Skip to content

Commit 8be5b35

Browse files
committed
fix(polymorphism): wrong query result when selecting "_count"
Fixes #1123
1 parent c0a9a02 commit 8be5b35

File tree

2 files changed

+83
-20
lines changed

2 files changed

+83
-20
lines changed

packages/runtime/src/enhancements/delegate.ts

Lines changed: 36 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -1106,23 +1106,31 @@ export class DelegateProxyHandler extends DefaultPrismaProxyHandler {
11061106

11071107
const modelInfo = getModelInfo(this.options.modelMeta, model, true);
11081108

1109-
for (const field of Object.values(modelInfo.fields)) {
1109+
for (const [key, value] of Object.entries(entity)) {
1110+
if (key.startsWith(DELEGATE_AUX_RELATION_PREFIX)) {
1111+
continue;
1112+
}
1113+
1114+
const field = modelInfo.fields[key];
1115+
if (!field) {
1116+
// not a field, could be `_count`, `_sum`, etc.
1117+
result[key] = value;
1118+
continue;
1119+
}
1120+
11101121
if (field.inheritedFrom) {
11111122
// already merged from base
11121123
continue;
11131124
}
11141125

1115-
if (field.name in entity) {
1116-
const fieldValue = entity[field.name];
1117-
if (field.isDataModel) {
1118-
if (Array.isArray(fieldValue)) {
1119-
result[field.name] = fieldValue.map((item) => this.assembleUp(field.type, item));
1120-
} else {
1121-
result[field.name] = this.assembleUp(field.type, fieldValue);
1122-
}
1126+
if (field.isDataModel) {
1127+
if (Array.isArray(value)) {
1128+
result[field.name] = value.map((item) => this.assembleUp(field.type, item));
11231129
} else {
1124-
result[field.name] = fieldValue;
1130+
result[field.name] = this.assembleUp(field.type, value);
11251131
}
1132+
} else {
1133+
result[field.name] = value;
11261134
}
11271135
}
11281136

@@ -1147,18 +1155,26 @@ export class DelegateProxyHandler extends DefaultPrismaProxyHandler {
11471155
}
11481156
}
11491157

1150-
for (const field of Object.values(modelInfo.fields)) {
1151-
if (field.name in entity) {
1152-
const fieldValue = entity[field.name];
1153-
if (field.isDataModel) {
1154-
if (Array.isArray(fieldValue)) {
1155-
result[field.name] = fieldValue.map((item) => this.assembleDown(field.type, item));
1156-
} else {
1157-
result[field.name] = this.assembleDown(field.type, fieldValue);
1158-
}
1158+
for (const [key, value] of Object.entries(entity)) {
1159+
if (key.startsWith(DELEGATE_AUX_RELATION_PREFIX)) {
1160+
continue;
1161+
}
1162+
1163+
const field = modelInfo.fields[key];
1164+
if (!field) {
1165+
// not a field, could be `_count`, `_sum`, etc.
1166+
result[key] = value;
1167+
continue;
1168+
}
1169+
1170+
if (field.isDataModel) {
1171+
if (Array.isArray(value)) {
1172+
result[field.name] = value.map((item) => this.assembleDown(field.type, item));
11591173
} else {
1160-
result[field.name] = fieldValue;
1174+
result[field.name] = this.assembleDown(field.type, value);
11611175
}
1176+
} else {
1177+
result[field.name] = value;
11621178
}
11631179
}
11641180

Lines changed: 47 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,47 @@
1+
import { loadSchema } from '@zenstackhq/testtools';
2+
3+
describe('Regression for issue 1123', () => {
4+
it('regression', async () => {
5+
const { enhance } = await loadSchema(
6+
`
7+
model Content {
8+
id String @id @default(cuid())
9+
published Boolean @default(false)
10+
contentType String
11+
likes Like[]
12+
@@delegate(contentType)
13+
@@allow('all', true)
14+
}
15+
16+
model Post extends Content {
17+
title String
18+
}
19+
20+
model Image extends Content {
21+
url String
22+
}
23+
24+
model Like {
25+
id String @id @default(cuid())
26+
content Content @relation(fields: [contentId], references: [id])
27+
contentId String
28+
@@allow('all', true)
29+
}
30+
`
31+
);
32+
33+
const db = enhance();
34+
await db.post.create({
35+
data: {
36+
title: 'a post',
37+
likes: { create: {} },
38+
},
39+
});
40+
41+
await expect(db.content.findFirst({ include: { _count: { select: { likes: true } } } })).resolves.toMatchObject(
42+
{
43+
_count: { likes: 1 },
44+
}
45+
);
46+
});
47+
});

0 commit comments

Comments
 (0)