Branch data Line data Source code
1 : : /** @file slowvaluelist.cc
2 : : * @brief Slow implementation for backends which don't streamed values.
3 : : */
4 : : /* Copyright (C) 2008 Olly Betts
5 : : *
6 : : * This program is free software; you can redistribute it and/or
7 : : * modify it under the terms of the GNU General Public License as
8 : : * published by the Free Software Foundation; either version 2 of the
9 : : * License, or (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 "slowvaluelist.h"
24 : :
25 : : #include "document.h"
26 : : #include "str.h"
27 : :
28 : : #include "xapian/error.h"
29 : :
30 : : #include "autoptr.h"
31 : :
32 : : using namespace std;
33 : :
34 : : Xapian::docid
35 : 285452 : SlowValueList::get_docid() const
36 : : {
37 : 285452 : return current_did;
38 : : }
39 : :
40 : : string
41 : 483581 : SlowValueList::get_value() const
42 : : {
43 : 483581 : return current_value;
44 : : }
45 : :
46 : : Xapian::valueno
47 : 212088 : SlowValueList::get_valueno() const
48 : : {
49 : 212088 : return slot;
50 : : }
51 : :
52 : : bool
53 : 491803 : SlowValueList::at_end() const
54 : : {
55 : 491803 : return last_docid == 0;
56 : : }
57 : :
58 : : void
59 : 385966 : SlowValueList::next()
60 : : {
61 : : // Compare before incrementing, since last_docid could be the largest
62 : : // representable value in which case current_did will wrap to zero before
63 : : // exceeding it.
64 [ + + ]: 414218 : while (current_did++ < last_docid) {
65 : : try {
66 : : // Open document lazily so that we don't waste time checking for
67 : : // its existence.
68 : : AutoPtr<Xapian::Document::Internal>
69 : 409089 : doc(db.get_document_lazily(current_did));
70 [ + + ]: 409089 : if (!doc.get()) continue;
71 : 409085 : string value = doc->get_value(slot);
72 [ + + ]: 409085 : if (!value.empty()) {
73 : 409085 : swap(current_value, value);
74 : : return;
75 [ + + ][ + + ]: 409089 : }
76 : 0 : } catch (const Xapian::DocNotFoundError &) {
77 : : }
78 : : }
79 : :
80 : : // Indicate that we're at_end().
81 : 385966 : last_docid = 0;
82 : : }
83 : :
84 : : void
85 : 135317 : SlowValueList::skip_to(Xapian::docid did)
86 : : {
87 [ + + ]: 135317 : if (did <= current_did) return;
88 : :
89 [ + + ]: 134184 : if (did > last_docid) {
90 : : // Indicate that we're at_end().
91 : 1392 : last_docid = 0;
92 : 1392 : return;
93 : : }
94 : :
95 : 132792 : current_did = did - 1;
96 : 135317 : next();
97 : : }
98 : :
99 : : bool
100 : 111079 : SlowValueList::check(Xapian::docid did)
101 : : {
102 [ + + ]: 111079 : if (did <= current_did) return true;
103 : :
104 [ + + ]: 110269 : if (did > last_docid) {
105 : : // Indicate that we're at_end().
106 : 760 : last_docid = 0;
107 : 760 : return true;
108 : : }
109 : :
110 : 109509 : current_did = did;
111 : : try {
112 : : AutoPtr<Xapian::Document::Internal>
113 : 109509 : doc(db.get_document_lazily(current_did));
114 [ + - ]: 109509 : if (doc.get()) {
115 : 109509 : current_value = doc->get_value(slot);
116 [ + + ]: 109509 : if (!current_value.empty()) return true;
117 [ + + ]: 109509 : }
118 : 0 : } catch (const Xapian::DocNotFoundError &) {
119 : : }
120 : 111079 : return false;
121 : : }
122 : :
123 : : string
124 : 0 : SlowValueList::get_description() const
125 : : {
126 : 0 : string desc = "SlowValueList(slot=";
127 : 0 : desc += str(slot);
128 [ # # ]: 0 : if (last_docid != 0) {
129 : 0 : desc += ", docid=";
130 : 0 : desc += str(current_did);
131 : 0 : desc += ", value=\"";
132 : 0 : desc += current_value;
133 : 0 : desc += "\")";
134 : : } else {
135 : 0 : desc += ", atend)";
136 : : }
137 : 0 : return desc;
138 : : }
|