(autoIndex: `off` | `eager`)
| 201 | } |
| 202 | |
| 203 | function createJoinSubqueryTests(autoIndex: `off` | `eager`): void { |
| 204 | describe(`with autoIndex ${autoIndex}`, () => { |
| 205 | describe(`subqueries in FROM clause with joins`, () => { |
| 206 | let issuesCollection: ReturnType<typeof createIssuesCollection> |
| 207 | let usersCollection: ReturnType<typeof createUsersCollection> |
| 208 | |
| 209 | beforeEach(() => { |
| 210 | issuesCollection = createIssuesCollection(autoIndex) |
| 211 | usersCollection = createUsersCollection(autoIndex) |
| 212 | }) |
| 213 | |
| 214 | test(`should join subquery with collection - inner join`, () => { |
| 215 | const joinQuery = createLiveQueryCollection({ |
| 216 | startSync: true, |
| 217 | query: (q) => { |
| 218 | // Subquery: filter issues by project 1 |
| 219 | const project1Issues = q |
| 220 | .from({ issue: issuesCollection }) |
| 221 | .where(({ issue }) => eq(issue.projectId, 1)) |
| 222 | |
| 223 | // Join subquery with users |
| 224 | return q |
| 225 | .from({ issue: project1Issues }) |
| 226 | .join( |
| 227 | { user: usersCollection }, |
| 228 | ({ issue, user }) => eq(issue.userId, user.id), |
| 229 | `inner`, |
| 230 | ) |
| 231 | .select(({ issue, user }) => ({ |
| 232 | issue_title: issue.title, |
| 233 | user_name: user.name, |
| 234 | issue_duration: issue.duration, |
| 235 | user_status: user.status, |
| 236 | })) |
| 237 | }, |
| 238 | }) |
| 239 | |
| 240 | const results = joinQuery.toArray |
| 241 | expect(results).toHaveLength(3) // Issues 1, 2, 3 from project 1 with users |
| 242 | |
| 243 | const resultTitles = results.map((r) => r.issue_title).sort() |
| 244 | expect(resultTitles).toEqual([`Bug 1`, `Bug 2`, `Feature 1`]) |
| 245 | |
| 246 | const alice = results.find((r) => r.user_name === `Alice`) |
| 247 | expect(alice).toMatchObject({ |
| 248 | user_name: `Alice`, |
| 249 | user_status: `active`, |
| 250 | }) |
| 251 | }) |
| 252 | |
| 253 | test(`should join collection with subquery - left join`, () => { |
| 254 | const joinQuery = createLiveQueryCollection({ |
| 255 | startSync: true, |
| 256 | query: (q) => { |
| 257 | // Subquery: filter active users |
| 258 | const activeUsers = q |
| 259 | .from({ user: usersCollection }) |
| 260 | .where(({ user }) => eq(user.status, `active`)) |
no test coverage detected
searching dependent graphs…