aboutsummaryrefslogtreecommitdiffstats
path: root/searchlib/src/vespa
diff options
context:
space:
mode:
authorArne Juul <arnej@verizonmedia.com>2020-06-02 11:46:16 +0000
committerArne Juul <arnej@verizonmedia.com>2020-06-04 10:19:59 +0000
commit67134e619715227e6cbe91f365213487ff1b1f34 (patch)
treec912b02050ed980ea6715a0b171ad61e47e34a89 /searchlib/src/vespa
parentc42ccbb874b581c7394a31dcb6a5e0e715d46e18 (diff)
use vector of UP as MultiSearch::Children
* add helper class for constructing MultiSearch::Children (mostly for unit tests) * rewrite as needed to adapt
Diffstat (limited to 'searchlib/src/vespa')
-rw-r--r--searchlib/src/vespa/searchlib/attribute/attribute_blueprint_factory.cpp11
-rw-r--r--searchlib/src/vespa/searchlib/queryeval/CMakeLists.txt1
-rw-r--r--searchlib/src/vespa/searchlib/queryeval/andnotsearch.cpp21
-rw-r--r--searchlib/src/vespa/searchlib/queryeval/andnotsearch.h13
-rw-r--r--searchlib/src/vespa/searchlib/queryeval/andsearch.cpp32
-rw-r--r--searchlib/src/vespa/searchlib/queryeval/andsearch.h7
-rw-r--r--searchlib/src/vespa/searchlib/queryeval/andsearchnostrict.h4
-rw-r--r--searchlib/src/vespa/searchlib/queryeval/andsearchstrict.h4
-rw-r--r--searchlib/src/vespa/searchlib/queryeval/blueprint.cpp5
-rw-r--r--searchlib/src/vespa/searchlib/queryeval/blueprint.h3
-rw-r--r--searchlib/src/vespa/searchlib/queryeval/children_iterators.cpp3
-rw-r--r--searchlib/src/vespa/searchlib/queryeval/children_iterators.h39
-rw-r--r--searchlib/src/vespa/searchlib/queryeval/equiv_blueprint.cpp14
-rw-r--r--searchlib/src/vespa/searchlib/queryeval/equivsearch.cpp14
-rw-r--r--searchlib/src/vespa/searchlib/queryeval/equivsearch.h12
-rw-r--r--searchlib/src/vespa/searchlib/queryeval/intermediate_blueprints.cpp105
-rw-r--r--searchlib/src/vespa/searchlib/queryeval/intermediate_blueprints.h16
-rw-r--r--searchlib/src/vespa/searchlib/queryeval/multibitvectoriterator.cpp38
-rw-r--r--searchlib/src/vespa/searchlib/queryeval/multibitvectoriterator.h2
-rw-r--r--searchlib/src/vespa/searchlib/queryeval/multisearch.cpp15
-rw-r--r--searchlib/src/vespa/searchlib/queryeval/multisearch.h13
-rw-r--r--searchlib/src/vespa/searchlib/queryeval/nearsearch.cpp15
-rw-r--r--searchlib/src/vespa/searchlib/queryeval/nearsearch.h6
-rw-r--r--searchlib/src/vespa/searchlib/queryeval/orlikesearch.h4
-rw-r--r--searchlib/src/vespa/searchlib/queryeval/orsearch.cpp28
-rw-r--r--searchlib/src/vespa/searchlib/queryeval/orsearch.h7
-rw-r--r--searchlib/src/vespa/searchlib/queryeval/ranksearch.cpp10
-rw-r--r--searchlib/src/vespa/searchlib/queryeval/ranksearch.h5
-rw-r--r--searchlib/src/vespa/searchlib/queryeval/simple_phrase_blueprint.cpp15
-rw-r--r--searchlib/src/vespa/searchlib/queryeval/simple_phrase_search.cpp12
-rw-r--r--searchlib/src/vespa/searchlib/queryeval/simple_phrase_search.h2
-rw-r--r--searchlib/src/vespa/searchlib/queryeval/sourceblendersearch.cpp6
-rw-r--r--searchlib/src/vespa/searchlib/queryeval/sourceblendersearch.h5
-rw-r--r--searchlib/src/vespa/searchlib/queryeval/termwise_blueprint_helper.cpp18
-rw-r--r--searchlib/src/vespa/searchlib/queryeval/termwise_blueprint_helper.h11
-rw-r--r--searchlib/src/vespa/searchlib/queryeval/test/leafspec.h35
-rw-r--r--searchlib/src/vespa/searchlib/queryeval/test/trackedsearch.h6
-rw-r--r--searchlib/src/vespa/searchlib/queryeval/test/wandspec.h6
-rw-r--r--searchlib/src/vespa/searchlib/queryeval/wand/wand_parts.h1
-rw-r--r--searchlib/src/vespa/searchlib/queryeval/wand/weak_and_search.cpp14
-rw-r--r--searchlib/src/vespa/searchlib/queryeval/wand/weak_and_search.h6
-rw-r--r--searchlib/src/vespa/searchlib/queryeval/weighted_set_term_search.cpp8
-rw-r--r--searchlib/src/vespa/searchlib/queryeval/weighted_set_term_search.h8
-rw-r--r--searchlib/src/vespa/searchlib/test/initrange.h1
-rw-r--r--searchlib/src/vespa/searchlib/test/searchiteratorverifier.cpp24
45 files changed, 352 insertions, 273 deletions
diff --git a/searchlib/src/vespa/searchlib/attribute/attribute_blueprint_factory.cpp b/searchlib/src/vespa/searchlib/attribute/attribute_blueprint_factory.cpp
index a9a593b429d..74a23db8b95 100644
--- a/searchlib/src/vespa/searchlib/attribute/attribute_blueprint_factory.cpp
+++ b/searchlib/src/vespa/searchlib/attribute/attribute_blueprint_factory.cpp
@@ -169,7 +169,8 @@ AttributeFieldBlueprint::visitMembers(vespalib::ObjectVisitor &visitor) const
template <bool is_strict>
struct LocationPreFilterIterator : public OrLikeSearch<is_strict, NoUnpack>
{
- LocationPreFilterIterator(const std::vector<SearchIterator *> &children) : OrLikeSearch<is_strict, NoUnpack>(children, NoUnpack()) {}
+ LocationPreFilterIterator(OrSearch::Children children)
+ : OrLikeSearch<is_strict, NoUnpack>(std::move(children), NoUnpack()) {}
void doUnpack(uint32_t) override {}
};
@@ -215,14 +216,14 @@ public:
SearchIterator::UP
createLeafSearch(const TermFieldMatchDataArray &tfmda, bool strict) const override
{
- std::vector<SearchIterator *> children;
+ OrSearch::Children children;
for (auto it(_rangeSearches.begin()), mt(_rangeSearches.end()); it != mt; it++) {
- children.push_back((*it)->createIterator(tfmda[0], strict).release());
+ children.push_back((*it)->createIterator(tfmda[0], strict));
}
if (strict) {
- return std::make_unique<LocationPreFilterIterator<true>>(children);
+ return std::make_unique<LocationPreFilterIterator<true>>(std::move(children));
} else {
- return std::make_unique<LocationPreFilterIterator<false>>(children);
+ return std::make_unique<LocationPreFilterIterator<false>>(std::move(children));
}
}
diff --git a/searchlib/src/vespa/searchlib/queryeval/CMakeLists.txt b/searchlib/src/vespa/searchlib/queryeval/CMakeLists.txt
index c6ca41a2a2a..a080fbcd387 100644
--- a/searchlib/src/vespa/searchlib/queryeval/CMakeLists.txt
+++ b/searchlib/src/vespa/searchlib/queryeval/CMakeLists.txt
@@ -5,6 +5,7 @@ vespa_add_library(searchlib_queryeval OBJECT
andsearch.cpp
blueprint.cpp
booleanmatchiteratorwrapper.cpp
+ children_iterators.cpp
create_blueprint_visitor_helper.cpp
document_weight_search_iterator.cpp
dot_product_blueprint.cpp
diff --git a/searchlib/src/vespa/searchlib/queryeval/andnotsearch.cpp b/searchlib/src/vespa/searchlib/queryeval/andnotsearch.cpp
index 5646af9e677..61d6d2d9259 100644
--- a/searchlib/src/vespa/searchlib/queryeval/andnotsearch.cpp
+++ b/searchlib/src/vespa/searchlib/queryeval/andnotsearch.cpp
@@ -51,7 +51,7 @@ public:
*
* @param children the search objects we are andnot'ing
**/
- AndNotSearchStrict(const Children & children) : AndNotSearchStrictBase(children)
+ AndNotSearchStrict(Children children) : AndNotSearchStrictBase(std::move(children))
{
}
@@ -105,8 +105,8 @@ AndNotSearchStrict::internalSeek(uint32_t docid)
} // namespace
-OptimizedAndNotForBlackListing::OptimizedAndNotForBlackListing(const MultiSearch::Children & children) :
- AndNotSearchStrictBase(children)
+OptimizedAndNotForBlackListing::OptimizedAndNotForBlackListing(MultiSearch::Children children) :
+ AndNotSearchStrictBase(std::move(children))
{
}
@@ -131,23 +131,24 @@ void OptimizedAndNotForBlackListing::doUnpack(uint32_t docid)
positive()->doUnpack(docid);
}
-SearchIterator *
-AndNotSearch::create(const AndNotSearch::Children &children, bool strict) {
+std::unique_ptr<SearchIterator>
+AndNotSearch::create(ChildrenIterators children_in, bool strict) {
+ MultiSearch::Children children = std::move(children_in);
if (strict) {
- if ((children.size() == 2) && OptimizedAndNotForBlackListing::isBlackListIterator(children[1])) {
- return new OptimizedAndNotForBlackListing(children);
+ if ((children.size() == 2) && OptimizedAndNotForBlackListing::isBlackListIterator(children[1].get())) {
+ return std::make_unique<OptimizedAndNotForBlackListing>(std::move(children));
} else {
- return new AndNotSearchStrict(children);
+ return std::make_unique<AndNotSearchStrict>(std::move(children));
}
} else {
- return new AndNotSearch(children);
+ return SearchIterator::UP(new AndNotSearch(std::move(children)));
}
}
BitVector::UP
AndNotSearch::get_hits(uint32_t begin_id) {
const Children &children = getChildren();
- BitVector::UP result = children.front()->get_hits(begin_id);
+ BitVector::UP result = children[0]->get_hits(begin_id);
result->notSelf();
result = TermwiseHelper::orChildren(std::move(result), children.begin()+1, children.end(), begin_id);
result->notSelf();
diff --git a/searchlib/src/vespa/searchlib/queryeval/andnotsearch.h b/searchlib/src/vespa/searchlib/queryeval/andnotsearch.h
index c29ef9407ad..53a9aad6cca 100644
--- a/searchlib/src/vespa/searchlib/queryeval/andnotsearch.h
+++ b/searchlib/src/vespa/searchlib/queryeval/andnotsearch.h
@@ -24,11 +24,10 @@ protected:
*
* @param children the search objects we are andnot'ing
**/
- AndNotSearch(const Children & children) : MultiSearch(children) { }
+ AndNotSearch(MultiSearch::Children children) : MultiSearch(std::move(children)) { }
public:
- // Caller takes ownership of the returned SearchIterator.
- static SearchIterator *create(const Children &children, bool strict);
+ static std::unique_ptr<SearchIterator> create(ChildrenIterators children, bool strict);
std::unique_ptr<BitVector> get_hits(uint32_t begin_id) override;
void or_hits_into(BitVector &result, uint32_t begin_id) override;
@@ -43,7 +42,7 @@ private:
class AndNotSearchStrictBase : public AndNotSearch
{
protected:
- AndNotSearchStrictBase(const Children & children) : AndNotSearch(children) { }
+ AndNotSearchStrictBase(Children children) : AndNotSearch(std::move(children)) { }
private:
Trinary is_strict() const override { return Trinary::True; }
UP andWith(UP filter, uint32_t estimate) override;
@@ -61,7 +60,7 @@ private:
//typedef FilterAttributeIteratorT<SingleValueSmallNumericAttribute::SingleSearchContext> BlackListIterator;
typedef AttributeIteratorT<SingleValueSmallNumericAttribute::SingleSearchContext> BlackListIterator;
public:
- OptimizedAndNotForBlackListing(const MultiSearch::Children & children);
+ OptimizedAndNotForBlackListing(MultiSearch::Children children);
static bool isBlackListIterator(const SearchIterator * iterator);
uint32_t seekFast(uint32_t docid) {
@@ -69,8 +68,8 @@ public:
}
void initRange(uint32_t beginid, uint32_t endid) override;
private:
- SearchIterator * positive() { return getChildren()[0]; }
- BlackListIterator * blackList() { return static_cast<BlackListIterator *>(getChildren()[1]); }
+ SearchIterator * positive() { return getChildren()[0].get(); }
+ BlackListIterator * blackList() { return static_cast<BlackListIterator *>(getChildren()[1].get()); }
template<bool doSeekOnly>
uint32_t internalSeek(uint32_t docid) {
uint32_t curr(docid);
diff --git a/searchlib/src/vespa/searchlib/queryeval/andsearch.cpp b/searchlib/src/vespa/searchlib/queryeval/andsearch.cpp
index 3cbb30e5f89..229cd27afed 100644
--- a/searchlib/src/vespa/searchlib/queryeval/andsearch.cpp
+++ b/searchlib/src/vespa/searchlib/queryeval/andsearch.cpp
@@ -48,8 +48,8 @@ AndSearch::doUnpack(uint32_t docid)
}
}
-AndSearch::AndSearch(const Children & children) :
- MultiSearch(children),
+AndSearch::AndSearch(Children children) :
+ MultiSearch(std::move(children)),
_estimate(std::numeric_limits<uint32_t>::max())
{
}
@@ -99,31 +99,37 @@ private:
}
-AndSearch *
-AndSearch::create(const MultiSearch::Children &children, bool strict)
+std::unique_ptr<AndSearch>
+AndSearch::create(ChildrenIterators children, bool strict)
{
UnpackInfo unpackInfo;
unpackInfo.forceAll();
- return create(children, strict, unpackInfo);
+ return create(std::move(children), strict, unpackInfo);
}
-AndSearch *
-AndSearch::create(const MultiSearch::Children &children, bool strict, const UnpackInfo & unpackInfo) {
+std::unique_ptr<AndSearch>
+AndSearch::create(ChildrenIterators children, bool strict, const UnpackInfo & unpackInfo) {
if (strict) {
if (unpackInfo.unpackAll()) {
- return new AndSearchStrict<FullUnpack>(children, FullUnpack());
+ using MyAnd = AndSearchStrict<FullUnpack>;
+ return std::make_unique<MyAnd>(std::move(children), FullUnpack());
} else if(unpackInfo.empty()) {
- return new AndSearchStrict<NoUnpack>(children, NoUnpack());
+ using MyAnd = AndSearchStrict<NoUnpack>;
+ return std::make_unique<MyAnd>(std::move(children), NoUnpack());
} else {
- return new AndSearchStrict<SelectiveUnpack>(children, SelectiveUnpack(unpackInfo));
+ using MyAnd = AndSearchStrict<SelectiveUnpack>;
+ return std::make_unique<MyAnd>(std::move(children), SelectiveUnpack(unpackInfo));
}
} else {
if (unpackInfo.unpackAll()) {
- return new AndSearchNoStrict<FullUnpack>(children, FullUnpack());
+ using MyAnd = AndSearchNoStrict<FullUnpack>;
+ return std::make_unique<MyAnd>(std::move(children), FullUnpack());
} else if (unpackInfo.empty()) {
- return new AndSearchNoStrict<NoUnpack>(children, NoUnpack());
+ using MyAnd = AndSearchNoStrict<NoUnpack>;
+ return std::make_unique<MyAnd>(std::move(children), NoUnpack());
} else {
- return new AndSearchNoStrict<SelectiveUnpack>(children, SelectiveUnpack(unpackInfo));
+ using MyAnd = AndSearchNoStrict<SelectiveUnpack>;
+ return std::make_unique<MyAnd>(std::move(children), SelectiveUnpack(unpackInfo));
}
}
}
diff --git a/searchlib/src/vespa/searchlib/queryeval/andsearch.h b/searchlib/src/vespa/searchlib/queryeval/andsearch.h
index 59c5769a1a2..b081951e826 100644
--- a/searchlib/src/vespa/searchlib/queryeval/andsearch.h
+++ b/searchlib/src/vespa/searchlib/queryeval/andsearch.h
@@ -13,9 +13,8 @@ namespace search::queryeval {
class AndSearch : public MultiSearch
{
public:
- // Caller takes ownership of the returned SearchIterator.
- static AndSearch *create(const Children &children, bool strict, const UnpackInfo & unpackInfo);
- static AndSearch *create(const Children &children, bool strict);
+ static std::unique_ptr<AndSearch> create(ChildrenIterators children, bool strict, const UnpackInfo & unpackInfo);
+ static std::unique_ptr<AndSearch> create(ChildrenIterators children, bool strict);
std::unique_ptr<BitVector> get_hits(uint32_t begin_id) override;
void or_hits_into(BitVector &result, uint32_t begin_id) override;
@@ -24,7 +23,7 @@ public:
AndSearch & estimate(uint32_t est) { _estimate = est; return *this; }
uint32_t estimate() const { return _estimate; }
protected:
- AndSearch(const Children & children);
+ AndSearch(Children children);
void doUnpack(uint32_t docid) override;
UP andWith(UP filter, uint32_t estimate) override;
UP offerFilterToChildren(UP filter, uint32_t estimate);
diff --git a/searchlib/src/vespa/searchlib/queryeval/andsearchnostrict.h b/searchlib/src/vespa/searchlib/queryeval/andsearchnostrict.h
index 1b1a5e77445..fac502f4c98 100644
--- a/searchlib/src/vespa/searchlib/queryeval/andsearchnostrict.h
+++ b/searchlib/src/vespa/searchlib/queryeval/andsearchnostrict.h
@@ -22,8 +22,8 @@ public:
* @param children the search objects we are and'ing
* ownership of the children is taken by the MultiSearch base class.
**/
- AndSearchNoStrict(const Children & children, const Unpack & unpacker) :
- AndSearch(children),
+ AndSearchNoStrict(Children children, const Unpack & unpacker) :
+ AndSearch(std::move(children)),
_unpacker(unpacker)
{ }
diff --git a/searchlib/src/vespa/searchlib/queryeval/andsearchstrict.h b/searchlib/src/vespa/searchlib/queryeval/andsearchstrict.h
index 87be4248a0a..7ec179404b6 100644
--- a/searchlib/src/vespa/searchlib/queryeval/andsearchstrict.h
+++ b/searchlib/src/vespa/searchlib/queryeval/andsearchstrict.h
@@ -23,8 +23,8 @@ protected:
Trinary is_strict() const override { return Trinary::True; }
SearchIterator::UP andWith(SearchIterator::UP filter, uint32_t estimate) override;
public:
- AndSearchStrict(const MultiSearch::Children & children, const Unpack & unpacker) :
- AndSearchNoStrict<Unpack>(children, unpacker)
+ AndSearchStrict(MultiSearch::Children children, const Unpack & unpacker)
+ : AndSearchNoStrict<Unpack>(std::move(children), unpacker)
{
}
diff --git a/searchlib/src/vespa/searchlib/queryeval/blueprint.cpp b/searchlib/src/vespa/searchlib/queryeval/blueprint.cpp
index 8881bc7da05..1a7a0c5eba2 100644
--- a/searchlib/src/vespa/searchlib/queryeval/blueprint.cpp
+++ b/searchlib/src/vespa/searchlib/queryeval/blueprint.cpp
@@ -400,10 +400,9 @@ IntermediateBlueprint::createSearch(fef::MatchData &md, bool strict) const
subSearches.reserve(_children.size());
for (size_t i = 0; i < _children.size(); ++i) {
bool strictChild = (strict && inheritStrict(i));
- SearchIterator::UP search = _children[i]->createSearch(md, strictChild);
- subSearches.push_back(search.release());
+ subSearches.push_back(_children[i]->createSearch(md, strictChild));
}
- return createIntermediateSearch(subSearches, strict, md);
+ return createIntermediateSearch(std::move(subSearches), strict, md);
}
IntermediateBlueprint::IntermediateBlueprint() = default;
diff --git a/searchlib/src/vespa/searchlib/queryeval/blueprint.h b/searchlib/src/vespa/searchlib/queryeval/blueprint.h
index 10a68e45d27..ef15736073e 100644
--- a/searchlib/src/vespa/searchlib/queryeval/blueprint.h
+++ b/searchlib/src/vespa/searchlib/queryeval/blueprint.h
@@ -6,6 +6,7 @@
#include "unpackinfo.h"
#include "executeinfo.h"
#include "global_filter.h"
+#include "multisearch.h"
#include <vespa/searchlib/common/bitvector.h>
namespace vespalib { class ObjectVisitor; }
@@ -297,7 +298,7 @@ public:
virtual void sort(std::vector<Blueprint*> &children) const = 0;
virtual bool inheritStrict(size_t i) const = 0;
virtual SearchIteratorUP
- createIntermediateSearch(const std::vector<SearchIterator *> &subSearches,
+ createIntermediateSearch(MultiSearch::Children subSearches,
bool strict, fef::MatchData &md) const = 0;
void visitMembers(vespalib::ObjectVisitor &visitor) const override;
diff --git a/searchlib/src/vespa/searchlib/queryeval/children_iterators.cpp b/searchlib/src/vespa/searchlib/queryeval/children_iterators.cpp
new file mode 100644
index 00000000000..3abbd6a1b81
--- /dev/null
+++ b/searchlib/src/vespa/searchlib/queryeval/children_iterators.cpp
@@ -0,0 +1,3 @@
+// Copyright Verizon Media. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root.
+
+#include "children_iterators.h"
diff --git a/searchlib/src/vespa/searchlib/queryeval/children_iterators.h b/searchlib/src/vespa/searchlib/queryeval/children_iterators.h
new file mode 100644
index 00000000000..aa147e0299b
--- /dev/null
+++ b/searchlib/src/vespa/searchlib/queryeval/children_iterators.h
@@ -0,0 +1,39 @@
+// Copyright Verizon Media. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root.
+
+#pragma once
+
+#include "searchiterator.h"
+
+namespace search::queryeval {
+
+/**
+ * Convenience for constructing MultiSearch::Children
+ * holding them or passing ownership around.
+ **/
+class ChildrenIterators {
+ private:
+ std::vector<SearchIterator::UP> _data;
+ public:
+ ChildrenIterators(std::vector<SearchIterator::UP> data)
+ : _data(std::move(data)) {}
+ ChildrenIterators(ChildrenIterators && other) = default;
+
+ // convenience constructors for unit tests:
+ template <typename... Args>
+ ChildrenIterators(SearchIterator::UP a, Args&&... args) {
+ _data.reserve(1 + sizeof...(Args));
+ _data.push_back(std::move(a));
+ (_data.emplace_back(std::forward<Args>(args)), ...);
+ }
+ template <typename... Args>
+ ChildrenIterators(SearchIterator *a, Args&&... args) {
+ _data.reserve(1 + sizeof...(Args));
+ _data.emplace_back(a);
+ (_data.emplace_back(std::forward<Args>(args)), ...);
+ }
+ operator std::vector<SearchIterator::UP> () && {
+ return std::move(_data);
+ }
+};
+
+} // namespace
diff --git a/searchlib/src/vespa/searchlib/queryeval/equiv_blueprint.cpp b/searchlib/src/vespa/searchlib/queryeval/equiv_blueprint.cpp
index 8a798e6cce3..6d044ca337d 100644
--- a/searchlib/src/vespa/searchlib/queryeval/equiv_blueprint.cpp
+++ b/searchlib/src/vespa/searchlib/queryeval/equiv_blueprint.cpp
@@ -57,7 +57,8 @@ SearchIterator::UP
EquivBlueprint::createLeafSearch(const fef::TermFieldMatchDataArray &outputs, bool strict) const
{
fef::MatchData::UP md = _layout.createMatchData();
- MultiSearch::Children children(_terms.size());
+ MultiSearch::Children children;
+ children.reserve(_terms.size());
fef::TermMatchDataMerger::Inputs childMatch;
vespalib::hash_map<uint16_t, UnpackNeed> unpack_needs(outputs.size());
for (size_t i = 0; i < outputs.size(); ++i) {
@@ -70,20 +71,21 @@ EquivBlueprint::createLeafSearch(const fef::TermFieldMatchDataArray &outputs, bo
unpack_needs[child_term_field_match_data->getFieldId()].notify(*child_term_field_match_data);
childMatch.emplace_back(child_term_field_match_data, _exactness[i]);
}
- children[i] = _terms[i]->createSearch(*md, strict).release();
+ children.push_back(_terms[i]->createSearch(*md, strict));
}
- return SearchIterator::UP(EquivSearch::create(children, std::move(md), childMatch, outputs, strict));
+ return EquivSearch::create(std::move(children), std::move(md), childMatch, outputs, strict);
}
SearchIterator::UP
EquivBlueprint::createFilterSearch(bool strict, FilterConstraint constraint) const
{
- MultiSearch::Children children(_terms.size());
+ MultiSearch::Children children;
+ children.reserve(_terms.size());
for (size_t i = 0; i < _terms.size(); ++i) {
- children[i] = _terms[i]->createFilterSearch(strict, constraint).release();
+ children.push_back(_terms[i]->createFilterSearch(strict, constraint));
}
UnpackInfo unpack_info;
- return SearchIterator::UP(OrSearch::create(children, strict, unpack_info));
+ return OrSearch::create(std::move(children), strict, unpack_info);
}
void
diff --git a/searchlib/src/vespa/searchlib/queryeval/equivsearch.cpp b/searchlib/src/vespa/searchlib/queryeval/equivsearch.cpp
index 593701fd14f..95af4da01b0 100644
--- a/searchlib/src/vespa/searchlib/queryeval/equivsearch.cpp
+++ b/searchlib/src/vespa/searchlib/queryeval/equivsearch.cpp
@@ -21,19 +21,19 @@ public:
*
* @param children the search objects that should be equivalent
**/
- EquivImpl(const MultiSearch::Children &children,
+ EquivImpl(MultiSearch::Children children,
fef::MatchData::UP inputMatchData,
const fef::TermMatchDataMerger::Inputs &inputs,
const fef::TermFieldMatchDataArray &outputs);
};
template<bool strict>
-EquivImpl<strict>::EquivImpl(const MultiSearch::Children &children,
+EquivImpl<strict>::EquivImpl(MultiSearch::Children children,
fef::MatchData::UP inputMatchData,
const fef::TermMatchDataMerger::Inputs &inputs,
const fef::TermFieldMatchDataArray &outputs)
- : OrLikeSearch<strict, NoUnpack>(children, NoUnpack()),
+ : OrLikeSearch<strict, NoUnpack>(std::move(children), NoUnpack()),
_inputMatchData(std::move(inputMatchData)),
_merger(inputs, outputs),
_valid(outputs.valid())
@@ -50,17 +50,17 @@ EquivImpl<strict>::doUnpack(uint32_t docid)
}
}
-SearchIterator *
-EquivSearch::create(const Children &children,
+SearchIterator::UP
+EquivSearch::create(Children children,
fef::MatchData::UP inputMatchData,
const fef::TermMatchDataMerger::Inputs &inputs,
const fef::TermFieldMatchDataArray &outputs,
bool strict)
{
if (strict) {
- return new EquivImpl<true>(children, std::move(inputMatchData), inputs, outputs);
+ return std::make_unique<EquivImpl<true>>(std::move(children), std::move(inputMatchData), inputs, outputs);
} else {
- return new EquivImpl<false>(children, std::move(inputMatchData), inputs, outputs);
+ return std::make_unique<EquivImpl<false>>(std::move(children), std::move(inputMatchData), inputs, outputs);
}
}
diff --git a/searchlib/src/vespa/searchlib/queryeval/equivsearch.h b/searchlib/src/vespa/searchlib/queryeval/equivsearch.h
index 252e17e610a..7dc7f90ee23 100644
--- a/searchlib/src/vespa/searchlib/queryeval/equivsearch.h
+++ b/searchlib/src/vespa/searchlib/queryeval/equivsearch.h
@@ -18,12 +18,12 @@ class EquivSearch : public SearchIterator
public:
typedef MultiSearch::Children Children;
- // Caller takes ownership of the returned SearchIterator.
- static SearchIterator *create(const Children &children,
- fef::MatchData::UP inputMD,
- const fef::TermMatchDataMerger::Inputs &inputs,
- const fef::TermFieldMatchDataArray &outputs,
- bool strict);
+ static SearchIterator::UP
+ create(Children children,
+ fef::MatchData::UP inputMD,
+ const fef::TermMatchDataMerger::Inputs &inputs,
+ const fef::TermFieldMatchDataArray &outputs,
+ bool strict);
};
}
diff --git a/searchlib/src/vespa/searchlib/queryeval/intermediate_blueprints.cpp b/searchlib/src/vespa/searchlib/queryeval/intermediate_blueprints.cpp
index 14e53d6d868..fd6a399e92f 100644
--- a/searchlib/src/vespa/searchlib/queryeval/intermediate_blueprints.cpp
+++ b/searchlib/src/vespa/searchlib/queryeval/intermediate_blueprints.cpp
@@ -91,12 +91,12 @@ SearchIterator::UP createAndFilter(const IntermediateBlueprint &self,
for (size_t i = 0; i < self.childCnt(); ++i) {
bool child_strict = strict && (i == 0);
auto search = self.getChild(i).createFilterSearch(child_strict, constraint);
- sub_searches.push_back(search.release());
+ sub_searches.push_back(std::move(search));
}
UnpackInfo unpack_info;
- AndSearch * search = AndSearch::create(sub_searches, strict, unpack_info);
+ auto search = AndSearch::create(std::move(sub_searches), strict, unpack_info);
search->estimate(self.getState().estimate().estHits);
- return SearchIterator::UP(search);
+ return search;
}
} // namespace search::queryeval::<unnamed>
@@ -166,23 +166,24 @@ AndNotBlueprint::inheritStrict(size_t i) const
}
SearchIterator::UP
-AndNotBlueprint::createIntermediateSearch(const MultiSearch::Children &sub_searches,
+AndNotBlueprint::createIntermediateSearch(MultiSearch::Children sub_searches,
bool strict, search::fef::MatchData &md) const
{
UnpackInfo unpack_info(calculateUnpackInfo(md));
if (should_do_termwise_eval(unpack_info, md.get_termwise_limit())) {
- TermwiseBlueprintHelper helper(*this, sub_searches, unpack_info);
+ TermwiseBlueprintHelper helper(*this, std::move(sub_searches), unpack_info);
bool termwise_strict = (strict && inheritStrict(helper.first_termwise));
auto termwise_search = (helper.first_termwise == 0)
- ? SearchIterator::UP(AndNotSearch::create(helper.termwise, termwise_strict))
- : SearchIterator::UP(OrSearch::create(helper.termwise, termwise_strict));
+ ? AndNotSearch::create(helper.get_termwise_children(), termwise_strict)
+ : OrSearch::create(helper.get_termwise_children(), termwise_strict);
helper.insert_termwise(std::move(termwise_search), termwise_strict);
- if (helper.children.size() == 1) {
- return SearchIterator::UP(helper.children.front());
+ auto rearranged = helper.get_result();
+ if (rearranged.size() == 1) {
+ return std::move(rearranged[0]);
}
- return SearchIterator::UP(AndNotSearch::create(helper.children, strict));
+ return AndNotSearch::create(std::move(rearranged), strict);
}
- return SearchIterator::UP(AndNotSearch::create(sub_searches, strict));
+ return AndNotSearch::create(std::move(sub_searches), strict);
}
namespace {
@@ -207,9 +208,9 @@ AndNotBlueprint::createFilterSearch(bool strict, FilterConstraint constraint) co
auto search = (i == 0)
? getChild(i).createFilterSearch(child_strict, constraint)
: getChild(i).createFilterSearch(child_strict, invert(constraint));
- sub_searches.push_back(search.release());
+ sub_searches.push_back(std::move(search));
}
- return SearchIterator::UP(AndNotSearch::create(sub_searches, strict));
+ return AndNotSearch::create(std::move(sub_searches), strict);
}
//-----------------------------------------------------------------------------
@@ -265,26 +266,27 @@ AndBlueprint::inheritStrict(size_t i) const
}
SearchIterator::UP
-AndBlueprint::createIntermediateSearch(const MultiSearch::Children &sub_searches,
+AndBlueprint::createIntermediateSearch(MultiSearch::Children sub_searches,
bool strict, search::fef::MatchData & md) const
{
UnpackInfo unpack_info(calculateUnpackInfo(md));
- AndSearch * search = 0;
+ std::unique_ptr<AndSearch> search;
if (should_do_termwise_eval(unpack_info, md.get_termwise_limit())) {
- TermwiseBlueprintHelper helper(*this, sub_searches, unpack_info);
+ TermwiseBlueprintHelper helper(*this, std::move(sub_searches), unpack_info);
bool termwise_strict = (strict && inheritStrict(helper.first_termwise));
- auto termwise_search = SearchIterator::UP(AndSearch::create(helper.termwise, termwise_strict));
+ auto termwise_search = AndSearch::create(helper.get_termwise_children(), termwise_strict);
helper.insert_termwise(std::move(termwise_search), termwise_strict);
- if (helper.children.size() == 1) {
- return SearchIterator::UP(helper.children.front());
+ auto rearranged = helper.get_result();
+ if (rearranged.size() == 1) {
+ return std::move(rearranged[0]);
} else {
- search = AndSearch::create(helper.children, strict, helper.termwise_unpack);
+ search = AndSearch::create(std::move(rearranged), strict, helper.termwise_unpack);
}
} else {
- search = AndSearch::create(sub_searches, strict, unpack_info);
+ search = AndSearch::create(std::move(sub_searches), strict, unpack_info);
}
search->estimate(getState().estimate().estHits);
- return SearchIterator::UP(search);
+ return search;
}
SearchIterator::UP
@@ -353,21 +355,22 @@ OrBlueprint::inheritStrict(size_t) const
}
SearchIterator::UP
-OrBlueprint::createIntermediateSearch(const MultiSearch::Children &sub_searches,
+OrBlueprint::createIntermediateSearch(MultiSearch::Children sub_searches,
bool strict, search::fef::MatchData & md) const
{
UnpackInfo unpack_info(calculateUnpackInfo(md));
if (should_do_termwise_eval(unpack_info, md.get_termwise_limit())) {
- TermwiseBlueprintHelper helper(*this, sub_searches, unpack_info);
+ TermwiseBlueprintHelper helper(*this, std::move(sub_searches), unpack_info);
bool termwise_strict = (strict && inheritStrict(helper.first_termwise));
- auto termwise_search = SearchIterator::UP(OrSearch::create(helper.termwise, termwise_strict));
+ auto termwise_search = OrSearch::create(helper.get_termwise_children(), termwise_strict);
helper.insert_termwise(std::move(termwise_search), termwise_strict);
- if (helper.children.size() == 1) {
- return SearchIterator::UP(helper.children.front());
+ auto rearranged = helper.get_result();
+ if (rearranged.size() == 1) {
+ return std::move(rearranged[0]);
}
- return SearchIterator::UP(OrSearch::create(helper.children, strict, helper.termwise_unpack));
+ return OrSearch::create(std::move(rearranged), strict, helper.termwise_unpack);
}
- return SearchIterator::UP(OrSearch::create(sub_searches, strict, unpack_info));
+ return OrSearch::create(std::move(sub_searches), strict, unpack_info);
}
SearchIterator::UP
@@ -378,10 +381,10 @@ OrBlueprint::createFilterSearch(bool strict, FilterConstraint constraint) const
for (size_t i = 0; i < childCnt(); ++i) {
bool child_strict = strict && inheritStrict(i);
auto search = getChild(i).createFilterSearch(child_strict, constraint);
- sub_searches.push_back(search.release());
+ sub_searches.push_back(std::move(search));
}
UnpackInfo unpack_info;
- return SearchIterator::UP(OrSearch::create(sub_searches, strict, unpack_info));
+ return OrSearch::create(std::move(sub_searches), strict, unpack_info);
}
//-----------------------------------------------------------------------------
@@ -423,18 +426,18 @@ WeakAndBlueprint::always_needs_unpack() const
}
SearchIterator::UP
-WeakAndBlueprint::createIntermediateSearch(const MultiSearch::Children &sub_searches,
+WeakAndBlueprint::createIntermediateSearch(MultiSearch::Children sub_searches,
bool strict, search::fef::MatchData &) const
{
WeakAndSearch::Terms terms;
assert(sub_searches.size() == childCnt());
assert(_weights.size() == childCnt());
for (size_t i = 0; i < sub_searches.size(); ++i) {
- terms.push_back(wand::Term(sub_searches[i],
+ terms.push_back(wand::Term(sub_searches[i].release(),
_weights[i],
getChild(i).getState().estimate().estHits));
}
- return SearchIterator::UP(WeakAndSearch::create(terms, _n, strict));
+ return WeakAndSearch::create(terms, _n, strict);
}
//-----------------------------------------------------------------------------
@@ -471,7 +474,7 @@ NearBlueprint::createSearch(fef::MatchData &md, bool strict) const
}
SearchIterator::UP
-NearBlueprint::createIntermediateSearch(const MultiSearch::Children &sub_searches,
+NearBlueprint::createIntermediateSearch(MultiSearch::Children sub_searches,
bool strict, search::fef::MatchData &md) const
{
search::fef::TermFieldMatchDataArray tfmda;
@@ -481,7 +484,7 @@ NearBlueprint::createIntermediateSearch(const MultiSearch::Children &sub_searche
tfmda.add(cs.field(j).resolve(md));
}
}
- return SearchIterator::UP(new NearSearch(sub_searches, tfmda, _window, strict));
+ return SearchIterator::UP(new NearSearch(std::move(sub_searches), tfmda, _window, strict));
}
SearchIterator::UP
@@ -529,7 +532,7 @@ ONearBlueprint::createSearch(fef::MatchData &md, bool strict) const
}
SearchIterator::UP
-ONearBlueprint::createIntermediateSearch(const MultiSearch::Children &sub_searches,
+ONearBlueprint::createIntermediateSearch(MultiSearch::Children sub_searches,
bool strict, search::fef::MatchData &md) const
{
search::fef::TermFieldMatchDataArray tfmda;
@@ -541,7 +544,7 @@ ONearBlueprint::createIntermediateSearch(const MultiSearch::Children &sub_search
}
// could sort sub_searches here
// but then strictness inheritance would also need to be fixed
- return SearchIterator::UP(new ONearSearch(sub_searches, tfmda, _window, strict));
+ return SearchIterator::UP(new ONearSearch(std::move(sub_searches), tfmda, _window, strict));
}
SearchIterator::UP
@@ -604,27 +607,27 @@ RankBlueprint::inheritStrict(size_t i) const
}
SearchIterator::UP
-RankBlueprint::createIntermediateSearch(const MultiSearch::Children &sub_searches,
+RankBlueprint::createIntermediateSearch(MultiSearch::Children sub_searches,
bool strict, search::fef::MatchData & md) const
{
UnpackInfo unpack_info(calculateUnpackInfo(md));
if (unpack_info.unpackAll()) {
- return SearchIterator::UP(RankSearch::create(sub_searches, strict));
+ return RankSearch::create(std::move(sub_searches), strict);
} else {
MultiSearch::Children require_unpack;
require_unpack.reserve(sub_searches.size());
- require_unpack.push_back(sub_searches[0]);
+ require_unpack.push_back(std::move(sub_searches[0]));
for (size_t i(1); i < sub_searches.size(); i++) {
if (unpack_info.needUnpack(i)) {
- require_unpack.push_back(sub_searches[i]);
+ require_unpack.push_back(std::move(sub_searches[i]));
} else {
- delete sub_searches[i];
+ sub_searches[i].reset();
}
}
if (require_unpack.size() == 1) {
- return SearchIterator::UP(require_unpack[0]);
+ return SearchIterator::UP(std::move(require_unpack[0]));
} else {
- return SearchIterator::UP(RankSearch::create(require_unpack, strict));
+ return RankSearch::create(std::move(require_unpack), strict);
}
}
}
@@ -688,18 +691,18 @@ SourceBlenderBlueprint::findSource(uint32_t sourceId) const
}
SearchIterator::UP
-SourceBlenderBlueprint::createIntermediateSearch(const MultiSearch::Children &sub_searches,
+SourceBlenderBlueprint::createIntermediateSearch(MultiSearch::Children sub_searches,
bool strict, search::fef::MatchData &) const
{
SourceBlenderSearch::Children children;
assert(sub_searches.size() == childCnt());
for (size_t i = 0; i < sub_searches.size(); ++i) {
- children.push_back(SourceBlenderSearch::Child(sub_searches[i],
+ children.push_back(SourceBlenderSearch::Child(sub_searches[i].release(),
getChild(i).getSourceId()));
assert(children.back().sourceId != 0xffffffff);
}
- return SearchIterator::UP(SourceBlenderSearch::create(_selector.createIterator(),
- children, strict));
+ return SourceBlenderSearch::create(_selector.createIterator(),
+ children, strict);
}
SearchIterator::UP
@@ -711,10 +714,10 @@ SourceBlenderBlueprint::createFilterSearch(bool strict, FilterConstraint constra
for (size_t i = 0; i < childCnt(); ++i) {
bool child_strict = strict && inheritStrict(i);
auto search = getChild(i).createFilterSearch(child_strict, constraint);
- sub_searches.push_back(search.release());
+ sub_searches.push_back(std::move(search));
}
UnpackInfo unpack_info;
- return SearchIterator::UP(OrSearch::create(sub_searches, strict, unpack_info));
+ return OrSearch::create(std::move(sub_searches), strict, unpack_info);
} else {
return std::make_unique<EmptySearch>();
}
diff --git a/searchlib/src/vespa/searchlib/queryeval/intermediate_blueprints.h b/searchlib/src/vespa/searchlib/queryeval/intermediate_blueprints.h
index 65dced2ea6b..6bbe4562641 100644
--- a/searchlib/src/vespa/searchlib/queryeval/intermediate_blueprints.h
+++ b/searchlib/src/vespa/searchlib/queryeval/intermediate_blueprints.h
@@ -22,7 +22,7 @@ public:
void sort(std::vector<Blueprint*> &children) const override;
bool inheritStrict(size_t i) const override;
SearchIterator::UP
- createIntermediateSearch(const MultiSearch::Children &subSearches,
+ createIntermediateSearch(MultiSearch::Children subSearches,
bool strict, fef::MatchData &md) const override;
SearchIterator::UP
createFilterSearch(bool strict, FilterConstraint constraint) const override;
@@ -49,7 +49,7 @@ public:
void sort(std::vector<Blueprint*> &children) const override;
bool inheritStrict(size_t i) const override;
SearchIterator::UP
- createIntermediateSearch(const MultiSearch::Children &subSearches,
+ createIntermediateSearch(MultiSearch::Children subSearches,
bool strict, fef::MatchData &md) const override;
SearchIterator::UP
createFilterSearch(bool strict, FilterConstraint constraint) const override;
@@ -69,7 +69,7 @@ public:
void sort(std::vector<Blueprint*> &children) const override;
bool inheritStrict(size_t i) const override;
SearchIterator::UP
- createIntermediateSearch(const MultiSearch::Children &subSearches,
+ createIntermediateSearch(MultiSearch::Children subSearches,
bool strict, fef::MatchData &md) const override;
SearchIterator::UP
createFilterSearch(bool strict, FilterConstraint constraint) const override;
@@ -90,7 +90,7 @@ public:
bool inheritStrict(size_t i) const override;
bool always_needs_unpack() const override;
SearchIterator::UP
- createIntermediateSearch(const MultiSearch::Children &subSearches,
+ createIntermediateSearch(MultiSearch::Children subSearches,
bool strict, fef::MatchData &md) const override;
WeakAndBlueprint(uint32_t n) : _n(n) {}
@@ -118,7 +118,7 @@ public:
bool inheritStrict(size_t i) const override;
SearchIteratorUP createSearch(fef::MatchData &md, bool strict) const override;
SearchIterator::UP
- createIntermediateSearch(const MultiSearch::Children &subSearches,
+ createIntermediateSearch(MultiSearch::Children subSearches,
bool strict, fef::MatchData &md) const override;
SearchIterator::UP createFilterSearch(bool strict, FilterConstraint constraint) const override;
@@ -140,7 +140,7 @@ public:
bool inheritStrict(size_t i) const override;
SearchIteratorUP createSearch(fef::MatchData &md, bool strict) const override;
SearchIterator::UP
- createIntermediateSearch(const MultiSearch::Children &subSearches,
+ createIntermediateSearch(MultiSearch::Children subSearches,
bool strict, fef::MatchData &md) const override;
SearchIterator::UP createFilterSearch(bool strict, FilterConstraint constraint) const override;
@@ -159,7 +159,7 @@ public:
void sort(std::vector<Blueprint*> &children) const override;
bool inheritStrict(size_t i) const override;
SearchIterator::UP
- createIntermediateSearch(const MultiSearch::Children &subSearches,
+ createIntermediateSearch(MultiSearch::Children subSearches,
bool strict, fef::MatchData &md) const override;
SearchIterator::UP
createFilterSearch(bool strict, FilterConstraint constraint) const override;
@@ -185,7 +185,7 @@ public:
*/
ssize_t findSource(uint32_t sourceId) const;
SearchIterator::UP
- createIntermediateSearch(const MultiSearch::Children &subSearches,
+ createIntermediateSearch(MultiSearch::Children subSearches,
bool strict, fef::MatchData &md) const override;
SearchIterator::UP
createFilterSearch(bool strict, FilterConstraint constraint) const override;
diff --git a/searchlib/src/vespa/searchlib/queryeval/multibitvectoriterator.cpp b/searchlib/src/vespa/searchlib/queryeval/multibitvectoriterator.cpp
index e9e34b4f5ce..105d57b22b1 100644
--- a/searchlib/src/vespa/searchlib/queryeval/multibitvectoriterator.cpp
+++ b/searchlib/src/vespa/searchlib/queryeval/multibitvectoriterator.cpp
@@ -21,7 +21,7 @@ template<typename Update>
class MultiBitVectorIterator : public MultiBitVectorIteratorBase
{
public:
- MultiBitVectorIterator(const Children & children) : MultiBitVectorIteratorBase(children) { }
+ MultiBitVectorIterator(Children children) : MultiBitVectorIteratorBase(std::move(children)) { }
protected:
void updateLastValue(uint32_t docId);
void strictSeek(uint32_t docId);
@@ -36,7 +36,7 @@ template<typename Update>
class MultiBitVectorIteratorStrict : public MultiBitVectorIterator<Update>
{
public:
- MultiBitVectorIteratorStrict(const MultiSearch::Children & children) : MultiBitVectorIterator<Update>(children) { }
+ MultiBitVectorIteratorStrict(MultiSearch::Children children) : MultiBitVectorIterator<Update>(std::move(children)) { }
private:
void doSeek(uint32_t docId) override { this->strictSeek(docId); }
Trinary is_strict() const override { return Trinary::True; }
@@ -112,7 +112,7 @@ typedef MultiBitVectorIteratorStrict<Or> OrBVIteratorStrict;
bool hasAtLeast2Bitvectors(const MultiSearch::Children & children)
{
size_t count(0);
- for (const SearchIterator * search : children) {
+ for (const auto & search : children) {
if (search->isBitVector()) {
count++;
}
@@ -133,16 +133,16 @@ bool canOptimize(const MultiSearch & s) {
}
-MultiBitVectorIteratorBase::MultiBitVectorIteratorBase(const Children & children) :
- MultiSearch(children),
+MultiBitVectorIteratorBase::MultiBitVectorIteratorBase(Children children) :
+ MultiSearch(std::move(children)),
_numDocs(std::numeric_limits<unsigned int>::max()),
_lastValue(0),
_lastMaxDocIdLimit(0),
_bvs()
{
- _bvs.reserve(children.size());
- for (size_t i(0); i < children.size(); i++) {
- const auto * bv = static_cast<const BitVectorIterator *>(children[i]);
+ _bvs.reserve(getChildren().size());
+ for (size_t i(0); i < getChildren().size(); i++) {
+ const auto * bv = static_cast<const BitVectorIterator *>(getChildren()[i].get());
_bvs.emplace_back(reinterpret_cast<const Word *>(bv->getBitValues()), bv->isInverted());
_numDocs = std::min(_numDocs, bv->getDocIdLimit());
}
@@ -178,8 +178,8 @@ MultiBitVectorIteratorBase::doUnpack(uint32_t docid)
} else {
auto &children = getChildren();
_unpackInfo.each([&children,docid](size_t i) {
- static_cast<BitVectorIterator *>(children[i])->unpack(docid);
- }, children.size());
+ static_cast<BitVectorIterator *>(children[i].get())->unpack(docid);
+ }, children.size());
}
}
@@ -218,7 +218,7 @@ MultiBitVectorIteratorBase::optimizeMultiSearch(SearchIterator::UP parentIt)
if ( ! strict && (bit->is_strict() == Trinary::True)) {
strict = true;
}
- stolen.push_back(bit.release());
+ stolen.push_back(std::move(bit));
} else {
it++;
}
@@ -226,21 +226,21 @@ MultiBitVectorIteratorBase::optimizeMultiSearch(SearchIterator::UP parentIt)
SearchIterator::UP next;
if (parent.isAnd()) {
if (strict) {
- next = std::make_unique<AndBVIteratorStrict>(stolen);
+ next = std::make_unique<AndBVIteratorStrict>(std::move(stolen));
} else {
- next = std::make_unique<AndBVIterator>(stolen);
+ next = std::make_unique<AndBVIterator>(std::move(stolen));
}
} else if (parent.isOr()) {
if (strict) {
- next = std::make_unique<OrBVIteratorStrict>(stolen);
+ next = std::make_unique<OrBVIteratorStrict>(std::move(stolen));
} else {
- next = std::make_unique<OrBVIterator>(stolen);
+ next = std::make_unique<OrBVIterator>(std::move(stolen));
}
} else if (parent.isAndNot()) {
if (strict) {
- next = std::make_unique<OrBVIteratorStrict>(stolen);
+ next = std::make_unique<OrBVIteratorStrict>(std::move(stolen));
} else {
- next = std::make_unique<OrBVIterator>(stolen);
+ next = std::make_unique<OrBVIterator>(std::move(stolen));
}
}
auto & nextM(static_cast<MultiBitVectorIteratorBase &>(*next));
@@ -254,8 +254,8 @@ MultiBitVectorIteratorBase::optimizeMultiSearch(SearchIterator::UP parentIt)
}
}
auto & toOptimize(const_cast<MultiSearch::Children &>(parent.getChildren()));
- for (SearchIterator * & search : toOptimize) {
- search = optimize(MultiSearch::UP(search)).release();
+ for (auto & search : toOptimize) {
+ search = optimize(std::move(search));
}
return parentIt;
diff --git a/searchlib/src/vespa/searchlib/queryeval/multibitvectoriterator.h b/searchlib/src/vespa/searchlib/queryeval/multibitvectoriterator.h
index cc40f834114..cde9ffcbfe5 100644
--- a/searchlib/src/vespa/searchlib/queryeval/multibitvectoriterator.h
+++ b/searchlib/src/vespa/searchlib/queryeval/multibitvectoriterator.h
@@ -20,7 +20,7 @@ public:
*/
static SearchIterator::UP optimize(SearchIterator::UP parent);
protected:
- MultiBitVectorIteratorBase(const Children & children);
+ MultiBitVectorIteratorBase(Children children);
class MetaWord {
public:
MetaWord(const Word * words, bool inverted) : _words(words), _inverted(inverted) { }
diff --git a/searchlib/src/vespa/searchlib/queryeval/multisearch.cpp b/searchlib/src/vespa/searchlib/queryeval/multisearch.cpp
index b63a54785a4..51098f50b37 100644
--- a/searchlib/src/vespa/searchlib/queryeval/multisearch.cpp
+++ b/searchlib/src/vespa/searchlib/queryeval/multisearch.cpp
@@ -10,7 +10,7 @@ void
MultiSearch::insert(size_t index, SearchIterator::UP search)
{
assert(index <= _children.size());
- _children.insert(_children.begin()+index, search.release());
+ _children.insert(_children.begin()+index, std::move(search));
onInsert(index);
}
@@ -18,7 +18,7 @@ SearchIterator::UP
MultiSearch::remove(size_t index)
{
assert(index < _children.size());
- SearchIterator::UP search(_children[index]);
+ SearchIterator::UP search = std::move(_children[index]);
_children.erase(_children.begin() + index);
onRemove(index);
return search;
@@ -27,7 +27,7 @@ MultiSearch::remove(size_t index)
void
MultiSearch::doUnpack(uint32_t docid)
{
- for (SearchIterator *child: _children) {
+ for (auto &child: _children) {
if (__builtin_expect(child->getDocId() < docid, false)) {
child->doSeek(docid);
}
@@ -37,23 +37,20 @@ MultiSearch::doUnpack(uint32_t docid)
}
}
-MultiSearch::MultiSearch(const Children & children)
- : _children(children)
+MultiSearch::MultiSearch(Children children)
+ : _children(std::move(children))
{
}
MultiSearch::~MultiSearch()
{
- for (SearchIterator * child : _children) {
- delete child;
- }
}
void
MultiSearch::initRange(uint32_t beginid, uint32_t endid)
{
SearchIterator::initRange(beginid, endid);
- for (SearchIterator * child : _children) {
+ for (auto & child : _children) {
child->initRange(beginid, endid);
}
}
diff --git a/searchlib/src/vespa/searchlib/queryeval/multisearch.h b/searchlib/src/vespa/searchlib/queryeval/multisearch.h
index af96734b26a..bd916f7953b 100644
--- a/searchlib/src/vespa/searchlib/queryeval/multisearch.h
+++ b/searchlib/src/vespa/searchlib/queryeval/multisearch.h
@@ -3,6 +3,7 @@
#pragma once
#include "searchiterator.h"
+#include "children_iterators.h"
struct MultiSearchRemoveTest;
@@ -12,25 +13,26 @@ class MultiBitVectorIteratorBase;
/**
* A virtual intermediate class that serves as the basis for combining searches
- * like and, or any or others that take a list of children.
+ * like AND, OR, RANK or others that take a list of children.
**/
class MultiSearch : public SearchIterator
{
friend struct ::MultiSearchRemoveTest;
friend class ::search::queryeval::MultiBitVectorIteratorBase;
+ friend class MySearch;
public:
/**
- * Defines how to represent the children iterators. vespalib::Array usage
- * generates faster and more compact code then using std::vector.
+ * Defines how to represent the children iterators.
*/
- typedef std::vector<SearchIterator *> Children;
+ using Children = std::vector<SearchIterator::UP>;
+
/**
* Create a new Multi Search with the given children.
*
* @param children the search objects we are and'ing
* this object takes ownership of the children.
**/
- MultiSearch(const Children & children);
+ MultiSearch(Children children);
virtual ~MultiSearch() override;
const Children & getChildren() const { return _children; }
virtual bool isAnd() const { return false; }
@@ -40,6 +42,7 @@ public:
virtual bool needUnpack(size_t index) const { (void) index; return true; }
void initRange(uint32_t beginId, uint32_t endId) override;
protected:
+ MultiSearch() {}
void doUnpack(uint32_t docid) override;
void visitMembers(vespalib::ObjectVisitor &visitor) const override;
private:
diff --git a/searchlib/src/vespa/searchlib/queryeval/nearsearch.cpp b/searchlib/src/vespa/searchlib/queryeval/nearsearch.cpp
index 4ecd84fb7c3..f7b83de5f4b 100644
--- a/searchlib/src/vespa/searchlib/queryeval/nearsearch.cpp
+++ b/searchlib/src/vespa/searchlib/queryeval/nearsearch.cpp
@@ -31,11 +31,11 @@ void setup_fields(uint32_t window, std::vector<T> &matchers, const TermFieldMatc
} // namespace search::queryeval::<unnamed>
-NearSearchBase::NearSearchBase(const Children & terms,
+NearSearchBase::NearSearchBase(Children terms,
const TermFieldMatchDataArray &data,
uint32_t window,
bool strict)
- : AndSearch(terms),
+ : AndSearch(std::move(terms)),
_data_size(data.size()),
_window(window),
_strict(strict)
@@ -107,8 +107,7 @@ NearSearchBase::doSeek(uint32_t docId)
const Children & terms(getChildren());
bool foundHit = true;
for (uint32_t i = 0, len = terms.size(); i < len; ++i) {
- SearchIterator *term = terms[i];
- if (!term->seek(docId)) {
+ if (! terms[i]->seek(docId)) {
LOG(debug, "Term %d does not occur in document %d.", i, docId);
foundHit = false;
break;
@@ -123,11 +122,11 @@ NearSearchBase::doSeek(uint32_t docId)
}
}
-NearSearch::NearSearch(const Children & terms,
+NearSearch::NearSearch(Children terms,
const TermFieldMatchDataArray &data,
uint32_t window,
bool strict)
- : NearSearchBase(terms, data, window, strict),
+ : NearSearchBase(std::move(terms), data, window, strict),
_matchers()
{
setup_fields(window, _matchers, data);
@@ -224,11 +223,11 @@ NearSearch::match(uint32_t docId)
return false;
}
-ONearSearch::ONearSearch(const Children & terms,
+ONearSearch::ONearSearch(Children terms,
const TermFieldMatchDataArray &data,
uint32_t window,
bool strict)
- : NearSearchBase(terms, data, window, strict),
+ : NearSearchBase(std::move(terms), data, window, strict),
_matchers()
{
setup_fields(window, _matchers, data);
diff --git a/searchlib/src/vespa/searchlib/queryeval/nearsearch.h b/searchlib/src/vespa/searchlib/queryeval/nearsearch.h
index 27c862735b1..13bd1c53383 100644
--- a/searchlib/src/vespa/searchlib/queryeval/nearsearch.h
+++ b/searchlib/src/vespa/searchlib/queryeval/nearsearch.h
@@ -72,7 +72,7 @@ public:
* @param window The size of the window in which all terms must occur.
* @param strict Whether or not to skip to next matching document if seek fails.
*/
- NearSearchBase(const Children & terms,
+ NearSearchBase(Children terms,
const TermFieldMatchDataArray &data,
uint32_t window,
bool strict);
@@ -106,7 +106,7 @@ public:
* @param window The size of the window in which all terms must occur.
* @param strict Whether or not to skip to next matching document if seek fails.
*/
- NearSearch(const Children & terms,
+ NearSearch(Children terms,
const TermFieldMatchDataArray &data,
uint32_t window,
bool strict = true);
@@ -138,7 +138,7 @@ public:
* @param window The size of the window in which all terms must occur.
* @param strict Whether or not to skip to next matching document if seek fails.
*/
- ONearSearch(const Children & terms,
+ ONearSearch(Children terms,
const TermFieldMatchDataArray &data,
uint32_t window,
bool strict = true);
diff --git a/searchlib/src/vespa/searchlib/queryeval/orlikesearch.h b/searchlib/src/vespa/searchlib/queryeval/orlikesearch.h
index 1dec50ffc97..57a2ff11997 100644
--- a/searchlib/src/vespa/searchlib/queryeval/orlikesearch.h
+++ b/searchlib/src/vespa/searchlib/queryeval/orlikesearch.h
@@ -46,8 +46,8 @@ public:
*
* @param children the search objects we are or'ing
**/
- OrLikeSearch(const Children &children, const Unpack & unpacker) :
- OrSearch(children),
+ OrLikeSearch(Children children, const Unpack & unpacker)
+ : OrSearch(std::move(children)),
_unpacker(unpacker)
{ }
private:
diff --git a/searchlib/src/vespa/searchlib/queryeval/orsearch.cpp b/searchlib/src/vespa/searchlib/queryeval/orsearch.cpp
index b5e0ff9c423..9d1dd252796 100644
--- a/searchlib/src/vespa/searchlib/queryeval/orsearch.cpp
+++ b/searchlib/src/vespa/searchlib/queryeval/orsearch.cpp
@@ -78,30 +78,36 @@ OrSearch::or_hits_into(BitVector &result, uint32_t begin_id)
TermwiseHelper::orChildren(result, getChildren().begin(), getChildren().end(), begin_id);
}
-SearchIterator *
-OrSearch::create(const MultiSearch::Children &children, bool strict) {
+SearchIterator::UP
+OrSearch::create(ChildrenIterators children, bool strict) {
UnpackInfo unpackInfo;
unpackInfo.forceAll();
- return create(children, strict, unpackInfo);
+ return create(std::move(children), strict, unpackInfo);
}
-SearchIterator *
-OrSearch::create(const MultiSearch::Children &children, bool strict, const UnpackInfo & unpackInfo) {
+SearchIterator::UP
+OrSearch::create(ChildrenIterators children, bool strict, const UnpackInfo & unpackInfo) {
if (strict) {
if (unpackInfo.unpackAll()) {
- return new OrLikeSearch<true, FullUnpack>(children, FullUnpack());
+ using MyOr = OrLikeSearch<true, FullUnpack>;
+ return std::make_unique<MyOr>(std::move(children), FullUnpack());
} else if(unpackInfo.empty()) {
- return new OrLikeSearch<true, NoUnpack>(children, NoUnpack());
+ using MyOr = OrLikeSearch<true, NoUnpack>;
+ return std::make_unique<MyOr>(std::move(children), NoUnpack());
} else {
- return new OrLikeSearch<true, SelectiveUnpack>(children, SelectiveUnpack(unpackInfo));
+ using MyOr = OrLikeSearch<true, SelectiveUnpack>;
+ return std::make_unique<MyOr>(std::move(children), SelectiveUnpack(unpackInfo));
}
} else {
if (unpackInfo.unpackAll()) {
- return new OrLikeSearch<false, FullUnpack>(children, FullUnpack());
+ using MyOr = OrLikeSearch<false, FullUnpack>;
+ return std::make_unique<MyOr>(std::move(children), FullUnpack());
} else if(unpackInfo.empty()) {
- return new OrLikeSearch<false, NoUnpack>(children, NoUnpack());
+ using MyOr = OrLikeSearch<false, NoUnpack>;
+ return std::make_unique<MyOr>(std::move(children), NoUnpack());
} else {
- return new OrLikeSearch<false, SelectiveUnpack>(children, SelectiveUnpack(unpackInfo));
+ using MyOr = OrLikeSearch<false, SelectiveUnpack>;
+ return std::make_unique<MyOr>(std::move(children), SelectiveUnpack(unpackInfo));
}
}
}
diff --git a/searchlib/src/vespa/searchlib/queryeval/orsearch.h b/searchlib/src/vespa/searchlib/queryeval/orsearch.h
index e3d74573db8..79da1b85b6f 100644
--- a/searchlib/src/vespa/searchlib/queryeval/orsearch.h
+++ b/searchlib/src/vespa/searchlib/queryeval/orsearch.h
@@ -15,16 +15,15 @@ class OrSearch : public MultiSearch
public:
typedef MultiSearch::Children Children;
- // Caller takes ownership of the returned SearchIterator.
- static SearchIterator *create(const Children &children, bool strict);
- static SearchIterator *create(const Children &children, bool strict, const UnpackInfo & unpackInfo);
+ static SearchIterator::UP create(ChildrenIterators children, bool strict);
+ static SearchIterator::UP create(ChildrenIterators children, bool strict, const UnpackInfo & unpackInfo);
std::unique_ptr<BitVector> get_hits(uint32_t begin_id) override;
void or_hits_into(BitVector &result, uint32_t begin_id) override;
void and_hits_into(BitVector &result, uint32_t begin_id) override;
protected:
- OrSearch(const Children & children) : MultiSearch(children) { }
+ OrSearch(Children children) : MultiSearch(std::move(children)) { }
private:
bool isOr() const override { return true; }
diff --git a/searchlib/src/vespa/searchlib/queryeval/ranksearch.cpp b/searchlib/src/vespa/searchlib/queryeval/ranksearch.cpp
index 2bcf2267b1d..a915442bf0c 100644
--- a/searchlib/src/vespa/searchlib/queryeval/ranksearch.cpp
+++ b/searchlib/src/vespa/searchlib/queryeval/ranksearch.cpp
@@ -32,7 +32,7 @@ public:
*
* @param children the search objects we are rank'ing
**/
- RankSearchStrict(const Children & children) : RankSearch(children) { }
+ RankSearchStrict(Children children) : RankSearch(std::move(children)) { }
};
SearchIterator::UP
@@ -49,12 +49,12 @@ RankSearchStrict::doSeek(uint32_t docid)
}
} // namespace
-SearchIterator *
-RankSearch::create(const RankSearch::Children &children, bool strict) {
+SearchIterator::UP
+RankSearch::create(ChildrenIterators children, bool strict) {
if (strict) {
- return new RankSearchStrict(children);
+ return UP(new RankSearchStrict(std::move(children)));
} else {
- return new RankSearch(children);
+ return UP(new RankSearch(std::move(children)));
}
}
diff --git a/searchlib/src/vespa/searchlib/queryeval/ranksearch.h b/searchlib/src/vespa/searchlib/queryeval/ranksearch.h
index 60efed3c694..443202f3e59 100644
--- a/searchlib/src/vespa/searchlib/queryeval/ranksearch.h
+++ b/searchlib/src/vespa/searchlib/queryeval/ranksearch.h
@@ -20,11 +20,10 @@ protected:
*
* @param children the search objects we are rank'ing
**/
- RankSearch(const Children & children) : MultiSearch(children) { }
+ RankSearch(Children children) : MultiSearch(std::move(children)) { }
public:
- // Caller takes ownership of the returned SearchIterator.
- static SearchIterator *create(const Children &children, bool strict);
+ static SearchIterator::UP create(ChildrenIterators children, bool strict);
};
}
diff --git a/searchlib/src/vespa/searchlib/queryeval/simple_phrase_blueprint.cpp b/searchlib/src/vespa/searchlib/queryeval/simple_phrase_blueprint.cpp
index fc29c7ef45d..83d5a5e1739 100644
--- a/searchlib/src/vespa/searchlib/queryeval/simple_phrase_blueprint.cpp
+++ b/searchlib/src/vespa/searchlib/queryeval/simple_phrase_blueprint.cpp
@@ -61,7 +61,8 @@ SimplePhraseBlueprint::createLeafSearch(const fef::TermFieldMatchDataArray &tfmd
assert(tfmda.size() == 1);
fef::MatchData::UP md = _layout.createMatchData();
fef::TermFieldMatchDataArray childMatch;
- SimplePhraseSearch::Children children(_terms.size());
+ SimplePhraseSearch::Children children;
+ children.reserve(_terms.size());
std::multimap<uint32_t, uint32_t> order_map;
for (size_t i = 0; i < _terms.size(); ++i) {
const State &childState = _terms[i]->getState();
@@ -70,7 +71,7 @@ SimplePhraseBlueprint::createLeafSearch(const fef::TermFieldMatchDataArray &tfmd
child_term_field_match_data->setNeedInterleavedFeatures(tfmda[0]->needs_interleaved_features());
child_term_field_match_data->setNeedNormalFeatures(true);
childMatch.add(child_term_field_match_data);
- children[i] = _terms[i]->createSearch(*md, strict).release();
+ children.push_back(_terms[i]->createSearch(*md, strict));
order_map.insert(std::make_pair(childState.estimate().estHits, i));
}
std::vector<uint32_t> eval_order;
@@ -78,7 +79,8 @@ SimplePhraseBlueprint::createLeafSearch(const fef::TermFieldMatchDataArray &tfmd
eval_order.push_back(child.second);
}
- auto phrase = std::make_unique<SimplePhraseSearch>(children, std::move(md), childMatch,
+ auto phrase = std::make_unique<SimplePhraseSearch>(std::move(children),
+ std::move(md), childMatch,
eval_order, *tfmda[0], strict);
phrase->setDoom(& _doom);
return phrase;
@@ -88,13 +90,14 @@ SearchIterator::UP
SimplePhraseBlueprint::createFilterSearch(bool strict, FilterConstraint constraint) const
{
if (constraint == FilterConstraint::UPPER_BOUND) {
- MultiSearch::Children children(_terms.size());
+ MultiSearch::Children children;
+ children.reserve(_terms.size());
for (size_t i = 0; i < _terms.size(); ++i) {
bool child_strict = strict && (i == 0);
- children[i] = _terms[i]->createFilterSearch(child_strict, constraint).release();
+ children.push_back(_terms[i]->createFilterSearch(child_strict, constraint));
}
UnpackInfo unpack_info;
- return SearchIterator::UP(AndSearch::create(children, strict, unpack_info));
+ return AndSearch::create(std::move(children), strict, unpack_info);
} else {
return std::make_unique<EmptySearch>();
}
diff --git a/searchlib/src/vespa/searchlib/queryeval/simple_phrase_search.cpp b/searchlib/src/vespa/searchlib/queryeval/simple_phrase_search.cpp
index df0dff06582..43a9ee4ab91 100644
--- a/searchlib/src/vespa/searchlib/queryeval/simple_phrase_search.cpp
+++ b/searchlib/src/vespa/searchlib/queryeval/simple_phrase_search.cpp
@@ -157,23 +157,23 @@ SimplePhraseSearch::phraseSeek(uint32_t doc_id) {
}
-SimplePhraseSearch::SimplePhraseSearch(const Children &children,
+SimplePhraseSearch::SimplePhraseSearch(Children children,
fef::MatchData::UP md,
const fef::TermFieldMatchDataArray &childMatch,
vector<uint32_t> eval_order,
TermFieldMatchData &tmd, bool strict)
- : AndSearch(children),
+ : AndSearch(std::move(children)),
_md(std::move(md)),
_childMatch(childMatch),
_eval_order(std::move(eval_order)),
_tmd(tmd),
_doom(nullptr),
_strict(strict),
- _iterators(children.size())
+ _iterators(getChildren().size())
{
- assert(!children.empty());
- assert(children.size() == _childMatch.size());
- assert(children.size() == _eval_order.size());
+ assert(getChildren().size() > 0);
+ assert(getChildren().size() == _childMatch.size());
+ assert(getChildren().size() == _eval_order.size());
}
void
diff --git a/searchlib/src/vespa/searchlib/queryeval/simple_phrase_search.h b/searchlib/src/vespa/searchlib/queryeval/simple_phrase_search.h
index d45e67ed4cb..5cec039e733 100644
--- a/searchlib/src/vespa/searchlib/queryeval/simple_phrase_search.h
+++ b/searchlib/src/vespa/searchlib/queryeval/simple_phrase_search.h
@@ -43,7 +43,7 @@ public:
* terms. The term with fewest hits should be
* evaluated first.
**/
- SimplePhraseSearch(const Children &children,
+ SimplePhraseSearch(Children children,
fef::MatchData::UP md,
const fef::TermFieldMatchDataArray &childMatch,
std::vector<uint32_t> eval_order,
diff --git a/searchlib/src/vespa/searchlib/queryeval/sourceblendersearch.cpp b/searchlib/src/vespa/searchlib/queryeval/sourceblendersearch.cpp
index 3280e0ac2cc..282e3bef104 100644
--- a/searchlib/src/vespa/searchlib/queryeval/sourceblendersearch.cpp
+++ b/searchlib/src/vespa/searchlib/queryeval/sourceblendersearch.cpp
@@ -158,14 +158,14 @@ SourceBlenderSearch::setChild(size_t index, SearchIterator::UP child) {
_sources[_children[index]] = child.release();
}
-SourceBlenderSearch *
+SearchIterator::UP
SourceBlenderSearch::create(std::unique_ptr<sourceselector::Iterator> sourceSelector,
const Children &children, bool strict)
{
if (strict) {
- return new SourceBlenderSearchStrict(std::move(sourceSelector), children);
+ return SearchIterator::UP(new SourceBlenderSearchStrict(std::move(sourceSelector), children));
} else {
- return new SourceBlenderSearch(std::move(sourceSelector), children);
+ return SearchIterator::UP(new SourceBlenderSearch(std::move(sourceSelector), children));
}
}
diff --git a/searchlib/src/vespa/searchlib/queryeval/sourceblendersearch.h b/searchlib/src/vespa/searchlib/queryeval/sourceblendersearch.h
index 9b4d8f58034..f209e0f7fd8 100644
--- a/searchlib/src/vespa/searchlib/queryeval/sourceblendersearch.h
+++ b/searchlib/src/vespa/searchlib/queryeval/sourceblendersearch.h
@@ -68,8 +68,9 @@ public:
* @param strict whether this search is strict
* (a strict search will locate its next hit when seeking fails)
**/
- static SourceBlenderSearch * create(std::unique_ptr<Iterator> sourceSelector,
- const Children &children, bool strict);
+ static SearchIterator::UP create(std::unique_ptr<Iterator> sourceSelector,
+ const Children &children,
+ bool strict);
~SourceBlenderSearch() override;
size_t getNumChildren() const { return _children.size(); }
SearchIterator::UP steal(size_t index) {
diff --git a/searchlib/src/vespa/searchlib/queryeval/termwise_blueprint_helper.cpp b/searchlib/src/vespa/searchlib/queryeval/termwise_blueprint_helper.cpp
index ae21fd93ba3..e26a1652441 100644
--- a/searchlib/src/vespa/searchlib/queryeval/termwise_blueprint_helper.cpp
+++ b/searchlib/src/vespa/searchlib/queryeval/termwise_blueprint_helper.cpp
@@ -6,27 +6,27 @@
namespace search::queryeval {
TermwiseBlueprintHelper::TermwiseBlueprintHelper(const IntermediateBlueprint &self,
- const MultiSearch::Children &subSearches,
+ MultiSearch::Children subSearches,
UnpackInfo &unpackInfo)
- : children(),
- termwise(),
+ : termwise_ch(),
+ other_ch(),
first_termwise(subSearches.size()),
termwise_unpack()
{
- children.reserve(subSearches.size());
- termwise.reserve(subSearches.size());
+ other_ch.reserve(subSearches.size());
+ termwise_ch.reserve(subSearches.size());
for (size_t i = 0; i < subSearches.size(); ++i) {
bool need_unpack = unpackInfo.needUnpack(i);
bool allow_termwise = self.getChild(i).getState().allow_termwise_eval();
if (need_unpack || !allow_termwise) {
if (need_unpack) {
- size_t index = (i < first_termwise) ? children.size() : (children.size() + 1);
+ size_t index = (i < first_termwise) ? other_ch.size() : (other_ch.size() + 1);
termwise_unpack.add(index);
}
- children.push_back(subSearches[i]);
+ other_ch.push_back(std::move(subSearches[i]));
} else {
first_termwise = std::min(i, first_termwise);
- termwise.push_back(subSearches[i]);
+ termwise_ch.push_back(std::move(subSearches[i]));
}
}
}
@@ -37,7 +37,7 @@ void
TermwiseBlueprintHelper::insert_termwise(SearchIterator::UP search, bool strict)
{
auto termwise_search = make_termwise(std::move(search), strict);
- children.insert(children.begin() + first_termwise, termwise_search.release());
+ other_ch.insert(other_ch.begin() + first_termwise, std::move(termwise_search));
}
}
diff --git a/searchlib/src/vespa/searchlib/queryeval/termwise_blueprint_helper.h b/searchlib/src/vespa/searchlib/queryeval/termwise_blueprint_helper.h
index e6b46cfb7d2..2917ce4d8c9 100644
--- a/searchlib/src/vespa/searchlib/queryeval/termwise_blueprint_helper.h
+++ b/searchlib/src/vespa/searchlib/queryeval/termwise_blueprint_helper.h
@@ -15,13 +15,18 @@ namespace search::queryeval {
* termwise and non-termwise parts with each other.
**/
struct TermwiseBlueprintHelper {
- MultiSearch::Children children;
- MultiSearch::Children termwise;
+private:
+ MultiSearch::Children termwise_ch;
+ MultiSearch::Children other_ch;
+public:
size_t first_termwise;
UnpackInfo termwise_unpack;
+ MultiSearch::Children get_termwise_children() { return std::move(termwise_ch); }
+ MultiSearch::Children get_result() { return std::move(other_ch); }
+
TermwiseBlueprintHelper(const IntermediateBlueprint &self,
- const MultiSearch::Children &subSearches, UnpackInfo &unpackInfo);
+ MultiSearch::Children subSearches, UnpackInfo &unpackInfo);
~TermwiseBlueprintHelper();
void insert_termwise(SearchIterator::UP search, bool strict);
diff --git a/searchlib/src/vespa/searchlib/queryeval/test/leafspec.h b/searchlib/src/vespa/searchlib/queryeval/test/leafspec.h
index 47b5ed26b60..fa14941844e 100644
--- a/searchlib/src/vespa/searchlib/queryeval/test/leafspec.h
+++ b/searchlib/src/vespa/searchlib/queryeval/test/leafspec.h
@@ -18,7 +18,7 @@ struct LeafSpec
int32_t weight;
int32_t maxWeight;
FakeResult result;
- SearchIterator *search;
+ SearchIterator::UP search;
LeafSpec(const std::string &n, int32_t w = 100)
: name(n),
weight(w),
@@ -26,31 +26,36 @@ struct LeafSpec
result(),
search()
{}
+ LeafSpec(LeafSpec && other) = default;
~LeafSpec() {}
- LeafSpec &doc(uint32_t docid) {
+ LeafSpec && doc(uint32_t docid) && {
result.doc(docid);
- return *this;
+ return std::move(*this);
}
- LeafSpec &doc(uint32_t docid, int32_t w) {
+ LeafSpec && doc(uint32_t docid, int32_t w) && {
result.doc(docid);
result.weight(w);
result.pos(0);
maxWeight = std::max(maxWeight, w);
- return *this;
+ return std::move(*this);
}
- LeafSpec &itr(SearchIterator *si) {
- search = si;
- return *this;
+ LeafSpec && itr(SearchIterator::UP si) && {
+ search = std::move(si);
+ return std::move(*this);
}
- SearchIterator *create(SearchHistory &hist, fef::TermFieldMatchData *tfmd) const {
- if (search != nullptr) {
- return new TrackedSearch(name, hist, search);
+ LeafSpec && itr(SearchIterator *si) && {
+ search.reset(si);
+ return std::move(*this);
+ }
+ SearchIterator::UP create(SearchHistory &hist, fef::TermFieldMatchData *tfmd) {
+ if (search) {
+ return SearchIterator::UP(new TrackedSearch(name, hist, std::move(search)));
} else if (tfmd != nullptr) {
- return new TrackedSearch(name, hist, result, *tfmd,
- MinMaxPostingInfo(0, maxWeight));
+ return SearchIterator::UP(new TrackedSearch(name, hist, result, *tfmd,
+ MinMaxPostingInfo(0, maxWeight)));
}
- return new TrackedSearch(name, hist, result,
- MinMaxPostingInfo(0, maxWeight));
+ return SearchIterator::UP(new TrackedSearch(name, hist, result,
+ MinMaxPostingInfo(0, maxWeight)));
}
};
diff --git a/searchlib/src/vespa/searchlib/queryeval/test/trackedsearch.h b/searchlib/src/vespa/searchlib/queryeval/test/trackedsearch.h
index 6cb4c1a9dda..ae04d35e658 100644
--- a/searchlib/src/vespa/searchlib/queryeval/test/trackedsearch.h
+++ b/searchlib/src/vespa/searchlib/queryeval/test/trackedsearch.h
@@ -56,6 +56,12 @@ public:
_search(new FakeSearch("<tag>", "<field>", "<term>", result, makeArray(tfmd))),
_minMaxPostingInfo(new MinMaxPostingInfo(minMaxPostingInfo))
{ setDocId(_search->getDocId()); }
+
+ // wraps a generic search (typically wand)
+ TrackedSearch(const std::string &name, SearchHistory &hist, SearchIterator::UP search)
+ : _name(name), _history(hist), _matchData(), _search(std::move(search)), _minMaxPostingInfo()
+ { setDocId(_search->getDocId()); }
+
// wraps a generic search (typically wand)
TrackedSearch(const std::string &name, SearchHistory &hist, SearchIterator *search)
: _name(name), _history(hist), _matchData(), _search(search), _minMaxPostingInfo()
diff --git a/searchlib/src/vespa/searchlib/queryeval/test/wandspec.h b/searchlib/src/vespa/searchlib/queryeval/test/wandspec.h
index bf456c287d6..2fb2b3bc9e2 100644
--- a/searchlib/src/vespa/searchlib/queryeval/test/wandspec.h
+++ b/searchlib/src/vespa/searchlib/queryeval/test/wandspec.h
@@ -26,8 +26,8 @@ private:
public:
WandSpec() : _leafs(), _layout(), _handles(), _history() {}
~WandSpec() {}
- WandSpec &leaf(const LeafSpec &l) {
- _leafs.push_back(l);
+ WandSpec &leaf(LeafSpec && l) {
+ _leafs.emplace_back(std::move(l));
_handles.push_back(_layout.allocTermField(0));
return *this;
}
@@ -35,7 +35,7 @@ public:
wand::Terms terms;
for (size_t i = 0; i < _leafs.size(); ++i) {
fef::TermFieldMatchData *tfmd = (matchData != NULL ? matchData->resolveTermField(_handles[i]) : NULL);
- terms.push_back(wand::Term(_leafs[i].create(_history, tfmd),
+ terms.push_back(wand::Term(_leafs[i].create(_history, tfmd).release(),
_leafs[i].weight,
_leafs[i].result.inspect().size(),
tfmd));
diff --git a/searchlib/src/vespa/searchlib/queryeval/wand/wand_parts.h b/searchlib/src/vespa/searchlib/queryeval/wand/wand_parts.h
index bd60473e05d..6c4d9209da1 100644
--- a/searchlib/src/vespa/searchlib/queryeval/wand/wand_parts.h
+++ b/searchlib/src/vespa/searchlib/queryeval/wand/wand_parts.h
@@ -44,6 +44,7 @@ struct Term {
: search(s), weight(w), estHits(e), matchData(tfmd) {}
Term() : Term(nullptr, 0, 0, nullptr){}
Term(SearchIterator *s, int32_t w, uint32_t e) : Term(s, w, e, nullptr) {}
+ Term(SearchIterator::UP s, int32_t w, uint32_t e) : Term(s.release(), w, e, nullptr) {}
};
//-----------------------------------------------------------------------------
diff --git a/searchlib/src/vespa/searchlib/queryeval/wand/weak_and_search.cpp b/searchlib/src/vespa/searchlib/queryeval/wand/weak_and_search.cpp
index f290d3e19ea..d94dc6d8ae8 100644
--- a/searchlib/src/vespa/searchlib/queryeval/wand/weak_and_search.cpp
+++ b/searchlib/src/vespa/searchlib/queryeval/wand/weak_and_search.cpp
@@ -106,27 +106,27 @@ WeakAndSearch::visitMembers(vespalib::ObjectVisitor &visitor) const
//-----------------------------------------------------------------------------
-SearchIterator *
+SearchIterator::UP
WeakAndSearch::createArrayWand(const Terms &terms, uint32_t n, bool strict)
{
if (strict) {
- return new wand::WeakAndSearchLR<vespalib::LeftArrayHeap, vespalib::RightArrayHeap, true>(terms, n);
+ return SearchIterator::UP(new wand::WeakAndSearchLR<vespalib::LeftArrayHeap, vespalib::RightArrayHeap, true>(terms, n));
} else {
- return new wand::WeakAndSearchLR<vespalib::LeftArrayHeap, vespalib::RightArrayHeap, false>(terms, n);
+ return SearchIterator::UP(new wand::WeakAndSearchLR<vespalib::LeftArrayHeap, vespalib::RightArrayHeap, false>(terms, n));
}
}
-SearchIterator *
+SearchIterator::UP
WeakAndSearch::createHeapWand(const Terms &terms, uint32_t n, bool strict)
{
if (strict) {
- return new wand::WeakAndSearchLR<vespalib::LeftHeap, vespalib::RightHeap, true>(terms, n);
+ return SearchIterator::UP(new wand::WeakAndSearchLR<vespalib::LeftHeap, vespalib::RightHeap, true>(terms, n));
} else {
- return new wand::WeakAndSearchLR<vespalib::LeftHeap, vespalib::RightHeap, false>(terms, n);
+ return SearchIterator::UP(new wand::WeakAndSearchLR<vespalib::LeftHeap, vespalib::RightHeap, false>(terms, n));
}
}
-SearchIterator *
+SearchIterator::UP
WeakAndSearch::create(const Terms &terms, uint32_t n, bool strict)
{
if (terms.size() < 128) {
diff --git a/searchlib/src/vespa/searchlib/queryeval/wand/weak_and_search.h b/searchlib/src/vespa/searchlib/queryeval/wand/weak_and_search.h
index 5b09d087873..e51b5ca102d 100644
--- a/searchlib/src/vespa/searchlib/queryeval/wand/weak_and_search.h
+++ b/searchlib/src/vespa/searchlib/queryeval/wand/weak_and_search.h
@@ -16,9 +16,9 @@ struct WeakAndSearch : SearchIterator {
virtual const Terms &getTerms() const = 0;
virtual uint32_t getN() const = 0;
void visitMembers(vespalib::ObjectVisitor &visitor) const override;
- static SearchIterator *createArrayWand(const Terms &terms, uint32_t n, bool strict);
- static SearchIterator *createHeapWand(const Terms &terms, uint32_t n, bool strict);
- static SearchIterator *create(const Terms &terms, uint32_t n, bool strict);
+ static SearchIterator::UP createArrayWand(const Terms &terms, uint32_t n, bool strict);
+ static SearchIterator::UP createHeapWand(const Terms &terms, uint32_t n, bool strict);
+ static SearchIterator::UP create(const Terms &terms, uint32_t n, bool strict);
};
} // namespace queryeval
diff --git a/searchlib/src/vespa/searchlib/queryeval/weighted_set_term_search.cpp b/searchlib/src/vespa/searchlib/queryeval/weighted_set_term_search.cpp
index 2801f1c5e0c..71270c84c63 100644
--- a/searchlib/src/vespa/searchlib/queryeval/weighted_set_term_search.cpp
+++ b/searchlib/src/vespa/searchlib/queryeval/weighted_set_term_search.cpp
@@ -131,8 +131,8 @@ public:
//-----------------------------------------------------------------------------
-SearchIterator *
-WeightedSetTermSearch::create(const std::vector<SearchIterator*> &children,
+SearchIterator::UP
+WeightedSetTermSearch::create(const std::vector<SearchIterator *> &children,
TermFieldMatchData &tmd,
const std::vector<int32_t> &weights,
fef::MatchData::UP match_data)
@@ -141,9 +141,9 @@ WeightedSetTermSearch::create(const std::vector<SearchIterator*> &children,
typedef WeightedSetTermSearchImpl<vespalib::LeftHeap, SearchIteratorPack> HeapImpl;
if (children.size() < 128) {
- return new ArrayHeapImpl(tmd, weights, SearchIteratorPack(children, std::move(match_data)));
+ return SearchIterator::UP(new ArrayHeapImpl(tmd, weights, SearchIteratorPack(children, std::move(match_data))));
}
- return new HeapImpl(tmd, weights, SearchIteratorPack(children, std::move(match_data)));
+ return SearchIterator::UP(new HeapImpl(tmd, weights, SearchIteratorPack(children, std::move(match_data))));
}
//-----------------------------------------------------------------------------
diff --git a/searchlib/src/vespa/searchlib/queryeval/weighted_set_term_search.h b/searchlib/src/vespa/searchlib/queryeval/weighted_set_term_search.h
index 397ac0caf2e..7eba0907f6b 100644
--- a/searchlib/src/vespa/searchlib/queryeval/weighted_set_term_search.h
+++ b/searchlib/src/vespa/searchlib/queryeval/weighted_set_term_search.h
@@ -27,10 +27,10 @@ protected:
WeightedSetTermSearch() {}
public:
- static SearchIterator* create(const std::vector<SearchIterator*> &children,
- search::fef::TermFieldMatchData &tmd,
- const std::vector<int32_t> &weights,
- fef::MatchData::UP match_data);
+ static SearchIterator::UP create(const std::vector<SearchIterator *> &children,
+ search::fef::TermFieldMatchData &tmd,
+ const std::vector<int32_t> &weights,
+ fef::MatchData::UP match_data);
static SearchIterator::UP create(search::fef::TermFieldMatchData &tmd,
const std::vector<int32_t> &weights,
diff --git a/searchlib/src/vespa/searchlib/test/initrange.h b/searchlib/src/vespa/searchlib/test/initrange.h
index 9431740ac08..a143dfdb119 100644
--- a/searchlib/src/vespa/searchlib/test/initrange.h
+++ b/searchlib/src/vespa/searchlib/test/initrange.h
@@ -25,6 +25,7 @@ public:
void verify(SearchIterator & iterator) const;
/// Convenience that takes ownership of the pointer.
void verify(SearchIterator * iterator) const;
+ void verify(SearchIterator::UP iterator) const { verify(*iterator); }
private:
void verify(SearchIterator & iterator, bool strict) const;
void verify(SearchIterator & iterator, const Ranges & ranges, bool strict) const;
diff --git a/searchlib/src/vespa/searchlib/test/searchiteratorverifier.cpp b/searchlib/src/vespa/searchlib/test/searchiteratorverifier.cpp
index fce768ab0d2..ec53d6d9d00 100644
--- a/searchlib/src/vespa/searchlib/test/searchiteratorverifier.cpp
+++ b/searchlib/src/vespa/searchlib/test/searchiteratorverifier.cpp
@@ -170,9 +170,9 @@ void
SearchIteratorVerifier::verifyAnd(bool strict) const {
fef::TermFieldMatchData tfmd;
MultiSearch::Children children;
- children.emplace_back(create(strict).release());
- children.emplace_back(BitVectorIterator::create(_everyOddBitSet.get(), getDocIdLimit(), tfmd, false).release());
- SearchIterator::UP search(AndSearch::create(children, strict, UnpackInfo()));
+ children.push_back(create(strict));
+ children.push_back(BitVectorIterator::create(_everyOddBitSet.get(), getDocIdLimit(), tfmd, false));
+ auto search = AndSearch::create(std::move(children), strict, UnpackInfo());
TEST_DO(verify(*search, strict, _expectedAnd));
TEST_DO(verifyTermwise(std::move(search), strict, _expectedAnd));
}
@@ -183,18 +183,18 @@ SearchIteratorVerifier::verifyAndNot(bool strict) const {
{
for (bool notStrictness : {false, true}) {
MultiSearch::Children children;
- children.emplace_back(create(strict).release());
- children.emplace_back(BitVectorIterator::create(_everyOddBitSet.get(), getDocIdLimit(), tfmd, notStrictness).release());
- SearchIterator::UP search(AndNotSearch::create(children, strict));
+ children.push_back(create(strict));
+ children.push_back(BitVectorIterator::create(_everyOddBitSet.get(), getDocIdLimit(), tfmd, notStrictness));
+ auto search = AndNotSearch::create(std::move(children), strict);
TEST_DO(verify(*search, strict, _expectedAndNotPositive));
TEST_DO(verifyTermwise(std::move(search), strict, _expectedAndNotPositive));
}
}
{
MultiSearch::Children children;
- children.emplace_back(BitVectorIterator::create(_everyOddBitSet.get(), getDocIdLimit(), tfmd, true).release());
- children.emplace_back(create(strict).release());
- SearchIterator::UP search(AndNotSearch::create(children, strict));
+ children.push_back(BitVectorIterator::create(_everyOddBitSet.get(), getDocIdLimit(), tfmd, true));
+ children.push_back(create(strict));
+ auto search = AndNotSearch::create(std::move(children), strict);
TEST_DO(verify(*search, strict, _expectedAndNotNegative));
TEST_DO(verifyTermwise(std::move(search), strict, _expectedAndNotNegative));
}
@@ -205,9 +205,9 @@ void
SearchIteratorVerifier::verifyOr(bool strict) const {
fef::TermFieldMatchData tfmd;
MultiSearch::Children children;
- children.emplace_back(create(strict).release());
- children.emplace_back(BitVectorIterator::create(_everyOddBitSet.get(), getDocIdLimit(), tfmd, strict).release());
- SearchIterator::UP search(OrSearch::create(children, strict, UnpackInfo()));
+ children.push_back(create(strict));
+ children.push_back(BitVectorIterator::create(_everyOddBitSet.get(), getDocIdLimit(), tfmd, strict));
+ SearchIterator::UP search(OrSearch::create(std::move(children), strict, UnpackInfo()));
TEST_DO(verify(*search, strict, _expectedOr));
TEST_DO(verifyTermwise(std::move(search), strict, _expectedOr));
}