diff --git a/generator/metadata/table_meta_data.go b/generator/metadata/table_meta_data.go index 1d56bc0..9533988 100644 --- a/generator/metadata/table_meta_data.go +++ b/generator/metadata/table_meta_data.go @@ -21,3 +21,16 @@ func (t Table) MutableColumns() []Column { return ret } + +// DefaultColumns returns list of columns with default values set for table +func (t Table) DefaultColumns() []Column { + var ret []Column + + for _, column := range t.Columns { + if column.HasDefault { + ret = append(ret, column) + } + } + + return ret +} diff --git a/generator/template/file_templates.go b/generator/template/file_templates.go index be3d2f6..03c5b83 100644 --- a/generator/template/file_templates.go +++ b/generator/template/file_templates.go @@ -33,6 +33,7 @@ type {{structImplName}} struct { AllColumns {{dialect.PackageName}}.ColumnList MutableColumns {{dialect.PackageName}}.ColumnList + DefaultColumns {{dialect.PackageName}}.ColumnList } type {{tableTemplate.TypeName}} struct { @@ -78,6 +79,7 @@ func new{{tableTemplate.TypeName}}Impl(schemaName, tableName, alias string) {{st {{- end}} allColumns = {{dialect.PackageName}}.ColumnList{ {{columnList .Columns}} } mutableColumns = {{dialect.PackageName}}.ColumnList{ {{columnList .MutableColumns}} } + defaultColumns = {{dialect.PackageName}}.ColumnList{ {{columnList .DefaultColumns}} } ) return {{structImplName}}{ @@ -93,6 +95,7 @@ func new{{tableTemplate.TypeName}}Impl(schemaName, tableName, alias string) {{st AllColumns: allColumns, MutableColumns: mutableColumns, + DefaultColumns: defaultColumns, } } ` diff --git a/generator/template/sql_builder_template.go b/generator/template/sql_builder_template.go index a72e8e9..cfd40aa 100644 --- a/generator/template/sql_builder_template.go +++ b/generator/template/sql_builder_template.go @@ -136,7 +136,7 @@ type TableSQLBuilderColumn struct { Type string } -var reservedKeywords = []string{"TableName", "Table", "SchemaName", "Alias", "AllColumns", "MutableColumns"} +var reservedKeywords = []string{"TableName", "Table", "SchemaName", "Alias", "AllColumns", "MutableColumns", "DefaultColumns"} func renameIfReserved(name string) string { if slices.Contains(reservedKeywords, name) { diff --git a/generator/template/sql_builder_template_test.go b/generator/template/sql_builder_template_test.go index 25834fc..b980a60 100644 --- a/generator/template/sql_builder_template_test.go +++ b/generator/template/sql_builder_template_test.go @@ -22,6 +22,7 @@ func TestColumnRenameReserved(t *testing.T) { {col: "Alias", want: "Alias_"}, {col: "AllColumns", want: "AllColumns_"}, {col: "MutableColumns", want: "MutableColumns_"}, + {col: "DefaultColumns", want: "DefaultColumns_"}, {col: "OtherColumn", want: "OtherColumn"}, } diff --git a/tests/Makefile b/tests/Makefile index 43a8d66..6ea27b6 100644 --- a/tests/Makefile +++ b/tests/Makefile @@ -14,7 +14,7 @@ checkout-latest-testdata: checkout-testdata # database with testdata retrieved in previous step. # On the first run this action might take couple of minutes. Docker temp data are stored in .docker directory. docker-compose-up: - docker-compose up + docker compose up init-all: go run ./init/init.go -testsuite all @@ -74,4 +74,4 @@ jet-gen-cockroach: # docker-compose-cleanup will stop and remove test containers, volumes, and images. cleanup: - docker-compose down --volumes + docker compose down --volumes diff --git a/tests/mysql/generator_test.go b/tests/mysql/generator_test.go index 2a915a5..55a2a1f 100644 --- a/tests/mysql/generator_test.go +++ b/tests/mysql/generator_test.go @@ -260,6 +260,7 @@ type linkTable struct { AllColumns mysql.ColumnList MutableColumns mysql.ColumnList + DefaultColumns mysql.ColumnList } type LinkTable struct { @@ -303,6 +304,7 @@ func newLinkTableImpl(schemaName, tableName, alias string) linkTable { DescriptionColumn = mysql.StringColumn("description") allColumns = mysql.ColumnList{IDColumn, URLColumn, NameColumn, DescriptionColumn} mutableColumns = mysql.ColumnList{URLColumn, NameColumn, DescriptionColumn} + defaultColumns = mysql.ColumnList{DescriptionColumn} ) return linkTable{ @@ -316,6 +318,7 @@ func newLinkTableImpl(schemaName, tableName, alias string) linkTable { AllColumns: allColumns, MutableColumns: mutableColumns, + DefaultColumns: defaultColumns, } } `) @@ -375,6 +378,7 @@ type actorTable struct { AllColumns mysql.ColumnList MutableColumns mysql.ColumnList + DefaultColumns mysql.ColumnList } type ActorTable struct { @@ -418,6 +422,7 @@ func newActorTableImpl(schemaName, tableName, alias string) actorTable { LastUpdateColumn = mysql.TimestampColumn("last_update") allColumns = mysql.ColumnList{ActorIDColumn, FirstNameColumn, LastNameColumn, LastUpdateColumn} mutableColumns = mysql.ColumnList{FirstNameColumn, LastNameColumn, LastUpdateColumn} + defaultColumns = mysql.ColumnList{LastUpdateColumn} ) return actorTable{ @@ -431,6 +436,7 @@ func newActorTableImpl(schemaName, tableName, alias string) actorTable { AllColumns: allColumns, MutableColumns: mutableColumns, + DefaultColumns: defaultColumns, } } ` @@ -516,6 +522,7 @@ type actorInfoTable struct { AllColumns mysql.ColumnList MutableColumns mysql.ColumnList + DefaultColumns mysql.ColumnList } type ActorInfoTable struct { @@ -559,6 +566,7 @@ func newActorInfoTableImpl(schemaName, tableName, alias string) actorInfoTable { FilmInfoColumn = mysql.StringColumn("film_info") allColumns = mysql.ColumnList{ActorIDColumn, FirstNameColumn, LastNameColumn, FilmInfoColumn} mutableColumns = mysql.ColumnList{ActorIDColumn, FirstNameColumn, LastNameColumn, FilmInfoColumn} + defaultColumns = mysql.ColumnList{ActorIDColumn} ) return actorInfoTable{ @@ -572,6 +580,7 @@ func newActorInfoTableImpl(schemaName, tableName, alias string) actorInfoTable { AllColumns: allColumns, MutableColumns: mutableColumns, + DefaultColumns: defaultColumns, } } ` diff --git a/tests/postgres/generator_test.go b/tests/postgres/generator_test.go index 93fb9c3..005e703 100644 --- a/tests/postgres/generator_test.go +++ b/tests/postgres/generator_test.go @@ -520,6 +520,7 @@ type actorTable struct { AllColumns postgres.ColumnList MutableColumns postgres.ColumnList + DefaultColumns postgres.ColumnList } type ActorTable struct { @@ -563,6 +564,7 @@ func newActorTableImpl(schemaName, tableName, alias string) actorTable { LastUpdateColumn = postgres.TimestampColumn("last_update") allColumns = postgres.ColumnList{ActorIDColumn, FirstNameColumn, LastNameColumn, LastUpdateColumn} mutableColumns = postgres.ColumnList{FirstNameColumn, LastNameColumn, LastUpdateColumn} + defaultColumns = postgres.ColumnList{ActorIDColumn} ) return actorTable{ @@ -576,6 +578,7 @@ func newActorTableImpl(schemaName, tableName, alias string) actorTable { AllColumns: allColumns, MutableColumns: mutableColumns, + DefaultColumns: defaultColumns, } } ` @@ -660,6 +663,7 @@ type actorInfoTable struct { AllColumns postgres.ColumnList MutableColumns postgres.ColumnList + DefaultColumns postgres.ColumnList } type ActorInfoTable struct { @@ -703,6 +707,7 @@ func newActorInfoTableImpl(schemaName, tableName, alias string) actorInfoTable { FilmInfoColumn = postgres.StringColumn("film_info") allColumns = postgres.ColumnList{ActorIDColumn, FirstNameColumn, LastNameColumn, FilmInfoColumn} mutableColumns = postgres.ColumnList{ActorIDColumn, FirstNameColumn, LastNameColumn, FilmInfoColumn} + defaultColumns = postgres.ColumnList{} ) return actorInfoTable{ @@ -716,6 +721,7 @@ func newActorInfoTableImpl(schemaName, tableName, alias string) actorInfoTable { AllColumns: allColumns, MutableColumns: mutableColumns, + DefaultColumns: defaultColumns, } } ` @@ -1011,6 +1017,7 @@ type allTypesTable struct { AllColumns postgres.ColumnList MutableColumns postgres.ColumnList + DefaultColumns postgres.ColumnList } type AllTypesTable struct { @@ -1113,6 +1120,7 @@ func newAllTypesTableImpl(schemaName, tableName, alias string) allTypesTable { MoodColumn = postgres.StringColumn("mood") allColumns = postgres.ColumnList{SmallIntPtrColumn, SmallIntColumn, IntegerPtrColumn, IntegerColumn, BigIntPtrColumn, BigIntColumn, DecimalPtrColumn, DecimalColumn, NumericPtrColumn, NumericColumn, RealPtrColumn, RealColumn, DoublePrecisionPtrColumn, DoublePrecisionColumn, SmallserialColumn, SerialColumn, BigserialColumn, VarCharPtrColumn, VarCharColumn, CharPtrColumn, CharColumn, TextPtrColumn, TextColumn, ByteaPtrColumn, ByteaColumn, TimestampzPtrColumn, TimestampzColumn, TimestampPtrColumn, TimestampColumn, DatePtrColumn, DateColumn, TimezPtrColumn, TimezColumn, TimePtrColumn, TimeColumn, IntervalPtrColumn, IntervalColumn, BooleanPtrColumn, BooleanColumn, PointPtrColumn, BitPtrColumn, BitColumn, BitVaryingPtrColumn, BitVaryingColumn, TsvectorPtrColumn, TsvectorColumn, UUIDPtrColumn, UUIDColumn, XMLPtrColumn, XMLColumn, JSONPtrColumn, JSONColumn, JsonbPtrColumn, JsonbColumn, IntegerArrayPtrColumn, IntegerArrayColumn, TextArrayPtrColumn, TextArrayColumn, JsonbArrayColumn, TextMultiDimArrayPtrColumn, TextMultiDimArrayColumn, MoodPtrColumn, MoodColumn} mutableColumns = postgres.ColumnList{SmallIntPtrColumn, SmallIntColumn, IntegerPtrColumn, IntegerColumn, BigIntPtrColumn, BigIntColumn, DecimalPtrColumn, DecimalColumn, NumericPtrColumn, NumericColumn, RealPtrColumn, RealColumn, DoublePrecisionPtrColumn, DoublePrecisionColumn, SmallserialColumn, SerialColumn, BigserialColumn, VarCharPtrColumn, VarCharColumn, CharPtrColumn, CharColumn, TextPtrColumn, TextColumn, ByteaPtrColumn, ByteaColumn, TimestampzPtrColumn, TimestampzColumn, TimestampPtrColumn, TimestampColumn, DatePtrColumn, DateColumn, TimezPtrColumn, TimezColumn, TimePtrColumn, TimeColumn, IntervalPtrColumn, IntervalColumn, BooleanPtrColumn, BooleanColumn, PointPtrColumn, BitPtrColumn, BitColumn, BitVaryingPtrColumn, BitVaryingColumn, TsvectorPtrColumn, TsvectorColumn, UUIDPtrColumn, UUIDColumn, XMLPtrColumn, XMLColumn, JSONPtrColumn, JSONColumn, JsonbPtrColumn, JsonbColumn, IntegerArrayPtrColumn, IntegerArrayColumn, TextArrayPtrColumn, TextArrayColumn, JsonbArrayColumn, TextMultiDimArrayPtrColumn, TextMultiDimArrayColumn, MoodPtrColumn, MoodColumn} + defaultColumns = postgres.ColumnList{SmallIntColumn, IntegerColumn, BigIntColumn, DecimalColumn, NumericColumn, RealColumn, DoublePrecisionColumn, SmallserialColumn, SerialColumn, BigserialColumn, VarCharColumn, CharColumn, TextColumn, ByteaColumn, TimestampzColumn, TimestampColumn, DateColumn, TimezColumn, TimeColumn, IntervalColumn, BooleanColumn, BitColumn, BitVaryingColumn, TsvectorColumn, UUIDColumn, XMLColumn, JSONColumn, JsonbColumn, IntegerArrayColumn, TextArrayColumn, JsonbArrayColumn, TextMultiDimArrayColumn, MoodColumn} ) return allTypesTable{ @@ -1185,6 +1193,7 @@ func newAllTypesTableImpl(schemaName, tableName, alias string) allTypesTable { AllColumns: allColumns, MutableColumns: mutableColumns, + DefaultColumns: defaultColumns, } } ` @@ -1218,6 +1227,7 @@ type sampleRangesTable struct { AllColumns postgres.ColumnList MutableColumns postgres.ColumnList + DefaultColumns postgres.ColumnList } type SampleRangesTable struct { @@ -1263,6 +1273,7 @@ func newSampleRangesTableImpl(schemaName, tableName, alias string) sampleRangesT NumRangeColumn = postgres.NumericRangeColumn("num_range") allColumns = postgres.ColumnList{DateRangeColumn, TimestampRangeColumn, TimestampzRangeColumn, Int4RangeColumn, Int8RangeColumn, NumRangeColumn} mutableColumns = postgres.ColumnList{DateRangeColumn, TimestampRangeColumn, TimestampzRangeColumn, Int4RangeColumn, Int8RangeColumn, NumRangeColumn} + defaultColumns = postgres.ColumnList{DateRangeColumn, TimestampRangeColumn, TimestampzRangeColumn, Int4RangeColumn, Int8RangeColumn, NumRangeColumn} ) return sampleRangesTable{ @@ -1278,6 +1289,7 @@ func newSampleRangesTableImpl(schemaName, tableName, alias string) sampleRangesT AllColumns: allColumns, MutableColumns: mutableColumns, + DefaultColumns: defaultColumns, } } ` @@ -1310,6 +1322,7 @@ type linkTable struct { AllColumns postgres.ColumnList MutableColumns postgres.ColumnList + DefaultColumns postgres.ColumnList } type LinkTable struct { @@ -1353,6 +1366,7 @@ func newLinkTableImpl(schemaName, tableName, alias string) linkTable { DescriptionColumn = postgres.StringColumn("description") allColumns = postgres.ColumnList{IDColumn, URLColumn, NameColumn, DescriptionColumn} mutableColumns = postgres.ColumnList{URLColumn, NameColumn, DescriptionColumn} + defaultColumns = postgres.ColumnList{IDColumn} ) return linkTable{ @@ -1366,6 +1380,7 @@ func newLinkTableImpl(schemaName, tableName, alias string) linkTable { AllColumns: allColumns, MutableColumns: mutableColumns, + DefaultColumns: defaultColumns, } } ` diff --git a/tests/sqlite/generator_test.go b/tests/sqlite/generator_test.go index 8a15568..f261d22 100644 --- a/tests/sqlite/generator_test.go +++ b/tests/sqlite/generator_test.go @@ -185,6 +185,7 @@ type actorTable struct { AllColumns sqlite.ColumnList MutableColumns sqlite.ColumnList + DefaultColumns sqlite.ColumnList } type ActorTable struct { @@ -228,6 +229,7 @@ func newActorTableImpl(schemaName, tableName, alias string) actorTable { LastUpdateColumn = sqlite.TimestampColumn("last_update") allColumns = sqlite.ColumnList{ActorIDColumn, FirstNameColumn, LastNameColumn, LastUpdateColumn} mutableColumns = sqlite.ColumnList{FirstNameColumn, LastNameColumn, LastUpdateColumn} + defaultColumns = sqlite.ColumnList{LastUpdateColumn} ) return actorTable{ @@ -241,6 +243,7 @@ func newActorTableImpl(schemaName, tableName, alias string) actorTable { AllColumns: allColumns, MutableColumns: mutableColumns, + DefaultColumns: defaultColumns, } } ` @@ -307,6 +310,7 @@ type filmListTable struct { AllColumns sqlite.ColumnList MutableColumns sqlite.ColumnList + DefaultColumns sqlite.ColumnList } type FilmListTable struct { @@ -354,6 +358,7 @@ func newFilmListTableImpl(schemaName, tableName, alias string) filmListTable { ActorsColumn = sqlite.StringColumn("actors") allColumns = sqlite.ColumnList{FidColumn, TitleColumn, DescriptionColumn, CategoryColumn, PriceColumn, LengthColumn, RatingColumn, ActorsColumn} mutableColumns = sqlite.ColumnList{FidColumn, TitleColumn, DescriptionColumn, CategoryColumn, PriceColumn, LengthColumn, RatingColumn, ActorsColumn} + defaultColumns = sqlite.ColumnList{} ) return filmListTable{ @@ -371,6 +376,7 @@ func newFilmListTableImpl(schemaName, tableName, alias string) filmListTable { AllColumns: allColumns, MutableColumns: mutableColumns, + DefaultColumns: defaultColumns, } } `