@blueshit/squel
Version:
squel without browser supports
1,618 lines (1,374 loc) • 53.6 kB
TypeScript
/* tslint:disable:max-file-line-count */
declare namespace squel {
type Flavour = "mssql" | "mysql" | "postgres";
type ValueHandler<T> = (value: T, asParam: boolean) => string | ParamString;
interface BuilderConstructor<B> {
new(options?: QueryBuilderOptions): B;
}
/*
* ---------------------------------------------------------------------------------------------------------
* ---------------------------------------------------------------------------------------------------------
* Base classes
* ---------------------------------------------------------------------------------------------------------
* ---------------------------------------------------------------------------------------------------------
*/
interface ToParamOptions {
/**
* The index to start numbered parameter placeholders at. Default is `1`.
*/
numberedParametersStartAt: number;
}
/**
* Base class for cloneable builders
*/
interface Cloneable {
/**
* Clone this object instance.
*/
clone(): this;
}
interface CompleteQueryBuilderOptions {
/**
* If `true` then table names will be rendered inside quotes. The quote character used is configurable via the
* `nameQuoteCharacter` option. `Default: (false)`.
*/
autoQuoteTableNames: boolean;
/**
* If `true` then field names will be rendered inside quotes. The quote character used is configurable via the
* `nameQuoteCharacter` option. `Default: (false)`.
*/
autoQuoteFieldNames: boolean;
/**
* If `true` then alias names will be rendered inside quotes. The quote character used is configurable via the
* `tableAliasQuoteCharacter` and `fieldAliasQuoteCharacter` options. `Default: (false)`.
*/
autoQuoteAliasNames: boolean;
/**
* Use `AS` clause when outputting table aliases. `Default: (false)`.
*/
useAsForTableAliasNames: boolean;
/**
* The quote character used when quoting table and field names. <code>Default: (`)</code>.
*/
nameQuoteCharacter: string;
/**
* The quote character used when quoting table alias names. <code>Default: (`)</code>.
*/
tableAliasQuoteCharacter: string;
/**
* The quote character used when quoting field alias names. `Default: (")`.
*/
fieldAliasQuoteCharacter: string;
/**
* Custom value type handlers for this builder. These override the handlers set for the given value types via
* [[Cls.registerValueHandler]] `Default: ([])`.
*/
valueHandlers: ValueHandler<any>[];
/**
* String used to represent a parameter value. `Default: (?)`.
*/
parameterCharacter: string;
/**
* Whether to use numbered parameters placeholders when building parameterized query strings.
* `Default: (false, postgres: true)`.
*/
numberedParameters: boolean;
/**
* Numbered parameters prefix character(s). `Default: ($)`.
*/
numberedParametersPrefix: string;
/**
* The index to start numbered parameter placeholders at. `Default: (1)`.
*/
numberedParametersStartAt: number;
/**
* Whether to replace single quotes within strings. The replacement is specified in
* `singleQuoteReplacement`. `Default: (false)`.
*/
replaceSingleQuotes: boolean;
/**
* What to replace single quotes with if replaceSingleQuotes is enabled. `Default: ('')`.
*/
singleQuoteReplacement: string;
/**
* String used to join individual blocks in a query when it is stringified. `Default: ( )`.
*/
separator: string;
/**
* Function to process string values, prior to insertion into a query string. `Default: (null)`.
*/
stringFormatter: any | null;
/**
* Whether to prevent the addition of brackets () when nesting this query builder's output. `Default: (false)`.
*/
rawNesting: boolean;
}
type QueryBuilderOptions = Partial<CompleteQueryBuilderOptions>;
interface ParamString {
text: string;
values: any[];
}
export interface FormattingOptions {
// TODO
}
export interface BuildManyStringOptions {
/**
* Whether to build paramterized string. Default is false.
*/
buildParameterized?: boolean;
/**
* Whether this expression is nested within another.
*/
nested?: boolean;
}
export interface BuildStringOptions extends BuildManyStringOptions {
/**
* Formatting options for values in query string.
*/
formattingOptions?: FormattingOptions;
}
export interface FormatValueResult<T = any> {
formatted: boolean;
value: T;
rawNesting?: boolean;
}
/**
* Base class for all builders
*/
interface BaseBuilder extends Cloneable {
options: CompleteQueryBuilderOptions;
/**
* Register a custom value type handler. We may wish to use custom value types (e.g. `Date`) and have Squel
* automatically take care of formatting them when building the output query string.
*
* @param type The class object or `typeof` string representing the value type to handle
* @param handler The handler method to call when we wish to format this value for output in a query string
*/
registerValueHandler(type: {new(...args: any[]): any} | string, handler: ValueHandler<any>): this;
/**
* Build and return the final query string.
*/
toString(): string;
/**
* Build and return the final parameterized query string along with the list of formatted parameter values.
*
* @param options Additional options.
*/
toParam(options?: ToParamOptions): ParamString;
/**
* Sanitize given expression.
*
* Note: This ensures that the type is a string or BaseBuilder, else it throws an error
*/
_sanitizeExpression<T extends string | BaseBuilder>(expr: T): T;
/**
* Sanitize the given name.
*
* The 'type' parameter is used to construct a meaningful error message in case validation fails.
*/
_sanitizeName(value: string, type: string): string;
_sanitizeField<T extends string | BaseBuilder>(item: T): T;
_sanitizeBaseBuilder<T extends BaseBuilder>(item: T): T;
_sanitizeTable<T extends string | BaseBuilder>(item: T): T;
_sanitizeTableAlias(item: string): string;
_sanitizeFieldAlias(item: string): string;
/**
* Sanitize the given limit/offset value.
*/
_sanitizeLimitOffset(value: number): number;
/**
* Santize the given field value
*/
_sanitizeValue<T>(item: T): T;
/**
* Escape a string value, e.g. escape quotes and other characters within it.
*/
_escapeValue(value: string): string;
_formatTableName(item: string): string;
_formatFieldAlias(item: string): string;
_formatTableAlias(item: string): string;
_formatFieldName(item: string, formattingOptions?: {ignorePeriodsForFieldNameQuotes?: boolean}): string;
_formatCustomValue<T = any>(
value: T,
asParam: boolean,
formattingOptions?: FormattingOptions,
): FormatValueResult<T>;
// Note: this type definition does not handle multi-dimensional arrays
// TODO(demurgos): Handle multidimensional arrays
_formatValueForParamArray<T = any>(
value: T[],
formattingOptions?: FormattingOptions,
): FormatValueResult<T>[];
_formatValueForParamArray<T = any>(
value: T,
formattingOptions?: FormattingOptions,
): FormatValueResult<T>;
/**
* Format the given field value for inclusion into the query string
*/
_formatValueForQueryString(initialValue: any, formattingOptions?: FormattingOptions): string;
_applyNestingFormatting(str: string, nesting?: boolean): string;
/**
* Build given string and its corresponding parameter values into
* output.
*
* @param str
* @param values
* @param options Additional options.
*/
_buildString(str: string, values: any[], options?: BuildStringOptions): ParamString;
/**
* Build all given strings and their corresponding parameter values into
* output.
*
* @param strings
* @param strValues array of value arrays corresponding to each string.
* @param options Additional options.
*/
_buildManyStrings(strings: string[], strValues: any[][], options?: BuildManyStringOptions): ParamString;
_toParamString(options?: ToParamOptions): ParamString;
}
/*
* ---------------------------------------------------------------------------------------------------------
* ---------------------------------------------------------------------------------------------------------
* Expression
* ---------------------------------------------------------------------------------------------------------
* ---------------------------------------------------------------------------------------------------------
*/
export interface ExpressionNode {
type: "AND" | "OR";
expr: string | BaseBuilder;
para: any[];
}
/**
* An SQL expression builder.
*
* SQL expressions are used in WHERE and ON clauses to filter data by various criteria.
*
* Expressions can be nested. Nested expression contains can themselves
* contain nested expressions. When rendered a nested expression will be
* fully contained within brackets.
*
* All the build methods in this object return the object instance for chained method calling purposes.
*/
interface Expression extends BaseBuilder {
_nodes: ExpressionNode[];
/**
* Add to the current expression using `AND`.
*
* @param expr The expression to add
* @param params The expression parameters supplied as additional arguments Default is `[]`.
*/
and(expr: string | Expression, ...params: any[]): this;
/**
* Add to the current expression using `OR`.
*
* @param expr The expression to add
* @param params The expression parameters supplied as additional arguments Default is `[]`.
*/
or(expr: string | Expression, ...params: any[]): this;
}
/*
* ---------------------------------------------------------------------------------------------------------
* ---------------------------------------------------------------------------------------------------------
* Case
* ---------------------------------------------------------------------------------------------------------
* ---------------------------------------------------------------------------------------------------------
*/
export interface CaseItem {
expression: string;
values: any[];
result?: any;
}
/**
* An SQL CASE expression builder.
*
* SQL cases are used to select proper values based on specific criteria.
*/
interface Case extends BaseBuilder {
_cases: CaseItem[];
_elseValue: any | null;
/**
* A `WHEN` clause
*
* @param expression The expression for the current case.
* @param values Additional arguments for parameter substitution. See guide for examples. Default is `null`.
*/
when(expression: string, ...values: any[]): this;
/**
* A THEN clause
*
* @param result The result for the current case.
*/
then(result: any): this;
/**
* An `ELSE` clause
*
* @param elseValue The else value for the current case.
*/
else(elseValue: any): this;
}
/*
* ---------------------------------------------------------------------------------------------------------
* ---------------------------------------------------------------------------------------------------------
* Building blocks
* ---------------------------------------------------------------------------------------------------------
* ---------------------------------------------------------------------------------------------------------
*/
/**
* A building block represents a single build-step within a query building process.
*
* Query builders consist of one or more building blocks which get run in a particular order. Building blocks can
* optionally specify methods to expose through the query builder interface. They can access all the input data for
* the query builder and manipulate it as necessary, as well as append to the final query string output.
*
* If you wish to customize how queries get built or add proprietary query phrases and content then it is
* recommended that you do so using one or more custom building blocks.
*
* Original idea posted in https://github.com/hiddentao/export/issues/10#issuecomment-15016427
*/
interface Block extends BaseBuilder {
/**
* Get input methods to expose within the query builder.
*
* By default all methods except the following get returned:
* methods prefixed with _
* constructor and toString()
*
* @return Object key -> function pairs
*/
exposedMethods(): {[key: string]: (...args: any[]) => any};
}
/**
* A fixed string which always gets output
*/
interface StringBlock extends Block {
_str: string;
}
interface StringBlockConstructor {
new(options: QueryBuilderOptions | undefined, str: string): StringBlock;
}
/**
* A function string block
*/
interface FunctionBlock extends Block {
_strings: string[];
_values: any[];
/**
* Insert a function value, see [[FunctionBlock]].
*/
function(str: string, ...value: any[]): void;
}
interface FunctionMixin {
/**
* Insert a function value, see [[FunctionBlock]].
*/
function(str: string, ...value: any[]): this;
}
export interface Table {
table: string | BaseBuilder;
alias: string | null;
}
interface TableBlockOptions extends QueryBuilderOptions {
/**
* If true then only allow one table spec.
*/
singleTable?: boolean;
}
interface AbstractTableBlock extends Block {
options: CompleteQueryBuilderOptions & TableBlockOptions;
_tables: Table[];
/**
* Update given table.
*
* An alias may also be specified for the table.
*
* Concrete subclasses should provide a method which calls this
*/
_table(table: string | BaseBuilder, alias?: string): void;
/**
* get whether a table has been set
*/
_hasTable(): boolean;
}
interface TargetTableBlock extends AbstractTableBlock {
target(table: string): void;
}
interface TargetTableMixin {
/**
* The actual target table whose data is to be deleted. Used in conjunction with `from()`.
*
* @param table Name of table.
*/
target(table: string): this;
}
interface UpdateTableBlock extends AbstractTableBlock {
table(name: string, alias?: string): void;
}
interface UpdateTableMixin {
/**
* A table to update.
*
* @param name Name of table.
* @param alias An alias by which to refer to this table. Default is `null`.
*/
table(name: string, alias?: string): this;
}
interface FromTableBlock extends AbstractTableBlock {
from(name: string | BaseBuilder, alias?: string): void;
}
interface FromTableMixin {
/**
* A table to select data from.
*
* @param name Name of table or a builder.
* @param alias An alias by which to refer to this table. Default is null.
*/
from(name: string | BaseBuilder, alias?: string): this;
}
interface IntoTableBlock extends AbstractTableBlock {
into(name: string): void;
}
interface IntoTableMixin {
/**
* The table to insert into.
*
* @param name Name of table.
*/
into(name: string): this;
}
interface FieldOptions {
/**
* When `autoQuoteFieldNames` is turned on this flag instructs it to ignore the period (.) character within field
* names. Default is `false`.
*/
ignorePeriodsForFieldNameQuotes?: boolean;
}
export interface Field {
alias: string | null;
field: string | BaseBuilder;
options: FieldOptions;
}
interface GetFieldBlock extends Block {
_fields: Field[];
/**
* Add the given field to the final result set.
*
* The 'field' parameter does not necessarily have to be a fieldname. It can use database functions too,
* e.g. DATE_FORMAT(a.started, "%H")
*
* An alias may also be specified for this field.
*/
field(name: string | BaseBuilder, alias?: string, options?: FieldOptions): this;
/**
* Add the given fields to the final result set.
*
* The parameter is an Object containing field names (or database functions) as the keys and aliases for the
* fields as the values. If the value for a key is null then no alias is set for that field.
*
* Internally this method simply calls the field() method of this block to add each individual field.
*/
fields(fields: {[field: string]: string} | string[], options?: FieldOptions): this;
}
interface GetFieldMixin {
/**
* Set a field to select data for.
*
* @param name Name of field OR an SQL expression such as `DATE_FORMAT` OR a builder.
* @param alias An alias by which to refer to this field. Default is `null`.
* @param options Additional options. Default is `null`.
*/
field(name: string | BaseBuilder, alias?: string, options?: FieldOptions): this;
/**
* Set fields to select data for.
*
* @param fields List of field:alias pairs OR Array of field names
* @param options Additional options. Default is `null`.
*/
fields(fields: {[field: string]: string} | string[], options?: FieldOptions): this;
}
/**
* Additional options for `update().set()`.
*/
interface SetOptions {
/**
* When `autoQuoteFieldNames` is turned on this flag instructs it to ignore the period (.) character within
* field names. Default is `false`.
*/
ignorePeriodsForFieldNameQuotes?: boolean;
/**
* If set and the value is a String then it will not be quoted in the output Default is `false`.
*/
dontQuote?: boolean;
}
/**
* Additional options for `update().setFields()`.
*/
interface SetFieldsOptions {
/**
* When `autoQuoteFieldNames` is turned on this flag instructs it to ignore the period (.) character within
* field names. Default is `false`.
*/
ignorePeriodsForFieldNameQuotes?: boolean;
}
interface AbstractSetFieldBlock extends Block {
_fields: (string | BaseBuilder)[];
_values: any[][];
_valueOptions: SetOptions[][];
_reset(): void;
/**
* Update the given field with the given value.
* This will override any previously set value for the given field.
*/
_set(field: string | BaseBuilder, value: any, options?: SetOptions): void;
/**
* Insert fields based on the key/value pairs in the given object
*/
_setFields(fields: {[field: string]: any}, options?: SetOptions): void;
}
interface SetFieldBlock extends AbstractSetFieldBlock {
set(name: string, value?: any, options?: SetOptions): this;
setFields(fields: {[field: string]: any}, options?: SetOptions): this;
/**
* Insert multiple rows for the given fields. Accepts an array of objects.
* This will override all previously set values for every field.
*/
setFieldsRows<T extends {[field: string]: any}>(fieldsRows: T[], options?: SetFieldsOptions): void;
}
interface SetFieldMixin {
/**
* Set a field to a value.
*
* @param name Name of field or an operation.
* @param value Value to set to field. Default is `undefined`.
* @param options Additional options. Default is `null`.
*/
set(name: string, value?: any, options?: SetOptions): this;
/**
* Set fields to given values.
*
* @param fields Field-value pairs.
* @param options Additional options. Default is `null`.
*/
setFields(fields: {[field: string]: any}, options?: SetFieldsOptions): this;
}
interface InsertFieldValueBlock extends AbstractSetFieldBlock {
set(name: string, value: any, options?: SetOptions): void;
setFields(name: {[field: string]: any}, options?: SetFieldsOptions): void;
setFieldsRows<T extends {[field: string]: any}>(fields: T[], options?: SetFieldsOptions): void;
}
interface InsertFieldValueMixin {
/**
* Set a field to a value.
*
* @param name Name of field.
* @param value Value to set to field.
* @param options Additional options. Default is `null`.
*/
set(name: string, value: any, options?: SetOptions): this;
/**
* Set fields to given values.
*
* @param name Field-value pairs.
* @param options Additional options. Default is `null`.
*/
setFields(name: {[field: string]: any}, options?: SetFieldsOptions): this;
/**
* Set fields to given values in the given rows (a multi-row insert).
*
* @param fields An array of objects, where each object is map of field-value pairs for that row
* @param options Additional options. Default is `null`.
*/
setFieldsRows<T extends {[field: string]: any}>(fields: T[], options?: SetFieldsOptions): this;
}
interface InsertFieldsFromQueryBlock extends Block {
_query: null | BaseBuilder;
fromQuery(columns: string[], selectQry: Select): void;
}
interface InsertFieldsFromQueryMixin {
/**
* Insert results of given `SELECT` query
*
* @param columns Names of columns to insert.
* @param selectQry The query to run.
*/
fromQuery(columns: string[], selectQry: Select): this;
}
interface DistinctBlock extends Block {
/**
* Add the DISTINCT keyword to the query.
*/
distinct(): void;
}
interface DistinctMixin {
/**
* Insert the DISTINCT keyword.
*/
distinct(): this;
}
interface GroupByBlock extends Block {
_groups: string[];
/**
* Add a GROUP BY transformation for the given field.
*/
group(field: string): this;
}
interface GroupByMixin {
/**
* Add an GROUP BY clause.
*
* @param field Name of field to group by.
*/
group(field: string): this;
}
interface VerbSingleValueBlockOptions extends QueryBuilderOptions {
/**
* The prefix verb string.
*/
verb?: string;
}
interface AbstractVerbSingleValueBlock extends Block {
options: CompleteQueryBuilderOptions & VerbSingleValueBlockOptions;
_value: number;
_setValue(value: number): void;
}
interface OffsetBlock extends AbstractVerbSingleValueBlock {
/**
* Set the OFFSET transformation.
*
* Call this will override the previously set offset for this query. Also note that Passing 0 for 'max' will
* remove the offset.
*/
offset(limit: number): void;
}
interface OffsetMixin {
/**
* Add an OFFSET clause.
*
* @param limit Index of record to start fetching from.
*/
offset(limit: number): this;
}
interface LimitBlock extends AbstractVerbSingleValueBlock {
/**
* Set the LIMIT transformation.
*
* Call this will override the previously set limit for this query. Also note that Passing 0 for 'max' will remove
* the limit.
*/
limit(limit: number): void;
}
interface LimitMixin {
/**
* Add a LIMIT clause.
*
* @param limit Number of records to limit the query to.
*/
limit(limit: number): this;
}
interface ConditionBlockOptions extends QueryBuilderOptions {
/**
* The condition verb.
*/
verb?: string;
}
interface Condition {
expr: string | Expression;
values: any[];
}
interface AbstractConditionBlock extends Block {
options: CompleteQueryBuilderOptions & ConditionBlockOptions;
_conditions: Condition[];
}
interface WhereBlock extends AbstractConditionBlock {
where(condition: string | Expression, ...args: any[]): void;
}
interface WhereMixin {
/**
* Add a WHERE condition.
*
* @param condition The condition expression.
* @param args Additional arguments for parameter substitution. See guide for examples. Default is `null`.
*/
where(condition: string | Expression, ...args: any[]): this;
}
interface HavingBlock extends AbstractConditionBlock {
having(condition: string | Expression, ...args: any[]): void;
}
interface HavingMixin {
/**
* Add a HAVING condition.
*
* @param condition The condition expression.
* @param args Additional arguments for parameter substitution. See guide for examples. Default
* is `null`.
*/
having(condition: string | Expression, ...args: any[]): this;
}
interface OrderByBlock extends Block {
/**
* Add an ORDER BY transformation for the given field in the given order.
*
* To specify descending order pass false for the 'dir' parameter.
*/
order(field: string, direction?: boolean | null, ...values: any[]): void;
}
interface OrderByMixin {
/**
* Add an ORDER BY clause.
*
* @param field Name of field to sort by.
* @param direction Sort direction. `true` = ascending, `false` = descending, `null` = no direction set.
* Default is `true`.
* @param values List of parameter values specified as additional arguments. Default is `[]`.
*/
order(field: string, direction?: boolean | null, ...values: any[]): this;
}
interface Join {
type: string;
table: string | BaseBuilder;
alias: string | null;
condition: string | Expression | null;
}
interface JoinBlock extends Block {
_joins: Join[];
/**
* Add a JOIN with the given table.
*
* 'table' is the name of the table to join with.
*
* 'alias' is an optional alias for the table name.
*
* 'condition' is an optional condition (containing an SQL expression) for the JOIN.
*
* 'type' must be either one of INNER, OUTER, LEFT or RIGHT. Default is 'INNER'.
*/
join(
name: string | BaseBuilder,
alias?: string,
condition?: string | Expression,
type?: "INNER" | "OUTER" | "LEFT" | "RIGHT",
): this;
left_join(name: string | BaseBuilder, alias?: string, condition?: string | Expression): this;
right_join(name: string | BaseBuilder, alias?: string, condition?: string | Expression): this;
outer_join(name: string | BaseBuilder, alias?: string, condition?: string | Expression): this;
cross_join(name: string | BaseBuilder, alias?: string, condition?: string | Expression): this;
}
interface JoinMixin {
/**
* Add an INNER JOIN.
*
* @param name The table to join on. Can be a a [[BaseBuilder]] instance.
* @param alias An alias by which to refer to this table. Default is `null`.
* @param condition A joining ON condition. Default is `null`.
*/
join(name: string | BaseBuilder, alias?: string, condition?: string | Expression): this;
/**
* Add a LEFT JOIN.
*
* @param name The table to join on. Can be a a [[cls.BaseBuilder]] instance.
* @param alias An alias by which to refer to this table. Default is `null`.
* @param condition A joining ON condition. Default is `null`.
*/
left_join(name: string | BaseBuilder, alias?: string, condition?: string | Expression): this;
/**
* Add a RIGHT JOIN.
*
* @param name The table to join on. Can be a a [[cls.BaseBuilder]] instance.
* @param alias An alias by which to refer to this table. Default is `null`.
* @param condition A joining ON condition. Default is `null`.
*/
right_join(name: string | BaseBuilder, alias?: string, condition?: string | Expression): this;
/**
* Add a OUTER JOIN.
*
* @param name The table to join on. Can be a a [[cls.BaseBuilder]] instance.
* @param alias An alias by which to refer to this table. Default is `null`.
* @param condition A joining ON condition. Default is `null`.
*/
outer_join(name: string | BaseBuilder, alias?: string, condition?: string | Expression): this;
/**
* Add a CROSS JOIN.
*
* @param name The table to join on. Can be a a [[cls.BaseBuilder]] instance.
* @param alias An alias by which to refer to this table. Default is `null`.
* @param condition A joining ON condition. Default is `null`.
*/
cross_join(name: string | BaseBuilder, alias?: string, condition?: string | Expression): this;
}
interface Union {
type: string;
table: QueryBuilder;
}
interface UnionBlock extends Block {
_unions: Union[];
/**
* Add a UNION with the given table/query.
*
* 'table' is the name of the table or query to union with.
*
* 'type' must be either one of UNION or UNION ALL.... Default is 'UNION'.
*/
union(table: QueryBuilder, type?: "UNION" | "UNION ALL"): void;
/**
* Add a UNION ALL with the given table/query.
*/
union_all(table: QueryBuilder): void;
}
interface UnionMixin {
/**
* Combine with another `SELECT` using `UNION`.
*
* @param query Another `SELECT` query to combine this query with.
*/
union(query: QueryBuilder): this;
/**
* Combine with another `SELECT` using `UNION ALL`.
*
* @param query Another `SELECT` query to combine this query with.
*/
union_all(query: QueryBuilder): this;
}
/* tslint:disable:member-ordering */
interface Cls {
/**
* Get whether obj is a query builder
*
* Note: this is a loose test checking for `_toParamString`
*/
isSquelBuilder(obj: any): obj is BaseBuilder;
/**
* Default configuration options for all query builders. These can be overridden in the query builder
* constructors.
*/
DefaultQueryBuilderOptions: CompleteQueryBuilderOptions;
/**
* Global custom value handlers for all instances of builder
*/
globalValueHandlers: ValueHandler<any>[];
/**
* Register a custom value type handler. We may wish to use custom value types (e.g. `Date`) and have Squel
* automatically take care of formatting them when building the output query string.
*
* @param type The class object or `typeof` string representing the value type to handle
* @param handler The handler method to call when we wish to format this value for output in a query string
*/
registerValueHandler(type: {new(...args: any[]): any} | string, handler: ValueHandler<any>): void;
Cloneable: {new(): Cloneable};
BaseBuilder: BuilderConstructor<BaseBuilder>;
Expression: BuilderConstructor<Expression>;
Case: {new(fieldName: string, options?: QueryBuilderOptions): Case};
Block: BuilderConstructor<Block>;
StringBlock: {new(options: QueryBuilderOptions | null, str: string): StringBlock};
FunctionBlock: BuilderConstructor<FunctionBlock>;
AbstractTableBlock: {new(options?: TableBlockOptions): AbstractTableBlock};
TargetTableBlock: {new(options?: TableBlockOptions): TargetTableBlock};
UpdateTableBlock: {new(options?: TableBlockOptions): UpdateTableBlock};
FromTableBlock: {new(options?: TableBlockOptions): FromTableBlock};
IntoTableBlock: {new(options?: TableBlockOptions): IntoTableBlock};
GetFieldBlock: BuilderConstructor<GetFieldBlock>;
AbstractSetFieldBlock: BuilderConstructor<AbstractSetFieldBlock>;
SetFieldBlock: BuilderConstructor<SetFieldBlock>;
InsertFieldValueBlock: BuilderConstructor<InsertFieldValueBlock>;
InsertFieldsFromQueryBlock: BuilderConstructor<InsertFieldsFromQueryBlock>;
DistinctBlock: BuilderConstructor<DistinctBlock>;
GroupByBlock: BuilderConstructor<GroupByBlock>;
AbstractVerbSingleValueBlock: {new(options?: VerbSingleValueBlockOptions): AbstractVerbSingleValueBlock};
OffsetBlock: {new(options?: VerbSingleValueBlockOptions): OffsetBlock};
LimitBlock: {new(options?: VerbSingleValueBlockOptions): LimitBlock};
AbstractConditionBlock: {new(options?: ConditionBlockOptions): AbstractConditionBlock};
WhereBlock: {new(options?: ConditionBlockOptions): WhereBlock};
HavingBlock: {new(options?: ConditionBlockOptions): HavingBlock};
OrderByBlock: BuilderConstructor<OrderByBlock>;
JoinBlock: BuilderConstructor<JoinBlock>;
UnionBlock: BuilderConstructor<UnionBlock>;
QueryBuilder: {
new(options?: QueryBuilderOptions): QueryBuilder;
new(options: QueryBuilderOptions | null, blocks: Block[]): QueryBuilder;
};
Select: {
new(options?: QueryBuilderOptions): Select;
new(options: QueryBuilderOptions | null, blocks: Block[]): QueryBuilder;
};
Update: {
new(options?: QueryBuilderOptions): Update;
new(options: QueryBuilderOptions | null, blocks: Block[]): QueryBuilder;
};
Delete: {
new(options?: QueryBuilderOptions): Delete;
new(options: QueryBuilderOptions | null, blocks: Block[]): QueryBuilder;
};
Insert: {
new(options?: QueryBuilderOptions): Insert;
new(options: QueryBuilderOptions | null, blocks: Block[]): QueryBuilder;
};
}
/* tslint:enable:member-ordering */
/*
* ---------------------------------------------------------------------------------------------------------
* ---------------------------------------------------------------------------------------------------------
* Query builders
* ---------------------------------------------------------------------------------------------------------
* ---------------------------------------------------------------------------------------------------------
*/
interface QueryBuilder extends BaseBuilder {
blocks: Block[];
/**
* Update query builder configuration options. This will pass on the options to all the registered
* [[Block]] objects.
*
* @param options Options for configuring this query builder.
*/
updateOptions(options: QueryBuilderOptions): void;
getBlock<B extends Block = Block>(blockType: {new(...args: any[]): B}): B;
}
/**
* SELECT query builder.
*/
interface Select extends QueryBuilder,
FunctionMixin,
DistinctMixin,
GetFieldMixin,
FromTableMixin,
JoinMixin,
WhereMixin,
GroupByMixin,
HavingMixin,
OrderByMixin,
LimitMixin,
OffsetMixin,
UnionMixin {
}
/**
* UPDATE query builder.
*/
interface Update extends QueryBuilder,
UpdateTableMixin,
SetFieldMixin,
WhereMixin,
OrderByMixin,
LimitMixin {
}
/**
* DELETE query builder.
*/
interface Delete extends QueryBuilder,
TargetTableMixin,
FromTableMixin,
JoinMixin,
WhereMixin,
OrderByMixin,
LimitMixin {
}
/**
* An INSERT query builder.
*/
interface Insert extends QueryBuilder,
IntoTableMixin,
InsertFieldValueMixin,
InsertFieldsFromQueryMixin {
}
/* tslint:disable:member-ordering */
interface Squel<S extends Select = Select,
U extends Update = Update,
D extends Delete = Delete,
I extends Insert = Insert,
C extends Case = Case> {
/**
* The version of Squel.
*/
readonly VERSION: string;
/**
* The current "flavour" of this squel instance.
*/
readonly flavour: Flavour | null;
/**
* Create a SELECT query builder instance.
*
* @param options Options for configuring this query builder. Default is [[DefaultQueryBuilderOptions]].
*/
select(options?: QueryBuilderOptions): S;
/**
* Create a custom SELECT query builder instance.
*
* @param options Options for configuring this query builder. Default is [[DefaultQueryBuilderOptions]].
* @param blocks List of [[Block]] objects which make up the functionality of this builder.
*/
select(options: QueryBuilderOptions | null, blocks: Block[]): QueryBuilder;
/**
* Create an UPDATE query builder instance.
*
* @param options Options for configuring this query builder. Default is [[DefaultQueryBuilderOptions]].
*/
update(options?: QueryBuilderOptions): U;
/**
* Create a custom UPDATE query builder instance.
*
* @param options Options for configuring this query builder. Default is [[DefaultQueryBuilderOptions]].
* @param blocks List of [[Block]] objects which make up the functionality of this builder.
*/
update(options: QueryBuilderOptions | null, blocks: Block[]): QueryBuilder;
/**
* Create a DELETE query builder instance.
*
* @param options Options for configuring this query builder. Default is [[DefaultQueryBuilderOptions]].
*/
delete(options?: QueryBuilderOptions): D;
/**
* Create a custom DELETE query builder instance.
*
* @param options Options for configuring this query builder. Default is [[DefaultQueryBuilderOptions]].
* @param blocks List of [[Block]] objects which make up the functionality of this builder.
*/
delete(options: QueryBuilderOptions | null, blocks: Block[]): QueryBuilder;
/**
* Alias for [[delete]]
*/
remove(options?: QueryBuilderOptions): D;
/**
* Alias for [[delete]]
*/
remove(options: QueryBuilderOptions | null, blocks: Block[]): QueryBuilder;
/**
* Create an INSERT query builder instance.
*
* @param options Options for configuring this query builder. Default is [[DefaultQueryBuilderOptions]].
*/
insert(options?: QueryBuilderOptions): I;
/**
* Create a custom INSERT query builder instance.
*
* @param options Options for configuring this query builder. Default is [[DefaultQueryBuilderOptions]].
* @param blocks List of [[Block]] objects which make up the functionality of this builder.
*/
insert(options: QueryBuilderOptions | null, blocks: Block[]): QueryBuilder;
/**
* Create an INSERT query builder instance.
*
* @param name Name of field. Default is `null`.
* @param options Options for configuring this query builder. Default is [[DefaultQueryBuilderOptions]].
*/
case(name: string, options?: QueryBuilderOptions): C;
/**
* Create a custom INSERT query builder instance.
*
* @param name Name of field. Default is `null`.
* @param options Options for configuring this query builder. Default is [[DefaultQueryBuilderOptions]].
* @param blocks List of [[Block]] objects which make up the functionality of this builder.
*/
case(name: string, options: QueryBuilderOptions | null, blocks: Block[]): QueryBuilder;
/**
* Create an SQL expression query builder instance.
*/
expr(): Expression;
/**
* Construct a [[FunctionBlock]] instance for inclusion within a query as a value.
*
* @param str The expression, with parameter placeholders.
* @param values The parameter values
*/
str(str: string, ...values: any[]): FunctionBlock;
/**
* Same as [[cls.str]] but with the `rawNesting` option turned on.
*
* @param str The expression, with parameter placeholders.
* @param values The parameter values
*/
rstr(str: string, ...values: any[]): FunctionBlock;
/**
* Register a custom value type handler. We may wish to use custom value types (e.g. `Date`) and have Squel
* automatically take care of formatting them when building the output query string.
*
* @param type The class object or `typeof` string representing the value type to handle
* @param handler The handler method to call when we wish to format this value for output in a query string
*/
registerValueHandler(type: {new(...args: any[]): any} | string, handler: ValueHandler<any>): void;
/**
* Classes and global methods in Squel.
*/
cls: Cls;
/**
* Available flavours
*/
readonly flavours: {[flavour: string]: (s: Squel) => void};
/**
* Get an instance of Squel for the MS-SQL SQL flavour.
*
* @param flavour The flavour of SQL to use.
*/
useFlavour(flavour: "mssql"): MssqlSquel;
/**
* Get an instance of Squel for the MySQL SQL flavour.
*
* @param flavour The flavour of SQL to use.
*/
useFlavour(flavour: "mysql"): MysqlSquel;
/**
* Get an instance of Squel for the Postgres SQL flavour.
*
* @param flavour The flavour of SQL to use.
*/
useFlavour(flavour: "postgres"): PostgresSquel;
}
/* tslint:enable:member-ordering */
/*
* ---------------------------------------------------------------------------------------------------------
* ---------------------------------------------------------------------------------------------------------
* MS-SQL Flavour
* ---------------------------------------------------------------------------------------------------------
* ---------------------------------------------------------------------------------------------------------
*/
interface MssqlLimitOffsetTopBlock extends Block {
_limits: null | number;
_offsets: null | number;
ParentBlock: {new(parent: Block): MssqlLimitOffsetTopBlock.ParentBlock};
LimitBlock: {new(parent: Block): MssqlLimitOffsetTopBlock.LimitBlock};
TopBlock: {new(parent: Block): MssqlLimitOffsetTopBlock.TopBlock};
OffsetBlock: {new(parent: Block): MssqlLimitOffsetTopBlock.OffsetBlock};
LIMIT(): MssqlLimitOffsetTopBlock.LimitBlock;
TOP(): MssqlLimitOffsetTopBlock.TopBlock;
OFFSET(): MssqlLimitOffsetTopBlock.OffsetBlock;
}
namespace MssqlLimitOffsetTopBlock {
interface ParentBlock extends Block {
_parent: Block;
}
interface LimitBlock extends ParentBlock {
limit(max: number): void;
}
interface LimitMixin {
/**
* Add a LIMIT clause.
*
* @param limit Number of records to limit the query to.
*/
limit(limit: number): this;
}
interface TopBlock extends ParentBlock {
top(max: number): void;
}
interface TopMixin {
/**
* Insert the `TOP` keyword to limit the number of rows returned.
*
* @param num Number of rows or percentage of rows to limit to
*/
top(num: number): this;
}
interface OffsetBlock extends ParentBlock {
offset(start: number): void;
}
interface OffsetMixin {
/**
* Add an OFFSET clause.
*
* @param limit Index of record to start fetching from.
*/
offset(limit: number): this;
}
}
interface MssqlUpdateTopBlock extends Block {
limit(max: number): void;
top(max: number): void;
}
interface MssqlUpdateTopMixin {
/**
* Add a LIMIT clause.
*
* @param limit Number of records to limit the query to.
*/
limit(limit: number): this;
/**
* Insert the `TOP` keyword to limit the number of rows returned.
*
* @param num Number of rows or percentage of rows to limit to
*/
top(num: number): this;
}
interface MssqlInsertFieldValueBlock extends InsertFieldValueBlock {
_outputs: string[];
/**
* add fields to the output clause
*/
output(fields: string | string[]): void;
}
interface MssqlInsertFieldValueMixin extends InsertFieldValueMixin {
/**
* Add field to OUTPUT clause.
*
* @param name Name of field or array of field names.
*/
output(name: string | string[]): this;
}
interface Output {
name: string;
alias: string | null;
}
interface MssqlUpdateDeleteOutputBlock extends Block {
_outputs: Output[];
/**
* Add the given field to the final result set.
*
* The 'field' parameter does not necessarily have to be a fieldname. It can use database functions too,
* e.g. DATE_FORMAT(a.started, "%H")
*
* An alias may also be specified for this field.
*/
output(output: string, alias?: string): void;
/**
* Add the given fields to the final result set.
*
* The parameter is an Object containing field names (or database functions) as the keys and aliases for the
* fields as the values. If the value for a key is null then no alias is set for that field.
*
* Internally this method simply calls the field() method of this block to add each individual field.
*/
outputs(outputs: {[field: string]: any}): void;
}
interface MssqlUpdateDeleteOutputMixin {
/**
* Add field to OUTPUT clause.
*
* @param name Name of field.
* @param alias An alias by which to refer to this field. Default is null.
*/
output(name: string, alias?: string): this;
/**
* Add fields to `OUTPUT` clause.
*
* @param fields List of field:alias pairs.
*/
outputs(fields: {[field: string]: any}): this;
}
interface MssqlCls extends Cls {
MssqlLimitOffsetTopBlock: BuilderConstructor<MssqlLimitOffsetTopBlock>;
MssqlUpdateTopBlock: BuilderConstructor<MssqlUpdateTopBlock>;
MssqlInsertFieldValueBlock: BuilderConstructor<MssqlInsertFieldValueBlock>;
MssqlUpdateDeleteOutputBlock: BuilderConstructor<MssqlUpdateDeleteOutputBlock>;
Select: {
new(options?: QueryBuilderOptions): MssqlSelect;
new(options: QueryBuilderOptions | null, blocks: Block[]): QueryBuilder;
};
Update: {
new(options?: QueryBuilderOptions): MssqlUpdate;
new(options: QueryBuilderOptions | null, blocks: Block[]): QueryBuilder;
};
Delete: {
new(options?: QueryBuilderOptions): MssqlDelete;
new(options: QueryBuilderOptions | null, blocks: Block[]): QueryBuilder;
};
Insert: {
new(options?: QueryBuilderOptions): MssqlInsert;
new(options: QueryBuilderOptions | null, blocks: Block[]): QueryBuilder;
};
}
/**
* MS-SQL SELECT query builder.
*/
interface MssqlSelect extends Select,
MssqlLimitOffsetTopBlock.TopMixin,
MssqlLimitOffsetTopBlock.LimitMixin,
MssqlLimitOffsetTopBlock.OffsetMixin {
}
/**
* MS-SQL UPDATE query builder.
*/
interface MssqlUpdate extends Update,
MssqlUpdateDeleteOutputMixin {
}
/**
* MS-SQL DELETE query builder.
*/
interface MssqlDelete extends Delete,
MssqlUpdateDeleteOutputMixin {
}
/**
* MS-SQL INSERT query builder.
*/
interface MssqlInsert extends Insert,
MssqlInsertFieldValueMixin {
}
interface MssqlSquel extends Squel<MssqlSelect, MssqlUpdate, MssqlDelete, MssqlInsert> {
cls: MssqlCls;
flavour: "mssql";
}
/*
* ---------------------------------------------------------------------------------------------------------
* ---------------------------------------------------------------------------------------------------------
* MySQL Flavour
* ---------------------------------------------------------------------------------------------------------
* ---------------------------------------------------------------------------------------------------------
*/
interface OnDupUpdateOptions {
/**
* When `autoQuoteFieldNames` is turned on this flag instructs it to ignore the period (.) character within field
* names. Default is `false`.
*/
ignorePeriodsForFieldNameQuotes: boolean;
/**
* If set and the value is a String then it will not be quoted in the output Default is `false`.
*/
dontQuote: boolean;
}
interface MysqlOnDuplicateKeyUpdateBlock extends AbstractSetFieldBlock {
onDupUpdate(name: string, value: any, options?: OnDupUpdateOptions): void;
}
interface MysqlOnDuplicateKeyUpdateMixin {
/**
* Add an ON DUPLICATE KEY UPDATE clause for given field
*
* @param name Name of field.
* @param value Value to set to field.
* @param options
*/
onDupUpdate(name: string, value: any, options?: OnDupUpdateOptions): this;
}
interface MysqlCls extends Cls {
MysqlOnDuplicateKeyUpdateBlock: BuilderConstructor<MysqlOnDuplicateKeyUpdateBlock>;
Insert: {
new(options?: QueryBuilderOptions): MysqlInsert;
new(options: QueryBuilderOptions | null, blocks: Block[]): QueryBuilder;
};
}
/**
* MySQL INSERT query builder.
*/
interface MysqlInsert extends Insert,
MysqlOnDuplicateKeyUpdateMixin {
}
/**
* MySQL REPLACE query builder.
*/
interface Replace extends QueryBuilder,
IntoTableMixin,
InsertFieldValueBlock,
InsertFieldsFromQueryMixin {
}
interface MysqlSquel extends Squel<Select, Update, Delete, MysqlInsert> {
cls: MysqlCls;
flavour: "mysql";
/**
* Create a REPLACE query builder instance.
*
* @param options Options for configuring this query builder. Default is [[DefaultQueryBuilderOptions]].
*/
replace(options?: QueryBuilderOptions): Replace;
/**
* Create a custom REPLACE query builder instance.
*
* @param options Options for configuring this query builder. Default is [[DefaultQueryBuilderOptions]].
* @param blocks List of [[Block]] objects which make up the functionality of this builder.
*/
replace(options: QueryBuilderOptions | null, blocks: Block[]): QueryBuilder;
}
/*
* ---------------------------------------------------------------------------------------------------------
* ---------------------------------------------------------------------------------------------------------
* Postgres Flavour
* ---------------------------------------------------------------------------------------------------------
* ---------------------------------------------------------------------------------------------------------
*/
interface PostgresOnConflictKeyUpdateBlock extends AbstractSetFieldBlock {
_onConflict?: boolean;
_dupFields?: string[];
onConflict(conflictFields: string | string[], fields?: {[f