diff options
author | Tor Egge <Tor.Egge@online.no> | 2022-08-29 17:33:04 +0200 |
---|---|---|
committer | Tor Egge <Tor.Egge@online.no> | 2022-08-29 17:33:04 +0200 |
commit | 7032f820c64c6a020483657b76c0ef594114d30f (patch) | |
tree | 5ac756a6623e3dcfa0bde4cdd79d897539d967e0 /streamingvisitors | |
parent | 1e059c5104ba96bf37f9f0ab7c1d08f17cc1fec4 (diff) |
Factor out DocsumFieldWriterFactory.
Diffstat (limited to 'streamingvisitors')
5 files changed, 112 insertions, 64 deletions
diff --git a/streamingvisitors/src/vespa/vsm/vsm/CMakeLists.txt b/streamingvisitors/src/vespa/vsm/vsm/CMakeLists.txt index adc00b341a3..6afb61078c7 100644 --- a/streamingvisitors/src/vespa/vsm/vsm/CMakeLists.txt +++ b/streamingvisitors/src/vespa/vsm/vsm/CMakeLists.txt @@ -3,6 +3,7 @@ vespa_add_library(vsm_vsmbase OBJECT SOURCES docsumfieldspec.cpp docsumfilter.cpp + docsum_field_writer_factory.cpp fieldsearchspec.cpp flattendocsumwriter.cpp slimefieldwriter.cpp diff --git a/streamingvisitors/src/vespa/vsm/vsm/docsum_field_writer_factory.cpp b/streamingvisitors/src/vespa/vsm/vsm/docsum_field_writer_factory.cpp new file mode 100644 index 00000000000..dcf093ee92b --- /dev/null +++ b/streamingvisitors/src/vespa/vsm/vsm/docsum_field_writer_factory.cpp @@ -0,0 +1,80 @@ +// Copyright Yahoo. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root. + +#include "docsum_field_writer_factory.h" +#include <vespa/searchsummary/docsummary/copy_dfw.h> +#include <vespa/searchsummary/docsummary/docsum_field_writer.h> +#include <vespa/searchsummary/docsummary/empty_dfw.h> +#include <vespa/searchsummary/docsummary/matched_elements_filter_dfw.h> +#include <vespa/searchlib/common/matching_elements_fields.h> +#include <vespa/vsm/config/config-vsmfields.h> + +using search::MatchingElementsFields; +using search::docsummary::CopyDFW; +using search::docsummary::EmptyDFW; +using search::docsummary::IDocsumEnvironment; +using search::docsummary::DocsumFieldWriter; +using search::docsummary::MatchedElementsFilterDFW; +using vespa::config::search::vsm::VsmfieldsConfig; + +namespace vsm { + +namespace { + +void populate_fields(MatchingElementsFields& fields, VsmfieldsConfig& fields_config, const vespalib::string& field_name) +{ + vespalib::string prefix = field_name + "."; + for (const auto& spec : fields_config.fieldspec) { + if (spec.name.substr(0, prefix.size()) == prefix) { + fields.add_mapping(field_name, spec.name); + } + if (spec.name == field_name) { + fields.add_field(field_name); + } + } +} + +} + +DocsumFieldWriterFactory::DocsumFieldWriterFactory(bool use_v8_geo_positions, IDocsumEnvironment* env, const vespa::config::search::vsm::VsmfieldsConfig& vsm_fields_config) + : search::docsummary::DocsumFieldWriterFactory(use_v8_geo_positions, env), + _vsm_fields_config(vsm_fields_config) +{ +} + +DocsumFieldWriterFactory::~DocsumFieldWriterFactory() = default; + +std::unique_ptr<DocsumFieldWriter> +DocsumFieldWriterFactory::create_docsum_field_writer(const vespalib::string& fieldName, const vespalib::string& overrideName, const vespalib::string& argument, bool& rc) +{ + std::unique_ptr<DocsumFieldWriter> fieldWriter; + if ((overrideName == "staticrank") || + (overrideName == "ranklog") || + (overrideName == "label") || + (overrideName == "project") || + (overrideName == "positions") || + (overrideName == "absdist") || + (overrideName == "subproject")) + { + fieldWriter = std::make_unique<EmptyDFW>(); + rc = true; + } else if ((overrideName == "attribute") || + (overrideName == "attributecombiner")) { + if (!argument.empty() && argument != fieldName) { + fieldWriter = std::make_unique<CopyDFW>(argument); + } + rc = true; + } else if (overrideName == "geopos") { + rc = true; + } else if ((overrideName == "matchedattributeelementsfilter") || + (overrideName == "matchedelementsfilter")) { + vespalib::string source_field = argument.empty() ? fieldName : argument; + populate_fields(*_matching_elems_fields, _vsm_fields_config, source_field); + fieldWriter = MatchedElementsFilterDFW::create(source_field, _matching_elems_fields); + rc = static_cast<bool>(fieldWriter); + } else { + return search::docsummary::DocsumFieldWriterFactory::create_docsum_field_writer(fieldName, overrideName, argument, rc); + } + return fieldWriter; +} + +} diff --git a/streamingvisitors/src/vespa/vsm/vsm/docsum_field_writer_factory.h b/streamingvisitors/src/vespa/vsm/vsm/docsum_field_writer_factory.h new file mode 100644 index 00000000000..4084b435bf2 --- /dev/null +++ b/streamingvisitors/src/vespa/vsm/vsm/docsum_field_writer_factory.h @@ -0,0 +1,25 @@ +// Copyright Yahoo. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root. + +#pragma once + +#include <vespa/searchsummary/docsummary/docsum_field_writer_factory.h> +#include <vespa/vsm/config/config-vsmfields.h> + +namespace vsm { + +/* + * Factory interface class for creating docsum field writers, adjusted for + * streaming search. + */ +class DocsumFieldWriterFactory : public search::docsummary::DocsumFieldWriterFactory +{ + const vespa::config::search::vsm::VsmfieldsConfig& _vsm_fields_config; + +public: + DocsumFieldWriterFactory(bool use_v8_geo_positions, search::docsummary::IDocsumEnvironment* env, const vespa::config::search::vsm::VsmfieldsConfig& vsm_fields_config); + ~DocsumFieldWriterFactory() override; + std::unique_ptr<search::docsummary::DocsumFieldWriter> + create_docsum_field_writer(const vespalib::string& fieldName, const vespalib::string& overrideName, const vespalib::string& argument, bool& rc) override; +}; + +} diff --git a/streamingvisitors/src/vespa/vsm/vsm/docsumconfig.cpp b/streamingvisitors/src/vespa/vsm/vsm/docsumconfig.cpp index 5b9c73cb07d..22c3b270836 100644 --- a/streamingvisitors/src/vespa/vsm/vsm/docsumconfig.cpp +++ b/streamingvisitors/src/vespa/vsm/vsm/docsumconfig.cpp @@ -1,80 +1,24 @@ // Copyright Yahoo. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root. -#include <vespa/vsm/vsm/docsumconfig.h> -#include <vespa/searchsummary/docsummary/copy_dfw.h> -#include <vespa/searchsummary/docsummary/empty_dfw.h> -#include <vespa/searchsummary/docsummary/matched_elements_filter_dfw.h> +#include "docsumconfig.h" #include <vespa/searchsummary/docsummary/resultconfig.h> -#include <vespa/searchlib/common/matching_elements_fields.h> #include <vespa/vsm/config/config-vsmfields.h> -#include <vespa/vsm/config/config-vsmsummary.h> +#include "docsum_field_writer_factory.h" -using search::MatchingElementsFields; -using search::docsummary::DocsumFieldWriter; -using search::docsummary::CopyDFW; -using search::docsummary::EmptyDFW; -using search::docsummary::MatchedElementsFilterDFW; -using search::docsummary::ResultConfig; using vespa::config::search::vsm::VsmfieldsConfig; -using vespa::config::search::vsm::VsmsummaryConfig; namespace vsm { -namespace { - -void populate_fields(MatchingElementsFields& fields, VsmfieldsConfig& fields_config, const vespalib::string& field_name) -{ - vespalib::string prefix = field_name + "."; - for (const auto& spec : fields_config.fieldspec) { - if (spec.name.substr(0, prefix.size()) == prefix) { - fields.add_mapping(field_name, spec.name); - } - if (spec.name == field_name) { - fields.add_field(field_name); - } - } -} - -} - DynamicDocsumConfig::DynamicDocsumConfig(search::docsummary::IDocsumEnvironment* env, search::docsummary::DynamicDocsumWriter* writer, std::shared_ptr<VsmfieldsConfig> vsm_fields_config) : Parent(env, writer), _vsm_fields_config(std::move(vsm_fields_config)) { } -std::unique_ptr<DocsumFieldWriter> -DynamicDocsumConfig::createFieldWriter(const string & fieldName, const string & overrideName, const string & argument, bool & rc, std::shared_ptr<search::MatchingElementsFields> matching_elems_fields) +std::unique_ptr<search::docsummary::IDocsumFieldWriterFactory> +DynamicDocsumConfig::make_docsum_field_writer_factory() { - std::unique_ptr<DocsumFieldWriter> fieldWriter; - if ((overrideName == "staticrank") || - (overrideName == "ranklog") || - (overrideName == "label") || - (overrideName == "project") || - (overrideName == "positions") || - (overrideName == "absdist") || - (overrideName == "subproject")) - { - fieldWriter = std::make_unique<EmptyDFW>(); - rc = true; - } else if ((overrideName == "attribute") || - (overrideName == "attributecombiner")) { - if (!argument.empty() && argument != fieldName) { - fieldWriter = std::make_unique<CopyDFW>(argument); - } - rc = true; - } else if (overrideName == "geopos") { - rc = true; - } else if ((overrideName == "matchedattributeelementsfilter") || - (overrideName == "matchedelementsfilter")) { - string source_field = argument.empty() ? fieldName : argument; - populate_fields(*matching_elems_fields, *_vsm_fields_config, source_field); - fieldWriter = MatchedElementsFilterDFW::create(source_field, matching_elems_fields); - rc = static_cast<bool>(fieldWriter); - } else { - fieldWriter = search::docsummary::DynamicDocsumConfig::createFieldWriter(fieldName, overrideName, argument, rc, matching_elems_fields); - } - return fieldWriter; + return std::make_unique<DocsumFieldWriterFactory>(getResultConfig().useV8geoPositions(), getEnvironment(), *_vsm_fields_config); } } diff --git a/streamingvisitors/src/vespa/vsm/vsm/docsumconfig.h b/streamingvisitors/src/vespa/vsm/vsm/docsumconfig.h index a660c544d7d..f423a0b478a 100644 --- a/streamingvisitors/src/vespa/vsm/vsm/docsumconfig.h +++ b/streamingvisitors/src/vespa/vsm/vsm/docsumconfig.h @@ -20,9 +20,7 @@ private: public: DynamicDocsumConfig(search::docsummary::IDocsumEnvironment* env, search::docsummary::DynamicDocsumWriter* writer, std::shared_ptr<VsmfieldsConfig> vsm_fields_config); private: - std::unique_ptr<search::docsummary::DocsumFieldWriter> - createFieldWriter(const string & fieldName, const string & overrideName, - const string & cf, bool & rc, std::shared_ptr<search::MatchingElementsFields> matching_elems_fields) override; + std::unique_ptr<search::docsummary::IDocsumFieldWriterFactory> make_docsum_field_writer_factory() override; }; } |