0
0

refactored boolean query to only depend on query

This commit is contained in:
Marty Schoch 2014-08-29 16:27:32 -04:00
parent 77c998a7a2
commit 607b038283
9 changed files with 447 additions and 575 deletions

View File

@ -20,11 +20,19 @@ type BooleanQuery struct {
BoostVal float64 `json:"boost,omitempty"`
}
func NewBooleanQuery(must *ConjunctionQuery, should *DisjunctionQuery, mustNot *DisjunctionQuery) *BooleanQuery {
func NewBooleanQuery(must []Query, should []Query, mustNot []Query) *BooleanQuery {
min := 0.0
if len(should) > 0 {
min = 1.0
}
return NewBooleanQueryMinShould(must, should, mustNot, min)
}
func NewBooleanQueryMinShould(must []Query, should []Query, mustNot []Query, minShould float64) *BooleanQuery {
return &BooleanQuery{
Must: must,
Should: should,
MustNot: mustNot,
Must: NewConjunctionQuery(must),
Should: NewDisjunctionQueryMin(should, minShould),
MustNot: NewDisjunctionQuery(mustNot),
BoostVal: 1.0,
}
}

View File

@ -21,6 +21,9 @@ type ConjunctionQuery struct {
}
func NewConjunctionQuery(conjuncts []Query) *ConjunctionQuery {
if len(conjuncts) == 0 {
return nil
}
return &ConjunctionQuery{
Conjuncts: conjuncts,
BoostVal: 1.0,

View File

@ -22,12 +22,26 @@ type DisjunctionQuery struct {
}
func NewDisjunctionQuery(disjuncts []Query) *DisjunctionQuery {
if len(disjuncts) == 0 {
return nil
}
return &DisjunctionQuery{
Disjuncts: disjuncts,
BoostVal: 1.0,
}
}
func NewDisjunctionQueryMin(disjuncts []Query, min float64) *DisjunctionQuery {
if len(disjuncts) == 0 {
return nil
}
return &DisjunctionQuery{
Disjuncts: disjuncts,
BoostVal: 1.0,
MinVal: min,
}
}
func (q *DisjunctionQuery) Boost() float64 {
return q.BoostVal
}

View File

@ -23,37 +23,16 @@ a = make([]family, 1)
{
var acc [18]bool
var fun [18]func(rune) int
fun[15] = func(r rune) int {
fun[10] = func(r rune) int {
switch(r) {
case 117: return 2
case 114: return 2
case 92: return 3
case 116: return 2
case 102: return 16
case 110: return 2
case 34: return 4
case 47: return 2
case 98: return 16
default:
switch {
case 48 <= r && r <= 57: return 16
case 65 <= r && r <= 70: return 16
case 97 <= r && r <= 102: return 16
default: return 2
}
}
panic("unreachable")
}
fun[2] = func(r rune) int {
switch(r) {
case 34: return 4
case 47: return 2
case 98: return 2
case 117: return 2
case 114: return 2
case 92: return 3
case 116: return 2
case 102: return 2
case 92: return 4
case 117: return 2
case 34: return 3
case 114: return 2
case 116: return 2
case 98: return 2
case 110: return 2
default:
switch {
@ -65,17 +44,59 @@ fun[2] = func(r rune) int {
}
panic("unreachable")
}
fun[7] = func(r rune) int {
fun[9] = func(r rune) int {
switch(r) {
case 117: return 5
case 102: return 2
case 92: return 4
case 117: return 2
case 34: return 3
case 114: return 2
case 116: return 2
case 98: return 2
case 110: return 2
case 47: return 2
default:
switch {
case 48 <= r && r <= 57: return 2
case 65 <= r && r <= 70: return 2
case 97 <= r && r <= 102: return 2
default: return 2
}
}
panic("unreachable")
}
fun[4] = func(r rune) int {
switch(r) {
case 34: return 5
case 114: return 6
case 92: return 7
case 116: return 8
case 102: return 9
case 110: return 10
case 34: return 11
case 47: return 12
case 98: return 13
case 116: return 7
case 98: return 8
case 110: return 9
case 47: return 10
case 102: return 11
case 92: return 12
case 117: return 13
default:
switch {
case 48 <= r && r <= 57: return 2
case 65 <= r && r <= 70: return 2
case 97 <= r && r <= 102: return 2
default: return 2
}
}
panic("unreachable")
}
fun[12] = func(r rune) int {
switch(r) {
case 47: return 10
case 102: return 11
case 92: return 12
case 117: return 13
case 34: return 5
case 114: return 6
case 116: return 7
case 98: return 8
case 110: return 9
default:
switch {
case 48 <= r && r <= 57: return 2
@ -88,15 +109,36 @@ fun[7] = func(r rune) int {
}
fun[13] = func(r rune) int {
switch(r) {
case 117: return 2
case 114: return 2
case 92: return 3
case 116: return 2
case 102: return 2
case 110: return 2
case 34: return 4
case 47: return 2
case 102: return 14
case 92: return 4
case 117: return 2
case 34: return 3
case 114: return 2
case 116: return 2
case 98: return 14
default:
switch {
case 48 <= r && r <= 57: return 14
case 65 <= r && r <= 70: return 14
case 97 <= r && r <= 102: return 14
default: return 2
}
}
panic("unreachable")
}
fun[17] = func(r rune) int {
switch(r) {
case 92: return 4
case 117: return 2
case 34: return 3
case 114: return 2
case 116: return 2
case 98: return 2
case 110: return 2
case 47: return 2
case 102: return 2
default:
switch {
case 48 <= r && r <= 57: return 2
@ -109,15 +151,15 @@ fun[13] = func(r rune) int {
}
fun[16] = func(r rune) int {
switch(r) {
case 92: return 4
case 117: return 2
case 34: return 3
case 114: return 2
case 92: return 3
case 116: return 2
case 102: return 17
case 110: return 2
case 34: return 4
case 47: return 2
case 98: return 17
case 110: return 2
case 47: return 2
case 102: return 17
default:
switch {
case 48 <= r && r <= 57: return 17
@ -128,59 +170,17 @@ fun[16] = func(r rune) int {
}
panic("unreachable")
}
fun[8] = func(r rune) int {
fun[2] = func(r rune) int {
switch(r) {
case 34: return 4
case 47: return 2
case 98: return 2
case 117: return 2
case 34: return 3
case 114: return 2
case 92: return 3
case 116: return 2
case 102: return 2
case 98: return 2
case 110: return 2
default:
switch {
case 48 <= r && r <= 57: return 2
case 65 <= r && r <= 70: return 2
case 97 <= r && r <= 102: return 2
default: return 2
}
}
panic("unreachable")
}
fun[0] = func(r rune) int {
switch(r) {
case 117: return -1
case 114: return -1
case 92: return -1
case 116: return -1
case 102: return -1
case 110: return -1
case 34: return 1
case 47: return -1
case 98: return -1
default:
switch {
case 48 <= r && r <= 57: return -1
case 65 <= r && r <= 70: return -1
case 97 <= r && r <= 102: return -1
default: return -1
}
}
panic("unreachable")
}
fun[3] = func(r rune) int {
switch(r) {
case 117: return 5
case 114: return 6
case 92: return 7
case 116: return 8
case 102: return 9
case 110: return 10
case 34: return 11
case 47: return 12
case 98: return 13
case 47: return 2
case 102: return 2
case 92: return 4
case 117: return 2
default:
switch {
case 48 <= r && r <= 57: return 2
@ -193,15 +193,15 @@ fun[3] = func(r rune) int {
}
fun[14] = func(r rune) int {
switch(r) {
case 102: return 15
case 110: return 2
case 34: return 4
case 47: return 2
case 98: return 15
case 102: return 15
case 92: return 4
case 117: return 2
case 34: return 3
case 114: return 2
case 92: return 3
case 116: return 2
case 98: return 15
default:
switch {
case 48 <= r && r <= 57: return 15
@ -212,60 +212,17 @@ fun[14] = func(r rune) int {
}
panic("unreachable")
}
acc[4] = true
fun[4] = func(r rune) int {
fun[7] = func(r rune) int {
switch(r) {
case 102: return -1
case 110: return -1
case 34: return -1
case 47: return -1
case 98: return -1
case 117: return -1
case 114: return -1
case 92: return -1
case 116: return -1
default:
switch {
case 48 <= r && r <= 57: return -1
case 65 <= r && r <= 70: return -1
case 97 <= r && r <= 102: return -1
default: return -1
}
}
panic("unreachable")
}
fun[5] = func(r rune) int {
switch(r) {
case 102: return 14
case 110: return 2
case 34: return 4
case 47: return 2
case 98: return 14
case 92: return 4
case 117: return 2
case 34: return 3
case 114: return 2
case 92: return 3
case 116: return 2
default:
switch {
case 48 <= r && r <= 57: return 14
case 65 <= r && r <= 70: return 14
case 97 <= r && r <= 102: return 14
default: return 2
}
}
panic("unreachable")
}
fun[10] = func(r rune) int {
switch(r) {
case 116: return 2
case 102: return 2
case 110: return 2
case 34: return 4
case 47: return 2
case 98: return 2
case 117: return 2
case 114: return 2
case 92: return 3
case 110: return 2
case 47: return 2
case 102: return 2
default:
switch {
case 48 <= r && r <= 57: return 2
@ -276,17 +233,124 @@ fun[10] = func(r rune) int {
}
panic("unreachable")
}
fun[11] = func(r rune) int {
switch(r) {
case 92: return 4
case 117: return 2
case 34: return 3
case 114: return 2
case 116: return 2
case 98: return 2
case 110: return 2
case 47: return 2
case 102: return 2
default:
switch {
case 48 <= r && r <= 57: return 2
case 65 <= r && r <= 70: return 2
case 97 <= r && r <= 102: return 2
default: return 2
}
}
panic("unreachable")
}
fun[8] = func(r rune) int {
switch(r) {
case 92: return 4
case 117: return 2
case 34: return 3
case 114: return 2
case 116: return 2
case 98: return 2
case 110: return 2
case 47: return 2
case 102: return 2
default:
switch {
case 48 <= r && r <= 57: return 2
case 65 <= r && r <= 70: return 2
case 97 <= r && r <= 102: return 2
default: return 2
}
}
panic("unreachable")
}
fun[15] = func(r rune) int {
switch(r) {
case 34: return 3
case 114: return 2
case 116: return 2
case 98: return 16
case 110: return 2
case 47: return 2
case 102: return 16
case 92: return 4
case 117: return 2
default:
switch {
case 48 <= r && r <= 57: return 16
case 65 <= r && r <= 70: return 16
case 97 <= r && r <= 102: return 16
default: return 2
}
}
panic("unreachable")
}
fun[6] = func(r rune) int {
switch(r) {
case 34: return 4
case 47: return 2
case 98: return 2
case 117: return 2
case 114: return 2
case 92: return 3
case 116: return 2
case 102: return 2
case 110: return 2
case 47: return 2
case 102: return 2
case 92: return 4
case 117: return 2
case 34: return 3
case 114: return 2
case 116: return 2
case 98: return 2
default:
switch {
case 48 <= r && r <= 57: return 2
case 65 <= r && r <= 70: return 2
case 97 <= r && r <= 102: return 2
default: return 2
}
}
panic("unreachable")
}
acc[3] = true
fun[3] = func(r rune) int {
switch(r) {
case 114: return -1
case 116: return -1
case 98: return -1
case 110: return -1
case 47: return -1
case 102: return -1
case 92: return -1
case 117: return -1
case 34: return -1
default:
switch {
case 48 <= r && r <= 57: return -1
case 65 <= r && r <= 70: return -1
case 97 <= r && r <= 102: return -1
default: return -1
}
}
panic("unreachable")
}
acc[5] = true
fun[5] = func(r rune) int {
switch(r) {
case 110: return 2
case 47: return 2
case 102: return 2
case 92: return 4
case 117: return 2
case 34: return 3
case 114: return 2
case 116: return 2
case 98: return 2
default:
switch {
case 48 <= r && r <= 57: return 2
@ -300,14 +364,14 @@ fun[6] = func(r rune) int {
fun[1] = func(r rune) int {
switch(r) {
case 117: return 2
case 34: return 3
case 114: return 2
case 92: return 3
case 116: return 2
case 102: return 2
case 110: return 2
case 34: return 4
case 47: return 2
case 98: return 2
case 110: return 2
case 47: return 2
case 102: return 2
case 92: return 4
default:
switch {
case 48 <= r && r <= 57: return 2
@ -318,87 +382,23 @@ fun[1] = func(r rune) int {
}
panic("unreachable")
}
fun[9] = func(r rune) int {
fun[0] = func(r rune) int {
switch(r) {
case 117: return 2
case 114: return 2
case 92: return 3
case 116: return 2
case 102: return 2
case 110: return 2
case 34: return 4
case 47: return 2
case 98: return 2
case 110: return -1
case 47: return -1
case 102: return -1
case 92: return -1
case 117: return -1
case 34: return 1
case 114: return -1
case 116: return -1
case 98: return -1
default:
switch {
case 48 <= r && r <= 57: return 2
case 65 <= r && r <= 70: return 2
case 97 <= r && r <= 102: return 2
default: return 2
}
}
panic("unreachable")
}
acc[11] = true
fun[11] = func(r rune) int {
switch(r) {
case 34: return 4
case 47: return 2
case 98: return 2
case 117: return 2
case 114: return 2
case 92: return 3
case 116: return 2
case 102: return 2
case 110: return 2
default:
switch {
case 48 <= r && r <= 57: return 2
case 65 <= r && r <= 70: return 2
case 97 <= r && r <= 102: return 2
default: return 2
}
}
panic("unreachable")
}
fun[17] = func(r rune) int {
switch(r) {
case 117: return 2
case 114: return 2
case 92: return 3
case 116: return 2
case 102: return 2
case 110: return 2
case 34: return 4
case 47: return 2
case 98: return 2
default:
switch {
case 48 <= r && r <= 57: return 2
case 65 <= r && r <= 70: return 2
case 97 <= r && r <= 102: return 2
default: return 2
}
}
panic("unreachable")
}
fun[12] = func(r rune) int {
switch(r) {
case 116: return 2
case 102: return 2
case 110: return 2
case 34: return 4
case 47: return 2
case 98: return 2
case 117: return 2
case 114: return 2
case 92: return 3
default:
switch {
case 48 <= r && r <= 57: return 2
case 65 <= r && r <= 70: return 2
case 97 <= r && r <= 102: return 2
default: return 2
case 48 <= r && r <= 57: return -1
case 65 <= r && r <= 70: return -1
case 97 <= r && r <= 102: return -1
default: return -1
}
}
panic("unreachable")
@ -438,9 +438,10 @@ a0[1].id = 1
{
var acc [2]bool
var fun [2]func(rune) int
fun[0] = func(r rune) int {
acc[1] = true
fun[1] = func(r rune) int {
switch(r) {
case 45: return 1
case 45: return -1
default:
switch {
default: return -1
@ -448,10 +449,9 @@ fun[0] = func(r rune) int {
}
panic("unreachable")
}
acc[1] = true
fun[1] = func(r rune) int {
fun[0] = func(r rune) int {
switch(r) {
case 45: return -1
case 45: return 1
default:
switch {
default: return -1
@ -550,10 +550,9 @@ a0[5].id = 5
{
var acc [2]bool
var fun [2]func(rune) int
acc[1] = true
fun[1] = func(r rune) int {
fun[0] = func(r rune) int {
switch(r) {
case 41: return -1
case 41: return 1
default:
switch {
default: return -1
@ -561,9 +560,10 @@ fun[1] = func(r rune) int {
}
panic("unreachable")
}
fun[0] = func(r rune) int {
acc[1] = true
fun[1] = func(r rune) int {
switch(r) {
case 41: return 1
case 41: return -1
default:
switch {
default: return -1
@ -662,10 +662,37 @@ a0[9].id = 9
{
var acc [8]bool
var fun [8]func(rune) int
fun[0] = func(r rune) int {
acc[2] = true
fun[2] = func(r rune) int {
switch(r) {
case 45: return 1
case 46: return 4
case 45: return -1
default:
switch {
case 48 <= r && r <= 48: return -1
case 49 <= r && r <= 57: return -1
default: return -1
}
}
panic("unreachable")
}
fun[4] = func(r rune) int {
switch(r) {
case 45: return -1
case 46: return -1
default:
switch {
case 48 <= r && r <= 48: return 6
case 49 <= r && r <= 57: return 6
default: return -1
}
}
panic("unreachable")
}
fun[1] = func(r rune) int {
switch(r) {
case 46: return -1
case 45: return -1
default:
switch {
case 48 <= r && r <= 48: return 2
@ -678,8 +705,8 @@ fun[0] = func(r rune) int {
acc[3] = true
fun[3] = func(r rune) int {
switch(r) {
case 45: return -1
case 46: return 4
case 45: return -1
default:
switch {
case 48 <= r && r <= 48: return 5
@ -689,37 +716,24 @@ fun[3] = func(r rune) int {
}
panic("unreachable")
}
fun[4] = func(r rune) int {
acc[6] = true
fun[6] = func(r rune) int {
switch(r) {
case 46: return -1
case 45: return -1
default:
switch {
case 48 <= r && r <= 48: return 6
case 49 <= r && r <= 57: return 6
case 48 <= r && r <= 48: return 7
case 49 <= r && r <= 57: return 7
default: return -1
}
}
panic("unreachable")
}
acc[2] = true
fun[2] = func(r rune) int {
fun[0] = func(r rune) int {
switch(r) {
case 45: return -1
case 46: return 4
default:
switch {
case 48 <= r && r <= 48: return -1
case 49 <= r && r <= 57: return -1
default: return -1
}
}
panic("unreachable")
}
fun[1] = func(r rune) int {
switch(r) {
case 45: return -1
case 46: return -1
case 45: return 1
default:
switch {
case 48 <= r && r <= 48: return 2
@ -729,20 +743,6 @@ fun[1] = func(r rune) int {
}
panic("unreachable")
}
acc[5] = true
fun[5] = func(r rune) int {
switch(r) {
case 46: return 4
case 45: return -1
default:
switch {
case 48 <= r && r <= 48: return 5
case 49 <= r && r <= 57: return 5
default: return -1
}
}
panic("unreachable")
}
acc[7] = true
fun[7] = func(r rune) int {
switch(r) {
@ -757,15 +757,15 @@ fun[7] = func(r rune) int {
}
panic("unreachable")
}
acc[6] = true
fun[6] = func(r rune) int {
acc[5] = true
fun[5] = func(r rune) int {
switch(r) {
case 46: return 4
case 45: return -1
case 46: return -1
default:
switch {
case 48 <= r && r <= 48: return 7
case 49 <= r && r <= 57: return 7
case 48 <= r && r <= 48: return 5
case 49 <= r && r <= 57: return 5
default: return -1
}
}
@ -778,12 +778,11 @@ a0[10].id = 10
{
var acc [2]bool
var fun [2]func(rune) int
acc[1] = true
fun[1] = func(r rune) int {
fun[0] = func(r rune) int {
switch(r) {
case 32: return 1
case 9: return 1
case 10: return 1
case 9: return 1
default:
switch {
default: return -1
@ -791,11 +790,12 @@ fun[1] = func(r rune) int {
}
panic("unreachable")
}
fun[0] = func(r rune) int {
acc[1] = true
fun[1] = func(r rune) int {
switch(r) {
case 9: return 1
case 10: return 1
case 32: return 1
case 10: return 1
case 9: return 1
default:
switch {
default: return -1
@ -814,17 +814,17 @@ acc[1] = true
fun[1] = func(r rune) int {
switch(r) {
case 60: return -1
case 62: return -1
case 45: return -1
case 94: return -1
case 32: return -1
case 10: return -1
case 9: return -1
case 13: return -1
case 58: return -1
case 12: return -1
case 32: return -1
case 94: return -1
case 43: return -1
case 9: return -1
case 58: return -1
case 10: return -1
case 45: return -1
case 61: return -1
case 62: return -1
default:
switch {
default: return 1
@ -834,18 +834,18 @@ fun[1] = func(r rune) int {
}
fun[0] = func(r rune) int {
switch(r) {
case 58: return -1
case 12: return -1
case 43: return -1
case 61: return -1
case 60: return -1
case 62: return -1
case 45: return -1
case 94: return -1
case 32: return -1
case 10: return -1
case 9: return -1
case 13: return -1
case 12: return -1
case 32: return -1
case 94: return -1
case 43: return -1
case 9: return -1
case 58: return -1
case 10: return -1
case 45: return -1
case 61: return -1
case 62: return -1
case 60: return -1
default:
switch {
default: return 1

View File

@ -63,32 +63,14 @@ tSTRING {
str := $1.s
logDebugGrammar("STRING - %s", str)
q := NewMatchQuery(str)
if parsingMust {
parsingMustList.AddQuery(q)
parsingMust = false
} else if parsingMustNot {
parsingMustNotList.AddQuery(q)
parsingMustNot = false
} else {
parsingShouldList.AddQuery(q)
}
parsingLastQuery = q
addQueryToList(q)
}
|
tPHRASE {
phrase := $1.s
logDebugGrammar("PHRASE - %s", phrase)
q := NewMatchPhraseQuery(phrase)
if parsingMust {
parsingMustList.AddQuery(q)
parsingMust = false
} else if parsingMustNot {
parsingMustNotList.AddQuery(q)
parsingMustNot = false
} else {
parsingShouldList.AddQuery(q)
}
parsingLastQuery = q
addQueryToList(q)
}
|
tSTRING tCOLON tSTRING {
@ -96,16 +78,7 @@ tSTRING tCOLON tSTRING {
str := $3.s
logDebugGrammar("FIELD - %s STRING - %s", field, str)
q := NewMatchQuery(str).SetField(field)
if parsingMust {
parsingMustList.AddQuery(q)
parsingMust = false
} else if parsingMustNot {
parsingMustNotList.AddQuery(q)
parsingMustNot = false
} else {
parsingShouldList.AddQuery(q)
}
parsingLastQuery = q
addQueryToList(q)
}
|
tSTRING tCOLON tPHRASE {
@ -113,16 +86,7 @@ tSTRING tCOLON tPHRASE {
phrase := $3.s
logDebugGrammar("FIELD - %s PHRASE - %s", field, phrase)
q := NewMatchPhraseQuery(phrase).SetField(field)
if parsingMust {
parsingMustList.AddQuery(q)
parsingMust = false
} else if parsingMustNot {
parsingMustNotList.AddQuery(q)
parsingMustNot = false
} else {
parsingShouldList.AddQuery(q)
}
parsingLastQuery = q
addQueryToList(q)
}
|
tSTRING tCOLON tGREATER tNUMBER {
@ -131,16 +95,7 @@ tSTRING tCOLON tGREATER tNUMBER {
minInclusive := false
logDebugGrammar("FIELD - GREATER THAN %f", min)
q := NewNumericRangeInclusiveQuery(&min, nil, &minInclusive, nil).SetField(field)
if parsingMust {
parsingMustList.AddQuery(q)
parsingMust = false
} else if parsingMustNot {
parsingMustNotList.AddQuery(q)
parsingMustNot = false
} else {
parsingShouldList.AddQuery(q)
}
parsingLastQuery = q
addQueryToList(q)
}
|
tSTRING tCOLON tGREATER tEQUAL tNUMBER {
@ -149,16 +104,7 @@ tSTRING tCOLON tGREATER tEQUAL tNUMBER {
minInclusive := true
logDebugGrammar("FIELD - GREATER THAN OR EQUAL %f", min)
q := NewNumericRangeInclusiveQuery(&min, nil, &minInclusive, nil).SetField(field)
if parsingMust {
parsingMustList.AddQuery(q)
parsingMust = false
} else if parsingMustNot {
parsingMustNotList.AddQuery(q)
parsingMustNot = false
} else {
parsingShouldList.AddQuery(q)
}
parsingLastQuery = q
addQueryToList(q)
}
|
tSTRING tCOLON tLESS tNUMBER {
@ -167,16 +113,7 @@ tSTRING tCOLON tLESS tNUMBER {
maxInclusive := false
logDebugGrammar("FIELD - LESS THAN %f", max)
q := NewNumericRangeInclusiveQuery(nil, &max, nil, &maxInclusive).SetField(field)
if parsingMust {
parsingMustList.AddQuery(q)
parsingMust = false
} else if parsingMustNot {
parsingMustNotList.AddQuery(q)
parsingMustNot = false
} else {
parsingShouldList.AddQuery(q)
}
parsingLastQuery = q
addQueryToList(q)
}
|
tSTRING tCOLON tLESS tEQUAL tNUMBER {
@ -185,16 +122,7 @@ tSTRING tCOLON tLESS tEQUAL tNUMBER {
maxInclusive := true
logDebugGrammar("FIELD - LESS THAN OR EQUAL %f", max)
q := NewNumericRangeInclusiveQuery(nil, &max, nil, &maxInclusive).SetField(field)
if parsingMust {
parsingMustList.AddQuery(q)
parsingMust = false
} else if parsingMustNot {
parsingMustNotList.AddQuery(q)
parsingMustNot = false
} else {
parsingShouldList.AddQuery(q)
}
parsingLastQuery = q
addQueryToList(q)
};

View File

@ -23,9 +23,9 @@ var debugParser bool
var debugLexer bool
var parsingLastQuery Query
var parsingMustList *ConjunctionQuery
var parsingMustNotList *DisjunctionQuery
var parsingShouldList *DisjunctionQuery
var parsingMustList []Query
var parsingMustNotList []Query
var parsingShouldList []Query
var parsingIndexMapping *IndexMapping
func ParseQuerySyntax(query string, mapping *IndexMapping) (rq Query, err error) {
@ -33,9 +33,9 @@ func ParseQuerySyntax(query string, mapping *IndexMapping) (rq Query, err error)
defer parserMutex.Unlock()
parsingIndexMapping = mapping
parsingMustList = NewConjunctionQuery([]Query{})
parsingMustNotList = NewDisjunctionQuery([]Query{})
parsingShouldList = NewDisjunctionQuery([]Query{})
parsingMustList = make([]Query, 0)
parsingMustNotList = make([]Query, 0)
parsingShouldList = make([]Query, 0)
defer func() {
r := recover()
@ -53,16 +53,19 @@ func ParseQuerySyntax(query string, mapping *IndexMapping) (rq Query, err error)
}()
yyParse(NewLexer(strings.NewReader(query)))
parsingQuery := NewBooleanQuery(nil, nil, nil)
if len(parsingMustList.Conjuncts) > 0 {
parsingQuery.Must = parsingMustList
}
if len(parsingMustNotList.Disjuncts) > 0 {
parsingQuery.MustNot = parsingMustNotList
}
if len(parsingShouldList.Disjuncts) > 0 {
parsingQuery.Should = parsingShouldList
}
rq = parsingQuery
rq = NewBooleanQuery(parsingMustList, parsingShouldList, parsingMustNotList)
return rq, err
}
func addQueryToList(q Query) {
if parsingMust {
parsingMustList = append(parsingMustList, q)
parsingMust = false
} else if parsingMustNot {
parsingMustNotList = append(parsingMustNotList, q)
parsingMustNot = false
} else {
parsingShouldList = append(parsingShouldList, q)
}
parsingLastQuery = q
}

View File

@ -26,10 +26,9 @@ func TestQuerySyntaxParserValid(t *testing.T) {
mapping: NewIndexMapping(),
result: NewBooleanQuery(
nil,
NewDisjunctionQuery(
[]Query{
NewMatchQuery("test"),
}),
[]Query{
NewMatchQuery("test"),
},
nil),
},
{
@ -37,10 +36,9 @@ func TestQuerySyntaxParserValid(t *testing.T) {
mapping: NewIndexMapping(),
result: NewBooleanQuery(
nil,
NewDisjunctionQuery(
[]Query{
NewMatchPhraseQuery("test phrase 1"),
}),
[]Query{
NewMatchPhraseQuery("test phrase 1"),
},
nil),
},
{
@ -48,20 +46,18 @@ func TestQuerySyntaxParserValid(t *testing.T) {
mapping: NewIndexMapping(),
result: NewBooleanQuery(
nil,
NewDisjunctionQuery(
[]Query{
NewMatchQuery("test").SetField("field"),
}),
[]Query{
NewMatchQuery("test").SetField("field"),
},
nil),
},
{
input: "+field1:test1",
mapping: NewIndexMapping(),
result: NewBooleanQuery(
NewConjunctionQuery(
[]Query{
NewMatchQuery("test1").SetField("field1"),
}),
[]Query{
NewMatchQuery("test1").SetField("field1"),
},
nil,
nil),
},
@ -71,30 +67,27 @@ func TestQuerySyntaxParserValid(t *testing.T) {
result: NewBooleanQuery(
nil,
nil,
NewDisjunctionQuery(
[]Query{
NewMatchQuery("test2").SetField("field2"),
})),
[]Query{
NewMatchQuery("test2").SetField("field2"),
}),
},
{
input: `field3:"test phrase 2"`,
mapping: NewIndexMapping(),
result: NewBooleanQuery(
nil,
NewDisjunctionQuery(
[]Query{
NewMatchPhraseQuery("test phrase 2").SetField("field3"),
}),
[]Query{
NewMatchPhraseQuery("test phrase 2").SetField("field3"),
},
nil),
},
{
input: `+field4:"test phrase 1"`,
mapping: NewIndexMapping(),
result: NewBooleanQuery(
NewConjunctionQuery(
[]Query{
NewMatchPhraseQuery("test phrase 1").SetField("field4"),
}),
[]Query{
NewMatchPhraseQuery("test phrase 1").SetField("field4"),
},
nil,
nil),
},
@ -104,37 +97,32 @@ func TestQuerySyntaxParserValid(t *testing.T) {
result: NewBooleanQuery(
nil,
nil,
NewDisjunctionQuery(
[]Query{
NewMatchPhraseQuery("test phrase 2").SetField("field5"),
})),
[]Query{
NewMatchPhraseQuery("test phrase 2").SetField("field5"),
}),
},
{
input: `+field6:test3 -field7:test4 field8:test5`,
mapping: NewIndexMapping(),
result: NewBooleanQuery(
NewConjunctionQuery(
[]Query{
NewMatchQuery("test3").SetField("field6"),
}),
NewDisjunctionQuery(
[]Query{
NewMatchQuery("test5").SetField("field8"),
}),
NewDisjunctionQuery(
[]Query{
NewMatchQuery("test4").SetField("field7"),
})),
[]Query{
NewMatchQuery("test3").SetField("field6"),
},
[]Query{
NewMatchQuery("test5").SetField("field8"),
},
[]Query{
NewMatchQuery("test4").SetField("field7"),
}),
},
{
input: "test^3",
mapping: NewIndexMapping(),
result: NewBooleanQuery(
nil,
NewDisjunctionQuery(
[]Query{
NewMatchQuery("test").SetBoost(3.0),
}),
[]Query{
NewMatchQuery("test").SetBoost(3.0),
},
nil),
},
{
@ -142,11 +130,10 @@ func TestQuerySyntaxParserValid(t *testing.T) {
mapping: NewIndexMapping(),
result: NewBooleanQuery(
nil,
NewDisjunctionQuery(
[]Query{
NewMatchQuery("test").SetBoost(3.0),
NewMatchQuery("other").SetBoost(6.0),
}),
[]Query{
NewMatchQuery("test").SetBoost(3.0),
NewMatchQuery("other").SetBoost(6.0),
},
nil),
},
}

View File

@ -38,11 +38,11 @@ func TestParseQuery(t *testing.T) {
output: NewMatchPhraseQuery("light beer").SetField("desc"),
},
{
input: []byte(`{"must":{"terms": [{"match":"beer","field":"desc"}]},"should":{"terms": [{"match":"water","field":"desc"}]},"must_not":{"terms": [{"match":"devon","field":"desc"}]}}`),
input: []byte(`{"must":{"terms": [{"match":"beer","field":"desc"}]},"should":{"terms": [{"match":"water","field":"desc"}],"min":1.0},"must_not":{"terms": [{"match":"devon","field":"desc"}]}}`),
output: NewBooleanQuery(
NewConjunctionQuery([]Query{NewMatchQuery("beer").SetField("desc")}),
NewDisjunctionQuery([]Query{NewMatchQuery("water").SetField("desc")}).SetMin(0),
NewDisjunctionQuery([]Query{NewMatchQuery("devon").SetField("desc")}).SetMin(0)),
[]Query{NewMatchQuery("beer").SetField("desc")},
[]Query{NewMatchQuery("water").SetField("desc")},
[]Query{NewMatchQuery("devon").SetField("desc")}),
},
{
input: []byte(`{"terms":[{"term":"watered","field":"desc"},{"term":"down","field":"desc"}]}`),
@ -208,30 +208,31 @@ func TestQueryValidate(t *testing.T) {
},
{
query: NewBooleanQuery(
NewConjunctionQuery([]Query{NewMatchQuery("beer").SetField("desc")}),
NewDisjunctionQuery([]Query{NewMatchQuery("water").SetField("desc")}).SetMin(0),
NewDisjunctionQuery([]Query{NewMatchQuery("devon").SetField("desc")}).SetMin(0)),
[]Query{NewMatchQuery("beer").SetField("desc")},
[]Query{NewMatchQuery("water").SetField("desc")},
[]Query{NewMatchQuery("devon").SetField("desc")}),
err: nil,
},
{
query: NewBooleanQuery(
nil,
nil,
NewDisjunctionQuery([]Query{NewMatchQuery("devon").SetField("desc")}).SetMin(0)),
[]Query{NewMatchQuery("devon").SetField("desc")}),
err: ERROR_BOOLEAN_QUERY_NEEDS_MUST_OR_SHOULD,
},
{
query: NewBooleanQuery(
NewConjunctionQuery([]Query{}),
NewDisjunctionQuery([]Query{}).SetMin(0),
NewDisjunctionQuery([]Query{NewMatchQuery("devon").SetField("desc")}).SetMin(0)),
[]Query{},
[]Query{},
[]Query{NewMatchQuery("devon").SetField("desc")}),
err: ERROR_BOOLEAN_QUERY_NEEDS_MUST_OR_SHOULD,
},
{
query: NewBooleanQuery(
NewConjunctionQuery([]Query{NewMatchQuery("beer").SetField("desc")}),
NewDisjunctionQuery([]Query{NewMatchQuery("water").SetField("desc")}).SetMin(2),
NewDisjunctionQuery([]Query{NewMatchQuery("devon").SetField("desc")}).SetMin(0)),
query: NewBooleanQueryMinShould(
[]Query{NewMatchQuery("beer").SetField("desc")},
[]Query{NewMatchQuery("water").SetField("desc")},
[]Query{NewMatchQuery("devon").SetField("desc")},
2.0),
err: ERROR_DISJUNCTION_FEWER_THAN_MIN_CLAUSES,
},
}

108
y.go
View File

@ -393,148 +393,76 @@ yydefault:
str := yyS[yypt-0].s
logDebugGrammar("STRING - %s", str)
q := NewMatchQuery(str)
if parsingMust {
parsingMustList.AddQuery(q)
parsingMust = false
} else if parsingMustNot {
parsingMustNotList.AddQuery(q)
parsingMustNot = false
} else {
parsingShouldList.AddQuery(q)
}
parsingLastQuery = q
addQueryToList(q)
}
case 10:
//line query_string.y:78
//line query_string.y:69
{
phrase := yyS[yypt-0].s
logDebugGrammar("PHRASE - %s", phrase)
q := NewMatchPhraseQuery(phrase)
if parsingMust {
parsingMustList.AddQuery(q)
parsingMust = false
} else if parsingMustNot {
parsingMustNotList.AddQuery(q)
parsingMustNot = false
} else {
parsingShouldList.AddQuery(q)
}
parsingLastQuery = q
addQueryToList(q)
}
case 11:
//line query_string.y:94
//line query_string.y:76
{
field := yyS[yypt-2].s
str := yyS[yypt-0].s
logDebugGrammar("FIELD - %s STRING - %s", field, str)
q := NewMatchQuery(str).SetField(field)
if parsingMust {
parsingMustList.AddQuery(q)
parsingMust = false
} else if parsingMustNot {
parsingMustNotList.AddQuery(q)
parsingMustNot = false
} else {
parsingShouldList.AddQuery(q)
}
parsingLastQuery = q
addQueryToList(q)
}
case 12:
//line query_string.y:111
//line query_string.y:84
{
field := yyS[yypt-2].s
phrase := yyS[yypt-0].s
logDebugGrammar("FIELD - %s PHRASE - %s", field, phrase)
q := NewMatchPhraseQuery(phrase).SetField(field)
if parsingMust {
parsingMustList.AddQuery(q)
parsingMust = false
} else if parsingMustNot {
parsingMustNotList.AddQuery(q)
parsingMustNot = false
} else {
parsingShouldList.AddQuery(q)
}
parsingLastQuery = q
addQueryToList(q)
}
case 13:
//line query_string.y:128
//line query_string.y:92
{
field := yyS[yypt-3].s
min := yyS[yypt-0].f
minInclusive := false
logDebugGrammar("FIELD - GREATER THAN %f", min)
q := NewNumericRangeInclusiveQuery(&min, nil, &minInclusive, nil).SetField(field)
if parsingMust {
parsingMustList.AddQuery(q)
parsingMust = false
} else if parsingMustNot {
parsingMustNotList.AddQuery(q)
parsingMustNot = false
} else {
parsingShouldList.AddQuery(q)
}
parsingLastQuery = q
addQueryToList(q)
}
case 14:
//line query_string.y:146
//line query_string.y:101
{
field := yyS[yypt-4].s
min := yyS[yypt-0].f
minInclusive := true
logDebugGrammar("FIELD - GREATER THAN OR EQUAL %f", min)
q := NewNumericRangeInclusiveQuery(&min, nil, &minInclusive, nil).SetField(field)
if parsingMust {
parsingMustList.AddQuery(q)
parsingMust = false
} else if parsingMustNot {
parsingMustNotList.AddQuery(q)
parsingMustNot = false
} else {
parsingShouldList.AddQuery(q)
}
parsingLastQuery = q
addQueryToList(q)
}
case 15:
//line query_string.y:164
//line query_string.y:110
{
field := yyS[yypt-3].s
max := yyS[yypt-0].f
maxInclusive := false
logDebugGrammar("FIELD - LESS THAN %f", max)
q := NewNumericRangeInclusiveQuery(nil, &max, nil, &maxInclusive).SetField(field)
if parsingMust {
parsingMustList.AddQuery(q)
parsingMust = false
} else if parsingMustNot {
parsingMustNotList.AddQuery(q)
parsingMustNot = false
} else {
parsingShouldList.AddQuery(q)
}
parsingLastQuery = q
addQueryToList(q)
}
case 16:
//line query_string.y:182
//line query_string.y:119
{
field := yyS[yypt-4].s
max := yyS[yypt-0].f
maxInclusive := true
logDebugGrammar("FIELD - LESS THAN OR EQUAL %f", max)
q := NewNumericRangeInclusiveQuery(nil, &max, nil, &maxInclusive).SetField(field)
if parsingMust {
parsingMustList.AddQuery(q)
parsingMust = false
} else if parsingMustNot {
parsingMustNotList.AddQuery(q)
parsingMustNot = false
} else {
parsingShouldList.AddQuery(q)
}
parsingLastQuery = q
addQueryToList(q)
}
case 17:
//line query_string.y:202
//line query_string.y:130
{
boost := yyS[yypt-0].f
if parsingLastQuery != nil {
@ -548,12 +476,12 @@ yydefault:
logDebugGrammar("BOOST %f", boost)
}
case 18:
//line query_string.y:216
//line query_string.y:144
{
}
case 19:
//line query_string.y:220
//line query_string.y:148
{
}