diff options
author | Geir Storli <geirst@yahooinc.com> | 2022-04-07 15:39:01 +0200 |
---|---|---|
committer | GitHub <noreply@github.com> | 2022-04-07 15:39:01 +0200 |
commit | cf48548f42740b20e1e277ca022707a769e6a79b (patch) | |
tree | 7c345497af8fdb2747349461511c56e8c12e7c30 /searchlib | |
parent | f2850bb028ff11c91adb370f5bd03899ac5022ec (diff) | |
parent | be22b2c9def56339be83f9dbe3bbf32c53a7a5d4 (diff) |
Merge pull request #22033 from vespa-engine/geirst/handle-filter-search-for-direct-attribute-blueprint
Implement createFilterSearch() for DirectAttributeBlueprint.
Diffstat (limited to 'searchlib')
-rw-r--r-- | searchlib/src/tests/attribute/searchable/attributeblueprint_test.cpp | 34 | ||||
-rw-r--r-- | searchlib/src/vespa/searchlib/attribute/attribute_blueprint_factory.cpp | 7 |
2 files changed, 41 insertions, 0 deletions
diff --git a/searchlib/src/tests/attribute/searchable/attributeblueprint_test.cpp b/searchlib/src/tests/attribute/searchable/attributeblueprint_test.cpp index 605a59b8a6a..192e137ddff 100644 --- a/searchlib/src/tests/attribute/searchable/attributeblueprint_test.cpp +++ b/searchlib/src/tests/attribute/searchable/attributeblueprint_test.cpp @@ -152,6 +152,16 @@ struct StringAttributeFiller { } }; +struct WsetStringAttributeFiller { + using ValueType = vespalib::string; + static void add(AttributeVector& attr, const vespalib::string& value) { + auto& real = downcast<StringAttribute>(attr); + uint32_t docid = attr.getNumDocs() - 1; + real.append(docid, value, 1); + real.commit(); + } +}; + struct IntegerAttributeFiller { using ValueType = int64_t; static void add(AttributeVector& attr, int64_t value) { @@ -183,6 +193,17 @@ make_string_attribute(const std::string& value) } AttributeVector::SP +make_wset_string_attribute(const std::string& value) +{ + Config cfg(BasicType::STRING, CollectionType::WSET); + // fast-search is needed to trigger use of DirectAttributeBlueprint. + cfg.setFastSearch(true); + auto attr = AttributeFactory::createAttribute(field, cfg); + fill<WsetStringAttributeFiller>(*attr, value); + return attr; +} + +AttributeVector::SP make_int_attribute(int64_t value) { Config cfg(BasicType::INT32, CollectionType::SINGLE); @@ -413,4 +434,17 @@ TEST(AttributeBlueprintTest, attribute_field_blueprint_wraps_filter_search_itera EXPECT_TRUE(wrapper.seek(2)); } +TEST(AttributeBlueprintTest, direct_attribute_blueprint_wraps_filter_search_iterator) +{ + BlueprintFactoryFixture f(make_wset_string_attribute("foo")); + SimpleStringTerm term("foo", field, 0, Weight(0)); + auto blueprint = f.create_blueprint(term); + + auto itr = blueprint->createFilterSearch(true, Blueprint::FilterConstraint::UPPER_BOUND); + auto& wrapper = downcast<FilterWrapper>(*itr); + wrapper.initRange(1, 3); + EXPECT_FALSE(wrapper.seek(1)); + EXPECT_TRUE(wrapper.seek(2)); +} + GTEST_MAIN_RUN_ALL_TESTS() diff --git a/searchlib/src/vespa/searchlib/attribute/attribute_blueprint_factory.cpp b/searchlib/src/vespa/searchlib/attribute/attribute_blueprint_factory.cpp index f14966dbfc8..bde73faf466 100644 --- a/searchlib/src/vespa/searchlib/attribute/attribute_blueprint_factory.cpp +++ b/searchlib/src/vespa/searchlib/attribute/attribute_blueprint_factory.cpp @@ -562,6 +562,13 @@ public: return std::make_unique<queryeval::DocumentWeightSearchIterator>(*tfmda[0], _attr, _dict_entry); } + SearchIteratorUP createFilterSearch(bool strict, FilterConstraint constraint) const override { + (void) constraint; // We provide an iterator with exact results, so no need to take constraint into consideration. + auto wrapper = std::make_unique<FilterWrapper>(getState().numFields()); + wrapper->wrap(createLeafSearch(wrapper->tfmda(), strict)); + return wrapper; + } + void visitMembers(vespalib::ObjectVisitor &visitor) const override { LeafBlueprint::visitMembers(visitor); visit(visitor, "attribute", _attrName); |