From fd2a0237adb095af9391f4939bf49f907366104b Mon Sep 17 00:00:00 2001 From: Femi3211 Date: Thu, 13 Jul 2023 14:25:23 +0200 Subject: [PATCH 1/3] Added: Templating for GCSpanner --- .../targets/spanner/SpannerDDLGenerator.java | 84 ++++++++++--------- .../templates/spanner/column/add.sqlt | 1 + .../spanner/column/alter_column_null.sqlt | 0 .../spanner/column/alter_column_type.sqlt | 0 .../templates/spanner/column/drop.sqlt | 1 + .../templates/spanner/foreignkey/create.sqlt | 1 + .../templates/spanner/foreignkey/drop.sqlt | 1 + .../templates/spanner/schema/create.sqlt | 0 .../spanner/table/alter_add_primary_key.sqlt | 6 ++ .../spanner/table/alter_drop_primary_key.sqlt | 6 ++ .../templates/spanner/table/create.sqlt | 7 ++ .../templates/spanner/table/drop.sqlt | 1 + .../templates/spanner/table/interleave.sqlt | 1 + .../rosetta/ddl/test/SpannerDDLTest.java | 14 ++-- 14 files changed, 76 insertions(+), 47 deletions(-) create mode 100644 ddl/src/main/resources/templates/spanner/column/add.sqlt create mode 100644 ddl/src/main/resources/templates/spanner/column/alter_column_null.sqlt create mode 100644 ddl/src/main/resources/templates/spanner/column/alter_column_type.sqlt create mode 100644 ddl/src/main/resources/templates/spanner/column/drop.sqlt create mode 100644 ddl/src/main/resources/templates/spanner/foreignkey/create.sqlt create mode 100644 ddl/src/main/resources/templates/spanner/foreignkey/drop.sqlt create mode 100644 ddl/src/main/resources/templates/spanner/schema/create.sqlt create mode 100644 ddl/src/main/resources/templates/spanner/table/alter_add_primary_key.sqlt create mode 100644 ddl/src/main/resources/templates/spanner/table/alter_drop_primary_key.sqlt create mode 100644 ddl/src/main/resources/templates/spanner/table/create.sqlt create mode 100644 ddl/src/main/resources/templates/spanner/table/drop.sqlt create mode 100644 ddl/src/main/resources/templates/spanner/table/interleave.sqlt diff --git a/ddl/src/main/java/com/adaptivescale/rosetta/ddl/targets/spanner/SpannerDDLGenerator.java b/ddl/src/main/java/com/adaptivescale/rosetta/ddl/targets/spanner/SpannerDDLGenerator.java index be7f0f21..60629568 100644 --- a/ddl/src/main/java/com/adaptivescale/rosetta/ddl/targets/spanner/SpannerDDLGenerator.java +++ b/ddl/src/main/java/com/adaptivescale/rosetta/ddl/targets/spanner/SpannerDDLGenerator.java @@ -22,6 +22,12 @@ type = RosettaModuleTypes.DDL_GENERATOR ) public class SpannerDDLGenerator implements DDL { + private final static String TABLE_CREATE_TEMPLATE = "spanner/table/create"; + private final static String TABLE_DROP_TEMPLATE = "spanner/table/drop"; + private final static String FOREIGN_KEY_CREATE_TEMPLATE = "spanner/foreignkey/create"; + private final static String FOREIGN_KEY_DROP_TEMPLATE = "spanner/foreignkey/drop"; + private final static String COLUMN_ADD_TEMPLATE = "spanner/column/add"; + private final static String COLUMN_DROP_TEMPLATE = "spanner/column/drop"; private static String VIEW_CREATE_TEMPLATE = "spanner/view/create"; private static String VIEW_ALTER_TEMPLATE = "spanner/view/alter"; private static String VIEW_DROP_TEMPLATE = "spanner/view/drop"; @@ -39,44 +45,28 @@ public String createTable(Table table, boolean dropTableIfExists) { throw new RuntimeException(String.format("Table %s has no primary key. Spanner requires tables to have primary key.", table.getName())); } List definitions = table.getColumns().stream().map(this::createColumn).collect(Collectors.toList()); - + Map createParams = new HashMap<>(); Optional primaryKeysForTable = createPrimaryKeysForTable(table); String definitionAsString = String.join(", ", definitions); StringBuilder stringBuilder = new StringBuilder(); if (dropTableIfExists) { - stringBuilder.append("DROP TABLE IF EXISTS "); - if (table.getSchema() != null && !table.getSchema().isBlank()) { - stringBuilder.append("`").append(table.getSchema()).append("`."); - } - stringBuilder.append(DEFAULT_WRAPPER).append(table.getName()).append(DEFAULT_WRAPPER).append("; \n"); + stringBuilder.append(dropTable(table)); } - stringBuilder.append("CREATE TABLE "); - - if (table.getSchema() != null && !table.getSchema().isBlank()) { - stringBuilder.append(DEFAULT_WRAPPER) - .append(table.getSchema()).append(DEFAULT_WRAPPER).append("."); - } - - stringBuilder.append(DEFAULT_WRAPPER).append(table.getName()).append(DEFAULT_WRAPPER) - .append("(").append(definitionAsString).append(")"); - if(primaryKeysForTable.isPresent()) { - stringBuilder.append(" "); - stringBuilder.append(primaryKeysForTable.get()); - } if (table.getInterleave() != null) { - stringBuilder.append(",\r"); - stringBuilder.append("INTERLEAVE IN PARENT ") - .append(table.getInterleave().getParentName()); - final String onDeleteAction = table.getInterleave().getOnDeleteAction(); if (onDeleteAction != null && !onDeleteAction.isEmpty()) { - stringBuilder.append(" ON DELETE ").append(table.getInterleave().getOnDeleteAction()); + createParams.put("deleteRule", String.format("ON DELETE %s", table.getInterleave().getOnDeleteAction())); } + createParams.put("interleavedTable", table.getInterleave().getParentName()); } - stringBuilder.append(";"); + createParams.put("schemaName", table.getSchema()); + createParams.put("tableName", table.getName()); + createParams.put("tableCode", definitionAsString); + primaryKeysForTable.ifPresent(s -> createParams.put("primaryKeyDefinition", s)); + stringBuilder.append(TemplateEngine.process(TABLE_CREATE_TEMPLATE, createParams)); return stringBuilder.toString(); } @@ -158,12 +148,16 @@ public String createForeignKey(ForeignKey foreignKey) { if (foreignKey.getName() == null) { return ""; } - return "ALTER TABLE" + handleNullSchema(foreignKey.getSchema(), foreignKey.getTableName()) + " ADD CONSTRAINT " - + foreignKey.getName() + " FOREIGN KEY ("+ DEFAULT_WRAPPER + foreignKey.getColumnName() + DEFAULT_WRAPPER +") REFERENCES " - + foreignKey.getPrimaryTableName() -// + handleNullSchema(foreignKey.getPrimaryTableSchema(), foreignKey.getPrimaryTableName()) - + "("+ DEFAULT_WRAPPER + foreignKey.getPrimaryColumnName()+ DEFAULT_WRAPPER + ")" - + foreignKeyDeleteRuleSanitation(foreignKeyDeleteRule(foreignKey)) + ";\r"; + Map params = new HashMap<>(); + params.put("schemaName", foreignKey.getSchema()); + params.put("tableName", foreignKey.getTableName()); + params.put("foreignkeyColumn", foreignKey.getColumnName()); + params.put("primaryTableSchema", foreignKey.getPrimaryTableSchema()); + params.put("primaryTableName", foreignKey.getPrimaryTableName()); + params.put("foreignKeyPrimaryColumnName", foreignKey.getPrimaryColumnName()); + params.put("foreignkeyName", foreignKey.getName()); + params.put("deleteRule", foreignKeyDeleteRule(foreignKey)); + return TemplateEngine.process(FOREIGN_KEY_CREATE_TEMPLATE, params); } @Override @@ -200,9 +194,11 @@ public String dropColumn(ColumnChange change) { Table table = change.getTable(); Column actual = change.getActual(); - return "ALTER TABLE" + - handleNullSchema(table.getSchema(), table.getName()) + " DROP COLUMN "+ DEFAULT_WRAPPER + - actual.getName() + DEFAULT_WRAPPER +";"; + Map params = new HashMap<>(); + params.put("schemaName", table.getSchema()); + params.put("tableName", table.getName()); + params.put("columnName", actual.getName()); + return TemplateEngine.process(COLUMN_DROP_TEMPLATE, params); } @Override @@ -210,15 +206,19 @@ public String addColumn(ColumnChange change) { Table table = change.getTable(); Column expected = change.getExpected(); - return "ALTER TABLE" + - handleNullSchema(table.getSchema(), table.getName()) + - " ADD COLUMN " + - columnSQLDecoratorFactory.decoratorFor(expected).expressSQl() + ";"; + Map params = new HashMap<>(); + params.put("schemaName", table.getSchema()); + params.put("tableName", table.getName()); + params.put("columnDefinition", columnSQLDecoratorFactory.decoratorFor(expected).expressSQl()); + return TemplateEngine.process(COLUMN_ADD_TEMPLATE, params); } @Override public String dropTable(Table actual) { - return "DROP TABLE" + handleNullSchema(actual.getSchema(), actual.getName()) + ";"; + Map params = new HashMap<>(); + params.put("schemaName", actual.getSchema()); + params.put("tableName", actual.getName()); + return TemplateEngine.process(TABLE_DROP_TEMPLATE, params); } @Override @@ -228,7 +228,11 @@ public String alterForeignKey(ForeignKeyChange change) { @Override public String dropForeignKey(ForeignKey actual) { - return "ALTER TABLE" + handleNullSchema(actual.getSchema(), actual.getTableName()) + " DROP CONSTRAINT " + DEFAULT_WRAPPER + actual.getName() + DEFAULT_WRAPPER + ";"; + Map params = new HashMap<>(); + params.put("schemaName", actual.getSchema()); + params.put("tableName", actual.getTableName()); + params.put("foreignkeyName", actual.getName()); + return TemplateEngine.process(FOREIGN_KEY_DROP_TEMPLATE, params); } @Override diff --git a/ddl/src/main/resources/templates/spanner/column/add.sqlt b/ddl/src/main/resources/templates/spanner/column/add.sqlt new file mode 100644 index 00000000..f2a6679f --- /dev/null +++ b/ddl/src/main/resources/templates/spanner/column/add.sqlt @@ -0,0 +1 @@ +ALTER TABLE [(${tableName})] ADD COLUMN [(${columnDefinition})]; diff --git a/ddl/src/main/resources/templates/spanner/column/alter_column_null.sqlt b/ddl/src/main/resources/templates/spanner/column/alter_column_null.sqlt new file mode 100644 index 00000000..e69de29b diff --git a/ddl/src/main/resources/templates/spanner/column/alter_column_type.sqlt b/ddl/src/main/resources/templates/spanner/column/alter_column_type.sqlt new file mode 100644 index 00000000..e69de29b diff --git a/ddl/src/main/resources/templates/spanner/column/drop.sqlt b/ddl/src/main/resources/templates/spanner/column/drop.sqlt new file mode 100644 index 00000000..004e724b --- /dev/null +++ b/ddl/src/main/resources/templates/spanner/column/drop.sqlt @@ -0,0 +1 @@ +ALTER TABLE [(${tableName})] DROP COLUMN [(${columnName})]; diff --git a/ddl/src/main/resources/templates/spanner/foreignkey/create.sqlt b/ddl/src/main/resources/templates/spanner/foreignkey/create.sqlt new file mode 100644 index 00000000..f2689157 --- /dev/null +++ b/ddl/src/main/resources/templates/spanner/foreignkey/create.sqlt @@ -0,0 +1 @@ +ALTER TABLE [(${tableName})] ADD CONSTRAINT [(${foreignkeyName})] FOREIGN KEY ("[(${foreignkeyColumn})]") REFERENCES [(${primaryTableName})]("[(${foreignKeyPrimaryColumnName})]") [(${deleteRule})]; diff --git a/ddl/src/main/resources/templates/spanner/foreignkey/drop.sqlt b/ddl/src/main/resources/templates/spanner/foreignkey/drop.sqlt new file mode 100644 index 00000000..6ba86f9a --- /dev/null +++ b/ddl/src/main/resources/templates/spanner/foreignkey/drop.sqlt @@ -0,0 +1 @@ +ALTER TABLE [(${tableName})] DROP CONSTRAINT [(${foreignkeyName})]; diff --git a/ddl/src/main/resources/templates/spanner/schema/create.sqlt b/ddl/src/main/resources/templates/spanner/schema/create.sqlt new file mode 100644 index 00000000..e69de29b diff --git a/ddl/src/main/resources/templates/spanner/table/alter_add_primary_key.sqlt b/ddl/src/main/resources/templates/spanner/table/alter_add_primary_key.sqlt new file mode 100644 index 00000000..ad2d0504 --- /dev/null +++ b/ddl/src/main/resources/templates/spanner/table/alter_add_primary_key.sqlt @@ -0,0 +1,6 @@ +[# th:if="${schemaName} == null or ${schemaName} == ''"] +ALTER TABLE "[(${tableName})]" ADD [(${primaryKeyDefinition})]; +[/] +[# th:if="${schemaName} != null and ${schemaName} != ''"] +ALTER TABLE "[(${schemaName})]"."[(${tableName})]" ADD [(${primaryKeyDefinition})]; +[/] \ No newline at end of file diff --git a/ddl/src/main/resources/templates/spanner/table/alter_drop_primary_key.sqlt b/ddl/src/main/resources/templates/spanner/table/alter_drop_primary_key.sqlt new file mode 100644 index 00000000..6103b4a0 --- /dev/null +++ b/ddl/src/main/resources/templates/spanner/table/alter_drop_primary_key.sqlt @@ -0,0 +1,6 @@ +[# th:if="${schemaName} == null or ${schemaName} == ''"] +ALTER TABLE "[(${tableName})]" DROP CONSTRAINT "[(${tableName})]_pkey"; +[/] +[# th:if="${schemaName} != null and ${schemaName} != ''"] +ALTER TABLE "[(${schemaName})]"."[(${tableName})]" DROP CONSTRAINT "[(${tableName})]_pkey"; +[/] \ No newline at end of file diff --git a/ddl/src/main/resources/templates/spanner/table/create.sqlt b/ddl/src/main/resources/templates/spanner/table/create.sqlt new file mode 100644 index 00000000..797534cf --- /dev/null +++ b/ddl/src/main/resources/templates/spanner/table/create.sqlt @@ -0,0 +1,7 @@ +[# th:if="${interleavedTable} == null or ${interleavedTable} == ''"] +CREATE TABLE [(${tableName})]([(${tableCode})]) [(${primaryKeyDefinition})]; +[/] +[# th:if="${interleavedTable} != null and ${interleavedTable} != ''"] +CREATE TABLE [(${tableName})]([(${tableCode})]) [(${primaryKeyDefinition})], +INTERLEAVE IN PARENT [(${interleavedTable})] [(${deleteRule})]; +[/] \ No newline at end of file diff --git a/ddl/src/main/resources/templates/spanner/table/drop.sqlt b/ddl/src/main/resources/templates/spanner/table/drop.sqlt new file mode 100644 index 00000000..f54a1931 --- /dev/null +++ b/ddl/src/main/resources/templates/spanner/table/drop.sqlt @@ -0,0 +1 @@ +DROP TABLE [(${tableName})]; diff --git a/ddl/src/main/resources/templates/spanner/table/interleave.sqlt b/ddl/src/main/resources/templates/spanner/table/interleave.sqlt new file mode 100644 index 00000000..347ba7d2 --- /dev/null +++ b/ddl/src/main/resources/templates/spanner/table/interleave.sqlt @@ -0,0 +1 @@ +CREATE TABLE [(${tableName})]([(${tableCode})]) ; \ No newline at end of file diff --git a/ddl/src/test/java/com/adaptivescale/rosetta/ddl/test/SpannerDDLTest.java b/ddl/src/test/java/com/adaptivescale/rosetta/ddl/test/SpannerDDLTest.java index 1c53cc46..fb75968c 100644 --- a/ddl/src/test/java/com/adaptivescale/rosetta/ddl/test/SpannerDDLTest.java +++ b/ddl/src/test/java/com/adaptivescale/rosetta/ddl/test/SpannerDDLTest.java @@ -21,39 +21,39 @@ public class SpannerDDLTest { @Test public void addInterleaveTable() throws IOException { String ddl = generateDDL("add_interleave_table"); - Assertions.assertEquals("CREATE TABLE AlbumsNew(SingerId INT64 NOT NULL , AlbumId INT64 NOT NULL , AlbumTitle STRING(MAX)) PRIMARY KEY (SingerId, AlbumId),\r" + - "INTERLEAVE IN PARENT Singers ON DELETE CASCADE;", ddl); + Assertions.assertEquals("CREATE TABLE AlbumsNew(SingerId INT64 NOT NULL , AlbumId INT64 NOT NULL , AlbumTitle STRING(MAX)) PRIMARY KEY (SingerId, AlbumId),\n" + + "INTERLEAVE IN PARENT Singers ON DELETE CASCADE;\n", ddl.replaceAll("(?m)^[ \t]*\r?\n", "")); } @Test public void createDB() throws IOException { String ddl = generateDDL("clean_database"); - Assertions.assertEquals("CREATE TABLE Singers(SingerId STRING(1024) NOT NULL , FirstName STRING(1024), LastName STRING(1024)) PRIMARY KEY (SingerId);CREATE VIEW `SingerNames` SQL SECURITY INVOKER AS SELECT Singers.SingerId AS SingerId, Singers.FirstName || ' ' || Singers.LastName AS Name FROM Singers ;CREATE VIEW `NamesSinger` SQL SECURITY INVOKER AS SELECT Singers.SingerId AS SingerId, Singers.FirstName, Singers.LastName FROM Singers ;", + Assertions.assertEquals(" CREATE TABLE Singers(SingerId STRING(1024) NOT NULL , FirstName STRING(1024), LastName STRING(1024)) PRIMARY KEY (SingerId); CREATE VIEW `SingerNames` SQL SECURITY INVOKER AS SELECT Singers.SingerId AS SingerId, Singers.FirstName || ' ' || Singers.LastName AS Name FROM Singers ;CREATE VIEW `NamesSinger` SQL SECURITY INVOKER AS SELECT Singers.SingerId AS SingerId, Singers.FirstName, Singers.LastName FROM Singers ;", ddl.replaceAll("(\\n)", " ").replaceAll("(\\r)", "")); } @Test public void addTable() throws IOException { String ddl = generateDDL("add_table"); - Assertions.assertEquals("CREATE TABLE Logs(LogId INT64 NOT NULL , Description STRING(1024)) PRIMARY KEY (LogId);", ddl); + Assertions.assertEquals("CREATE TABLE Logs(LogId INT64 NOT NULL , Description STRING(1024)) PRIMARY KEY (LogId);\n", ddl.replaceAll("(?m)^[ \t]*\r?\n", "")); } @Test public void dropTable() throws IOException { String ddl = generateDDL("drop_table"); - Assertions.assertEquals("DROP TABLE Logs;", ddl); + Assertions.assertEquals("DROP TABLE Logs;\n", ddl.replaceAll("(?m)^[ \t]*\r?\n", "")); } @Test public void addColumn() throws IOException { String ddl = generateDDL("add_column"); - Assertions.assertEquals("ALTER TABLE Logs ADD COLUMN Status STRING(1024);", ddl); + Assertions.assertEquals("ALTER TABLE Logs ADD COLUMN Status STRING(1024);\n", ddl.replaceAll("(?m)^[ \t]*\r?\n", "")); } @Test public void dropColumn() throws IOException { String ddl = generateDDL("drop_column"); - Assertions.assertEquals("ALTER TABLE Logs DROP COLUMN Status;", ddl); + Assertions.assertEquals("ALTER TABLE Logs DROP COLUMN Status;\n", ddl.replaceAll("(?m)^[ \t]*\r?\n", "")); } @Test From 625378a6f1af968c016abe2f73bb99b087ea48c5 Mon Sep 17 00:00:00 2001 From: Femi3211 Date: Thu, 13 Jul 2023 16:08:10 +0200 Subject: [PATCH 2/3] Modified: Removed unnecessary file --- ddl/src/main/resources/templates/spanner/table/interleave.sqlt | 1 - 1 file changed, 1 deletion(-) delete mode 100644 ddl/src/main/resources/templates/spanner/table/interleave.sqlt diff --git a/ddl/src/main/resources/templates/spanner/table/interleave.sqlt b/ddl/src/main/resources/templates/spanner/table/interleave.sqlt deleted file mode 100644 index 347ba7d2..00000000 --- a/ddl/src/main/resources/templates/spanner/table/interleave.sqlt +++ /dev/null @@ -1 +0,0 @@ -CREATE TABLE [(${tableName})]([(${tableCode})]) ; \ No newline at end of file From c8c3cadf7e760966153f40c39c07c071b85b6c32 Mon Sep 17 00:00:00 2001 From: Femi3211 Date: Fri, 14 Jul 2023 11:29:29 +0200 Subject: [PATCH 3/3] modified:fixed the primaryKey templates --- .../templates/spanner/table/alter_add_primary_key.sqlt | 6 ------ .../templates/spanner/table/alter_drop_primary_key.sqlt | 6 ------ 2 files changed, 12 deletions(-) diff --git a/ddl/src/main/resources/templates/spanner/table/alter_add_primary_key.sqlt b/ddl/src/main/resources/templates/spanner/table/alter_add_primary_key.sqlt index ad2d0504..e69de29b 100644 --- a/ddl/src/main/resources/templates/spanner/table/alter_add_primary_key.sqlt +++ b/ddl/src/main/resources/templates/spanner/table/alter_add_primary_key.sqlt @@ -1,6 +0,0 @@ -[# th:if="${schemaName} == null or ${schemaName} == ''"] -ALTER TABLE "[(${tableName})]" ADD [(${primaryKeyDefinition})]; -[/] -[# th:if="${schemaName} != null and ${schemaName} != ''"] -ALTER TABLE "[(${schemaName})]"."[(${tableName})]" ADD [(${primaryKeyDefinition})]; -[/] \ No newline at end of file diff --git a/ddl/src/main/resources/templates/spanner/table/alter_drop_primary_key.sqlt b/ddl/src/main/resources/templates/spanner/table/alter_drop_primary_key.sqlt index 6103b4a0..e69de29b 100644 --- a/ddl/src/main/resources/templates/spanner/table/alter_drop_primary_key.sqlt +++ b/ddl/src/main/resources/templates/spanner/table/alter_drop_primary_key.sqlt @@ -1,6 +0,0 @@ -[# th:if="${schemaName} == null or ${schemaName} == ''"] -ALTER TABLE "[(${tableName})]" DROP CONSTRAINT "[(${tableName})]_pkey"; -[/] -[# th:if="${schemaName} != null and ${schemaName} != ''"] -ALTER TABLE "[(${schemaName})]"."[(${tableName})]" DROP CONSTRAINT "[(${tableName})]_pkey"; -[/] \ No newline at end of file