aboutsummaryrefslogtreecommitdiffstats
path: root/streamingvisitors/src/vespa/searchvisitor/rankmanager.cpp
diff options
context:
space:
mode:
authorTor Egge <Tor.Egge@online.no>2024-03-20 11:10:54 +0100
committerTor Egge <Tor.Egge@online.no>2024-03-20 11:10:54 +0100
commitcaed98d39b292eece8e950fad9b0662d1e2a04d4 (patch)
tree129b8af0dfb683d031e47cef086fe673e0bb09f7 /streamingvisitors/src/vespa/searchvisitor/rankmanager.cpp
parent7938460dd3b3d72ec1900febe29c1a94db964648 (diff)
Reapply add virtual fields to index environment for streaming mode.
Diffstat (limited to 'streamingvisitors/src/vespa/searchvisitor/rankmanager.cpp')
-rw-r--r--streamingvisitors/src/vespa/searchvisitor/rankmanager.cpp42
1 files changed, 34 insertions, 8 deletions
diff --git a/streamingvisitors/src/vespa/searchvisitor/rankmanager.cpp b/streamingvisitors/src/vespa/searchvisitor/rankmanager.cpp
index 3efeb8ef168..c1ca5daf1cb 100644
--- a/streamingvisitors/src/vespa/searchvisitor/rankmanager.cpp
+++ b/streamingvisitors/src/vespa/searchvisitor/rankmanager.cpp
@@ -78,20 +78,37 @@ IndexEnvPrototype::detectFields(const vespa::config::search::vsm::VsmfieldsConfi
}
}
+void
+IndexEnvPrototype::add_virtual_fields()
+{
+ _prototype.add_virtual_fields();
+}
+
namespace {
FieldIdTList
buildFieldSet(const VsmfieldsConfig::Documenttype::Index & ci, const search::fef::IIndexEnvironment & indexEnv,
- const VsmfieldsConfig::Documenttype::IndexVector & indexes)
+ const VsmfieldsConfig::Documenttype::IndexVector & indexes, bool prefer_virtual_fields)
{
LOG(spam, "Index %s with %zd fields", ci.name.c_str(), ci.field.size());
FieldIdTList ifm;
+ if (prefer_virtual_fields) {
+ /*
+ * Stop at an existing virtual field when setting up views
+ * used by the same element query operator.
+ */
+ auto info = indexEnv.getFieldByName(ci.name);
+ if (info != nullptr && info->type() == search::fef::FieldType::VIRTUAL) {
+ ifm.push_back(info->id());
+ return ifm;
+ }
+ }
for (const VsmfieldsConfig::Documenttype::Index::Field & cf : ci.field) {
LOG(spam, "Parsing field %s", cf.name.c_str());
auto foundIndex = std::find_if(indexes.begin(), indexes.end(),
[&cf](const auto & v) { return v.name == cf.name;});
if ((foundIndex != indexes.end()) && (cf.name != ci.name)) {
- FieldIdTList sub = buildFieldSet(*foundIndex, indexEnv, indexes);
+ FieldIdTList sub = buildFieldSet(*foundIndex, indexEnv, indexes, prefer_virtual_fields);
ifm.insert(ifm.end(), sub.begin(), sub.end());
} else {
const FieldInfo * info = indexEnv.getFieldByName(cf.name);
@@ -111,15 +128,15 @@ buildFieldSet(const VsmfieldsConfig::Documenttype::Index & ci, const search::fef
}
void
-RankManager::Snapshot::buildFieldMappings(const VsmfieldsHandle & fields)
+RankManager::Snapshot::build_field_mappings(const VsmfieldsHandle& fields, ViewMap& views, bool prefer_virtual_fields)
{
for(const VsmfieldsConfig::Documenttype & di : fields->documenttype) {
LOG(debug, "Looking through indexes for documenttype '%s'", di.name.c_str());
for(const VsmfieldsConfig::Documenttype::Index & ci : di.index) {
- FieldIdTList view = buildFieldSet(ci, _protoEnv.current(), di.index);
- if (_views.find(ci.name) == _views.end()) {
+ FieldIdTList view = buildFieldSet(ci, _protoEnv.current(), di.index, prefer_virtual_fields);
+ if (views.find(ci.name) == views.end()) {
std::sort(view.begin(), view.end()); // lowest field id first
- _views[ci.name] = view;
+ views[ci.name] = view;
} else {
LOG(warning, "We already have a view for index '%s'. Drop the new view.", ci.name.c_str());
}
@@ -127,6 +144,13 @@ RankManager::Snapshot::buildFieldMappings(const VsmfieldsHandle & fields)
}
}
+void
+RankManager::Snapshot::build_field_mappings(const VsmfieldsHandle& fields)
+{
+ build_field_mappings(fields, _views, false);
+ build_field_mappings(fields, _same_element_views, true);
+}
+
bool
RankManager::Snapshot::initRankSetup(const BlueprintFactory & factory)
{
@@ -170,7 +194,8 @@ RankManager::Snapshot::Snapshot() :
_indexEnv(),
_rankSetup(),
_rpmap(),
- _views()
+ _views(),
+ _same_element_views()
{
}
@@ -181,7 +206,8 @@ RankManager::Snapshot::setup(const RankManager & rm)
{
VsmfieldsHandle fields = rm._vsmAdapter->getFieldsConfig();
_protoEnv.detectFields(*fields);
- buildFieldMappings(fields);
+ _protoEnv.add_virtual_fields();
+ build_field_mappings(fields);
if (!initRankSetup(rm._blueprintFactory)) {
return false;
}