typeorm
Version:
Data-Mapper ORM for TypeScript and ES2021+. Supports MySQL/MariaDB, PostgreSQL, MS SQL Server, Oracle, SAP HANA, SQLite, MongoDB databases.
201 lines (199 loc) • 8.12 kB
JavaScript
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
exports.DeleteQueryBuilder = void 0;
const QueryBuilder_1 = require("./QueryBuilder");
const DeleteResult_1 = require("./result/DeleteResult");
const ReturningStatementNotSupportedError_1 = require("../error/ReturningStatementNotSupportedError");
const InstanceChecker_1 = require("../util/InstanceChecker");
/**
* Allows to build complex sql queries in a fashion way and execute those queries.
*/
class DeleteQueryBuilder extends QueryBuilder_1.QueryBuilder {
// -------------------------------------------------------------------------
// Constructor
// -------------------------------------------------------------------------
constructor(connectionOrQueryBuilder, queryRunner) {
super(connectionOrQueryBuilder, queryRunner);
this["@instanceof"] = Symbol.for("DeleteQueryBuilder");
this.expressionMap.aliasNamePrefixingEnabled = false;
}
// -------------------------------------------------------------------------
// Public Implemented Methods
// -------------------------------------------------------------------------
/**
* Gets generated SQL query without parameters being replaced.
*/
getQuery() {
let sql = this.createComment();
sql += this.createCteExpression();
sql += this.createDeleteExpression();
return this.replacePropertyNamesForTheWholeQuery(sql.trim());
}
/**
* Executes sql generated by query builder and returns raw database results.
*/
async execute() {
const [sql, parameters] = this.getQueryAndParameters();
const queryRunner = this.obtainQueryRunner();
let transactionStartedByUs = false;
try {
// start transaction if it was enabled
if (this.expressionMap.useTransaction === true &&
queryRunner.isTransactionActive === false) {
await queryRunner.startTransaction();
transactionStartedByUs = true;
}
// call before deletion methods in listeners and subscribers
if (this.expressionMap.callListeners === true &&
this.expressionMap.mainAlias.hasMetadata) {
await queryRunner.broadcaster.broadcast("BeforeRemove", this.expressionMap.mainAlias.metadata);
}
// execute query
const queryResult = await queryRunner.query(sql, parameters, true);
const deleteResult = DeleteResult_1.DeleteResult.from(queryResult);
// call after deletion methods in listeners and subscribers
if (this.expressionMap.callListeners === true &&
this.expressionMap.mainAlias.hasMetadata) {
await queryRunner.broadcaster.broadcast("AfterRemove", this.expressionMap.mainAlias.metadata);
}
// close transaction if we started it
if (transactionStartedByUs)
await queryRunner.commitTransaction();
return deleteResult;
}
catch (error) {
// rollback transaction if we started it
if (transactionStartedByUs) {
try {
await queryRunner.rollbackTransaction();
}
catch (rollbackError) { }
}
throw error;
}
finally {
if (queryRunner !== this.queryRunner) {
// means we created our own query runner
await queryRunner.release();
}
}
}
// -------------------------------------------------------------------------
// Public Methods
// -------------------------------------------------------------------------
/**
* Specifies FROM which entity's table select/update/delete will be executed.
* Also sets a main string alias of the selection data.
*/
from(entityTarget, aliasName) {
entityTarget = InstanceChecker_1.InstanceChecker.isEntitySchema(entityTarget)
? entityTarget.options.name
: entityTarget;
const mainAlias = this.createFromAlias(entityTarget, aliasName);
this.expressionMap.setMainAlias(mainAlias);
return this;
}
/**
* Sets WHERE condition in the query builder.
* If you had previously WHERE expression defined,
* calling this function will override previously set WHERE conditions.
* Additionally you can add parameters used in where expression.
*/
where(where, parameters) {
this.expressionMap.wheres = []; // don't move this block below since computeWhereParameter can add where expressions
const condition = this.getWhereCondition(where);
if (condition)
this.expressionMap.wheres = [
{ type: "simple", condition: condition },
];
if (parameters)
this.setParameters(parameters);
return this;
}
/**
* Adds new AND WHERE condition in the query builder.
* Additionally you can add parameters used in where expression.
*/
andWhere(where, parameters) {
this.expressionMap.wheres.push({
type: "and",
condition: this.getWhereCondition(where),
});
if (parameters)
this.setParameters(parameters);
return this;
}
/**
* Adds new OR WHERE condition in the query builder.
* Additionally you can add parameters used in where expression.
*/
orWhere(where, parameters) {
this.expressionMap.wheres.push({
type: "or",
condition: this.getWhereCondition(where),
});
if (parameters)
this.setParameters(parameters);
return this;
}
/**
* Sets WHERE condition in the query builder with a condition for the given ids.
* If you had previously WHERE expression defined,
* calling this function will override previously set WHERE conditions.
*/
whereInIds(ids) {
return this.where(this.getWhereInIdsCondition(ids));
}
/**
* Adds new AND WHERE with conditions for the given ids.
*/
andWhereInIds(ids) {
return this.andWhere(this.getWhereInIdsCondition(ids));
}
/**
* Adds new OR WHERE with conditions for the given ids.
*/
orWhereInIds(ids) {
return this.orWhere(this.getWhereInIdsCondition(ids));
}
/**
* Optional returning/output clause.
*/
output(output) {
return this.returning(output);
}
/**
* Optional returning/output clause.
*/
returning(returning) {
// not all databases support returning/output cause
if (!this.connection.driver.isReturningSqlSupported("delete")) {
throw new ReturningStatementNotSupportedError_1.ReturningStatementNotSupportedError();
}
this.expressionMap.returning = returning;
return this;
}
// -------------------------------------------------------------------------
// Protected Methods
// -------------------------------------------------------------------------
/**
* Creates DELETE express used to perform query.
*/
createDeleteExpression() {
const tableName = this.getTableName(this.getMainTableName());
const whereExpression = this.createWhereExpression();
const returningExpression = this.createReturningExpression("delete");
if (returningExpression === "") {
return `DELETE FROM ${tableName}${whereExpression}`;
}
if (this.connection.driver.options.type === "mssql") {
return `DELETE FROM ${tableName} OUTPUT ${returningExpression}${whereExpression}`;
}
if (this.connection.driver.options.type === "spanner") {
return `DELETE FROM ${tableName}${whereExpression} THEN RETURN ${returningExpression}`;
}
return `DELETE FROM ${tableName}${whereExpression} RETURNING ${returningExpression}`;
}
}
exports.DeleteQueryBuilder = DeleteQueryBuilder;
//# sourceMappingURL=DeleteQueryBuilder.js.map