32 #include "../prefix_compressed_strings.h" 46 for (
auto i : termlist_deltas) {
47 const string& key = i.first;
48 const set<string>& changes = i.second;
50 auto d = changes.begin();
51 if (d == changes.end())
continue;
56 if (get_exact_entry(key, current)) {
58 updated.reserve(current.size());
59 while (!in.
at_end() && d != changes.end()) {
60 const string & word = *in;
61 Assert(d != changes.end());
62 int cmp = word.compare(*d);
83 while (d != changes.end()) {
86 if (!updated.empty()) {
92 termlist_deltas.clear();
94 map<string, Xapian::termcount>::const_iterator j;
95 for (j = wordfreq_changes.begin(); j != wordfreq_changes.end(); ++j) {
96 string key =
"W" + j->first;
105 wordfreq_changes.clear();
111 auto i = termlist_deltas.find(frag);
112 if (i == termlist_deltas.end()) {
113 i = termlist_deltas.insert(make_pair(frag, set<string>())).first;
117 auto res = i->second.insert(word);
120 i->second.erase(res.first);
127 if (word.size() <= 1)
return;
129 map<string, Xapian::termcount>::iterator i = wordfreq_changes.find(word);
130 if (i != wordfreq_changes.end()) {
133 i->second += freqinc;
140 string key =
"W" + word;
142 if (get_exact_entry(key, data)) {
145 const char * p = data.data();
149 wordfreq_changes[word] = freq + freqinc;
152 wordfreq_changes[word] = freqinc;
162 if (word.size() <= 1)
return;
164 map<string, Xapian::termcount>::iterator i = wordfreq_changes.find(word);
165 if (i != wordfreq_changes.end()) {
166 if (i->second == 0) {
171 if (freqdec < i->second) {
172 i->second -= freqdec;
179 string key =
"W" + word;
181 if (!get_exact_entry(key, data)) {
187 const char *p = data.data();
191 if (freqdec < freq) {
192 wordfreq_changes[word] = freq - freqdec;
196 wordfreq_changes[word] = 0;
212 toggle_fragment(buf, word);
216 buf[1] = word[word.size() - 2];
217 buf[2] = word[word.size() - 1];
219 toggle_fragment(buf, word);
221 if (word.size() <= 4) {
231 toggle_fragment(buf, word);
233 if (word.size() > 2) {
237 for (
size_t start = 0; start <= word.size() - 3; ++start) {
238 memcpy(buf.
data + 1, word.data() + start, 3);
241 if (done.insert(buf).second)
242 toggle_fragment(buf, word);
261 if (!wordfreq_changes.empty()) merge_changes();
274 if (get_exact_entry(
string(buf), data))
279 buf[1] = word[word.size() - 2];
280 buf[2] = word[word.size() - 1];
281 if (get_exact_entry(
string(buf), data))
284 if (word.size() <= 4) {
293 if (get_exact_entry(
string(buf), data))
296 if (word.size() > 2) {
299 for (
size_t start = 0; start <= word.size() - 3; ++start) {
300 memcpy(buf.
data + 1, word.data() + start, 3);
301 if (get_exact_entry(
string(buf), data))
305 if (word.size() == 3) {
312 if (get_exact_entry(
string(buf), data))
318 if (get_exact_entry(
string(buf), data))
330 if (get_exact_entry(
string(buf), data))
333 if (get_exact_entry(
string(buf), data))
337 if (pq.empty())
return NULL;
346 while (pq.size() > 1) {
352 termlist =
new OrTermList(pq.top(), termlist);
361 while (!pq.empty()) {
372 map<string, Xapian::termcount>::const_iterator i;
373 i = wordfreq_changes.find(word);
374 if (i != wordfreq_changes.end()) {
379 string key =
"W" + word;
381 if (get_exact_entry(key, data)) {
384 const char *p = data.data();
425 if (p == data.size()) {
430 if (!current_term.empty()) {
431 if (p == data.size())
436 if (p == data.size() ||
439 current_term.append(data.data() + p + 1, add);
447 while (!data.empty() && current_term < term) {
The list of words containing a particular trigram.
Xapian::PositionIterator positionlist_begin() const
Return a PositionIterator for the current position.
Xapian::termcount get_wdf() const
Return the wdf for the term at the current position.
#define AssertRel(A, REL, B)
Merge two TermList objects using an OR operation.
Abstract base class for termlists.
Xapian::doccount get_word_frequency(const std::string &word) const
virtual Xapian::termcount get_approx_size() const =0
Return approximate size of this termlist.
Xapian::termcount positionlist_count() const
Return the length of the position list for the current position.
Hierarchy of classes which Xapian can throw as exceptions.
unsigned XAPIAN_TERMCOUNT_BASE_TYPE termcount
A counts of terms.
void toggle_fragment(fragment frag, const std::string &word)
TermList * open_termlist(const std::string &word)
void pack_uint_last(std::string &s, U value)
Append an encoded unsigned integer to a string as the last item.
Collate statistics and calculate the term weights for the ESet.
TermList * next()
Advance the current position to the next term in the termlist.
Xapian::termcount get_approx_size() const
Return approximate size of this termlist.
std::string get_termname() const
Return the termname at the current position.
Class for iterating over term positions.
void toggle_word(const std::string &word)
bool at_end() const
Return true if the current position is past the last term in this list.
DatabaseCorruptError indicates database corruption was detected.
Spelling correction data for a chert database.
unsigned XAPIAN_DOCID_BASE_TYPE doccount
A count of documents.
TermList * skip_to(const std::string &term)
Skip forward to the specified term.
Xapian::doccount get_termfreq() const
Return the term frequency for the term at the current position.
Pack types into strings and unpack them again.
bool unpack_uint_last(const char **p, const char *end, U *result)
Decode an unsigned integer as the last item in a string.
void append(const std::string &word)
Various assertion macros.
void add_word(const std::string &word, Xapian::termcount freqinc)
bool operator()(const TermList *a, const TermList *b) const
void remove_word(const std::string &word, Xapian::termcount freqdec)
UnimplementedError indicates an attempt to use an unimplemented feature.