From 565b10f7bba3be0009e186591eacfa280122caa9 Mon Sep 17 00:00:00 2001 From: Tor Egge Date: Wed, 21 Sep 2022 15:54:23 +0200 Subject: Reduce special handling of struct fields. --- .../docsummary/slime_filler/slime_filler_test.cpp | 23 +++++++++++++++++++++- .../searchsummary/docsummary/slime_filler.cpp | 11 +++++++++++ .../vespa/searchsummary/docsummary/slime_filler.h | 1 + 3 files changed, 34 insertions(+), 1 deletion(-) (limited to 'searchsummary/src') 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& matching_elems); void expect_insert(const vespalib::string& exp, const FieldValue& fv, SlimeFillerFilter& filter); void expect_insert_callback(const std::vector& 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& 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& exp, const vespalib::string& exp_slime, const FieldValue& fv); }; @@ -345,6 +346,16 @@ SlimeFillerTest::expect_insert_summary_field_with_filter(const vespalib::string& EXPECT_EQ(exp, act); } +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& exp, const vespalib::string& exp_slime, const FieldValue& fv) { @@ -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 @@ -364,6 +364,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) { 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& 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); }; -- cgit v1.2.3