@@ -7,45 +7,45 @@ import (
77)
88
99const (
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