Skip to content

Commit ac77462

Browse files
committed
Fix guesser
1 parent 5569136 commit ac77462

File tree

3 files changed

+29
-40
lines changed

3 files changed

+29
-40
lines changed

cmd/hakagi/hakagi.go

Lines changed: 2 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,6 @@ import (
77
"strings"
88

99
_ "github.com/go-sql-driver/mysql"
10-
"github.com/syucream/hakagi/src/constraint"
1110
"github.com/syucream/hakagi/src/database"
1211
"github.com/syucream/hakagi/src/formatter"
1312
"github.com/syucream/hakagi/src/guess"
@@ -19,7 +18,7 @@ func main() {
1918
dbHost := flag.String("dbhost", "localhost", "database host")
2019
dbPort := flag.Int("dbport", 3306, "database port")
2120

22-
targets := flag.String("targets", "", "analysing targets(comma-separated)")
21+
targets := flag.String("targets", "", "analysing target databases(comma-separated)")
2322

2423
flag.Parse()
2524

@@ -38,9 +37,7 @@ func main() {
3837
log.Fatalf("Failed to fetch primary keys : %v", err)
3938
}
4039

41-
var constraints []constraint.Constraint
42-
constraints = append(constraints, guess.GuessByPrimaryKeyName(schemas, primaryKeys)...)
43-
constraints = append(constraints, guess.GuessBySimilarColumn(schemas)...)
40+
constraints := guess.GuessConstraints(schemas, primaryKeys, guess.GuessByPrimaryKeyName(), guess.GuessBySimilarColumn())
4441

4542
alterQuery := formatter.FormatSql(constraints)
4643
fmt.Println(alterQuery)

src/formatter/formatter.go

Lines changed: 1 addition & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -8,15 +8,7 @@ import (
88
)
99

1010
const (
11-
baseSql = `ALTER TABLE
12-
%s
13-
ADD CONSTRAINT
14-
%s_ibfk_%s%s
15-
FOREIGN KEY
16-
(%s)
17-
REFERENCES
18-
%s(%s);
19-
`
11+
baseSql = "ALTER TABLE %s ADD CONSTRAINT %s_ibfk_%s%s FOREIGN KEY (%s) REFERENCES %s(%s);"
2012
)
2113

2214
func FormatSql(constraints []constraint.Constraint) string {

src/guess/guess.go

Lines changed: 26 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -7,45 +7,45 @@ import (
77
)
88

99
const (
10-
idColumn = "id"
11-
targetPrimaryKeySuffix = "_id"
10+
idColumn = "id"
11+
targetColumnSuffix = "_id"
1212
)
1313

14-
func isTargetPrimaryKey(column string) bool {
15-
cLen := len(column)
16-
tLen := len(targetPrimaryKeySuffix)
17-
return cLen >= tLen && column[cLen-tLen:] == targetPrimaryKeySuffix
18-
}
19-
20-
func isSimilarColumn(left, right database.Schema) bool {
21-
maybeRightTable := inflection.Plural(left.Column)
22-
return maybeRightTable == right.Table && right.Column == idColumn
23-
}
14+
type guessOption func(database.Schema, database.PrimaryKey) bool
2415

2516
// Recongnize a column thats same name of other table's primary key is a foreign key
2617
// This base idea refers to SchemaSpy DbAnalyzer:
2718
// https://github.com/schemaspy/schemaspy/blob/master/src/main/java/org/schemaspy/DbAnalyzer.java
28-
func GuessByPrimaryKeyName(schemas []database.Schema, primaryKeys []database.PrimaryKey) []constraint.Constraint {
29-
var constraints []constraint.Constraint
19+
func GuessByPrimaryKeyName() guessOption {
20+
return func(s database.Schema, pk database.PrimaryKey) bool {
21+
return s.Column == pk.Column && pk.Column != idColumn
22+
}
23+
}
3024

31-
for _, s := range schemas {
32-
for _, pk := range primaryKeys {
33-
if s.Table != pk.Table && s.Column == pk.Column && isTargetPrimaryKey(s.Column) {
34-
constraints = append(constraints, constraint.Constraint{s.Table, s.Column, pk.Table, pk.Column})
35-
}
25+
func GuessBySimilarColumn() guessOption {
26+
return func(s database.Schema, pk database.PrimaryKey) bool {
27+
cLen := len(s.Column)
28+
tLen := len(targetColumnSuffix)
29+
30+
if !(cLen >= tLen && s.Column[cLen-tLen:] == targetColumnSuffix) {
31+
return false
3632
}
37-
}
3833

39-
return constraints
34+
return inflection.Plural(s.Column[:cLen-tLen]) == pk.Table && pk.Column == idColumn
35+
}
4036
}
4137

42-
func GuessBySimilarColumn(schemas []database.Schema) []constraint.Constraint {
38+
func GuessConstraints(schemas []database.Schema, primaryKeys []database.PrimaryKey, guessOptions ...guessOption) []constraint.Constraint {
4339
var constraints []constraint.Constraint
4440

45-
for _, left := range schemas {
46-
for _, right := range schemas {
47-
if left.Table != right.Table && isSimilarColumn(left, right) {
48-
constraints = append(constraints, constraint.Constraint{left.Table, left.Column, right.Table, right.Column})
41+
for _, s := range schemas {
42+
for _, pk := range primaryKeys {
43+
if s.Table != pk.Table {
44+
for _, guesser := range guessOptions {
45+
if guesser(s, pk) {
46+
constraints = append(constraints, constraint.Constraint{s.Table, s.Column, pk.Table, pk.Column})
47+
}
48+
}
4949
}
5050
}
5151
}

0 commit comments

Comments
 (0)