55 "encoding/json"
66 "errors"
77 "fmt"
8- "github.com/tandemdude/sqlc-gen-java/internal/inflection"
98 "regexp"
109 "slices"
1110 "strconv"
@@ -16,6 +15,7 @@ import (
1615 "github.com/sqlc-dev/plugin-sdk-go/sdk"
1716 "github.com/tandemdude/sqlc-gen-java/internal/codegen"
1817 "github.com/tandemdude/sqlc-gen-java/internal/core"
18+ "github.com/tandemdude/sqlc-gen-java/internal/inflection"
1919 "github.com/tandemdude/sqlc-gen-java/internal/sql_types"
2020)
2121
@@ -45,9 +45,8 @@ func fixQueryPlaceholders(engine, query string) (string, error) {
4545 return newQuery , nil
4646}
4747
48- func parseQueryReturn (tcf sql_types.TypeConversionFunc , col * plugin.Column ) (* core.QueryReturn , error ) {
49- name := strcase .ToCamel (col .Name )
50- javaType , err := tcf (col .Type )
48+ func parseQueryReturn (tcf sql_types.TypeConversionFunc , nullableHelpers * core.NullableHelpers , col * plugin.Column ) (* core.QueryReturn , error ) {
49+ strJavaType , err := tcf (col .Type )
5150 if err != nil {
5251 return nil , err
5352 }
@@ -56,14 +55,35 @@ func parseQueryReturn(tcf sql_types.TypeConversionFunc, col *plugin.Column) (*co
5655 return nil , fmt .Errorf ("multidimensional arrays are not supported, store JSON instead" )
5756 }
5857
58+ javaType := core.JavaType {
59+ SqlType : sdk .DataType (col .Type ),
60+ Type : strJavaType ,
61+ IsList : col .IsArray ,
62+ IsNullable : ! col .NotNull ,
63+ }
64+
65+ if javaType .IsNullable {
66+ if javaType .IsList {
67+ nullableHelpers .List = true
68+ } else {
69+ switch strJavaType {
70+ case "Integer" :
71+ nullableHelpers .Int = true
72+ case "Long" :
73+ nullableHelpers .Long = true
74+ case "Float" :
75+ nullableHelpers .Float = true
76+ case "Double" :
77+ nullableHelpers .Double = true
78+ case "Boolean" :
79+ nullableHelpers .Boolean = true
80+ }
81+ }
82+ }
83+
5984 return & core.QueryReturn {
60- Name : strcase .ToLowerCamel (name ),
61- JavaType : core.JavaType {
62- SqlType : sdk .DataType (col .Type ),
63- Type : javaType ,
64- IsList : col .IsArray ,
65- IsNullable : ! col .NotNull ,
66- },
85+ Name : strcase .ToLowerCamel (col .Name ),
86+ JavaType : javaType ,
6787 }, nil
6888}
6989
@@ -94,6 +114,7 @@ func Generate(ctx context.Context, req *plugin.GenerateRequest) (*plugin.Generat
94114
95115 var queries core.Queries = make (map [string ][]core.Query )
96116 var embeddedModels core.EmbeddedModels = make (map [string ][]core.QueryReturn )
117+ nullableHelpers := core.NullableHelpers {}
97118
98119 // parse the incoming generate request into our Queries type
99120 for _ , query := range req .Queries {
@@ -135,7 +156,7 @@ func Generate(ctx context.Context, req *plugin.GenerateRequest) (*plugin.Generat
135156 for _ , ret := range query .Columns {
136157 if ret .EmbedTable == nil {
137158 // normal types
138- qr , err := parseQueryReturn (typeConversionFunc , ret )
159+ qr , err := parseQueryReturn (typeConversionFunc , & nullableHelpers , ret )
139160 if err != nil {
140161 return nil , errors .Join (errors .New ("failed to parse query return column" ), err )
141162 }
@@ -179,7 +200,7 @@ func Generate(ctx context.Context, req *plugin.GenerateRequest) (*plugin.Generat
179200 if _ , ok := embeddedModels [modelName ]; ! ok {
180201 var modelParams []core.QueryReturn
181202 for _ , c := range table .Columns {
182- qr , err := parseQueryReturn (typeConversionFunc , c )
203+ qr , err := parseQueryReturn (typeConversionFunc , & nullableHelpers , c )
183204 if err != nil {
184205 return nil , errors .Join (errors .New ("failed to parse query return column" ), err )
185206 }
@@ -227,7 +248,7 @@ func Generate(ctx context.Context, req *plugin.GenerateRequest) (*plugin.Generat
227248 slices .SortFunc (queries [file ], func (a , b core.Query ) int { return strings .Compare (a .MethodName , b .MethodName ) })
228249
229250 // build the queries file contents
230- fileName , fileContents , err := codegen .BuildQueriesFile (conf , file , queries [file ], embeddedModels )
251+ fileName , fileContents , err := codegen .BuildQueriesFile (conf , file , queries [file ], embeddedModels , nullableHelpers )
231252 if err != nil {
232253 return nil , err
233254 }
0 commit comments