Branch data Line data Source code
1 : : /** @file flint_alldocspostlist.cc
2 : : * @brief A PostList which iterates over all documents in a FlintDatabase.
3 : : */
4 : : /* Copyright (C) 2006,2007,2008,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_alldocspostlist.h"
23 : :
24 : : #include <string>
25 : :
26 : : #include "debuglog.h"
27 : : #include "flint_database.h"
28 : : #include "str.h"
29 : :
30 : : using namespace std;
31 : :
32 : : Xapian::doccount
33 : 0 : FlintAllDocsPostList::get_termfreq() const
34 : : {
35 : 0 : return doccount;
36 : : }
37 : :
38 : : Xapian::docid
39 : 4149 : FlintAllDocsPostList::get_docid() const
40 : : {
41 : 4149 : return current_did;
42 : : }
43 : :
44 : : Xapian::termcount
45 : 7 : FlintAllDocsPostList::get_doclength() const
46 : : {
47 : : LOGCALL(DB, Xapian::termcount, "FlintAllDocsPostList::get_doclength", NO_ARGS);
48 : : Assert(current_did);
49 : :
50 : 7 : cursor->read_tag();
51 : :
52 [ + - ]: 7 : if (cursor->current_tag.empty()) RETURN(0);
53 : :
54 : 0 : const char * pos = cursor->current_tag.data();
55 : 0 : const char * end = pos + cursor->current_tag.size();
56 : :
57 : : flint_doclen_t doclen;
58 [ # # ]: 0 : if (!F_unpack_uint(&pos, end, &doclen)) {
59 : : const char *msg;
60 [ # # ]: 0 : if (pos == 0) {
61 : 0 : msg = "Too little data for doclen in termlist";
62 : : } else {
63 : 0 : msg = "Overflowed value for doclen in termlist";
64 : : }
65 : 0 : throw Xapian::DatabaseCorruptError(msg);
66 : : }
67 : :
68 : 7 : RETURN(doclen);
69 : : }
70 : :
71 : : Xapian::termcount
72 : 2083 : FlintAllDocsPostList::get_wdf() const
73 : : {
74 : : LOGCALL(DB, Xapian::termcount, "FlintAllDocsPostList::get_wdf", NO_ARGS);
75 : : Assert(current_did);
76 : 2083 : RETURN(1);
77 : : }
78 : :
79 : : PostList *
80 : 3309 : FlintAllDocsPostList::read_did_from_current_key()
81 : : {
82 : : LOGCALL(DB, PostList *, "FlintAllDocsPostList::read_did_from_current_key", NO_ARGS);
83 : 3309 : const string & key = cursor->current_key;
84 : 3309 : const char * pos = key.data();
85 : 3309 : const char * end = pos + key.size();
86 [ - + ]: 3309 : if (!F_unpack_uint_preserving_sort(&pos, end, ¤t_did)) {
87 : : const char *msg;
88 [ # # ]: 0 : if (pos == 0) {
89 : 0 : msg = "Too little data in termlist key";
90 : : } else {
91 : 0 : msg = "Overflowed value in termlist key";
92 : : }
93 : 0 : throw Xapian::DatabaseCorruptError(msg);
94 : : }
95 : :
96 : : // Return NULL to help the compiler tail-call optimise our callers.
97 : 3309 : RETURN(NULL);
98 : : }
99 : :
100 : : PostList *
101 : 3320 : FlintAllDocsPostList::next(Xapian::weight /*w_min*/)
102 : : {
103 : : LOGCALL(DB, PostList *, "FlintAllDocsPostList::next", Literal("/*w_min*/"));
104 : : Assert(!at_end());
105 [ + + ]: 3320 : if (!cursor->next()) RETURN(NULL);
106 : 3320 : RETURN(read_did_from_current_key());
107 : : }
108 : :
109 : : PostList *
110 : 204 : FlintAllDocsPostList::skip_to(Xapian::docid did, Xapian::weight /*w_min*/)
111 : : {
112 : : LOGCALL(DB, PostList *, "FlintAllDocsPostList::skip_to", did | Literal("/*w_min*/"));
113 : :
114 [ + - ][ - + ]: 204 : if (did <= current_did || at_end()) RETURN(NULL);
[ - + ]
115 : :
116 [ + + ]: 204 : if (cursor->find_entry_ge(F_pack_uint_preserving_sort(did))) {
117 : : // The exact docid that was asked for exists.
118 : 9 : current_did = did;
119 : 9 : RETURN(NULL);
120 : : }
121 [ + + ]: 195 : if (cursor->after_end()) RETURN(NULL);
122 : :
123 : 204 : RETURN(read_did_from_current_key());
124 : : }
125 : :
126 : : bool
127 : 3728 : FlintAllDocsPostList::at_end() const {
128 : : LOGCALL(DB, bool, "FlintAllDocsPostList::at_end", NO_ARGS);
129 : 3728 : RETURN(cursor->after_end());
130 : : }
131 : :
132 : : string
133 : 0 : FlintAllDocsPostList::get_description() const
134 : : {
135 : 0 : string desc = "FlintAllDocsPostList(did=";
136 : 0 : desc += str(current_did);
137 : 0 : desc += ",doccount=";
138 : 0 : desc += str(doccount);
139 : 0 : desc += ')';
140 : 0 : return desc;
141 : : }
|