Skip to content

Commit

Permalink
fix(aurora): apply mysql query fixes to aurora (#4779)
Browse files Browse the repository at this point in the history
  • Loading branch information
ArsenyYankovsky authored and pleerock committed Oct 3, 2019
1 parent a3b2ee0 commit ee61c51
Show file tree
Hide file tree
Showing 12 changed files with 44 additions and 27 deletions.
3 changes: 2 additions & 1 deletion src/commands/MigrationGenerateCommand.ts
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,7 @@ import {createConnection} from "../index";
import {MysqlDriver} from "../driver/mysql/MysqlDriver";
import {camelCase} from "../util/StringUtils";
import * as yargs from "yargs";
import {AuroraDataApiDriver} from "../driver/aurora-data-api/AuroraDataApiDriver";
const chalk = require("chalk");

/**
Expand Down Expand Up @@ -79,7 +80,7 @@ export class MigrationGenerateCommand implements yargs.CommandModule {

// mysql is exceptional here because it uses ` character in to escape names in queries, that's why for mysql
// we are using simple quoted string instead of template string syntax
if (connection.driver instanceof MysqlDriver) {
if (connection.driver instanceof MysqlDriver || connection.driver instanceof AuroraDataApiDriver) {
sqlInMemory.upQueries.forEach(upQuery => {
upSqls.push(" await queryRunner.query(\"" + upQuery.query.replace(new RegExp(`"`, "g"), `\\"`) + "\", " + JSON.stringify(upQuery.parameters) + ");");
});
Expand Down
3 changes: 2 additions & 1 deletion src/connection/Connection.ts
Original file line number Diff line number Diff line change
Expand Up @@ -37,6 +37,7 @@ import {MysqlDriver} from "../driver/mysql/MysqlDriver";
import {ObjectUtils} from "../util/ObjectUtils";
import {PromiseUtils} from "../";
import {IsolationLevel} from "../driver/types/IsolationLevel";
import {AuroraDataApiDriver} from "../driver/aurora-data-api/AuroraDataApiDriver";

/**
* Connection is a single database ORM connection to a specific database.
Expand Down Expand Up @@ -258,7 +259,7 @@ export class Connection {
async dropDatabase(): Promise<void> {
const queryRunner = await this.createQueryRunner("master");
try {
if (this.driver instanceof SqlServerDriver || this.driver instanceof MysqlDriver) {
if (this.driver instanceof SqlServerDriver || this.driver instanceof MysqlDriver || this.driver instanceof AuroraDataApiDriver) {
const databases: string[] = this.driver.database ? [this.driver.database] : [];
this.entityMetadatas.forEach(metadata => {
if (metadata.database && databases.indexOf(metadata.database) === -1)
Expand Down
5 changes: 3 additions & 2 deletions src/metadata-builder/EntityMetadataBuilder.ts
Original file line number Diff line number Diff line change
Expand Up @@ -21,6 +21,7 @@ import {CheckMetadata} from "../metadata/CheckMetadata";
import {SqlServerDriver} from "../driver/sqlserver/SqlServerDriver";
import {PostgresDriver} from "../driver/postgres/PostgresDriver";
import {ExclusionMetadata} from "../metadata/ExclusionMetadata";
import {AuroraDataApiDriver} from "../driver/aurora-data-api/AuroraDataApiDriver";

/**
* Builds EntityMetadata objects and all its sub-metadatas.
Expand Down Expand Up @@ -128,7 +129,7 @@ export class EntityMetadataBuilder {
entityMetadata.foreignKeys.push(foreignKey);
}
if (uniqueConstraint) {
if (this.connection.driver instanceof MysqlDriver || this.connection.driver instanceof SqlServerDriver) {
if (this.connection.driver instanceof MysqlDriver || this.connection.driver instanceof AuroraDataApiDriver || this.connection.driver instanceof SqlServerDriver) {
const index = new IndexMetadata({
entityMetadata: uniqueConstraint.entityMetadata,
columns: uniqueConstraint.columns,
Expand Down Expand Up @@ -520,7 +521,7 @@ export class EntityMetadataBuilder {
}

// Mysql stores unique constraints as unique indices.
if (this.connection.driver instanceof MysqlDriver) {
if (this.connection.driver instanceof MysqlDriver || this.connection.driver instanceof AuroraDataApiDriver) {
const indices = this.metadataArgsStorage.filterUniques(entityMetadata.inheritanceTree).map(args => {
return new IndexMetadata({
entityMetadata: entityMetadata,
Expand Down
5 changes: 3 additions & 2 deletions src/metadata-builder/EntityMetadataValidator.ts
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,7 @@ import {SqlServerDriver} from "../driver/sqlserver/SqlServerDriver";
import {MysqlDriver} from "../driver/mysql/MysqlDriver";
import {NoConnectionOptionError} from "../error/NoConnectionOptionError";
import {InitializedRelationError} from "../error/InitializedRelationError";
import {AuroraDataApiDriver} from "../driver/aurora-data-api/AuroraDataApiDriver";

/// todo: add check if there are multiple tables with the same name
/// todo: add checks when generated column / table names are too long for the specific driver
Expand Down Expand Up @@ -86,7 +87,7 @@ export class EntityMetadataValidator {
});
}

if (driver instanceof MysqlDriver) {
if (driver instanceof MysqlDriver || driver instanceof AuroraDataApiDriver) {
const generatedColumns = entityMetadata.columns.filter(column => column.isGenerated && column.generationStrategy !== "uuid");
if (generatedColumns.length > 1)
throw new Error(`Error in ${entityMetadata.name} entity. There can be only one auto-increment column in MySql table.`);
Expand Down Expand Up @@ -237,4 +238,4 @@ export class EntityMetadataValidator {
});
}

}
}
5 changes: 3 additions & 2 deletions src/metadata-builder/JunctionEntityMetadataBuilder.ts
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,7 @@ import {ForeignKeyMetadata} from "../metadata/ForeignKeyMetadata";
import {IndexMetadata} from "../metadata/IndexMetadata";
import {JoinTableMetadataArgs} from "../metadata-args/JoinTableMetadataArgs";
import {RelationMetadata} from "../metadata/RelationMetadata";
import {AuroraDataApiDriver} from "../driver/aurora-data-api/AuroraDataApiDriver";

/**
* Creates EntityMetadata for junction tables.
Expand Down Expand Up @@ -70,7 +71,7 @@ export class JunctionEntityMetadataBuilder {
options: {
name: columnName,
length: !referencedColumn.length
&& (this.connection.driver instanceof MysqlDriver)
&& (this.connection.driver instanceof MysqlDriver || this.connection.driver instanceof AuroraDataApiDriver)
&& (referencedColumn.generationStrategy === "uuid" || referencedColumn.type === "uuid")
? "36"
: referencedColumn.length, // fix https://github.com/typeorm/typeorm/issues/3604
Expand Down Expand Up @@ -108,7 +109,7 @@ export class JunctionEntityMetadataBuilder {
propertyName: columnName,
options: {
length: !inverseReferencedColumn.length
&& (this.connection.driver instanceof MysqlDriver)
&& (this.connection.driver instanceof MysqlDriver || this.connection.driver instanceof AuroraDataApiDriver)
&& (inverseReferencedColumn.generationStrategy === "uuid" || inverseReferencedColumn.type === "uuid")
? "36"
: inverseReferencedColumn.length, // fix https://github.com/typeorm/typeorm/issues/3604
Expand Down
3 changes: 2 additions & 1 deletion src/metadata-builder/RelationJoinColumnBuilder.ts
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,7 @@ import {RelationMetadata} from "../metadata/RelationMetadata";
import {JoinColumnMetadataArgs} from "../metadata-args/JoinColumnMetadataArgs";
import {Connection} from "../connection/Connection";
import {OracleDriver} from "../driver/oracle/OracleDriver";
import {AuroraDataApiDriver} from "../driver/aurora-data-api/AuroraDataApiDriver";

/**
* Builds join column for the many-to-one and one-to-one owner relations.
Expand Down Expand Up @@ -145,7 +146,7 @@ export class RelationJoinColumnBuilder {
name: joinColumnName,
type: referencedColumn.type,
length: !referencedColumn.length
&& (this.connection.driver instanceof MysqlDriver)
&& (this.connection.driver instanceof MysqlDriver || this.connection.driver instanceof AuroraDataApiDriver)
&& (referencedColumn.generationStrategy === "uuid" || referencedColumn.type === "uuid")
? "36"
: referencedColumn.length, // fix https://github.com/typeorm/typeorm/issues/3604
Expand Down
3 changes: 2 additions & 1 deletion src/query-builder/DeleteQueryBuilder.ts
Original file line number Diff line number Diff line change
Expand Up @@ -15,6 +15,7 @@ import {SqljsDriver} from "../driver/sqljs/SqljsDriver";
import {MysqlDriver} from "../driver/mysql/MysqlDriver";
import {BroadcasterResult} from "../subscriber/BroadcasterResult";
import {EntitySchema} from "../index";
import {AuroraDataApiDriver} from "../driver/aurora-data-api/AuroraDataApiDriver";

/**
* Allows to build complex sql queries in a fashion way and execute those queries.
Expand Down Expand Up @@ -70,7 +71,7 @@ export class DeleteQueryBuilder<Entity> extends QueryBuilder<Entity> implements
const result = await queryRunner.query(sql, parameters);

const driver = queryRunner.connection.driver;
if (driver instanceof MysqlDriver) {
if (driver instanceof MysqlDriver || driver instanceof AuroraDataApiDriver) {
deleteResult.raw = result;
deleteResult.affected = result.affectedRows;

Expand Down
16 changes: 9 additions & 7 deletions src/query-builder/InsertQueryBuilder.ts
Original file line number Diff line number Diff line change
Expand Up @@ -17,6 +17,7 @@ import {SqljsDriver} from "../driver/sqljs/SqljsDriver";
import {BroadcasterResult} from "../subscriber/BroadcasterResult";
import {EntitySchema} from "../";
import {OracleDriver} from "../driver/oracle/OracleDriver";
import {AuroraDataApiDriver} from "../driver/aurora-data-api/AuroraDataApiDriver";

/**
* Allows to build complex sql queries in a fashion way and execute those queries.
Expand Down Expand Up @@ -247,7 +248,7 @@ export class InsertQueryBuilder<Entity> extends QueryBuilder<Entity> {
if (statement && statement.columns instanceof Array)
this.expressionMap.onUpdate.columns = statement.columns.map(column => `${column} = :${column}`).join(", ");
if (statement && statement.overwrite instanceof Array) {
if (this.connection.driver instanceof MysqlDriver) {
if (this.connection.driver instanceof MysqlDriver || this.connection.driver instanceof AuroraDataApiDriver) {
this.expressionMap.onUpdate.overwrite = statement.overwrite.map(column => `${column} = VALUES(${column})`).join(", ");
} else if (this.connection.driver instanceof PostgresDriver || this.connection.driver instanceof AbstractSqliteDriver || this.connection.driver instanceof CockroachDriver) {
this.expressionMap.onUpdate.overwrite = statement.overwrite.map(column => `${column} = EXCLUDED.${column}`).join(", ");
Expand All @@ -271,7 +272,7 @@ export class InsertQueryBuilder<Entity> extends QueryBuilder<Entity> {
const columnsExpression = this.createColumnNamesExpression();
let query = "INSERT ";

if (this.connection.driver instanceof MysqlDriver) {
if (this.connection.driver instanceof MysqlDriver || this.connection.driver instanceof AuroraDataApiDriver) {
query += `${this.expressionMap.onIgnore ? " IGNORE " : ""}`;
}

Expand All @@ -281,7 +282,7 @@ export class InsertQueryBuilder<Entity> extends QueryBuilder<Entity> {
if (columnsExpression) {
query += `(${columnsExpression})`;
} else {
if (!valuesExpression && this.connection.driver instanceof MysqlDriver) // special syntax for mysql DEFAULT VALUES insertion
if (!valuesExpression && (this.connection.driver instanceof MysqlDriver || this.connection.driver instanceof AuroraDataApiDriver)) // special syntax for mysql DEFAULT VALUES insertion
query += "()";
}

Expand All @@ -294,7 +295,7 @@ export class InsertQueryBuilder<Entity> extends QueryBuilder<Entity> {
if (valuesExpression) {
query += ` VALUES ${valuesExpression}`;
} else {
if (this.connection.driver instanceof MysqlDriver) { // special syntax for mysql DEFAULT VALUES insertion
if (this.connection.driver instanceof MysqlDriver || this.connection.driver instanceof AuroraDataApiDriver) { // special syntax for mysql DEFAULT VALUES insertion
query += " VALUES ()";
} else {
query += ` DEFAULT VALUES`;
Expand All @@ -308,7 +309,7 @@ export class InsertQueryBuilder<Entity> extends QueryBuilder<Entity> {
query += `${columns ? " ON CONFLICT " + conflict + " DO UPDATE SET " + columns : ""}`;
query += `${overwrite ? " ON CONFLICT " + conflict + " DO UPDATE SET " + overwrite : ""}`;
}
} else if (this.connection.driver instanceof MysqlDriver) {
} else if (this.connection.driver instanceof MysqlDriver || this.connection.driver instanceof AuroraDataApiDriver) {
if (this.expressionMap.onUpdate) {
const { overwrite, columns } = this.expressionMap.onUpdate;
query += `${columns ? " ON DUPLICATE KEY UPDATE " + columns : ""}`;
Expand Down Expand Up @@ -345,7 +346,8 @@ export class InsertQueryBuilder<Entity> extends QueryBuilder<Entity> {
if (column.isGenerated && column.generationStrategy === "increment"
&& !(this.connection.driver instanceof OracleDriver)
&& !(this.connection.driver instanceof AbstractSqliteDriver)
&& !(this.connection.driver instanceof MysqlDriver))
&& !(this.connection.driver instanceof MysqlDriver)
&& !(this.connection.driver instanceof AuroraDataApiDriver))
return false;

return true;
Expand Down Expand Up @@ -467,7 +469,7 @@ export class InsertQueryBuilder<Entity> extends QueryBuilder<Entity> {
// value = new ArrayParameter(value);

this.expressionMap.nativeParameters[paramName] = value;
if (this.connection.driver instanceof MysqlDriver && this.connection.driver.spatialTypes.indexOf(column.type) !== -1) {
if ((this.connection.driver instanceof MysqlDriver || this.connection.driver instanceof AuroraDataApiDriver) && this.connection.driver.spatialTypes.indexOf(column.type) !== -1) {
expression += `GeomFromText(${this.connection.driver.createParameter(paramName, parametersCount)})`;
} else if (this.connection.driver instanceof PostgresDriver && this.connection.driver.spatialTypes.indexOf(column.type) !== -1) {
if (column.srid != null) {
Expand Down
9 changes: 5 additions & 4 deletions src/query-builder/SelectQueryBuilder.ts
Original file line number Diff line number Diff line change
Expand Up @@ -34,6 +34,7 @@ import {BroadcasterResult} from "../subscriber/BroadcasterResult";
import {SelectQueryBuilderOption} from "./SelectQueryBuilderOption";
import {ObjectUtils} from "../util/ObjectUtils";
import {DriverUtils} from "../driver/DriverUtils";
import {AuroraDataApiDriver} from "../driver/aurora-data-api/AuroraDataApiDriver";

/**
* Allows to build complex sql queries in a fashion way and execute those queries.
Expand Down Expand Up @@ -1560,7 +1561,7 @@ export class SelectQueryBuilder<Entity> extends QueryBuilder<Entity> implements
if (offset)
return prefix + " OFFSET " + offset + " ROWS";

} else if (this.connection.driver instanceof MysqlDriver) {
} else if (this.connection.driver instanceof MysqlDriver || this.connection.driver instanceof AuroraDataApiDriver) {

if (limit && offset)
return " LIMIT " + limit + " OFFSET " + offset;
Expand Down Expand Up @@ -1606,7 +1607,7 @@ export class SelectQueryBuilder<Entity> extends QueryBuilder<Entity> implements
const driver = this.connection.driver;
switch (this.expressionMap.lockMode) {
case "pessimistic_read":
if (driver instanceof MysqlDriver) {
if (driver instanceof MysqlDriver || driver instanceof AuroraDataApiDriver) {
return " LOCK IN SHARE MODE";

} else if (driver instanceof PostgresDriver) {
Expand All @@ -1622,7 +1623,7 @@ export class SelectQueryBuilder<Entity> extends QueryBuilder<Entity> implements
throw new LockNotSupportedOnGivenDriverError();
}
case "pessimistic_write":
if (driver instanceof MysqlDriver || driver instanceof PostgresDriver || driver instanceof OracleDriver) {
if (driver instanceof MysqlDriver || driver instanceof AuroraDataApiDriver || driver instanceof PostgresDriver || driver instanceof OracleDriver) {
return " FOR UPDATE";

} else if (driver instanceof SqlServerDriver) {
Expand Down Expand Up @@ -1680,7 +1681,7 @@ export class SelectQueryBuilder<Entity> extends QueryBuilder<Entity> implements
const selection = this.expressionMap.selects.find(select => select.selection === aliasName + "." + column.propertyPath);
let selectionPath = this.escape(aliasName) + "." + this.escape(column.databaseName);
if (this.connection.driver.spatialTypes.indexOf(column.type) !== -1) {
if (this.connection.driver instanceof MysqlDriver)
if (this.connection.driver instanceof MysqlDriver || this.connection.driver instanceof AuroraDataApiDriver)
selectionPath = `AsText(${selectionPath})`;

if (this.connection.driver instanceof PostgresDriver)
Expand Down
Loading

0 comments on commit ee61c51

Please sign in to comment.