import {EnforceNonEmptyRecord, ValueRecord} from '../../record' import {Value} from '../../value' import {Table} from '../one/table' import {Subtable} from '../subtable' import {mapTable, mapTableWithSubquery, SelectRows} from '../selection/select_rows' import {getColumn, SelectVector} from '../selection/select_vector' import {addAscendingOrder, addDescendingOrder, SelectStatement} from '../../statements/select_statement' import {selectSetsOfRows, SelectSetsOfRows} from '../selection/select_sets_of_rows' export class SortTwoTables { constructor( private readonly statement: SelectStatement) {} thenBy(sortBy: (first: T1, second: T2) => Value): SortTwoTables { return new SortTwoTables( addAscendingOrder(this.statement, sortBy)) } thenDescendinglyBy(sortBy: (first: T1, second: T2) => Value): SortTwoTables { return new SortTwoTables( addDescendingOrder(this.statement, sortBy)) } select(firstName: string, secondName: string): SelectSetsOfRows<{ [first in K]: T1 } & { [second in K]: T2 }> { return selectSetsOfRows( this.statement, [ firstName, secondName ]) } map(f: (first: T1, second: T2) => EnforceNonEmptyRecord & U): SelectRows map(tableInSubquery: Table, f: (s: Subtable, first: T1, second: T2) => EnforceNonEmptyRecord & U): SelectRows map(fOrTableInSubquery: ((first: T1, second: T2) => EnforceNonEmptyRecord & U)|Table, f?: (s: Subtable, first: T1, second: T2) => EnforceNonEmptyRecord & U): SelectRows{ return typeof fOrTableInSubquery === 'function' ? mapTable(this.statement, fOrTableInSubquery) : mapTableWithSubquery(this.statement, f!, fOrTableInSubquery) } get(f: (first: T1, second: T2) => U): SelectVector { return getColumn(this.statement, f) } }