void ParseCtx::AddEntries(const char* text, size_t textLen) { Stems stems(text, textLen); while (stems.HasMore()) { StemmedWord word = stems.Next(); keybuilder.PushWord(word.stemmed, word.stemmed_len); keybuilder.PushDocSeq(docseq); map[keybuilder.key()][pathArrayOffsets] .push_back({word.stemmed_offset, std::string(word.suffix, word.suffix_len), long(word.suffix_offset - word.stemmed_offset)}); keybuilder.Pop(KeyBuilder::DocSeq); keybuilder.Pop(KeyBuilder::Word); } }
unique_ptr<QueryRuntimeFilter> Compare() { std::string field; if (ConsumeField(&field)) { if (Consume(".")) { kb_.PushObjectKey(field); unique_ptr<QueryRuntimeFilter> ret(Compare()); kb_.PopObjectKey(); return ret; } else if (Consume("=")) { std::string literal; if (!ConsumeStringLiteral(&literal)) Error("value"); Stems stems(literal); unique_ptr<std::vector<unique_ptr<QueryRuntimeFilter> > > filters( new std::vector<unique_ptr<QueryRuntimeFilter> >); kb_.PushObjectKey(field); while (stems.HasMore()) { StemmedWord stem = stems.Next(); unique_ptr<rocksdb::Iterator> itor(ic_.NewIterator()); filters->emplace_back(new ExactWordMatchFilter(itor, stem, kb_)); } kb_.PopObjectKey(); if (filters->size() == 1) return std::move(filters->front()); else return unique_ptr<QueryRuntimeFilter>(new AndFilter(filters, kb_.ArrayDepth())); } else if (CouldConsume("[")) { kb_.PushObjectKey(field); unique_ptr<QueryRuntimeFilter> ret(Array()); kb_.PopObjectKey(); return ret; } Error("Expected comparison or array operator"); } return Factor(); }