aboutsummaryrefslogtreecommitdiffstats
path: root/streamingvisitors
diff options
context:
space:
mode:
authorGeir Storli <geirst@yahooinc.com>2023-04-27 14:01:00 +0000
committerGeir Storli <geirst@yahooinc.com>2023-04-27 14:11:03 +0000
commit232b1d3460c1a15aa64e1aae3f516dbfda290701 (patch)
treefce0623f10d0656bf90010b0d80fd8561b339019 /streamingvisitors
parentf5dd3cb5d31875cf596adc01f2207f690afe553f (diff)
Test basic query execution in search visitor.
Diffstat (limited to 'streamingvisitors')
-rw-r--r--streamingvisitors/src/tests/searchvisitor/cfg/documenttypes.cfg358
-rwxr-xr-xstreamingvisitors/src/tests/searchvisitor/cfg/generate.sh25
-rw-r--r--streamingvisitors/src/tests/searchvisitor/cfg/juniperrc.mycl.cfg (renamed from streamingvisitors/src/tests/searchvisitor/cfg/juniperrc.aaa.cfg)7
-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.mycl.cfg15
-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.mycl.cfg41
-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/test.sd16
-rw-r--r--streamingvisitors/src/tests/searchvisitor/cfg/vsmfields.aaa.cfg98
-rw-r--r--streamingvisitors/src/tests/searchvisitor/cfg/vsmfields.mycl.cfg10
-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.mycl.cfg8
-rw-r--r--streamingvisitors/src/tests/searchvisitor/cfg/vsmsummary.simple.cfg0
-rw-r--r--streamingvisitors/src/tests/searchvisitor/searchvisitor_test.cpp224
-rw-r--r--streamingvisitors/src/vespa/searchvisitor/searchvisitor.cpp9
-rw-r--r--streamingvisitors/src/vespa/searchvisitor/searchvisitor.h4
22 files changed, 364 insertions, 561 deletions
diff --git a/streamingvisitors/src/tests/searchvisitor/cfg/documenttypes.cfg b/streamingvisitors/src/tests/searchvisitor/cfg/documenttypes.cfg
index db0df6fba25..2eb6e552274 100644
--- a/streamingvisitors/src/tests/searchvisitor/cfg/documenttypes.cfg
+++ b/streamingvisitors/src/tests/searchvisitor/cfg/documenttypes.cfg
@@ -1,301 +1,57 @@
-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].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].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].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].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].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].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].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].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].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].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].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].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].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].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].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].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
+ignoreundefinedfields false
+usev8geopositions false
+doctype[0].name "document"
+doctype[0].idx 10000
+doctype[0].internalid 8
+doctype[0].contentstruct 10001
+doctype[0].primitivetype[0].idx 10002
+doctype[0].primitivetype[0].name "bool"
+doctype[0].primitivetype[1].idx 10003
+doctype[0].primitivetype[1].name "byte"
+doctype[0].primitivetype[2].idx 10004
+doctype[0].primitivetype[2].name "double"
+doctype[0].primitivetype[3].idx 10005
+doctype[0].primitivetype[3].name "float"
+doctype[0].primitivetype[4].idx 10006
+doctype[0].primitivetype[4].name "float16"
+doctype[0].primitivetype[5].idx 10007
+doctype[0].primitivetype[5].name "int"
+doctype[0].primitivetype[6].idx 10008
+doctype[0].primitivetype[6].name "long"
+doctype[0].primitivetype[7].idx 10010
+doctype[0].primitivetype[7].name "predicate"
+doctype[0].primitivetype[8].idx 10011
+doctype[0].primitivetype[8].name "raw"
+doctype[0].primitivetype[9].idx 10012
+doctype[0].primitivetype[9].name "string"
+doctype[0].primitivetype[10].idx 10014
+doctype[0].primitivetype[10].name "uri"
+doctype[0].wsettype[0].idx 10013
+doctype[0].wsettype[0].elementtype 10012
+doctype[0].wsettype[0].createifnonexistent true
+doctype[0].wsettype[0].removeifzero true
+doctype[0].wsettype[0].internalid 18
+doctype[0].structtype[0].idx 10001
+doctype[0].structtype[0].name "document.header"
+doctype[0].structtype[0].internalid -284186494
+doctype[0].structtype[1].idx 10009
+doctype[0].structtype[1].name "position"
+doctype[0].structtype[1].field[0].name "x"
+doctype[0].structtype[1].field[0].internalid 914677694
+doctype[0].structtype[1].field[0].type 10007
+doctype[0].structtype[1].field[1].name "y"
+doctype[0].structtype[1].field[1].internalid 900009410
+doctype[0].structtype[1].field[1].type 10007
+doctype[0].structtype[1].internalid 1381038251
+doctype[1].name "test"
+doctype[1].idx 10015
+doctype[1].internalid -877171244
+doctype[1].inherits[0].idx 10000
+doctype[1].contentstruct 10016
+doctype[1].fieldsets{[document]}.fields[0] "id"
+doctype[1].structtype[0].idx 10016
+doctype[1].structtype[0].name "test.header"
+doctype[1].structtype[0].field[0].name "id"
+doctype[1].structtype[0].field[0].internalid 2086523186
+doctype[1].structtype[0].field[0].type 10007
+doctype[1].structtype[0].internalid 306916075
diff --git a/streamingvisitors/src/tests/searchvisitor/cfg/generate.sh b/streamingvisitors/src/tests/searchvisitor/cfg/generate.sh
new file mode 100755
index 00000000000..1eade461060
--- /dev/null
+++ b/streamingvisitors/src/tests/searchvisitor/cfg/generate.sh
@@ -0,0 +1,25 @@
+#!/bin/sh
+# Use this script to generate config files based on test.sd:
+# ./generate.sh
+
+# Generate config files:
+cd $HOME/git/vespa
+WORK_DIR=$HOME/git/vespa/streamingvisitors/src/tests/searchvisitor/cfg
+mvn test -Dtest=SchemaToDerivedConfigExporter -Dschema.exporter.path=$WORK_DIR -pl config-model
+
+cd $WORK_DIR
+# Delete files not relevant for streaming:
+rm attributes.cfg
+rm ilscripts.cfg
+rm imported-fields.cfg
+rm index-info.cfg
+rm indexschema.cfg
+rm onnx-models.cfg
+rm schema-info.cfg
+
+# Add search cluster name as part of file name:
+mv juniperrc.cfg juniperrc.mycl.cfg
+mv rank-profiles.cfg rank-profiles.mycl.cfg
+mv summary.cfg summary.mycl.cfg
+mv vsmfields.cfg vsmfields.mycl.cfg
+mv vsmsummary.cfg vsmsummary.mycl.cfg
diff --git a/streamingvisitors/src/tests/searchvisitor/cfg/juniperrc.aaa.cfg b/streamingvisitors/src/tests/searchvisitor/cfg/juniperrc.mycl.cfg
index 09e13ed0f8b..f2116782b7a 100644
--- a/streamingvisitors/src/tests/searchvisitor/cfg/juniperrc.aaa.cfg
+++ b/streamingvisitors/src/tests/searchvisitor/cfg/juniperrc.mycl.cfg
@@ -1,11 +1,10 @@
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]
+max_match_candidates 1000
+stem_min_length 5
+stem_max_extend 3
diff --git a/streamingvisitors/src/tests/searchvisitor/cfg/juniperrc.simple.cfg b/streamingvisitors/src/tests/searchvisitor/cfg/juniperrc.simple.cfg
deleted file mode 100644
index e69de29bb2d..00000000000
--- a/streamingvisitors/src/tests/searchvisitor/cfg/juniperrc.simple.cfg
+++ /dev/null
diff --git a/streamingvisitors/src/tests/searchvisitor/cfg/rank-profiles.aaa.cfg b/streamingvisitors/src/tests/searchvisitor/cfg/rank-profiles.aaa.cfg
deleted file mode 100644
index cf3ee6a7179..00000000000
--- a/streamingvisitors/src/tests/searchvisitor/cfg/rank-profiles.aaa.cfg
+++ /dev/null
@@ -1,43 +0,0 @@
-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.mycl.cfg b/streamingvisitors/src/tests/searchvisitor/cfg/rank-profiles.mycl.cfg
new file mode 100644
index 00000000000..d3132a8ff25
--- /dev/null
+++ b/streamingvisitors/src/tests/searchvisitor/cfg/rank-profiles.mycl.cfg
@@ -0,0 +1,15 @@
+rankprofile[0].name "default"
+rankprofile[1].name "unranked"
+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"
+rankprofile[2].name "myrank"
+rankprofile[2].fef.property[0].name "vespa.rank.firstphase"
+rankprofile[2].fef.property[0].value "rankingExpression(firstphase)"
+rankprofile[2].fef.property[1].name "rankingExpression(firstphase).rankingScript"
+rankprofile[2].fef.property[1].value "attribute(id) + 10"
diff --git a/streamingvisitors/src/tests/searchvisitor/cfg/rank-profiles.simple.cfg b/streamingvisitors/src/tests/searchvisitor/cfg/rank-profiles.simple.cfg
deleted file mode 100644
index e69de29bb2d..00000000000
--- a/streamingvisitors/src/tests/searchvisitor/cfg/rank-profiles.simple.cfg
+++ /dev/null
diff --git a/streamingvisitors/src/tests/searchvisitor/cfg/summary.aaa.cfg b/streamingvisitors/src/tests/searchvisitor/cfg/summary.aaa.cfg
deleted file mode 100644
index 8cc32ed5ea4..00000000000
--- a/streamingvisitors/src/tests/searchvisitor/cfg/summary.aaa.cfg
+++ /dev/null
@@ -1,30 +0,0 @@
-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.mycl.cfg b/streamingvisitors/src/tests/searchvisitor/cfg/summary.mycl.cfg
new file mode 100644
index 00000000000..5983609ac9d
--- /dev/null
+++ b/streamingvisitors/src/tests/searchvisitor/cfg/summary.mycl.cfg
@@ -0,0 +1,41 @@
+defaultsummaryid 793791073
+usev8geopositions true
+classes[0].id 793791073
+classes[0].name "default"
+classes[0].omitsummaryfeatures false
+classes[0].fields[0].name "id"
+classes[0].fields[0].command "attribute"
+classes[0].fields[0].source "id"
+classes[0].fields[1].name "rankfeatures"
+classes[0].fields[1].command "rankfeatures"
+classes[0].fields[1].source ""
+classes[0].fields[2].name "summaryfeatures"
+classes[0].fields[2].command "summaryfeatures"
+classes[0].fields[2].source ""
+classes[0].fields[3].name "documentid"
+classes[0].fields[3].command "documentid"
+classes[0].fields[3].source ""
+classes[1].id 1473683981
+classes[1].name "mysum"
+classes[1].omitsummaryfeatures false
+classes[1].fields[0].name "id"
+classes[1].fields[0].command "attribute"
+classes[1].fields[0].source "id"
+classes[1].fields[1].name "rankfeatures"
+classes[1].fields[1].command "rankfeatures"
+classes[1].fields[1].source ""
+classes[1].fields[2].name "summaryfeatures"
+classes[1].fields[2].command "summaryfeatures"
+classes[1].fields[2].source ""
+classes[2].id 1783786855
+classes[2].name "attributeprefetch"
+classes[2].omitsummaryfeatures false
+classes[2].fields[0].name "id"
+classes[2].fields[0].command "attribute"
+classes[2].fields[0].source "id"
+classes[2].fields[1].name "rankfeatures"
+classes[2].fields[1].command "rankfeatures"
+classes[2].fields[1].source ""
+classes[2].fields[2].name "summaryfeatures"
+classes[2].fields[2].command "summaryfeatures"
+classes[2].fields[2].source ""
diff --git a/streamingvisitors/src/tests/searchvisitor/cfg/summary.simple.cfg b/streamingvisitors/src/tests/searchvisitor/cfg/summary.simple.cfg
deleted file mode 100644
index e69de29bb2d..00000000000
--- a/streamingvisitors/src/tests/searchvisitor/cfg/summary.simple.cfg
+++ /dev/null
diff --git a/streamingvisitors/src/tests/searchvisitor/cfg/summarymap.aaa.cfg b/streamingvisitors/src/tests/searchvisitor/cfg/summarymap.aaa.cfg
deleted file mode 100644
index 1c9567431ae..00000000000
--- a/streamingvisitors/src/tests/searchvisitor/cfg/summarymap.aaa.cfg
+++ /dev/null
@@ -1,11 +0,0 @@
-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
deleted file mode 100644
index e69de29bb2d..00000000000
--- a/streamingvisitors/src/tests/searchvisitor/cfg/summarymap.simple.cfg
+++ /dev/null
diff --git a/streamingvisitors/src/tests/searchvisitor/cfg/test.sd b/streamingvisitors/src/tests/searchvisitor/cfg/test.sd
new file mode 100644
index 00000000000..ad998aa91f6
--- /dev/null
+++ b/streamingvisitors/src/tests/searchvisitor/cfg/test.sd
@@ -0,0 +1,16 @@
+schema test {
+ document test {
+ field id type int {
+ indexing: attribute | summary
+ }
+ }
+ document-summary mysum {
+ summary id type int {}
+ }
+ rank-profile myrank {
+ first-phase {
+ expression: attribute(id) + 10
+ }
+ }
+}
+
diff --git a/streamingvisitors/src/tests/searchvisitor/cfg/vsmfields.aaa.cfg b/streamingvisitors/src/tests/searchvisitor/cfg/vsmfields.aaa.cfg
deleted file mode 100644
index 4d976764bd9..00000000000
--- a/streamingvisitors/src/tests/searchvisitor/cfg/vsmfields.aaa.cfg
+++ /dev/null
@@ -1,98 +0,0 @@
-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.mycl.cfg b/streamingvisitors/src/tests/searchvisitor/cfg/vsmfields.mycl.cfg
new file mode 100644
index 00000000000..78b53fe24fb
--- /dev/null
+++ b/streamingvisitors/src/tests/searchvisitor/cfg/vsmfields.mycl.cfg
@@ -0,0 +1,10 @@
+documentverificationlevel 0
+searchall 1
+fieldspec[0].name "id"
+fieldspec[0].searchmethod INT32
+fieldspec[0].arg1 ""
+fieldspec[0].maxlength 1048576
+fieldspec[0].fieldtype ATTRIBUTE
+documenttype[0].name "test"
+documenttype[0].index[0].name "id"
+documenttype[0].index[0].field[0].name "id"
diff --git a/streamingvisitors/src/tests/searchvisitor/cfg/vsmfields.simple.cfg b/streamingvisitors/src/tests/searchvisitor/cfg/vsmfields.simple.cfg
deleted file mode 100644
index e69de29bb2d..00000000000
--- a/streamingvisitors/src/tests/searchvisitor/cfg/vsmfields.simple.cfg
+++ /dev/null
diff --git a/streamingvisitors/src/tests/searchvisitor/cfg/vsmsummary.aaa.cfg b/streamingvisitors/src/tests/searchvisitor/cfg/vsmsummary.aaa.cfg
deleted file mode 100644
index 664778d40a8..00000000000
--- a/streamingvisitors/src/tests/searchvisitor/cfg/vsmsummary.aaa.cfg
+++ /dev/null
@@ -1,26 +0,0 @@
-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.mycl.cfg b/streamingvisitors/src/tests/searchvisitor/cfg/vsmsummary.mycl.cfg
new file mode 100644
index 00000000000..4dc35c8e1ce
--- /dev/null
+++ b/streamingvisitors/src/tests/searchvisitor/cfg/vsmsummary.mycl.cfg
@@ -0,0 +1,8 @@
+outputclass ""
+fieldmap[0].summary "id"
+fieldmap[0].document[0].field "id"
+fieldmap[0].command NONE
+fieldmap[1].summary "rankfeatures"
+fieldmap[1].command NONE
+fieldmap[2].summary "summaryfeatures"
+fieldmap[2].command NONE
diff --git a/streamingvisitors/src/tests/searchvisitor/cfg/vsmsummary.simple.cfg b/streamingvisitors/src/tests/searchvisitor/cfg/vsmsummary.simple.cfg
deleted file mode 100644
index e69de29bb2d..00000000000
--- a/streamingvisitors/src/tests/searchvisitor/cfg/vsmsummary.simple.cfg
+++ /dev/null
diff --git a/streamingvisitors/src/tests/searchvisitor/searchvisitor_test.cpp b/streamingvisitors/src/tests/searchvisitor/searchvisitor_test.cpp
index 5521994e60e..b93a2c25f82 100644
--- a/streamingvisitors/src/tests/searchvisitor/searchvisitor_test.cpp
+++ b/streamingvisitors/src/tests/searchvisitor/searchvisitor_test.cpp
@@ -1,6 +1,8 @@
// Copyright Yahoo. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root.
#include <vespa/document/base/testdocrepo.h>
+#include <vespa/document/datatype/documenttype.h>
+#include <vespa/document/fieldvalue/document.h>
#include <vespa/document/repo/documenttyperepo.h>
#include <vespa/persistence/spi/docentry.h>
#include <vespa/searchlib/query/tree/querybuilder.h>
@@ -22,27 +24,149 @@ using namespace storage;
namespace streaming {
-class SearchVisitorTest : public testing::Test
-{
+vespalib::string get_doc_id(int id) {
+ return "id:test:test::" + std::to_string(id);
+}
+
+/**
+ * This class reflects the document type defined in cfg/test.sd.
+ */
+struct MyDocument {
+ int id;
+ MyDocument(int id_in) : id(id_in) {}
+ std::unique_ptr<Document> to_document(const DocumentTypeRepo& repo, const DataType& doc_type) const {
+ auto result = std::make_unique<Document>(repo, doc_type, DocumentId(get_doc_id(id)));
+ result->setValue("id", std::make_unique<IntFieldValue>(id));
+ return result;
+ }
+};
+
+using DocumentVector = std::vector<MyDocument>;
+
+struct MyHit {
+ vespalib::string doc_id;
+ double rank;
+ MyHit(int id, double rank_in) noexcept : doc_id(get_doc_id(id)), rank(rank_in) {}
+ MyHit(int id) noexcept : doc_id(get_doc_id(id)), rank(0.0) {}
+ MyHit(const vespalib::string& doc_id_in, double rank_in) noexcept : doc_id(doc_id_in), rank(rank_in) {}
+ bool operator==(const MyHit& rhs) const {
+ return (doc_id == rhs.doc_id) &&
+ (rank == rhs.rank);
+ }
+};
+
+using HitVector = std::vector<MyHit>;
+
+std::ostream& operator<<(std::ostream& oss, const MyHit& hit) {
+ oss << "{doc_id=" << hit.doc_id << ",rank=" << hit.rank << "}";
+ return oss;
+}
+
+class RequestBuilder {
+private:
+ vdslib::Parameters _params;
+ QueryBuilder<SimpleQueryNodeTypes> _builder;
+ int32_t _term_id;
+
+public:
+ RequestBuilder() : _params(), _builder(), _term_id(1)
+ {
+ search_cluster("mycl");
+ rank_profile("myrank");
+ summary_class("mysum");
+ summary_count(10);
+ }
+ RequestBuilder& set_param(const vespalib::string& key, const vespalib::string& value) {
+ _params.set(key, value);
+ return *this;
+ }
+ RequestBuilder& search_cluster(const vespalib::string& value) { return set_param("searchcluster", value); }
+ RequestBuilder& rank_profile(const vespalib::string& value) { return set_param("rankprofile", value); }
+ RequestBuilder& summary_class(const vespalib::string& value) { return set_param("summaryclass", value); }
+ RequestBuilder& summary_count(uint32_t value) { return set_param("summarycount", std::to_string(value)); }
+ RequestBuilder& string_term(const vespalib::string& term, const vespalib::string& field) {
+ _builder.addStringTerm(term, field, _term_id++, Weight(100));
+ return *this;
+ }
+ RequestBuilder& number_term(const vespalib::string& term, const vespalib::string& field) {
+ _builder.addNumberTerm(term, field, _term_id++, Weight(100));
+ return *this;
+ }
+ vdslib::Parameters build() {
+ auto node = _builder.build();
+ vespalib::string query_stack_dump = StackDumpCreator::create(*node);
+ _params.set("query", query_stack_dump);
+ return _params;
+ }
+};
+
+struct VisitorSession {
+ std::unique_ptr<SearchVisitor> search_visitor;
+ Visitor& visitor;
+ Visitor::HitCounter hit_counter;
+ VisitorSession(SearchVisitor* sv)
+ : search_visitor(sv),
+ visitor(*search_visitor),
+ hit_counter()
+ {
+ }
+ void handle_documents(Visitor::DocEntryList& docs) {
+ document::BucketId bucket_id;
+ visitor.handleDocuments(bucket_id, docs, hit_counter);
+ }
+ std::unique_ptr<documentapi::QueryResultMessage> generate_query_result() {
+ return search_visitor->generate_query_result(hit_counter);
+ }
+};
+
+class SearchVisitorTest : public testing::Test {
public:
framework::defaultimplementation::FakeClock _clock;
StorageComponentRegisterImpl _componentRegister;
std::unique_ptr<StorageComponent> _component;
SearchEnvironment _env;
- void testCreateSearchVisitor(const vespalib::string & dir, const vdslib::Parameters & parameters);
+ SearchVisitorFactory _factory;
+ std::shared_ptr<DocumentTypeRepo> _repo;
+ const document::DocumentType* _doc_type;
SearchVisitorTest();
~SearchVisitorTest() override;
+
+ std::unique_ptr<VisitorSession> make_visitor_session(const vdslib::Parameters& params) {
+ VisitorFactory& factory(_factory);
+ auto *visitor = factory.makeVisitor(*_component, _env, params);
+ auto *search_visitor = dynamic_cast<SearchVisitor *>(visitor);
+ assert(search_visitor != nullptr);
+ return std::make_unique<VisitorSession>(search_visitor);
+ }
+ Visitor::DocEntryList make_documents(const std::vector<MyDocument>& docs) const {
+ Visitor::DocEntryList result;
+ for (const auto& doc : docs) {
+ result.push_back(spi::DocEntry::create(spi::Timestamp(),
+ doc.to_document(*_repo, *_doc_type)));
+ }
+ return result;
+ }
+ std::unique_ptr<documentapi::QueryResultMessage> execute_query(const vdslib::Parameters& params,
+ const DocumentVector& docs) {
+ auto session = make_visitor_session(params);
+ auto entries = make_documents(docs);
+ session->handle_documents(entries);
+ return session->generate_query_result();
+ }
};
SearchVisitorTest::SearchVisitorTest() :
_componentRegister(),
- _env(::config::ConfigUri("dir:cfg"))
+ _env(::config::ConfigUri("dir:cfg")),
+ _factory(::config::ConfigUri("dir:cfg")),
+ _repo(std::make_shared<DocumentTypeRepo>(readDocumenttypesConfig("cfg/documenttypes.cfg"))),
+ _doc_type(_repo->getDocumentType("test"))
{
- _componentRegister.setNodeInfo("mycluster", lib::NodeType::STORAGE, 1);
+ assert(_doc_type != nullptr);
+ _componentRegister.setNodeInfo("mycl", lib::NodeType::STORAGE, 1);
_componentRegister.setClock(_clock);
- auto repo = std::make_shared<DocumentTypeRepo>(readDocumenttypesConfig("cfg/documenttypes.cfg"));
- _componentRegister.setDocumentTypeRepo(repo);
+ _componentRegister.setDocumentTypeRepo(_repo);
_component = std::make_unique<StorageComponent>(_componentRegister, "storage");
}
@@ -51,61 +175,67 @@ SearchVisitorTest::~SearchVisitorTest()
_env.clear_thread_local_env_map();
}
-Visitor::DocEntryList
-createDocuments(const vespalib::string & dir)
+TEST_F(SearchVisitorTest, search_environment_is_configured)
+{
+ EXPECT_TRUE(_env.getVSMAdapter("mycl") != nullptr);
+ EXPECT_TRUE(_env.getRankManager("mycl") != nullptr);
+}
+
+HitVector
+to_hit_vector(vdslib::SearchResult& res)
+{
+ HitVector result;
+ const char* doc_id;
+ double rank;
+ for (size_t i = 0; i < res.getHitCount(); ++i) {
+ res.getHit(i, doc_id, rank);
+ result.emplace_back(vespalib::string(doc_id), rank);
+ }
+ return result;
+}
+
+HitVector
+to_hit_vector(vdslib::DocumentSummary& sum)
{
- (void) dir;
- Visitor::DocEntryList documents;
- spi::Timestamp ts;
- auto e = spi::DocEntry::create(ts, std::make_unique<Document>());
- documents.push_back(std::move(e));
- return documents;
+ HitVector result;
+ const char* doc_id;
+ const void* buf;
+ size_t sz;
+ for (size_t i = 0; i < sum.getSummaryCount(); ++i) {
+ sum.getSummary(i, doc_id, buf, sz);
+ result.emplace_back(vespalib::string(doc_id), 0.0);
+ }
+ return result;
}
void
-SearchVisitorTest::testCreateSearchVisitor(const vespalib::string & dir, const vdslib::Parameters & params)
+expect_hits(const HitVector& exp_hits, documentapi::QueryResultMessage& res)
{
- ::config::ConfigUri uri(dir);
- SearchVisitorFactory sFactory(uri);
- VisitorFactory & factory(sFactory);
- std::unique_ptr<Visitor> sv(static_cast<SearchVisitor *>(factory.makeVisitor(*_component, _env, params)));
- document::BucketId bucketId;
- Visitor::DocEntryList documents(createDocuments(dir));
- Visitor::HitCounter hitCounter;
- sv->handleDocuments(bucketId, documents, hitCounter);
+ EXPECT_EQ(exp_hits.size(), res.getSearchResult().getHitCount());
+ EXPECT_EQ(exp_hits, to_hit_vector(res.getSearchResult()));
}
-TEST_F(SearchVisitorTest, test_search_environment)
+void
+expect_summary(const HitVector& exp_summary, documentapi::QueryResultMessage& res)
{
- EXPECT_TRUE(_env.getVSMAdapter("simple") != nullptr);
- EXPECT_TRUE(_env.getRankManager("simple") != nullptr);
+ EXPECT_EQ(exp_summary.size(), res.getDocumentSummary().getSummaryCount());
+ EXPECT_EQ(exp_summary, to_hit_vector(res.getDocumentSummary()));
}
-TEST_F(SearchVisitorTest, test_search_visitor)
+TEST_F(SearchVisitorTest, basic_query_execution_in_search_visitor)
{
- 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);
+ auto res = execute_query(RequestBuilder().
+ number_term("[5;10]", "id").build(),
+ {{3},{7},{4},{5},{9}});
+ expect_hits({{9,19.0}, {7,17.0}, {5,15.0}}, *res);
+ expect_summary({{5}, {7}, {9}}, *res);
}
-TEST_F(SearchVisitorTest, test_only_require_weak_read_consistency)
+TEST_F(SearchVisitorTest, visitor_only_require_weak_read_consistency)
{
- SearchVisitorFactory factory(::config::ConfigUri("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);
+ auto session = make_visitor_session(params);
+ EXPECT_TRUE(session->visitor.getRequiredReadConsistency() == spi::ReadConsistency::WEAK);
}
}
diff --git a/streamingvisitors/src/vespa/searchvisitor/searchvisitor.cpp b/streamingvisitors/src/vespa/searchvisitor/searchvisitor.cpp
index 8980bc1f54d..105196a3249 100644
--- a/streamingvisitors/src/vespa/searchvisitor/searchvisitor.cpp
+++ b/streamingvisitors/src/vespa/searchvisitor/searchvisitor.cpp
@@ -238,7 +238,7 @@ void SearchVisitor::GroupingEntry::aggregate(const document::Document & doc, sea
}
SearchVisitor::~SearchVisitor() {
- if (! isCompletedCalled()) {
+ if (!isCompletedCalled() && _queryResult) {
HitCounter hc;
completedVisitingInternal(hc);
}
@@ -1126,6 +1126,13 @@ void SearchVisitor::completedBucket(const document::BucketId&, HitCounter&)
LOG(debug, "Completed bucket");
}
+std::unique_ptr<documentapi::QueryResultMessage>
+SearchVisitor::generate_query_result(HitCounter& counter)
+{
+ completedVisitingInternal(counter);
+ return std::move(_queryResult);
+}
+
void SearchVisitor::completedVisitingInternal(HitCounter& hitCounter)
{
if (_vsmAdapter == nullptr) {
diff --git a/streamingvisitors/src/vespa/searchvisitor/searchvisitor.h b/streamingvisitors/src/vespa/searchvisitor/searchvisitor.h
index 80df69f756e..d7c68162246 100644
--- a/streamingvisitors/src/vespa/searchvisitor/searchvisitor.h
+++ b/streamingvisitors/src/vespa/searchvisitor/searchvisitor.h
@@ -46,6 +46,10 @@ public:
const vdslib::Parameters & params);
~SearchVisitor() override;
+
+ // This should only be used by unit tests.
+ std::unique_ptr<documentapi::QueryResultMessage> generate_query_result(HitCounter& counter);
+
private:
/**
* This struct wraps an attribute vector.