summaryrefslogtreecommitdiffstats
path: root/searchlib/src/tests/query/stackdumpquerycreator_test.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'searchlib/src/tests/query/stackdumpquerycreator_test.cpp')
-rw-r--r--searchlib/src/tests/query/stackdumpquerycreator_test.cpp116
1 files changed, 116 insertions, 0 deletions
diff --git a/searchlib/src/tests/query/stackdumpquerycreator_test.cpp b/searchlib/src/tests/query/stackdumpquerycreator_test.cpp
new file mode 100644
index 00000000000..269947b7059
--- /dev/null
+++ b/searchlib/src/tests/query/stackdumpquerycreator_test.cpp
@@ -0,0 +1,116 @@
+// Copyright 2016 Yahoo Inc. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root.
+// Unit tests for stackdumpquerycreator.
+
+#include <vespa/fastos/fastos.h>
+#include <vespa/log/log.h>
+LOG_SETUP("stackdumpquerycreator_test");
+
+#include <vespa/searchlib/parsequery/parse.h>
+#include <vespa/searchlib/parsequery/stackdumpiterator.h>
+#include <vespa/searchlib/query/tree/simplequery.h>
+#include <vespa/searchlib/query/tree/stackdumpquerycreator.h>
+#include <vespa/searchlib/util/rawbuf.h>
+#include <vespa/vespalib/testkit/testapp.h>
+
+using search::ParseItem;
+using search::RawBuf;
+using search::SimpleQueryStackDumpIterator;
+using std::string;
+using namespace search::query;
+
+namespace {
+
+template <typename T>
+void append(RawBuf &buf, T i) {
+ buf.preAlloc(sizeof(T));
+ buf.PutToInet(i);
+}
+
+void appendString(RawBuf &buf, const string &s) {
+ buf.preAlloc(sizeof(uint32_t) + s.size());
+ buf.appendCompressedPositiveNumber(s.size());
+ buf.append(s.data(), s.size());
+}
+
+void appendNumTerm(RawBuf &buf, const string &term_string) {
+ uint8_t typefield = ParseItem::ITEM_NUMTERM |
+ ParseItem::IF_WEIGHT |
+ ParseItem::IF_UNIQUEID;
+ buf.append(typefield);
+ buf.appendCompressedNumber(2); // weight
+ buf.appendCompressedPositiveNumber(42); // id
+ appendString(buf, "view_name");
+ appendString(buf, term_string);
+}
+
+TEST("requireThatTooLargeNumTermIsTreatedAsFloat") {
+ const string term_string("99999999999999999999999999999999999");
+ RawBuf buf(1024);
+ appendNumTerm(buf, term_string);
+
+ SimpleQueryStackDumpIterator query_stack(vespalib::stringref(buf.GetDrainPos(), buf.GetUsedLen()));
+ Node::UP node =
+ StackDumpQueryCreator<SimpleQueryNodeTypes>::create(query_stack);
+ ASSERT_TRUE(node.get());
+ NumberTerm *term = dynamic_cast<NumberTerm *>(node.get());
+ ASSERT_TRUE(term);
+ EXPECT_EQUAL(term_string, term->getTerm());
+}
+
+TEST("requireThatTooLargeFloatNumTermIsTreatedAsFloat") {
+ const string term_string = "1" + string(310, '0') + ".20";
+ RawBuf buf(1024);
+ appendNumTerm(buf, term_string);
+
+ SimpleQueryStackDumpIterator
+ query_stack(vespalib::stringref(buf.GetDrainPos(), buf.GetUsedLen()));
+ Node::UP node =
+ StackDumpQueryCreator<SimpleQueryNodeTypes>::create(query_stack);
+ ASSERT_TRUE(node.get());
+ NumberTerm *term = dynamic_cast<NumberTerm *>(node.get());
+ ASSERT_TRUE(term);
+ EXPECT_EQUAL(term_string, term->getTerm());
+}
+
+TEST("require that PredicateQueryItem stack dump item can be read") {
+ RawBuf buf(1024);
+ uint8_t typefield = ParseItem::ITEM_PREDICATE_QUERY;
+ buf.append(typefield);
+ appendString(buf, "view_name");
+
+ buf.appendCompressedNumber(2);
+ appendString(buf, "key1");
+ appendString(buf, "value1");
+ buf.Put64ToInet(-1ULL);
+ appendString(buf, "key2");
+ appendString(buf, "value2");
+ buf.Put64ToInet(0xffffULL);
+
+ buf.appendCompressedNumber(2);
+ appendString(buf, "key3");
+ buf.Put64ToInet(42ULL);
+ buf.Put64ToInet(-1ULL);
+ appendString(buf, "key4");
+ buf.Put64ToInet(84ULL);
+ buf.Put64ToInet(0xffffULL);
+
+ SimpleQueryStackDumpIterator
+ query_stack(vespalib::stringref(buf.GetDrainPos(), buf.GetUsedLen()));
+ Node::UP node =
+ StackDumpQueryCreator<SimpleQueryNodeTypes>::create(query_stack);
+ ASSERT_TRUE(node.get());
+ PredicateQuery *p = dynamic_cast<PredicateQuery *>(node.get());
+ ASSERT_TRUE(p);
+ const PredicateQueryTerm &term = *p->getTerm();
+ ASSERT_EQUAL(2u, term.getFeatures().size());
+ ASSERT_EQUAL(2u, term.getRangeFeatures().size());
+ ASSERT_EQUAL("value1", term.getFeatures()[0].getValue());
+ ASSERT_EQUAL(0xffffffffffffffffULL,
+ term.getFeatures()[0].getSubQueryBitmap());
+ ASSERT_EQUAL("key2", term.getFeatures()[1].getKey());
+ ASSERT_EQUAL(42u, term.getRangeFeatures()[0].getValue());
+}
+
+} // namespace
+
+TEST_MAIN() { TEST_RUN_ALL(); }