Branch data Line data Source code
1 : : /** @file valuestreamdocument.cc
2 : : * @brief A document which gets its values from a ValueStreamManager.
3 : : */
4 : : /* Copyright (C) 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 : :
23 : : #include "valuestreamdocument.h"
24 : : #include "omassert.h"
25 : :
26 : : using namespace std;
27 : :
28 : : static void
29 : 245799 : clear_valuelists(map<Xapian::valueno, ValueList *> & valuelists)
30 : : {
31 : 245799 : map<Xapian::valueno, ValueList *>::const_iterator i;
32 [ + + ]: 249431 : for (i = valuelists.begin(); i != valuelists.end(); ++i) {
33 [ + - ]: 3632 : delete i->second;
34 : : }
35 : 245799 : valuelists.clear();
36 : 245799 : }
37 : :
38 : 175211 : ValueStreamDocument::~ValueStreamDocument()
39 : : {
40 [ # # ][ + + ]: 175211 : delete doc;
[ # # ]
41 : 175211 : clear_valuelists(valuelists);
42 [ # # ][ - + ]: 175211 : }
[ # # ]
43 : :
44 : : void
45 : 70588 : ValueStreamDocument::new_subdb(int n)
46 : : {
47 : : AssertRel(n,>,0);
48 : : AssertRel(size_t(n),<,db.internal.size());
49 : 70588 : current = unsigned(n);
50 : 70588 : database = db.internal[n];
51 : 70588 : clear_valuelists(valuelists);
52 : 70588 : }
53 : :
54 : : string
55 : 71127 : ValueStreamDocument::do_get_value(Xapian::valueno slot) const
56 : : {
57 : : #ifdef XAPIAN_ASSERTIONS_PARANOID
58 : : if (!doc)
59 : : doc = db.get_document_lazily(did);
60 : : #endif
61 : :
62 : 71127 : pair<map<Xapian::valueno, ValueList *>::iterator, bool> ret;
63 [ - + ]: 71127 : ret = valuelists.insert(make_pair(slot, static_cast<ValueList*>(NULL)));
64 : : ValueList * vl;
65 [ + + ]: 71127 : if (ret.second) {
66 : : // Entry didn't already exist, so open a value list for slot.
67 : 3632 : vl = database->open_value_list(slot);
68 : 3632 : ret.first->second = vl;
69 : : } else {
70 : 67495 : vl = ret.first->second;
71 [ - + ]: 67495 : if (!vl) {
72 : : AssertEqParanoid(string(), doc->get_value(slot));
73 : 0 : return string();
74 : : }
75 : : }
76 : :
77 : 71127 : size_t multiplier = db.internal.size();
78 : 71127 : Xapian::docid sub_did = (did - current - 2 + multiplier) / multiplier + 1;
79 : : AssertEq((sub_did - 1) * multiplier + current + 1, did);
80 [ + + ]: 71127 : if (vl->check(sub_did)) {
81 [ - + ]: 70690 : if (vl->at_end()) {
82 [ # # ]: 0 : delete vl;
83 : 0 : ret.first->second = NULL;
84 [ + + ]: 70690 : } else if (vl->get_docid() == sub_did) {
85 : : Assert(vl);
86 : 70670 : string v = vl->get_value();
87 : : AssertEq(v, doc->get_value(slot));
88 : 70670 : return v;
89 : : }
90 : : }
91 : : AssertEqParanoid(string(), doc->get_value(slot));
92 : 71127 : return string();
93 : : }
94 : :
95 : : void
96 : 0 : ValueStreamDocument::do_get_all_values(map<Xapian::valueno, string> & v) const
97 : : {
98 [ # # ]: 0 : if (!doc)
99 : 0 : doc = db.get_document_lazily(did);
100 : 0 : return doc->do_get_all_values(v);
101 : : }
102 : :
103 : : string
104 : 4354 : ValueStreamDocument::do_get_data() const
105 : : {
106 [ + - ]: 4354 : if (!doc)
107 : 4354 : doc = db.get_document_lazily(did);
108 : 4354 : return doc->do_get_data();
109 : : }
|