import * as sd from "type-mapping"; import * as ColumnUtil from "./util"; import {SortDirection} from "../order"; export interface ColumnData { readonly tableAlias : string; readonly name : string; readonly assertDelegate : sd.SafeMapper; } export interface IColumn { readonly tableAlias : DataT["tableAlias"]; readonly name : DataT["name"]; readonly assertDelegate : DataT["assertDelegate"]; //HACK for referencing IExprSelectItem readonly __isFromExprSelectItem : boolean; } export type IAnonymousTypedColumn = IColumn<{ readonly tableAlias : string, readonly name : string, readonly assertDelegate : sd.SafeMapper, }>; export class Column implements IColumn { readonly tableAlias : DataT["tableAlias"]; readonly name : DataT["name"]; readonly assertDelegate : DataT["assertDelegate"]; //HACK for referencing IExprSelectItem readonly __isFromExprSelectItem : boolean; constructor ( data : DataT, __isFromExprSelectItem? : boolean ) { this.tableAlias = data.tableAlias; this.name = data.name; this.assertDelegate = data.assertDelegate; //HACK this.__isFromExprSelectItem = (__isFromExprSelectItem === true); } queryTree () { return ColumnUtil.queryTree(this); } toNullable () : ColumnUtil.ToNullable { return ColumnUtil.toNullable(this); } withTableAlias ( newTableAlias : NewTableAliasT ) : ( ColumnUtil.WithTableAlias ) { return ColumnUtil.withTableAlias(this, newTableAlias); } withType ( newAssertFunc : NewAssertFuncT ) : ( ColumnUtil.WithType ) { return ColumnUtil.withType(this, newAssertFunc); } as (alias : AliasT) : ColumnUtil.As { return ColumnUtil.as(this, alias); } asc () : ColumnUtil.Asc { return ColumnUtil.asc(this); } desc () : ColumnUtil.Desc { return ColumnUtil.desc(this); } sort (sortDirection : SortDirection) : ColumnUtil.Sort { return ColumnUtil.sort(this, sortDirection); } } export function column< TableAliasT extends string, NameT extends string, AssertFuncT extends sd.AnySafeMapper > ( tableAlias : TableAliasT, name : NameT, assertFunc : AssertFuncT ) : Column<{ readonly tableAlias : TableAliasT, readonly name : NameT, readonly assertDelegate : sd.SafeMapper>, }> { return new Column({ tableAlias, name, assertDelegate : assertFunc as sd.SafeMapper>, }); }