aboutsummaryrefslogtreecommitdiffstats
path: root/streamingvisitors/src/vespa
diff options
context:
space:
mode:
authorGeir Storli <geirst@yahooinc.com>2023-04-20 13:53:05 +0000
committerGeir Storli <geirst@yahooinc.com>2023-04-20 14:07:29 +0000
commitea513ec5e898b82c97a1a161c06698843bf43d69 (patch)
tree32187aaf1cb1274c791c75754438e74bfa67f91a /streamingvisitors/src/vespa
parent687be0d6e22caca23708de1493fb483069bbab0a (diff)
Provide FieldPathMap and IQueryEnvironment when preparing streaming searchers.
This is required to prepare the NearestNeighborFieldSearcher.
Diffstat (limited to 'streamingvisitors/src/vespa')
-rw-r--r--streamingvisitors/src/vespa/searchvisitor/rankprocessor.h1
-rw-r--r--streamingvisitors/src/vespa/searchvisitor/searchvisitor.cpp22
-rw-r--r--streamingvisitors/src/vespa/searchvisitor/searchvisitor.h7
-rw-r--r--streamingvisitors/src/vespa/vsm/searcher/boolfieldsearcher.cpp7
-rw-r--r--streamingvisitors/src/vespa/vsm/searcher/boolfieldsearcher.h5
-rw-r--r--streamingvisitors/src/vespa/vsm/searcher/fieldsearcher.cpp13
-rw-r--r--streamingvisitors/src/vespa/vsm/searcher/fieldsearcher.h14
-rw-r--r--streamingvisitors/src/vespa/vsm/searcher/floatfieldsearcher.cpp7
-rw-r--r--streamingvisitors/src/vespa/vsm/searcher/floatfieldsearcher.h5
-rw-r--r--streamingvisitors/src/vespa/vsm/searcher/geo_pos_field_searcher.cpp8
-rw-r--r--streamingvisitors/src/vespa/vsm/searcher/geo_pos_field_searcher.h5
-rw-r--r--streamingvisitors/src/vespa/vsm/searcher/intfieldsearcher.cpp7
-rw-r--r--streamingvisitors/src/vespa/vsm/searcher/intfieldsearcher.h5
-rw-r--r--streamingvisitors/src/vespa/vsm/searcher/mock_field_searcher_env.h48
-rw-r--r--streamingvisitors/src/vespa/vsm/searcher/nearest_neighbor_field_searcher.cpp18
-rw-r--r--streamingvisitors/src/vespa/vsm/searcher/nearest_neighbor_field_searcher.h8
-rw-r--r--streamingvisitors/src/vespa/vsm/searcher/strchrfieldsearcher.cpp7
-rw-r--r--streamingvisitors/src/vespa/vsm/searcher/strchrfieldsearcher.h5
-rw-r--r--streamingvisitors/src/vespa/vsm/searcher/utf8stringfieldsearcherbase.cpp7
-rw-r--r--streamingvisitors/src/vespa/vsm/searcher/utf8stringfieldsearcherbase.h5
-rw-r--r--streamingvisitors/src/vespa/vsm/vsm/snippetmodifier.cpp10
-rw-r--r--streamingvisitors/src/vespa/vsm/vsm/snippetmodifier.h9
22 files changed, 184 insertions, 39 deletions
diff --git a/streamingvisitors/src/vespa/searchvisitor/rankprocessor.h b/streamingvisitors/src/vespa/searchvisitor/rankprocessor.h
index 039a9386539..c541f62646e 100644
--- a/streamingvisitors/src/vespa/searchvisitor/rankprocessor.h
+++ b/streamingvisitors/src/vespa/searchvisitor/rankprocessor.h
@@ -72,6 +72,7 @@ public:
double getRankScore() const { return _score; }
HitCollector & getHitCollector() { return *_hitCollector; }
uint32_t getDocId() const { return _docId; }
+ search::fef::IQueryEnvironment& get_query_env() { return _queryEnv; }
};
} // namespace streaming
diff --git a/streamingvisitors/src/vespa/searchvisitor/searchvisitor.cpp b/streamingvisitors/src/vespa/searchvisitor/searchvisitor.cpp
index 2caf2de1d0b..7dc0c05cfaa 100644
--- a/streamingvisitors/src/vespa/searchvisitor/searchvisitor.cpp
+++ b/streamingvisitors/src/vespa/searchvisitor/searchvisitor.cpp
@@ -387,7 +387,6 @@ void SearchVisitor::init(const Parameters & params)
StringFieldIdTMap fieldsInQuery;
setupFieldSearchers(additionalFields, fieldsInQuery);
- setupSnippetModifiers();
setupScratchDocument(fieldsInQuery);
@@ -400,9 +399,18 @@ void SearchVisitor::init(const Parameters & params)
const RankManager * rm = _env.getRankManager(searchCluster);
_rankController.setRankManagerSnapshot(rm->getSnapshot());
_rankController.setupRankProcessors(_query, location, wantedSummaryCount, _attrMan, _attributeFields);
- // Depends on hitCollector setup.
+
+ // This depends on _fieldPathMap (from setupScratchDocument),
+ // and IQueryEnvironment (from setupRankProcessors).
+ setupSnippetModifiers();
+
+ // Depends on hitCollector setup and _snippetModifierManager
setupDocsumObjects();
+ // This depends on _fieldPathMap (from setupScratchDocument),
+ // and IQueryEnvironment (from setupRankProcessors).
+ prepare_field_searchers();
+
} else {
LOG(warning, "No query received");
}
@@ -732,9 +740,14 @@ SearchVisitor::setupFieldSearchers(const std::vector<vespalib::string> & additio
_fieldSearchSpecMap.buildFieldsInQuery(_query, fieldsInQuery);
// Connect field names in the query to field searchers
_fieldSearchSpecMap.buildSearcherMap(fieldsInQuery.map(), _fieldSearcherMap);
+}
+void
+SearchVisitor::prepare_field_searchers()
+{
// prepare the field searchers
- _fieldSearcherMap.prepare(_fieldSearchSpecMap.documentTypeMap(), _searchBuffer, _query);
+ _fieldSearcherMap.prepare(_fieldSearchSpecMap.documentTypeMap(), _searchBuffer, _query,
+ *_fieldPathMap, _rankController.getRankProcessor()->get_query_env());
}
void
@@ -742,7 +755,8 @@ SearchVisitor::setupSnippetModifiers()
{
QueryTermList qtl;
_query.getLeafs(qtl);
- _snippetModifierManager.setup(qtl, _fieldSearchSpecMap.specMap(), _fieldSearchSpecMap.documentTypeMap().begin()->second);
+ _snippetModifierManager.setup(qtl, _fieldSearchSpecMap.specMap(), _fieldSearchSpecMap.documentTypeMap().begin()->second,
+ *_fieldPathMap, _rankController.getRankProcessor()->get_query_env());
}
void
diff --git a/streamingvisitors/src/vespa/searchvisitor/searchvisitor.h b/streamingvisitors/src/vespa/searchvisitor/searchvisitor.h
index 06ab2eaeaaa..162c031ac9e 100644
--- a/streamingvisitors/src/vespa/searchvisitor/searchvisitor.h
+++ b/streamingvisitors/src/vespa/searchvisitor/searchvisitor.h
@@ -260,6 +260,13 @@ private:
vsm::StringFieldIdTMap & fieldsInQuery);
/**
+ * Prepare the field searchers for the given query.
+ * This includes connecting the query terms searching a given field to that field searcher,
+ * and setting up objects in the field searcher needed when matching later on.
+ **/
+ void prepare_field_searchers();
+
+ /**
* Setup snippet modifiers for the fields where we have substring search.
* The modifiers will be used when generating docsum.
**/
diff --git a/streamingvisitors/src/vespa/vsm/searcher/boolfieldsearcher.cpp b/streamingvisitors/src/vespa/vsm/searcher/boolfieldsearcher.cpp
index 8c9b556e593..47b88429f06 100644
--- a/streamingvisitors/src/vespa/vsm/searcher/boolfieldsearcher.cpp
+++ b/streamingvisitors/src/vespa/vsm/searcher/boolfieldsearcher.cpp
@@ -25,10 +25,13 @@ BoolFieldSearcher::BoolFieldSearcher(FieldIdT fId) :
BoolFieldSearcher::~BoolFieldSearcher() = default;
-void BoolFieldSearcher::prepare(QueryTermList & qtl, const SharedSearcherBuf & buf)
+void BoolFieldSearcher::prepare(search::streaming::QueryTermList& qtl,
+ const SharedSearcherBuf& buf,
+ const vsm::FieldPathMapT& field_paths,
+ search::fef::IQueryEnvironment& query_env)
{
_terms.clear();
- FieldSearcher::prepare(qtl, buf);
+ FieldSearcher::prepare(qtl, buf, field_paths, query_env);
for (const QueryTerm * qt : qtl) {
if (TRUE == qt->getTerm()) {
_terms.push_back(true);
diff --git a/streamingvisitors/src/vespa/vsm/searcher/boolfieldsearcher.h b/streamingvisitors/src/vespa/vsm/searcher/boolfieldsearcher.h
index f6afef9e507..01c907888c6 100644
--- a/streamingvisitors/src/vespa/vsm/searcher/boolfieldsearcher.h
+++ b/streamingvisitors/src/vespa/vsm/searcher/boolfieldsearcher.h
@@ -11,7 +11,10 @@ public:
std::unique_ptr<FieldSearcher> duplicate() const override;
BoolFieldSearcher(FieldIdT fId);
~BoolFieldSearcher();
- void prepare(search::streaming::QueryTermList & qtl, const SharedSearcherBuf & buf) override;
+ void prepare(search::streaming::QueryTermList& qtl,
+ const SharedSearcherBuf& buf,
+ const vsm::FieldPathMapT& field_paths,
+ search::fef::IQueryEnvironment& query_env) override;
void onValue(const document::FieldValue & fv) override;
private:
std::vector<bool> _terms;
diff --git a/streamingvisitors/src/vespa/vsm/searcher/fieldsearcher.cpp b/streamingvisitors/src/vespa/vsm/searcher/fieldsearcher.cpp
index aad4f9d5aa2..cbf8903caab 100644
--- a/streamingvisitors/src/vespa/vsm/searcher/fieldsearcher.cpp
+++ b/streamingvisitors/src/vespa/vsm/searcher/fieldsearcher.cpp
@@ -105,7 +105,10 @@ bool FieldSearcher::search(const StorageDocument & doc)
return true;
}
-void FieldSearcher::prepare(QueryTermList & qtl, const SharedSearcherBuf &)
+void FieldSearcher::prepare(QueryTermList& qtl,
+ const SharedSearcherBuf&,
+ const vsm::FieldPathMapT&,
+ search::fef::IQueryEnvironment&)
{
FieldSearcherBase::prepare(qtl);
prepareFieldId();
@@ -220,7 +223,11 @@ void FieldSearcher::init()
}
}
-void FieldIdTSearcherMap::prepare(const DocumentTypeIndexFieldMapT & difm, const SharedSearcherBuf & searcherBuf, Query & query)
+void FieldIdTSearcherMap::prepare(const DocumentTypeIndexFieldMapT& difm,
+ const SharedSearcherBuf& searcherBuf,
+ Query& query,
+ const vsm::FieldPathMapT& field_paths,
+ search::fef::IQueryEnvironment& query_env)
{
QueryTermList qtl;
query.getLeafs(qtl);
@@ -244,7 +251,7 @@ void FieldIdTSearcherMap::prepare(const DocumentTypeIndexFieldMapT & difm, const
}
}
/// Should perhaps do a unique on onlyInIndex
- (*it)->prepare(onlyInIndex, searcherBuf);
+ (*it)->prepare(onlyInIndex, searcherBuf, field_paths, query_env);
if (LOG_WOULD_LOG(spam)) {
char tmpBuf[16];
snprintf(tmpBuf, sizeof(tmpBuf), "%d", fid);
diff --git a/streamingvisitors/src/vespa/vsm/searcher/fieldsearcher.h b/streamingvisitors/src/vespa/vsm/searcher/fieldsearcher.h
index 55aabf3c0cf..879902ca514 100644
--- a/streamingvisitors/src/vespa/vsm/searcher/fieldsearcher.h
+++ b/streamingvisitors/src/vespa/vsm/searcher/fieldsearcher.h
@@ -7,6 +7,8 @@
#include <vespa/vsm/common/storagedocument.h>
#include <vespa/vespalib/util/array.h>
+namespace search::fef { class IQueryEnvironment; }
+
namespace vsm {
using termcount_t = size_t;
@@ -54,7 +56,11 @@ public:
~FieldSearcher() override;
virtual std::unique_ptr<FieldSearcher> duplicate() const = 0;
bool search(const StorageDocument & doc);
- virtual void prepare(search::streaming::QueryTermList & qtl, const SharedSearcherBuf & buf);
+ virtual void prepare(search::streaming::QueryTermList& qtl,
+ const SharedSearcherBuf& buf,
+ const vsm::FieldPathMapT& field_paths,
+ search::fef::IQueryEnvironment& query_env);
+
const FieldIdT & field() const { return _field; }
void field(const FieldIdT & v) { _field = v; prepareFieldId(); }
bool prefix() const { return _matchType == PREFIX; }
@@ -142,7 +148,11 @@ using FieldIdTSearcherMapT = std::vector<FieldSearcherContainer>;
class FieldIdTSearcherMap : public FieldIdTSearcherMapT
{
public:
- void prepare(const DocumentTypeIndexFieldMapT & difm, const SharedSearcherBuf & searcherBuf, search::streaming::Query & query);
+ void prepare(const DocumentTypeIndexFieldMapT& difm,
+ const SharedSearcherBuf& searcherBuf,
+ search::streaming::Query& query,
+ const vsm::FieldPathMapT& field_paths,
+ search::fef::IQueryEnvironment& query_env);
};
}
diff --git a/streamingvisitors/src/vespa/vsm/searcher/floatfieldsearcher.cpp b/streamingvisitors/src/vespa/vsm/searcher/floatfieldsearcher.cpp
index 02d8bd8c12a..8585975ca3c 100644
--- a/streamingvisitors/src/vespa/vsm/searcher/floatfieldsearcher.cpp
+++ b/streamingvisitors/src/vespa/vsm/searcher/floatfieldsearcher.cpp
@@ -29,10 +29,13 @@ template<typename T>
FloatFieldSearcherT<T>::~FloatFieldSearcherT() {}
template<typename T>
-void FloatFieldSearcherT<T>::prepare(QueryTermList & qtl, const SharedSearcherBuf & buf)
+void FloatFieldSearcherT<T>::prepare(search::streaming::QueryTermList& qtl,
+ const SharedSearcherBuf& buf,
+ const vsm::FieldPathMapT& field_paths,
+ search::fef::IQueryEnvironment& query_env)
{
_floatTerm.clear();
- FieldSearcher::prepare(qtl, buf);
+ FieldSearcher::prepare(qtl, buf, field_paths, query_env);
for (QueryTermList::const_iterator it=qtl.begin(); it < qtl.end(); it++) {
const QueryTerm * qt = *it;
size_t sz(qt->termLen());
diff --git a/streamingvisitors/src/vespa/vsm/searcher/floatfieldsearcher.h b/streamingvisitors/src/vespa/vsm/searcher/floatfieldsearcher.h
index 80f79fd6491..a25f7a74d64 100644
--- a/streamingvisitors/src/vespa/vsm/searcher/floatfieldsearcher.h
+++ b/streamingvisitors/src/vespa/vsm/searcher/floatfieldsearcher.h
@@ -11,7 +11,10 @@ class FloatFieldSearcherT : public FieldSearcher
public:
FloatFieldSearcherT(FieldIdT fId=0);
~FloatFieldSearcherT();
- void prepare(search::streaming::QueryTermList & qtl, const SharedSearcherBuf & buf) override;
+ void prepare(search::streaming::QueryTermList& qtl,
+ const SharedSearcherBuf& buf,
+ const vsm::FieldPathMapT& field_paths,
+ search::fef::IQueryEnvironment& query_env) override;
void onValue(const document::FieldValue & fv) override;
protected:
class FloatInfo
diff --git a/streamingvisitors/src/vespa/vsm/searcher/geo_pos_field_searcher.cpp b/streamingvisitors/src/vespa/vsm/searcher/geo_pos_field_searcher.cpp
index db93bda7778..6b0bbbb368d 100644
--- a/streamingvisitors/src/vespa/vsm/searcher/geo_pos_field_searcher.cpp
+++ b/streamingvisitors/src/vespa/vsm/searcher/geo_pos_field_searcher.cpp
@@ -28,9 +28,13 @@ GeoPosFieldSearcher::GeoPosFieldSearcher(FieldIdT fId) :
GeoPosFieldSearcher::~GeoPosFieldSearcher() {}
-void GeoPosFieldSearcher::prepare(QueryTermList & qtl, const SharedSearcherBuf & buf) {
+void GeoPosFieldSearcher::prepare(search::streaming::QueryTermList& qtl,
+ const SharedSearcherBuf& buf,
+ const vsm::FieldPathMapT& field_paths,
+ search::fef::IQueryEnvironment& query_env)
+{
_geoPosTerm.clear();
- FieldSearcher::prepare(qtl, buf);
+ FieldSearcher::prepare(qtl, buf, field_paths, query_env);
for (const QueryTerm * qt : qtl) {
const vespalib::string & str = qt->getTermString();
GeoLocationParser parser;
diff --git a/streamingvisitors/src/vespa/vsm/searcher/geo_pos_field_searcher.h b/streamingvisitors/src/vespa/vsm/searcher/geo_pos_field_searcher.h
index 307be1dacab..b3d09594c01 100644
--- a/streamingvisitors/src/vespa/vsm/searcher/geo_pos_field_searcher.h
+++ b/streamingvisitors/src/vespa/vsm/searcher/geo_pos_field_searcher.h
@@ -10,7 +10,10 @@ class GeoPosFieldSearcher : public FieldSearcher {
public:
GeoPosFieldSearcher(FieldIdT fId=0);
~GeoPosFieldSearcher();
- void prepare(search::streaming::QueryTermList & qtl, const SharedSearcherBuf & buf) override;
+ void prepare(search::streaming::QueryTermList& qtl,
+ const SharedSearcherBuf& buf,
+ const vsm::FieldPathMapT& field_paths,
+ search::fef::IQueryEnvironment& query_env) override;
void onValue(const document::FieldValue & fv) override;
void onStructValue(const document::StructFieldValue & fv) override;
std::unique_ptr<FieldSearcher> duplicate() const override;
diff --git a/streamingvisitors/src/vespa/vsm/searcher/intfieldsearcher.cpp b/streamingvisitors/src/vespa/vsm/searcher/intfieldsearcher.cpp
index 8cfb8e6df14..18b286946f7 100644
--- a/streamingvisitors/src/vespa/vsm/searcher/intfieldsearcher.cpp
+++ b/streamingvisitors/src/vespa/vsm/searcher/intfieldsearcher.cpp
@@ -19,10 +19,13 @@ IntFieldSearcher::IntFieldSearcher(FieldIdT fId) :
IntFieldSearcher::~IntFieldSearcher() = default;
-void IntFieldSearcher::prepare(QueryTermList & qtl, const SharedSearcherBuf & buf)
+void IntFieldSearcher::prepare(search::streaming::QueryTermList& qtl,
+ const SharedSearcherBuf& buf,
+ const vsm::FieldPathMapT& field_paths,
+ search::fef::IQueryEnvironment& query_env)
{
_intTerm.clear();
- FieldSearcher::prepare(qtl, buf);
+ FieldSearcher::prepare(qtl, buf, field_paths, query_env);
for (QueryTermList::const_iterator it=qtl.begin(); it < qtl.end(); it++) {
const QueryTerm * qt = *it;
size_t sz(qt->termLen());
diff --git a/streamingvisitors/src/vespa/vsm/searcher/intfieldsearcher.h b/streamingvisitors/src/vespa/vsm/searcher/intfieldsearcher.h
index 6645a5d719a..f9ae098dae5 100644
--- a/streamingvisitors/src/vespa/vsm/searcher/intfieldsearcher.h
+++ b/streamingvisitors/src/vespa/vsm/searcher/intfieldsearcher.h
@@ -11,7 +11,10 @@ public:
std::unique_ptr<FieldSearcher> duplicate() const override;
IntFieldSearcher(FieldIdT fId=0);
~IntFieldSearcher();
- void prepare(search::streaming::QueryTermList & qtl, const SharedSearcherBuf & buf) override;
+ void prepare(search::streaming::QueryTermList& qtl,
+ const SharedSearcherBuf& buf,
+ const vsm::FieldPathMapT& field_paths,
+ search::fef::IQueryEnvironment& query_env) override;
void onValue(const document::FieldValue & fv) override;
protected:
class IntInfo
diff --git a/streamingvisitors/src/vespa/vsm/searcher/mock_field_searcher_env.h b/streamingvisitors/src/vespa/vsm/searcher/mock_field_searcher_env.h
new file mode 100644
index 00000000000..0c872ad120f
--- /dev/null
+++ b/streamingvisitors/src/vespa/vsm/searcher/mock_field_searcher_env.h
@@ -0,0 +1,48 @@
+// Copyright Yahoo. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root.
+
+#pragma once
+
+#include "fieldsearcher.h"
+#include <vespa/searchlib/fef/properties.h>
+#include <vespa/searchlib/fef/tablemanager.h>
+#include <vespa/searchlib/test/mock_attribute_manager.h>
+#include <vespa/searchvisitor/indexenvironment.h>
+#include <vespa/searchvisitor/queryenvironment.h>
+#include <vespa/vsm/common/storagedocument.h>
+
+namespace vsm::test {
+
+/**
+ * Mock of the objects needed to prepare a FieldSearcher.
+ * Only used for unit testing.
+ */
+struct MockFieldSearcherEnv {
+ SharedSearcherBuf buf;
+ vsm::SharedFieldPathMap field_paths;
+ search::fef::TableManager table_mgr;
+ streaming::IndexEnvironment index_env;
+ search::attribute::test::MockAttributeManager attr_mgr;
+ search::fef::Properties query_props;
+ streaming::QueryEnvironment query_env;
+ MockFieldSearcherEnv()
+ : buf(new SearcherBuf(8)),
+ field_paths(std::make_shared<FieldPathMapT>()),
+ table_mgr(),
+ index_env(table_mgr),
+ attr_mgr(),
+ query_props(),
+ query_env("", index_env, query_props, &attr_mgr)
+ {}
+ ~MockFieldSearcherEnv() {}
+ void prepare(FieldSearcher& searcher, search::streaming::QueryTermList& qtl) {
+ searcher.prepare(qtl, buf, *field_paths, query_env);
+ }
+ void prepare(FieldIdTSearcherMap& searcher_map,
+ const DocumentTypeIndexFieldMapT& difm,
+ search::streaming::Query& query) {
+ searcher_map.prepare(difm, buf, query, *field_paths, query_env);
+ }
+};
+
+}
+
diff --git a/streamingvisitors/src/vespa/vsm/searcher/nearest_neighbor_field_searcher.cpp b/streamingvisitors/src/vespa/vsm/searcher/nearest_neighbor_field_searcher.cpp
index 82243d67e5a..045ec9b04a3 100644
--- a/streamingvisitors/src/vespa/vsm/searcher/nearest_neighbor_field_searcher.cpp
+++ b/streamingvisitors/src/vespa/vsm/searcher/nearest_neighbor_field_searcher.cpp
@@ -1,6 +1,8 @@
// Copyright Yahoo. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root.
#include "nearest_neighbor_field_searcher.h"
+#include <vespa/document/datatype/datatype.h>
+#include <vespa/document/datatype/tensor_data_type.h>
#include <vespa/document/fieldvalue/tensorfieldvalue.h>
#include <vespa/searchcommon/attribute/config.h>
#include <vespa/searchlib/fef/iqueryenvironment.h>
@@ -59,6 +61,8 @@ NearestNeighborFieldSearcher::NearestNeighborFieldSearcher(const FieldIdT& fid,
{
}
+NearestNeighborFieldSearcher::~NearestNeighborFieldSearcher() = default;
+
std::unique_ptr<FieldSearcher>
NearestNeighborFieldSearcher::duplicate() const
{
@@ -66,10 +70,18 @@ NearestNeighborFieldSearcher::duplicate() const
}
void
-NearestNeighborFieldSearcher::prepare_new(search::streaming::QueryTermList& qtl, const SharedSearcherBuf&,
- const vespalib::eval::ValueType& tensor_type, search::fef::IQueryEnvironment& query_env)
+NearestNeighborFieldSearcher::prepare(search::streaming::QueryTermList& qtl,
+ const SharedSearcherBuf& buf,
+ const vsm::FieldPathMapT& field_paths,
+ search::fef::IQueryEnvironment& query_env)
{
- _attr = make_attribute(tensor_type);
+ FieldSearcher::prepare(qtl, buf, field_paths, query_env);
+ const auto* tensor_type = field_paths[field()].back().getDataType().cast_tensor();
+ if (tensor_type == nullptr) {
+ vespalib::Issue::report("Data type for field %u is '%s', but expected it to be a tensor type",
+ field(), field_paths[field()].back().getDataType().toString().c_str());
+ }
+ _attr = make_attribute(tensor_type->getTensorType());
_calcs.clear();
for (auto term : qtl) {
auto* nn_term = term->as_nearest_neighbor_query_node();
diff --git a/streamingvisitors/src/vespa/vsm/searcher/nearest_neighbor_field_searcher.h b/streamingvisitors/src/vespa/vsm/searcher/nearest_neighbor_field_searcher.h
index ec78360b216..83f2c444e5a 100644
--- a/streamingvisitors/src/vespa/vsm/searcher/nearest_neighbor_field_searcher.h
+++ b/streamingvisitors/src/vespa/vsm/searcher/nearest_neighbor_field_searcher.h
@@ -40,11 +40,13 @@ private:
public:
NearestNeighborFieldSearcher(const FieldIdT& fid,
search::attribute::DistanceMetric metric);
+ ~NearestNeighborFieldSearcher();
std::unique_ptr<FieldSearcher> duplicate() const override;
- // TODO: change FieldSearcher::prepare() to provide the necessary objects.
- void prepare_new(search::streaming::QueryTermList& qtl, const SharedSearcherBuf& buf,
- const vespalib::eval::ValueType& tensor_type, search::fef::IQueryEnvironment& query_env);
+ void prepare(search::streaming::QueryTermList& qtl,
+ const SharedSearcherBuf& buf,
+ const vsm::FieldPathMapT& field_paths,
+ search::fef::IQueryEnvironment& query_env) override;
void onValue(const document::FieldValue& fv) override;
static search::attribute::DistanceMetric distance_metric_from_string(const vespalib::string& value);
diff --git a/streamingvisitors/src/vespa/vsm/searcher/strchrfieldsearcher.cpp b/streamingvisitors/src/vespa/vsm/searcher/strchrfieldsearcher.cpp
index 1c4ff78ff4a..f15290526d9 100644
--- a/streamingvisitors/src/vespa/vsm/searcher/strchrfieldsearcher.cpp
+++ b/streamingvisitors/src/vespa/vsm/searcher/strchrfieldsearcher.cpp
@@ -7,9 +7,12 @@ using search::streaming::QueryTermList;
namespace vsm {
-void StrChrFieldSearcher::prepare(QueryTermList & qtl, const SharedSearcherBuf & buf)
+void StrChrFieldSearcher::prepare(search::streaming::QueryTermList& qtl,
+ const SharedSearcherBuf& buf,
+ const vsm::FieldPathMapT& field_paths,
+ search::fef::IQueryEnvironment& query_env)
{
- FieldSearcher::prepare(qtl, buf);
+ FieldSearcher::prepare(qtl, buf, field_paths, query_env);
}
void StrChrFieldSearcher::onValue(const document::FieldValue & fv)
diff --git a/streamingvisitors/src/vespa/vsm/searcher/strchrfieldsearcher.h b/streamingvisitors/src/vespa/vsm/searcher/strchrfieldsearcher.h
index 0155c79cddf..c155aaefea9 100644
--- a/streamingvisitors/src/vespa/vsm/searcher/strchrfieldsearcher.h
+++ b/streamingvisitors/src/vespa/vsm/searcher/strchrfieldsearcher.h
@@ -11,7 +11,10 @@ public:
StrChrFieldSearcher() : FieldSearcher(0) { }
StrChrFieldSearcher(FieldIdT fId) : FieldSearcher(fId) { }
void onValue(const document::FieldValue & fv) override;
- void prepare(search::streaming::QueryTermList & qtl, const SharedSearcherBuf & buf) override;
+ void prepare(search::streaming::QueryTermList& qtl,
+ const SharedSearcherBuf& buf,
+ const vsm::FieldPathMapT& field_paths,
+ search::fef::IQueryEnvironment& query_env) override;
private:
size_t shortestTerm() const;
bool matchDoc(const FieldRef & field);
diff --git a/streamingvisitors/src/vespa/vsm/searcher/utf8stringfieldsearcherbase.cpp b/streamingvisitors/src/vespa/vsm/searcher/utf8stringfieldsearcherbase.cpp
index 148cdf2c0c3..f991722d623 100644
--- a/streamingvisitors/src/vespa/vsm/searcher/utf8stringfieldsearcherbase.cpp
+++ b/streamingvisitors/src/vespa/vsm/searcher/utf8stringfieldsearcherbase.cpp
@@ -236,9 +236,12 @@ UTF8StringFieldSearcherBase::UTF8StringFieldSearcherBase(FieldIdT fId) :
UTF8StringFieldSearcherBase::~UTF8StringFieldSearcherBase() {}
void
-UTF8StringFieldSearcherBase::prepare(QueryTermList & qtl, const SharedSearcherBuf & buf)
+UTF8StringFieldSearcherBase::prepare(search::streaming::QueryTermList& qtl,
+ const SharedSearcherBuf& buf,
+ const vsm::FieldPathMapT& field_paths,
+ search::fef::IQueryEnvironment& query_env)
{
- StrChrFieldSearcher::prepare(qtl, buf);
+ StrChrFieldSearcher::prepare(qtl, buf, field_paths, query_env);
_buf = buf;
}
diff --git a/streamingvisitors/src/vespa/vsm/searcher/utf8stringfieldsearcherbase.h b/streamingvisitors/src/vespa/vsm/searcher/utf8stringfieldsearcherbase.h
index f540a7ac457..a017b501660 100644
--- a/streamingvisitors/src/vespa/vsm/searcher/utf8stringfieldsearcherbase.h
+++ b/streamingvisitors/src/vespa/vsm/searcher/utf8stringfieldsearcherbase.h
@@ -107,7 +107,10 @@ public:
UTF8StringFieldSearcherBase();
UTF8StringFieldSearcherBase(FieldIdT fId);
~UTF8StringFieldSearcherBase();
- void prepare(search::streaming::QueryTermList & qtl, const SharedSearcherBuf & buf) override;
+ void prepare(search::streaming::QueryTermList& qtl,
+ const SharedSearcherBuf& buf,
+ const vsm::FieldPathMapT& field_paths,
+ search::fef::IQueryEnvironment& query_env) override;
/**
* Matches the given query term against the given word using suffix match strategy.
*
diff --git a/streamingvisitors/src/vespa/vsm/vsm/snippetmodifier.cpp b/streamingvisitors/src/vespa/vsm/vsm/snippetmodifier.cpp
index 1993f1cf657..2d2d3f24bc6 100644
--- a/streamingvisitors/src/vespa/vsm/vsm/snippetmodifier.cpp
+++ b/streamingvisitors/src/vespa/vsm/vsm/snippetmodifier.cpp
@@ -99,9 +99,11 @@ SnippetModifierManager::SnippetModifierManager() :
SnippetModifierManager::~SnippetModifierManager() {}
void
-SnippetModifierManager::setup(const QueryTermList & queryTerms,
- const FieldSearchSpecMapT & specMap,
- const IndexFieldMapT & indexMap)
+SnippetModifierManager::setup(const QueryTermList& queryTerms,
+ const FieldSearchSpecMapT& specMap,
+ const IndexFieldMapT& indexMap,
+ const vsm::FieldPathMapT& field_paths,
+ search::fef::IQueryEnvironment& query_env)
{
FieldQueryTermMap fqtm;
@@ -130,7 +132,7 @@ SnippetModifierManager::setup(const QueryTermList & queryTerms,
for (auto & entry : _modifiers.map()) {
FieldIdT fId = entry.first;
SnippetModifier & smod = static_cast<SnippetModifier &>(*entry.second);
- smod.getSearcher()->prepare(fqtm[fId], _searchBuf);
+ smod.getSearcher()->prepare(fqtm[fId], _searchBuf, field_paths, query_env);
}
}
diff --git a/streamingvisitors/src/vespa/vsm/vsm/snippetmodifier.h b/streamingvisitors/src/vespa/vsm/vsm/snippetmodifier.h
index 1f8cb952948..c6ca115bda2 100644
--- a/streamingvisitors/src/vespa/vsm/vsm/snippetmodifier.h
+++ b/streamingvisitors/src/vespa/vsm/vsm/snippetmodifier.h
@@ -99,9 +99,14 @@ public:
* @param queryTerms the query terms to take into consideration.
* @param specMap mapping from field id to search spec objects.
* @param fieldMap mapping from index (used in the query) to a list of field ids.
+ * @param field_paths mapping from field id to document::FieldPath.
+ * @param query_env query environment containg e.g. query tensors.
**/
- void setup(const search::streaming::QueryTermList & queryTerms,
- const FieldSearchSpecMapT & specMap, const IndexFieldMapT & fieldMap);
+ void setup(const search::streaming::QueryTermList& queryTerms,
+ const FieldSearchSpecMapT& specMap,
+ const IndexFieldMapT& fieldMap,
+ const vsm::FieldPathMapT& field_paths,
+ search::fef::IQueryEnvironment& query_env);
const FieldModifierMap & getModifiers() const { return _modifiers; }
};