0
0
bleve/search/query_syntax_parser_test.go
Marty Schoch f225d484b3 overhauled search
many bugs fixed in existing search
phrase query updated to support gaps in term sequence
new query types
all,none,match,phrase match
and new query syntax search, like google search:
+/-(optional field qualifier:)<term or quoted phrase>
2014-07-11 14:49:59 -04:00

236 lines
4.5 KiB
Go

package search
import (
"reflect"
"testing"
"github.com/couchbaselabs/bleve/document"
)
func TestQuerySyntaxParserValid(t *testing.T) {
tests := []struct {
input string
result Query
mapping document.Mapping
}{
{
input: "test",
mapping: document.Mapping{},
result: &TermBooleanQuery{
Should: &TermDisjunctionQuery{
Terms: []Query{
&MatchQuery{
Match: "test",
Field: "_all",
BoostVal: 1.0,
Explain: true,
},
},
BoostVal: 1.0,
Explain: true,
Min: 1.0,
},
BoostVal: 1.0,
Explain: true,
},
},
{
input: "field:test",
mapping: document.Mapping{},
result: &TermBooleanQuery{
Should: &TermDisjunctionQuery{
Terms: []Query{
&MatchQuery{
Match: "test",
Field: "field",
BoostVal: 1.0,
Explain: true,
},
},
BoostVal: 1.0,
Explain: true,
Min: 1.0,
},
BoostVal: 1.0,
Explain: true,
},
},
{
input: "+field1:test1",
mapping: document.Mapping{},
result: &TermBooleanQuery{
Must: &TermConjunctionQuery{
Terms: []Query{
&MatchQuery{
Match: "test1",
Field: "field1",
BoostVal: 1.0,
Explain: true,
},
},
BoostVal: 1.0,
Explain: true,
},
BoostVal: 1.0,
Explain: true,
},
},
{
input: "-field2:test2",
mapping: document.Mapping{},
result: &TermBooleanQuery{
MustNot: &TermDisjunctionQuery{
Terms: []Query{
&MatchQuery{
Match: "test2",
Field: "field2",
BoostVal: 1.0,
Explain: true,
},
},
BoostVal: 1.0,
Explain: true,
},
BoostVal: 1.0,
Explain: true,
},
},
{
input: `field3:"test phrase 2"`,
mapping: document.Mapping{},
result: &TermBooleanQuery{
Should: &TermDisjunctionQuery{
Terms: []Query{
&MatchPhraseQuery{
MatchPhrase: "test phrase 2",
Field: "field3",
BoostVal: 1.0,
Explain: true,
},
},
BoostVal: 1.0,
Explain: true,
Min: 1.0,
},
BoostVal: 1.0,
Explain: true,
},
},
{
input: `+field4:"test phrase 1"`,
mapping: document.Mapping{},
result: &TermBooleanQuery{
Must: &TermConjunctionQuery{
Terms: []Query{
&MatchPhraseQuery{
MatchPhrase: "test phrase 1",
Field: "field4",
BoostVal: 1.0,
Explain: true,
},
},
BoostVal: 1.0,
Explain: true,
},
BoostVal: 1.0,
Explain: true,
},
},
{
input: `-field5:"test phrase 2"`,
mapping: document.Mapping{},
result: &TermBooleanQuery{
MustNot: &TermDisjunctionQuery{
Terms: []Query{
&MatchPhraseQuery{
MatchPhrase: "test phrase 2",
Field: "field5",
BoostVal: 1.0,
Explain: true,
},
},
BoostVal: 1.0,
Explain: true,
},
BoostVal: 1.0,
Explain: true,
},
},
{
input: `+field6:test3 -field7:test4 field8:test5`,
mapping: document.Mapping{},
result: &TermBooleanQuery{
Must: &TermConjunctionQuery{
Terms: []Query{
&MatchQuery{
Match: "test3",
Field: "field6",
BoostVal: 1.0,
Explain: true,
},
},
BoostVal: 1.0,
Explain: true,
},
MustNot: &TermDisjunctionQuery{
Terms: []Query{
&MatchQuery{
Match: "test4",
Field: "field7",
BoostVal: 1.0,
Explain: true,
},
},
BoostVal: 1.0,
Explain: true,
},
Should: &TermDisjunctionQuery{
Terms: []Query{
&MatchQuery{
Match: "test5",
Field: "field8",
BoostVal: 1.0,
Explain: true,
},
},
BoostVal: 1.0,
Explain: true,
Min: 1.0,
},
BoostVal: 1.0,
Explain: true,
},
},
}
parsingDefaultField = "_all"
for _, test := range tests {
q, err := ParseQuerySyntax(test.input, test.mapping)
if err != nil {
t.Error(err)
}
if !reflect.DeepEqual(q, test.result) {
t.Errorf("Expected %#v, got %#v: for %s", test.result, q, test.input)
for _, x := range q.(*TermBooleanQuery).Should.Terms {
t.Logf("term: %#v", x)
}
}
}
}
func TestQuerySyntaxParserInvalid(t *testing.T) {
tests := []struct {
input string
}{
{"^"},
{"^5"},
}
for _, test := range tests {
_, err := ParseQuerySyntax(test.input, document.Mapping{})
if err == nil {
t.Errorf("expected error, got nil for `%s`", test.input)
}
}
}