aboutsummaryrefslogtreecommitdiffstats
path: root/vsm
diff options
context:
space:
mode:
authorHenning Baldersheim <balder@yahoo-inc.com>2019-01-14 11:27:51 +0000
committerHenning Baldersheim <balder@yahoo-inc.com>2019-01-14 13:39:03 +0000
commit87a1a5e68e554245e4fdece8025e401b633b8551 (patch)
tree0727ef9c567bfc65a9e7c501ba9fc6cc69f4be24 /vsm
parent2ec9429eb01e6dfdc801d588904723aa12cdf631 (diff)
Also handle bool queries in streaming search.
Diffstat (limited to 'vsm')
-rw-r--r--vsm/src/tests/searcher/searcher.cpp26
-rw-r--r--vsm/src/vespa/vsm/searcher/CMakeLists.txt1
-rw-r--r--vsm/src/vespa/vsm/searcher/boolfieldsearcher.cpp52
-rw-r--r--vsm/src/vespa/vsm/searcher/boolfieldsearcher.h21
-rw-r--r--vsm/src/vespa/vsm/searcher/intfieldsearcher.cpp2
-rw-r--r--vsm/src/vespa/vsm/searcher/intfieldsearcher.h1
-rw-r--r--vsm/src/vespa/vsm/vsm/fieldsearchspec.cpp4
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: