00001
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021 #include <config.h>
00022
00023 #include "valuestreamdocument.h"
00024 #include "omassert.h"
00025
00026 using namespace std;
00027
00028 static void
00029 clear_valuelists(map<Xapian::valueno, ValueList *> & valuelists)
00030 {
00031 map<Xapian::valueno, ValueList *>::const_iterator i;
00032 for (i = valuelists.begin(); i != valuelists.end(); ++i) {
00033 delete i->second;
00034 }
00035 valuelists.clear();
00036 }
00037
00038 ValueStreamDocument::~ValueStreamDocument()
00039 {
00040 delete doc;
00041 clear_valuelists(valuelists);
00042 }
00043
00044 void
00045 ValueStreamDocument::new_subdb(int n)
00046 {
00047 AssertRel(n,>,0);
00048 AssertRel(size_t(n),<,db.internal.size());
00049 current = unsigned(n);
00050 database = db.internal[n];
00051 clear_valuelists(valuelists);
00052 }
00053
00054 string
00055 ValueStreamDocument::do_get_value(Xapian::valueno slot) const
00056 {
00057 #ifdef XAPIAN_ASSERTIONS_PARANOID
00058 if (!doc)
00059 doc = db.get_document_lazily(did);
00060 #endif
00061
00062 pair<map<Xapian::valueno, ValueList *>::iterator, bool> ret;
00063 ret = valuelists.insert(make_pair(slot, static_cast<ValueList*>(NULL)));
00064 ValueList * vl;
00065 if (ret.second) {
00066
00067 vl = database->open_value_list(slot);
00068 ret.first->second = vl;
00069 } else {
00070 vl = ret.first->second;
00071 if (!vl) {
00072 AssertEqParanoid(string(), doc->get_value(slot));
00073 return string();
00074 }
00075 }
00076
00077 size_t multiplier = db.internal.size();
00078 Xapian::docid sub_did = (did - current - 2 + multiplier) / multiplier + 1;
00079 AssertEq((sub_did - 1) * multiplier + current + 1, did);
00080 if (vl->check(sub_did)) {
00081 if (vl->at_end()) {
00082 delete vl;
00083 ret.first->second = NULL;
00084 } else if (vl->get_docid() == sub_did) {
00085 Assert(vl);
00086 string v = vl->get_value();
00087 AssertEq(v, doc->get_value(slot));
00088 return v;
00089 }
00090 }
00091 AssertEqParanoid(string(), doc->get_value(slot));
00092 return string();
00093 }
00094
00095 void
00096 ValueStreamDocument::do_get_all_values(map<Xapian::valueno, string> & v) const
00097 {
00098 if (!doc)
00099 doc = db.get_document_lazily(did);
00100 return doc->do_get_all_values(v);
00101 }
00102
00103 string
00104 ValueStreamDocument::do_get_data() const
00105 {
00106 if (!doc)
00107 doc = db.get_document_lazily(did);
00108 return doc->do_get_data();
00109 }