-
Notifications
You must be signed in to change notification settings - Fork 4
/
syntax_basic_compare_query.go
45 lines (38 loc) · 1.13 KB
/
syntax_basic_compare_query.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
package jsonpath
type syntaxBasicCompareQuery struct {
leftParam *syntaxBasicCompareParameter
rightParam *syntaxBasicCompareParameter
comparator syntaxComparator
}
func (q *syntaxBasicCompareQuery) compute(
root interface{}, currentList []interface{}) []interface{} {
leftValues := q.leftParam.compute(root, currentList)
leftFound := q.comparator.typeCast(leftValues)
rightValues := q.rightParam.compute(root, currentList)
rightFound := q.comparator.typeCast(rightValues)
if leftFound && rightFound {
var hasValue bool
// The syntax parser always results in a literal value on the right side as input.
for leftIndex := range leftValues {
if _, ok := leftValues[leftIndex].(struct{}); ok {
continue
}
if q.comparator.comparator(leftValues[leftIndex], rightValues[0]) {
hasValue = true
} else {
leftValues[leftIndex] = struct{}{}
}
}
if hasValue {
return leftValues
}
return []interface{}{struct{}{}}
}
// leftFound == false && rightFound == false
if leftFound == rightFound {
if _, ok := q.comparator.(*syntaxCompareEQ); ok {
return currentList
}
}
return []interface{}{struct{}{}}
}