@@ -11,6 +11,7 @@ var aAndB = `{ "glue":"and", "rules":[{ "field": "a", "filter":"less", "value":1
11
11
var aOrB = `{ "glue":"or", "rules":[{ "field": "a", "filter":"less", "value":1}, { "field": "b", "filter":"greater", "value":"abc" }]}`
12
12
var cOrC = `{ "glue":"or", "rules":[{ "field": "a", "filter":"is null" }, { "field": "b", "filter":"range100", "value":500 }]}`
13
13
var JSONaAndB = `{ "glue":"and", "rules":[{ "field": "json:cfg.a", "filter":"less", "value":1}, { "field": "json:cfg.b", "filter":"greater", "value":"abc" }]}`
14
+ var aPred = `{ "glue":"and", "rules":[{ "field": "a", "filter":"greater", "type": "number", "predicate": "month","value": 10 }, { "field": "a", "filter":"less", "type": "number", "predicate": "year","value": 2024 }]}`
14
15
15
16
var cases = [][]string {
16
17
{`{}` , "" , "" , "" },
@@ -447,7 +448,7 @@ func TestWhitelistPG(t *testing.T) {
447
448
func TestCustomOperation (t * testing.T ) {
448
449
format , err := FromJSON ([]byte (cOrC ))
449
450
if err != nil {
450
- t .Errorf ("can't parse json\n j: %s\n %f" , aAndB , err )
451
+ t .Errorf ("can't parse json\n j: %s\n %f" , cOrC , err )
451
452
return
452
453
}
453
454
@@ -486,3 +487,87 @@ func TestCustomOperation(t *testing.T) {
486
487
return
487
488
}
488
489
}
490
+
491
+ func TestCustomPredicate (t * testing.T ) {
492
+ format , err := FromJSON ([]byte (aPred ))
493
+ if err != nil {
494
+ t .Errorf ("can't parse json\n j: %s\n %f" , aPred , err )
495
+ return
496
+ }
497
+
498
+ sql , vals , err := GetSQL (format , & SQLConfig {
499
+ Predicates : map [string ]CustomPredicate {
500
+ "month" : func (n string , p string , values []interface {}) (string , []interface {}, error ) {
501
+ return fmt .Sprintf ("month(%s)" , n ), values , nil
502
+ },
503
+ "year" : func (n string , p string , values []interface {}) (string , []interface {}, error ) {
504
+ return fmt .Sprintf ("year(%s)" , n ), values , nil
505
+ },
506
+ },
507
+ })
508
+
509
+ if err != nil {
510
+ t .Errorf ("can't generate sql: %s\n %f" , aPred , err )
511
+ return
512
+ }
513
+
514
+ check := "( month(a) > ? AND year(a) < ? )"
515
+ if sql != check {
516
+ t .Errorf ("wrong sql generated\n j: %s\n s: %s\n r: %s" , aPred , check , sql )
517
+ return
518
+ }
519
+
520
+ valsStr , err := anyToStringArray (vals )
521
+ if err != nil {
522
+ t .Errorf ("can't convert parameters\n j: %s\n %f" , aPred , err )
523
+ return
524
+ }
525
+
526
+ check = "10,2024"
527
+ if valsStr != check {
528
+ t .Errorf ("wrong sql generated\n j: %s\n s: %s\n r: %s" , aPred , check , valsStr )
529
+ return
530
+ }
531
+ }
532
+
533
+ func TestCustomPredicatePG (t * testing.T ) {
534
+ format , err := FromJSON ([]byte (aPred ))
535
+ if err != nil {
536
+ t .Errorf ("can't parse json\n j: %s\n %f" , aPred , err )
537
+ return
538
+ }
539
+
540
+ sql , vals , err := GetSQL (format , & SQLConfig {
541
+ Predicates : map [string ]CustomPredicate {
542
+ "month" : func (n string , p string , values []interface {}) (string , []interface {}, error ) {
543
+ return fmt .Sprintf ("date_part('month', %s)" , n ), values , nil
544
+ },
545
+ "year" : func (n string , p string , values []interface {}) (string , []interface {}, error ) {
546
+ return fmt .Sprintf ("date_part('year', %s)" , n ), values , nil
547
+ },
548
+ },
549
+ }, & PostgreSQL {})
550
+
551
+ if err != nil {
552
+ t .Errorf ("can't generate sql: %s\n %f" , aPred , err )
553
+ return
554
+ }
555
+
556
+ check := "( date_part('month', a) > $1 AND date_part('year', a) < $2 )"
557
+ if sql != check {
558
+ t .Errorf ("wrong sql generated\n j: %s\n s: %s\n r: %s" , aPred , check , sql )
559
+ return
560
+ }
561
+
562
+ valsStr , err := anyToStringArray (vals )
563
+ if err != nil {
564
+ t .Errorf ("can't convert parameters\n j: %s\n %f" , aPred , err )
565
+ return
566
+ }
567
+
568
+ check = "10,2024"
569
+ if valsStr != check {
570
+ t .Errorf ("wrong sql generated\n j: %s\n s: %s\n r: %s" , aPred , check , valsStr )
571
+ return
572
+ }
573
+ }
0 commit comments