ts-sql
Version:
An SQL builder in Typescript. This project is heavily inspired by [XQL](/extjs/xql). A big shout out to @exjs and @kobalicek for this amazing project.
355 lines (354 loc) • 15.6 kB
TypeScript
import { AstSymbol } from "jsymbol";
import "reflect-metadata";
export declare type SqlDialect = "MySQL" | "Custom";
export declare type SelectAll = "*";
export declare type NotOperator = "NOT" | "!";
export declare type UnaryOperator = NotOperator | "~" | "+" | "-";
export declare type ComparisonOperator = "=" | ">" | "<" | ">=" | "<=" | "!=" | "<=>";
export declare type LogicalOperator = "AND" | "OR" | "XOR" | "&&" | "||";
export declare type BitOperator = "<<" | ">>" | "&" | "|" | "^";
export declare type MathOperator = "*" | "/" | "DIV" | "MOD" | "%" | "+" | "-";
export declare type NullLiteral = "NULL" | "NOT NULL";
export declare type ConstantType = string | number | boolean | NullLiteral;
export declare type BinaryOperator = ComparisonOperator | LogicalOperator | BitOperator | MathOperator;
export declare type SortType = "ASC" | "DESC";
export declare type All = "ALL";
export declare type Distinct = "DISTINCT";
export declare type SelectSpec = All | Distinct | "DISTINCTROW" | "HIGH_PRIORITY" | "STRAIGHT_JOIN" | "SQL_SMALL_RESULT" | "SQL_BIG_RESULT" | "SQL_BUFFER_RESULT" | "SQL_CACHE" | "SQL_NO_CACHE" | "SQL_CALC_FOUND_ROWS";
export declare type LockClause = "FOR UPDATE" | "LOCK IN SHARE MODE";
export declare type Quantifier = "ALL" | "SOME" | "ANY";
export declare type IntervalTypeBase = "QUARTER" | "MONTH" | "DAY" | "HOUR" | "MINUTE" | "WEEK" | "SECOND" | "MICROSECOND";
export declare type IntervalType = IntervalTypeBase | "YEAR" | "YEAR_MONTH" | "DAY_HOUR" | "DAY_MINUTE" | "DAY_SECOND" | "HOUR_MINUTE" | "HOUR_SECOND" | "MINUTE_SECOND" | "SECOND_MICROSECOND" | "MINUTE_MICROSECOND" | "HOUR_MICROSECOND" | "DAY_MICROSECOND";
export declare type JoinType = "INNER" | "CROSS" | "LEFT OUTER" | "RIGHT OUTER";
export declare enum SqlSymbolType {
Table = 0,
Field = 1,
Variable = 2,
Alias = 3,
Function = 4,
}
export declare enum SqlNodeType {
Undefined = 0,
NotImplemented = 1,
SqlRoot = 2,
SelectStatement = 3,
QueryExpression = 4,
QueryIntoExpression = 5,
UnionGroupStatement = 6,
UnionStatement = 7,
AllColumns = 8,
ColumnName = 9,
SimpleFunctionCall = 10,
CaseExpression = 11,
CaseBranchExpression = 12,
Constant = 13,
AliasedTerm = 14,
AssignedTerm = 15,
NotExpression = 16,
BinaryExpression = 17,
TruthyPredicate = 18,
InPredicate = 19,
IsNullNotNullPredicate = 20,
BinaryPredicate = 21,
QuantifiedSelectStatement = 22,
BetweenPredicate = 23,
SoundsLikePredicate = 24,
LikePredicate = 25,
AssignedExpressionAtom = 26,
Variable = 27,
UnaryExpressionAtom = 28,
BinaryModifiedExpression = 29,
RowExpression = 30,
IntervalExpression = 31,
BinaryExpressionAtom = 32,
NestedSelectStatement = 33,
ExistsSelectStatement = 34,
FromClause = 35,
TableSource = 36,
TableSpec = 37,
WhereClause = 38,
GroupByClause = 39,
GroupByItem = 40,
JoinClause = 41,
OrderByClause = 42,
OrderByExpression = 43,
LimitClause = 44,
SelectIntoFieldsExpression = 45,
}
export declare const NodeTypeKey: unique symbol;
export declare const SqlNodeMarker: (nodeType: SqlNodeType) => <TNode extends new (...args: any[]) => SqlAstNode>(constructor: TNode) => {
new (...args: any[]): {
nodeType: SqlNodeType;
};
} & TNode;
export declare function getSqlNodeType(node: SqlAstNode): string;
export declare type SqlSymbol<T = {}> = string | AstSymbol<T>;
export declare abstract class SqlAstNode {
static getNodeType(node: SqlAstNode): string;
}
export declare class NotImplemented extends SqlAstNode {
}
export declare class SqlRoot extends SqlAstNode {
dialect: string;
statements: SqlStatement[];
constructor(dialect: string, statements?: SqlStatement[]);
}
export declare type SqlStatement = DdlStatement | DmlStatement | TransactionStatement | ReplicationStatement | PreparedStatement | AdministrationStatement | UtilityStatement;
export declare type DdlStatement = NotImplemented;
export declare type TransactionStatement = NotImplemented;
export declare type ReplicationStatement = NotImplemented;
export declare type PreparedStatement = NotImplemented;
export declare type AdministrationStatement = NotImplemented;
export declare type UtilityStatement = NotImplemented;
export declare type DmlStatement = SelectStatement | InsertStatement | UpdateStatement | DeleteStatement | ReplaceStatement | CallStatement | LoadDataStatement | LoadXmlStatement | DoStatement | HandlerStatement;
export declare type InsertStatement = NotImplemented;
export declare type UpdateStatement = NotImplemented;
export declare type DeleteStatement = NotImplemented;
export declare type ReplaceStatement = NotImplemented;
export declare type CallStatement = NotImplemented;
export declare type LoadDataStatement = NotImplemented;
export declare type LoadXmlStatement = NotImplemented;
export declare type DoStatement = NotImplemented;
export declare type HandlerStatement = NotImplemented;
export declare class SelectStatement extends SqlAstNode {
query: QueryIntoExpression | UnionGroupStatement;
lock?: LockClause;
constructor(query: QueryIntoExpression | UnionGroupStatement);
}
export declare class QueryExpression extends SqlAstNode {
selectSpec?: SelectSpec[];
selectAll?: SelectAll;
elements: SelectElement[];
from?: FromClause;
orderBy?: OrderByClause;
limit?: LimitClause;
constructor(elements?: SelectElement[]);
}
export declare class QueryIntoExpression extends SqlAstNode {
query: QueryExpression;
into?: SelectIntoExpression;
constructor(query: QueryExpression);
}
export declare class UnionStatement extends SqlAstNode {
unionWith: QueryExpression;
unionType?: All | Distinct;
constructor(unionWith: QueryExpression, unionType?: All | Distinct);
}
export declare class UnionGroupStatement extends SqlAstNode {
query: QueryExpression;
unions?: UnionStatement[];
unionType?: All | Distinct;
unionLast?: QueryIntoExpression;
orderBy?: OrderByClause;
limit?: LimitClause;
constructor(query: QueryExpression);
}
export declare type SelectElement = AllColumns | ColumnName | FunctionCall | Expression | AssignedTerm<Expression> | AliasedTerm<ColumnName> | AliasedTerm<FunctionCall> | AliasedTerm<AssignedTerm<Expression>>;
export declare class AllColumns extends SqlAstNode {
table: SqlSymbol;
constructor(table: SqlSymbol);
}
export declare class ColumnName extends SqlAstNode {
name: SqlSymbol;
table: string | AstSymbol<{}> | undefined;
constructor(name: SqlSymbol, table?: string | AstSymbol<{}> | undefined);
}
export declare type FunctionCall = SpecificFunction | AggregatedWindowFunction | SimpleFunctionCall | PasswordFunction;
export declare type SpecificFunction = CaseExpression | NotImplemented;
export declare type AggregatedWindowFunction = NotImplemented;
export declare type PasswordFunction = NotImplemented;
export declare class SimpleFunctionCall extends SqlAstNode {
name: SqlSymbol;
args: FunctionArgument[] | undefined;
constructor(name: SqlSymbol, args?: FunctionArgument[] | undefined);
}
export declare class CaseExpression extends SqlAstNode {
expression: NotImplemented | NotExpression | BinaryExpression<LogicalOperator> | TruthyPredicate | InPredicate | IsNullNotNullPredicate | BinaryPredicate | BetweenPredicate | SoundsLikePredicate | LikePredicate | AssignedExpressionAtom | undefined;
branches: CaseBranchExpression[];
elseBranch?: FunctionArgument;
constructor(expression?: NotImplemented | NotExpression | BinaryExpression<LogicalOperator> | TruthyPredicate | InPredicate | IsNullNotNullPredicate | BinaryPredicate | BetweenPredicate | SoundsLikePredicate | LikePredicate | AssignedExpressionAtom | undefined);
}
export declare class CaseBranchExpression extends SqlAstNode {
expression: FunctionArgument;
result: FunctionArgument;
constructor(expression: FunctionArgument, result: FunctionArgument);
}
export declare type FunctionArgument = Constant | ColumnName | FunctionCall | Expression;
export declare class Constant extends SqlAstNode {
value: ConstantType;
constructor(value: ConstantType);
}
export declare class AliasedTerm<TTerm extends SqlAstNode> extends SqlAstNode {
term: TTerm;
alias: string | AstSymbol<{}> | undefined;
constructor(term: TTerm, alias?: string | AstSymbol<{}> | undefined);
}
export declare class AssignedTerm<TTerm extends SqlAstNode> extends SqlAstNode {
value: TTerm;
variable: string | AstSymbol<{}> | undefined;
constructor(value: TTerm, variable?: string | AstSymbol<{}> | undefined);
}
export declare type Expression = NotExpression | BinaryExpression<LogicalOperator> | TruthyPredicate | Predicate;
export declare class NotExpression extends SqlAstNode {
expression: Expression;
constructor(expression: Expression);
}
export declare class BinaryExpression<TOperator extends BinaryOperator> extends SqlAstNode {
left: Expression;
operator: TOperator;
right: Expression;
constructor(left: Expression, operator: TOperator, right: Expression);
}
export declare class TruthyPredicate extends SqlAstNode {
predicate: Predicate;
negate: boolean;
testValue: boolean | undefined;
constructor(predicate: Predicate, negate?: boolean, testValue?: boolean | undefined);
}
export declare type Predicate = InPredicate | IsNullNotNullPredicate | BinaryPredicate | BetweenPredicate | SoundsLikePredicate | LikePredicate | RegexPredicate | AssignedExpressionAtom;
export declare class InPredicate extends SqlAstNode {
predicate: Predicate;
target: SelectStatement | Expression[];
negate: boolean;
constructor(predicate: Predicate, target: SelectStatement | Expression[], negate?: boolean);
}
export declare class IsNullNotNullPredicate extends SqlAstNode {
predicate: Predicate;
checkWith: NullLiteral;
constructor(predicate: Predicate, checkWith: NullLiteral);
}
export declare class BinaryPredicate extends SqlAstNode {
left: Predicate;
operator: ComparisonOperator;
right: Predicate | QuantifiedSelectStatement;
constructor(left: Predicate, operator: ComparisonOperator, right: Predicate | QuantifiedSelectStatement);
}
export declare class QuantifiedSelectStatement extends SqlAstNode {
quantifier: Quantifier;
statement: SelectStatement;
constructor(quantifier: Quantifier, statement: SelectStatement);
}
export declare class BetweenPredicate extends SqlAstNode {
operand: Predicate;
left: Predicate;
right: Predicate;
negate: boolean;
constructor(operand: Predicate, left: Predicate, right: Predicate, negate?: boolean);
}
export declare class SoundsLikePredicate extends SqlAstNode {
left: Predicate;
right: Predicate;
constructor(left: Predicate, right: Predicate);
}
export declare class LikePredicate extends SqlAstNode {
left: Predicate;
right: Predicate;
negate: boolean;
constructor(left: Predicate, right: Predicate, negate?: boolean);
}
export declare type RegexPredicate = NotImplemented;
export declare class AssignedExpressionAtom extends SqlAstNode {
expression: ExpressionAtom;
variable: string | AstSymbol<{}> | undefined;
constructor(expression: ExpressionAtom, variable?: string | AstSymbol<{}> | undefined);
}
export declare type ExpressionAtom = Constant | ColumnName | FunctionCall | CollatedExpression | Variable | UnaryExpressionAtom | BinaryModifiedExpression | Expression[] | RowExpression | ExistsSelectStatement | NestedSelectStatement | BinaryExpressionAtom<BitOperator | MathOperator>;
export declare type CollatedExpression = NotImplemented;
export declare class Variable extends SqlAstNode {
name: SqlSymbol;
constructor(name: SqlSymbol);
}
export declare class UnaryExpressionAtom extends SqlAstNode {
operator: UnaryOperator;
expression: ExpressionAtom;
constructor(operator: UnaryOperator, expression: ExpressionAtom);
}
export declare class BinaryModifiedExpression extends SqlAstNode {
expression: ExpressionAtom;
constructor(expression: ExpressionAtom);
}
export declare class RowExpression extends SqlAstNode {
expressions: Expression[];
constructor(expressions: Expression[]);
}
export declare class IntervalExpression extends SqlAstNode {
expression: Expression;
intervalType: IntervalType;
constructor(expression: Expression, intervalType: IntervalType);
}
export declare class BinaryExpressionAtom<TOperator extends BinaryOperator> extends SqlAstNode {
left: ExpressionAtom;
operator: TOperator;
right: ExpressionAtom;
constructor(left: ExpressionAtom, operator: TOperator, right: ExpressionAtom);
}
export declare class NestedSelectStatement extends SqlAstNode {
statement: SelectStatement;
constructor(statement: SelectStatement);
}
export declare class ExistsSelectStatement extends SqlAstNode {
statement: SelectStatement;
constructor(statement: SelectStatement);
}
export declare type SelectIntoExpression = SelectIntoFieldsExpression | SelectIntoDumpFileExpression | SelectIntoOutFileExpression;
export declare type SelectIntoDumpFileExpression = NotImplemented;
export declare type SelectIntoOutFileExpression = NotImplemented;
export declare class FromClause extends SqlAstNode {
tables: TableSource[];
where?: WhereClause;
groupBy?: GroupByClause;
having?: Expression;
constructor(tables: TableSource[]);
}
export declare class TableSource extends SqlAstNode {
tableSourceItem: TableSourceItem;
joins?: JoinClause[];
constructor(tableSourceItem: TableSourceItem);
}
export declare type TableSourceItem = TableSpec | AliasedTerm<TableSpec | NestedSelectStatement>;
export declare class TableSpec extends SqlAstNode {
tableName: SqlSymbol;
partitions?: SqlSymbol[];
indexHints?: IndexHint[];
constructor(tableName: SqlSymbol);
}
export declare type IndexHint = NotImplemented;
export declare class WhereClause extends SqlAstNode {
expression: Expression;
constructor(expression: Expression);
}
export declare class GroupByClause extends SqlAstNode {
items: GroupByItem[];
rollup: boolean;
constructor(items: GroupByItem[], rollup?: boolean);
}
export declare class GroupByItem extends SqlAstNode {
expression: Expression;
descending: boolean;
constructor(expression: Expression, descending?: boolean);
}
export declare class JoinClause extends SqlAstNode {
joinWith: TableSourceItem;
joinType?: JoinType;
on?: Expression;
using?: SqlSymbol[];
constructor(joinWith: TableSourceItem);
}
export declare class OrderByClause extends SqlAstNode {
expressions: OrderByExpression[];
constructor(expressions: OrderByExpression[]);
}
export declare class OrderByExpression extends SqlAstNode {
expression: Expression;
descending: boolean;
constructor(expression: Expression, descending?: boolean);
}
export declare class LimitClause extends SqlAstNode {
limit: number;
offset: number | undefined;
constructor(limit: number, offset?: number | undefined);
}
export declare class SelectIntoFieldsExpression extends SqlAstNode {
fields: SqlSymbol[];
constructor(fields: SqlSymbol[]);
}