@@ -537,14 +537,11 @@ func (r *Query) OrderByRaw(raw string) db.Query {
537537}
538538
539539func (r * Query ) OrWhere (query any , args ... any ) db.Query {
540- q := r .clone ()
541- q .conditions .Where = append (q .conditions .Where , contractsdriver.Where {
540+ return r .addWhere (contractsdriver.Where {
542541 Query : query ,
543542 Args : args ,
544543 Or : true ,
545544 })
546-
547- return q
548545}
549546
550547func (r * Query ) OrWhereBetween (column string , x , y any ) db.Query {
@@ -568,6 +565,51 @@ func (r *Query) OrWhereIn(column string, values []any) db.Query {
568565 return r .OrWhere (column , values )
569566}
570567
568+ func (r * Query ) OrWhereJsonContains (column string , value any ) db.Query {
569+ return r .addWhere (contractsdriver.Where {
570+ Type : contractsdriver .WhereTypeJsonContains ,
571+ Query : column ,
572+ Args : []any {value },
573+ Or : true ,
574+ })
575+ }
576+
577+ func (r * Query ) OrWhereJsonContainsKey (column string ) db.Query {
578+ return r .addWhere (contractsdriver.Where {
579+ Type : contractsdriver .WhereTypeJsonContainsKey ,
580+ Query : column ,
581+ Or : true ,
582+ })
583+ }
584+
585+ func (r * Query ) OrWhereJsonDoesntContain (column string , value any ) db.Query {
586+ return r .addWhere (contractsdriver.Where {
587+ Type : contractsdriver .WhereTypeJsonContains ,
588+ Query : column ,
589+ Args : []any {value },
590+ IsNot : true ,
591+ Or : true ,
592+ })
593+ }
594+
595+ func (r * Query ) OrWhereJsonDoesntContainKey (column string ) db.Query {
596+ return r .addWhere (contractsdriver.Where {
597+ Type : contractsdriver .WhereTypeJsonContainsKey ,
598+ Query : column ,
599+ IsNot : true ,
600+ Or : true ,
601+ })
602+ }
603+
604+ func (r * Query ) OrWhereJsonLength (column string , length int ) db.Query {
605+ return r .addWhere (contractsdriver.Where {
606+ Type : contractsdriver .WhereTypeJsonLength ,
607+ Query : column ,
608+ Args : []any {length },
609+ Or : true ,
610+ })
611+ }
612+
571613func (r * Query ) OrWhereLike (column string , value string ) db.Query {
572614 return r .OrWhere (sq.Like {column : value })
573615}
@@ -769,13 +811,10 @@ func (r *Query) When(condition bool, callback func(query db.Query) db.Query, fal
769811}
770812
771813func (r * Query ) Where (query any , args ... any ) db.Query {
772- q := r .clone ()
773- q .conditions .Where = append (q .conditions .Where , contractsdriver.Where {
814+ return r .addWhere (contractsdriver.Where {
774815 Query : query ,
775816 Args : args ,
776817 })
777-
778- return q
779818}
780819
781820func (r * Query ) WhereBetween (column string , x , y any ) db.Query {
@@ -812,6 +851,46 @@ func (r *Query) WhereIn(column string, values []any) db.Query {
812851 return r .Where (column , values )
813852}
814853
854+ func (r * Query ) WhereJsonContains (column string , value any ) db.Query {
855+ return r .addWhere (contractsdriver.Where {
856+ Type : contractsdriver .WhereTypeJsonContains ,
857+ Query : column ,
858+ Args : []any {value },
859+ })
860+ }
861+
862+ func (r * Query ) WhereJsonContainsKey (column string ) db.Query {
863+ return r .addWhere (contractsdriver.Where {
864+ Type : contractsdriver .WhereTypeJsonContainsKey ,
865+ Query : column ,
866+ })
867+ }
868+
869+ func (r * Query ) WhereJsonDoesntContain (column string , value any ) db.Query {
870+ return r .addWhere (contractsdriver.Where {
871+ Type : contractsdriver .WhereTypeJsonContains ,
872+ Query : column ,
873+ Args : []any {value },
874+ IsNot : true ,
875+ })
876+ }
877+
878+ func (r * Query ) WhereJsonDoesntContainKey (column string ) db.Query {
879+ return r .addWhere (contractsdriver.Where {
880+ Type : contractsdriver .WhereTypeJsonContainsKey ,
881+ Query : column ,
882+ IsNot : true ,
883+ })
884+ }
885+
886+ func (r * Query ) WhereJsonLength (column string , length int ) db.Query {
887+ return r .addWhere (contractsdriver.Where {
888+ Type : contractsdriver .WhereTypeJsonLength ,
889+ Query : column ,
890+ Args : []any {length },
891+ })
892+ }
893+
815894func (r * Query ) WhereLike (column string , value string ) db.Query {
816895 return r .Where (sq.Like {column : value })
817896}
@@ -865,6 +944,13 @@ func (r *Query) WhereRaw(raw string, args []any) db.Query {
865944 return r .Where (sq .Expr (raw , args ... ))
866945}
867946
947+ func (r * Query ) addWhere (where contractsdriver.Where ) db.Query {
948+ q := r .clone ()
949+ q .conditions .Where = append (q .conditions .Where , where )
950+
951+ return q
952+ }
953+
868954func (r * Query ) buildDelete () (sql string , args []any , err error ) {
869955 if r .err != nil {
870956 return "" , nil , r .err
@@ -1043,13 +1129,39 @@ func (r *Query) buildUpdate(data map[string]any) (sql string, args []any, err er
10431129func (r * Query ) buildWhere (where contractsdriver.Where ) (any , []any , error ) {
10441130 switch query := where .Query .(type ) {
10451131 case string :
1046- if ! str .Of (query ).Trim ().Contains (" " , "?" ) {
1132+ switch where .Type {
1133+ case contractsdriver .WhereTypeJsonContains :
1134+ var err error
1135+ query , where .Args , err = r .grammar .CompileJsonContains (query , where .Args [0 ], where .IsNot )
1136+ if err != nil {
1137+ return nil , nil , errors .OrmJsonContainsInvalidBinding .Args (err )
1138+ }
1139+ case contractsdriver .WhereTypeJsonContainsKey :
1140+ query = str .Of (r .grammar .CompileJsonContainsKey (query , where .IsNot )).Replace ("?" , "??" ).String ()
1141+ case contractsdriver .WhereTypeJsonLength :
1142+ segments := strings .SplitN (query , " " , 2 )
1143+ segments [0 ] = r .grammar .CompileJsonLength (segments [0 ])
1144+ query = strings .Join (segments , " " )
1145+ default :
1146+ if str .Of (query ).Trim ().Contains ("->" ) {
1147+ segments := strings .Split (query , " " )
1148+ for i := range segments {
1149+ if strings .Contains (segments [i ], "->" ) {
1150+ segments [i ] = r .grammar .CompileJsonSelector (segments [i ])
1151+ }
1152+ }
1153+ query = strings .Join (segments , " " )
1154+ where .Args = r .grammar .CompileJsonValues (where .Args ... )
1155+ }
1156+ }
1157+ if ! str .Of (query ).Trim ().Contains ("?" ) {
10471158 if len (where .Args ) > 1 {
10481159 return sq.Eq {query : where .Args }, nil , nil
10491160 } else if len (where .Args ) == 1 {
10501161 return sq.Eq {query : where .Args [0 ]}, nil , nil
10511162 }
10521163 }
1164+
10531165 return query , where .Args , nil
10541166 case map [string ]any :
10551167 return sq .Eq (query ), nil , nil
0 commit comments