00001
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023 #include <config.h>
00024
00025 #include "valuerangepostlist.h"
00026
00027 #include "debuglog.h"
00028 #include "omassert.h"
00029 #include "str.h"
00030
00031 using namespace std;
00032
00033 ValueRangePostList::~ValueRangePostList()
00034 {
00035 delete valuelist;
00036 }
00037
00038 Xapian::doccount
00039 ValueRangePostList::get_termfreq_min() const
00040 {
00041 return 0;
00042 }
00043
00044 Xapian::doccount
00045 ValueRangePostList::get_termfreq_est() const
00046 {
00047 AssertParanoid(!db || db_size == db->get_doccount());
00048
00049
00050 return db_size / 2;
00051 }
00052
00053 TermFreqs
00054 ValueRangePostList::get_termfreq_est_using_stats(
00055 const Xapian::Weight::Internal & stats) const
00056 {
00057 LOGCALL(MATCH, TermFreqs, "ValueRangePostList::get_termfreq_est_using_stats", stats);
00058
00059
00060 RETURN(TermFreqs(stats.collection_size / 2, stats.rset_size / 2));
00061 }
00062
00063 Xapian::doccount
00064 ValueRangePostList::get_termfreq_max() const
00065 {
00066 AssertParanoid(!db || db_size == db->get_doccount());
00067 return db_size;
00068 }
00069
00070 Xapian::weight
00071 ValueRangePostList::get_maxweight() const
00072 {
00073 return 0;
00074 }
00075
00076 Xapian::docid
00077 ValueRangePostList::get_docid() const
00078 {
00079 Assert(valuelist);
00080 Assert(db);
00081 return valuelist->get_docid();
00082 }
00083
00084 Xapian::weight
00085 ValueRangePostList::get_weight() const
00086 {
00087 Assert(db);
00088 return 0;
00089 }
00090
00091 Xapian::termcount
00092 ValueRangePostList::get_doclength() const
00093 {
00094 Assert(db);
00095 return 0;
00096 }
00097
00098 Xapian::weight
00099 ValueRangePostList::recalc_maxweight()
00100 {
00101 Assert(db);
00102 return 0;
00103 }
00104
00105 PositionList *
00106 ValueRangePostList::read_position_list()
00107 {
00108 Assert(db);
00109 return NULL;
00110 }
00111
00112 PositionList *
00113 ValueRangePostList::open_position_list() const
00114 {
00115 Assert(db);
00116 return NULL;
00117 }
00118
00119 PostList *
00120 ValueRangePostList::next(Xapian::weight)
00121 {
00122 Assert(db);
00123 if (!valuelist) valuelist = db->open_value_list(slot);
00124 valuelist->next();
00125 while (!valuelist->at_end()) {
00126 const string & v = valuelist->get_value();
00127 if (v >= begin && v <= end) {
00128 return NULL;
00129 }
00130 valuelist->next();
00131 }
00132 db = NULL;
00133 return NULL;
00134 }
00135
00136 PostList *
00137 ValueRangePostList::skip_to(Xapian::docid did, Xapian::weight)
00138 {
00139 Assert(db);
00140 if (!valuelist) valuelist = db->open_value_list(slot);
00141 valuelist->skip_to(did);
00142 while (!valuelist->at_end()) {
00143 const string & v = valuelist->get_value();
00144 if (v >= begin && v <= end) {
00145 return NULL;
00146 }
00147 valuelist->next();
00148 }
00149 db = NULL;
00150 return NULL;
00151 }
00152
00153 PostList *
00154 ValueRangePostList::check(Xapian::docid did, Xapian::weight, bool &valid)
00155 {
00156 Assert(db);
00157 AssertRelParanoid(did, <=, db->get_lastdocid());
00158 if (!valuelist) valuelist = db->open_value_list(slot);
00159 valid = valuelist->check(did);
00160 if (!valid) {
00161 return NULL;
00162 }
00163 const string & v = valuelist->get_value();
00164 valid = (v >= begin && v <= end);
00165 return NULL;
00166 }
00167
00168 bool
00169 ValueRangePostList::at_end() const
00170 {
00171 return (db == NULL);
00172 }
00173
00174 Xapian::termcount
00175 ValueRangePostList::count_matching_subqs() const
00176 {
00177 return 1;
00178 }
00179
00180 string
00181 ValueRangePostList::get_description() const
00182 {
00183 string desc = "ValueRangePostList(";
00184 desc += str(slot);
00185 desc += ", ";
00186 desc += begin;
00187 desc += ", ";
00188 desc += end;
00189 desc += ")";
00190 return desc;
00191 }