11import type * as V1 from './_relations.ts' ;
2+ import { OriginalColumn } from './column-common.ts' ;
23import type { AnyColumn } from './column.ts' ;
34import { Column } from './column.ts' ;
45import { entityKind , is } from './entity.ts' ;
@@ -7,8 +8,8 @@ import { SQL, sql } from './sql/sql.ts';
78import { Table } from './table.ts' ;
89import { ViewBaseConfig } from './view-common.ts' ;
910
10- export class ColumnAliasProxyHandler < TColumn extends Column > implements ProxyHandler < TColumn > {
11- static readonly [ entityKind ] : string = 'ColumnAliasProxyHandler ' ;
11+ export class ColumnTableAliasProxyHandler < TColumn extends Column > implements ProxyHandler < TColumn > {
12+ static readonly [ entityKind ] : string = 'ColumnTableAliasProxyHandler ' ;
1213
1314 constructor ( private table : Table | View ) { }
1415
@@ -58,7 +59,7 @@ export class TableAliasProxyHandler<T extends Table | View> implements ProxyHand
5859 Object . keys ( columns ) . map ( ( key ) => {
5960 proxiedColumns [ key ] = new Proxy (
6061 columns [ key ] ! ,
61- new ColumnAliasProxyHandler ( new Proxy ( target , this ) ) ,
62+ new ColumnTableAliasProxyHandler ( new Proxy ( target , this ) ) ,
6263 ) ;
6364 } ) ;
6465
@@ -67,13 +68,39 @@ export class TableAliasProxyHandler<T extends Table | View> implements ProxyHand
6768
6869 const value = target [ prop as keyof typeof target ] ;
6970 if ( is ( value , Column ) ) {
70- return new Proxy ( value as AnyColumn , new ColumnAliasProxyHandler ( new Proxy ( target , this ) ) ) ;
71+ return new Proxy ( value as AnyColumn , new ColumnTableAliasProxyHandler ( new Proxy ( target , this ) ) ) ;
7172 }
7273
7374 return value ;
7475 }
7576}
7677
78+ export class ColumnAliasProxyHandler < T extends Column > implements ProxyHandler < T > {
79+ static readonly [ entityKind ] : string = 'ColumnAliasProxyHandler' ;
80+
81+ constructor ( private alias : string ) { }
82+
83+ get ( target : T , prop : keyof Column ) : any {
84+ if ( prop === 'isAlias' ) {
85+ return true ;
86+ }
87+
88+ if ( prop === 'name' ) {
89+ return this . alias ;
90+ }
91+
92+ if ( prop === 'keyAsName' ) {
93+ return false ;
94+ }
95+
96+ if ( prop === OriginalColumn ) {
97+ return ( ) => target ;
98+ }
99+
100+ return target [ prop ] ;
101+ }
102+ }
103+
77104export class RelationTableAliasProxyHandler < T extends V1 . Relation > implements ProxyHandler < T > {
78105 static readonly [ entityKind ] : string = 'RelationTableAliasProxyHandler' ;
79106
@@ -92,14 +119,18 @@ export function aliasedTable<T extends Table | View>(table: T, tableAlias: strin
92119 return new Proxy ( table , new TableAliasProxyHandler ( tableAlias , false ) ) ;
93120}
94121
122+ export function aliasedColumn < T extends Column > ( column : T , alias : string ) : T {
123+ return new Proxy ( column , new ColumnAliasProxyHandler ( alias ) ) ;
124+ }
125+
95126export function aliasedRelation < T extends V1 . Relation > ( relation : T , tableAlias : string ) : T {
96127 return new Proxy ( relation , new RelationTableAliasProxyHandler ( tableAlias ) ) ;
97128}
98129
99130export function aliasedTableColumn < T extends AnyColumn > ( column : T , tableAlias : string ) : T {
100131 return new Proxy (
101132 column ,
102- new ColumnAliasProxyHandler ( new Proxy ( column . table , new TableAliasProxyHandler ( tableAlias , false ) ) ) ,
133+ new ColumnTableAliasProxyHandler ( new Proxy ( column . table , new TableAliasProxyHandler ( tableAlias , false ) ) ) ,
103134 ) ;
104135}
105136
@@ -121,3 +152,12 @@ export function mapColumnsInSQLToAlias(query: SQL, alias: string): SQL {
121152 return c ;
122153 } ) ) ;
123154}
155+
156+ // Defined separately from the Column class to resolve circular dependency
157+ Column . prototype . as = function ( alias : string ) : Column {
158+ return aliasedColumn ( this , alias ) ;
159+ } ;
160+
161+ export function getOriginalColumnFromAlias < T extends Column > ( column : T ) : T {
162+ return column [ OriginalColumn ] ( ) ;
163+ }
0 commit comments