fix unary in the beginning
This commit is contained in:
@@ -0,0 +1,7 @@
|
|||||||
|
Bugfix: Fixed cunary in the beginning
|
||||||
|
|
||||||
|
Fixed case when the unary in the beginning lead to panic
|
||||||
|
|
||||||
|
|
||||||
|
https://github.com/owncloud/ocis/pull/7247
|
||||||
|
git
|
||||||
@@ -39,7 +39,10 @@ func (c Compiler) Compile(givenAst *ast.Ast) (bleveQuery.Query, error) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
func compile(a *ast.Ast) (bleveQuery.Query, error) {
|
func compile(a *ast.Ast) (bleveQuery.Query, error) {
|
||||||
q, _ := walk(0, a.Nodes)
|
q, _, err := walk(0, a.Nodes)
|
||||||
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
switch q.(type) {
|
switch q.(type) {
|
||||||
case *bleveQuery.ConjunctionQuery, *bleveQuery.DisjunctionQuery:
|
case *bleveQuery.ConjunctionQuery, *bleveQuery.DisjunctionQuery:
|
||||||
return q, nil
|
return q, nil
|
||||||
@@ -47,7 +50,7 @@ func compile(a *ast.Ast) (bleveQuery.Query, error) {
|
|||||||
return bleve.NewConjunctionQuery(q), nil
|
return bleve.NewConjunctionQuery(q), nil
|
||||||
}
|
}
|
||||||
|
|
||||||
func walk(offset int, nodes []ast.Node) (bleveQuery.Query, int) {
|
func walk(offset int, nodes []ast.Node) (bleveQuery.Query, int, error) {
|
||||||
var prev, next bleveQuery.Query
|
var prev, next bleveQuery.Query
|
||||||
var operator *ast.OperatorNode
|
var operator *ast.OperatorNode
|
||||||
var isGroup bool
|
var isGroup bool
|
||||||
@@ -113,7 +116,10 @@ func walk(offset int, nodes []ast.Node) (bleveQuery.Query, int) {
|
|||||||
if n.Key != "" {
|
if n.Key != "" {
|
||||||
n = normalizeGroupingProperty(n)
|
n = normalizeGroupingProperty(n)
|
||||||
}
|
}
|
||||||
q, _ := walk(0, n.Nodes)
|
q, _, err := walk(0, n.Nodes)
|
||||||
|
if err != nil {
|
||||||
|
return nil, 0, err
|
||||||
|
}
|
||||||
if prev == nil {
|
if prev == nil {
|
||||||
prev = q
|
prev = q
|
||||||
isGroup = true
|
isGroup = true
|
||||||
@@ -124,10 +130,19 @@ func walk(offset int, nodes []ast.Node) (bleveQuery.Query, int) {
|
|||||||
if n.Value == kql.BoolAND || n.Value == kql.BoolOR {
|
if n.Value == kql.BoolAND || n.Value == kql.BoolOR {
|
||||||
operator = n
|
operator = n
|
||||||
} else if n.Value == kql.BoolNOT {
|
} else if n.Value == kql.BoolNOT {
|
||||||
next, offset = nextNode(i+1, nodes)
|
var err error
|
||||||
|
next, offset, err = nextNode(i+1, nodes)
|
||||||
|
if err != nil {
|
||||||
|
return nil, 0, err
|
||||||
|
}
|
||||||
q := bleve.NewBooleanQuery()
|
q := bleve.NewBooleanQuery()
|
||||||
q.AddMustNot(next)
|
q.AddMustNot(next)
|
||||||
next = q
|
if prev == nil {
|
||||||
|
// unary in the beginning
|
||||||
|
prev = q
|
||||||
|
} else {
|
||||||
|
next = q
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if prev != nil && next != nil && operator != nil {
|
if prev != nil && next != nil && operator != nil {
|
||||||
@@ -140,13 +155,19 @@ func walk(offset int, nodes []ast.Node) (bleveQuery.Query, int) {
|
|||||||
i = offset
|
i = offset
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return prev, offset
|
if prev == nil {
|
||||||
|
return nil, 0, fmt.Errorf("can not compile the query")
|
||||||
|
}
|
||||||
|
return prev, offset, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
func nextNode(offset int, nodes []ast.Node) (bleveQuery.Query, int) {
|
func nextNode(offset int, nodes []ast.Node) (bleveQuery.Query, int, error) {
|
||||||
if n, ok := nodes[offset].(*ast.GroupNode); ok {
|
if n, ok := nodes[offset].(*ast.GroupNode); ok {
|
||||||
gq, _ := walk(0, n.Nodes)
|
gq, _, err := walk(0, n.Nodes)
|
||||||
return gq, offset + 1
|
if err != nil {
|
||||||
|
return nil, 0, err
|
||||||
|
}
|
||||||
|
return gq, offset + 1, nil
|
||||||
}
|
}
|
||||||
if n, ok := nodes[offset].(*ast.OperatorNode); ok {
|
if n, ok := nodes[offset].(*ast.OperatorNode); ok {
|
||||||
if n.Value == kql.BoolNOT {
|
if n.Value == kql.BoolNOT {
|
||||||
|
|||||||
@@ -255,6 +255,19 @@ func Test_compile(t *testing.T) {
|
|||||||
}),
|
}),
|
||||||
wantErr: false,
|
wantErr: false,
|
||||||
},
|
},
|
||||||
|
{
|
||||||
|
name: `NOT tag:physik`,
|
||||||
|
args: &ast.Ast{
|
||||||
|
Nodes: []ast.Node{
|
||||||
|
&ast.OperatorNode{Value: "NOT"},
|
||||||
|
&ast.StringNode{Key: "tag", Value: "physik"},
|
||||||
|
},
|
||||||
|
},
|
||||||
|
want: query.NewConjunctionQuery([]query.Query{
|
||||||
|
query.NewBooleanQuery(nil, nil, []query.Query{query.NewQueryStringQuery(`Tags:physik`)}),
|
||||||
|
}),
|
||||||
|
wantErr: false,
|
||||||
|
},
|
||||||
{
|
{
|
||||||
name: `ast.DateTimeNode`,
|
name: `ast.DateTimeNode`,
|
||||||
args: &ast.Ast{
|
args: &ast.Ast{
|
||||||
|
|||||||
Reference in New Issue
Block a user