(autoIndex: `off` | `eager`)
| 75 | } |
| 76 | |
| 77 | function createSubqueryTests(autoIndex: `off` | `eager`): void { |
| 78 | describe(`with autoIndex ${autoIndex}`, () => { |
| 79 | describe(`basic subqueries in FROM clause`, () => { |
| 80 | let issuesCollection: ReturnType<typeof createIssuesCollection> |
| 81 | |
| 82 | beforeEach(() => { |
| 83 | issuesCollection = createIssuesCollection(autoIndex) |
| 84 | }) |
| 85 | |
| 86 | test(`should create live query with simple subquery in FROM clause`, () => { |
| 87 | const liveCollection = createLiveQueryCollection({ |
| 88 | startSync: true, |
| 89 | query: (q) => { |
| 90 | const projectIssues = q |
| 91 | .from({ issue: issuesCollection }) |
| 92 | .where(({ issue }) => eq(issue.projectId, 1)) |
| 93 | |
| 94 | return q |
| 95 | .from({ filteredIssue: projectIssues }) |
| 96 | .select(({ filteredIssue }) => ({ |
| 97 | id: filteredIssue.id, |
| 98 | title: filteredIssue.title, |
| 99 | status: filteredIssue.status, |
| 100 | })) |
| 101 | }, |
| 102 | }) |
| 103 | |
| 104 | const results = liveCollection.toArray |
| 105 | expect(results).toHaveLength(4) // Issues 1, 2, 3, 5 are from project 1 |
| 106 | |
| 107 | expect(results.map((r) => r.id).sort()).toEqual([1, 2, 3, 5]) |
| 108 | expect(results.map((r) => r.title)).toEqual( |
| 109 | expect.arrayContaining([`Bug 1`, `Bug 2`, `Feature 1`, `Feature 2`]), |
| 110 | ) |
| 111 | }) |
| 112 | |
| 113 | test(`should create live query with subquery using query function syntax`, async () => { |
| 114 | const liveCollection = createLiveQueryCollection((q) => { |
| 115 | const openIssues = q |
| 116 | .from({ issue: issuesCollection }) |
| 117 | .where(({ issue }) => eq(issue.status, `open`)) |
| 118 | |
| 119 | return q.from({ openIssue: openIssues }).select(({ openIssue }) => ({ |
| 120 | id: openIssue.id, |
| 121 | title: openIssue.title, |
| 122 | projectId: openIssue.projectId, |
| 123 | })) |
| 124 | }) |
| 125 | await liveCollection.preload() |
| 126 | |
| 127 | const results = liveCollection.toArray |
| 128 | expect(results).toHaveLength(2) // Issues 1 and 4 are open |
| 129 | |
| 130 | expect(results.map((r) => r.id).sort()).toEqual([1, 4]) |
| 131 | expect( |
| 132 | results.every( |
| 133 | (r) => sampleIssues.find((i) => i.id === r.id)?.status === `open`, |
| 134 | ), |
no test coverage detected
searching dependent graphs…