OrderByNeighborTerms appends ordering based on the number of neighbors. For example, order users by their number of posts.
(q *sql.Selector, s *Step, opts ...sql.OrderTerm)
| 520 | // OrderByNeighborTerms appends ordering based on the number of neighbors. |
| 521 | // For example, order users by their number of posts. |
| 522 | func OrderByNeighborTerms(q *sql.Selector, s *Step, opts ...sql.OrderTerm) { |
| 523 | var ( |
| 524 | join *sql.Selector |
| 525 | build = sql.Dialect(q.Dialect()) |
| 526 | ) |
| 527 | switch { |
| 528 | case s.FromEdgeOwner(): |
| 529 | toT := build.Table(s.To.Table).Schema(s.To.Schema) |
| 530 | join = build.Select(toT.C(s.To.Column)). |
| 531 | From(toT) |
| 532 | selectTerms(join, opts) |
| 533 | q.LeftJoin(join). |
| 534 | On(q.C(s.Edge.Columns[0]), join.C(s.To.Column)) |
| 535 | case s.ThroughEdgeTable(): |
| 536 | pk1, pk2 := s.Edge.Columns[1], s.Edge.Columns[0] |
| 537 | if s.Edge.Inverse { |
| 538 | pk1, pk2 = pk2, pk1 |
| 539 | } |
| 540 | toT := build.Table(s.To.Table).Schema(s.To.Schema) |
| 541 | joinT := build.Table(s.Edge.Table).Schema(s.Edge.Schema) |
| 542 | join = build.Select(pk2). |
| 543 | From(toT). |
| 544 | Join(joinT). |
| 545 | On(toT.C(s.To.Column), joinT.C(pk1)). |
| 546 | GroupBy(pk2) |
| 547 | selectTerms(join, opts) |
| 548 | q.LeftJoin(join). |
| 549 | On(q.C(s.From.Column), join.C(pk2)) |
| 550 | case s.ToEdgeOwner(): |
| 551 | toT := build.Table(s.Edge.Table).Schema(s.Edge.Schema) |
| 552 | join = build.Select(toT.C(s.Edge.Columns[0])). |
| 553 | From(toT). |
| 554 | GroupBy(toT.C(s.Edge.Columns[0])) |
| 555 | selectTerms(join, opts) |
| 556 | q.LeftJoin(join). |
| 557 | On(q.C(s.From.Column), join.C(s.Edge.Columns[0])) |
| 558 | } |
| 559 | orderTerms(q, join, opts) |
| 560 | } |
| 561 | |
| 562 | // NeighborsLimit provides a modifier function that limits the |
| 563 | // number of neighbors (rows) loaded per parent row (node). |
searching dependent graphs…