diff --git a/generator/templates/builders_create.gotpl b/generator/templates/builders_create.gotpl index f60c787..f732ef2 100644 --- a/generator/templates/builders_create.gotpl +++ b/generator/templates/builders_create.gotpl @@ -297,7 +297,7 @@ func loadRelation[P any, C any]( scan func(*sql.Rows, *C) error, childKey func(*C) (string, bool), assign func(*P, []*C), - params QueryParams, + params QueryParams[C], ) ([]*C, error) { var parentKeys []any for _, p := range parents { @@ -312,9 +312,9 @@ func loadRelation[P any, C any]( return nil, nil } - // Prepend parent ID checks to filters using StandardPredicate - allPreds := append([]Predicate{ - StandardPredicate{ + // Prepend parent ID checks to filters using Predicate[C] + allPreds := append([]PredicateOf[C]{ + Predicate[C]{ Data: PredicateData{ Column: fkCol, Operator: "IN", @@ -366,14 +366,14 @@ func loadRelation[P any, C any]( return allChildren, nil } -func compileRelationSQL(dialect Dialect, table, fkCol string, cols []string, where string, params QueryParams) string { +func compileRelationSQL[M any](dialect Dialect, table, fkCol string, cols []string, where string, params QueryParams[M]) string { if params.Take != nil || params.Skip != nil { return compilePartitionedRelationSQL(dialect, table, fkCol, cols, where, params) } return compileSimpleRelationSQL(dialect, table, cols, where, params) } -func compilePartitionedRelationSQL(dialect Dialect, table, fkCol string, cols []string, where string, params QueryParams) string { +func compilePartitionedRelationSQL[M any](dialect Dialect, table, fkCol string, cols []string, where string, params QueryParams[M]) string { var innerSb strings.Builder innerSb.WriteString("SELECT ") for i, col := range cols { @@ -424,7 +424,7 @@ func compilePartitionedRelationSQL(dialect Dialect, table, fkCol string, cols [] return outerSb.String() } -func compileSimpleRelationSQL(dialect Dialect, table string, cols []string, where string, params QueryParams) string { +func compileSimpleRelationSQL[M any](dialect Dialect, table string, cols []string, where string, params QueryParams[M]) string { var sb strings.Builder sb.WriteString("SELECT ") for i, col := range cols { diff --git a/generator/templates/builders_query.gotpl b/generator/templates/builders_query.gotpl index 142c8e2..70d73de 100644 --- a/generator/templates/builders_query.gotpl +++ b/generator/templates/builders_query.gotpl @@ -1,8 +1,8 @@ type FindUniqueBuilder[M any, S any, O any] struct { client *Queries - where UniquePredicate - additional []Predicate - execFunc func(ctx context.Context, where UniquePredicate, additional []Predicate, s *S, o *O) (*M, error) + where UniquePredicate[M] + additional []PredicateOf[M] + execFunc func(ctx context.Context, where UniquePredicate[M], additional []PredicateOf[M], s *S, o *O) (*M, error) } func (b *FindUniqueBuilder[M, S, O]) Select(s S) *FindUniqueSelectBuilder[M, S, O] { @@ -37,9 +37,9 @@ func (b *FindUniqueOmitBuilder[M, S, O]) Exec(ctx context.Context) (*M, error) { type FindFirstBuilder[M any, S any, O any] struct { client *Queries - where []Predicate + where []PredicateOf[M] skip *int - execFunc func(ctx context.Context, params QueryParams, s *S, o *O) (*M, error) + execFunc func(ctx context.Context, params QueryParams[M], s *S, o *O) (*M, error) } func (b *FindFirstBuilder[M, S, O]) Skip(offset int) *FindFirstBuilder[M, S, O] { @@ -56,7 +56,7 @@ func (b *FindFirstBuilder[M, S, O]) Omit(o O) *FindFirstOmitBuilder[M, S, O] { } func (b *FindFirstBuilder[M, S, O]) Exec(ctx context.Context) (*M, error) { - params := QueryParams{ + params := QueryParams[M]{ Where: b.where, Skip: b.skip, } @@ -69,7 +69,7 @@ type FindFirstSelectBuilder[M any, S any, O any] struct { } func (b *FindFirstSelectBuilder[M, S, O]) Exec(ctx context.Context) (*M, error) { - params := QueryParams{ + params := QueryParams[M]{ Where: b.builder.where, Skip: b.builder.skip, } @@ -82,7 +82,7 @@ type FindFirstOmitBuilder[M any, S any, O any] struct { } func (b *FindFirstOmitBuilder[M, S, O]) Exec(ctx context.Context) (*M, error) { - params := QueryParams{ + params := QueryParams[M]{ Where: b.builder.where, Skip: b.builder.skip, } @@ -91,10 +91,10 @@ func (b *FindFirstOmitBuilder[M, S, O]) Exec(ctx context.Context) (*M, error) { type FindManyBuilder[M any, S any, O any] struct { client *Queries - where []Predicate + where []PredicateOf[M] take *int skip *int - execFunc func(ctx context.Context, params QueryParams, s *S, o *O) ([]*M, error) + execFunc func(ctx context.Context, params QueryParams[M], s *S, o *O) ([]*M, error) } func (b *FindManyBuilder[M, S, O]) Take(limit int) *FindManyBuilder[M, S, O] { @@ -116,7 +116,7 @@ func (b *FindManyBuilder[M, S, O]) Omit(o O) *FindManyOmitBuilder[M, S, O] { } func (b *FindManyBuilder[M, S, O]) Exec(ctx context.Context) ([]*M, error) { - params := QueryParams{ + params := QueryParams[M]{ Where: b.where, Take: b.take, Skip: b.skip, @@ -130,7 +130,7 @@ type FindManySelectBuilder[M any, S any, O any] struct { } func (b *FindManySelectBuilder[M, S, O]) Exec(ctx context.Context) ([]*M, error) { - params := QueryParams{ + params := QueryParams[M]{ Where: b.builder.where, Take: b.builder.take, Skip: b.builder.skip, @@ -144,7 +144,7 @@ type FindManyOmitBuilder[M any, S any, O any] struct { } func (b *FindManyOmitBuilder[M, S, O]) Exec(ctx context.Context) ([]*M, error) { - params := QueryParams{ + params := QueryParams[M]{ Where: b.builder.where, Take: b.builder.take, Skip: b.builder.skip, diff --git a/generator/templates/client.gotpl b/generator/templates/client.gotpl index 4f81194..01a4b12 100644 --- a/generator/templates/client.gotpl +++ b/generator/templates/client.gotpl @@ -275,25 +275,43 @@ type PredicateData struct { Children []PredicateData } -type Predicate interface { +type PredicateOf[M any] interface { ToPredicateData() PredicateData Validate() error + phantom(M) } -type UniquePredicate interface { - Predicate - IsUnique() - Validate() error +type Predicate[M any] struct { + Data PredicateData +} + +func (p Predicate[M]) ToPredicateData() PredicateData { + return p.Data } -type StandardPredicate struct { +func (p Predicate[M]) Validate() error { + return p.Data.Validate() +} + +func (p Predicate[M]) phantom(M) {} + +type UniquePredicate[M any] struct { Data PredicateData } -func (sp StandardPredicate) ToPredicateData() PredicateData { - return sp.Data +func (p UniquePredicate[M]) ToPredicateData() PredicateData { + return p.Data } +func (p UniquePredicate[M]) Validate() error { + if p.Data.Column == "" && len(p.Data.Children) == 0 { + return fmt.Errorf("at least one unique field must be set for FindUnique") + } + return p.Data.Validate() +} + +func (p UniquePredicate[M]) phantom(M) {} + func validateValue(col string, val any) error { switch v := val.(type) { case string: @@ -339,18 +357,14 @@ func (pd PredicateData) Validate() error { return validateValue(pd.Column, pd.Value) } -func (sp StandardPredicate) Validate() error { - return sp.Data.Validate() -} - -func And(preds ...Predicate) Predicate { +func And[M any](preds ...PredicateOf[M]) PredicateOf[M] { var children []PredicateData for _, p := range preds { if p != nil { children = append(children, p.ToPredicateData()) } } - return StandardPredicate{ + return Predicate[M]{ Data: PredicateData{ IsLogical: true, Operator: "AND", @@ -359,14 +373,14 @@ func And(preds ...Predicate) Predicate { } } -func Or(preds ...Predicate) Predicate { +func Or[M any](preds ...PredicateOf[M]) PredicateOf[M] { var children []PredicateData for _, p := range preds { if p != nil { children = append(children, p.ToPredicateData()) } } - return StandardPredicate{ + return Predicate[M]{ Data: PredicateData{ IsLogical: true, Operator: "OR", @@ -375,12 +389,12 @@ func Or(preds ...Predicate) Predicate { } } -func Not(pred Predicate) Predicate { +func Not[M any](pred PredicateOf[M]) PredicateOf[M] { var children []PredicateData if pred != nil { children = append(children, pred.ToPredicateData()) } - return StandardPredicate{ + return Predicate[M]{ Data: PredicateData{ IsLogical: true, Operator: "NOT", @@ -389,16 +403,16 @@ func Not(pred Predicate) Predicate { } } -type Field[T any] struct { +type Field[M any, T any] struct { Column string } -func (f Field[T]) Set(val T) FieldAssignment { +func (f Field[M, T]) Set(val T) FieldAssignment { return FieldAssignment{Col: f.Column, Val: val} } -func (f Field[T]) EQ(val T) Predicate { - return StandardPredicate{ +func (f Field[M, T]) EQ(val T) Predicate[M] { + return Predicate[M]{ Data: PredicateData{ Column: f.Column, Operator: "=", @@ -407,8 +421,8 @@ func (f Field[T]) EQ(val T) Predicate { } } -func (f Field[T]) NEQ(val T) Predicate { - return StandardPredicate{ +func (f Field[M, T]) NEQ(val T) Predicate[M] { + return Predicate[M]{ Data: PredicateData{ Column: f.Column, Operator: "!=", @@ -417,8 +431,8 @@ func (f Field[T]) NEQ(val T) Predicate { } } -func (f Field[T]) GT(val T) Predicate { - return StandardPredicate{ +func (f Field[M, T]) GT(val T) Predicate[M] { + return Predicate[M]{ Data: PredicateData{ Column: f.Column, Operator: ">", @@ -427,8 +441,8 @@ func (f Field[T]) GT(val T) Predicate { } } -func (f Field[T]) GTE(val T) Predicate { - return StandardPredicate{ +func (f Field[M, T]) GTE(val T) Predicate[M] { + return Predicate[M]{ Data: PredicateData{ Column: f.Column, Operator: ">=", @@ -437,8 +451,8 @@ func (f Field[T]) GTE(val T) Predicate { } } -func (f Field[T]) LT(val T) Predicate { - return StandardPredicate{ +func (f Field[M, T]) LT(val T) Predicate[M] { + return Predicate[M]{ Data: PredicateData{ Column: f.Column, Operator: "<", @@ -447,8 +461,8 @@ func (f Field[T]) LT(val T) Predicate { } } -func (f Field[T]) LTE(val T) Predicate { - return StandardPredicate{ +func (f Field[M, T]) LTE(val T) Predicate[M] { + return Predicate[M]{ Data: PredicateData{ Column: f.Column, Operator: "<=", @@ -457,8 +471,8 @@ func (f Field[T]) LTE(val T) Predicate { } } -func (f Field[T]) In(vals []T) Predicate { - return StandardPredicate{ +func (f Field[M, T]) In(vals []T) Predicate[M] { + return Predicate[M]{ Data: PredicateData{ Column: f.Column, Operator: "IN", @@ -467,8 +481,8 @@ func (f Field[T]) In(vals []T) Predicate { } } -func (f Field[T]) IsNull() Predicate { - return StandardPredicate{ +func (f Field[M, T]) IsNull() Predicate[M] { + return Predicate[M]{ Data: PredicateData{ Column: f.Column, Operator: "IS NULL", @@ -476,8 +490,8 @@ func (f Field[T]) IsNull() Predicate { } } -func (f Field[T]) IsNotNull() Predicate { - return StandardPredicate{ +func (f Field[M, T]) IsNotNull() Predicate[M] { + return Predicate[M]{ Data: PredicateData{ Column: f.Column, Operator: "IS NOT NULL", @@ -485,49 +499,34 @@ func (f Field[T]) IsNotNull() Predicate { } } -func (f Field[T]) Asc() OrderBy { +func (f Field[M, T]) Asc() OrderBy { return OrderBy{Field: f.Column, Direction: Asc} } -func (f Field[T]) Desc() OrderBy { +func (f Field[M, T]) Desc() OrderBy { return OrderBy{Field: f.Column, Direction: Desc} } -type UniqueField[T any] struct { +type UniqueField[M any, T any] struct { Column string } -func (f UniqueField[T]) Set(val T) FieldAssignment { +func (f UniqueField[M, T]) Set(val T) FieldAssignment { return FieldAssignment{Col: f.Column, Val: val} } -type UniqueFieldPredicate struct { - StandardPredicate -} - -func (UniqueFieldPredicate) IsUnique() {} - -func (p UniqueFieldPredicate) Validate() error { - if p.Data.Column == "" { - return fmt.Errorf("at least one unique field must be set for FindUnique") - } - return p.StandardPredicate.Validate() -} - -func (f UniqueField[T]) EQ(val T) UniquePredicate { - return UniqueFieldPredicate{ - StandardPredicate: StandardPredicate{ - Data: PredicateData{ - Column: f.Column, - Operator: "=", - Value: val, - }, +func (f UniqueField[M, T]) EQ(val T) UniquePredicate[M] { + return UniquePredicate[M]{ + Data: PredicateData{ + Column: f.Column, + Operator: "=", + Value: val, }, } } -func (f UniqueField[T]) NEQ(val T) Predicate { - return StandardPredicate{ +func (f UniqueField[M, T]) NEQ(val T) Predicate[M] { + return Predicate[M]{ Data: PredicateData{ Column: f.Column, Operator: "!=", @@ -536,8 +535,8 @@ func (f UniqueField[T]) NEQ(val T) Predicate { } } -func (f UniqueField[T]) GT(val T) Predicate { - return StandardPredicate{ +func (f UniqueField[M, T]) GT(val T) Predicate[M] { + return Predicate[M]{ Data: PredicateData{ Column: f.Column, Operator: ">", @@ -546,8 +545,8 @@ func (f UniqueField[T]) GT(val T) Predicate { } } -func (f UniqueField[T]) GTE(val T) Predicate { - return StandardPredicate{ +func (f UniqueField[M, T]) GTE(val T) Predicate[M] { + return Predicate[M]{ Data: PredicateData{ Column: f.Column, Operator: ">=", @@ -556,8 +555,8 @@ func (f UniqueField[T]) GTE(val T) Predicate { } } -func (f UniqueField[T]) LT(val T) Predicate { - return StandardPredicate{ +func (f UniqueField[M, T]) LT(val T) Predicate[M] { + return Predicate[M]{ Data: PredicateData{ Column: f.Column, Operator: "<", @@ -566,8 +565,8 @@ func (f UniqueField[T]) LT(val T) Predicate { } } -func (f UniqueField[T]) LTE(val T) Predicate { - return StandardPredicate{ +func (f UniqueField[M, T]) LTE(val T) Predicate[M] { + return Predicate[M]{ Data: PredicateData{ Column: f.Column, Operator: "<=", @@ -576,8 +575,8 @@ func (f UniqueField[T]) LTE(val T) Predicate { } } -func (f UniqueField[T]) In(vals []T) Predicate { - return StandardPredicate{ +func (f UniqueField[M, T]) In(vals []T) Predicate[M] { + return Predicate[M]{ Data: PredicateData{ Column: f.Column, Operator: "IN", @@ -586,8 +585,8 @@ func (f UniqueField[T]) In(vals []T) Predicate { } } -func (f UniqueField[T]) IsNull() Predicate { - return StandardPredicate{ +func (f UniqueField[M, T]) IsNull() Predicate[M] { + return Predicate[M]{ Data: PredicateData{ Column: f.Column, Operator: "IS NULL", @@ -595,8 +594,8 @@ func (f UniqueField[T]) IsNull() Predicate { } } -func (f UniqueField[T]) IsNotNull() Predicate { - return StandardPredicate{ +func (f UniqueField[M, T]) IsNotNull() Predicate[M] { + return Predicate[M]{ Data: PredicateData{ Column: f.Column, Operator: "IS NOT NULL", @@ -604,24 +603,24 @@ func (f UniqueField[T]) IsNotNull() Predicate { } } -func (f UniqueField[T]) Asc() OrderBy { +func (f UniqueField[M, T]) Asc() OrderBy { return OrderBy{Field: f.Column, Direction: Asc} } -func (f UniqueField[T]) Desc() OrderBy { +func (f UniqueField[M, T]) Desc() OrderBy { return OrderBy{Field: f.Column, Direction: Desc} } -type StringField struct { +type StringField[M any] struct { Column string } -func (f StringField) Set(val string) FieldAssignment { +func (f StringField[M]) Set(val string) FieldAssignment { return FieldAssignment{Col: f.Column, Val: val} } -func (f StringField) EQ(val string) Predicate { - return StandardPredicate{ +func (f StringField[M]) EQ(val string) Predicate[M] { + return Predicate[M]{ Data: PredicateData{ Column: f.Column, Operator: "=", @@ -630,8 +629,8 @@ func (f StringField) EQ(val string) Predicate { } } -func (f StringField) NEQ(val string) Predicate { - return StandardPredicate{ +func (f StringField[M]) NEQ(val string) Predicate[M] { + return Predicate[M]{ Data: PredicateData{ Column: f.Column, Operator: "!=", @@ -640,8 +639,8 @@ func (f StringField) NEQ(val string) Predicate { } } -func (f StringField) GT(val string) Predicate { - return StandardPredicate{ +func (f StringField[M]) GT(val string) Predicate[M] { + return Predicate[M]{ Data: PredicateData{ Column: f.Column, Operator: ">", @@ -650,8 +649,8 @@ func (f StringField) GT(val string) Predicate { } } -func (f StringField) GTE(val string) Predicate { - return StandardPredicate{ +func (f StringField[M]) GTE(val string) Predicate[M] { + return Predicate[M]{ Data: PredicateData{ Column: f.Column, Operator: ">=", @@ -660,8 +659,8 @@ func (f StringField) GTE(val string) Predicate { } } -func (f StringField) LT(val string) Predicate { - return StandardPredicate{ +func (f StringField[M]) LT(val string) Predicate[M] { + return Predicate[M]{ Data: PredicateData{ Column: f.Column, Operator: "<", @@ -670,8 +669,8 @@ func (f StringField) LT(val string) Predicate { } } -func (f StringField) LTE(val string) Predicate { - return StandardPredicate{ +func (f StringField[M]) LTE(val string) Predicate[M] { + return Predicate[M]{ Data: PredicateData{ Column: f.Column, Operator: "<=", @@ -680,8 +679,8 @@ func (f StringField) LTE(val string) Predicate { } } -func (f StringField) In(vals []string) Predicate { - return StandardPredicate{ +func (f StringField[M]) In(vals []string) Predicate[M] { + return Predicate[M]{ Data: PredicateData{ Column: f.Column, Operator: "IN", @@ -690,8 +689,8 @@ func (f StringField) In(vals []string) Predicate { } } -func (f StringField) Like(val string) Predicate { - return StandardPredicate{ +func (f StringField[M]) Like(val string) Predicate[M] { + return Predicate[M]{ Data: PredicateData{ Column: f.Column, Operator: "LIKE", @@ -700,8 +699,8 @@ func (f StringField) Like(val string) Predicate { } } -func (f StringField) Contains(val string) Predicate { - return StandardPredicate{ +func (f StringField[M]) Contains(val string) Predicate[M] { + return Predicate[M]{ Data: PredicateData{ Column: f.Column, Operator: "LIKE", @@ -710,8 +709,8 @@ func (f StringField) Contains(val string) Predicate { } } -func (f StringField) IsNull() Predicate { - return StandardPredicate{ +func (f StringField[M]) IsNull() Predicate[M] { + return Predicate[M]{ Data: PredicateData{ Column: f.Column, Operator: "IS NULL", @@ -719,8 +718,8 @@ func (f StringField) IsNull() Predicate { } } -func (f StringField) IsNotNull() Predicate { - return StandardPredicate{ +func (f StringField[M]) IsNotNull() Predicate[M] { + return Predicate[M]{ Data: PredicateData{ Column: f.Column, Operator: "IS NOT NULL", @@ -728,36 +727,34 @@ func (f StringField) IsNotNull() Predicate { } } -func (f StringField) Asc() OrderBy { +func (f StringField[M]) Asc() OrderBy { return OrderBy{Field: f.Column, Direction: Asc} } -func (f StringField) Desc() OrderBy { +func (f StringField[M]) Desc() OrderBy { return OrderBy{Field: f.Column, Direction: Desc} } -type StringUniqueField struct { +type StringUniqueField[M any] struct { Column string } -func (f StringUniqueField) Set(val string) FieldAssignment { +func (f StringUniqueField[M]) Set(val string) FieldAssignment { return FieldAssignment{Col: f.Column, Val: val} } -func (f StringUniqueField) EQ(val string) UniquePredicate { - return UniqueFieldPredicate{ - StandardPredicate: StandardPredicate{ - Data: PredicateData{ - Column: f.Column, - Operator: "=", - Value: val, - }, +func (f StringUniqueField[M]) EQ(val string) UniquePredicate[M] { + return UniquePredicate[M]{ + Data: PredicateData{ + Column: f.Column, + Operator: "=", + Value: val, }, } } -func (f StringUniqueField) NEQ(val string) Predicate { - return StandardPredicate{ +func (f StringUniqueField[M]) NEQ(val string) Predicate[M] { + return Predicate[M]{ Data: PredicateData{ Column: f.Column, Operator: "!=", @@ -766,8 +763,8 @@ func (f StringUniqueField) NEQ(val string) Predicate { } } -func (f StringUniqueField) GT(val string) Predicate { - return StandardPredicate{ +func (f StringUniqueField[M]) GT(val string) Predicate[M] { + return Predicate[M]{ Data: PredicateData{ Column: f.Column, Operator: ">", @@ -776,8 +773,8 @@ func (f StringUniqueField) GT(val string) Predicate { } } -func (f StringUniqueField) GTE(val string) Predicate { - return StandardPredicate{ +func (f StringUniqueField[M]) GTE(val string) Predicate[M] { + return Predicate[M]{ Data: PredicateData{ Column: f.Column, Operator: ">=", @@ -786,8 +783,8 @@ func (f StringUniqueField) GTE(val string) Predicate { } } -func (f StringUniqueField) LT(val string) Predicate { - return StandardPredicate{ +func (f StringUniqueField[M]) LT(val string) Predicate[M] { + return Predicate[M]{ Data: PredicateData{ Column: f.Column, Operator: "<", @@ -796,8 +793,8 @@ func (f StringUniqueField) LT(val string) Predicate { } } -func (f StringUniqueField) LTE(val string) Predicate { - return StandardPredicate{ +func (f StringUniqueField[M]) LTE(val string) Predicate[M] { + return Predicate[M]{ Data: PredicateData{ Column: f.Column, Operator: "<=", @@ -806,8 +803,8 @@ func (f StringUniqueField) LTE(val string) Predicate { } } -func (f StringUniqueField) In(vals []string) Predicate { - return StandardPredicate{ +func (f StringUniqueField[M]) In(vals []string) Predicate[M] { + return Predicate[M]{ Data: PredicateData{ Column: f.Column, Operator: "IN", @@ -816,8 +813,8 @@ func (f StringUniqueField) In(vals []string) Predicate { } } -func (f StringUniqueField) Like(val string) Predicate { - return StandardPredicate{ +func (f StringUniqueField[M]) Like(val string) Predicate[M] { + return Predicate[M]{ Data: PredicateData{ Column: f.Column, Operator: "LIKE", @@ -826,8 +823,8 @@ func (f StringUniqueField) Like(val string) Predicate { } } -func (f StringUniqueField) Contains(val string) Predicate { - return StandardPredicate{ +func (f StringUniqueField[M]) Contains(val string) Predicate[M] { + return Predicate[M]{ Data: PredicateData{ Column: f.Column, Operator: "LIKE", @@ -836,8 +833,8 @@ func (f StringUniqueField) Contains(val string) Predicate { } } -func (f StringUniqueField) IsNull() Predicate { - return StandardPredicate{ +func (f StringUniqueField[M]) IsNull() Predicate[M] { + return Predicate[M]{ Data: PredicateData{ Column: f.Column, Operator: "IS NULL", @@ -845,8 +842,8 @@ func (f StringUniqueField) IsNull() Predicate { } } -func (f StringUniqueField) IsNotNull() Predicate { - return StandardPredicate{ +func (f StringUniqueField[M]) IsNotNull() Predicate[M] { + return Predicate[M]{ Data: PredicateData{ Column: f.Column, Operator: "IS NOT NULL", @@ -854,15 +851,15 @@ func (f StringUniqueField) IsNotNull() Predicate { } } -func (f StringUniqueField) Asc() OrderBy { +func (f StringUniqueField[M]) Asc() OrderBy { return OrderBy{Field: f.Column, Direction: Asc} } -func (f StringUniqueField) Desc() OrderBy { +func (f StringUniqueField[M]) Desc() OrderBy { return OrderBy{Field: f.Column, Direction: Desc} } -func CompilePredicates(dialect Dialect, preds []Predicate) (string, []any) { +func CompilePredicates[M any](dialect Dialect, preds []PredicateOf[M]) (string, []any) { if len(preds) == 0 { return "", nil } diff --git a/generator/templates/model_predicate.gotpl b/generator/templates/model_predicate.gotpl index e8719fe..8227816 100644 --- a/generator/templates/model_predicate.gotpl +++ b/generator/templates/model_predicate.gotpl @@ -1,7 +1,6 @@ package {{ .PackageName }} import ( - "fmt" {{- if hasJsonField .Model }} "encoding/json" {{- end }} @@ -11,19 +10,6 @@ import ( "{{ .ParentImportPath }}" ) -type UniquePredicate struct { - {{ .ParentPackageName }}.StandardPredicate -} - -func (UniquePredicate) IsUnique() {} - -func (p UniquePredicate) Validate() error { - if p.StandardPredicate.Data.Column == "" && len(p.StandardPredicate.Data.Children) == 0 { - return fmt.Errorf("at least one unique field must be set for FindUnique") - } - return p.StandardPredicate.Validate() -} - type Select = {{ .ParentPackageName }}.{{ .Model.Name }}Select type Omit = {{ .ParentPackageName }}.{{ .Model.Name }}Omit type QueryBuilder = {{ .ParentPackageName }}.{{ .Model.Name }}QueryBuilder @@ -37,15 +23,15 @@ func Record(assignments ...{{ .ParentPackageName }}.FieldAssignment) {{ .ParentP return {{ .ParentPackageName }}.RecordInput{Assignments: assignments} } -func And(preds ...{{ .ParentPackageName }}.Predicate) {{ .ParentPackageName }}.Predicate { +func And(preds ...{{ .ParentPackageName }}.PredicateOf[{{ .ParentPackageName }}.{{ .Model.Name }}]) {{ .ParentPackageName }}.PredicateOf[{{ .ParentPackageName }}.{{ .Model.Name }}] { return {{ .ParentPackageName }}.And(preds...) } -func Or(preds ...{{ .ParentPackageName }}.Predicate) {{ .ParentPackageName }}.Predicate { +func Or(preds ...{{ .ParentPackageName }}.PredicateOf[{{ .ParentPackageName }}.{{ .Model.Name }}]) {{ .ParentPackageName }}.PredicateOf[{{ .ParentPackageName }}.{{ .Model.Name }}] { return {{ .ParentPackageName }}.Or(preds...) } -func Not(pred {{ .ParentPackageName }}.Predicate) {{ .ParentPackageName }}.Predicate { +func Not(pred {{ .ParentPackageName }}.PredicateOf[{{ .ParentPackageName }}.{{ .Model.Name }}]) {{ .ParentPackageName }}.PredicateOf[{{ .ParentPackageName }}.{{ .Model.Name }}] { return {{ .ParentPackageName }}.Not(pred) } @@ -55,15 +41,15 @@ func Not(pred {{ .ParentPackageName }}.Predicate) {{ .ParentPackageName }}.Predi {{- $col := $field.EffectiveColName -}} {{- if eq $field.Type "String" }} {{- if $isUnique }} -var {{ capitalize $field.Name }} = {{ $.ParentPackageName }}.StringUniqueField{Column: "{{ $col }}"} +var {{ capitalize $field.Name }} = {{ $.ParentPackageName }}.StringUniqueField[{{ $.ParentPackageName }}.{{ $.Model.Name }}]{Column: "{{ $col }}"} {{- else }} -var {{ capitalize $field.Name }} = {{ $.ParentPackageName }}.StringField{Column: "{{ $col }}"} +var {{ capitalize $field.Name }} = {{ $.ParentPackageName }}.StringField[{{ $.ParentPackageName }}.{{ $.Model.Name }}]{Column: "{{ $col }}"} {{- end }} {{- else }} {{- if $isUnique }} -var {{ capitalize $field.Name }} = {{ $.ParentPackageName }}.UniqueField[{{ $fieldType }}]{Column: "{{ $col }}"} +var {{ capitalize $field.Name }} = {{ $.ParentPackageName }}.UniqueField[{{ $.ParentPackageName }}.{{ $.Model.Name }}, {{ $fieldType }}]{Column: "{{ $col }}"} {{- else }} -var {{ capitalize $field.Name }} = {{ $.ParentPackageName }}.Field[{{ $fieldType }}]{Column: "{{ $col }}"} +var {{ capitalize $field.Name }} = {{ $.ParentPackageName }}.Field[{{ $.ParentPackageName }}.{{ $.Model.Name }}, {{ $fieldType }}]{Column: "{{ $col }}"} {{- end }} {{- end }} {{ end }} @@ -86,22 +72,20 @@ func {{ capitalize $constraintName }}Unique( {{- if $i }}, {{ end -}} {{- lowercase $field.Name }} {{ fieldPredType $field $.ParentPackageName -}} {{- end -}} -) UniquePredicate { - return UniquePredicate{ - StandardPredicate: {{ $.ParentPackageName }}.StandardPredicate{ - Data: {{ $.ParentPackageName }}.And( - {{- range $fName := $index.Fields }} - {{- $field := $.Model.GetField $fName }} - {{ $.ParentPackageName }}.StandardPredicate{ - Data: {{ $.ParentPackageName }}.PredicateData{ - Column: "{{ $field.EffectiveColName }}", - Operator: "=", - Value: {{ lowercase $field.Name }}, - }, +) {{ $.ParentPackageName }}.UniquePredicate[{{ $.ParentPackageName }}.{{ $.Model.Name }}] { + return {{ $.ParentPackageName }}.UniquePredicate[{{ $.ParentPackageName }}.{{ $.Model.Name }}]{ + Data: {{ $.ParentPackageName }}.And[{{ $.ParentPackageName }}.{{ $.Model.Name }}]( + {{- range $fName := $index.Fields }} + {{- $field := $.Model.GetField $fName }} + {{ $.ParentPackageName }}.Predicate[{{ $.ParentPackageName }}.{{ $.Model.Name }}]{ + Data: {{ $.ParentPackageName }}.PredicateData{ + Column: "{{ $field.EffectiveColName }}", + Operator: "=", + Value: {{ lowercase $field.Name }}, }, - {{- end }} - ).ToPredicateData(), - }, + }, + {{- end }} + ).ToPredicateData(), } } {{- end }} diff --git a/generator/templates/model_query.gotpl b/generator/templates/model_query.gotpl index f5cf546..29e5785 100644 --- a/generator/templates/model_query.gotpl +++ b/generator/templates/model_query.gotpl @@ -1,4 +1,4 @@ -func (d *{{ .Model.Name }}Delegate) FindUnique(where UniquePredicate, additional ...Predicate) *FindUniqueBuilder[{{ .Model.Name }}, {{ .Model.Name }}Select, {{ .Model.Name }}Omit] { +func (d *{{ .Model.Name }}Delegate) FindUnique(where UniquePredicate[{{ .Model.Name }}], additional ...PredicateOf[{{ .Model.Name }}]) *FindUniqueBuilder[{{ .Model.Name }}, {{ .Model.Name }}Select, {{ .Model.Name }}Omit] { return &FindUniqueBuilder[{{ .Model.Name }}, {{ .Model.Name }}Select, {{ .Model.Name }}Omit]{ client: d.client, where: where, @@ -7,7 +7,7 @@ func (d *{{ .Model.Name }}Delegate) FindUnique(where UniquePredicate, additional } } -func (d *{{ .Model.Name }}Delegate) FindFirst(preds ...Predicate) *FindFirstBuilder[{{ .Model.Name }}, {{ .Model.Name }}Select, {{ .Model.Name }}Omit] { +func (d *{{ .Model.Name }}Delegate) FindFirst(preds ...PredicateOf[{{ .Model.Name }}]) *FindFirstBuilder[{{ .Model.Name }}, {{ .Model.Name }}Select, {{ .Model.Name }}Omit] { return &FindFirstBuilder[{{ .Model.Name }}, {{ .Model.Name }}Select, {{ .Model.Name }}Omit]{ client: d.client, where: preds, @@ -15,7 +15,7 @@ func (d *{{ .Model.Name }}Delegate) FindFirst(preds ...Predicate) *FindFirstBuil } } -func (d *{{ .Model.Name }}Delegate) FindMany(preds ...Predicate) *FindManyBuilder[{{ .Model.Name }}, {{ .Model.Name }}Select, {{ .Model.Name }}Omit] { +func (d *{{ .Model.Name }}Delegate) FindMany(preds ...PredicateOf[{{ .Model.Name }}]) *FindManyBuilder[{{ .Model.Name }}, {{ .Model.Name }}Select, {{ .Model.Name }}Omit] { return &FindManyBuilder[{{ .Model.Name }}, {{ .Model.Name }}Select, {{ .Model.Name }}Omit]{ client: d.client, where: preds, @@ -23,10 +23,7 @@ func (d *{{ .Model.Name }}Delegate) FindMany(preds ...Predicate) *FindManyBuilde } } -func (q *Queries) execute{{ .Model.Name }}FindUnique(ctx context.Context, where UniquePredicate, additional []Predicate, selects *{{ .Model.Name }}Select, omits *{{ .Model.Name }}Omit) (*{{ .Model.Name }}, error) { - if where == nil { - return nil, fmt.Errorf("at least one unique field must be set for FindUnique") - } +func (q *Queries) execute{{ .Model.Name }}FindUnique(ctx context.Context, where UniquePredicate[{{ .Model.Name }}], additional []PredicateOf[{{ .Model.Name }}], selects *{{ .Model.Name }}Select, omits *{{ .Model.Name }}Omit) (*{{ .Model.Name }}, error) { if err := where.Validate(); err != nil { return nil, err } @@ -37,7 +34,7 @@ func (q *Queries) execute{{ .Model.Name }}FindUnique(ctx context.Context, where } } } - allPreds := append([]Predicate{where}, additional...) + allPreds := append([]PredicateOf[{{ .Model.Name }}]{where}, additional...) whereClause, vals := CompilePredicates(q.dialect, allPreds) if whereClause != "" { whereClause = " WHERE " + whereClause @@ -55,7 +52,7 @@ func (q *Queries) execute{{ .Model.Name }}FindUnique(ctx context.Context, where func (q *Queries) execute{{ .Model.Name }}FindFirst( ctx context.Context, - params QueryParams, + params QueryParams[{{ .Model.Name }}], selects *{{ .Model.Name }}Select, omits *{{ .Model.Name }}Omit, ) (*{{ .Model.Name }}, error) { @@ -83,7 +80,7 @@ func (q *Queries) execute{{ .Model.Name }}FindFirst( func (q *Queries) execute{{ .Model.Name }}FindMany( ctx context.Context, - params QueryParams, + params QueryParams[{{ .Model.Name }}], selects *{{ .Model.Name }}Select, omits *{{ .Model.Name }}Omit, ) ([]*{{ .Model.Name }}, error) { diff --git a/generator/templates/model_structs.gotpl b/generator/templates/model_structs.gotpl index 9c10f48..3d240a4 100644 --- a/generator/templates/model_structs.gotpl +++ b/generator/templates/model_structs.gotpl @@ -33,24 +33,24 @@ type {{ .Model.Name }}Omit struct { } type {{ .Model.Name }}SelectQuery interface { - GetRelationParams() (*{{ .Model.Name }}Select, *{{ .Model.Name }}Omit, QueryParams) + GetRelationParams() (*{{ .Model.Name }}Select, *{{ .Model.Name }}Omit, QueryParams[{{ .Model.Name }}]) } -func (s *{{ .Model.Name }}Select) GetRelationParams() (*{{ .Model.Name }}Select, *{{ .Model.Name }}Omit, QueryParams) { - return s, nil, QueryParams{} +func (s *{{ .Model.Name }}Select) GetRelationParams() (*{{ .Model.Name }}Select, *{{ .Model.Name }}Omit, QueryParams[{{ .Model.Name }}]) { + return s, nil, QueryParams[{{ .Model.Name }}]{} } // {{ .Model.Name }}QueryBuilder builds a query for the relation {{ .Model.Name }} type {{ .Model.Name }}QueryBuilder struct { selects *{{ .Model.Name }}Select omits *{{ .Model.Name }}Omit - where []Predicate + where []PredicateOf[{{ .Model.Name }}] take *int skip *int orderBy []OrderBy } -func (b *{{ .Model.Name }}QueryBuilder) Where(preds ...Predicate) *{{ .Model.Name }}QueryBuilder { +func (b *{{ .Model.Name }}QueryBuilder) Where(preds ...PredicateOf[{{ .Model.Name }}]) *{{ .Model.Name }}QueryBuilder { b.where = append(b.where, preds...) return b } @@ -80,11 +80,11 @@ func (b *{{ .Model.Name }}QueryBuilder) Omit(o {{ .Model.Name }}Omit) *{{ .Model return b } -func (b *{{ .Model.Name }}QueryBuilder) GetRelationParams() (*{{ .Model.Name }}Select, *{{ .Model.Name }}Omit, QueryParams) { +func (b *{{ .Model.Name }}QueryBuilder) GetRelationParams() (*{{ .Model.Name }}Select, *{{ .Model.Name }}Omit, QueryParams[{{ .Model.Name }}]) { if b == nil { - return nil, nil, QueryParams{} + return nil, nil, QueryParams[{{ .Model.Name }}]{} } - return b.selects, b.omits, QueryParams{ + return b.selects, b.omits, QueryParams[{{ .Model.Name }}]{ Where: b.where, Take: b.take, Skip: b.skip, diff --git a/generator/templates/runtime.gotpl b/generator/templates/runtime.gotpl index fc0907a..b123840 100644 --- a/generator/templates/runtime.gotpl +++ b/generator/templates/runtime.gotpl @@ -192,8 +192,8 @@ type OrderBy struct { Direction OrderDirection } -type QueryParams struct { - Where []Predicate +type QueryParams[M any] struct { + Where []PredicateOf[M] Take *int Skip *int OrderBy []OrderBy diff --git a/integration/main.go b/integration/main.go index d1144b7..6d6e303 100644 --- a/integration/main.go +++ b/integration/main.go @@ -64,22 +64,33 @@ func main() { ctx := context.Background() runMigrations(db, ctx) - - var builders []*user.CreateBuilder - for i := range 20 { - builder := db.User.Create(). - SetEmail(fmt.Sprintf("user%d@gmail.com", i)). - SetPassword(fmt.Sprintf("pass%d", i)). - SetPhoneNum(fmt.Sprintf("+1111%d", i)) - - builders = append(builders, builder) + posts, err := db.Post.FindMany(post.Id.Contains("xx")).Select(post.Select{}).Exec(ctx) + if err != nil { + log.Fatal(err) } - count, err := db.User.CreateMany(builders...).Exec(ctx) + post, err := db.Post.FindUnique(post.Id.EQ("xxx")).Select(post.Select{}).Exec(ctx) if err != nil { - log.Fatalf("failed to seed users: %v", err) + log.Fatal(err) } - printJSON(count) + printJSON(posts) + printJSON(post) + + // var builders []*user.CreateBuilder + // for i := range 20 { + // builder := db.User.Create(). + // SetEmail(fmt.Sprintf("user%d@gmail.com", i)). + // SetPassword(fmt.Sprintf("pass%d", i)). + // SetPhoneNum(fmt.Sprintf("+1111%d", i)) + + // builders = append(builders, builder) + // } + // count, err := db.User.CreateMany(builders...).Exec(ctx) + // if err != nil { + // log.Fatalf("failed to seed users: %v", err) + // } + + // printJSON(count) } @@ -239,7 +250,7 @@ func seed(db *valk.DB, ctx context.Context) *SeedData { Post: &post.Select{ Id: true, Title: true, - Author: user.Query().Where(post.Id.EQ(p.Id)).OrderBy(user.Email.Asc()), + Author: user.Query().Where(user.Id.EQ(p.Id)).OrderBy(user.Id.Asc()), }, }). Exec(ctx) diff --git a/integration/read_test.go b/integration/read_test.go index a2b488b..d66821f 100644 --- a/integration/read_test.go +++ b/integration/read_test.go @@ -24,7 +24,7 @@ func TestFindUniqueWithNoFieldsSet(t *testing.T) { t.Fatalf("seed failed: %v", err) } - res, err := db.User.FindUnique(nil).Exec(ctx) + res, err := db.User.FindUnique(valk.UniquePredicate[valk.User]{}).Exec(ctx) if err == nil && res != nil { t.Errorf("FindUnique with a zero-value where matched a row unexpectedly (%+v); it should require at least one unique field or return an error", res) } diff --git a/integration/valk/allFieldsSoFar.go b/integration/valk/allFieldsSoFar.go index aaf8ce4..4c4a88e 100644 --- a/integration/valk/allFieldsSoFar.go +++ b/integration/valk/allFieldsSoFar.go @@ -241,24 +241,24 @@ type AllFieldsSoFarOmit struct { } type AllFieldsSoFarSelectQuery interface { - GetRelationParams() (*AllFieldsSoFarSelect, *AllFieldsSoFarOmit, QueryParams) + GetRelationParams() (*AllFieldsSoFarSelect, *AllFieldsSoFarOmit, QueryParams[AllFieldsSoFar]) } -func (s *AllFieldsSoFarSelect) GetRelationParams() (*AllFieldsSoFarSelect, *AllFieldsSoFarOmit, QueryParams) { - return s, nil, QueryParams{} +func (s *AllFieldsSoFarSelect) GetRelationParams() (*AllFieldsSoFarSelect, *AllFieldsSoFarOmit, QueryParams[AllFieldsSoFar]) { + return s, nil, QueryParams[AllFieldsSoFar]{} } // AllFieldsSoFarQueryBuilder builds a query for the relation AllFieldsSoFar type AllFieldsSoFarQueryBuilder struct { selects *AllFieldsSoFarSelect omits *AllFieldsSoFarOmit - where []Predicate + where []PredicateOf[AllFieldsSoFar] take *int skip *int orderBy []OrderBy } -func (b *AllFieldsSoFarQueryBuilder) Where(preds ...Predicate) *AllFieldsSoFarQueryBuilder { +func (b *AllFieldsSoFarQueryBuilder) Where(preds ...PredicateOf[AllFieldsSoFar]) *AllFieldsSoFarQueryBuilder { b.where = append(b.where, preds...) return b } @@ -288,11 +288,11 @@ func (b *AllFieldsSoFarQueryBuilder) Omit(o AllFieldsSoFarOmit) *AllFieldsSoFarQ return b } -func (b *AllFieldsSoFarQueryBuilder) GetRelationParams() (*AllFieldsSoFarSelect, *AllFieldsSoFarOmit, QueryParams) { +func (b *AllFieldsSoFarQueryBuilder) GetRelationParams() (*AllFieldsSoFarSelect, *AllFieldsSoFarOmit, QueryParams[AllFieldsSoFar]) { if b == nil { - return nil, nil, QueryParams{} + return nil, nil, QueryParams[AllFieldsSoFar]{} } - return b.selects, b.omits, QueryParams{ + return b.selects, b.omits, QueryParams[AllFieldsSoFar]{ Where: b.where, Take: b.take, Skip: b.skip, @@ -1747,7 +1747,7 @@ func (q *Queries) executeAllFieldsSoFarCreateManyAndReturn(ctx context.Context, } return results, nil } -func (d *AllFieldsSoFarDelegate) FindUnique(where UniquePredicate, additional ...Predicate) *FindUniqueBuilder[AllFieldsSoFar, AllFieldsSoFarSelect, AllFieldsSoFarOmit] { +func (d *AllFieldsSoFarDelegate) FindUnique(where UniquePredicate[AllFieldsSoFar], additional ...PredicateOf[AllFieldsSoFar]) *FindUniqueBuilder[AllFieldsSoFar, AllFieldsSoFarSelect, AllFieldsSoFarOmit] { return &FindUniqueBuilder[AllFieldsSoFar, AllFieldsSoFarSelect, AllFieldsSoFarOmit]{ client: d.client, where: where, @@ -1756,7 +1756,7 @@ func (d *AllFieldsSoFarDelegate) FindUnique(where UniquePredicate, additional .. } } -func (d *AllFieldsSoFarDelegate) FindFirst(preds ...Predicate) *FindFirstBuilder[AllFieldsSoFar, AllFieldsSoFarSelect, AllFieldsSoFarOmit] { +func (d *AllFieldsSoFarDelegate) FindFirst(preds ...PredicateOf[AllFieldsSoFar]) *FindFirstBuilder[AllFieldsSoFar, AllFieldsSoFarSelect, AllFieldsSoFarOmit] { return &FindFirstBuilder[AllFieldsSoFar, AllFieldsSoFarSelect, AllFieldsSoFarOmit]{ client: d.client, where: preds, @@ -1764,7 +1764,7 @@ func (d *AllFieldsSoFarDelegate) FindFirst(preds ...Predicate) *FindFirstBuilder } } -func (d *AllFieldsSoFarDelegate) FindMany(preds ...Predicate) *FindManyBuilder[AllFieldsSoFar, AllFieldsSoFarSelect, AllFieldsSoFarOmit] { +func (d *AllFieldsSoFarDelegate) FindMany(preds ...PredicateOf[AllFieldsSoFar]) *FindManyBuilder[AllFieldsSoFar, AllFieldsSoFarSelect, AllFieldsSoFarOmit] { return &FindManyBuilder[AllFieldsSoFar, AllFieldsSoFarSelect, AllFieldsSoFarOmit]{ client: d.client, where: preds, @@ -1772,10 +1772,7 @@ func (d *AllFieldsSoFarDelegate) FindMany(preds ...Predicate) *FindManyBuilder[A } } -func (q *Queries) executeAllFieldsSoFarFindUnique(ctx context.Context, where UniquePredicate, additional []Predicate, selects *AllFieldsSoFarSelect, omits *AllFieldsSoFarOmit) (*AllFieldsSoFar, error) { - if where == nil { - return nil, fmt.Errorf("at least one unique field must be set for FindUnique") - } +func (q *Queries) executeAllFieldsSoFarFindUnique(ctx context.Context, where UniquePredicate[AllFieldsSoFar], additional []PredicateOf[AllFieldsSoFar], selects *AllFieldsSoFarSelect, omits *AllFieldsSoFarOmit) (*AllFieldsSoFar, error) { if err := where.Validate(); err != nil { return nil, err } @@ -1786,7 +1783,7 @@ func (q *Queries) executeAllFieldsSoFarFindUnique(ctx context.Context, where Uni } } } - allPreds := append([]Predicate{where}, additional...) + allPreds := append([]PredicateOf[AllFieldsSoFar]{where}, additional...) whereClause, vals := CompilePredicates(q.dialect, allPreds) if whereClause != "" { whereClause = " WHERE " + whereClause @@ -1804,7 +1801,7 @@ func (q *Queries) executeAllFieldsSoFarFindUnique(ctx context.Context, where Uni func (q *Queries) executeAllFieldsSoFarFindFirst( ctx context.Context, - params QueryParams, + params QueryParams[AllFieldsSoFar], selects *AllFieldsSoFarSelect, omits *AllFieldsSoFarOmit, ) (*AllFieldsSoFar, error) { @@ -1832,7 +1829,7 @@ func (q *Queries) executeAllFieldsSoFarFindFirst( func (q *Queries) executeAllFieldsSoFarFindMany( ctx context.Context, - params QueryParams, + params QueryParams[AllFieldsSoFar], selects *AllFieldsSoFarSelect, omits *AllFieldsSoFarOmit, ) ([]*AllFieldsSoFar, error) { diff --git a/integration/valk/allFieldsSoFar/allFieldsSoFar.go b/integration/valk/allFieldsSoFar/allFieldsSoFar.go index 01bae05..5556bb1 100644 --- a/integration/valk/allFieldsSoFar/allFieldsSoFar.go +++ b/integration/valk/allFieldsSoFar/allFieldsSoFar.go @@ -2,24 +2,10 @@ package allFieldsSoFar import ( "encoding/json" - "fmt" "integration/valk" "time" ) -type UniquePredicate struct { - valk.StandardPredicate -} - -func (UniquePredicate) IsUnique() {} - -func (p UniquePredicate) Validate() error { - if p.StandardPredicate.Data.Column == "" && len(p.StandardPredicate.Data.Children) == 0 { - return fmt.Errorf("at least one unique field must be set for FindUnique") - } - return p.StandardPredicate.Validate() -} - type Select = valk.AllFieldsSoFarSelect type Omit = valk.AllFieldsSoFarOmit type QueryBuilder = valk.AllFieldsSoFarQueryBuilder @@ -33,122 +19,122 @@ func Record(assignments ...valk.FieldAssignment) valk.RecordInput { return valk.RecordInput{Assignments: assignments} } -func And(preds ...valk.Predicate) valk.Predicate { +func And(preds ...valk.PredicateOf[valk.AllFieldsSoFar]) valk.PredicateOf[valk.AllFieldsSoFar] { return valk.And(preds...) } -func Or(preds ...valk.Predicate) valk.Predicate { +func Or(preds ...valk.PredicateOf[valk.AllFieldsSoFar]) valk.PredicateOf[valk.AllFieldsSoFar] { return valk.Or(preds...) } -func Not(pred valk.Predicate) valk.Predicate { +func Not(pred valk.PredicateOf[valk.AllFieldsSoFar]) valk.PredicateOf[valk.AllFieldsSoFar] { return valk.Not(pred) } -var Id = valk.UniqueField[int32]{Column: "id"} +var Id = valk.UniqueField[valk.AllFieldsSoFar, int32]{Column: "id"} -var StringReq = valk.StringField{Column: "stringReq"} +var StringReq = valk.StringField[valk.AllFieldsSoFar]{Column: "stringReq"} -var StringOpt = valk.StringField{Column: "stringOpt"} +var StringOpt = valk.StringField[valk.AllFieldsSoFar]{Column: "stringOpt"} -var StringDefault = valk.StringField{Column: "stringDefault"} +var StringDefault = valk.StringField[valk.AllFieldsSoFar]{Column: "stringDefault"} -var StringVarchar = valk.StringField{Column: "stringVarchar"} +var StringVarchar = valk.StringField[valk.AllFieldsSoFar]{Column: "stringVarchar"} -var StringChar = valk.StringField{Column: "stringChar"} +var StringChar = valk.StringField[valk.AllFieldsSoFar]{Column: "stringChar"} -var BitVal = valk.StringField{Column: "bitVal"} +var BitVal = valk.StringField[valk.AllFieldsSoFar]{Column: "bitVal"} -var VarBitVal = valk.StringField{Column: "varBitVal"} +var VarBitVal = valk.StringField[valk.AllFieldsSoFar]{Column: "varBitVal"} -var InetVal = valk.StringField{Column: "inetVal"} +var InetVal = valk.StringField[valk.AllFieldsSoFar]{Column: "inetVal"} -var XmlVal = valk.StringField{Column: "xmlVal"} +var XmlVal = valk.StringField[valk.AllFieldsSoFar]{Column: "xmlVal"} -var CuidDefault = valk.StringField{Column: "cuidDefault"} +var CuidDefault = valk.StringField[valk.AllFieldsSoFar]{Column: "cuidDefault"} -var Cuid1Default = valk.StringField{Column: "cuid1Default"} +var Cuid1Default = valk.StringField[valk.AllFieldsSoFar]{Column: "cuid1Default"} -var Cuid2Default = valk.StringField{Column: "cuid2Default"} +var Cuid2Default = valk.StringField[valk.AllFieldsSoFar]{Column: "cuid2Default"} -var UuidDefault = valk.StringField{Column: "uuidDefault"} +var UuidDefault = valk.StringField[valk.AllFieldsSoFar]{Column: "uuidDefault"} -var Uuid4Default = valk.StringField{Column: "uuid4Default"} +var Uuid4Default = valk.StringField[valk.AllFieldsSoFar]{Column: "uuid4Default"} -var Uuid7Default = valk.StringField{Column: "uuid7Default"} +var Uuid7Default = valk.StringField[valk.AllFieldsSoFar]{Column: "uuid7Default"} -var UlidDefault = valk.StringField{Column: "ulidDefault"} +var UlidDefault = valk.StringField[valk.AllFieldsSoFar]{Column: "ulidDefault"} -var NanoidDefault = valk.StringField{Column: "nanoidDefault"} +var NanoidDefault = valk.StringField[valk.AllFieldsSoFar]{Column: "nanoidDefault"} -var UuidDb = valk.StringField{Column: "uuidDb"} +var UuidDb = valk.StringField[valk.AllFieldsSoFar]{Column: "uuidDb"} -var IntReq = valk.Field[int32]{Column: "intReq"} +var IntReq = valk.Field[valk.AllFieldsSoFar, int32]{Column: "intReq"} -var IntOpt = valk.Field[int32]{Column: "intOpt"} +var IntOpt = valk.Field[valk.AllFieldsSoFar, int32]{Column: "intOpt"} -var IntDefault = valk.Field[int32]{Column: "intDefault"} +var IntDefault = valk.Field[valk.AllFieldsSoFar, int32]{Column: "intDefault"} -var IntegerVal = valk.Field[int32]{Column: "integerVal"} +var IntegerVal = valk.Field[valk.AllFieldsSoFar, int32]{Column: "integerVal"} -var SmallInt = valk.Field[int32]{Column: "smallInt"} +var SmallInt = valk.Field[valk.AllFieldsSoFar, int32]{Column: "smallInt"} -var TinyInt = valk.Field[int32]{Column: "tinyInt"} +var TinyInt = valk.Field[valk.AllFieldsSoFar, int32]{Column: "tinyInt"} -var OidVal = valk.Field[int32]{Column: "oidVal"} +var OidVal = valk.Field[valk.AllFieldsSoFar, int32]{Column: "oidVal"} -var BigIntReq = valk.Field[int64]{Column: "bigIntReq"} +var BigIntReq = valk.Field[valk.AllFieldsSoFar, int64]{Column: "bigIntReq"} -var BigIntOpt = valk.Field[int64]{Column: "bigIntOpt"} +var BigIntOpt = valk.Field[valk.AllFieldsSoFar, int64]{Column: "bigIntOpt"} -var FloatReq = valk.Field[float64]{Column: "floatReq"} +var FloatReq = valk.Field[valk.AllFieldsSoFar, float64]{Column: "floatReq"} -var FloatOpt = valk.Field[float64]{Column: "floatOpt"} +var FloatOpt = valk.Field[valk.AllFieldsSoFar, float64]{Column: "floatOpt"} -var RealVal = valk.Field[float64]{Column: "realVal"} +var RealVal = valk.Field[valk.AllFieldsSoFar, float64]{Column: "realVal"} -var DecimalReq = valk.Field[string]{Column: "decimalReq"} +var DecimalReq = valk.Field[valk.AllFieldsSoFar, string]{Column: "decimalReq"} -var DecimalOpt = valk.Field[string]{Column: "decimalOpt"} +var DecimalOpt = valk.Field[valk.AllFieldsSoFar, string]{Column: "decimalOpt"} -var DecimalPrecise = valk.Field[string]{Column: "decimalPrecise"} +var DecimalPrecise = valk.Field[valk.AllFieldsSoFar, string]{Column: "decimalPrecise"} -var MoneyVal = valk.Field[string]{Column: "moneyVal"} +var MoneyVal = valk.Field[valk.AllFieldsSoFar, string]{Column: "moneyVal"} -var BoolReq = valk.Field[bool]{Column: "boolReq"} +var BoolReq = valk.Field[valk.AllFieldsSoFar, bool]{Column: "boolReq"} -var BoolOpt = valk.Field[bool]{Column: "boolOpt"} +var BoolOpt = valk.Field[valk.AllFieldsSoFar, bool]{Column: "boolOpt"} -var BoolDefault = valk.Field[bool]{Column: "boolDefault"} +var BoolDefault = valk.Field[valk.AllFieldsSoFar, bool]{Column: "boolDefault"} -var DateTimeReq = valk.Field[time.Time]{Column: "dateTimeReq"} +var DateTimeReq = valk.Field[valk.AllFieldsSoFar, time.Time]{Column: "dateTimeReq"} -var DateTimeOpt = valk.Field[time.Time]{Column: "dateTimeOpt"} +var DateTimeOpt = valk.Field[valk.AllFieldsSoFar, time.Time]{Column: "dateTimeOpt"} -var DateTimeDefault = valk.Field[time.Time]{Column: "dateTimeDefault"} +var DateTimeDefault = valk.Field[valk.AllFieldsSoFar, time.Time]{Column: "dateTimeDefault"} -var UpdatedAt = valk.Field[time.Time]{Column: "updatedAt"} +var UpdatedAt = valk.Field[valk.AllFieldsSoFar, time.Time]{Column: "updatedAt"} -var DateTimeTz = valk.Field[time.Time]{Column: "dateTimeTz"} +var DateTimeTz = valk.Field[valk.AllFieldsSoFar, time.Time]{Column: "dateTimeTz"} -var TimestampVal = valk.Field[time.Time]{Column: "timestampVal"} +var TimestampVal = valk.Field[valk.AllFieldsSoFar, time.Time]{Column: "timestampVal"} -var TimeVal = valk.Field[time.Time]{Column: "timeVal"} +var TimeVal = valk.Field[valk.AllFieldsSoFar, time.Time]{Column: "timeVal"} -var TimetzVal = valk.Field[time.Time]{Column: "timetzVal"} +var TimetzVal = valk.Field[valk.AllFieldsSoFar, time.Time]{Column: "timetzVal"} -var JsonReq = valk.Field[json.RawMessage]{Column: "jsonReq"} +var JsonReq = valk.Field[valk.AllFieldsSoFar, json.RawMessage]{Column: "jsonReq"} -var JsonOpt = valk.Field[json.RawMessage]{Column: "jsonOpt"} +var JsonOpt = valk.Field[valk.AllFieldsSoFar, json.RawMessage]{Column: "jsonOpt"} -var JsonVal = valk.Field[json.RawMessage]{Column: "jsonVal"} +var JsonVal = valk.Field[valk.AllFieldsSoFar, json.RawMessage]{Column: "jsonVal"} -var BytesReq = valk.Field[[]byte]{Column: "bytesReq"} +var BytesReq = valk.Field[valk.AllFieldsSoFar, []byte]{Column: "bytesReq"} -var BytesOpt = valk.Field[[]byte]{Column: "bytesOpt"} +var BytesOpt = valk.Field[valk.AllFieldsSoFar, []byte]{Column: "bytesOpt"} -var HstoreField = valk.Field[map[string]*string]{Column: "hstoreField"} +var HstoreField = valk.Field[valk.AllFieldsSoFar, map[string]*string]{Column: "hstoreField"} -var LtreeField = valk.Field[string]{Column: "ltreeField"} +var LtreeField = valk.Field[valk.AllFieldsSoFar, string]{Column: "ltreeField"} -var CitextField = valk.Field[string]{Column: "citextField"} +var CitextField = valk.Field[valk.AllFieldsSoFar, string]{Column: "citextField"} diff --git a/integration/valk/category.go b/integration/valk/category.go index aea1711..27b45af 100644 --- a/integration/valk/category.go +++ b/integration/valk/category.go @@ -33,24 +33,24 @@ type CategoryOmit struct { } type CategorySelectQuery interface { - GetRelationParams() (*CategorySelect, *CategoryOmit, QueryParams) + GetRelationParams() (*CategorySelect, *CategoryOmit, QueryParams[Category]) } -func (s *CategorySelect) GetRelationParams() (*CategorySelect, *CategoryOmit, QueryParams) { - return s, nil, QueryParams{} +func (s *CategorySelect) GetRelationParams() (*CategorySelect, *CategoryOmit, QueryParams[Category]) { + return s, nil, QueryParams[Category]{} } // CategoryQueryBuilder builds a query for the relation Category type CategoryQueryBuilder struct { selects *CategorySelect omits *CategoryOmit - where []Predicate + where []PredicateOf[Category] take *int skip *int orderBy []OrderBy } -func (b *CategoryQueryBuilder) Where(preds ...Predicate) *CategoryQueryBuilder { +func (b *CategoryQueryBuilder) Where(preds ...PredicateOf[Category]) *CategoryQueryBuilder { b.where = append(b.where, preds...) return b } @@ -80,11 +80,11 @@ func (b *CategoryQueryBuilder) Omit(o CategoryOmit) *CategoryQueryBuilder { return b } -func (b *CategoryQueryBuilder) GetRelationParams() (*CategorySelect, *CategoryOmit, QueryParams) { +func (b *CategoryQueryBuilder) GetRelationParams() (*CategorySelect, *CategoryOmit, QueryParams[Category]) { if b == nil { - return nil, nil, QueryParams{} + return nil, nil, QueryParams[Category]{} } - return b.selects, b.omits, QueryParams{ + return b.selects, b.omits, QueryParams[Category]{ Where: b.where, Take: b.take, Skip: b.skip, @@ -388,7 +388,7 @@ func (q *Queries) executeCategoryCreateManyAndReturn(ctx context.Context, record } return results, nil } -func (d *CategoryDelegate) FindUnique(where UniquePredicate, additional ...Predicate) *FindUniqueBuilder[Category, CategorySelect, CategoryOmit] { +func (d *CategoryDelegate) FindUnique(where UniquePredicate[Category], additional ...PredicateOf[Category]) *FindUniqueBuilder[Category, CategorySelect, CategoryOmit] { return &FindUniqueBuilder[Category, CategorySelect, CategoryOmit]{ client: d.client, where: where, @@ -397,7 +397,7 @@ func (d *CategoryDelegate) FindUnique(where UniquePredicate, additional ...Predi } } -func (d *CategoryDelegate) FindFirst(preds ...Predicate) *FindFirstBuilder[Category, CategorySelect, CategoryOmit] { +func (d *CategoryDelegate) FindFirst(preds ...PredicateOf[Category]) *FindFirstBuilder[Category, CategorySelect, CategoryOmit] { return &FindFirstBuilder[Category, CategorySelect, CategoryOmit]{ client: d.client, where: preds, @@ -405,7 +405,7 @@ func (d *CategoryDelegate) FindFirst(preds ...Predicate) *FindFirstBuilder[Categ } } -func (d *CategoryDelegate) FindMany(preds ...Predicate) *FindManyBuilder[Category, CategorySelect, CategoryOmit] { +func (d *CategoryDelegate) FindMany(preds ...PredicateOf[Category]) *FindManyBuilder[Category, CategorySelect, CategoryOmit] { return &FindManyBuilder[Category, CategorySelect, CategoryOmit]{ client: d.client, where: preds, @@ -413,10 +413,7 @@ func (d *CategoryDelegate) FindMany(preds ...Predicate) *FindManyBuilder[Categor } } -func (q *Queries) executeCategoryFindUnique(ctx context.Context, where UniquePredicate, additional []Predicate, selects *CategorySelect, omits *CategoryOmit) (*Category, error) { - if where == nil { - return nil, fmt.Errorf("at least one unique field must be set for FindUnique") - } +func (q *Queries) executeCategoryFindUnique(ctx context.Context, where UniquePredicate[Category], additional []PredicateOf[Category], selects *CategorySelect, omits *CategoryOmit) (*Category, error) { if err := where.Validate(); err != nil { return nil, err } @@ -427,7 +424,7 @@ func (q *Queries) executeCategoryFindUnique(ctx context.Context, where UniquePre } } } - allPreds := append([]Predicate{where}, additional...) + allPreds := append([]PredicateOf[Category]{where}, additional...) whereClause, vals := CompilePredicates(q.dialect, allPreds) if whereClause != "" { whereClause = " WHERE " + whereClause @@ -445,7 +442,7 @@ func (q *Queries) executeCategoryFindUnique(ctx context.Context, where UniquePre func (q *Queries) executeCategoryFindFirst( ctx context.Context, - params QueryParams, + params QueryParams[Category], selects *CategorySelect, omits *CategoryOmit, ) (*Category, error) { @@ -473,7 +470,7 @@ func (q *Queries) executeCategoryFindFirst( func (q *Queries) executeCategoryFindMany( ctx context.Context, - params QueryParams, + params QueryParams[Category], selects *CategorySelect, omits *CategoryOmit, ) ([]*Category, error) { diff --git a/integration/valk/category/category.go b/integration/valk/category/category.go index 6abd473..d3711e2 100644 --- a/integration/valk/category/category.go +++ b/integration/valk/category/category.go @@ -1,23 +1,9 @@ package category import ( - "fmt" "integration/valk" ) -type UniquePredicate struct { - valk.StandardPredicate -} - -func (UniquePredicate) IsUnique() {} - -func (p UniquePredicate) Validate() error { - if p.StandardPredicate.Data.Column == "" && len(p.StandardPredicate.Data.Children) == 0 { - return fmt.Errorf("at least one unique field must be set for FindUnique") - } - return p.StandardPredicate.Validate() -} - type Select = valk.CategorySelect type Omit = valk.CategoryOmit type QueryBuilder = valk.CategoryQueryBuilder @@ -31,18 +17,18 @@ func Record(assignments ...valk.FieldAssignment) valk.RecordInput { return valk.RecordInput{Assignments: assignments} } -func And(preds ...valk.Predicate) valk.Predicate { +func And(preds ...valk.PredicateOf[valk.Category]) valk.PredicateOf[valk.Category] { return valk.And(preds...) } -func Or(preds ...valk.Predicate) valk.Predicate { +func Or(preds ...valk.PredicateOf[valk.Category]) valk.PredicateOf[valk.Category] { return valk.Or(preds...) } -func Not(pred valk.Predicate) valk.Predicate { +func Not(pred valk.PredicateOf[valk.Category]) valk.PredicateOf[valk.Category] { return valk.Not(pred) } -var Id = valk.UniqueField[int32]{Column: "id"} +var Id = valk.UniqueField[valk.Category, int32]{Column: "id"} -var Name = valk.StringUniqueField{Column: "name"} +var Name = valk.StringUniqueField[valk.Category]{Column: "name"} diff --git a/integration/valk/categoryToPost.go b/integration/valk/categoryToPost.go index c8b8561..ef0941e 100644 --- a/integration/valk/categoryToPost.go +++ b/integration/valk/categoryToPost.go @@ -35,24 +35,24 @@ type CategoryToPostOmit struct { } type CategoryToPostSelectQuery interface { - GetRelationParams() (*CategoryToPostSelect, *CategoryToPostOmit, QueryParams) + GetRelationParams() (*CategoryToPostSelect, *CategoryToPostOmit, QueryParams[CategoryToPost]) } -func (s *CategoryToPostSelect) GetRelationParams() (*CategoryToPostSelect, *CategoryToPostOmit, QueryParams) { - return s, nil, QueryParams{} +func (s *CategoryToPostSelect) GetRelationParams() (*CategoryToPostSelect, *CategoryToPostOmit, QueryParams[CategoryToPost]) { + return s, nil, QueryParams[CategoryToPost]{} } // CategoryToPostQueryBuilder builds a query for the relation CategoryToPost type CategoryToPostQueryBuilder struct { selects *CategoryToPostSelect omits *CategoryToPostOmit - where []Predicate + where []PredicateOf[CategoryToPost] take *int skip *int orderBy []OrderBy } -func (b *CategoryToPostQueryBuilder) Where(preds ...Predicate) *CategoryToPostQueryBuilder { +func (b *CategoryToPostQueryBuilder) Where(preds ...PredicateOf[CategoryToPost]) *CategoryToPostQueryBuilder { b.where = append(b.where, preds...) return b } @@ -82,11 +82,11 @@ func (b *CategoryToPostQueryBuilder) Omit(o CategoryToPostOmit) *CategoryToPostQ return b } -func (b *CategoryToPostQueryBuilder) GetRelationParams() (*CategoryToPostSelect, *CategoryToPostOmit, QueryParams) { +func (b *CategoryToPostQueryBuilder) GetRelationParams() (*CategoryToPostSelect, *CategoryToPostOmit, QueryParams[CategoryToPost]) { if b == nil { - return nil, nil, QueryParams{} + return nil, nil, QueryParams[CategoryToPost]{} } - return b.selects, b.omits, QueryParams{ + return b.selects, b.omits, QueryParams[CategoryToPost]{ Where: b.where, Take: b.take, Skip: b.skip, @@ -391,7 +391,7 @@ func (q *Queries) executeCategoryToPostCreateManyAndReturn(ctx context.Context, } return results, nil } -func (d *CategoryToPostDelegate) FindUnique(where UniquePredicate, additional ...Predicate) *FindUniqueBuilder[CategoryToPost, CategoryToPostSelect, CategoryToPostOmit] { +func (d *CategoryToPostDelegate) FindUnique(where UniquePredicate[CategoryToPost], additional ...PredicateOf[CategoryToPost]) *FindUniqueBuilder[CategoryToPost, CategoryToPostSelect, CategoryToPostOmit] { return &FindUniqueBuilder[CategoryToPost, CategoryToPostSelect, CategoryToPostOmit]{ client: d.client, where: where, @@ -400,7 +400,7 @@ func (d *CategoryToPostDelegate) FindUnique(where UniquePredicate, additional .. } } -func (d *CategoryToPostDelegate) FindFirst(preds ...Predicate) *FindFirstBuilder[CategoryToPost, CategoryToPostSelect, CategoryToPostOmit] { +func (d *CategoryToPostDelegate) FindFirst(preds ...PredicateOf[CategoryToPost]) *FindFirstBuilder[CategoryToPost, CategoryToPostSelect, CategoryToPostOmit] { return &FindFirstBuilder[CategoryToPost, CategoryToPostSelect, CategoryToPostOmit]{ client: d.client, where: preds, @@ -408,7 +408,7 @@ func (d *CategoryToPostDelegate) FindFirst(preds ...Predicate) *FindFirstBuilder } } -func (d *CategoryToPostDelegate) FindMany(preds ...Predicate) *FindManyBuilder[CategoryToPost, CategoryToPostSelect, CategoryToPostOmit] { +func (d *CategoryToPostDelegate) FindMany(preds ...PredicateOf[CategoryToPost]) *FindManyBuilder[CategoryToPost, CategoryToPostSelect, CategoryToPostOmit] { return &FindManyBuilder[CategoryToPost, CategoryToPostSelect, CategoryToPostOmit]{ client: d.client, where: preds, @@ -416,10 +416,7 @@ func (d *CategoryToPostDelegate) FindMany(preds ...Predicate) *FindManyBuilder[C } } -func (q *Queries) executeCategoryToPostFindUnique(ctx context.Context, where UniquePredicate, additional []Predicate, selects *CategoryToPostSelect, omits *CategoryToPostOmit) (*CategoryToPost, error) { - if where == nil { - return nil, fmt.Errorf("at least one unique field must be set for FindUnique") - } +func (q *Queries) executeCategoryToPostFindUnique(ctx context.Context, where UniquePredicate[CategoryToPost], additional []PredicateOf[CategoryToPost], selects *CategoryToPostSelect, omits *CategoryToPostOmit) (*CategoryToPost, error) { if err := where.Validate(); err != nil { return nil, err } @@ -430,7 +427,7 @@ func (q *Queries) executeCategoryToPostFindUnique(ctx context.Context, where Uni } } } - allPreds := append([]Predicate{where}, additional...) + allPreds := append([]PredicateOf[CategoryToPost]{where}, additional...) whereClause, vals := CompilePredicates(q.dialect, allPreds) if whereClause != "" { whereClause = " WHERE " + whereClause @@ -448,7 +445,7 @@ func (q *Queries) executeCategoryToPostFindUnique(ctx context.Context, where Uni func (q *Queries) executeCategoryToPostFindFirst( ctx context.Context, - params QueryParams, + params QueryParams[CategoryToPost], selects *CategoryToPostSelect, omits *CategoryToPostOmit, ) (*CategoryToPost, error) { @@ -476,7 +473,7 @@ func (q *Queries) executeCategoryToPostFindFirst( func (q *Queries) executeCategoryToPostFindMany( ctx context.Context, - params QueryParams, + params QueryParams[CategoryToPost], selects *CategoryToPostSelect, omits *CategoryToPostOmit, ) ([]*CategoryToPost, error) { diff --git a/integration/valk/categoryToPost/categoryToPost.go b/integration/valk/categoryToPost/categoryToPost.go index ffe2d97..0b5d10c 100644 --- a/integration/valk/categoryToPost/categoryToPost.go +++ b/integration/valk/categoryToPost/categoryToPost.go @@ -1,23 +1,9 @@ package categoryToPost import ( - "fmt" "integration/valk" ) -type UniquePredicate struct { - valk.StandardPredicate -} - -func (UniquePredicate) IsUnique() {} - -func (p UniquePredicate) Validate() error { - if p.StandardPredicate.Data.Column == "" && len(p.StandardPredicate.Data.Children) == 0 { - return fmt.Errorf("at least one unique field must be set for FindUnique") - } - return p.StandardPredicate.Validate() -} - type Select = valk.CategoryToPostSelect type Omit = valk.CategoryToPostOmit type QueryBuilder = valk.CategoryToPostQueryBuilder @@ -31,18 +17,18 @@ func Record(assignments ...valk.FieldAssignment) valk.RecordInput { return valk.RecordInput{Assignments: assignments} } -func And(preds ...valk.Predicate) valk.Predicate { +func And(preds ...valk.PredicateOf[valk.CategoryToPost]) valk.PredicateOf[valk.CategoryToPost] { return valk.And(preds...) } -func Or(preds ...valk.Predicate) valk.Predicate { +func Or(preds ...valk.PredicateOf[valk.CategoryToPost]) valk.PredicateOf[valk.CategoryToPost] { return valk.Or(preds...) } -func Not(pred valk.Predicate) valk.Predicate { +func Not(pred valk.PredicateOf[valk.CategoryToPost]) valk.PredicateOf[valk.CategoryToPost] { return valk.Not(pred) } -var PostId = valk.StringField{Column: "postId"} +var PostId = valk.StringField[valk.CategoryToPost]{Column: "postId"} -var CategoryId = valk.Field[int32]{Column: "categoryId"} +var CategoryId = valk.Field[valk.CategoryToPost, int32]{Column: "categoryId"} diff --git a/integration/valk/client.go b/integration/valk/client.go index a896c95..f3c09b6 100644 --- a/integration/valk/client.go +++ b/integration/valk/client.go @@ -333,8 +333,8 @@ type OrderBy struct { Direction OrderDirection } -type QueryParams struct { - Where []Predicate +type QueryParams[M any] struct { + Where []PredicateOf[M] Take *int Skip *int OrderBy []OrderBy @@ -660,25 +660,43 @@ type PredicateData struct { Children []PredicateData } -type Predicate interface { +type PredicateOf[M any] interface { ToPredicateData() PredicateData Validate() error + phantom(M) } -type UniquePredicate interface { - Predicate - IsUnique() - Validate() error +type Predicate[M any] struct { + Data PredicateData } -type StandardPredicate struct { +func (p Predicate[M]) ToPredicateData() PredicateData { + return p.Data +} + +func (p Predicate[M]) Validate() error { + return p.Data.Validate() +} + +func (p Predicate[M]) phantom(M) {} + +type UniquePredicate[M any] struct { Data PredicateData } -func (sp StandardPredicate) ToPredicateData() PredicateData { - return sp.Data +func (p UniquePredicate[M]) ToPredicateData() PredicateData { + return p.Data } +func (p UniquePredicate[M]) Validate() error { + if p.Data.Column == "" && len(p.Data.Children) == 0 { + return fmt.Errorf("at least one unique field must be set for FindUnique") + } + return p.Data.Validate() +} + +func (p UniquePredicate[M]) phantom(M) {} + func validateValue(col string, val any) error { switch v := val.(type) { case string: @@ -724,18 +742,14 @@ func (pd PredicateData) Validate() error { return validateValue(pd.Column, pd.Value) } -func (sp StandardPredicate) Validate() error { - return sp.Data.Validate() -} - -func And(preds ...Predicate) Predicate { +func And[M any](preds ...PredicateOf[M]) PredicateOf[M] { var children []PredicateData for _, p := range preds { if p != nil { children = append(children, p.ToPredicateData()) } } - return StandardPredicate{ + return Predicate[M]{ Data: PredicateData{ IsLogical: true, Operator: "AND", @@ -744,14 +758,14 @@ func And(preds ...Predicate) Predicate { } } -func Or(preds ...Predicate) Predicate { +func Or[M any](preds ...PredicateOf[M]) PredicateOf[M] { var children []PredicateData for _, p := range preds { if p != nil { children = append(children, p.ToPredicateData()) } } - return StandardPredicate{ + return Predicate[M]{ Data: PredicateData{ IsLogical: true, Operator: "OR", @@ -760,12 +774,12 @@ func Or(preds ...Predicate) Predicate { } } -func Not(pred Predicate) Predicate { +func Not[M any](pred PredicateOf[M]) PredicateOf[M] { var children []PredicateData if pred != nil { children = append(children, pred.ToPredicateData()) } - return StandardPredicate{ + return Predicate[M]{ Data: PredicateData{ IsLogical: true, Operator: "NOT", @@ -774,16 +788,16 @@ func Not(pred Predicate) Predicate { } } -type Field[T any] struct { +type Field[M any, T any] struct { Column string } -func (f Field[T]) Set(val T) FieldAssignment { +func (f Field[M, T]) Set(val T) FieldAssignment { return FieldAssignment{Col: f.Column, Val: val} } -func (f Field[T]) EQ(val T) Predicate { - return StandardPredicate{ +func (f Field[M, T]) EQ(val T) Predicate[M] { + return Predicate[M]{ Data: PredicateData{ Column: f.Column, Operator: "=", @@ -792,8 +806,8 @@ func (f Field[T]) EQ(val T) Predicate { } } -func (f Field[T]) NEQ(val T) Predicate { - return StandardPredicate{ +func (f Field[M, T]) NEQ(val T) Predicate[M] { + return Predicate[M]{ Data: PredicateData{ Column: f.Column, Operator: "!=", @@ -802,8 +816,8 @@ func (f Field[T]) NEQ(val T) Predicate { } } -func (f Field[T]) GT(val T) Predicate { - return StandardPredicate{ +func (f Field[M, T]) GT(val T) Predicate[M] { + return Predicate[M]{ Data: PredicateData{ Column: f.Column, Operator: ">", @@ -812,8 +826,8 @@ func (f Field[T]) GT(val T) Predicate { } } -func (f Field[T]) GTE(val T) Predicate { - return StandardPredicate{ +func (f Field[M, T]) GTE(val T) Predicate[M] { + return Predicate[M]{ Data: PredicateData{ Column: f.Column, Operator: ">=", @@ -822,8 +836,8 @@ func (f Field[T]) GTE(val T) Predicate { } } -func (f Field[T]) LT(val T) Predicate { - return StandardPredicate{ +func (f Field[M, T]) LT(val T) Predicate[M] { + return Predicate[M]{ Data: PredicateData{ Column: f.Column, Operator: "<", @@ -832,8 +846,8 @@ func (f Field[T]) LT(val T) Predicate { } } -func (f Field[T]) LTE(val T) Predicate { - return StandardPredicate{ +func (f Field[M, T]) LTE(val T) Predicate[M] { + return Predicate[M]{ Data: PredicateData{ Column: f.Column, Operator: "<=", @@ -842,8 +856,8 @@ func (f Field[T]) LTE(val T) Predicate { } } -func (f Field[T]) In(vals []T) Predicate { - return StandardPredicate{ +func (f Field[M, T]) In(vals []T) Predicate[M] { + return Predicate[M]{ Data: PredicateData{ Column: f.Column, Operator: "IN", @@ -852,8 +866,8 @@ func (f Field[T]) In(vals []T) Predicate { } } -func (f Field[T]) IsNull() Predicate { - return StandardPredicate{ +func (f Field[M, T]) IsNull() Predicate[M] { + return Predicate[M]{ Data: PredicateData{ Column: f.Column, Operator: "IS NULL", @@ -861,8 +875,8 @@ func (f Field[T]) IsNull() Predicate { } } -func (f Field[T]) IsNotNull() Predicate { - return StandardPredicate{ +func (f Field[M, T]) IsNotNull() Predicate[M] { + return Predicate[M]{ Data: PredicateData{ Column: f.Column, Operator: "IS NOT NULL", @@ -870,49 +884,34 @@ func (f Field[T]) IsNotNull() Predicate { } } -func (f Field[T]) Asc() OrderBy { +func (f Field[M, T]) Asc() OrderBy { return OrderBy{Field: f.Column, Direction: Asc} } -func (f Field[T]) Desc() OrderBy { +func (f Field[M, T]) Desc() OrderBy { return OrderBy{Field: f.Column, Direction: Desc} } -type UniqueField[T any] struct { +type UniqueField[M any, T any] struct { Column string } -func (f UniqueField[T]) Set(val T) FieldAssignment { +func (f UniqueField[M, T]) Set(val T) FieldAssignment { return FieldAssignment{Col: f.Column, Val: val} } -type UniqueFieldPredicate struct { - StandardPredicate -} - -func (UniqueFieldPredicate) IsUnique() {} - -func (p UniqueFieldPredicate) Validate() error { - if p.Data.Column == "" { - return fmt.Errorf("at least one unique field must be set for FindUnique") - } - return p.StandardPredicate.Validate() -} - -func (f UniqueField[T]) EQ(val T) UniquePredicate { - return UniqueFieldPredicate{ - StandardPredicate: StandardPredicate{ - Data: PredicateData{ - Column: f.Column, - Operator: "=", - Value: val, - }, +func (f UniqueField[M, T]) EQ(val T) UniquePredicate[M] { + return UniquePredicate[M]{ + Data: PredicateData{ + Column: f.Column, + Operator: "=", + Value: val, }, } } -func (f UniqueField[T]) NEQ(val T) Predicate { - return StandardPredicate{ +func (f UniqueField[M, T]) NEQ(val T) Predicate[M] { + return Predicate[M]{ Data: PredicateData{ Column: f.Column, Operator: "!=", @@ -921,8 +920,8 @@ func (f UniqueField[T]) NEQ(val T) Predicate { } } -func (f UniqueField[T]) GT(val T) Predicate { - return StandardPredicate{ +func (f UniqueField[M, T]) GT(val T) Predicate[M] { + return Predicate[M]{ Data: PredicateData{ Column: f.Column, Operator: ">", @@ -931,8 +930,8 @@ func (f UniqueField[T]) GT(val T) Predicate { } } -func (f UniqueField[T]) GTE(val T) Predicate { - return StandardPredicate{ +func (f UniqueField[M, T]) GTE(val T) Predicate[M] { + return Predicate[M]{ Data: PredicateData{ Column: f.Column, Operator: ">=", @@ -941,8 +940,8 @@ func (f UniqueField[T]) GTE(val T) Predicate { } } -func (f UniqueField[T]) LT(val T) Predicate { - return StandardPredicate{ +func (f UniqueField[M, T]) LT(val T) Predicate[M] { + return Predicate[M]{ Data: PredicateData{ Column: f.Column, Operator: "<", @@ -951,8 +950,8 @@ func (f UniqueField[T]) LT(val T) Predicate { } } -func (f UniqueField[T]) LTE(val T) Predicate { - return StandardPredicate{ +func (f UniqueField[M, T]) LTE(val T) Predicate[M] { + return Predicate[M]{ Data: PredicateData{ Column: f.Column, Operator: "<=", @@ -961,8 +960,8 @@ func (f UniqueField[T]) LTE(val T) Predicate { } } -func (f UniqueField[T]) In(vals []T) Predicate { - return StandardPredicate{ +func (f UniqueField[M, T]) In(vals []T) Predicate[M] { + return Predicate[M]{ Data: PredicateData{ Column: f.Column, Operator: "IN", @@ -971,8 +970,8 @@ func (f UniqueField[T]) In(vals []T) Predicate { } } -func (f UniqueField[T]) IsNull() Predicate { - return StandardPredicate{ +func (f UniqueField[M, T]) IsNull() Predicate[M] { + return Predicate[M]{ Data: PredicateData{ Column: f.Column, Operator: "IS NULL", @@ -980,8 +979,8 @@ func (f UniqueField[T]) IsNull() Predicate { } } -func (f UniqueField[T]) IsNotNull() Predicate { - return StandardPredicate{ +func (f UniqueField[M, T]) IsNotNull() Predicate[M] { + return Predicate[M]{ Data: PredicateData{ Column: f.Column, Operator: "IS NOT NULL", @@ -989,24 +988,24 @@ func (f UniqueField[T]) IsNotNull() Predicate { } } -func (f UniqueField[T]) Asc() OrderBy { +func (f UniqueField[M, T]) Asc() OrderBy { return OrderBy{Field: f.Column, Direction: Asc} } -func (f UniqueField[T]) Desc() OrderBy { +func (f UniqueField[M, T]) Desc() OrderBy { return OrderBy{Field: f.Column, Direction: Desc} } -type StringField struct { +type StringField[M any] struct { Column string } -func (f StringField) Set(val string) FieldAssignment { +func (f StringField[M]) Set(val string) FieldAssignment { return FieldAssignment{Col: f.Column, Val: val} } -func (f StringField) EQ(val string) Predicate { - return StandardPredicate{ +func (f StringField[M]) EQ(val string) Predicate[M] { + return Predicate[M]{ Data: PredicateData{ Column: f.Column, Operator: "=", @@ -1015,8 +1014,8 @@ func (f StringField) EQ(val string) Predicate { } } -func (f StringField) NEQ(val string) Predicate { - return StandardPredicate{ +func (f StringField[M]) NEQ(val string) Predicate[M] { + return Predicate[M]{ Data: PredicateData{ Column: f.Column, Operator: "!=", @@ -1025,8 +1024,8 @@ func (f StringField) NEQ(val string) Predicate { } } -func (f StringField) GT(val string) Predicate { - return StandardPredicate{ +func (f StringField[M]) GT(val string) Predicate[M] { + return Predicate[M]{ Data: PredicateData{ Column: f.Column, Operator: ">", @@ -1035,8 +1034,8 @@ func (f StringField) GT(val string) Predicate { } } -func (f StringField) GTE(val string) Predicate { - return StandardPredicate{ +func (f StringField[M]) GTE(val string) Predicate[M] { + return Predicate[M]{ Data: PredicateData{ Column: f.Column, Operator: ">=", @@ -1045,8 +1044,8 @@ func (f StringField) GTE(val string) Predicate { } } -func (f StringField) LT(val string) Predicate { - return StandardPredicate{ +func (f StringField[M]) LT(val string) Predicate[M] { + return Predicate[M]{ Data: PredicateData{ Column: f.Column, Operator: "<", @@ -1055,8 +1054,8 @@ func (f StringField) LT(val string) Predicate { } } -func (f StringField) LTE(val string) Predicate { - return StandardPredicate{ +func (f StringField[M]) LTE(val string) Predicate[M] { + return Predicate[M]{ Data: PredicateData{ Column: f.Column, Operator: "<=", @@ -1065,8 +1064,8 @@ func (f StringField) LTE(val string) Predicate { } } -func (f StringField) In(vals []string) Predicate { - return StandardPredicate{ +func (f StringField[M]) In(vals []string) Predicate[M] { + return Predicate[M]{ Data: PredicateData{ Column: f.Column, Operator: "IN", @@ -1075,8 +1074,8 @@ func (f StringField) In(vals []string) Predicate { } } -func (f StringField) Like(val string) Predicate { - return StandardPredicate{ +func (f StringField[M]) Like(val string) Predicate[M] { + return Predicate[M]{ Data: PredicateData{ Column: f.Column, Operator: "LIKE", @@ -1085,8 +1084,8 @@ func (f StringField) Like(val string) Predicate { } } -func (f StringField) Contains(val string) Predicate { - return StandardPredicate{ +func (f StringField[M]) Contains(val string) Predicate[M] { + return Predicate[M]{ Data: PredicateData{ Column: f.Column, Operator: "LIKE", @@ -1095,8 +1094,8 @@ func (f StringField) Contains(val string) Predicate { } } -func (f StringField) IsNull() Predicate { - return StandardPredicate{ +func (f StringField[M]) IsNull() Predicate[M] { + return Predicate[M]{ Data: PredicateData{ Column: f.Column, Operator: "IS NULL", @@ -1104,8 +1103,8 @@ func (f StringField) IsNull() Predicate { } } -func (f StringField) IsNotNull() Predicate { - return StandardPredicate{ +func (f StringField[M]) IsNotNull() Predicate[M] { + return Predicate[M]{ Data: PredicateData{ Column: f.Column, Operator: "IS NOT NULL", @@ -1113,36 +1112,34 @@ func (f StringField) IsNotNull() Predicate { } } -func (f StringField) Asc() OrderBy { +func (f StringField[M]) Asc() OrderBy { return OrderBy{Field: f.Column, Direction: Asc} } -func (f StringField) Desc() OrderBy { +func (f StringField[M]) Desc() OrderBy { return OrderBy{Field: f.Column, Direction: Desc} } -type StringUniqueField struct { +type StringUniqueField[M any] struct { Column string } -func (f StringUniqueField) Set(val string) FieldAssignment { +func (f StringUniqueField[M]) Set(val string) FieldAssignment { return FieldAssignment{Col: f.Column, Val: val} } -func (f StringUniqueField) EQ(val string) UniquePredicate { - return UniqueFieldPredicate{ - StandardPredicate: StandardPredicate{ - Data: PredicateData{ - Column: f.Column, - Operator: "=", - Value: val, - }, +func (f StringUniqueField[M]) EQ(val string) UniquePredicate[M] { + return UniquePredicate[M]{ + Data: PredicateData{ + Column: f.Column, + Operator: "=", + Value: val, }, } } -func (f StringUniqueField) NEQ(val string) Predicate { - return StandardPredicate{ +func (f StringUniqueField[M]) NEQ(val string) Predicate[M] { + return Predicate[M]{ Data: PredicateData{ Column: f.Column, Operator: "!=", @@ -1151,8 +1148,8 @@ func (f StringUniqueField) NEQ(val string) Predicate { } } -func (f StringUniqueField) GT(val string) Predicate { - return StandardPredicate{ +func (f StringUniqueField[M]) GT(val string) Predicate[M] { + return Predicate[M]{ Data: PredicateData{ Column: f.Column, Operator: ">", @@ -1161,8 +1158,8 @@ func (f StringUniqueField) GT(val string) Predicate { } } -func (f StringUniqueField) GTE(val string) Predicate { - return StandardPredicate{ +func (f StringUniqueField[M]) GTE(val string) Predicate[M] { + return Predicate[M]{ Data: PredicateData{ Column: f.Column, Operator: ">=", @@ -1171,8 +1168,8 @@ func (f StringUniqueField) GTE(val string) Predicate { } } -func (f StringUniqueField) LT(val string) Predicate { - return StandardPredicate{ +func (f StringUniqueField[M]) LT(val string) Predicate[M] { + return Predicate[M]{ Data: PredicateData{ Column: f.Column, Operator: "<", @@ -1181,8 +1178,8 @@ func (f StringUniqueField) LT(val string) Predicate { } } -func (f StringUniqueField) LTE(val string) Predicate { - return StandardPredicate{ +func (f StringUniqueField[M]) LTE(val string) Predicate[M] { + return Predicate[M]{ Data: PredicateData{ Column: f.Column, Operator: "<=", @@ -1191,8 +1188,8 @@ func (f StringUniqueField) LTE(val string) Predicate { } } -func (f StringUniqueField) In(vals []string) Predicate { - return StandardPredicate{ +func (f StringUniqueField[M]) In(vals []string) Predicate[M] { + return Predicate[M]{ Data: PredicateData{ Column: f.Column, Operator: "IN", @@ -1201,8 +1198,8 @@ func (f StringUniqueField) In(vals []string) Predicate { } } -func (f StringUniqueField) Like(val string) Predicate { - return StandardPredicate{ +func (f StringUniqueField[M]) Like(val string) Predicate[M] { + return Predicate[M]{ Data: PredicateData{ Column: f.Column, Operator: "LIKE", @@ -1211,8 +1208,8 @@ func (f StringUniqueField) Like(val string) Predicate { } } -func (f StringUniqueField) Contains(val string) Predicate { - return StandardPredicate{ +func (f StringUniqueField[M]) Contains(val string) Predicate[M] { + return Predicate[M]{ Data: PredicateData{ Column: f.Column, Operator: "LIKE", @@ -1221,8 +1218,8 @@ func (f StringUniqueField) Contains(val string) Predicate { } } -func (f StringUniqueField) IsNull() Predicate { - return StandardPredicate{ +func (f StringUniqueField[M]) IsNull() Predicate[M] { + return Predicate[M]{ Data: PredicateData{ Column: f.Column, Operator: "IS NULL", @@ -1230,8 +1227,8 @@ func (f StringUniqueField) IsNull() Predicate { } } -func (f StringUniqueField) IsNotNull() Predicate { - return StandardPredicate{ +func (f StringUniqueField[M]) IsNotNull() Predicate[M] { + return Predicate[M]{ Data: PredicateData{ Column: f.Column, Operator: "IS NOT NULL", @@ -1239,15 +1236,15 @@ func (f StringUniqueField) IsNotNull() Predicate { } } -func (f StringUniqueField) Asc() OrderBy { +func (f StringUniqueField[M]) Asc() OrderBy { return OrderBy{Field: f.Column, Direction: Asc} } -func (f StringUniqueField) Desc() OrderBy { +func (f StringUniqueField[M]) Desc() OrderBy { return OrderBy{Field: f.Column, Direction: Desc} } -func CompilePredicates(dialect Dialect, preds []Predicate) (string, []any) { +func CompilePredicates[M any](dialect Dialect, preds []PredicateOf[M]) (string, []any) { if len(preds) == 0 { return "", nil } @@ -1780,7 +1777,7 @@ func loadRelation[P any, C any]( scan func(*sql.Rows, *C) error, childKey func(*C) (string, bool), assign func(*P, []*C), - params QueryParams, + params QueryParams[C], ) ([]*C, error) { var parentKeys []any for _, p := range parents { @@ -1795,9 +1792,9 @@ func loadRelation[P any, C any]( return nil, nil } - // Prepend parent ID checks to filters using StandardPredicate - allPreds := append([]Predicate{ - StandardPredicate{ + // Prepend parent ID checks to filters using Predicate[C] + allPreds := append([]PredicateOf[C]{ + Predicate[C]{ Data: PredicateData{ Column: fkCol, Operator: "IN", @@ -1849,14 +1846,14 @@ func loadRelation[P any, C any]( return allChildren, nil } -func compileRelationSQL(dialect Dialect, table, fkCol string, cols []string, where string, params QueryParams) string { +func compileRelationSQL[M any](dialect Dialect, table, fkCol string, cols []string, where string, params QueryParams[M]) string { if params.Take != nil || params.Skip != nil { return compilePartitionedRelationSQL(dialect, table, fkCol, cols, where, params) } return compileSimpleRelationSQL(dialect, table, cols, where, params) } -func compilePartitionedRelationSQL(dialect Dialect, table, fkCol string, cols []string, where string, params QueryParams) string { +func compilePartitionedRelationSQL[M any](dialect Dialect, table, fkCol string, cols []string, where string, params QueryParams[M]) string { var innerSb strings.Builder innerSb.WriteString("SELECT ") for i, col := range cols { @@ -1907,7 +1904,7 @@ func compilePartitionedRelationSQL(dialect Dialect, table, fkCol string, cols [] return outerSb.String() } -func compileSimpleRelationSQL(dialect Dialect, table string, cols []string, where string, params QueryParams) string { +func compileSimpleRelationSQL[M any](dialect Dialect, table string, cols []string, where string, params QueryParams[M]) string { var sb strings.Builder sb.WriteString("SELECT ") for i, col := range cols { @@ -1935,9 +1932,9 @@ func compileSimpleRelationSQL(dialect Dialect, table string, cols []string, wher type FindUniqueBuilder[M any, S any, O any] struct { client *Queries - where UniquePredicate - additional []Predicate - execFunc func(ctx context.Context, where UniquePredicate, additional []Predicate, s *S, o *O) (*M, error) + where UniquePredicate[M] + additional []PredicateOf[M] + execFunc func(ctx context.Context, where UniquePredicate[M], additional []PredicateOf[M], s *S, o *O) (*M, error) } func (b *FindUniqueBuilder[M, S, O]) Select(s S) *FindUniqueSelectBuilder[M, S, O] { @@ -1972,9 +1969,9 @@ func (b *FindUniqueOmitBuilder[M, S, O]) Exec(ctx context.Context) (*M, error) { type FindFirstBuilder[M any, S any, O any] struct { client *Queries - where []Predicate + where []PredicateOf[M] skip *int - execFunc func(ctx context.Context, params QueryParams, s *S, o *O) (*M, error) + execFunc func(ctx context.Context, params QueryParams[M], s *S, o *O) (*M, error) } func (b *FindFirstBuilder[M, S, O]) Skip(offset int) *FindFirstBuilder[M, S, O] { @@ -1991,7 +1988,7 @@ func (b *FindFirstBuilder[M, S, O]) Omit(o O) *FindFirstOmitBuilder[M, S, O] { } func (b *FindFirstBuilder[M, S, O]) Exec(ctx context.Context) (*M, error) { - params := QueryParams{ + params := QueryParams[M]{ Where: b.where, Skip: b.skip, } @@ -2004,7 +2001,7 @@ type FindFirstSelectBuilder[M any, S any, O any] struct { } func (b *FindFirstSelectBuilder[M, S, O]) Exec(ctx context.Context) (*M, error) { - params := QueryParams{ + params := QueryParams[M]{ Where: b.builder.where, Skip: b.builder.skip, } @@ -2017,7 +2014,7 @@ type FindFirstOmitBuilder[M any, S any, O any] struct { } func (b *FindFirstOmitBuilder[M, S, O]) Exec(ctx context.Context) (*M, error) { - params := QueryParams{ + params := QueryParams[M]{ Where: b.builder.where, Skip: b.builder.skip, } @@ -2026,10 +2023,10 @@ func (b *FindFirstOmitBuilder[M, S, O]) Exec(ctx context.Context) (*M, error) { type FindManyBuilder[M any, S any, O any] struct { client *Queries - where []Predicate + where []PredicateOf[M] take *int skip *int - execFunc func(ctx context.Context, params QueryParams, s *S, o *O) ([]*M, error) + execFunc func(ctx context.Context, params QueryParams[M], s *S, o *O) ([]*M, error) } func (b *FindManyBuilder[M, S, O]) Take(limit int) *FindManyBuilder[M, S, O] { @@ -2051,7 +2048,7 @@ func (b *FindManyBuilder[M, S, O]) Omit(o O) *FindManyOmitBuilder[M, S, O] { } func (b *FindManyBuilder[M, S, O]) Exec(ctx context.Context) ([]*M, error) { - params := QueryParams{ + params := QueryParams[M]{ Where: b.where, Take: b.take, Skip: b.skip, @@ -2065,7 +2062,7 @@ type FindManySelectBuilder[M any, S any, O any] struct { } func (b *FindManySelectBuilder[M, S, O]) Exec(ctx context.Context) ([]*M, error) { - params := QueryParams{ + params := QueryParams[M]{ Where: b.builder.where, Take: b.builder.take, Skip: b.builder.skip, @@ -2079,7 +2076,7 @@ type FindManyOmitBuilder[M any, S any, O any] struct { } func (b *FindManyOmitBuilder[M, S, O]) Exec(ctx context.Context) ([]*M, error) { - params := QueryParams{ + params := QueryParams[M]{ Where: b.builder.where, Take: b.builder.take, Skip: b.builder.skip, diff --git a/integration/valk/comment.go b/integration/valk/comment.go index 1e4de17..8c998b4 100644 --- a/integration/valk/comment.go +++ b/integration/valk/comment.go @@ -60,24 +60,24 @@ type CommentOmit struct { } type CommentSelectQuery interface { - GetRelationParams() (*CommentSelect, *CommentOmit, QueryParams) + GetRelationParams() (*CommentSelect, *CommentOmit, QueryParams[Comment]) } -func (s *CommentSelect) GetRelationParams() (*CommentSelect, *CommentOmit, QueryParams) { - return s, nil, QueryParams{} +func (s *CommentSelect) GetRelationParams() (*CommentSelect, *CommentOmit, QueryParams[Comment]) { + return s, nil, QueryParams[Comment]{} } // CommentQueryBuilder builds a query for the relation Comment type CommentQueryBuilder struct { selects *CommentSelect omits *CommentOmit - where []Predicate + where []PredicateOf[Comment] take *int skip *int orderBy []OrderBy } -func (b *CommentQueryBuilder) Where(preds ...Predicate) *CommentQueryBuilder { +func (b *CommentQueryBuilder) Where(preds ...PredicateOf[Comment]) *CommentQueryBuilder { b.where = append(b.where, preds...) return b } @@ -107,11 +107,11 @@ func (b *CommentQueryBuilder) Omit(o CommentOmit) *CommentQueryBuilder { return b } -func (b *CommentQueryBuilder) GetRelationParams() (*CommentSelect, *CommentOmit, QueryParams) { +func (b *CommentQueryBuilder) GetRelationParams() (*CommentSelect, *CommentOmit, QueryParams[Comment]) { if b == nil { - return nil, nil, QueryParams{} + return nil, nil, QueryParams[Comment]{} } - return b.selects, b.omits, QueryParams{ + return b.selects, b.omits, QueryParams[Comment]{ Where: b.where, Take: b.take, Skip: b.skip, @@ -552,7 +552,7 @@ func (q *Queries) executeCommentCreateManyAndReturn(ctx context.Context, records } return results, nil } -func (d *CommentDelegate) FindUnique(where UniquePredicate, additional ...Predicate) *FindUniqueBuilder[Comment, CommentSelect, CommentOmit] { +func (d *CommentDelegate) FindUnique(where UniquePredicate[Comment], additional ...PredicateOf[Comment]) *FindUniqueBuilder[Comment, CommentSelect, CommentOmit] { return &FindUniqueBuilder[Comment, CommentSelect, CommentOmit]{ client: d.client, where: where, @@ -561,7 +561,7 @@ func (d *CommentDelegate) FindUnique(where UniquePredicate, additional ...Predic } } -func (d *CommentDelegate) FindFirst(preds ...Predicate) *FindFirstBuilder[Comment, CommentSelect, CommentOmit] { +func (d *CommentDelegate) FindFirst(preds ...PredicateOf[Comment]) *FindFirstBuilder[Comment, CommentSelect, CommentOmit] { return &FindFirstBuilder[Comment, CommentSelect, CommentOmit]{ client: d.client, where: preds, @@ -569,7 +569,7 @@ func (d *CommentDelegate) FindFirst(preds ...Predicate) *FindFirstBuilder[Commen } } -func (d *CommentDelegate) FindMany(preds ...Predicate) *FindManyBuilder[Comment, CommentSelect, CommentOmit] { +func (d *CommentDelegate) FindMany(preds ...PredicateOf[Comment]) *FindManyBuilder[Comment, CommentSelect, CommentOmit] { return &FindManyBuilder[Comment, CommentSelect, CommentOmit]{ client: d.client, where: preds, @@ -577,10 +577,7 @@ func (d *CommentDelegate) FindMany(preds ...Predicate) *FindManyBuilder[Comment, } } -func (q *Queries) executeCommentFindUnique(ctx context.Context, where UniquePredicate, additional []Predicate, selects *CommentSelect, omits *CommentOmit) (*Comment, error) { - if where == nil { - return nil, fmt.Errorf("at least one unique field must be set for FindUnique") - } +func (q *Queries) executeCommentFindUnique(ctx context.Context, where UniquePredicate[Comment], additional []PredicateOf[Comment], selects *CommentSelect, omits *CommentOmit) (*Comment, error) { if err := where.Validate(); err != nil { return nil, err } @@ -591,7 +588,7 @@ func (q *Queries) executeCommentFindUnique(ctx context.Context, where UniquePred } } } - allPreds := append([]Predicate{where}, additional...) + allPreds := append([]PredicateOf[Comment]{where}, additional...) whereClause, vals := CompilePredicates(q.dialect, allPreds) if whereClause != "" { whereClause = " WHERE " + whereClause @@ -609,7 +606,7 @@ func (q *Queries) executeCommentFindUnique(ctx context.Context, where UniquePred func (q *Queries) executeCommentFindFirst( ctx context.Context, - params QueryParams, + params QueryParams[Comment], selects *CommentSelect, omits *CommentOmit, ) (*Comment, error) { @@ -637,7 +634,7 @@ func (q *Queries) executeCommentFindFirst( func (q *Queries) executeCommentFindMany( ctx context.Context, - params QueryParams, + params QueryParams[Comment], selects *CommentSelect, omits *CommentOmit, ) ([]*Comment, error) { diff --git a/integration/valk/comment/comment.go b/integration/valk/comment/comment.go index 48ea007..9dcdf67 100644 --- a/integration/valk/comment/comment.go +++ b/integration/valk/comment/comment.go @@ -2,23 +2,9 @@ package comment import ( "encoding/json" - "fmt" "integration/valk" ) -type UniquePredicate struct { - valk.StandardPredicate -} - -func (UniquePredicate) IsUnique() {} - -func (p UniquePredicate) Validate() error { - if p.StandardPredicate.Data.Column == "" && len(p.StandardPredicate.Data.Children) == 0 { - return fmt.Errorf("at least one unique field must be set for FindUnique") - } - return p.StandardPredicate.Validate() -} - type Select = valk.CommentSelect type Omit = valk.CommentOmit type QueryBuilder = valk.CommentQueryBuilder @@ -32,30 +18,30 @@ func Record(assignments ...valk.FieldAssignment) valk.RecordInput { return valk.RecordInput{Assignments: assignments} } -func And(preds ...valk.Predicate) valk.Predicate { +func And(preds ...valk.PredicateOf[valk.Comment]) valk.PredicateOf[valk.Comment] { return valk.And(preds...) } -func Or(preds ...valk.Predicate) valk.Predicate { +func Or(preds ...valk.PredicateOf[valk.Comment]) valk.PredicateOf[valk.Comment] { return valk.Or(preds...) } -func Not(pred valk.Predicate) valk.Predicate { +func Not(pred valk.PredicateOf[valk.Comment]) valk.PredicateOf[valk.Comment] { return valk.Not(pred) } -var Id = valk.StringUniqueField{Column: "id"} +var Id = valk.StringUniqueField[valk.Comment]{Column: "id"} -var Textify = valk.Field[int32]{Column: "textify"} +var Textify = valk.Field[valk.Comment, int32]{Column: "textify"} -var Dummy3 = valk.StringField{Column: "dummy3"} +var Dummy3 = valk.StringField[valk.Comment]{Column: "dummy3"} -var Dummy1 = valk.Field[int32]{Column: "dummy1"} +var Dummy1 = valk.Field[valk.Comment, int32]{Column: "dummy1"} -var Dummy2 = valk.StringField{Column: "dummy2"} +var Dummy2 = valk.StringField[valk.Comment]{Column: "dummy2"} -var PostId = valk.StringField{Column: "postId"} +var PostId = valk.StringField[valk.Comment]{Column: "postId"} -var AuthorId = valk.StringField{Column: "authorId"} +var AuthorId = valk.StringField[valk.Comment]{Column: "authorId"} -var Meta = valk.Field[json.RawMessage]{Column: "meta"} +var Meta = valk.Field[valk.Comment, json.RawMessage]{Column: "meta"} diff --git a/integration/valk/defaultsTest.go b/integration/valk/defaultsTest.go index ba30c61..8f951ac 100644 --- a/integration/valk/defaultsTest.go +++ b/integration/valk/defaultsTest.go @@ -60,24 +60,24 @@ type DefaultsTestOmit struct { } type DefaultsTestSelectQuery interface { - GetRelationParams() (*DefaultsTestSelect, *DefaultsTestOmit, QueryParams) + GetRelationParams() (*DefaultsTestSelect, *DefaultsTestOmit, QueryParams[DefaultsTest]) } -func (s *DefaultsTestSelect) GetRelationParams() (*DefaultsTestSelect, *DefaultsTestOmit, QueryParams) { - return s, nil, QueryParams{} +func (s *DefaultsTestSelect) GetRelationParams() (*DefaultsTestSelect, *DefaultsTestOmit, QueryParams[DefaultsTest]) { + return s, nil, QueryParams[DefaultsTest]{} } // DefaultsTestQueryBuilder builds a query for the relation DefaultsTest type DefaultsTestQueryBuilder struct { selects *DefaultsTestSelect omits *DefaultsTestOmit - where []Predicate + where []PredicateOf[DefaultsTest] take *int skip *int orderBy []OrderBy } -func (b *DefaultsTestQueryBuilder) Where(preds ...Predicate) *DefaultsTestQueryBuilder { +func (b *DefaultsTestQueryBuilder) Where(preds ...PredicateOf[DefaultsTest]) *DefaultsTestQueryBuilder { b.where = append(b.where, preds...) return b } @@ -107,11 +107,11 @@ func (b *DefaultsTestQueryBuilder) Omit(o DefaultsTestOmit) *DefaultsTestQueryBu return b } -func (b *DefaultsTestQueryBuilder) GetRelationParams() (*DefaultsTestSelect, *DefaultsTestOmit, QueryParams) { +func (b *DefaultsTestQueryBuilder) GetRelationParams() (*DefaultsTestSelect, *DefaultsTestOmit, QueryParams[DefaultsTest]) { if b == nil { - return nil, nil, QueryParams{} + return nil, nil, QueryParams[DefaultsTest]{} } - return b.selects, b.omits, QueryParams{ + return b.selects, b.omits, QueryParams[DefaultsTest]{ Where: b.where, Take: b.take, Skip: b.skip, @@ -584,7 +584,7 @@ func (q *Queries) executeDefaultsTestCreateManyAndReturn(ctx context.Context, re } return results, nil } -func (d *DefaultsTestDelegate) FindUnique(where UniquePredicate, additional ...Predicate) *FindUniqueBuilder[DefaultsTest, DefaultsTestSelect, DefaultsTestOmit] { +func (d *DefaultsTestDelegate) FindUnique(where UniquePredicate[DefaultsTest], additional ...PredicateOf[DefaultsTest]) *FindUniqueBuilder[DefaultsTest, DefaultsTestSelect, DefaultsTestOmit] { return &FindUniqueBuilder[DefaultsTest, DefaultsTestSelect, DefaultsTestOmit]{ client: d.client, where: where, @@ -593,7 +593,7 @@ func (d *DefaultsTestDelegate) FindUnique(where UniquePredicate, additional ...P } } -func (d *DefaultsTestDelegate) FindFirst(preds ...Predicate) *FindFirstBuilder[DefaultsTest, DefaultsTestSelect, DefaultsTestOmit] { +func (d *DefaultsTestDelegate) FindFirst(preds ...PredicateOf[DefaultsTest]) *FindFirstBuilder[DefaultsTest, DefaultsTestSelect, DefaultsTestOmit] { return &FindFirstBuilder[DefaultsTest, DefaultsTestSelect, DefaultsTestOmit]{ client: d.client, where: preds, @@ -601,7 +601,7 @@ func (d *DefaultsTestDelegate) FindFirst(preds ...Predicate) *FindFirstBuilder[D } } -func (d *DefaultsTestDelegate) FindMany(preds ...Predicate) *FindManyBuilder[DefaultsTest, DefaultsTestSelect, DefaultsTestOmit] { +func (d *DefaultsTestDelegate) FindMany(preds ...PredicateOf[DefaultsTest]) *FindManyBuilder[DefaultsTest, DefaultsTestSelect, DefaultsTestOmit] { return &FindManyBuilder[DefaultsTest, DefaultsTestSelect, DefaultsTestOmit]{ client: d.client, where: preds, @@ -609,10 +609,7 @@ func (d *DefaultsTestDelegate) FindMany(preds ...Predicate) *FindManyBuilder[Def } } -func (q *Queries) executeDefaultsTestFindUnique(ctx context.Context, where UniquePredicate, additional []Predicate, selects *DefaultsTestSelect, omits *DefaultsTestOmit) (*DefaultsTest, error) { - if where == nil { - return nil, fmt.Errorf("at least one unique field must be set for FindUnique") - } +func (q *Queries) executeDefaultsTestFindUnique(ctx context.Context, where UniquePredicate[DefaultsTest], additional []PredicateOf[DefaultsTest], selects *DefaultsTestSelect, omits *DefaultsTestOmit) (*DefaultsTest, error) { if err := where.Validate(); err != nil { return nil, err } @@ -623,7 +620,7 @@ func (q *Queries) executeDefaultsTestFindUnique(ctx context.Context, where Uniqu } } } - allPreds := append([]Predicate{where}, additional...) + allPreds := append([]PredicateOf[DefaultsTest]{where}, additional...) whereClause, vals := CompilePredicates(q.dialect, allPreds) if whereClause != "" { whereClause = " WHERE " + whereClause @@ -641,7 +638,7 @@ func (q *Queries) executeDefaultsTestFindUnique(ctx context.Context, where Uniqu func (q *Queries) executeDefaultsTestFindFirst( ctx context.Context, - params QueryParams, + params QueryParams[DefaultsTest], selects *DefaultsTestSelect, omits *DefaultsTestOmit, ) (*DefaultsTest, error) { @@ -669,7 +666,7 @@ func (q *Queries) executeDefaultsTestFindFirst( func (q *Queries) executeDefaultsTestFindMany( ctx context.Context, - params QueryParams, + params QueryParams[DefaultsTest], selects *DefaultsTestSelect, omits *DefaultsTestOmit, ) ([]*DefaultsTest, error) { diff --git a/integration/valk/defaultsTest/defaultsTest.go b/integration/valk/defaultsTest/defaultsTest.go index 769deb1..468c7a3 100644 --- a/integration/valk/defaultsTest/defaultsTest.go +++ b/integration/valk/defaultsTest/defaultsTest.go @@ -1,24 +1,10 @@ package defaultsTest import ( - "fmt" "integration/valk" "time" ) -type UniquePredicate struct { - valk.StandardPredicate -} - -func (UniquePredicate) IsUnique() {} - -func (p UniquePredicate) Validate() error { - if p.StandardPredicate.Data.Column == "" && len(p.StandardPredicate.Data.Children) == 0 { - return fmt.Errorf("at least one unique field must be set for FindUnique") - } - return p.StandardPredicate.Validate() -} - type Select = valk.DefaultsTestSelect type Omit = valk.DefaultsTestOmit type QueryBuilder = valk.DefaultsTestQueryBuilder @@ -32,32 +18,32 @@ func Record(assignments ...valk.FieldAssignment) valk.RecordInput { return valk.RecordInput{Assignments: assignments} } -func And(preds ...valk.Predicate) valk.Predicate { +func And(preds ...valk.PredicateOf[valk.DefaultsTest]) valk.PredicateOf[valk.DefaultsTest] { return valk.And(preds...) } -func Or(preds ...valk.Predicate) valk.Predicate { +func Or(preds ...valk.PredicateOf[valk.DefaultsTest]) valk.PredicateOf[valk.DefaultsTest] { return valk.Or(preds...) } -func Not(pred valk.Predicate) valk.Predicate { +func Not(pred valk.PredicateOf[valk.DefaultsTest]) valk.PredicateOf[valk.DefaultsTest] { return valk.Not(pred) } -var Uuid4 = valk.StringUniqueField{Column: "uuid4"} +var Uuid4 = valk.StringUniqueField[valk.DefaultsTest]{Column: "uuid4"} -var Uuid7 = valk.StringField{Column: "uuid7"} +var Uuid7 = valk.StringField[valk.DefaultsTest]{Column: "uuid7"} -var UuidNoArgs = valk.StringField{Column: "uuidNoArgs"} +var UuidNoArgs = valk.StringField[valk.DefaultsTest]{Column: "uuidNoArgs"} -var Cuid1 = valk.StringField{Column: "cuid1"} +var Cuid1 = valk.StringField[valk.DefaultsTest]{Column: "cuid1"} -var Cuid2 = valk.StringField{Column: "cuid2"} +var Cuid2 = valk.StringField[valk.DefaultsTest]{Column: "cuid2"} -var CuidNoArgs = valk.StringField{Column: "cuidNoArgs"} +var CuidNoArgs = valk.StringField[valk.DefaultsTest]{Column: "cuidNoArgs"} -var Ulid = valk.StringField{Column: "ulid"} +var Ulid = valk.StringField[valk.DefaultsTest]{Column: "ulid"} -var Nanoid = valk.StringField{Column: "nanoid"} +var Nanoid = valk.StringField[valk.DefaultsTest]{Column: "nanoid"} -var Now = valk.Field[time.Time]{Column: "now"} +var Now = valk.Field[valk.DefaultsTest, time.Time]{Column: "now"} diff --git a/integration/valk/post.go b/integration/valk/post.go index d2b38d6..62cb048 100644 --- a/integration/valk/post.go +++ b/integration/valk/post.go @@ -49,24 +49,24 @@ type PostOmit struct { } type PostSelectQuery interface { - GetRelationParams() (*PostSelect, *PostOmit, QueryParams) + GetRelationParams() (*PostSelect, *PostOmit, QueryParams[Post]) } -func (s *PostSelect) GetRelationParams() (*PostSelect, *PostOmit, QueryParams) { - return s, nil, QueryParams{} +func (s *PostSelect) GetRelationParams() (*PostSelect, *PostOmit, QueryParams[Post]) { + return s, nil, QueryParams[Post]{} } // PostQueryBuilder builds a query for the relation Post type PostQueryBuilder struct { selects *PostSelect omits *PostOmit - where []Predicate + where []PredicateOf[Post] take *int skip *int orderBy []OrderBy } -func (b *PostQueryBuilder) Where(preds ...Predicate) *PostQueryBuilder { +func (b *PostQueryBuilder) Where(preds ...PredicateOf[Post]) *PostQueryBuilder { b.where = append(b.where, preds...) return b } @@ -96,11 +96,11 @@ func (b *PostQueryBuilder) Omit(o PostOmit) *PostQueryBuilder { return b } -func (b *PostQueryBuilder) GetRelationParams() (*PostSelect, *PostOmit, QueryParams) { +func (b *PostQueryBuilder) GetRelationParams() (*PostSelect, *PostOmit, QueryParams[Post]) { if b == nil { - return nil, nil, QueryParams{} + return nil, nil, QueryParams[Post]{} } - return b.selects, b.omits, QueryParams{ + return b.selects, b.omits, QueryParams[Post]{ Where: b.where, Take: b.take, Skip: b.skip, @@ -471,7 +471,7 @@ func (q *Queries) executePostCreateManyAndReturn(ctx context.Context, records [] } return results, nil } -func (d *PostDelegate) FindUnique(where UniquePredicate, additional ...Predicate) *FindUniqueBuilder[Post, PostSelect, PostOmit] { +func (d *PostDelegate) FindUnique(where UniquePredicate[Post], additional ...PredicateOf[Post]) *FindUniqueBuilder[Post, PostSelect, PostOmit] { return &FindUniqueBuilder[Post, PostSelect, PostOmit]{ client: d.client, where: where, @@ -480,7 +480,7 @@ func (d *PostDelegate) FindUnique(where UniquePredicate, additional ...Predicate } } -func (d *PostDelegate) FindFirst(preds ...Predicate) *FindFirstBuilder[Post, PostSelect, PostOmit] { +func (d *PostDelegate) FindFirst(preds ...PredicateOf[Post]) *FindFirstBuilder[Post, PostSelect, PostOmit] { return &FindFirstBuilder[Post, PostSelect, PostOmit]{ client: d.client, where: preds, @@ -488,7 +488,7 @@ func (d *PostDelegate) FindFirst(preds ...Predicate) *FindFirstBuilder[Post, Pos } } -func (d *PostDelegate) FindMany(preds ...Predicate) *FindManyBuilder[Post, PostSelect, PostOmit] { +func (d *PostDelegate) FindMany(preds ...PredicateOf[Post]) *FindManyBuilder[Post, PostSelect, PostOmit] { return &FindManyBuilder[Post, PostSelect, PostOmit]{ client: d.client, where: preds, @@ -496,10 +496,7 @@ func (d *PostDelegate) FindMany(preds ...Predicate) *FindManyBuilder[Post, PostS } } -func (q *Queries) executePostFindUnique(ctx context.Context, where UniquePredicate, additional []Predicate, selects *PostSelect, omits *PostOmit) (*Post, error) { - if where == nil { - return nil, fmt.Errorf("at least one unique field must be set for FindUnique") - } +func (q *Queries) executePostFindUnique(ctx context.Context, where UniquePredicate[Post], additional []PredicateOf[Post], selects *PostSelect, omits *PostOmit) (*Post, error) { if err := where.Validate(); err != nil { return nil, err } @@ -510,7 +507,7 @@ func (q *Queries) executePostFindUnique(ctx context.Context, where UniquePredica } } } - allPreds := append([]Predicate{where}, additional...) + allPreds := append([]PredicateOf[Post]{where}, additional...) whereClause, vals := CompilePredicates(q.dialect, allPreds) if whereClause != "" { whereClause = " WHERE " + whereClause @@ -528,7 +525,7 @@ func (q *Queries) executePostFindUnique(ctx context.Context, where UniquePredica func (q *Queries) executePostFindFirst( ctx context.Context, - params QueryParams, + params QueryParams[Post], selects *PostSelect, omits *PostOmit, ) (*Post, error) { @@ -556,7 +553,7 @@ func (q *Queries) executePostFindFirst( func (q *Queries) executePostFindMany( ctx context.Context, - params QueryParams, + params QueryParams[Post], selects *PostSelect, omits *PostOmit, ) ([]*Post, error) { diff --git a/integration/valk/post/post.go b/integration/valk/post/post.go index 216503e..36cabe0 100644 --- a/integration/valk/post/post.go +++ b/integration/valk/post/post.go @@ -1,23 +1,9 @@ package post import ( - "fmt" "integration/valk" ) -type UniquePredicate struct { - valk.StandardPredicate -} - -func (UniquePredicate) IsUnique() {} - -func (p UniquePredicate) Validate() error { - if p.StandardPredicate.Data.Column == "" && len(p.StandardPredicate.Data.Children) == 0 { - return fmt.Errorf("at least one unique field must be set for FindUnique") - } - return p.StandardPredicate.Validate() -} - type Select = valk.PostSelect type Omit = valk.PostOmit type QueryBuilder = valk.PostQueryBuilder @@ -31,24 +17,24 @@ func Record(assignments ...valk.FieldAssignment) valk.RecordInput { return valk.RecordInput{Assignments: assignments} } -func And(preds ...valk.Predicate) valk.Predicate { +func And(preds ...valk.PredicateOf[valk.Post]) valk.PredicateOf[valk.Post] { return valk.And(preds...) } -func Or(preds ...valk.Predicate) valk.Predicate { +func Or(preds ...valk.PredicateOf[valk.Post]) valk.PredicateOf[valk.Post] { return valk.Or(preds...) } -func Not(pred valk.Predicate) valk.Predicate { +func Not(pred valk.PredicateOf[valk.Post]) valk.PredicateOf[valk.Post] { return valk.Not(pred) } -var Id = valk.StringUniqueField{Column: "id"} +var Id = valk.StringUniqueField[valk.Post]{Column: "id"} -var Title = valk.StringField{Column: "title"} +var Title = valk.StringField[valk.Post]{Column: "title"} -var Content = valk.StringField{Column: "content"} +var Content = valk.StringField[valk.Post]{Column: "content"} -var Published = valk.Field[bool]{Column: "published"} +var Published = valk.Field[valk.Post, bool]{Column: "published"} -var AuthorId = valk.StringField{Column: "authorId"} +var AuthorId = valk.StringField[valk.Post]{Column: "authorId"} diff --git a/integration/valk/profile.go b/integration/valk/profile.go index f1a8600..7d4edb4 100644 --- a/integration/valk/profile.go +++ b/integration/valk/profile.go @@ -42,24 +42,24 @@ type ProfileOmit struct { } type ProfileSelectQuery interface { - GetRelationParams() (*ProfileSelect, *ProfileOmit, QueryParams) + GetRelationParams() (*ProfileSelect, *ProfileOmit, QueryParams[Profile]) } -func (s *ProfileSelect) GetRelationParams() (*ProfileSelect, *ProfileOmit, QueryParams) { - return s, nil, QueryParams{} +func (s *ProfileSelect) GetRelationParams() (*ProfileSelect, *ProfileOmit, QueryParams[Profile]) { + return s, nil, QueryParams[Profile]{} } // ProfileQueryBuilder builds a query for the relation Profile type ProfileQueryBuilder struct { selects *ProfileSelect omits *ProfileOmit - where []Predicate + where []PredicateOf[Profile] take *int skip *int orderBy []OrderBy } -func (b *ProfileQueryBuilder) Where(preds ...Predicate) *ProfileQueryBuilder { +func (b *ProfileQueryBuilder) Where(preds ...PredicateOf[Profile]) *ProfileQueryBuilder { b.where = append(b.where, preds...) return b } @@ -89,11 +89,11 @@ func (b *ProfileQueryBuilder) Omit(o ProfileOmit) *ProfileQueryBuilder { return b } -func (b *ProfileQueryBuilder) GetRelationParams() (*ProfileSelect, *ProfileOmit, QueryParams) { +func (b *ProfileQueryBuilder) GetRelationParams() (*ProfileSelect, *ProfileOmit, QueryParams[Profile]) { if b == nil { - return nil, nil, QueryParams{} + return nil, nil, QueryParams[Profile]{} } - return b.selects, b.omits, QueryParams{ + return b.selects, b.omits, QueryParams[Profile]{ Where: b.where, Take: b.take, Skip: b.skip, @@ -443,7 +443,7 @@ func (q *Queries) executeProfileCreateManyAndReturn(ctx context.Context, records } return results, nil } -func (d *ProfileDelegate) FindUnique(where UniquePredicate, additional ...Predicate) *FindUniqueBuilder[Profile, ProfileSelect, ProfileOmit] { +func (d *ProfileDelegate) FindUnique(where UniquePredicate[Profile], additional ...PredicateOf[Profile]) *FindUniqueBuilder[Profile, ProfileSelect, ProfileOmit] { return &FindUniqueBuilder[Profile, ProfileSelect, ProfileOmit]{ client: d.client, where: where, @@ -452,7 +452,7 @@ func (d *ProfileDelegate) FindUnique(where UniquePredicate, additional ...Predic } } -func (d *ProfileDelegate) FindFirst(preds ...Predicate) *FindFirstBuilder[Profile, ProfileSelect, ProfileOmit] { +func (d *ProfileDelegate) FindFirst(preds ...PredicateOf[Profile]) *FindFirstBuilder[Profile, ProfileSelect, ProfileOmit] { return &FindFirstBuilder[Profile, ProfileSelect, ProfileOmit]{ client: d.client, where: preds, @@ -460,7 +460,7 @@ func (d *ProfileDelegate) FindFirst(preds ...Predicate) *FindFirstBuilder[Profil } } -func (d *ProfileDelegate) FindMany(preds ...Predicate) *FindManyBuilder[Profile, ProfileSelect, ProfileOmit] { +func (d *ProfileDelegate) FindMany(preds ...PredicateOf[Profile]) *FindManyBuilder[Profile, ProfileSelect, ProfileOmit] { return &FindManyBuilder[Profile, ProfileSelect, ProfileOmit]{ client: d.client, where: preds, @@ -468,10 +468,7 @@ func (d *ProfileDelegate) FindMany(preds ...Predicate) *FindManyBuilder[Profile, } } -func (q *Queries) executeProfileFindUnique(ctx context.Context, where UniquePredicate, additional []Predicate, selects *ProfileSelect, omits *ProfileOmit) (*Profile, error) { - if where == nil { - return nil, fmt.Errorf("at least one unique field must be set for FindUnique") - } +func (q *Queries) executeProfileFindUnique(ctx context.Context, where UniquePredicate[Profile], additional []PredicateOf[Profile], selects *ProfileSelect, omits *ProfileOmit) (*Profile, error) { if err := where.Validate(); err != nil { return nil, err } @@ -482,7 +479,7 @@ func (q *Queries) executeProfileFindUnique(ctx context.Context, where UniquePred } } } - allPreds := append([]Predicate{where}, additional...) + allPreds := append([]PredicateOf[Profile]{where}, additional...) whereClause, vals := CompilePredicates(q.dialect, allPreds) if whereClause != "" { whereClause = " WHERE " + whereClause @@ -500,7 +497,7 @@ func (q *Queries) executeProfileFindUnique(ctx context.Context, where UniquePred func (q *Queries) executeProfileFindFirst( ctx context.Context, - params QueryParams, + params QueryParams[Profile], selects *ProfileSelect, omits *ProfileOmit, ) (*Profile, error) { @@ -528,7 +525,7 @@ func (q *Queries) executeProfileFindFirst( func (q *Queries) executeProfileFindMany( ctx context.Context, - params QueryParams, + params QueryParams[Profile], selects *ProfileSelect, omits *ProfileOmit, ) ([]*Profile, error) { diff --git a/integration/valk/profile/profile.go b/integration/valk/profile/profile.go index 6fcdd67..236d8d2 100644 --- a/integration/valk/profile/profile.go +++ b/integration/valk/profile/profile.go @@ -1,24 +1,10 @@ package profile import ( - "fmt" "integration/valk" "time" ) -type UniquePredicate struct { - valk.StandardPredicate -} - -func (UniquePredicate) IsUnique() {} - -func (p UniquePredicate) Validate() error { - if p.StandardPredicate.Data.Column == "" && len(p.StandardPredicate.Data.Children) == 0 { - return fmt.Errorf("at least one unique field must be set for FindUnique") - } - return p.StandardPredicate.Validate() -} - type Select = valk.ProfileSelect type Omit = valk.ProfileOmit type QueryBuilder = valk.ProfileQueryBuilder @@ -32,22 +18,22 @@ func Record(assignments ...valk.FieldAssignment) valk.RecordInput { return valk.RecordInput{Assignments: assignments} } -func And(preds ...valk.Predicate) valk.Predicate { +func And(preds ...valk.PredicateOf[valk.Profile]) valk.PredicateOf[valk.Profile] { return valk.And(preds...) } -func Or(preds ...valk.Predicate) valk.Predicate { +func Or(preds ...valk.PredicateOf[valk.Profile]) valk.PredicateOf[valk.Profile] { return valk.Or(preds...) } -func Not(pred valk.Predicate) valk.Predicate { +func Not(pred valk.PredicateOf[valk.Profile]) valk.PredicateOf[valk.Profile] { return valk.Not(pred) } -var Id = valk.StringUniqueField{Column: "id"} +var Id = valk.StringUniqueField[valk.Profile]{Column: "id"} -var Bio = valk.StringField{Column: "bio"} +var Bio = valk.StringField[valk.Profile]{Column: "bio"} -var UserId = valk.StringUniqueField{Column: "userId"} +var UserId = valk.StringUniqueField[valk.Profile]{Column: "userId"} -var CreatedAt = valk.Field[time.Time]{Column: "createdAt"} +var CreatedAt = valk.Field[valk.Profile, time.Time]{Column: "createdAt"} diff --git a/integration/valk/user.go b/integration/valk/user.go index 666e395..61517fc 100644 --- a/integration/valk/user.go +++ b/integration/valk/user.go @@ -61,24 +61,24 @@ type UserOmit struct { } type UserSelectQuery interface { - GetRelationParams() (*UserSelect, *UserOmit, QueryParams) + GetRelationParams() (*UserSelect, *UserOmit, QueryParams[User]) } -func (s *UserSelect) GetRelationParams() (*UserSelect, *UserOmit, QueryParams) { - return s, nil, QueryParams{} +func (s *UserSelect) GetRelationParams() (*UserSelect, *UserOmit, QueryParams[User]) { + return s, nil, QueryParams[User]{} } // UserQueryBuilder builds a query for the relation User type UserQueryBuilder struct { selects *UserSelect omits *UserOmit - where []Predicate + where []PredicateOf[User] take *int skip *int orderBy []OrderBy } -func (b *UserQueryBuilder) Where(preds ...Predicate) *UserQueryBuilder { +func (b *UserQueryBuilder) Where(preds ...PredicateOf[User]) *UserQueryBuilder { b.where = append(b.where, preds...) return b } @@ -108,11 +108,11 @@ func (b *UserQueryBuilder) Omit(o UserOmit) *UserQueryBuilder { return b } -func (b *UserQueryBuilder) GetRelationParams() (*UserSelect, *UserOmit, QueryParams) { +func (b *UserQueryBuilder) GetRelationParams() (*UserSelect, *UserOmit, QueryParams[User]) { if b == nil { - return nil, nil, QueryParams{} + return nil, nil, QueryParams[User]{} } - return b.selects, b.omits, QueryParams{ + return b.selects, b.omits, QueryParams[User]{ Where: b.where, Take: b.take, Skip: b.skip, @@ -533,7 +533,7 @@ func (q *Queries) executeUserCreateManyAndReturn(ctx context.Context, records [] } return results, nil } -func (d *UserDelegate) FindUnique(where UniquePredicate, additional ...Predicate) *FindUniqueBuilder[User, UserSelect, UserOmit] { +func (d *UserDelegate) FindUnique(where UniquePredicate[User], additional ...PredicateOf[User]) *FindUniqueBuilder[User, UserSelect, UserOmit] { return &FindUniqueBuilder[User, UserSelect, UserOmit]{ client: d.client, where: where, @@ -542,7 +542,7 @@ func (d *UserDelegate) FindUnique(where UniquePredicate, additional ...Predicate } } -func (d *UserDelegate) FindFirst(preds ...Predicate) *FindFirstBuilder[User, UserSelect, UserOmit] { +func (d *UserDelegate) FindFirst(preds ...PredicateOf[User]) *FindFirstBuilder[User, UserSelect, UserOmit] { return &FindFirstBuilder[User, UserSelect, UserOmit]{ client: d.client, where: preds, @@ -550,7 +550,7 @@ func (d *UserDelegate) FindFirst(preds ...Predicate) *FindFirstBuilder[User, Use } } -func (d *UserDelegate) FindMany(preds ...Predicate) *FindManyBuilder[User, UserSelect, UserOmit] { +func (d *UserDelegate) FindMany(preds ...PredicateOf[User]) *FindManyBuilder[User, UserSelect, UserOmit] { return &FindManyBuilder[User, UserSelect, UserOmit]{ client: d.client, where: preds, @@ -558,10 +558,7 @@ func (d *UserDelegate) FindMany(preds ...Predicate) *FindManyBuilder[User, UserS } } -func (q *Queries) executeUserFindUnique(ctx context.Context, where UniquePredicate, additional []Predicate, selects *UserSelect, omits *UserOmit) (*User, error) { - if where == nil { - return nil, fmt.Errorf("at least one unique field must be set for FindUnique") - } +func (q *Queries) executeUserFindUnique(ctx context.Context, where UniquePredicate[User], additional []PredicateOf[User], selects *UserSelect, omits *UserOmit) (*User, error) { if err := where.Validate(); err != nil { return nil, err } @@ -572,7 +569,7 @@ func (q *Queries) executeUserFindUnique(ctx context.Context, where UniquePredica } } } - allPreds := append([]Predicate{where}, additional...) + allPreds := append([]PredicateOf[User]{where}, additional...) whereClause, vals := CompilePredicates(q.dialect, allPreds) if whereClause != "" { whereClause = " WHERE " + whereClause @@ -590,7 +587,7 @@ func (q *Queries) executeUserFindUnique(ctx context.Context, where UniquePredica func (q *Queries) executeUserFindFirst( ctx context.Context, - params QueryParams, + params QueryParams[User], selects *UserSelect, omits *UserOmit, ) (*User, error) { @@ -618,7 +615,7 @@ func (q *Queries) executeUserFindFirst( func (q *Queries) executeUserFindMany( ctx context.Context, - params QueryParams, + params QueryParams[User], selects *UserSelect, omits *UserOmit, ) ([]*User, error) { diff --git a/integration/valk/user/user.go b/integration/valk/user/user.go index 07fa367..d5ef9a0 100644 --- a/integration/valk/user/user.go +++ b/integration/valk/user/user.go @@ -1,23 +1,9 @@ package user import ( - "fmt" "integration/valk" ) -type UniquePredicate struct { - valk.StandardPredicate -} - -func (UniquePredicate) IsUnique() {} - -func (p UniquePredicate) Validate() error { - if p.StandardPredicate.Data.Column == "" && len(p.StandardPredicate.Data.Children) == 0 { - return fmt.Errorf("at least one unique field must be set for FindUnique") - } - return p.StandardPredicate.Validate() -} - type Select = valk.UserSelect type Omit = valk.UserOmit type QueryBuilder = valk.UserQueryBuilder @@ -31,52 +17,50 @@ func Record(assignments ...valk.FieldAssignment) valk.RecordInput { return valk.RecordInput{Assignments: assignments} } -func And(preds ...valk.Predicate) valk.Predicate { +func And(preds ...valk.PredicateOf[valk.User]) valk.PredicateOf[valk.User] { return valk.And(preds...) } -func Or(preds ...valk.Predicate) valk.Predicate { +func Or(preds ...valk.PredicateOf[valk.User]) valk.PredicateOf[valk.User] { return valk.Or(preds...) } -func Not(pred valk.Predicate) valk.Predicate { +func Not(pred valk.PredicateOf[valk.User]) valk.PredicateOf[valk.User] { return valk.Not(pred) } -var Id = valk.StringUniqueField{Column: "id"} +var Id = valk.StringUniqueField[valk.User]{Column: "id"} -var Email = valk.StringUniqueField{Column: "email"} +var Email = valk.StringUniqueField[valk.User]{Column: "email"} -var PhoneNum = valk.StringUniqueField{Column: "phoneNum"} +var PhoneNum = valk.StringUniqueField[valk.User]{Column: "phoneNum"} -var Password = valk.StringField{Column: "password"} +var Password = valk.StringField[valk.User]{Column: "password"} -var Role = valk.Field[valk.UserRoleType]{Column: "role"} +var Role = valk.Field[valk.User, valk.UserRoleType]{Column: "role"} -var RoleOptional = valk.Field[valk.UserRoleType]{Column: "roleOptional"} +var RoleOptional = valk.Field[valk.User, valk.UserRoleType]{Column: "roleOptional"} -var ReferredById = valk.StringField{Column: "referredById"} +var ReferredById = valk.StringField[valk.User]{Column: "referredById"} // Helper for compound unique constraint: emailPhone -func EmailPhoneUnique(email string, phoneNum string) UniquePredicate { - return UniquePredicate{ - StandardPredicate: valk.StandardPredicate{ - Data: valk.And( - valk.StandardPredicate{ - Data: valk.PredicateData{ - Column: "email", - Operator: "=", - Value: email, - }, +func EmailPhoneUnique(email string, phoneNum string) valk.UniquePredicate[valk.User] { + return valk.UniquePredicate[valk.User]{ + Data: valk.And[valk.User]( + valk.Predicate[valk.User]{ + Data: valk.PredicateData{ + Column: "email", + Operator: "=", + Value: email, }, - valk.StandardPredicate{ - Data: valk.PredicateData{ - Column: "phoneNum", - Operator: "=", - Value: phoneNum, - }, + }, + valk.Predicate[valk.User]{ + Data: valk.PredicateData{ + Column: "phoneNum", + Operator: "=", + Value: phoneNum, }, - ).ToPredicateData(), - }, + }, + ).ToPredicateData(), } }