ts-sql-query
Version:
Type-safe SQL query builder like QueryDSL or JOOQ in Java or Linq in .Net for TypeScript with MariaDB, MySql, Oracle, PostgreSql, Sqlite and SqlServer support.
341 lines (340 loc) • 21.7 kB
TypeScript
import type { ITableOrView, ITable, IWithView, HasIsValue } from "../utils/ITableOrView";
import { IExecutableSelectQuery, AnyValueSource, AlwaysIfValueSource, INumberValueSource, IIntValueSource, IAggregatedArrayValueSource, IExecutableInsertQuery, IExecutableUpdateQuery, IExecutableDeleteQuery, IStringValueSource, ITypeSafeStringValueSource, ValueType } from "../expressions/values";
import type { int } from "ts-extended-types";
import type { DefaultTypeAdapter, TypeAdapter } from "../TypeAdapter";
import type { OrderByMode, SelectCustomization } from "../expressions/select";
import type { Column } from "../utils/Column";
import type { QueryRunner } from "../queryRunners/QueryRunner";
import type { ConnectionConfiguration } from "../utils/ConnectionConfiguration";
import type { UpdateCustomization } from "../expressions/update";
import type { DeleteCustomization } from "../expressions/delete";
import type { InsertCustomization } from "../expressions/insert";
import type { isSelectQueryObject } from "../utils/symbols";
import { RawFragment } from "../utils/RawFragment";
export type QueryColumns = {
[property: string]: AnyValueSource | QueryColumns;
};
export type FlatQueryColumns = {
[property: string]: AnyValueSource;
};
export declare function getQueryColumn(columns: QueryColumns, prop: string | number | symbol): AnyValueSource | undefined;
export declare function flattenQueryColumns(columns: QueryColumns, target: FlatQueryColumns, prefix: string): void;
export declare function isAllowedQueryColumns(columns: QueryColumns, sqlBuilder: HasIsValue): boolean;
export interface WithSelectData {
__type: 'with';
__name: string;
__as?: string;
__selectData: SelectData;
__recursive?: boolean;
}
export interface WithValuesData {
__type: 'values';
__name: string;
__as?: string;
__values: any[];
__getTableOrView(): ITableOrView<any>;
}
export type WithData = WithSelectData | WithValuesData;
export declare function hasWithData(value: any): value is WithData;
export declare function getWithData(withView: IWithView<any>): WithData;
export interface JoinData {
__joinType: 'join' | 'innerJoin' | 'leftJoin' | 'leftOuterJoin';
__tableOrView: ITableOrView<any>;
__on?: AlwaysIfValueSource<any, any>;
__optional?: boolean;
}
export interface WithQueryData {
__withs: Array<IWithView<any>>;
__customization?: SelectCustomization<any>;
__subSelectUsing?: Array<ITableOrView<any>>;
}
export type OrderByEntry = {
expression: string | AnyValueSource | RawFragment<any>;
order: OrderByMode | null | undefined;
};
export type SelectData = PlainSelectData | CompoundSelectData;
export interface PlainSelectData extends WithQueryData {
[isSelectQueryObject]: true;
__type: 'plain';
__distinct: boolean;
__columns: QueryColumns;
__oneColumn: boolean;
__tablesOrViews: Array<ITableOrView<any>>;
__joins: Array<JoinData>;
__where?: AlwaysIfValueSource<any, any>;
__startWith?: AlwaysIfValueSource<any, any>;
__connectBy?: AlwaysIfValueSource<any, any>;
__connectByNoCycle?: boolean;
__having?: AlwaysIfValueSource<any, any>;
__groupBy: Array<AnyValueSource>;
__orderBy?: OrderByEntry[];
__orderingSiblingsOnly?: boolean;
__limit?: int | number | INumberValueSource<any, any> | IIntValueSource<any, any>;
__offset?: int | number | INumberValueSource<any, any> | IIntValueSource<any, any>;
__requiredTablesOrViews?: Set<ITableOrView<any>>;
__asInlineAggregatedArrayValue?: boolean;
}
export type CompoundOperator = 'union' | 'unionAll' | 'intersect' | 'intersectAll' | 'except' | 'exceptAll' | 'minus' | 'minusAll';
export interface CompoundSelectData extends WithQueryData {
[isSelectQueryObject]: true;
__type: 'compound';
__firstQuery: SelectData;
__compoundOperator: CompoundOperator;
__secondQuery: SelectData;
__columns: QueryColumns;
__oneColumn: boolean;
__orderBy?: OrderByEntry[];
__orderingSiblingsOnly?: boolean;
__limit?: int | number | INumberValueSource<any, any> | IIntValueSource<any, any>;
__offset?: int | number | INumberValueSource<any, any> | IIntValueSource<any, any>;
__asInlineAggregatedArrayValue?: boolean;
}
export interface InsertData extends WithQueryData {
__table: ITable<any>;
__shape?: {
[property: string]: string;
};
__sets: {
[property: string]: any;
};
__multiple?: {
[property: string]: any;
}[];
__idColumn?: Column;
__from?: SelectData;
__customization?: InsertCustomization<any>;
__columns?: QueryColumns;
__onConflictOnConstraint?: string | IStringValueSource<any, any> | ITypeSafeStringValueSource<any, any> | RawFragment<any>;
__onConflictOnColumns?: AnyValueSource[];
__onConflictOnColumnsWhere?: AlwaysIfValueSource<any, any>;
__onConflictDoNothing?: boolean;
__onConflictUpdateShape?: {
[property: string]: string;
};
__onConflictUpdateSets?: {
[property: string]: any;
};
__onConflictUpdateWhere?: AlwaysIfValueSource<any, any>;
__valuesForInsert?: ITableOrView<any>;
}
export interface UpdateData extends WithQueryData {
__table: ITable<any>;
__shape?: {
[property: string]: Column | string;
};
__sets: {
[property: string]: any;
};
__where?: AlwaysIfValueSource<any, any>;
__allowNoWhere: boolean;
__customization?: UpdateCustomization<any>;
__columns?: QueryColumns;
__oldValues?: ITableOrView<any>;
__froms?: Array<ITableOrView<any>>;
__joins?: Array<JoinData>;
}
export interface DeleteData extends WithQueryData {
__table: ITable<any>;
__where?: AlwaysIfValueSource<any, any>;
__allowNoWhere: boolean;
__customization?: DeleteCustomization<any>;
__columns?: QueryColumns;
__using?: Array<ITableOrView<any>>;
__joins?: Array<JoinData>;
}
export interface SqlBuilder extends SqlOperation {
_defaultTypeAdapter: DefaultTypeAdapter;
_queryRunner: QueryRunner;
_connectionConfiguration: ConnectionConfiguration;
_isValue(value: any): boolean;
_isReservedKeyword(word: string): boolean;
_forceAsIdentifier(identifier: string): string;
_appendColumnName(column: Column, params: any[]): string;
_appendColumnNameForCondition(column: Column, params: any[]): string;
_buildSelect(query: SelectData, params: any[]): string;
_buildInlineSelect(query: SelectData, params: any[]): string;
_buildInsertDefaultValues(query: InsertData, params: any[]): string;
_buildInsert(query: InsertData, params: any[]): string;
_buildInsertFromSelect(query: InsertData, params: any[]): string;
_buildInsertMultiple(query: InsertData, params: any[]): string;
_buildUpdate(query: UpdateData, params: any[]): string;
_buildDelete(query: DeleteData, params: any[]): string;
_buildCallProcedure(params: any[], procedureName: string, procedureParams: AnyValueSource[]): string;
_buildCallFunction(params: any[], functionName: string, functionParams: AnyValueSource[]): string;
_generateUnique(): number;
_resetUnique(): void;
_rawFragment(params: any[], sql: TemplateStringsArray, sqlParams: Array<AnyValueSource | IExecutableSelectQuery<any, any, any, any> | IExecutableInsertQuery<any, any> | IExecutableUpdateQuery<any, any> | IExecutableDeleteQuery<any, any>>): string;
_rawFragmentTableName(params: any[], tableOrView: ITableOrView<any>): string;
_rawFragmentTableAlias(params: any[], tableOrView: ITableOrView<any>): string;
_inlineSelectAsValue(query: SelectData, params: any[]): string;
_inlineSelectAsValueForCondition(query: SelectData, params: any[]): string;
_aggregateValueAsArray(valueSource: IAggregatedArrayValueSource<any, any, any>, params: any[]): string;
}
export interface ToSql {
__toSql(sqlBuilder: SqlBuilder, params: any[]): string;
__toSqlForCondition(sqlBuilder: SqlBuilder, params: any[]): string;
}
export declare function hasToSql(value: any): value is ToSql;
export interface HasOperation {
__operation: keyof SqlOperation;
}
export declare function operationOf(value: any): keyof SqlOperation | null;
export interface SqlComparator0 {
_isNull(params: any[], valueSource: ToSql): string;
_isNotNull(params: any[], valueSource: ToSql): string;
}
export interface SqlComparator1 {
_equals(params: any[], valueSource: ToSql, value: any, columnType: ValueType, columnTypeName: string, typeAdapter: TypeAdapter | undefined): string;
_notEquals(params: any[], valueSource: ToSql, value: any, columnType: ValueType, columnTypeName: string, typeAdapter: TypeAdapter | undefined): string;
_is(params: any[], valueSource: ToSql, value: any, columnType: ValueType, columnTypeName: string, typeAdapter: TypeAdapter | undefined): string;
_isNot(params: any[], valueSource: ToSql, value: any, columnType: ValueType, columnTypeName: string, typeAdapter: TypeAdapter | undefined): string;
_equalsInsensitive(params: any[], valueSource: ToSql, value: any, columnType: ValueType, columnTypeName: string, typeAdapter: TypeAdapter | undefined): string;
_notEqualsInsensitive(params: any[], valueSource: ToSql, value: any, columnType: ValueType, columnTypeName: string, typeAdapter: TypeAdapter | undefined): string;
_lessThan(params: any[], valueSource: ToSql, value: any, columnType: ValueType, columnTypeName: string, typeAdapter: TypeAdapter | undefined): string;
_greaterThan(params: any[], valueSource: ToSql, value: any, columnType: ValueType, columnTypeName: string, typeAdapter: TypeAdapter | undefined): string;
_lessOrEquals(params: any[], valueSource: ToSql, value: any, columnType: ValueType, columnTypeName: string, typeAdapter: TypeAdapter | undefined): string;
_greaterOrEquals(params: any[], valueSource: ToSql, value: any, columnType: ValueType, columnTypeName: string, typeAdapter: TypeAdapter | undefined): string;
_in(params: any[], valueSource: ToSql, value: any, columnType: ValueType, columnTypeName: string, typeAdapter: TypeAdapter | undefined): string;
_notIn(params: any[], valueSource: ToSql, value: any, columnType: ValueType, columnTypeName: string, typeAdapter: TypeAdapter | undefined): string;
_like(params: any[], valueSource: ToSql, value: any, columnType: ValueType, columnTypeName: string, typeAdapter: TypeAdapter | undefined): string;
_notLike(params: any[], valueSource: ToSql, value: any, columnType: ValueType, columnTypeName: string, typeAdapter: TypeAdapter | undefined): string;
_likeInsensitive(params: any[], valueSource: ToSql, value: any, columnType: ValueType, columnTypeName: string, typeAdapter: TypeAdapter | undefined): string;
_notLikeInsensitive(params: any[], valueSource: ToSql, value: any, columnType: ValueType, columnTypeName: string, typeAdapter: TypeAdapter | undefined): string;
_startsWith(params: any[], valueSource: ToSql, value: any, columnType: ValueType, columnTypeName: string, typeAdapter: TypeAdapter | undefined): string;
_notStartsWith(params: any[], valueSource: ToSql, value: any, columnType: ValueType, columnTypeName: string, typeAdapter: TypeAdapter | undefined): string;
_endsWith(params: any[], valueSource: ToSql, value: any, columnType: ValueType, columnTypeName: string, typeAdapter: TypeAdapter | undefined): string;
_notEndsWith(params: any[], valueSource: ToSql, value: any, columnType: ValueType, columnTypeName: string, typeAdapter: TypeAdapter | undefined): string;
_startsWithInsensitive(params: any[], valueSource: ToSql, value: any, columnType: ValueType, columnTypeName: string, typeAdapter: TypeAdapter | undefined): string;
_notStartsWithInsensitive(params: any[], valueSource: ToSql, value: any, columnType: ValueType, columnTypeName: string, typeAdapter: TypeAdapter | undefined): string;
_endsWithInsensitive(params: any[], valueSource: ToSql, value: any, columnType: ValueType, columnTypeName: string, typeAdapter: TypeAdapter | undefined): string;
_notEndsWithInsensitive(params: any[], valueSource: ToSql, value: any, columnType: ValueType, columnTypeName: string, typeAdapter: TypeAdapter | undefined): string;
_contains(params: any[], valueSource: ToSql, value: any, columnType: ValueType, columnTypeName: string, typeAdapter: TypeAdapter | undefined): string;
_notContains(params: any[], valueSource: ToSql, value: any, columnType: ValueType, columnTypeName: string, typeAdapter: TypeAdapter | undefined): string;
_containsInsensitive(params: any[], valueSource: ToSql, value: any, columnType: ValueType, columnTypeName: string, typeAdapter: TypeAdapter | undefined): string;
_notContainsInsensitive(params: any[], valueSource: ToSql, value: any, columnType: ValueType, columnTypeName: string, typeAdapter: TypeAdapter | undefined): string;
}
export interface SqlComparator2 {
_between(params: any[], valueSource: ToSql, value: any, value2: any, columnType: ValueType, columnTypeName: string, typeAdapter: TypeAdapter | undefined): string;
_notBetween(params: any[], valueSource: ToSql, value: any, value2: any, columnType: ValueType, columnTypeName: string, typeAdapter: TypeAdapter | undefined): string;
}
export interface SqlFunctionStatic0 {
_pi(params: any): string;
_random(params: any): string;
_currentDate(params: any): string;
_currentTime(params: any): string;
_currentTimestamp(params: any): string;
_default(params: any): string;
_true(params: any): string;
_false(params: any): string;
_trueForCondition(params: any): string;
_falseForCondition(params: any): string;
}
export interface SqlFunctionStatic1 {
_const(params: any[], value: any, columnType: ValueType, columnTypeName: string, typeAdapter: TypeAdapter | undefined): string;
_constForCondition(params: any[], value: any, columnType: ValueType, columnTypeName: string, typeAdapter: TypeAdapter | undefined): string;
_exists(params: any[], value: any, columnType: ValueType, columnTypeName: string, typeAdapter: TypeAdapter | undefined): string;
_notExists(params: any[], value: any, columnType: ValueType, columnTypeName: string, typeAdapter: TypeAdapter | undefined): string;
_escapeLikeWildcard(params: any[], value: any, columnType: ValueType, columnTypeName: string, typeAdapter: TypeAdapter | undefined): string;
}
export interface SqlFunction0 {
_negate(params: any[], valueSource: ToSql): string;
_toLowerCase(params: any[], valueSource: ToSql): string;
_toUpperCase(params: any[], valueSource: ToSql): string;
_length(params: any[], valueSource: ToSql): string;
_trim(params: any[], valueSource: ToSql): string;
_trimLeft(params: any[], valueSource: ToSql): string;
_trimRight(params: any[], valueSource: ToSql): string;
_reverse(params: any[], valueSource: ToSql): string;
_asDouble(params: any[], valueSource: ToSql): string;
_abs(params: any[], valueSource: ToSql): string;
_ceil(params: any[], valueSource: ToSql): string;
_floor(params: any[], valueSource: ToSql): string;
_round(params: any[], valueSource: ToSql): string;
_exp(params: any[], valueSource: ToSql): string;
_ln(params: any[], valueSource: ToSql): string;
_log10(params: any[], valueSource: ToSql): string;
_sqrt(params: any[], valueSource: ToSql): string;
_cbrt(params: any[], valueSource: ToSql): string;
_sign(params: any[], valueSource: ToSql): string;
_acos(params: any[], valueSource: ToSql): string;
_asin(params: any[], valueSource: ToSql): string;
_atan(params: any[], valueSource: ToSql): string;
_cos(params: any[], valueSource: ToSql): string;
_cot(params: any[], valueSource: ToSql): string;
_sin(params: any[], valueSource: ToSql): string;
_tan(params: any[], valueSource: ToSql): string;
_getDate(params: any[], valueSource: ToSql): string;
_getTime(params: any[], valueSource: ToSql): string;
_getFullYear(params: any[], valueSource: ToSql): string;
_getMonth(params: any[], valueSource: ToSql): string;
_getDay(params: any[], valueSource: ToSql): string;
_getHours(params: any[], valueSource: ToSql): string;
_getMinutes(params: any[], valueSource: ToSql): string;
_getSeconds(params: any[], valueSource: ToSql): string;
_getMilliseconds(params: any[], valueSource: ToSql): string;
_asString(params: any[], valueSource: ToSql): string;
_prior(params: any[], valueSource: ToSql): string;
}
export interface SqlFunction1 {
_valueWhenNull(params: any[], valueSource: ToSql, value: any, columnType: ValueType, columnTypeName: string, typeAdapter: TypeAdapter | undefined): string;
_nullIfValue(params: any[], valueSource: ToSql, value: any, columnType: ValueType, columnTypeName: string, typeAdapter: TypeAdapter | undefined): string;
_and(params: any[], valueSource: ToSql, value: any, columnType: ValueType, columnTypeName: string, typeAdapter: TypeAdapter | undefined): string;
_or(params: any[], valueSource: ToSql, value: any, columnType: ValueType, columnTypeName: string, typeAdapter: TypeAdapter | undefined): string;
_concat(params: any[], valueSource: ToSql, value: any, columnType: ValueType, columnTypeName: string, typeAdapter: TypeAdapter | undefined): string;
_substrToEnd(params: any[], valueSource: ToSql, value: any, columnType: ValueType, columnTypeName: string, typeAdapter: TypeAdapter | undefined): string;
_substringToEnd(params: any[], valueSource: ToSql, value: any, columnType: ValueType, columnTypeName: string, typeAdapter: TypeAdapter | undefined): string;
_power(params: any[], valueSource: ToSql, value: any, columnType: ValueType, columnTypeName: string, typeAdapter: TypeAdapter | undefined): string;
_logn(params: any[], valueSource: ToSql, value: any, columnType: ValueType, columnTypeName: string, typeAdapter: TypeAdapter | undefined): string;
_roundn(params: any[], valueSource: ToSql, value: any, columnType: ValueType, columnTypeName: string, typeAdapter: TypeAdapter | undefined): string;
_minimumBetweenTwoValues(params: any[], valueSource: ToSql, value: any, columnType: ValueType, columnTypeName: string, typeAdapter: TypeAdapter | undefined): string;
_maximumBetweenTwoValues(params: any[], valueSource: ToSql, value: any, columnType: ValueType, columnTypeName: string, typeAdapter: TypeAdapter | undefined): string;
_add(params: any[], valueSource: ToSql, value: any, columnType: ValueType, columnTypeName: string, typeAdapter: TypeAdapter | undefined): string;
_substract(params: any[], valueSource: ToSql, value: any, columnType: ValueType, columnTypeName: string, typeAdapter: TypeAdapter | undefined): string;
_multiply(params: any[], valueSource: ToSql, value: any, columnType: ValueType, columnTypeName: string, typeAdapter: TypeAdapter | undefined): string;
_divide(params: any[], valueSource: ToSql, value: any, columnType: ValueType, columnTypeName: string, typeAdapter: TypeAdapter | undefined): string;
_modulo(params: any[], valueSource: ToSql, value: any, columnType: ValueType, columnTypeName: string, typeAdapter: TypeAdapter | undefined): string;
_atan2(params: any[], valueSource: ToSql, value: any, columnType: ValueType, columnTypeName: string, typeAdapter: TypeAdapter | undefined): string;
}
export interface SqlFunction2 {
_substr(params: any[], valueSource: ToSql, value: any, value2: any, columnType: ValueType, columnTypeName: string, typeAdapter: TypeAdapter | undefined): string;
_substring(params: any[], valueSource: ToSql, value: any, value2: any, columnType: ValueType, columnTypeName: string, typeAdapter: TypeAdapter | undefined): string;
_replaceAll(params: any[], valueSource: ToSql, value: any, value2: any, columnType: ValueType, columnTypeName: string, typeAdapter: TypeAdapter | undefined): string;
}
export interface SqlSequenceOperation {
_nextSequenceValue(params: any[], sequenceName: string): string;
_currentSequenceValue(params: any[], sequenceName: string): string;
}
export interface SqlFragmentOperation {
_fragment(params: any[], sql: TemplateStringsArray, sqlParams: AnyValueSource[]): string;
}
export interface AggregateFunctions0 {
_countAll(params: any[]): string;
}
export interface AggregateFunctions1 {
_count(params: any[], value: any): string;
_countDistinct(params: any[], value: any): string;
_max(params: any[], value: any): string;
_min(params: any[], value: any): string;
_sum(params: any[], value: any): string;
_sumDistinct(params: any[], value: any): string;
_average(params: any[], value: any): string;
_averageDistinct(params: any[], value: any): string;
}
export interface AggregateFunctions1or2 {
_stringConcat(params: any[], separator: string | undefined, value: any): string;
_stringConcatDistinct(params: any[], separator: string | undefined, value: any): string;
}
export interface SqlOperationStatic0 extends SqlFunctionStatic0 {
}
export interface SqlOperationStatic1 extends SqlFunctionStatic1 {
}
export interface SqlOperation0 extends SqlComparator0, SqlFunction0 {
}
export interface SqlOperation1 extends SqlComparator1, SqlFunction1 {
}
export interface SqlOperation2 extends SqlComparator2, SqlFunction2 {
}
export interface SqlOperation extends SqlOperationStatic0, SqlOperationStatic1, SqlOperation0, SqlOperation1, SqlOperation2, SqlSequenceOperation, SqlFragmentOperation, AggregateFunctions0, AggregateFunctions1, AggregateFunctions1or2 {
_inlineSelectAsValue(query: SelectData, params: any[]): string;
_asNullValue(params: any[], columnType: ValueType, columnTypeName: string, typeAdapter: TypeAdapter | undefined): string;
}