@@ -184,39 +184,51 @@ export class QueryNameMapper extends OperationNodeTransformer {
184184 return ColumnNode . create ( mappedName ) ;
185185 }
186186
187- protected override transformBinaryOperation ( node : BinaryOperationNode ) : BinaryOperationNode {
187+ protected override transformBinaryOperation ( node : BinaryOperationNode ) {
188+ // transform enum name mapping for enum values used inside binary operations
189+ // 1. simple value: column = EnumValue
190+ // 2. list value: column IN [EnumValue, EnumValue2]
191+
192+ // note: Kysely only allows column ref on the left side of a binary operation
193+
188194 if (
189195 ReferenceNode . is ( node . leftOperand ) &&
190196 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 ) )
197+ ( ValueNode . is ( node . rightOperand ) || PrimitiveValueListNode . is ( node . rightOperand ) )
197198 ) {
198- const tableName = node . leftOperand . table . table . identifier . name ;
199199 const columnNode = node . leftOperand . column ;
200- const valueNode = node . rightOperand ;
201-
202- let resultValue : OperationNode = valueNode ;
203-
204- if ( ValueNode . is ( valueNode ) ) {
205- resultValue = this . processEnumMappingForValue ( tableName , columnNode , valueNode ) as OperationNode ;
206- } else if ( PrimitiveValueListNode . is ( valueNode ) ) {
207- resultValue = PrimitiveValueListNode . create (
208- this . processEnumMappingForValues (
209- tableName ,
210- valueNode . values . map ( ( ) => columnNode ) ,
211- valueNode . values ,
212- ) ,
213- ) ;
214- }
215200
216- return super . transformBinaryOperation ( {
217- ...node ,
218- rightOperand : resultValue ,
219- } ) ;
201+ // resolve field from scope in case it's not directly qualified with a table name
202+ const resolvedScope = this . resolveFieldFromScopes (
203+ columnNode . column . name ,
204+ node . leftOperand . table ?. table . identifier . name ,
205+ ) ;
206+
207+ if ( resolvedScope ?. model ) {
208+ const valueNode = node . rightOperand ;
209+ let resultValue : OperationNode = valueNode ;
210+
211+ if ( ValueNode . is ( valueNode ) ) {
212+ resultValue = this . processEnumMappingForValue (
213+ resolvedScope . model ,
214+ columnNode ,
215+ valueNode ,
216+ ) as OperationNode ;
217+ } else if ( PrimitiveValueListNode . is ( valueNode ) ) {
218+ resultValue = PrimitiveValueListNode . create (
219+ this . processEnumMappingForValues (
220+ resolvedScope . model ,
221+ valueNode . values . map ( ( ) => columnNode ) ,
222+ valueNode . values ,
223+ ) ,
224+ ) ;
225+ }
226+
227+ return super . transformBinaryOperation ( {
228+ ...node ,
229+ rightOperand : resultValue ,
230+ } ) ;
231+ }
220232 }
221233
222234 return super . transformBinaryOperation ( node ) ;
0 commit comments