diff options
author | Tor Egge <Tor.Egge@online.no> | 2023-12-13 11:53:33 +0100 |
---|---|---|
committer | Tor Egge <Tor.Egge@online.no> | 2023-12-13 11:53:33 +0100 |
commit | f914f09852aa9a43a75abc5f8543113d9c9e64fd (patch) | |
tree | 1bb008e3e46e72006386d44bc3c59fae3817fabf /searchlib/src/vespa/searchlib/query/streaming/querynode.cpp | |
parent | 32b8a74701ade63457977a36aaa56cdcc5ddaf0a (diff) |
Add DotProductTerm for streaming search.
Diffstat (limited to 'searchlib/src/vespa/searchlib/query/streaming/querynode.cpp')
-rw-r--r-- | searchlib/src/vespa/searchlib/query/streaming/querynode.cpp | 64 |
1 files changed, 56 insertions, 8 deletions
diff --git a/searchlib/src/vespa/searchlib/query/streaming/querynode.cpp b/searchlib/src/vespa/searchlib/query/streaming/querynode.cpp index 7e7d1f1f260..db0fbd5b98e 100644 --- a/searchlib/src/vespa/searchlib/query/streaming/querynode.cpp +++ b/searchlib/src/vespa/searchlib/query/streaming/querynode.cpp @@ -3,6 +3,7 @@ #include "query.h" #include "nearest_neighbor_query_node.h" #include <vespa/searchlib/parsequery/stackdumpiterator.h> +#include <vespa/searchlib/query/streaming/dot_product_term.h> #include <vespa/searchlib/query/streaming/in_term.h> #include <vespa/searchlib/query/tree/term_vector.h> #include <charconv> @@ -33,7 +34,6 @@ QueryNode::Build(const QueryNode * parent, const QueryNodeResultFactory & factor case ParseItem::ITEM_WEAK_AND: case ParseItem::ITEM_EQUIV: case ParseItem::ITEM_WEIGHTED_SET: - case ParseItem::ITEM_DOT_PRODUCT: case ParseItem::ITEM_WAND: case ParseItem::ITEM_NOT: case ParseItem::ITEM_PHRASE: @@ -184,14 +184,12 @@ QueryNode::Build(const QueryNode * parent, const QueryNodeResultFactory & factor case ParseItem::ITEM_NUMERIC_IN: qn = std::make_unique<InTerm>(factory.create(), queryRep.getIndexName(), queryRep.get_terms()); break; + case ParseItem::ITEM_DOT_PRODUCT: + qn = build_dot_product_term(factory, queryRep); + break; default: - { - for (uint32_t skipCount = arity; (skipCount > 0) && queryRep.next(); skipCount--) { - skipCount += queryRep.getArity(); - LOG(warning, "Does not understand anything,.... skipping %d", type); - } - } - break; + skip_unknown(queryRep); + break; } return qn; } @@ -219,4 +217,54 @@ QueryNode::build_nearest_neighbor_query_node(const QueryNodeResultFactory& facto weight); } +void +QueryNode::populate_multi_term(MultiTerm& mt, SimpleQueryStackDumpIterator& queryRep) +{ + char buf[24]; + vespalib::string subterm; + auto arity = queryRep.getArity(); + for (size_t i = 0; i < arity && queryRep.next(); i++) { + std::unique_ptr<QueryTerm> term; + switch (queryRep.getType()) { + case ParseItem::ITEM_PURE_WEIGHTED_STRING: + term = std::make_unique<QueryTerm>(std::unique_ptr<QueryNodeResultBase>(), queryRep.getTerm(), "", QueryTermSimple::Type::WORD); + break; + case ParseItem::ITEM_PURE_WEIGHTED_LONG: + { + auto res = std::to_chars(buf, buf + sizeof(buf), queryRep.getIntergerTerm(), 10); + subterm.assign(buf, res.ptr - buf); + term = std::make_unique<QueryTerm>(std::unique_ptr<QueryNodeResultBase>(), subterm, "", QueryTermSimple::Type::WORD); + } + break; + default: + skip_unknown(queryRep); + break; + } + if (term) { + term->setWeight(queryRep.GetWeight()); + mt.add_term(std::move(term)); + } + } +} + +std::unique_ptr<QueryNode> +QueryNode::build_dot_product_term(const QueryNodeResultFactory& factory, SimpleQueryStackDumpIterator& queryRep) +{ + auto dp =std::make_unique<DotProductTerm>(factory.create(), queryRep.getIndexName(), queryRep.getArity()); + dp->setWeight(queryRep.GetWeight()); + dp->setUniqueId(queryRep.getUniqueId()); + populate_multi_term(*dp, queryRep); + return dp; +} + +void +QueryNode::skip_unknown(SimpleQueryStackDumpIterator& queryRep) +{ + auto type = queryRep.getType(); + for (uint32_t skipCount = queryRep.getArity(); (skipCount > 0) && queryRep.next(); skipCount--) { + skipCount += queryRep.getArity(); + LOG(warning, "Does not understand anything,.... skipping %d", type); + } +} + } |