aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorTor Egge <Tor.Egge@online.no>2024-03-18 17:24:35 +0100
committerTor Egge <Tor.Egge@online.no>2024-03-18 17:24:35 +0100
commitb700eeb73d8de490cdafbc3d004ed091e71e3c9e (patch)
tree62c710558ace31723020bf73e48d917a9d95ec3f
parent4b5012817431e6cb91a2d19235ffa768cf6cf88f (diff)
Use multi_index_terms() returning boolean to differentiate between
multi term nodes that all searches the same index (e.g. Phrase) and multi term nodes that searches multiple indexes (e.g. Equiv, SameElement).
-rw-r--r--searchlib/src/vespa/searchlib/query/streaming/equiv_query_node.cpp6
-rw-r--r--searchlib/src/vespa/searchlib/query/streaming/equiv_query_node.h2
-rw-r--r--searchlib/src/vespa/searchlib/query/streaming/multi_term.cpp18
-rw-r--r--searchlib/src/vespa/searchlib/query/streaming/multi_term.h7
-rw-r--r--searchlib/src/vespa/searchlib/query/streaming/queryterm.cpp12
-rw-r--r--searchlib/src/vespa/searchlib/query/streaming/queryterm.h2
-rw-r--r--searchlib/src/vespa/searchlib/query/streaming/same_element_query_node.cpp6
-rw-r--r--searchlib/src/vespa/searchlib/query/streaming/same_element_query_node.h2
-rw-r--r--streamingvisitors/src/vespa/vsm/searcher/fieldsearcher.cpp7
-rw-r--r--streamingvisitors/src/vespa/vsm/vsm/fieldsearchspec.cpp6
10 files changed, 45 insertions, 23 deletions
diff --git a/searchlib/src/vespa/searchlib/query/streaming/equiv_query_node.cpp b/searchlib/src/vespa/searchlib/query/streaming/equiv_query_node.cpp
index 4367dc1cd69..8878c8c5cdc 100644
--- a/searchlib/src/vespa/searchlib/query/streaming/equiv_query_node.cpp
+++ b/searchlib/src/vespa/searchlib/query/streaming/equiv_query_node.cpp
@@ -81,10 +81,10 @@ EquivQueryNode::unpack_match_data(uint32_t docid, const fef::ITermData& td, fef:
unpack_match_data_helper(docid, td, match_data, hit_list, *this, is_filter(), index_env);
}
-const MultiTerm*
-EquivQueryNode::as_multi_index_multi_term() const noexcept
+bool
+EquivQueryNode::multi_index_terms() const noexcept
{
- return this;
+ return true;
}
const EquivQueryNode*
diff --git a/searchlib/src/vespa/searchlib/query/streaming/equiv_query_node.h b/searchlib/src/vespa/searchlib/query/streaming/equiv_query_node.h
index ac87e14150b..997a861ee44 100644
--- a/searchlib/src/vespa/searchlib/query/streaming/equiv_query_node.h
+++ b/searchlib/src/vespa/searchlib/query/streaming/equiv_query_node.h
@@ -17,7 +17,7 @@ public:
bool evaluate() const override;
const HitList & evaluateHits(HitList & hl) const override;
void unpack_match_data(uint32_t docid, const fef::ITermData& td, fef::MatchData& match_data, const fef::IIndexEnvironment& index_env) override;
- const MultiTerm* as_multi_index_multi_term() const noexcept override;
+ bool multi_index_terms() const noexcept override;
const EquivQueryNode* as_equiv_query_node() const noexcept override;
std::vector<std::unique_ptr<QueryTerm>> steal_terms();
};
diff --git a/searchlib/src/vespa/searchlib/query/streaming/multi_term.cpp b/searchlib/src/vespa/searchlib/query/streaming/multi_term.cpp
index f5a09892551..2a96a967215 100644
--- a/searchlib/src/vespa/searchlib/query/streaming/multi_term.cpp
+++ b/searchlib/src/vespa/searchlib/query/streaming/multi_term.cpp
@@ -51,4 +51,22 @@ MultiTerm::evaluate() const
return false;
}
+MultiTerm*
+MultiTerm::as_multi_term() noexcept
+{
+ return this;
+}
+
+const MultiTerm*
+MultiTerm::as_multi_term() const noexcept
+{
+ return this;
+}
+
+bool
+MultiTerm::multi_index_terms() const noexcept
+{
+ return false;
+}
+
}
diff --git a/searchlib/src/vespa/searchlib/query/streaming/multi_term.h b/searchlib/src/vespa/searchlib/query/streaming/multi_term.h
index 9bf5f8de6b2..a2ae3d30d52 100644
--- a/searchlib/src/vespa/searchlib/query/streaming/multi_term.h
+++ b/searchlib/src/vespa/searchlib/query/streaming/multi_term.h
@@ -29,7 +29,12 @@ public:
std::unique_ptr<query::TermVector> terms, Normalizing normalizing);
~MultiTerm() override;
void add_term(std::unique_ptr<QueryTerm> term);
- MultiTerm* as_multi_term() noexcept override { return this; }
+ MultiTerm* as_multi_term() noexcept override;
+ const MultiTerm* as_multi_term() const noexcept override;
+ /*
+ * Terms below search in different indexes when multi_index_terms() returns true.
+ */
+ virtual bool multi_index_terms() const noexcept;
void reset() override;
bool evaluate() const override;
const std::vector<std::unique_ptr<QueryTerm>>& get_terms() const noexcept { return _terms; }
diff --git a/searchlib/src/vespa/searchlib/query/streaming/queryterm.cpp b/searchlib/src/vespa/searchlib/query/streaming/queryterm.cpp
index 8a1fe2004d0..07fc60d2243 100644
--- a/searchlib/src/vespa/searchlib/query/streaming/queryterm.cpp
+++ b/searchlib/src/vespa/searchlib/query/streaming/queryterm.cpp
@@ -135,20 +135,20 @@ QueryTerm::as_multi_term() noexcept
return nullptr;
}
-RegexpTerm*
-QueryTerm::as_regexp_term() noexcept
+const MultiTerm*
+QueryTerm::as_multi_term() const noexcept
{
return nullptr;
}
-FuzzyTerm*
-QueryTerm::as_fuzzy_term() noexcept
+RegexpTerm*
+QueryTerm::as_regexp_term() noexcept
{
return nullptr;
}
-const MultiTerm*
-QueryTerm::as_multi_index_multi_term() const noexcept
+FuzzyTerm*
+QueryTerm::as_fuzzy_term() noexcept
{
return nullptr;
}
diff --git a/searchlib/src/vespa/searchlib/query/streaming/queryterm.h b/searchlib/src/vespa/searchlib/query/streaming/queryterm.h
index 4a108d880e9..78b0a1fea7d 100644
--- a/searchlib/src/vespa/searchlib/query/streaming/queryterm.h
+++ b/searchlib/src/vespa/searchlib/query/streaming/queryterm.h
@@ -104,9 +104,9 @@ public:
void setFuzzyPrefixLength(uint32_t fuzzyPrefixLength) { _fuzzyPrefixLength = fuzzyPrefixLength; }
virtual NearestNeighborQueryNode* as_nearest_neighbor_query_node() noexcept;
virtual MultiTerm* as_multi_term() noexcept;
+ virtual const MultiTerm* as_multi_term() const noexcept;
virtual RegexpTerm* as_regexp_term() noexcept;
virtual FuzzyTerm* as_fuzzy_term() noexcept;
- virtual const MultiTerm* as_multi_index_multi_term() const noexcept;
virtual const EquivQueryNode* as_equiv_query_node() const noexcept;
virtual void unpack_match_data(uint32_t docid, const fef::ITermData& td, fef::MatchData& match_data, const fef::IIndexEnvironment& index_env);
protected:
diff --git a/searchlib/src/vespa/searchlib/query/streaming/same_element_query_node.cpp b/searchlib/src/vespa/searchlib/query/streaming/same_element_query_node.cpp
index ae1ae8d5230..cd9c693ca1c 100644
--- a/searchlib/src/vespa/searchlib/query/streaming/same_element_query_node.cpp
+++ b/searchlib/src/vespa/searchlib/query/streaming/same_element_query_node.cpp
@@ -89,10 +89,10 @@ SameElementQueryNode::unpack_match_data(uint32_t docid, const fef::ITermData& td
}
}
-const MultiTerm*
-SameElementQueryNode::as_multi_index_multi_term() const noexcept
+bool
+SameElementQueryNode::multi_index_terms() const noexcept
{
- return this;
+ return true;
}
}
diff --git a/searchlib/src/vespa/searchlib/query/streaming/same_element_query_node.h b/searchlib/src/vespa/searchlib/query/streaming/same_element_query_node.h
index 8955071ba4a..37fb3dbba52 100644
--- a/searchlib/src/vespa/searchlib/query/streaming/same_element_query_node.h
+++ b/searchlib/src/vespa/searchlib/query/streaming/same_element_query_node.h
@@ -17,7 +17,7 @@ public:
bool evaluate() const override;
const HitList & evaluateHits(HitList & hl) const override;
void unpack_match_data(uint32_t docid, const fef::ITermData& td, fef::MatchData& match_data, const fef::IIndexEnvironment& index_env) override;
- const MultiTerm* as_multi_index_multi_term() const noexcept override;
+ bool multi_index_terms() const noexcept override;
};
}
diff --git a/streamingvisitors/src/vespa/vsm/searcher/fieldsearcher.cpp b/streamingvisitors/src/vespa/vsm/searcher/fieldsearcher.cpp
index b03ae07c910..38e12a3054d 100644
--- a/streamingvisitors/src/vespa/vsm/searcher/fieldsearcher.cpp
+++ b/streamingvisitors/src/vespa/vsm/searcher/fieldsearcher.cpp
@@ -192,9 +192,9 @@ FieldSearcher::init()
void
FieldIdTSearcherMap::prepare_term(const DocumentTypeIndexFieldMapT& difm, QueryTerm* qt, FieldIdT fid, vespalib::hash_set<const void*>& seen, QueryTermList& onlyInIndex)
{
- auto mimt = qt->as_multi_index_multi_term();
- if (mimt != nullptr) {
- for (auto& subterm : mimt->get_terms()) {
+ auto multi_term = qt->as_multi_term();
+ if (multi_term != nullptr && multi_term->multi_index_terms()) {
+ for (auto& subterm : multi_term->get_terms()) {
prepare_term(difm, subterm.get(), fid, seen, onlyInIndex);
}
return;
@@ -206,7 +206,6 @@ FieldIdTSearcherMap::prepare_term(const DocumentTypeIndexFieldMapT& difm, QueryT
const FieldIdTList & index = found->second;
if ((find(index.begin(), index.end(), fid) != index.end()) && !seen.contains(qt)) {
seen.insert(qt);
- auto multi_term = qt->as_multi_term();
if (multi_term != nullptr) {
for (auto& subterm : multi_term->get_terms()) {
onlyInIndex.emplace_back(subterm.get());
diff --git a/streamingvisitors/src/vespa/vsm/vsm/fieldsearchspec.cpp b/streamingvisitors/src/vespa/vsm/vsm/fieldsearchspec.cpp
index 35ce1a07cfb..1dbac859262 100644
--- a/streamingvisitors/src/vespa/vsm/vsm/fieldsearchspec.cpp
+++ b/streamingvisitors/src/vespa/vsm/vsm/fieldsearchspec.cpp
@@ -223,9 +223,9 @@ FieldSearchSpecMap::buildFieldsInQuery(const Query & query) const
query.getLeaves(qtl);
for (const auto & term : qtl) {
- auto mimt = term->as_multi_index_multi_term();
- if (mimt != nullptr) {
- for (const auto& subterm : mimt->get_terms()) {
+ auto multi_term = term->as_multi_term();
+ if (multi_term != nullptr && multi_term->multi_index_terms()) {
+ for (const auto& subterm : multi_term->get_terms()) {
addFieldsFromIndex(subterm->index(), fieldsInQuery);
}
} else {