0
0
bleve/search/query_syntax_parser.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

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
}