@@ -8,9 +8,10 @@ import (
8
8
"strings"
9
9
)
10
10
11
- type SQLParseObject struct {
11
+ type SQLParser struct {
12
+ Key string
12
13
LoadFunc func (s string ) interface {}
13
- QueryFirst bool
14
+ RequestMap map [ string ] interface {}
14
15
Values []interface {}
15
16
16
17
table string
@@ -20,20 +21,43 @@ type SQLParseObject struct {
20
21
limit int
21
22
page int
22
23
withPage bool
24
+
25
+ children []SQLParser
23
26
}
24
27
25
- func (o * SQLParseObject ) From (key string , fieldMap map [string ]interface {}) error {
26
- if strings .HasSuffix (key , "[]" ) {
27
- o .QueryFirst = false
28
- return o .parseListQuery (fieldMap )
28
+ func (o * SQLParser ) GetData () (interface {}, error ) {
29
+ if strings .HasSuffix (o .Key , "[]" ) {
30
+ if err := o .parseListQuery (); err != nil {
31
+ return nil , err
32
+ }
33
+ values , err := QueryAll (o .ToSQL (), o .Values ... )
34
+ if err != nil {
35
+ return nil , err
36
+ }
37
+ if len (o .children ) > 0 {
38
+ for _ , v := range values {
39
+ for _ , childParser := range o .children {
40
+ if data , err := childParser .GetData (); err != nil {
41
+ return nil , err
42
+ } else {
43
+ v [childParser .Key ] = data
44
+ }
45
+ }
46
+ }
47
+ }
48
+ return values , nil
29
49
}
30
- o .QueryFirst = true
31
- return o .parseObject (key , fieldMap )
50
+ err := o .parseObject ()
51
+ if err != nil {
52
+ return nil , err
53
+ }
54
+ sql := o .ToSQL ()
55
+ logger .Debugf ("解析 %s 执行SQL: %s %v" , o .Key , sql , o .Values )
56
+ return QueryOne (sql , o .Values ... ), nil
32
57
}
33
58
34
- func (o * SQLParseObject ) parseObject (key string , fieldMap map [string ]interface {}) error {
35
- o .table = key
36
- for field , value := range fieldMap {
59
+ func (o * SQLParser ) parseObject () error {
60
+ for field , value := range o .RequestMap {
37
61
if value == nil {
38
62
return fmt .Errorf ("field value error, %s is nil" , field )
39
63
}
@@ -62,7 +86,7 @@ func (o *SQLParseObject) parseObject(key string, fieldMap map[string]interface{}
62
86
return nil
63
87
}
64
88
65
- func (o * SQLParseObject ) parseRangeCondition (field string , value interface {}) {
89
+ func (o * SQLParser ) parseRangeCondition (field string , value interface {}) {
66
90
// 数组使用 IN 条件
67
91
if values , ok := value .([]interface {}); ok {
68
92
condition := field + " in ("
@@ -86,9 +110,9 @@ func (o *SQLParseObject) parseRangeCondition(field string, value interface{}) {
86
110
}
87
111
}
88
112
89
- func (o * SQLParseObject ) parseListQuery (fieldMap map [ string ] interface {} ) error {
90
-
91
- for field , value := range fieldMap {
113
+ func (o * SQLParser ) parseListQuery () error {
114
+ o . table = o . Key [ 0 : len ( o . Key ) - 2 ]
115
+ for field , value := range o . RequestMap {
92
116
if value == nil {
93
117
return fmt .Errorf ("field value error, %s is nil" , field )
94
118
}
@@ -101,7 +125,7 @@ func (o *SQLParseObject) parseListQuery(fieldMap map[string]interface{}) error {
101
125
logger .Debugf ("parseListQuery table:%s, size: %d" , o .table , o .limit )
102
126
default :
103
127
if _ , ok := AllTable [field ]; ok {
104
- if err := o .parseObject (field , value .( map [ string ] interface {}) ); err != nil {
128
+ if err := o .parseObject (); err != nil {
105
129
return err
106
130
}
107
131
} else {
@@ -110,13 +134,13 @@ func (o *SQLParseObject) parseListQuery(fieldMap map[string]interface{}) error {
110
134
}
111
135
}
112
136
if len (o .table ) == 0 {
113
- return fmt .Errorf ("请求列表数据处理失败,未发现可用表名 %v" , fieldMap )
137
+ return fmt .Errorf ("请求列表数据处理失败,未发现可用表名 %v" , o . RequestMap )
114
138
}
115
139
o .withPage = o .page > 0 && o .limit > 0
116
140
return nil
117
141
}
118
142
119
- func (o * SQLParseObject ) ToSQL () string {
143
+ func (o * SQLParser ) ToSQL () string {
120
144
var buf bytes.Buffer
121
145
buf .WriteString ("SELECT " )
122
146
if o .columns == nil {
@@ -134,7 +158,7 @@ func (o *SQLParseObject) ToSQL() string {
134
158
buf .WriteString (" ORDER BY " )
135
159
buf .WriteString (o .order )
136
160
}
137
- if o .QueryFirst {
161
+ if o .Key == o . table {
138
162
buf .WriteString (" LIMIT 1" )
139
163
} else if o .withPage {
140
164
buf .WriteString (" LIMIT " )
0 commit comments