import {SortTable} from './sort_table' import {GroupTable} from './group_table' import {EnforceNonEmptyRecord, ValueOrNestedValueRecord, ValueRecord} from '../../record' import {Value} from '../../value' import {Subtable} from '../subtable' import {Table} from './table' import { averageColumn, countRows, maximizeColumn, minimizeColumn, SelectScalar, sumColumn } from '../selection/select_scalar' import {mapTable, mapTableWithSubquery, SelectRows, selectTable} from '../selection/select_rows' import {getColumn, SelectVector} from '../selection/select_vector' import {AggregatableTable} from '../aggregatable_table' import { addAscendingOrder, addDescendingOrder, addParameterizedFilter, addParameterlessFilter, SelectStatement } from '../../statements/select_statement' import {groupTablesBy} from '../../statements/group_select_statement' import {SelectExpectedSingleRow, selectExpectedSingleRow} from '../selection/select_expected_single_row' import {aggregateTables, SelectGuaranteedSingleRow} from '../selection/select_guaranteed_single_row' export class FilterTable { constructor( private readonly statement: SelectStatement) {} filter(predicate: (table: T) => boolean): FilterTable filter

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

(predicateOrProvided: ((table: T) => boolean)|P, predicate?: (parameters: P, table: T) => boolean): FilterTable { return new FilterTable( typeof predicateOrProvided === 'function' ? addParameterlessFilter(this.statement, predicateOrProvided) : addParameterizedFilter(this.statement, predicate!, predicateOrProvided) ) } sortBy(sortBy: (table: T) => Value): SortTable { return new SortTable( addAscendingOrder(this.statement, sortBy)) } sortDescendinglyBy(sortBy: (table: T) => Value): SortTable { return new SortTable( addDescendingOrder(this.statement, sortBy)) } select(): SelectRows { return selectTable(this.statement) } single(): SelectExpectedSingleRow { return selectExpectedSingleRow(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) } count(): SelectScalar { return countRows(this.statement) } max(f: (table: T) => V): SelectScalar { return maximizeColumn(this.statement, f) } min(f: (table: T) => V): SelectScalar { return minimizeColumn(this.statement, f) } sum(f: (table: T) => V): SelectScalar { return sumColumn(this.statement, f) } average(f: (table: T) => V): SelectScalar { return averageColumn(this.statement, f) } aggregate( aggregation: (table: AggregatableTable, count: () => number) => EnforceNonEmptyRecord & A): SelectGuaranteedSingleRow { return aggregateTables(this.statement, aggregation) } groupBy(getKey: (table: T) => EnforceNonEmptyRecord & K): GroupTable{ return new GroupTable(groupTablesBy(this.statement, getKey)) } }