Add support for postgres GROUPING SET, ROLLUP and CUBE grouping operators

Add support for mysql WITH ROLLUP grouping operator
Add support for GROUPING operator
This commit is contained in:
go-jet 2023-03-28 13:16:57 +02:00
parent 31dc7b6dd3
commit fa69565dbf
9 changed files with 476 additions and 70 deletions

View file

@ -217,16 +217,95 @@ GROUP BY payment.customer_id;
}
func TestGroupByWithRollup(t *testing.T) {
skipForMariaDB(t)
stmt := SELECT(
Inventory.FilmID.AS("film_id"),
Inventory.StoreID.AS("store_id"),
GROUPING(Inventory.FilmID).AS("grouping_film_id"),
GROUPING(Inventory.FilmID, Inventory.StoreID).AS("grouping_film_id_store_id"),
COUNT(STAR).AS("count"),
).FROM(
Inventory,
).WHERE(
Inventory.FilmID.IN(Int(2), Int(3)),
).GROUP_BY(
WITH_ROLLUP(Inventory.FilmID, Inventory.StoreID),
).ORDER_BY(
Inventory.FilmID,
Inventory.StoreID,
)
testutils.AssertDebugStatementSql(t, stmt, `
SELECT inventory.film_id AS "film_id",
inventory.store_id AS "store_id",
GROUPING(inventory.film_id) AS "grouping_film_id",
GROUPING(inventory.film_id, inventory.store_id) AS "grouping_film_id_store_id",
COUNT(*) AS "count"
FROM dvds.inventory
WHERE inventory.film_id IN (2, 3)
GROUP BY inventory.film_id, inventory.store_id WITH ROLLUP
ORDER BY inventory.film_id, inventory.store_id;
`)
var dest []struct {
FilmID int
StoreID int
GroupingFilmID int
GroupingFilmIDStoreID int
}
err := stmt.Query(db, &dest)
require.NoError(t, err)
testutils.AssertJSON(t, dest, `
[
{
"FilmID": 0,
"StoreID": 0,
"GroupingFilmID": 1,
"GroupingFilmIDStoreID": 3
},
{
"FilmID": 2,
"StoreID": 0,
"GroupingFilmID": 0,
"GroupingFilmIDStoreID": 1
},
{
"FilmID": 2,
"StoreID": 2,
"GroupingFilmID": 0,
"GroupingFilmIDStoreID": 0
},
{
"FilmID": 3,
"StoreID": 0,
"GroupingFilmID": 0,
"GroupingFilmIDStoreID": 1
},
{
"FilmID": 3,
"StoreID": 2,
"GroupingFilmID": 0,
"GroupingFilmIDStoreID": 0
}
]
`)
}
func TestSubQuery(t *testing.T) {
rRatingFilms := Film.
SELECT(
Film.FilmID,
Film.Title,
Film.Rating,
).
WHERE(Film.Rating.EQ(enum.FilmRating.R)).
AsTable("rFilms")
rRatingFilms := SELECT(
Film.FilmID,
Film.Title,
Film.Rating,
).FROM(
Film,
).WHERE(
Film.Rating.EQ(enum.FilmRating.R),
).AsTable("rFilms")
rFilmID := Film.FilmID.From(rRatingFilms)