From 7e0554bd6f3bd567d82af18da74355027f96d354 Mon Sep 17 00:00:00 2001 From: "John W. Carbone" Date: Tue, 20 Jun 2023 09:49:21 -0400 Subject: [PATCH 1/6] Start of work on where clause and filter --- internal/codegen/golang/query.go | 6 ++++- internal/codegen/golang/result.go | 19 +++++++++++--- .../golang/templates/pgx/queryCode.tmpl | 26 +++++++++++++++---- internal/plugin/codegen.pb.go | 2 ++ 4 files changed, 44 insertions(+), 9 deletions(-) diff --git a/internal/codegen/golang/query.go b/internal/codegen/golang/query.go index 0e553b64ff..b9a484e062 100644 --- a/internal/codegen/golang/query.go +++ b/internal/codegen/golang/query.go @@ -120,7 +120,9 @@ func (v QueryValue) Params() string { } else if !v.EmitStruct() && v.IsStruct() { out = append(out, toLowerCase(f.Name)) } else { - out = append(out, v.Name+"."+f.Name) + if !f.Column.IsFilter { + out = append(out, v.Name+"."+f.Name) + } } } } @@ -200,6 +202,8 @@ type Query struct { SourceName string Ret QueryValue Arg QueryValue + HasFilter bool + HasOrderBy bool // Used for :copyfrom Table *plugin.Identifier } diff --git a/internal/codegen/golang/result.go b/internal/codegen/golang/result.go index f5ecd124a1..08c5562588 100644 --- a/internal/codegen/golang/result.go +++ b/internal/codegen/golang/result.go @@ -109,7 +109,8 @@ func buildStructs(req *plugin.CodeGenRequest) []Struct { } type goColumn struct { - id int + id int + IsFilter bool *plugin.Column embed *goEmbed } @@ -223,12 +224,22 @@ func buildQueries(req *plugin.CodeGenRequest, structs []Struct) ([]Query, error) } } else if len(query.Params) >= 1 { var cols []goColumn + var isFilter bool + for _, p := range query.Params { + isFilter = false + if p.Column.Name == "filter" && p.Column.Table == nil { + fmt.Println("Filter found") + gq.HasFilter = true + isFilter = true + } cols = append(cols, goColumn{ - id: int(p.Number), - Column: p.Column, + id: int(p.Number), + IsFilter: isFilter, + Column: p.Column, }) } + s, err := columnsToStruct(req, gq.MethodName+"Params", cols, false) if err != nil { return nil, err @@ -378,6 +389,8 @@ func columnsToStruct(req *plugin.CodeGenRequest, name string, columns []goColumn Tags: tags, Column: c.Column, } + f.Column.IsFilter = c.IsFilter + f.Column.IsOrderBy = c.IsOrderBy if c.embed == nil { f.Type = goType(req, c.Column) } else { diff --git a/internal/codegen/golang/templates/pgx/queryCode.tmpl b/internal/codegen/golang/templates/pgx/queryCode.tmpl index 1736fa11f7..497a94d5c6 100644 --- a/internal/codegen/golang/templates/pgx/queryCode.tmpl +++ b/internal/codegen/golang/templates/pgx/queryCode.tmpl @@ -28,10 +28,18 @@ type {{.Ret.Type}} struct { {{- range .Ret.Struct.Fields}} {{end -}} {{- if $.EmitMethodsWithDBArgument -}} func (q *Queries) {{.MethodName}}(ctx context.Context, db DBTX, {{.Arg.Pair}}) ({{.Ret.DefineType}}, error) { - row := db.QueryRow(ctx, {{.ConstantName}}, {{.Arg.Params}}) + sql := {{.ConstantName}} +{{ if .HasFilter -}} + sql = strings.Replace(sql, "@filter::text", arg.Filter, -1) +{{- end}} + row := db.QueryRow(ctx, sql, {{.Arg.Params}}) {{- else -}} func (q *Queries) {{.MethodName}}(ctx context.Context, {{.Arg.Pair}}) ({{.Ret.DefineType}}, error) { - row := q.db.QueryRow(ctx, {{.ConstantName}}, {{.Arg.Params}}) + sql := {{.ConstantName}} +{{ if .HasFilter -}} + sql = strings.Replace(sql, "@filter::text", arg.Filter, -1) +{{- end}} + row := q.db.QueryRow(ctx, sql, {{.Arg.Params}}) {{- end}} {{- if ne .Arg.Pair .Ret.Pair }} var {{.Ret.Name}} {{.Ret.Type}} @@ -46,10 +54,18 @@ func (q *Queries) {{.MethodName}}(ctx context.Context, {{.Arg.Pair}}) ({{.Ret.De {{end -}} {{- if $.EmitMethodsWithDBArgument -}} func (q *Queries) {{.MethodName}}(ctx context.Context, db DBTX, {{.Arg.Pair}}) ([]{{.Ret.DefineType}}, error) { - rows, err := db.Query(ctx, {{.ConstantName}}, {{.Arg.Params}}) + sql := {{.ConstantName}} +{{ if .HasFilter -}} + sql = strings.Replace(sql, "@filter::text", arg.Filter, -1) +{{- end}} + rows, err := db.Query(ctx, sql, {{.Arg.Params}}) {{- else -}} -func (q *Queries) {{.MethodName}}(ctx context.Context, {{.Arg.Pair}}) ([]{{.Ret.DefineType}}, error) { - rows, err := q.db.Query(ctx, {{.ConstantName}}, {{.Arg.Params}}) +func (q *Queries) {{.MethodName}}XXX(ctx context.Context, {{.Arg.Pair}}) ([]{{.Ret.DefineType}}, error) { + sql := {{.ConstantName}} +{{ if .HasFilter -}} + sql = strings.Replace(sql, "@filter::text", arg.Filter, -1) +{{- end}} + rows, err := q.db.Query(ctx, sql, {{.Arg.Params}}) {{- end}} if err != nil { return nil, err diff --git a/internal/plugin/codegen.pb.go b/internal/plugin/codegen.pb.go index cd1caa0e31..0bdc0153a3 100644 --- a/internal/plugin/codegen.pb.go +++ b/internal/plugin/codegen.pb.go @@ -1154,6 +1154,8 @@ type Column struct { EmbedTable *Identifier `protobuf:"bytes,14,opt,name=embed_table,json=embedTable,proto3" json:"embed_table,omitempty"` OriginalName string `protobuf:"bytes,15,opt,name=original_name,json=originalName,proto3" json:"original_name,omitempty"` Unsigned bool `protobuf:"varint,16,opt,name=unsigned,proto3" json:"unsigned,omitempty"` + IsFilter bool `protobuf:"varint,17,opt,name=is_filter,proto3" json:"is_filter,omitempty"` + IsOrderBy bool `protobuf:"varint,18,opt,name=is_order_by,proto3" json:"is_order_by,omitempty"` } func (x *Column) Reset() { From 28d8f95be9166997169c3ae191c1cb5417783007 Mon Sep 17 00:00:00 2001 From: "John W. Carbone" Date: Tue, 20 Jun 2023 10:08:29 -0400 Subject: [PATCH 2/6] Add OrderBy code --- internal/codegen/golang/query.go | 2 +- internal/codegen/golang/result.go | 19 ++++++++++++++----- .../golang/templates/pgx/queryCode.tmpl | 12 ++++++++++++ 3 files changed, 27 insertions(+), 6 deletions(-) diff --git a/internal/codegen/golang/query.go b/internal/codegen/golang/query.go index b9a484e062..8168df492d 100644 --- a/internal/codegen/golang/query.go +++ b/internal/codegen/golang/query.go @@ -120,7 +120,7 @@ func (v QueryValue) Params() string { } else if !v.EmitStruct() && v.IsStruct() { out = append(out, toLowerCase(f.Name)) } else { - if !f.Column.IsFilter { + if !f.Column.IsFilter && !f.Column.IsOrderBy { out = append(out, v.Name+"."+f.Name) } } diff --git a/internal/codegen/golang/result.go b/internal/codegen/golang/result.go index 08c5562588..8fde253f52 100644 --- a/internal/codegen/golang/result.go +++ b/internal/codegen/golang/result.go @@ -109,8 +109,9 @@ func buildStructs(req *plugin.CodeGenRequest) []Struct { } type goColumn struct { - id int - IsFilter bool + id int + IsFilter bool + IsOrderBy bool *plugin.Column embed *goEmbed } @@ -225,18 +226,26 @@ func buildQueries(req *plugin.CodeGenRequest, structs []Struct) ([]Query, error) } else if len(query.Params) >= 1 { var cols []goColumn var isFilter bool + var isOrderBy bool for _, p := range query.Params { isFilter = false + isOrderBy = false if p.Column.Name == "filter" && p.Column.Table == nil { fmt.Println("Filter found") gq.HasFilter = true isFilter = true } + if p.Column.Name == "orderby" && p.Column.Table == nil { + fmt.Println("OrderBy found") + gq.HasOrderBy = true + isOrderBy = true + } cols = append(cols, goColumn{ - id: int(p.Number), - IsFilter: isFilter, - Column: p.Column, + id: int(p.Number), + IsFilter: isFilter, + IsOrderBy: isOrderBy, + Column: p.Column, }) } diff --git a/internal/codegen/golang/templates/pgx/queryCode.tmpl b/internal/codegen/golang/templates/pgx/queryCode.tmpl index 497a94d5c6..1703b60e49 100644 --- a/internal/codegen/golang/templates/pgx/queryCode.tmpl +++ b/internal/codegen/golang/templates/pgx/queryCode.tmpl @@ -31,6 +31,9 @@ func (q *Queries) {{.MethodName}}(ctx context.Context, db DBTX, {{.Arg.Pair}}) ( sql := {{.ConstantName}} {{ if .HasFilter -}} sql = strings.Replace(sql, "@filter::text", arg.Filter, -1) +{{- end}} +{{ if .HasOrderBy -}} + sql = strings.Replace(sql, "@orderby::text", arg.Filter, -1) {{- end}} row := db.QueryRow(ctx, sql, {{.Arg.Params}}) {{- else -}} @@ -38,6 +41,9 @@ func (q *Queries) {{.MethodName}}(ctx context.Context, {{.Arg.Pair}}) ({{.Ret.De sql := {{.ConstantName}} {{ if .HasFilter -}} sql = strings.Replace(sql, "@filter::text", arg.Filter, -1) +{{- end}} +{{ if .HasOrderBy -}} + sql = strings.Replace(sql, "@orderby::text", arg.Filter, -1) {{- end}} row := q.db.QueryRow(ctx, sql, {{.Arg.Params}}) {{- end}} @@ -57,6 +63,9 @@ func (q *Queries) {{.MethodName}}(ctx context.Context, db DBTX, {{.Arg.Pair}}) ( sql := {{.ConstantName}} {{ if .HasFilter -}} sql = strings.Replace(sql, "@filter::text", arg.Filter, -1) +{{- end}} +{{ if .HasOrderBy -}} + sql = strings.Replace(sql, "@orderby::text", arg.Filter, -1) {{- end}} rows, err := db.Query(ctx, sql, {{.Arg.Params}}) {{- else -}} @@ -64,6 +73,9 @@ func (q *Queries) {{.MethodName}}XXX(ctx context.Context, {{.Arg.Pair}}) ([]{{.R sql := {{.ConstantName}} {{ if .HasFilter -}} sql = strings.Replace(sql, "@filter::text", arg.Filter, -1) +{{- end}} +{{ if .HasOrderBy -}} + sql = strings.Replace(sql, "@orderby::text", arg.Filter, -1) {{- end}} rows, err := q.db.Query(ctx, sql, {{.Arg.Params}}) {{- end}} From d67e1eb4b0d0a8b7139adee47b8afcf9ebeaa541 Mon Sep 17 00:00:00 2001 From: "John W. Carbone" Date: Tue, 20 Jun 2023 12:38:38 -0400 Subject: [PATCH 3/6] Change from named to numbered parameters --- internal/codegen/golang/query.go | 24 ++++++------ internal/codegen/golang/result.go | 37 +++++++++---------- .../golang/templates/pgx/queryCode.tmpl | 32 ++++++++-------- internal/plugin/codegen.pb.go | 4 +- 4 files changed, 48 insertions(+), 49 deletions(-) diff --git a/internal/codegen/golang/query.go b/internal/codegen/golang/query.go index 8168df492d..53b4e16a55 100644 --- a/internal/codegen/golang/query.go +++ b/internal/codegen/golang/query.go @@ -120,7 +120,7 @@ func (v QueryValue) Params() string { } else if !v.EmitStruct() && v.IsStruct() { out = append(out, toLowerCase(f.Name)) } else { - if !f.Column.IsFilter && !f.Column.IsOrderBy { + if f.Column.FilterNumber == 0 && f.Column.OrderByNumber == 0 { out = append(out, v.Name+"."+f.Name) } } @@ -193,17 +193,17 @@ func (v QueryValue) Scan() string { // A struct used to generate methods and fields on the Queries struct type Query struct { - Cmd string - Comments []string - MethodName string - FieldName string - ConstantName string - SQL string - SourceName string - Ret QueryValue - Arg QueryValue - HasFilter bool - HasOrderBy bool + Cmd string + Comments []string + MethodName string + FieldName string + ConstantName string + SQL string + SourceName string + Ret QueryValue + Arg QueryValue + FilterNumber int + OrderByNumber int // Used for :copyfrom Table *plugin.Identifier } diff --git a/internal/codegen/golang/result.go b/internal/codegen/golang/result.go index 8fde253f52..ae48a24228 100644 --- a/internal/codegen/golang/result.go +++ b/internal/codegen/golang/result.go @@ -109,9 +109,9 @@ func buildStructs(req *plugin.CodeGenRequest) []Struct { } type goColumn struct { - id int - IsFilter bool - IsOrderBy bool + id int + FilterNumber int + OrderByNumber int *plugin.Column embed *goEmbed } @@ -225,27 +225,26 @@ func buildQueries(req *plugin.CodeGenRequest, structs []Struct) ([]Query, error) } } else if len(query.Params) >= 1 { var cols []goColumn - var isFilter bool - var isOrderBy bool + var filterNumber int + var orderByNumber int for _, p := range query.Params { - isFilter = false - isOrderBy = false + number := int(p.Number) if p.Column.Name == "filter" && p.Column.Table == nil { - fmt.Println("Filter found") - gq.HasFilter = true - isFilter = true + fmt.Println("Filter found:", number) + gq.FilterNumber = number + filterNumber = number } if p.Column.Name == "orderby" && p.Column.Table == nil { - fmt.Println("OrderBy found") - gq.HasOrderBy = true - isOrderBy = true + fmt.Println("OrderBy found:", p.Number) + gq.OrderByNumber = number + orderByNumber = number } cols = append(cols, goColumn{ - id: int(p.Number), - IsFilter: isFilter, - IsOrderBy: isOrderBy, - Column: p.Column, + id: int(p.Number), + FilterNumber: filterNumber, + OrderByNumber: orderByNumber, + Column: p.Column, }) } @@ -398,8 +397,8 @@ func columnsToStruct(req *plugin.CodeGenRequest, name string, columns []goColumn Tags: tags, Column: c.Column, } - f.Column.IsFilter = c.IsFilter - f.Column.IsOrderBy = c.IsOrderBy + f.Column.FilterNumber = c.FilterNumber + f.Column.OrderByNumber = c.OrderByNumber if c.embed == nil { f.Type = goType(req, c.Column) } else { diff --git a/internal/codegen/golang/templates/pgx/queryCode.tmpl b/internal/codegen/golang/templates/pgx/queryCode.tmpl index 1703b60e49..1bff89ccf8 100644 --- a/internal/codegen/golang/templates/pgx/queryCode.tmpl +++ b/internal/codegen/golang/templates/pgx/queryCode.tmpl @@ -29,21 +29,21 @@ type {{.Ret.Type}} struct { {{- range .Ret.Struct.Fields}} {{- if $.EmitMethodsWithDBArgument -}} func (q *Queries) {{.MethodName}}(ctx context.Context, db DBTX, {{.Arg.Pair}}) ({{.Ret.DefineType}}, error) { sql := {{.ConstantName}} -{{ if .HasFilter -}} - sql = strings.Replace(sql, "@filter::text", arg.Filter, -1) +{{ if (gt .FilterNumber 0) -}} + sql = strings.Replace(sql, "${{.FilterNumber}}::text", arg.Filter, -1) {{- end}} -{{ if .HasOrderBy -}} - sql = strings.Replace(sql, "@orderby::text", arg.Filter, -1) +{{ if (gt .OrderByNumber 0) -}} + sql = strings.Replace(sql, "${{.OrderByNumber}}::text", arg.Orderby, -1) {{- end}} row := db.QueryRow(ctx, sql, {{.Arg.Params}}) {{- else -}} func (q *Queries) {{.MethodName}}(ctx context.Context, {{.Arg.Pair}}) ({{.Ret.DefineType}}, error) { sql := {{.ConstantName}} -{{ if .HasFilter -}} - sql = strings.Replace(sql, "@filter::text", arg.Filter, -1) +{{ if (gt .FilterNumber 0) -}} + sql = strings.Replace(sql, "${{.FilterNumber}}::text", arg.Filter, -1) {{- end}} -{{ if .HasOrderBy -}} - sql = strings.Replace(sql, "@orderby::text", arg.Filter, -1) +{{ if (gt .OrderByNumber 0) -}} + sql = strings.Replace(sql, "${{.OrderByNumber}}::text", arg.Orderby, -1) {{- end}} row := q.db.QueryRow(ctx, sql, {{.Arg.Params}}) {{- end}} @@ -61,21 +61,21 @@ func (q *Queries) {{.MethodName}}(ctx context.Context, {{.Arg.Pair}}) ({{.Ret.De {{- if $.EmitMethodsWithDBArgument -}} func (q *Queries) {{.MethodName}}(ctx context.Context, db DBTX, {{.Arg.Pair}}) ([]{{.Ret.DefineType}}, error) { sql := {{.ConstantName}} -{{ if .HasFilter -}} - sql = strings.Replace(sql, "@filter::text", arg.Filter, -1) +{{ if (gt .FilterNumber 0) -}} + sql = strings.Replace(sql, "${{.FilterNumber}}::text", arg.Filter, -1) {{- end}} -{{ if .HasOrderBy -}} - sql = strings.Replace(sql, "@orderby::text", arg.Filter, -1) +{{ if (gt .OrderByNumber 0) -}} + sql = strings.Replace(sql, "${{.OrderByNumber}}::text", arg.Orderby, -1) {{- end}} rows, err := db.Query(ctx, sql, {{.Arg.Params}}) {{- else -}} func (q *Queries) {{.MethodName}}XXX(ctx context.Context, {{.Arg.Pair}}) ([]{{.Ret.DefineType}}, error) { sql := {{.ConstantName}} -{{ if .HasFilter -}} - sql = strings.Replace(sql, "@filter::text", arg.Filter, -1) +{{ if (gt .FilterNumber 0) -}} + sql = strings.Replace(sql, "${{.FilterNumber}}::text", arg.Filter, -1) {{- end}} -{{ if .HasOrderBy -}} - sql = strings.Replace(sql, "@orderby::text", arg.Filter, -1) +{{ if (gt .OrderByNumber 0) -}} + sql = strings.Replace(sql, "${{.OrderByNumber}}::text", arg.Orderby, -1) {{- end}} rows, err := q.db.Query(ctx, sql, {{.Arg.Params}}) {{- end}} diff --git a/internal/plugin/codegen.pb.go b/internal/plugin/codegen.pb.go index 0bdc0153a3..c1161999ac 100644 --- a/internal/plugin/codegen.pb.go +++ b/internal/plugin/codegen.pb.go @@ -1154,8 +1154,8 @@ type Column struct { EmbedTable *Identifier `protobuf:"bytes,14,opt,name=embed_table,json=embedTable,proto3" json:"embed_table,omitempty"` OriginalName string `protobuf:"bytes,15,opt,name=original_name,json=originalName,proto3" json:"original_name,omitempty"` Unsigned bool `protobuf:"varint,16,opt,name=unsigned,proto3" json:"unsigned,omitempty"` - IsFilter bool `protobuf:"varint,17,opt,name=is_filter,proto3" json:"is_filter,omitempty"` - IsOrderBy bool `protobuf:"varint,18,opt,name=is_order_by,proto3" json:"is_order_by,omitempty"` + FilterNumber int `protobuf:"varint,17,opt,name=filter_number,proto3" json:"filter_number,omitempty"` + OrderByNumber int `protobuf:"varint,18,opt,name=order_by_number,proto3" json:"order_by_number,omitempty"` } func (x *Column) Reset() { From 0a8df64ad33e33fb45e4bfc0abc95cc01b248697 Mon Sep 17 00:00:00 2001 From: "John W. Carbone" Date: Tue, 20 Jun 2023 12:44:00 -0400 Subject: [PATCH 4/6] Remove debugging code --- internal/codegen/golang/result.go | 2 -- 1 file changed, 2 deletions(-) diff --git a/internal/codegen/golang/result.go b/internal/codegen/golang/result.go index ae48a24228..167d735663 100644 --- a/internal/codegen/golang/result.go +++ b/internal/codegen/golang/result.go @@ -231,12 +231,10 @@ func buildQueries(req *plugin.CodeGenRequest, structs []Struct) ([]Query, error) for _, p := range query.Params { number := int(p.Number) if p.Column.Name == "filter" && p.Column.Table == nil { - fmt.Println("Filter found:", number) gq.FilterNumber = number filterNumber = number } if p.Column.Name == "orderby" && p.Column.Table == nil { - fmt.Println("OrderBy found:", p.Number) gq.OrderByNumber = number orderByNumber = number } From 519d62394f4c459172a80ed0ec952509a0657a7d Mon Sep 17 00:00:00 2001 From: "John W. Carbone" Date: Tue, 20 Jun 2023 14:01:02 -0400 Subject: [PATCH 5/6] Removed development landmark indicator --- internal/codegen/golang/templates/pgx/queryCode.tmpl | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/internal/codegen/golang/templates/pgx/queryCode.tmpl b/internal/codegen/golang/templates/pgx/queryCode.tmpl index 1bff89ccf8..3f6f96d66b 100644 --- a/internal/codegen/golang/templates/pgx/queryCode.tmpl +++ b/internal/codegen/golang/templates/pgx/queryCode.tmpl @@ -69,7 +69,7 @@ func (q *Queries) {{.MethodName}}(ctx context.Context, db DBTX, {{.Arg.Pair}}) ( {{- end}} rows, err := db.Query(ctx, sql, {{.Arg.Params}}) {{- else -}} -func (q *Queries) {{.MethodName}}XXX(ctx context.Context, {{.Arg.Pair}}) ([]{{.Ret.DefineType}}, error) { +func (q *Queries) {{.MethodName}}(ctx context.Context, {{.Arg.Pair}}) ([]{{.Ret.DefineType}}, error) { sql := {{.ConstantName}} {{ if (gt .FilterNumber 0) -}} sql = strings.Replace(sql, "${{.FilterNumber}}::text", arg.Filter, -1) From 3ac81c5ba8715be644a16ebc540fc8ad68739f93 Mon Sep 17 00:00:00 2001 From: "John W. Carbone" Date: Mon, 26 Jun 2023 23:57:02 -0400 Subject: [PATCH 6/6] Fixes to Dynamic Query --- internal/codegen/golang/query.go | 11 +++-- internal/codegen/golang/result.go | 42 +++++++++++++------ .../golang/templates/pgx/queryCode.tmpl | 42 +++++++------------ internal/plugin/codegen.pb.go | 3 +- 4 files changed, 53 insertions(+), 45 deletions(-) diff --git a/internal/codegen/golang/query.go b/internal/codegen/golang/query.go index 53b4e16a55..fe50ce1f5b 100644 --- a/internal/codegen/golang/query.go +++ b/internal/codegen/golang/query.go @@ -120,7 +120,7 @@ func (v QueryValue) Params() string { } else if !v.EmitStruct() && v.IsStruct() { out = append(out, toLowerCase(f.Name)) } else { - if f.Column.FilterNumber == 0 && f.Column.OrderByNumber == 0 { + if !f.Column.IsClause { out = append(out, v.Name+"."+f.Name) } } @@ -191,6 +191,11 @@ func (v QueryValue) Scan() string { return "\n" + strings.Join(out, ",\n") } +type QueryClause struct { + Position int + Name string +} + // A struct used to generate methods and fields on the Queries struct type Query struct { Cmd string @@ -202,8 +207,8 @@ type Query struct { SourceName string Ret QueryValue Arg QueryValue - FilterNumber int - OrderByNumber int + WhereClause *QueryClause + OrderbyClause *QueryClause // Used for :copyfrom Table *plugin.Identifier } diff --git a/internal/codegen/golang/result.go b/internal/codegen/golang/result.go index 167d735663..50a12a57f1 100644 --- a/internal/codegen/golang/result.go +++ b/internal/codegen/golang/result.go @@ -216,6 +216,21 @@ func buildQueries(req *plugin.CodeGenRequest, structs []Struct) ([]Query, error) if len(query.Params) == 1 && qpl != 0 { p := query.Params[0] + + if p.Column.Name == "filter" && p.Column.Table == nil { + p.Column.IsClause = true + gq.WhereClause = &QueryClause{ + Position: 1, + Name: "filter", + } + } + if p.Column.Name == "orderby" && p.Column.Table == nil { + p.Column.IsClause = true + gq.OrderbyClause = &QueryClause{ + Position: 1, + Name: "orderby", + } + } gq.Arg = QueryValue{ Name: paramName(p), DBName: p.Column.GetName(), @@ -223,26 +238,30 @@ func buildQueries(req *plugin.CodeGenRequest, structs []Struct) ([]Query, error) SQLDriver: sqlpkg, Column: p.Column, } + } else if len(query.Params) >= 1 { var cols []goColumn - var filterNumber int - var orderByNumber int for _, p := range query.Params { number := int(p.Number) + if p.Column.Name == "filter" && p.Column.Table == nil { - gq.FilterNumber = number - filterNumber = number + p.Column.IsClause = true + gq.WhereClause = &QueryClause{ + Position: number, + Name: "arg.Filter", + } } if p.Column.Name == "orderby" && p.Column.Table == nil { - gq.OrderByNumber = number - orderByNumber = number + p.Column.IsClause = true + gq.OrderbyClause = &QueryClause{ + Position: number, + Name: "arg.Orderby", + } } cols = append(cols, goColumn{ - id: int(p.Number), - FilterNumber: filterNumber, - OrderByNumber: orderByNumber, - Column: p.Column, + id: int(number), + Column: p.Column, }) } @@ -395,8 +414,7 @@ func columnsToStruct(req *plugin.CodeGenRequest, name string, columns []goColumn Tags: tags, Column: c.Column, } - f.Column.FilterNumber = c.FilterNumber - f.Column.OrderByNumber = c.OrderByNumber + //f.Column.IsClause = c.IsClause // TODO: Is this needed? if c.embed == nil { f.Type = goType(req, c.Column) } else { diff --git a/internal/codegen/golang/templates/pgx/queryCode.tmpl b/internal/codegen/golang/templates/pgx/queryCode.tmpl index 3f6f96d66b..12788a5017 100644 --- a/internal/codegen/golang/templates/pgx/queryCode.tmpl +++ b/internal/codegen/golang/templates/pgx/queryCode.tmpl @@ -28,23 +28,11 @@ type {{.Ret.Type}} struct { {{- range .Ret.Struct.Fields}} {{end -}} {{- if $.EmitMethodsWithDBArgument -}} func (q *Queries) {{.MethodName}}(ctx context.Context, db DBTX, {{.Arg.Pair}}) ({{.Ret.DefineType}}, error) { - sql := {{.ConstantName}} -{{ if (gt .FilterNumber 0) -}} - sql = strings.Replace(sql, "${{.FilterNumber}}::text", arg.Filter, -1) -{{- end}} -{{ if (gt .OrderByNumber 0) -}} - sql = strings.Replace(sql, "${{.OrderByNumber}}::text", arg.Orderby, -1) -{{- end}} +{{- template "makeSql" . -}} row := db.QueryRow(ctx, sql, {{.Arg.Params}}) {{- else -}} func (q *Queries) {{.MethodName}}(ctx context.Context, {{.Arg.Pair}}) ({{.Ret.DefineType}}, error) { - sql := {{.ConstantName}} -{{ if (gt .FilterNumber 0) -}} - sql = strings.Replace(sql, "${{.FilterNumber}}::text", arg.Filter, -1) -{{- end}} -{{ if (gt .OrderByNumber 0) -}} - sql = strings.Replace(sql, "${{.OrderByNumber}}::text", arg.Orderby, -1) -{{- end}} +{{- template "makeSql" . -}} row := q.db.QueryRow(ctx, sql, {{.Arg.Params}}) {{- end}} {{- if ne .Arg.Pair .Ret.Pair }} @@ -60,23 +48,11 @@ func (q *Queries) {{.MethodName}}(ctx context.Context, {{.Arg.Pair}}) ({{.Ret.De {{end -}} {{- if $.EmitMethodsWithDBArgument -}} func (q *Queries) {{.MethodName}}(ctx context.Context, db DBTX, {{.Arg.Pair}}) ([]{{.Ret.DefineType}}, error) { - sql := {{.ConstantName}} -{{ if (gt .FilterNumber 0) -}} - sql = strings.Replace(sql, "${{.FilterNumber}}::text", arg.Filter, -1) -{{- end}} -{{ if (gt .OrderByNumber 0) -}} - sql = strings.Replace(sql, "${{.OrderByNumber}}::text", arg.Orderby, -1) -{{- end}} +{{- template "makeSql" . -}} rows, err := db.Query(ctx, sql, {{.Arg.Params}}) {{- else -}} func (q *Queries) {{.MethodName}}(ctx context.Context, {{.Arg.Pair}}) ([]{{.Ret.DefineType}}, error) { - sql := {{.ConstantName}} -{{ if (gt .FilterNumber 0) -}} - sql = strings.Replace(sql, "${{.FilterNumber}}::text", arg.Filter, -1) -{{- end}} -{{ if (gt .OrderByNumber 0) -}} - sql = strings.Replace(sql, "${{.OrderByNumber}}::text", arg.Orderby, -1) -{{- end}} +{{- template "makeSql" . -}} rows, err := q.db.Query(ctx, sql, {{.Arg.Params}}) {{- end}} if err != nil { @@ -150,3 +126,13 @@ func (q *Queries) {{.MethodName}}(ctx context.Context, {{.Arg.Pair}}) (pgconn.Co {{end}} {{end}} {{end}} + +{{define "makeSql"}} + sql := {{.ConstantName}} +{{- if .WhereClause }} + sql = strings.Replace(sql, "${{.WhereClause.Position}}::text", {{.WhereClause.Name}}, -1) +{{- end }} +{{- if .OrderbyClause }} + sql = strings.Replace(sql, "${{.OrderbyClause.Position}}::text", {{.OrderbyClause.Name}}, -1) +{{- end }} +{{end}} \ No newline at end of file diff --git a/internal/plugin/codegen.pb.go b/internal/plugin/codegen.pb.go index c1161999ac..ace8181a9d 100644 --- a/internal/plugin/codegen.pb.go +++ b/internal/plugin/codegen.pb.go @@ -1154,8 +1154,7 @@ type Column struct { EmbedTable *Identifier `protobuf:"bytes,14,opt,name=embed_table,json=embedTable,proto3" json:"embed_table,omitempty"` OriginalName string `protobuf:"bytes,15,opt,name=original_name,json=originalName,proto3" json:"original_name,omitempty"` Unsigned bool `protobuf:"varint,16,opt,name=unsigned,proto3" json:"unsigned,omitempty"` - FilterNumber int `protobuf:"varint,17,opt,name=filter_number,proto3" json:"filter_number,omitempty"` - OrderByNumber int `protobuf:"varint,18,opt,name=order_by_number,proto3" json:"order_by_number,omitempty"` + IsClause bool `protobuf:"varint,17,opt,name=is_clause,proto3" json:"is_clause,omitempty"` } func (x *Column) Reset() {