Branch data Line data Source code
1 : : /** @file msetpostlist.cc
2 : : * @brief PostList returning entries from an MSet
3 : : */
4 : : /* Copyright (C) 2006,2007,2009,2010 Olly Betts
5 : : *
6 : : * This program is free software; you can redistribute it and/or modify
7 : : * it under the terms of the GNU General Public License as published by
8 : : * the Free Software Foundation; either version 2 of the License, or
9 : : * (at your option) any later version.
10 : : *
11 : : * This program is distributed in the hope that it will be useful,
12 : : * but WITHOUT ANY WARRANTY; without even the implied warranty of
13 : : * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14 : : * GNU General Public License for more details.
15 : : *
16 : : * You should have received a copy of the GNU General Public License
17 : : * along with this program; if not, write to the Free Software
18 : : * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
19 : : */
20 : :
21 : : #include <config.h>
22 : :
23 : : #include "msetpostlist.h"
24 : :
25 : : #include "debuglog.h"
26 : : #include "omassert.h"
27 : :
28 : : Xapian::doccount
29 : 324 : MSetPostList::get_termfreq_min() const
30 : : {
31 : : LOGCALL(MATCH, Xapian::doccount, "MSetPostList::get_termfreq_min", NO_ARGS);
32 : 324 : RETURN(mset_internal->matches_lower_bound);
33 : : }
34 : :
35 : : Xapian::doccount
36 : 156 : MSetPostList::get_termfreq_est() const
37 : : {
38 : : LOGCALL(MATCH, Xapian::doccount, "MSetPostList::get_termfreq_est", NO_ARGS);
39 : 156 : RETURN(mset_internal->matches_estimated);
40 : : }
41 : :
42 : : Xapian::doccount
43 : 156 : MSetPostList::get_termfreq_max() const
44 : : {
45 : : LOGCALL(MATCH, Xapian::doccount, "MSetPostList::get_termfreq_max", NO_ARGS);
46 : 156 : RETURN(mset_internal->matches_upper_bound);
47 : : }
48 : :
49 : : Xapian::weight
50 : 156 : MSetPostList::get_maxweight() const
51 : : {
52 : : LOGCALL(MATCH, Xapian::weight, "MSetPostList::get_maxweight", NO_ARGS);
53 : : // If we've not started, return max_possible from our MSet so that this
54 : : // value gets used to set max_possible in the combined MSet.
55 [ + - ]: 156 : if (cursor == -1) RETURN(mset_internal->max_possible);
56 : :
57 : : // If the MSet is sorted in descending weight order, then the maxweight we
58 : : // can return from now on is the weight of the current item.
59 [ # # ]: 0 : if (decreasing_relevance) {
60 : : // FIXME: This is actually a reduction in the maxweight...
61 [ # # ]: 0 : if (at_end()) RETURN(0);
62 : 0 : RETURN(mset_internal->items[cursor].wt);
63 : : }
64 : :
65 : : // Otherwise max_attained is the best answer we can give.
66 : 156 : RETURN(mset_internal->max_attained);
67 : : }
68 : :
69 : : Xapian::docid
70 : 252 : MSetPostList::get_docid() const
71 : : {
72 : : LOGCALL(MATCH, Xapian::docid, "MSetPostList::get_docid", NO_ARGS);
73 : : Assert(cursor != -1);
74 : 252 : RETURN(mset_internal->items[cursor].did);
75 : : }
76 : :
77 : : Xapian::weight
78 : 252 : MSetPostList::get_weight() const
79 : : {
80 : : LOGCALL(MATCH, Xapian::weight, "MSetPostList::get_weight", NO_ARGS);
81 : : Assert(cursor != -1);
82 : 252 : RETURN(mset_internal->items[cursor].wt);
83 : : }
84 : :
85 : : const string *
86 : 0 : MSetPostList::get_collapse_key() const
87 : : {
88 : : LOGCALL(MATCH, string *, "MSetPostList::get_collapse_key", NO_ARGS);
89 : : Assert(cursor != -1);
90 : 0 : RETURN(&mset_internal->items[cursor].collapse_key);
91 : : }
92 : :
93 : : Xapian::termcount
94 : 0 : MSetPostList::get_doclength() const
95 : : {
96 : 0 : throw Xapian::UnimplementedError("MSetPostList::get_doclength() unimplemented");
97 : : }
98 : :
99 : : Xapian::weight
100 : 156 : MSetPostList::recalc_maxweight()
101 : : {
102 : : LOGCALL(MATCH, Xapian::weight, "MSetPostList::recalc_maxweight", NO_ARGS);
103 : 156 : RETURN(MSetPostList::get_maxweight());
104 : : }
105 : :
106 : : PostList *
107 : 396 : MSetPostList::next(Xapian::weight w_min)
108 : : {
109 : : LOGCALL(MATCH, PostList *, "MSetPostList::next", w_min);
110 : : Assert(cursor == -1 || !at_end());
111 : 396 : ++cursor;
112 [ + + ]: 396 : if (decreasing_relevance) {
113 : : // MSet items are in decreasing weight order, so if the current item
114 : : // doesn't have enough weight, none of the remaining items will, so
115 : : // skip straight to the end.
116 [ + + ][ - + ]: 354 : if (!at_end() && mset_internal->items[cursor].wt < w_min)
[ - + ]
117 : 0 : cursor = mset_internal->items.size();
118 : : } else {
119 : : // Otherwise, skip to the next entry with enough weight.
120 [ + + ][ - + ]: 42 : while (!at_end() && mset_internal->items[cursor].wt < w_min)
[ - + ]
121 : 0 : ++cursor;
122 : : }
123 : 396 : RETURN(NULL);
124 : : }
125 : :
126 : : PostList *
127 : 0 : MSetPostList::skip_to(Xapian::docid, Xapian::weight)
128 : : {
129 : : // The usual semantics of skip_to don't make sense since MSetPostList
130 : : // returns documents in MSet order rather than docid order like other
131 : : // PostLists do.
132 : 0 : throw Xapian::InvalidOperationError("MSetPostList::skip_to not meaningful");
133 : : }
134 : :
135 : : bool
136 : 792 : MSetPostList::at_end() const
137 : : {
138 : : LOGCALL(MATCH, bool, "MSetPostList::at_end", NO_ARGS);
139 : : Assert(cursor != -1);
140 : 792 : RETURN(size_t(cursor) >= mset_internal->items.size());
141 : : }
142 : :
143 : : string
144 : 0 : MSetPostList::get_description() const
145 : : {
146 : 0 : string desc("(MSet ");
147 : 0 : desc += mset_internal->get_description();
148 : 0 : desc += ')';
149 : 0 : return desc;
150 : : }
|