Exemplo n.º 1
0
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);
    }
}
Exemplo n.º 2
0
    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();
    }