Skip to content

Commit de9ede2

Browse files
committed
kotlin: fix enums, use List instead of Array
1 parent d17db0e commit de9ede2

File tree

1 file changed

+66
-57
lines changed

1 file changed

+66
-57
lines changed

internal/dinosql/kotlin/gen.go

Lines changed: 66 additions & 57 deletions
Original file line numberDiff line numberDiff line change
@@ -79,28 +79,60 @@ func (v KtQueryValue) Type() string {
7979
panic("no type for KtQueryValue: " + v.Name)
8080
}
8181

82+
func jdbcSet(t ktType, idx int, name string) string {
83+
if t.IsEnum && t.IsArray {
84+
return fmt.Sprintf(`stmt.setArray(%d, conn.createArrayOf("%s", %s.map { v -> v.value }.toTypedArray()))`, idx, t.DataType, name)
85+
}
86+
if t.IsEnum {
87+
return fmt.Sprintf("stmt.setObject(%d, %s.value, %s)", idx, name, "Types.OTHER")
88+
}
89+
if t.IsArray {
90+
return fmt.Sprintf(`stmt.setArray(%d, conn.createArrayOf("%s", %s.toTypedArray()))`, idx, t.DataType, name)
91+
}
92+
if t.IsTime() {
93+
return fmt.Sprintf("stmt.setObject(%d, %s)", idx, name)
94+
}
95+
return fmt.Sprintf("stmt.set%s(%d, %s)", t.Name, idx, name)
96+
}
97+
8298
func (v KtQueryValue) Params() string {
8399
if v.isEmpty() {
84100
return ""
85101
}
86102
var out []string
87103
if v.Struct == nil {
88-
out = append(out, fmt.Sprintf("stmt.%s(%d, %s)", v.Typ.jdbcSetter(), 1, v.Typ.jdbcValue(v.Name)))
104+
out = append(out, jdbcSet(v.Typ, 1, v.Name))
89105
} else {
90106
for i, f := range v.Struct.Fields {
91-
out = append(out, fmt.Sprintf("stmt.%s(%d, %s)", f.Type.jdbcSetter(), i+1, f.Type.jdbcValue(v.Name+"."+f.Name)))
107+
out = append(out, jdbcSet(f.Type, i+1, v.Name+"."+f.Name))
92108
}
93109
}
94110
return strings.Join(out, "\n ")
95111
}
96112

113+
func jdbcGet(t ktType, idx int) string {
114+
if t.IsEnum && t.IsArray {
115+
return fmt.Sprintf(`(results.getArray(%d).array as Array<String>).map { v -> %s.lookup(v)!! }.toList()`, idx, t.Name)
116+
}
117+
if t.IsEnum {
118+
return fmt.Sprintf("%s.lookup(results.getString(%d))!!", t.Name, idx)
119+
}
120+
if t.IsArray {
121+
return fmt.Sprintf(`(results.getArray(%d).array as Array<%s>).toList()`, idx, t.Name)
122+
}
123+
if t.IsTime() {
124+
return fmt.Sprintf(`results.getObject(%d, %s::class.java)`, idx, t.Name)
125+
}
126+
return fmt.Sprintf(`results.get%s(%d)`, t.Name, idx)
127+
}
128+
97129
func (v KtQueryValue) ResultSet() string {
98130
var out []string
99131
if v.Struct == nil {
100-
out = append(out, v.Typ.fromJDBCValue(fmt.Sprintf("%s.%s(%d)", v.Name, v.Typ.jdbcGetter(), 1)))
132+
out = append(out, jdbcGet(v.Typ, 1))
101133
} else {
102134
for i, f := range v.Struct.Fields {
103-
out = append(out, f.Type.fromJDBCValue(fmt.Sprintf("%s.%s(%d)", v.Name, f.Type.jdbcGetter(), i+1)))
135+
out = append(out, jdbcGet(f.Type, i+1))
104136
}
105137
}
106138
ret := strings.Join(out, ",\n ")
@@ -110,19 +142,6 @@ func (v KtQueryValue) ResultSet() string {
110142
return ret
111143
}
112144

113-
type KtQueryParam struct {
114-
Name string
115-
Typ string
116-
}
117-
118-
func (p KtQueryParam) Getter() string {
119-
return "get" + strings.TrimSuffix(p.Typ, "?")
120-
}
121-
122-
func (p KtQueryParam) Setter() string {
123-
return "set" + strings.TrimSuffix(p.Typ, "?")
124-
}
125-
126145
// A struct used to generate methods and fields on the Queries struct
127146
type KtQuery struct {
128147
ClassName string
@@ -279,6 +298,25 @@ func QueryKtImports(r KtGenerateable, settings dinosql.CombinedSettings, filenam
279298
return false
280299
}
281300

301+
hasEnum := func() bool {
302+
for _, q := range gq {
303+
if !q.Arg.isEmpty() {
304+
if q.Arg.IsStruct() {
305+
for _, f := range q.Arg.Struct.Fields {
306+
if f.Type.IsEnum {
307+
return true
308+
}
309+
}
310+
} else {
311+
if q.Arg.Typ.IsEnum {
312+
return true
313+
}
314+
}
315+
}
316+
}
317+
return false
318+
}
319+
282320
std := map[string]struct{}{
283321
"java.sql.Connection": {},
284322
"java.sql.SQLException": {},
@@ -295,6 +333,9 @@ func QueryKtImports(r KtGenerateable, settings dinosql.CombinedSettings, filenam
295333
if uses("OffsetDateTime") {
296334
std["java.time.OffsetDateTime"] = struct{}{}
297335
}
336+
if hasEnum() {
337+
std["java.sql.Types"] = struct{}{}
338+
}
298339

299340
pkg := make(map[string]struct{})
300341

@@ -422,7 +463,7 @@ type ktType struct {
422463
func (t ktType) String() string {
423464
v := t.Name
424465
if t.IsArray {
425-
v = fmt.Sprintf("Array<%s>", v)
466+
v = fmt.Sprintf("List<%s>", v)
426467
} else if t.IsNull {
427468
v += "?"
428469
}
@@ -433,18 +474,11 @@ func (t ktType) jdbcSetter() string {
433474
return "set" + t.jdbcType()
434475
}
435476

436-
func (t ktType) jdbcGetter() string {
437-
return "get" + t.jdbcType()
438-
}
439-
440477
func (t ktType) jdbcType() string {
441478
if t.IsArray {
442479
return "Array"
443480
}
444-
if t.IsEnum {
445-
return "String"
446-
}
447-
if t.IsTime() {
481+
if t.IsEnum || t.IsTime() {
448482
return "Object"
449483
}
450484
return t.Name
@@ -454,36 +488,6 @@ func (t ktType) IsTime() bool {
454488
return t.Name == "LocalDate" || t.Name == "LocalDateTime" || t.Name == "LocalTime" || t.Name == "OffsetDateTime"
455489
}
456490

457-
func (t ktType) jdbcValue(name string) string {
458-
if t.IsEnum && t.IsArray {
459-
return fmt.Sprintf(`conn.createArrayOf("%s", %s.map { v -> v.value }.toTypedArray())`, t.DataType, name)
460-
}
461-
if t.IsEnum {
462-
return name + ".value"
463-
}
464-
if t.IsArray {
465-
return fmt.Sprintf(`conn.createArrayOf("%s", %s)`, t.DataType, name)
466-
}
467-
return name
468-
}
469-
470-
func (t ktType) fromJDBCValue(expr string) string {
471-
if t.IsEnum && t.IsArray {
472-
return fmt.Sprintf(`(%s.array as Array<String>).map { v -> %s.valueOf(v) }.toTypedArray()`, expr, t.Name)
473-
}
474-
if t.IsEnum {
475-
return fmt.Sprintf("%s.valueOf(%s)", t.Name, expr)
476-
}
477-
if t.IsArray {
478-
return fmt.Sprintf(`%s.array as Array<%s>`, expr, t.Name)
479-
}
480-
if t.IsTime() {
481-
expr = strings.TrimSuffix(expr, ")")
482-
return fmt.Sprintf(`%s, %s::class.java)`, expr, t.Name)
483-
}
484-
return expr
485-
}
486-
487491
func (r Result) ktType(col core.Column, settings dinosql.CombinedSettings) ktType {
488492
typ, isEnum := r.ktInnerType(col, settings)
489493
return ktType{
@@ -777,7 +781,12 @@ enum class {{.Name}}(val value: String) {
777781
{{- range $i, $e := .Constants}}
778782
{{- if $i }},{{end}}
779783
{{.Name}}("{{.Value}}")
780-
{{- end}}
784+
{{- end}};
785+
786+
companion object {
787+
private val map = {{.Name}}.values().associateBy({{.Name}}::value)
788+
fun lookup(value: String) = map[value]
789+
}
781790
}
782791
{{end}}
783792

0 commit comments

Comments
 (0)