0818af0e26
- In the bowels of the eager loading we weave in and out of reflection, but we should not care about using XSlice unless it's going back to the user. This change makes it so the XSlice is only used where it matters, everywhere else is *[]*X to avoid type assertion errors from being able to have either or come into the Load() functions. - Fix #124
92 lines
2.5 KiB
Smarty
92 lines
2.5 KiB
Smarty
{{- if .Table.IsJoinTable -}}
|
|
{{- else -}}
|
|
{{- $dot := . -}}
|
|
{{- range .Table.ToOneRelationships -}}
|
|
{{- $txt := txtsFromOneToOne $dot.Tables $dot.Table . -}}
|
|
{{- $varNameSingular := $dot.Table.Name | singular | camelCase -}}
|
|
{{- $arg := printf "maybe%s" $txt.LocalTable.NameGo -}}
|
|
// Load{{$txt.Function.Name}} allows an eager lookup of values, cached into the
|
|
// loaded structs of the objects.
|
|
func ({{$varNameSingular}}L) Load{{$txt.Function.Name}}(e boil.Executor, singular bool, {{$arg}} interface{}) error {
|
|
var slice []*{{$txt.LocalTable.NameGo}}
|
|
var object *{{$txt.LocalTable.NameGo}}
|
|
|
|
count := 1
|
|
if singular {
|
|
object = {{$arg}}.(*{{$txt.LocalTable.NameGo}})
|
|
} else {
|
|
slice = *{{$arg}}.(*[]*{{$txt.LocalTable.NameGo}})
|
|
count = len(slice)
|
|
}
|
|
|
|
args := make([]interface{}, count)
|
|
if singular {
|
|
if object.R == nil {
|
|
object.R = &{{$varNameSingular}}R{}
|
|
}
|
|
args[0] = object.{{$txt.LocalTable.ColumnNameGo}}
|
|
} else {
|
|
for i, obj := range slice {
|
|
if obj.R == nil {
|
|
obj.R = &{{$varNameSingular}}R{}
|
|
}
|
|
args[i] = obj.{{$txt.LocalTable.ColumnNameGo}}
|
|
}
|
|
}
|
|
|
|
query := fmt.Sprintf(
|
|
"select * from {{.ForeignTable | $dot.SchemaTable}} where {{.ForeignColumn | $dot.Quotes}} in (%s)",
|
|
strmangle.Placeholders(dialect.IndexPlaceholders, count, 1, 1),
|
|
)
|
|
|
|
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 {{$txt.ForeignTable.NameGo}}")
|
|
}
|
|
defer results.Close()
|
|
|
|
var resultSlice []*{{$txt.ForeignTable.NameGo}}
|
|
if err = queries.Bind(results, &resultSlice); err != nil {
|
|
return errors.Wrap(err, "failed to bind eager loaded slice {{$txt.ForeignTable.NameGo}}")
|
|
}
|
|
|
|
{{if not $dot.NoHooks -}}
|
|
if len({{$varNameSingular}}AfterSelectHooks) != 0 {
|
|
for _, obj := range resultSlice {
|
|
if err := obj.doAfterSelectHooks(e); err != nil {
|
|
return err
|
|
}
|
|
}
|
|
}
|
|
{{- end}}
|
|
|
|
if len(resultSlice) == 0 {
|
|
return nil
|
|
}
|
|
|
|
if singular {
|
|
object.R.{{$txt.Function.Name}} = resultSlice[0]
|
|
return nil
|
|
}
|
|
|
|
for _, local := range slice {
|
|
for _, foreign := range resultSlice {
|
|
{{if $txt.Function.UsesBytes -}}
|
|
if 0 == bytes.Compare(local.{{$txt.Function.LocalAssignment}}, foreign.{{$txt.Function.ForeignAssignment}}) {
|
|
{{else -}}
|
|
if local.{{$txt.Function.LocalAssignment}} == foreign.{{$txt.Function.ForeignAssignment}} {
|
|
{{end -}}
|
|
local.R.{{$txt.Function.Name}} = foreign
|
|
break
|
|
}
|
|
}
|
|
}
|
|
|
|
return nil
|
|
}
|
|
{{end -}}{{/* range */}}
|
|
{{end}}{{/* join table */}}
|