Skip to content

Commit dd1ecf6

Browse files
committed
refactor: change Columns from slice to map in TableSchema for improved access
1 parent c4218c2 commit dd1ecf6

File tree

3 files changed

+91
-79
lines changed

3 files changed

+91
-79
lines changed

domains/table_schema.go

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,14 @@ package domains
22

33
type TableSchema struct {
44
TableName string
5-
Columns []TableSchemaColumn
5+
// ColumnName -> ColumnSchema
6+
Columns map[string]TableSchemaColumn
7+
}
8+
9+
func newTableSchema() TableSchema {
10+
return TableSchema{
11+
Columns: make(map[string]TableSchemaColumn),
12+
}
613
}
714

815
type TableSchemaColumn struct {

domains/table_schema_repository.go

Lines changed: 53 additions & 48 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@ package domains
22

33
import (
44
"regexp"
5+
"slices"
56
"strings"
67
)
78

@@ -19,65 +20,69 @@ func LoadTableSchema(sql string) ([]TableSchema, error) {
1920
tableNames := tableDefRegex.SubexpNames()
2021

2122
for _, tableMatch := range tableMatches {
22-
var schema TableSchema
23+
var schema = newTableSchema()
24+
25+
var tableName string
2326
for i, name := range tableNames {
2427
if name == "TableName" {
25-
schema.TableName = tableMatch[i]
26-
} else if name == "Columns" {
27-
columnsDef := tableMatch[i]
28-
columnDefs := strings.Split(columnsDef, ",")
29-
for _, columnDef := range columnDefs {
30-
columnDef = strings.TrimSpace(columnDef)
31-
primaryKeyMatches := primaryKeyRegex.FindStringSubmatch(columnDef)
32-
if len(primaryKeyMatches) > 0 {
33-
primaryKeyNames := primaryKeyRegex.SubexpNames()
34-
for j, name := range primaryKeyNames {
35-
if name == "ColumnName" {
36-
for i, column := range schema.Columns {
37-
if column.ColumnName == primaryKeyMatches[j] {
38-
schema.Columns[i].IsPrimary = true
39-
}
40-
}
41-
}
28+
tableName = tableMatch[i]
29+
}
30+
}
31+
schema.TableName = tableName
32+
33+
for i := range tableNames {
34+
columnsDef := tableMatch[i]
35+
columnDefs := strings.Split(columnsDef, ",")
36+
for _, columnDef := range columnDefs {
37+
columnDef = strings.TrimSpace(columnDef)
38+
39+
primaryKeyMatches := primaryKeyRegex.FindStringSubmatch(columnDef)
40+
if len(primaryKeyMatches) > 0 {
41+
primaryKeyNames := primaryKeyRegex.SubexpNames()
42+
j := slices.Index(primaryKeyNames, "ColumnName")
43+
if j >= 0 {
44+
primaryKeyColumn, ok := schema.Columns[primaryKeyMatches[j]]
45+
if ok {
46+
primaryKeyColumn.IsPrimary = true
47+
schema.Columns[primaryKeyMatches[j]] = primaryKeyColumn
4248
}
4349
}
50+
}
4451

45-
uniqueMatches := uniqueRegex.FindStringSubmatch(columnDef)
46-
if len(uniqueMatches) > 0 {
47-
uniqueNames := uniqueRegex.SubexpNames()
48-
for j, name := range uniqueNames {
49-
if name == "ColumnName" {
50-
for i, column := range schema.Columns {
51-
if column.ColumnName == uniqueMatches[j] {
52-
schema.Columns[i].IsUnique = true
53-
}
54-
}
55-
}
52+
uniqueMatches := uniqueRegex.FindStringSubmatch(columnDef)
53+
if len(uniqueMatches) > 0 {
54+
uniqueNames := uniqueRegex.SubexpNames()
55+
j := slices.Index(uniqueNames, "ColumnName")
56+
if j >= 0 {
57+
uniqueColumn, ok := schema.Columns[uniqueMatches[j]]
58+
if ok {
59+
uniqueColumn.IsUnique = true
60+
schema.Columns[uniqueMatches[j]] = uniqueColumn
5661
}
5762
}
63+
}
5864

59-
columnMatches := columnDefRegex.FindAllStringSubmatch(columnDef, -1)
60-
columnNames := columnDefRegex.SubexpNames()
65+
columnMatches := columnDefRegex.FindAllStringSubmatch(columnDef, -1)
66+
columnNames := columnDefRegex.SubexpNames()
6167

62-
for _, columnMatch := range columnMatches {
63-
var column TableSchemaColumn
64-
column.IsNullable = true
65-
for j, cname := range columnNames {
66-
switch cname {
67-
case "ColumnName":
68-
column.ColumnName = columnMatch[j]
69-
case "DataType":
70-
column.DataType = parseDataType(columnMatch[j])
71-
case "NonNullable":
72-
column.IsNullable = column.IsNullable && columnMatch[j] == ""
73-
case "PrimaryKey":
74-
column.IsPrimary = columnMatch[j] != ""
75-
case "Unique":
76-
column.IsUnique = columnMatch[j] != ""
77-
}
68+
for _, columnMatch := range columnMatches {
69+
var column TableSchemaColumn
70+
column.IsNullable = true
71+
for j, cname := range columnNames {
72+
switch cname {
73+
case "ColumnName":
74+
column.ColumnName = columnMatch[j]
75+
case "DataType":
76+
column.DataType = parseDataType(columnMatch[j])
77+
case "NonNullable":
78+
column.IsNullable = column.IsNullable && columnMatch[j] == ""
79+
case "PrimaryKey":
80+
column.IsPrimary = columnMatch[j] != ""
81+
case "Unique":
82+
column.IsUnique = columnMatch[j] != ""
7883
}
79-
schema.Columns = append(schema.Columns, column)
8084
}
85+
schema.Columns[column.ColumnName] = column
8186
}
8287
}
8388
}

domains/table_schema_repository_test.go

Lines changed: 30 additions & 30 deletions
Original file line numberDiff line numberDiff line change
@@ -31,20 +31,20 @@ func TestLoadTableSchema(t *testing.T) {
3131
expected: []TableSchema{
3232
{
3333
TableName: "users",
34-
Columns: []TableSchemaColumn{
35-
{ColumnName: "id", DataType: TableSchemaDataType_INT64, IsNullable: true, IsPrimary: true, IsUnique: false},
36-
{ColumnName: "name", DataType: TableSchemaDataType_STRING, IsNullable: false, IsPrimary: false, IsUnique: true},
37-
{ColumnName: "created_at", DataType: TableSchemaDataType_DATETIME, IsNullable: true, IsPrimary: false, IsUnique: true},
38-
{ColumnName: "description", DataType: TableSchemaDataType_STRING, IsNullable: false, IsPrimary: false, IsUnique: false},
39-
{ColumnName: "icon", DataType: TableSchemaDataType_BYTES, IsNullable: false, IsPrimary: false, IsUnique: false},
34+
Columns: map[string]TableSchemaColumn{
35+
"id": {ColumnName: "id", DataType: TableSchemaDataType_INT64, IsNullable: true, IsPrimary: true, IsUnique: false},
36+
"name": {ColumnName: "name", DataType: TableSchemaDataType_STRING, IsNullable: false, IsPrimary: false, IsUnique: true},
37+
"created_at": {ColumnName: "created_at", DataType: TableSchemaDataType_DATETIME, IsNullable: true, IsPrimary: false, IsUnique: true},
38+
"description": {ColumnName: "description", DataType: TableSchemaDataType_STRING, IsNullable: false, IsPrimary: false, IsUnique: false},
39+
"icon": {ColumnName: "icon", DataType: TableSchemaDataType_BYTES, IsNullable: false, IsPrimary: false, IsUnique: false},
4040
},
4141
},
4242
{
4343
TableName: "posts",
44-
Columns: []TableSchemaColumn{
45-
{ColumnName: "id", DataType: TableSchemaDataType_INT64, IsNullable: false, IsPrimary: true, IsUnique: false},
46-
{ColumnName: "title", DataType: TableSchemaDataType_STRING, IsNullable: false, IsPrimary: false, IsUnique: true},
47-
{ColumnName: "content", DataType: TableSchemaDataType_STRING, IsNullable: false, IsPrimary: false, IsUnique: false},
44+
Columns: map[string]TableSchemaColumn{
45+
"id": {ColumnName: "id", DataType: TableSchemaDataType_INT64, IsNullable: false, IsPrimary: true, IsUnique: false},
46+
"title": {ColumnName: "title", DataType: TableSchemaDataType_STRING, IsNullable: false, IsPrimary: false, IsUnique: true},
47+
"content": {ColumnName: "content", DataType: TableSchemaDataType_STRING, IsNullable: false, IsPrimary: false, IsUnique: false},
4848
},
4949
},
5050
},
@@ -81,34 +81,34 @@ func TestLoadTableSchema(t *testing.T) {
8181
expected: []TableSchema{
8282
{
8383
TableName: "users",
84-
Columns: []TableSchemaColumn{
85-
{ColumnName: "id", DataType: TableSchemaDataType_INT, IsNullable: false, IsPrimary: true, IsUnique: false},
86-
{ColumnName: "account_name", DataType: TableSchemaDataType_STRING, IsNullable: false, IsPrimary: false, IsUnique: true},
87-
{ColumnName: "passhash", DataType: TableSchemaDataType_STRING, IsNullable: false, IsPrimary: false, IsUnique: false},
88-
{ColumnName: "authority", DataType: TableSchemaDataType_INT, IsNullable: false, IsPrimary: false, IsUnique: false},
89-
{ColumnName: "del_flg", DataType: TableSchemaDataType_INT, IsNullable: false, IsPrimary: false, IsUnique: false},
90-
{ColumnName: "created_at", DataType: TableSchemaDataType_DATETIME, IsNullable: false, IsPrimary: false, IsUnique: false},
84+
Columns: map[string]TableSchemaColumn{
85+
"id": {ColumnName: "id", DataType: TableSchemaDataType_INT, IsNullable: false, IsPrimary: true, IsUnique: false},
86+
"account_name": {ColumnName: "account_name", DataType: TableSchemaDataType_STRING, IsNullable: false, IsPrimary: false, IsUnique: true},
87+
"passhash": {ColumnName: "passhash", DataType: TableSchemaDataType_STRING, IsNullable: false, IsPrimary: false, IsUnique: false},
88+
"authority": {ColumnName: "authority", DataType: TableSchemaDataType_INT, IsNullable: false, IsPrimary: false, IsUnique: false},
89+
"del_flg": {ColumnName: "del_flg", DataType: TableSchemaDataType_INT, IsNullable: false, IsPrimary: false, IsUnique: false},
90+
"created_at": {ColumnName: "created_at", DataType: TableSchemaDataType_DATETIME, IsNullable: false, IsPrimary: false, IsUnique: false},
9191
},
9292
},
9393
{
9494
TableName: "posts",
95-
Columns: []TableSchemaColumn{
96-
{ColumnName: "id", DataType: TableSchemaDataType_INT, IsNullable: false, IsPrimary: true, IsUnique: false},
97-
{ColumnName: "user_id", DataType: TableSchemaDataType_INT, IsNullable: false, IsPrimary: false, IsUnique: false},
98-
{ColumnName: "mime", DataType: TableSchemaDataType_STRING, IsNullable: false, IsPrimary: false, IsUnique: false},
99-
{ColumnName: "imgdata", DataType: TableSchemaDataType_BYTES, IsNullable: false, IsPrimary: false, IsUnique: false},
100-
{ColumnName: "body", DataType: TableSchemaDataType_STRING, IsNullable: false, IsPrimary: false, IsUnique: false},
101-
{ColumnName: "created_at", DataType: TableSchemaDataType_DATETIME, IsNullable: false, IsPrimary: false, IsUnique: false},
95+
Columns: map[string]TableSchemaColumn{
96+
"id": {ColumnName: "id", DataType: TableSchemaDataType_INT, IsNullable: false, IsPrimary: true, IsUnique: false},
97+
"user_id": {ColumnName: "user_id", DataType: TableSchemaDataType_INT, IsNullable: false, IsPrimary: false, IsUnique: false},
98+
"mime": {ColumnName: "mime", DataType: TableSchemaDataType_STRING, IsNullable: false, IsPrimary: false, IsUnique: false},
99+
"imgdata": {ColumnName: "imgdata", DataType: TableSchemaDataType_BYTES, IsNullable: false, IsPrimary: false, IsUnique: false},
100+
"body": {ColumnName: "body", DataType: TableSchemaDataType_STRING, IsNullable: false, IsPrimary: false, IsUnique: false},
101+
"created_at": {ColumnName: "created_at", DataType: TableSchemaDataType_DATETIME, IsNullable: false, IsPrimary: false, IsUnique: false},
102102
},
103103
},
104104
{
105105
TableName: "comments",
106-
Columns: []TableSchemaColumn{
107-
{ColumnName: "id", DataType: TableSchemaDataType_INT, IsNullable: false, IsPrimary: true, IsUnique: false},
108-
{ColumnName: "post_id", DataType: TableSchemaDataType_INT, IsNullable: false, IsPrimary: false, IsUnique: false},
109-
{ColumnName: "user_id", DataType: TableSchemaDataType_INT, IsNullable: false, IsPrimary: false, IsUnique: false},
110-
{ColumnName: "comment", DataType: TableSchemaDataType_STRING, IsNullable: false, IsPrimary: false, IsUnique: false},
111-
{ColumnName: "created_at", DataType: TableSchemaDataType_DATETIME, IsNullable: false, IsPrimary: false, IsUnique: false},
106+
Columns: map[string]TableSchemaColumn{
107+
"id": {ColumnName: "id", DataType: TableSchemaDataType_INT, IsNullable: false, IsPrimary: true, IsUnique: false},
108+
"post_id": {ColumnName: "post_id", DataType: TableSchemaDataType_INT, IsNullable: false, IsPrimary: false, IsUnique: false},
109+
"user_id": {ColumnName: "user_id", DataType: TableSchemaDataType_INT, IsNullable: false, IsPrimary: false, IsUnique: false},
110+
"comment": {ColumnName: "comment", DataType: TableSchemaDataType_STRING, IsNullable: false, IsPrimary: false, IsUnique: false},
111+
"created_at": {ColumnName: "created_at", DataType: TableSchemaDataType_DATETIME, IsNullable: false, IsPrimary: false, IsUnique: false},
112112
},
113113
},
114114
},

0 commit comments

Comments
 (0)