UNPKG

13.1 kBJavaScriptView Raw
1"use strict";
2Object.defineProperty(exports, "__esModule", { value: true });
3var tslib_1 = require("tslib");
4var OrmUtils_1 = require("../util/OrmUtils");
5var OracleDriver_1 = require("../driver/oracle/OracleDriver");
6/**
7 * Updates entity with returning results in the entity insert and update operations.
8 */
9var ReturningResultsEntityUpdator = /** @class */ (function () {
10 // -------------------------------------------------------------------------
11 // Constructor
12 // -------------------------------------------------------------------------
13 function ReturningResultsEntityUpdator(queryRunner, expressionMap) {
14 this.queryRunner = queryRunner;
15 this.expressionMap = expressionMap;
16 }
17 // -------------------------------------------------------------------------
18 // Public Methods
19 // -------------------------------------------------------------------------
20 /**
21 * Updates entities with a special columns after updation query execution.
22 */
23 ReturningResultsEntityUpdator.prototype.update = function (updateResult, entities) {
24 return tslib_1.__awaiter(this, void 0, void 0, function () {
25 var metadata;
26 var _this = this;
27 return tslib_1.__generator(this, function (_a) {
28 switch (_a.label) {
29 case 0:
30 metadata = this.expressionMap.mainAlias.metadata;
31 return [4 /*yield*/, Promise.all(entities.map(function (entity, entityIndex) { return tslib_1.__awaiter(_this, void 0, void 0, function () {
32 var result, returningColumns, updationColumns, entityId, loadedReturningColumns;
33 var _this = this;
34 return tslib_1.__generator(this, function (_a) {
35 switch (_a.label) {
36 case 0:
37 if (!this.queryRunner.connection.driver.isReturningSqlSupported()) return [3 /*break*/, 1];
38 if (this.queryRunner.connection.driver instanceof OracleDriver_1.OracleDriver && updateResult.raw instanceof Array && this.expressionMap.extraReturningColumns.length > 0) {
39 updateResult.raw = updateResult.raw.reduce(function (newRaw, rawItem, rawItemIndex) {
40 newRaw[_this.expressionMap.extraReturningColumns[rawItemIndex].databaseName] = rawItem[0];
41 return newRaw;
42 }, {});
43 }
44 result = updateResult.raw instanceof Array ? updateResult.raw[entityIndex] : updateResult.raw;
45 returningColumns = this.queryRunner.connection.driver.createGeneratedMap(metadata, result);
46 if (returningColumns) {
47 this.queryRunner.manager.merge(metadata.target, entity, returningColumns);
48 updateResult.generatedMaps.push(returningColumns);
49 }
50 return [3 /*break*/, 3];
51 case 1:
52 updationColumns = this.getUpdationReturningColumns();
53 if (!(updationColumns.length > 0)) return [3 /*break*/, 3];
54 entityId = this.expressionMap.mainAlias.metadata.getEntityIdMap(entity);
55 if (!entityId)
56 throw new Error("Cannot update entity because entity id is not set in the entity.");
57 return [4 /*yield*/, this.queryRunner.manager
58 .createQueryBuilder()
59 .select(metadata.primaryColumns.map(function (column) { return metadata.targetName + "." + column.propertyPath; }))
60 .addSelect(this.getUpdationReturningColumns().map(function (column) { return metadata.targetName + "." + column.propertyPath; }))
61 .from(metadata.target, metadata.targetName)
62 .where(entityId)
63 .setOption("create-pojo") // use POJO because created object can contain default values, e.g. property = null and those properties maight be overridden by merge process
64 .getOne()];
65 case 2:
66 loadedReturningColumns = _a.sent();
67 if (loadedReturningColumns) {
68 this.queryRunner.manager.merge(metadata.target, entity, loadedReturningColumns);
69 updateResult.generatedMaps.push(loadedReturningColumns);
70 }
71 _a.label = 3;
72 case 3: return [2 /*return*/];
73 }
74 });
75 }); }))];
76 case 1:
77 _a.sent();
78 return [2 /*return*/];
79 }
80 });
81 });
82 };
83 /**
84 * Updates entities with a special columns after insertion query execution.
85 */
86 ReturningResultsEntityUpdator.prototype.insert = function (insertResult, entities) {
87 return tslib_1.__awaiter(this, void 0, void 0, function () {
88 var metadata, insertionColumns, generatedMaps;
89 var _this = this;
90 return tslib_1.__generator(this, function (_a) {
91 switch (_a.label) {
92 case 0:
93 metadata = this.expressionMap.mainAlias.metadata;
94 insertionColumns = this.getInsertionReturningColumns();
95 generatedMaps = entities.map(function (entity, entityIndex) {
96 if (_this.queryRunner.connection.driver instanceof OracleDriver_1.OracleDriver && insertResult.raw instanceof Array && _this.expressionMap.extraReturningColumns.length > 0) {
97 insertResult.raw = insertResult.raw.reduce(function (newRaw, rawItem, rawItemIndex) {
98 newRaw[_this.expressionMap.extraReturningColumns[rawItemIndex].databaseName] = rawItem[0];
99 return newRaw;
100 }, {});
101 }
102 // get all values generated by a database for us
103 var result = insertResult.raw instanceof Array ? insertResult.raw[entityIndex] : insertResult.raw;
104 var generatedMap = _this.queryRunner.connection.driver.createGeneratedMap(metadata, result) || {};
105 // if database does not support uuid generation we need to get uuid values
106 // generated by orm and set them to the generatedMap
107 if (_this.queryRunner.connection.driver.isUUIDGenerationSupported() === false) {
108 metadata.generatedColumns.forEach(function (generatedColumn) {
109 if (generatedColumn.generationStrategy === "uuid") {
110 // uuid can be defined by user in a model, that's why first we get it
111 var uuid = generatedColumn.getEntityValue(entity);
112 if (!uuid) // if it was not defined by a user then InsertQueryBuilder generates it by its own, get this generated uuid value
113 uuid = _this.expressionMap.nativeParameters["uuid_" + generatedColumn.databaseName + entityIndex];
114 OrmUtils_1.OrmUtils.mergeDeep(generatedMap, generatedColumn.createValueMap(uuid));
115 }
116 });
117 }
118 _this.queryRunner.manager.merge(metadata.target, entity, generatedMap); // todo: this should not be here, but problem with below line
119 return generatedMap;
120 });
121 if (!(this.queryRunner.connection.driver.isReturningSqlSupported() === false && insertionColumns.length > 0)) return [3 /*break*/, 2];
122 return [4 /*yield*/, Promise.all(entities.map(function (entity, entityIndex) { return tslib_1.__awaiter(_this, void 0, void 0, function () {
123 var entityId, returningResult;
124 return tslib_1.__generator(this, function (_a) {
125 switch (_a.label) {
126 case 0:
127 entityId = metadata.getEntityIdMap(entity);
128 return [4 /*yield*/, this.queryRunner.manager
129 .createQueryBuilder()
130 .select(metadata.primaryColumns.map(function (column) { return metadata.targetName + "." + column.propertyPath; }))
131 .addSelect(insertionColumns.map(function (column) { return metadata.targetName + "." + column.propertyPath; }))
132 .from(metadata.target, metadata.targetName)
133 .where(entityId)
134 .setOption("create-pojo") // use POJO because created object can contain default values, e.g. property = null and those properties maight be overridden by merge process
135 .getOne()];
136 case 1:
137 returningResult = _a.sent();
138 this.queryRunner.manager.merge(metadata.target, generatedMaps[entityIndex], returningResult);
139 return [2 /*return*/];
140 }
141 });
142 }); }))];
143 case 1:
144 _a.sent();
145 _a.label = 2;
146 case 2:
147 entities.forEach(function (entity, entityIndex) {
148 var entityId = metadata.getEntityIdMap(entity);
149 insertResult.identifiers.push(entityId);
150 insertResult.generatedMaps.push(generatedMaps[entityIndex]);
151 _this.queryRunner.manager.merge(_this.expressionMap.mainAlias.metadata.target, entity, generatedMaps[entityIndex], generatedMaps[entityIndex]); // todo: why twice?!
152 });
153 return [2 /*return*/];
154 }
155 });
156 });
157 };
158 /**
159 * Columns we need to be returned from the database when we insert entity.
160 */
161 ReturningResultsEntityUpdator.prototype.getInsertionReturningColumns = function () {
162 // for databases which support returning statement we need to return extra columns like id
163 // for other databases we don't need to return id column since its returned by a driver already
164 var needToCheckGenerated = this.queryRunner.connection.driver.isReturningSqlSupported();
165 // filter out the columns of which we need database inserted values to update our entity
166 return this.expressionMap.mainAlias.metadata.columns.filter(function (column) {
167 return column.default !== undefined ||
168 (needToCheckGenerated && column.isGenerated) ||
169 column.isCreateDate ||
170 column.isUpdateDate ||
171 column.isVersion;
172 });
173 };
174 /**
175 * Columns we need to be returned from the database when we update entity.
176 */
177 ReturningResultsEntityUpdator.prototype.getUpdationReturningColumns = function () {
178 return this.expressionMap.mainAlias.metadata.columns.filter(function (column) {
179 return column.isUpdateDate || column.isVersion;
180 });
181 };
182 return ReturningResultsEntityUpdator;
183}());
184exports.ReturningResultsEntityUpdator = ReturningResultsEntityUpdator;
185
186//# sourceMappingURL=ReturningResultsEntityUpdator.js.map