00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024 #ifndef OM_HGUARD_CHERT_DATABASE_H
00025 #define OM_HGUARD_CHERT_DATABASE_H
00026
00027 #include "database.h"
00028 #include "chert_dbstats.h"
00029 #include "chert_positionlist.h"
00030 #include "chert_postlist.h"
00031 #include "chert_record.h"
00032 #include "chert_spelling.h"
00033 #include "chert_synonym.h"
00034 #include "chert_termlisttable.h"
00035 #include "chert_values.h"
00036 #include "chert_version.h"
00037 #include "../flint_lock.h"
00038 #include "chert_types.h"
00039 #include "valuestats.h"
00040
00041 #include <map>
00042
00043 class ChertTermList;
00044 class ChertAllDocsPostList;
00045 class RemoteConnection;
00046
00050 class ChertDatabase : public Xapian::Database::Internal {
00051 friend class ChertWritableDatabase;
00052 friend class ChertTermList;
00053 friend class ChertPostList;
00054 friend class ChertAllTermsList;
00055 friend class ChertAllDocsPostList;
00056 private:
00059 std::string db_dir;
00060
00063 bool readonly;
00064
00069 ChertVersion version_file;
00070
00077 mutable ChertPostListTable postlist_table;
00078
00081 ChertPositionListTable position_table;
00082
00085 ChertTermListTable termlist_table;
00086
00088 mutable ChertValueManager value_manager;
00089
00092 mutable ChertSynonymTable synonym_table;
00093
00096 mutable ChertSpellingTable spelling_table;
00097
00106 ChertRecordTable record_table;
00107
00109 FlintLock lock;
00110
00113 unsigned int max_changesets;
00114
00116 ChertDatabaseStats stats;
00117
00121 bool database_exists();
00122
00126 void create_and_open_tables(unsigned int blocksize);
00127
00133 void open_tables_consistent();
00134
00142 void get_database_write_lock(bool creating);
00143
00149 void open_tables(chert_revision_number_t revision);
00150
00156 chert_revision_number_t get_revision_number() const;
00157
00163 chert_revision_number_t get_next_revision_number() const;
00164
00175 void set_revision_number(chert_revision_number_t new_revision);
00176
00180 void reopen();
00181
00184 void close();
00185
00191 void modifications_failed(chert_revision_number_t old_revision,
00192 chert_revision_number_t new_revision,
00193 const std::string & msg);
00194
00203 void apply();
00204
00207 void cancel();
00208
00211 void send_whole_database(RemoteConnection & conn, double end_time);
00212
00215 void get_changeset_revisions(const string & path,
00216 chert_revision_number_t * startrev,
00217 chert_revision_number_t * endrev) const;
00218 public:
00238 ChertDatabase(const string &db_dir_, int action = XAPIAN_DB_READONLY,
00239 unsigned int block_size = 0u);
00240
00241 ~ChertDatabase();
00242
00244 ChertCursor * get_postlist_cursor() const {
00245 return postlist_table.cursor_get();
00246 }
00247
00250 Xapian::doccount get_doccount() const;
00251 Xapian::docid get_lastdocid() const;
00252 totlen_t get_total_length() const;
00253 Xapian::doclength get_avlength() const;
00254 Xapian::termcount get_doclength(Xapian::docid did) const;
00255 Xapian::doccount get_termfreq(const string & tname) const;
00256 Xapian::termcount get_collection_freq(const string & tname) const;
00257 Xapian::doccount get_value_freq(Xapian::valueno slot) const;
00258 std::string get_value_lower_bound(Xapian::valueno slot) const;
00259 std::string get_value_upper_bound(Xapian::valueno slot) const;
00260 Xapian::termcount get_doclength_lower_bound() const;
00261 Xapian::termcount get_doclength_upper_bound() const;
00262 Xapian::termcount get_wdf_upper_bound(const string & term) const;
00263 bool term_exists(const string & tname) const;
00264 bool has_positions() const;
00265
00266 LeafPostList * open_post_list(const string & tname) const;
00267 ValueList * open_value_list(Xapian::valueno slot) const;
00268 Xapian::Document::Internal * open_document(Xapian::docid did, bool lazy) const;
00269
00270 PositionList * open_position_list(Xapian::docid did, const string & term) const;
00271 TermList * open_term_list(Xapian::docid did) const;
00272 TermList * open_allterms(const string & prefix) const;
00273
00274 TermList * open_spelling_termlist(const string & word) const;
00275 TermList * open_spelling_wordlist() const;
00276 Xapian::doccount get_spelling_frequency(const string & word) const;
00277
00278 TermList * open_synonym_termlist(const string & term) const;
00279 TermList * open_synonym_keylist(const string & prefix) const;
00280
00281 string get_metadata(const string & key) const;
00282 TermList * open_metadata_keylist(const std::string &prefix) const;
00283 void write_changesets_to_fd(int fd,
00284 const string & start_revision,
00285 bool need_whole_db,
00286 Xapian::ReplicationInfo * info);
00287 string get_revision_info() const;
00288 string get_uuid() const;
00290
00291 };
00292
00295 class ChertWritableDatabase : public ChertDatabase {
00297 mutable map<string, pair<Xapian::termcount_diff, Xapian::termcount_diff> >
00298 freq_deltas;
00299
00301 mutable map<Xapian::docid, Xapian::termcount> doclens;
00302
00304 mutable map<string, map<Xapian::docid,
00305 pair<char, Xapian::termcount> > > mod_plists;
00306
00307 mutable map<Xapian::valueno, ValueStats> value_stats;
00308
00312 mutable Xapian::doccount change_count;
00313
00315 Xapian::doccount flush_threshold;
00316
00323 mutable Xapian::Document::Internal * modify_shortcut_document;
00324
00327 mutable Xapian::docid modify_shortcut_docid;
00328
00330 void flush_postlist_changes() const;
00331
00333 void close();
00334
00336 void apply();
00337
00344 void add_freq_delta(const string & tname,
00345 Xapian::termcount_diff tf_delta,
00346 Xapian::termcount_diff cf_delta);
00347
00354 void insert_mod_plist(Xapian::docid did,
00355 const string & tname,
00356 Xapian::termcount wdf);
00357
00369 void update_mod_plist(Xapian::docid did,
00370 const string & tname,
00371 char type,
00372 Xapian::termcount wdf);
00373
00375
00378 void commit();
00379
00381 void cancel();
00382
00383 Xapian::docid add_document(const Xapian::Document & document);
00384 Xapian::docid add_document_(Xapian::docid did, const Xapian::Document & document);
00385
00386
00387
00388
00389
00390 #ifndef _MSC_VER
00391 using Xapian::Database::Internal::delete_document;
00392 using Xapian::Database::Internal::replace_document;
00393 #endif
00394 void delete_document(Xapian::docid did);
00395 void replace_document(Xapian::docid did, const Xapian::Document & document);
00396
00397 Xapian::Document::Internal * open_document(Xapian::docid did,
00398 bool lazy) const;
00399
00401
00402 public:
00414 ChertWritableDatabase(const string &dir, int action, int block_size);
00415
00416 ~ChertWritableDatabase();
00417
00420 Xapian::termcount get_doclength(Xapian::docid did) const;
00421 Xapian::doccount get_termfreq(const string & tname) const;
00422 Xapian::termcount get_collection_freq(const string & tname) const;
00423 Xapian::doccount get_value_freq(Xapian::valueno slot) const;
00424 std::string get_value_lower_bound(Xapian::valueno slot) const;
00425 std::string get_value_upper_bound(Xapian::valueno slot) const;
00426 bool term_exists(const string & tname) const;
00427
00428 LeafPostList * open_post_list(const string & tname) const;
00429 ValueList * open_value_list(Xapian::valueno slot) const;
00430 TermList * open_allterms(const string & prefix) const;
00431
00432 void add_spelling(const string & word, Xapian::termcount freqinc) const;
00433 void remove_spelling(const string & word, Xapian::termcount freqdec) const;
00434 TermList * open_spelling_wordlist() const;
00435
00436 TermList * open_synonym_keylist(const string & prefix) const;
00437 void add_synonym(const string & word, const string & synonym) const;
00438 void remove_synonym(const string & word, const string & synonym) const;
00439 void clear_synonyms(const string & word) const;
00440
00441 void set_metadata(const string & key, const string & value);
00442 void invalidate_doc_object(Xapian::Document::Internal * obj) const;
00444 };
00445
00446 #endif