00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022 #include <config.h>
00023 #include <xapian/postingiterator.h>
00024 #include <xapian/positioniterator.h>
00025 #include "postlist.h"
00026 #include "debuglog.h"
00027 #include "omassert.h"
00028
00029 using namespace std;
00030
00031 Xapian::PostingIterator::PostingIterator(Internal *internal_)
00032 : internal(internal_)
00033 {
00034 if (internal.get()) {
00035
00036 Internal *p = internal->next();
00037 if (p) internal = p;
00038 if (internal->at_end()) internal = 0;
00039 }
00040 }
00041
00042 Xapian::PostingIterator::PostingIterator() : internal(0) {
00043 LOGCALL_VOID(API, "Xapian::PostingIterator::PostingIterator", NO_ARGS);
00044 }
00045
00046 Xapian::PostingIterator::~PostingIterator() {
00047 LOGCALL_VOID(API, "Xapian::PostingIterator::~PostingIterator", NO_ARGS);
00048 }
00049
00050 Xapian::PostingIterator::PostingIterator(const Xapian::PostingIterator &other)
00051 : internal(other.internal)
00052 {
00053 LOGCALL_VOID(API, "Xapian::PostingIterator::Xapian::PostingIterator", other);
00054 }
00055
00056 void
00057 Xapian::PostingIterator::operator=(const Xapian::PostingIterator &other)
00058 {
00059 LOGCALL_VOID(API, "Xapian::PostingIterator::operator=", other);
00060 internal = other.internal;
00061 }
00062
00063 Xapian::docid
00064 Xapian::PostingIterator::operator *() const
00065 {
00066 LOGCALL(API, Xapian::docid, "Xapian::PostingIterator::operator*", NO_ARGS);
00067 Assert(internal.get());
00068 Assert(!internal->at_end());
00069 RETURN(internal->get_docid());
00070 }
00071
00072 Xapian::PostingIterator &
00073 Xapian::PostingIterator::operator++()
00074 {
00075 LOGCALL_VOID(API, "Xapian::PostingIterator::operator++", NO_ARGS);
00076 Assert(internal.get());
00077 Assert(!internal->at_end());
00078 Internal *p = internal->next();
00079 if (p) internal = p;
00080 if (internal->at_end()) internal = 0;
00081 return *this;
00082 }
00083
00084
00085 void
00086 Xapian::PostingIterator::skip_to(Xapian::docid did)
00087 {
00088 LOGCALL_VOID(API, "Xapian::PostingIterator::skip_to", did);
00089 Assert(internal.get());
00090 Assert(!internal->at_end());
00091 PostList *p = internal->skip_to(did, 0);
00092 if (p) internal = p;
00093 if (internal->at_end()) internal = 0;
00094 }
00095
00096 Xapian::termcount
00097 Xapian::PostingIterator::get_doclength() const
00098 {
00099 LOGCALL(API, Xapian::termcount, "Xapian::PostingIterator::get_doclength", NO_ARGS);
00100 Assert(internal.get());
00101 Assert(!internal->at_end());
00102 RETURN(internal->get_doclength());
00103 }
00104
00105 Xapian::termcount
00106 Xapian::PostingIterator::get_wdf() const
00107 {
00108 LOGCALL(API, Xapian::termcount, "Xapian::PostingIterator::get_wdf", NO_ARGS);
00109 Assert(internal.get());
00110 Assert(!internal->at_end());
00111 RETURN(internal->get_wdf());
00112 }
00113
00114 Xapian::PositionIterator
00115 Xapian::PostingIterator::positionlist_begin() const
00116 {
00117 LOGCALL(API, Xapian::PositionIterator, "Xapian::PostingIterator::positionlist_begin", NO_ARGS);
00118 Assert(internal.get());
00119 Assert(!internal->at_end());
00120 RETURN(Xapian::PositionIterator(internal->open_position_list()));
00121 }
00122
00123 string
00124 Xapian::PostingIterator::get_description() const
00125 {
00126 string desc = "Xapian::PostingIterator(pos=";
00127 if (internal.get() == 0) {
00128 desc += "END";
00129 } else {
00130 desc += internal->get_description();
00131 }
00132 desc += ")";
00133 return desc;
00134 }