summaryrefslogtreecommitdiffstats
path: root/searchlib
diff options
context:
space:
mode:
authorGeir Storli <geirst@yahooinc.com>2022-04-07 15:39:01 +0200
committerGitHub <noreply@github.com>2022-04-07 15:39:01 +0200
commitcf48548f42740b20e1e277ca022707a769e6a79b (patch)
tree7c345497af8fdb2747349461511c56e8c12e7c30 /searchlib
parentf2850bb028ff11c91adb370f5bd03899ac5022ec (diff)
parentbe22b2c9def56339be83f9dbe3bbf32c53a7a5d4 (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.cpp34
-rw-r--r--searchlib/src/vespa/searchlib/attribute/attribute_blueprint_factory.cpp7
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);