import {SortFiveTables} from './sort_five_tables' import {FilterFiveTables} from './filter_five_tables' import {GroupFiveTables} from './group_five_tables' import {EnforceNonEmptyRecord, ValueOrNestedValueRecord, ValueRecord} from '../../record' import {Value} from '../../value' import {Subtable} from '../subtable' import {Table} from '../one/table' import { averageColumn, countRows, maximizeColumn, minimizeColumn, SelectScalar, sumColumn } from '../selection/select_scalar' import {mapTable, mapTableWithSubquery, SelectRows} 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 {aggregateTables, SelectGuaranteedSingleRow} from '../selection/select_guaranteed_single_row' import {selectSetsOfRows, SelectSetsOfRows} from '../selection/select_sets_of_rows' export class JoinFifthTable { constructor(private readonly statement: SelectStatement) {} filter(predicate: (first: T1, second: T2, third: T3, fourth: T4, fifth: T5) => boolean): FilterFiveTables filter

(provided: P, predicate: (parameters: P, first: T1, second: T2, third: T3, fourth: T4, fifth: T5) => boolean): FilterFiveTables filter

(predicateOrProvided: ((first: T1, second: T2, third: T3, fourth: T4, fifth: T5) => boolean)|P, predicate?: (parameters: P, first: T1, second: T2, third: T3, fourth: T4, fifth: T5) => boolean): FilterFiveTables { return new FilterFiveTables( typeof predicateOrProvided === 'function' ? addParameterlessFilter(this.statement, predicateOrProvided) : addParameterizedFilter(this.statement, predicate!, predicateOrProvided), ) } sortBy(sortBy: (first: T1, second: T2, third: T3, fourth: T4, fifth: T5) => Value): SortFiveTables { return new SortFiveTables( addAscendingOrder(this.statement, sortBy)) } sortDescendinglyBy(sortBy: (first: T1, second: T2, third: T3, fourth: T4, fifth: T5) => Value): SortFiveTables { return new SortFiveTables( addDescendingOrder(this.statement, sortBy)) } select(firstName: string, secondName: string, thirdName: string, fourthName: string): SelectSetsOfRows<{ [first in K]: T1 } & { [second in K]: T2 } & { [third in K]: T3 } & { [fourth in K]: T4 } > { return selectSetsOfRows( this.statement, [ firstName, secondName, thirdName, fourthName ]) } map(f: (first: T1, second: T2, third: T3, fourth: T4, fifth: T5) => EnforceNonEmptyRecord & U): SelectRows map(tableInSubquery: Table, f: (s: Subtable, first: T1, second: T2, third: T3, fourth: T4, fifth: T5) => EnforceNonEmptyRecord & U): SelectRows map(fOrTableInSubquery: ((first: T1, second: T2, third: T3, fourth: T4, fifth: T5) => EnforceNonEmptyRecord & U)|Table, f?: (s: Subtable, first: T1, second: T2, third: T3, fourth: T4, fifth: T5) => EnforceNonEmptyRecord & U): SelectRows{ return typeof fOrTableInSubquery === 'function' ? mapTable(this.statement, fOrTableInSubquery) : mapTableWithSubquery(this.statement, f!, fOrTableInSubquery) } get(f: (first: T1, second: T2, third: T3, fourth: T4, fifth: T5) => U): SelectVector { return getColumn(this.statement, f) } count(): SelectScalar { return countRows(this.statement) } max(f: (first: T1, second: T2, third: T3, fourth: T4, fifth: T5) => V): SelectScalar { return maximizeColumn(this.statement, f) } min(f: (first: T1, second: T2, third: T3, fourth: T4, fifth: T5) => V): SelectScalar { return minimizeColumn(this.statement, f) } sum(f: (first: T1, second: T2, third: T3, fourth: T4, fifth: T5) => V): SelectScalar { return sumColumn(this.statement, f) } average(f: (first: T1, second: T2, third: T3, fourth: T4, fifth: T5) => V): SelectScalar { return averageColumn(this.statement, f) } aggregate( aggregation: (first: AggregatableTable, second: AggregatableTable, third: AggregatableTable, fourth: AggregatableTable, fifth: AggregatableTable, count: () => number) => EnforceNonEmptyRecord & A): SelectGuaranteedSingleRow { return aggregateTables(this.statement, aggregation) } groupBy(getKey: (first: T1, second: T2, third: T3, fourth: T4, fifth: T5) => EnforceNonEmptyRecord & K) : GroupFiveTables{ return new GroupFiveTables(groupTablesBy(this.statement, getKey)) } }