@@ -255,17 +255,9 @@ export function findMany<const S extends AnyNoContext>(
255255 const filtered : Array < Entity < S > > = [ ] ;
256256
257257 const evaluateFilter = < T > ( fieldFilter : EntityFieldFilter < T > , fieldValue : T ) : boolean => {
258- // Handle NOT operator
259- if ( 'not' in fieldFilter && fieldFilter . not ) {
260- return ! evaluateFilter ( fieldFilter . not , fieldValue ) ;
261- }
262-
263- // Handle OR operator
264- if ( 'or' in fieldFilter ) {
265- const orFilters = fieldFilter . or ;
266- if ( Array . isArray ( orFilters ) ) {
267- return orFilters . some ( ( orFilter ) => evaluateFilter ( orFilter as EntityFieldFilter < T > , fieldValue ) ) ;
268- }
258+ const ff = fieldFilter as unknown as Record < string , unknown > ;
259+ if ( 'not' in ff || 'or' in ff || 'and' in ff ) {
260+ throw new Error ( "Logical operators 'not', 'or', 'and' are only allowed at the root (cross-field) level." ) ;
269261 }
270262
271263 // Handle basic filters
@@ -324,14 +316,35 @@ export function findMany<const S extends AnyNoContext>(
324316 crossFieldFilter : CrossFieldFilter < Schema . Schema . Type < S > > ,
325317 entity : Entity < S > ,
326318 ) : boolean => {
319+ // Evaluate regular field filters with AND semantics
327320 for ( const fieldName in crossFieldFilter ) {
328- const fieldFilter = crossFieldFilter [ fieldName ] ;
329- const fieldValue = entity [ fieldName ] ;
321+ if ( fieldName === 'or' || fieldName === 'not' ) continue ;
322+ const fieldFilter = crossFieldFilter [ fieldName ] as unknown as EntityFieldFilter < unknown > | undefined ;
323+ if ( ! fieldFilter ) continue ;
324+ const fieldValue = ( entity as unknown as Record < string , unknown > ) [ fieldName ] as unknown ;
325+ if ( ! evaluateFilter ( fieldFilter , fieldValue ) ) {
326+ return false ;
327+ }
328+ }
329+
330+ // Evaluate nested OR at cross-field level (if present)
331+ const cf = crossFieldFilter as unknown as Record < string , unknown > ;
332+ const maybeOr = cf . or ;
333+ if ( Array . isArray ( maybeOr ) ) {
334+ const orFilters = maybeOr as Array < CrossFieldFilter < Schema . Schema . Type < S > > > ;
335+ const orSatisfied = orFilters . some ( ( orFilter ) => evaluateCrossFieldFilter ( orFilter , entity ) ) ;
336+ if ( ! orSatisfied ) return false ;
337+ }
330338
331- if ( fieldFilter && ! evaluateFilter ( fieldFilter , fieldValue ) ) {
339+ // Evaluate nested NOT at cross-field level (if present)
340+ const maybeNot = cf . not ;
341+ if ( maybeNot ) {
342+ const notFilter = maybeNot as CrossFieldFilter < Schema . Schema . Type < S > > ;
343+ if ( evaluateCrossFieldFilter ( notFilter , entity ) ) {
332344 return false ;
333345 }
334346 }
347+
335348 return true ;
336349 } ;
337350
0 commit comments