Branch data Line data Source code
1 : : /** @file valuerangepostlist.cc
2 : : * @brief Return document ids matching a range test on a specified doc value.
3 : : */
4 : : /* Copyright 2007,2008,2009,2010 Olly Betts
5 : : * Copyright 2009 Lemur Consulting Ltd
6 : : * Copyright 2010 Richard Boulton
7 : : *
8 : : * This program is free software; you can redistribute it and/or modify
9 : : * it under the terms of the GNU General Public License as published by
10 : : * the Free Software Foundation; either version 2 of the License, or
11 : : * (at your option) any later version.
12 : : *
13 : : * This program is distributed in the hope that it will be useful,
14 : : * but WITHOUT ANY WARRANTY; without even the implied warranty of
15 : : * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
16 : : * GNU General Public License for more details.
17 : : *
18 : : * You should have received a copy of the GNU General Public License
19 : : * along with this program; if not, write to the Free Software
20 : : * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
21 : : */
22 : :
23 : : #include <config.h>
24 : :
25 : : #include "valuerangepostlist.h"
26 : :
27 : : #include "debuglog.h"
28 : : #include "omassert.h"
29 : : #include "str.h"
30 : :
31 : : using namespace std;
32 : :
33 : 6174 : ValueRangePostList::~ValueRangePostList()
34 : : {
35 [ + + ][ # # ]: 6174 : delete valuelist;
[ + + ]
36 [ + - ][ # # ]: 6174 : }
[ - + ]
37 : :
38 : : Xapian::doccount
39 : 6168 : ValueRangePostList::get_termfreq_min() const
40 : : {
41 : 6168 : return 0;
42 : : }
43 : :
44 : : Xapian::doccount
45 : 6250 : ValueRangePostList::get_termfreq_est() const
46 : : {
47 : : AssertParanoid(!db || db_size == db->get_doccount());
48 : : // FIXME: It's hard to estimate well - perhaps consider the values of
49 : : // begin and end?
50 : 6250 : return db_size / 2;
51 : : }
52 : :
53 : : TermFreqs
54 : 0 : ValueRangePostList::get_termfreq_est_using_stats(
55 : : const Xapian::Weight::Internal & stats) const
56 : : {
57 : : LOGCALL(MATCH, TermFreqs, "ValueRangePostList::get_termfreq_est_using_stats", stats);
58 : : // FIXME: It's hard to estimate well - perhaps consider the values of
59 : : // begin and end?
60 : 0 : RETURN(TermFreqs(stats.collection_size / 2, stats.rset_size / 2));
61 : : }
62 : :
63 : : Xapian::doccount
64 : 6174 : ValueRangePostList::get_termfreq_max() const
65 : : {
66 : : AssertParanoid(!db || db_size == db->get_doccount());
67 : 6174 : return db_size;
68 : : }
69 : :
70 : : Xapian::weight
71 : 0 : ValueRangePostList::get_maxweight() const
72 : : {
73 : 0 : return 0;
74 : : }
75 : :
76 : : Xapian::docid
77 : 48530 : ValueRangePostList::get_docid() const
78 : : {
79 : : Assert(valuelist);
80 : : Assert(db);
81 : 48530 : return valuelist->get_docid();
82 : : }
83 : :
84 : : Xapian::weight
85 : 48466 : ValueRangePostList::get_weight() const
86 : : {
87 : : Assert(db);
88 : 48466 : return 0;
89 : : }
90 : :
91 : : Xapian::termcount
92 : 0 : ValueRangePostList::get_doclength() const
93 : : {
94 : : Assert(db);
95 : 0 : return 0;
96 : : }
97 : :
98 : : Xapian::weight
99 : 6174 : ValueRangePostList::recalc_maxweight()
100 : : {
101 : : Assert(db);
102 : 6174 : return 0;
103 : : }
104 : :
105 : : PositionList *
106 : 0 : ValueRangePostList::read_position_list()
107 : : {
108 : : Assert(db);
109 : 0 : return NULL;
110 : : }
111 : :
112 : : PositionList *
113 : 0 : ValueRangePostList::open_position_list() const
114 : : {
115 : : Assert(db);
116 : 0 : return NULL;
117 : : }
118 : :
119 : : PostList *
120 : 52772 : ValueRangePostList::next(Xapian::weight)
121 : : {
122 : : Assert(db);
123 [ + + ]: 52772 : if (!valuelist) valuelist = db->open_value_list(valno);
124 : 52772 : valuelist->next();
125 [ + + ][ + + ]: 310521 : while (!valuelist->at_end()) {
126 : 257749 : const string & v = valuelist->get_value();
127 [ + + + + ]: 257749 : if (v >= begin && v <= end) {
[ + + ]
128 : 46871 : return NULL;
129 : : }
130 : 210878 : valuelist->next();
131 : : }
132 : 5901 : db = NULL;
133 : 52772 : return NULL;
134 : : }
135 : :
136 : : PostList *
137 : 16 : ValueRangePostList::skip_to(Xapian::docid did, Xapian::weight)
138 : : {
139 : : Assert(db);
140 [ - + ]: 16 : if (!valuelist) valuelist = db->open_value_list(valno);
141 : 16 : valuelist->skip_to(did);
142 [ + + ][ + - ]: 45 : while (!valuelist->at_end()) {
143 : 29 : const string & v = valuelist->get_value();
144 [ + + + - ]: 29 : if (v >= begin && v <= end) {
[ + + ]
145 : 16 : return NULL;
146 : : }
147 : 13 : valuelist->next();
148 : : }
149 : 0 : db = NULL;
150 : 16 : return NULL;
151 : : }
152 : :
153 : : PostList *
154 : 41 : ValueRangePostList::check(Xapian::docid did, Xapian::weight, bool &valid)
155 : : {
156 : : Assert(db);
157 : : AssertRelParanoid(did, <=, db->get_lastdocid());
158 [ + + ]: 41 : if (!valuelist) valuelist = db->open_value_list(valno);
159 : 41 : valid = valuelist->check(did);
160 [ + + ]: 41 : if (!valid) {
161 : 13 : return NULL;
162 : : }
163 : 28 : const string & v = valuelist->get_value();
164 [ + - + - ]: 28 : valid = (v >= begin && v <= end);
165 : 41 : return NULL;
166 : : }
167 : :
168 : : bool
169 : 54602 : ValueRangePostList::at_end() const
170 : : {
171 : 54602 : return (db == NULL);
172 : : }
173 : :
174 : : Xapian::termcount
175 : 84 : ValueRangePostList::count_matching_subqs() const
176 : : {
177 : 84 : return 1;
178 : : }
179 : :
180 : : string
181 : 0 : ValueRangePostList::get_description() const
182 : : {
183 : 0 : string desc = "ValueRangePostList(";
184 : 0 : desc += str(valno);
185 : 0 : desc += ", ";
186 : 0 : desc += begin;
187 : 0 : desc += ", ";
188 : 0 : desc += end;
189 : 0 : desc += ")";
190 : 0 : return desc;
191 : : }
|