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 /searchsummary/src/vespa/searchsummary/docsummary/docsum_field_writer_factory.cpp | |
parent | 1e059c5104ba96bf37f9f0ab7c1d08f17cc1fec4 (diff) |
Factor out DocsumFieldWriterFactory.
Diffstat (limited to 'searchsummary/src/vespa/searchsummary/docsummary/docsum_field_writer_factory.cpp')
-rw-r--r-- | searchsummary/src/vespa/searchsummary/docsummary/docsum_field_writer_factory.cpp | 115 |
1 files changed, 115 insertions, 0 deletions
diff --git a/searchsummary/src/vespa/searchsummary/docsummary/docsum_field_writer_factory.cpp b/searchsummary/src/vespa/searchsummary/docsummary/docsum_field_writer_factory.cpp new file mode 100644 index 00000000000..fdbf9cf169d --- /dev/null +++ b/searchsummary/src/vespa/searchsummary/docsummary/docsum_field_writer_factory.cpp @@ -0,0 +1,115 @@ +// 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 "attribute_combiner_dfw.h" +#include "copy_dfw.h" +#include "document_id_dfw.h" +#include "empty_dfw.h" +#include "geoposdfw.h" +#include "idocsumenvironment.h" +#include "juniperdfw.h" +#include "matched_elements_filter_dfw.h" +#include "positionsdfw.h" +#include "rankfeaturesdfw.h" +#include "summaryfeaturesdfw.h" +#include <vespa/searchlib/common/matching_elements_fields.h> +#include <vespa/vespalib/util/exceptions.h> + +using vespalib::IllegalArgumentException; + +namespace search::docsummary { + +DocsumFieldWriterFactory::DocsumFieldWriterFactory(bool use_v8_geo_positions, IDocsumEnvironment* env) + : _use_v8_geo_positions(use_v8_geo_positions), + _env(env), + _matching_elems_fields(std::make_shared<MatchingElementsFields>()) +{ +} + +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) +{ + rc = false; + std::unique_ptr<DocsumFieldWriter> fieldWriter; + if (overrideName == "dynamicteaser") { + if ( ! argument.empty() ) { + auto fw = std::make_unique<DynamicTeaserDFW>(getEnvironment()->getJuniper()); + auto fw_ptr = fw.get(); + fieldWriter = std::move(fw); + rc = fw_ptr->Init(fieldName.c_str(), argument); + } else { + throw IllegalArgumentException("Missing argument"); + } + } else if (overrideName == "summaryfeatures") { + fieldWriter = std::make_unique<SummaryFeaturesDFW>(getEnvironment()); + rc = true; + } else if (overrideName == "rankfeatures") { + fieldWriter = std::make_unique<RankFeaturesDFW>(getEnvironment()); + rc = true; + } else if (overrideName == "empty") { + fieldWriter = std::make_unique<EmptyDFW>(); + rc = true; + } else if (overrideName == "copy") { + if ( ! argument.empty() ) { + fieldWriter = std::make_unique<CopyDFW>(argument); + rc = true; + } else { + throw IllegalArgumentException("Missing argument"); + } + } else if (overrideName == "absdist") { + if (getEnvironment()) { + fieldWriter = AbsDistanceDFW::create(argument.c_str(), getEnvironment()->getAttributeManager()); + rc = static_cast<bool>(fieldWriter); + } + } else if (overrideName == "positions") { + if (getEnvironment()) { + fieldWriter = PositionsDFW::create(argument.c_str(), getEnvironment()->getAttributeManager(), _use_v8_geo_positions); + rc = static_cast<bool>(fieldWriter); + } + } else if (overrideName == "geopos") { + if (getEnvironment()) { + fieldWriter = GeoPositionDFW::create(argument.c_str(), getEnvironment()->getAttributeManager(), _use_v8_geo_positions); + rc = static_cast<bool>(fieldWriter); + } + } else if (overrideName == "attribute") { + if (getEnvironment() && getEnvironment()->getAttributeManager()) { + fieldWriter = AttributeDFWFactory::create(*getEnvironment()->getAttributeManager(), argument); + rc = true; // Allow missing attribute vector + } + } else if (overrideName == "attributecombiner") { + if (getEnvironment() && getEnvironment()->getAttributeManager()) { + auto attr_ctx = getEnvironment()->getAttributeManager()->createContext(); + const vespalib::string& source_field = argument.empty() ? fieldName : argument; + fieldWriter = AttributeCombinerDFW::create(source_field, *attr_ctx, false, std::shared_ptr<MatchingElementsFields>()); + rc = static_cast<bool>(fieldWriter); + } + } else if (overrideName == "matchedattributeelementsfilter") { + const vespalib::string& source_field = argument.empty() ? fieldName : argument; + if (getEnvironment() && getEnvironment()->getAttributeManager()) { + auto attr_ctx = getEnvironment()->getAttributeManager()->createContext(); + if (attr_ctx->getAttribute(source_field) != nullptr) { + fieldWriter = AttributeDFWFactory::create(*getEnvironment()->getAttributeManager(), source_field, true, _matching_elems_fields); + } else { + fieldWriter = AttributeCombinerDFW::create(source_field, *attr_ctx, true, _matching_elems_fields); + } + rc = static_cast<bool>(fieldWriter); + } + } else if (overrideName == "matchedelementsfilter") { + const vespalib::string& source_field = argument.empty() ? fieldName : argument; + if (getEnvironment() && getEnvironment()->getAttributeManager()) { + auto attr_ctx = getEnvironment()->getAttributeManager()->createContext(); + fieldWriter = MatchedElementsFilterDFW::create(source_field,*attr_ctx, _matching_elems_fields); + rc = static_cast<bool>(fieldWriter); + } + } else if (overrideName == "documentid") { + fieldWriter = std::make_unique<DocumentIdDFW>(); + rc = true; + } else { + throw IllegalArgumentException("unknown override operation '" + overrideName + "' for field '" + fieldName + "'."); + } + return fieldWriter; +} + +} |