@@ -117,34 +117,40 @@ func (q QuerySpec) validateGroupBy() error {
117
117
}
118
118
for _ , c := range q .GroupBy {
119
119
if ! c .Validate () {
120
- return fmt .Errorf ("%w: groupby %v" , ErrInvalidColumnInfo , c . Name )
120
+ return fmt .Errorf ("%w: groupby %# v" , ErrInvalidColumnInfo , c )
121
121
}
122
- // 清除ASC
123
- c .Order = merger .OrderDESC
124
- if ! slice .Contains (q .Select , c ) {
125
- return fmt .Errorf ("%w: groupby %v" , ErrColumnNotFoundInSelectList , c .Name )
122
+ if ! slice .ContainsFunc (q .Select , func (src merger.ColumnInfo ) bool { return equals (src , c ) }) {
123
+ return fmt .Errorf ("%w: groupby %#v" , ErrColumnNotFoundInSelectList , c )
126
124
}
127
125
}
128
126
for _ , c := range q .Select {
129
- if c .AggregateFunc == "" && ! slice .Contains (q .GroupBy , c ) {
130
- return fmt .Errorf ("%w: 非聚合列 %v 必须出现在groupby列表中" , ErrInvalidColumnInfo , c .Name )
127
+ isInGroupByList := slice .ContainsFunc (q .GroupBy , func (src merger.ColumnInfo ) bool { return equals (src , c ) })
128
+ if c .AggregateFunc == "" && ! isInGroupByList {
129
+ return fmt .Errorf ("%w: 非聚合列 %#v 必须出现在groupby列表中" , ErrInvalidColumnInfo , c )
131
130
}
132
- if c .AggregateFunc != "" && slice . Contains ( q . GroupBy , c ) {
133
- return fmt .Errorf ("%w: 聚合列 %v 不能出现在groupby列表中" , ErrInvalidColumnInfo , c . Name )
131
+ if c .AggregateFunc != "" && isInGroupByList {
132
+ return fmt .Errorf ("%w: 聚合列 %# v 不能出现在groupby列表中" , ErrInvalidColumnInfo , c )
134
133
}
135
134
}
136
135
return nil
137
136
}
138
137
138
+ func equals (a , b merger.ColumnInfo ) bool {
139
+ // 这里忽略Order和Distinct字段的比较
140
+ return a .Index == b .Index &&
141
+ strings .Trim (a .Name , "`" ) == strings .Trim (b .Name , "`" ) &&
142
+ strings .EqualFold (a .AggregateFunc , b .AggregateFunc ) &&
143
+ strings .Trim (a .Alias , "`" ) == strings .Trim (b .Alias , "`" )
144
+ }
145
+
139
146
func (q QuerySpec ) validateDistinct () error {
140
147
if ! slice .Contains (q .Features , query .Distinct ) {
141
148
return nil
142
149
}
143
- // 程序走到这q.Select的长度至少为1
150
+ // 注意: 程序走到这q.Select的长度至少为1
144
151
for _ , c := range q .Select {
145
- // case2,3
146
152
if ! c .Distinct || ! c .Validate () {
147
- return fmt .Errorf ("%w: distinct %v" , ErrInvalidColumnInfo , c . Name )
153
+ return fmt .Errorf ("%w: distinct %# v" , ErrInvalidColumnInfo , c )
148
154
}
149
155
}
150
156
return nil
@@ -158,15 +164,11 @@ func (q QuerySpec) validateOrderBy() error {
158
164
return fmt .Errorf ("%w: orderby" , ErrEmptyColumnList )
159
165
}
160
166
for _ , c := range q .OrderBy {
161
-
162
167
if ! c .Validate () {
163
- return fmt .Errorf ("%w: orderby %v" , ErrInvalidColumnInfo , c . Name )
168
+ return fmt .Errorf ("%w: orderby %# v" , ErrInvalidColumnInfo , c )
164
169
}
165
- _ , ok := slice .Find (q .Select , func (src merger.ColumnInfo ) bool {
166
- return src .Index == c .Index && src .SelectName () == c .SelectName ()
167
- })
168
- if ! ok {
169
- return fmt .Errorf ("%w: orderby %v" , ErrColumnNotFoundInSelectList , c .Name )
170
+ if ! slice .ContainsFunc (q .Select , func (src merger.ColumnInfo ) bool { return equals (src , c ) }) {
171
+ return fmt .Errorf ("%w: orderby %#v" , ErrColumnNotFoundInSelectList , c )
170
172
}
171
173
}
172
174
return nil
0 commit comments