aboutsummaryrefslogtreecommitdiffstats
path: root/streamingvisitors/src/tests
diff options
context:
space:
mode:
authorJon Bratseth <bratseth@yahoo-inc.com>2016-06-15 23:09:44 +0200
committerJon Bratseth <bratseth@yahoo-inc.com>2016-06-15 23:09:44 +0200
commit72231250ed81e10d66bfe70701e64fa5fe50f712 (patch)
tree2728bba1131a6f6e5bdf95afec7d7ff9358dac50 /streamingvisitors/src/tests
Publish
Diffstat (limited to 'streamingvisitors/src/tests')
-rw-r--r--streamingvisitors/src/tests/hitcollector/.gitignore4
-rw-r--r--streamingvisitors/src/tests/hitcollector/CMakeLists.txt8
-rw-r--r--streamingvisitors/src/tests/hitcollector/DESC1
-rw-r--r--streamingvisitors/src/tests/hitcollector/FILES1
-rw-r--r--streamingvisitors/src/tests/hitcollector/hitcollector.cpp314
-rw-r--r--streamingvisitors/src/tests/querywrapper/.gitignore4
-rw-r--r--streamingvisitors/src/tests/querywrapper/CMakeLists.txt8
-rw-r--r--streamingvisitors/src/tests/querywrapper/DESC1
-rw-r--r--streamingvisitors/src/tests/querywrapper/FILES1
-rw-r--r--streamingvisitors/src/tests/querywrapper/querywrapper.cpp108
-rw-r--r--streamingvisitors/src/tests/searchvisitor/.gitignore4
-rw-r--r--streamingvisitors/src/tests/searchvisitor/CMakeLists.txt8
-rw-r--r--streamingvisitors/src/tests/searchvisitor/cfg/documenttypes.cfg317
-rw-r--r--streamingvisitors/src/tests/searchvisitor/cfg/juniperrc.aaa.cfg11
-rw-r--r--streamingvisitors/src/tests/searchvisitor/cfg/juniperrc.simple.cfg0
-rw-r--r--streamingvisitors/src/tests/searchvisitor/cfg/rank-profiles.aaa.cfg43
-rw-r--r--streamingvisitors/src/tests/searchvisitor/cfg/rank-profiles.simple.cfg0
-rw-r--r--streamingvisitors/src/tests/searchvisitor/cfg/summary.aaa.cfg30
-rw-r--r--streamingvisitors/src/tests/searchvisitor/cfg/summary.simple.cfg0
-rw-r--r--streamingvisitors/src/tests/searchvisitor/cfg/summarymap.aaa.cfg11
-rw-r--r--streamingvisitors/src/tests/searchvisitor/cfg/summarymap.simple.cfg0
-rw-r--r--streamingvisitors/src/tests/searchvisitor/cfg/vsmfields.aaa.cfg98
-rw-r--r--streamingvisitors/src/tests/searchvisitor/cfg/vsmfields.simple.cfg0
-rw-r--r--streamingvisitors/src/tests/searchvisitor/cfg/vsmsummary.aaa.cfg26
-rw-r--r--streamingvisitors/src/tests/searchvisitor/cfg/vsmsummary.simple.cfg0
-rw-r--r--streamingvisitors/src/tests/searchvisitor/searchvisitor.cpp123
26 files changed, 1121 insertions, 0 deletions
diff --git a/streamingvisitors/src/tests/hitcollector/.gitignore b/streamingvisitors/src/tests/hitcollector/.gitignore
new file mode 100644
index 00000000000..2ffc5acb4c1
--- /dev/null
+++ b/streamingvisitors/src/tests/hitcollector/.gitignore
@@ -0,0 +1,4 @@
+.depend
+Makefile
+hitcollector_test
+streamingvisitors_hitcollector_test_app
diff --git a/streamingvisitors/src/tests/hitcollector/CMakeLists.txt b/streamingvisitors/src/tests/hitcollector/CMakeLists.txt
new file mode 100644
index 00000000000..62c481e13a7
--- /dev/null
+++ b/streamingvisitors/src/tests/hitcollector/CMakeLists.txt
@@ -0,0 +1,8 @@
+# Copyright 2016 Yahoo Inc. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root.
+vespa_add_executable(streamingvisitors_hitcollector_test_app
+ SOURCES
+ hitcollector.cpp
+ DEPENDS
+ streamingvisitors_searchvisitor
+)
+vespa_add_test(NAME streamingvisitors_hitcollector_test_app COMMAND streamingvisitors_hitcollector_test_app)
diff --git a/streamingvisitors/src/tests/hitcollector/DESC b/streamingvisitors/src/tests/hitcollector/DESC
new file mode 100644
index 00000000000..4933144da80
--- /dev/null
+++ b/streamingvisitors/src/tests/hitcollector/DESC
@@ -0,0 +1 @@
+Test of the hit collector used by the streaming searcher.
diff --git a/streamingvisitors/src/tests/hitcollector/FILES b/streamingvisitors/src/tests/hitcollector/FILES
new file mode 100644
index 00000000000..88a0d4ba4b3
--- /dev/null
+++ b/streamingvisitors/src/tests/hitcollector/FILES
@@ -0,0 +1 @@
+hitcollector.cpp
diff --git a/streamingvisitors/src/tests/hitcollector/hitcollector.cpp b/streamingvisitors/src/tests/hitcollector/hitcollector.cpp
new file mode 100644
index 00000000000..4e008211223
--- /dev/null
+++ b/streamingvisitors/src/tests/hitcollector/hitcollector.cpp
@@ -0,0 +1,314 @@
+// Copyright 2016 Yahoo Inc. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root.
+#include <vespa/fastos/fastos.h>
+#include <vespa/log/log.h>
+#include <vespa/vespalib/testkit/testapp.h>
+
+#include <vespa/document/fieldvalue/fieldvalues.h>
+#include <vespa/searchlib/fef/matchdata.h>
+#include <vespa/searchvisitor/hitcollector.h>
+#include <vespa/vdslib/container/searchresult.h>
+#include <vespa/vsm/common/storagedocument.h>
+
+LOG_SETUP("hitcollector_test");
+
+using namespace document;
+using namespace search::fef;
+using namespace vespalib;
+using namespace vdslib;
+using namespace vsm;
+
+namespace storage {
+
+class HitCollectorTest : public vespalib::TestApp
+{
+private:
+ void assertHit(SearchResult::RankType expRank, uint32_t hitNo, SearchResult & rs);
+ void assertHit(SearchResult::RankType expRank, uint32_t expDocId, uint32_t hitNo, SearchResult & rs);
+ void addHit(HitCollector &hc, uint32_t docId, double score,
+ const char *sortData = nullptr, size_t sortDataSize = 0);
+ void testSimple();
+ void testGapsInDocId();
+ void testHeapProperty();
+ void testHeapPropertyWithSorting();
+ void testEmpty();
+ void testFeatureSet();
+
+ DocumentType _docType;
+
+public:
+ HitCollectorTest();
+ int Main();
+};
+
+HitCollectorTest::HitCollectorTest()
+ : _docType("testdoc", 0)
+{
+}
+
+void
+HitCollectorTest::assertHit(SearchResult::RankType expRank, uint32_t hitNo, SearchResult & rs)
+{
+ assertHit(expRank, hitNo, hitNo, rs);
+}
+
+void
+HitCollectorTest::assertHit(SearchResult::RankType expRank, uint32_t expDocId, uint32_t hitNo, SearchResult & rs)
+{
+ //std::cout << "assertHit(" << expRank << ", " << expDocId << ")" << std::endl;
+ uint32_t lDocId;
+ const char * gDocId;
+ SearchResult::RankType rank;
+ lDocId = rs.getHit(hitNo, gDocId, rank);
+ EXPECT_EQUAL(rank, expRank);
+ EXPECT_EQUAL(lDocId, expDocId);
+}
+
+void
+HitCollectorTest::addHit(HitCollector &hc, uint32_t docId, double score, const char *sortData, size_t sortDataSize)
+{
+ document::Document::UP doc(new document::Document(_docType, DocumentId("doc::")));
+ StorageDocument::SP sdoc(new StorageDocument(std::move(doc)));
+ ASSERT_TRUE(sdoc->valid());
+ MatchData md(MatchData::params());
+ md.setDocId(docId);
+ hc.addHit(sdoc, md, score, sortData, sortDataSize);
+}
+
+void
+HitCollectorTest::testSimple()
+{
+ HitCollector hc(5);
+
+ // add hits to hit collector
+ for (uint32_t i = 0; i < 5; ++i) {
+ addHit(hc, i, 10 + i);
+ }
+ // merge from match data heap and fill search result
+ for (size_t i = 0; i < 2; ++i) { // try it twice
+ SearchResult sr;
+ hc.fillSearchResult(sr);
+ ASSERT_TRUE(sr.getHitCount() == 5);
+ assertHit(10, 0, sr);
+ assertHit(11, 1, sr);
+ assertHit(12, 2, sr);
+ assertHit(13, 3, sr);
+ assertHit(14, 4, sr);
+ }
+}
+
+void
+HitCollectorTest::testGapsInDocId()
+{
+ HitCollector hc(5);
+
+ // add hits to hit collector
+ for (uint32_t i = 0; i < 5; ++i) {
+ addHit(hc, i * 2, i * 2 + 10);
+ }
+
+ // merge from heap into search result
+ SearchResult sr;
+ hc.fillSearchResult(sr);
+
+ ASSERT_TRUE(sr.getHitCount() == 5);
+ assertHit(10, 0, 0, sr);
+ assertHit(12, 2, 1, sr);
+ assertHit(14, 4, 2, sr);
+ assertHit(16, 6, 3, sr);
+ assertHit(18, 8, 4, sr);
+}
+
+void
+HitCollectorTest::testHeapProperty()
+{
+ {
+ HitCollector hc(3);
+ // add hits (low to high)
+ for (uint32_t i = 0; i < 6; ++i) {
+ addHit(hc, i, i + 10);
+ }
+ SearchResult sr;
+ hc.fillSearchResult(sr);
+ ASSERT_TRUE(sr.getHitCount() == 3);
+ assertHit(13, 3, 0, sr);
+ assertHit(14, 4, 1, sr);
+ assertHit(15, 5, 2, sr);
+ }
+ {
+ HitCollector hc(3);
+ // add hits (high to low)
+ for (uint32_t i = 0; i < 6; ++i) {
+ addHit(hc, i, 10 - i);
+ }
+ SearchResult sr;
+ hc.fillSearchResult(sr);
+ ASSERT_TRUE(sr.getHitCount() == 3);
+ assertHit(10, 0, 0, sr);
+ assertHit(9, 1, 1, sr);
+ assertHit(8, 2, 2, sr);
+ }
+ {
+ HitCollector hc(3);
+ // add hits (same rank score)
+ for (uint32_t i = 0; i < 6; ++i) {
+ addHit(hc, i, 10);
+ }
+ SearchResult sr;
+ hc.fillSearchResult(sr);
+ ASSERT_TRUE(sr.getHitCount() == 3);
+ assertHit(10, 0, 0, sr);
+ assertHit(10, 1, 1, sr);
+ assertHit(10, 2, 2, sr);
+ }
+}
+
+void
+HitCollectorTest::testHeapPropertyWithSorting()
+{
+ std::vector<char> sortData;
+ sortData.push_back('a');
+ sortData.push_back('b');
+ sortData.push_back('c');
+ sortData.push_back('d');
+ sortData.push_back('e');
+ sortData.push_back('f');
+ {
+ HitCollector hc(3);
+ // add hits ('a' is sorted/ranked better than 'b')
+ for (uint32_t i = 0; i < 6; ++i) {
+ addHit(hc, i, i + 10, &sortData[i], 1);
+ }
+ SearchResult sr;
+ hc.fillSearchResult(sr);
+ ASSERT_TRUE(sr.getHitCount() == 3);
+ assertHit(10, 0, 0, sr);
+ assertHit(11, 1, 1, sr);
+ assertHit(12, 2, 2, sr);
+ }
+ {
+ HitCollector hc(3);
+ // add hits ('a' is sorted/ranked better than 'b')
+ for (uint32_t i = 0; i < 6; ++i) {
+ addHit(hc, i, i + 10, &sortData[5 - i], 1);
+ }
+ SearchResult sr;
+ hc.fillSearchResult(sr);
+ ASSERT_TRUE(sr.getHitCount() == 3);
+ assertHit(13, 3, 0, sr);
+ assertHit(14, 4, 1, sr);
+ assertHit(15, 5, 2, sr);
+ }
+ {
+ HitCollector hc(3);
+ // add hits (same sort blob)
+ for (uint32_t i = 0; i < 6; ++i) {
+ addHit(hc, i, 10, &sortData[0], 1);
+ }
+ SearchResult sr;
+ hc.fillSearchResult(sr);
+ ASSERT_TRUE(sr.getHitCount() == 3);
+ assertHit(10, 0, 0, sr);
+ assertHit(10, 1, 1, sr);
+ assertHit(10, 2, 2, sr);
+ }
+}
+
+void
+HitCollectorTest::testEmpty()
+{
+ HitCollector hc(0);
+ addHit(hc, 0, 0);
+ SearchResult rs;
+ hc.fillSearchResult(rs);
+ ASSERT_TRUE(rs.getHitCount() == 0);
+}
+
+class MyRankProgram : public HitCollector::IRankProgram
+{
+private:
+ MatchData _matchData;
+
+public:
+ MyRankProgram() : _matchData(MatchData::params().numFeatures(3)) {}
+ virtual const search::fef::MatchData &run(uint32_t docid, const std::vector<search::fef::TermFieldMatchData> &) override {
+ _matchData.setDocId(docid);
+ *_matchData.resolveFeature(0) = docid + 10;
+ *_matchData.resolveFeature(1) = docid + 20;
+ *_matchData.resolveFeature(2) = docid + 30;
+ return _matchData;
+ }
+};
+
+void
+HitCollectorTest::testFeatureSet()
+{
+ HitCollector hc(3);
+
+ addHit(hc, 0, 10);
+ addHit(hc, 1, 50); // on heap
+ addHit(hc, 2, 20);
+ addHit(hc, 3, 40); // on heap
+ addHit(hc, 4, 30); // on heap
+
+ std::vector<vespalib::string> names;
+ std::vector<FeatureHandle> handles;
+ names.push_back("foo");
+ names.push_back("bar");
+ handles.push_back(0);
+ handles.push_back(2);
+
+ MyRankProgram rankProgram;
+ search::FeatureSet::SP sf = hc.getFeatureSet(rankProgram, names, handles);
+
+ EXPECT_EQUAL(sf->getNames().size(), 2u);
+ EXPECT_EQUAL(sf->getNames()[0], "foo");
+ EXPECT_EQUAL(sf->getNames()[1], "bar");
+ EXPECT_EQUAL(sf->numFeatures(), 2u);
+ EXPECT_EQUAL(sf->numDocs(), 3u);
+ {
+ const search::feature_t * f = sf->getFeaturesByDocId(1);
+ ASSERT_TRUE(f != NULL);
+ EXPECT_EQUAL(f[0], 11); // 10 + docId
+ EXPECT_EQUAL(f[1], 31); // 30 + docId
+ }
+ {
+ const search::feature_t * f = sf->getFeaturesByDocId(3);
+ ASSERT_TRUE(f != NULL);
+ EXPECT_EQUAL(f[0], 13);
+ EXPECT_EQUAL(f[1], 33);
+ }
+ {
+ const search::feature_t * f = sf->getFeaturesByDocId(4);
+ ASSERT_TRUE(f != NULL);
+ EXPECT_EQUAL(f[0], 14);
+ EXPECT_EQUAL(f[1], 34);
+ }
+ ASSERT_TRUE(sf->getFeaturesByDocId(0) == NULL);
+ ASSERT_TRUE(sf->getFeaturesByDocId(2) == NULL);
+
+ SearchResult sr;
+ hc.fillSearchResult(sr);
+ ASSERT_TRUE(sr.getHitCount() == 3);
+ assertHit(50, 1, 0, sr);
+ assertHit(40, 3, 1, sr);
+ assertHit(30, 4, 2, sr);
+}
+
+int
+HitCollectorTest::Main()
+{
+ TEST_INIT("hitcollector_test");
+
+ testSimple();
+ testGapsInDocId();
+ testHeapProperty();
+ testHeapPropertyWithSorting();
+ testEmpty();
+ testFeatureSet();
+
+ TEST_DONE();
+}
+
+} // namespace storage
+
+TEST_APPHOOK(storage::HitCollectorTest)
diff --git a/streamingvisitors/src/tests/querywrapper/.gitignore b/streamingvisitors/src/tests/querywrapper/.gitignore
new file mode 100644
index 00000000000..3c8a4b1c9f8
--- /dev/null
+++ b/streamingvisitors/src/tests/querywrapper/.gitignore
@@ -0,0 +1,4 @@
+.depend
+Makefile
+querywrapper_test
+streamingvisitors_querywrapper_test_app
diff --git a/streamingvisitors/src/tests/querywrapper/CMakeLists.txt b/streamingvisitors/src/tests/querywrapper/CMakeLists.txt
new file mode 100644
index 00000000000..501b1eee1a9
--- /dev/null
+++ b/streamingvisitors/src/tests/querywrapper/CMakeLists.txt
@@ -0,0 +1,8 @@
+# Copyright 2016 Yahoo Inc. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root.
+vespa_add_executable(streamingvisitors_querywrapper_test_app
+ SOURCES
+ querywrapper.cpp
+ DEPENDS
+ streamingvisitors_searchvisitor
+)
+vespa_add_test(NAME streamingvisitors_querywrapper_test_app COMMAND streamingvisitors_querywrapper_test_app)
diff --git a/streamingvisitors/src/tests/querywrapper/DESC b/streamingvisitors/src/tests/querywrapper/DESC
new file mode 100644
index 00000000000..dfdd9d55a8e
--- /dev/null
+++ b/streamingvisitors/src/tests/querywrapper/DESC
@@ -0,0 +1 @@
+Test of the query wrapper used by the rank processor.
diff --git a/streamingvisitors/src/tests/querywrapper/FILES b/streamingvisitors/src/tests/querywrapper/FILES
new file mode 100644
index 00000000000..91138d25b2e
--- /dev/null
+++ b/streamingvisitors/src/tests/querywrapper/FILES
@@ -0,0 +1 @@
+querywrapper.cpp
diff --git a/streamingvisitors/src/tests/querywrapper/querywrapper.cpp b/streamingvisitors/src/tests/querywrapper/querywrapper.cpp
new file mode 100644
index 00000000000..b717962d920
--- /dev/null
+++ b/streamingvisitors/src/tests/querywrapper/querywrapper.cpp
@@ -0,0 +1,108 @@
+// Copyright 2016 Yahoo Inc. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root.
+#include <vespa/fastos/fastos.h>
+#include <vespa/vespalib/testkit/testapp.h>
+#include <iostream>
+#include <vespa/searchlib/query/tree/querybuilder.h>
+#include <vespa/searchlib/query/tree/simplequery.h>
+#include <vespa/searchlib/query/tree/stackdumpcreator.h>
+
+#include <vespa/searchvisitor/querywrapper.h>
+
+using namespace search;
+using namespace search::query;
+
+namespace storage {
+
+class QueryWrapperTest : public vespalib::TestApp
+{
+private:
+ void testQueryWrapper();
+
+public:
+ int Main();
+};
+
+void
+QueryWrapperTest::testQueryWrapper()
+{
+ EmptyQueryNodeResult empty;
+ PhraseQueryNode * null = NULL;
+ {
+ QueryBuilder<SimpleQueryNodeTypes> builder;
+ builder.addAnd(3);
+ {
+ builder.addStringTerm("a", "", 0, Weight(0));
+ builder.addPhrase(3, "", 0, Weight(0));
+ {
+ builder.addStringTerm("b", "", 0, Weight(0));
+ builder.addStringTerm("c", "", 0, Weight(0));
+ builder.addStringTerm("d", "", 0, Weight(0));
+ }
+ builder.addStringTerm("e", "", 0, Weight(0));
+ }
+ Node::UP node = builder.build();
+ vespalib::string stackDump = StackDumpCreator::create(*node);
+ Query q(empty, stackDump);
+ QueryWrapper wrap(q);
+ QueryWrapper::TermList & tl = wrap.getTermList();
+
+ QueryTermList terms;
+ q.getLeafs(terms);
+ ASSERT_TRUE(tl.size() == 5 && terms.size() == 5);
+ for (size_t i = 0; i < 5; ++i) {
+ EXPECT_EQUAL(tl[i].getTerm(), terms[i]);
+ std::cout << "t[" << i << "]:" << terms[i] << std::endl;
+ }
+
+ QueryNodeRefList phrases;
+ q.getPhrases(phrases);
+ for (size_t i = 0; i < phrases.size(); ++i) {
+ std::cout << "p[" << i << "]:" << phrases[i] << std::endl;
+ }
+ EXPECT_EQUAL(phrases.size(), 1u);
+ ASSERT_TRUE(phrases.size() == 1);
+ EXPECT_EQUAL(tl[0].getParent(), null);
+ EXPECT_EQUAL(tl[1].getParent(), phrases[0]);
+ EXPECT_EQUAL(tl[2].getParent(), phrases[0]);
+ EXPECT_EQUAL(tl[3].getParent(), phrases[0]);
+ EXPECT_EQUAL(tl[4].getParent(), null);
+
+ EXPECT_EQUAL(tl[0].getIndex(), 0u);
+ EXPECT_EQUAL(tl[1].getIndex(), 0u);
+ EXPECT_EQUAL(tl[2].getIndex(), 1u);
+ EXPECT_EQUAL(tl[3].getIndex(), 2u);
+ EXPECT_EQUAL(tl[4].getIndex(), 0u);
+
+ EXPECT_TRUE(!tl[0].isFirstPhraseTerm());
+ EXPECT_TRUE( tl[1].isFirstPhraseTerm());
+ EXPECT_TRUE(!tl[2].isFirstPhraseTerm());
+ EXPECT_TRUE(!tl[3].isFirstPhraseTerm());
+ EXPECT_TRUE(!tl[4].isFirstPhraseTerm());
+
+ EXPECT_TRUE(!tl[0].isPhraseTerm());
+ EXPECT_TRUE( tl[1].isPhraseTerm());
+ EXPECT_TRUE( tl[2].isPhraseTerm());
+ EXPECT_TRUE( tl[3].isPhraseTerm());
+ EXPECT_TRUE(!tl[4].isPhraseTerm());
+
+ EXPECT_EQUAL(tl[0].getPosAdjust(), 0u);
+ EXPECT_EQUAL(tl[1].getPosAdjust(), 2u);
+ EXPECT_EQUAL(tl[2].getPosAdjust(), 2u);
+ EXPECT_EQUAL(tl[3].getPosAdjust(), 2u);
+ EXPECT_EQUAL(tl[4].getPosAdjust(), 0u);
+ }
+}
+
+int
+QueryWrapperTest::Main()
+{
+ TEST_INIT("querywrapper_test");
+
+ testQueryWrapper();
+
+ TEST_DONE();
+}
+
+} // namespace storage
+
+TEST_APPHOOK(storage::QueryWrapperTest)
diff --git a/streamingvisitors/src/tests/searchvisitor/.gitignore b/streamingvisitors/src/tests/searchvisitor/.gitignore
new file mode 100644
index 00000000000..543f6428e3c
--- /dev/null
+++ b/streamingvisitors/src/tests/searchvisitor/.gitignore
@@ -0,0 +1,4 @@
+/.depend
+/Makefile
+/searchvisitor_test
+streamingvisitors_searchvisitor_test_app
diff --git a/streamingvisitors/src/tests/searchvisitor/CMakeLists.txt b/streamingvisitors/src/tests/searchvisitor/CMakeLists.txt
new file mode 100644
index 00000000000..83abfde144a
--- /dev/null
+++ b/streamingvisitors/src/tests/searchvisitor/CMakeLists.txt
@@ -0,0 +1,8 @@
+# Copyright 2016 Yahoo Inc. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root.
+vespa_add_executable(streamingvisitors_searchvisitor_test_app
+ SOURCES
+ searchvisitor.cpp
+ DEPENDS
+ streamingvisitors_searchvisitor
+)
+vespa_add_test(NAME streamingvisitors_searchvisitor_test_app COMMAND streamingvisitors_searchvisitor_test_app)
diff --git a/streamingvisitors/src/tests/searchvisitor/cfg/documenttypes.cfg b/streamingvisitors/src/tests/searchvisitor/cfg/documenttypes.cfg
new file mode 100644
index 00000000000..7bb863dc8e2
--- /dev/null
+++ b/streamingvisitors/src/tests/searchvisitor/cfg/documenttypes.cfg
@@ -0,0 +1,317 @@
+enablecompression false
+documenttype[0].id 1843830320
+documenttype[0].name "maptest"
+documenttype[0].version 0
+documenttype[0].headerstruct -91088113
+documenttype[0].bodystruct -1659731740
+documenttype[0].inherits[0].id 8
+documenttype[0].datatype[0].id 3474528
+documenttype[0].datatype[0].type STRUCT
+documenttype[0].datatype[0].array.element.id 0
+documenttype[0].datatype[0].map.key.id 0
+documenttype[0].datatype[0].map.value.id 0
+documenttype[0].datatype[0].wset.key.id 0
+documenttype[0].datatype[0].wset.createifnonexistent false
+documenttype[0].datatype[0].wset.removeifzero false
+documenttype[0].datatype[0].annotationref.annotation.id 0
+documenttype[0].datatype[0].sstruct.name "s1"
+documenttype[0].datatype[0].sstruct.version 0
+documenttype[0].datatype[0].sstruct.compression.type NONE
+documenttype[0].datatype[0].sstruct.compression.level 0
+documenttype[0].datatype[0].sstruct.compression.threshold 95
+documenttype[0].datatype[0].sstruct.compression.minsize 200
+documenttype[0].datatype[0].sstruct.field[0].name "a"
+documenttype[0].datatype[0].sstruct.field[0].id 493339625
+documenttype[0].datatype[0].sstruct.field[0].id_v6 703514648
+documenttype[0].datatype[0].sstruct.field[0].datatype 2
+documenttype[0].datatype[0].sstruct.field[1].name "b"
+documenttype[0].datatype[0].sstruct.field[1].id 441632370
+documenttype[0].datatype[0].sstruct.field[1].id_v6 1420600727
+documenttype[0].datatype[0].sstruct.field[1].datatype 2
+documenttype[0].datatype[1].id 339965458
+documenttype[0].datatype[1].type MAP
+documenttype[0].datatype[1].array.element.id 0
+documenttype[0].datatype[1].map.key.id 2
+documenttype[0].datatype[1].map.value.id 2
+documenttype[0].datatype[1].wset.key.id 0
+documenttype[0].datatype[1].wset.createifnonexistent false
+documenttype[0].datatype[1].wset.removeifzero false
+documenttype[0].datatype[1].annotationref.annotation.id 0
+documenttype[0].datatype[1].sstruct.name ""
+documenttype[0].datatype[1].sstruct.version 0
+documenttype[0].datatype[1].sstruct.compression.type NONE
+documenttype[0].datatype[1].sstruct.compression.level 0
+documenttype[0].datatype[1].sstruct.compression.threshold 95
+documenttype[0].datatype[1].sstruct.compression.minsize 200
+documenttype[0].datatype[2].id 1888564261
+documenttype[0].datatype[2].type MAP
+documenttype[0].datatype[2].array.element.id 0
+documenttype[0].datatype[2].map.key.id 2
+documenttype[0].datatype[2].map.value.id 3474528
+documenttype[0].datatype[2].wset.key.id 0
+documenttype[0].datatype[2].wset.createifnonexistent false
+documenttype[0].datatype[2].wset.removeifzero false
+documenttype[0].datatype[2].annotationref.annotation.id 0
+documenttype[0].datatype[2].sstruct.name ""
+documenttype[0].datatype[2].sstruct.version 0
+documenttype[0].datatype[2].sstruct.compression.type NONE
+documenttype[0].datatype[2].sstruct.compression.level 0
+documenttype[0].datatype[2].sstruct.compression.threshold 95
+documenttype[0].datatype[2].sstruct.compression.minsize 200
+documenttype[0].datatype[3].id -1486737430
+documenttype[0].datatype[3].type ARRAY
+documenttype[0].datatype[3].array.element.id 2
+documenttype[0].datatype[3].map.key.id 0
+documenttype[0].datatype[3].map.value.id 0
+documenttype[0].datatype[3].wset.key.id 0
+documenttype[0].datatype[3].wset.createifnonexistent false
+documenttype[0].datatype[3].wset.removeifzero false
+documenttype[0].datatype[3].annotationref.annotation.id 0
+documenttype[0].datatype[3].sstruct.name ""
+documenttype[0].datatype[3].sstruct.version 0
+documenttype[0].datatype[3].sstruct.compression.type NONE
+documenttype[0].datatype[3].sstruct.compression.level 0
+documenttype[0].datatype[3].sstruct.compression.threshold 95
+documenttype[0].datatype[3].sstruct.compression.minsize 200
+documenttype[0].datatype[4].id -1220861393
+documenttype[0].datatype[4].type MAP
+documenttype[0].datatype[4].array.element.id 0
+documenttype[0].datatype[4].map.key.id 2
+documenttype[0].datatype[4].map.value.id -1486737430
+documenttype[0].datatype[4].wset.key.id 0
+documenttype[0].datatype[4].wset.createifnonexistent false
+documenttype[0].datatype[4].wset.removeifzero false
+documenttype[0].datatype[4].annotationref.annotation.id 0
+documenttype[0].datatype[4].sstruct.name ""
+documenttype[0].datatype[4].sstruct.version 0
+documenttype[0].datatype[4].sstruct.compression.type NONE
+documenttype[0].datatype[4].sstruct.compression.level 0
+documenttype[0].datatype[4].sstruct.compression.threshold 95
+documenttype[0].datatype[4].sstruct.compression.minsize 200
+documenttype[0].datatype[5].id 1070047409
+documenttype[0].datatype[5].type MAP
+documenttype[0].datatype[5].array.element.id 0
+documenttype[0].datatype[5].map.key.id 2
+documenttype[0].datatype[5].map.value.id 339965458
+documenttype[0].datatype[5].wset.key.id 0
+documenttype[0].datatype[5].wset.createifnonexistent false
+documenttype[0].datatype[5].wset.removeifzero false
+documenttype[0].datatype[5].annotationref.annotation.id 0
+documenttype[0].datatype[5].sstruct.name ""
+documenttype[0].datatype[5].sstruct.version 0
+documenttype[0].datatype[5].sstruct.compression.type NONE
+documenttype[0].datatype[5].sstruct.compression.level 0
+documenttype[0].datatype[5].sstruct.compression.threshold 95
+documenttype[0].datatype[5].sstruct.compression.minsize 200
+documenttype[0].datatype[6].id -91088113
+documenttype[0].datatype[6].type STRUCT
+documenttype[0].datatype[6].array.element.id 0
+documenttype[0].datatype[6].map.key.id 0
+documenttype[0].datatype[6].map.value.id 0
+documenttype[0].datatype[6].wset.key.id 0
+documenttype[0].datatype[6].wset.createifnonexistent false
+documenttype[0].datatype[6].wset.removeifzero false
+documenttype[0].datatype[6].annotationref.annotation.id 0
+documenttype[0].datatype[6].sstruct.name "maptest.header"
+documenttype[0].datatype[6].sstruct.version 0
+documenttype[0].datatype[6].sstruct.compression.type NONE
+documenttype[0].datatype[6].sstruct.compression.level 0
+documenttype[0].datatype[6].sstruct.compression.threshold 95
+documenttype[0].datatype[6].sstruct.compression.minsize 200
+documenttype[0].datatype[6].sstruct.field[0].name "name"
+documenttype[0].datatype[6].sstruct.field[0].id 1160796772
+documenttype[0].datatype[6].sstruct.field[0].id_v6 774203930
+documenttype[0].datatype[6].sstruct.field[0].datatype 2
+documenttype[0].datatype[6].sstruct.field[1].name "m1"
+documenttype[0].datatype[6].sstruct.field[1].id 656260193
+documenttype[0].datatype[6].sstruct.field[1].id_v6 1013611640
+documenttype[0].datatype[6].sstruct.field[1].datatype 339965458
+documenttype[0].datatype[6].sstruct.field[2].name "m2"
+documenttype[0].datatype[6].sstruct.field[2].id 1105173090
+documenttype[0].datatype[6].sstruct.field[2].id_v6 1026497887
+documenttype[0].datatype[6].sstruct.field[2].datatype 1888564261
+documenttype[0].datatype[6].sstruct.field[3].name "m3"
+documenttype[0].datatype[6].sstruct.field[3].id 1834987989
+documenttype[0].datatype[6].sstruct.field[3].id_v6 1365320273
+documenttype[0].datatype[6].sstruct.field[3].datatype -1220861393
+documenttype[0].datatype[6].sstruct.field[4].name "m4"
+documenttype[0].datatype[6].sstruct.field[4].id 1696105521
+documenttype[0].datatype[6].sstruct.field[4].id_v6 1636310067
+documenttype[0].datatype[6].sstruct.field[4].datatype 1070047409
+documenttype[0].datatype[7].id -1659731740
+documenttype[0].datatype[7].type STRUCT
+documenttype[0].datatype[7].array.element.id 0
+documenttype[0].datatype[7].map.key.id 0
+documenttype[0].datatype[7].map.value.id 0
+documenttype[0].datatype[7].wset.key.id 0
+documenttype[0].datatype[7].wset.createifnonexistent false
+documenttype[0].datatype[7].wset.removeifzero false
+documenttype[0].datatype[7].annotationref.annotation.id 0
+documenttype[0].datatype[7].sstruct.name "maptest.body"
+documenttype[0].datatype[7].sstruct.version 0
+documenttype[0].datatype[7].sstruct.compression.type NONE
+documenttype[0].datatype[7].sstruct.compression.level 0
+documenttype[0].datatype[7].sstruct.compression.threshold 95
+documenttype[0].datatype[7].sstruct.compression.minsize 200
+documenttype[1].id -753106277
+documenttype[1].name "maptest_search"
+documenttype[1].version 0
+documenttype[1].headerstruct 919697476
+documenttype[1].bodystruct -125720743
+documenttype[1].inherits[0].id 8
+documenttype[1].datatype[0].id 3474528
+documenttype[1].datatype[0].type STRUCT
+documenttype[1].datatype[0].array.element.id 0
+documenttype[1].datatype[0].map.key.id 0
+documenttype[1].datatype[0].map.value.id 0
+documenttype[1].datatype[0].wset.key.id 0
+documenttype[1].datatype[0].wset.createifnonexistent false
+documenttype[1].datatype[0].wset.removeifzero false
+documenttype[1].datatype[0].annotationref.annotation.id 0
+documenttype[1].datatype[0].sstruct.name "s1"
+documenttype[1].datatype[0].sstruct.version 0
+documenttype[1].datatype[0].sstruct.compression.type NONE
+documenttype[1].datatype[0].sstruct.compression.level 0
+documenttype[1].datatype[0].sstruct.compression.threshold 95
+documenttype[1].datatype[0].sstruct.compression.minsize 200
+documenttype[1].datatype[0].sstruct.field[0].name "a"
+documenttype[1].datatype[0].sstruct.field[0].id 493339625
+documenttype[1].datatype[0].sstruct.field[0].id_v6 703514648
+documenttype[1].datatype[0].sstruct.field[0].datatype 2
+documenttype[1].datatype[0].sstruct.field[1].name "b"
+documenttype[1].datatype[0].sstruct.field[1].id 441632370
+documenttype[1].datatype[0].sstruct.field[1].id_v6 1420600727
+documenttype[1].datatype[0].sstruct.field[1].datatype 2
+documenttype[1].datatype[1].id 339965458
+documenttype[1].datatype[1].type MAP
+documenttype[1].datatype[1].array.element.id 0
+documenttype[1].datatype[1].map.key.id 2
+documenttype[1].datatype[1].map.value.id 2
+documenttype[1].datatype[1].wset.key.id 0
+documenttype[1].datatype[1].wset.createifnonexistent false
+documenttype[1].datatype[1].wset.removeifzero false
+documenttype[1].datatype[1].annotationref.annotation.id 0
+documenttype[1].datatype[1].sstruct.name ""
+documenttype[1].datatype[1].sstruct.version 0
+documenttype[1].datatype[1].sstruct.compression.type NONE
+documenttype[1].datatype[1].sstruct.compression.level 0
+documenttype[1].datatype[1].sstruct.compression.threshold 95
+documenttype[1].datatype[1].sstruct.compression.minsize 200
+documenttype[1].datatype[2].id 1888564261
+documenttype[1].datatype[2].type MAP
+documenttype[1].datatype[2].array.element.id 0
+documenttype[1].datatype[2].map.key.id 2
+documenttype[1].datatype[2].map.value.id 3474528
+documenttype[1].datatype[2].wset.key.id 0
+documenttype[1].datatype[2].wset.createifnonexistent false
+documenttype[1].datatype[2].wset.removeifzero false
+documenttype[1].datatype[2].annotationref.annotation.id 0
+documenttype[1].datatype[2].sstruct.name ""
+documenttype[1].datatype[2].sstruct.version 0
+documenttype[1].datatype[2].sstruct.compression.type NONE
+documenttype[1].datatype[2].sstruct.compression.level 0
+documenttype[1].datatype[2].sstruct.compression.threshold 95
+documenttype[1].datatype[2].sstruct.compression.minsize 200
+documenttype[1].datatype[3].id -1486737430
+documenttype[1].datatype[3].type ARRAY
+documenttype[1].datatype[3].array.element.id 2
+documenttype[1].datatype[3].map.key.id 0
+documenttype[1].datatype[3].map.value.id 0
+documenttype[1].datatype[3].wset.key.id 0
+documenttype[1].datatype[3].wset.createifnonexistent false
+documenttype[1].datatype[3].wset.removeifzero false
+documenttype[1].datatype[3].annotationref.annotation.id 0
+documenttype[1].datatype[3].sstruct.name ""
+documenttype[1].datatype[3].sstruct.version 0
+documenttype[1].datatype[3].sstruct.compression.type NONE
+documenttype[1].datatype[3].sstruct.compression.level 0
+documenttype[1].datatype[3].sstruct.compression.threshold 95
+documenttype[1].datatype[3].sstruct.compression.minsize 200
+documenttype[1].datatype[4].id -1220861393
+documenttype[1].datatype[4].type MAP
+documenttype[1].datatype[4].array.element.id 0
+documenttype[1].datatype[4].map.key.id 2
+documenttype[1].datatype[4].map.value.id -1486737430
+documenttype[1].datatype[4].wset.key.id 0
+documenttype[1].datatype[4].wset.createifnonexistent false
+documenttype[1].datatype[4].wset.removeifzero false
+documenttype[1].datatype[4].annotationref.annotation.id 0
+documenttype[1].datatype[4].sstruct.name ""
+documenttype[1].datatype[4].sstruct.version 0
+documenttype[1].datatype[4].sstruct.compression.type NONE
+documenttype[1].datatype[4].sstruct.compression.level 0
+documenttype[1].datatype[4].sstruct.compression.threshold 95
+documenttype[1].datatype[4].sstruct.compression.minsize 200
+documenttype[1].datatype[5].id 1070047409
+documenttype[1].datatype[5].type MAP
+documenttype[1].datatype[5].array.element.id 0
+documenttype[1].datatype[5].map.key.id 2
+documenttype[1].datatype[5].map.value.id 339965458
+documenttype[1].datatype[5].wset.key.id 0
+documenttype[1].datatype[5].wset.createifnonexistent false
+documenttype[1].datatype[5].wset.removeifzero false
+documenttype[1].datatype[5].annotationref.annotation.id 0
+documenttype[1].datatype[5].sstruct.name ""
+documenttype[1].datatype[5].sstruct.version 0
+documenttype[1].datatype[5].sstruct.compression.type NONE
+documenttype[1].datatype[5].sstruct.compression.level 0
+documenttype[1].datatype[5].sstruct.compression.threshold 95
+documenttype[1].datatype[5].sstruct.compression.minsize 200
+documenttype[1].datatype[6].id 919697476
+documenttype[1].datatype[6].type STRUCT
+documenttype[1].datatype[6].array.element.id 0
+documenttype[1].datatype[6].map.key.id 0
+documenttype[1].datatype[6].map.value.id 0
+documenttype[1].datatype[6].wset.key.id 0
+documenttype[1].datatype[6].wset.createifnonexistent false
+documenttype[1].datatype[6].wset.removeifzero false
+documenttype[1].datatype[6].annotationref.annotation.id 0
+documenttype[1].datatype[6].sstruct.name "maptest_search.header"
+documenttype[1].datatype[6].sstruct.version 0
+documenttype[1].datatype[6].sstruct.compression.type NONE
+documenttype[1].datatype[6].sstruct.compression.level 0
+documenttype[1].datatype[6].sstruct.compression.threshold 95
+documenttype[1].datatype[6].sstruct.compression.minsize 200
+documenttype[1].datatype[6].sstruct.field[0].name "name"
+documenttype[1].datatype[6].sstruct.field[0].id 1160796772
+documenttype[1].datatype[6].sstruct.field[0].id_v6 774203930
+documenttype[1].datatype[6].sstruct.field[0].datatype 2
+documenttype[1].datatype[6].sstruct.field[1].name "m1"
+documenttype[1].datatype[6].sstruct.field[1].id 656260193
+documenttype[1].datatype[6].sstruct.field[1].id_v6 1013611640
+documenttype[1].datatype[6].sstruct.field[1].datatype 339965458
+documenttype[1].datatype[6].sstruct.field[2].name "m2"
+documenttype[1].datatype[6].sstruct.field[2].id 1105173090
+documenttype[1].datatype[6].sstruct.field[2].id_v6 1026497887
+documenttype[1].datatype[6].sstruct.field[2].datatype 1888564261
+documenttype[1].datatype[6].sstruct.field[3].name "m3"
+documenttype[1].datatype[6].sstruct.field[3].id 1834987989
+documenttype[1].datatype[6].sstruct.field[3].id_v6 1365320273
+documenttype[1].datatype[6].sstruct.field[3].datatype -1220861393
+documenttype[1].datatype[6].sstruct.field[4].name "m4"
+documenttype[1].datatype[6].sstruct.field[4].id 1696105521
+documenttype[1].datatype[6].sstruct.field[4].id_v6 1636310067
+documenttype[1].datatype[6].sstruct.field[4].datatype 1070047409
+documenttype[1].datatype[6].sstruct.field[5].name "rankfeatures"
+documenttype[1].datatype[6].sstruct.field[5].id 1883197392
+documenttype[1].datatype[6].sstruct.field[5].id_v6 699950698
+documenttype[1].datatype[6].sstruct.field[5].datatype 2
+documenttype[1].datatype[6].sstruct.field[6].name "summaryfeatures"
+documenttype[1].datatype[6].sstruct.field[6].id 1840337115
+documenttype[1].datatype[6].sstruct.field[6].id_v6 1981648971
+documenttype[1].datatype[6].sstruct.field[6].datatype 2
+documenttype[1].datatype[7].id -125720743
+documenttype[1].datatype[7].type STRUCT
+documenttype[1].datatype[7].array.element.id 0
+documenttype[1].datatype[7].map.key.id 0
+documenttype[1].datatype[7].map.value.id 0
+documenttype[1].datatype[7].wset.key.id 0
+documenttype[1].datatype[7].wset.createifnonexistent false
+documenttype[1].datatype[7].wset.removeifzero false
+documenttype[1].datatype[7].annotationref.annotation.id 0
+documenttype[1].datatype[7].sstruct.name "maptest_search.body"
+documenttype[1].datatype[7].sstruct.version 0
+documenttype[1].datatype[7].sstruct.compression.type NONE
+documenttype[1].datatype[7].sstruct.compression.level 0
+documenttype[1].datatype[7].sstruct.compression.threshold 95
+documenttype[1].datatype[7].sstruct.compression.minsize 200
diff --git a/streamingvisitors/src/tests/searchvisitor/cfg/juniperrc.aaa.cfg b/streamingvisitors/src/tests/searchvisitor/cfg/juniperrc.aaa.cfg
new file mode 100644
index 00000000000..09e13ed0f8b
--- /dev/null
+++ b/streamingvisitors/src/tests/searchvisitor/cfg/juniperrc.aaa.cfg
@@ -0,0 +1,11 @@
+length 256
+max_match_candidates 1000
+max_matches 3
+min_length 128
+prefix true
+stem_max_extend 3
+stem_min_length 5
+surround_max 128
+winsize 200
+winsize_fallback_multiplier 10.0
+override[0]
diff --git a/streamingvisitors/src/tests/searchvisitor/cfg/juniperrc.simple.cfg b/streamingvisitors/src/tests/searchvisitor/cfg/juniperrc.simple.cfg
new file mode 100644
index 00000000000..e69de29bb2d
--- /dev/null
+++ b/streamingvisitors/src/tests/searchvisitor/cfg/juniperrc.simple.cfg
diff --git a/streamingvisitors/src/tests/searchvisitor/cfg/rank-profiles.aaa.cfg b/streamingvisitors/src/tests/searchvisitor/cfg/rank-profiles.aaa.cfg
new file mode 100644
index 00000000000..cf3ee6a7179
--- /dev/null
+++ b/streamingvisitors/src/tests/searchvisitor/cfg/rank-profiles.aaa.cfg
@@ -0,0 +1,43 @@
+rankprofile[2]
+rankprofile[0].name "default"
+rankprofile[0].fef.property[15]
+rankprofile[0].fef.property[00].name "vespa.summary.feature"
+rankprofile[0].fef.property[00].value "fieldTermMatch(m1.key,0).firstPosition"
+rankprofile[0].fef.property[01].name "vespa.summary.feature"
+rankprofile[0].fef.property[01].value "fieldTermMatch(m1.key,0).occurrences"
+rankprofile[0].fef.property[02].name "vespa.summary.feature"
+rankprofile[0].fef.property[02].value "fieldLength(m1.key)"
+rankprofile[0].fef.property[03].name "vespa.summary.feature"
+rankprofile[0].fef.property[03].value "fieldTermMatch(m1.value,0).firstPosition"
+rankprofile[0].fef.property[04].name "vespa.summary.feature"
+rankprofile[0].fef.property[04].value "fieldTermMatch(m1.value,0).occurrences"
+rankprofile[0].fef.property[05].name "vespa.summary.feature"
+rankprofile[0].fef.property[05].value "fieldLength(m1.value)"
+rankprofile[0].fef.property[06].name "vespa.summary.feature"
+rankprofile[0].fef.property[06].value "fieldTermMatch(m2.value.a,0).firstPosition"
+rankprofile[0].fef.property[07].name "vespa.summary.feature"
+rankprofile[0].fef.property[07].value "fieldTermMatch(m2.value.a,0).occurrences"
+rankprofile[0].fef.property[08].name "vespa.summary.feature"
+rankprofile[0].fef.property[08].value "fieldLength(m2.value.a)"
+rankprofile[0].fef.property[09].name "vespa.summary.feature"
+rankprofile[0].fef.property[09].value "fieldTermMatch(m3.value,0).firstPosition"
+rankprofile[0].fef.property[10].name "vespa.summary.feature"
+rankprofile[0].fef.property[10].value "fieldTermMatch(m3.value,0).occurrences"
+rankprofile[0].fef.property[11].name "vespa.summary.feature"
+rankprofile[0].fef.property[11].value "fieldLength(m3.value)"
+rankprofile[0].fef.property[12].name "vespa.summary.feature"
+rankprofile[0].fef.property[12].value "fieldTermMatch(m4.value.value,0).firstPosition"
+rankprofile[0].fef.property[13].name "vespa.summary.feature"
+rankprofile[0].fef.property[13].value "fieldTermMatch(m4.value.value,0).occurrences"
+rankprofile[0].fef.property[14].name "vespa.summary.feature"
+rankprofile[0].fef.property[14].value "fieldLength(m4.value.value)"
+rankprofile[1].name "unranked"
+rankprofile[1].fef.property[4]
+rankprofile[1].fef.property[0].name "vespa.rank.firstphase"
+rankprofile[1].fef.property[0].value "value(0)"
+rankprofile[1].fef.property[1].name "vespa.hitcollector.heapsize"
+rankprofile[1].fef.property[1].value "0"
+rankprofile[1].fef.property[2].name "vespa.hitcollector.arraysize"
+rankprofile[1].fef.property[2].value "0"
+rankprofile[1].fef.property[3].name "vespa.dump.ignoredefaultfeatures"
+rankprofile[1].fef.property[3].value "true"
diff --git a/streamingvisitors/src/tests/searchvisitor/cfg/rank-profiles.simple.cfg b/streamingvisitors/src/tests/searchvisitor/cfg/rank-profiles.simple.cfg
new file mode 100644
index 00000000000..e69de29bb2d
--- /dev/null
+++ b/streamingvisitors/src/tests/searchvisitor/cfg/rank-profiles.simple.cfg
diff --git a/streamingvisitors/src/tests/searchvisitor/cfg/summary.aaa.cfg b/streamingvisitors/src/tests/searchvisitor/cfg/summary.aaa.cfg
new file mode 100644
index 00000000000..8cc32ed5ea4
--- /dev/null
+++ b/streamingvisitors/src/tests/searchvisitor/cfg/summary.aaa.cfg
@@ -0,0 +1,30 @@
+defaultsummaryid 197963550
+classes[2]
+classes[0].id 190911431
+classes[0].name "attributeprefetch"
+classes[0].fields[3]
+classes[0].fields[0].name "name"
+classes[0].fields[0].type "longstring"
+classes[0].fields[1].name "rankfeatures"
+classes[0].fields[1].type "longstring"
+classes[0].fields[2].name "summaryfeatures"
+classes[0].fields[2].type "longstring"
+classes[1].id 197963550
+classes[1].name "maptest"
+classes[1].fields[8]
+classes[1].fields[0].name "documentid"
+classes[1].fields[0].type "longstring"
+classes[1].fields[1].name "m1"
+classes[1].fields[1].type "jsonstring"
+classes[1].fields[2].name "m2"
+classes[1].fields[2].type "jsonstring"
+classes[1].fields[3].name "m3"
+classes[1].fields[3].type "jsonstring"
+classes[1].fields[4].name "m4"
+classes[1].fields[4].type "jsonstring"
+classes[1].fields[5].name "name"
+classes[1].fields[5].type "longstring"
+classes[1].fields[6].name "rankfeatures"
+classes[1].fields[6].type "longstring"
+classes[1].fields[7].name "summaryfeatures"
+classes[1].fields[7].type "longstring"
diff --git a/streamingvisitors/src/tests/searchvisitor/cfg/summary.simple.cfg b/streamingvisitors/src/tests/searchvisitor/cfg/summary.simple.cfg
new file mode 100644
index 00000000000..e69de29bb2d
--- /dev/null
+++ b/streamingvisitors/src/tests/searchvisitor/cfg/summary.simple.cfg
diff --git a/streamingvisitors/src/tests/searchvisitor/cfg/summarymap.aaa.cfg b/streamingvisitors/src/tests/searchvisitor/cfg/summarymap.aaa.cfg
new file mode 100644
index 00000000000..1c9567431ae
--- /dev/null
+++ b/streamingvisitors/src/tests/searchvisitor/cfg/summarymap.aaa.cfg
@@ -0,0 +1,11 @@
+defaultoutputclass -1
+override[3]
+override[0].arguments "name"
+override[0].command "attribute"
+override[0].field "name"
+override[1].arguments ""
+override[1].command "rankfeatures"
+override[1].field "rankfeatures"
+override[2].arguments ""
+override[2].command "summaryfeatures"
+override[2].field "summaryfeatures"
diff --git a/streamingvisitors/src/tests/searchvisitor/cfg/summarymap.simple.cfg b/streamingvisitors/src/tests/searchvisitor/cfg/summarymap.simple.cfg
new file mode 100644
index 00000000000..e69de29bb2d
--- /dev/null
+++ b/streamingvisitors/src/tests/searchvisitor/cfg/summarymap.simple.cfg
diff --git a/streamingvisitors/src/tests/searchvisitor/cfg/vsmfields.aaa.cfg b/streamingvisitors/src/tests/searchvisitor/cfg/vsmfields.aaa.cfg
new file mode 100644
index 00000000000..4d976764bd9
--- /dev/null
+++ b/streamingvisitors/src/tests/searchvisitor/cfg/vsmfields.aaa.cfg
@@ -0,0 +1,98 @@
+documentverificationlevel 0
+searchall 1
+documenttype[1]
+documenttype[0].name "maptest"
+documenttype[0].index[17]
+documenttype[0].index[00].name "m1"
+documenttype[0].index[00].field[2]
+documenttype[0].index[00].field[0].name "m1.key"
+documenttype[0].index[00].field[1].name "m1.value"
+documenttype[0].index[01].name "m1.key"
+documenttype[0].index[01].field[1]
+documenttype[0].index[01].field[0].name "m1.key"
+documenttype[0].index[02].name "m1.value"
+documenttype[0].index[02].field[1]
+documenttype[0].index[02].field[0].name "m1.value"
+documenttype[0].index[03].name "m2"
+documenttype[0].index[03].field[3]
+documenttype[0].index[03].field[0].name "m2.key"
+documenttype[0].index[03].field[1].name "m2.value.a"
+documenttype[0].index[03].field[2].name "m2.value.b"
+documenttype[0].index[04].name "m2.key"
+documenttype[0].index[04].field[1]
+documenttype[0].index[04].field[0].name "m2.key"
+documenttype[0].index[05].name "m2.value"
+documenttype[0].index[05].field[2]
+documenttype[0].index[05].field[0].name "m2.value.a"
+documenttype[0].index[05].field[1].name "m2.value.b"
+documenttype[0].index[06].name "m2.value.a"
+documenttype[0].index[06].field[1]
+documenttype[0].index[06].field[0].name "m2.value.a"
+documenttype[0].index[07].name "m2.value.b"
+documenttype[0].index[07].field[1]
+documenttype[0].index[07].field[0].name "m2.value.b"
+documenttype[0].index[08].name "m3"
+documenttype[0].index[08].field[2]
+documenttype[0].index[08].field[0].name "m3.key"
+documenttype[0].index[08].field[1].name "m3.value"
+documenttype[0].index[09].name "m3.key"
+documenttype[0].index[09].field[1]
+documenttype[0].index[09].field[0].name "m3.key"
+documenttype[0].index[10].name "m3.value"
+documenttype[0].index[10].field[1]
+documenttype[0].index[10].field[0].name "m3.value"
+documenttype[0].index[11].name "m4"
+documenttype[0].index[11].field[3]
+documenttype[0].index[11].field[0].name "m4.key"
+documenttype[0].index[11].field[1].name "m4.value.key"
+documenttype[0].index[11].field[2].name "m4.value.value"
+documenttype[0].index[12].name "m4.key"
+documenttype[0].index[12].field[1]
+documenttype[0].index[12].field[0].name "m4.key"
+documenttype[0].index[13].name "m4.value"
+documenttype[0].index[13].field[2]
+documenttype[0].index[13].field[0].name "m4.value.key"
+documenttype[0].index[13].field[1].name "m4.value.value"
+documenttype[0].index[14].name "m4.value.key"
+documenttype[0].index[14].field[1]
+documenttype[0].index[14].field[0].name "m4.value.key"
+documenttype[0].index[15].name "m4.value.value"
+documenttype[0].index[15].field[1]
+documenttype[0].index[15].field[0].name "m4.value.value"
+documenttype[0].index[16].name "name"
+documenttype[0].index[16].field[1]
+documenttype[0].index[16].field[0].name "name"
+fieldspec[11]
+fieldspec[00].arg1 ""
+fieldspec[00].name "m1.key"
+fieldspec[00].searchmethod AUTOUTF8
+fieldspec[01].arg1 ""
+fieldspec[01].name "m1.value"
+fieldspec[01].searchmethod AUTOUTF8
+fieldspec[02].arg1 ""
+fieldspec[02].name "m2.key"
+fieldspec[02].searchmethod AUTOUTF8
+fieldspec[03].arg1 ""
+fieldspec[03].name "m2.value.a"
+fieldspec[03].searchmethod AUTOUTF8
+fieldspec[04].arg1 ""
+fieldspec[04].name "m2.value.b"
+fieldspec[04].searchmethod AUTOUTF8
+fieldspec[05].arg1 ""
+fieldspec[05].name "m3.key"
+fieldspec[05].searchmethod AUTOUTF8
+fieldspec[06].arg1 ""
+fieldspec[06].name "m3.value"
+fieldspec[06].searchmethod AUTOUTF8
+fieldspec[07].arg1 ""
+fieldspec[07].name "m4.key"
+fieldspec[07].searchmethod AUTOUTF8
+fieldspec[08].arg1 ""
+fieldspec[08].name "m4.value.key"
+fieldspec[08].searchmethod AUTOUTF8
+fieldspec[09].arg1 ""
+fieldspec[09].name "m4.value.value"
+fieldspec[09].searchmethod AUTOUTF8
+fieldspec[10].arg1 ""
+fieldspec[10].name "name"
+fieldspec[10].searchmethod AUTOUTF8
diff --git a/streamingvisitors/src/tests/searchvisitor/cfg/vsmfields.simple.cfg b/streamingvisitors/src/tests/searchvisitor/cfg/vsmfields.simple.cfg
new file mode 100644
index 00000000000..e69de29bb2d
--- /dev/null
+++ b/streamingvisitors/src/tests/searchvisitor/cfg/vsmfields.simple.cfg
diff --git a/streamingvisitors/src/tests/searchvisitor/cfg/vsmsummary.aaa.cfg b/streamingvisitors/src/tests/searchvisitor/cfg/vsmsummary.aaa.cfg
new file mode 100644
index 00000000000..664778d40a8
--- /dev/null
+++ b/streamingvisitors/src/tests/searchvisitor/cfg/vsmsummary.aaa.cfg
@@ -0,0 +1,26 @@
+outputclass ""
+fieldmap[6]
+fieldmap[0].command NONE
+fieldmap[0].summary "m1"
+fieldmap[0].document[1]
+fieldmap[0].document[0].field "m1"
+fieldmap[1].command NONE
+fieldmap[1].summary "m2"
+fieldmap[1].document[3]
+fieldmap[1].document[0].field "m2.key"
+fieldmap[1].document[1].field "m2.value.a"
+fieldmap[1].document[2].field "m2.value.b"
+fieldmap[2].command NONE
+fieldmap[2].summary "m3"
+fieldmap[2].document[1]
+fieldmap[2].document[0].field "m3"
+fieldmap[3].command NONE
+fieldmap[3].summary "m4"
+fieldmap[3].document[1]
+fieldmap[3].document[0].field "m4"
+fieldmap[4].command NONE
+fieldmap[4].summary "rankfeatures"
+fieldmap[4].document[0]
+fieldmap[5].command NONE
+fieldmap[5].summary "summaryfeatures"
+fieldmap[5].document[0]
diff --git a/streamingvisitors/src/tests/searchvisitor/cfg/vsmsummary.simple.cfg b/streamingvisitors/src/tests/searchvisitor/cfg/vsmsummary.simple.cfg
new file mode 100644
index 00000000000..e69de29bb2d
--- /dev/null
+++ b/streamingvisitors/src/tests/searchvisitor/cfg/vsmsummary.simple.cfg
diff --git a/streamingvisitors/src/tests/searchvisitor/searchvisitor.cpp b/streamingvisitors/src/tests/searchvisitor/searchvisitor.cpp
new file mode 100644
index 00000000000..77df70ad256
--- /dev/null
+++ b/streamingvisitors/src/tests/searchvisitor/searchvisitor.cpp
@@ -0,0 +1,123 @@
+// Copyright 2016 Yahoo Inc. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root.
+#include <vespa/fastos/fastos.h>
+#include <vespa/vespalib/testkit/testapp.h>
+#include <vespa/searchlib/query/tree/querybuilder.h>
+#include <vespa/searchlib/query/tree/simplequery.h>
+#include <vespa/searchlib/query/tree/stackdumpcreator.h>
+#include <vespa/searchvisitor/searchenvironment.h>
+#include <vespa/searchvisitor/searchvisitor.h>
+#include <vespa/storage/frameworkimpl/component/storagecomponentregisterimpl.h>
+#include <vespa/storageframework/defaultimplementation/clock/fakeclock.h>
+
+using namespace search;
+using namespace search::query;
+using namespace document;
+
+namespace storage {
+
+class SearchVisitorTest : public vespalib::TestApp
+{
+private:
+ framework::defaultimplementation::FakeClock _clock;
+ StorageComponentRegisterImpl _componentRegister;
+ std::unique_ptr<StorageComponent> _component;
+ SearchEnvironment _env;
+ void testSearchVisitor();
+ void testSearchEnvironment();
+ void testCreateSearchVisitor(const vespalib::string & dir, const vdslib::Parameters & parameters);
+ void testOnlyRequireWeakReadConsistency();
+
+public:
+ SearchVisitorTest();
+ int Main();
+};
+
+SearchVisitorTest::SearchVisitorTest() :
+ vespalib::TestApp(),
+ _componentRegister(),
+ _env("dir:cfg")
+{
+ _componentRegister.setNodeInfo("mycluster", lib::NodeType::STORAGE, 1);
+ _componentRegister.setClock(_clock);
+ StorageComponent::DocumentTypeRepoSP repo(new DocumentTypeRepo(readDocumenttypesConfig("cfg/documenttypes.cfg")));
+ _componentRegister.setDocumentTypeRepo(repo);
+ _component.reset(new StorageComponent(_componentRegister, "storage"));
+};
+
+std::vector<spi::DocEntry::LP>
+createDocuments(const vespalib::string & dir)
+{
+ (void) dir;
+ std::vector<spi::DocEntry::LP> documents;
+ spi::Timestamp ts;
+ document::Document::UP doc(new document::Document());
+ spi::DocEntry::LP e(new spi::DocEntry(ts, 0, std::move(doc)));
+ documents.push_back(e);
+ return documents;
+}
+
+void
+SearchVisitorTest::testCreateSearchVisitor(const vespalib::string & dir, const vdslib::Parameters & params)
+{
+ SearchVisitorFactory sFactory(dir);
+ VisitorFactory & factory(sFactory);
+ std::unique_ptr<Visitor> sv(static_cast<SearchVisitor *>(factory.makeVisitor(*_component, _env, params)));
+ document::OrderingSpecification orderSpec;
+ document::BucketId bucketId;
+ std::vector<spi::DocEntry::LP> documents(createDocuments(dir));
+ Visitor::HitCounter hitCounter(&orderSpec);
+ sv->handleDocuments(bucketId, documents, hitCounter);
+}
+
+void
+SearchVisitorTest::testSearchEnvironment()
+{
+ EXPECT_TRUE(_env.getVSMAdapter("simple") != NULL);
+ EXPECT_TRUE(_env.getRankManager("simple") != NULL);
+}
+
+void
+SearchVisitorTest::testSearchVisitor()
+{
+ vdslib::Parameters params;
+ params.set("searchcluster", "aaa");
+ params.set("queryflags", "0x40000");
+ params.set("summarycount", "3");
+ params.set("summaryclass", "petra");
+ params.set("rankprofile", "default");
+
+ QueryBuilder<SimpleQueryNodeTypes> builder;
+ builder.addStringTerm("maptest", "sddocname", 0, Weight(0));
+ Node::UP node = builder.build();
+ vespalib::string stackDump = StackDumpCreator::create(*node);
+
+ params.set("query", stackDump);
+ testCreateSearchVisitor("dir:cfg", params);
+}
+
+void
+SearchVisitorTest::testOnlyRequireWeakReadConsistency()
+{
+ SearchVisitorFactory factory("dir:cfg");
+ VisitorFactory& factoryBase(factory);
+ vdslib::Parameters params;
+ std::unique_ptr<Visitor> sv(
+ factoryBase.makeVisitor(*_component, _env, params));
+ EXPECT_TRUE(sv->getRequiredReadConsistency() == spi::ReadConsistency::WEAK);
+}
+
+int
+SearchVisitorTest::Main()
+{
+ TEST_INIT("searchvisitor_test");
+
+ testSearchVisitor(); TEST_FLUSH();
+ testSearchEnvironment(); TEST_FLUSH();
+ testOnlyRequireWeakReadConsistency(); TEST_FLUSH();
+
+ TEST_DONE();
+}
+
+} // namespace storage
+
+TEST_APPHOOK(storage::SearchVisitorTest)