From 3c9913ad6d0351834c95dfcbb2b774756e086888 Mon Sep 17 00:00:00 2001 From: Arne Juul Date: Tue, 26 May 2020 10:44:10 +0000 Subject: extend blueprint API --- .../src/vespa/searchlib/queryeval/CMakeLists.txt | 1 + .../src/vespa/searchlib/queryeval/blueprint.cpp | 13 ++++++ .../src/vespa/searchlib/queryeval/blueprint.h | 3 ++ .../src/vespa/searchlib/queryeval/emptysearch.cpp | 27 +++++++++++-- .../src/vespa/searchlib/queryeval/emptysearch.h | 5 ++- .../src/vespa/searchlib/queryeval/full_search.cpp | 46 ++++++++++++++++++++++ .../src/vespa/searchlib/queryeval/full_search.h | 25 ++++++++++++ .../src/vespa/searchlib/queryeval/searchiterator.h | 4 +- 8 files changed, 117 insertions(+), 7 deletions(-) create mode 100644 searchlib/src/vespa/searchlib/queryeval/full_search.cpp create mode 100644 searchlib/src/vespa/searchlib/queryeval/full_search.h (limited to 'searchlib') 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 #include @@ -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(); + } else { + LOG_ASSERT(bound == FilterBound::LOWER); + return std::make_unique(); + } +} + 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 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 + +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) -- cgit v1.2.3