From 533b2950e10f3cdb8c7034f3913014d957f30071 Mon Sep 17 00:00:00 2001 From: "clayton@xdevel.com.br" Date: Wed, 8 Apr 2015 06:57:24 -0300 Subject: [PATCH 1/5] Aws RedShift portability Change CURRENT_SCHEMA to CURRENT_SCHEMA(), because aws redshift --- .../storage/relational/idiom/PostgresqlDialect.scala | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/activate-jdbc/src/main/scala/net/fwbrasil/activate/storage/relational/idiom/PostgresqlDialect.scala b/activate-jdbc/src/main/scala/net/fwbrasil/activate/storage/relational/idiom/PostgresqlDialect.scala index bcaa9497..7ee4b94c 100644 --- a/activate-jdbc/src/main/scala/net/fwbrasil/activate/storage/relational/idiom/PostgresqlDialect.scala +++ b/activate-jdbc/src/main/scala/net/fwbrasil/activate/storage/relational/idiom/PostgresqlDialect.scala @@ -47,27 +47,27 @@ class postgresqlDialect(pEscape: String => String, pNormalize: String => String) override def findTableStatement(tableName: String) = "SELECT COUNT(1) " + " FROM INFORMATION_SCHEMA.TABLES " + - " WHERE TABLE_SCHEMA = CURRENT_SCHEMA " + + " WHERE TABLE_SCHEMA = CURRENT_SCHEMA() " + " AND TABLE_NAME = '" + pNormalize(tableName) + "'" override def findTableColumnStatement(tableName: String, columnName: String) = "SELECT COUNT(1) " + " FROM INFORMATION_SCHEMA.COLUMNS " + - " WHERE TABLE_SCHEMA = CURRENT_SCHEMA " + + " WHERE TABLE_SCHEMA = CURRENT_SCHEMA() " + " AND TABLE_NAME = '" + pNormalize(tableName) + "'" + " AND COLUMN_NAME = '" + pNormalize(columnName) + "'" override def findIndexStatement(tableName: String, indexName: String) = "SELECT COUNT(1) " + " FROM pg_catalog.pg_indexes" + - " WHERE schemaname = CURRENT_SCHEMA" + + " WHERE schemaname = CURRENT_SCHEMA()" + " AND tablename = '" + pNormalize(tableName) + "'" + " AND indexname = '" + pNormalize(indexName) + "'" override def findConstraintStatement(tableName: String, constraintName: String): String = "SELECT COUNT(1) " + " FROM INFORMATION_SCHEMA.KEY_COLUMN_USAGE " + - " WHERE TABLE_SCHEMA = CURRENT_SCHEMA " + + " WHERE TABLE_SCHEMA = CURRENT_SCHEMA() " + " AND TABLE_NAME = '" + pNormalize(tableName) + "'" + " AND CONSTRAINT_NAME = '" + pNormalize(constraintName) + "'" From 8ba3858318b9ee68363cbe290b0adfa11f8d18b5 Mon Sep 17 00:00:00 2001 From: "clayton@xdevel.com.br" Date: Wed, 8 Apr 2015 09:17:52 -0300 Subject: [PATCH 2/5] - fork PostgresDialect into RedShiftDialect for AWS Redshift because : redshift uses lowercase in objects redshit dont use index --- .../relational/idiom/PostgresqlDialect.scala | 8 +- .../relational/idiom/RedshiftDialect.scala | 133 ++++++++++++++++++ 2 files changed, 137 insertions(+), 4 deletions(-) create mode 100644 activate-jdbc/src/main/scala/net/fwbrasil/activate/storage/relational/idiom/RedshiftDialect.scala diff --git a/activate-jdbc/src/main/scala/net/fwbrasil/activate/storage/relational/idiom/PostgresqlDialect.scala b/activate-jdbc/src/main/scala/net/fwbrasil/activate/storage/relational/idiom/PostgresqlDialect.scala index 7ee4b94c..b2e5a351 100644 --- a/activate-jdbc/src/main/scala/net/fwbrasil/activate/storage/relational/idiom/PostgresqlDialect.scala +++ b/activate-jdbc/src/main/scala/net/fwbrasil/activate/storage/relational/idiom/PostgresqlDialect.scala @@ -47,27 +47,27 @@ class postgresqlDialect(pEscape: String => String, pNormalize: String => String) override def findTableStatement(tableName: String) = "SELECT COUNT(1) " + " FROM INFORMATION_SCHEMA.TABLES " + - " WHERE TABLE_SCHEMA = CURRENT_SCHEMA() " + + " WHERE TABLE_SCHEMA = CURRENT_SCHEMA " + " AND TABLE_NAME = '" + pNormalize(tableName) + "'" override def findTableColumnStatement(tableName: String, columnName: String) = "SELECT COUNT(1) " + " FROM INFORMATION_SCHEMA.COLUMNS " + - " WHERE TABLE_SCHEMA = CURRENT_SCHEMA() " + + " WHERE TABLE_SCHEMA = CURRENT_SCHEMA" + " AND TABLE_NAME = '" + pNormalize(tableName) + "'" + " AND COLUMN_NAME = '" + pNormalize(columnName) + "'" override def findIndexStatement(tableName: String, indexName: String) = "SELECT COUNT(1) " + " FROM pg_catalog.pg_indexes" + - " WHERE schemaname = CURRENT_SCHEMA()" + + " WHERE schemaname = CURRENT_SCHEMA" + " AND tablename = '" + pNormalize(tableName) + "'" + " AND indexname = '" + pNormalize(indexName) + "'" override def findConstraintStatement(tableName: String, constraintName: String): String = "SELECT COUNT(1) " + " FROM INFORMATION_SCHEMA.KEY_COLUMN_USAGE " + - " WHERE TABLE_SCHEMA = CURRENT_SCHEMA() " + + " WHERE TABLE_SCHEMA = CURRENT_SCHEMA " + " AND TABLE_NAME = '" + pNormalize(tableName) + "'" + " AND CONSTRAINT_NAME = '" + pNormalize(constraintName) + "'" diff --git a/activate-jdbc/src/main/scala/net/fwbrasil/activate/storage/relational/idiom/RedshiftDialect.scala b/activate-jdbc/src/main/scala/net/fwbrasil/activate/storage/relational/idiom/RedshiftDialect.scala new file mode 100644 index 00000000..9d693146 --- /dev/null +++ b/activate-jdbc/src/main/scala/net/fwbrasil/activate/storage/relational/idiom/RedshiftDialect.scala @@ -0,0 +1,133 @@ +package net.fwbrasil.activate.storage.relational.idiom + +import scala.collection.mutable.{ Map => MutableMap } +import net.fwbrasil.activate.storage.marshalling.BooleanStorageValue +import net.fwbrasil.activate.storage.marshalling.DoubleStorageValue +import net.fwbrasil.activate.storage.marshalling.IntStorageValue +import net.fwbrasil.activate.storage.marshalling.StorageRenameTable +import net.fwbrasil.activate.storage.marshalling.StorageRemoveTable +import net.fwbrasil.activate.storage.marshalling.BigDecimalStorageValue +import net.fwbrasil.activate.storage.marshalling.LongStorageValue +import net.fwbrasil.activate.storage.marshalling.StringStorageValue +import net.fwbrasil.activate.storage.marshalling.StorageValue +import net.fwbrasil.activate.storage.marshalling.DateStorageValue +import net.fwbrasil.activate.storage.marshalling.StorageAddColumn +import net.fwbrasil.activate.storage.marshalling.ModifyStorageAction +import net.fwbrasil.activate.storage.marshalling.FloatStorageValue +import net.fwbrasil.activate.storage.marshalling.StorageAddIndex +import net.fwbrasil.activate.storage.marshalling.StorageAddReference +import net.fwbrasil.activate.storage.marshalling.ReferenceStorageValue +import net.fwbrasil.activate.storage.marshalling.StorageRenameColumn +import net.fwbrasil.activate.storage.marshalling.StorageCreateTable +import net.fwbrasil.activate.storage.marshalling.StorageRemoveReference +import net.fwbrasil.activate.storage.marshalling.StorageRemoveColumn +import net.fwbrasil.activate.storage.marshalling.ByteArrayStorageValue +import net.fwbrasil.activate.storage.marshalling.StorageRemoveIndex +import net.fwbrasil.activate.storage.marshalling.ListStorageValue +import net.fwbrasil.activate.storage.marshalling.StorageCreateListTable +import net.fwbrasil.activate.storage.marshalling.StorageRemoveListTable +import net.fwbrasil.activate.storage.marshalling.IntStorageValue +import net.fwbrasil.activate.statement.query.OrderByCriteria +import net.fwbrasil.activate.statement.query.orderByAscendingDirection +import net.fwbrasil.activate.storage.marshalling.StorageModifyColumnType + +object redshiftDialect extends postgresqlDialect(pEscape = string => "\"" + string + "\"", pNormalize = string => string.toLowerCase) { + def apply(escape: String => String = string => "\"" + string + "\"", normalize: String => String = string => string.toLowerCase) = + new postgresqlDialect(escape, normalize) +} + +class redshiftDialect(pEscape: String => String, pNormalize: String => String) extends postgresqlDialect (pEscape = string => "\"" + string + "\"", pNormalize = string => string.toLowerCase) { + + override def escape(string: String) = + pEscape(pNormalize(string)) + + + override def findTableStatement(tableName: String) = + "SELECT COUNT(1) " + + " FROM INFORMATION_SCHEMA.TABLES " + + " WHERE TABLE_SCHEMA = CURRENT_SCHEMA() " + + " AND TABLE_NAME = '" + pNormalize(tableName) + "'" + + override def findTableColumnStatement(tableName: String, columnName: String) = + "SELECT COUNT(1) " + + " FROM INFORMATION_SCHEMA.COLUMNS " + + " WHERE TABLE_SCHEMA = CURRENT_SCHEMA() " + + " AND TABLE_NAME = '" + pNormalize(tableName) + "'" + + " AND COLUMN_NAME = '" + pNormalize(columnName) + "'" + + override def findIndexStatement(tableName: String, indexName: String) = + "SELECT COUNT(1) " + + " FROM pg_catalog.pg_indexes" + + " WHERE schemaname = CURRENT_SCHEMA()" + + " AND tablename = '" + pNormalize(tableName) + "'" + + " AND indexname = '" + pNormalize(indexName) + "'" + + override def findConstraintStatement(tableName: String, constraintName: String): String = + "SELECT COUNT(1) " + + " FROM INFORMATION_SCHEMA.KEY_COLUMN_USAGE " + + " WHERE TABLE_SCHEMA = CURRENT_SCHEMA() " + + " AND TABLE_NAME = '" + pNormalize(tableName) + "'" + + " AND CONSTRAINT_NAME = '" + pNormalize(constraintName) + "'" + + override def toSqlDdl(action: ModifyStorageAction): String = { + action match { + case StorageRemoveListTable(listTableName, ifNotExists) => + "DROP TABLE " + escape(listTableName) + case StorageCreateListTable(ownerTableName, ownerIdColumn, listTableName, valueColumn, orderColumn, ifNotExists) => + "CREATE TABLE " + escape(listTableName) + "(\n" + + " " + escape("owner") + " " + columnType(ownerIdColumn) + " REFERENCES " + escape(ownerTableName) + "(ID),\n" + + toSqlDdl(valueColumn) + ", " + toSqlDdl(orderColumn) + + ")" + case StorageCreateTable(tableName, idColumn, columns, ifNotExists) => + if(tableName.toLowerCase == "caseclassentity") + println(1) + "CREATE TABLE " + escape(tableName) + "(\n" + + " ID " + columnType(idColumn) + " PRIMARY KEY" + (if (columns.nonEmpty) ",\n" else "") + + columns.map(toSqlDdl).mkString(", \n") + + ")" + case StorageRenameTable(oldName, newName, ifExists) => + "ALTER TABLE " + escape(oldName) + " RENAME TO " + escape(newName) + case StorageRemoveTable(name, ifExists, isCascade) => + "DROP TABLE " + escape(name) + (if (isCascade) " CASCADE" else "") + case StorageAddColumn(tableName, column, ifNotExists) => + "ALTER TABLE " + escape(tableName) + " ADD " + toSqlDdl(column) + case StorageRenameColumn(tableName, oldName, column, ifExists) => + "ALTER TABLE " + escape(tableName) + " RENAME COLUMN " + escape(oldName) + " TO " + escape(column.name) + case StorageModifyColumnType(tableName, column, ifExists) => + "ALTER TABLE " + escape(tableName) + " ALTER COLUMN " + escape(column.name) + " SET DATA TYPE " + columnType(column) + case StorageRemoveColumn(tableName, name, ifExists) => + "ALTER TABLE " + escape(tableName) + " DROP COLUMN " + escape(name) + } + } + + override def concat(strings: String*) = + "CONCAT(" + strings.mkString(", ") + ")" + + override def toSqlDml(criteria: OrderByCriteria[_])(implicit binds: MutableMap[StorageValue, String]): String = + super.toSqlDml(criteria) + (if (criteria.direction == orderByAscendingDirection) " NULLS FIRST" else " NULLS LAST") + + override def toSqlDdl(storageValue: StorageValue): String = + storageValue match { + case value: IntStorageValue => + "INTEGER" + case value: LongStorageValue => + "DECIMAL" + case value: BooleanStorageValue => + "BOOLEAN" + case value: StringStorageValue => + "TEXT" + case value: FloatStorageValue => + "DOUBLE PRECISION" + case value: DateStorageValue => + "TIMESTAMP" + case value: DoubleStorageValue => + "DOUBLE PRECISION" + case value: BigDecimalStorageValue => + "DECIMAL" + case value: ListStorageValue => + "VARCHAR(1)" + case value: ByteArrayStorageValue => + "BYTEA" + } +} + From 520c3bf1c348802df7646516cf960ad977d1f098 Mon Sep 17 00:00:00 2001 From: "clayton@xdevel.com.br" Date: Wed, 8 Apr 2015 10:54:45 -0300 Subject: [PATCH 3/5] adjust on RedShift with case in blank if exists constraints in migrations --- .../storage/relational/idiom/RedshiftDialect.scala | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/activate-jdbc/src/main/scala/net/fwbrasil/activate/storage/relational/idiom/RedshiftDialect.scala b/activate-jdbc/src/main/scala/net/fwbrasil/activate/storage/relational/idiom/RedshiftDialect.scala index 9d693146..8ec5b485 100644 --- a/activate-jdbc/src/main/scala/net/fwbrasil/activate/storage/relational/idiom/RedshiftDialect.scala +++ b/activate-jdbc/src/main/scala/net/fwbrasil/activate/storage/relational/idiom/RedshiftDialect.scala @@ -97,9 +97,19 @@ class redshiftDialect(pEscape: String => String, pNormalize: String => String) e "ALTER TABLE " + escape(tableName) + " ALTER COLUMN " + escape(column.name) + " SET DATA TYPE " + columnType(column) case StorageRemoveColumn(tableName, name, ifExists) => "ALTER TABLE " + escape(tableName) + " DROP COLUMN " + escape(name) + //redshift dont contains indexes, constraints and fk's + case StorageAddIndex(tableName, columns, indexName, ifNotExists, unique) => + "" + case StorageRemoveIndex(tableName, columnName, name, ifExists) => + "" + case StorageAddReference(tableName, columnName, referencedTable, constraintName, ifNotExists) => + "" + case StorageRemoveReference(tableName, columnName, referencedTable, constraintName, ifNotExists) => + "" } } + override def concat(strings: String*) = "CONCAT(" + strings.mkString(", ") + ")" From 76c7309eaa8cda058d3881e584d552e4c871cc5f Mon Sep 17 00:00:00 2001 From: "clayton@xdevel.com.br" Date: Wed, 8 Apr 2015 18:00:18 -0300 Subject: [PATCH 4/5] - problem with extend, solved change object extends to local class - tested in aws enviroment --- .../relational/idiom/RedshiftDialect.scala | 19 ++++++++----------- 1 file changed, 8 insertions(+), 11 deletions(-) diff --git a/activate-jdbc/src/main/scala/net/fwbrasil/activate/storage/relational/idiom/RedshiftDialect.scala b/activate-jdbc/src/main/scala/net/fwbrasil/activate/storage/relational/idiom/RedshiftDialect.scala index 8ec5b485..a4ea3e5a 100644 --- a/activate-jdbc/src/main/scala/net/fwbrasil/activate/storage/relational/idiom/RedshiftDialect.scala +++ b/activate-jdbc/src/main/scala/net/fwbrasil/activate/storage/relational/idiom/RedshiftDialect.scala @@ -1,5 +1,6 @@ package net.fwbrasil.activate.storage.relational.idiom +import scala.collection.immutable.Stream.Empty import scala.collection.mutable.{ Map => MutableMap } import net.fwbrasil.activate.storage.marshalling.BooleanStorageValue import net.fwbrasil.activate.storage.marshalling.DoubleStorageValue @@ -31,12 +32,12 @@ import net.fwbrasil.activate.statement.query.OrderByCriteria import net.fwbrasil.activate.statement.query.orderByAscendingDirection import net.fwbrasil.activate.storage.marshalling.StorageModifyColumnType -object redshiftDialect extends postgresqlDialect(pEscape = string => "\"" + string + "\"", pNormalize = string => string.toLowerCase) { +object redshiftDialect extends redshiftDialect(pEscape = string => "\"" + string + "\"", pNormalize = string => string.toLowerCase) { def apply(escape: String => String = string => "\"" + string + "\"", normalize: String => String = string => string.toLowerCase) = - new postgresqlDialect(escape, normalize) + new redshiftDialect(escape, normalize) } -class redshiftDialect(pEscape: String => String, pNormalize: String => String) extends postgresqlDialect (pEscape = string => "\"" + string + "\"", pNormalize = string => string.toLowerCase) { +class redshiftDialect(pEscape: String => String, pNormalize: String => String) extends postgresqlDialect (pEscape = string => "\"" + string + "\"", pNormalize = string => string) { override def escape(string: String) = pEscape(pNormalize(string)) @@ -98,14 +99,10 @@ class redshiftDialect(pEscape: String => String, pNormalize: String => String) e case StorageRemoveColumn(tableName, name, ifExists) => "ALTER TABLE " + escape(tableName) + " DROP COLUMN " + escape(name) //redshift dont contains indexes, constraints and fk's - case StorageAddIndex(tableName, columns, indexName, ifNotExists, unique) => - "" - case StorageRemoveIndex(tableName, columnName, name, ifExists) => - "" - case StorageAddReference(tableName, columnName, referencedTable, constraintName, ifNotExists) => - "" - case StorageRemoveReference(tableName, columnName, referencedTable, constraintName, ifNotExists) => - "" + case StorageAddIndex(tableName, columns, indexName, ifNotExists, unique) => "" + case StorageRemoveIndex(tableName, columnName, name, ifExists) => "" + case StorageAddReference(tableName, columnName, referencedTable, constraintName, ifNotExists) => "" + case StorageRemoveReference(tableName, columnName, referencedTable, constraintName, ifNotExists) => "" } } From 026a0c0e8a46114c562b171cee9169b0673d8df5 Mon Sep 17 00:00:00 2001 From: "clayton@xdevel.com.br" Date: Sat, 11 Apr 2015 17:34:09 -0300 Subject: [PATCH 5/5] - remove constraints and index verification with "select(1)" because the redshift dont use this types --- .../relational/idiom/RedshiftDialect.scala | 28 ++++--------------- 1 file changed, 5 insertions(+), 23 deletions(-) diff --git a/activate-jdbc/src/main/scala/net/fwbrasil/activate/storage/relational/idiom/RedshiftDialect.scala b/activate-jdbc/src/main/scala/net/fwbrasil/activate/storage/relational/idiom/RedshiftDialect.scala index a4ea3e5a..0ebf52fb 100644 --- a/activate-jdbc/src/main/scala/net/fwbrasil/activate/storage/relational/idiom/RedshiftDialect.scala +++ b/activate-jdbc/src/main/scala/net/fwbrasil/activate/storage/relational/idiom/RedshiftDialect.scala @@ -43,32 +43,14 @@ class redshiftDialect(pEscape: String => String, pNormalize: String => String) e pEscape(pNormalize(string)) - override def findTableStatement(tableName: String) = - "SELECT COUNT(1) " + - " FROM INFORMATION_SCHEMA.TABLES " + - " WHERE TABLE_SCHEMA = CURRENT_SCHEMA() " + - " AND TABLE_NAME = '" + pNormalize(tableName) + "'" - - override def findTableColumnStatement(tableName: String, columnName: String) = - "SELECT COUNT(1) " + - " FROM INFORMATION_SCHEMA.COLUMNS " + - " WHERE TABLE_SCHEMA = CURRENT_SCHEMA() " + - " AND TABLE_NAME = '" + pNormalize(tableName) + "'" + - " AND COLUMN_NAME = '" + pNormalize(columnName) + "'" + //dont exists index override def findIndexStatement(tableName: String, indexName: String) = - "SELECT COUNT(1) " + - " FROM pg_catalog.pg_indexes" + - " WHERE schemaname = CURRENT_SCHEMA()" + - " AND tablename = '" + pNormalize(tableName) + "'" + - " AND indexname = '" + pNormalize(indexName) + "'" - + "SELECT COUNT(1) " + //dont exists constraints override def findConstraintStatement(tableName: String, constraintName: String): String = - "SELECT COUNT(1) " + - " FROM INFORMATION_SCHEMA.KEY_COLUMN_USAGE " + - " WHERE TABLE_SCHEMA = CURRENT_SCHEMA() " + - " AND TABLE_NAME = '" + pNormalize(tableName) + "'" + - " AND CONSTRAINT_NAME = '" + pNormalize(constraintName) + "'" + "SELECT COUNT(1) " + override def toSqlDdl(action: ModifyStorageAction): String = { action match {