Branch data Line data Source code
1 : : /** @file flint_modifiedpostlist.cc
2 : : * @brief A FlintPostList plus pending modifications
3 : : */
4 : : /* Copyright (C) 2006,2007,2009 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 : : #include "flint_modifiedpostlist.h"
23 : :
24 : : #include "debuglog.h"
25 : : #include "flint_database.h"
26 : :
27 : 96 : FlintModifiedPostList::~FlintModifiedPostList()
28 : : {
29 [ - + ][ # # ]: 96 : delete poslist;
[ # # ]
30 [ + - ][ # # ]: 96 : }
[ # # ]
31 : :
32 : : void
33 : 471 : FlintModifiedPostList::skip_deletes(Xapian::weight w_min)
34 : : {
35 [ + + ]: 471 : while (!FlintPostList::at_end()) {
36 [ + + ][ + - ]: 6 : while (it != mods.end() && it->second.first == 'D' &&
[ + - ][ + + ]
37 : : it->first < FlintPostList::get_docid())
38 : 3 : ++it;
39 [ + - ]: 3 : if (it == mods.end()) return;
40 [ # # ]: 0 : if (it->first != FlintPostList::get_docid()) return;
41 [ # # ]: 0 : if (it->second.first != 'D') return;
42 : 0 : ++it;
43 : 0 : FlintPostList::next(w_min);
44 : : }
45 [ + + ][ + + ]: 492 : while (it != mods.end() && it->second.first == 'D') ++it;
[ + + ]
46 : : }
47 : :
48 : : Xapian::doccount
49 : 81 : FlintModifiedPostList::get_termfreq() const
50 : : {
51 : 81 : return this_db->get_termfreq(term);
52 : : }
53 : :
54 : : Xapian::docid
55 : 375 : FlintModifiedPostList::get_docid() const
56 : : {
57 [ + + ]: 375 : if (it == mods.end()) return FlintPostList::get_docid();
58 [ + - ]: 372 : if (FlintPostList::at_end()) return it->first;
59 : : Assert(it->second.first != 'D');
60 : 375 : return min(it->first, FlintPostList::get_docid());
61 : : }
62 : :
63 : : Xapian::termcount
64 : 300 : FlintModifiedPostList::get_doclength() const
65 : : {
66 : : LOGCALL(DB, Xapian::termcount, "FlintModifiedPostList::get_doclength", NO_ARGS);
67 [ + + ][ - + ]: 300 : if (it != mods.end() && (FlintPostList::at_end() || it->first <= FlintPostList::get_docid()))
[ # # ][ + + ]
68 : 297 : RETURN(this_db->get_doclength(it->first));
69 : 300 : RETURN(FlintPostList::get_doclength());
70 : : }
71 : :
72 : : Xapian::termcount
73 : 306 : FlintModifiedPostList::get_wdf() const
74 : : {
75 [ + + ]: 306 : if (FlintPostList::at_end()) return it->second.second;
76 : 3 : Xapian::docid unmod_did = FlintPostList::get_docid();
77 [ - + # # ]: 3 : if (it != mods.end() && it->first <= unmod_did) {
[ - + ]
78 [ # # ]: 0 : if (it->first < unmod_did) return it->second.second;
79 : 0 : return it->second.second;
80 : : }
81 : 306 : return FlintPostList::get_wdf();
82 : : }
83 : :
84 : : PositionList *
85 : 0 : FlintModifiedPostList::read_position_list()
86 : : {
87 [ # # ][ # # ]: 0 : if (it != mods.end() && (FlintPostList::at_end() || it->first <= FlintPostList::get_docid())) {
[ # # ][ # # ]
88 [ # # ]: 0 : if (poslist) {
89 [ # # ]: 0 : delete poslist;
90 : 0 : poslist = NULL;
91 : : }
92 : 0 : poslist = this_db->open_position_list(it->first, term);
93 : 0 : return poslist;
94 : : }
95 : 0 : return FlintPostList::read_position_list();
96 : : }
97 : :
98 : : PositionList *
99 : 0 : FlintModifiedPostList::open_position_list() const
100 : : {
101 [ # # ][ # # ]: 0 : if (it != mods.end() && (FlintPostList::at_end() || it->first <= FlintPostList::get_docid())) {
[ # # ][ # # ]
102 : 0 : return this_db->open_position_list(it->first, term);
103 : : }
104 : 0 : return FlintPostList::open_position_list();
105 : : }
106 : :
107 : : PostList *
108 : 471 : FlintModifiedPostList::next(Xapian::weight w_min)
109 : : {
110 [ + + ]: 471 : if (have_started) {
111 [ + + ]: 375 : if (FlintPostList::at_end()) {
112 : 372 : ++it;
113 : 372 : skip_deletes(w_min);
114 : 372 : return NULL;
115 : : }
116 : 3 : Xapian::docid unmod_did = FlintPostList::get_docid();
117 [ - + # # ]: 3 : if (it != mods.end() && it->first <= unmod_did) {
[ - + ]
118 [ # # ][ # # ]: 0 : if (it->first < unmod_did && it->second.first != 'D') {
[ # # ]
119 : 0 : ++it;
120 : 0 : skip_deletes(w_min);
121 : 0 : return NULL;
122 : : }
123 : 0 : ++it;
124 : : }
125 : : }
126 : 99 : FlintPostList::next(w_min);
127 : 99 : skip_deletes(w_min);
128 : 471 : return NULL;
129 : : }
130 : :
131 : : PostList *
132 : 0 : FlintModifiedPostList::skip_to(Xapian::docid desired_did, Xapian::weight w_min)
133 : : {
134 [ # # ]: 0 : if (!FlintPostList::at_end()) FlintPostList::skip_to(desired_did, w_min);
135 : : /* FIXME: should we use lower_bound() on the map? */
136 [ # # ][ # # ]: 0 : while (it != mods.end() && it->first < desired_did) ++it;
[ # # ]
137 : 0 : skip_deletes(w_min);
138 : 0 : return NULL;
139 : : }
140 : :
141 : : bool
142 : 471 : FlintModifiedPostList::at_end() const {
143 [ + + ][ + + ]: 471 : return it == mods.end() && FlintPostList::at_end();
144 : : }
145 : :
146 : : std::string
147 : 0 : FlintModifiedPostList::get_description() const
148 : : {
149 : 0 : std::string desc = "FlintModifiedPostList(";
150 : 0 : desc += FlintPostList::get_description();
151 : 0 : desc += ')';
152 : 0 : return desc;
153 : : }
|