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.
|
2014-08-29 20:18:36 +02:00
|
|
|
|
2014-07-30 18:30:38 +02:00
|
|
|
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-08-29 22:27:32 +02:00
|
|
|
var parsingMustList []Query
|
|
|
|
var parsingMustNotList []Query
|
|
|
|
var parsingShouldList []Query
|
2014-07-30 18:30:38 +02:00
|
|
|
var parsingIndexMapping *IndexMapping
|
|
|
|
|
2014-08-30 01:31:09 +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
|
2014-08-29 22:27:32 +02:00
|
|
|
parsingMustList = make([]Query, 0)
|
|
|
|
parsingMustNotList = make([]Query, 0)
|
|
|
|
parsingShouldList = make([]Query, 0)
|
2014-07-30 18:30:38 +02:00
|
|
|
|
|
|
|
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)
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}()
|
|
|
|
|
2014-08-30 05:31:40 +02:00
|
|
|
yyParse(newLexer(strings.NewReader(query)))
|
2014-08-29 22:27:32 +02:00
|
|
|
rq = NewBooleanQuery(parsingMustList, parsingShouldList, parsingMustNotList)
|
2014-07-30 18:30:38 +02:00
|
|
|
return rq, err
|
|
|
|
}
|
2014-08-29 22:27:32 +02:00
|
|
|
|
|
|
|
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
|
|
|
|
}
|