Skip to content

Commit 72f2ee6

Browse files
feat: support comma seperated edge ordering
taken from ent#561
1 parent c7cc4a2 commit 72f2ee6

File tree

1 file changed

+49
-41
lines changed

1 file changed

+49
-41
lines changed

entgql/template.go

Lines changed: 49 additions & 41 deletions
Original file line numberDiff line numberDiff line change
@@ -455,50 +455,58 @@ func orderFields(n *gen.Type) ([]*OrderTerm, error) {
455455
edgeNamesWithThroughTables := make(map[string]interface{})
456456
for _, e := range n.Edges {
457457
name := strings.ToUpper(e.Name)
458-
switch ant, err := annotation(e.Annotations); {
459-
case err != nil:
458+
ant, err := annotation(e.Annotations)
459+
if err != nil {
460460
return nil, err
461-
case ant.Skip.Is(SkipOrderField), ant.OrderField == "":
462-
case strings.HasSuffix(ant.OrderField, "_COUNT") &&
463-
edgeNamesWithThroughTables[strings.TrimSuffix(ant.OrderField, "_COUNT")] != nil:
464-
// skip the through table annotations, annotations are applied on the `edge.To` edge instead
465-
case ant.OrderField == fmt.Sprintf("%s_COUNT", name):
466-
// Validate that the edge has a count ordering.
467-
if _, err := e.OrderCountName(); err != nil {
468-
return nil, fmt.Errorf("entgql: invalid order field %s defined on edge %s.%s: %w", ant.OrderField, n.Name, e.Name, err)
469-
}
470-
terms = append(terms, &OrderTerm{
471-
Owner: n,
472-
GQL: ant.OrderField,
473-
Type: n,
474-
Edge: e,
475-
Count: true,
476-
})
477-
case strings.HasPrefix(ant.OrderField, name+"_"):
478-
// Validate that the edge has an edge field ordering.
479-
if _, err := e.OrderFieldName(); err != nil {
480-
return nil, fmt.Errorf("entgql: invalid order field %s defined on edge %s.%s: %w", ant.OrderField, n.Name, e.Name, err)
461+
}
462+
if ant.Skip.Is(SkipOrderField) || ant.OrderField == "" {
463+
continue
464+
}
465+
orderFields := strings.Split(ant.OrderField, ",")
466+
for _, orderField := range orderFields {
467+
switch {
468+
case ant.Skip.Is(SkipOrderField), orderField == "":
469+
case strings.HasSuffix(orderField, "_COUNT") &&
470+
edgeNamesWithThroughTables[strings.TrimSuffix(orderField, "_COUNT")] != nil:
471+
// skip the through table annotations, annotations are applied on the `edge.To` edge instead
472+
case orderField == fmt.Sprintf("%s_COUNT", name):
473+
// Validate that the edge has a count ordering.
474+
if _, err := e.OrderCountName(); err != nil {
475+
return nil, fmt.Errorf("entgql: invalid order field %s defined on edge %s.%s: %w", orderField, n.Name, e.Name, err)
476+
}
477+
terms = append(terms, &OrderTerm{
478+
Owner: n,
479+
GQL: orderField,
480+
Type: n,
481+
Edge: e,
482+
Count: true,
483+
})
484+
case strings.HasPrefix(orderField, name+"_"):
485+
// Validate that the edge has an edge field ordering.
486+
if _, err := e.OrderFieldName(); err != nil {
487+
return nil, fmt.Errorf("entgql: invalid order field %s defined on edge %s.%s: %w", orderField, n.Name, e.Name, err)
488+
}
489+
ef := strings.TrimPrefix(orderField, name+"_")
490+
idx := slices.IndexFunc(e.Type.Fields, func(f *gen.Field) bool {
491+
ant, err := annotation(f.Annotations)
492+
return err == nil && ant.OrderField == ef
493+
})
494+
if idx == -1 {
495+
return nil, fmt.Errorf("entgql: order field %s defined on edge %s.%s was not found on its reference", orderField, n.Name, e.Name)
496+
}
497+
terms = append(terms, &OrderTerm{
498+
Owner: n,
499+
GQL: orderField,
500+
Edge: e,
501+
Type: e.Type,
502+
Field: e.Type.Fields[idx],
503+
})
504+
default:
505+
return nil, fmt.Errorf("entgql: invalid order field defined on edge %s.%s", n.Name, e.Name)
481506
}
482-
ef := strings.TrimPrefix(ant.OrderField, name+"_")
483-
idx := slices.IndexFunc(e.Type.Fields, func(f *gen.Field) bool {
484-
ant, err := annotation(f.Annotations)
485-
return err == nil && ant.OrderField == ef
486-
})
487-
if idx == -1 {
488-
return nil, fmt.Errorf("entgql: order field %s defined on edge %s.%s was not found on its reference", ant.OrderField, n.Name, e.Name)
507+
if e.Through != nil {
508+
edgeNamesWithThroughTables[name] = true
489509
}
490-
terms = append(terms, &OrderTerm{
491-
Owner: n,
492-
GQL: ant.OrderField,
493-
Edge: e,
494-
Type: e.Type,
495-
Field: e.Type.Fields[idx],
496-
})
497-
default:
498-
return nil, fmt.Errorf("entgql: invalid order field defined on edge %s.%s", n.Name, e.Name)
499-
}
500-
if e.Through != nil {
501-
edgeNamesWithThroughTables[name] = true
502510
}
503511
}
504512
return terms, nil

0 commit comments

Comments
 (0)