Skip to content

Commit 02cc212

Browse files
authored
Merge pull request #374 from azdagron/add-has-default
Add HasDefault column metadata
2 parents f55edaf + b7904cd commit 02cc212

File tree

8 files changed

+120
-11
lines changed

8 files changed

+120
-11
lines changed

generator/metadata/column_meta_data.go

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@ type Column struct {
1010
IsPrimaryKey bool
1111
IsNullable bool
1212
IsGenerated bool
13+
HasDefault bool
1314
DataType DataType
1415
Comment string
1516
}

generator/mysql/query_set.go

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@ func (m mySqlQuerySet) GetTablesMetaData(db *sql.DB, schemaName string, tableTyp
1818
SELECT
1919
t.table_name as "table.name",
2020
col.COLUMN_NAME AS "column.Name",
21+
col.COLUMN_DEFAULT IS NOT NULL as "column.HasDefault",
2122
col.IS_NULLABLE = "YES" AS "column.IsNullable",
2223
col.COLUMN_COMMENT AS "column.Comment",
2324
COALESCE(pk.IsPrimaryKey, 0) AS "column.IsPrimaryKey",

generator/postgres/query_set.go

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -64,6 +64,7 @@ select
6464
) as "column.IsPrimaryKey",
6565
not attr.attnotnull as "column.isNullable",
6666
attr.attgenerated = 's' as "column.isGenerated",
67+
attr.atthasdef as "column.hasDefault",
6768
(case tp.typtype
6869
when 'b' then 'base'
6970
when 'd' then 'base'

generator/sqlite/query_set.go

Lines changed: 10 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -4,10 +4,11 @@ import (
44
"context"
55
"database/sql"
66
"fmt"
7+
"strings"
8+
79
"github.com/go-jet/jet/v2/generator/metadata"
810
"github.com/go-jet/jet/v2/internal/utils/semantic"
911
"github.com/go-jet/jet/v2/qrm"
10-
"strings"
1112
)
1213

1314
// sqliteQuerySet is dialect query set for SQLite
@@ -74,11 +75,12 @@ func (p sqliteQuerySet) GetTableColumnsMetaData(db *sql.DB, schemaName string, t
7475
}
7576

7677
var columnInfos []struct {
77-
Name string
78-
Type string
79-
NotNull int32
80-
Pk int32
81-
Hidden int32
78+
Name string
79+
Type string
80+
NotNull int32
81+
DfltValue string
82+
Pk int32
83+
Hidden int32
8284
}
8385

8486
_, err = qrm.Query(context.Background(), db, tableInfoQuery, []interface{}{tableName}, &columnInfos)
@@ -91,12 +93,14 @@ func (p sqliteQuerySet) GetTableColumnsMetaData(db *sql.DB, schemaName string, t
9193
for _, columnInfo := range columnInfos {
9294
columnType := strings.TrimSuffix(getColumnType(columnInfo.Type), " GENERATED ALWAYS")
9395
isGenerated := columnInfo.Hidden == 2 || columnInfo.Hidden == 3 // stored or virtual column
96+
hasDefault := columnInfo.DfltValue != ""
9497

9598
columns = append(columns, metadata.Column{
9699
Name: columnInfo.Name,
97100
IsPrimaryKey: columnInfo.Pk != 0,
98101
IsNullable: columnInfo.NotNull != 1,
99102
IsGenerated: isGenerated,
103+
HasDefault: hasDefault,
100104
DataType: metadata.DataType{
101105
Name: columnType,
102106
Kind: metadata.BaseType,

tests/mysql/generator_test.go

Lines changed: 36 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,8 +8,11 @@ import (
88

99
"github.com/stretchr/testify/require"
1010

11+
"github.com/go-jet/jet/v2/generator/metadata"
1112
"github.com/go-jet/jet/v2/generator/mysql"
13+
"github.com/go-jet/jet/v2/generator/template"
1214
"github.com/go-jet/jet/v2/internal/testutils"
15+
mysql2 "github.com/go-jet/jet/v2/mysql"
1316
"github.com/go-jet/jet/v2/tests/dbconfig"
1417
)
1518

@@ -39,6 +42,39 @@ func TestGenerator(t *testing.T) {
3942
require.NoError(t, err)
4043
}
4144

45+
func TestGenerator_TableMetadata(t *testing.T) {
46+
var schema metadata.Schema
47+
err := mysql.Generate(genTestDir3, dbConnection("dvds"),
48+
template.Default(mysql2.Dialect).UseSchema(func(m metadata.Schema) template.Schema {
49+
schema = m
50+
return template.DefaultSchema(m)
51+
}))
52+
require.NoError(t, err)
53+
54+
// Spot check the actor table and assert that the emitted
55+
// properties are as expected.
56+
var got metadata.Table
57+
for _, table := range schema.TablesMetaData {
58+
if table.Name == "actor" {
59+
got = table
60+
}
61+
}
62+
63+
want := metadata.Table{
64+
Name: "actor",
65+
Columns: []metadata.Column{
66+
{Name: "actor_id", IsPrimaryKey: true, IsNullable: false, IsGenerated: false, HasDefault: false, DataType: metadata.DataType{Name: "smallint", Kind: "base", IsUnsigned: true}, Comment: ""},
67+
{Name: "first_name", IsPrimaryKey: false, IsNullable: false, IsGenerated: false, HasDefault: false, DataType: metadata.DataType{Name: "varchar", Kind: "base", IsUnsigned: false}, Comment: ""},
68+
{Name: "last_name", IsPrimaryKey: false, IsNullable: false, IsGenerated: false, HasDefault: false, DataType: metadata.DataType{Name: "varchar", Kind: "base", IsUnsigned: false}, Comment: ""},
69+
{Name: "last_update", IsPrimaryKey: false, IsNullable: false, IsGenerated: false, HasDefault: true, DataType: metadata.DataType{Name: "timestamp", Kind: "base", IsUnsigned: false}, Comment: ""},
70+
},
71+
}
72+
require.Equal(t, want, got)
73+
74+
err = os.RemoveAll(genTestDirRoot)
75+
require.NoError(t, err)
76+
}
77+
4278
func TestCmdGenerator(t *testing.T) {
4379
err := os.RemoveAll(genTestDir3)
4480
require.NoError(t, err)

tests/postgres/generator_template_test.go

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,9 @@ package postgres
33
import (
44
"database/sql"
55
"fmt"
6+
"path"
7+
"testing"
8+
69
"github.com/go-jet/jet/v2/generator/metadata"
710
"github.com/go-jet/jet/v2/generator/postgres"
811
"github.com/go-jet/jet/v2/generator/template"
@@ -13,8 +16,6 @@ import (
1316
"github.com/go-jet/jet/v2/tests/dbconfig"
1417
file2 "github.com/go-jet/jet/v2/tests/internal/utils/file"
1518
"github.com/stretchr/testify/require"
16-
"path"
17-
"testing"
1819
)
1920

2021
const tempTestDir = "./.tempTestDir"

tests/postgres/generator_test.go

Lines changed: 35 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,6 @@ package postgres
22

33
import (
44
"fmt"
5-
"github.com/go-jet/jet/v2/tests/internal/utils/file"
65
"os"
76
"os/exec"
87
"path/filepath"
@@ -12,11 +11,14 @@ import (
1211

1312
"github.com/stretchr/testify/require"
1413

14+
"github.com/go-jet/jet/v2/generator/metadata"
1515
"github.com/go-jet/jet/v2/generator/postgres"
16+
"github.com/go-jet/jet/v2/generator/template"
1617
"github.com/go-jet/jet/v2/internal/testutils"
17-
"github.com/go-jet/jet/v2/tests/dbconfig"
18-
18+
postgres2 "github.com/go-jet/jet/v2/postgres"
1919
"github.com/go-jet/jet/v2/tests/.gentestdata/jetdb/dvds/model"
20+
"github.com/go-jet/jet/v2/tests/dbconfig"
21+
"github.com/go-jet/jet/v2/tests/internal/utils/file"
2022
)
2123

2224
func dsn(host string, port int, dbName, user, password string) string {
@@ -208,6 +210,36 @@ func TestGenerator(t *testing.T) {
208210
require.NoError(t, err)
209211
}
210212

213+
func TestGenerator_TableMetadata(t *testing.T) {
214+
var schema metadata.Schema
215+
err := postgres.GenerateDSN(defaultDSN(), "dvds", genTestDir2,
216+
template.Default(postgres2.Dialect).UseSchema(func(m metadata.Schema) template.Schema {
217+
schema = m
218+
return template.DefaultSchema(m)
219+
}))
220+
require.NoError(t, err)
221+
222+
// Spot check the actor table and assert that the emitted
223+
// properties are as expected.
224+
var got metadata.Table
225+
for _, table := range schema.TablesMetaData {
226+
if table.Name == "actor" {
227+
got = table
228+
}
229+
}
230+
231+
want := metadata.Table{
232+
Name: "actor",
233+
Columns: []metadata.Column{
234+
{Name: "actor_id", IsPrimaryKey: true, IsNullable: false, IsGenerated: false, HasDefault: true, DataType: metadata.DataType{Name: "int4", Kind: "base", IsUnsigned: false}, Comment: ""},
235+
{Name: "first_name", IsPrimaryKey: false, IsNullable: false, IsGenerated: false, HasDefault: false, DataType: metadata.DataType{Name: "varchar", Kind: "base", IsUnsigned: false}, Comment: ""},
236+
{Name: "last_name", IsPrimaryKey: false, IsNullable: false, IsGenerated: false, HasDefault: false, DataType: metadata.DataType{Name: "varchar", Kind: "base", IsUnsigned: false}, Comment: ""},
237+
{Name: "last_update", IsPrimaryKey: false, IsNullable: false, IsGenerated: false, HasDefault: false, DataType: metadata.DataType{Name: "timestamp", Kind: "base", IsUnsigned: false}, Comment: ""},
238+
},
239+
}
240+
require.Equal(t, want, got)
241+
}
242+
211243
func TestGeneratorSpecialCharacters(t *testing.T) {
212244
t.SkipNow()
213245
err := postgres.Generate(genTestDir2, postgres.DBConnection{

tests/sqlite/generator_test.go

Lines changed: 33 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,8 +8,11 @@ import (
88

99
"github.com/stretchr/testify/require"
1010

11+
"github.com/go-jet/jet/v2/generator/metadata"
1112
"github.com/go-jet/jet/v2/generator/sqlite"
13+
"github.com/go-jet/jet/v2/generator/template"
1214
"github.com/go-jet/jet/v2/internal/testutils"
15+
sqlite2 "github.com/go-jet/jet/v2/sqlite"
1316
"github.com/go-jet/jet/v2/tests/.gentestdata/sqlite/sakila/model"
1417
"github.com/go-jet/jet/v2/tests/internal/utils/repo"
1518
)
@@ -58,6 +61,36 @@ func TestGenerator(t *testing.T) {
5861
require.NoError(t, err)
5962
}
6063

64+
func TestGenerator_TableMetadata(t *testing.T) {
65+
var schema metadata.Schema
66+
err := sqlite.GenerateDSN(testDatabaseFilePath, genDestDir,
67+
template.Default(sqlite2.Dialect).UseSchema(func(m metadata.Schema) template.Schema {
68+
schema = m
69+
return template.DefaultSchema(m)
70+
}))
71+
require.NoError(t, err)
72+
73+
// Spot check the actor table and assert that the emitted
74+
// properties are as expected.
75+
var got metadata.Table
76+
for _, table := range schema.TablesMetaData {
77+
if table.Name == "actor" {
78+
got = table
79+
}
80+
}
81+
82+
want := metadata.Table{
83+
Name: "actor",
84+
Columns: []metadata.Column{
85+
{Name: "actor_id", IsPrimaryKey: true, IsNullable: false, IsGenerated: false, HasDefault: false, DataType: metadata.DataType{Name: "INTEGER", Kind: "base", IsUnsigned: false}, Comment: ""},
86+
{Name: "first_name", IsPrimaryKey: false, IsNullable: false, IsGenerated: false, HasDefault: false, DataType: metadata.DataType{Name: "VARCHAR", Kind: "base", IsUnsigned: false}, Comment: ""},
87+
{Name: "last_name", IsPrimaryKey: false, IsNullable: false, IsGenerated: false, HasDefault: false, DataType: metadata.DataType{Name: "VARCHAR", Kind: "base", IsUnsigned: false}, Comment: ""},
88+
{Name: "last_update", IsPrimaryKey: false, IsNullable: false, IsGenerated: false, HasDefault: true, DataType: metadata.DataType{Name: "TIMESTAMP", Kind: "base", IsUnsigned: false}, Comment: ""},
89+
},
90+
}
91+
require.Equal(t, want, got)
92+
}
93+
6194
func TestCmdGenerator(t *testing.T) {
6295
cmd := exec.Command("jet", "-source=SQLite", "-dsn=file://"+testDatabaseFilePath, "-path="+genDestDir)
6396

0 commit comments

Comments
 (0)