00001
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022 #include <config.h>
00023
00024 #include "brass_metadata.h"
00025
00026 #include "brass_cursor.h"
00027
00028 #include "database.h"
00029 #include "debuglog.h"
00030 #include "omassert.h"
00031 #include "stringutils.h"
00032
00033 #include "xapian/error.h"
00034
00035 using namespace std;
00036
00037 BrassMetadataTermList::BrassMetadataTermList(
00038 Xapian::Internal::RefCntPtr<const Xapian::Database::Internal> database_,
00039 BrassCursor * cursor_,
00040 const string &prefix_)
00041 : database(database_), cursor(cursor_), prefix(string("\x00\xc0", 2) + prefix_)
00042 {
00043 LOGCALL_CTOR(DB, "BrassMetadataTermList", database_ | cursor_ | prefix_);
00044 Assert(cursor);
00045
00046 cursor->find_entry_lt(prefix);
00047 }
00048
00049 BrassMetadataTermList::~BrassMetadataTermList()
00050 {
00051 LOGCALL_DTOR(DB, "BrassMetadataTermList");
00052 delete cursor;
00053 }
00054
00055 string
00056 BrassMetadataTermList::get_termname() const
00057 {
00058 LOGCALL(DB, string, "BrassMetadataTermList::get_termname", NO_ARGS);
00059 Assert(!at_end());
00060 Assert(!cursor->current_key.empty());
00061 Assert(startswith(cursor->current_key, prefix));
00062 RETURN(cursor->current_key.substr(2));
00063 }
00064
00065 Xapian::doccount
00066 BrassMetadataTermList::get_termfreq() const
00067 {
00068 throw Xapian::InvalidOperationError("BrassMetadataTermList::get_termfreq() not meaningful");
00069 }
00070
00071 Xapian::termcount
00072 BrassMetadataTermList::get_collection_freq() const
00073 {
00074 throw Xapian::InvalidOperationError("BrassMetadataTermList::get_collection_freq() not meaningful");
00075 }
00076
00077 TermList *
00078 BrassMetadataTermList::next()
00079 {
00080 LOGCALL(DB, TermList *, "BrassMetadataTermList::next", NO_ARGS);
00081 Assert(!at_end());
00082
00083 cursor->next();
00084 if (!cursor->after_end() && !startswith(cursor->current_key, prefix)) {
00085
00086 cursor->to_end();
00087 }
00088
00089 RETURN(NULL);
00090 }
00091
00092 TermList *
00093 BrassMetadataTermList::skip_to(const string &key)
00094 {
00095 LOGCALL(DB, TermList *, "BrassMetadataTermList::skip_to", key);
00096 Assert(!at_end());
00097
00098 if (!cursor->find_entry_ge(string("\x00\xc0", 2) + key)) {
00099
00100
00101 if (!cursor->after_end() && !startswith(cursor->current_key, prefix)) {
00102
00103 cursor->to_end();
00104 }
00105 }
00106 RETURN(NULL);
00107 }
00108
00109 bool
00110 BrassMetadataTermList::at_end() const
00111 {
00112 LOGCALL(DB, bool, "BrassMetadataTermList::at_end", NO_ARGS);
00113 RETURN(cursor->after_end());
00114 }