diff options
author | Tor Egge <Tor.Egge@online.no> | 2024-03-20 11:10:54 +0100 |
---|---|---|
committer | Tor Egge <Tor.Egge@online.no> | 2024-03-20 11:10:54 +0100 |
commit | caed98d39b292eece8e950fad9b0662d1e2a04d4 (patch) | |
tree | 129b8af0dfb683d031e47cef086fe673e0bb09f7 /streamingvisitors/src/vespa/searchvisitor/rankmanager.cpp | |
parent | 7938460dd3b3d72ec1900febe29c1a94db964648 (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.cpp | 42 |
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; } |