entc/gen: allow group-by by relations

This commit is contained in:
Ariel Mashraki
2021-04-19 13:57:51 +03:00
committed by Ariel Mashraki
parent 26b8f3b6b2
commit a51c50f6a3
100 changed files with 1829 additions and 337 deletions

View File

@@ -782,12 +782,23 @@ func (ggb *GroupGroupBy) sqlScan(ctx context.Context, v interface{}) error {
func (ggb *GroupGroupBy) sqlQuery() *sql.Selector {
selector := ggb.sql
columns := make([]string, 0, len(ggb.fields)+len(ggb.fns))
columns = append(columns, ggb.fields...)
aggregation := make([]string, 0, len(ggb.fns))
for _, fn := range ggb.fns {
columns = append(columns, fn(selector))
aggregation = append(aggregation, fn(selector))
}
return selector.Select(columns...).GroupBy(ggb.fields...)
// If no columns were selected in a custom aggregation function, the default
// selection is the fields used for "group-by", and the aggregation functions.
if len(selector.Columns()) == 0 {
columns := make([]string, 0, len(ggb.fields)+len(ggb.fns))
for _, f := range ggb.fields {
columns = append(columns, selector.C(f))
}
for _, c := range aggregation {
columns = append(columns, c)
}
selector.Select(columns...)
}
return selector.GroupBy(selector.Columns(ggb.fields...)...)
}
// GroupSelect is the builder for selecting fields of Group entities.

View File

@@ -782,12 +782,23 @@ func (ugb *UserGroupBy) sqlScan(ctx context.Context, v interface{}) error {
func (ugb *UserGroupBy) sqlQuery() *sql.Selector {
selector := ugb.sql
columns := make([]string, 0, len(ugb.fields)+len(ugb.fns))
columns = append(columns, ugb.fields...)
aggregation := make([]string, 0, len(ugb.fns))
for _, fn := range ugb.fns {
columns = append(columns, fn(selector))
aggregation = append(aggregation, fn(selector))
}
return selector.Select(columns...).GroupBy(ugb.fields...)
// If no columns were selected in a custom aggregation function, the default
// selection is the fields used for "group-by", and the aggregation functions.
if len(selector.Columns()) == 0 {
columns := make([]string, 0, len(ugb.fields)+len(ugb.fns))
for _, f := range ugb.fields {
columns = append(columns, selector.C(f))
}
for _, c := range aggregation {
columns = append(columns, c)
}
selector.Select(columns...)
}
return selector.GroupBy(selector.Columns(ugb.fields...)...)
}
// UserSelect is the builder for selecting fields of User entities.