-
Notifications
You must be signed in to change notification settings - Fork 7
/
Copy pathexpression_utils.go
111 lines (104 loc) · 3.34 KB
/
expression_utils.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
package gojsonsm
import "fmt"
func fieldExprMatches(lhs FieldExpr, rhs FieldExpr) bool {
if lhs.Root != rhs.Root {
return false
}
if len(lhs.Path) != len(rhs.Path) {
return false
}
for pathIdx := range lhs.Path {
if lhs.Path[pathIdx] != rhs.Path[pathIdx] {
return false
}
}
return true
}
func fetchExprFieldRefsRecurse(expr Expression, loopVars []VariableID, fields []FieldExpr) []FieldExpr {
switch expr := expr.(type) {
case FieldExpr:
isLoopVarRef := false
for _, loopVar := range loopVars {
if expr.Root == loopVar {
isLoopVarRef = true
break
}
}
if isLoopVarRef {
break
}
fieldAlreadyExists := false
for _, oexpr := range fields {
if fieldExprMatches(expr, oexpr) {
fieldAlreadyExists = true
break
}
}
if fieldAlreadyExists {
break
}
fields = append(fields, expr)
case ValueExpr:
case RegexExpr:
case PcreExpr:
case TimeExpr:
case FuncExpr:
for _, subexpr := range expr.Params {
fields = fetchExprFieldRefsRecurse(subexpr, loopVars, fields)
}
case NotExpr:
fields = fetchExprFieldRefsRecurse(expr.SubExpr, loopVars, fields)
case AndExpr:
for _, subexpr := range expr {
fields = fetchExprFieldRefsRecurse(subexpr, loopVars, fields)
}
case OrExpr:
for _, subexpr := range expr {
fields = fetchExprFieldRefsRecurse(subexpr, loopVars, fields)
}
case AnyInExpr:
fields = fetchExprFieldRefsRecurse(expr.InExpr, loopVars, fields)
loopVars = append(loopVars, expr.VarId)
fields = fetchExprFieldRefsRecurse(expr.SubExpr, loopVars, fields)
loopVars = loopVars[0 : len(loopVars)-1]
case EveryInExpr:
fields = fetchExprFieldRefsRecurse(expr.InExpr, loopVars, fields)
loopVars = append(loopVars, expr.VarId)
fields = fetchExprFieldRefsRecurse(expr.SubExpr, loopVars, fields)
loopVars = loopVars[0 : len(loopVars)-1]
case AnyEveryInExpr:
fields = fetchExprFieldRefsRecurse(expr.InExpr, loopVars, fields)
loopVars = append(loopVars, expr.VarId)
fields = fetchExprFieldRefsRecurse(expr.SubExpr, loopVars, fields)
loopVars = loopVars[0 : len(loopVars)-1]
case EqualsExpr:
fields = fetchExprFieldRefsRecurse(expr.Lhs, loopVars, fields)
fields = fetchExprFieldRefsRecurse(expr.Rhs, loopVars, fields)
case NotEqualsExpr:
fields = fetchExprFieldRefsRecurse(expr.Lhs, loopVars, fields)
fields = fetchExprFieldRefsRecurse(expr.Rhs, loopVars, fields)
case LessThanExpr:
fields = fetchExprFieldRefsRecurse(expr.Lhs, loopVars, fields)
fields = fetchExprFieldRefsRecurse(expr.Rhs, loopVars, fields)
case LessEqualsExpr:
fields = fetchExprFieldRefsRecurse(expr.Lhs, loopVars, fields)
fields = fetchExprFieldRefsRecurse(expr.Rhs, loopVars, fields)
case GreaterThanExpr:
fields = fetchExprFieldRefsRecurse(expr.Lhs, loopVars, fields)
fields = fetchExprFieldRefsRecurse(expr.Rhs, loopVars, fields)
case GreaterEqualsExpr:
fields = fetchExprFieldRefsRecurse(expr.Lhs, loopVars, fields)
fields = fetchExprFieldRefsRecurse(expr.Rhs, loopVars, fields)
case ExistsExpr:
fields = fetchExprFieldRefsRecurse(expr.SubExpr, loopVars, fields)
case LikeExpr:
fields = fetchExprFieldRefsRecurse(expr.Lhs, loopVars, fields)
fields = fetchExprFieldRefsRecurse(expr.Rhs, loopVars, fields)
default:
panic(fmt.Sprintf("unexpected expression type %T", expr))
}
return fields
}
func fetchExprFieldRefs(expr Expression) []FieldExpr {
return fetchExprFieldRefsRecurse(expr, nil, nil)
}