diff options
author | Henning Baldersheim <balder@yahoo-inc.com> | 2019-01-14 11:27:51 +0000 |
---|---|---|
committer | Henning Baldersheim <balder@yahoo-inc.com> | 2019-01-14 13:39:03 +0000 |
commit | 87a1a5e68e554245e4fdece8025e401b633b8551 (patch) | |
tree | 0727ef9c567bfc65a9e7c501ba9fc6cc69f4be24 /vsm/src | |
parent | 2ec9429eb01e6dfdc801d588904723aa12cdf631 (diff) |
Also handle bool queries in streaming search.
Diffstat (limited to 'vsm/src')
-rw-r--r-- | vsm/src/tests/searcher/searcher.cpp | 26 | ||||
-rw-r--r-- | vsm/src/vespa/vsm/searcher/CMakeLists.txt | 1 | ||||
-rw-r--r-- | vsm/src/vespa/vsm/searcher/boolfieldsearcher.cpp | 52 | ||||
-rw-r--r-- | vsm/src/vespa/vsm/searcher/boolfieldsearcher.h | 21 | ||||
-rw-r--r-- | vsm/src/vespa/vsm/searcher/intfieldsearcher.cpp | 2 | ||||
-rw-r--r-- | vsm/src/vespa/vsm/searcher/intfieldsearcher.h | 1 | ||||
-rw-r--r-- | vsm/src/vespa/vsm/vsm/fieldsearchspec.cpp | 4 |
7 files changed, 103 insertions, 4 deletions
diff --git a/vsm/src/tests/searcher/searcher.cpp b/vsm/src/tests/searcher/searcher.cpp index a83c4e6b348..f5f7508a256 100644 --- a/vsm/src/tests/searcher/searcher.cpp +++ b/vsm/src/tests/searcher/searcher.cpp @@ -6,6 +6,7 @@ #include <vespa/vsm/searcher/floatfieldsearcher.h> #include <vespa/vsm/searcher/futf8strchrfieldsearcher.h> #include <vespa/vsm/searcher/intfieldsearcher.h> +#include <vespa/vsm/searcher/boolfieldsearcher.h> #include <vespa/vsm/searcher/utf8flexiblestringfieldsearcher.h> #include <vespa/vsm/searcher/utf8exactstringfieldsearcher.h> #include <vespa/vsm/searcher/utf8substringsearcher.h> @@ -113,7 +114,7 @@ SnippetModifierSetup::SnippetModifierSetup(const StringList & terms) { searcher->prepare(query.qtl, buf); } -SnippetModifierSetup::~SnippetModifierSetup() {} +SnippetModifierSetup::~SnippetModifierSetup() = default; // helper functions ArrayFieldValue getFieldValue(const StringList &fv); @@ -153,6 +154,13 @@ void assertInt(IntFieldSearcher & fs, const std::string &term, int64_t field, bo assertInt(fs, StringList().add(term), field, BoolList().add(exp)); } +void assertBool(BoolFieldSearcher & fs, const StringList &query, bool field, const BoolList &exp) { + assertNumeric(fs, query, BoolFieldValue(field), exp); +} +void assertBool(BoolFieldSearcher & fs, const std::string &term, bool field, bool exp) { + assertBool(fs, StringList().add(term), field, BoolList().add(exp)); +} + void assertInt(IntFieldSearcher & fs, const StringList &query, const LongList &field, const HitsList &exp) { assertSearch(fs, query, getFieldValue(field), exp); } @@ -595,9 +603,23 @@ TEST("utf8 flexible searcher"){ EXPECT_TRUE(testStringFieldInfo(fs)); } +TEST("bool search") { + BoolFieldSearcher fs(0); + TEST_DO(assertBool(fs, "true", true, true)); + TEST_DO(assertBool(fs, "true", false, false)); + TEST_DO(assertBool(fs, "1", true, true)); + TEST_DO(assertBool(fs, "1", false, false)); + TEST_DO(assertBool(fs, "false", true, false)); + TEST_DO(assertBool(fs, "false", false, true)); + TEST_DO(assertBool(fs, "0", true, false)); + TEST_DO(assertBool(fs, "0", false, true)); + TEST_DO(assertBool(fs, StringList().add("true").add("false").add("true"), true, BoolList().add(true).add(false).add(true))); + TEST_DO(assertBool(fs, StringList().add("true").add("false").add("true"), false, BoolList().add(false).add(true).add(false))); +} + TEST("integer search") { - IntFieldSearcher fs; + IntFieldSearcher fs(0); TEST_DO(assertInt(fs, "10", 10, true)); TEST_DO(assertInt(fs, "9", 10, false)); TEST_DO(assertInt(fs, ">9", 10, true)); diff --git a/vsm/src/vespa/vsm/searcher/CMakeLists.txt b/vsm/src/vespa/vsm/searcher/CMakeLists.txt index 205a5abef42..cecdd2c5ca9 100644 --- a/vsm/src/vespa/vsm/searcher/CMakeLists.txt +++ b/vsm/src/vespa/vsm/searcher/CMakeLists.txt @@ -1,6 +1,7 @@ # Copyright 2017 Yahoo Holdings. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root. vespa_add_library(vsm_vsmsearcher OBJECT SOURCES + boolfieldsearcher.cpp fieldsearcher.cpp floatfieldsearcher.cpp fold.cpp diff --git a/vsm/src/vespa/vsm/searcher/boolfieldsearcher.cpp b/vsm/src/vespa/vsm/searcher/boolfieldsearcher.cpp new file mode 100644 index 00000000000..bf40a679bab --- /dev/null +++ b/vsm/src/vespa/vsm/searcher/boolfieldsearcher.cpp @@ -0,0 +1,52 @@ +// Copyright 2019 Yahoo Holdings. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root. +#include "boolfieldsearcher.h" +#include <vespa/document/fieldvalue/boolfieldvalue.h> + +using search::QueryTerm; +using search::QueryTermList; + +namespace vsm { + +namespace { +vespalib::stringref TRUE = "true"; +vespalib::stringref FALSE = "false"; +} + +IMPLEMENT_DUPLICATE(BoolFieldSearcher); + +BoolFieldSearcher::BoolFieldSearcher(FieldIdT fId) : + FieldSearcher(fId), + _terms() +{ } + +BoolFieldSearcher::~BoolFieldSearcher() = default; + +void BoolFieldSearcher::prepare(QueryTermList & qtl, const SharedSearcherBuf & buf) +{ + _terms.clear(); + FieldSearcher::prepare(qtl, buf); + for (const QueryTerm * qt : qtl) { + if (TRUE == qt->getTerm()) { + _terms.push_back(true); + } else if (FALSE == qt->getTerm()) { + _terms.push_back(false); + } else { + int64_t low; + int64_t high; + bool valid = qt->getAsIntegerTerm(low, high); + _terms.push_back(valid && (low > 0)); + } + } +} + +void BoolFieldSearcher::onValue(const document::FieldValue & fv) +{ + for(size_t j=0, jm(_terms.size()); j < jm; j++) { + if (static_cast<const document::BoolFieldValue &>(fv).getValue() == _terms[j]) { + addHit(*_qtl[j], 0); + } + } + ++_words; +} + +} diff --git a/vsm/src/vespa/vsm/searcher/boolfieldsearcher.h b/vsm/src/vespa/vsm/searcher/boolfieldsearcher.h new file mode 100644 index 00000000000..139645bf0ba --- /dev/null +++ b/vsm/src/vespa/vsm/searcher/boolfieldsearcher.h @@ -0,0 +1,21 @@ +// Copyright 2019 Yahoo Holdings. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root. +#pragma once + +#include "fieldsearcher.h" + +namespace vsm { + +class BoolFieldSearcher : public FieldSearcher +{ +public: + DUPLICATE(BoolFieldSearcher); + BoolFieldSearcher(FieldIdT fId); + ~BoolFieldSearcher(); + void prepare(search::QueryTermList & qtl, const SharedSearcherBuf & buf) override; + void onValue(const document::FieldValue & fv) override; +private: + std::vector<bool> _terms; +}; + +} + diff --git a/vsm/src/vespa/vsm/searcher/intfieldsearcher.cpp b/vsm/src/vespa/vsm/searcher/intfieldsearcher.cpp index 1f06d37b80f..30d9992e2d4 100644 --- a/vsm/src/vespa/vsm/searcher/intfieldsearcher.cpp +++ b/vsm/src/vespa/vsm/searcher/intfieldsearcher.cpp @@ -13,7 +13,7 @@ IntFieldSearcher::IntFieldSearcher(FieldIdT fId) : _intTerm() { } -IntFieldSearcher::~IntFieldSearcher() {} +IntFieldSearcher::~IntFieldSearcher() = default; void IntFieldSearcher::prepare(QueryTermList & qtl, const SharedSearcherBuf & buf) { diff --git a/vsm/src/vespa/vsm/searcher/intfieldsearcher.h b/vsm/src/vespa/vsm/searcher/intfieldsearcher.h index 67c235f6577..3e158b2d93c 100644 --- a/vsm/src/vespa/vsm/searcher/intfieldsearcher.h +++ b/vsm/src/vespa/vsm/searcher/intfieldsearcher.h @@ -20,7 +20,6 @@ protected: IntInfo(int64_t low, int64_t high, bool v) : _lower(low), _upper(high), _valid(v) { if (low > high) { _lower = high; _upper = low; } } bool cmp(int64_t key) const { return (_lower <= key) && (key <= _upper); } bool valid() const { return _valid; } - void setValid(bool v) { _valid = v; } private: int64_t _lower; int64_t _upper; diff --git a/vsm/src/vespa/vsm/vsm/fieldsearchspec.cpp b/vsm/src/vespa/vsm/vsm/fieldsearchspec.cpp index b21177a6810..351c2d1da0d 100644 --- a/vsm/src/vespa/vsm/vsm/fieldsearchspec.cpp +++ b/vsm/src/vespa/vsm/vsm/fieldsearchspec.cpp @@ -8,6 +8,7 @@ #include <vespa/vsm/searcher/utf8exactstringfieldsearcher.h> #include <vespa/vsm/searcher/futf8strchrfieldsearcher.h> #include <vespa/vsm/searcher/intfieldsearcher.h> +#include <vespa/vsm/searcher/boolfieldsearcher.h> #include <vespa/vsm/searcher/floatfieldsearcher.h> #include <vespa/vespalib/util/regexp.h> @@ -84,6 +85,9 @@ FieldSearchSpec::FieldSearchSpec(const FieldIdT & fid, const vespalib::string & _searcher = FUTF8StrChrFieldSearcher(fid); } break; + case VsmfieldsConfig::Fieldspec::BOOL: + _searcher = BoolFieldSearcher(fid); + break; case VsmfieldsConfig::Fieldspec::INT8: case VsmfieldsConfig::Fieldspec::INT16: case VsmfieldsConfig::Fieldspec::INT32: |