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.
157 lines (156 loc) • 7.37 kB
TypeScript
import * as ast from "./astsql";
export interface PreparedQuery {
toSelect: ToSelectMethod;
build: BuildMethod;
}
export interface BinaryPredicateBuilderMethod {
(left: string | ast.Predicate, right: string | ast.Predicate): ast.BinaryPredicate;
}
export interface IntoMethod {
(...fields: string[]): PreparedQuery;
}
export interface LimitMethod {
(limit: number, offset?: number): LimitedProjection;
}
export interface OrderByMethod {
(...expressions: ast.OrderByExpression[]): OrderedProjection;
}
export interface SelectMethod {
(element: string | ast.SelectElement | ast.SelectAll, ...moreElements: ast.SelectElement[]): Projection;
}
export interface FromMethod {
(table: string | ast.NestedSelectStatement, alias?: string): QuerySource;
}
export interface JoinMethod {
(table: string | ast.NestedSelectStatement, alias: string, on: ast.Expression): QuerySource;
}
export interface WhereMethod {
(expression: ast.Expression): FilteredQuerySource;
}
export interface GroupByMethod {
(...fields: (string | ast.GroupByItem)[]): GroupedQuerySource;
}
export interface HavingMethod {
(condition: ast.Expression): GroupedAndFilteredQuerySource;
}
export interface ToSelectMethod {
(): ast.SelectStatement;
}
export interface BuildMethod {
(): ast.SqlRoot;
}
export interface QueryBuilder {
dialect: ast.SqlDialect;
query(): Queryable;
}
export interface Queryable {
select: SelectMethod;
from: FromMethod;
}
export interface QuerySource {
join: JoinMethod;
lefJoin: JoinMethod;
rightJoin: JoinMethod;
where: WhereMethod;
select: SelectMethod;
}
export interface FilteredQuerySource {
groupBy: GroupByMethod;
select: SelectMethod;
}
export interface GroupedQuerySource {
having: HavingMethod;
select: SelectMethod;
}
export interface GroupedAndFilteredQuerySource {
select: SelectMethod;
}
export interface Projection extends PreparedQuery {
orderBy: OrderByMethod;
limit: LimitMethod;
into: IntoMethod;
}
export interface OrderedProjection extends PreparedQuery {
orderBy: OrderByMethod;
into: IntoMethod;
limit: LimitMethod;
}
export interface LimitedProjection extends PreparedQuery {
into: IntoMethod;
}
export interface QueryElementsBuilder {
func(name: string, ...funcArgs: (string | ast.FunctionArgument)[]): ast.SimpleFunctionCall;
column(name: string, table?: string): ast.ColumnName;
literal(value: ast.ConstantType): ast.Constant | ast.AliasedTerm<ast.Constant>;
variable(name: string): ast.Variable;
exists(statement: ast.SelectStatement): ast.ExistsSelectStatement;
nested(statement: ast.SelectStatement): ast.NestedSelectStatement;
}
export interface ExpressionBuilder {
not(expression: ast.Expression): ast.NotExpression;
and(left: ast.Expression, right: ast.Expression): ast.BinaryExpression<ast.LogicalOperator>;
or(left: ast.Expression, right: ast.Expression): ast.BinaryExpression<ast.LogicalOperator>;
xor(left: ast.Expression, right: ast.Expression): ast.BinaryExpression<ast.LogicalOperator>;
}
export interface PredicateBuilder {
equals: BinaryPredicateBuilderMethod;
greater: BinaryPredicateBuilderMethod;
less: BinaryPredicateBuilderMethod;
greaterOrEquals: BinaryPredicateBuilderMethod;
lessOrEquals: BinaryPredicateBuilderMethod;
notEquals: BinaryPredicateBuilderMethod;
nullSafeEquals: BinaryPredicateBuilderMethod;
isTrue(predicate: ast.Predicate): ast.TruthyPredicate;
isFalse(predicate: ast.Predicate): ast.TruthyPredicate;
isUnknown(predicate: ast.Predicate): ast.TruthyPredicate;
in(predicate: ast.Predicate, target: ast.SelectStatement | ast.Expression[]): ast.InPredicate;
notIn(predicate: ast.Predicate, target: ast.SelectStatement | ast.Expression[]): ast.InPredicate;
isNull(predicate: ast.Predicate): ast.IsNullNotNullPredicate;
isNotNull(predicate: ast.Predicate): ast.IsNullNotNullPredicate;
binaryPredicate(left: ast.Predicate, operator: ast.ComparisonOperator, right: ast.Predicate): ast.BinaryPredicate;
between(operand: ast.Predicate, start: ast.Predicate, end: ast.Predicate): ast.BetweenPredicate;
notBetween(operand: ast.Predicate, start: ast.Predicate, end: ast.Predicate): ast.BetweenPredicate;
soundsLike(left: ast.Predicate, right: ast.Predicate): ast.SoundsLikePredicate;
like(left: ast.Predicate, right: ast.Predicate): ast.LikePredicate;
notLike(left: ast.Predicate, right: ast.Predicate): ast.LikePredicate;
}
export declare abstract class QueryBuilderBase implements QueryBuilder, QueryElementsBuilder, ExpressionBuilder, PredicateBuilder {
dialect: ast.SqlDialect;
constructor(dialect: ast.SqlDialect);
alias(node: ast.SqlAstNode, aliasName: string): ast.AliasedTerm<ast.SqlAstNode>;
func(name: string, ...funcArgs: (string | ast.FunctionArgument)[]): ast.SimpleFunctionCall;
column(name: string, table?: string): ast.ColumnName;
literal(value: ast.ConstantType, alias?: string): ast.Constant | ast.AliasedTerm<ast.Constant>;
variable(name: string): ast.Variable;
exists(statement: ast.SelectStatement): ast.ExistsSelectStatement;
nested(statement: ast.SelectStatement): ast.NestedSelectStatement;
not(expression: ast.Expression): ast.NotExpression;
and(left: ast.Expression, right: ast.Expression, ...more: ast.Expression[]): ast.BinaryExpression<ast.LogicalOperator>;
or(left: ast.Expression, right: ast.Expression, ...more: ast.Expression[]): ast.BinaryExpression<ast.LogicalOperator>;
xor(left: ast.Expression, right: ast.Expression): ast.BinaryExpression<ast.LogicalOperator>;
isTrue(predicate: ast.Predicate): ast.TruthyPredicate;
isFalse(predicate: ast.Predicate): ast.TruthyPredicate;
isUnknown(predicate: ast.Predicate): ast.TruthyPredicate;
in(predicate: ast.Predicate, target: ast.SelectStatement | ast.Expression[]): ast.InPredicate;
notIn(predicate: ast.Predicate, target: ast.SelectStatement | ast.Expression[]): ast.InPredicate;
isNull(predicate: ast.Predicate): ast.IsNullNotNullPredicate;
isNotNull(predicate: ast.Predicate): ast.IsNullNotNullPredicate;
binaryPredicate(left: ast.Predicate, operator: ast.ComparisonOperator, right: ast.Predicate): ast.BinaryPredicate;
equals: BinaryPredicateBuilderMethod;
greater: BinaryPredicateBuilderMethod;
less: BinaryPredicateBuilderMethod;
greaterOrEquals: BinaryPredicateBuilderMethod;
lessOrEquals: BinaryPredicateBuilderMethod;
notEquals: BinaryPredicateBuilderMethod;
nullSafeEquals: BinaryPredicateBuilderMethod;
between(operand: ast.Predicate, start: ast.Predicate, end: ast.Predicate): ast.BetweenPredicate;
notBetween(operand: ast.Predicate, left: ast.Predicate, right: ast.Predicate): ast.BetweenPredicate;
soundsLike(left: ast.Predicate, right: ast.Predicate): ast.SoundsLikePredicate;
like(left: ast.Predicate, right: ast.Predicate): ast.LikePredicate;
notLike(left: ast.Predicate, right: ast.Predicate): ast.LikePredicate;
query(): Queryable;
private buildBinaryPredicate(left, operator, right);
}
export declare class MySQLQueryBuilder extends QueryBuilderBase {
constructor();
}