(t *testing.T)
| 2719 | } |
| 2720 | |
| 2721 | func TestLimitNeighbors(t *testing.T) { |
| 2722 | t.Run("O2M", func(t *testing.T) { |
| 2723 | const fk = "author_id" |
| 2724 | // Authors load their posts. |
| 2725 | s := sql.Select(fk, "id").From(sql.Table("posts")) |
| 2726 | LimitNeighbors(fk, 2)(s) |
| 2727 | query, args := s.Query() |
| 2728 | require.Equal(t, |
| 2729 | "WITH `src_query` AS (SELECT `author_id`, `id` FROM `posts`), `limited_query` AS (SELECT *, (ROW_NUMBER() OVER (PARTITION BY `author_id` ORDER BY `id`)) AS `row_number` FROM `src_query`) SELECT `author_id`, `id` FROM `limited_query` AS `posts` WHERE `posts`.`row_number` <= ?", |
| 2730 | query, |
| 2731 | ) |
| 2732 | require.Equal(t, []any{2}, args) |
| 2733 | }) |
| 2734 | t.Run("M2M", func(t *testing.T) { |
| 2735 | const fk = "user_id" |
| 2736 | edgeT, neighborsT := sql.Table("user_groups"), sql.Table("groups") |
| 2737 | s := sql.Select(fk, "id", "name").From(neighborsT).Join(edgeT).On(neighborsT.C("id"), edgeT.C("group_id")) |
| 2738 | LimitNeighbors(fk, 1, sql.ExprFunc(func(b *sql.Builder) { b.Ident("updated_at") }))(s) |
| 2739 | query, args := s.Query() |
| 2740 | require.Equal(t, |
| 2741 | "WITH `src_query` AS (SELECT `user_id`, `id`, `name` FROM `groups` JOIN `user_groups` AS `t1` ON `groups`.`id` = `t1`.`group_id`), `limited_query` AS (SELECT *, (ROW_NUMBER() OVER (PARTITION BY `user_id` ORDER BY `updated_at`)) AS `row_number` FROM `src_query`) SELECT `user_id`, `id`, `name` FROM `limited_query` AS `groups` WHERE `groups`.`row_number` <= ?", |
| 2742 | query, |
| 2743 | ) |
| 2744 | require.Equal(t, []any{1}, args) |
| 2745 | }) |
| 2746 | } |
| 2747 | |
| 2748 | func escape(query string) string { |
| 2749 | rows := strings.Split(query, "\n") |
nothing calls this directly
no test coverage detected
searching dependent graphs…