|
5 | 5 | jsonObjectFrom, |
6 | 6 | sql, |
7 | 7 | ExpressionBuilder, |
8 | | - Selectable, |
9 | 8 | } from '..' |
10 | | -import { Database, Pet } from '../shared' |
| 9 | +import { Database } from '../shared' |
11 | 10 | import { expectType } from 'tsd' |
12 | 11 |
|
13 | 12 | async function testPostgresJsonSelects(db: Kysely<Database>) { |
@@ -78,54 +77,85 @@ async function testPostgresConditionalJsonSelects(db: Kysely<Database>) { |
78 | 77 |
|
79 | 78 | async function testPostgresJsonAgg(db: Kysely<Database>) { |
80 | 79 | const r1 = await db |
81 | | - .selectFrom('person') |
82 | | - .innerJoin('pet', 'pet.owner_id', 'person.id') |
83 | | - .select((eb) => ['first_name', eb.fn.jsonAgg('pet').as('pets')]) |
84 | | - .groupBy('person.first_name') |
| 80 | + .selectFrom('pet') |
| 81 | + .innerJoin('person', 'pet.owner_id', 'person.id') |
| 82 | + .select((eb) => ['pet.name', eb.fn.jsonAgg('person').as('people')]) |
| 83 | + .groupBy('pet.name') |
85 | 84 | .execute() |
86 | 85 |
|
87 | 86 | expectType< |
88 | 87 | { |
89 | | - first_name: string |
90 | | - pets: Selectable<Pet>[] |
| 88 | + name: string |
| 89 | + people: { |
| 90 | + id: number |
| 91 | + first_name: string |
| 92 | + last_name: string | null |
| 93 | + age: number |
| 94 | + gender: 'male' | 'female' | 'other' |
| 95 | + marital_status: 'single' | 'married' | 'divorced' | 'widowed' | null |
| 96 | + modified_at: string |
| 97 | + deleted_at: string | null |
| 98 | + }[] |
91 | 99 | }[] |
92 | 100 | >(r1) |
93 | 101 |
|
94 | 102 | const r2 = await db |
95 | | - .selectFrom('person') |
| 103 | + .selectFrom('pet') |
96 | 104 | .select((eb) => [ |
97 | | - 'first_name', |
| 105 | + 'name', |
98 | 106 | eb |
99 | | - .selectFrom('pet') |
100 | | - .select((eb) => eb.fn.jsonAgg('pet').as('pet')) |
| 107 | + .selectFrom('person') |
| 108 | + .select((eb) => eb.fn.jsonAgg('person').as('people')) |
101 | 109 | .whereRef('pet.owner_id', '=', 'person.id') |
102 | | - .as('pets'), |
| 110 | + .as('people'), |
103 | 111 | ]) |
104 | 112 | .execute() |
105 | 113 |
|
106 | 114 | expectType< |
107 | 115 | { |
108 | | - first_name: string |
109 | | - pets: Selectable<Pet>[] | null |
| 116 | + name: string |
| 117 | + people: |
| 118 | + | { |
| 119 | + id: number |
| 120 | + first_name: string |
| 121 | + last_name: string | null |
| 122 | + age: number |
| 123 | + gender: 'male' | 'female' | 'other' |
| 124 | + marital_status: 'single' | 'married' | 'divorced' | 'widowed' | null |
| 125 | + modified_at: string |
| 126 | + deleted_at: string | null |
| 127 | + }[] |
| 128 | + | null |
110 | 129 | }[] |
111 | 130 | >(r2) |
112 | 131 |
|
113 | 132 | const r3 = await db |
114 | | - .selectFrom('person') |
| 133 | + .selectFrom('pet') |
115 | 134 | .select((eb) => [ |
116 | | - 'first_name', |
| 135 | + 'name', |
117 | 136 | eb |
118 | | - .selectFrom('pet') |
119 | | - .select((eb) => eb.fn.jsonAgg(eb.table('pet')).as('pet')) |
| 137 | + .selectFrom('person') |
| 138 | + .select((eb) => eb.fn.jsonAgg(eb.table('person')).as('people')) |
120 | 139 | .whereRef('pet.owner_id', '=', 'person.id') |
121 | | - .as('pets'), |
| 140 | + .as('people'), |
122 | 141 | ]) |
123 | 142 | .execute() |
124 | 143 |
|
125 | 144 | expectType< |
126 | 145 | { |
127 | | - first_name: string |
128 | | - pets: Selectable<Pet>[] | null |
| 146 | + name: string |
| 147 | + people: |
| 148 | + | { |
| 149 | + id: number |
| 150 | + first_name: string |
| 151 | + last_name: string | null |
| 152 | + age: number |
| 153 | + gender: 'male' | 'female' | 'other' |
| 154 | + marital_status: 'single' | 'married' | 'divorced' | 'widowed' | null |
| 155 | + modified_at: string |
| 156 | + deleted_at: string | null |
| 157 | + }[] |
| 158 | + | null |
129 | 159 | }[] |
130 | 160 | >(r3) |
131 | 161 |
|
@@ -171,31 +201,43 @@ async function testPostgresJsonAgg(db: Kysely<Database>) { |
171 | 201 | }>(r4) |
172 | 202 |
|
173 | 203 | const r5 = await db |
174 | | - .selectFrom('person') |
175 | | - .innerJoin('pet', 'pet.owner_id', 'person.id') |
176 | | - .select((eb) => ['first_name', eb.fn.jsonAgg('owner_id').as('pet_names')]) |
177 | | - .groupBy('person.first_name') |
| 204 | + .selectFrom('pet') |
| 205 | + .innerJoin('person', 'pet.owner_id', 'person.id') |
| 206 | + .select((eb) => [ |
| 207 | + 'name', |
| 208 | + eb.fn.jsonAgg('person.modified_at').as('modified_at'), |
| 209 | + ]) |
| 210 | + .groupBy('name') |
178 | 211 | .execute() |
179 | 212 |
|
180 | 213 | expectType< |
181 | 214 | { |
182 | | - first_name: string |
183 | | - pet_names: number[] | null |
| 215 | + name: string |
| 216 | + modified_at: string[] | null |
184 | 217 | }[] |
185 | 218 | >(r5) |
186 | 219 | } |
187 | 220 |
|
188 | 221 | async function testPostgresToJson(db: Kysely<Database>) { |
189 | 222 | const r1 = await db |
190 | | - .selectFrom('person') |
191 | | - .innerJoin('pet', 'pet.owner_id', 'person.id') |
192 | | - .select((eb) => ['first_name', eb.fn.toJson('pet').as('pet')]) |
| 223 | + .selectFrom('pet') |
| 224 | + .innerJoin('person', 'pet.owner_id', 'person.id') |
| 225 | + .select((eb) => ['name', eb.fn.toJson('person').as('person')]) |
193 | 226 | .execute() |
194 | 227 |
|
195 | 228 | expectType< |
196 | 229 | { |
197 | | - first_name: string |
198 | | - pet: Selectable<Pet> |
| 230 | + name: string |
| 231 | + person: { |
| 232 | + id: number |
| 233 | + first_name: string |
| 234 | + last_name: string | null |
| 235 | + age: number |
| 236 | + gender: 'male' | 'female' | 'other' |
| 237 | + marital_status: 'single' | 'married' | 'divorced' | 'widowed' | null |
| 238 | + modified_at: string |
| 239 | + deleted_at: string | null |
| 240 | + } |
199 | 241 | }[] |
200 | 242 | >(r1) |
201 | 243 | } |
|
0 commit comments