Skip to content

Commit d20e205

Browse files
committed
handle a mix of requested info
1 parent 4b4f40c commit d20e205

File tree

2 files changed

+42
-4
lines changed

2 files changed

+42
-4
lines changed

packages/slonik-dataloaders/src/factories/createConnectionLoaderClass.test.ts

Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -337,6 +337,17 @@ describe('createConnectionLoaderClass', () => {
337337
});
338338

339339
it('gets the count without fetching edges', async () => {
340+
const loader = new PersonConnectionLoader(pool, {});
341+
const result = await loader.load({
342+
info: getInfo(['count']),
343+
where: ({ name }) => sql.fragment`${name} = 'ccc'`,
344+
});
345+
346+
expect(result.count).toEqual(2n);
347+
expect(result.edges.length).toEqual(0);
348+
});
349+
350+
it('gets the count without fetching edges (batch)', async () => {
340351
const loader = new PersonConnectionLoader(pool, {});
341352
const results = await Promise.all([
342353
loader.load({
@@ -355,6 +366,24 @@ describe('createConnectionLoaderClass', () => {
355366
expect(results[1].edges.length).toEqual(0);
356367
});
357368

369+
it('gets a mix of count and edges', async () => {
370+
const loader = new PersonConnectionLoader(pool, {});
371+
372+
const results = await Promise.all([
373+
loader.load({
374+
info: getInfo(['edges']),
375+
where: ({ name }) => sql.fragment`${name} = 'eee'`,
376+
}),
377+
loader.load({
378+
info: getInfo(['count']),
379+
where: ({ name }) => sql.fragment`${name} = 'eee'`,
380+
}),
381+
]);
382+
383+
expect(results[0].count).toEqual(0);
384+
expect(results[1].count).toEqual(2n);
385+
});
386+
358387
it('gets the edges without fetching edges', async () => {
359388
const loader = new PersonConnectionLoader(pool, {});
360389
const results = await Promise.all([

packages/slonik-dataloaders/src/factories/createConnectionLoaderClass.ts

Lines changed: 13 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -38,6 +38,7 @@ export const createConnectionLoaderClass = <T extends ZodTypeAny>(config: {
3838
query: QuerySqlToken<T>;
3939
}) => {
4040
const { columnNameTransformer = snakeCase, query } = config;
41+
4142
const columnIdentifiers = getColumnIdentifiers<z.infer<T>>(
4243
TABLE_ALIAS,
4344
columnNameTransformer,
@@ -58,8 +59,8 @@ export const createConnectionLoaderClass = <T extends ZodTypeAny>(config: {
5859
) {
5960
super(
6061
async (loaderKeys) => {
61-
const edgesQueries: QuerySqlToken[] = [];
62-
const countQueries: QuerySqlToken[] = [];
62+
const edgesQueries: Array<QuerySqlToken | null> = [];
63+
const countQueries: Array<QuerySqlToken | null> = [];
6364

6465
for (const loaderKey of loaderKeys.values()) {
6566
const {
@@ -98,6 +99,8 @@ export const createConnectionLoaderClass = <T extends ZodTypeAny>(config: {
9899
}
99100
)`,
100101
);
102+
} else {
103+
countQueries.push(null);
101104
}
102105

103106
if (
@@ -181,6 +184,8 @@ export const createConnectionLoaderClass = <T extends ZodTypeAny>(config: {
181184
OFFSET ${offset || 0}
182185
)`,
183186
);
187+
} else {
188+
edgesQueries.push(null);
184189
}
185190
}
186191

@@ -203,12 +208,16 @@ export const createConnectionLoaderClass = <T extends ZodTypeAny>(config: {
203208
const [edgeResults, countResults] = await Promise.all([
204209
Promise.all(
205210
edgesQueries.map((edgesQuery) => {
206-
return pool.any(sql.type(edgeSchema)`${edgesQuery}`);
211+
return edgesQuery === null
212+
? []
213+
: pool.any(sql.type(edgeSchema)`${edgesQuery}`);
207214
}),
208215
),
209216
Promise.all(
210217
countQueries.map((countQuery) => {
211-
return pool.oneFirst(sql.type(countSchema)`${countQuery}`);
218+
return countQuery === null
219+
? 0
220+
: pool.oneFirst(sql.type(countSchema)`${countQuery}`);
212221
}),
213222
),
214223
]);

0 commit comments

Comments
 (0)