summaryrefslogtreecommitdiffstats
path: root/streamingvisitors
diff options
context:
space:
mode:
authorTor Egge <Tor.Egge@online.no>2022-09-21 15:54:23 +0200
committerTor Egge <Tor.Egge@online.no>2022-09-21 15:54:23 +0200
commit565b10f7bba3be0009e186591eacfa280122caa9 (patch)
treeabc7e91862c8d9ee38dd9a96c3098c6b2c175f2f /streamingvisitors
parent587f3301e1bf7d896a91c5cd5e86b55b20477e2b (diff)
Reduce special handling of struct fields.
Diffstat (limited to 'streamingvisitors')
-rw-r--r--streamingvisitors/src/vespa/vsm/vsm/docsumfilter.cpp96
-rw-r--r--streamingvisitors/src/vespa/vsm/vsm/docsumfilter.h3
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;