00001
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022 #ifndef XAPIAN_INCLUDED_CHERT_VALUES_H
00023 #define XAPIAN_INCLUDED_CHERT_VALUES_H
00024
00025 #include "pack.h"
00026 #include "valuestats.h"
00027
00028 #include "xapian/error.h"
00029 #include "xapian/types.h"
00030
00031 #include <map>
00032 #include <string>
00033
00035 inline std::string
00036 make_valuechunk_key(Xapian::valueno slot, Xapian::docid did)
00037 {
00038 std::string key("\0\xd8", 2);
00039 pack_uint(key, slot);
00040 pack_uint_preserving_sort(key, did);
00041 return key;
00042 }
00043
00044 inline Xapian::docid
00045 docid_from_key(Xapian::valueno required_slot, const std::string & key)
00046 {
00047 const char * p = key.data();
00048 const char * end = p + key.length();
00049
00050 if (end - p < 2 || *p++ != '\0' || *p++ != '\xd8') return 0;
00051 Xapian::valueno slot;
00052 if (!unpack_uint(&p, end, &slot))
00053 throw Xapian::DatabaseCorruptError("bad value key");
00054
00055 if (slot != required_slot) return 0;
00056 Xapian::docid did;
00057 if (!unpack_uint_preserving_sort(&p, end, &did))
00058 throw Xapian::DatabaseCorruptError("bad value key");
00059 return did;
00060 }
00061
00062 namespace Xapian {
00063 class Document;
00064 }
00065
00066 class ChertPostListTable;
00067 class ChertTermListTable;
00068 struct ValueStats;
00069
00070 class ChertValueManager {
00076 mutable Xapian::valueno mru_slot;
00077
00079 mutable ValueStats mru_valstats;
00080
00081 ChertPostListTable * postlist_table;
00082
00083 ChertTermListTable * termlist_table;
00084
00085 std::map<Xapian::docid, std::string> slots;
00086
00087 std::map<Xapian::valueno, std::map<Xapian::docid, std::string> > changes;
00088
00089 void add_value(Xapian::docid did, Xapian::valueno slot,
00090 const std::string & val);
00091
00092 void remove_value(Xapian::docid did, Xapian::valueno slot);
00093
00094 Xapian::docid get_chunk_containing_did(Xapian::valueno slot,
00095 Xapian::docid did,
00096 std::string &chunk) const;
00097
00099 void get_value_stats(Xapian::valueno slot) const;
00100
00101 void get_value_stats(Xapian::valueno slot, ValueStats & stats) const;
00102
00103 public:
00105 ChertValueManager(ChertPostListTable * postlist_table_,
00106 ChertTermListTable * termlist_table_)
00107 : mru_slot(Xapian::BAD_VALUENO),
00108 postlist_table(postlist_table_),
00109 termlist_table(termlist_table_) { }
00110
00111
00112 void merge_changes();
00113
00114 void add_document(Xapian::docid did, const Xapian::Document &doc,
00115 std::map<Xapian::valueno, ValueStats> & value_stats);
00116
00117 void delete_document(Xapian::docid did,
00118 std::map<Xapian::valueno, ValueStats> & value_stats);
00119
00120 void replace_document(Xapian::docid did, const Xapian::Document &doc,
00121 std::map<Xapian::valueno, ValueStats> & value_stats);
00122
00123 std::string get_value(Xapian::docid did, Xapian::valueno slot) const;
00124
00125 void get_all_values(std::map<Xapian::valueno, std::string> & values,
00126 Xapian::docid did) const;
00127
00128 Xapian::doccount get_value_freq(Xapian::valueno slot) const {
00129 if (mru_slot != slot) get_value_stats(slot);
00130 return mru_valstats.freq;
00131 }
00132
00133 std::string get_value_lower_bound(Xapian::valueno slot) const {
00134 if (mru_slot != slot) get_value_stats(slot);
00135 return mru_valstats.lower_bound;
00136 }
00137
00138 std::string get_value_upper_bound(Xapian::valueno slot) const {
00139 if (mru_slot != slot) get_value_stats(slot);
00140 return mru_valstats.upper_bound;
00141 }
00142
00150 void set_value_stats(std::map<Xapian::valueno, ValueStats> & value_stats);
00151
00152 void reset() {
00154 mru_slot = Xapian::BAD_VALUENO;
00155 }
00156
00157 bool is_modified() const {
00158 return !changes.empty();
00159 }
00160
00161 void cancel() {
00162
00163 slots.clear();
00164 changes.clear();
00165 }
00166 };
00167
00168 class ValueChunkReader {
00169 const char *p;
00170 const char *end;
00171
00172 Xapian::docid did;
00173
00174 std::string value;
00175
00176 public:
00178 ValueChunkReader() : p(NULL) { }
00179
00180 ValueChunkReader(const char * p_, size_t len, Xapian::docid did_) {
00181 assign(p_, len, did_);
00182 }
00183
00184 void assign(const char * p_, size_t len, Xapian::docid did_);
00185
00186 bool at_end() const { return p == NULL; }
00187
00188 Xapian::docid get_docid() const { return did; }
00189
00190 const std::string & get_value() const { return value; }
00191
00192 void next();
00193
00194 void skip_to(Xapian::docid target);
00195 };
00196
00197 #endif // XAPIAN_INCLUDED_CHERT_VALUES_H