UNPKG

12.4 kBJavaScriptView Raw
1"use strict";
2Object.defineProperty(exports, "__esModule", { value: true });
3var tslib_1 = require("tslib");
4var CockroachDriver_1 = require("../driver/cockroachdb/CockroachDriver");
5var OracleDriver_1 = require("../driver/oracle/OracleDriver");
6var QueryBuilder_1 = require("./QueryBuilder");
7var SqlServerDriver_1 = require("../driver/sqlserver/SqlServerDriver");
8var PostgresDriver_1 = require("../driver/postgres/PostgresDriver");
9var DeleteResult_1 = require("./result/DeleteResult");
10var ReturningStatementNotSupportedError_1 = require("../error/ReturningStatementNotSupportedError");
11var SqljsDriver_1 = require("../driver/sqljs/SqljsDriver");
12var MysqlDriver_1 = require("../driver/mysql/MysqlDriver");
13var BroadcasterResult_1 = require("../subscriber/BroadcasterResult");
14var index_1 = require("../index");
15/**
16 * Allows to build complex sql queries in a fashion way and execute those queries.
17 */
18var DeleteQueryBuilder = /** @class */ (function (_super) {
19 tslib_1.__extends(DeleteQueryBuilder, _super);
20 // -------------------------------------------------------------------------
21 // Constructor
22 // -------------------------------------------------------------------------
23 function DeleteQueryBuilder(connectionOrQueryBuilder, queryRunner) {
24 var _this = _super.call(this, connectionOrQueryBuilder, queryRunner) || this;
25 _this.expressionMap.aliasNamePrefixingEnabled = false;
26 return _this;
27 }
28 // -------------------------------------------------------------------------
29 // Public Implemented Methods
30 // -------------------------------------------------------------------------
31 /**
32 * Gets generated sql query without parameters being replaced.
33 */
34 DeleteQueryBuilder.prototype.getQuery = function () {
35 var sql = this.createDeleteExpression();
36 return sql.trim();
37 };
38 /**
39 * Executes sql generated by query builder and returns raw database results.
40 */
41 DeleteQueryBuilder.prototype.execute = function () {
42 return tslib_1.__awaiter(this, void 0, void 0, function () {
43 var _a, sql, parameters, queryRunner, transactionStartedByUs, broadcastResult, deleteResult, result, driver, broadcastResult, error_1, rollbackError_1;
44 return tslib_1.__generator(this, function (_b) {
45 switch (_b.label) {
46 case 0:
47 _a = tslib_1.__read(this.getQueryAndParameters(), 2), sql = _a[0], parameters = _a[1];
48 queryRunner = this.obtainQueryRunner();
49 transactionStartedByUs = false;
50 _b.label = 1;
51 case 1:
52 _b.trys.push([1, 11, 16, 21]);
53 if (!(this.expressionMap.useTransaction === true && queryRunner.isTransactionActive === false)) return [3 /*break*/, 3];
54 return [4 /*yield*/, queryRunner.startTransaction()];
55 case 2:
56 _b.sent();
57 transactionStartedByUs = true;
58 _b.label = 3;
59 case 3:
60 if (!(this.expressionMap.callListeners === true && this.expressionMap.mainAlias.hasMetadata)) return [3 /*break*/, 5];
61 broadcastResult = new BroadcasterResult_1.BroadcasterResult();
62 queryRunner.broadcaster.broadcastBeforeRemoveEvent(broadcastResult, this.expressionMap.mainAlias.metadata);
63 if (!(broadcastResult.promises.length > 0)) return [3 /*break*/, 5];
64 return [4 /*yield*/, Promise.all(broadcastResult.promises)];
65 case 4:
66 _b.sent();
67 _b.label = 5;
68 case 5:
69 deleteResult = new DeleteResult_1.DeleteResult();
70 return [4 /*yield*/, queryRunner.query(sql, parameters)];
71 case 6:
72 result = _b.sent();
73 driver = queryRunner.connection.driver;
74 if (driver instanceof MysqlDriver_1.MysqlDriver) {
75 deleteResult.raw = result;
76 deleteResult.affected = result.affectedRows;
77 }
78 else if (driver instanceof SqlServerDriver_1.SqlServerDriver || driver instanceof PostgresDriver_1.PostgresDriver || driver instanceof CockroachDriver_1.CockroachDriver) {
79 deleteResult.raw = result[0] ? result[0] : null;
80 // don't return 0 because it could confuse. null means that we did not receive this value
81 deleteResult.affected = typeof result[1] === "number" ? result[1] : null;
82 }
83 else if (driver instanceof OracleDriver_1.OracleDriver) {
84 deleteResult.affected = result;
85 }
86 else {
87 deleteResult.raw = result;
88 }
89 if (!(this.expressionMap.callListeners === true && this.expressionMap.mainAlias.hasMetadata)) return [3 /*break*/, 8];
90 broadcastResult = new BroadcasterResult_1.BroadcasterResult();
91 queryRunner.broadcaster.broadcastAfterRemoveEvent(broadcastResult, this.expressionMap.mainAlias.metadata);
92 if (!(broadcastResult.promises.length > 0)) return [3 /*break*/, 8];
93 return [4 /*yield*/, Promise.all(broadcastResult.promises)];
94 case 7:
95 _b.sent();
96 _b.label = 8;
97 case 8:
98 if (!transactionStartedByUs) return [3 /*break*/, 10];
99 return [4 /*yield*/, queryRunner.commitTransaction()];
100 case 9:
101 _b.sent();
102 _b.label = 10;
103 case 10: return [2 /*return*/, deleteResult];
104 case 11:
105 error_1 = _b.sent();
106 if (!transactionStartedByUs) return [3 /*break*/, 15];
107 _b.label = 12;
108 case 12:
109 _b.trys.push([12, 14, , 15]);
110 return [4 /*yield*/, queryRunner.rollbackTransaction()];
111 case 13:
112 _b.sent();
113 return [3 /*break*/, 15];
114 case 14:
115 rollbackError_1 = _b.sent();
116 return [3 /*break*/, 15];
117 case 15: throw error_1;
118 case 16:
119 if (!(queryRunner !== this.queryRunner)) return [3 /*break*/, 18];
120 return [4 /*yield*/, queryRunner.release()];
121 case 17:
122 _b.sent();
123 _b.label = 18;
124 case 18:
125 if (!(this.connection.driver instanceof SqljsDriver_1.SqljsDriver && !queryRunner.isTransactionActive)) return [3 /*break*/, 20];
126 return [4 /*yield*/, this.connection.driver.autoSave()];
127 case 19:
128 _b.sent();
129 _b.label = 20;
130 case 20: return [7 /*endfinally*/];
131 case 21: return [2 /*return*/];
132 }
133 });
134 });
135 };
136 // -------------------------------------------------------------------------
137 // Public Methods
138 // -------------------------------------------------------------------------
139 /**
140 * Specifies FROM which entity's table select/update/delete will be executed.
141 * Also sets a main string alias of the selection data.
142 */
143 DeleteQueryBuilder.prototype.from = function (entityTarget, aliasName) {
144 entityTarget = entityTarget instanceof index_1.EntitySchema ? entityTarget.options.name : entityTarget;
145 var mainAlias = this.createFromAlias(entityTarget, aliasName);
146 this.expressionMap.setMainAlias(mainAlias);
147 return this;
148 };
149 /**
150 * Sets WHERE condition in the query builder.
151 * If you had previously WHERE expression defined,
152 * calling this function will override previously set WHERE conditions.
153 * Additionally you can add parameters used in where expression.
154 */
155 DeleteQueryBuilder.prototype.where = function (where, parameters) {
156 this.expressionMap.wheres = []; // don't move this block below since computeWhereParameter can add where expressions
157 var condition = this.computeWhereParameter(where);
158 if (condition)
159 this.expressionMap.wheres = [{ type: "simple", condition: condition }];
160 if (parameters)
161 this.setParameters(parameters);
162 return this;
163 };
164 /**
165 * Adds new AND WHERE condition in the query builder.
166 * Additionally you can add parameters used in where expression.
167 */
168 DeleteQueryBuilder.prototype.andWhere = function (where, parameters) {
169 this.expressionMap.wheres.push({ type: "and", condition: this.computeWhereParameter(where) });
170 if (parameters)
171 this.setParameters(parameters);
172 return this;
173 };
174 /**
175 * Adds new OR WHERE condition in the query builder.
176 * Additionally you can add parameters used in where expression.
177 */
178 DeleteQueryBuilder.prototype.orWhere = function (where, parameters) {
179 this.expressionMap.wheres.push({ type: "or", condition: this.computeWhereParameter(where) });
180 if (parameters)
181 this.setParameters(parameters);
182 return this;
183 };
184 /**
185 * Adds new AND WHERE with conditions for the given ids.
186 */
187 DeleteQueryBuilder.prototype.whereInIds = function (ids) {
188 return this.where(this.createWhereIdsExpression(ids));
189 };
190 /**
191 * Adds new AND WHERE with conditions for the given ids.
192 */
193 DeleteQueryBuilder.prototype.andWhereInIds = function (ids) {
194 return this.andWhere(this.createWhereIdsExpression(ids));
195 };
196 /**
197 * Adds new OR WHERE with conditions for the given ids.
198 */
199 DeleteQueryBuilder.prototype.orWhereInIds = function (ids) {
200 return this.orWhere(this.createWhereIdsExpression(ids));
201 };
202 /**
203 * Optional returning/output clause.
204 */
205 DeleteQueryBuilder.prototype.output = function (output) {
206 return this.returning(output);
207 };
208 /**
209 * Optional returning/output clause.
210 */
211 DeleteQueryBuilder.prototype.returning = function (returning) {
212 // not all databases support returning/output cause
213 if (!this.connection.driver.isReturningSqlSupported())
214 throw new ReturningStatementNotSupportedError_1.ReturningStatementNotSupportedError();
215 this.expressionMap.returning = returning;
216 return this;
217 };
218 // -------------------------------------------------------------------------
219 // Protected Methods
220 // -------------------------------------------------------------------------
221 /**
222 * Creates DELETE express used to perform query.
223 */
224 DeleteQueryBuilder.prototype.createDeleteExpression = function () {
225 var tableName = this.getTableName(this.getMainTableName());
226 var whereExpression = this.createWhereExpression();
227 var returningExpression = this.createReturningExpression();
228 if (returningExpression && (this.connection.driver instanceof PostgresDriver_1.PostgresDriver || this.connection.driver instanceof CockroachDriver_1.CockroachDriver)) {
229 return "DELETE FROM " + tableName + whereExpression + " RETURNING " + returningExpression;
230 }
231 else if (returningExpression !== "" && this.connection.driver instanceof SqlServerDriver_1.SqlServerDriver) {
232 return "DELETE FROM " + tableName + " OUTPUT " + returningExpression + whereExpression;
233 }
234 else {
235 return "DELETE FROM " + tableName + whereExpression;
236 }
237 };
238 return DeleteQueryBuilder;
239}(QueryBuilder_1.QueryBuilder));
240exports.DeleteQueryBuilder = DeleteQueryBuilder;
241
242//# sourceMappingURL=DeleteQueryBuilder.js.map