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 }