sqlboiler/templates/07_relationship_to_many_eager.tpl

125 lines
4.1 KiB
Smarty
Raw Normal View History

{{- if .Table.IsJoinTable -}}
{{- else -}}
{{- $dot := . -}}
{{- range .Table.ToManyRelationships -}}
2016-08-16 09:30:08 +02:00
{{- if (and .ForeignColumnUnique (not .ToJoinTable)) -}}
{{- template "relationship_to_one_eager_helper" (textsFromOneToOneRelationship $dot.PkgName $dot.Tables $dot.Table .) -}}
{{- else -}}
{{- $rel := textsFromRelationship $dot.Tables $dot.Table . -}}
{{- $arg := printf "maybe%s" $rel.LocalTable.NameGo -}}
{{- $slice := printf "%sSlice" $rel.LocalTable.NameGo -}}
// Load{{$rel.Function.Name}} allows an eager lookup of values, cached into the
2016-08-23 06:53:37 +02:00
// loaded structs of the objects.
2016-08-27 06:40:11 +02:00
func (r *{{$rel.LocalTable.NameGo}}R) Load{{$rel.Function.Name}}(e boil.Executor, singular bool, {{$arg}} interface{}) error {
var slice []*{{$rel.LocalTable.NameGo}}
var object *{{$rel.LocalTable.NameGo}}
count := 1
if singular {
object = {{$arg}}.(*{{$rel.LocalTable.NameGo}})
} else {
2016-08-24 07:07:51 +02:00
slice = *{{$arg}}.(*{{$slice}})
count = len(slice)
}
2016-08-16 09:30:08 +02:00
args := make([]interface{}, count)
if singular {
2016-08-16 09:30:08 +02:00
args[0] = object.{{.Column | titleCase}}
} else {
2016-08-16 09:30:08 +02:00
for i, obj := range slice {
args[i] = obj.{{.Column | titleCase}}
}
}
2016-08-16 09:30:08 +02:00
{{if .ToJoinTable -}}
query := fmt.Sprintf(
`select "{{id 0}}".*, "{{id 1}}"."{{.JoinLocalColumn}}" from "{{.ForeignTable}}" as "{{id 0}}" inner join "{{.JoinTable}}" as "{{id 1}}" on "{{id 0}}"."{{.ForeignColumn}}" = "{{id 1}}"."{{.JoinForeignColumn}}" where "{{id 1}}"."{{.JoinLocalColumn}}" in (%s)`,
2016-08-16 09:30:08 +02:00
strmangle.Placeholders(count, 1, 1),
)
{{else -}}
2016-08-16 07:24:56 +02:00
query := fmt.Sprintf(
`select * from "{{.ForeignTable}}" where "{{.ForeignColumn}}" in (%s)`,
strmangle.Placeholders(count, 1, 1),
)
2016-08-16 09:30:08 +02:00
{{end -}}
2016-08-16 07:24:56 +02:00
if boil.DebugMode {
fmt.Fprintf(boil.DebugWriter, "%s\n%v\n", query, args)
}
results, err := e.Query(query, args...)
if err != nil {
return errors.Wrap(err, "failed to eager load {{.ForeignTable}}")
}
2016-08-16 07:24:56 +02:00
defer results.Close()
var resultSlice []*{{$rel.ForeignTable.NameGo}}
{{if .ToJoinTable -}}
{{- $foreignTable := getTable $dot.Tables .ForeignTable -}}
{{- $joinTable := getTable $dot.Tables .JoinTable -}}
{{- $localCol := $joinTable.GetColumn .JoinLocalColumn}}
var localJoinCols []{{$localCol.Type}}
for results.Next() {
one := new({{$rel.ForeignTable.NameGo}})
var localJoinCol {{$localCol.Type}}
err = results.Scan({{$foreignTable.Columns | columnNames | stringMap $dot.StringFuncs.titleCase | prefixStringSlice "&one." | join ", "}}, &localJoinCol)
if err = results.Err(); err != nil {
return errors.Wrap(err, "failed to plebian-bind eager loaded slice {{.ForeignTable}}")
}
resultSlice = append(resultSlice, one)
localJoinCols = append(localJoinCols, localJoinCol)
}
if err = results.Err(); err != nil {
return errors.Wrap(err, "failed to plebian-bind eager loaded slice {{.ForeignTable}}")
}
{{else -}}
if err = boil.BindFast(results, &resultSlice, {{$dot.Table.Name | singular | camelCase}}TitleCases); err != nil {
return errors.Wrap(err, "failed to bind eager loaded slice {{.ForeignTable}}")
}
{{end}}
if singular {
2016-08-27 06:40:11 +02:00
if object.R == nil {
object.R = &{{$rel.LocalTable.NameGo}}R{}
}
2016-08-27 06:40:11 +02:00
object.R.{{$rel.Function.Name}} = resultSlice
return nil
}
{{if .ToJoinTable -}}
for i, foreign := range resultSlice {
localJoinCol := localJoinCols[i]
for _, local := range slice {
if local.{{$rel.Function.LocalAssignment}} == localJoinCol {
2016-08-27 06:40:11 +02:00
if local.R == nil {
local.R = &{{$rel.LocalTable.NameGo}}R{}
}
2016-08-27 06:40:11 +02:00
local.R.{{$rel.Function.Name}} = append(local.R.{{$rel.Function.Name}}, foreign)
break
}
}
}
{{else -}}
for _, foreign := range resultSlice {
for _, local := range slice {
if local.{{$rel.Function.LocalAssignment}} == foreign.{{$rel.Function.ForeignAssignment}} {
2016-08-27 06:40:11 +02:00
if local.R == nil {
local.R = &{{$rel.LocalTable.NameGo}}R{}
}
2016-08-27 06:40:11 +02:00
local.R.{{$rel.Function.Name}} = append(local.R.{{$rel.Function.Name}}, foreign)
break
}
}
}
{{end}}
return nil
}
{{end -}}{{/* if ForeignColumnUnique */}}
{{- end -}}{{/* range tomany */}}
{{- end -}}{{/* if isjointable */}}