fix(dbml): resolve commented cross-file // Ref: lines
Commented refs are collected per file and resolved against the combined model after all inputs are loaded (directory, --from-list, merge, jobs). Matched refs become FKs and relationships; duplicates of existing FKs are skipped; missing targets are skipped with a warning; column type mismatches warn. Also keep reused index names within a DBML table instead of overwriting, give a second FK to the same table a distinct relationship name, and make the pgsql writer match relationships to FKs by name first.
This commit is contained in:
@@ -91,6 +91,45 @@ func (r *MergeResult) merge(target, source *models.Database, opts *MergeOptions)
|
||||
if !opts.SkipDomains {
|
||||
r.mergeDomains(target, source)
|
||||
}
|
||||
|
||||
mergeDatabaseMetadata(target, source)
|
||||
}
|
||||
|
||||
// mergeDatabaseMetadata adds missing metadata keys and unions []string values,
|
||||
// so per-file reader state (e.g. pending DBML commented refs) survives a merge.
|
||||
func mergeDatabaseMetadata(target, source *models.Database) {
|
||||
if len(source.Metadata) == 0 {
|
||||
return
|
||||
}
|
||||
if target.Metadata == nil {
|
||||
target.Metadata = make(map[string]any, len(source.Metadata))
|
||||
}
|
||||
for key, srcVal := range source.Metadata {
|
||||
tgtVal, exists := target.Metadata[key]
|
||||
if !exists {
|
||||
if list, ok := srcVal.([]string); ok {
|
||||
srcVal = append([]string(nil), list...)
|
||||
}
|
||||
target.Metadata[key] = srcVal
|
||||
continue
|
||||
}
|
||||
tgtList, tgtOK := tgtVal.([]string)
|
||||
srcList, srcOK := srcVal.([]string)
|
||||
if !tgtOK || !srcOK {
|
||||
continue
|
||||
}
|
||||
seen := make(map[string]bool, len(tgtList))
|
||||
for _, v := range tgtList {
|
||||
seen[v] = true
|
||||
}
|
||||
for _, v := range srcList {
|
||||
if !seen[v] {
|
||||
tgtList = append(tgtList, v)
|
||||
seen[v] = true
|
||||
}
|
||||
}
|
||||
target.Metadata[key] = tgtList
|
||||
}
|
||||
}
|
||||
|
||||
func (r *MergeResult) mergeSchemaContents(target, source *models.Schema, opts *MergeOptions) {
|
||||
|
||||
Reference in New Issue
Block a user