aboutsummaryrefslogtreecommitdiffstats
path: root/searchlib
diff options
context:
space:
mode:
authorHenning Baldersheim <balder@yahoo-inc.com>2020-01-10 15:34:14 +0100
committerGitHub <noreply@github.com>2020-01-10 15:34:14 +0100
commitcd168363b8f09ccc9d830b97b077ee09c5d5b4f1 (patch)
tree05e4b5ad6f094512619a06dc68d9179d46e98914 /searchlib
parent4a4d4d63b282edce1d7aa281f8652099cdef4a73 (diff)
parent373acb16527ab02cadd4142fb0b6b2cc14a3ae6d (diff)
Merge pull request #11741 from vespa-engine/balder/bitvectorsearchcontext-must-implement-find-too
Balder/bitvectorsearchcontext must implement find too
Diffstat (limited to 'searchlib')
-rw-r--r--searchlib/src/tests/queryeval/getnodeweight/getnodeweight_test.cpp26
-rw-r--r--searchlib/src/tests/queryeval/queryeval.cpp21
-rw-r--r--searchlib/src/vespa/searchlib/attribute/imported_attribute_vector.cpp1
-rw-r--r--searchlib/src/vespa/searchlib/attribute/imported_search_context.cpp11
-rw-r--r--searchlib/src/vespa/searchlib/attribute/imported_search_context.h1
-rw-r--r--searchlib/src/vespa/searchlib/attribute/singleboolattribute.cpp15
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: