From 2b85522882aa34f20d6d2c863d06c7e52929fb5e Mon Sep 17 00:00:00 2001 From: Henning Baldersheim Date: Thu, 6 Jul 2023 09:36:30 +0000 Subject: Enable DirectWeightedAttribute optmization also for arrays. --- .../document_weight_iterator_test.cpp | 62 +++++++++++++++++----- .../attribute/multinumericpostattribute.hpp | 7 ++- .../attribute/multistringpostattribute.hpp | 7 ++- 3 files changed, 54 insertions(+), 22 deletions(-) (limited to 'searchlib') diff --git a/searchlib/src/tests/attribute/document_weight_iterator/document_weight_iterator_test.cpp b/searchlib/src/tests/attribute/document_weight_iterator/document_weight_iterator_test.cpp index 98e70fd6c1f..c864877aec2 100644 --- a/searchlib/src/tests/attribute/document_weight_iterator/document_weight_iterator_test.cpp +++ b/searchlib/src/tests/attribute/document_weight_iterator/document_weight_iterator_test.cpp @@ -38,7 +38,13 @@ void add_docs(AttributeVector::SP attr_ptr, size_t limit = 1000) { template void set_doc(ATTR *attr, uint32_t docid, KEY key, int32_t weight) { attr->clearDoc(docid); - attr->append(docid, key, weight); + if (attr->hasWeightedSetType()) { + attr->append(docid, key, weight); + } else { + for (int32_t i(0); i < weight; i++) { + attr->append(docid, key, 1); + } + } attr->commit(); } @@ -56,11 +62,13 @@ void populate_string(AttributeVector::SP attr_ptr) { set_doc(attr, 7, "foo", 10); } +template struct LongFixture { AttributeVector::SP attr; const IDocumentWeightAttribute *api; - LongFixture() : attr(make_attribute(BasicType::INT64, CollectionType::WSET, true)), - api(attr->asDocumentWeightAttribute()) + LongFixture() + : attr(make_attribute(BasicType::INT64, CollectionType::WSET, true)), + api(attr->asDocumentWeightAttribute()) { ASSERT_TRUE(api != nullptr); add_docs(attr); @@ -68,11 +76,16 @@ struct LongFixture { } }; +using LongWsetFixture = LongFixture; +using LongArrayFixture = LongFixture; + +template struct StringFixture { AttributeVector::SP attr; const IDocumentWeightAttribute *api; - StringFixture() : attr(make_attribute(BasicType::STRING, CollectionType::WSET, true)), - api(attr->asDocumentWeightAttribute()) + StringFixture() + : attr(make_attribute(BasicType::STRING, CT, true)), + api(attr->asDocumentWeightAttribute()) { ASSERT_TRUE(api != nullptr); add_docs(attr); @@ -80,10 +93,15 @@ struct StringFixture { } }; +using StringWsetFixture = StringFixture; +using StringArrayFixture = StringFixture; + TEST("require that appropriate attributes support the document weight attribute interface") { EXPECT_TRUE(make_attribute(BasicType::INT32, CollectionType::WSET, true)->asDocumentWeightAttribute() != nullptr); EXPECT_TRUE(make_attribute(BasicType::INT64, CollectionType::WSET, true)->asDocumentWeightAttribute() != nullptr); EXPECT_TRUE(make_attribute(BasicType::STRING, CollectionType::WSET, true)->asDocumentWeightAttribute() != nullptr); + EXPECT_TRUE(make_attribute(BasicType::INT64, CollectionType::ARRAY, true)->asDocumentWeightAttribute() != nullptr); + EXPECT_TRUE(make_attribute(BasicType::STRING, CollectionType::ARRAY, true)->asDocumentWeightAttribute() != nullptr); } TEST("require that inappropriate attributes do not support the document weight attribute interface") { @@ -91,12 +109,10 @@ TEST("require that inappropriate attributes do not support the document weight a EXPECT_TRUE(make_attribute(BasicType::INT64, CollectionType::ARRAY, false)->asDocumentWeightAttribute() == nullptr); EXPECT_TRUE(make_attribute(BasicType::INT64, CollectionType::WSET, false)->asDocumentWeightAttribute() == nullptr); EXPECT_TRUE(make_attribute(BasicType::INT64, CollectionType::SINGLE, true)->asDocumentWeightAttribute() == nullptr); - EXPECT_TRUE(make_attribute(BasicType::INT64, CollectionType::ARRAY, true)->asDocumentWeightAttribute() == nullptr); EXPECT_TRUE(make_attribute(BasicType::STRING, CollectionType::SINGLE, false)->asDocumentWeightAttribute() == nullptr); EXPECT_TRUE(make_attribute(BasicType::STRING, CollectionType::ARRAY, false)->asDocumentWeightAttribute() == nullptr); EXPECT_TRUE(make_attribute(BasicType::STRING, CollectionType::WSET, false)->asDocumentWeightAttribute() == nullptr); EXPECT_TRUE(make_attribute(BasicType::STRING, CollectionType::SINGLE, true)->asDocumentWeightAttribute() == nullptr); - EXPECT_TRUE(make_attribute(BasicType::STRING, CollectionType::ARRAY, true)->asDocumentWeightAttribute() == nullptr); EXPECT_TRUE(make_attribute(BasicType::FLOAT, CollectionType::WSET, true)->asDocumentWeightAttribute() == nullptr); EXPECT_TRUE(make_attribute(BasicType::DOUBLE, CollectionType::WSET, true)->asDocumentWeightAttribute() == nullptr); } @@ -115,12 +131,22 @@ void verify_invalid_lookup(IDocumentWeightAttribute::LookupResult result) { EXPECT_EQUAL(0, result.max_weight); } -TEST_F("require that integer lookup works correctly", LongFixture) { +TEST_F("require that integer wset lookup works correctly", LongWsetFixture) { verify_valid_lookup(f1.api->lookup("111", f1.api->get_dictionary_snapshot())); verify_invalid_lookup(f1.api->lookup("222", f1.api->get_dictionary_snapshot())); } -TEST_F("require string lookup works correctly", StringFixture) { +TEST_F("require that integer array lookup works correctly", LongArrayFixture) { + verify_valid_lookup(f1.api->lookup("111", f1.api->get_dictionary_snapshot())); + verify_invalid_lookup(f1.api->lookup("222", f1.api->get_dictionary_snapshot())); +} + +TEST_F("require string wset lookup works correctly", StringWsetFixture) { + verify_valid_lookup(f1.api->lookup("foo", f1.api->get_dictionary_snapshot())); + verify_invalid_lookup(f1.api->lookup("bar", f1.api->get_dictionary_snapshot())); +} + +TEST_F("require string array lookup works correctly", StringArrayFixture) { verify_valid_lookup(f1.api->lookup("foo", f1.api->get_dictionary_snapshot())); verify_invalid_lookup(f1.api->lookup("bar", f1.api->get_dictionary_snapshot())); } @@ -152,15 +178,23 @@ void verify_posting(const IDocumentWeightAttribute &api, const char *term) { } } -TEST_F("require that integer iterators are created correctly", LongFixture) { +TEST_F("require that integer wset iterators are created correctly", LongWsetFixture) { verify_posting(*f1.api, "111"); } -TEST_F("require that string iterators are created correctly", StringFixture) { +TEST_F("require that integer array iterators are created correctly", LongArrayFixture) { + verify_posting(*f1.api, "111"); +} + +TEST_F("require that string wset iterators are created correctly", StringWsetFixture) { + verify_posting(*f1.api, "foo"); +} + +TEST_F("require that string array iterators are created correctly", StringArrayFixture) { verify_posting(*f1.api, "foo"); } -TEST_F("require that collect_folded works for string", StringFixture) +TEST_F("require that collect_folded works for string", StringWsetFixture) { StringAttribute *attr = static_cast(f1.attr.get()); set_doc(attr, 2, "bar", 30); @@ -176,7 +210,7 @@ TEST_F("require that collect_folded works for string", StringFixture) EXPECT_EQUAL(expected_folded, folded); } -TEST_F("require that collect_folded works for integers", LongFixture) +TEST_F("require that collect_folded works for integers", LongWsetFixture) { IntegerAttributeTemplate *attr = dynamic_cast *>(f1.attr.get()); set_doc(attr, 2, int64_t(112), 30); @@ -217,7 +251,7 @@ Verifier::Verifier() set_doc(int_attr, docid, int64_t(123), 1); } } -Verifier::~Verifier() {} +Verifier::~Verifier() = default; TEST("verify document weight search iterator") { Verifier verifier; diff --git a/searchlib/src/vespa/searchlib/attribute/multinumericpostattribute.hpp b/searchlib/src/vespa/searchlib/attribute/multinumericpostattribute.hpp index f652a3b95b9..67dcc992c58 100644 --- a/searchlib/src/vespa/searchlib/attribute/multinumericpostattribute.hpp +++ b/searchlib/src/vespa/searchlib/attribute/multinumericpostattribute.hpp @@ -154,10 +154,9 @@ template const IDocumentWeightAttribute * MultiValueNumericPostingAttribute::asDocumentWeightAttribute() const { - if (this->hasWeightedSetType() && this->isIntegerType()) { - return &_document_weight_attribute_adapter; - } - return nullptr; + return this->isIntegerType() + ? &_document_weight_attribute_adapter + : nullptr; } } // namespace search diff --git a/searchlib/src/vespa/searchlib/attribute/multistringpostattribute.hpp b/searchlib/src/vespa/searchlib/attribute/multistringpostattribute.hpp index b8844583911..c10b370d629 100644 --- a/searchlib/src/vespa/searchlib/attribute/multistringpostattribute.hpp +++ b/searchlib/src/vespa/searchlib/attribute/multistringpostattribute.hpp @@ -174,10 +174,9 @@ template const IDocumentWeightAttribute * MultiValueStringPostingAttributeT::asDocumentWeightAttribute() const { - if (this->hasWeightedSetType() && (this->isStringType())) { - return &_document_weight_attribute_adapter; - } - return nullptr; + return this->isStringType() + ? &_document_weight_attribute_adapter + : nullptr; } } // namespace search -- cgit v1.2.3