81 lines
1.6 KiB
Go
81 lines
1.6 KiB
Go
|
package search
|
||
|
|
||
|
import (
|
||
|
"fmt"
|
||
|
"strings"
|
||
|
"sync"
|
||
|
|
||
|
"github.com/couchbaselabs/bleve/document"
|
||
|
)
|
||
|
|
||
|
var crashHard = false
|
||
|
var parserMutex sync.Mutex
|
||
|
var parsingDefaultField string
|
||
|
var parsingMust bool
|
||
|
var parsingMustNot bool
|
||
|
var debugParser bool
|
||
|
var debugLexer bool
|
||
|
|
||
|
var parsingMustList *TermConjunctionQuery
|
||
|
var parsingMustNotList *TermDisjunctionQuery
|
||
|
var parsingShouldList *TermDisjunctionQuery
|
||
|
var parsingMapping document.Mapping
|
||
|
|
||
|
func ParseQuerySyntax(query string, mapping document.Mapping) (rq Query, err error) {
|
||
|
parserMutex.Lock()
|
||
|
defer parserMutex.Unlock()
|
||
|
|
||
|
parsingMapping = mapping
|
||
|
|
||
|
parsingMustList = &TermConjunctionQuery{
|
||
|
Terms: make([]Query, 0),
|
||
|
BoostVal: 1.0,
|
||
|
Explain: true,
|
||
|
}
|
||
|
|
||
|
parsingMustNotList = &TermDisjunctionQuery{
|
||
|
Terms: make([]Query, 0),
|
||
|
BoostVal: 1.0,
|
||
|
Explain: true,
|
||
|
}
|
||
|
|
||
|
parsingShouldList = &TermDisjunctionQuery{
|
||
|
Terms: make([]Query, 0),
|
||
|
BoostVal: 1.0,
|
||
|
Explain: true,
|
||
|
Min: 1,
|
||
|
}
|
||
|
|
||
|
defer func() {
|
||
|
r := recover()
|
||
|
if r != nil && r == "syntax error" {
|
||
|
// if we're panicing over a syntax error, chill
|
||
|
err = fmt.Errorf("Parse Error - %v", r)
|
||
|
} else if r != nil {
|
||
|
// otherise continue to panic
|
||
|
if crashHard {
|
||
|
panic(r)
|
||
|
} else {
|
||
|
err = fmt.Errorf("Other Error - %v", r)
|
||
|
}
|
||
|
}
|
||
|
}()
|
||
|
|
||
|
yyParse(NewLexer(strings.NewReader(query)))
|
||
|
parsingQuery := &TermBooleanQuery{
|
||
|
BoostVal: 1.0,
|
||
|
Explain: true,
|
||
|
}
|
||
|
if len(parsingMustList.Terms) > 0 {
|
||
|
parsingQuery.Must = parsingMustList
|
||
|
}
|
||
|
if len(parsingMustNotList.Terms) > 0 {
|
||
|
parsingQuery.MustNot = parsingMustNotList
|
||
|
}
|
||
|
if len(parsingShouldList.Terms) > 0 {
|
||
|
parsingQuery.Should = parsingShouldList
|
||
|
}
|
||
|
rq = parsingQuery
|
||
|
return rq, err
|
||
|
}
|