dialect/sql: move order-by options to top-level driver package (#3446)

This commit is contained in:
Ariel Mashraki
2023-04-07 00:35:20 +03:00
committed by GitHub
parent b26c2fe1bc
commit 02bb3269af
4 changed files with 210 additions and 266 deletions

View File

@@ -918,27 +918,43 @@ func TestOrderByNeighborsCount(t *testing.T) {
From(t1)
t.Run("O2M", func(t *testing.T) {
s := s.Clone()
OrderByNeighborsCount(s, NewOrderBy(
OrderByNeighborsCount(s,
NewStep(
From("users", "id"),
To("pets", "owner_id"),
Edge(O2M, false, "pets", "owner_id"),
),
OrderByExprDesc(nil, "count_pets"),
))
sql.OrderDesc(),
sql.OrderAs("count_pets"),
)
query, args := s.Query()
require.Empty(t, args)
require.Equal(t, `SELECT "users"."name" FROM "users" LEFT JOIN (SELECT "pets"."owner_id", COUNT(*) AS "count_pets" FROM "pets" GROUP BY "pets"."owner_id") AS "t1" ON "users"."id" = "t1"."owner_id" ORDER BY "t1"."count_pets" DESC NULLS LAST`, query)
})
t.Run("O2M/Selected", func(t *testing.T) {
s := s.Clone()
OrderByNeighborsCount(s,
NewStep(
From("users", "id"),
To("pets", "owner_id"),
Edge(O2M, false, "pets", "owner_id"),
),
sql.OrderDesc(),
sql.OrderSelectAs("count_pets"),
)
query, args := s.Query()
require.Empty(t, args)
require.Equal(t, `SELECT "users"."name", "t1"."count_pets" FROM "users" LEFT JOIN (SELECT "pets"."owner_id", COUNT(*) AS "count_pets" FROM "pets" GROUP BY "pets"."owner_id") AS "t1" ON "users"."id" = "t1"."owner_id" ORDER BY "t1"."count_pets" DESC NULLS LAST`, query)
})
t.Run("M2M", func(t *testing.T) {
s := s.Clone()
OrderByNeighborsCount(s, &OrderByOptions{
Step: NewStep(
OrderByNeighborsCount(s,
NewStep(
From("users", "id"),
To("groups", "id"),
Edge(M2M, false, "user_groups", "user_id", "group_id"),
),
})
)
query, args := s.Query()
require.Empty(t, args)
require.Equal(t, `SELECT "users"."name" FROM "users" LEFT JOIN (SELECT "user_groups"."user_id", COUNT(*) AS "count_groups" FROM "user_groups" GROUP BY "user_groups"."user_id") AS "t1" ON "users"."id" = "t1"."user_id" ORDER BY "t1"."count_groups" NULLS FIRST`, query)
@@ -946,44 +962,29 @@ func TestOrderByNeighborsCount(t *testing.T) {
// Zero or one.
t.Run("M2O", func(t *testing.T) {
s1, s2 := s.Clone(), s.Clone()
OrderByNeighborsCount(s1, NewOrderBy(
OrderByNeighborsCount(s1,
NewStep(
From("pets", "owner_id"),
To("users", "id"),
Edge(M2O, true, "pets", "owner_id"),
),
))
)
query, args := s1.Query()
require.Empty(t, args)
require.Equal(t, `SELECT "users"."name" FROM "users" ORDER BY "owner_id" IS NULL`, query)
OrderByNeighborsCount(s2, NewOrderBy(
OrderByNeighborsCount(s2,
NewStep(
From("pets", "owner_id"),
To("users", "id"),
Edge(M2O, true, "pets", "owner_id"),
),
OrderDesc(),
))
sql.OrderDesc(),
)
query, args = s2.Query()
require.Empty(t, args)
require.Equal(t, `SELECT "users"."name" FROM "users" ORDER BY "owner_id" IS NOT NULL`, query)
})
t.Run("Selected", func(t *testing.T) {
s := s.Clone()
OrderByNeighborsCount(s, NewOrderBy(
NewStep(
From("users", "id"),
To("pets", "owner_id"),
Edge(O2M, false, "pets", "owner_id"),
),
OrderByExprDesc(nil, "count_pets"),
OrderBySelected(),
))
query, args := s.Query()
require.Empty(t, args)
require.Equal(t, `SELECT "users"."name", "count_pets" FROM "users" LEFT JOIN (SELECT "pets"."owner_id", COUNT(*) AS "count_pets" FROM "pets" GROUP BY "pets"."owner_id") AS "t1" ON "users"."id" = "t1"."owner_id" ORDER BY "t1"."count_pets" DESC NULLS LAST`, query)
})
}
func TestOrderByNeighborTerms(t *testing.T) {
@@ -993,77 +994,55 @@ func TestOrderByNeighborTerms(t *testing.T) {
From(t1)
t.Run("M2O", func(t *testing.T) {
s := s.Clone()
OrderByNeighborTerms(s, NewOrderBy(
OrderByNeighborTerms(s,
NewStep(
From("users", "id"),
To("workplace", "id"),
Edge(M2O, true, "users", "workplace_id"),
),
OrderByColumn("name"),
))
sql.OrderByField("name"),
)
query, args := s.Query()
require.Empty(t, args)
require.Equal(t, `SELECT "users"."name" FROM "users" LEFT JOIN (SELECT "workplace"."id", "workplace"."name" FROM "workplace") AS "t1" ON "users"."workplace_id" = "t1"."id" ORDER BY "t1"."name" NULLS FIRST`, query)
})
t.Run("O2M", func(t *testing.T) {
s := s.Clone()
OrderByNeighborTerms(s, NewOrderBy(
OrderByNeighborTerms(s,
NewStep(
From("users", "id"),
To("repos", "id"),
Edge(O2M, false, "repo", "owner_id"),
),
OrderByExpr(
sql.OrderByExpr(
sql.ExprFunc(func(b *sql.Builder) {
b.S("SUM(").Ident("num_stars").S(")")
}),
"total_stars",
sql.OrderSelectAs("total_stars"),
),
))
)
query, args := s.Query()
require.Empty(t, args)
require.Equal(t, `SELECT "users"."name" FROM "users" LEFT JOIN (SELECT "repo"."owner_id", (SUM("num_stars")) AS "total_stars" FROM "repo" GROUP BY "repo"."owner_id") AS "t1" ON "users"."id" = "t1"."owner_id" ORDER BY "t1"."total_stars" NULLS FIRST`, query)
require.Equal(t, `SELECT "users"."name", "t1"."total_stars" FROM "users" LEFT JOIN (SELECT "repo"."owner_id", (SUM("num_stars")) AS "total_stars" FROM "repo" GROUP BY "repo"."owner_id") AS "t1" ON "users"."id" = "t1"."owner_id" ORDER BY "t1"."total_stars" NULLS FIRST`, query)
})
t.Run("M2M", func(t *testing.T) {
s := s.Clone()
OrderByNeighborTerms(s, NewOrderBy(
OrderByNeighborTerms(s,
NewStep(
From("users", "id"),
To("group", "id"),
Edge(M2M, false, "user_groups", "user_id", "group_id"),
),
OrderByExpr(
sql.OrderByExpr(
sql.ExprFunc(func(b *sql.Builder) {
b.S("SUM(").Ident("num_users").S(")")
}),
"total_users",
sql.OrderSelectAs("total_users"),
),
))
)
query, args := s.Query()
require.Empty(t, args)
require.Equal(t, `SELECT "users"."name" FROM "users" LEFT JOIN (SELECT "user_id", (SUM("num_users")) AS "total_users" FROM "group" JOIN "user_groups" AS "t1" ON "group"."id" = "t1"."group_id" GROUP BY "user_id") AS "t1" ON "users"."id" = "t1"."user_id" ORDER BY "t1"."total_users" NULLS FIRST`, query)
})
t.Run("Selected", func(t *testing.T) {
t1 := build.Table("users")
s := build.Select(t1.C("name")).
From(t1)
OrderByNeighborTerms(s, NewOrderBy(
NewStep(
From("users", "id"),
To("group", "id"),
Edge(M2M, false, "user_groups", "user_id", "group_id"),
),
OrderByExpr(
sql.ExprFunc(func(b *sql.Builder) {
b.S("SUM(").Ident("num_users").S(")")
}),
"total_users",
),
OrderBySelected(),
))
query, args := s.Query()
require.Empty(t, args)
require.Equal(t, `SELECT "users"."name", "total_users" FROM "users" LEFT JOIN (SELECT "user_id", (SUM("num_users")) AS "total_users" FROM "group" JOIN "user_groups" AS "t1" ON "group"."id" = "t1"."group_id" GROUP BY "user_id") AS "t1" ON "users"."id" = "t1"."user_id" ORDER BY "t1"."total_users" NULLS FIRST`, query)
require.Equal(t, `SELECT "users"."name", "t1"."total_users" FROM "users" LEFT JOIN (SELECT "user_id", (SUM("num_users")) AS "total_users" FROM "group" JOIN "user_groups" AS "t1" ON "group"."id" = "t1"."group_id" GROUP BY "user_id") AS "t1" ON "users"."id" = "t1"."user_id" ORDER BY "t1"."total_users" NULLS FIRST`, query)
})
}