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/src/vespa/vsm/vsm/docsum_field_writer_factory.cpp | |
parent | 1e059c5104ba96bf37f9f0ab7c1d08f17cc1fec4 (diff) |
Factor out DocsumFieldWriterFactory.
Diffstat (limited to 'streamingvisitors/src/vespa/vsm/vsm/docsum_field_writer_factory.cpp')
-rw-r--r-- | streamingvisitors/src/vespa/vsm/vsm/docsum_field_writer_factory.cpp | 80 |
1 files changed, 80 insertions, 0 deletions
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; +} + +} |