00001
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022 #include <config.h>
00023 #include "chert_alldocsmodifiedpostlist.h"
00024
00025 #include "chert_database.h"
00026 #include "debuglog.h"
00027 #include "str.h"
00028
00029 using namespace std;
00030
00031 ChertAllDocsModifiedPostList::ChertAllDocsModifiedPostList(Xapian::Internal::RefCntPtr<const ChertDatabase> db_,
00032 Xapian::doccount doccount_,
00033 const map<Xapian::docid, Xapian::termcount> & doclens_)
00034 : ChertAllDocsPostList(db_, doccount_),
00035 doclens(doclens_),
00036 doclens_it(doclens.begin())
00037 {
00038 LOGCALL_CTOR(DB, "ChertAllDocsModifiedPostList", db_.get() | doccount_ | doclens_);
00039 }
00040
00041 void
00042 ChertAllDocsModifiedPostList::skip_deletes(Xapian::weight w_min)
00043 {
00044 LOGCALL_VOID(DB, "ChertAllDocsModifiedPostList::skip_deletes", w_min);
00045 while (!ChertAllDocsPostList::at_end()) {
00046 if (doclens_it == doclens.end()) return;
00047 if (doclens_it->first != ChertAllDocsPostList::get_docid()) return;
00048 if (doclens_it->second != static_cast<Xapian::termcount>(-1)) return;
00049 ++doclens_it;
00050 ChertAllDocsPostList::next(w_min);
00051 }
00052 while (doclens_it != doclens.end() && doclens_it->second == static_cast<Xapian::termcount>(-1)) {
00053 ++doclens_it;
00054 }
00055 }
00056
00057 Xapian::docid
00058 ChertAllDocsModifiedPostList::get_docid() const
00059 {
00060 LOGCALL(DB, Xapian::docid, "ChertAllDocsModifiedPostList::get_docid()", NO_ARGS);
00061 if (doclens_it == doclens.end()) RETURN(ChertAllDocsPostList::get_docid());
00062 if (ChertAllDocsPostList::at_end()) RETURN(doclens_it->first);
00063 RETURN(min(doclens_it->first, ChertAllDocsPostList::get_docid()));
00064 }
00065
00066 Xapian::termcount
00067 ChertAllDocsModifiedPostList::get_doclength() const
00068 {
00069 LOGCALL(DB, Xapian::termcount, "ChertAllDocsModifiedPostList::get_doclength", NO_ARGS);
00070
00071
00072 if (doclens_it != doclens.end() &&
00073 (ChertAllDocsPostList::at_end() ||
00074 doclens_it->first <= ChertAllDocsPostList::get_docid()))
00075 RETURN(doclens_it->second);
00076
00077 RETURN(ChertAllDocsPostList::get_doclength());
00078 }
00079
00080 PostList *
00081 ChertAllDocsModifiedPostList::next(Xapian::weight w_min)
00082 {
00083 LOGCALL(DB, PostList *, "ChertAllDocsModifiedPostList::next", w_min);
00084 if (have_started) {
00085 if (ChertAllDocsPostList::at_end()) {
00086 ++doclens_it;
00087 skip_deletes(w_min);
00088 RETURN(NULL);
00089 }
00090 Xapian::docid unmod_did = ChertAllDocsPostList::get_docid();
00091 if (doclens_it != doclens.end() && doclens_it->first <= unmod_did) {
00092 if (doclens_it->first < unmod_did &&
00093 doclens_it->second != static_cast<Xapian::termcount>(-1)) {
00094 ++doclens_it;
00095 skip_deletes(w_min);
00096 RETURN(NULL);
00097 }
00098 ++doclens_it;
00099 }
00100 }
00101 ChertAllDocsPostList::next(w_min);
00102 skip_deletes(w_min);
00103 RETURN(NULL);
00104 }
00105
00106 PostList *
00107 ChertAllDocsModifiedPostList::skip_to(Xapian::docid desired_did,
00108 Xapian::weight w_min)
00109 {
00110 LOGCALL(DB, PostList *, "ChertAllDocsModifiedPostList::skip_to", desired_did | w_min);
00111 if (!ChertAllDocsPostList::at_end())
00112 ChertAllDocsPostList::skip_to(desired_did, w_min);
00113
00114 while (doclens_it != doclens.end() && doclens_it->first < desired_did) {
00115 ++doclens_it;
00116 }
00117 skip_deletes(w_min);
00118 RETURN(NULL);
00119 }
00120
00121 bool
00122 ChertAllDocsModifiedPostList::at_end() const
00123 {
00124 LOGCALL(DB, bool, "ChertAllDocsModifiedPostList::end", NO_ARGS);
00125 RETURN(doclens_it == doclens.end() && ChertAllDocsPostList::at_end());
00126 }
00127
00128 string
00129 ChertAllDocsModifiedPostList::get_description() const
00130 {
00131 string desc = "ChertAllDocsModifiedPostList(did=";
00132 desc += str(get_docid());
00133 desc += ')';
00134 return desc;
00135 }