diff options
author | Tor Egge <Tor.Egge@online.no> | 2022-09-21 15:54:23 +0200 |
---|---|---|
committer | Tor Egge <Tor.Egge@online.no> | 2022-09-21 15:54:23 +0200 |
commit | 565b10f7bba3be0009e186591eacfa280122caa9 (patch) | |
tree | abc7e91862c8d9ee38dd9a96c3098c6b2c175f2f /streamingvisitors/src | |
parent | 587f3301e1bf7d896a91c5cd5e86b55b20477e2b (diff) |
Reduce special handling of struct fields.
Diffstat (limited to 'streamingvisitors/src')
-rw-r--r-- | streamingvisitors/src/vespa/vsm/vsm/docsumfilter.cpp | 96 | ||||
-rw-r--r-- | streamingvisitors/src/vespa/vsm/vsm/docsumfilter.h | 3 |
2 files changed, 28 insertions, 71 deletions
diff --git a/streamingvisitors/src/vespa/vsm/vsm/docsumfilter.cpp b/streamingvisitors/src/vespa/vsm/vsm/docsumfilter.cpp index 845e81dc01b..398404c6e71 100644 --- a/streamingvisitors/src/vespa/vsm/vsm/docsumfilter.cpp +++ b/streamingvisitors/src/vespa/vsm/vsm/docsumfilter.cpp @@ -2,7 +2,6 @@ #include "docsumfilter.h" #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/i_string_field_converter.h> @@ -40,6 +39,19 @@ bool is_struct_or_multivalue_field_type(const FieldPath& fp) return false; } + +std::optional<FieldIdT> +get_single_source_field_id(const DocsumFieldSpec &field_spec) +{ + if (field_spec.is_struct_or_multivalue()) { + return field_spec.getOutputField().getId(); + } + if (field_spec.getInputFields().size() == 1 && field_spec.getCommand() == VsmsummaryConfig::Fieldmap::Command::NONE) { + return field_spec.getInputFields()[0].getId(); + } + return std::nullopt; // No single source +} + FieldPath copyPathButFirst(const FieldPath & rhs) { // skip the element that correspond to the start field value @@ -100,34 +112,6 @@ prepareFieldSpec(DocsumFieldSpec & spec, const DocsumTools::FieldSpec & toolsSpe } } -search::docsummary::DocsumStoreFieldValue -get_struct_or_multivalue_summary_field(const DocsumFieldSpec& field_spec, const Document& doc) -{ - // Filtering not yet implemented, return whole struct or multivalue field - const DocsumFieldSpec::FieldIdentifier & fieldId = field_spec.getOutputField(); - const document::FieldValue* field_value = doc.getField(fieldId.getId()); - return DocsumStoreFieldValue(field_value); -} - -void -insert_struct_or_multivalue_summary_field(const DocsumFieldSpec& field_spec, const Document& doc, vespalib::slime::Inserter& inserter) -{ - if (field_spec.getCommand() != VsmsummaryConfig::Fieldmap::Command::NONE) { - return; - } - const DocsumFieldSpec::FieldIdentifier& fieldId = field_spec.getOutputField(); - const document::FieldValue* fv = doc.getField(fieldId.getId()); - if (fv == nullptr) { - return; - } - CheckUndefinedValueVisitor check_undefined; - fv->accept(check_undefined); - if (!check_undefined.is_undefined()) { - SlimeFiller writer(inserter, nullptr, field_spec.get_filter()); - fv->accept(writer); - } -} - /* * This class creates a modified field value which is then passed to * the original juniper converter. @@ -386,8 +370,14 @@ DocsumFilter::get_document(uint32_t id) } search::docsummary::DocsumStoreFieldValue -DocsumFilter::get_flattened_summary_field(const DocsumFieldSpec& field_spec, const Document& doc) +DocsumFilter::get_summary_field(uint32_t entry_idx, const Document& doc) { + const auto& field_spec = _fields[entry_idx]; + auto single_source_field_id = get_single_source_field_id(field_spec); + if (single_source_field_id.has_value()) { + auto field_value = doc.getField(single_source_field_id.value()); + return DocsumStoreFieldValue(field_value); + } if (!write_flatten_field(field_spec, doc)) { return {}; } @@ -397,28 +387,18 @@ DocsumFilter::get_flattened_summary_field(const DocsumFieldSpec& field_spec, con return DocsumStoreFieldValue(std::move(value)); } -search::docsummary::DocsumStoreFieldValue -DocsumFilter::get_summary_field(uint32_t entry_idx, const Document& doc) +void +DocsumFilter::insert_summary_field(uint32_t entry_idx, const Document& doc, vespalib::slime::Inserter& inserter) { const auto& field_spec = _fields[entry_idx]; - if (field_spec.is_struct_or_multivalue()) { - return get_struct_or_multivalue_summary_field(field_spec, doc); - } else { - if (field_spec.getInputFields().size() == 1 && field_spec.getCommand() == VsmsummaryConfig::Fieldmap::Command::NONE) { - const DocsumFieldSpec::FieldIdentifier & fieldId = field_spec.getInputFields()[0]; - const document::FieldValue* field_value = doc.getField(fieldId.getId()); - return DocsumStoreFieldValue(field_value); - } else if (field_spec.getInputFields().empty() && field_spec.getCommand() == VsmsummaryConfig::Fieldmap::Command::NONE) { - return {}; - } else { - return get_flattened_summary_field(field_spec, doc); + auto single_source_field_id = get_single_source_field_id(field_spec); + if (single_source_field_id.has_value()) { + auto field_value = doc.getField(single_source_field_id.value()); + if (field_value != nullptr) { + SlimeFiller::insert_summary_field_with_field_filter(*field_value, inserter, field_spec.get_filter()); } + return; } -} - -void -DocsumFilter::insert_flattened_summary_field(const DocsumFieldSpec& field_spec, const Document& doc, vespalib::slime::Inserter& inserter) -{ if (!write_flatten_field(field_spec, doc)) { return; } @@ -427,26 +407,6 @@ DocsumFilter::insert_flattened_summary_field(const DocsumFieldSpec& field_spec, _flattenWriter.clear(); } -void -DocsumFilter::insert_summary_field(uint32_t entry_idx, const Document& doc, vespalib::slime::Inserter& inserter) -{ - const auto& field_spec = _fields[entry_idx]; - if (field_spec.is_struct_or_multivalue()) { - insert_struct_or_multivalue_summary_field(field_spec, doc, inserter); - } else { - if (field_spec.getInputFields().size() == 1 && field_spec.getCommand() == VsmsummaryConfig::Fieldmap::Command::NONE) { - const DocsumFieldSpec::FieldIdentifier & fieldId = field_spec.getInputFields()[0]; - const document::FieldValue* field_value = doc.getField(fieldId.getId()); - if (field_value != nullptr) { - SlimeFiller::insert_summary_field(*field_value, inserter); - } - } else if (field_spec.getInputFields().empty() && field_spec.getCommand() == VsmsummaryConfig::Fieldmap::Command::NONE) { - } else { - insert_flattened_summary_field(field_spec, doc, inserter); - } - } -} - FieldModifier* DocsumFilter::get_field_modifier(uint32_t entry_idx) { diff --git a/streamingvisitors/src/vespa/vsm/vsm/docsumfilter.h b/streamingvisitors/src/vespa/vsm/vsm/docsumfilter.h index d7f6d88bd0c..e87a3e9a431 100644 --- a/streamingvisitors/src/vespa/vsm/vsm/docsumfilter.h +++ b/streamingvisitors/src/vespa/vsm/vsm/docsumfilter.h @@ -38,9 +38,6 @@ private: VsmsummaryConfig::Fieldmap::Command command, const Document & docsum, bool & modified); bool write_flatten_field(const DocsumFieldSpec& field_spec, const Document & docsum); - - search::docsummary::DocsumStoreFieldValue get_flattened_summary_field(const DocsumFieldSpec& field_spec, const Document& doc); - void insert_flattened_summary_field(const DocsumFieldSpec& field_spec, const Document& doc, vespalib::slime::Inserter& inserter); public: DocsumFilter(DocsumToolsPtr tools, const IDocSumCache & docsumCache); DocsumFilter(const DocsumFilter &) = delete; |