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 /searchsummary | |
parent | 587f3301e1bf7d896a91c5cd5e86b55b20477e2b (diff) |
Reduce special handling of struct fields.
Diffstat (limited to 'searchsummary')
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); }; |