aboutsummaryrefslogtreecommitdiffstats
path: root/searchlib
diff options
context:
space:
mode:
authorHenning Baldersheim <balder@yahoo-inc.com>2017-03-10 16:17:35 +0100
committerHenning Baldersheim <balder@yahoo-inc.com>2017-03-10 16:17:35 +0100
commit091b55e5a64eb27bb8fc980e56e2edb1e4824daa (patch)
tree95f83034371328bc7eb96e17552ce1d423c392a4 /searchlib
parent8d4c358fbdffe099ca3c164f156286563c2aa59b (diff)
Move to helper class.
Diffstat (limited to 'searchlib')
-rw-r--r--searchlib/src/vespa/searchlib/queryeval/andnotsearch.cpp3
-rw-r--r--searchlib/src/vespa/searchlib/queryeval/andsearch.cpp5
-rw-r--r--searchlib/src/vespa/searchlib/queryeval/iterator_pack.cpp5
-rw-r--r--searchlib/src/vespa/searchlib/queryeval/orsearch.cpp5
-rw-r--r--searchlib/src/vespa/searchlib/queryeval/searchiterator.cpp100
-rw-r--r--searchlib/src/vespa/searchlib/queryeval/searchiterator.h15
-rw-r--r--searchlib/src/vespa/searchlib/queryeval/termwise_helper.h135
7 files changed, 147 insertions, 121 deletions
diff --git a/searchlib/src/vespa/searchlib/queryeval/andnotsearch.cpp b/searchlib/src/vespa/searchlib/queryeval/andnotsearch.cpp
index 6bfe7cb81fd..32984438fa0 100644
--- a/searchlib/src/vespa/searchlib/queryeval/andnotsearch.cpp
+++ b/searchlib/src/vespa/searchlib/queryeval/andnotsearch.cpp
@@ -1,6 +1,7 @@
// Copyright 2016 Yahoo Inc. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root.
#include "andnotsearch.h"
+#include "termwise_helper.h"
#include <vespa/searchlib/common/bitvector.h>
namespace search {
@@ -149,7 +150,7 @@ AndNotSearch::get_hits(uint32_t begin_id) {
const Children &children = getChildren();
BitVector::UP result = children.front()->get_hits(begin_id);
result->notSelf();
- result = orChildren(std::move(result), children.begin()+1, children.end(), begin_id);
+ result = TermwiseHelper::orChildren(std::move(result), children.begin()+1, children.end(), begin_id);
result->notSelf();
return result;
}
diff --git a/searchlib/src/vespa/searchlib/queryeval/andsearch.cpp b/searchlib/src/vespa/searchlib/queryeval/andsearch.cpp
index 4a2af1a518d..09f5c548838 100644
--- a/searchlib/src/vespa/searchlib/queryeval/andsearch.cpp
+++ b/searchlib/src/vespa/searchlib/queryeval/andsearch.cpp
@@ -2,6 +2,7 @@
#include "andsearch.h"
#include "andsearchstrict.h"
+#include "termwise_helper.h"
#include <vespa/searchlib/common/bitvector.h>
namespace search {
@@ -9,7 +10,7 @@ namespace queryeval {
BitVector::UP
AndSearch::get_hits(uint32_t begin_id) {
- return andChildren(getChildren(), begin_id);
+ return TermwiseHelper::andChildren(getChildren().begin(), getChildren().end(), begin_id);
}
void
@@ -20,7 +21,7 @@ AndSearch::or_hits_into(BitVector &result, uint32_t begin_id) {
void
AndSearch::and_hits_into(BitVector &result, uint32_t begin_id)
{
- andChildren(result, getChildren(), begin_id);
+ TermwiseHelper::andChildren(result, getChildren().begin(), getChildren().end(), begin_id);
}
SearchIterator::UP AndSearch::andWith(UP filter, uint32_t estimate_)
diff --git a/searchlib/src/vespa/searchlib/queryeval/iterator_pack.cpp b/searchlib/src/vespa/searchlib/queryeval/iterator_pack.cpp
index 45778bc0cf5..ab64acd23b8 100644
--- a/searchlib/src/vespa/searchlib/queryeval/iterator_pack.cpp
+++ b/searchlib/src/vespa/searchlib/queryeval/iterator_pack.cpp
@@ -1,6 +1,7 @@
// Copyright 2016 Yahoo Inc. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root.
#include "iterator_pack.h"
+#include "termwise_helper.h"
#include <vespa/searchlib/common/bitvector.h>
#include <vespa/searchlib/fef/matchdata.h>
@@ -47,7 +48,7 @@ SearchIteratorPack::SearchIteratorPack(const std::vector<SearchIterator*> &child
std::unique_ptr<BitVector>
SearchIteratorPack::get_hits(uint32_t begin_id, uint32_t end_id) const {
- BitVector::UP result = SearchIterator::orChildren(_children.begin(), _children.end(), begin_id);
+ BitVector::UP result = TermwiseHelper::orChildren(_children.begin(), _children.end(), begin_id);
if (! result ) {
result = BitVector::create(begin_id, end_id);
}
@@ -56,7 +57,7 @@ SearchIteratorPack::get_hits(uint32_t begin_id, uint32_t end_id) const {
void
SearchIteratorPack::or_hits_into(BitVector &result, uint32_t begin_id) const {
- SearchIterator::orChildren(result, _children.begin(), _children.end(), begin_id);
+ TermwiseHelper::orChildren(result, _children.begin(), _children.end(), begin_id);
}
diff --git a/searchlib/src/vespa/searchlib/queryeval/orsearch.cpp b/searchlib/src/vespa/searchlib/queryeval/orsearch.cpp
index f9b99d695fc..0238ba835e2 100644
--- a/searchlib/src/vespa/searchlib/queryeval/orsearch.cpp
+++ b/searchlib/src/vespa/searchlib/queryeval/orsearch.cpp
@@ -2,6 +2,7 @@
#include "orsearch.h"
#include "orlikesearch.h"
+#include "termwise_helper.h"
#include <vespa/searchlib/common/bitvector.h>
namespace search {
@@ -78,7 +79,7 @@ private:
BitVector::UP
OrSearch::get_hits(uint32_t begin_id) {
- return orChildren(getChildren().begin(), getChildren().end(), begin_id);
+ return TermwiseHelper::orChildren(getChildren().begin(), getChildren().end(), begin_id);
}
void
@@ -89,7 +90,7 @@ OrSearch::and_hits_into(BitVector &result, uint32_t begin_id) {
void
OrSearch::or_hits_into(BitVector &result, uint32_t begin_id)
{
- orChildren(result, getChildren().begin(), getChildren().end(), begin_id);
+ TermwiseHelper::orChildren(result, getChildren().begin(), getChildren().end(), begin_id);
}
SearchIterator *
diff --git a/searchlib/src/vespa/searchlib/queryeval/searchiterator.cpp b/searchlib/src/vespa/searchlib/queryeval/searchiterator.cpp
index 9860105ddc5..a2f64b06e4c 100644
--- a/searchlib/src/vespa/searchlib/queryeval/searchiterator.cpp
+++ b/searchlib/src/vespa/searchlib/queryeval/searchiterator.cpp
@@ -97,105 +97,7 @@ SearchIterator::visitMembers(vespalib::ObjectVisitor &visitor) const
visit(visitor, "docid", _docid);
visit(visitor, "endid", _endid);
}
-
-namespace {
-
-using Children = SearchIterator::Children;
-
-BitVector::UP
-andIterators(BitVector::UP result, const Children &children, uint32_t begin_id, bool select_bitvector) {
- for (SearchIterator *child : children) {
- if (child->isBitVector() == select_bitvector) {
- if (!result) {
- result = child->get_hits(begin_id);
- } else {
- child->and_hits_into(*result, begin_id);
- }
- }
- }
- return result;
-}
-
-void
-andIterators(BitVector & result, const Children &children, uint32_t begin_id, bool select_bitvector) {
- for (SearchIterator *child : children) {
- if (child->isBitVector() == select_bitvector) {
- child->and_hits_into(result, begin_id);
- }
- }
-}
-
-template<typename IT>
-BitVector::UP
-orIterators(BitVector::UP result, IT begin, IT end, uint32_t begin_id, bool select_bitvector) {
- for (IT it(begin); it != end; ++it) {
- auto & child = *it;
- if (child->isBitVector() == select_bitvector) {
- if (!result) {
- result = child->get_hits(begin_id);
- } else {
- child->or_hits_into(*result, begin_id);
- }
- }
- }
- return result;
-}
-
-template<typename IT>
-void
-orIterators(BitVector & result, IT begin, IT end, uint32_t begin_id, bool select_bitvector) {
- for (IT it(begin); it != end; ++it) {
- auto & child = *it;
- if (child->isBitVector() == select_bitvector) {
- child->or_hits_into(result, begin_id);
- }
- }
-}
-
-}
-
-BitVector::UP
-SearchIterator::andChildren(BitVector::UP result, const Children &children, uint32_t begin_id) {
- return andIterators(andIterators(std::move(result), children, begin_id, true), children, begin_id, false);
-}
-
-void
-SearchIterator::andChildren(BitVector & result, const Children &children, uint32_t begin_id) {
- andIterators(result, children, begin_id, true);
- andIterators(result, children, begin_id, false);
-}
-
-BitVector::UP
-SearchIterator::andChildren(const Children &children, uint32_t begin_id) {
- return andChildren(BitVector::UP(), children, begin_id);
-}
-
-template<typename IT>
-BitVector::UP
-SearchIterator::orChildren(BitVector::UP result, IT from, IT to, uint32_t begin_id) {
- return orIterators(orIterators(std::move(result), from, to, begin_id, true),
- from, to, begin_id, false);
-}
-
-template<typename IT>
-void SearchIterator::orChildren(BitVector & result, IT from, IT to, uint32_t begin_id) {
- orIterators(result, from, to, begin_id, true);
- orIterators(result, from, to, begin_id, false);
-}
-
-template<typename IT>
-BitVector::UP
-SearchIterator::orChildren(IT from, IT to, uint32_t begin_id) {
- return orChildren(BitVector::UP(), from, to, begin_id);
-}
-
-template BitVector::UP SearchIterator::orChildren(Children::const_iterator from, Children::const_iterator to, uint32_t begin_id);
-template BitVector::UP SearchIterator::orChildren(OwnedChildren::const_iterator from, OwnedChildren::const_iterator to, uint32_t begin_id);
-template BitVector::UP SearchIterator::orChildren(BitVector::UP result, Children::const_iterator from, Children::const_iterator to, uint32_t begin_id);
-template BitVector::UP SearchIterator::orChildren(BitVector::UP result, OwnedChildren::const_iterator from, OwnedChildren::const_iterator to, uint32_t begin_id);
-template void SearchIterator::orChildren(BitVector & result, Children::const_iterator from, Children::const_iterator to, uint32_t begin_id);
-template void SearchIterator::orChildren(BitVector & result, OwnedChildren::const_iterator from, OwnedChildren::const_iterator to, uint32_t begin_id);
-
+
} // namespace queryeval
} // namespace search
diff --git a/searchlib/src/vespa/searchlib/queryeval/searchiterator.h b/searchlib/src/vespa/searchlib/queryeval/searchiterator.h
index a23fbf07fb2..17fa8fd9902 100644
--- a/searchlib/src/vespa/searchlib/queryeval/searchiterator.h
+++ b/searchlib/src/vespa/searchlib/queryeval/searchiterator.h
@@ -338,21 +338,6 @@ public:
virtual Trinary is_strict() const { return Trinary::Undefined; }
- using Children = std::vector<SearchIterator *>;
- using OwnedChildren = std::vector<std::unique_ptr<SearchIterator>>;
-
- static BitVectorUP andChildren(BitVectorUP result, const Children & children, uint32_t begin_id);
- static void andChildren(BitVector & result, const Children & children, uint32_t begin_id);
- static BitVectorUP andChildren(const Children & children, uint32_t begin_id);
-
- template <typename IT>
- static BitVectorUP orChildren(IT from, IT to, uint32_t begin_id);
- template <typename IT>
- static BitVectorUP orChildren(BitVectorUP result, IT from, IT to, uint32_t begin_id);
- template <typename IT>
- static void orChildren(BitVector & result, IT from, IT to, uint32_t begin_id);
-
-
};
} // namespace queryeval
diff --git a/searchlib/src/vespa/searchlib/queryeval/termwise_helper.h b/searchlib/src/vespa/searchlib/queryeval/termwise_helper.h
new file mode 100644
index 00000000000..12983a076b0
--- /dev/null
+++ b/searchlib/src/vespa/searchlib/queryeval/termwise_helper.h
@@ -0,0 +1,135 @@
+// Copyright 2016 Yahoo Inc. 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 {
+
+namespace queryeval {
+
+/**
+* Helper methods for doing termwise evaluation.
+**/
+class TermwiseHelper {
+public:
+ template<typename IT>
+ static BitVector::UP andChildren(BitVector::UP result, IT from, IT to, uint32_t begin_id);
+ template<typename IT>
+ static void andChildren(BitVector & result, IT from, IT to, uint32_t begin_id);
+ template<typename IT>
+ static BitVector::UP andChildren(IT from, IT to, uint32_t begin_id);
+
+ template<typename IT>
+ static BitVector::UP orChildren(BitVector::UP result, IT from, IT to, uint32_t begin_id);
+ template<typename IT>
+ static void orChildren(BitVector & result, IT from, IT to, uint32_t begin_id);
+ template<typename IT>
+ static BitVector::UP orChildren(IT from, IT to, uint32_t begin_id);
+private:
+ template<typename IT>
+ static BitVector::UP andIterators(BitVector::UP result, IT begin, IT end, uint32_t begin_id, bool select_bitvector);
+ template<typename IT>
+ static void andIterators(BitVector & result, IT begin, IT end, uint32_t begin_id, bool select_bitvector);
+ template<typename IT>
+ static BitVector::UP orIterators(BitVector::UP result, IT begin, IT end, uint32_t begin_id, bool select_bitvector);
+ template<typename IT>
+ static void orIterators(BitVector & result, IT begin, IT end, uint32_t begin_id, bool select_bitvector);
+};
+
+template<typename IT>
+BitVector::UP
+TermwiseHelper::andChildren(BitVector::UP result, IT from, IT to, uint32_t begin_id) {
+ return andIterators(andIterators(std::move(result), from, to, begin_id, true), from, to, begin_id, false);
+}
+
+template<typename IT>
+void
+TermwiseHelper::andChildren(BitVector & result, IT from, IT to, uint32_t begin_id) {
+ andIterators(result, from, to, begin_id, true);
+ andIterators(result, from, to, begin_id, false);
+}
+
+template<typename IT>
+BitVector::UP
+TermwiseHelper::andChildren(IT from, IT to, uint32_t begin_id) {
+ return andChildren(BitVector::UP(), from, to, begin_id);
+}
+
+template<typename IT>
+BitVector::UP
+TermwiseHelper::orChildren(BitVector::UP result, IT from, IT to, uint32_t begin_id) {
+ return orIterators(orIterators(std::move(result), from, to, begin_id, true),
+ from, to, begin_id, false);
+}
+
+template<typename IT>
+void
+TermwiseHelper::orChildren(BitVector & result, IT from, IT to, uint32_t begin_id) {
+ orIterators(result, from, to, begin_id, true);
+ orIterators(result, from, to, begin_id, false);
+}
+
+template<typename IT>
+BitVector::UP
+TermwiseHelper::orChildren(IT from, IT to, uint32_t begin_id) {
+ return orChildren(BitVector::UP(), from, to, begin_id);
+}
+
+template<typename IT>
+BitVector::UP
+TermwiseHelper::andIterators(BitVector::UP result, IT begin, IT end, uint32_t begin_id, bool select_bitvector) {
+ for (IT it(begin); it != end; ++it) {
+ auto & child = *it;
+ if (child->isBitVector() == select_bitvector) {
+ if (!result) {
+ result = child->get_hits(begin_id);
+ } else {
+ child->and_hits_into(*result, begin_id);
+ }
+ }
+ }
+ return result;
+}
+
+template<typename IT>
+void
+TermwiseHelper::andIterators(BitVector & result, IT begin, IT end, uint32_t begin_id, bool select_bitvector) {
+ for (IT it(begin); it != end; ++it) {
+ auto & child = *it;
+ if (child->isBitVector() == select_bitvector) {
+ child->and_hits_into(result, begin_id);
+ }
+ }
+}
+
+template<typename IT>
+BitVector::UP
+TermwiseHelper::orIterators(BitVector::UP result, IT begin, IT end, uint32_t begin_id, bool select_bitvector) {
+ for (IT it(begin); it != end; ++it) {
+ auto & child = *it;
+ if (child->isBitVector() == select_bitvector) {
+ if (!result) {
+ result = child->get_hits(begin_id);
+ } else {
+ child->or_hits_into(*result, begin_id);
+ }
+ }
+ }
+ return result;
+}
+
+template<typename IT>
+void
+TermwiseHelper::orIterators(BitVector & result, IT begin, IT end, uint32_t begin_id, bool select_bitvector) {
+ for (IT it(begin); it != end; ++it) {
+ auto & child = *it;
+ if (child->isBitVector() == select_bitvector) {
+ child->or_hits_into(result, begin_id);
+ }
+ }
+}
+
+}
+}