-
Notifications
You must be signed in to change notification settings - Fork 2
Expand file tree
/
Copy pathquery_parser.go
More file actions
108 lines (103 loc) · 2.07 KB
/
query_parser.go
File metadata and controls
108 lines (103 loc) · 2.07 KB
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
package gosql
import (
"encoding/json"
"strings"
)
func (o *QueryRoot) ParseJSONString(str string) error {
var m map[string]interface{}
if err := json.Unmarshal([]byte(str), &m); err != nil {
return err
}
return o.Parse(m)
}
func (q *QueryRoot) Parse(m map[string]interface{}) error {
if m == nil || len(m) == 0 {
return nil
}
for k, v := range m {
if v == nil {
} else if IsQueryKey(k) {
if q.Values == nil {
q.Values = make([]IQuery, 0, len(m))
}
elem := &QueryElem{anonymous: IsQueryAnonymousKey(k), Key: k}
if elem.IsAnonymous() {
elem.RelKey = QueryKeyAnd
} else {
elem.RelKey = k
}
if err := elem.Parse(v); err == nil {
q.Values = append(q.Values, elem)
}
}
}
return nil
}
func (q *QueryElem) Parse(obj interface{}) error {
if m, ok := obj.(map[string]interface{}); !ok {
return ErrTypeMap
} else if m == nil || len(m) == 0 {
return ErrTypeMap
} else {
if q.Values == nil {
q.Values = make([]IQuery, 0, len(m))
}
for k, v := range m {
if v == nil {
} else if IsQueryKey(k) {
if !q.IsAnonymous() {
elem := &QueryElem{anonymous: IsQueryAnonymousKey(k), Key: k}
if elem.IsAnonymous() {
elem.RelKey = q.RelKey
} else {
elem.RelKey = k
}
if err := elem.Parse(v); err == nil {
q.Values = append(q.Values, elem)
}
}
} else {
value := &QueryValue{Key: q.Key, Field: k}
if err := value.Parse(v); err == nil {
q.Values = append(q.Values, value)
}
}
}
}
if q.Values == nil || len(q.Values) == 0 {
return ErrTypeMap
}
return nil
}
func (q *QueryValue) Parse(obj interface{}) error {
if obj == nil {
return ErrTypeNil
} else if strings.HasPrefix(q.Field, "%") {
return ErrTypeString
}
switch v := obj.(type) {
case int:
q.Value = v
case int8:
q.Value = v
case int16:
q.Value = v
case int32:
q.Value = v
case int64:
q.Value = v
case float32:
q.Value = v
case float64:
q.Value = v
case string:
q.Value = v
case bool:
q.Value = v
case []interface{}:
q.Value = v
default:
return ErrTypeString
}
return nil
}