From 7ae238f63267f02b6758991397e7a6e95812f648 Mon Sep 17 00:00:00 2001 From: vzakharchenko Date: Wed, 25 Mar 2020 16:59:27 +0200 Subject: [PATCH 1/4] release 1.2.3 - refactoring schema builder - drop index - drop foreign key - remove private key --- README.md | 345 ++++++++++++------ .../dynamic/ModifyColumnMetaDataInfo.java | 4 +- .../dynamic/ModifyColumnMetaDataInfoImpl.java | 10 +- .../core/dynamic/QAbstractDynamicTable.java | 50 ++- .../orm/core/dynamic/QDynamicTable.java | 40 +- .../core/dynamic/QDynamicTableBuilder.java | 18 +- .../core/dynamic/QForeignKeyBuilderImpl.java | 40 +- .../orm/core/dynamic/QIndexBuilderImpl.java | 10 +- .../core/dynamic/QPrimaryKeyBuilderImpl.java | 18 +- .../orm/core/dynamic/QSequenceBuilder.java | 2 +- .../core/dynamic/QSequenceBuilderImpl.java | 2 +- .../orm/core/dynamic/QTableBuilder.java | 81 +++- .../orm/core/dynamic/QViewBuilder.java | 23 +- .../orm/core/dynamic/QViewBuilderImpl.java | 2 +- .../orm/core/dynamic/column/QTableColumn.java | 2 +- .../column/QTableColumnContextImpl.java | 2 +- .../column/builder/QColumnBuilder.java | 4 +- .../column/builder/QDefaultColumnBuilder.java | 8 +- .../core/dynamic/fk/QForeignKeyBuilder.java | 61 +++- .../orm/core/dynamic/index/QIndexBuilder.java | 29 +- .../core/dynamic/pk/QPrimaryKeyBuilder.java | 50 ++- .../dynamic/schema/SchemaLoaderHelper.java | 4 +- .../schema/SchemaTableLoaderHelper.java | 14 +- .../liquibase/DynamicDatabaseSnapshot.java | 50 ++- .../structure/liquibase/LiquibaseHelper.java | 30 ++ .../structure/liquibase/TableFactory.java | 8 +- .../dynamic/orm/core/CacheSelectTest.java | 12 +- .../orm/core/ConcurrentSelectCacheTest.java | 22 +- .../dynamic/orm/core/CrudTest.java | 80 ++-- .../dynamic/orm/core/DynamicCacheTest.java | 7 +- .../orm/core/DynamicCompositeKeyTest.java | 106 +++++- .../dynamic/orm/core/DynamicIndexTest.java | 56 +-- .../dynamic/orm/core/DynamicOrmTest.java | 345 ++++++++++++------ .../dynamic/orm/core/ModifySchemaTest.java | 36 +- .../dynamic/orm/core/QueryAnnotationTest.java | 36 +- .../dynamic/orm/core/SelectTest.java | 15 +- .../dynamic/orm/core/SequanceTest.java | 10 +- .../StaticDynamicQueryAnnotationTest.java | 14 +- .../orm/core/UnionAndSubQueryDynamicTest.java | 26 +- .../dynamic/orm/core/VersionTest.java | 40 +- .../orm/core/pk/PKGeneratorLongTest.java | 6 +- 41 files changed, 1204 insertions(+), 514 deletions(-) create mode 100644 dynamic-orm-core/src/main/java/com/github/vzakharchenko/dynamic/orm/core/dynamic/structure/liquibase/LiquibaseHelper.java diff --git a/README.md b/README.md index 21d3070..6b7552b 100644 --- a/README.md +++ b/README.md @@ -209,14 +209,14 @@ public class SpringAnnotationTest extends CachingConfigurerSupport { public void testQuery() { qDynamicTableFactory.buildTables("firstTable") .columns().addStringColumn("Id") - .size(255).useAsPrimaryKey().create() - .addStringColumn("TestStringColumn").size(255).create() - .addDateColumn("modificationTime").create() - .finish() - .addPrimaryKey().addPrimaryKeyGenerator(UUIDPKGenerator.getInstance()) - .finish() + .size(255).useAsPrimaryKey().createColumn() + .addStringColumn("TestStringColumn").size(255).createColumn() + .addDateColumn("modificationTime").createColumn() + .endColumns() + .primaryKey().addPrimaryKeyGenerator(UUIDPKGenerator.getInstance()) + .endPrimaryKey() .addVersionColumn("modificationTime") - .finish().buildSchema(); + .endBuildTables().buildSchema(); } ``` - load dynamic structure from current connection @@ -248,8 +248,8 @@ public void testQuery() { ```java // add integer column to table qDynamicTableFactory.buildTables("firstTable") - .columns().addNumberColumn("newColumn", Integer.class).create().finish() - .finish().buildSchema(); + .columns().addNumberColumn("newColumn", Integer.class).createColumn().endColumns() + .endBuildTables().buildSchema(); ``` - add custom column type ```java @@ -258,9 +258,9 @@ public void testQuery() { .addCustomColumn("customColumn") .column(Expressions::stringPath) .jdbcType(new NVarcharType()) - .create() - .finish() - .finish().buildSchema(); + .createColumn() + .endColumns() + .endBuildTables().buildSchema(); ``` - update operation ```java @@ -377,27 +377,27 @@ how it works: // build schema qDynamicTableFactory.buildTables("firstTable") .columns().addStringColumn("Id") - .size(255).useAsPrimaryKey().create() - .addStringColumn("TestStringColumn").size(255).create() - .addDateColumn("modificationTime").create() - .finish() - .addPrimaryKey().addPrimaryKeyGenerator(UUIDPKGenerator.getInstance()) - .finish() + .size(255).useAsPrimaryKey().createColumn() + .addStringColumn("TestStringColumn").size(255).createColumn() + .addDateColumn("modificationTime").createColumn() + .endColumns() + .primaryKey().addPrimaryKeyGenerator(UUIDPKGenerator.getInstance()) + .endPrimaryKey() .addVersionColumn("modificationTime") .buildNextTable("secondTable") .columns().addStringColumn("Id") - .size(255).useAsPrimaryKey().create() - .addBooleanColumn("isDeleted").notNull().create() - .addDateTimeColumn("modificationTime").notNull().create() - .addStringColumn("linkToFirstTable").size(255).create() - .addStringColumn("uniqValue").size(255).create() - .finish() - .addPrimaryKey().addPrimaryKeyGenerator(UUIDPKGenerator.getInstance()).finish() + .size(255).useAsPrimaryKey().createColumn() + .addBooleanColumn("isDeleted").notNull().createColumn() + .addDateTimeColumn("modificationTime").notNull().createColumn() + .addStringColumn("linkToFirstTable").size(255).createColumn() + .addStringColumn("uniqValue").size(255).createColumn() + .endColumns() + .primaryKey().addPrimaryKeyGenerator(UUIDPKGenerator.getInstance()).endPrimaryKey() .addSoftDeleteColumn("isDeleted", true, false) .addVersionColumn("modificationTime") - .addIndex("uniqValue").buildIndex() - .addForeignKey("linkToFirstTable").buildForeignKey("firstTable") - .finish().buildSchema(); + .index("uniqValue").addUniqueIndex() + .foreignKey("linkToFirstTable").addForeignKey(("firstTable") + .endBuildTables().buildSchema(); transactionManager.commit(); QDynamicTable firstTable = qDynamicTableFactory.getQDynamicTableByName("firstTable"); @@ -425,8 +425,8 @@ how it works: // add integer column to table1 transactionManager.startTransactionIfNeeded(); qDynamicTableFactory.buildTables("firstTable") - .columns().addNumberColumn("newColumn", Integer.class).create().finish() - .finish().buildSchema(); + .columns().addNumberColumn("newColumn", Integer.class).createColumn().endColumns() + .endBuildTables().buildSchema(); transactionManager.commit(); @@ -481,6 +481,104 @@ how it works: assertEquals(secondModelFromJoin.getValue("Id"), secondModel1.getValue("Id")); } ``` +# SQL INDEX +## create index on runtime +```java + qDynamicTableFactory.buildTables("firstTable") + .columns().addStringColumn("Id") + .size(255).useAsPrimaryKey().createColumn() + .addStringColumn("column1").size(255).createColumn() + .addStringColumn("column2").size(255).createColumn() + .endColumns() + .index("column1","column2").addIndex() + .endBuildTables().buildSchema(); +``` + +## create unique index on runtime +```java + qDynamicTableFactory.buildTables("firstTable") + .columns().addStringColumn("Id") + .size(255).useAsPrimaryKey().createColumn() + .addStringColumn("column1").size(255).createColumn() + .addStringColumn("column2").size(255).createColumn() + .endColumns() + .index("column1","column2").clustered().addUniqueIndex() + .endBuildTables().buildSchema(); +``` + +## drop index on runtime +```java + // create schema + qDynamicTableFactory.buildTables("table1").columns() + .addStringColumn("Id1").size(255).useAsPrimaryKey().createColumn() + .addStringColumn("column1").size(255).createColumn() + .addStringColumn("column2").size(255).createColumn() + .endColumns() + .primaryKey().addPrimaryKeyGenerator(PrimaryKeyGenerators.UUID.getPkGenerator()).endPrimaryKey() + .index("column1", "column2").addIndex() + .endBuildTables().buildSchema(); + + // drop Index + qDynamicTableFactory.buildTables("table1") + .index("column1", "column2").drop() + .endBuildTables().buildSchema(); + +``` +# Foreign Key +## create foreign key on runtime +```java +qDynamicTableFactory.buildTables("table1").columns() + .addStringColumn("Id1").size(255).useAsPrimaryKey().createColumn() + .endColumns() + .primaryKey().addPrimaryKeyGenerator(PrimaryKeyGenerators.UUID.getPkGenerator()).endPrimaryKey() + .buildNextTable("table2") + .columns() + .addStringColumn("Id2").size(255).useAsPrimaryKey().createColumn() + .addStringColumn("Id1").size(255).notNull().createColumn() + .endColumns() + .primaryKey().addPrimaryKeyGenerator(PrimaryKeyGenerators.UUID.getPkGenerator()).endPrimaryKey() + .foreignKey("Id1").addForeignKey("table1") + .endBuildTables().buildSchema(); +``` +## drop foreign key on runtime + ```java + // create table1 and table2 + qDynamicTableFactory.buildTables("table1").columns() + .addStringColumn("Id1").size(255).useAsPrimaryKey().createColumn() + .endColumns() + .primaryKey().addPrimaryKeyGenerator(PrimaryKeyGenerators.UUID.getPkGenerator()).endPrimaryKey() + .buildNextTable("table2") + .columns() + .addStringColumn("Id2").size(255).useAsPrimaryKey().createColumn() + .addStringColumn("Id1").size(255).notNull().createColumn() + .endColumns() + .primaryKey().addPrimaryKeyGenerator(PrimaryKeyGenerators.UUID.getPkGenerator()).endPrimaryKey() + .foreignKey("Id1").addForeignKey("table1") + .endBuildTables().buildSchema(); + QDynamicTable table1 = qDynamicTableFactory.getQDynamicTableByName("table1"); + QDynamicTable table2 = qDynamicTableFactory.getQDynamicTableByName("table2"); + + // insert Table 1 + DynamicTableModel dynamicTableModel1 = new DynamicTableModel(table1); + ormQueryFactory.insert(dynamicTableModel1); + + // insert to table 2 with foreign Key + DynamicTableModel dynamicTableModel2 = new DynamicTableModel(table2); + dynamicTableModel2.addColumnValue("id1", dynamicTableModel1.getValue("Id1")); + ormQueryFactory.insert(dynamicTableModel2); + + // drop foreign Key + + qDynamicTableFactory.buildTables("table2") + .foreignKey("Id1").drop() + .endBuildTables().buildSchema(); + + + // insert to table 2 with foreign Key + DynamicTableModel dynamicTableModel2WithoutForeign = new DynamicTableModel(table2); + dynamicTableModel2WithoutForeign.addColumnValue("id1", "Not Foreign Key Value"); + ormQueryFactory.insert(dynamicTableModel2WithoutForeign); +``` # Static Tables(not Dynamic) ## - QueryDsl Models (Table Metadata) ```java @@ -588,14 +686,14 @@ Annotations: ormQueryFactory.insert(staticTable); // build dynamic Table with foreign Key to Static Table qDynamicTableFactory.buildTables("relatedTable") - .columns().addStringColumn("Id").size(255).useAsPrimaryKey().create() - .addNumberColumn("StaticId", Integer.class).create() - .addDateTimeColumn("modificationTime").notNull().create() - .finish() - .addPrimaryKey().addPrimaryKeyGenerator(UUIDPKGenerator.getInstance()).finish() + .columns().addStringColumn("Id").size(255).useAsPrimaryKey().createColumn() + .addNumberColumn("StaticId", Integer.class).createColumn() + .addDateTimeColumn("modificationTime").notNull().createColumn() + .endColumns() + .primaryKey().addPrimaryKeyGenerator(UUIDPKGenerator.getInstance()).endPrimaryKey() .addVersionColumn("modificationTime") - .addForeignKey("StaticId").buildForeignKey(QTestTableVersionAnnotation.qTestTableVersionAnnotation, QTestTableVersionAnnotation.qTestTableVersionAnnotation.id) - .finish().buildSchema(); + .foreignKey("StaticId").addForeignKey((QTestTableVersionAnnotation.qTestTableVersionAnnotation, QTestTableVersionAnnotation.qTestTableVersionAnnotation.id) + .endBuildTables().buildSchema(); // fetch dynamic table metadata QDynamicTable relatedTable = qDynamicTableFactory.getQDynamicTableByName("relatedTable"); @@ -629,9 +727,8 @@ Annotations: qDynamicTableFactory.buildTables("DynamicTable") .columns() .dropColumns("TestColumn") - .finish() - .finish() - .finish().buildSchema(); + .endColumns() + .endBuildTables().buildSchema(); ``` - modify column ```java @@ -640,8 +737,8 @@ Annotations: .modifyColumn() .size("TestColumn", 1) .finish() - .finish() - .finish() + .endColumns() + .endBuildTables() .buildSchema(); ``` - drop table or View @@ -776,21 +873,21 @@ public class LogAudit implements ApplicationListener { .increment(10L) .min(1000L) .max(10000L) - .finish() + .addSequence() .buildSchema(); ``` # Create SQL Sequence on runtime ```java qDynamicTableFactory.buildTables("dynamicTestTable") - .columns().addNumberColumn("ID", Integer.class).useAsPrimaryKey().create() - .addStringColumn("testColumn").size(100).create() - .finish() - .addPrimaryKey().addPrimaryKeyGenerator(new PKGeneratorSequence("dynamicTestTableSequance1")).finish() - .finish() + .columns().addNumberColumn("ID", Integer.class).useAsPrimaryKey().createColumn() + .addStringColumn("testColumn").size(100).createColumn() + .endColumns() + .primaryKey().addPrimaryKeyGenerator(new PKGeneratorSequence("dynamicTestTableSequance1")).endPrimaryKey() + .endBuildTables() .createSequence("dynamicTestTableSequance1") .initialValue(1000L) - .finish() + .addSequence() .buildSchema(); ``` # Create SQL View on runtime @@ -798,7 +895,7 @@ public class LogAudit implements ApplicationListener { qDynamicTableFactory .createView("testView").resultSet(ormQueryFactory.buildQuery() .from(QTestTableVersionAnnotation.qTestTableVersionAnnotation), QTestTableVersionAnnotation.qTestTableVersionAnnotation.id) - .finish() + .addView() .buildSchema(); ``` # use SQL View @@ -806,7 +903,7 @@ if you use selectcache() pay attention to the method "registerRelatedTables" ```java qDynamicTableFactory .createView("testView").resultSet(ormQueryFactory.buildQuery() - .from(QTestTableVersionAnnotation.qTestTableVersionAnnotation), QTestTableVersionAnnotation.qTestTableVersionAnnotation.id).finish() + .from(QTestTableVersionAnnotation.qTestTableVersionAnnotation), QTestTableVersionAnnotation.qTestTableVersionAnnotation.id).addView() .buildSchema(); QDynamicTable testView = qDynamicTableFactory.getQDynamicTableByName("testView"); @@ -839,23 +936,23 @@ if you use selectcache() pay attention to the method "registerRelatedTables" ```java // create database schema qDynamicTableFactory.buildTables("UnionTable1") - .columns().addStringColumn("Id1").size(255).useAsPrimaryKey().create() - .addDateTimeColumn("modificationTime1").notNull().create() - .addStringColumn("TestColumn1_1").size(255).create() - .addStringColumn("TestColumn1_2").size(255).create() - .finish() - .addPrimaryKey().addPrimaryKeyGenerator(PrimaryKeyGenerators.UUID.getPkGenerator()).finish() + .columns().addStringColumn("Id1").size(255).useAsPrimaryKey().createColumn() + .addDateTimeColumn("modificationTime1").notNull().createColumn() + .addStringColumn("TestColumn1_1").size(255).createColumn() + .addStringColumn("TestColumn1_2").size(255).createColumn() + .endColumns() + .primaryKey().addPrimaryKeyGenerator(PrimaryKeyGenerators.UUID.getPkGenerator()).endPrimaryKey() .addVersionColumn("modificationTime1") .buildNextTable("UnionTable2") .columns() - .addStringColumn("Id2").size(255).useAsPrimaryKey().create() - .addDateTimeColumn("modificationTime2").notNull().create() - .addStringColumn("TestColumn2_1").size(255).create() - .addStringColumn("TestColumn2_2").size(255).create() - .finish() - .addPrimaryKey().addPrimaryKeyGenerator(PrimaryKeyGenerators.UUID.getPkGenerator()).finish() + .addStringColumn("Id2").size(255).useAsPrimaryKey().createColumn() + .addDateTimeColumn("modificationTime2").notNull().createColumn() + .addStringColumn("TestColumn2_1").size(255).createColumn() + .addStringColumn("TestColumn2_2").size(255).createColumn() + .endColumns() + .primaryKey().addPrimaryKeyGenerator(PrimaryKeyGenerators.UUID.getPkGenerator()).endPrimaryKey() .addVersionColumn("modificationTime2") - .finish() + .endBuildTables() .buildSchema(); // get unionTable1 Metadata @@ -896,23 +993,23 @@ if you use selectcache() pay attention to the method "registerRelatedTables" ```java // create database schema qDynamicTableFactory.buildTables("UnionTable1") - .columns().addStringColumn("Id1").size(255).useAsPrimaryKey().create() - .addDateTimeColumn("modificationTime1").notNull().create() - .addStringColumn("TestColumn1_1").size(255).create() - .addStringColumn("TestColumn1_2").size(255).create() - .finish() - .addPrimaryKey().addPrimaryKeyGenerator(PrimaryKeyGenerators.UUID.getPkGenerator()).finish() + .columns().addStringColumn("Id1").size(255).useAsPrimaryKey().createColumn() + .addDateTimeColumn("modificationTime1").notNull().createColumn() + .addStringColumn("TestColumn1_1").size(255).createColumn() + .addStringColumn("TestColumn1_2").size(255).createColumn() + .endColumns() + .primaryKey().addPrimaryKeyGenerator(PrimaryKeyGenerators.UUID.getPkGenerator()).endPrimaryKey() .addVersionColumn("modificationTime1") .buildNextTable("UnionTable2") .columns() - .addStringColumn("Id2").size(255).useAsPrimaryKey().create() - .addDateTimeColumn("modificationTime2").notNull().create() - .addStringColumn("TestColumn2_1").size(255).create() - .addStringColumn("TestColumn2_2").size(255).create() - .finish() - .addPrimaryKey().addPrimaryKeyGenerator(PrimaryKeyGenerators.UUID.getPkGenerator()).finish() + .addStringColumn("Id2").size(255).useAsPrimaryKey().createColumn() + .addDateTimeColumn("modificationTime2").notNull().createColumn() + .addStringColumn("TestColumn2_1").size(255).createColumn() + .addStringColumn("TestColumn2_2").size(255).createColumn() + .endColumns() + .primaryKey().addPrimaryKeyGenerator(PrimaryKeyGenerators.UUID.getPkGenerator()).endPrimaryKey() .addVersionColumn("modificationTime2") - .finish() + .endBuildTables() .buildSchema(); // get unionTable1 Metadata @@ -985,23 +1082,23 @@ if you use selectcache() pay attention to the method "registerRelatedTables" ```java // create database schema qDynamicTableFactory.buildTables("UnionTable1") - .columns().addStringColumn("Id1").size(255).useAsPrimaryKey().create() - .addDateTimeColumn("modificationTime1").notNull().create() - .addStringColumn("TestColumn1_1").size(255).create() - .addStringColumn("TestColumn1_2").size(255).create() - .finish() - .addPrimaryKey().addPrimaryKeyGenerator(PrimaryKeyGenerators.UUID.getPkGenerator()).finish() + .columns().addStringColumn("Id1").size(255).useAsPrimaryKey().createColumn() + .addDateTimeColumn("modificationTime1").notNull().createColumn() + .addStringColumn("TestColumn1_1").size(255).createColumn() + .addStringColumn("TestColumn1_2").size(255).createColumn() + .endColumns() + .primaryKey().addPrimaryKeyGenerator(PrimaryKeyGenerators.UUID.getPkGenerator()).endPrimaryKey() .addVersionColumn("modificationTime1") .buildNextTable("UnionTable2") .columns() - .addStringColumn("Id2").size(255).useAsPrimaryKey().create() - .addDateTimeColumn("modificationTime2").notNull().create() - .addStringColumn("TestColumn2_1").size(255).create() - .addStringColumn("TestColumn2_2").size(255).create() - .finish() - .addPrimaryKey().addPrimaryKeyGenerator(PrimaryKeyGenerators.UUID.getPkGenerator()).finish() + .addStringColumn("Id2").size(255).useAsPrimaryKey().createColumn() + .addDateTimeColumn("modificationTime2").notNull().createColumn() + .addStringColumn("TestColumn2_1").size(255).createColumn() + .addStringColumn("TestColumn2_2").size(255).createColumn() + .endColumns() + .primaryKey().addPrimaryKeyGenerator(PrimaryKeyGenerators.UUID.getPkGenerator()).endPrimaryKey() .addVersionColumn("modificationTime2") - .finish() + .endBuildTables() .buildSchema(); // get unionTable1 Metadata @@ -1051,14 +1148,14 @@ if you use selectcache() pay attention to the method "registerRelatedTables" ```java // create database schema qDynamicTableFactory.buildTables("UnionTable1") - .columns().addStringColumn("Id1").size(255).useAsPrimaryKey().create() - .addDateTimeColumn("modificationTime1").notNull().create() - .addStringColumn("TestColumn1_1").size(255).create() - .addStringColumn("TestColumn1_2").size(255).create() - .finish() - .addPrimaryKey().addPrimaryKeyGenerator(PrimaryKeyGenerators.UUID.getPkGenerator()).finish() + .columns().addStringColumn("Id1").size(255).useAsPrimaryKey().createColumn() + .addDateTimeColumn("modificationTime1").notNull().createColumn() + .addStringColumn("TestColumn1_1").size(255).createColumn() + .addStringColumn("TestColumn1_2").size(255).createColumn() + .endColumns() + .primaryKey().addPrimaryKeyGenerator(PrimaryKeyGenerators.UUID.getPkGenerator()).endPrimaryKey() .addVersionColumn("modificationTime1) - .finish() + .endBuildTables() .buildSchema(); // get unionTable1 Metadata @@ -1135,14 +1232,14 @@ if you use selectcache() pay attention to the method "registerRelatedTables" ```java // create database schema qDynamicTableFactory.buildTables("UnionTable1") - .columns().addStringColumn("Id1").size(255).useAsPrimaryKey().create() - .addDateTimeColumn("modificationTime1").notNull().create() - .addStringColumn("TestColumn1_1").size(255).create() - .addStringColumn("TestColumn1_2").size(255).create() - .finish() - .addPrimaryKey().addPrimaryKeyGenerator(PrimaryKeyGenerators.UUID.getPkGenerator()).finish() + .columns().addStringColumn("Id1").size(255).useAsPrimaryKey().createColumn() + .addDateTimeColumn("modificationTime1").notNull().createColumn() + .addStringColumn("TestColumn1_1").size(255).createColumn() + .addStringColumn("TestColumn1_2").size(255).createColumn() + .endColumns() + .primaryKey().addPrimaryKeyGenerator(PrimaryKeyGenerators.UUID.getPkGenerator()).endPrimaryKey() .addVersionColumn("modificationTime1) - .finish() + .endBuildTables() .buildSchema(); // get unionTable1 Metadata @@ -1230,10 +1327,10 @@ if you use selectcache() pay attention to the method "registerRelatedTables" qDynamicTableFactory .buildTables("testDynamicTableWithCompositeKey") .columns().addNumberColumn("id1", Integer.class) - .useAsPrimaryKey().create() - .addStringColumn("id2").size(255).useAsPrimaryKey().create() - .addStringColumn("testColumn").size(255).create() - .finish().finish().buildSchema(); + .useAsPrimaryKey().createColumn() + .addStringColumn("id2").size(255).useAsPrimaryKey().createColumn() + .addStringColumn("testColumn").size(255).createColumn() + .endColumns().endBuildTables().buildSchema(); // get dynamic table QDynamicTable table = qDynamicTableFactory @@ -1253,3 +1350,35 @@ if you use selectcache() pay attention to the method "registerRelatedTables" assertEquals(models.get(0).getValue("Id2", String.class), "2"); assertEquals(models.get(0).getValue("testColumn", String.class), "test"); ``` + +# remove column from the Composite key + +```java + // create Database schema + qDynamicTableFactory + .buildTables("testDynamicTableWithCompositeKey") + .columns().addNumberColumn("id1", Integer.class) + .useAsPrimaryKey().createColumn() + .addStringColumn("id2").size(255).useAsPrimaryKey().createColumn() + .addStringColumn("testColumn").size(255).createColumn() + .endColumns().endBuildTables().buildSchema(); + + // remove Id2 from primary key + qDynamicTableFactory + .buildTables(table.getTableName()) + .primaryKey() + .removePrimaryKey("Id2") + .endPrimaryKey() + .endBuildTables().buildSchema(); + // set column Id2 as nullable + qDynamicTableFactory + .buildTables(table.getTableName()) + .columns().modifyColumn().nullable("Id2").finish().endColumns() + .endBuildTables().buildSchema(); + + // insert Data without Id2 + DynamicTableModel dynamicTableModel1 = new DynamicTableModel(table); + dynamicTableModel1.addColumnValue("Id1", 1); + dynamicTableModel1.addColumnValue("testColumn", "test"); + ormQueryFactory.insert(dynamicTableModel1); +``` diff --git a/dynamic-orm-core/src/main/java/com/github/vzakharchenko/dynamic/orm/core/dynamic/ModifyColumnMetaDataInfo.java b/dynamic-orm-core/src/main/java/com/github/vzakharchenko/dynamic/orm/core/dynamic/ModifyColumnMetaDataInfo.java index 5056ac5..f1eec8a 100644 --- a/dynamic-orm-core/src/main/java/com/github/vzakharchenko/dynamic/orm/core/dynamic/ModifyColumnMetaDataInfo.java +++ b/dynamic-orm-core/src/main/java/com/github/vzakharchenko/dynamic/orm/core/dynamic/ModifyColumnMetaDataInfo.java @@ -2,12 +2,14 @@ import com.querydsl.core.types.Path; -public interface ModifyColumnMetaDataInfo { +public interface ModifyColumnMetaDataInfo extends ColumnMetaDataInfo { void setColumn(Path column); void setSize(Integer size); void setDecimalDigits(Integer decimalDigits); + void setPrimaryKey(Boolean primaryKey); + void setNullable(Boolean nullable); } diff --git a/dynamic-orm-core/src/main/java/com/github/vzakharchenko/dynamic/orm/core/dynamic/ModifyColumnMetaDataInfoImpl.java b/dynamic-orm-core/src/main/java/com/github/vzakharchenko/dynamic/orm/core/dynamic/ModifyColumnMetaDataInfoImpl.java index 745065f..8181bfe 100644 --- a/dynamic-orm-core/src/main/java/com/github/vzakharchenko/dynamic/orm/core/dynamic/ModifyColumnMetaDataInfoImpl.java +++ b/dynamic-orm-core/src/main/java/com/github/vzakharchenko/dynamic/orm/core/dynamic/ModifyColumnMetaDataInfoImpl.java @@ -3,12 +3,13 @@ import com.querydsl.core.types.Path; public class ModifyColumnMetaDataInfoImpl - implements ColumnMetaDataInfo, ModifyColumnMetaDataInfo { + implements ModifyColumnMetaDataInfo { private final ColumnMetaDataInfo columnMetaDataInfo; private Path column; private Integer size; private Integer decimalDigits; private Boolean nullable; + private Boolean primaryKey; public ModifyColumnMetaDataInfoImpl(ColumnMetaDataInfo columnMetaDataInfo) { this.columnMetaDataInfo = columnMetaDataInfo; @@ -56,7 +57,12 @@ public Boolean isNullable() { @Override public Boolean isPrimaryKey() { - return columnMetaDataInfo.isPrimaryKey(); + return primaryKey == null ? columnMetaDataInfo.isPrimaryKey() : primaryKey; + } + + @Override + public void setPrimaryKey(Boolean primaryKey) { + this.primaryKey = primaryKey; } @Override diff --git a/dynamic-orm-core/src/main/java/com/github/vzakharchenko/dynamic/orm/core/dynamic/QAbstractDynamicTable.java b/dynamic-orm-core/src/main/java/com/github/vzakharchenko/dynamic/orm/core/dynamic/QAbstractDynamicTable.java index e66cc0b..a92311d 100644 --- a/dynamic-orm-core/src/main/java/com/github/vzakharchenko/dynamic/orm/core/dynamic/QAbstractDynamicTable.java +++ b/dynamic-orm-core/src/main/java/com/github/vzakharchenko/dynamic/orm/core/dynamic/QAbstractDynamicTable.java @@ -1,10 +1,12 @@ package com.github.vzakharchenko.dynamic.orm.core.dynamic; import com.github.vzakharchenko.dynamic.orm.core.helper.ModelHelper; +import com.google.common.base.Predicate; import com.google.common.collect.ImmutableList; import com.querydsl.core.types.Path; import com.querydsl.core.types.PathMetadataFactory; import com.querydsl.sql.*; +import org.apache.commons.collections4.CollectionUtils; import org.apache.commons.lang3.ArrayUtils; import org.apache.commons.lang3.BooleanUtils; import org.apache.commons.lang3.StringUtils; @@ -23,14 +25,14 @@ public abstract class QAbstractDynamicTable> columns = new LinkedHashMap<>(); protected final Map, ColumnMetaDataInfo> columnMetaDataInfoMap = new HashMap<>(); private final Map> removedColumns = new LinkedHashMap<>(); - + private final List> removedForeignKeys = new ArrayList<>(); protected QAbstractDynamicTable(String tableName) { super(Object.class, PathMetadataFactory.forVariable(tableName), "", tableName); } - protected DYNAMIC_TABLE addPrimaryKey( - Path path) { + protected DYNAMIC_TABLE modifyPrimaryKey( + Path path, boolean remove) { Assert.notNull(path); RelationalPath qTable = ModelHelper.getQTable(path); Assert.isTrue(Objects.equals(this, qTable)); @@ -42,21 +44,33 @@ protected DYNAMIC_TABLE addPrimaryKey( createPrimaryKey(path); } else { List> localColumns = primaryKey.getLocalColumns(); - updatePrimaryKey(localColumns.toArray(new Path[0]), path); + updatePrimaryKey(localColumns.toArray(new Path[0]), path, remove); } return (DYNAMIC_TABLE) this; } protected PrimaryKey updatePrimaryKey(Path[] columnArray, - Path column) { - return createPrimaryKey(ArrayUtils.add(columnArray, column)); + Path column, + boolean remove) { + return createPrimaryKey(remove ? ArrayUtils.removeElement(columnArray, column) : + ArrayUtils.add(columnArray, column)); } protected DYNAMIC_TABLE addPrimaryKey(String columnName) { Assert.hasText(columnName); Path pkColumn = columns.get(StringUtils.upperCase(columnName)); - return addPrimaryKey(pkColumn); + return modifyPrimaryKey(pkColumn, false); + } + + protected DYNAMIC_TABLE removePrimaryKey(String columnName) { + Assert.hasText(columnName); + Path pkColumn = columns.get(StringUtils.upperCase(columnName)); + Assert.notNull(pkColumn, "Column " + columnName + " does not exist."); + ModifyColumnMetaDataInfo metaInfo = new ModifyColumnMetaDataInfoImpl(getMetaInfo(pkColumn)); + metaInfo.setPrimaryKey(Boolean.FALSE); + columnMetaDataInfoMap.put(pkColumn, metaInfo); + return modifyPrimaryKey(pkColumn, true); } protected DYNAMIC_TABLE addForeignKey( @@ -77,6 +91,7 @@ protected DYNAMIC_TABLE addForeignKey( ModelHelper::getColumnRealName) .collect(Collectors.toList()))); getForeignKeys().add(foreignKey); + removedForeignKeys.remove(foreignKey); return (DYNAMIC_TABLE) this; } @@ -87,7 +102,7 @@ protected DYNAMIC_TABLE addColumn( addMetadata(columnMetaDataInfo); Path column = columnMetaDataInfo.getColumn(); if (BooleanUtils.isTrue(columnMetaDataInfo.isPrimaryKey())) { - addPrimaryKey(column); + modifyPrimaryKey(column, false); } columns.put(ModelHelper.getColumnRealName(column), column); columnMetaDataInfoMap.put(column, columnMetaDataInfo); @@ -119,6 +134,7 @@ private void addMetadata( if (!columnMetaDataInfo.isNullable()) { columnMetadata = columnMetadata.notNull(); } + removedColumns.remove(columnMetadata.getName()); addMetadata(column, columnMetadata); } @@ -146,4 +162,22 @@ public void checkColumn(String columnName, Object value) { public List deletedColumns() { return new ArrayList<>(removedColumns.keySet()); } + + public List> deletedForeignKeys() { + return this.removedForeignKeys; + } + + public void removeForeignKey(List> localColumns) { + List> foreignKeys = getForeignKeys().stream().filter( + (Predicate>) foreignKey -> + !CollectionUtils.isEqualCollection(foreignKey.getLocalColumns(), + localColumns)).collect(Collectors.toList()); + List> foreignKeysToDelete = getForeignKeys().stream().filter( + (Predicate>) foreignKey -> + CollectionUtils.isEqualCollection(foreignKey.getLocalColumns(), + localColumns)).collect(Collectors.toList()); + this.removedForeignKeys.addAll(foreignKeysToDelete); + getForeignKeys().clear(); + getForeignKeys().addAll(foreignKeys); + } } diff --git a/dynamic-orm-core/src/main/java/com/github/vzakharchenko/dynamic/orm/core/dynamic/QDynamicTable.java b/dynamic-orm-core/src/main/java/com/github/vzakharchenko/dynamic/orm/core/dynamic/QDynamicTable.java index f46fb9e..5db240d 100644 --- a/dynamic-orm-core/src/main/java/com/github/vzakharchenko/dynamic/orm/core/dynamic/QDynamicTable.java +++ b/dynamic-orm-core/src/main/java/com/github/vzakharchenko/dynamic/orm/core/dynamic/QDynamicTable.java @@ -5,8 +5,10 @@ import com.github.vzakharchenko.dynamic.orm.core.pk.PKGenerator; import com.github.vzakharchenko.dynamic.orm.core.query.crud.SoftDelete; import com.github.vzakharchenko.dynamic.orm.core.query.crud.SoftDeleteFactory; +import com.google.common.collect.Sets; import com.querydsl.core.types.Path; import com.querydsl.sql.RelationalPath; +import org.apache.commons.collections4.CollectionUtils; import org.apache.commons.lang3.ObjectUtils; import org.apache.commons.lang3.StringUtils; import org.springframework.util.Assert; @@ -15,6 +17,7 @@ import java.util.ArrayList; import java.util.Collections; import java.util.List; +import java.util.stream.Collectors; import static com.github.vzakharchenko.dynamic.orm.core.RawModelBuilderImpl.SIZE; @@ -25,6 +28,7 @@ public class QDynamicTable extends QAbstractSetColumnDynamicTable public static final String WRONG_COLUMN = "Wrong column "; private final List indexDatas = new ArrayList<>(); + private final List removedIndexList = new ArrayList<>(); private PKGenerator pkGenerator; private Path versionColumn; private SoftDelete softDelete; @@ -125,10 +129,21 @@ protected QDynamicTable addIndex(List> columns, throw new IllegalStateException(WRONG_COLUMN + column); } } - indexDatas.add(new IndexData(columns, unique, clustered)); + IndexData indexData = new IndexData(columns, unique, clustered); + indexDatas.add(indexData); + resetRemovedIndices(indexData); return this; } + + private void resetRemovedIndices(IndexData indexData) { + List list = removedIndexList.stream().filter(id -> + !CollectionUtils.isEqualCollection( + Sets.newHashSet(indexData.getColumns()), Sets.newHashSet(id.getColumns()))) + .collect(Collectors.toList()); + updateIndices(removedIndexList, list); + } + public PKGenerator getPkGenerator() { return pkGenerator; } @@ -155,4 +170,27 @@ public Path[] all() { public List> getColumns() { return new ArrayList<>(columns.values()); } + + public void removeIndex(List> localColumns) { + List list1 = indexDatas.stream().filter(indexData -> + !CollectionUtils.isEqualCollection( + Sets.newHashSet(indexData.getColumns()), + Sets.newHashSet(localColumns))).collect(Collectors.toList()); + + List list2 = indexDatas.stream().filter(indexData -> + CollectionUtils.isEqualCollection( + Sets.newHashSet(indexData.getColumns()), + Sets.newHashSet(localColumns))).collect(Collectors.toList()); + updateIndices(indexDatas, list1); + removedIndexList.addAll(list2); + } + + public List removedIndices() { + return this.removedIndexList; + } + + private void updateIndices(List origin, List list) { + origin.clear(); + origin.addAll(list); + } } diff --git a/dynamic-orm-core/src/main/java/com/github/vzakharchenko/dynamic/orm/core/dynamic/QDynamicTableBuilder.java b/dynamic-orm-core/src/main/java/com/github/vzakharchenko/dynamic/orm/core/dynamic/QDynamicTableBuilder.java index e758303..f13f80c 100644 --- a/dynamic-orm-core/src/main/java/com/github/vzakharchenko/dynamic/orm/core/dynamic/QDynamicTableBuilder.java +++ b/dynamic-orm-core/src/main/java/com/github/vzakharchenko/dynamic/orm/core/dynamic/QDynamicTableBuilder.java @@ -52,12 +52,12 @@ public QTableColumn columns() { } @Override - public QPrimaryKeyBuilder addPrimaryKey() { + public QPrimaryKeyBuilder primaryKey() { return new QPrimaryKeyBuilderImpl(this, qDynamicTable); } @Override - public QForeignKeyBuilder addForeignKey(String... localColumns) { + public QForeignKeyBuilder foreignKey(String... localColumns) { List> localStringColumns = Arrays.stream(localColumns) .map(StringUtils::upperCase).map((Function>) s -> qDynamicTable.getColumnByName(s)) @@ -66,25 +66,25 @@ public QForeignKeyBuilder addForeignKey(String... localColumns) { } @Override - public QForeignKeyBuilder addForeignKeyPath(Path... localColumns) { + public QForeignKeyBuilder foreignKeyPath(Path... localColumns) { return addForeignKey(Arrays.asList(localColumns)); } @Override - public QIndexBuilder addIndex(String... localColumns) { + public QIndexBuilder index(String... localColumns) { List> localStringColumns = Arrays.stream(localColumns) .map(StringUtils::upperCase).map((Function>) s -> qDynamicTable.getColumnByName(s)) .collect(Collectors.toList()); - return addIndex(localStringColumns); + return index(localStringColumns); } @Override - public QIndexBuilder addIndex(Path... localColumns) { - return addIndex(Arrays.asList(localColumns)); + public QIndexBuilder index(Path... localColumns) { + return index(Arrays.asList(localColumns)); } - private QIndexBuilder addIndex(List> localColumns) { + private QIndexBuilder index(List> localColumns) { return new QIndexBuilderImpl(this, localColumns, qDynamicTable); } @@ -121,7 +121,7 @@ public QTableBuilder buildNextTable(String tableName) { } @Override - public QDynamicTableFactory finish() { + public QDynamicTableFactory endBuildTables() { dynamicContextHolder.getContextTables().put(qDynamicTable.getTableName(), qDynamicTable); return dynamicContextHolder; } diff --git a/dynamic-orm-core/src/main/java/com/github/vzakharchenko/dynamic/orm/core/dynamic/QForeignKeyBuilderImpl.java b/dynamic-orm-core/src/main/java/com/github/vzakharchenko/dynamic/orm/core/dynamic/QForeignKeyBuilderImpl.java index fc6c1a9..377f788 100644 --- a/dynamic-orm-core/src/main/java/com/github/vzakharchenko/dynamic/orm/core/dynamic/QForeignKeyBuilderImpl.java +++ b/dynamic-orm-core/src/main/java/com/github/vzakharchenko/dynamic/orm/core/dynamic/QForeignKeyBuilderImpl.java @@ -35,35 +35,35 @@ private QDynamicTable getDynamicTable() { @Override - public QTableBuilder buildForeignKey(RelationalPath remoteQTable, - Path... remotePrimaryKeys) { - return buildForeignKey(remoteQTable, Arrays.asList(remotePrimaryKeys)); + public QTableBuilder addForeignKey(RelationalPath remoteQTable, + Path... remotePrimaryKeys) { + return addForeignKey(remoteQTable, Arrays.asList(remotePrimaryKeys)); } - public QTableBuilder buildForeignKey(RelationalPath remoteQTable, - List> remotePrimaryKeys) { + public QTableBuilder addForeignKey(RelationalPath remoteQTable, + List> remotePrimaryKeys) { getDynamicTable().addForeignKey(localColumns, remoteQTable, remotePrimaryKeys); return tableBuilder; } @Override - public QTableBuilder buildForeignKey(QDynamicTable remoteDynamicTable, - String... remotePrimaryKeys) { - return buildForeignKey(remoteDynamicTable, + public QTableBuilder addForeignKey(QDynamicTable remoteDynamicTable, + String... remotePrimaryKeys) { + return addForeignKey(remoteDynamicTable, Arrays.stream(remotePrimaryKeys).map((Function>) s -> (Path) remoteDynamicTable.getColumnByName(s, Object.class)) .collect(Collectors.toList())); } @Override - public QTableBuilder buildForeignKey(String remoteDynamicTableName, - String... remotePrimaryKeys) { - return buildForeignKey(getDynamicTable(remoteDynamicTableName), remotePrimaryKeys); + public QTableBuilder addForeignKey(String remoteDynamicTableName, + String... remotePrimaryKeys) { + return addForeignKey(getDynamicTable(remoteDynamicTableName), remotePrimaryKeys); } @Override - public QTableBuilder buildForeignKey(RelationalPath remoteQTable) { - return buildForeignKey(remoteQTable, PrimaryKeyHelper + public QTableBuilder addForeignKey(RelationalPath remoteQTable) { + return addForeignKey(remoteQTable, PrimaryKeyHelper .getPrimaryKeyColumns(remoteQTable).stream() .map((Function, Path>) path -> path).collect(Collectors.toList())); } @@ -79,13 +79,19 @@ private QDynamicTable getDynamicTable(String remoteDynamicTableName) { } @Override - public QTableBuilder buildForeignKey(String remoteDynamicTableName) { - return buildForeignKey(getDynamicTable(remoteDynamicTableName)); + public QTableBuilder addForeignKey(String remoteDynamicTableName) { + return addForeignKey(getDynamicTable(remoteDynamicTableName)); } @Override - public QTableBuilder buildForeignKey(QDynamicTable remoteDynamicTable) { - return buildForeignKey(remoteDynamicTable, + public QTableBuilder addForeignKey(QDynamicTable remoteDynamicTable) { + return addForeignKey(remoteDynamicTable, PrimaryKeyHelper.getPrimaryKeyColumns(remoteDynamicTable).toArray(new Path[0])); } + + @Override + public QTableBuilder drop() { + dynamicTable.removeForeignKey(localColumns); + return tableBuilder; + } } diff --git a/dynamic-orm-core/src/main/java/com/github/vzakharchenko/dynamic/orm/core/dynamic/QIndexBuilderImpl.java b/dynamic-orm-core/src/main/java/com/github/vzakharchenko/dynamic/orm/core/dynamic/QIndexBuilderImpl.java index aa8ac8b..3ea2474 100644 --- a/dynamic-orm-core/src/main/java/com/github/vzakharchenko/dynamic/orm/core/dynamic/QIndexBuilderImpl.java +++ b/dynamic-orm-core/src/main/java/com/github/vzakharchenko/dynamic/orm/core/dynamic/QIndexBuilderImpl.java @@ -32,12 +32,18 @@ public QIndexBuilder clustered() { } @Override - public QTableBuilder buildIndex() { + public QTableBuilder addIndex() { return buildIndex(false); } @Override - public QTableBuilder buildUniqueIndex() { + public QTableBuilder addUniqueIndex() { return buildIndex(true); } + + @Override + public QTableBuilder drop() { + dynamicTable.removeIndex(localColumns); + return tableBuilder; + } } diff --git a/dynamic-orm-core/src/main/java/com/github/vzakharchenko/dynamic/orm/core/dynamic/QPrimaryKeyBuilderImpl.java b/dynamic-orm-core/src/main/java/com/github/vzakharchenko/dynamic/orm/core/dynamic/QPrimaryKeyBuilderImpl.java index 1a40c6f..c171d9b 100644 --- a/dynamic-orm-core/src/main/java/com/github/vzakharchenko/dynamic/orm/core/dynamic/QPrimaryKeyBuilderImpl.java +++ b/dynamic-orm-core/src/main/java/com/github/vzakharchenko/dynamic/orm/core/dynamic/QPrimaryKeyBuilderImpl.java @@ -1,6 +1,7 @@ package com.github.vzakharchenko.dynamic.orm.core.dynamic; import com.github.vzakharchenko.dynamic.orm.core.dynamic.pk.QPrimaryKeyBuilder; +import com.github.vzakharchenko.dynamic.orm.core.helper.ModelHelper; import com.github.vzakharchenko.dynamic.orm.core.helper.PrimaryKeyHelper; import com.github.vzakharchenko.dynamic.orm.core.pk.PKGenerator; import com.querydsl.core.types.Path; @@ -18,17 +19,28 @@ public QPrimaryKeyBuilderImpl(QTableBuilder tableBuilder, @Override - public QPrimaryKeyBuilder addPrimaryKey(Path path) { - dynamicTable.addPrimaryKey(path); + public QPrimaryKeyBuilder addPrimaryKey(Path column) { + dynamicTable.modifyPrimaryKey(column, false); return this; } + @Override + public QPrimaryKeyBuilder removePrimaryKey(Path column) { + return removePrimaryKey(ModelHelper.getColumnName(column)); + } + @Override public QPrimaryKeyBuilder addPrimaryKey(String columnName) { dynamicTable.addPrimaryKey(columnName); return this; } + @Override + public QPrimaryKeyBuilder removePrimaryKey(String columnName) { + dynamicTable.removePrimaryKey(columnName); + return this; + } + @Override public QPrimaryKeyBuilder addPrimaryKeyGenerator(PKGenerator pkGenerator) { if (!PrimaryKeyHelper.hasPrimaryKey(dynamicTable)) { @@ -40,7 +52,7 @@ public QPrimaryKeyBuilder addPrimaryKeyGenerator(PKGenerator pkGenerator) { } @Override - public QTableBuilder finish() { + public QTableBuilder endPrimaryKey() { return tableBuilder; } } diff --git a/dynamic-orm-core/src/main/java/com/github/vzakharchenko/dynamic/orm/core/dynamic/QSequenceBuilder.java b/dynamic-orm-core/src/main/java/com/github/vzakharchenko/dynamic/orm/core/dynamic/QSequenceBuilder.java index e1f34dd..d09a616 100644 --- a/dynamic-orm-core/src/main/java/com/github/vzakharchenko/dynamic/orm/core/dynamic/QSequenceBuilder.java +++ b/dynamic-orm-core/src/main/java/com/github/vzakharchenko/dynamic/orm/core/dynamic/QSequenceBuilder.java @@ -9,5 +9,5 @@ public interface QSequenceBuilder { QSequenceBuilder max(Long maxValue); - QDynamicTableFactory finish(); + QDynamicTableFactory addSequence(); } diff --git a/dynamic-orm-core/src/main/java/com/github/vzakharchenko/dynamic/orm/core/dynamic/QSequenceBuilderImpl.java b/dynamic-orm-core/src/main/java/com/github/vzakharchenko/dynamic/orm/core/dynamic/QSequenceBuilderImpl.java index b8d9f8c..92a1327 100644 --- a/dynamic-orm-core/src/main/java/com/github/vzakharchenko/dynamic/orm/core/dynamic/QSequenceBuilderImpl.java +++ b/dynamic-orm-core/src/main/java/com/github/vzakharchenko/dynamic/orm/core/dynamic/QSequenceBuilderImpl.java @@ -47,7 +47,7 @@ public QSequenceBuilder max(Long maxValue) { } @Override - public QDynamicTableFactory finish() { + public QDynamicTableFactory addSequence() { dynamicBuilderContext.getContextSequances().put( StringUtils.upperCase(sequanceModel.getName(), Locale.US), sequanceModel); diff --git a/dynamic-orm-core/src/main/java/com/github/vzakharchenko/dynamic/orm/core/dynamic/QTableBuilder.java b/dynamic-orm-core/src/main/java/com/github/vzakharchenko/dynamic/orm/core/dynamic/QTableBuilder.java index bf61600..dcb2f90 100644 --- a/dynamic-orm-core/src/main/java/com/github/vzakharchenko/dynamic/orm/core/dynamic/QTableBuilder.java +++ b/dynamic-orm-core/src/main/java/com/github/vzakharchenko/dynamic/orm/core/dynamic/QTableBuilder.java @@ -14,34 +14,97 @@ */ public interface QTableBuilder { + /** + * add/modify/drop column + * + * @return Column builder + */ QTableColumn columns(); - QPrimaryKeyBuilder addPrimaryKey(); + /** + * add primary key for table + * add column to composite primary key + * remove column from primary key + * + * @return primary key builder + */ + QPrimaryKeyBuilder primaryKey(); - QForeignKeyBuilder addForeignKey(String... localColumns); + /** + * add foreign Key + * + * @param localColumns - column names + * you should create columns first using method columns() + * @return foreign Key builder + */ + QForeignKeyBuilder foreignKey(String... localColumns); - QForeignKeyBuilder addForeignKeyPath(Path... localColumns); + /** + * add foreign Key + * + * @param localColumns - columns + * @return foreign Key builder + */ + QForeignKeyBuilder foreignKeyPath(Path... localColumns); - QIndexBuilder addIndex(String... localColumns); + /** + * create/drop sql index + * + * @param localColumns - columns + * @return Index builder + */ + QIndexBuilder index(String... localColumns); - QIndexBuilder addIndex(Path... localColumns); + /** + * create/drop sql index + * + * @param localColumns - columns + * @return Index builder + */ + QIndexBuilder index(Path... localColumns); + /** + * mark column as Optimistic Locking + * + * @param columnName column Name + * @return table builder + */ QTableBuilder addVersionColumn( String columnName); + /** + * mark column as Optimistic Locking + * + * @param versionColumn column + * @return table builder + */ QTableBuilder addVersionColumn(Path versionColumn); + /** + * mark column as soft delete column + * soft deletion means not real deletion of the record, but simply marks the record as deleted + * + * @param columnName column name + * @param value deleted value + * @param defaultValue not deleted value + * @return table builder + */ QTableBuilder addSoftDeleteColumn( String columnName, Serializable value, Serializable defaultValue); /** - * batch build table + * build next table * - * @param tableName - * @return + * @param tableName name of next table + * @return build next table */ QTableBuilder buildNextTable(String tableName); - QDynamicTableFactory finish(); + /** + * return to table factory + * + * @return Dynamic Builder Factory + */ + QDynamicTableFactory endBuildTables(); } diff --git a/dynamic-orm-core/src/main/java/com/github/vzakharchenko/dynamic/orm/core/dynamic/QViewBuilder.java b/dynamic-orm-core/src/main/java/com/github/vzakharchenko/dynamic/orm/core/dynamic/QViewBuilder.java index 2095f7e..28373ee 100644 --- a/dynamic-orm-core/src/main/java/com/github/vzakharchenko/dynamic/orm/core/dynamic/QViewBuilder.java +++ b/dynamic-orm-core/src/main/java/com/github/vzakharchenko/dynamic/orm/core/dynamic/QViewBuilder.java @@ -5,12 +5,29 @@ import java.util.List; - +/** + * Sql View builder + */ public interface QViewBuilder { + /** + * Create view Using QueryDsl expressions + * @param query - QueryDsl subquery (ormQueryFactory.buildQuery()...) + * @param columns - columns + * @return View Builder + */ QViewBuilder resultSet(SQLCommonQuery query, Expression... columns); - + /** + * Create view Using raw sql query + * @param sql - sql subquery + * @param columns - columns + * @return View Builder + */ QViewBuilder resultSet(String sql, List> columns); - QDynamicTableFactory finish(); + /** + * add View + * @return Dynamic Table Factory Builder + */ + QDynamicTableFactory addView(); } diff --git a/dynamic-orm-core/src/main/java/com/github/vzakharchenko/dynamic/orm/core/dynamic/QViewBuilderImpl.java b/dynamic-orm-core/src/main/java/com/github/vzakharchenko/dynamic/orm/core/dynamic/QViewBuilderImpl.java index 8a4fb4d..d65bc1c 100644 --- a/dynamic-orm-core/src/main/java/com/github/vzakharchenko/dynamic/orm/core/dynamic/QViewBuilderImpl.java +++ b/dynamic-orm-core/src/main/java/com/github/vzakharchenko/dynamic/orm/core/dynamic/QViewBuilderImpl.java @@ -34,7 +34,7 @@ public QViewBuilder resultSet(String sql, List> columns) { } @Override - public QDynamicTableFactory finish() { + public QDynamicTableFactory addView() { dynamicBuilderContext.getViewSequances().put(viewModel.getName(), viewModel); return dynamicBuilderContext; } diff --git a/dynamic-orm-core/src/main/java/com/github/vzakharchenko/dynamic/orm/core/dynamic/column/QTableColumn.java b/dynamic-orm-core/src/main/java/com/github/vzakharchenko/dynamic/orm/core/dynamic/column/QTableColumn.java index deac8ea..f2d7cbf 100644 --- a/dynamic-orm-core/src/main/java/com/github/vzakharchenko/dynamic/orm/core/dynamic/column/QTableColumn.java +++ b/dynamic-orm-core/src/main/java/com/github/vzakharchenko/dynamic/orm/core/dynamic/column/QTableColumn.java @@ -38,6 +38,6 @@ public interface QTableColumn { QTableColumn dropColumns(String... columns); - QTableBuilder finish(); + QTableBuilder endColumns(); } diff --git a/dynamic-orm-core/src/main/java/com/github/vzakharchenko/dynamic/orm/core/dynamic/column/QTableColumnContextImpl.java b/dynamic-orm-core/src/main/java/com/github/vzakharchenko/dynamic/orm/core/dynamic/column/QTableColumnContextImpl.java index d87cff4..27907c6 100644 --- a/dynamic-orm-core/src/main/java/com/github/vzakharchenko/dynamic/orm/core/dynamic/column/QTableColumnContextImpl.java +++ b/dynamic-orm-core/src/main/java/com/github/vzakharchenko/dynamic/orm/core/dynamic/column/QTableColumnContextImpl.java @@ -114,7 +114,7 @@ public QTableColumn dropColumns(String... columns) { } @Override - public QTableBuilder finish() { + public QTableBuilder endColumns() { return qTableBuilder; } diff --git a/dynamic-orm-core/src/main/java/com/github/vzakharchenko/dynamic/orm/core/dynamic/column/builder/QColumnBuilder.java b/dynamic-orm-core/src/main/java/com/github/vzakharchenko/dynamic/orm/core/dynamic/column/builder/QColumnBuilder.java index eec71d2..054cfa9 100644 --- a/dynamic-orm-core/src/main/java/com/github/vzakharchenko/dynamic/orm/core/dynamic/column/builder/QColumnBuilder.java +++ b/dynamic-orm-core/src/main/java/com/github/vzakharchenko/dynamic/orm/core/dynamic/column/builder/QColumnBuilder.java @@ -10,7 +10,7 @@ public interface QColumnBuilder remoteQTable, Path... remotePrimaryKey); - QTableBuilder buildForeignKey( + /** + * add Foreign Key to Table + * + * @param remoteDynamicTable - remote dynamic Table + * @param remotePrimaryKey remote table columns + * @return table builder + */ + QTableBuilder addForeignKey( QDynamicTable remoteDynamicTable, String... remotePrimaryKey); - QTableBuilder buildForeignKey( + /** + * add Foreign Key to Table + * + * @param remoteDynamicTableName remote dynamic Table Name + * @param remotePrimaryKey remote table columns + * @return table builder + */ + QTableBuilder addForeignKey( String remoteDynamicTableName, String... remotePrimaryKey); - QTableBuilder buildForeignKey(RelationalPath remoteQTable); + /** + * add Foreign Key to Table + * + * @param remoteQTable remote table + * @return table builder + */ + QTableBuilder addForeignKey(RelationalPath remoteQTable); + + /** + * add Foreign Key to Table + * + * @param remoteDynamicTableName - dynamic table name + * @return table builder + */ + QTableBuilder addForeignKey(String remoteDynamicTableName); - QTableBuilder buildForeignKey(String remoteDynamicTableName); + /** + * add Foreign Key to Table + * + * @param remoteDynamicTable - dynamic table + * @return table builder + */ + QTableBuilder addForeignKey(QDynamicTable remoteDynamicTable); - QTableBuilder buildForeignKey(QDynamicTable remoteDynamicTable); + /** + * drop Foreign Key + * @return table builder + */ + QTableBuilder drop(); } diff --git a/dynamic-orm-core/src/main/java/com/github/vzakharchenko/dynamic/orm/core/dynamic/index/QIndexBuilder.java b/dynamic-orm-core/src/main/java/com/github/vzakharchenko/dynamic/orm/core/dynamic/index/QIndexBuilder.java index a878ccd..50991d4 100644 --- a/dynamic-orm-core/src/main/java/com/github/vzakharchenko/dynamic/orm/core/dynamic/index/QIndexBuilder.java +++ b/dynamic-orm-core/src/main/java/com/github/vzakharchenko/dynamic/orm/core/dynamic/index/QIndexBuilder.java @@ -2,11 +2,34 @@ import com.github.vzakharchenko.dynamic.orm.core.dynamic.QTableBuilder; +/** + * SQL Index builder + */ public interface QIndexBuilder { - + /** + * clustered Index + * + * @return Index Builder + */ QIndexBuilder clustered(); - QTableBuilder buildIndex(); + /** + * add Index + * + * @return Table Builder + */ + QTableBuilder addIndex(); + + /** + * add unique index + * + * @return Table Builder + */ + QTableBuilder addUniqueIndex(); - QTableBuilder buildUniqueIndex(); + /** + * Drop Index + * @return Table Builder + */ + QTableBuilder drop(); } diff --git a/dynamic-orm-core/src/main/java/com/github/vzakharchenko/dynamic/orm/core/dynamic/pk/QPrimaryKeyBuilder.java b/dynamic-orm-core/src/main/java/com/github/vzakharchenko/dynamic/orm/core/dynamic/pk/QPrimaryKeyBuilder.java index f35c083..6a1fd78 100644 --- a/dynamic-orm-core/src/main/java/com/github/vzakharchenko/dynamic/orm/core/dynamic/pk/QPrimaryKeyBuilder.java +++ b/dynamic-orm-core/src/main/java/com/github/vzakharchenko/dynamic/orm/core/dynamic/pk/QPrimaryKeyBuilder.java @@ -4,13 +4,59 @@ import com.github.vzakharchenko.dynamic.orm.core.pk.PKGenerator; import com.querydsl.core.types.Path; +/** + * Primary Key Builder. + */ public interface QPrimaryKeyBuilder { - QPrimaryKeyBuilder addPrimaryKey(Path path); + /** + * add column as primary key for current table + * + * @param column - column + * @return builder + */ + QPrimaryKeyBuilder addPrimaryKey(Path column); + /** + * remove column from composite Primary Key + * + * @param column - column + * @return builder + */ + QPrimaryKeyBuilder removePrimaryKey(Path column); + + /** + * add column as primary key for current table + * + * @param columnName - column name + * @return builder + */ QPrimaryKeyBuilder addPrimaryKey(String columnName); + /** + * remove column from composite Primary Key + * + * @param columnName - column name + * @return builder + */ + QPrimaryKeyBuilder removePrimaryKey(String columnName); + + + /** + * add Primary Key Generator (works only with non composite Primary Key) + * + * @param pkGenerator new PKGeneratorSequence(String sequenceName) - SQL sequence generator + * PrimaryKeyGenerators.INTEGER.getPkGenerator() - unique integer generator + * PrimaryKeyGenerators.LONG.getPkGenerator() - unique long generator + * PrimaryKeyGenerators.UUID.getPkGenerator() - UUID String generator + * @return + */ QPrimaryKeyBuilder addPrimaryKeyGenerator(PKGenerator pkGenerator); - QTableBuilder finish(); + /** + * back to Table Builder + * + * @return Table Builder + */ + QTableBuilder endPrimaryKey(); } diff --git a/dynamic-orm-core/src/main/java/com/github/vzakharchenko/dynamic/orm/core/dynamic/schema/SchemaLoaderHelper.java b/dynamic-orm-core/src/main/java/com/github/vzakharchenko/dynamic/orm/core/dynamic/schema/SchemaLoaderHelper.java index 08cef1e..67387fa 100644 --- a/dynamic-orm-core/src/main/java/com/github/vzakharchenko/dynamic/orm/core/dynamic/schema/SchemaLoaderHelper.java +++ b/dynamic-orm-core/src/main/java/com/github/vzakharchenko/dynamic/orm/core/dynamic/schema/SchemaLoaderHelper.java @@ -23,7 +23,7 @@ private static void loadSequences(QDynamicTableFactory dynamicTableFactory, .increment(ClassHelper.transform(schemaSequence.getIncrement())) .max(ClassHelper.transform(schemaSequence.getMax())) .min(ClassHelper.transform(schemaSequence.getMin())) - .finish()); + .addSequence()); } @@ -43,7 +43,7 @@ private static void loadView(QDynamicTableFactory dynamicTableFactory, SchemaView schemaView) { List columns = schemaView.getColumns(); dynamicTableFactory.createView(schemaView.getName()).resultSet(schemaView.getSql(), - getFromViewColumn(columns)).finish(); + getFromViewColumn(columns)).addView(); } private static void loadViews(QDynamicTableFactory dynamicTableFactory, diff --git a/dynamic-orm-core/src/main/java/com/github/vzakharchenko/dynamic/orm/core/dynamic/schema/SchemaTableLoaderHelper.java b/dynamic-orm-core/src/main/java/com/github/vzakharchenko/dynamic/orm/core/dynamic/schema/SchemaTableLoaderHelper.java index fab9c05..789d8ed 100644 --- a/dynamic-orm-core/src/main/java/com/github/vzakharchenko/dynamic/orm/core/dynamic/schema/SchemaTableLoaderHelper.java +++ b/dynamic-orm-core/src/main/java/com/github/vzakharchenko/dynamic/orm/core/dynamic/schema/SchemaTableLoaderHelper.java @@ -28,7 +28,7 @@ private static void loadColumn(QTableColumn columnBuilder, SchemaColumn schemaCo ClassHelper.getClassType(schemaColumn.getaType()), metadata)); builder.jdbcType(schemaColumn.getJdbcType()).nullable(schemaColumn.getNullable()) .size(schemaColumn.getSize()) - .decimalDigits(schemaColumn.getDecimalDigits()).create(); + .decimalDigits(schemaColumn.getDecimalDigits()).createColumn(); } private static void loadGenerator(QTableBuilder qTableBuilder, SchemaTable schemaTable) { @@ -44,7 +44,7 @@ private static void loadGenerator(QTableBuilder qTableBuilder, SchemaTable schem } else { pkGenerator = primaryKeyGenerators.getPkGenerator(); } - qTableBuilder.addPrimaryKey().addPrimaryKeyGenerator(pkGenerator); + qTableBuilder.primaryKey().addPrimaryKeyGenerator(pkGenerator); } } @@ -53,7 +53,7 @@ private static void loadPrimaryKeys(QTableBuilder qTableBuilder, List primaryKeys) { if (primaryKeys != null) { primaryKeys.forEach(schemaPrimaryKey -> qTableBuilder - .addPrimaryKey().addPrimaryKey(schemaPrimaryKey.getColumn()) + .primaryKey().addPrimaryKey(schemaPrimaryKey.getColumn()) ); loadGenerator(qTableBuilder, schemaTable); } @@ -69,12 +69,12 @@ private static void loadIndices(QTableBuilder qTableBuilder, List i if (indices != null) { indices.forEach(schemaIndex -> { QIndexBuilder builder = qTableBuilder - .addIndex(schemaIndex.getColumns().toArray(new String[0])); + .index(schemaIndex.getColumns().toArray(new String[0])); clusteredIndex(builder, schemaIndex); if (schemaIndex.getUniq()) { - builder.buildUniqueIndex(); + builder.addUniqueIndex(); } else { - builder.buildIndex(); + builder.addIndex(); } }); } @@ -125,7 +125,7 @@ public static void loadTables(QDynamicTableFactory dynamicTableFactory, loadIndices(qTableBuilder, schemaTable.getIndices()); softDeletedColumn(qTableBuilder, schemaTable.getSoftDeleteColumn()); versionColumn(qTableBuilder, schemaTable.getVersionColumn()); - qTableBuilder.finish(); + qTableBuilder.endBuildTables(); }); } } diff --git a/dynamic-orm-core/src/main/java/com/github/vzakharchenko/dynamic/orm/core/dynamic/structure/liquibase/DynamicDatabaseSnapshot.java b/dynamic-orm-core/src/main/java/com/github/vzakharchenko/dynamic/orm/core/dynamic/structure/liquibase/DynamicDatabaseSnapshot.java index 5489fe3..c4bc1a6 100644 --- a/dynamic-orm-core/src/main/java/com/github/vzakharchenko/dynamic/orm/core/dynamic/structure/liquibase/DynamicDatabaseSnapshot.java +++ b/dynamic-orm-core/src/main/java/com/github/vzakharchenko/dynamic/orm/core/dynamic/structure/liquibase/DynamicDatabaseSnapshot.java @@ -1,6 +1,9 @@ package com.github.vzakharchenko.dynamic.orm.core.dynamic.structure.liquibase; +import com.github.vzakharchenko.dynamic.orm.core.dynamic.IndexData; import com.github.vzakharchenko.dynamic.orm.core.dynamic.structure.LiquibaseHolder; +import com.github.vzakharchenko.dynamic.orm.core.helper.ModelHelper; +import com.querydsl.core.types.Path; import liquibase.database.Database; import liquibase.exception.DatabaseException; import liquibase.snapshot.DatabaseSnapshot; @@ -14,8 +17,11 @@ import java.lang.reflect.InvocationTargetException; import java.util.*; import java.util.function.Consumer; +import java.util.function.Function; import java.util.stream.Collectors; +import static com.github.vzakharchenko.dynamic.orm.core.dynamic.structure.liquibase.TableFactory.*; + /** * */ @@ -120,6 +126,19 @@ private void mergeDatabase(DatabaseObject databaseObject) { } + private boolean isDeletedForeignKeys(ForeignKey foreignKey, + List> foreignKeys) { + Set columns = foreignKey.getForeignKeyColumns().stream().map(Column::getName) + .collect(Collectors.toSet()); + return CollectionUtils.isNotEmpty(foreignKeys) && + foreignKeys.stream().anyMatch(foreignKey0 -> + CollectionUtils.isEqualCollection(columns, + foreignKey0.getLocalColumns().stream() + .map((Function, String>) + ModelHelper::getColumnRealName) + .collect(Collectors.toSet()))); + } + private boolean isDeleted(DatabaseObject databaseObject, List removedColumns) { if (CollectionUtils.isNotEmpty(removedColumns)) { return removedColumns.stream().anyMatch(s -> @@ -130,17 +149,42 @@ private boolean isDeleted(DatabaseObject databaseObject, List removedCol return false; } + private boolean isDeletedTableOrigin(DatabaseObject databaseObject, Relation tableOrigin) { + if (databaseObject instanceof ForeignKey) { + List> foreignKeyList = + tableOrigin.getAttribute(DELETED_FOREIGN_KEYS, List.class); + return isDeletedForeignKeys((ForeignKey) databaseObject, foreignKeyList); + } + if (databaseObject instanceof Index) { + List indexList = + tableOrigin.getAttribute(DELETED_INDICES, List.class); + return isDeletedIndex((Index) databaseObject, indexList); + } + return isDeleted(databaseObject, tableOrigin + .getAttribute(DELETED_STRING_OBJECTS, List.class)); + } + + private boolean isDeletedIndex(Index index, List indexList) { + Set columns = index.getColumns().stream().map(Column::getName) + .collect(Collectors.toSet()); + return CollectionUtils.isNotEmpty(indexList) && + indexList.stream().anyMatch(index0 -> + CollectionUtils.isEqualCollection(columns, + index0.getColumns().stream() + .map(ModelHelper::getColumnRealName) + .collect(Collectors.toSet()))); + } + private boolean isDeleted(DatabaseObject databaseObject, Relation table) { Relation tableOrigin = getDatabaseObjectCollection().get(table, null); if (tableOrigin != null) { - return isDeleted(databaseObject, tableOrigin - .getAttribute("deletedObjects", List.class)); + return isDeletedTableOrigin(databaseObject, tableOrigin); } return false; } private boolean isDeleted(DatabaseObject databaseObject) { - Relation table = databaseObject.getAttribute("relation", Relation.class); + Relation table = LiquibaseHelper.getRelation(databaseObject); if (table != null) { return liquibaseHolder.isDeletedRelation(table) || isDeleted(databaseObject, table); } diff --git a/dynamic-orm-core/src/main/java/com/github/vzakharchenko/dynamic/orm/core/dynamic/structure/liquibase/LiquibaseHelper.java b/dynamic-orm-core/src/main/java/com/github/vzakharchenko/dynamic/orm/core/dynamic/structure/liquibase/LiquibaseHelper.java new file mode 100644 index 0000000..5765d64 --- /dev/null +++ b/dynamic-orm-core/src/main/java/com/github/vzakharchenko/dynamic/orm/core/dynamic/structure/liquibase/LiquibaseHelper.java @@ -0,0 +1,30 @@ +package com.github.vzakharchenko.dynamic.orm.core.dynamic.structure.liquibase; + +import liquibase.structure.DatabaseObject; +import liquibase.structure.core.Relation; + +import java.util.Optional; + +public final class LiquibaseHelper { + private LiquibaseHelper() { + } + + public static Relation getRelation(DatabaseObject databaseObject) { + return Optional.ofNullable(getSimpleRelation(databaseObject)).or(() -> + Optional.ofNullable(getForeignRelation(databaseObject)).or(() + -> Optional.ofNullable(getIndexRelation(databaseObject)).or( + Optional::empty))).orElse(null); + } + + private static Relation getForeignRelation(DatabaseObject databaseObject) { + return databaseObject.getAttribute("foreignKeyTable", Relation.class); + } + + private static Relation getIndexRelation(DatabaseObject databaseObject) { + return databaseObject.getAttribute("table", Relation.class); + } + + private static Relation getSimpleRelation(DatabaseObject databaseObject) { + return databaseObject.getAttribute("relation", Relation.class); + } +} diff --git a/dynamic-orm-core/src/main/java/com/github/vzakharchenko/dynamic/orm/core/dynamic/structure/liquibase/TableFactory.java b/dynamic-orm-core/src/main/java/com/github/vzakharchenko/dynamic/orm/core/dynamic/structure/liquibase/TableFactory.java index 42072cc..7e0b86d 100644 --- a/dynamic-orm-core/src/main/java/com/github/vzakharchenko/dynamic/orm/core/dynamic/structure/liquibase/TableFactory.java +++ b/dynamic-orm-core/src/main/java/com/github/vzakharchenko/dynamic/orm/core/dynamic/structure/liquibase/TableFactory.java @@ -28,13 +28,19 @@ */ public abstract class TableFactory { + public static final String DELETED_STRING_OBJECTS = "deletedStringObjects"; + public static final String DELETED_FOREIGN_KEYS = "deletedForeignKeys"; + public static final String DELETED_INDICES = "deletedIndices"; + private static void createColumns(QDynamicTable dynamicTable, Table table ) { table.setAttribute("columns", Lists.newArrayList()); dynamicTable.getColumns().forEach(column -> table.getColumns() .add(buildColumn(table, dynamicTable.getMetaInfo(column)))); - table.setAttribute("deletedObjects", dynamicTable.deletedColumns()); + table.setAttribute(DELETED_STRING_OBJECTS, dynamicTable.deletedColumns()); + table.setAttribute(DELETED_FOREIGN_KEYS, dynamicTable.deletedForeignKeys()); + table.setAttribute(DELETED_INDICES, dynamicTable.removedIndices()); } private static void createPrivateKey(QDynamicTable dynamicTable, diff --git a/dynamic-orm-core/src/test/java/com/github/vzakharchenko/dynamic/orm/core/CacheSelectTest.java b/dynamic-orm-core/src/test/java/com/github/vzakharchenko/dynamic/orm/core/CacheSelectTest.java index 13f230b..9c1375c 100644 --- a/dynamic-orm-core/src/test/java/com/github/vzakharchenko/dynamic/orm/core/CacheSelectTest.java +++ b/dynamic-orm-core/src/test/java/com/github/vzakharchenko/dynamic/orm/core/CacheSelectTest.java @@ -17,12 +17,12 @@ public class CacheSelectTest extends DebugAnnotationTestQueryOrm { @BeforeMethod public void beforeMethod() { qDynamicTableFactory.buildTables("DynamicTable") - .columns().addStringColumn("Id").size(255).useAsPrimaryKey().create() - .addDateTimeColumn("modificationTime").notNull().create() - .addStringColumn("TestColumn").size(255).create() - .finish() - .addPrimaryKey().addPrimaryKeyGenerator(PrimaryKeyGenerators.UUID.getPkGenerator()).finish() - .addVersionColumn("modificationTime").finish().buildSchema(); + .columns().addStringColumn("Id").size(255).useAsPrimaryKey().createColumn() + .addDateTimeColumn("modificationTime").notNull().createColumn() + .addStringColumn("TestColumn").size(255).createColumn() + .endColumns() + .primaryKey().addPrimaryKeyGenerator(PrimaryKeyGenerators.UUID.getPkGenerator()).endPrimaryKey() + .addVersionColumn("modificationTime").endBuildTables().buildSchema(); } @Test diff --git a/dynamic-orm-core/src/test/java/com/github/vzakharchenko/dynamic/orm/core/ConcurrentSelectCacheTest.java b/dynamic-orm-core/src/test/java/com/github/vzakharchenko/dynamic/orm/core/ConcurrentSelectCacheTest.java index c1a3444..cc1d6e6 100644 --- a/dynamic-orm-core/src/test/java/com/github/vzakharchenko/dynamic/orm/core/ConcurrentSelectCacheTest.java +++ b/dynamic-orm-core/src/test/java/com/github/vzakharchenko/dynamic/orm/core/ConcurrentSelectCacheTest.java @@ -27,23 +27,23 @@ public void createSchema() { qDynamicTableFactory .buildTables("DynamicTable") - .columns().addStringColumn("Id").size(255).useAsPrimaryKey().create() - .addDateTimeColumn("modificationTime").notNull().create() - .addStringColumn("TestColumn").size(255).create() - .finish() - .addPrimaryKey().addPrimaryKeyGenerator(PrimaryKeyGenerators.UUID.getPkGenerator()).finish() + .columns().addStringColumn("Id").size(255).useAsPrimaryKey().createColumn() + .addDateTimeColumn("modificationTime").notNull().createColumn() + .addStringColumn("TestColumn").size(255).createColumn() + .endColumns() + .primaryKey().addPrimaryKeyGenerator(PrimaryKeyGenerators.UUID.getPkGenerator()).endPrimaryKey() .addVersionColumn("modificationTime") .buildNextTable("DynamicTable2") .columns() - .addStringColumn("Id1").size(255).useAsPrimaryKey().create() - .addStringColumn("Id2").size(255).useAsPrimaryKey().create() - .addStringColumn("TestColumn").size(255).create() - .addDateTimeColumn("modificationTime").notNull().create() - .finish() + .addStringColumn("Id1").size(255).useAsPrimaryKey().createColumn() + .addStringColumn("Id2").size(255).useAsPrimaryKey().createColumn() + .addStringColumn("TestColumn").size(255).createColumn() + .addDateTimeColumn("modificationTime").notNull().createColumn() + .endColumns() .addVersionColumn("modificationTime") - .finish().buildSchema(); + .endBuildTables().buildSchema(); ormQueryFactory.transactionManager().commit(); } diff --git a/dynamic-orm-core/src/test/java/com/github/vzakharchenko/dynamic/orm/core/CrudTest.java b/dynamic-orm-core/src/test/java/com/github/vzakharchenko/dynamic/orm/core/CrudTest.java index 88da908..1b4f3e9 100644 --- a/dynamic-orm-core/src/test/java/com/github/vzakharchenko/dynamic/orm/core/CrudTest.java +++ b/dynamic-orm-core/src/test/java/com/github/vzakharchenko/dynamic/orm/core/CrudTest.java @@ -19,12 +19,12 @@ public class CrudTest extends DebugAnnotationTestQueryOrm { @BeforeMethod public void beforeMethod() { qDynamicTableFactory.buildTables("DynamicTable") - .columns().addStringColumn("Id").size(255).useAsPrimaryKey().create() - .addDateTimeColumn("modificationTime").notNull().create() - .addStringColumn("TestColumn").size(255).create() - .finish() - .addPrimaryKey().addPrimaryKeyGenerator(PrimaryKeyGenerators.UUID.getPkGenerator()).finish() - .addVersionColumn("modificationTime").finish().buildSchema(); + .columns().addStringColumn("Id").size(255).useAsPrimaryKey().createColumn() + .addDateTimeColumn("modificationTime").notNull().createColumn() + .addStringColumn("TestColumn").size(255).createColumn() + .endColumns() + .primaryKey().addPrimaryKeyGenerator(PrimaryKeyGenerators.UUID.getPkGenerator()).endPrimaryKey() + .addVersionColumn("modificationTime").endBuildTables().buildSchema(); } @Test @@ -71,12 +71,12 @@ public void testUpdateIdDynamicTest() { public void testDeleteDynamicCompositeIds() { qDynamicTableFactory.buildTables("DynamicTable2") .columns() - .addStringColumn("Id1").size(255).useAsPrimaryKey().create() - .addStringColumn("Id2").size(255).useAsPrimaryKey().create() - .addDateTimeColumn("modificationTime").notNull().create() - .addStringColumn("TestColumn").size(255).create() - .finish() - .addVersionColumn("modificationTime").finish().buildSchema(); + .addStringColumn("Id1").size(255).useAsPrimaryKey().createColumn() + .addStringColumn("Id2").size(255).useAsPrimaryKey().createColumn() + .addDateTimeColumn("modificationTime").notNull().createColumn() + .addStringColumn("TestColumn").size(255).createColumn() + .endColumns() + .addVersionColumn("modificationTime").endBuildTables().buildSchema(); QDynamicTable dynamicTable = qDynamicTableFactory.getQDynamicTableByName("DynamicTable2"); DynamicTableModel dynamicTableModel1 = new DynamicTableModel(dynamicTable); @@ -105,14 +105,14 @@ public void testDeleteDynamicCompositeIds() { public void testSoftDeleteDynamicCompositeIds() { qDynamicTableFactory.buildTables("DynamicTable2") .columns() - .addStringColumn("Id1").size(255).useAsPrimaryKey().create() - .addStringColumn("Id2").size(255).useAsPrimaryKey().create() - .addDateTimeColumn("modificationTime").notNull().create() - .addBooleanColumn("softDelete").create() - .addStringColumn("TestColumn").size(255).create() - .finish() + .addStringColumn("Id1").size(255).useAsPrimaryKey().createColumn() + .addStringColumn("Id2").size(255).useAsPrimaryKey().createColumn() + .addDateTimeColumn("modificationTime").notNull().createColumn() + .addBooleanColumn("softDelete").createColumn() + .addStringColumn("TestColumn").size(255).createColumn() + .endColumns() .addSoftDeleteColumn("softDelete",true,false) - .addVersionColumn("modificationTime").finish().buildSchema(); + .addVersionColumn("modificationTime").endBuildTables().buildSchema(); QDynamicTable dynamicTable = qDynamicTableFactory.getQDynamicTableByName("DynamicTable2"); DynamicTableModel dynamicTableModel1 = new DynamicTableModel(dynamicTable); @@ -204,11 +204,11 @@ public void testUpdatePartWhereWithoutPrimaryKey() { qDynamicTableFactory.buildTables("DynamicTable2") .columns() - .addDateTimeColumn("modificationTime").notNull().create() - .addStringColumn("TestColumn").size(255).create() - .finish() + .addDateTimeColumn("modificationTime").notNull().createColumn() + .addStringColumn("TestColumn").size(255).createColumn() + .endColumns() .addVersionColumn("modificationTime") - .finish() + .endBuildTables() .buildSchema(); QDynamicTable dynamicTable = qDynamicTableFactory.getQDynamicTableByName("DynamicTable2"); @@ -230,11 +230,11 @@ public void testDeleteWithoutPrimaryKey() { qDynamicTableFactory.buildTables("DynamicTable2") .columns() - .addDateTimeColumn("modificationTime").notNull().create() - .addStringColumn("TestColumn").size(255).create() - .finish() + .addDateTimeColumn("modificationTime").notNull().createColumn() + .addStringColumn("TestColumn").size(255).createColumn() + .endColumns() .addVersionColumn("modificationTime") - .finish() + .endBuildTables() .buildSchema(); QDynamicTable dynamicTable = qDynamicTableFactory.getQDynamicTableByName("DynamicTable2"); @@ -267,79 +267,79 @@ public void testGetColumnFailed() { @Test(expectedExceptions = IllegalArgumentException.class) public void testAddFailed1() { qDynamicTableFactory.buildTables("DynamicTable1") - .columns().addStringColumn(null).create(); + .columns().addStringColumn(null).createColumn(); } @Test(expectedExceptions = IllegalArgumentException.class) public void testAddFailed2() { qDynamicTableFactory.buildTables("DynamicTable1") - .columns().addDateTimeColumn(null).create(); + .columns().addDateTimeColumn(null).createColumn(); } @Test(expectedExceptions = IllegalArgumentException.class) public void testAddFailed3() { qDynamicTableFactory.buildTables("DynamicTable1") - .columns().addNumberColumn(null, null).create(); + .columns().addNumberColumn(null, null).createColumn(); } @Test(expectedExceptions = IllegalArgumentException.class) public void testAddFailed4() { qDynamicTableFactory.buildTables("DynamicTable1") - .columns().addNumberColumn("dsfs", null).create(); + .columns().addNumberColumn("dsfs", null).createColumn(); } @Test(expectedExceptions = IllegalArgumentException.class) public void testAddFailed5() { qDynamicTableFactory.buildTables("DynamicTable1") - .columns().addDateColumn(null).create(); + .columns().addDateColumn(null).createColumn(); } @Test(expectedExceptions = IllegalArgumentException.class) public void testAddFailed6() { qDynamicTableFactory.buildTables("DynamicTable1") - .columns().addDateTimeColumn(null).create(); + .columns().addDateTimeColumn(null).createColumn(); } @Test(expectedExceptions = IllegalArgumentException.class) public void testAddFailed7() { qDynamicTableFactory.buildTables("DynamicTable1") - .columns().addBooleanColumn(null).create(); + .columns().addBooleanColumn(null).createColumn(); } @Test(expectedExceptions = IllegalArgumentException.class) public void testAddFailed8() { qDynamicTableFactory.buildTables("DynamicTable1") - .columns().addClobColumn(null).create(); + .columns().addClobColumn(null).createColumn(); } @Test(expectedExceptions = IllegalArgumentException.class) public void testAddFailed9() { qDynamicTableFactory.buildTables("DynamicTable1") - .columns().addBlobColumn(null).create(); + .columns().addBlobColumn(null).createColumn(); } @Test(expectedExceptions = IllegalArgumentException.class) public void testAddFailed10() { qDynamicTableFactory.buildTables("DynamicTable1") - .columns().addTimeColumn(null).create(); + .columns().addTimeColumn(null).createColumn(); } @Test(expectedExceptions = IllegalArgumentException.class) public void testAddFailed11() { qDynamicTableFactory.buildTables("DynamicTable") - .addPrimaryKey().addPrimaryKeyGenerator(null); + .primaryKey().addPrimaryKeyGenerator(null); } @Test(expectedExceptions = IllegalArgumentException.class) public void testAddFailed12() { qDynamicTableFactory.buildTables("DynamicTable1") - .addPrimaryKey().addPrimaryKey((String) null); + .primaryKey().addPrimaryKey((String) null); } @Test(expectedExceptions = IllegalArgumentException.class) public void testAddFailed13() { qDynamicTableFactory.buildTables("DynamicTable1") - .addPrimaryKey().addPrimaryKey((String) null); + .primaryKey().addPrimaryKey((String) null); } @Test(expectedExceptions = IllegalStateException.class) diff --git a/dynamic-orm-core/src/test/java/com/github/vzakharchenko/dynamic/orm/core/DynamicCacheTest.java b/dynamic-orm-core/src/test/java/com/github/vzakharchenko/dynamic/orm/core/DynamicCacheTest.java index babecf2..19c3470 100644 --- a/dynamic-orm-core/src/test/java/com/github/vzakharchenko/dynamic/orm/core/DynamicCacheTest.java +++ b/dynamic-orm-core/src/test/java/com/github/vzakharchenko/dynamic/orm/core/DynamicCacheTest.java @@ -1,7 +1,6 @@ package com.github.vzakharchenko.dynamic.orm.core; import com.github.vzakharchenko.dynamic.orm.OracleTestQueryOrm; -import com.github.vzakharchenko.dynamic.orm.core.cache.LazyList; import com.github.vzakharchenko.dynamic.orm.core.dynamic.QDynamicTable; import com.github.vzakharchenko.dynamic.orm.core.dynamic.QTableBuilder; import com.github.vzakharchenko.dynamic.orm.core.dynamic.dml.DynamicTableModel; @@ -26,15 +25,15 @@ public class DynamicCacheTest extends OracleTestQueryOrm { public void testCacheSelect() { QTableBuilder testTable1 = qDynamicTableFactory.buildTables("testtable1"); // build primary key - testTable1.columns().addNumberColumn("ID", Integer.class).size(18).decimalDigits(0).useAsPrimaryKey().create(); + testTable1.columns().addNumberColumn("ID", Integer.class).size(18).decimalDigits(0).useAsPrimaryKey().createColumn(); // build String Field - testTable1.columns().addStringColumn("STRING_Test_FIELD").size( 200).create(); + testTable1.columns().addStringColumn("STRING_Test_FIELD").size( 200).createColumn(); // validate and create structure - testTable1.finish().buildSchema(); + testTable1.endBuildTables().buildSchema(); QDynamicTable qDynamicTable = qDynamicTableFactory.getQDynamicTableByName("testtable1"); assertNotNull(qDynamicTable); diff --git a/dynamic-orm-core/src/test/java/com/github/vzakharchenko/dynamic/orm/core/DynamicCompositeKeyTest.java b/dynamic-orm-core/src/test/java/com/github/vzakharchenko/dynamic/orm/core/DynamicCompositeKeyTest.java index 9a40b66..2e28f48 100644 --- a/dynamic-orm-core/src/test/java/com/github/vzakharchenko/dynamic/orm/core/DynamicCompositeKeyTest.java +++ b/dynamic-orm-core/src/test/java/com/github/vzakharchenko/dynamic/orm/core/DynamicCompositeKeyTest.java @@ -18,10 +18,10 @@ public void createSchema() { qDynamicTableFactory .buildTables("testDynamicTableWithCompositeKey") .columns().addNumberColumn("id1", Integer.class) - .useAsPrimaryKey().create() - .addStringColumn("id2").size(255).useAsPrimaryKey().create() - .addStringColumn("testColumn").size(255).create() - .finish().finish().buildSchema(); + .useAsPrimaryKey().createColumn() + .addStringColumn("id2").size(255).useAsPrimaryKey().createColumn() + .addStringColumn("testColumn").size(255).createColumn() + .endColumns().endBuildTables().buildSchema(); } public void createSchemaRelatedTable() { @@ -29,13 +29,13 @@ public void createSchemaRelatedTable() { qDynamicTableFactory .buildTables("testDynamicTableRelated") .columns().addNumberColumn("id", Integer.class) - .useAsPrimaryKey().create() - .addNumberColumn("id1", Integer.class).notNull().create() - .addStringColumn("id2").size(255).notNull().create() - .addStringColumn("testColumn").size(255).create() - .finish() - .addForeignKey("id1", "id2").buildForeignKey("testDynamicTableWithCompositeKey") - .finish() + .useAsPrimaryKey().createColumn() + .addNumberColumn("id1", Integer.class).notNull().createColumn() + .addStringColumn("id2").size(255).notNull().createColumn() + .addStringColumn("testColumn").size(255).createColumn() + .endColumns() + .foreignKey("id1", "id2").addForeignKey("testDynamicTableWithCompositeKey") + .endBuildTables() .buildSchema(); } @@ -44,13 +44,13 @@ public void createSchemaRelatedTable2() { qDynamicTableFactory .buildTables("testDynamicTableRelated") .columns().addNumberColumn("id", Integer.class) - .useAsPrimaryKey().create() - .addNumberColumn("id1", Integer.class).notNull().create() - .addStringColumn("id2").size(255).notNull().create() - .addStringColumn("testColumn").size(255).create() - .finish() - .addForeignKey("id1", "id2").buildForeignKey("testDynamicTableWithCompositeKey","id1", "id2") - .finish() + .useAsPrimaryKey().createColumn() + .addNumberColumn("id1", Integer.class).notNull().createColumn() + .addStringColumn("id2").size(255).notNull().createColumn() + .addStringColumn("testColumn").size(255).createColumn() + .endColumns() + .foreignKey("id1", "id2").addForeignKey("testDynamicTableWithCompositeKey", "id1", "id2") + .endBuildTables() .buildSchema(); } @@ -224,4 +224,74 @@ public void compositeForeignKeyTestFail() { } + @Test + public void compositeRemoveTest() { + createSchema(); + + QDynamicTable table = qDynamicTableFactory + .getQDynamicTableByName("testDynamicTableWithCompositeKey"); + // insert Data with Composite + DynamicTableModel dynamicTableModel = new DynamicTableModel(table); + dynamicTableModel.addColumnValue("Id1", 1); + dynamicTableModel.addColumnValue("Id2", "2"); + dynamicTableModel.addColumnValue("testColumn", "test"); + ormQueryFactory.insert(dynamicTableModel); + + + // remove Id2 from primary key + qDynamicTableFactory + .buildTables(table.getTableName()) + .primaryKey() + .removePrimaryKey(table.getColumnByName("Id2")) + .endPrimaryKey() + .endBuildTables().buildSchema(); + // set column Id2 as nullable + qDynamicTableFactory + .buildTables(table.getTableName()) + .columns().modifyColumn().nullable("Id2").finish().endColumns() + .endBuildTables().buildSchema(); + + // insert Data without Id2 + DynamicTableModel dynamicTableModel1 = new DynamicTableModel(table); + dynamicTableModel1.addColumnValue("Id1", 1); + dynamicTableModel1.addColumnValue("testColumn", "test"); + ormQueryFactory.insert(dynamicTableModel1); + + } + + @Test + public void compositeRemoveTest2() { + createSchema(); + + QDynamicTable table = qDynamicTableFactory + .getQDynamicTableByName("testDynamicTableWithCompositeKey"); + // insert Data with Composite + DynamicTableModel dynamicTableModel = new DynamicTableModel(table); + dynamicTableModel.addColumnValue("Id1", 1); + dynamicTableModel.addColumnValue("Id2", "2"); + dynamicTableModel.addColumnValue("testColumn", "test"); + ormQueryFactory.insert(dynamicTableModel); + + + // remove Id2 from primary key + qDynamicTableFactory + .buildTables(table.getTableName()) + .primaryKey() + .removePrimaryKey("Id2") + .endPrimaryKey() + .endBuildTables().buildSchema(); + // set column Id2 as nullable + qDynamicTableFactory + .buildTables(table.getTableName()) + .columns().modifyColumn().nullable("Id2").finish().endColumns() + .endBuildTables().buildSchema(); + + // insert Data without Id2 + DynamicTableModel dynamicTableModel1 = new DynamicTableModel(table); + dynamicTableModel1.addColumnValue("Id1", 1); + dynamicTableModel1.addColumnValue("testColumn", "test"); + ormQueryFactory.insert(dynamicTableModel1); + + } + } diff --git a/dynamic-orm-core/src/test/java/com/github/vzakharchenko/dynamic/orm/core/DynamicIndexTest.java b/dynamic-orm-core/src/test/java/com/github/vzakharchenko/dynamic/orm/core/DynamicIndexTest.java index bcb879d..2e9d26f 100644 --- a/dynamic-orm-core/src/test/java/com/github/vzakharchenko/dynamic/orm/core/DynamicIndexTest.java +++ b/dynamic-orm-core/src/test/java/com/github/vzakharchenko/dynamic/orm/core/DynamicIndexTest.java @@ -12,47 +12,47 @@ public class DynamicIndexTest extends OracleTestQueryOrm { @Test public void indexTest() { qDynamicTableFactory.buildTables("Test_table_Index") - .columns().addNumberColumn("ID", Integer.class).size(18).useAsPrimaryKey().create() - .addStringColumn("test_column").size(200).create() - .addNumberColumn("INDEXED_COLUMN", Integer.class).size(38).decimalDigits(3).create() - .finish() - .addPrimaryKey().addPrimaryKeyGenerator(new PKGeneratorSequence<>("TEST_SEQUENCE")).finish() - .addIndex("INDEXED_COLUMN").buildIndex() - .finish().buildSchema(); + .columns().addNumberColumn("ID", Integer.class).size(18).useAsPrimaryKey().createColumn() + .addStringColumn("test_column").size(200).createColumn() + .addNumberColumn("INDEXED_COLUMN", Integer.class).size(38).decimalDigits(3).createColumn() + .endColumns() + .primaryKey().addPrimaryKeyGenerator(new PKGeneratorSequence<>("TEST_SEQUENCE")).endPrimaryKey() + .index("INDEXED_COLUMN").addIndex() + .endBuildTables().buildSchema(); } @Test(expectedExceptions = IllegalStateException.class) public void indexTestFailed() { qDynamicTableFactory.buildTables("Test_table_Index") - .columns().addNumberColumn("ID", Integer.class).size(18).useAsPrimaryKey().create() - .addStringColumn("test_column").size(200).create() - .addNumberColumn("INDEXED_COLUMN", Integer.class).size(38).decimalDigits(3).create() - .finish() - .addPrimaryKey().addPrimaryKeyGenerator(new PKGeneratorSequence<>("TEST_SEQUENCE")).finish() - .addIndex((String) null).buildIndex() - .finish().buildSchema(); + .columns().addNumberColumn("ID", Integer.class).size(18).useAsPrimaryKey().createColumn() + .addStringColumn("test_column").size(200).createColumn() + .addNumberColumn("INDEXED_COLUMN", Integer.class).size(38).decimalDigits(3).createColumn() + .endColumns() + .primaryKey().addPrimaryKeyGenerator(new PKGeneratorSequence<>("TEST_SEQUENCE")).endPrimaryKey() + .index((String) null).addIndex() + .endBuildTables().buildSchema(); } @Test(expectedExceptions = IllegalStateException.class) public void indexTestFailed2() { qDynamicTableFactory.buildTables("Test_table_Index") - .columns().addNumberColumn("ID", Integer.class).size(18).useAsPrimaryKey().create() - .addStringColumn("test_column").size(200).create() - .addNumberColumn("INDEXED_COLUMN", Integer.class).size(38).decimalDigits(3).create() - .finish() - .addPrimaryKey().addPrimaryKeyGenerator(new PKGeneratorSequence<>("TEST_SEQUENCE")).finish() - .addIndex(new String[0]).buildIndex() - .finish().buildSchema(); + .columns().addNumberColumn("ID", Integer.class).size(18).useAsPrimaryKey().createColumn() + .addStringColumn("test_column").size(200).createColumn() + .addNumberColumn("INDEXED_COLUMN", Integer.class).size(38).decimalDigits(3).createColumn() + .endColumns() + .primaryKey().addPrimaryKeyGenerator(new PKGeneratorSequence<>("TEST_SEQUENCE")).endPrimaryKey() + .index(new String[0]).addIndex() + .endBuildTables().buildSchema(); } @Test public void indexUniqueTest() { qDynamicTableFactory.buildTables("Test_table_Index") - .columns().addNumberColumn("ID", Integer.class).size(18).decimalDigits(0).useAsPrimaryKey().create() - .addStringColumn("test_column").size(200).create() - .addNumberColumn("INDEXED_COLUMN", Integer.class).size(38).decimalDigits(3).create() - .finish() - .addPrimaryKey().addPrimaryKeyGenerator(new PKGeneratorSequence<>("TEST_SEQUENCE")).finish() - .addIndex("INDEXED_COLUMN").clustered().buildUniqueIndex() - .finish().buildSchema(); + .columns().addNumberColumn("ID", Integer.class).size(18).decimalDigits(0).useAsPrimaryKey().createColumn() + .addStringColumn("test_column").size(200).createColumn() + .addNumberColumn("INDEXED_COLUMN", Integer.class).size(38).decimalDigits(3).createColumn() + .endColumns() + .primaryKey().addPrimaryKeyGenerator(new PKGeneratorSequence<>("TEST_SEQUENCE")).endPrimaryKey() + .index("INDEXED_COLUMN").clustered().addUniqueIndex() + .endBuildTables().buildSchema(); } } diff --git a/dynamic-orm-core/src/test/java/com/github/vzakharchenko/dynamic/orm/core/DynamicOrmTest.java b/dynamic-orm-core/src/test/java/com/github/vzakharchenko/dynamic/orm/core/DynamicOrmTest.java index b52c18f..4dc4e99 100644 --- a/dynamic-orm-core/src/test/java/com/github/vzakharchenko/dynamic/orm/core/DynamicOrmTest.java +++ b/dynamic-orm-core/src/test/java/com/github/vzakharchenko/dynamic/orm/core/DynamicOrmTest.java @@ -9,12 +9,14 @@ import com.github.vzakharchenko.dynamic.orm.core.helper.PrimaryKeyHelper; import com.github.vzakharchenko.dynamic.orm.core.pk.PKGeneratorInteger; import com.github.vzakharchenko.dynamic.orm.core.pk.PKGeneratorSequence; +import com.github.vzakharchenko.dynamic.orm.core.pk.PrimaryKeyGenerators; import com.github.vzakharchenko.dynamic.orm.core.pk.UUIDPKGenerator; import com.github.vzakharchenko.dynamic.orm.core.query.crud.CrudBuilder; import com.github.vzakharchenko.dynamic.orm.model.TestTableVersionAnnotation; import com.github.vzakharchenko.dynamic.orm.qModel.QTestTableVersion; import com.github.vzakharchenko.dynamic.orm.qModel.QTestTableVersionAnnotation; import com.github.vzakharchenko.dynamic.orm.qModel.QTesttable; +import com.querydsl.core.QueryException; import com.querydsl.core.types.Path; import com.querydsl.core.types.dsl.Expressions; import com.querydsl.core.types.dsl.NumberPath; @@ -42,19 +44,19 @@ public class DynamicOrmTest extends OracleTestQueryOrm { public void testBuildOneTable() { QTableBuilder testTable1 = qDynamicTableFactory.buildTables("dynamicTestTable1"); // build primary key - testTable1.columns().addNumberColumn("ID", Integer.class).size(18).decimalDigits(0).notNull().useAsPrimaryKey().create(); + testTable1.columns().addNumberColumn("ID", Integer.class).size(18).decimalDigits(0).notNull().useAsPrimaryKey().createColumn(); // build String Field - testTable1.columns().addStringColumn("STRING_Test_FIELD").size(200).nullable().create(); + testTable1.columns().addStringColumn("STRING_Test_FIELD").size(200).nullable().createColumn(); // build foreign Key to table testtable with Primary key ID NumberPath id = QTesttable.testtable.id; testTable1 - .columns().addNumberColumn("Test_FK", id.getType()).size(ModelHelper.getColumnSize(id)).decimalDigits(ModelHelper.getColumnDigitSize(id)).nullable().create().finish() - .addForeignKey("Test_FK").buildForeignKey(QTesttable.testtable, id); + .columns().addNumberColumn("Test_FK", id.getType()).size(ModelHelper.getColumnSize(id)).decimalDigits(ModelHelper.getColumnDigitSize(id)).nullable().createColumn().endColumns() + .foreignKey("Test_FK").addForeignKey(QTesttable.testtable, id); // validate and create structure - testTable1.finish().buildSchema(); + testTable1.endBuildTables().buildSchema(); QDynamicTable qDynamicTable = qDynamicTableFactory.getQDynamicTableByName("dynamicTestTable1"); assertNotNull(qDynamicTable); List> columns = qDynamicTable.getColumns(); @@ -73,30 +75,30 @@ public void testBuildOneTable() { public void testBuildBatchTable() { QTableBuilder testTable1 = qDynamicTableFactory.buildTables("dynamicTestTable1"); // build primary key - testTable1.columns().addNumberColumn("ID", Integer.class).size(18).decimalDigits(0).nullable().useAsPrimaryKey().create(); + testTable1.columns().addNumberColumn("ID", Integer.class).size(18).decimalDigits(0).nullable().useAsPrimaryKey().createColumn(); // build String Field - testTable1.columns().addStringColumn("STRING_Test_FIELD").size(200).nullable().usAsNotPrimaryKey().create(); + testTable1.columns().addStringColumn("STRING_Test_FIELD").size(200).nullable().notPrimaryKey().createColumn(); // build foreign Key to table testtable with Primary key ID NumberPath id = QTesttable.testtable.id; testTable1.columns() - .addNumberColumn("Test_FK", id.getType()).size(ModelHelper.getColumnSize(id)).decimalDigits(ModelHelper.getColumnDigitSize(id)).nullable().create().finish() - .addForeignKey("Test_FK").buildForeignKey(QTesttable.testtable, id); + .addNumberColumn("Test_FK", id.getType()).size(ModelHelper.getColumnSize(id)).decimalDigits(ModelHelper.getColumnDigitSize(id)).nullable().createColumn().endColumns() + .foreignKey("Test_FK").addForeignKey(QTesttable.testtable, id); // build next table QTableBuilder testTable2 = testTable1.buildNextTable("dynamicTestTable2"); // build primary key for table testTable2 - testTable2.columns().addStringColumn("ID").size(18).notNull().useAsPrimaryKey().create(); + testTable2.columns().addStringColumn("ID").size(18).notNull().useAsPrimaryKey().createColumn(); - testTable2.columns().addDateColumn("dateColumn").notNull().create(); + testTable2.columns().addDateColumn("dateColumn").notNull().createColumn(); - testTable2.columns().addNumberColumn("testTable1_FK", Integer.class).size(18).decimalDigits(0).notNull().create().finish() - .addForeignKey("testTable1_FK").buildForeignKey("dynamicTestTable1"); + testTable2.columns().addNumberColumn("testTable1_FK", Integer.class).size(18).decimalDigits(0).notNull().createColumn().endColumns() + .foreignKey("testTable1_FK").addForeignKey("dynamicTestTable1"); - testTable2.finish().buildSchema(); + testTable2.endBuildTables().buildSchema(); QDynamicTable qDynamicTable1 = qDynamicTableFactory.getQDynamicTableByName("dynamicTestTable1"); QDynamicTable qDynamicTable2 = qDynamicTableFactory.getQDynamicTableByName("dynamicTestTable2"); @@ -130,15 +132,15 @@ public void testBuildBatchTable() { public void testInsertToTable() { QTableBuilder testTable1 = qDynamicTableFactory.buildTables("dynamicTestTable1"); // build primary key - testTable1.columns().addNumberColumn("ID", Integer.class).size(18).decimalDigits(0).notNull().useAsPrimaryKey().create(); + testTable1.columns().addNumberColumn("ID", Integer.class).size(18).decimalDigits(0).notNull().useAsPrimaryKey().createColumn(); // build String Field - testTable1.columns().addStringColumn("STRING_Test_FIELD").size(200).nullable().create(); + testTable1.columns().addStringColumn("STRING_Test_FIELD").size(200).nullable().createColumn(); // validate and create structure - testTable1.finish().buildSchema(); + testTable1.endBuildTables().buildSchema(); QDynamicTable qDynamicTable = qDynamicTableFactory.getQDynamicTableByName("dynamicTestTable1"); assertNotNull(qDynamicTable); @@ -169,16 +171,16 @@ public void testInsertToTable() { public void testSimpleInsertToTable() { QTableBuilder testTable1 = qDynamicTableFactory.buildTables("dynamicTestTable1"); // build primary key - testTable1.columns().addNumberColumn("ID", Integer.class).size(18).decimalDigits(0).notNull().create().finish() - .addPrimaryKey().addPrimaryKey("ID").addPrimaryKeyGenerator(PKGeneratorInteger.getInstance()).finish(); + testTable1.columns().addNumberColumn("ID", Integer.class).size(18).decimalDigits(0).notNull().createColumn().endColumns() + .primaryKey().addPrimaryKey("ID").addPrimaryKeyGenerator(PKGeneratorInteger.getInstance()).endPrimaryKey(); // build String Field - testTable1.columns().addStringColumn("STRING_Test_FIELD").size(200).create(); + testTable1.columns().addStringColumn("STRING_Test_FIELD").size(200).createColumn(); // validate and create structure - testTable1.finish().buildSchema(); + testTable1.endBuildTables().buildSchema(); QDynamicTable qDynamicTable = qDynamicTableFactory.getQDynamicTableByName("dynamicTestTable1"); assertNotNull(qDynamicTable); @@ -209,15 +211,15 @@ public void testSimpleInsertToTable() { public void testDeleteFromTable() { QTableBuilder testTable1 = qDynamicTableFactory.buildTables("dynamicTestTable1"); // build primary key - testTable1.columns().addNumberColumn("ID", Integer.class).size(18).decimalDigits(0).useAsPrimaryKey().create(); + testTable1.columns().addNumberColumn("ID", Integer.class).size(18).decimalDigits(0).useAsPrimaryKey().createColumn(); // build String Field - testTable1.columns().addStringColumn("STRING_Test_FIELD").size(200).nullable().create(); + testTable1.columns().addStringColumn("STRING_Test_FIELD").size(200).nullable().createColumn(); // validate and create structure - testTable1.finish().buildSchema(); + testTable1.endBuildTables().buildSchema(); QDynamicTable qDynamicTable = qDynamicTableFactory.getQDynamicTableByName("dynamicTestTable1"); assertNotNull(qDynamicTable); @@ -256,15 +258,15 @@ public void testDeleteFromTable() { public void testUpdateTable() { QTableBuilder testTable1 = qDynamicTableFactory.buildTables("dynamicTestTable1"); // build primary key - testTable1.columns().addNumberColumn("ID", Integer.class).size(18).decimalDigits(0).useAsPrimaryKey().create(); + testTable1.columns().addNumberColumn("ID", Integer.class).size(18).decimalDigits(0).useAsPrimaryKey().createColumn(); // build String Field - testTable1.columns().addStringColumn("STRING_Test_FIELD").size(200).create(); + testTable1.columns().addStringColumn("STRING_Test_FIELD").size(200).createColumn(); // validate and create structure - testTable1.finish().buildSchema(); + testTable1.endBuildTables().buildSchema(); QDynamicTable qDynamicTable = qDynamicTableFactory.getQDynamicTableByName("dynamicTestTable1"); assertNotNull(qDynamicTable); @@ -306,44 +308,44 @@ public void testUpdateTable() { public void testDynamicSchema() { ormQueryFactory.transactionManager().startTransactionIfNeeded(); qDynamicTableFactory.buildTables("dynamicTestTable") - .columns().addNumberColumn("ID", Integer.class).useAsPrimaryKey().create() - .addStringColumn("test").create() - .addDateTimeColumn("dateTime").create() - .addBooleanColumn("b").create() - .addDateColumn("date").create() - .addBlobColumn("blob").create() - .addClobColumn("clob").create() - .addCharColumn("c").create() - .addTimeColumn("time").create() - .addNumberColumn("fk1", Integer.class).create() - .addNumberColumn("fk2", Integer.class).create() - .addNumberColumn("fk3", Integer.class).create() - .finish() - .addForeignKey("fk2").buildForeignKey(QTestTableVersion.qTestTableVersion) - .finish().buildSchema(); + .columns().addNumberColumn("ID", Integer.class).useAsPrimaryKey().createColumn() + .addStringColumn("test").createColumn() + .addDateTimeColumn("dateTime").createColumn() + .addBooleanColumn("b").createColumn() + .addDateColumn("date").createColumn() + .addBlobColumn("blob").createColumn() + .addClobColumn("clob").createColumn() + .addCharColumn("c").createColumn() + .addTimeColumn("time").createColumn() + .addNumberColumn("fk1", Integer.class).createColumn() + .addNumberColumn("fk2", Integer.class).createColumn() + .addNumberColumn("fk3", Integer.class).createColumn() + .endColumns() + .foreignKey("fk2").addForeignKey(QTestTableVersion.qTestTableVersion) + .endBuildTables().buildSchema(); ormQueryFactory.transactionManager().commit(); QDynamicTable dynamicTestTable = qDynamicTableFactory.getQDynamicTableByName("dynamicTestTable"); ormQueryFactory.transactionManager().startTransactionIfNeeded(); qDynamicTableFactory.buildTables("dynamicTestTable") - .addForeignKeyPath(dynamicTestTable.getNumberColumnByName("fk1")) - .buildForeignKey( + .foreignKeyPath(dynamicTestTable.getNumberColumnByName("fk1")) + .addForeignKey( QTestTableVersion.qTestTableVersion, QTestTableVersion.qTestTableVersion.id - ).finish().buildSchema(); + ).endBuildTables().buildSchema(); ormQueryFactory.transactionManager().commit(); ormQueryFactory.transactionManager().startTransactionIfNeeded(); qDynamicTableFactory.buildTables("dynamicTestTable") .addVersionColumn( dynamicTestTable.getDateTimeColumnByName("dateTime") - ).finish().buildSchema(); + ).endBuildTables().buildSchema(); ormQueryFactory.transactionManager().commit(); ormQueryFactory.transactionManager().startTransactionIfNeeded(); qDynamicTableFactory.buildTables("dynamicTestTable") - .addIndex(dynamicTestTable.getStringColumnByName("test")).buildIndex( - ).finish().buildSchema(); + .index(dynamicTestTable.getStringColumnByName("test")).addIndex( + ).endBuildTables().buildSchema(); ormQueryFactory.transactionManager().commit(); } @@ -351,43 +353,43 @@ public void testDynamicSchema() { @Test public void testCustomColumns() { qDynamicTableFactory.buildTables("dynamicTestTable") - .columns().addNumberColumn("ID", Integer.class).useAsPrimaryKey().create() + .columns().addNumberColumn("ID", Integer.class).useAsPrimaryKey().createColumn() .addCustomColumn("customColumn") .column(Expressions::stringPath) - .jdbcType(new NVarcharType()).create() - .finish() - .finish().buildSchema(); + .jdbcType(new NVarcharType()).createColumn() + .endColumns() + .endBuildTables().buildSchema(); } @Test public void testSequanceTestSUCCESS() { qDynamicTableFactory.buildTables("dynamicTestTable") - .columns().addNumberColumn("ID", Integer.class).useAsPrimaryKey().create() - .addStringColumn("testColumn").size(100).create() - .finish() - .addPrimaryKey().addPrimaryKeyGenerator(new PKGeneratorSequence("dynamicTestTableSequance1")).finish() - .finish() + .columns().addNumberColumn("ID", Integer.class).useAsPrimaryKey().createColumn() + .addStringColumn("testColumn").size(100).createColumn() + .endColumns() + .primaryKey().addPrimaryKeyGenerator(new PKGeneratorSequence("dynamicTestTableSequance1")).endPrimaryKey() + .endBuildTables() .createSequence("dynamicTestTableSequance1") .initialValue(1000L) .increment(10L) - .finish() + .addSequence() .buildSchema(); } @Test(expectedExceptions = IllegalStateException.class) public void testSequanceTestFailed() { qDynamicTableFactory.buildTables("dynamicTestTable") - .columns().addNumberColumn("ID", Integer.class).useAsPrimaryKey().create() - .addStringColumn("testColumn").size(100).create() - .finish() - .addPrimaryKey().addPrimaryKeyGenerator(new PKGeneratorSequence("dynamicTestTableSequance1")).finish() - .finish() + .columns().addNumberColumn("ID", Integer.class).useAsPrimaryKey().createColumn() + .addStringColumn("testColumn").size(100).createColumn() + .endColumns() + .primaryKey().addPrimaryKeyGenerator(new PKGeneratorSequence("dynamicTestTableSequance1")).endPrimaryKey() + .endBuildTables() .createSequence("dynamicTestTableSequance1") .initialValue(1000L) .increment(10L) .min(1000L) .max(10000L) - .finish() + .addSequence() .buildSchema(); } @@ -395,7 +397,7 @@ public void testSequanceTestFailed() { public void testViewTest() { qDynamicTableFactory .createView("testView").resultSet(ormQueryFactory.buildQuery() - .from(QTestTableVersionAnnotation.qTestTableVersionAnnotation), QTestTableVersionAnnotation.qTestTableVersionAnnotation.id).finish() + .from(QTestTableVersionAnnotation.qTestTableVersionAnnotation), QTestTableVersionAnnotation.qTestTableVersionAnnotation.id).addView() .buildSchema(); } @@ -403,7 +405,7 @@ public void testViewTest() { public void testViewTestUnsupported() { qDynamicTableFactory .createView("testView").resultSet(ormQueryFactory.buildQuery() - .from(QTestTableVersionAnnotation.qTestTableVersionAnnotation), QTestTableVersionAnnotation.qTestTableVersionAnnotation.id).finish() + .from(QTestTableVersionAnnotation.qTestTableVersionAnnotation), QTestTableVersionAnnotation.qTestTableVersionAnnotation.id).addView() .buildSchema(); QDynamicTable testView = qDynamicTableFactory.getQDynamicTableByName("testView"); @@ -427,7 +429,7 @@ public void testViewTestUnsupported() { public void testViewSelectCacheTestUnsupported() { qDynamicTableFactory .createView("testView").resultSet(ormQueryFactory.buildQuery() - .from(QTestTableVersionAnnotation.qTestTableVersionAnnotation), QTestTableVersionAnnotation.qTestTableVersionAnnotation.id).finish() + .from(QTestTableVersionAnnotation.qTestTableVersionAnnotation), QTestTableVersionAnnotation.qTestTableVersionAnnotation.id).addView() .buildSchema(); QDynamicTable testView = qDynamicTableFactory.getQDynamicTableByName("testView"); @@ -455,7 +457,7 @@ public void testViewAlias() { .from(QTestTableVersionAnnotation.qTestTableVersionAnnotation), QTestTableVersionAnnotation.qTestTableVersionAnnotation.id.as("id"), QTestTableVersionAnnotation.qTestTableVersionAnnotation.version.as("version") - ).finish() + ).addView() .buildSchema(); QDynamicTable testView = qDynamicTableFactory.getQDynamicTableByName("testView"); @@ -470,7 +472,7 @@ public void testViewFailed() { .from(QTestTableVersionAnnotation.qTestTableVersionAnnotation), QTestTableVersionAnnotation.qTestTableVersionAnnotation.id.as("id"), QTestTableVersionAnnotation.qTestTableVersionAnnotation.version.as("version") - ).finish() + ).addView() .buildSchema(); qDynamicTableFactory.getQDynamicTableByName("testView223"); @@ -480,23 +482,23 @@ public void testViewFailed() { @Test public void testViewSizeColumn() { qDynamicTableFactory.buildTables("table") - .columns().addStringColumn("string1").create() - .addStringColumn("string2").create() - .addTimeColumn("time1").create() - .addTimeColumn("time2").create() - .addCharColumn("char1").create() - .addCharColumn("char2").create() - .addClobColumn("clob1").create() - .addClobColumn("clob2").create() - .addBlobColumn("blob1").create() - .addBlobColumn("blob2").create() - .addDateColumn("date1").create() - .addDateColumn("date2").create() - .addDateTimeColumn("datetime1").create() - .addDateTimeColumn("datetime2").create() - .addBooleanColumn("boolean1").create() - .addBooleanColumn("boolean2").create() - .finish().finish() + .columns().addStringColumn("string1").createColumn() + .addStringColumn("string2").createColumn() + .addTimeColumn("time1").createColumn() + .addTimeColumn("time2").createColumn() + .addCharColumn("char1").createColumn() + .addCharColumn("char2").createColumn() + .addClobColumn("clob1").createColumn() + .addClobColumn("clob2").createColumn() + .addBlobColumn("blob1").createColumn() + .addBlobColumn("blob2").createColumn() + .addDateColumn("date1").createColumn() + .addDateColumn("date2").createColumn() + .addDateTimeColumn("datetime1").createColumn() + .addDateTimeColumn("datetime2").createColumn() + .addBooleanColumn("boolean1").createColumn() + .addBooleanColumn("boolean2").createColumn() + .endColumns().endBuildTables() .buildSchema(); QDynamicTable qDynamicTable = qDynamicTableFactory.getQDynamicTableByName("table"); @@ -518,7 +520,7 @@ public void testViewSizeColumn() { qDynamicTable.getBlobColumnByName("blob2").as("someBlob"), qDynamicTable.getBooleanColumnByName("boolean1"), qDynamicTable.getBooleanColumnByName("boolean2").as("someBoolean") - ).finish().buildSchema(); + ).addView().buildSchema(); QDynamicTable testView = qDynamicTableFactory.getQDynamicTableByName("testView"); assertNotNull(testView); @@ -528,27 +530,27 @@ public void testViewSizeColumn() { @Test public void testFileSaver() throws IOException { qDynamicTableFactory.buildTables("table") - .columns().addStringColumn("string1").size(255).useAsPrimaryKey().create() - .addStringColumn("string2").size(255).create() - .addTimeColumn("time1").create() - .addTimeColumn("time2").create() - .addCharColumn("char1").size(255).create() - .addCharColumn("char2").size(255).create() - .addClobColumn("clob1").create() - .addClobColumn("clob2").create() - .addBlobColumn("blob1").create() - .addBlobColumn("blob2").create() - .addDateColumn("date1").create() - .addDateColumn("date2").create() - .addDateTimeColumn("datetime1").create() - .addDateTimeColumn("datetime2").create() - .addBooleanColumn("boolean1").create() - .addBooleanColumn("boolean2").create() - .finish() + .columns().addStringColumn("string1").size(255).useAsPrimaryKey().createColumn() + .addStringColumn("string2").size(255).createColumn() + .addTimeColumn("time1").createColumn() + .addTimeColumn("time2").createColumn() + .addCharColumn("char1").size(255).createColumn() + .addCharColumn("char2").size(255).createColumn() + .addClobColumn("clob1").createColumn() + .addClobColumn("clob2").createColumn() + .addBlobColumn("blob1").createColumn() + .addBlobColumn("blob2").createColumn() + .addDateColumn("date1").createColumn() + .addDateColumn("date2").createColumn() + .addDateTimeColumn("datetime1").createColumn() + .addDateTimeColumn("datetime2").createColumn() + .addBooleanColumn("boolean1").createColumn() + .addBooleanColumn("boolean2").createColumn() + .endColumns() .addVersionColumn("datetime1") .addSoftDeleteColumn("boolean1", true, false) - .addPrimaryKey().addPrimaryKeyGenerator(UUIDPKGenerator.getInstance()).finish() - .finish() + .primaryKey().addPrimaryKeyGenerator(UUIDPKGenerator.getInstance()).endPrimaryKey() + .endBuildTables() .buildSchema(); QDynamicTable qDynamicTable = qDynamicTableFactory.getQDynamicTableByName("table"); @@ -570,17 +572,17 @@ public void testFileSaver() throws IOException { qDynamicTable.getBlobColumnByName("blob2").as("someBlob"), qDynamicTable.getBooleanColumnByName("boolean1"), qDynamicTable.getBooleanColumnByName("boolean2").as("someBoolean") - ).finish() + ).addView() .buildTables("testTable").columns() - .addNumberColumn("Id", Integer.class).size(37).useAsPrimaryKey().create() - .addNumberColumn("exIdt", Integer.class).create() - .addStringColumn("exIdt2").size(255).create() - .finish() - .addIndex("exIdt").buildUniqueIndex() - .addForeignKey("exIdt").buildForeignKey(QTestTableVersionAnnotation.qTestTableVersionAnnotation) - .addForeignKey("exIdt2").buildForeignKey(qDynamicTable.getTableName()) - .finish() - .createSequence("sequence").finish() + .addNumberColumn("Id", Integer.class).size(37).useAsPrimaryKey().createColumn() + .addNumberColumn("exIdt", Integer.class).createColumn() + .addStringColumn("exIdt2").size(255).createColumn() + .endColumns() + .index("exIdt").addUniqueIndex() + .foreignKey("exIdt").addForeignKey(QTestTableVersionAnnotation.qTestTableVersionAnnotation) + .foreignKey("exIdt2").addForeignKey(qDynamicTable.getTableName()) + .endBuildTables() + .createSequence("sequence").addSequence() .buildSchema(); File file = new File("./target/", "testSchema.json"); qDynamicTableFactory.saveSchema(SchemaUtils.getFileSaver(file)); @@ -588,4 +590,115 @@ public void testFileSaver() throws IOException { assertNotNull(bytes); } + + + @Test + public void testRemoveForeignKey() { + qDynamicTableFactory.buildTables("table1").columns() + .addStringColumn("Id1").size(255).useAsPrimaryKey().createColumn() + .endColumns() + .primaryKey().addPrimaryKeyGenerator(PrimaryKeyGenerators.UUID.getPkGenerator()).endPrimaryKey() + .buildNextTable("table2") + .columns() + .addStringColumn("Id2").size(255).useAsPrimaryKey().createColumn() + .addStringColumn("Id1").size(255).notNull().createColumn() + .endColumns() + .primaryKey().addPrimaryKeyGenerator(PrimaryKeyGenerators.UUID.getPkGenerator()).endPrimaryKey() + .foreignKey("Id1").addForeignKey("table1") + .endBuildTables().buildSchema(); + QDynamicTable table1 = qDynamicTableFactory.getQDynamicTableByName("table1"); + QDynamicTable table2 = qDynamicTableFactory.getQDynamicTableByName("table2"); + + // insert Table 1 + DynamicTableModel dynamicTableModel1 = new DynamicTableModel(table1); + ormQueryFactory.insert(dynamicTableModel1); + + // insert to table 2 with foreign Key + DynamicTableModel dynamicTableModel2 = new DynamicTableModel(table2); + dynamicTableModel2.addColumnValue("id1", dynamicTableModel1.getValue("Id1")); + ormQueryFactory.insert(dynamicTableModel2); + + // drop foreign Key + + qDynamicTableFactory.buildTables("table2") + .foreignKey("Id1").drop() + .endBuildTables().buildSchema(); + + + // insert to table 2 with foreign Key + DynamicTableModel dynamicTableModel2WithoutForeign = new DynamicTableModel(table2); + dynamicTableModel2WithoutForeign.addColumnValue("id1", "Not Foreign Key Value"); + ormQueryFactory.insert(dynamicTableModel2WithoutForeign); + + } + + @Test(expectedExceptions = QueryException.class) + public void testRemoveAddForeignKey() { + qDynamicTableFactory.buildTables("table1").columns() + .addStringColumn("Id1").size(255).useAsPrimaryKey().createColumn() + .endColumns() + .primaryKey().addPrimaryKeyGenerator(PrimaryKeyGenerators.UUID.getPkGenerator()).endPrimaryKey() + .buildNextTable("table2") + .columns() + .addStringColumn("Id2").size(255).useAsPrimaryKey().createColumn() + .addStringColumn("Id1").size(255).notNull().createColumn() + .endColumns() + .primaryKey().addPrimaryKeyGenerator(PrimaryKeyGenerators.UUID.getPkGenerator()).endPrimaryKey() + .foreignKey("Id1").addForeignKey("table1") + .endBuildTables().buildSchema(); + QDynamicTable table1 = qDynamicTableFactory.getQDynamicTableByName("table1"); + QDynamicTable table2 = qDynamicTableFactory.getQDynamicTableByName("table2"); + + // insert Table 1 + DynamicTableModel dynamicTableModel1 = new DynamicTableModel(table1); + ormQueryFactory.insert(dynamicTableModel1); + + // insert to table 2 with foreign Key + DynamicTableModel dynamicTableModel2 = new DynamicTableModel(table2); + dynamicTableModel2.addColumnValue("id1", dynamicTableModel1.getValue("Id1")); + ormQueryFactory.insert(dynamicTableModel2); + + // drop foreign Key + + qDynamicTableFactory.buildTables("table2") + .foreignKey("Id1").drop() + .endBuildTables().buildSchema(); + + // add foreign Key + qDynamicTableFactory.buildTables("table2") + .foreignKey("Id1").addForeignKey("table1") + .endBuildTables().buildSchema(); + + + // insert to table 2 with foreign Key + DynamicTableModel dynamicTableModel2WithoutForeign = new DynamicTableModel(table2); + dynamicTableModel2WithoutForeign.addColumnValue("id1", "Not Foreign Key Value"); + ormQueryFactory.insert(dynamicTableModel2WithoutForeign); + + } + + + @Test + public void testDropIndex() { + // create schema + qDynamicTableFactory.buildTables("table1").columns() + .addStringColumn("Id1").size(255).useAsPrimaryKey().createColumn() + .addStringColumn("column1").size(255).createColumn() + .addStringColumn("column2").size(255).createColumn() + .endColumns() + .primaryKey().addPrimaryKeyGenerator(PrimaryKeyGenerators.UUID.getPkGenerator()).endPrimaryKey() + .index("column1", "column2").addIndex() + .endBuildTables().buildSchema(); + + QDynamicTable table1 = qDynamicTableFactory.getQDynamicTableByName("table1"); + ormQueryFactory.insert(new DynamicTableModel(table1)); + + // drop Index + qDynamicTableFactory.buildTables("table1") + .index("column1", "column2").drop() + .endBuildTables().buildSchema(); + + ormQueryFactory.insert(new DynamicTableModel(table1)); + } + } \ No newline at end of file diff --git a/dynamic-orm-core/src/test/java/com/github/vzakharchenko/dynamic/orm/core/ModifySchemaTest.java b/dynamic-orm-core/src/test/java/com/github/vzakharchenko/dynamic/orm/core/ModifySchemaTest.java index 3f0b56b..e3419c4 100644 --- a/dynamic-orm-core/src/test/java/com/github/vzakharchenko/dynamic/orm/core/ModifySchemaTest.java +++ b/dynamic-orm-core/src/test/java/com/github/vzakharchenko/dynamic/orm/core/ModifySchemaTest.java @@ -18,13 +18,13 @@ public class ModifySchemaTest extends DebugAnnotationTestQueryOrm { @BeforeMethod public void createDefaultSchema() { qDynamicTableFactory.buildTables("DynamicTable") - .columns().addStringColumn("Id").size(255).useAsPrimaryKey().create() - .addDateTimeColumn("modificationTime").notNull().create() - .addStringColumn("TestColumn").notNull().size(255).create() - .addNumberColumn("TestColumnNull", Integer.class).nullable().size(255).create() - .finish() - .addPrimaryKey().addPrimaryKeyGenerator(PrimaryKeyGenerators.UUID.getPkGenerator()).finish() - .addVersionColumn("modificationTime").finish().buildSchema(); + .columns().addStringColumn("Id").size(255).useAsPrimaryKey().createColumn() + .addDateTimeColumn("modificationTime").notNull().createColumn() + .addStringColumn("TestColumn").notNull().size(255).createColumn() + .addNumberColumn("TestColumnNull", Integer.class).nullable().size(255).createColumn() + .endColumns() + .primaryKey().addPrimaryKeyGenerator(PrimaryKeyGenerators.UUID.getPkGenerator()).endPrimaryKey() + .addVersionColumn("modificationTime").endBuildTables().buildSchema(); } @Test @@ -34,8 +34,8 @@ public void testDeleteColumnModificationSchema() { .modifyColumn() .dropColumns("TestColumn") .finish() - .finish() - .finish().buildSchema(); + .endColumns() + .endBuildTables().buildSchema(); QDynamicTable table = qDynamicTableFactory.getQDynamicTableByName("DynamicTable"); DynamicTableModel dynamicTableModel = new DynamicTableModel(table); ormQueryFactory.insert(dynamicTableModel); @@ -45,8 +45,8 @@ public void testDeleteColumnModificationSchema() { public void testDeleteColumnModificationSchema2() { qDynamicTableFactory.buildTables("DynamicTable") .columns().dropColumns("TestColumn") - .finish() - .finish().buildSchema(); + .endColumns() + .endBuildTables().buildSchema(); QDynamicTable table = qDynamicTableFactory.getQDynamicTableByName("DynamicTable"); DynamicTableModel dynamicTableModel = new DynamicTableModel(table); ormQueryFactory.insert(dynamicTableModel); @@ -67,7 +67,7 @@ public void testDropStaticTable() { @Test() public void testDropSequenceTable() { qDynamicTableFactory - .createSequence("sequence1").finish() + .createSequence("sequence1").addSequence() .buildSchema(); qDynamicTableFactory.dropSequence("sequence1").buildSchema(); } @@ -79,8 +79,8 @@ public void testColumnModificationSchema() { .modifyColumn() .size("TestColumn", 1) .finish() - .finish() - .finish() + .endColumns() + .endBuildTables() .buildSchema(); QDynamicTable table = qDynamicTableFactory.getQDynamicTableByName("DynamicTable"); DynamicTableModel dynamicTableModel = new DynamicTableModel(table); @@ -93,7 +93,7 @@ public void testColumnModificationSchemaFailed() { qDynamicTableFactory.buildTables("DynamicTable") .columns() .modifyColumn() - .size("TestColumn", 1).finish().finish().finish().buildSchema(); + .size("TestColumn", 1).finish().endColumns().endBuildTables().buildSchema(); QDynamicTable table = qDynamicTableFactory.getQDynamicTableByName("DynamicTable"); DynamicTableModel dynamicTableModel = new DynamicTableModel(table); dynamicTableModel.addColumnValue("TestColumn", "Size bigger than 1"); @@ -105,7 +105,7 @@ public void testColumnModificationSchemaNullable() { qDynamicTableFactory.buildTables("DynamicTable") .columns() .modifyColumn() - .nullable("TestColumn").finish().finish().finish().buildSchema(); + .nullable("TestColumn").finish().endColumns().endBuildTables().buildSchema(); QDynamicTable table = qDynamicTableFactory.getQDynamicTableByName("DynamicTable"); DynamicTableModel dynamicTableModel = new DynamicTableModel(table); ormQueryFactory.insert(dynamicTableModel); @@ -117,7 +117,7 @@ public void testColumnModificationSchemaDecimalDigits() { .columns() .modifyColumn() .decimalDigits("TestColumnNull", 10) - .changeNumberType("TestColumnNull", Double.class).finish().finish().finish().buildSchema(); + .changeNumberType("TestColumnNull", Double.class).finish().endColumns().endBuildTables().buildSchema(); QDynamicTable table = qDynamicTableFactory.getQDynamicTableByName("DynamicTable"); DynamicTableModel dynamicTableModel = new DynamicTableModel(table); dynamicTableModel.addColumnValue("TestColumnNull", 1.1); @@ -133,7 +133,7 @@ public void testColumnModificationSchemaNotNull() { qDynamicTableFactory.buildTables("DynamicTable") .columns() .modifyColumn() - .notNull("TestColumnNull").finish().finish().finish().buildSchema(); + .notNull("TestColumnNull").finish().endColumns().endBuildTables().buildSchema(); QDynamicTable table = qDynamicTableFactory.getQDynamicTableByName("DynamicTable"); DynamicTableModel dynamicTableModel = new DynamicTableModel(table); ormQueryFactory.insert(dynamicTableModel); diff --git a/dynamic-orm-core/src/test/java/com/github/vzakharchenko/dynamic/orm/core/QueryAnnotationTest.java b/dynamic-orm-core/src/test/java/com/github/vzakharchenko/dynamic/orm/core/QueryAnnotationTest.java index 212f71b..67c48b3 100644 --- a/dynamic-orm-core/src/test/java/com/github/vzakharchenko/dynamic/orm/core/QueryAnnotationTest.java +++ b/dynamic-orm-core/src/test/java/com/github/vzakharchenko/dynamic/orm/core/QueryAnnotationTest.java @@ -25,27 +25,27 @@ public void testQuery() { // build schema qDynamicTableFactory.buildTables("firstTable") .columns().addStringColumn("Id") - .size(255).useAsPrimaryKey().create() - .addStringColumn("TestStringColumn").size(255).create() - .addDateColumn("modificationTime").create() - .finish() - .addPrimaryKey().addPrimaryKeyGenerator(UUIDPKGenerator.getInstance()) - .finish() + .size(255).useAsPrimaryKey().createColumn() + .addStringColumn("TestStringColumn").size(255).createColumn() + .addDateColumn("modificationTime").createColumn() + .endColumns() + .primaryKey().addPrimaryKeyGenerator(UUIDPKGenerator.getInstance()) + .endPrimaryKey() .addVersionColumn("modificationTime") .buildNextTable("secondTable") .columns().addStringColumn("Id") - .size(255).useAsPrimaryKey().create() - .addBooleanColumn("isDeleted").notNull().create() - .addDateTimeColumn("modificationTime").notNull().create() - .addStringColumn("linkToFirstTable").size(255).create() - .addStringColumn("uniqValue").size(255).create() - .finish() - .addPrimaryKey().addPrimaryKeyGenerator(UUIDPKGenerator.getInstance()).finish() + .size(255).useAsPrimaryKey().createColumn() + .addBooleanColumn("isDeleted").notNull().createColumn() + .addDateTimeColumn("modificationTime").notNull().createColumn() + .addStringColumn("linkToFirstTable").size(255).createColumn() + .addStringColumn("uniqValue").size(255).createColumn() + .endColumns() + .primaryKey().addPrimaryKeyGenerator(UUIDPKGenerator.getInstance()).endPrimaryKey() .addSoftDeleteColumn("isDeleted", true, false) .addVersionColumn("modificationTime") - .addIndex("uniqValue").buildUniqueIndex() - .addForeignKey("linkToFirstTable").buildForeignKey( "firstTable") - .finish().buildSchema(); + .index("uniqValue").addUniqueIndex() + .foreignKey("linkToFirstTable").addForeignKey( "firstTable") + .endBuildTables().buildSchema(); transactionManager.commit(); QDynamicTable firstTable = qDynamicTableFactory.getQDynamicTableByName("firstTable"); @@ -73,8 +73,8 @@ public void testQuery() { // add integer column to table1 transactionManager.startTransactionIfNeeded(); qDynamicTableFactory.buildTables("firstTable") - .columns().addNumberColumn("newColumn", Integer.class).create().finish() - .finish().buildSchema(); + .columns().addNumberColumn("newColumn", Integer.class).createColumn().endColumns() + .endBuildTables().buildSchema(); transactionManager.commit(); diff --git a/dynamic-orm-core/src/test/java/com/github/vzakharchenko/dynamic/orm/core/SelectTest.java b/dynamic-orm-core/src/test/java/com/github/vzakharchenko/dynamic/orm/core/SelectTest.java index 41cd53c..b6f6934 100644 --- a/dynamic-orm-core/src/test/java/com/github/vzakharchenko/dynamic/orm/core/SelectTest.java +++ b/dynamic-orm-core/src/test/java/com/github/vzakharchenko/dynamic/orm/core/SelectTest.java @@ -1,6 +1,5 @@ package com.github.vzakharchenko.dynamic.orm.core; -import com.github.vzakharchenko.dynamic.orm.AnnotationTestQueryOrm; import com.github.vzakharchenko.dynamic.orm.OracleTestQueryOrm; import com.github.vzakharchenko.dynamic.orm.core.cache.LazyList; import com.github.vzakharchenko.dynamic.orm.core.dynamic.QDynamicTable; @@ -12,8 +11,6 @@ import com.querydsl.core.types.dsl.StringPath; import com.querydsl.core.types.dsl.Wildcard; import org.springframework.dao.IncorrectResultSizeDataAccessException; -import org.springframework.transaction.annotation.Propagation; -import org.springframework.transaction.annotation.Transactional; import org.testng.annotations.BeforeMethod; import org.testng.annotations.Test; @@ -27,12 +24,12 @@ public class SelectTest extends OracleTestQueryOrm { @BeforeMethod public void beforeMethod() { qDynamicTableFactory.buildTables("DynamicTable") - .columns().addStringColumn("Id").size(255).useAsPrimaryKey().create() - .addDateTimeColumn("modificationTime").notNull().create() - .addStringColumn("TestColumn").size(255).create() - .finish() - .addPrimaryKey().addPrimaryKeyGenerator(PrimaryKeyGenerators.UUID.getPkGenerator()).finish() - .addVersionColumn("modificationTime").finish().buildSchema(); + .columns().addStringColumn("Id").size(255).useAsPrimaryKey().createColumn() + .addDateTimeColumn("modificationTime").notNull().createColumn() + .addStringColumn("TestColumn").size(255).createColumn() + .endColumns() + .primaryKey().addPrimaryKeyGenerator(PrimaryKeyGenerators.UUID.getPkGenerator()).endPrimaryKey() + .addVersionColumn("modificationTime").endBuildTables().buildSchema(); } @Test diff --git a/dynamic-orm-core/src/test/java/com/github/vzakharchenko/dynamic/orm/core/SequanceTest.java b/dynamic-orm-core/src/test/java/com/github/vzakharchenko/dynamic/orm/core/SequanceTest.java index 37c2f39..698bcdf 100644 --- a/dynamic-orm-core/src/test/java/com/github/vzakharchenko/dynamic/orm/core/SequanceTest.java +++ b/dynamic-orm-core/src/test/java/com/github/vzakharchenko/dynamic/orm/core/SequanceTest.java @@ -52,11 +52,11 @@ public void insertModelFail() { @Test public void insertDynamicModel() { qDynamicTableFactory.buildTables("new_test_Dynamic_Table") - .columns().addNumberColumn("ID", Integer.class).size(18).decimalDigits(0).useAsPrimaryKey().create() - .addStringColumn("test_column").size(200).create() - .finish() - .addPrimaryKey().addPrimaryKeyGenerator(new PKGeneratorSequence<>("TEST_SEQUENCE")).finish() - .finish().buildSchema(); + .columns().addNumberColumn("ID", Integer.class).size(18).decimalDigits(0).useAsPrimaryKey().createColumn() + .addStringColumn("test_column").size(200).createColumn() + .endColumns() + .primaryKey().addPrimaryKeyGenerator(new PKGeneratorSequence<>("TEST_SEQUENCE")).endPrimaryKey() + .endBuildTables().buildSchema(); QDynamicTable qDynamicTable = qDynamicTableFactory.getQDynamicTableByName("new_test_Dynamic_Table"); DynamicTableModel dynamicTableModel = new DynamicTableModel(qDynamicTable); diff --git a/dynamic-orm-core/src/test/java/com/github/vzakharchenko/dynamic/orm/core/StaticDynamicQueryAnnotationTest.java b/dynamic-orm-core/src/test/java/com/github/vzakharchenko/dynamic/orm/core/StaticDynamicQueryAnnotationTest.java index a92acf9..d69e6cb 100644 --- a/dynamic-orm-core/src/test/java/com/github/vzakharchenko/dynamic/orm/core/StaticDynamicQueryAnnotationTest.java +++ b/dynamic-orm-core/src/test/java/com/github/vzakharchenko/dynamic/orm/core/StaticDynamicQueryAnnotationTest.java @@ -31,14 +31,14 @@ public void testQuery() { transactionManager.startTransactionIfNeeded(); // build dynamic Table with foreign Key to Static Table qDynamicTableFactory.buildTables("relatedTable") - .columns().addStringColumn("Id").size(255).useAsPrimaryKey().create() - .addNumberColumn("StaticId", Integer.class).create() - .addDateTimeColumn("modificationTime").notNull().create() - .finish() - .addPrimaryKey().addPrimaryKeyGenerator(UUIDPKGenerator.getInstance()).finish() + .columns().addStringColumn("Id").size(255).useAsPrimaryKey().createColumn() + .addNumberColumn("StaticId", Integer.class).createColumn() + .addDateTimeColumn("modificationTime").notNull().createColumn() + .endColumns() + .primaryKey().addPrimaryKeyGenerator(UUIDPKGenerator.getInstance()).endPrimaryKey() .addVersionColumn("modificationTime") - .addForeignKey("StaticId").buildForeignKey(QTestTableVersionAnnotation.qTestTableVersionAnnotation, QTestTableVersionAnnotation.qTestTableVersionAnnotation.id) - .finish().buildSchema(); + .foreignKey("StaticId").addForeignKey(QTestTableVersionAnnotation.qTestTableVersionAnnotation, QTestTableVersionAnnotation.qTestTableVersionAnnotation.id) + .endBuildTables().buildSchema(); // get dynamic table metadata QDynamicTable relatedTable = qDynamicTableFactory.getQDynamicTableByName("relatedTable"); diff --git a/dynamic-orm-core/src/test/java/com/github/vzakharchenko/dynamic/orm/core/UnionAndSubQueryDynamicTest.java b/dynamic-orm-core/src/test/java/com/github/vzakharchenko/dynamic/orm/core/UnionAndSubQueryDynamicTest.java index aeba20a..d7abe9a 100644 --- a/dynamic-orm-core/src/test/java/com/github/vzakharchenko/dynamic/orm/core/UnionAndSubQueryDynamicTest.java +++ b/dynamic-orm-core/src/test/java/com/github/vzakharchenko/dynamic/orm/core/UnionAndSubQueryDynamicTest.java @@ -26,23 +26,23 @@ public class UnionAndSubQueryDynamicTest extends DebugAnnotationTestQueryOrm { public void beforeMethod() { // build structure qDynamicTableFactory.buildTables("UnionTable1") - .columns().addStringColumn("Id1").size(255).useAsPrimaryKey().create() - .addDateTimeColumn("modificationTime1").notNull().create() - .addStringColumn("TestColumn1_1").size(255).create() - .addStringColumn("TestColumn1_2").size(255).create() - .finish() - .addPrimaryKey().addPrimaryKeyGenerator(PrimaryKeyGenerators.UUID.getPkGenerator()).finish() + .columns().addStringColumn("Id1").size(255).useAsPrimaryKey().createColumn() + .addDateTimeColumn("modificationTime1").notNull().createColumn() + .addStringColumn("TestColumn1_1").size(255).createColumn() + .addStringColumn("TestColumn1_2").size(255).createColumn() + .endColumns() + .primaryKey().addPrimaryKeyGenerator(PrimaryKeyGenerators.UUID.getPkGenerator()).endPrimaryKey() .addVersionColumn("modificationTime1") .buildNextTable("UnionTable2") .columns() - .addStringColumn("Id2").size(255).useAsPrimaryKey().create() - .addDateTimeColumn("modificationTime2").notNull().create() - .addStringColumn("TestColumn2_1").size(255).create() - .addStringColumn("TestColumn2_2").size(255).create() - .finish() - .addPrimaryKey().addPrimaryKeyGenerator(PrimaryKeyGenerators.UUID.getPkGenerator()).finish() + .addStringColumn("Id2").size(255).useAsPrimaryKey().createColumn() + .addDateTimeColumn("modificationTime2").notNull().createColumn() + .addStringColumn("TestColumn2_1").size(255).createColumn() + .addStringColumn("TestColumn2_2").size(255).createColumn() + .endColumns() + .primaryKey().addPrimaryKeyGenerator(PrimaryKeyGenerators.UUID.getPkGenerator()).endPrimaryKey() .addVersionColumn("modificationTime2") - .finish() + .endBuildTables() .buildSchema(); } diff --git a/dynamic-orm-core/src/test/java/com/github/vzakharchenko/dynamic/orm/core/VersionTest.java b/dynamic-orm-core/src/test/java/com/github/vzakharchenko/dynamic/orm/core/VersionTest.java index bfb545e..73f4471 100644 --- a/dynamic-orm-core/src/test/java/com/github/vzakharchenko/dynamic/orm/core/VersionTest.java +++ b/dynamic-orm-core/src/test/java/com/github/vzakharchenko/dynamic/orm/core/VersionTest.java @@ -49,11 +49,11 @@ public void testAnnotationInsert() { @Test public void testDynamicInsert() { qDynamicTableFactory.buildTables("TEST_DYNAMIC_TABLE") - .columns().addStringColumn("ID").size(100).useAsPrimaryKey().create() - .addNumberColumn("VERSION", Integer.class).size(38).decimalDigits(0).notNull().create() - .finish() - .addPrimaryKey().addPrimaryKeyGenerator(UUIDPKGenerator.getInstance()).finish() - .finish().buildSchema(); + .columns().addStringColumn("ID").size(100).useAsPrimaryKey().createColumn() + .addNumberColumn("VERSION", Integer.class).size(38).decimalDigits(0).notNull().createColumn() + .endColumns() + .primaryKey().addPrimaryKeyGenerator(UUIDPKGenerator.getInstance()).endPrimaryKey() + .endBuildTables().buildSchema(); QDynamicTable qDynamicTable = qDynamicTableFactory.getQDynamicTableByName("TEST_DYNAMIC_TABLE"); DynamicTableModel testTableVersion = new DynamicTableModel(qDynamicTable); ormQueryFactory.modify(qDynamicTable) @@ -67,12 +67,12 @@ public void testDynamicInsert() { @Test public void testDynamicPresetInsert() { qDynamicTableFactory.buildTables("TEST_DYNAMIC_TABLE") - .columns().addStringColumn("ID").size(100).useAsPrimaryKey().create() - .addNumberColumn("VERSION", Integer.class).size(38).decimalDigits(0).notNull().create() - .finish() - .addPrimaryKey().addPrimaryKeyGenerator(UUIDPKGenerator.getInstance()).finish() + .columns().addStringColumn("ID").size(100).useAsPrimaryKey().createColumn() + .addNumberColumn("VERSION", Integer.class).size(38).decimalDigits(0).notNull().createColumn() + .endColumns() + .primaryKey().addPrimaryKeyGenerator(UUIDPKGenerator.getInstance()).endPrimaryKey() .addVersionColumn("VERSION") - .finish().buildSchema(); + .endBuildTables().buildSchema(); QDynamicTable qDynamicTable = qDynamicTableFactory.getQDynamicTableByName("TEST_DYNAMIC_TABLE"); DynamicTableModel testTableVersion = new DynamicTableModel(qDynamicTable); ormQueryFactory.insert(testTableVersion); @@ -196,11 +196,11 @@ public void testConcurrentlyUpdateFail() throws InterruptedException, ExecutionE @Test public void testDynamicUpdate() { qDynamicTableFactory.buildTables("TEST_DYNAMIC_TABLE") - .columns().addStringColumn("ID").size(100).useAsPrimaryKey().create() - .addNumberColumn("VERSION", Integer.class).size(38).decimalDigits(0).notNull().create() - .finish() - .addPrimaryKey().addPrimaryKeyGenerator(UUIDPKGenerator.getInstance()).finish() - .finish().buildSchema(); + .columns().addStringColumn("ID").size(100).useAsPrimaryKey().createColumn() + .addNumberColumn("VERSION", Integer.class).size(38).decimalDigits(0).notNull().createColumn() + .endColumns() + .primaryKey().addPrimaryKeyGenerator(UUIDPKGenerator.getInstance()).endPrimaryKey() + .endBuildTables().buildSchema(); QDynamicTable qDynamicTable = qDynamicTableFactory.getQDynamicTableByName("TEST_DYNAMIC_TABLE"); DynamicTableModel testTableVersion = new DynamicTableModel(qDynamicTable); CrudBuilder builder = ormQueryFactory.modify(qDynamicTable) @@ -230,11 +230,11 @@ public void testConcurrentlyDynamicUpdateFail() throws InterruptedException, Exe ormQueryFactory.transactionManager().startTransactionIfNeeded(); qDynamicTableFactory.buildTables("TEST_DYNAMIC_TABLE") - .columns().addStringColumn("ID").size(100).useAsPrimaryKey().create() - .addNumberColumn("VERSION", Integer.class).size(38).decimalDigits(0).notNull().create() - .finish() - .addPrimaryKey().addPrimaryKeyGenerator(UUIDPKGenerator.getInstance()).finish() - .finish().buildSchema(); + .columns().addStringColumn("ID").size(100).useAsPrimaryKey().createColumn() + .addNumberColumn("VERSION", Integer.class).size(38).decimalDigits(0).notNull().createColumn() + .endColumns() + .primaryKey().addPrimaryKeyGenerator(UUIDPKGenerator.getInstance()).endPrimaryKey() + .endBuildTables().buildSchema(); QDynamicTable qDynamicTable = qDynamicTableFactory.getQDynamicTableByName("TEST_DYNAMIC_TABLE"); DynamicTableModel testTableVersion = new DynamicTableModel(qDynamicTable); CrudBuilder builder = ormQueryFactory.modify(qDynamicTable) diff --git a/dynamic-orm-core/src/test/java/com/github/vzakharchenko/dynamic/orm/core/pk/PKGeneratorLongTest.java b/dynamic-orm-core/src/test/java/com/github/vzakharchenko/dynamic/orm/core/pk/PKGeneratorLongTest.java index d2c927d..a6220f8 100644 --- a/dynamic-orm-core/src/test/java/com/github/vzakharchenko/dynamic/orm/core/pk/PKGeneratorLongTest.java +++ b/dynamic-orm-core/src/test/java/com/github/vzakharchenko/dynamic/orm/core/pk/PKGeneratorLongTest.java @@ -11,9 +11,9 @@ public class PKGeneratorLongTest extends AnnotationTestQueryOrm { @Test public void uniq() { qDynamicTableFactory.buildTables("testTable") - .columns().addNumberColumn("Id", Long.class).useAsPrimaryKey().create().finish() - .addPrimaryKey().addPrimaryKeyGenerator(PKGeneratorLong.getInstance()).finish() - .finish().buildSchema(); + .columns().addNumberColumn("Id", Long.class).useAsPrimaryKey().createColumn().endColumns() + .primaryKey().addPrimaryKeyGenerator(PKGeneratorLong.getInstance()).endPrimaryKey() + .endBuildTables().buildSchema(); QDynamicTable testTable = qDynamicTableFactory.getQDynamicTableByName("testTable"); DynamicTableModel newDynamicTableModel = new DynamicTableModel(testTable); ormQueryFactory.insert(newDynamicTableModel); From 52877296934000412ffb76113bb291730a9ebb0c Mon Sep 17 00:00:00 2001 From: vzakharchenko Date: Wed, 25 Mar 2020 17:28:37 +0200 Subject: [PATCH 2/4] fix --- .../liquibase/DynamicDatabaseSnapshot.java | 64 ++---------------- .../structure/liquibase/LiquibaseHelper.java | 65 +++++++++++++++++++ 2 files changed, 70 insertions(+), 59 deletions(-) diff --git a/dynamic-orm-core/src/main/java/com/github/vzakharchenko/dynamic/orm/core/dynamic/structure/liquibase/DynamicDatabaseSnapshot.java b/dynamic-orm-core/src/main/java/com/github/vzakharchenko/dynamic/orm/core/dynamic/structure/liquibase/DynamicDatabaseSnapshot.java index c4bc1a6..4ed986e 100644 --- a/dynamic-orm-core/src/main/java/com/github/vzakharchenko/dynamic/orm/core/dynamic/structure/liquibase/DynamicDatabaseSnapshot.java +++ b/dynamic-orm-core/src/main/java/com/github/vzakharchenko/dynamic/orm/core/dynamic/structure/liquibase/DynamicDatabaseSnapshot.java @@ -1,9 +1,6 @@ package com.github.vzakharchenko.dynamic.orm.core.dynamic.structure.liquibase; -import com.github.vzakharchenko.dynamic.orm.core.dynamic.IndexData; import com.github.vzakharchenko.dynamic.orm.core.dynamic.structure.LiquibaseHolder; -import com.github.vzakharchenko.dynamic.orm.core.helper.ModelHelper; -import com.querydsl.core.types.Path; import liquibase.database.Database; import liquibase.exception.DatabaseException; import liquibase.snapshot.DatabaseSnapshot; @@ -11,17 +8,16 @@ import liquibase.structure.DatabaseObject; import liquibase.structure.DatabaseObjectCollection; import liquibase.structure.core.*; -import org.apache.commons.collections.CollectionUtils; import org.apache.commons.lang3.StringUtils; import java.lang.reflect.InvocationTargetException; -import java.util.*; +import java.util.Collection; +import java.util.Map; +import java.util.Objects; +import java.util.Set; import java.util.function.Consumer; -import java.util.function.Function; import java.util.stream.Collectors; -import static com.github.vzakharchenko.dynamic.orm.core.dynamic.structure.liquibase.TableFactory.*; - /** * */ @@ -125,60 +121,10 @@ private void mergeDatabase(DatabaseObject databaseObject) { }); } - - private boolean isDeletedForeignKeys(ForeignKey foreignKey, - List> foreignKeys) { - Set columns = foreignKey.getForeignKeyColumns().stream().map(Column::getName) - .collect(Collectors.toSet()); - return CollectionUtils.isNotEmpty(foreignKeys) && - foreignKeys.stream().anyMatch(foreignKey0 -> - CollectionUtils.isEqualCollection(columns, - foreignKey0.getLocalColumns().stream() - .map((Function, String>) - ModelHelper::getColumnRealName) - .collect(Collectors.toSet()))); - } - - private boolean isDeleted(DatabaseObject databaseObject, List removedColumns) { - if (CollectionUtils.isNotEmpty(removedColumns)) { - return removedColumns.stream().anyMatch(s -> - removedColumns.contains(StringUtils.upperCase( - databaseObject.getAttribute( - "name", String.class)))); - } - return false; - } - - private boolean isDeletedTableOrigin(DatabaseObject databaseObject, Relation tableOrigin) { - if (databaseObject instanceof ForeignKey) { - List> foreignKeyList = - tableOrigin.getAttribute(DELETED_FOREIGN_KEYS, List.class); - return isDeletedForeignKeys((ForeignKey) databaseObject, foreignKeyList); - } - if (databaseObject instanceof Index) { - List indexList = - tableOrigin.getAttribute(DELETED_INDICES, List.class); - return isDeletedIndex((Index) databaseObject, indexList); - } - return isDeleted(databaseObject, tableOrigin - .getAttribute(DELETED_STRING_OBJECTS, List.class)); - } - - private boolean isDeletedIndex(Index index, List indexList) { - Set columns = index.getColumns().stream().map(Column::getName) - .collect(Collectors.toSet()); - return CollectionUtils.isNotEmpty(indexList) && - indexList.stream().anyMatch(index0 -> - CollectionUtils.isEqualCollection(columns, - index0.getColumns().stream() - .map(ModelHelper::getColumnRealName) - .collect(Collectors.toSet()))); - } - private boolean isDeleted(DatabaseObject databaseObject, Relation table) { Relation tableOrigin = getDatabaseObjectCollection().get(table, null); if (tableOrigin != null) { - return isDeletedTableOrigin(databaseObject, tableOrigin); + return LiquibaseHelper.isDeletedTableOrigin(databaseObject, tableOrigin); } return false; } diff --git a/dynamic-orm-core/src/main/java/com/github/vzakharchenko/dynamic/orm/core/dynamic/structure/liquibase/LiquibaseHelper.java b/dynamic-orm-core/src/main/java/com/github/vzakharchenko/dynamic/orm/core/dynamic/structure/liquibase/LiquibaseHelper.java index 5765d64..7c72ed0 100644 --- a/dynamic-orm-core/src/main/java/com/github/vzakharchenko/dynamic/orm/core/dynamic/structure/liquibase/LiquibaseHelper.java +++ b/dynamic-orm-core/src/main/java/com/github/vzakharchenko/dynamic/orm/core/dynamic/structure/liquibase/LiquibaseHelper.java @@ -1,9 +1,23 @@ package com.github.vzakharchenko.dynamic.orm.core.dynamic.structure.liquibase; +import com.github.vzakharchenko.dynamic.orm.core.dynamic.IndexData; +import com.github.vzakharchenko.dynamic.orm.core.helper.ModelHelper; +import com.querydsl.core.types.Path; import liquibase.structure.DatabaseObject; +import liquibase.structure.core.Column; +import liquibase.structure.core.ForeignKey; +import liquibase.structure.core.Index; import liquibase.structure.core.Relation; +import org.apache.commons.collections.CollectionUtils; +import org.apache.commons.lang3.StringUtils; +import java.util.List; import java.util.Optional; +import java.util.Set; +import java.util.function.Function; +import java.util.stream.Collectors; + +import static com.github.vzakharchenko.dynamic.orm.core.dynamic.structure.liquibase.TableFactory.*; public final class LiquibaseHelper { private LiquibaseHelper() { @@ -27,4 +41,55 @@ private static Relation getIndexRelation(DatabaseObject databaseObject) { private static Relation getSimpleRelation(DatabaseObject databaseObject) { return databaseObject.getAttribute("relation", Relation.class); } + + + public static boolean isDeletedTableOrigin(DatabaseObject databaseObject, Relation tableOrigin) { + if (databaseObject instanceof ForeignKey) { + List> foreignKeyList = + tableOrigin.getAttribute(DELETED_FOREIGN_KEYS, List.class); + return isDeletedForeignKeys((ForeignKey) databaseObject, foreignKeyList); + } + if (databaseObject instanceof Index) { + List indexList = + tableOrigin.getAttribute(DELETED_INDICES, List.class); + return isDeletedIndex((Index) databaseObject, indexList); + } + return isDeleted(databaseObject, tableOrigin + .getAttribute(DELETED_STRING_OBJECTS, List.class)); + } + + private static boolean isDeletedForeignKeys(ForeignKey foreignKey, + List> foreignKeys) { + Set columns = foreignKey.getForeignKeyColumns().stream().map(Column::getName) + .collect(Collectors.toSet()); + return CollectionUtils.isNotEmpty(foreignKeys) && + foreignKeys.stream().anyMatch(foreignKey0 -> + CollectionUtils.isEqualCollection(columns, + foreignKey0.getLocalColumns().stream() + .map((Function, String>) + ModelHelper::getColumnRealName) + .collect(Collectors.toSet()))); + } + + private static boolean isDeleted(DatabaseObject databaseObject, List removedColumns) { + if (CollectionUtils.isNotEmpty(removedColumns)) { + return removedColumns.stream().anyMatch(s -> + removedColumns.contains(StringUtils.upperCase( + databaseObject.getAttribute( + "name", String.class)))); + } + return false; + } + + + private static boolean isDeletedIndex(Index index, List indexList) { + Set columns = index.getColumns().stream().map(Column::getName) + .collect(Collectors.toSet()); + return CollectionUtils.isNotEmpty(indexList) && + indexList.stream().anyMatch(index0 -> + CollectionUtils.isEqualCollection(columns, + index0.getColumns().stream() + .map(ModelHelper::getColumnRealName) + .collect(Collectors.toSet()))); + } } From d3004839a598dedbe5735de3d8589206789fca59 Mon Sep 17 00:00:00 2001 From: vzakharchenko Date: Wed, 25 Mar 2020 17:40:27 +0200 Subject: [PATCH 3/4] clear cache after modification schema --- .../dynamic/orm/core/dynamic/AbstractDynamicContext.java | 1 + .../dynamic/orm/core/dynamic/QAbstractDynamicTable.java | 8 ++++++++ .../dynamic/orm/core/dynamic/QDynamicTable.java | 5 +++++ .../orm/core/dynamic/QDynamicTableFactoryImpl.java | 4 ++++ .../dynamic/orm/core/helper/CacheHelper.java | 8 ++++++++ .../vzakharchenko/dynamic/orm/AbstractTestQueryOrm.java | 1 + 6 files changed, 27 insertions(+) diff --git a/dynamic-orm-core/src/main/java/com/github/vzakharchenko/dynamic/orm/core/dynamic/AbstractDynamicContext.java b/dynamic-orm-core/src/main/java/com/github/vzakharchenko/dynamic/orm/core/dynamic/AbstractDynamicContext.java index 5ea09d5..6bc6547 100644 --- a/dynamic-orm-core/src/main/java/com/github/vzakharchenko/dynamic/orm/core/dynamic/AbstractDynamicContext.java +++ b/dynamic-orm-core/src/main/java/com/github/vzakharchenko/dynamic/orm/core/dynamic/AbstractDynamicContext.java @@ -44,6 +44,7 @@ public void registerQ(Map qDynamicTableMap, for (QDynamicTable qDynamicTable : qDynamicTables) { qDynamicTableMap.put(StringUtils.upperCase( qDynamicTable.getTableName()), qDynamicTable); + qDynamicTable.reInit(); } updateCache(qDynamicTableMap, cacheName); } diff --git a/dynamic-orm-core/src/main/java/com/github/vzakharchenko/dynamic/orm/core/dynamic/QAbstractDynamicTable.java b/dynamic-orm-core/src/main/java/com/github/vzakharchenko/dynamic/orm/core/dynamic/QAbstractDynamicTable.java index a92311d..55cb277 100644 --- a/dynamic-orm-core/src/main/java/com/github/vzakharchenko/dynamic/orm/core/dynamic/QAbstractDynamicTable.java +++ b/dynamic-orm-core/src/main/java/com/github/vzakharchenko/dynamic/orm/core/dynamic/QAbstractDynamicTable.java @@ -167,6 +167,14 @@ public List> deletedForeignKeys() { return this.removedForeignKeys; } + protected abstract void init(); + + public void reInit() { + deletedColumns().clear(); + deletedForeignKeys().clear(); + init(); + } + public void removeForeignKey(List> localColumns) { List> foreignKeys = getForeignKeys().stream().filter( (Predicate>) foreignKey -> diff --git a/dynamic-orm-core/src/main/java/com/github/vzakharchenko/dynamic/orm/core/dynamic/QDynamicTable.java b/dynamic-orm-core/src/main/java/com/github/vzakharchenko/dynamic/orm/core/dynamic/QDynamicTable.java index 5db240d..6c74759 100644 --- a/dynamic-orm-core/src/main/java/com/github/vzakharchenko/dynamic/orm/core/dynamic/QDynamicTable.java +++ b/dynamic-orm-core/src/main/java/com/github/vzakharchenko/dynamic/orm/core/dynamic/QDynamicTable.java @@ -37,6 +37,11 @@ protected QDynamicTable(String tableName) { super(StringUtils.upperCase(tableName)); } + @Override + protected void init() { + removedIndexList.clear(); + } + // CHECKSTYLE:OFF @Override public boolean equals(Object o) { //NOPMD diff --git a/dynamic-orm-core/src/main/java/com/github/vzakharchenko/dynamic/orm/core/dynamic/QDynamicTableFactoryImpl.java b/dynamic-orm-core/src/main/java/com/github/vzakharchenko/dynamic/orm/core/dynamic/QDynamicTableFactoryImpl.java index 10f48ef..440f27c 100644 --- a/dynamic-orm-core/src/main/java/com/github/vzakharchenko/dynamic/orm/core/dynamic/QDynamicTableFactoryImpl.java +++ b/dynamic-orm-core/src/main/java/com/github/vzakharchenko/dynamic/orm/core/dynamic/QDynamicTableFactoryImpl.java @@ -7,6 +7,7 @@ import com.github.vzakharchenko.dynamic.orm.core.dynamic.structure.DynamicStructureSaver; import com.github.vzakharchenko.dynamic.orm.core.dynamic.structure.DynamicStructureUpdater; import com.github.vzakharchenko.dynamic.orm.core.dynamic.structure.LiquibaseHolder; +import com.github.vzakharchenko.dynamic.orm.core.helper.CacheHelper; import liquibase.database.Database; import liquibase.database.DatabaseFactory; import liquibase.database.jvm.JdbcConnection; @@ -150,6 +151,9 @@ public void clear() { sequenceModelMap.clear(); dynamicTableMap.clear(); viewModelMap.clear(); + removedTables.clear(); + removedSequences.clear(); + CacheHelper.getAccessQueryContext(ormQueryFactory).clearCache(); } diff --git a/dynamic-orm-core/src/main/java/com/github/vzakharchenko/dynamic/orm/core/helper/CacheHelper.java b/dynamic-orm-core/src/main/java/com/github/vzakharchenko/dynamic/orm/core/helper/CacheHelper.java index 04767e7..7646f7b 100644 --- a/dynamic-orm-core/src/main/java/com/github/vzakharchenko/dynamic/orm/core/helper/CacheHelper.java +++ b/dynamic-orm-core/src/main/java/com/github/vzakharchenko/dynamic/orm/core/helper/CacheHelper.java @@ -1,6 +1,8 @@ package com.github.vzakharchenko.dynamic.orm.core.helper; +import com.github.vzakharchenko.dynamic.orm.core.AccessQueryContext; import com.github.vzakharchenko.dynamic.orm.core.DMLModel; +import com.github.vzakharchenko.dynamic.orm.core.OrmQueryFactory; import com.github.vzakharchenko.dynamic.orm.core.cache.CachedAllData; import com.github.vzakharchenko.dynamic.orm.core.cache.CachedColumn; import com.github.vzakharchenko.dynamic.orm.core.cache.CachedColumnWithValue; @@ -11,6 +13,7 @@ import com.querydsl.sql.RelationalPath; import org.apache.commons.collections4.MapUtils; import org.apache.commons.lang3.ObjectUtils; +import org.springframework.util.Assert; import java.io.Serializable; import java.util.Collections; @@ -31,6 +34,11 @@ public abstract class CacheHelper { // } // } + public static AccessQueryContext getAccessQueryContext(OrmQueryFactory ormQueryFactory) { + Assert.notNull(ormQueryFactory, ormQueryFactory + " is null"); + return (AccessQueryContext) ormQueryFactory; + } + public static CachedAllData buildAllDataCache(RelationalPath qTable) { return new CachedAllData(qTable); diff --git a/dynamic-orm-core/src/test/java/com/github/vzakharchenko/dynamic/orm/AbstractTestQueryOrm.java b/dynamic-orm-core/src/test/java/com/github/vzakharchenko/dynamic/orm/AbstractTestQueryOrm.java index c293502..248e032 100644 --- a/dynamic-orm-core/src/test/java/com/github/vzakharchenko/dynamic/orm/AbstractTestQueryOrm.java +++ b/dynamic-orm-core/src/test/java/com/github/vzakharchenko/dynamic/orm/AbstractTestQueryOrm.java @@ -104,6 +104,7 @@ public void dropSchema() { for (DbStructureService dbStructureService : dbStructureServices) { dbStructureService.clear(); } + qDynamicTableFactory.clear(); checkConnectionLeaks(); } From 5d2a7c583817fd44715944402b89eb685b33a217 Mon Sep 17 00:00:00 2001 From: vzakharchenko Date: Wed, 25 Mar 2020 18:27:52 +0200 Subject: [PATCH 4/4] small fix --- README.md | 10 ++++++---- .../dynamic/orm/core/DebugSpringAnnotationTest.java | 11 ++++++----- 2 files changed, 12 insertions(+), 9 deletions(-) diff --git a/README.md b/README.md index 6b7552b..365f005 100644 --- a/README.md +++ b/README.md @@ -158,11 +158,13 @@ public class SpringAnnotationTest extends CachingConfigurerSupport { @Bean() public OrmQueryFactory ormQueryFactory() { - OrmQueryFactory ormQueryFactory = OrmQueryFactoryInit.create(dataSource()) + OrmQueryFactoryInit.create(dataSource()) .transactionCacheManager(new TransactionCacheManagerImpl(cacheManager())) - .transactionalEventPublisher(transactionAwareApplicationEventPublisher) - .transactionManager(transactionNameManager).build(); - return ormQueryFactory; + .transactionalEventPublisher(transactionAwareApplicationEventPublisher) // event publisher + .debug() // show all sql queries in console + .cacheRegion("cache-orm") // cache region + .transactionManager(transactionNameManager) + .build(); } @Bean diff --git a/dynamic-orm-core/src/test/java/com/github/vzakharchenko/dynamic/orm/core/DebugSpringAnnotationTest.java b/dynamic-orm-core/src/test/java/com/github/vzakharchenko/dynamic/orm/core/DebugSpringAnnotationTest.java index 3857c08..25e05fb 100644 --- a/dynamic-orm-core/src/test/java/com/github/vzakharchenko/dynamic/orm/core/DebugSpringAnnotationTest.java +++ b/dynamic-orm-core/src/test/java/com/github/vzakharchenko/dynamic/orm/core/DebugSpringAnnotationTest.java @@ -68,12 +68,13 @@ public DbStructureService staticStructure() { @Bean() public OrmQueryFactory ormQueryFactory() { - OrmQueryFactory ormQueryFactory = OrmQueryFactoryInit.create(dataSource()) + return OrmQueryFactoryInit.create(dataSource()) .transactionCacheManager(new TransactionCacheManagerImpl(cacheManager())) - .transactionalEventPublisher(transactionAwareApplicationEventPublisher) - .debug().cacheRegion("cache-orm") - .transactionManager(transactionNameManager).build(); - return ormQueryFactory; + .transactionalEventPublisher(transactionAwareApplicationEventPublisher) // event publisher + .debug() // show all sql queries in console + .cacheRegion("cache-orm") // cache region + .transactionManager(transactionNameManager) + .build(); } @Bean()