summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorGeir Storli <geirst@yahooinc.com>2022-09-14 13:15:40 +0200
committerGitHub <noreply@github.com>2022-09-14 13:15:40 +0200
commit736524f0c11604d167d73f5dffab65d7692e0d73 (patch)
tree3a8821fa38aa383db92f3ea649594cb164852afb
parent155223379d6d2ebd9038a9b4ecc4fcb50b91eaa3 (diff)
parentf0c31efeb0146788fd02057f70292f55b1e04a9f (diff)
Merge pull request #24041 from vespa-engine/toregge/use-snippet-modifier-on-each-string-element-in-array-of-string
Use snippet modifier on each element in array of string when dynamic …
-rw-r--r--streamingvisitors/src/vespa/vsm/vsm/docsumfilter.cpp68
-rw-r--r--streamingvisitors/src/vespa/vsm/vsm/docsumfilter.h1
2 files changed, 69 insertions, 0 deletions
diff --git a/streamingvisitors/src/vespa/vsm/vsm/docsumfilter.cpp b/streamingvisitors/src/vespa/vsm/vsm/docsumfilter.cpp
index 32a9da08a51..69a38e205c0 100644
--- a/streamingvisitors/src/vespa/vsm/vsm/docsumfilter.cpp
+++ b/streamingvisitors/src/vespa/vsm/vsm/docsumfilter.cpp
@@ -5,6 +5,7 @@
#include <vespa/juniper/juniper_separators.h>
#include <vespa/searchsummary/docsummary/check_undefined_value_visitor.h>
#include <vespa/searchsummary/docsummary/i_docsum_store_document.h>
+#include <vespa/searchsummary/docsummary/i_juniper_converter.h>
#include <vespa/searchsummary/docsummary/summaryfieldconverter.h>
#include <vespa/document/base/exceptions.h>
#include <vespa/document/fieldvalue/iteratorhandler.h>
@@ -20,6 +21,49 @@ namespace vsm {
namespace {
+bool is_struct_or_multivalue_field_type(const document::DataType& data_type)
+{
+ return (data_type.isStructured() || data_type.isArray() || data_type.isWeightedSet() || data_type.isMap());
+}
+
+/*
+ * This class creates a modified field value which is then passed to
+ * the original juniper converter.
+ */
+class SnippetModifierJuniperConverter : public IJuniperConverter
+{
+ IJuniperConverter& _orig_converter;
+ FieldModifier& _modifier;
+ FieldPath _empty_field_path;
+public:
+ SnippetModifierJuniperConverter(IJuniperConverter& orig_converter, FieldModifier& modifier)
+ : IJuniperConverter(),
+ _orig_converter(orig_converter),
+ _modifier(modifier),
+ _empty_field_path()
+ {
+ }
+ ~SnippetModifierJuniperConverter() override = default;
+ void insert_juniper_field(vespalib::stringref input, vespalib::slime::Inserter& inserter) override;
+ void insert_juniper_field(const document::StringFieldValue &input, vespalib::slime::Inserter& inserter) override;
+};
+
+
+void
+SnippetModifierJuniperConverter::insert_juniper_field(vespalib::stringref input, vespalib::slime::Inserter& inserter)
+{
+ _orig_converter.insert_juniper_field(input, inserter);
+}
+
+void
+SnippetModifierJuniperConverter::insert_juniper_field(const document::StringFieldValue &input, vespalib::slime::Inserter& inserter)
+{
+ auto fv = _modifier.modify(input, _empty_field_path);
+ assert(fv);
+ auto& modified_input = dynamic_cast<const document::StringFieldValue &>(*fv);
+ _orig_converter.insert_juniper_field(modified_input.getValueRef(), inserter);
+}
+
/**
* Class providing access to a document retrieved from an IDocsumStore
* (vsm::DocsumFilter). VSM specific transforms might be applied when
@@ -114,6 +158,18 @@ DocsumStoreVsmDocument::insert_juniper_field(const vespalib::string& field_name,
// Markup for juniper has already been added due to FLATTENJUNIPER command in vsm summary config.
auto field_value = get_field_value(field_name);
if (field_value) {
+ if (is_struct_or_multivalue_field_type(*field_value->getDataType())) {
+ auto entry_idx = _result_class.GetIndexFromName(field_name.c_str());
+ if (entry_idx >= 0) {
+ assert((uint32_t) entry_idx < _result_class.GetNumEntries());
+ auto modifier = _docsum_filter.get_field_modifier(entry_idx);
+ if (modifier != nullptr) {
+ SnippetModifierJuniperConverter stacked_converter(converter, *modifier);
+ SummaryFieldConverter::insert_juniper_field(*field_value, inserter, false, stacked_converter);
+ return;
+ }
+ }
+ }
SummaryFieldConverter::insert_juniper_field(*field_value, inserter, false, converter);
}
}
@@ -396,4 +452,16 @@ DocsumFilter::insert_summary_field(uint32_t entry_idx, const Document& doc, vesp
}
}
+FieldModifier*
+DocsumFilter::get_field_modifier(uint32_t entry_idx)
+{
+ if (_snippetModifiers == nullptr) {
+ return nullptr;
+ }
+ const auto& field_spec = _fields[entry_idx];
+ auto& fieldId = field_spec.getOutputField();
+ FieldIdT fId = fieldId.getId();
+ return _snippetModifiers->getModifier(fId);
+}
+
}
diff --git a/streamingvisitors/src/vespa/vsm/vsm/docsumfilter.h b/streamingvisitors/src/vespa/vsm/vsm/docsumfilter.h
index f143c91d962..9ec6cb54f51 100644
--- a/streamingvisitors/src/vespa/vsm/vsm/docsumfilter.h
+++ b/streamingvisitors/src/vespa/vsm/vsm/docsumfilter.h
@@ -84,6 +84,7 @@ public:
search::docsummary::DocsumStoreFieldValue get_summary_field(uint32_t entry_idx, const Document& doc);
void insert_summary_field(uint32_t entry_idx, const Document& doc, vespalib::slime::Inserter& inserter);
+ FieldModifier* get_field_modifier(uint32_t entry_idx);
};
}