import {EnforceNonEmptyRecord, ValueOrNestedValueRecord, ValueRecord} from '../../record' import {Value} from '../../value' import {Subtable} from '../subtable' import {Table} from './table' import {mapTable, mapTableWithSubquery, SelectRows, selectTable} from '../selection/select_rows' import {getColumn, SelectVector} from '../selection/select_vector' import { addAscendingOrder, addDescendingOrder, addParameterizedFilter, addParameterlessFilter, SelectStatement } from '../../statements/select_statement' export type Direction = 'asc' | 'desc' export class SortTable { constructor( private readonly statement: SelectStatement) {} filter(predicate: (table: T) => boolean): SortTable filter

(provided: P, predicate: (parameters: P, table: T) => boolean): SortTable filter

(predicateOrProvided: ((table: T) => boolean)|P, predicate?: (parameters: P, table: T) => boolean): SortTable { return new SortTable( typeof predicateOrProvided === 'function' ? addParameterlessFilter(this.statement, predicateOrProvided) : addParameterizedFilter(this.statement, predicate!, predicateOrProvided) ) } thenBy(sortBy: (table: T) => Value): SortTable { return new SortTable( addAscendingOrder(this.statement, sortBy) ) } thenDescendinglyBy(sortBy: (table: T) => Value): SortTable { return new SortTable( addDescendingOrder(this.statement, sortBy) ) } select(): SelectRows { return selectTable(this.statement) } map(f: (table: T) => EnforceNonEmptyRecord & U): SelectRows map(tableInSubquery: Table, f: (s: Subtable, x: T) => EnforceNonEmptyRecord & U): SelectRows map(fOrTableInSubquery: ((table: T) => EnforceNonEmptyRecord & U)|Table, f?: (s: Subtable, x: T) => EnforceNonEmptyRecord & U): SelectRows{ return typeof fOrTableInSubquery === 'function' ? mapTable(this.statement, fOrTableInSubquery) : mapTableWithSubquery(this.statement, f!, fOrTableInSubquery) } get(f: (table: T) => U): SelectVector { return getColumn(this.statement, f) } }