@@ -18,7 +18,7 @@ type Query struct {
18
18
Offset int
19
19
Limit int
20
20
Sorts []Sort
21
- Filters []* Filter
21
+ Filters [][] * Filter
22
22
23
23
delimiterIN string
24
24
delimiterOR string
@@ -219,9 +219,11 @@ func (q *Query) AddSortBy(by string, desc bool) *Query {
219
219
// HaveFilter returns true if request contains some filter
220
220
func (q * Query ) HaveFilter (name string ) bool {
221
221
222
- for _ , v := range q .Filters {
223
- if v .Name == name {
224
- return true
222
+ for _ , filters := range q .Filters {
223
+ for _ , v := range filters {
224
+ if v .Name == name {
225
+ return true
226
+ }
225
227
}
226
228
}
227
229
@@ -230,27 +232,31 @@ func (q *Query) HaveFilter(name string) bool {
230
232
231
233
// AddFilter adds a filter to Query
232
234
func (q * Query ) AddFilter (name string , m Method , value interface {}) * Query {
233
- q .Filters = append (q .Filters , & Filter {
234
- Name : name ,
235
- Method : m ,
236
- Value : value ,
235
+ q .Filters = append (q .Filters , []* Filter {
236
+ {
237
+ Name : name ,
238
+ Method : m ,
239
+ Value : value ,
240
+ },
237
241
})
238
242
return q
239
243
}
240
244
241
245
// RemoveFilter removes the filter by name
242
246
func (q * Query ) RemoveFilter (name string ) error {
243
247
244
- for i , v := range q .Filters {
245
- if v .Name == name {
246
- // safe remove element from slice
247
- if i < len (q .Filters )- 1 {
248
- copy (q .Filters [i :], q .Filters [i + 1 :])
249
- }
250
- q .Filters [len (q .Filters )- 1 ] = nil
251
- q .Filters = q .Filters [:len (q .Filters )- 1 ]
248
+ for key , filters := range q .Filters {
249
+ for i , v := range filters {
250
+ if v .Name == name {
251
+ // safe remove element from slice
252
+ if i < len (q .Filters [key ])- 1 {
253
+ copy (q .Filters [key ][i :], q .Filters [key ][i + 1 :])
254
+ }
255
+ q .Filters [key ][len (q .Filters [key ])- 1 ] = nil
256
+ q .Filters [key ] = q .Filters [key ][:len (q .Filters [key ])- 1 ]
252
257
253
- return nil
258
+ return nil
259
+ }
254
260
}
255
261
}
256
262
@@ -289,9 +295,11 @@ func (q *Query) RemoveValidation(NameAndOrTags string) error {
289
295
// GetFilter returns filter by name
290
296
func (q * Query ) GetFilter (name string ) (* Filter , error ) {
291
297
292
- for _ , v := range q .Filters {
293
- if v .Name == name {
294
- return v , nil
298
+ for _ , filters := range q .Filters {
299
+ for _ , v := range filters {
300
+ if v .Name == name {
301
+ return v , nil
302
+ }
295
303
}
296
304
}
297
305
@@ -313,9 +321,11 @@ type Replacer map[string]string
313
321
func (q * Query ) ReplaceNames (r Replacer ) {
314
322
315
323
for name , newname := range r {
316
- for i , v := range q .Filters {
317
- if v .Name == name {
318
- q .Filters [i ].Name = newname
324
+ for key , filters := range q .Filters {
325
+ for i , v := range filters {
326
+ if v .Name == name {
327
+ q.Filters [key ][i ].Name = newname
328
+ }
319
329
}
320
330
}
321
331
for i , v := range q .Fields {
@@ -340,55 +350,74 @@ func (q *Query) Where() string {
340
350
return ""
341
351
}
342
352
353
+ var whereList []string
354
+
343
355
var where string
344
- var OR bool = false
356
+ var OR bool
345
357
346
- for i := 0 ; i < len (q .Filters ); i ++ {
347
- filter := q .Filters [i ]
358
+ for key := range q .Filters {
359
+ where = ""
360
+ OR = false
361
+ if len (q .Filters [key ]) == 0 {
362
+ continue
363
+ }
364
+ for i := 0 ; i < len (q .Filters [key ]); i ++ {
365
+ filter := q.Filters [key ][i ]
348
366
349
- prefix := ""
350
- suffix := ""
367
+ prefix := ""
368
+ suffix := ""
351
369
352
- if filter .Or && ! OR {
353
- if i == 0 {
354
- prefix = "("
370
+ if filter .Or && ! OR {
371
+ if i == 0 {
372
+ prefix = "("
373
+ } else {
374
+ prefix = " AND ("
375
+ }
376
+ OR = true
377
+ } else if filter .Or && OR {
378
+ prefix = " OR "
379
+ // if last element of next element not OR method
380
+ if i + 1 == len (q .Filters [key ]) || (i + 1 < len (q .Filters [key ]) && ! q .Filters [key ][i + 1 ].Or ) {
381
+ suffix = ")"
382
+ OR = false
383
+ }
355
384
} else {
356
- prefix = " AND ("
357
- }
358
- OR = true
359
- } else if filter .Or && OR {
360
- prefix = " OR "
361
- // if last element of next element not OR method
362
- if i + 1 == len (q .Filters ) || (i + 1 < len (q .Filters ) && ! q .Filters [i + 1 ].Or ) {
363
- suffix = ")"
364
- OR = false
385
+ if i > 0 {
386
+ prefix = " AND "
387
+ }
365
388
}
366
- } else {
367
- if i > 0 {
368
- prefix = " AND "
389
+
390
+ if a , err := filter .Where (); err == nil {
391
+ where += fmt .Sprintf ("%s%s%s" , prefix , a , suffix )
392
+ } else {
393
+ continue
369
394
}
370
395
}
371
-
372
- if a , err := filter .Where (); err == nil {
373
- where += fmt .Sprintf ("%s%s%s" , prefix , a , suffix )
374
- } else {
375
- continue
396
+ if where != "" {
397
+ whereList = append (whereList , where )
376
398
}
399
+ }
377
400
401
+ if len (whereList ) == 0 {
402
+ return ""
378
403
}
379
404
380
- return where
405
+ return strings . Join ( whereList , " AND " )
381
406
}
382
407
383
408
// WHERE returns list of filters for WHERE SQL statement with `WHERE` word
384
409
// return example: `WHERE id > 0 AND email LIKE 'some@email.com'`
385
410
func (q * Query ) WHERE () string {
386
-
387
411
if len (q .Filters ) == 0 {
388
412
return ""
389
413
}
390
414
391
- return " WHERE " + q .Where ()
415
+ where := q .Where ()
416
+ if where == "" {
417
+ return ""
418
+ }
419
+
420
+ return " WHERE " + where
392
421
}
393
422
394
423
// Args returns slice of arguments for WHERE statement
@@ -400,14 +429,20 @@ func (q *Query) Args() []interface{} {
400
429
return args
401
430
}
402
431
403
- for i := 0 ; i < len (q .Filters ); i ++ {
404
- filter := q .Filters [i ]
405
-
406
- if a , err := filter .Args (); err == nil {
407
- args = append (args , a ... )
408
- } else {
432
+ for key := range q .Filters {
433
+ if len (q .Filters [key ]) == 0 {
409
434
continue
410
435
}
436
+
437
+ for i := 0 ; i < len (q .Filters [key ]); i ++ {
438
+ filter := q.Filters [key ][i ]
439
+
440
+ if a , err := filter .Args (); err == nil {
441
+ args = append (args , a ... )
442
+ } else {
443
+ continue
444
+ }
445
+ }
411
446
}
412
447
413
448
return args
@@ -503,11 +538,14 @@ func (q *Query) Parse() (err error) {
503
538
err = q .parseSort (values , q .validations [low ])
504
539
delete (requiredNames , low )
505
540
default :
506
- if len (values ) != 1 {
541
+ if len (values ) == 0 {
507
542
return errors .Wrap (ErrBadFormat , key )
508
543
}
509
- if err = q .parseFilter (key , values [0 ]); err != nil {
510
- return err
544
+
545
+ for i := 0 ; i < len (values ); i ++ {
546
+ if err = q .parseFilter (key , values [i ]); err != nil {
547
+ return err
548
+ }
511
549
}
512
550
}
513
551
@@ -576,6 +614,8 @@ func (q *Query) parseFilter(key, value string) error {
576
614
return errors .Wrap (ErrEmptyValue , key )
577
615
}
578
616
617
+ filters := make ([]* Filter , 0 )
618
+
579
619
if strings .Contains (value , q .delimiterOR ) { // OR multiple filter
580
620
parts := strings .Split (value , q .delimiterOR )
581
621
for i , v := range parts {
@@ -609,7 +649,7 @@ func (q *Query) parseFilter(key, value string) error {
609
649
// set OR
610
650
filter .Or = true
611
651
612
- q . Filters = append (q . Filters , filter )
652
+ filters = append (filters , filter )
613
653
}
614
654
} else { // Single filter
615
655
filter , err := newFilter (key , value , q .delimiterIN , q .validations )
@@ -623,20 +663,26 @@ func (q *Query) parseFilter(key, value string) error {
623
663
return errors .Wrap (err , key )
624
664
}
625
665
626
- q . Filters = append (q . Filters , filter )
666
+ filters = append (filters , filter )
627
667
}
628
668
669
+ q .Filters = append (q .Filters , filters )
670
+
629
671
return nil
630
672
}
631
673
632
674
// clean the filters slice
633
675
func (q * Query ) cleanFilters () {
634
676
if len (q .Filters ) > 0 {
635
- for i := range q .Filters {
636
- q .Filters [i ] = nil
677
+ for key := range q .Filters {
678
+ for i := range q .Filters [key ] {
679
+ q.Filters [key ][i ] = nil
680
+ }
681
+ q .Filters [key ] = nil
637
682
}
638
683
q .Filters = nil
639
684
}
685
+ q .Filters = make ([][]* Filter , 0 )
640
686
}
641
687
642
688
func (q * Query ) parseSort (value []string , validate ValidationFunc ) error {
0 commit comments