11import { invariant , isPlainObject } from '@zenstackhq/common-helpers' ;
22import type { Expression , ExpressionBuilder , ExpressionWrapper , SqlBool , ValueNode } from 'kysely' ;
3- import { sql , type SelectQueryBuilder } from 'kysely' ;
3+ import { expressionBuilder , sql , type SelectQueryBuilder } from 'kysely' ;
44import { match , P } from 'ts-pattern' ;
55import type { BuiltinType , DataSourceProviderType , FieldDef , GetModels , SchemaDef } from '../../../schema' ;
66import { enumerate } from '../../../utils/enumerate' ;
@@ -95,11 +95,9 @@ export abstract class BaseCrudDialect<Schema extends SchemaDef> {
9595 result = this . and ( eb , result , this . buildRelationFilter ( eb , model , modelAlias , key , fieldDef , payload ) ) ;
9696 } else {
9797 // if the field is from a base model, build a reference from that model
98- const fieldRef = buildFieldRef (
99- this . schema ,
98+ const fieldRef = this . fieldRef (
10099 fieldDef . originModel ?? model ,
101100 key ,
102- this . options ,
103101 eb ,
104102 fieldDef . originModel ?? modelAlias ,
105103 ) ;
@@ -727,7 +725,8 @@ export abstract class BaseCrudDialect<Schema extends SchemaDef> {
727725 for ( const [ k , v ] of Object . entries < string > ( value ) ) {
728726 invariant ( v === 'asc' || v === 'desc' , `invalid orderBy value for field "${ field } "` ) ;
729727 result = result . orderBy (
730- ( eb ) => aggregate ( eb , sql . ref ( `${ modelAlias } .${ k } ` ) , field as AGGREGATE_OPERATORS ) ,
728+ ( eb ) =>
729+ aggregate ( eb , this . fieldRef ( model , k , eb , modelAlias ) , field as AGGREGATE_OPERATORS ) ,
731730 sql . raw ( this . negateSort ( v , negated ) ) ,
732731 ) ;
733732 }
@@ -740,7 +739,7 @@ export abstract class BaseCrudDialect<Schema extends SchemaDef> {
740739 for ( const [ k , v ] of Object . entries < string > ( value ) ) {
741740 invariant ( v === 'asc' || v === 'desc' , `invalid orderBy value for field "${ field } "` ) ;
742741 result = result . orderBy (
743- ( eb ) => eb . fn . count ( sql . ref ( k ) ) ,
742+ ( eb ) => eb . fn . count ( this . fieldRef ( model , k , eb , modelAlias ) ) ,
744743 sql . raw ( this . negateSort ( v , negated ) ) ,
745744 ) ;
746745 }
@@ -753,8 +752,9 @@ export abstract class BaseCrudDialect<Schema extends SchemaDef> {
753752 const fieldDef = requireField ( this . schema , model , field ) ;
754753
755754 if ( ! fieldDef . relation ) {
755+ const fieldRef = this . fieldRef ( model , field , expressionBuilder ( ) , modelAlias ) ;
756756 if ( value === 'asc' || value === 'desc' ) {
757- result = result . orderBy ( sql . ref ( ` ${ modelAlias } . ${ field } ` ) , this . negateSort ( value , negated ) ) ;
757+ result = result . orderBy ( fieldRef , this . negateSort ( value , negated ) ) ;
758758 } else if (
759759 value &&
760760 typeof value === 'object' &&
@@ -764,7 +764,7 @@ export abstract class BaseCrudDialect<Schema extends SchemaDef> {
764764 ( value . nulls === 'first' || value . nulls === 'last' )
765765 ) {
766766 result = result . orderBy (
767- sql . ref ( ` ${ modelAlias } . ${ field } ` ) ,
767+ fieldRef ,
768768 sql . raw ( `${ this . negateSort ( value . sort , negated ) } nulls ${ value . nulls } ` ) ,
769769 ) ;
770770 }
@@ -865,7 +865,7 @@ export abstract class BaseCrudDialect<Schema extends SchemaDef> {
865865 const fieldDef = requireField ( this . schema , model , field ) ;
866866 if ( fieldDef . computed ) {
867867 // TODO: computed field from delegate base?
868- return query . select ( ( eb ) => buildFieldRef ( this . schema , model , field , this . options , eb ) . as ( field ) ) ;
868+ return query . select ( ( eb ) => this . fieldRef ( model , field , eb , modelAlias ) . as ( field ) ) ;
869869 } else if ( ! fieldDef . originModel ) {
870870 // regular field
871871 return query . select ( sql . ref ( `${ modelAlias } .${ field } ` ) . as ( field ) ) ;
@@ -993,6 +993,10 @@ export abstract class BaseCrudDialect<Schema extends SchemaDef> {
993993 return eb . not ( this . and ( eb , ...args ) ) ;
994994 }
995995
996+ fieldRef ( model : string , field : string , eb : ExpressionBuilder < any , any > , modelAlias ?: string ) {
997+ return buildFieldRef ( this . schema , model , field , this . options , eb , modelAlias ) ;
998+ }
999+
9961000 // #endregion
9971001
9981002 // #region abstract methods
0 commit comments