2014-07-30 18:30:38 +02:00
|
|
|
// Copyright (c) 2014 Couchbase, Inc.
|
|
|
|
// Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file
|
|
|
|
// except in compliance with the License. You may obtain a copy of the License at
|
|
|
|
// http://www.apache.org/licenses/LICENSE-2.0
|
|
|
|
// Unless required by applicable law or agreed to in writing, software distributed under the
|
|
|
|
// License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND,
|
|
|
|
// either express or implied. See the License for the specific language governing permissions
|
|
|
|
// and limitations under the License.
|
|
|
|
package bleve
|
|
|
|
|
|
|
|
import (
|
|
|
|
"fmt"
|
|
|
|
"strings"
|
|
|
|
"sync"
|
|
|
|
)
|
|
|
|
|
|
|
|
var crashHard = false
|
|
|
|
var parserMutex sync.Mutex
|
|
|
|
var parsingMust bool
|
|
|
|
var parsingMustNot bool
|
|
|
|
var debugParser bool
|
|
|
|
var debugLexer bool
|
|
|
|
|
2014-08-07 01:36:23 +02:00
|
|
|
var parsingLastQuery Query
|
2014-07-30 18:30:38 +02:00
|
|
|
var parsingMustList *ConjunctionQuery
|
|
|
|
var parsingMustNotList *DisjunctionQuery
|
|
|
|
var parsingShouldList *DisjunctionQuery
|
|
|
|
var parsingIndexMapping *IndexMapping
|
|
|
|
|
2014-08-07 01:36:23 +02:00
|
|
|
func ParseQuerySyntax(query string, mapping *IndexMapping) (rq Query, err error) {
|
2014-07-30 18:30:38 +02:00
|
|
|
parserMutex.Lock()
|
|
|
|
defer parserMutex.Unlock()
|
|
|
|
|
|
|
|
parsingIndexMapping = mapping
|
|
|
|
parsingMustList = NewConjunctionQuery([]Query{})
|
|
|
|
parsingMustNotList = NewDisjunctionQuery([]Query{})
|
|
|
|
parsingShouldList = NewDisjunctionQuery([]Query{})
|
|
|
|
|
|
|
|
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 := 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
|
|
|
|
return rq, err
|
|
|
|
}
|