diff options
author | Henning Baldersheim <balder@yahoo-inc.com> | 2020-01-10 15:34:14 +0100 |
---|---|---|
committer | GitHub <noreply@github.com> | 2020-01-10 15:34:14 +0100 |
commit | cd168363b8f09ccc9d830b97b077ee09c5d5b4f1 (patch) | |
tree | 05e4b5ad6f094512619a06dc68d9179d46e98914 | |
parent | 4a4d4d63b282edce1d7aa281f8652099cdef4a73 (diff) | |
parent | 373acb16527ab02cadd4142fb0b6b2cc14a3ae6d (diff) |
Merge pull request #11741 from vespa-engine/balder/bitvectorsearchcontext-must-implement-find-too
Balder/bitvectorsearchcontext must implement find too
6 files changed, 47 insertions, 28 deletions
diff --git a/searchlib/src/tests/queryeval/getnodeweight/getnodeweight_test.cpp b/searchlib/src/tests/queryeval/getnodeweight/getnodeweight_test.cpp index 830093e7b5f..359a7f9c074 100644 --- a/searchlib/src/tests/queryeval/getnodeweight/getnodeweight_test.cpp +++ b/searchlib/src/tests/queryeval/getnodeweight/getnodeweight_test.cpp @@ -1,29 +1,24 @@ // Copyright 2017 Yahoo Holdings. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root. -#include <vespa/log/log.h> -LOG_SETUP("getweight_test"); + #include <vespa/vespalib/testkit/testapp.h> #include <vespa/searchlib/query/tree/simplequery.h> #include <vespa/searchlib/queryeval/get_weight_from_node.h> +#include <vespa/log/log.h> +LOG_SETUP("getweight_test"); using namespace search::query; using namespace search::queryeval; -class Test : public vespalib::TestApp { -public: - int32_t getWeight(const Node &node); - int Main() override; -}; - -int32_t -Test::getWeight(const Node &node) { - return getWeightFromNode(node).percent(); +namespace { + int32_t + getWeight(const Node &node) { + return getWeightFromNode(node).percent(); + } } -int -Test::Main() +TEST("test variations of getWeight") { - TEST_INIT("getweight_test"); EXPECT_EQUAL(0, getWeight(SimpleAnd())); EXPECT_EQUAL(0, getWeight(SimpleAndNot())); EXPECT_EQUAL(42, getWeight(SimpleEquiv(0, Weight(42)))); @@ -42,7 +37,6 @@ Test::Main() EXPECT_EQUAL(42, getWeight(SimpleWeightedSetTerm("bar", 1, Weight(42)))); EXPECT_EQUAL(42, getWeight(SimpleDotProduct("bar", 1, Weight(42)))); EXPECT_EQUAL(42, getWeight(SimpleWandTerm("bar", 1, Weight(42), 57, 67, 77.7))); - TEST_DONE(); } -TEST_APPHOOK(Test); +TEST_MAIN() { TEST_RUN_ALL(); } diff --git a/searchlib/src/tests/queryeval/queryeval.cpp b/searchlib/src/tests/queryeval/queryeval.cpp index 26e7095dd60..32dc9b1fa7e 100644 --- a/searchlib/src/tests/queryeval/queryeval.cpp +++ b/searchlib/src/tests/queryeval/queryeval.cpp @@ -2,7 +2,6 @@ #include <vespa/vespalib/testkit/test_kit.h> #include <vespa/searchlib/test/initrange.h> -#include <vespa/searchlib/common/bitvectoriterator.h> #include <vespa/searchlib/queryeval/andnotsearch.h> #include <vespa/searchlib/queryeval/andsearch.h> #include <vespa/searchlib/queryeval/booleanmatchiteratorwrapper.h> @@ -27,7 +26,6 @@ LOG_SETUP("query_eval_test"); using namespace search::queryeval; using search::BitVector; -using search::BitVectorIterator; using search::attribute::SearchContextParams; using search::fef::MatchData; using search::fef::TermFieldMatchData; @@ -342,18 +340,35 @@ public: _sc = _a.getSearch(std::make_unique<search::QueryTermSimple>("1", search::QueryTermSimple::WORD), SearchContextParams().useBitVector(true)); } - virtual SearchIterator::UP + SearchIterator::UP createLeafSearch(const TermFieldMatchDataArray &tfmda, bool strict) const override { (void) tfmda; return _sc->createIterator(&_tfmd, strict); } + const search::AttributeVector::SearchContext & getSearchContext() const { return *_sc; } private: search::SingleBoolAttribute _a; search::AttributeVector::SearchContext::UP _sc; mutable TermFieldMatchData _tfmd; }; +TEST("test bool attribute searchcontext") { + SimpleResult a; + a.addHit(5).addHit(17).addHit(30); + auto bp = std::make_unique<DummySingleValueBitNumericAttributeBlueprint>(a); + const search::AttributeVector::SearchContext & sc = bp->getSearchContext(); + EXPECT_FALSE(sc.matches(7)); + EXPECT_TRUE(sc.matches(17)); + int32_t weight(0); + EXPECT_FALSE(sc.matches(7, weight)); + EXPECT_EQUAL(0, weight); + EXPECT_TRUE(sc.matches(17, weight)); + EXPECT_EQUAL(1, weight); + EXPECT_FALSE(sc.matches(27, weight)); + EXPECT_EQUAL(0, weight); +} + TEST("testAndNot") { { diff --git a/searchlib/src/vespa/searchlib/attribute/imported_attribute_vector.cpp b/searchlib/src/vespa/searchlib/attribute/imported_attribute_vector.cpp index 9e3b0bbde3e..7ae55a243f8 100644 --- a/searchlib/src/vespa/searchlib/attribute/imported_attribute_vector.cpp +++ b/searchlib/src/vespa/searchlib/attribute/imported_attribute_vector.cpp @@ -3,7 +3,6 @@ #include "imported_attribute_vector.h" #include "imported_attribute_vector_read_guard.h" #include "imported_search_context.h" -#include <vespa/vespalib/util/exceptions.h> namespace search::attribute { diff --git a/searchlib/src/vespa/searchlib/attribute/imported_search_context.cpp b/searchlib/src/vespa/searchlib/attribute/imported_search_context.cpp index f146378782c..0c15e832487 100644 --- a/searchlib/src/vespa/searchlib/attribute/imported_search_context.cpp +++ b/searchlib/src/vespa/searchlib/attribute/imported_search_context.cpp @@ -44,9 +44,9 @@ ImportedSearchContext::ImportedSearchContext( _target_search_context(_target_attribute.createSearchContext(std::move(term), params)), _targetLids(_reference_attribute.getTargetLids()), _merger(_reference_attribute.getCommittedDocIdLimit()), - _fetchPostingsDone(false) + _fetchPostingsDone(false), + _params(params) { - } ImportedSearchContext::~ImportedSearchContext() = default; @@ -74,6 +74,13 @@ ImportedSearchContext::createIterator(fef::TermFieldMatchData* matchData, bool s } else if (_merger.hasBitVector()) { return BitVectorIterator::create(_merger.getBitVector(), _merger.getDocIdLimit(), *matchData, strict); } + if (_params.useBitVector()) { + if (!strict) { + return std::make_unique<FilterAttributeIteratorT<ImportedSearchContext>>(*this, matchData); + } else { + return std::make_unique<FilterAttributeIteratorStrict<ImportedSearchContext>>(*this, matchData); + } + } if (!strict) { return std::make_unique<AttributeIteratorT<ImportedSearchContext>>(*this, matchData); } else { diff --git a/searchlib/src/vespa/searchlib/attribute/imported_search_context.h b/searchlib/src/vespa/searchlib/attribute/imported_search_context.h index 2663978c99a..1c73ac6c8c2 100644 --- a/searchlib/src/vespa/searchlib/attribute/imported_search_context.h +++ b/searchlib/src/vespa/searchlib/attribute/imported_search_context.h @@ -38,6 +38,7 @@ class ImportedSearchContext : public ISearchContext { TargetLids _targetLids; PostingListMerger<int32_t> _merger; bool _fetchPostingsDone; + SearchContextParams _params; uint32_t getTargetLid(uint32_t lid) const { return _targetLids[lid]; diff --git a/searchlib/src/vespa/searchlib/attribute/singleboolattribute.cpp b/searchlib/src/vespa/searchlib/attribute/singleboolattribute.cpp index e1277653b83..250182f924b 100644 --- a/searchlib/src/vespa/searchlib/attribute/singleboolattribute.cpp +++ b/searchlib/src/vespa/searchlib/attribute/singleboolattribute.cpp @@ -112,14 +112,17 @@ private: bool _invert; bool _valid; bool valid() const override { return _valid; } - int32_t onFind(DocId , int32_t , int32_t & ) const override { - assert(false); - return -1; + int32_t onFind(DocId docId, int32_t elemId, int32_t & weight) const override final { + if ((elemId == 0) && _bv.testBit(docId)) { + weight = 1; + return 0; + } + weight = 0; + return -1; } - int32_t onFind(DocId , int32_t ) const override { - assert(false); - return -1; + int32_t onFind(DocId docId, int32_t elemId) const override final { + return ((elemId == 0) && _bv.testBit(docId)) ? 0 : -1; } public: |