2016-09-09 14:31:51 +02:00
{ { - / * Begin execution of template for many - to - one or many - to - many eager load * / - } }
2016-08-12 08:16:06 +02:00
{ { - if . Table . IsJoinTable - } }
2016-08-21 08:28:47 +02:00
{ { - else - } }
2016-09-14 10:08:30 +02:00
{ { - $dot : = . - } }
{ { - range . Table . ToManyRelationships - } }
2016-09-18 08:50:31 +02:00
{ { - $varNameSingular : = $dot.Table.Name | singular | camelCase - } }
2016-09-18 20:18:43 +02:00
{ { - $txt : = txtsFromToMany $dot.Tables $dot.Table . - } }
2016-09-18 08:50:31 +02:00
{ { - $arg : = printf "maybe%s" $txt.LocalTable.NameGo - } }
{ { - $slice : = printf "%sSlice" $txt.LocalTable.NameGo - } }
{ { - $schemaForeignTable : = . ForeignTable | $dot.SchemaTable } }
2016-08-29 18:36:07 +02:00
// Load { { $txt.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-09-02 03:22:56 +02:00
func ( { { $varNameSingular } } L) Load { { $txt.Function.Name } } (e boil.Executor, singular bool, { { $arg } } interface { } ) error {
2016-09-14 10:08:30 +02:00
var slice []* { { $txt.LocalTable.NameGo } }
var object * { { $txt.LocalTable.NameGo } }
2016-08-12 08:16:06 +02:00
2016-09-14 10:08:30 +02:00
count := 1
if singular {
object = { { $arg } } .(* { { $txt.LocalTable.NameGo } } )
} else {
slice = * { { $arg } } .(* { { $slice } } )
count = len(slice)
}
2016-08-12 08:16:06 +02:00
2016-09-14 10:08:30 +02:00
args := make([]interface { } , count)
if singular {
args[0] = object. { { . Column | titleCase } }
} else {
for i, obj := range slice {
args[i] = obj. { { . Column | titleCase } }
}
}
2016-08-12 08:16:06 +02:00
2016-09-14 10:08:30 +02:00
{ { if . ToJoinTable - } }
{ { - $schemaJoinTable : = . JoinTable | $dot.SchemaTable - } }
query := fmt.Sprintf(
"select { { id 0 | $dot.Quotes } } .*, { { id 1 | $dot.Quotes } } . { { . JoinLocalColumn | $dot.Quotes } } from { { $schemaForeignTable } } as { { id 0 | $dot.Quotes } } inner join { { $schemaJoinTable } } as { { id 1 | $dot.Quotes } } on { { id 0 | $dot.Quotes } } . { { . ForeignColumn | $dot.Quotes } } = { { id 1 | $dot.Quotes } } . { { . JoinForeignColumn | $dot.Quotes } } where { { id 1 | $dot.Quotes } } . { { . JoinLocalColumn | $dot.Quotes } } in (%s)",
strmangle.Placeholders(dialect.IndexPlaceholders, count, 1, 1),
)
{ { else - } }
query := fmt.Sprintf(
"select * from { { $schemaForeignTable } } where { { . ForeignColumn | $dot.Quotes } } in (%s)",
strmangle.Placeholders(dialect.IndexPlaceholders, count, 1, 1),
)
{ { end - } }
2016-08-16 07:24:56 +02:00
2016-09-14 10:08:30 +02:00
if boil.DebugMode {
fmt.Fprintf(boil.DebugWriter, "%s\n%v\n", query, args)
}
2016-08-17 06:08:55 +02:00
2016-09-14 10:08:30 +02:00
results, err := e.Query(query, args...)
if err != nil {
return errors.Wrap(err, "failed to eager load { { . ForeignTable } } ")
}
defer results.Close()
2016-08-12 08:16:06 +02:00
2016-09-14 10:08:30 +02:00
var resultSlice []* { { $txt.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( { { $txt.ForeignTable.NameGo } } )
var localJoinCol { { $localCol.Type } }
2016-08-18 08:07:39 +02:00
2016-09-14 10:08:30 +02:00
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 } } ")
}
2016-08-18 08:07:39 +02:00
2016-09-14 10:08:30 +02:00
resultSlice = append(resultSlice, one)
localJoinCols = append(localJoinCols, localJoinCol)
}
2016-08-18 08:07:39 +02:00
2016-09-14 10:08:30 +02:00
if err = results.Err(); err != nil {
return errors.Wrap(err, "failed to plebian-bind eager loaded slice { { . ForeignTable } } ")
}
{ { else - } }
2016-09-15 05:59:55 +02:00
if err = queries.Bind(results, &resultSlice); err != nil {
2016-09-14 10:08:30 +02:00
return errors.Wrap(err, "failed to bind eager loaded slice { { . ForeignTable } } ")
}
{ { end } }
2016-08-12 08:16:06 +02:00
2016-09-14 10:08:30 +02:00
{ { if not $dot.NoHooks - } }
if len( { { . ForeignTable | singular | camelCase } } AfterSelectHooks) != 0 {
for _, obj := range resultSlice {
if err := obj.doAfterSelectHooks(e); err != nil {
return err
}
}
}
2016-08-29 18:36:07 +02:00
2016-09-14 10:08:30 +02:00
{ { - end } }
if singular {
if object.R == nil {
object.R = & { { $varNameSingular } } R { }
}
object.R. { { $txt.Function.Name } } = resultSlice
return nil
}
2016-08-12 08:16:06 +02:00
2016-09-14 10:08:30 +02:00
{ { if . ToJoinTable - } }
for i, foreign := range resultSlice {
localJoinCol := localJoinCols[i]
for _, local := range slice {
2016-09-17 09:02:03 +02:00
{ { if $txt.Function.UsesBytes - } }
2016-09-16 09:22:12 +02:00
if 0 == bytes.Compare(local. { { $txt.Function.LocalAssignment } } , localJoinCol) {
{ { else - } }
2016-09-14 10:08:30 +02:00
if local. { { $txt.Function.LocalAssignment } } == localJoinCol {
2016-09-16 09:22:12 +02:00
{ { end - } }
2016-09-14 10:08:30 +02:00
if local.R == nil {
local.R = & { { $varNameSingular } } R { }
}
local.R. { { $txt.Function.Name } } = append(local.R. { { $txt.Function.Name } } , foreign)
break
}
}
}
{ { else - } }
for _, foreign := range resultSlice {
for _, local := range slice {
2016-09-17 09:02:03 +02:00
{ { if $txt.Function.UsesBytes - } }
2016-09-16 09:22:12 +02:00
if 0 == bytes.Compare(local. { { $txt.Function.LocalAssignment } } , foreign. { { $txt.Function.ForeignAssignment } } ) {
{ { else - } }
2016-09-14 10:08:30 +02:00
if local. { { $txt.Function.LocalAssignment } } == foreign. { { $txt.Function.ForeignAssignment } } {
2016-09-16 09:22:12 +02:00
{ { end - } }
2016-09-14 10:08:30 +02:00
if local.R == nil {
local.R = & { { $varNameSingular } } R { }
}
local.R. { { $txt.Function.Name } } = append(local.R. { { $txt.Function.Name } } , foreign)
break
}
}
}
{ { end } }
2016-08-12 08:16:06 +02:00
2016-09-14 10:08:30 +02:00
return nil
2016-08-12 08:16:06 +02:00
}
2016-09-18 08:50:31 +02:00
{ { end - } } { { / * range tomany * / } }
2016-09-09 14:31:51 +02:00
{ { - end - } } { { / * if IsJoinTable * / } }