diff options
Diffstat (limited to 'streamingvisitors')
-rw-r--r-- | streamingvisitors/src/vespa/vsm/vsm/docsumfilter.cpp | 51 |
1 files changed, 23 insertions, 28 deletions
diff --git a/streamingvisitors/src/vespa/vsm/vsm/docsumfilter.cpp b/streamingvisitors/src/vespa/vsm/vsm/docsumfilter.cpp index 253ac33c909..ca1de0082f0 100644 --- a/streamingvisitors/src/vespa/vsm/vsm/docsumfilter.cpp +++ b/streamingvisitors/src/vespa/vsm/vsm/docsumfilter.cpp @@ -6,6 +6,7 @@ #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/i_string_field_converter.h> #include <vespa/searchsummary/docsummary/summaryfieldconverter.h> #include <vespa/document/base/exceptions.h> #include <vespa/document/fieldvalue/iteratorhandler.h> @@ -30,38 +31,34 @@ bool is_struct_or_multivalue_field_type(const document::DataType& data_type) * This class creates a modified field value which is then passed to * the original juniper converter. */ -class SnippetModifierJuniperConverter : public IJuniperConverter +class SnippetModifierJuniperConverter : public IStringFieldConverter { - IJuniperConverter& _orig_converter; - FieldModifier& _modifier; + IJuniperConverter& _juniper_converter; + FieldModifier* _modifier; FieldPath _empty_field_path; public: - SnippetModifierJuniperConverter(IJuniperConverter& orig_converter, FieldModifier& modifier) - : IJuniperConverter(), - _orig_converter(orig_converter), + SnippetModifierJuniperConverter(IJuniperConverter& juniper_converter, FieldModifier* modifier) + : IStringFieldConverter(), + _juniper_converter(juniper_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 convert(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) +SnippetModifierJuniperConverter::convert(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); + if (_modifier != nullptr) { + auto fv = _modifier->modify(input, _empty_field_path); + assert(fv); + auto& modified_input = dynamic_cast<const document::StringFieldValue &>(*fv); + _juniper_converter.convert(modified_input.getValueRef(), inserter); + } else { + _juniper_converter.convert(input.getValueRef(), inserter); + } } /** @@ -155,22 +152,20 @@ DocsumStoreVsmDocument::insert_summary_field(const vespalib::string& field_name, void DocsumStoreVsmDocument::insert_juniper_field(const vespalib::string& field_name, vespalib::slime::Inserter& inserter, IJuniperConverter& converter) const { - // 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) { + FieldModifier* modifier = nullptr; 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, stacked_converter); - return; - } + modifier = _docsum_filter.get_field_modifier(entry_idx); } + } else { + // Markup for juniper has already been added due to FLATTENJUNIPER command in vsm summary config. } - SummaryFieldConverter::insert_juniper_field(*field_value, inserter, converter); + SnippetModifierJuniperConverter string_converter(converter, modifier); + SummaryFieldConverter::insert_juniper_field(*field_value, inserter, string_converter); } } |