summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--searchlib/src/tests/common/bitvector/bitvector_test.cpp57
-rw-r--r--searchlib/src/vespa/searchlib/common/allocatedbitvector.cpp4
-rw-r--r--searchlib/src/vespa/searchlib/common/bitvector.cpp115
-rw-r--r--searchlib/src/vespa/searchlib/common/bitvector.h38
-rw-r--r--searchlib/src/vespa/searchlib/queryeval/andsearch.cpp15
-rw-r--r--searchlib/src/vespa/searchlib/queryeval/simplesearch.cpp10
-rw-r--r--searchlib/src/vespa/searchlib/queryeval/simplesearch.h7
-rw-r--r--searchlib/src/vespa/searchlib/queryeval/sourceblendersearch.cpp17
-rw-r--r--searchlib/src/vespa/searchlib/queryeval/sourceblendersearch.h12
-rw-r--r--searchlib/src/vespa/searchlib/queryeval/termwise_blueprint_helper.cpp8
-rw-r--r--searchlib/src/vespa/searchlib/queryeval/termwise_blueprint_helper.h6
-rw-r--r--searchlib/src/vespa/searchlib/queryeval/termwise_helper.h5
-rw-r--r--searchlib/src/vespa/searchlib/queryeval/termwise_search.cpp6
-rw-r--r--searchlib/src/vespa/searchlib/queryeval/termwise_search.h6
-rw-r--r--searchlib/src/vespa/searchlib/queryeval/truesearch.cpp10
-rw-r--r--searchlib/src/vespa/searchlib/queryeval/truesearch.h8
16 files changed, 200 insertions, 124 deletions
diff --git a/searchlib/src/tests/common/bitvector/bitvector_test.cpp b/searchlib/src/tests/common/bitvector/bitvector_test.cpp
index db29ab9881f..f53d15d6dc4 100644
--- a/searchlib/src/tests/common/bitvector/bitvector_test.cpp
+++ b/searchlib/src/tests/common/bitvector/bitvector_test.cpp
@@ -300,15 +300,59 @@ TEST("requireThatInitRangeStaysWithinBounds") {
EXPECT_TRUE(it->isAtEnd());
}
+void
+setEveryNthBit(uint32_t n, BitVector & bv, uint32_t offset, uint32_t end) {
+ for (uint32_t i(0); i < (end - offset); i++) {
+ if ((i % n) == 0) {
+ bv.setBit(offset + i);
+ } else {
+ bv.clearBit(offset + i);
+ }
+ }
+ bv.invalidateCachedCount();
+}
+BitVector::UP
+createEveryNthBitSet(uint32_t n, uint32_t offset, uint32_t sz) {
+ BitVector::UP bv(BitVector::create(offset, offset + sz));
+ setEveryNthBit(n, *bv, offset, offset + sz);
+ return bv;
+}
+
+template<typename Func>
+void
+verifyThatLongerWithShorterWorksAsZeroPadded(uint32_t offset, uint32_t sz1, uint32_t sz2, Func func) {
+ BitVector::UP aLarger = createEveryNthBitSet(2, offset, sz2);
+
+ BitVector::UP bSmall = createEveryNthBitSet(3, 0, offset + sz1);
+ BitVector::UP bLarger = createEveryNthBitSet(3, 0, offset + sz2);
+ BitVector::UP bEmpty = createEveryNthBitSet(3, 0, 0);
+ bLarger->clearInterval(offset + sz1, offset + sz2);
+ EXPECT_EQUAL(bSmall->countTrueBits(), bLarger->countTrueBits());
+
+ BitVector::UP aLarger2 = BitVector::create(*aLarger, aLarger->getStartIndex(), aLarger->size());
+ BitVector::UP aLarger3 = BitVector::create(*aLarger, aLarger->getStartIndex(), aLarger->size());
+ EXPECT_TRUE(*aLarger == *aLarger2);
+ EXPECT_TRUE(*aLarger == *aLarger3);
+ func(*aLarger, *bLarger);
+ func(*aLarger2, *bSmall);
+ func(*aLarger3, *bEmpty);
+ EXPECT_TRUE(*aLarger == *aLarger2);
+ //EXPECT_TRUE(*aLarger == *aLarger3);
+}
+
TEST("requireThatAndWorks") {
for (uint32_t offset(0); offset < 100; offset++) {
testAnd(offset);
+ verifyThatLongerWithShorterWorksAsZeroPadded(offset, offset+256, offset+256 + offset + 3,
+ [](BitVector & a, const BitVector & b) { a.andWith(b); });
}
}
TEST("requireThatOrWorks") {
for (uint32_t offset(0); offset < 100; offset++) {
testOr(offset);
+ verifyThatLongerWithShorterWorksAsZeroPadded(offset, offset+256, offset+256 + offset + 3,
+ [](BitVector & a, const BitVector & b) { a.orWith(b); });
}
}
@@ -316,9 +360,22 @@ TEST("requireThatOrWorks") {
TEST("requireThatAndNotWorks") {
for (uint32_t offset(0); offset < 100; offset++) {
testAndNot(offset);
+ verifyThatLongerWithShorterWorksAsZeroPadded(offset, offset+256, offset+256 + offset + 3,
+ [](BitVector & a, const BitVector & b) { a.andNotWith(b); });
}
}
+TEST("test that empty bitvectors does not crash") {
+ BitVector::UP empty = BitVector::create(0);
+ EXPECT_EQUAL(0u, empty->countTrueBits());
+ EXPECT_EQUAL(0u, empty->countInterval(0, 100));
+ empty->setInterval(0,17);
+ EXPECT_EQUAL(0u, empty->countInterval(0, 100));
+ empty->clearInterval(0,17);
+ EXPECT_EQUAL(0u, empty->countInterval(0, 100));
+ empty->notSelf();
+ EXPECT_EQUAL(0u, empty->countInterval(0, 100));
+}
TEST("requireThatNotWorks") {
for (uint32_t offset(0); offset < 100; offset++) {
diff --git a/searchlib/src/vespa/searchlib/common/allocatedbitvector.cpp b/searchlib/src/vespa/searchlib/common/allocatedbitvector.cpp
index 08a3847f00d..3add7d1a328 100644
--- a/searchlib/src/vespa/searchlib/common/allocatedbitvector.cpp
+++ b/searchlib/src/vespa/searchlib/common/allocatedbitvector.cpp
@@ -130,9 +130,9 @@ AllocatedBitVector::grow(Index newSize, Index newCapacity)
swap(tbv);
} else {
if (newSize > size()) {
- Index oldSz(size());
+ Range clearRange(size(), newSize);
setSize(newSize);
- clearIntervalNoInvalidation(oldSz, newSize);
+ clearIntervalNoInvalidation(clearRange);
} else {
clearInterval(newSize, size());
setSize(newSize);
diff --git a/searchlib/src/vespa/searchlib/common/bitvector.cpp b/searchlib/src/vespa/searchlib/common/bitvector.cpp
index 2e70e9f2603..96234e373dc 100644
--- a/searchlib/src/vespa/searchlib/common/bitvector.cpp
+++ b/searchlib/src/vespa/searchlib/common/bitvector.cpp
@@ -20,12 +20,12 @@ using vespalib::alloc::Alloc;
namespace {
-void verifyContains(const search::BitVector & a, const search::BitVector & b) __attribute__((noinline));
+void verifyInclusiveStart(const search::BitVector & a, const search::BitVector & b) __attribute__((noinline));
-void verifyContains(const search::BitVector & a, const search::BitVector & b)
+void verifyInclusiveStart(const search::BitVector & a, const search::BitVector & b)
{
- if ((a.getStartIndex() < b.getStartIndex()) || (a.size() > b.size())) {
- throw IllegalArgumentException(make_string("[%d, %d] is not contained in [%d, %d]",
+ if (a.getStartIndex() < b.getStartIndex()) {
+ throw IllegalArgumentException(make_string("[%d, %d] starts before which is not allowed currently [%d, %d]",
a.getStartIndex(), a.size(), b.getStartIndex(), b.size()),
VESPA_STRLOC);
}
@@ -85,44 +85,46 @@ BitVector::clear()
void
BitVector::clearInterval(Index start, Index end)
{
- clearIntervalNoInvalidation(start, end);
+ clearIntervalNoInvalidation(Range(start, end));
invalidateCachedCount();
}
void
-BitVector::clearIntervalNoInvalidation(Index start, Index end)
+BitVector::clearIntervalNoInvalidation(Range range_in)
{
- if (start >= end) { return; }
+ Range range = sanitize(range_in);
+ if ( ! range.validNonZero()) { return; }
- Index last = std::min(end, size()) - 1;
- Index startw = wordNum(start);
+ Index last = range.end() - 1;
+ Index startw = wordNum(range.start());
Index endw = wordNum(last);
if (endw > startw) {
- _words[startw++] &= startBits(start);
+ _words[startw++] &= startBits(range.start());
memset(_words+startw, 0, sizeof(*_words)*(endw-startw));
_words[endw] &= endBits(last);
} else {
- _words[startw] &= (startBits(start) | endBits(last));
+ _words[startw] &= (startBits(range.start()) | endBits(last));
}
}
void
-BitVector::setInterval(Index start, Index end)
+BitVector::setInterval(Index start_in, Index end_in)
{
- if (start >= end) { return; }
+ Range range = sanitize(Range(start_in, end_in));
+ if ( ! range.validNonZero()) { return; }
- Index last = std::min(end, size()) - 1;
- Index startw = wordNum(start);
+ Index last = range.end() - 1;
+ Index startw = wordNum(range.start());
Index endw = wordNum(last);
if (endw > startw) {
- _words[startw++] |= checkTab(start);
+ _words[startw++] |= checkTab(range.start());
memset(_words + startw, 0xff, sizeof(*_words)*(endw-startw));
_words[endw] |= ~endBits(last);
} else {
- _words[startw] |= ~(startBits(start) | endBits(last));
+ _words[startw] |= ~(startBits(range.start()) | endBits(last));
}
invalidateCachedCount();
@@ -131,28 +133,28 @@ BitVector::setInterval(Index start, Index end)
BitVector::Index
BitVector::count() const
{
- // Subtract by one to compensate for guard bit
- return countInterval(getStartIndex(), getEndIndex());
+ return countInterval(Range(getStartIndex(), size()));
}
BitVector::Index
-BitVector::countInterval(Index start, Index end) const
+BitVector::countInterval(Range range_in) const
{
- if (start >= end) return 0;
+ Range range = sanitize(range_in);
+ if ( ! range.validNonZero()) { return 0; }
- Index last = std::min(end, size()) - 1;
+ Index last = range.end() - 1;
// Count bits in range [start..end>
- Index startw = wordNum(start);
+ Index startw = wordNum(range.start());
Index endw = wordNum(last);
Word *bitValues = _words;
if (startw == endw) {
- return Optimized::popCount(bitValues[startw] & ~(startBits(start) | endBits(last)));
+ return Optimized::popCount(bitValues[startw] & ~(startBits(range.start()) | endBits(last)));
}
Index res = 0;
// Limit to full words
- if ((start & (WordLen - 1)) != 0) {
- res += Optimized::popCount(bitValues[startw] & ~startBits(start));
+ if ((range.start() & (WordLen - 1)) != 0) {
+ res += Optimized::popCount(bitValues[startw] & ~startBits(range.start()));
++startw;
}
// Align start to 16 bytes
@@ -177,9 +179,20 @@ BitVector::countInterval(Index start, Index end) const
void
BitVector::orWith(const BitVector & right)
{
- verifyContains(*this, right);
- IAccelrated::getAccelrator().orBit(getActiveStart(), right.getWordIndex(getStartIndex()), getActiveBytes());
-
+ verifyInclusiveStart(*this, right);
+
+ if (right.size() < size()) {
+ if (right.size() > 0) {
+ ssize_t commonBytes = numActiveBytes(getStartIndex(), right.size()) - sizeof(Word);
+ if (commonBytes > 0) {
+ IAccelrated::getAccelrator().orBit(getActiveStart(), right.getWordIndex(getStartIndex()), commonBytes);
+ }
+ Index last(right.size() - 1);
+ getWordIndex(last)[0] |= (right.getWordIndex(last)[0] & ~endBits(last));
+ }
+ } else {
+ IAccelrated::getAccelrator().orBit(getActiveStart(), right.getWordIndex(getStartIndex()), getActiveBytes());
+ }
repairEnds();
invalidateCachedCount();
}
@@ -187,11 +200,12 @@ BitVector::orWith(const BitVector & right)
void
BitVector::repairEnds()
{
- if (size() == 0) return;
- Index start(getStartIndex());
- Index last(size() - 1);
- getWordIndex(start)[0] &= ~startBits(start);
- getWordIndex(last)[0] &= ~endBits(last);
+ if (size() != 0) {
+ Index start(getStartIndex());
+ Index last(size() - 1);
+ getWordIndex(start)[0] &= ~startBits(start);
+ getWordIndex(last)[0] &= ~endBits(last);
+ }
setGuardBit();
}
@@ -199,11 +213,15 @@ BitVector::repairEnds()
void
BitVector::andWith(const BitVector & right)
{
- verifyContains(*this, right);
+ verifyInclusiveStart(*this, right);
- IAccelrated::getAccelrator().andBit(getActiveStart(), right.getWordIndex(getStartIndex()), getActiveBytes());
+ uint32_t commonBytes = std::min(getActiveBytes(), numActiveBytes(getStartIndex(), right.size()));
+ IAccelrated::getAccelrator().andBit(getActiveStart(), right.getWordIndex(getStartIndex()), commonBytes);
+ if (right.size() < size()) {
+ clearInterval(right.size(), size());
+ }
- setGuardBit();
+ repairEnds();
invalidateCachedCount();
}
@@ -211,11 +229,22 @@ BitVector::andWith(const BitVector & right)
void
BitVector::andNotWith(const BitVector& right)
{
- verifyContains(*this, right);
-
- IAccelrated::getAccelrator().andNotBit(getActiveStart(), right.getWordIndex(getStartIndex()), getActiveBytes());
+ verifyInclusiveStart(*this, right);
+
+ if (right.size() < size()) {
+ if (right.size() > 0) {
+ ssize_t commonBytes = numActiveBytes(getStartIndex(), right.size()) - sizeof(Word);
+ if (commonBytes > 0) {
+ IAccelrated::getAccelrator().andNotBit(getActiveStart(), right.getWordIndex(getStartIndex()), commonBytes);
+ }
+ Index last(right.size() - 1);
+ getWordIndex(last)[0] &= ~(right.getWordIndex(last)[0] & ~endBits(last));
+ }
+ } else {
+ IAccelrated::getAccelrator().andNotBit(getActiveStart(), right.getWordIndex(getStartIndex()), getActiveBytes());
+ }
- setGuardBit();
+ repairEnds();
invalidateCachedCount();
}
@@ -329,8 +358,8 @@ BitVector::create(Index start, Index end)
BitVector::UP
BitVector::create(const BitVector & org, Index start, Index end)
{
- return (start == 0)
- ? create(end)
+ return ((start == 0) && (end == org.size()) && (org.getStartIndex() == 0))
+ ? create(org)
: std::make_unique<PartialBitVector>(org, start, end);
}
diff --git a/searchlib/src/vespa/searchlib/common/bitvector.h b/searchlib/src/vespa/searchlib/common/bitvector.h
index 9671e41df24..951a8ec9d88 100644
--- a/searchlib/src/vespa/searchlib/common/bitvector.h
+++ b/searchlib/src/vespa/searchlib/common/bitvector.h
@@ -23,10 +23,20 @@ class PartialBitVector;
class BitVector : protected BitWord
{
public:
- typedef BitWord::Index Index;
- typedef vespalib::GenerationHolder GenerationHolder;
- typedef vespalib::GenerationHeldBase GenerationHeldBase;
- typedef std::unique_ptr<BitVector> UP;
+ using Index = BitWord::Index;
+ using GenerationHolder = vespalib::GenerationHolder;
+ using GenerationHeldBase = vespalib::GenerationHeldBase;
+ using UP = std::unique_ptr<BitVector>;
+ class Range {
+ public:
+ Range(Index start_in, Index end_in) : _start(start_in), _end(end_in) {}
+ Index start() const { return _start; }
+ Index end() const { return _end; }
+ bool validNonZero() const { return _end > _start; }
+ private:
+ Index _start;
+ Index _end;
+ };
BitVector(const BitVector &) = delete;
BitVector& operator = (const BitVector &) = delete;
virtual ~BitVector() = default;
@@ -56,7 +66,6 @@ public:
* @return The Index of the first valid bit of the bitvector.
*/
Index getStartIndex() const { return _startOffset; }
- Index getEndIndex() const { return getStartIndex() + size(); }
/**
* Get next bit set in the bitvector (inclusive start).
@@ -73,7 +82,7 @@ public:
}
/**
- * Iterate over all true bits in th einclusive range.
+ * Iterate over all true bits in the inclusive range.
*
* @param func callback
* @param start first bit
@@ -86,7 +95,7 @@ public:
}
/**
- * Iterate over all true bits in th einclusive range.
+ * Iterate over all true bits in the inclusive range.
*
* @param func callback
* @param start first bit
@@ -207,7 +216,10 @@ public:
* @param start first bit to be counted
* @param end limit
*/
- Index countInterval(Index start, Index end) const;
+ Index countInterval(Index start, Index end) const {
+ return countInterval(Range(start, end));
+ }
+ Index countInterval(Range range) const;
/**
* Perform an andnot with an internal array representation.
@@ -257,7 +269,7 @@ protected:
void init(void * buf, Index start, Index end);
void updateCount() const { _numTrueBits.store(count(), std::memory_order_relaxed); }
void setTrueBits(Index numTrueBits) { _numTrueBits.store(numTrueBits, std::memory_order_relaxed); }
- VESPA_DLL_LOCAL void clearIntervalNoInvalidation(Index start, Index end);
+ VESPA_DLL_LOCAL void clearIntervalNoInvalidation(Range range);
bool isValidCount() const { return isValidCount(_numTrueBits.load(std::memory_order_relaxed)); }
static bool isValidCount(Index v) { return v != invalidCount(); }
static Index numWords(Index bits) { return wordNum(bits + 1 + (WordLen - 1)); }
@@ -283,7 +295,9 @@ private:
Index getActiveSize() const { return size() - getStartIndex(); }
size_t getActiveBytes() const { return numActiveBytes(getStartIndex(), size()); }
size_t numActiveWords() const { return numActiveWords(getStartIndex(), size()); }
- static size_t numActiveWords(Index start, Index end) { return (numWords(end) - wordNum(start)); }
+ static size_t numActiveWords(Index start, Index end) {
+ return (end >= start) ? (numWords(end) - wordNum(start)) : 0;
+ }
static Index invalidCount() { return std::numeric_limits<Index>::max(); }
void setGuardBit() { setBit(size()); }
void incNumBits() {
@@ -298,6 +312,10 @@ private:
}
}
VESPA_DLL_LOCAL void repairEnds();
+ Range sanitize(Range range) const {
+ return Range(std::max(range.start(), getStartIndex()),
+ std::min(range.end(), size()));
+ }
Index count() const;
bool hasTrueBitsInternal() const;
template <typename FunctionType, typename WordConverter>
diff --git a/searchlib/src/vespa/searchlib/queryeval/andsearch.cpp b/searchlib/src/vespa/searchlib/queryeval/andsearch.cpp
index 57d7e8c7506..3cbb30e5f89 100644
--- a/searchlib/src/vespa/searchlib/queryeval/andsearch.cpp
+++ b/searchlib/src/vespa/searchlib/queryeval/andsearch.cpp
@@ -5,8 +5,7 @@
#include "termwise_helper.h"
#include <vespa/searchlib/common/bitvector.h>
-namespace search {
-namespace queryeval {
+namespace search::queryeval {
BitVector::UP
AndSearch::get_hits(uint32_t begin_id) {
@@ -24,12 +23,14 @@ AndSearch::and_hits_into(BitVector &result, uint32_t begin_id)
TermwiseHelper::andChildren(result, getChildren().begin(), getChildren().end(), begin_id);
}
-SearchIterator::UP AndSearch::andWith(UP filter, uint32_t estimate_)
+SearchIterator::UP
+AndSearch::andWith(UP filter, uint32_t estimate_)
{
return offerFilterToChildren(std::move(filter), estimate_);
}
-SearchIterator::UP AndSearch::offerFilterToChildren(UP filter, uint32_t estimate_)
+SearchIterator::UP
+AndSearch::offerFilterToChildren(UP filter, uint32_t estimate_)
{
const Children & children(getChildren());
for (uint32_t i(0); filter && (i < children.size()); ++i) {
@@ -38,7 +39,8 @@ SearchIterator::UP AndSearch::offerFilterToChildren(UP filter, uint32_t estimate
return filter;
}
-void AndSearch::doUnpack(uint32_t docid)
+void
+AndSearch::doUnpack(uint32_t docid)
{
const Children & children(getChildren());
for (uint32_t i(0); i < children.size(); ++i) {
@@ -126,5 +128,4 @@ AndSearch::create(const MultiSearch::Children &children, bool strict, const Unpa
}
}
-} // namespace queryeval
-} // namespace search
+}
diff --git a/searchlib/src/vespa/searchlib/queryeval/simplesearch.cpp b/searchlib/src/vespa/searchlib/queryeval/simplesearch.cpp
index 58f217f106f..1e5ba8d0c27 100644
--- a/searchlib/src/vespa/searchlib/queryeval/simplesearch.cpp
+++ b/searchlib/src/vespa/searchlib/queryeval/simplesearch.cpp
@@ -3,8 +3,7 @@
#include "simplesearch.h"
#include <vespa/vespalib/objects/visit.h>
-namespace search {
-namespace queryeval {
+namespace search::queryeval {
void
SimpleSearch::doSeek(uint32_t docid)
@@ -38,9 +37,6 @@ SimpleSearch::visitMembers(vespalib::ObjectVisitor &visitor) const
visit(visitor, "tag", _tag);
}
-SimpleSearch::~SimpleSearch()
-{
-}
+SimpleSearch::~SimpleSearch() = default;
-} // namespace queryeval
-} // namespace search
+}
diff --git a/searchlib/src/vespa/searchlib/queryeval/simplesearch.h b/searchlib/src/vespa/searchlib/queryeval/simplesearch.h
index f8a9c61a393..8dfec9abd4a 100644
--- a/searchlib/src/vespa/searchlib/queryeval/simplesearch.h
+++ b/searchlib/src/vespa/searchlib/queryeval/simplesearch.h
@@ -5,8 +5,7 @@
#include "searchiterator.h"
#include "simpleresult.h"
-namespace search {
-namespace queryeval {
+namespace search::queryeval {
/**
* Simple search class used to return a predefined set of
@@ -36,6 +35,4 @@ public:
~SimpleSearch();
};
-} // namespace queryeval
-} // namespace search
-
+}
diff --git a/searchlib/src/vespa/searchlib/queryeval/sourceblendersearch.cpp b/searchlib/src/vespa/searchlib/queryeval/sourceblendersearch.cpp
index 23a0d2d52a6..3280e0ac2cc 100644
--- a/searchlib/src/vespa/searchlib/queryeval/sourceblendersearch.cpp
+++ b/searchlib/src/vespa/searchlib/queryeval/sourceblendersearch.cpp
@@ -6,8 +6,7 @@
#include <vespa/vespalib/objects/visit.hpp>
#include <vespa/vespalib/util/array.hpp>
-namespace search {
-namespace queryeval {
+namespace search::queryeval {
EmptySearch SourceBlenderSearch::_emptySearch;
@@ -91,13 +90,13 @@ SourceBlenderSearchStrict::advance()
return;
}
search = getSearch(_sourceSelector->getSource(minNextId));
- for (uint32_t i = 0; i < _nextChildren.size(); ++i) {
- if (_nextChildren[i] == search) {
+ for (SearchIterator * child : _nextChildren) {
+ if (child == search) {
_matchedChild = search;
setDocId(minNextId);
return;
}
- _nextChildren[i]->seek(minNextId + 1);
+ child->seek(minNextId + 1);
}
}
}
@@ -111,7 +110,7 @@ SourceBlenderSearch::doUnpack(uint32_t docid)
SourceBlenderSearch::SourceBlenderSearch(
std::unique_ptr<sourceselector::Iterator> sourceSelector,
const Children &children) :
- _matchedChild(NULL),
+ _matchedChild(nullptr),
_sourceSelector(std::move(sourceSelector)),
_children(),
_docIdLimit(_sourceSelector->getDocIdLimit())
@@ -155,7 +154,7 @@ SourceBlenderSearch::~SourceBlenderSearch()
void
SourceBlenderSearch::setChild(size_t index, SearchIterator::UP child) {
- assert(_sources[_children[index]] == NULL);
+ assert(_sources[_children[index]] == nullptr);
_sources[_children[index]] = child.release();
}
@@ -170,9 +169,7 @@ SourceBlenderSearch::create(std::unique_ptr<sourceselector::Iterator> sourceSele
}
}
-
-} // namespace queryeval
-} // namespace search
+}
void visit(vespalib::ObjectVisitor &self, const vespalib::string &name,
const search::queryeval::SourceBlenderSearch::Child &obj)
diff --git a/searchlib/src/vespa/searchlib/queryeval/sourceblendersearch.h b/searchlib/src/vespa/searchlib/queryeval/sourceblendersearch.h
index 3e51f7f6a1b..9b4d8f58034 100644
--- a/searchlib/src/vespa/searchlib/queryeval/sourceblendersearch.h
+++ b/searchlib/src/vespa/searchlib/queryeval/sourceblendersearch.h
@@ -6,8 +6,7 @@
#include "emptysearch.h"
#include <vector>
-namespace search {
-namespace queryeval {
+namespace search::queryeval {
namespace sourceselector { class Iterator; }
/**
@@ -29,7 +28,7 @@ public:
struct Child {
SearchIterator *search;
uint32_t sourceId;
- Child() : search(NULL), sourceId(0) { }
+ Child() : search(nullptr), sourceId(0) { }
Child(SearchIterator *s, uint32_t id) : search(s), sourceId(id) {}
};
typedef std::vector<Child> Children;
@@ -71,19 +70,18 @@ public:
**/
static SourceBlenderSearch * create(std::unique_ptr<Iterator> sourceSelector,
const Children &children, bool strict);
- virtual ~SourceBlenderSearch();
+ ~SourceBlenderSearch() override;
size_t getNumChildren() const { return _children.size(); }
SearchIterator::UP steal(size_t index) {
SearchIterator::UP retval(_sources[_children[index]]);
- _sources[_children[index]] = NULL;
+ _sources[_children[index]] = nullptr;
return retval;
}
void setChild(size_t index, SearchIterator::UP child);
void initRange(uint32_t beginId, uint32_t endId) override;
};
-} // namespace queryeval
-} // namespace search
+}
void visit(vespalib::ObjectVisitor &self, const vespalib::string &name,
const search::queryeval::SourceBlenderSearch::Child &obj);
diff --git a/searchlib/src/vespa/searchlib/queryeval/termwise_blueprint_helper.cpp b/searchlib/src/vespa/searchlib/queryeval/termwise_blueprint_helper.cpp
index 3eddda57ccc..ae21fd93ba3 100644
--- a/searchlib/src/vespa/searchlib/queryeval/termwise_blueprint_helper.cpp
+++ b/searchlib/src/vespa/searchlib/queryeval/termwise_blueprint_helper.cpp
@@ -3,8 +3,7 @@
#include "termwise_blueprint_helper.h"
#include "termwise_search.h"
-namespace search {
-namespace queryeval {
+namespace search::queryeval {
TermwiseBlueprintHelper::TermwiseBlueprintHelper(const IntermediateBlueprint &self,
const MultiSearch::Children &subSearches,
@@ -32,7 +31,7 @@ TermwiseBlueprintHelper::TermwiseBlueprintHelper(const IntermediateBlueprint &se
}
}
-TermwiseBlueprintHelper::~TermwiseBlueprintHelper() { }
+TermwiseBlueprintHelper::~TermwiseBlueprintHelper() = default;
void
TermwiseBlueprintHelper::insert_termwise(SearchIterator::UP search, bool strict)
@@ -41,5 +40,4 @@ TermwiseBlueprintHelper::insert_termwise(SearchIterator::UP search, bool strict)
children.insert(children.begin() + first_termwise, termwise_search.release());
}
-} // namespace queryeval
-} // namespace search
+}
diff --git a/searchlib/src/vespa/searchlib/queryeval/termwise_blueprint_helper.h b/searchlib/src/vespa/searchlib/queryeval/termwise_blueprint_helper.h
index 335daeae7f0..e6b46cfb7d2 100644
--- a/searchlib/src/vespa/searchlib/queryeval/termwise_blueprint_helper.h
+++ b/searchlib/src/vespa/searchlib/queryeval/termwise_blueprint_helper.h
@@ -7,8 +7,7 @@
#include "unpackinfo.h"
#include "searchiterator.h"
-namespace search {
-namespace queryeval {
+namespace search::queryeval {
/**
* Utility used to keep track of which children can be evaluated
@@ -28,5 +27,4 @@ struct TermwiseBlueprintHelper {
void insert_termwise(SearchIterator::UP search, bool strict);
};
-} // namespace queryeval
-} // namespace search
+}
diff --git a/searchlib/src/vespa/searchlib/queryeval/termwise_helper.h b/searchlib/src/vespa/searchlib/queryeval/termwise_helper.h
index d2be71f3ab8..8abcf6e0e42 100644
--- a/searchlib/src/vespa/searchlib/queryeval/termwise_helper.h
+++ b/searchlib/src/vespa/searchlib/queryeval/termwise_helper.h
@@ -5,9 +5,7 @@
#include "searchiterator.h"
#include <vespa/searchlib/common/bitvector.h>
-namespace search {
-
-namespace queryeval {
+namespace search::queryeval {
/**
* Helper methods for doing termwise evaluation.
@@ -132,4 +130,3 @@ TermwiseHelper::orIterators(BitVector & result, IT begin, IT end, uint32_t begin
}
}
-}
diff --git a/searchlib/src/vespa/searchlib/queryeval/termwise_search.cpp b/searchlib/src/vespa/searchlib/queryeval/termwise_search.cpp
index e7df5aa6bae..2f00b249795 100644
--- a/searchlib/src/vespa/searchlib/queryeval/termwise_search.cpp
+++ b/searchlib/src/vespa/searchlib/queryeval/termwise_search.cpp
@@ -4,8 +4,7 @@
#include <vespa/vespalib/objects/visit.h>
#include <vespa/searchlib/common/bitvector.h>
-namespace search {
-namespace queryeval {
+namespace search::queryeval {
template <bool IS_STRICT>
struct TermwiseSearch : public SearchIterator {
@@ -64,5 +63,4 @@ make_termwise(SearchIterator::UP search, bool strict)
}
}
-} // namespace queryeval
-} // namespace search
+}
diff --git a/searchlib/src/vespa/searchlib/queryeval/termwise_search.h b/searchlib/src/vespa/searchlib/queryeval/termwise_search.h
index 2446c5dc847..193f2f86ed7 100644
--- a/searchlib/src/vespa/searchlib/queryeval/termwise_search.h
+++ b/searchlib/src/vespa/searchlib/queryeval/termwise_search.h
@@ -4,8 +4,7 @@
#include "searchiterator.h"
-namespace search {
-namespace queryeval {
+namespace search::queryeval {
/**
* Creates a termwise wrapper for the given search. The wrapper will
@@ -23,5 +22,4 @@ namespace queryeval {
**/
SearchIterator::UP make_termwise(SearchIterator::UP search, bool strict);
-} // namespace queryeval
-} // namespace search
+}
diff --git a/searchlib/src/vespa/searchlib/queryeval/truesearch.cpp b/searchlib/src/vespa/searchlib/queryeval/truesearch.cpp
index a5a179230e5..b585647fb3e 100644
--- a/searchlib/src/vespa/searchlib/queryeval/truesearch.cpp
+++ b/searchlib/src/vespa/searchlib/queryeval/truesearch.cpp
@@ -2,8 +2,7 @@
#include "truesearch.h"
-namespace search {
-namespace queryeval {
+namespace search::queryeval {
void
TrueSearch::doSeek(uint32_t docid)
@@ -24,9 +23,6 @@ TrueSearch::TrueSearch(fef::TermFieldMatchData & tfmd) :
_tfmd.resetOnlyDocId(0);
}
-TrueSearch::~TrueSearch()
-{
-}
+TrueSearch::~TrueSearch() = default;
-} // namespace queryeval
-} // namespace search
+}
diff --git a/searchlib/src/vespa/searchlib/queryeval/truesearch.h b/searchlib/src/vespa/searchlib/queryeval/truesearch.h
index deaafd82351..6cf1e4dec02 100644
--- a/searchlib/src/vespa/searchlib/queryeval/truesearch.h
+++ b/searchlib/src/vespa/searchlib/queryeval/truesearch.h
@@ -2,11 +2,10 @@
#pragma once
-#include <vespa/searchlib/fef/termfieldmatchdata.h>
#include "searchiterator.h"
+#include <vespa/searchlib/fef/termfieldmatchdata.h>
-namespace search {
-namespace queryeval {
+namespace search::queryeval {
class TrueSearch : public SearchIterator
{
@@ -21,5 +20,4 @@ public:
~TrueSearch();
};
-} // namespace queryeval
-} // namespace search
+}