-
Notifications
You must be signed in to change notification settings - Fork 4
/
Copy pathsyntax_node_qualifier_filter.go
129 lines (101 loc) · 2.68 KB
/
syntax_node_qualifier_filter.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
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
package jsonpath
import "reflect"
type syntaxFilterQualifier struct {
*syntaxBasicNode
query syntaxQuery
}
func (f *syntaxFilterQualifier) retrieve(
root, current interface{}, container *bufferContainer) errorRuntime {
switch typedNodes := current.(type) {
case map[string]interface{}:
return f.retrieveMap(root, typedNodes, container)
case []interface{}:
return f.retrieveList(root, typedNodes, container)
default:
foundType := msgTypeNull
if current != nil {
foundType = reflect.TypeOf(current).String()
}
return ErrorTypeUnmatched{
errorBasicRuntime: f.errorRuntime,
expectedType: msgTypeObjectOrArray,
foundType: foundType,
}
}
}
func (f *syntaxFilterQualifier) retrieveMap(
root interface{}, srcMap map[string]interface{}, container *bufferContainer) errorRuntime {
var deepestTextLen int
var deepestError errorRuntime
sortKeys := getSortedKeys(srcMap)
valueList := make([]interface{}, len(*sortKeys))
for index := range *sortKeys {
valueList[index] = srcMap[(*sortKeys)[index]]
}
valueList = f.query.compute(root, valueList)
isEachResult := len(valueList) == len(srcMap)
if !isEachResult {
if valueList[0] == emptyEntity {
return ErrorMemberNotExist{
errorBasicRuntime: f.errorRuntime,
}
}
}
for index := range *sortKeys {
if isEachResult {
if valueList[index] == emptyEntity {
continue
}
}
if err := f.retrieveMapNext(root, srcMap, (*sortKeys)[index], container); err != nil {
if len(container.result) == 0 {
deepestTextLen, deepestError = f.addDeepestError(err, deepestTextLen, deepestError)
}
}
}
putSortSlice(sortKeys)
if len(container.result) > 0 {
return nil
}
if deepestError == nil {
return ErrorMemberNotExist{
errorBasicRuntime: f.errorRuntime,
}
}
return deepestError
}
func (f *syntaxFilterQualifier) retrieveList(
root interface{}, srcList []interface{}, container *bufferContainer) errorRuntime {
var deepestTextLen int
var deepestError errorRuntime
valueList := f.query.compute(root, srcList)
isEachResult := len(valueList) == len(srcList)
if !isEachResult {
if valueList[0] == emptyEntity {
return ErrorMemberNotExist{
errorBasicRuntime: f.errorRuntime,
}
}
}
for index := range srcList {
if isEachResult {
if valueList[index] == emptyEntity {
continue
}
}
if err := f.retrieveListNext(root, srcList, index, container); err != nil {
if len(container.result) == 0 {
deepestTextLen, deepestError = f.addDeepestError(err, deepestTextLen, deepestError)
}
}
}
if len(container.result) > 0 {
return nil
}
if deepestError == nil {
return ErrorMemberNotExist{
errorBasicRuntime: f.errorRuntime,
}
}
return deepestError
}