aboutsummaryrefslogtreecommitdiffstats
path: root/searchsummary/src/vespa/searchsummary/docsummary/docsum_field_writer_factory.cpp
diff options
context:
space:
mode:
authorTor Egge <Tor.Egge@online.no>2022-08-29 17:33:04 +0200
committerTor Egge <Tor.Egge@online.no>2022-08-29 17:33:04 +0200
commit7032f820c64c6a020483657b76c0ef594114d30f (patch)
tree5ac756a6623e3dcfa0bde4cdd79d897539d967e0 /searchsummary/src/vespa/searchsummary/docsummary/docsum_field_writer_factory.cpp
parent1e059c5104ba96bf37f9f0ab7c1d08f17cc1fec4 (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.cpp115
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;
+}
+
+}