aboutsummaryrefslogtreecommitdiffstats
path: root/searchlib
diff options
context:
space:
mode:
authorArne Juul <arnej@verizonmedia.com>2020-05-26 10:44:10 +0000
committerArne Juul <arnej@verizonmedia.com>2020-05-26 11:28:42 +0000
commit3c9913ad6d0351834c95dfcbb2b774756e086888 (patch)
tree692aa5ecef219881913a7e04d2f7bd9bb2bc4a12 /searchlib
parent2db5075555f93d5adbc5db67c53935d904e4aceb (diff)
extend blueprint API
Diffstat (limited to 'searchlib')
-rw-r--r--searchlib/src/vespa/searchlib/queryeval/CMakeLists.txt1
-rw-r--r--searchlib/src/vespa/searchlib/queryeval/blueprint.cpp13
-rw-r--r--searchlib/src/vespa/searchlib/queryeval/blueprint.h3
-rw-r--r--searchlib/src/vespa/searchlib/queryeval/emptysearch.cpp27
-rw-r--r--searchlib/src/vespa/searchlib/queryeval/emptysearch.h5
-rw-r--r--searchlib/src/vespa/searchlib/queryeval/full_search.cpp46
-rw-r--r--searchlib/src/vespa/searchlib/queryeval/full_search.h25
-rw-r--r--searchlib/src/vespa/searchlib/queryeval/searchiterator.h4
8 files changed, 117 insertions, 7 deletions
diff --git a/searchlib/src/vespa/searchlib/queryeval/CMakeLists.txt b/searchlib/src/vespa/searchlib/queryeval/CMakeLists.txt
index 723af890f0e..5f8c2514f49 100644
--- a/searchlib/src/vespa/searchlib/queryeval/CMakeLists.txt
+++ b/searchlib/src/vespa/searchlib/queryeval/CMakeLists.txt
@@ -19,6 +19,7 @@ vespa_add_library(searchlib_queryeval OBJECT
fake_search.cpp
fake_searchable.cpp
field_spec.cpp
+ full_search.cpp
get_weight_from_node.cpp
global_filter.cpp
hitcollector.cpp
diff --git a/searchlib/src/vespa/searchlib/queryeval/blueprint.cpp b/searchlib/src/vespa/searchlib/queryeval/blueprint.cpp
index ff19041e16c..2229d2be9a0 100644
--- a/searchlib/src/vespa/searchlib/queryeval/blueprint.cpp
+++ b/searchlib/src/vespa/searchlib/queryeval/blueprint.cpp
@@ -3,6 +3,8 @@
#include "blueprint.h"
#include "leaf_blueprints.h"
#include "intermediate_blueprints.h"
+#include "emptysearch.h"
+#include "full_search.h"
#include "field_spec.hpp"
#include <vespa/searchlib/fef/termfieldmatchdataarray.h>
#include <vespa/vespalib/objects/visit.hpp>
@@ -119,6 +121,17 @@ Blueprint::root() const
return *bp;
}
+SearchIterator::UP
+Blueprint::createFilterSearch(bool /*strict*/, FilterBound bound) const
+{
+ if (bound == FilterBound::UPPER) {
+ return std::make_unique<FullSearch>();
+ } else {
+ LOG_ASSERT(bound == FilterBound::LOWER);
+ return std::make_unique<EmptySearch>();
+ }
+}
+
vespalib::string
Blueprint::asString() const
{
diff --git a/searchlib/src/vespa/searchlib/queryeval/blueprint.h b/searchlib/src/vespa/searchlib/queryeval/blueprint.h
index 927f57907f8..604ace7dbe5 100644
--- a/searchlib/src/vespa/searchlib/queryeval/blueprint.h
+++ b/searchlib/src/vespa/searchlib/queryeval/blueprint.h
@@ -164,6 +164,8 @@ public:
virtual bool check(const Blueprint & bp) const = 0;
};
+ enum class FilterBound { UPPER, LOWER };
+
Blueprint();
Blueprint(const Blueprint &) = delete;
Blueprint &operator=(const Blueprint &) = delete;
@@ -199,6 +201,7 @@ public:
bool frozen() const { return _frozen; }
virtual SearchIteratorUP createSearch(fef::MatchData &md, bool strict) const = 0;
+ virtual SearchIteratorUP createFilterSearch(bool strict, FilterBound bound) const;
// for debug dumping
vespalib::string asString() const;
diff --git a/searchlib/src/vespa/searchlib/queryeval/emptysearch.cpp b/searchlib/src/vespa/searchlib/queryeval/emptysearch.cpp
index bab047827ad..0850f57702e 100644
--- a/searchlib/src/vespa/searchlib/queryeval/emptysearch.cpp
+++ b/searchlib/src/vespa/searchlib/queryeval/emptysearch.cpp
@@ -2,8 +2,7 @@
#include "emptysearch.h"
-namespace search {
-namespace queryeval {
+namespace search::queryeval {
void
EmptySearch::doSeek(uint32_t)
@@ -15,6 +14,27 @@ EmptySearch::doUnpack(uint32_t)
{
}
+void
+EmptySearch::or_hits_into(BitVector &, uint32_t)
+{
+ // nop
+}
+
+void
+EmptySearch::and_hits_into(BitVector &result, uint32_t begin_id)
+{
+ result.clearInterval(begin_id, getEndId());
+}
+
+BitVector::UP
+EmptySearch::get_hits(uint32_t begin_id)
+{
+ auto result = BitVector::create(begin_id, getEndId());
+ result->clearInterval(begin_id, getEndId());
+ result->invalidateCachedCount();
+ return result;
+}
+
EmptySearch::Trinary
EmptySearch::is_strict() const
{
@@ -30,5 +50,4 @@ EmptySearch::~EmptySearch()
{
}
-} // namespace queryeval
-} // namespace search
+} // namespace
diff --git a/searchlib/src/vespa/searchlib/queryeval/emptysearch.h b/searchlib/src/vespa/searchlib/queryeval/emptysearch.h
index 12d7430922c..c98129210bd 100644
--- a/searchlib/src/vespa/searchlib/queryeval/emptysearch.h
+++ b/searchlib/src/vespa/searchlib/queryeval/emptysearch.h
@@ -3,6 +3,7 @@
#pragma once
#include "searchiterator.h"
+#include <vespa/searchlib/common/bitvector.h>
namespace search {
namespace queryeval {
@@ -12,6 +13,9 @@ class EmptySearch : public SearchIterator
protected:
void doSeek(uint32_t) override;
void doUnpack(uint32_t) override;
+ void or_hits_into(BitVector &result, uint32_t begin_id) override;
+ void and_hits_into(BitVector &result, uint32_t begin_id) override;
+ BitVector::UP get_hits(uint32_t begin_id) override;
void initRange(uint32_t begin, uint32_t end) override {
SearchIterator::initRange(begin, end);
setAtEnd();
@@ -25,4 +29,3 @@ public:
} // namespace queryeval
} // namespace search
-
diff --git a/searchlib/src/vespa/searchlib/queryeval/full_search.cpp b/searchlib/src/vespa/searchlib/queryeval/full_search.cpp
new file mode 100644
index 00000000000..9b02845b98d
--- /dev/null
+++ b/searchlib/src/vespa/searchlib/queryeval/full_search.cpp
@@ -0,0 +1,46 @@
+// Copyright Verizon Media. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root.
+
+#include "full_search.h"
+
+namespace search::queryeval {
+
+void
+FullSearch::doSeek(uint32_t docid)
+{
+ setDocId(docid);
+}
+
+void
+FullSearch::doUnpack(uint32_t)
+{
+ abort();
+}
+
+void
+FullSearch::or_hits_into(BitVector &result, uint32_t begin_id)
+{
+ result.setInterval(begin_id, getEndId());
+}
+
+void
+FullSearch::and_hits_into(BitVector &, uint32_t)
+{
+ // nop
+}
+
+BitVector::UP
+FullSearch::get_hits(uint32_t begin_id)
+{
+ auto result = BitVector::create(begin_id, getEndId());
+ result->setInterval(begin_id, getEndId());
+ result->invalidateCachedCount();
+ return result;
+}
+
+FullSearch::FullSearch() : SearchIterator()
+{
+}
+
+FullSearch::~FullSearch() = default;
+
+} // namespace
diff --git a/searchlib/src/vespa/searchlib/queryeval/full_search.h b/searchlib/src/vespa/searchlib/queryeval/full_search.h
new file mode 100644
index 00000000000..3838b90999c
--- /dev/null
+++ b/searchlib/src/vespa/searchlib/queryeval/full_search.h
@@ -0,0 +1,25 @@
+// Copyright Verizon Media. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root.
+
+#pragma once
+
+#include "searchiterator.h"
+#include <vespa/searchlib/common/bitvector.h>
+
+namespace search::queryeval {
+
+class FullSearch : public SearchIterator
+{
+private:
+ Trinary is_strict() const override { return Trinary::True; }
+ void doSeek(uint32_t) override;
+ void doUnpack(uint32_t) override;
+ void or_hits_into(BitVector &result, uint32_t begin_id) override;
+ void and_hits_into(BitVector &result, uint32_t begin_id) override;
+ BitVector::UP get_hits(uint32_t begin_id) override;
+
+public:
+ FullSearch();
+ ~FullSearch();
+};
+
+}
diff --git a/searchlib/src/vespa/searchlib/queryeval/searchiterator.h b/searchlib/src/vespa/searchlib/queryeval/searchiterator.h
index afc1bc8ce15..3ce808de7a1 100644
--- a/searchlib/src/vespa/searchlib/queryeval/searchiterator.h
+++ b/searchlib/src/vespa/searchlib/queryeval/searchiterator.h
@@ -160,14 +160,14 @@ public:
/**
* Find all hits in the currently searched range (specified by
- * initRange) and OR them into the given temporary result. This
+ * initRange) and AND them into the given temporary result. This
* function will perform term-at-a-time evaluation and should only
* be used for terms not needed for ranking. Calling this function
* will exhaust this iterator and no more results will be
* available in the currently searched range after this function
* returns.
*
- * @param result result to be augmented by adding hits from this
+ * @param result result to be augmented by clearing non-hits from this
* iterator.
* @param begin_id the lowest document id that may be a hit
* (we might not remember beginId from initRange)