49 lines
1.7 KiB
Go
49 lines
1.7 KiB
Go
package generator
|
|
|
|
import (
|
|
"fmt"
|
|
"strings"
|
|
)
|
|
|
|
// GenerateMapper generates the mapper snippet (without imports)
|
|
func GenerateMapper(ctx *Context) (string, error) {
|
|
var b strings.Builder
|
|
|
|
// Mapper registration (snippet only, no imports)
|
|
b.WriteString(" mapper_registry.map_imperatively(\n")
|
|
b.WriteString(fmt.Sprintf(" class_=%s,\n", ctx.EntityName))
|
|
b.WriteString(fmt.Sprintf(" local_table=%s,\n", ctx.TableConstant))
|
|
b.WriteString(" properties={\n")
|
|
|
|
// Generate relationships for all foreign keys
|
|
fkRelationships := make(map[string][]string) // entity -> []column_names
|
|
|
|
for _, fk := range ctx.TableInfo.ForeignKeys {
|
|
relationName := GetRelationshipName(fk.ColumnName)
|
|
entityName := GetRelationshipEntityName(fk.ForeignTableName)
|
|
|
|
// Group by entity name to handle multiple FKs to same table
|
|
fkRelationships[entityName] = append(fkRelationships[entityName], fk.ColumnName)
|
|
|
|
if len(fkRelationships[entityName]) == 1 {
|
|
// First FK to this table
|
|
b.WriteString(fmt.Sprintf(" \"%s\": relationship(\n", relationName))
|
|
b.WriteString(fmt.Sprintf(" %s, lazy=relationship_loading_strategy.value\n", entityName))
|
|
} else {
|
|
// Multiple FKs to same table, need to specify foreign_keys
|
|
b.WriteString(fmt.Sprintf(" \"%s\": relationship(\n", relationName))
|
|
b.WriteString(fmt.Sprintf(" %s,\n", entityName))
|
|
b.WriteString(" lazy=relationship_loading_strategy.value,\n")
|
|
b.WriteString(fmt.Sprintf(" foreign_keys=%s.columns.%s,\n",
|
|
ctx.TableConstant, fk.ColumnName))
|
|
}
|
|
|
|
b.WriteString(" ),\n")
|
|
}
|
|
|
|
b.WriteString(" },\n")
|
|
b.WriteString(" )\n")
|
|
|
|
return b.String(), nil
|
|
}
|