Skip to content
This repository was archived by the owner on Mar 1, 2026. It is now read-only.

Commit ce999fd

Browse files
committed
feat(orm): support nested enum in where and/or
1 parent c8bf5f5 commit ce999fd

2 files changed

Lines changed: 38 additions & 21 deletions

File tree

packages/orm/src/client/executor/name-mapper.ts

Lines changed: 22 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -25,7 +25,6 @@ import {
2525
ValueListNode,
2626
ValueNode,
2727
ValuesNode,
28-
WhereNode,
2928
} from 'kysely';
3029
import type { EnumDef, EnumField, FieldDef, ModelDef, SchemaDef } from '../../schema';
3130
import {
@@ -185,40 +184,42 @@ export class QueryNameMapper extends OperationNodeTransformer {
185184
return ColumnNode.create(mappedName);
186185
}
187186

188-
protected override transformWhere(node: WhereNode): WhereNode {
187+
protected override transformBinaryOperation(node: BinaryOperationNode): BinaryOperationNode {
189188
if (
190-
BinaryOperationNode.is(node.where) &&
191-
ReferenceNode.is(node.where.leftOperand) &&
192-
ColumnNode.is(node.where.leftOperand.column) &&
193-
node.where.leftOperand.table &&
194-
TableNode.is(node.where.leftOperand.table) &&
195-
// where: { enumColumn: Enum.VALUE }
196-
(ValueNode.is(node.where.rightOperand) ||
197-
// where: { enumColumn: { in: [Enum.VALUE] } }
198-
PrimitiveValueListNode.is(node.where.rightOperand))
189+
ReferenceNode.is(node.leftOperand) &&
190+
ColumnNode.is(node.leftOperand.column) &&
191+
node.leftOperand.table &&
192+
TableNode.is(node.leftOperand.table) &&
193+
// { enumColumn: Enum.VALUE }
194+
(ValueNode.is(node.rightOperand) ||
195+
// { enumColumn: { in: [Enum.VALUE] } }
196+
PrimitiveValueListNode.is(node.rightOperand))
199197
) {
200-
const tableName = node.where.leftOperand.table.table.identifier.name;
201-
const columnNode = node.where.leftOperand.column;
202-
const valueNode = node.where.rightOperand;
198+
const tableName = node.leftOperand.table.table.identifier.name;
199+
const columnNode = node.leftOperand.column;
200+
const valueNode = node.rightOperand;
203201

204202
let resultValue: OperationNode = valueNode;
205203

206204
if (ValueNode.is(valueNode)) {
207205
resultValue = this.processEnumMappingForValue(tableName, columnNode, valueNode) as OperationNode;
208206
} else if (PrimitiveValueListNode.is(valueNode)) {
209207
resultValue = PrimitiveValueListNode.create(
210-
this.processEnumMappingForValues(tableName, valueNode.values.map(() => columnNode), valueNode.values),
208+
this.processEnumMappingForValues(
209+
tableName,
210+
valueNode.values.map(() => columnNode),
211+
valueNode.values,
212+
),
211213
);
212214
}
213215

214-
return super.transformWhere(
215-
WhereNode.create(
216-
BinaryOperationNode.create(node.where.leftOperand, node.where.operator, resultValue)
217-
)
218-
);
216+
return super.transformBinaryOperation({
217+
...node,
218+
rightOperand: resultValue,
219+
});
219220
}
220221

221-
return super.transformWhere(node);
222+
return super.transformBinaryOperation(node);
222223
}
223224

224225
protected override transformUpdateQuery(node: UpdateQueryNode) {

tests/e2e/orm/client-api/name-mapping.test.ts

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -211,6 +211,22 @@ describe('Name mapping tests', () => {
211211
}),
212212
).resolves.toEqual([expect.objectContaining({ email: 'u1@test.com', role: 'USER' })]);
213213

214+
await expect(
215+
db.user.findMany({
216+
where: {
217+
AND: [
218+
{ role: { in: ['USER'] } },
219+
{ role: { in: ['USER'] } },
220+
{ OR: [{ role: { in: ['USER'] } }] },
221+
],
222+
},
223+
select: {
224+
email: true,
225+
role: true,
226+
},
227+
}),
228+
).resolves.toEqual([expect.objectContaining({ email: 'u1@test.com', role: 'USER' })]);
229+
214230
// select all
215231
await expect(
216232
db.user.findFirst({

0 commit comments

Comments
 (0)