summaryrefslogtreecommitdiffstats
path: root/searchsummary
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 /searchsummary
parent587f3301e1bf7d896a91c5cd5e86b55b20477e2b (diff)
Reduce special handling of struct fields.
Diffstat (limited to 'searchsummary')
-rw-r--r--searchsummary/src/tests/docsummary/slime_filler/slime_filler_test.cpp23
-rw-r--r--searchsummary/src/vespa/searchsummary/docsummary/slime_filler.cpp11
-rw-r--r--searchsummary/src/vespa/searchsummary/docsummary/slime_filler.h1
3 files changed, 34 insertions, 1 deletions
diff --git a/searchsummary/src/tests/docsummary/slime_filler/slime_filler_test.cpp b/searchsummary/src/tests/docsummary/slime_filler/slime_filler_test.cpp
index 49be0caefc1..fb902eda080 100644
--- a/searchsummary/src/tests/docsummary/slime_filler/slime_filler_test.cpp
+++ b/searchsummary/src/tests/docsummary/slime_filler/slime_filler_test.cpp
@@ -183,9 +183,10 @@ protected:
void expect_insert_filtered(const vespalib::string& exp, const FieldValue& fv, const std::vector<uint32_t>& matching_elems);
void expect_insert(const vespalib::string& exp, const FieldValue& fv, SlimeFillerFilter& filter);
void expect_insert_callback(const std::vector<vespalib::string>& exp, const FieldValue& fv);
- // Following 3 member functions tests static member functions in SlimeFiller
+ // Following 4 member functions tests static member functions in SlimeFiller
void expect_insert_summary_field(const vespalib::string& exp, const FieldValue& fv);
void expect_insert_summary_field_with_filter(const vespalib::string& exp, const FieldValue& fv, const std::vector<uint32_t>& matching_elems);
+ void expect_insert_summary_field_with_field_filter(const vespalib::string& exp, const FieldValue& fv, const SlimeFillerFilter* filter);
void expect_insert_juniper_field(const std::vector<vespalib::string>& exp, const vespalib::string& exp_slime, const FieldValue& fv);
};
@@ -346,6 +347,16 @@ SlimeFillerTest::expect_insert_summary_field_with_filter(const vespalib::string&
}
void
+SlimeFillerTest::expect_insert_summary_field_with_field_filter(const vespalib::string& exp, const FieldValue& fv, const SlimeFillerFilter* filter)
+{
+ Slime slime;
+ SlimeInserter inserter(slime);
+ SlimeFiller::insert_summary_field_with_field_filter(fv, inserter, filter);
+ auto act = slime_to_string(slime);
+ EXPECT_EQ(exp, act);
+}
+
+void
SlimeFillerTest::expect_insert_juniper_field(const std::vector<vespalib::string>& exp, const vespalib::string& exp_slime, const FieldValue& fv)
{
Slime slime;
@@ -609,6 +620,16 @@ TEST_F(SlimeFillerTest, insert_summary_field_with_filter)
expect_insert_summary_field_with_filter("null", make_empty_map(), {});
}
+TEST_F(SlimeFillerTest, insert_summary_field_with_field_filter)
+{
+ auto nested = make_nested_value(0);
+ // Field order depends on assigned field ids, cf. document::Field::calculateIdV7(), and symbol insertion order in slime
+ expect_insert_summary_field_with_field_filter(R"({"f":{"c":66,"a":62},"c":46,"a":42,"b":44,"d":{"c":66,"a":62}})", nested, nullptr);
+ SlimeFillerFilter filter;
+ filter.add("a").add("c").add("f.a").add("d");
+ expect_insert_summary_field_with_field_filter(R"({"f":{"a":62},"a":42,"c":46,"d":{"a":62,"c":66}})", nested, &filter);
+}
+
TEST_F(SlimeFillerTest, insert_juniper_field)
{
expect_insert_juniper_field({"Hello"}, "null", StringFieldValue("Hello"));
diff --git a/searchsummary/src/vespa/searchsummary/docsummary/slime_filler.cpp b/searchsummary/src/vespa/searchsummary/docsummary/slime_filler.cpp
index 06cb363b61f..1baa6bca189 100644
--- a/searchsummary/src/vespa/searchsummary/docsummary/slime_filler.cpp
+++ b/searchsummary/src/vespa/searchsummary/docsummary/slime_filler.cpp
@@ -365,6 +365,17 @@ SlimeFiller::insert_summary_field_with_filter(const FieldValue& value, vespalib:
}
void
+SlimeFiller::insert_summary_field_with_field_filter(const document::FieldValue& value, vespalib::slime::Inserter& inserter, const SlimeFillerFilter* filter)
+{
+ CheckUndefinedValueVisitor check_undefined;
+ value.accept(check_undefined);
+ if (!check_undefined.is_undefined()) {
+ SlimeFiller visitor(inserter, nullptr, filter);
+ value.accept(visitor);
+ }
+}
+
+void
SlimeFiller::insert_juniper_field(const document::FieldValue& value, vespalib::slime::Inserter& inserter, IStringFieldConverter& converter)
{
CheckUndefinedValueVisitor check_undefined;
diff --git a/searchsummary/src/vespa/searchsummary/docsummary/slime_filler.h b/searchsummary/src/vespa/searchsummary/docsummary/slime_filler.h
index 2f924de8af4..620610d782d 100644
--- a/searchsummary/src/vespa/searchsummary/docsummary/slime_filler.h
+++ b/searchsummary/src/vespa/searchsummary/docsummary/slime_filler.h
@@ -64,6 +64,7 @@ public:
* Insert the given field value, but only the elements that are contained in the matching_elems vector.
*/
static void insert_summary_field_with_filter(const document::FieldValue& value, vespalib::slime::Inserter& inserter, const std::vector<uint32_t>& matching_elems);
+ static void insert_summary_field_with_field_filter(const document::FieldValue& value, vespalib::slime::Inserter& inserter, const SlimeFillerFilter* filter);
static void insert_juniper_field(const document::FieldValue& value, vespalib::slime::Inserter& inserter, IStringFieldConverter& converter);
};