typeorm 0.3.6-dev.9d331b1 → 0.3.6
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +33 -13
- package/browser/cache/DbQueryResultCache.js +9 -1
- package/browser/cache/DbQueryResultCache.js.map +1 -1
- package/browser/cli-ts-node-commonjs.js +0 -0
- package/browser/cli-ts-node-esm.js +0 -0
- package/browser/data-source/DataSourceOptions.d.ts +2 -1
- package/browser/data-source/DataSourceOptions.js.map +1 -1
- package/browser/decorator/Index.js +1 -0
- package/browser/decorator/Index.js.map +1 -1
- package/browser/decorator/columns/PrimaryColumn.js +4 -1
- package/browser/decorator/columns/PrimaryColumn.js.map +1 -1
- package/browser/decorator/options/IndexOptions.d.ts +8 -0
- package/browser/decorator/options/IndexOptions.js.map +1 -1
- package/browser/driver/DriverFactory.js +4 -0
- package/browser/driver/DriverFactory.js.map +1 -1
- package/browser/driver/spanner/SpannerConnectionCredentialsOptions.d.ts +17 -0
- package/browser/driver/spanner/SpannerConnectionCredentialsOptions.js +3 -0
- package/browser/driver/spanner/SpannerConnectionCredentialsOptions.js.map +1 -0
- package/browser/driver/spanner/SpannerConnectionOptions.d.ts +120 -0
- package/browser/driver/spanner/SpannerConnectionOptions.js +3 -0
- package/browser/driver/spanner/SpannerConnectionOptions.js.map +1 -0
- package/browser/driver/spanner/SpannerDriver.d.ts +240 -0
- package/browser/driver/spanner/SpannerDriver.js +565 -0
- package/browser/driver/spanner/SpannerDriver.js.map +1 -0
- package/browser/driver/spanner/SpannerQueryRunner.d.ts +350 -0
- package/browser/driver/spanner/SpannerQueryRunner.js +1359 -0
- package/browser/driver/spanner/SpannerQueryRunner.js.map +1 -0
- package/browser/driver/types/ColumnTypes.d.ts +1 -1
- package/browser/driver/types/ColumnTypes.js.map +1 -1
- package/browser/driver/types/DatabaseType.d.ts +1 -1
- package/browser/driver/types/DatabaseType.js.map +1 -1
- package/browser/entity-schema/EntitySchemaIndexOptions.d.ts +8 -0
- package/browser/entity-schema/EntitySchemaIndexOptions.js.map +1 -1
- package/browser/entity-schema/EntitySchemaTransformer.js +1 -0
- package/browser/entity-schema/EntitySchemaTransformer.js.map +1 -1
- package/browser/find-options/FindOneOptions.d.ts +1 -1
- package/browser/find-options/FindOneOptions.js.map +1 -1
- package/browser/find-options/FindOptionsUtils.d.ts +2 -1
- package/browser/find-options/FindOptionsUtils.js +2 -1
- package/browser/find-options/FindOptionsUtils.js.map +1 -1
- package/browser/logger/AdvancedConsoleLogger.d.ts +1 -1
- package/browser/logger/AdvancedConsoleLogger.js +1 -1
- package/browser/logger/AdvancedConsoleLogger.js.map +1 -1
- package/browser/metadata/IndexMetadata.d.ts +8 -0
- package/browser/metadata/IndexMetadata.js +9 -0
- package/browser/metadata/IndexMetadata.js.map +1 -1
- package/browser/metadata-args/IndexMetadataArgs.d.ts +8 -0
- package/browser/metadata-args/IndexMetadataArgs.js.map +1 -1
- package/browser/metadata-builder/EntityMetadataBuilder.js +13 -6
- package/browser/metadata-builder/EntityMetadataBuilder.js.map +1 -1
- package/browser/metadata-builder/JunctionEntityMetadataBuilder.js +13 -6
- package/browser/metadata-builder/JunctionEntityMetadataBuilder.js.map +1 -1
- package/browser/platform/PlatformTools.js +5 -0
- package/browser/platform/PlatformTools.js.map +1 -1
- package/browser/query-builder/InsertQueryBuilder.js +15 -3
- package/browser/query-builder/InsertQueryBuilder.js.map +1 -1
- package/browser/query-builder/QueryExpressionMap.d.ts +1 -1
- package/browser/query-builder/QueryExpressionMap.js.map +1 -1
- package/browser/query-builder/SelectQueryBuilder.d.ts +1 -1
- package/browser/query-builder/SelectQueryBuilder.js +25 -4
- package/browser/query-builder/SelectQueryBuilder.js.map +1 -1
- package/browser/query-builder/UpdateQueryBuilder.js +18 -7
- package/browser/query-builder/UpdateQueryBuilder.js.map +1 -1
- package/browser/schema-builder/RdbmsSchemaBuilder.js +15 -1
- package/browser/schema-builder/RdbmsSchemaBuilder.js.map +1 -1
- package/browser/schema-builder/options/TableIndexOptions.d.ts +8 -0
- package/browser/schema-builder/options/TableIndexOptions.js.map +1 -1
- package/browser/schema-builder/table/TableIndex.d.ts +8 -0
- package/browser/schema-builder/table/TableIndex.js +3 -0
- package/browser/schema-builder/table/TableIndex.js.map +1 -1
- package/cache/DbQueryResultCache.js +9 -1
- package/cache/DbQueryResultCache.js.map +1 -1
- package/cli-ts-node-commonjs.js +0 -0
- package/cli-ts-node-esm.js +0 -0
- package/cli.js +0 -0
- package/data-source/DataSourceOptions.d.ts +2 -1
- package/data-source/DataSourceOptions.js.map +1 -1
- package/decorator/Index.js +1 -0
- package/decorator/Index.js.map +1 -1
- package/decorator/columns/PrimaryColumn.js +4 -1
- package/decorator/columns/PrimaryColumn.js.map +1 -1
- package/decorator/options/IndexOptions.d.ts +8 -0
- package/decorator/options/IndexOptions.js.map +1 -1
- package/driver/DriverFactory.js +4 -0
- package/driver/DriverFactory.js.map +1 -1
- package/driver/spanner/SpannerConnectionCredentialsOptions.d.ts +17 -0
- package/driver/spanner/SpannerConnectionCredentialsOptions.js +4 -0
- package/driver/spanner/SpannerConnectionCredentialsOptions.js.map +1 -0
- package/driver/spanner/SpannerConnectionOptions.d.ts +120 -0
- package/driver/spanner/SpannerConnectionOptions.js +4 -0
- package/driver/spanner/SpannerConnectionOptions.js.map +1 -0
- package/driver/spanner/SpannerDriver.d.ts +240 -0
- package/driver/spanner/SpannerDriver.js +569 -0
- package/driver/spanner/SpannerDriver.js.map +1 -0
- package/driver/spanner/SpannerQueryRunner.d.ts +350 -0
- package/driver/spanner/SpannerQueryRunner.js +1363 -0
- package/driver/spanner/SpannerQueryRunner.js.map +1 -0
- package/driver/types/ColumnTypes.d.ts +1 -1
- package/driver/types/ColumnTypes.js.map +1 -1
- package/driver/types/DatabaseType.d.ts +1 -1
- package/driver/types/DatabaseType.js.map +1 -1
- package/entity-schema/EntitySchemaIndexOptions.d.ts +8 -0
- package/entity-schema/EntitySchemaIndexOptions.js.map +1 -1
- package/entity-schema/EntitySchemaTransformer.js +1 -0
- package/entity-schema/EntitySchemaTransformer.js.map +1 -1
- package/find-options/FindOneOptions.d.ts +1 -1
- package/find-options/FindOneOptions.js.map +1 -1
- package/find-options/FindOptionsUtils.d.ts +2 -1
- package/find-options/FindOptionsUtils.js +2 -1
- package/find-options/FindOptionsUtils.js.map +1 -1
- package/logger/AdvancedConsoleLogger.d.ts +1 -1
- package/logger/AdvancedConsoleLogger.js +1 -1
- package/logger/AdvancedConsoleLogger.js.map +1 -1
- package/metadata/IndexMetadata.d.ts +8 -0
- package/metadata/IndexMetadata.js +9 -0
- package/metadata/IndexMetadata.js.map +1 -1
- package/metadata-args/IndexMetadataArgs.d.ts +8 -0
- package/metadata-args/IndexMetadataArgs.js.map +1 -1
- package/metadata-builder/EntityMetadataBuilder.js +13 -6
- package/metadata-builder/EntityMetadataBuilder.js.map +1 -1
- package/metadata-builder/JunctionEntityMetadataBuilder.js +13 -6
- package/metadata-builder/JunctionEntityMetadataBuilder.js.map +1 -1
- package/package.json +268 -1
- package/platform/PlatformTools.js +5 -0
- package/platform/PlatformTools.js.map +1 -1
- package/query-builder/InsertQueryBuilder.js +15 -3
- package/query-builder/InsertQueryBuilder.js.map +1 -1
- package/query-builder/QueryExpressionMap.d.ts +1 -1
- package/query-builder/QueryExpressionMap.js.map +1 -1
- package/query-builder/SelectQueryBuilder.d.ts +1 -1
- package/query-builder/SelectQueryBuilder.js +25 -4
- package/query-builder/SelectQueryBuilder.js.map +1 -1
- package/query-builder/UpdateQueryBuilder.js +18 -7
- package/query-builder/UpdateQueryBuilder.js.map +1 -1
- package/schema-builder/RdbmsSchemaBuilder.js +15 -1
- package/schema-builder/RdbmsSchemaBuilder.js.map +1 -1
- package/schema-builder/options/TableIndexOptions.d.ts +8 -0
- package/schema-builder/options/TableIndexOptions.js.map +1 -1
- package/schema-builder/table/TableIndex.d.ts +8 -0
- package/schema-builder/table/TableIndex.js +3 -0
- package/schema-builder/table/TableIndex.js.map +1 -1
|
@@ -286,11 +286,18 @@ export class UpdateQueryBuilder extends QueryBuilder {
|
|
|
286
286
|
const metadata = this.expressionMap.mainAlias.hasMetadata
|
|
287
287
|
? this.expressionMap.mainAlias.metadata
|
|
288
288
|
: undefined;
|
|
289
|
+
// it doesn't make sense to update undefined properties, so just skip them
|
|
290
|
+
const valuesSetNormalized = {};
|
|
291
|
+
for (let key in valuesSet) {
|
|
292
|
+
if (valuesSet[key] !== undefined) {
|
|
293
|
+
valuesSetNormalized[key] = valuesSet[key];
|
|
294
|
+
}
|
|
295
|
+
}
|
|
289
296
|
// prepare columns and values to be updated
|
|
290
297
|
const updateColumnAndValues = [];
|
|
291
298
|
const updatedColumns = [];
|
|
292
299
|
if (metadata) {
|
|
293
|
-
this.createPropertyPath(metadata,
|
|
300
|
+
this.createPropertyPath(metadata, valuesSetNormalized).forEach((propertyPath) => {
|
|
294
301
|
// todo: make this and other query builder to work with properly with tables without metadata
|
|
295
302
|
const columns = metadata.findColumnsWithPropertyPath(propertyPath);
|
|
296
303
|
if (columns.length <= 0) {
|
|
@@ -303,9 +310,10 @@ export class UpdateQueryBuilder extends QueryBuilder {
|
|
|
303
310
|
}
|
|
304
311
|
updatedColumns.push(column);
|
|
305
312
|
//
|
|
306
|
-
let value = column.getEntityValue(
|
|
313
|
+
let value = column.getEntityValue(valuesSetNormalized);
|
|
307
314
|
if (column.referencedColumn &&
|
|
308
315
|
typeof value === "object" &&
|
|
316
|
+
value !== null &&
|
|
309
317
|
!Buffer.isBuffer(value)) {
|
|
310
318
|
value =
|
|
311
319
|
column.referencedColumn.getEntityValue(value);
|
|
@@ -321,7 +329,9 @@ export class UpdateQueryBuilder extends QueryBuilder {
|
|
|
321
329
|
" = " +
|
|
322
330
|
value());
|
|
323
331
|
}
|
|
324
|
-
else if (this.connection.driver.options.type === "sap"
|
|
332
|
+
else if ((this.connection.driver.options.type === "sap" ||
|
|
333
|
+
this.connection.driver.options.type ===
|
|
334
|
+
"spanner") &&
|
|
325
335
|
value === null) {
|
|
326
336
|
updateColumnAndValues.push(this.escape(column.databaseName) + " = NULL");
|
|
327
337
|
}
|
|
@@ -378,7 +388,7 @@ export class UpdateQueryBuilder extends QueryBuilder {
|
|
|
378
388
|
});
|
|
379
389
|
// Don't allow calling update only with columns that are `update: false`
|
|
380
390
|
if (updateColumnAndValues.length > 0 ||
|
|
381
|
-
Object.keys(
|
|
391
|
+
Object.keys(valuesSetNormalized).length === 0) {
|
|
382
392
|
if (metadata.versionColumn &&
|
|
383
393
|
updatedColumns.indexOf(metadata.versionColumn) === -1)
|
|
384
394
|
updateColumnAndValues.push(this.escape(metadata.versionColumn.databaseName) +
|
|
@@ -392,14 +402,15 @@ export class UpdateQueryBuilder extends QueryBuilder {
|
|
|
392
402
|
}
|
|
393
403
|
}
|
|
394
404
|
else {
|
|
395
|
-
Object.keys(
|
|
396
|
-
let value =
|
|
405
|
+
Object.keys(valuesSetNormalized).map((key) => {
|
|
406
|
+
let value = valuesSetNormalized[key];
|
|
397
407
|
// todo: duplication zone
|
|
398
408
|
if (typeof value === "function") {
|
|
399
409
|
// support for SQL expressions in update query
|
|
400
410
|
updateColumnAndValues.push(this.escape(key) + " = " + value());
|
|
401
411
|
}
|
|
402
|
-
else if (this.connection.driver.options.type === "sap"
|
|
412
|
+
else if ((this.connection.driver.options.type === "sap" ||
|
|
413
|
+
this.connection.driver.options.type === "spanner") &&
|
|
403
414
|
value === null) {
|
|
404
415
|
updateColumnAndValues.push(this.escape(key) + " = NULL");
|
|
405
416
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../browser/src/query-builder/UpdateQueryBuilder.ts"],"names":[],"mappings":"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","file":"UpdateQueryBuilder.js","sourcesContent":["import { ColumnMetadata } from \"../metadata/ColumnMetadata\"\nimport { QueryBuilder } from \"./QueryBuilder\"\nimport { ObjectLiteral } from \"../common/ObjectLiteral\"\nimport { DataSource } from \"../data-source/DataSource\"\nimport { QueryRunner } from \"../query-runner/QueryRunner\"\nimport { WhereExpressionBuilder } from \"./WhereExpressionBuilder\"\nimport { Brackets } from \"./Brackets\"\nimport { UpdateResult } from \"./result/UpdateResult\"\nimport { ReturningStatementNotSupportedError } from \"../error/ReturningStatementNotSupportedError\"\nimport { ReturningResultsEntityUpdator } from \"./ReturningResultsEntityUpdator\"\nimport { MysqlDriver } from \"../driver/mysql/MysqlDriver\"\nimport { OrderByCondition } from \"../find-options/OrderByCondition\"\nimport { LimitOnUpdateNotSupportedError } from \"../error/LimitOnUpdateNotSupportedError\"\nimport { UpdateValuesMissingError } from \"../error/UpdateValuesMissingError\"\nimport { QueryDeepPartialEntity } from \"./QueryPartialEntity\"\nimport { AuroraMysqlDriver } from \"../driver/aurora-mysql/AuroraMysqlDriver\"\nimport { TypeORMError } from \"../error\"\nimport { EntityPropertyNotFoundError } from \"../error/EntityPropertyNotFoundError\"\nimport { SqlServerDriver } from \"../driver/sqlserver/SqlServerDriver\"\nimport { DriverUtils } from \"../driver/DriverUtils\"\n\n/**\n * Allows to build complex sql queries in a fashion way and execute those queries.\n */\nexport class UpdateQueryBuilder<Entity>\n extends QueryBuilder<Entity>\n implements WhereExpressionBuilder\n{\n readonly \"@instanceof\" = Symbol.for(\"UpdateQueryBuilder\")\n\n // -------------------------------------------------------------------------\n // Constructor\n // -------------------------------------------------------------------------\n\n constructor(\n connectionOrQueryBuilder: DataSource | QueryBuilder<any>,\n queryRunner?: QueryRunner,\n ) {\n super(connectionOrQueryBuilder as any, queryRunner)\n this.expressionMap.aliasNamePrefixingEnabled = false\n }\n\n // -------------------------------------------------------------------------\n // Public Implemented Methods\n // -------------------------------------------------------------------------\n\n /**\n * Gets generated SQL query without parameters being replaced.\n */\n getQuery(): string {\n let sql = this.createComment()\n sql += this.createCteExpression()\n sql += this.createUpdateExpression()\n sql += this.createOrderByExpression()\n sql += this.createLimitExpression()\n return sql.trim()\n }\n\n /**\n * Executes sql generated by query builder and returns raw database results.\n */\n async execute(): Promise<UpdateResult> {\n const queryRunner = this.obtainQueryRunner()\n let transactionStartedByUs: boolean = false\n\n try {\n // start transaction if it was enabled\n if (\n this.expressionMap.useTransaction === true &&\n queryRunner.isTransactionActive === false\n ) {\n await queryRunner.startTransaction()\n transactionStartedByUs = true\n }\n\n // call before updation methods in listeners and subscribers\n if (\n this.expressionMap.callListeners === true &&\n this.expressionMap.mainAlias!.hasMetadata\n ) {\n await queryRunner.broadcaster.broadcast(\n \"BeforeUpdate\",\n this.expressionMap.mainAlias!.metadata,\n this.expressionMap.valuesSet,\n )\n }\n\n let declareSql: string | null = null\n let selectOutputSql: string | null = null\n\n // if update entity mode is enabled we may need extra columns for the returning statement\n const returningResultsEntityUpdator =\n new ReturningResultsEntityUpdator(\n queryRunner,\n this.expressionMap,\n )\n\n const returningColumns: ColumnMetadata[] = []\n\n if (\n Array.isArray(this.expressionMap.returning) &&\n this.expressionMap.mainAlias!.hasMetadata\n ) {\n for (const columnPath of this.expressionMap.returning) {\n returningColumns.push(\n ...this.expressionMap.mainAlias!.metadata.findColumnsWithPropertyPath(\n columnPath,\n ),\n )\n }\n }\n\n if (\n this.expressionMap.updateEntity === true &&\n this.expressionMap.mainAlias!.hasMetadata &&\n this.expressionMap.whereEntities.length > 0\n ) {\n this.expressionMap.extraReturningColumns =\n returningResultsEntityUpdator.getUpdationReturningColumns()\n\n returningColumns.push(\n ...this.expressionMap.extraReturningColumns.filter(\n (c) => !returningColumns.includes(c),\n ),\n )\n }\n\n if (\n returningColumns.length > 0 &&\n this.connection.driver.options.type === \"mssql\"\n ) {\n declareSql = (\n this.connection.driver as SqlServerDriver\n ).buildTableVariableDeclaration(\n \"@OutputTable\",\n returningColumns,\n )\n selectOutputSql = `SELECT * FROM @OutputTable`\n }\n\n // execute update query\n const [updateSql, parameters] = this.getQueryAndParameters()\n\n const statements = [declareSql, updateSql, selectOutputSql]\n const queryResult = await queryRunner.query(\n statements.filter((sql) => sql != null).join(\";\\n\\n\"),\n parameters,\n true,\n )\n const updateResult = UpdateResult.from(queryResult)\n\n // if we are updating entities and entity updation is enabled we must update some of entity columns (like version, update date, etc.)\n if (\n this.expressionMap.updateEntity === true &&\n this.expressionMap.mainAlias!.hasMetadata &&\n this.expressionMap.whereEntities.length > 0\n ) {\n await returningResultsEntityUpdator.update(\n updateResult,\n this.expressionMap.whereEntities,\n )\n }\n\n // call after updation methods in listeners and subscribers\n if (\n this.expressionMap.callListeners === true &&\n this.expressionMap.mainAlias!.hasMetadata\n ) {\n await queryRunner.broadcaster.broadcast(\n \"AfterUpdate\",\n this.expressionMap.mainAlias!.metadata,\n this.expressionMap.valuesSet,\n )\n }\n\n // close transaction if we started it\n if (transactionStartedByUs) await queryRunner.commitTransaction()\n\n return updateResult\n } catch (error) {\n // rollback transaction if we started it\n if (transactionStartedByUs) {\n try {\n await queryRunner.rollbackTransaction()\n } catch (rollbackError) {}\n }\n throw error\n } finally {\n if (queryRunner !== this.queryRunner) {\n // means we created our own query runner\n await queryRunner.release()\n }\n }\n }\n\n // -------------------------------------------------------------------------\n // Public Methods\n // -------------------------------------------------------------------------\n\n /**\n * Values needs to be updated.\n */\n set(values: QueryDeepPartialEntity<Entity>): this {\n this.expressionMap.valuesSet = values\n return this\n }\n\n /**\n * Sets WHERE condition in the query builder.\n * If you had previously WHERE expression defined,\n * calling this function will override previously set WHERE conditions.\n * Additionally you can add parameters used in where expression.\n */\n where(\n where:\n | string\n | ((qb: this) => string)\n | Brackets\n | ObjectLiteral\n | ObjectLiteral[],\n parameters?: ObjectLiteral,\n ): this {\n this.expressionMap.wheres = [] // don't move this block below since computeWhereParameter can add where expressions\n const condition = this.getWhereCondition(where)\n if (condition)\n this.expressionMap.wheres = [\n { type: \"simple\", condition: condition },\n ]\n if (parameters) this.setParameters(parameters)\n return this\n }\n\n /**\n * Adds new AND WHERE condition in the query builder.\n * Additionally you can add parameters used in where expression.\n */\n andWhere(\n where:\n | string\n | ((qb: this) => string)\n | Brackets\n | ObjectLiteral\n | ObjectLiteral[],\n parameters?: ObjectLiteral,\n ): this {\n this.expressionMap.wheres.push({\n type: \"and\",\n condition: this.getWhereCondition(where),\n })\n if (parameters) this.setParameters(parameters)\n return this\n }\n\n /**\n * Adds new OR WHERE condition in the query builder.\n * Additionally you can add parameters used in where expression.\n */\n orWhere(\n where:\n | string\n | ((qb: this) => string)\n | Brackets\n | ObjectLiteral\n | ObjectLiteral[],\n parameters?: ObjectLiteral,\n ): this {\n this.expressionMap.wheres.push({\n type: \"or\",\n condition: this.getWhereCondition(where),\n })\n if (parameters) this.setParameters(parameters)\n return this\n }\n\n /**\n * Sets WHERE condition in the query builder with a condition for the given ids.\n * If you had previously WHERE expression defined,\n * calling this function will override previously set WHERE conditions.\n */\n whereInIds(ids: any | any[]): this {\n return this.where(this.getWhereInIdsCondition(ids))\n }\n\n /**\n * Adds new AND WHERE with conditions for the given ids.\n */\n andWhereInIds(ids: any | any[]): this {\n return this.andWhere(this.getWhereInIdsCondition(ids))\n }\n\n /**\n * Adds new OR WHERE with conditions for the given ids.\n */\n orWhereInIds(ids: any | any[]): this {\n return this.orWhere(this.getWhereInIdsCondition(ids))\n }\n /**\n * Optional returning/output clause.\n * This will return given column values.\n */\n output(columns: string[]): this\n\n /**\n * Optional returning/output clause.\n * Returning is a SQL string containing returning statement.\n */\n output(output: string): this\n\n /**\n * Optional returning/output clause.\n */\n output(output: string | string[]): this\n\n /**\n * Optional returning/output clause.\n */\n output(output: string | string[]): this {\n return this.returning(output)\n }\n\n /**\n * Optional returning/output clause.\n * This will return given column values.\n */\n returning(columns: string[]): this\n\n /**\n * Optional returning/output clause.\n * Returning is a SQL string containing returning statement.\n */\n returning(returning: string): this\n\n /**\n * Optional returning/output clause.\n */\n returning(returning: string | string[]): this\n\n /**\n * Optional returning/output clause.\n */\n returning(returning: string | string[]): this {\n // not all databases support returning/output cause\n if (!this.connection.driver.isReturningSqlSupported(\"update\")) {\n throw new ReturningStatementNotSupportedError()\n }\n\n this.expressionMap.returning = returning\n return this\n }\n\n /**\n * Sets ORDER BY condition in the query builder.\n * If you had previously ORDER BY expression defined,\n * calling this function will override previously set ORDER BY conditions.\n *\n * Calling order by without order set will remove all previously set order bys.\n */\n orderBy(): this\n\n /**\n * Sets ORDER BY condition in the query builder.\n * If you had previously ORDER BY expression defined,\n * calling this function will override previously set ORDER BY conditions.\n */\n orderBy(\n sort: string,\n order?: \"ASC\" | \"DESC\",\n nulls?: \"NULLS FIRST\" | \"NULLS LAST\",\n ): this\n\n /**\n * Sets ORDER BY condition in the query builder.\n * If you had previously ORDER BY expression defined,\n * calling this function will override previously set ORDER BY conditions.\n */\n orderBy(order: OrderByCondition): this\n\n /**\n * Sets ORDER BY condition in the query builder.\n * If you had previously ORDER BY expression defined,\n * calling this function will override previously set ORDER BY conditions.\n */\n orderBy(\n sort?: string | OrderByCondition,\n order: \"ASC\" | \"DESC\" = \"ASC\",\n nulls?: \"NULLS FIRST\" | \"NULLS LAST\",\n ): this {\n if (sort) {\n if (typeof sort === \"object\") {\n this.expressionMap.orderBys = sort as OrderByCondition\n } else {\n if (nulls) {\n this.expressionMap.orderBys = {\n [sort as string]: { order, nulls },\n }\n } else {\n this.expressionMap.orderBys = { [sort as string]: order }\n }\n }\n } else {\n this.expressionMap.orderBys = {}\n }\n return this\n }\n\n /**\n * Adds ORDER BY condition in the query builder.\n */\n addOrderBy(\n sort: string,\n order: \"ASC\" | \"DESC\" = \"ASC\",\n nulls?: \"NULLS FIRST\" | \"NULLS LAST\",\n ): this {\n if (nulls) {\n this.expressionMap.orderBys[sort] = { order, nulls }\n } else {\n this.expressionMap.orderBys[sort] = order\n }\n return this\n }\n\n /**\n * Sets LIMIT - maximum number of rows to be selected.\n */\n limit(limit?: number): this {\n this.expressionMap.limit = limit\n return this\n }\n\n /**\n * Indicates if entity must be updated after update operation.\n * This may produce extra query or use RETURNING / OUTPUT statement (depend on database).\n * Enabled by default.\n */\n whereEntity(entity: Entity | Entity[]): this {\n if (!this.expressionMap.mainAlias!.hasMetadata)\n throw new TypeORMError(\n `.whereEntity method can only be used on queries which update real entity table.`,\n )\n\n this.expressionMap.wheres = []\n const entities: Entity[] = Array.isArray(entity) ? entity : [entity]\n entities.forEach((entity) => {\n const entityIdMap =\n this.expressionMap.mainAlias!.metadata.getEntityIdMap(entity)\n if (!entityIdMap)\n throw new TypeORMError(\n `Provided entity does not have ids set, cannot perform operation.`,\n )\n\n this.orWhereInIds(entityIdMap)\n })\n\n this.expressionMap.whereEntities = entities\n return this\n }\n\n /**\n * Indicates if entity must be updated after update operation.\n * This may produce extra query or use RETURNING / OUTPUT statement (depend on database).\n * Enabled by default.\n */\n updateEntity(enabled: boolean): this {\n this.expressionMap.updateEntity = enabled\n return this\n }\n\n // -------------------------------------------------------------------------\n // Protected Methods\n // -------------------------------------------------------------------------\n\n /**\n * Creates UPDATE express used to perform insert query.\n */\n protected createUpdateExpression() {\n const valuesSet = this.getValueSet()\n const metadata = this.expressionMap.mainAlias!.hasMetadata\n ? this.expressionMap.mainAlias!.metadata\n : undefined\n\n // prepare columns and values to be updated\n const updateColumnAndValues: string[] = []\n const updatedColumns: ColumnMetadata[] = []\n if (metadata) {\n this.createPropertyPath(metadata, valuesSet).forEach(\n (propertyPath) => {\n // todo: make this and other query builder to work with properly with tables without metadata\n const columns =\n metadata.findColumnsWithPropertyPath(propertyPath)\n\n if (columns.length <= 0) {\n throw new EntityPropertyNotFoundError(\n propertyPath,\n metadata,\n )\n }\n\n columns.forEach((column) => {\n if (\n !column.isUpdate ||\n updatedColumns.includes(column)\n ) {\n return\n }\n\n updatedColumns.push(column)\n\n //\n let value = column.getEntityValue(valuesSet)\n if (\n column.referencedColumn &&\n typeof value === \"object\" &&\n !Buffer.isBuffer(value)\n ) {\n value =\n column.referencedColumn.getEntityValue(value)\n } else if (!(typeof value === \"function\")) {\n value =\n this.connection.driver.preparePersistentValue(\n value,\n column,\n )\n }\n\n // todo: duplication zone\n if (typeof value === \"function\") {\n // support for SQL expressions in update query\n updateColumnAndValues.push(\n this.escape(column.databaseName) +\n \" = \" +\n value(),\n )\n } else if (\n this.connection.driver.options.type === \"sap\" &&\n value === null\n ) {\n updateColumnAndValues.push(\n this.escape(column.databaseName) + \" = NULL\",\n )\n } else {\n if (\n this.connection.driver.options.type === \"mssql\"\n ) {\n value = (\n this.connection.driver as SqlServerDriver\n ).parametrizeValue(column, value)\n }\n\n const paramName = this.createParameter(value)\n\n let expression = null\n if (\n (DriverUtils.isMySQLFamily(\n this.connection.driver,\n ) ||\n this.connection.driver.options.type ===\n \"aurora-mysql\") &&\n this.connection.driver.spatialTypes.indexOf(\n column.type,\n ) !== -1\n ) {\n const useLegacy = (\n this.connection.driver as\n | MysqlDriver\n | AuroraMysqlDriver\n ).options.legacySpatialSupport\n const geomFromText = useLegacy\n ? \"GeomFromText\"\n : \"ST_GeomFromText\"\n if (column.srid != null) {\n expression = `${geomFromText}(${paramName}, ${column.srid})`\n } else {\n expression = `${geomFromText}(${paramName})`\n }\n } else if (\n this.connection.driver.options.type ===\n \"postgres\" &&\n this.connection.driver.spatialTypes.indexOf(\n column.type,\n ) !== -1\n ) {\n if (column.srid != null) {\n expression = `ST_SetSRID(ST_GeomFromGeoJSON(${paramName}), ${column.srid})::${column.type}`\n } else {\n expression = `ST_GeomFromGeoJSON(${paramName})::${column.type}`\n }\n } else if (\n this.connection.driver.options.type ===\n \"mssql\" &&\n this.connection.driver.spatialTypes.indexOf(\n column.type,\n ) !== -1\n ) {\n expression =\n column.type +\n \"::STGeomFromText(\" +\n paramName +\n \", \" +\n (column.srid || \"0\") +\n \")\"\n } else {\n expression = paramName\n }\n updateColumnAndValues.push(\n this.escape(column.databaseName) +\n \" = \" +\n expression,\n )\n }\n })\n },\n )\n\n // Don't allow calling update only with columns that are `update: false`\n if (\n updateColumnAndValues.length > 0 ||\n Object.keys(valuesSet).length === 0\n ) {\n if (\n metadata.versionColumn &&\n updatedColumns.indexOf(metadata.versionColumn) === -1\n )\n updateColumnAndValues.push(\n this.escape(metadata.versionColumn.databaseName) +\n \" = \" +\n this.escape(metadata.versionColumn.databaseName) +\n \" + 1\",\n )\n if (\n metadata.updateDateColumn &&\n updatedColumns.indexOf(metadata.updateDateColumn) === -1\n )\n updateColumnAndValues.push(\n this.escape(metadata.updateDateColumn.databaseName) +\n \" = CURRENT_TIMESTAMP\",\n ) // todo: fix issue with CURRENT_TIMESTAMP(6) being used, can \"DEFAULT\" be used?!\n }\n } else {\n Object.keys(valuesSet).map((key) => {\n let value = valuesSet[key]\n\n // todo: duplication zone\n if (typeof value === \"function\") {\n // support for SQL expressions in update query\n updateColumnAndValues.push(\n this.escape(key) + \" = \" + value(),\n )\n } else if (\n this.connection.driver.options.type === \"sap\" &&\n value === null\n ) {\n updateColumnAndValues.push(this.escape(key) + \" = NULL\")\n } else {\n // we need to store array values in a special class to make sure parameter replacement will work correctly\n // if (value instanceof Array)\n // value = new ArrayParameter(value);\n\n const paramName = this.createParameter(value)\n updateColumnAndValues.push(\n this.escape(key) + \" = \" + paramName,\n )\n }\n })\n }\n\n if (updateColumnAndValues.length <= 0) {\n throw new UpdateValuesMissingError()\n }\n\n // get a table name and all column database names\n const whereExpression = this.createWhereExpression()\n const returningExpression = this.createReturningExpression(\"update\")\n\n if (returningExpression === \"\") {\n return `UPDATE ${this.getTableName(\n this.getMainTableName(),\n )} SET ${updateColumnAndValues.join(\", \")}${whereExpression}` // todo: how do we replace aliases in where to nothing?\n }\n if (this.connection.driver.options.type === \"mssql\") {\n return `UPDATE ${this.getTableName(\n this.getMainTableName(),\n )} SET ${updateColumnAndValues.join(\n \", \",\n )} OUTPUT ${returningExpression}${whereExpression}`\n }\n return `UPDATE ${this.getTableName(\n this.getMainTableName(),\n )} SET ${updateColumnAndValues.join(\n \", \",\n )}${whereExpression} RETURNING ${returningExpression}`\n }\n\n /**\n * Creates \"ORDER BY\" part of SQL query.\n */\n protected createOrderByExpression() {\n const orderBys = this.expressionMap.orderBys\n if (Object.keys(orderBys).length > 0)\n return (\n \" ORDER BY \" +\n Object.keys(orderBys)\n .map((columnName) => {\n if (typeof orderBys[columnName] === \"string\") {\n return (\n this.replacePropertyNames(columnName) +\n \" \" +\n orderBys[columnName]\n )\n } else {\n return (\n this.replacePropertyNames(columnName) +\n \" \" +\n (orderBys[columnName] as any).order +\n \" \" +\n (orderBys[columnName] as any).nulls\n )\n }\n })\n .join(\", \")\n )\n\n return \"\"\n }\n\n /**\n * Creates \"LIMIT\" parts of SQL query.\n */\n protected createLimitExpression(): string {\n let limit: number | undefined = this.expressionMap.limit\n\n if (limit) {\n if (\n DriverUtils.isMySQLFamily(this.connection.driver) ||\n this.connection.driver.options.type === \"aurora-mysql\"\n ) {\n return \" LIMIT \" + limit\n } else {\n throw new LimitOnUpdateNotSupportedError()\n }\n }\n\n return \"\"\n }\n\n /**\n * Gets array of values need to be inserted into the target table.\n */\n protected getValueSet(): ObjectLiteral {\n if (typeof this.expressionMap.valuesSet === \"object\")\n return this.expressionMap.valuesSet\n\n throw new UpdateValuesMissingError()\n }\n}\n"],"sourceRoot":".."}
|
|
1
|
+
{"version":3,"sources":["../browser/src/query-builder/UpdateQueryBuilder.ts"],"names":[],"mappings":"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","file":"UpdateQueryBuilder.js","sourcesContent":["import { ColumnMetadata } from \"../metadata/ColumnMetadata\"\nimport { QueryBuilder } from \"./QueryBuilder\"\nimport { ObjectLiteral } from \"../common/ObjectLiteral\"\nimport { DataSource } from \"../data-source/DataSource\"\nimport { QueryRunner } from \"../query-runner/QueryRunner\"\nimport { WhereExpressionBuilder } from \"./WhereExpressionBuilder\"\nimport { Brackets } from \"./Brackets\"\nimport { UpdateResult } from \"./result/UpdateResult\"\nimport { ReturningStatementNotSupportedError } from \"../error/ReturningStatementNotSupportedError\"\nimport { ReturningResultsEntityUpdator } from \"./ReturningResultsEntityUpdator\"\nimport { MysqlDriver } from \"../driver/mysql/MysqlDriver\"\nimport { OrderByCondition } from \"../find-options/OrderByCondition\"\nimport { LimitOnUpdateNotSupportedError } from \"../error/LimitOnUpdateNotSupportedError\"\nimport { UpdateValuesMissingError } from \"../error/UpdateValuesMissingError\"\nimport { QueryDeepPartialEntity } from \"./QueryPartialEntity\"\nimport { AuroraMysqlDriver } from \"../driver/aurora-mysql/AuroraMysqlDriver\"\nimport { TypeORMError } from \"../error\"\nimport { EntityPropertyNotFoundError } from \"../error/EntityPropertyNotFoundError\"\nimport { SqlServerDriver } from \"../driver/sqlserver/SqlServerDriver\"\nimport { DriverUtils } from \"../driver/DriverUtils\"\n\n/**\n * Allows to build complex sql queries in a fashion way and execute those queries.\n */\nexport class UpdateQueryBuilder<Entity>\n extends QueryBuilder<Entity>\n implements WhereExpressionBuilder\n{\n readonly \"@instanceof\" = Symbol.for(\"UpdateQueryBuilder\")\n\n // -------------------------------------------------------------------------\n // Constructor\n // -------------------------------------------------------------------------\n\n constructor(\n connectionOrQueryBuilder: DataSource | QueryBuilder<any>,\n queryRunner?: QueryRunner,\n ) {\n super(connectionOrQueryBuilder as any, queryRunner)\n this.expressionMap.aliasNamePrefixingEnabled = false\n }\n\n // -------------------------------------------------------------------------\n // Public Implemented Methods\n // -------------------------------------------------------------------------\n\n /**\n * Gets generated SQL query without parameters being replaced.\n */\n getQuery(): string {\n let sql = this.createComment()\n sql += this.createCteExpression()\n sql += this.createUpdateExpression()\n sql += this.createOrderByExpression()\n sql += this.createLimitExpression()\n return sql.trim()\n }\n\n /**\n * Executes sql generated by query builder and returns raw database results.\n */\n async execute(): Promise<UpdateResult> {\n const queryRunner = this.obtainQueryRunner()\n let transactionStartedByUs: boolean = false\n\n try {\n // start transaction if it was enabled\n if (\n this.expressionMap.useTransaction === true &&\n queryRunner.isTransactionActive === false\n ) {\n await queryRunner.startTransaction()\n transactionStartedByUs = true\n }\n\n // call before updation methods in listeners and subscribers\n if (\n this.expressionMap.callListeners === true &&\n this.expressionMap.mainAlias!.hasMetadata\n ) {\n await queryRunner.broadcaster.broadcast(\n \"BeforeUpdate\",\n this.expressionMap.mainAlias!.metadata,\n this.expressionMap.valuesSet,\n )\n }\n\n let declareSql: string | null = null\n let selectOutputSql: string | null = null\n\n // if update entity mode is enabled we may need extra columns for the returning statement\n const returningResultsEntityUpdator =\n new ReturningResultsEntityUpdator(\n queryRunner,\n this.expressionMap,\n )\n\n const returningColumns: ColumnMetadata[] = []\n\n if (\n Array.isArray(this.expressionMap.returning) &&\n this.expressionMap.mainAlias!.hasMetadata\n ) {\n for (const columnPath of this.expressionMap.returning) {\n returningColumns.push(\n ...this.expressionMap.mainAlias!.metadata.findColumnsWithPropertyPath(\n columnPath,\n ),\n )\n }\n }\n\n if (\n this.expressionMap.updateEntity === true &&\n this.expressionMap.mainAlias!.hasMetadata &&\n this.expressionMap.whereEntities.length > 0\n ) {\n this.expressionMap.extraReturningColumns =\n returningResultsEntityUpdator.getUpdationReturningColumns()\n\n returningColumns.push(\n ...this.expressionMap.extraReturningColumns.filter(\n (c) => !returningColumns.includes(c),\n ),\n )\n }\n\n if (\n returningColumns.length > 0 &&\n this.connection.driver.options.type === \"mssql\"\n ) {\n declareSql = (\n this.connection.driver as SqlServerDriver\n ).buildTableVariableDeclaration(\n \"@OutputTable\",\n returningColumns,\n )\n selectOutputSql = `SELECT * FROM @OutputTable`\n }\n\n // execute update query\n const [updateSql, parameters] = this.getQueryAndParameters()\n\n const statements = [declareSql, updateSql, selectOutputSql]\n const queryResult = await queryRunner.query(\n statements.filter((sql) => sql != null).join(\";\\n\\n\"),\n parameters,\n true,\n )\n const updateResult = UpdateResult.from(queryResult)\n\n // if we are updating entities and entity updation is enabled we must update some of entity columns (like version, update date, etc.)\n if (\n this.expressionMap.updateEntity === true &&\n this.expressionMap.mainAlias!.hasMetadata &&\n this.expressionMap.whereEntities.length > 0\n ) {\n await returningResultsEntityUpdator.update(\n updateResult,\n this.expressionMap.whereEntities,\n )\n }\n\n // call after updation methods in listeners and subscribers\n if (\n this.expressionMap.callListeners === true &&\n this.expressionMap.mainAlias!.hasMetadata\n ) {\n await queryRunner.broadcaster.broadcast(\n \"AfterUpdate\",\n this.expressionMap.mainAlias!.metadata,\n this.expressionMap.valuesSet,\n )\n }\n\n // close transaction if we started it\n if (transactionStartedByUs) await queryRunner.commitTransaction()\n\n return updateResult\n } catch (error) {\n // rollback transaction if we started it\n if (transactionStartedByUs) {\n try {\n await queryRunner.rollbackTransaction()\n } catch (rollbackError) {}\n }\n throw error\n } finally {\n if (queryRunner !== this.queryRunner) {\n // means we created our own query runner\n await queryRunner.release()\n }\n }\n }\n\n // -------------------------------------------------------------------------\n // Public Methods\n // -------------------------------------------------------------------------\n\n /**\n * Values needs to be updated.\n */\n set(values: QueryDeepPartialEntity<Entity>): this {\n this.expressionMap.valuesSet = values\n return this\n }\n\n /**\n * Sets WHERE condition in the query builder.\n * If you had previously WHERE expression defined,\n * calling this function will override previously set WHERE conditions.\n * Additionally you can add parameters used in where expression.\n */\n where(\n where:\n | string\n | ((qb: this) => string)\n | Brackets\n | ObjectLiteral\n | ObjectLiteral[],\n parameters?: ObjectLiteral,\n ): this {\n this.expressionMap.wheres = [] // don't move this block below since computeWhereParameter can add where expressions\n const condition = this.getWhereCondition(where)\n if (condition)\n this.expressionMap.wheres = [\n { type: \"simple\", condition: condition },\n ]\n if (parameters) this.setParameters(parameters)\n return this\n }\n\n /**\n * Adds new AND WHERE condition in the query builder.\n * Additionally you can add parameters used in where expression.\n */\n andWhere(\n where:\n | string\n | ((qb: this) => string)\n | Brackets\n | ObjectLiteral\n | ObjectLiteral[],\n parameters?: ObjectLiteral,\n ): this {\n this.expressionMap.wheres.push({\n type: \"and\",\n condition: this.getWhereCondition(where),\n })\n if (parameters) this.setParameters(parameters)\n return this\n }\n\n /**\n * Adds new OR WHERE condition in the query builder.\n * Additionally you can add parameters used in where expression.\n */\n orWhere(\n where:\n | string\n | ((qb: this) => string)\n | Brackets\n | ObjectLiteral\n | ObjectLiteral[],\n parameters?: ObjectLiteral,\n ): this {\n this.expressionMap.wheres.push({\n type: \"or\",\n condition: this.getWhereCondition(where),\n })\n if (parameters) this.setParameters(parameters)\n return this\n }\n\n /**\n * Sets WHERE condition in the query builder with a condition for the given ids.\n * If you had previously WHERE expression defined,\n * calling this function will override previously set WHERE conditions.\n */\n whereInIds(ids: any | any[]): this {\n return this.where(this.getWhereInIdsCondition(ids))\n }\n\n /**\n * Adds new AND WHERE with conditions for the given ids.\n */\n andWhereInIds(ids: any | any[]): this {\n return this.andWhere(this.getWhereInIdsCondition(ids))\n }\n\n /**\n * Adds new OR WHERE with conditions for the given ids.\n */\n orWhereInIds(ids: any | any[]): this {\n return this.orWhere(this.getWhereInIdsCondition(ids))\n }\n /**\n * Optional returning/output clause.\n * This will return given column values.\n */\n output(columns: string[]): this\n\n /**\n * Optional returning/output clause.\n * Returning is a SQL string containing returning statement.\n */\n output(output: string): this\n\n /**\n * Optional returning/output clause.\n */\n output(output: string | string[]): this\n\n /**\n * Optional returning/output clause.\n */\n output(output: string | string[]): this {\n return this.returning(output)\n }\n\n /**\n * Optional returning/output clause.\n * This will return given column values.\n */\n returning(columns: string[]): this\n\n /**\n * Optional returning/output clause.\n * Returning is a SQL string containing returning statement.\n */\n returning(returning: string): this\n\n /**\n * Optional returning/output clause.\n */\n returning(returning: string | string[]): this\n\n /**\n * Optional returning/output clause.\n */\n returning(returning: string | string[]): this {\n // not all databases support returning/output cause\n if (!this.connection.driver.isReturningSqlSupported(\"update\")) {\n throw new ReturningStatementNotSupportedError()\n }\n\n this.expressionMap.returning = returning\n return this\n }\n\n /**\n * Sets ORDER BY condition in the query builder.\n * If you had previously ORDER BY expression defined,\n * calling this function will override previously set ORDER BY conditions.\n *\n * Calling order by without order set will remove all previously set order bys.\n */\n orderBy(): this\n\n /**\n * Sets ORDER BY condition in the query builder.\n * If you had previously ORDER BY expression defined,\n * calling this function will override previously set ORDER BY conditions.\n */\n orderBy(\n sort: string,\n order?: \"ASC\" | \"DESC\",\n nulls?: \"NULLS FIRST\" | \"NULLS LAST\",\n ): this\n\n /**\n * Sets ORDER BY condition in the query builder.\n * If you had previously ORDER BY expression defined,\n * calling this function will override previously set ORDER BY conditions.\n */\n orderBy(order: OrderByCondition): this\n\n /**\n * Sets ORDER BY condition in the query builder.\n * If you had previously ORDER BY expression defined,\n * calling this function will override previously set ORDER BY conditions.\n */\n orderBy(\n sort?: string | OrderByCondition,\n order: \"ASC\" | \"DESC\" = \"ASC\",\n nulls?: \"NULLS FIRST\" | \"NULLS LAST\",\n ): this {\n if (sort) {\n if (typeof sort === \"object\") {\n this.expressionMap.orderBys = sort as OrderByCondition\n } else {\n if (nulls) {\n this.expressionMap.orderBys = {\n [sort as string]: { order, nulls },\n }\n } else {\n this.expressionMap.orderBys = { [sort as string]: order }\n }\n }\n } else {\n this.expressionMap.orderBys = {}\n }\n return this\n }\n\n /**\n * Adds ORDER BY condition in the query builder.\n */\n addOrderBy(\n sort: string,\n order: \"ASC\" | \"DESC\" = \"ASC\",\n nulls?: \"NULLS FIRST\" | \"NULLS LAST\",\n ): this {\n if (nulls) {\n this.expressionMap.orderBys[sort] = { order, nulls }\n } else {\n this.expressionMap.orderBys[sort] = order\n }\n return this\n }\n\n /**\n * Sets LIMIT - maximum number of rows to be selected.\n */\n limit(limit?: number): this {\n this.expressionMap.limit = limit\n return this\n }\n\n /**\n * Indicates if entity must be updated after update operation.\n * This may produce extra query or use RETURNING / OUTPUT statement (depend on database).\n * Enabled by default.\n */\n whereEntity(entity: Entity | Entity[]): this {\n if (!this.expressionMap.mainAlias!.hasMetadata)\n throw new TypeORMError(\n `.whereEntity method can only be used on queries which update real entity table.`,\n )\n\n this.expressionMap.wheres = []\n const entities: Entity[] = Array.isArray(entity) ? entity : [entity]\n entities.forEach((entity) => {\n const entityIdMap =\n this.expressionMap.mainAlias!.metadata.getEntityIdMap(entity)\n if (!entityIdMap)\n throw new TypeORMError(\n `Provided entity does not have ids set, cannot perform operation.`,\n )\n\n this.orWhereInIds(entityIdMap)\n })\n\n this.expressionMap.whereEntities = entities\n return this\n }\n\n /**\n * Indicates if entity must be updated after update operation.\n * This may produce extra query or use RETURNING / OUTPUT statement (depend on database).\n * Enabled by default.\n */\n updateEntity(enabled: boolean): this {\n this.expressionMap.updateEntity = enabled\n return this\n }\n\n // -------------------------------------------------------------------------\n // Protected Methods\n // -------------------------------------------------------------------------\n\n /**\n * Creates UPDATE express used to perform insert query.\n */\n protected createUpdateExpression() {\n const valuesSet = this.getValueSet()\n const metadata = this.expressionMap.mainAlias!.hasMetadata\n ? this.expressionMap.mainAlias!.metadata\n : undefined\n\n // it doesn't make sense to update undefined properties, so just skip them\n const valuesSetNormalized: ObjectLiteral = {}\n for (let key in valuesSet) {\n if (valuesSet[key] !== undefined) {\n valuesSetNormalized[key] = valuesSet[key]\n }\n }\n\n // prepare columns and values to be updated\n const updateColumnAndValues: string[] = []\n const updatedColumns: ColumnMetadata[] = []\n if (metadata) {\n this.createPropertyPath(metadata, valuesSetNormalized).forEach(\n (propertyPath) => {\n // todo: make this and other query builder to work with properly with tables without metadata\n const columns =\n metadata.findColumnsWithPropertyPath(propertyPath)\n\n if (columns.length <= 0) {\n throw new EntityPropertyNotFoundError(\n propertyPath,\n metadata,\n )\n }\n\n columns.forEach((column) => {\n if (\n !column.isUpdate ||\n updatedColumns.includes(column)\n ) {\n return\n }\n\n updatedColumns.push(column)\n\n //\n let value = column.getEntityValue(valuesSetNormalized)\n if (\n column.referencedColumn &&\n typeof value === \"object\" &&\n value !== null &&\n !Buffer.isBuffer(value)\n ) {\n value =\n column.referencedColumn.getEntityValue(value)\n } else if (!(typeof value === \"function\")) {\n value =\n this.connection.driver.preparePersistentValue(\n value,\n column,\n )\n }\n\n // todo: duplication zone\n if (typeof value === \"function\") {\n // support for SQL expressions in update query\n updateColumnAndValues.push(\n this.escape(column.databaseName) +\n \" = \" +\n value(),\n )\n } else if (\n (this.connection.driver.options.type === \"sap\" ||\n this.connection.driver.options.type ===\n \"spanner\") &&\n value === null\n ) {\n updateColumnAndValues.push(\n this.escape(column.databaseName) + \" = NULL\",\n )\n } else {\n if (\n this.connection.driver.options.type === \"mssql\"\n ) {\n value = (\n this.connection.driver as SqlServerDriver\n ).parametrizeValue(column, value)\n }\n\n const paramName = this.createParameter(value)\n\n let expression = null\n if (\n (DriverUtils.isMySQLFamily(\n this.connection.driver,\n ) ||\n this.connection.driver.options.type ===\n \"aurora-mysql\") &&\n this.connection.driver.spatialTypes.indexOf(\n column.type,\n ) !== -1\n ) {\n const useLegacy = (\n this.connection.driver as\n | MysqlDriver\n | AuroraMysqlDriver\n ).options.legacySpatialSupport\n const geomFromText = useLegacy\n ? \"GeomFromText\"\n : \"ST_GeomFromText\"\n if (column.srid != null) {\n expression = `${geomFromText}(${paramName}, ${column.srid})`\n } else {\n expression = `${geomFromText}(${paramName})`\n }\n } else if (\n this.connection.driver.options.type ===\n \"postgres\" &&\n this.connection.driver.spatialTypes.indexOf(\n column.type,\n ) !== -1\n ) {\n if (column.srid != null) {\n expression = `ST_SetSRID(ST_GeomFromGeoJSON(${paramName}), ${column.srid})::${column.type}`\n } else {\n expression = `ST_GeomFromGeoJSON(${paramName})::${column.type}`\n }\n } else if (\n this.connection.driver.options.type ===\n \"mssql\" &&\n this.connection.driver.spatialTypes.indexOf(\n column.type,\n ) !== -1\n ) {\n expression =\n column.type +\n \"::STGeomFromText(\" +\n paramName +\n \", \" +\n (column.srid || \"0\") +\n \")\"\n } else {\n expression = paramName\n }\n updateColumnAndValues.push(\n this.escape(column.databaseName) +\n \" = \" +\n expression,\n )\n }\n })\n },\n )\n\n // Don't allow calling update only with columns that are `update: false`\n if (\n updateColumnAndValues.length > 0 ||\n Object.keys(valuesSetNormalized).length === 0\n ) {\n if (\n metadata.versionColumn &&\n updatedColumns.indexOf(metadata.versionColumn) === -1\n )\n updateColumnAndValues.push(\n this.escape(metadata.versionColumn.databaseName) +\n \" = \" +\n this.escape(metadata.versionColumn.databaseName) +\n \" + 1\",\n )\n if (\n metadata.updateDateColumn &&\n updatedColumns.indexOf(metadata.updateDateColumn) === -1\n )\n updateColumnAndValues.push(\n this.escape(metadata.updateDateColumn.databaseName) +\n \" = CURRENT_TIMESTAMP\",\n ) // todo: fix issue with CURRENT_TIMESTAMP(6) being used, can \"DEFAULT\" be used?!\n }\n } else {\n Object.keys(valuesSetNormalized).map((key) => {\n let value = valuesSetNormalized[key]\n\n // todo: duplication zone\n if (typeof value === \"function\") {\n // support for SQL expressions in update query\n updateColumnAndValues.push(\n this.escape(key) + \" = \" + value(),\n )\n } else if (\n (this.connection.driver.options.type === \"sap\" ||\n this.connection.driver.options.type === \"spanner\") &&\n value === null\n ) {\n updateColumnAndValues.push(this.escape(key) + \" = NULL\")\n } else {\n // we need to store array values in a special class to make sure parameter replacement will work correctly\n // if (value instanceof Array)\n // value = new ArrayParameter(value);\n\n const paramName = this.createParameter(value)\n updateColumnAndValues.push(\n this.escape(key) + \" = \" + paramName,\n )\n }\n })\n }\n\n if (updateColumnAndValues.length <= 0) {\n throw new UpdateValuesMissingError()\n }\n\n // get a table name and all column database names\n const whereExpression = this.createWhereExpression()\n const returningExpression = this.createReturningExpression(\"update\")\n\n if (returningExpression === \"\") {\n return `UPDATE ${this.getTableName(\n this.getMainTableName(),\n )} SET ${updateColumnAndValues.join(\", \")}${whereExpression}` // todo: how do we replace aliases in where to nothing?\n }\n if (this.connection.driver.options.type === \"mssql\") {\n return `UPDATE ${this.getTableName(\n this.getMainTableName(),\n )} SET ${updateColumnAndValues.join(\n \", \",\n )} OUTPUT ${returningExpression}${whereExpression}`\n }\n return `UPDATE ${this.getTableName(\n this.getMainTableName(),\n )} SET ${updateColumnAndValues.join(\n \", \",\n )}${whereExpression} RETURNING ${returningExpression}`\n }\n\n /**\n * Creates \"ORDER BY\" part of SQL query.\n */\n protected createOrderByExpression() {\n const orderBys = this.expressionMap.orderBys\n if (Object.keys(orderBys).length > 0)\n return (\n \" ORDER BY \" +\n Object.keys(orderBys)\n .map((columnName) => {\n if (typeof orderBys[columnName] === \"string\") {\n return (\n this.replacePropertyNames(columnName) +\n \" \" +\n orderBys[columnName]\n )\n } else {\n return (\n this.replacePropertyNames(columnName) +\n \" \" +\n (orderBys[columnName] as any).order +\n \" \" +\n (orderBys[columnName] as any).nulls\n )\n }\n })\n .join(\", \")\n )\n\n return \"\"\n }\n\n /**\n * Creates \"LIMIT\" parts of SQL query.\n */\n protected createLimitExpression(): string {\n let limit: number | undefined = this.expressionMap.limit\n\n if (limit) {\n if (\n DriverUtils.isMySQLFamily(this.connection.driver) ||\n this.connection.driver.options.type === \"aurora-mysql\"\n ) {\n return \" LIMIT \" + limit\n } else {\n throw new LimitOnUpdateNotSupportedError()\n }\n }\n\n return \"\"\n }\n\n /**\n * Gets array of values need to be inserted into the target table.\n */\n protected getValueSet(): ObjectLiteral {\n if (typeof this.expressionMap.valuesSet === \"object\")\n return this.expressionMap.valuesSet\n\n throw new UpdateValuesMissingError()\n }\n}\n"],"sourceRoot":".."}
|
|
@@ -44,7 +44,10 @@ export class RdbmsSchemaBuilder {
|
|
|
44
44
|
this.currentSchema = this.connection.driver.schema;
|
|
45
45
|
// CockroachDB implements asynchronous schema sync operations which can not been executed in transaction.
|
|
46
46
|
// E.g. if you try to DROP column and ADD it again in the same transaction, crdb throws error.
|
|
47
|
+
// In Spanner queries against the INFORMATION_SCHEMA can be used in a read-only transaction,
|
|
48
|
+
// but not in a read-write transaction.
|
|
47
49
|
const isUsingTransactions = !(this.connection.driver.options.type === "cockroachdb") &&
|
|
50
|
+
!(this.connection.driver.options.type === "spanner") &&
|
|
48
51
|
this.connection.options.migrationsTransactionMode !== "none";
|
|
49
52
|
await this.queryRunner.beforeMigration();
|
|
50
53
|
if (isUsingTransactions) {
|
|
@@ -541,7 +544,8 @@ export class RdbmsSchemaBuilder {
|
|
|
541
544
|
// drop all composite uniques related to this column
|
|
542
545
|
// Mysql does not support unique constraints.
|
|
543
546
|
if (!(DriverUtils.isMySQLFamily(this.connection.driver) ||
|
|
544
|
-
this.connection.driver.options.type === "aurora-mysql"
|
|
547
|
+
this.connection.driver.options.type === "aurora-mysql" ||
|
|
548
|
+
this.connection.driver.options.type === "spanner")) {
|
|
545
549
|
for (const changedColumn of changedColumns) {
|
|
546
550
|
await this.dropColumnCompositeUniques(this.getTablePath(metadata), changedColumn.databaseName);
|
|
547
551
|
}
|
|
@@ -750,6 +754,10 @@ export class RdbmsSchemaBuilder {
|
|
|
750
754
|
const schema = this.currentSchema;
|
|
751
755
|
const database = this.currentDatabase;
|
|
752
756
|
const typeormMetadataTable = this.connection.driver.buildTableName(this.connection.metadataTableName, schema, database);
|
|
757
|
+
// Spanner requires at least one primary key in a table.
|
|
758
|
+
// Since we don't have unique column in "typeorm_metadata" table
|
|
759
|
+
// and we should avoid breaking changes, we mark all columns as primary for Spanner driver.
|
|
760
|
+
const isPrimary = this.connection.driver.options.type === "spanner";
|
|
753
761
|
await queryRunner.createTable(new Table({
|
|
754
762
|
database: database,
|
|
755
763
|
schema: schema,
|
|
@@ -762,6 +770,7 @@ export class RdbmsSchemaBuilder {
|
|
|
762
770
|
.metadataType,
|
|
763
771
|
}),
|
|
764
772
|
isNullable: false,
|
|
773
|
+
isPrimary,
|
|
765
774
|
},
|
|
766
775
|
{
|
|
767
776
|
name: "database",
|
|
@@ -770,6 +779,7 @@ export class RdbmsSchemaBuilder {
|
|
|
770
779
|
.metadataDatabase,
|
|
771
780
|
}),
|
|
772
781
|
isNullable: true,
|
|
782
|
+
isPrimary,
|
|
773
783
|
},
|
|
774
784
|
{
|
|
775
785
|
name: "schema",
|
|
@@ -778,6 +788,7 @@ export class RdbmsSchemaBuilder {
|
|
|
778
788
|
.metadataSchema,
|
|
779
789
|
}),
|
|
780
790
|
isNullable: true,
|
|
791
|
+
isPrimary,
|
|
781
792
|
},
|
|
782
793
|
{
|
|
783
794
|
name: "table",
|
|
@@ -786,6 +797,7 @@ export class RdbmsSchemaBuilder {
|
|
|
786
797
|
.metadataTable,
|
|
787
798
|
}),
|
|
788
799
|
isNullable: true,
|
|
800
|
+
isPrimary,
|
|
789
801
|
},
|
|
790
802
|
{
|
|
791
803
|
name: "name",
|
|
@@ -794,6 +806,7 @@ export class RdbmsSchemaBuilder {
|
|
|
794
806
|
.metadataName,
|
|
795
807
|
}),
|
|
796
808
|
isNullable: true,
|
|
809
|
+
isPrimary,
|
|
797
810
|
},
|
|
798
811
|
{
|
|
799
812
|
name: "value",
|
|
@@ -802,6 +815,7 @@ export class RdbmsSchemaBuilder {
|
|
|
802
815
|
.metadataValue,
|
|
803
816
|
}),
|
|
804
817
|
isNullable: true,
|
|
818
|
+
isPrimary,
|
|
805
819
|
},
|
|
806
820
|
],
|
|
807
821
|
}), true);
|