ka/ent/gql_collection.go

612 lines
18 KiB
Go
Raw Normal View History

2024-10-04 20:22:25 +02:00
// Code generated by ent, DO NOT EDIT.
package ent
import (
"context"
"database/sql/driver"
"fmt"
"code.icod.de/dalu/ka/ent/category"
"code.icod.de/dalu/ka/ent/post"
"code.icod.de/dalu/ka/ent/profile"
"entgo.io/contrib/entgql"
"entgo.io/ent/dialect/sql"
"github.com/99designs/gqlgen/graphql"
"github.com/google/uuid"
)
// CollectFields tells the query-builder to eagerly load connected nodes by resolver context.
func (c *CategoryQuery) CollectFields(ctx context.Context, satisfies ...string) (*CategoryQuery, error) {
fc := graphql.GetFieldContext(ctx)
if fc == nil {
return c, nil
}
if err := c.collectField(ctx, false, graphql.GetOperationContext(ctx), fc.Field, nil, satisfies...); err != nil {
return nil, err
}
return c, nil
}
func (c *CategoryQuery) collectField(ctx context.Context, oneNode bool, opCtx *graphql.OperationContext, collected graphql.CollectedField, path []string, satisfies ...string) error {
path = append([]string(nil), path...)
var (
unknownSeen bool
fieldSeen = make(map[string]struct{}, len(category.Columns))
selectedFields = []string{category.FieldID}
)
for _, field := range graphql.CollectFields(opCtx, collected.Selections, satisfies) {
switch field.Name {
case "posts":
var (
alias = field.Alias
path = append(path, alias)
query = (&PostClient{config: c.config}).Query()
)
args := newPostPaginateArgs(fieldArgs(ctx, new(PostWhereInput), path...))
if err := validateFirstLast(args.first, args.last); err != nil {
return fmt.Errorf("validate first and last in path %q: %w", path, err)
}
pager, err := newPostPager(args.opts, args.last != nil)
if err != nil {
return fmt.Errorf("create new pager in path %q: %w", path, err)
}
if query, err = pager.applyFilter(query); err != nil {
return err
}
ignoredEdges := !hasCollectedField(ctx, append(path, edgesField)...)
if hasCollectedField(ctx, append(path, totalCountField)...) || hasCollectedField(ctx, append(path, pageInfoField)...) {
hasPagination := args.after != nil || args.first != nil || args.before != nil || args.last != nil
if hasPagination || ignoredEdges {
query := query.Clone()
c.loadTotal = append(c.loadTotal, func(ctx context.Context, nodes []*Category) error {
ids := make([]driver.Value, len(nodes))
for i := range nodes {
ids[i] = nodes[i].ID
}
var v []struct {
NodeID uuid.UUID `sql:"category_posts"`
Count int `sql:"count"`
}
query.Where(func(s *sql.Selector) {
s.Where(sql.InValues(s.C(category.PostsColumn), ids...))
})
if err := query.GroupBy(category.PostsColumn).Aggregate(Count()).Scan(ctx, &v); err != nil {
return err
}
m := make(map[uuid.UUID]int, len(v))
for i := range v {
m[v[i].NodeID] = v[i].Count
}
for i := range nodes {
n := m[nodes[i].ID]
if nodes[i].Edges.totalCount[0] == nil {
nodes[i].Edges.totalCount[0] = make(map[string]int)
}
nodes[i].Edges.totalCount[0][alias] = n
}
return nil
})
} else {
c.loadTotal = append(c.loadTotal, func(_ context.Context, nodes []*Category) error {
for i := range nodes {
n := len(nodes[i].Edges.Posts)
if nodes[i].Edges.totalCount[0] == nil {
nodes[i].Edges.totalCount[0] = make(map[string]int)
}
nodes[i].Edges.totalCount[0][alias] = n
}
return nil
})
}
}
if ignoredEdges || (args.first != nil && *args.first == 0) || (args.last != nil && *args.last == 0) {
continue
}
if query, err = pager.applyCursors(query, args.after, args.before); err != nil {
return err
}
path = append(path, edgesField, nodeField)
if field := collectedField(ctx, path...); field != nil {
if err := query.collectField(ctx, false, opCtx, *field, path, mayAddCondition(satisfies, postImplementors)...); err != nil {
return err
}
}
if limit := paginateLimit(args.first, args.last); limit > 0 {
if oneNode {
pager.applyOrder(query.Limit(limit))
} else {
modify := entgql.LimitPerRow(category.PostsColumn, limit, pager.orderExpr(query))
query.modifiers = append(query.modifiers, modify)
}
} else {
query = pager.applyOrder(query)
}
c.WithNamedPosts(alias, func(wq *PostQuery) {
*wq = *query
})
case "createdAt":
if _, ok := fieldSeen[category.FieldCreatedAt]; !ok {
selectedFields = append(selectedFields, category.FieldCreatedAt)
fieldSeen[category.FieldCreatedAt] = struct{}{}
}
case "updatedAt":
if _, ok := fieldSeen[category.FieldUpdatedAt]; !ok {
selectedFields = append(selectedFields, category.FieldUpdatedAt)
fieldSeen[category.FieldUpdatedAt] = struct{}{}
}
case "title":
if _, ok := fieldSeen[category.FieldTitle]; !ok {
selectedFields = append(selectedFields, category.FieldTitle)
fieldSeen[category.FieldTitle] = struct{}{}
}
case "description":
if _, ok := fieldSeen[category.FieldDescription]; !ok {
selectedFields = append(selectedFields, category.FieldDescription)
fieldSeen[category.FieldDescription] = struct{}{}
}
case "id":
case "__typename":
default:
unknownSeen = true
}
}
if !unknownSeen {
c.Select(selectedFields...)
}
return nil
}
type categoryPaginateArgs struct {
first, last *int
after, before *Cursor
opts []CategoryPaginateOption
}
func newCategoryPaginateArgs(rv map[string]any) *categoryPaginateArgs {
args := &categoryPaginateArgs{}
if rv == nil {
return args
}
if v := rv[firstField]; v != nil {
args.first = v.(*int)
}
if v := rv[lastField]; v != nil {
args.last = v.(*int)
}
if v := rv[afterField]; v != nil {
args.after = v.(*Cursor)
}
if v := rv[beforeField]; v != nil {
args.before = v.(*Cursor)
}
if v, ok := rv[orderByField]; ok {
switch v := v.(type) {
case map[string]any:
var (
err1, err2 error
order = &CategoryOrder{Field: &CategoryOrderField{}, Direction: entgql.OrderDirectionAsc}
)
if d, ok := v[directionField]; ok {
err1 = order.Direction.UnmarshalGQL(d)
}
if f, ok := v[fieldField]; ok {
err2 = order.Field.UnmarshalGQL(f)
}
if err1 == nil && err2 == nil {
args.opts = append(args.opts, WithCategoryOrder(order))
}
case *CategoryOrder:
if v != nil {
args.opts = append(args.opts, WithCategoryOrder(v))
}
}
}
if v, ok := rv[whereField].(*CategoryWhereInput); ok {
args.opts = append(args.opts, WithCategoryFilter(v.Filter))
}
return args
}
// CollectFields tells the query-builder to eagerly load connected nodes by resolver context.
func (po *PostQuery) CollectFields(ctx context.Context, satisfies ...string) (*PostQuery, error) {
fc := graphql.GetFieldContext(ctx)
if fc == nil {
return po, nil
}
if err := po.collectField(ctx, false, graphql.GetOperationContext(ctx), fc.Field, nil, satisfies...); err != nil {
return nil, err
}
return po, nil
}
func (po *PostQuery) collectField(ctx context.Context, oneNode bool, opCtx *graphql.OperationContext, collected graphql.CollectedField, path []string, satisfies ...string) error {
path = append([]string(nil), path...)
var (
unknownSeen bool
fieldSeen = make(map[string]struct{}, len(post.Columns))
selectedFields = []string{post.FieldID}
)
for _, field := range graphql.CollectFields(opCtx, collected.Selections, satisfies) {
switch field.Name {
case "category":
var (
alias = field.Alias
path = append(path, alias)
query = (&CategoryClient{config: po.config}).Query()
)
if err := query.collectField(ctx, oneNode, opCtx, field, path, mayAddCondition(satisfies, categoryImplementors)...); err != nil {
return err
}
po.withCategory = query
case "profile":
var (
alias = field.Alias
path = append(path, alias)
query = (&ProfileClient{config: po.config}).Query()
)
if err := query.collectField(ctx, oneNode, opCtx, field, path, mayAddCondition(satisfies, profileImplementors)...); err != nil {
return err
}
po.withProfile = query
case "createdAt":
if _, ok := fieldSeen[post.FieldCreatedAt]; !ok {
selectedFields = append(selectedFields, post.FieldCreatedAt)
fieldSeen[post.FieldCreatedAt] = struct{}{}
}
case "updatedAt":
if _, ok := fieldSeen[post.FieldUpdatedAt]; !ok {
selectedFields = append(selectedFields, post.FieldUpdatedAt)
fieldSeen[post.FieldUpdatedAt] = struct{}{}
}
case "expires":
if _, ok := fieldSeen[post.FieldExpires]; !ok {
selectedFields = append(selectedFields, post.FieldExpires)
fieldSeen[post.FieldExpires] = struct{}{}
}
case "expireTime":
if _, ok := fieldSeen[post.FieldExpireTime]; !ok {
selectedFields = append(selectedFields, post.FieldExpireTime)
fieldSeen[post.FieldExpireTime] = struct{}{}
}
case "title":
if _, ok := fieldSeen[post.FieldTitle]; !ok {
selectedFields = append(selectedFields, post.FieldTitle)
fieldSeen[post.FieldTitle] = struct{}{}
}
case "body":
if _, ok := fieldSeen[post.FieldBody]; !ok {
selectedFields = append(selectedFields, post.FieldBody)
fieldSeen[post.FieldBody] = struct{}{}
}
case "id":
case "__typename":
default:
unknownSeen = true
}
}
if !unknownSeen {
po.Select(selectedFields...)
}
return nil
}
type postPaginateArgs struct {
first, last *int
after, before *Cursor
opts []PostPaginateOption
}
func newPostPaginateArgs(rv map[string]any) *postPaginateArgs {
args := &postPaginateArgs{}
if rv == nil {
return args
}
if v := rv[firstField]; v != nil {
args.first = v.(*int)
}
if v := rv[lastField]; v != nil {
args.last = v.(*int)
}
if v := rv[afterField]; v != nil {
args.after = v.(*Cursor)
}
if v := rv[beforeField]; v != nil {
args.before = v.(*Cursor)
}
if v, ok := rv[orderByField]; ok {
switch v := v.(type) {
case map[string]any:
var (
err1, err2 error
order = &PostOrder{Field: &PostOrderField{}, Direction: entgql.OrderDirectionAsc}
)
if d, ok := v[directionField]; ok {
err1 = order.Direction.UnmarshalGQL(d)
}
if f, ok := v[fieldField]; ok {
err2 = order.Field.UnmarshalGQL(f)
}
if err1 == nil && err2 == nil {
args.opts = append(args.opts, WithPostOrder(order))
}
case *PostOrder:
if v != nil {
args.opts = append(args.opts, WithPostOrder(v))
}
}
}
if v, ok := rv[whereField].(*PostWhereInput); ok {
args.opts = append(args.opts, WithPostFilter(v.Filter))
}
return args
}
// CollectFields tells the query-builder to eagerly load connected nodes by resolver context.
func (pr *ProfileQuery) CollectFields(ctx context.Context, satisfies ...string) (*ProfileQuery, error) {
fc := graphql.GetFieldContext(ctx)
if fc == nil {
return pr, nil
}
if err := pr.collectField(ctx, false, graphql.GetOperationContext(ctx), fc.Field, nil, satisfies...); err != nil {
return nil, err
}
return pr, nil
}
func (pr *ProfileQuery) collectField(ctx context.Context, oneNode bool, opCtx *graphql.OperationContext, collected graphql.CollectedField, path []string, satisfies ...string) error {
path = append([]string(nil), path...)
var (
unknownSeen bool
fieldSeen = make(map[string]struct{}, len(profile.Columns))
selectedFields = []string{profile.FieldID}
)
for _, field := range graphql.CollectFields(opCtx, collected.Selections, satisfies) {
switch field.Name {
case "posts":
var (
alias = field.Alias
path = append(path, alias)
query = (&PostClient{config: pr.config}).Query()
)
args := newPostPaginateArgs(fieldArgs(ctx, new(PostWhereInput), path...))
if err := validateFirstLast(args.first, args.last); err != nil {
return fmt.Errorf("validate first and last in path %q: %w", path, err)
}
pager, err := newPostPager(args.opts, args.last != nil)
if err != nil {
return fmt.Errorf("create new pager in path %q: %w", path, err)
}
if query, err = pager.applyFilter(query); err != nil {
return err
}
ignoredEdges := !hasCollectedField(ctx, append(path, edgesField)...)
if hasCollectedField(ctx, append(path, totalCountField)...) || hasCollectedField(ctx, append(path, pageInfoField)...) {
hasPagination := args.after != nil || args.first != nil || args.before != nil || args.last != nil
if hasPagination || ignoredEdges {
query := query.Clone()
pr.loadTotal = append(pr.loadTotal, func(ctx context.Context, nodes []*Profile) error {
ids := make([]driver.Value, len(nodes))
for i := range nodes {
ids[i] = nodes[i].ID
}
var v []struct {
NodeID uuid.UUID `sql:"profile_posts"`
Count int `sql:"count"`
}
query.Where(func(s *sql.Selector) {
s.Where(sql.InValues(s.C(profile.PostsColumn), ids...))
})
if err := query.GroupBy(profile.PostsColumn).Aggregate(Count()).Scan(ctx, &v); err != nil {
return err
}
m := make(map[uuid.UUID]int, len(v))
for i := range v {
m[v[i].NodeID] = v[i].Count
}
for i := range nodes {
n := m[nodes[i].ID]
if nodes[i].Edges.totalCount[0] == nil {
nodes[i].Edges.totalCount[0] = make(map[string]int)
}
nodes[i].Edges.totalCount[0][alias] = n
}
return nil
})
} else {
pr.loadTotal = append(pr.loadTotal, func(_ context.Context, nodes []*Profile) error {
for i := range nodes {
n := len(nodes[i].Edges.Posts)
if nodes[i].Edges.totalCount[0] == nil {
nodes[i].Edges.totalCount[0] = make(map[string]int)
}
nodes[i].Edges.totalCount[0][alias] = n
}
return nil
})
}
}
if ignoredEdges || (args.first != nil && *args.first == 0) || (args.last != nil && *args.last == 0) {
continue
}
if query, err = pager.applyCursors(query, args.after, args.before); err != nil {
return err
}
path = append(path, edgesField, nodeField)
if field := collectedField(ctx, path...); field != nil {
if err := query.collectField(ctx, false, opCtx, *field, path, mayAddCondition(satisfies, postImplementors)...); err != nil {
return err
}
}
if limit := paginateLimit(args.first, args.last); limit > 0 {
if oneNode {
pager.applyOrder(query.Limit(limit))
} else {
modify := entgql.LimitPerRow(profile.PostsColumn, limit, pager.orderExpr(query))
query.modifiers = append(query.modifiers, modify)
}
} else {
query = pager.applyOrder(query)
}
pr.WithNamedPosts(alias, func(wq *PostQuery) {
*wq = *query
})
case "createdAt":
if _, ok := fieldSeen[profile.FieldCreatedAt]; !ok {
selectedFields = append(selectedFields, profile.FieldCreatedAt)
fieldSeen[profile.FieldCreatedAt] = struct{}{}
}
case "updatedAt":
if _, ok := fieldSeen[profile.FieldUpdatedAt]; !ok {
selectedFields = append(selectedFields, profile.FieldUpdatedAt)
fieldSeen[profile.FieldUpdatedAt] = struct{}{}
}
case "name":
if _, ok := fieldSeen[profile.FieldName]; !ok {
selectedFields = append(selectedFields, profile.FieldName)
fieldSeen[profile.FieldName] = struct{}{}
}
case "address":
if _, ok := fieldSeen[profile.FieldAddress]; !ok {
selectedFields = append(selectedFields, profile.FieldAddress)
fieldSeen[profile.FieldAddress] = struct{}{}
}
case "phone":
if _, ok := fieldSeen[profile.FieldPhone]; !ok {
selectedFields = append(selectedFields, profile.FieldPhone)
fieldSeen[profile.FieldPhone] = struct{}{}
}
case "id":
case "__typename":
default:
unknownSeen = true
}
}
if !unknownSeen {
pr.Select(selectedFields...)
}
return nil
}
type profilePaginateArgs struct {
first, last *int
after, before *Cursor
opts []ProfilePaginateOption
}
func newProfilePaginateArgs(rv map[string]any) *profilePaginateArgs {
args := &profilePaginateArgs{}
if rv == nil {
return args
}
if v := rv[firstField]; v != nil {
args.first = v.(*int)
}
if v := rv[lastField]; v != nil {
args.last = v.(*int)
}
if v := rv[afterField]; v != nil {
args.after = v.(*Cursor)
}
if v := rv[beforeField]; v != nil {
args.before = v.(*Cursor)
}
if v, ok := rv[orderByField]; ok {
switch v := v.(type) {
case map[string]any:
var (
err1, err2 error
order = &ProfileOrder{Field: &ProfileOrderField{}, Direction: entgql.OrderDirectionAsc}
)
if d, ok := v[directionField]; ok {
err1 = order.Direction.UnmarshalGQL(d)
}
if f, ok := v[fieldField]; ok {
err2 = order.Field.UnmarshalGQL(f)
}
if err1 == nil && err2 == nil {
args.opts = append(args.opts, WithProfileOrder(order))
}
case *ProfileOrder:
if v != nil {
args.opts = append(args.opts, WithProfileOrder(v))
}
}
}
if v, ok := rv[whereField].(*ProfileWhereInput); ok {
args.opts = append(args.opts, WithProfileFilter(v.Filter))
}
return args
}
const (
afterField = "after"
firstField = "first"
beforeField = "before"
lastField = "last"
orderByField = "orderBy"
directionField = "direction"
fieldField = "field"
whereField = "where"
)
func fieldArgs(ctx context.Context, whereInput any, path ...string) map[string]any {
field := collectedField(ctx, path...)
if field == nil || field.Arguments == nil {
return nil
}
oc := graphql.GetOperationContext(ctx)
args := field.ArgumentMap(oc.Variables)
return unmarshalArgs(ctx, whereInput, args)
}
// unmarshalArgs allows extracting the field arguments from their raw representation.
func unmarshalArgs(ctx context.Context, whereInput any, args map[string]any) map[string]any {
for _, k := range []string{firstField, lastField} {
v, ok := args[k]
if !ok {
continue
}
i, err := graphql.UnmarshalInt(v)
if err == nil {
args[k] = &i
}
}
for _, k := range []string{beforeField, afterField} {
v, ok := args[k]
if !ok {
continue
}
c := &Cursor{}
if c.UnmarshalGQL(v) == nil {
args[k] = c
}
}
if v, ok := args[whereField]; ok && whereInput != nil {
if err := graphql.UnmarshalInputFromContext(ctx, v, whereInput); err == nil {
args[whereField] = whereInput
}
}
return args
}
// mayAddCondition appends another type condition to the satisfies list
// if it does not exist in the list.
func mayAddCondition(satisfies []string, typeCond []string) []string {
Cond:
for _, c := range typeCond {
for _, s := range satisfies {
if c == s {
continue Cond
}
}
satisfies = append(satisfies, c)
}
return satisfies
}