aboutsummaryrefslogtreecommitdiffstats
path: root/streamingvisitors
diff options
context:
space:
mode:
authorTor Egge <Tor.Egge@online.no>2022-09-19 17:15:56 +0200
committerTor Egge <Tor.Egge@online.no>2022-09-19 17:15:56 +0200
commit8b99ea30175098760c26e8a44442b59bc879c007 (patch)
tree58e7a2dcaabbd7b261d2a219c27c2cc29c267f81 /streamingvisitors
parentdd11dce329e66dc6474a00b798f46a1ee5febfb0 (diff)
Stop using summary field type for streaming search.
Diffstat (limited to 'streamingvisitors')
-rw-r--r--streamingvisitors/src/vespa/vsm/vsm/docsumfieldspec.cpp7
-rw-r--r--streamingvisitors/src/vespa/vsm/vsm/docsumfieldspec.h13
-rw-r--r--streamingvisitors/src/vespa/vsm/vsm/docsumfilter.cpp30
3 files changed, 27 insertions, 23 deletions
diff --git a/streamingvisitors/src/vespa/vsm/vsm/docsumfieldspec.cpp b/streamingvisitors/src/vespa/vsm/vsm/docsumfieldspec.cpp
index 3d689b385b3..44321518c46 100644
--- a/streamingvisitors/src/vespa/vsm/vsm/docsumfieldspec.cpp
+++ b/streamingvisitors/src/vespa/vsm/vsm/docsumfieldspec.cpp
@@ -20,16 +20,15 @@ DocsumFieldSpec::FieldIdentifier & DocsumFieldSpec::FieldIdentifier::operator=(F
DocsumFieldSpec::FieldIdentifier::~FieldIdentifier() = default;
DocsumFieldSpec::DocsumFieldSpec() :
- _resultType(search::docsummary::RES_INT),
+ _struct_or_multivalue(false),
_command(VsmsummaryConfig::Fieldmap::Command::NONE),
_outputField(),
_inputFields(),
_filter()
{ }
-DocsumFieldSpec::DocsumFieldSpec(search::docsummary::ResType resultType,
- VsmsummaryConfig::Fieldmap::Command command) :
- _resultType(resultType),
+DocsumFieldSpec::DocsumFieldSpec(VsmsummaryConfig::Fieldmap::Command command) :
+ _struct_or_multivalue(false),
_command(command),
_outputField(),
_inputFields(),
diff --git a/streamingvisitors/src/vespa/vsm/vsm/docsumfieldspec.h b/streamingvisitors/src/vespa/vsm/vsm/docsumfieldspec.h
index e08ae8c6e71..52ba099ee51 100644
--- a/streamingvisitors/src/vespa/vsm/vsm/docsumfieldspec.h
+++ b/streamingvisitors/src/vespa/vsm/vsm/docsumfieldspec.h
@@ -1,9 +1,7 @@
// Copyright Yahoo. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root.
#pragma once
-#include <vespa/searchsummary/docsummary/resultclass.h>
#include <vespa/vsm/common/document.h>
-#include <vespa/vsm/common/storagedocument.h>
#include <vespa/vsm/config/vsm-cfif.h>
namespace search::docsummary { class SlimeFillerFilter; }
@@ -15,6 +13,7 @@ namespace vsm {
**/
class DocsumFieldSpec {
public:
+ using FieldPath = document::FieldPath;
/**
* This class contains a field id and a field path (to navigate a field value).
**/
@@ -38,7 +37,7 @@ public:
typedef std::vector<FieldIdentifier> FieldIdentifierVector;
private:
- search::docsummary::ResType _resultType;
+ bool _struct_or_multivalue;
VsmsummaryConfig::Fieldmap::Command _command;
FieldIdentifier _outputField;
FieldIdentifierVector _inputFields;
@@ -46,14 +45,12 @@ private:
public:
DocsumFieldSpec();
- DocsumFieldSpec(search::docsummary::ResType resultType, VsmsummaryConfig::Fieldmap::Command command);
+ DocsumFieldSpec(VsmsummaryConfig::Fieldmap::Command command);
DocsumFieldSpec(DocsumFieldSpec&&) noexcept;
~DocsumFieldSpec();
- /**
- * Returns the result type for the summary field.
- **/
- search::docsummary::ResType getResultType() const { return _resultType; }
+ bool is_struct_or_multivalue() const noexcept { return _struct_or_multivalue; }
+ void set_struct_or_multivalue(bool struct_or_multivalue) { _struct_or_multivalue = struct_or_multivalue; }
/**
* Returns the command specifying how to transform input fields into output summary field.
diff --git a/streamingvisitors/src/vespa/vsm/vsm/docsumfilter.cpp b/streamingvisitors/src/vespa/vsm/vsm/docsumfilter.cpp
index 534f8b92445..ec28688196e 100644
--- a/streamingvisitors/src/vespa/vsm/vsm/docsumfilter.cpp
+++ b/streamingvisitors/src/vespa/vsm/vsm/docsumfilter.cpp
@@ -19,7 +19,7 @@
LOG_SETUP(".vsm.docsumfilter");
using namespace search::docsummary;
-
+using document::FieldPathEntry;
namespace vsm {
@@ -30,6 +30,17 @@ 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());
}
+bool is_struct_or_multivalue_field_type(const FieldPath& fp)
+{
+ if (fp.size() == 1u) {
+ auto& fpe = fp[0];
+ if (fpe.getType() == FieldPathEntry::Type::STRUCT_FIELD && is_struct_or_multivalue_field_type(fpe.getDataType())) {
+ return true;
+ }
+ }
+ return false;
+}
+
/*
* This class creates a modified field value which is then passed to
* the original juniper converter.
@@ -207,6 +218,9 @@ DocsumFilter::prepareFieldSpec(DocsumFieldSpec & spec, const DocsumTools::FieldS
if (field != FieldMap::npos) {
if (field < fieldPathMap.size()) {
spec.setOutputField(DocsumFieldSpec::FieldIdentifier(field, copyPathButFirst(fieldPathMap[field])));
+ if (is_struct_or_multivalue_field_type(fieldPathMap[field])) {
+ spec.set_struct_or_multivalue(true);
+ }
} else {
LOG(warning, "Could not find a field path for field '%s' with id '%d'", name.c_str(), field);
spec.setOutputField(DocsumFieldSpec::FieldIdentifier(field, FieldPath()));
@@ -217,7 +231,7 @@ DocsumFilter::prepareFieldSpec(DocsumFieldSpec & spec, const DocsumTools::FieldS
}
// setup input fields
std::unique_ptr<SlimeFillerFilter> filter;
- if (spec.getResultType() == RES_JSONSTRING) {
+ if (spec.is_struct_or_multivalue()) {
filter = std::make_unique<SlimeFillerFilter>();
}
for (size_t i = 0; i < toolsSpec.getInputNames().size(); ++i) {
@@ -296,7 +310,7 @@ void DocsumFilter::init(const FieldMap & fieldMap, const FieldPathMapT & fieldPa
for (uint32_t i = 0; i < entryCnt; ++i) {
const ResConfigEntry &entry = *resClass->GetEntry(i);
const DocsumTools::FieldSpec & toolsSpec = inputSpecs[i];
- _fields.push_back(DocsumFieldSpec(entry._type, toolsSpec.getCommand()));
+ _fields.push_back(DocsumFieldSpec(toolsSpec.getCommand()));
LOG(debug, "About to prepare field spec for summary field '%s'", entry._name.c_str());
prepareFieldSpec(_fields.back(), toolsSpec, fieldMap, fieldPathMap);
}
@@ -319,10 +333,6 @@ DocsumFilter::write_flatten_field(const DocsumFieldSpec& field_spec, const Docum
return false;
}
- if (field_spec.getResultType() != RES_LONG_STRING && field_spec.getResultType() != RES_STRING) {
- LOG(debug, "write_flatten_field: Can only handle result types STRING and LONG_STRING");
- return false;
- }
switch (field_spec.getCommand()) {
case VsmsummaryConfig::Fieldmap::Command::FLATTENJUNIPER:
_flattenWriter.setSeparator(juniper::separators::record_separator_string);
@@ -388,8 +398,7 @@ search::docsummary::DocsumStoreFieldValue
DocsumFilter::get_summary_field(uint32_t entry_idx, const Document& doc)
{
const auto& field_spec = _fields[entry_idx];
- ResType type = field_spec.getResultType();
- if (type == RES_JSONSTRING) {
+ 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) {
@@ -438,8 +447,7 @@ void
DocsumFilter::insert_summary_field(uint32_t entry_idx, const Document& doc, vespalib::slime::Inserter& inserter)
{
const auto& field_spec = _fields[entry_idx];
- ResType type = field_spec.getResultType();
- if (type == RES_JSONSTRING) {
+ 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) {