// 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 }