diff options
author | Geir Storli <geirst@yahooinc.com> | 2022-09-14 13:15:40 +0200 |
---|---|---|
committer | GitHub <noreply@github.com> | 2022-09-14 13:15:40 +0200 |
commit | 736524f0c11604d167d73f5dffab65d7692e0d73 (patch) | |
tree | 3a8821fa38aa383db92f3ea649594cb164852afb | |
parent | 155223379d6d2ebd9038a9b4ecc4fcb50b91eaa3 (diff) | |
parent | f0c31efeb0146788fd02057f70292f55b1e04a9f (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.cpp | 68 | ||||
-rw-r--r-- | streamingvisitors/src/vespa/vsm/vsm/docsumfilter.h | 1 |
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); }; } |