From da88293159dea9ad556dfa3d811274965e782092 Mon Sep 17 00:00:00 2001 From: vzakharchenko Date: Wed, 11 Mar 2020 00:05:07 +0200 Subject: [PATCH] added support View --- analizers/exclude-pmd.properties | 2 +- .../orm/core/AbstractShowSqlBuilder.java | 13 +- .../dynamic/orm/core/ShowSqlBuilder.java | 4 +- .../orm/core/dynamic/DynamicContext.java | 12 ++ .../orm/core/dynamic/QBlobBuilder.java | 6 +- .../orm/core/dynamic/QBooleanBuilder.java | 6 +- .../orm/core/dynamic/QCharBuilder.java | 6 +- .../orm/core/dynamic/QClobBuilder.java | 6 +- .../orm/core/dynamic/QDateBuilder.java | 6 +- .../orm/core/dynamic/QDateTimeBuilder.java | 6 +- .../core/dynamic/QDynamicBuilderContext.java | 2 +- .../core/dynamic/QDynamicContextHolder.java | 4 +- .../orm/core/dynamic/QDynamicTable.java | 17 +- .../core/dynamic/QDynamicTableBuilder.java | 103 ++--------- .../core/dynamic/QDynamicTableFactory.java | 26 ++- .../dynamic/QDynamicTableFactoryImpl.java | 74 +++++++- .../core/dynamic/QForeignKeyBuilderImpl.java | 16 +- .../orm/core/dynamic/QIndexBuilderImpl.java | 18 +- .../orm/core/dynamic/QNumberBuilder.java | 6 +- .../core/dynamic/QPrimaryKeyBuilderImpl.java | 19 +- .../orm/core/dynamic/QSequenceBuilder.java | 13 ++ .../core/dynamic/QSequenceBuilderImpl.java | 52 ++++++ .../orm/core/dynamic/QStringBuilder.java | 6 +- .../orm/core/dynamic/QTableBuilder.java | 23 +-- .../orm/core/dynamic/QTimeBuilder.java | 6 +- .../orm/core/dynamic/QViewBuilder.java | 12 ++ .../orm/core/dynamic/QViewBuilderImpl.java | 34 ++++ .../dynamic/orm/core/dynamic/QViewUtils.java | 111 +++++++++++ .../orm/core/dynamic/SequanceModel.java | 56 ++++++ .../dynamic/orm/core/dynamic/ViewModel.java | 49 +++++ .../dynamic/column/QTableColumnContext.java | 5 +- .../column/QTableColumnContextImpl.java | 63 +++---- .../column/builder/QDefaultColumnBuilder.java | 11 +- .../builder/QSizeColumnBuilderImpl.java | 5 +- .../core/dynamic/dml/DynamicTableModel.java | 3 +- .../structure/DynamicStructureSaver.java | 31 +--- .../structure/DynamicStructureUpdater.java | 11 +- .../dynamic/structure/LiquibaseHolder.java | 59 ++++++ .../DynamicDatabaseSnapshotFactory.java | 70 ++++--- .../structure/liquibase/SequanceFactory.java | 15 ++ .../orm/structure/LiquibaseStructure.java | 1 + .../dynamic/orm/DynamicCacheQueryOrm.java | 8 +- .../dynamic/orm/DynamicIndexTest.java | 8 +- .../dynamic/orm/DynamicQueryOrm.java | 173 +++++++++++++++--- .../dynamic/orm/SequanceTest.java | 4 +- .../dynamic/orm/SoftDeleteTest.java | 4 +- .../dynamic/orm/VersionTest.java | 19 +- .../dynamic/orm/core/QueryAnnotationTest.java | 8 +- .../StaticDynamicQueryAnnotationTest.java | 4 +- 49 files changed, 889 insertions(+), 327 deletions(-) create mode 100644 dynamic-orm-core/src/main/java/com/github/vzakharchenko/dynamic/orm/core/dynamic/QSequenceBuilder.java create mode 100644 dynamic-orm-core/src/main/java/com/github/vzakharchenko/dynamic/orm/core/dynamic/QSequenceBuilderImpl.java create mode 100644 dynamic-orm-core/src/main/java/com/github/vzakharchenko/dynamic/orm/core/dynamic/QViewBuilder.java create mode 100644 dynamic-orm-core/src/main/java/com/github/vzakharchenko/dynamic/orm/core/dynamic/QViewBuilderImpl.java create mode 100644 dynamic-orm-core/src/main/java/com/github/vzakharchenko/dynamic/orm/core/dynamic/QViewUtils.java create mode 100644 dynamic-orm-core/src/main/java/com/github/vzakharchenko/dynamic/orm/core/dynamic/SequanceModel.java create mode 100644 dynamic-orm-core/src/main/java/com/github/vzakharchenko/dynamic/orm/core/dynamic/ViewModel.java create mode 100644 dynamic-orm-core/src/main/java/com/github/vzakharchenko/dynamic/orm/core/dynamic/structure/LiquibaseHolder.java create mode 100644 dynamic-orm-core/src/main/java/com/github/vzakharchenko/dynamic/orm/core/dynamic/structure/liquibase/SequanceFactory.java diff --git a/analizers/exclude-pmd.properties b/analizers/exclude-pmd.properties index 6986959..f3a9cd5 100644 --- a/analizers/exclude-pmd.properties +++ b/analizers/exclude-pmd.properties @@ -13,4 +13,4 @@ com.github.vzakharchenko.dynamic.orm.core.query.crud.InsertBuilderImpl=NPathComp com.github.vzakharchenko.dynamic.orm.core.query.crud.ModifyItem=NullAssignment com.github.vzakharchenko.dynamic.orm.core.query.crud.UpdateModelBuilderImpl=TooManyMethods,LooseCoupling com.github.vzakharchenko.dynamic.orm.core.statistic.resolver.QueryResolverFactory=CyclomaticComplexity -com.github.vzakharchenko.dynamic.orm.structure.LiquibaseStructure=ExcessiveImports +com.github.vzakharchenko.dynamic.orm.structure.LiquibaseStructure=ExcessiveImports,CouplingBetweenObjects diff --git a/dynamic-orm-core/src/main/java/com/github/vzakharchenko/dynamic/orm/core/AbstractShowSqlBuilder.java b/dynamic-orm-core/src/main/java/com/github/vzakharchenko/dynamic/orm/core/AbstractShowSqlBuilder.java index ced31a0..fc1488c 100644 --- a/dynamic-orm-core/src/main/java/com/github/vzakharchenko/dynamic/orm/core/AbstractShowSqlBuilder.java +++ b/dynamic-orm-core/src/main/java/com/github/vzakharchenko/dynamic/orm/core/AbstractShowSqlBuilder.java @@ -57,13 +57,6 @@ private boolean searchQModel(SQLCommonQuery sqlQuery, RelationalPath qTabl return false; } - @Override - public String showSql(SQLCommonQuery sqlQuery, Expression expression) { - SQLQuery clone = DBHelper.castProjectionQueryToSqlQuery(sqlQuery).clone(); - clone.setUseLiterals(true); - return clone.select(expression).getSQL().getSQL(); - } - @Override public String showSql(SQLCommonQuery sqlQuery, RelationalPath qTable, @@ -80,4 +73,10 @@ public String showSql(SQLCommonQuery sqlQuery, return showSql(sqlQuery, qTableFromModel, modelClass); } + @Override + public String showSql(SQLCommonQuery sqlQuery, Expression... expressions) { + SQLQuery clone = DBHelper.castProjectionQueryToSqlQuery(sqlQuery).clone(); + clone.setUseLiterals(true); + return clone.select(expressions).getSQL().getSQL(); + } } diff --git a/dynamic-orm-core/src/main/java/com/github/vzakharchenko/dynamic/orm/core/ShowSqlBuilder.java b/dynamic-orm-core/src/main/java/com/github/vzakharchenko/dynamic/orm/core/ShowSqlBuilder.java index f3ef755..d2c8a3e 100644 --- a/dynamic-orm-core/src/main/java/com/github/vzakharchenko/dynamic/orm/core/ShowSqlBuilder.java +++ b/dynamic-orm-core/src/main/java/com/github/vzakharchenko/dynamic/orm/core/ShowSqlBuilder.java @@ -13,11 +13,11 @@ public interface ShowSqlBuilder { * creates the sql query from querydsl object query. * * @param sqlQuery querydsl query - * @param expression column or any other expression + * @param expressions column or any other expression * @return sql query string */ - String showSql(SQLCommonQuery sqlQuery, Expression expression); + String showSql(SQLCommonQuery sqlQuery, Expression... expressions); /** * creates the sql query from querydsl object query. diff --git a/dynamic-orm-core/src/main/java/com/github/vzakharchenko/dynamic/orm/core/dynamic/DynamicContext.java b/dynamic-orm-core/src/main/java/com/github/vzakharchenko/dynamic/orm/core/dynamic/DynamicContext.java index 47089c6..a31bec0 100644 --- a/dynamic-orm-core/src/main/java/com/github/vzakharchenko/dynamic/orm/core/dynamic/DynamicContext.java +++ b/dynamic-orm-core/src/main/java/com/github/vzakharchenko/dynamic/orm/core/dynamic/DynamicContext.java @@ -80,4 +80,16 @@ public QDynamicTable createQTable(String tableName) { QDynamicTable qDynamicTable = dynamicTableMap.get(StringUtils.upperCase(tableName)); return qDynamicTable != null ? qDynamicTable : new QDynamicTable(tableName); } + + public OrmQueryFactory getOrmQueryFactory() { + return ormQueryFactory; + } + + public void registerViews(Collection viewModels) { + viewModels.forEach(viewModel -> { + QDynamicTable qDynamicTable = QViewUtils.transform(database, viewModel); + registerQTable(qDynamicTable); + }); + + } } diff --git a/dynamic-orm-core/src/main/java/com/github/vzakharchenko/dynamic/orm/core/dynamic/QBlobBuilder.java b/dynamic-orm-core/src/main/java/com/github/vzakharchenko/dynamic/orm/core/dynamic/QBlobBuilder.java index 51590eb..4dc79c1 100644 --- a/dynamic-orm-core/src/main/java/com/github/vzakharchenko/dynamic/orm/core/dynamic/QBlobBuilder.java +++ b/dynamic-orm-core/src/main/java/com/github/vzakharchenko/dynamic/orm/core/dynamic/QBlobBuilder.java @@ -11,8 +11,10 @@ public class QBlobBuilder extends QSizeColumnBuilderImpl> { - public QBlobBuilder(QTableColumnContext qTableColumn, String columnName) { - super(qTableColumn, columnName); + public QBlobBuilder(QTableColumnContext qTableColumn, + QDynamicTable dynamicTable, + String columnName) { + super(qTableColumn, dynamicTable, columnName); } @Override diff --git a/dynamic-orm-core/src/main/java/com/github/vzakharchenko/dynamic/orm/core/dynamic/QBooleanBuilder.java b/dynamic-orm-core/src/main/java/com/github/vzakharchenko/dynamic/orm/core/dynamic/QBooleanBuilder.java index f2e8596..8965d6b 100644 --- a/dynamic-orm-core/src/main/java/com/github/vzakharchenko/dynamic/orm/core/dynamic/QBooleanBuilder.java +++ b/dynamic-orm-core/src/main/java/com/github/vzakharchenko/dynamic/orm/core/dynamic/QBooleanBuilder.java @@ -11,8 +11,10 @@ public class QBooleanBuilder extends QDefaultColumnBuilder> { - public QBooleanBuilder(QTableColumnContext qTableColumn, String columnName) { - super(qTableColumn, columnName); + public QBooleanBuilder(QTableColumnContext qTableColumn, + QDynamicTable dynamicTable, + String columnName) { + super(qTableColumn, dynamicTable, columnName); } @Override diff --git a/dynamic-orm-core/src/main/java/com/github/vzakharchenko/dynamic/orm/core/dynamic/QCharBuilder.java b/dynamic-orm-core/src/main/java/com/github/vzakharchenko/dynamic/orm/core/dynamic/QCharBuilder.java index 0606d55..f4f2aca 100644 --- a/dynamic-orm-core/src/main/java/com/github/vzakharchenko/dynamic/orm/core/dynamic/QCharBuilder.java +++ b/dynamic-orm-core/src/main/java/com/github/vzakharchenko/dynamic/orm/core/dynamic/QCharBuilder.java @@ -11,8 +11,10 @@ public class QCharBuilder extends QSizeColumnBuilderImpl> { - public QCharBuilder(QTableColumnContext qTableColumn, String columnName) { - super(qTableColumn, columnName); + public QCharBuilder(QTableColumnContext qTableColumn, + QDynamicTable dynamicTable, + String columnName) { + super(qTableColumn, dynamicTable, columnName); } @Override diff --git a/dynamic-orm-core/src/main/java/com/github/vzakharchenko/dynamic/orm/core/dynamic/QClobBuilder.java b/dynamic-orm-core/src/main/java/com/github/vzakharchenko/dynamic/orm/core/dynamic/QClobBuilder.java index 303e214..c7e10f9 100644 --- a/dynamic-orm-core/src/main/java/com/github/vzakharchenko/dynamic/orm/core/dynamic/QClobBuilder.java +++ b/dynamic-orm-core/src/main/java/com/github/vzakharchenko/dynamic/orm/core/dynamic/QClobBuilder.java @@ -11,8 +11,10 @@ public class QClobBuilder extends QSizeColumnBuilderImpl> { - public QClobBuilder(QTableColumnContext qTableColumn, String columnName) { - super(qTableColumn, columnName); + public QClobBuilder(QTableColumnContext qTableColumn, + QDynamicTable dynamicTable, + String columnName) { + super(qTableColumn, dynamicTable, columnName); } @Override diff --git a/dynamic-orm-core/src/main/java/com/github/vzakharchenko/dynamic/orm/core/dynamic/QDateBuilder.java b/dynamic-orm-core/src/main/java/com/github/vzakharchenko/dynamic/orm/core/dynamic/QDateBuilder.java index 7975202..c632fef 100644 --- a/dynamic-orm-core/src/main/java/com/github/vzakharchenko/dynamic/orm/core/dynamic/QDateBuilder.java +++ b/dynamic-orm-core/src/main/java/com/github/vzakharchenko/dynamic/orm/core/dynamic/QDateBuilder.java @@ -11,8 +11,10 @@ public class QDateBuilder extends QSizeColumnBuilderImpl> { - public QDateBuilder(QTableColumnContext qTableColumn, String columnName) { - super(qTableColumn, columnName); + public QDateBuilder(QTableColumnContext qTableColumn, + QDynamicTable dynamicTable, + String columnName) { + super(qTableColumn, dynamicTable, columnName); } @Override diff --git a/dynamic-orm-core/src/main/java/com/github/vzakharchenko/dynamic/orm/core/dynamic/QDateTimeBuilder.java b/dynamic-orm-core/src/main/java/com/github/vzakharchenko/dynamic/orm/core/dynamic/QDateTimeBuilder.java index 88b265b..6d8bf0a 100644 --- a/dynamic-orm-core/src/main/java/com/github/vzakharchenko/dynamic/orm/core/dynamic/QDateTimeBuilder.java +++ b/dynamic-orm-core/src/main/java/com/github/vzakharchenko/dynamic/orm/core/dynamic/QDateTimeBuilder.java @@ -11,8 +11,10 @@ public class QDateTimeBuilder extends QSizeColumnBuilderImpl> { - public QDateTimeBuilder(QTableColumnContext qTableColumn, String columnName) { - super(qTableColumn, columnName); + public QDateTimeBuilder(QTableColumnContext qTableColumn, + QDynamicTable dynamicTable, + String columnName) { + super(qTableColumn, dynamicTable, columnName); } @Override diff --git a/dynamic-orm-core/src/main/java/com/github/vzakharchenko/dynamic/orm/core/dynamic/QDynamicBuilderContext.java b/dynamic-orm-core/src/main/java/com/github/vzakharchenko/dynamic/orm/core/dynamic/QDynamicBuilderContext.java index f0e17ca..3104baa 100644 --- a/dynamic-orm-core/src/main/java/com/github/vzakharchenko/dynamic/orm/core/dynamic/QDynamicBuilderContext.java +++ b/dynamic-orm-core/src/main/java/com/github/vzakharchenko/dynamic/orm/core/dynamic/QDynamicBuilderContext.java @@ -1,4 +1,4 @@ package com.github.vzakharchenko.dynamic.orm.core.dynamic; -public interface QDynamicBuilderContext extends QTableBuilder, QDynamicContextHolder { +public interface QDynamicBuilderContext extends QDynamicTableFactory, QDynamicContextHolder { } diff --git a/dynamic-orm-core/src/main/java/com/github/vzakharchenko/dynamic/orm/core/dynamic/QDynamicContextHolder.java b/dynamic-orm-core/src/main/java/com/github/vzakharchenko/dynamic/orm/core/dynamic/QDynamicContextHolder.java index 0d224d8..538eadf 100644 --- a/dynamic-orm-core/src/main/java/com/github/vzakharchenko/dynamic/orm/core/dynamic/QDynamicContextHolder.java +++ b/dynamic-orm-core/src/main/java/com/github/vzakharchenko/dynamic/orm/core/dynamic/QDynamicContextHolder.java @@ -6,11 +6,11 @@ public interface QDynamicContextHolder { DataSource getDataSource(); - QDynamicTable getDynamicTable(); - DynamicContext getDynamicContext(); Map getContextTables(); + Map getContextSequances(); + Map getViewSequances(); } 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 9294406..2b16179 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 @@ -4,7 +4,6 @@ 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.ImmutableMap; import com.querydsl.core.types.Path; import com.querydsl.sql.RelationalPath; import org.apache.commons.lang3.ObjectUtils; @@ -12,7 +11,9 @@ import org.springframework.util.Assert; import java.io.Serializable; -import java.util.*; +import java.util.ArrayList; +import java.util.Collections; +import java.util.List; /** * @@ -20,11 +21,10 @@ public final class QDynamicTable extends QAbstractDynamicTable { public static final String WRONG_COLUMN = "Wrong column "; - private final Map customFields = new HashMap<>(); + private final List indexDatas = new ArrayList<>(); private PKGenerator pkGenerator; private Path versionColumn; private SoftDelete softDelete; - private final List indexDatas = new ArrayList<>(); protected QDynamicTable(String tableName) { super(StringUtils.upperCase(tableName)); @@ -158,13 +158,4 @@ protected List getIndexDatas() { return Collections .unmodifiableList(indexDatas); } - - protected QDynamicTable registerCustomFields(Serializable key, Serializable value) { - customFields.put(key, value); - return this; - } - - public Map getCustomFields() { - return ImmutableMap.copyOf(customFields); - } } 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 b964f7c..5f4ab7f 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 @@ -6,79 +6,60 @@ import com.github.vzakharchenko.dynamic.orm.core.dynamic.fk.QForeignKeyBuilder; import com.github.vzakharchenko.dynamic.orm.core.dynamic.index.QIndexBuilder; import com.github.vzakharchenko.dynamic.orm.core.dynamic.pk.QPrimaryKeyBuilder; -import com.github.vzakharchenko.dynamic.orm.core.dynamic.structure.DynamicStructureSaver; -import com.github.vzakharchenko.dynamic.orm.core.dynamic.structure.DynamicStructureUpdater; import com.querydsl.core.types.Path; import org.apache.commons.lang3.StringUtils; import javax.sql.DataSource; import java.io.Serializable; -import java.util.HashMap; -import java.util.Map; /** * */ -public final class QDynamicTableBuilder implements QDynamicBuilderContext { +public final class QDynamicTableBuilder implements QTableBuilder { - private final DynamicContext dynamicContext; + private final QDynamicBuilderContext dynamicContextHolder; private final DataSource dataSource; - private DynamicStructureUpdater dynamicStructureUpdater; private QDynamicTable qDynamicTable; - private Map dynamicTableMap = new HashMap<>(); - - private QDynamicTableBuilder( - QDynamicTable qDynamicTable, DataSource dataSource, - DynamicContext dynamicContext, Map dynamicTableMap) { - this(qDynamicTable, dataSource, dynamicContext); - this.dynamicTableMap = dynamicTableMap; - } private QDynamicTableBuilder(QDynamicTable qDynamicTable, DataSource dataSource, - DynamicContext dynamicContext) { + QDynamicBuilderContext dynamicContextHolder) { this.qDynamicTable = qDynamicTable; - this.dynamicStructureUpdater = new DynamicStructureSaver(dataSource); - this.dynamicContext = dynamicContext; + this.dynamicContextHolder = dynamicContextHolder; this.dataSource = dataSource; } - private static QTableBuilder createBuilder( + public static QTableBuilder createBuilder( String tableName, DataSource dataSource, - DynamicContext dynamicContext, - Map dynamicTableMap) { + QDynamicBuilderContext dynamicContextHolder) { return new QDynamicTableBuilder( - dynamicContext.createQTable(tableName), - dataSource, dynamicContext, dynamicTableMap); - } - - public static QTableBuilder createBuilder( - String tableName, DataSource dataSource, DynamicContext dynamicContext) { - return new QDynamicTableBuilder(dynamicContext.createQTable(tableName), dataSource, dynamicContext); + dynamicContextHolder.getDynamicContext().createQTable(tableName), + dataSource, dynamicContextHolder); } @Override public QTableColumn addColumns() { - return new QTableColumnContextImpl(this); + return new QTableColumnContextImpl(dynamicContextHolder, + this, qDynamicTable); } @Override public QPrimaryKeyBuilder addPrimaryKey() { - return new QPrimaryKeyBuilderImpl(this); + return new QPrimaryKeyBuilderImpl(this, qDynamicTable); } @Override public QForeignKeyBuilder addForeignKey() { - return new QForeignKeyBuilderImpl(this); + return new QForeignKeyBuilderImpl(this, qDynamicTable, dynamicContextHolder); } @Override public QIndexBuilder addIndex() { - return new QIndexBuilderImpl(this); + return new QIndexBuilderImpl(this, qDynamicTable); } @Override @@ -100,67 +81,19 @@ public QTableBuilder addSoftDeleteColumn( return this; } - @Override - public QTableBuilder addCustomField(Serializable key, Serializable value) { - qDynamicTable = qDynamicTable.registerCustomFields(key, value); - return this; - } - - @Override - public QTableBuilder addSoftDeleteColumn( - Path column, TYPE value, TYPE defaultValue) { - qDynamicTable = qDynamicTable.addSoftDeleteColumn(column, value, defaultValue); - return this; - } - @Override public QTableBuilder buildNextTable(String tableName) { - dynamicTableMap.put(StringUtils.upperCase( - qDynamicTable.getTableName()), qDynamicTable); - return createBuilder(tableName, dataSource, dynamicContext, dynamicTableMap); - } - - - @Override - public void buildSchema() { - dynamicTableMap.put(StringUtils.upperCase( + dynamicContextHolder.getContextTables().put(StringUtils.upperCase( qDynamicTable.getTableName()), qDynamicTable); - dynamicStructureUpdater.update(dynamicTableMap); - dynamicContext.registerQTables(dynamicTableMap.values()); - } - - @Override - public void support() { - dynamicTableMap.put(StringUtils.upperCase( - qDynamicTable.getTableName()), qDynamicTable); - dynamicContext.registerQTables(dynamicTableMap.values()); - } - - @Override - public void clear() { - dynamicTableMap.clear(); - dynamicStructureUpdater = new DynamicStructureSaver(dataSource); + return createBuilder(tableName, dataSource, dynamicContextHolder); } @Override - public DataSource getDataSource() { - return dataSource; + public QDynamicTableFactory finish() { + dynamicContextHolder.getContextTables().put(qDynamicTable.getTableName(), qDynamicTable); + return dynamicContextHolder; } - @Override - public QDynamicTable getDynamicTable() { - return qDynamicTable; - } - - @Override - public DynamicContext getDynamicContext() { - return dynamicContext; - } - - @Override - public Map getContextTables() { - return dynamicTableMap; - } } diff --git a/dynamic-orm-core/src/main/java/com/github/vzakharchenko/dynamic/orm/core/dynamic/QDynamicTableFactory.java b/dynamic-orm-core/src/main/java/com/github/vzakharchenko/dynamic/orm/core/dynamic/QDynamicTableFactory.java index f888844..fdcebce 100644 --- a/dynamic-orm-core/src/main/java/com/github/vzakharchenko/dynamic/orm/core/dynamic/QDynamicTableFactory.java +++ b/dynamic-orm-core/src/main/java/com/github/vzakharchenko/dynamic/orm/core/dynamic/QDynamicTableFactory.java @@ -19,6 +19,7 @@ public interface QDynamicTableFactory { /** * get list of dynamic Tables + * * @return */ Collection getQDynamicTables(); @@ -30,7 +31,30 @@ public interface QDynamicTableFactory { * @return tableBuilder * @see QTableBuilder */ - QTableBuilder buildTable(String tableName); + QTableBuilder buildTables(String tableName); + /** + * add sequance + * + * @param sequanceName + * @return builder + */ + QSequenceBuilder createSequence(String sequanceName); + + /** + * create SQL View (Virtual table) + * + * @param viewName + * @return + */ + QViewBuilder createView(String viewName); + + /** + * The construction of the table using ddl queries + *

+ * Attention! existing columns are not deleted + */ + void buildSchema(); + void clear(); } 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 168a05c..ee7dced 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 @@ -1,6 +1,9 @@ package com.github.vzakharchenko.dynamic.orm.core.dynamic; import com.github.vzakharchenko.dynamic.orm.core.OrmQueryFactory; +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 liquibase.database.Database; import liquibase.database.DatabaseFactory; import liquibase.database.jvm.JdbcConnection; @@ -10,22 +13,28 @@ import javax.sql.DataSource; import java.sql.Connection; import java.util.Collection; +import java.util.HashMap; +import java.util.Map; /** * */ -public class QDynamicTableFactoryImpl implements QDynamicTableFactory, AccessDynamicContext { +public class QDynamicTableFactoryImpl implements QDynamicBuilderContext, AccessDynamicContext { private final DataSource dataSource; - - private DynamicContext dynamicContext; - private final Database database; private final OrmQueryFactory ormQueryFactory; + private DynamicContext dynamicContext; + private DynamicStructureUpdater dynamicStructureUpdater; + + private final Map dynamicTableMap = new HashMap<>(); + private final Map sequenceModelMap = new HashMap<>(); + private final Map viewModelMap = new HashMap<>(); public QDynamicTableFactoryImpl(OrmQueryFactory ormQueryFactory, DataSource dataSource) { this.dataSource = dataSource; this.ormQueryFactory = ormQueryFactory; + this.dynamicStructureUpdater = new DynamicStructureSaver(dataSource); Connection connection = DataSourceUtils.getConnection(dataSource); try { this.database = DatabaseFactory.getInstance() @@ -37,7 +46,8 @@ public QDynamicTableFactoryImpl(OrmQueryFactory ormQueryFactory, } } - private DynamicContext getDynamicContext() { + @Override + public DynamicContext getDynamicContext() { if (dynamicContext == null) { dynamicContext = new DynamicContext(database, ormQueryFactory); } @@ -56,12 +66,62 @@ public Collection getQDynamicTables() { @Override - public QTableBuilder buildTable(String tableName) { - return QDynamicTableBuilder.createBuilder(tableName, dataSource, getDynamicContext()); + public QTableBuilder buildTables(String tableName) { + return QDynamicTableBuilder.createBuilder(tableName, dataSource, this); } + + @Override + public QSequenceBuilder createSequence(String sequenceName) { + return new QSequenceBuilderImpl(sequenceName, this); + } + + @Override + public QViewBuilder createView(String viewName) { + return new QViewBuilderImpl(this, viewName); + } + + @Override + public void buildSchema() { + dynamicStructureUpdater.update(LiquibaseHolder.create(dynamicTableMap, + sequenceModelMap, viewModelMap)); + dynamicContext.registerQTables(dynamicTableMap.values()); + dynamicContext.registerViews(viewModelMap.values()); + clear(); + } + + @Override + public void clear() { + sequenceModelMap.clear(); + dynamicTableMap.clear(); + viewModelMap.clear(); + dynamicStructureUpdater = new DynamicStructureSaver(dataSource); + } + + @Override public void clearCache() { getDynamicContext().clear(); } + + @Override + public DataSource getDataSource() { + return dataSource; + } + + + @Override + public Map getContextTables() { + return dynamicTableMap; + } + + @Override + public Map getContextSequances() { + return sequenceModelMap; + } + + @Override + public Map getViewSequances() { + return viewModelMap; + } } 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 cdb48e5..56b5951 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 @@ -9,14 +9,20 @@ public class QForeignKeyBuilderImpl implements QForeignKeyBuilder { + private final QTableBuilder tableBuilder; + private final QDynamicTable dynamicTable; private final QDynamicBuilderContext dynamicBuilderContext; - public QForeignKeyBuilderImpl(QDynamicBuilderContext dynamicBuilderContext) { + public QForeignKeyBuilderImpl(QTableBuilder tableBuilder, + QDynamicTable dynamicTable, + QDynamicBuilderContext dynamicBuilderContext) { + this.tableBuilder = tableBuilder; + this.dynamicTable = dynamicTable; this.dynamicBuilderContext = dynamicBuilderContext; } private QDynamicTable getDynamicTable() { - return dynamicBuilderContext.getDynamicTable(); + return dynamicTable; } @Override @@ -25,7 +31,7 @@ public QTableBuilder buildForeignKey( RelationalPath remoteQTable, Path remotePrimaryKey) { getDynamicTable().addForeignKey(localColumn, remoteQTable, remotePrimaryKey); - return dynamicBuilderContext; + return tableBuilder; } @Override @@ -35,13 +41,13 @@ public QTableBuilder buildForeignKey( Path remotePrimaryKey) { getDynamicTable().addForeignKey( localColumnName, remoteQTable, remotePrimaryKey); - return dynamicBuilderContext; + return tableBuilder; } @Override public QTableBuilder buildForeignKey(String localColumnName, RelationalPath remoteQTable) { getDynamicTable().addForeignKey(localColumnName, remoteQTable); - return dynamicBuilderContext; + return tableBuilder; } @Override 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 57bd800..b5225aa 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 @@ -5,22 +5,24 @@ public class QIndexBuilderImpl implements QIndexBuilder { - private final QDynamicBuilderContext dynamicBuilderContext; + private final QTableBuilder tableBuilder; + private final QDynamicTable dynamicTable; - public QIndexBuilderImpl(QDynamicBuilderContext dynamicBuilderContext) { - this.dynamicBuilderContext = dynamicBuilderContext; + public QIndexBuilderImpl(QTableBuilder tableBuilder, + QDynamicTable dynamicTable) { + this.tableBuilder = tableBuilder; + this.dynamicTable = dynamicTable; } - @Override public QTableBuilder buildIndex(Path columnName, boolean unique) { - dynamicBuilderContext.getDynamicTable().addIndex(columnName, unique); - return dynamicBuilderContext; + dynamicTable.addIndex(columnName, unique); + return tableBuilder; } @Override public QTableBuilder buildIndex(String columnName, boolean unique) { - dynamicBuilderContext.getDynamicTable().addIndex(columnName, unique); - return dynamicBuilderContext; + dynamicTable.addIndex(columnName, unique); + return tableBuilder; } } diff --git a/dynamic-orm-core/src/main/java/com/github/vzakharchenko/dynamic/orm/core/dynamic/QNumberBuilder.java b/dynamic-orm-core/src/main/java/com/github/vzakharchenko/dynamic/orm/core/dynamic/QNumberBuilder.java index 754d8dc..6502728 100644 --- a/dynamic-orm-core/src/main/java/com/github/vzakharchenko/dynamic/orm/core/dynamic/QNumberBuilder.java +++ b/dynamic-orm-core/src/main/java/com/github/vzakharchenko/dynamic/orm/core/dynamic/QNumberBuilder.java @@ -14,9 +14,11 @@ public class QNumberBuilder QNumberColumnBuilder> { - public QNumberBuilder(QTableColumnContext qTableColumn, String columnName, + public QNumberBuilder(QTableColumnContext qTableColumn, + QDynamicTable dynamicTable, + String columnName, Class tClass) { - super(qTableColumn, columnName); + super(qTableColumn, dynamicTable, columnName); columnType.setNumberClass(tClass); } 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 b4c875c..4adcfbe 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 @@ -7,31 +7,30 @@ public class QPrimaryKeyBuilderImpl implements QPrimaryKeyBuilder { - private final QDynamicBuilderContext dynamicBuilderContext; + private final QTableBuilder tableBuilder; + private final QDynamicTable dynamicTable; - public QPrimaryKeyBuilderImpl(QDynamicBuilderContext dynamicBuilderContext) { - this.dynamicBuilderContext = dynamicBuilderContext; + public QPrimaryKeyBuilderImpl(QTableBuilder tableBuilder, + QDynamicTable qDynamicTable) { + this.tableBuilder = tableBuilder; + this.dynamicTable = qDynamicTable; } - private QDynamicTable getDynamicTable() { - return dynamicBuilderContext.getDynamicTable(); - } @Override public QPrimaryKeyBuilder addPrimaryKey(Path path) { - getDynamicTable().addPrimaryKey(path); + dynamicTable.addPrimaryKey(path); return this; } @Override public QPrimaryKeyBuilder addPrimaryKey(String columnName) { - getDynamicTable().addPrimaryKey(columnName); + dynamicTable.addPrimaryKey(columnName); return this; } @Override public QPrimaryKeyBuilder addPrimaryKeyGenerator(PKGenerator pkGenerator) { - QDynamicTable dynamicTable = getDynamicTable(); if (!ModelHelper.hasPrimaryKey(dynamicTable)) { throw new IllegalStateException("First add Primary key to Table " + dynamicTable.getTableName()); @@ -42,6 +41,6 @@ public QPrimaryKeyBuilder addPrimaryKeyGenerator(PKGenerator pkGenerator) { @Override public QTableBuilder finish() { - return dynamicBuilderContext; + 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 new file mode 100644 index 0000000..e1f34dd --- /dev/null +++ b/dynamic-orm-core/src/main/java/com/github/vzakharchenko/dynamic/orm/core/dynamic/QSequenceBuilder.java @@ -0,0 +1,13 @@ +package com.github.vzakharchenko.dynamic.orm.core.dynamic; + +public interface QSequenceBuilder { + QSequenceBuilder initialValue(Long initialValue); + + QSequenceBuilder increment(Long incrementValue); + + QSequenceBuilder min(Long minValue); + + QSequenceBuilder max(Long maxValue); + + QDynamicTableFactory finish(); +} 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 new file mode 100644 index 0000000..9ff0894 --- /dev/null +++ b/dynamic-orm-core/src/main/java/com/github/vzakharchenko/dynamic/orm/core/dynamic/QSequenceBuilderImpl.java @@ -0,0 +1,52 @@ +package com.github.vzakharchenko.dynamic.orm.core.dynamic; + +import org.apache.commons.lang3.StringUtils; + +import java.math.BigInteger; +import java.util.Locale; + +public class QSequenceBuilderImpl implements QSequenceBuilder { + + private final QDynamicBuilderContext dynamicBuilderContext; + + private final SequanceModel sequanceModel; + + protected QSequenceBuilderImpl(String name, + QDynamicBuilderContext dynamicBuilderContext + ) { + this.sequanceModel = new SequanceModel(name); + this.dynamicBuilderContext = dynamicBuilderContext; + } + + @Override + public QSequenceBuilder initialValue(Long initialValue) { + sequanceModel.setInitial(BigInteger.valueOf(initialValue)); + return this; + } + + @Override + public QSequenceBuilder increment(Long incrementValue) { + sequanceModel.setIncrement(BigInteger.valueOf(incrementValue)); + return this; + } + + @Override + public QSequenceBuilder min(Long minValue) { + sequanceModel.setMin(BigInteger.valueOf(minValue)); + return this; + } + + @Override + public QSequenceBuilder max(Long maxValue) { + sequanceModel.setMax(BigInteger.valueOf(maxValue)); + return this; + } + + @Override + public QDynamicTableFactory finish() { + dynamicBuilderContext.getContextSequances().put( + StringUtils.upperCase(sequanceModel.getName(), Locale.US), + sequanceModel); + return dynamicBuilderContext; + } +} diff --git a/dynamic-orm-core/src/main/java/com/github/vzakharchenko/dynamic/orm/core/dynamic/QStringBuilder.java b/dynamic-orm-core/src/main/java/com/github/vzakharchenko/dynamic/orm/core/dynamic/QStringBuilder.java index cfe18cf..176753e 100644 --- a/dynamic-orm-core/src/main/java/com/github/vzakharchenko/dynamic/orm/core/dynamic/QStringBuilder.java +++ b/dynamic-orm-core/src/main/java/com/github/vzakharchenko/dynamic/orm/core/dynamic/QStringBuilder.java @@ -11,8 +11,10 @@ public class QStringBuilder extends QSizeColumnBuilderImpl> { - public QStringBuilder(QTableColumnContext qTableColumn, String columnName) { - super(qTableColumn, columnName); + public QStringBuilder(QTableColumnContext qTableColumn, + QDynamicTable dynamicTable, + String columnName) { + super(qTableColumn, dynamicTable, columnName); } @Override 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 60e0d7e..cc0c705 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 @@ -30,12 +30,6 @@ QTableBuilder addVersionColumn( QTableBuilder addSoftDeleteColumn( String columnName, Serializable value, Serializable defaultValue); - QTableBuilder addCustomField( - Serializable key, Serializable value); - - QTableBuilder addSoftDeleteColumn( - Path column, TYPE value, TYPE defaultValue); - /** * batch build table * @@ -44,21 +38,6 @@ QTableBuilder addSoftDeleteColumn( */ QTableBuilder buildNextTable(String tableName); - /** - * The construction of the table using ddl queries - *

- * Attention! existing columns are not deleted - */ - void buildSchema(); - - /** - * support of existing tables - *

- * ATTENTION! CONSISTENCY OF COLUMNS CAN NOT BE GUARANTEED - *

- * Is better use buildSchema() - */ - void support(); + QDynamicTableFactory finish(); - void clear(); } diff --git a/dynamic-orm-core/src/main/java/com/github/vzakharchenko/dynamic/orm/core/dynamic/QTimeBuilder.java b/dynamic-orm-core/src/main/java/com/github/vzakharchenko/dynamic/orm/core/dynamic/QTimeBuilder.java index 3209125..3aac5b0 100644 --- a/dynamic-orm-core/src/main/java/com/github/vzakharchenko/dynamic/orm/core/dynamic/QTimeBuilder.java +++ b/dynamic-orm-core/src/main/java/com/github/vzakharchenko/dynamic/orm/core/dynamic/QTimeBuilder.java @@ -11,8 +11,10 @@ public class QTimeBuilder extends QSizeColumnBuilderImpl> { - public QTimeBuilder(QTableColumnContext qTableColumn, String columnName) { - super(qTableColumn, columnName); + public QTimeBuilder(QTableColumnContext qTableColumn, + QDynamicTable dynamicTable, + String columnName) { + super(qTableColumn, dynamicTable, columnName); } @Override 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 new file mode 100644 index 0000000..22946d4 --- /dev/null +++ b/dynamic-orm-core/src/main/java/com/github/vzakharchenko/dynamic/orm/core/dynamic/QViewBuilder.java @@ -0,0 +1,12 @@ +package com.github.vzakharchenko.dynamic.orm.core.dynamic; + +import com.querydsl.core.types.Expression; +import com.querydsl.sql.SQLCommonQuery; + + +public interface QViewBuilder { + + QViewBuilder resultSet(SQLCommonQuery query, Expression... column); + + QDynamicTableFactory finish(); +} 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 new file mode 100644 index 0000000..dedc783 --- /dev/null +++ b/dynamic-orm-core/src/main/java/com/github/vzakharchenko/dynamic/orm/core/dynamic/QViewBuilderImpl.java @@ -0,0 +1,34 @@ +package com.github.vzakharchenko.dynamic.orm.core.dynamic; + +import com.github.vzakharchenko.dynamic.orm.core.OrmQueryFactory; +import com.querydsl.core.types.Expression; +import com.querydsl.sql.SQLCommonQuery; + +import java.util.Arrays; + +public class QViewBuilderImpl implements QViewBuilder { + private final QDynamicBuilderContext dynamicBuilderContext; + + private final ViewModel viewModel; + + public QViewBuilderImpl(QDynamicBuilderContext dynamicBuilderContext, String viewName) { + this.dynamicBuilderContext = dynamicBuilderContext; + this.viewModel = new ViewModel(viewName); + } + + + @Override + public QViewBuilder resultSet(SQLCommonQuery query, Expression... columns) { + viewModel.setQuery(query); + viewModel.setExpressions(Arrays.asList(columns)); + OrmQueryFactory ormQueryFactory = dynamicBuilderContext.getDynamicContext().getOrmQueryFactory(); + viewModel.setSql(ormQueryFactory.select().showSql(query, columns)); + return this; + } + + @Override + public QDynamicTableFactory finish() { + dynamicBuilderContext.getViewSequances().put(viewModel.getName(), viewModel); + return dynamicBuilderContext; + } +} diff --git a/dynamic-orm-core/src/main/java/com/github/vzakharchenko/dynamic/orm/core/dynamic/QViewUtils.java b/dynamic-orm-core/src/main/java/com/github/vzakharchenko/dynamic/orm/core/dynamic/QViewUtils.java new file mode 100644 index 0000000..55bbcac --- /dev/null +++ b/dynamic-orm-core/src/main/java/com/github/vzakharchenko/dynamic/orm/core/dynamic/QViewUtils.java @@ -0,0 +1,111 @@ +package com.github.vzakharchenko.dynamic.orm.core.dynamic; + +import com.github.vzakharchenko.dynamic.orm.core.dynamic.column.QNumberColumnImpl; +import com.github.vzakharchenko.dynamic.orm.core.dynamic.column.QSizeColumn; +import com.github.vzakharchenko.dynamic.orm.core.dynamic.column.QSizeColumnImpl; +import com.querydsl.core.types.*; +import liquibase.database.Database; + +import java.util.Date; +import java.util.List; + +public final class QViewUtils { + + private QViewUtils() { + } + + public static QDynamicTable transform(Database database, ViewModel viewModel) { + QDynamicTable qDynamicTable = new QDynamicTable(viewModel.getName()); + List> columns = viewModel.getExpressions(); + for (Expression column : columns) { + transform(qDynamicTable, database, column); + } + return qDynamicTable; + } + + private static void transform(QDynamicTable qDynamicTable, Database database, + Expression column) { + if (column instanceof Path) { + transformPath(qDynamicTable, database, (Path) column); + } else if (column instanceof Operation) { + transformOperation(qDynamicTable, database, (Operation) column); + } else { + throw new IllegalStateException("Unsupported type " + column); + } + } + + private static void transformOperation(QDynamicTable qDynamicTable, Database database, + Operation column) { + Path path = getPathFromOperation(column); + if (path == null) { + throw new IllegalStateException("Operation " + column + " does not support"); + } + transformPath(qDynamicTable, database, path); + } + + private static void transformPath(QDynamicTable qDynamicTable, Database database, + Path column) { + if (Number.class.isAssignableFrom(column.getType())) { + transformNumber(qDynamicTable, database, column); + } else if (String.class.isAssignableFrom(column.getType())) { + transformString(qDynamicTable, database, column); + } else if (Date.class.isAssignableFrom(column.getType())) { + transformDate(qDynamicTable, database, column); + } else if (column.getType().isArray()) { + transformBlob(qDynamicTable, database, column); + } else if (Boolean.class.isAssignableFrom(column.getType())) { + transformBoolean(qDynamicTable, database, column); + } else { + throw new IllegalStateException("unsupported operation"); + } + } + + private static void transformNumber(QDynamicTable qDynamicTable, Database database, + Path column) { + PathMetadata metadata = column.getMetadata(); + QNumberColumnImpl numberColumn = new QNumberColumnImpl(metadata.getName()); + numberColumn.setNumberClass(Number.class); + qDynamicTable.createNumberColumn(database, numberColumn); + } + + private static void transformString(QDynamicTable qDynamicTable, Database database, + Path column) { + QSizeColumn sizeColumn = createSizeColumn(column.getMetadata()); + qDynamicTable.createStringColumn(database, sizeColumn); + } + + private static void transformDate(QDynamicTable qDynamicTable, Database database, + Path column) { + QSizeColumn sizeColumn = createSizeColumn(column.getMetadata()); + qDynamicTable.createDateTimeColumn(database, sizeColumn); + } + + private static void transformBlob(QDynamicTable qDynamicTable, Database database, + Path column) { + QSizeColumn sizeColumn = createSizeColumn(column.getMetadata()); + qDynamicTable.createBlobColumn(database, sizeColumn); + } + + private static void transformBoolean(QDynamicTable qDynamicTable, Database database, + Path column) { + QSizeColumn sizeColumn = createSizeColumn(column.getMetadata()); + qDynamicTable.createBooleanColumn(database, sizeColumn); + } + + private static QSizeColumn createSizeColumn(PathMetadata metadata) { + return new QSizeColumnImpl(metadata.getName()); + } + + private static Path getPathFromOperation(Operation operation) { + List> expressions = operation.getArgs(); + for (Expression exp : expressions) { + if (exp instanceof Path) { + Path column = (Path) exp; + if (column.getMetadata().getPathType() == PathType.PROPERTY) { + return column; + } + } + } + return null; + } +} diff --git a/dynamic-orm-core/src/main/java/com/github/vzakharchenko/dynamic/orm/core/dynamic/SequanceModel.java b/dynamic-orm-core/src/main/java/com/github/vzakharchenko/dynamic/orm/core/dynamic/SequanceModel.java new file mode 100644 index 0000000..b957cdd --- /dev/null +++ b/dynamic-orm-core/src/main/java/com/github/vzakharchenko/dynamic/orm/core/dynamic/SequanceModel.java @@ -0,0 +1,56 @@ +package com.github.vzakharchenko.dynamic.orm.core.dynamic; + +import org.apache.commons.lang3.StringUtils; + +import java.io.Serializable; +import java.math.BigInteger; +import java.util.Locale; + +public class SequanceModel implements Serializable { + + private final String name; + private BigInteger initial = BigInteger.valueOf(0L); + private BigInteger increment = BigInteger.valueOf(1L); + private BigInteger min; + private BigInteger max; + + public SequanceModel(String name) { + this.name = StringUtils.upperCase(name, Locale.US); + } + + public String getName() { + return name; + } + + public BigInteger getInitial() { + return initial; + } + + public void setInitial(BigInteger initial) { + this.initial = initial; + } + + public BigInteger getIncrement() { + return increment; + } + + public void setIncrement(BigInteger increment) { + this.increment = increment; + } + + public BigInteger getMin() { + return min; + } + + public void setMin(BigInteger min) { + this.min = min; + } + + public BigInteger getMax() { + return max; + } + + public void setMax(BigInteger max) { + this.max = max; + } +} diff --git a/dynamic-orm-core/src/main/java/com/github/vzakharchenko/dynamic/orm/core/dynamic/ViewModel.java b/dynamic-orm-core/src/main/java/com/github/vzakharchenko/dynamic/orm/core/dynamic/ViewModel.java new file mode 100644 index 0000000..0eface2 --- /dev/null +++ b/dynamic-orm-core/src/main/java/com/github/vzakharchenko/dynamic/orm/core/dynamic/ViewModel.java @@ -0,0 +1,49 @@ +package com.github.vzakharchenko.dynamic.orm.core.dynamic; + +import com.querydsl.core.types.Expression; +import com.querydsl.sql.SQLCommonQuery; +import org.apache.commons.lang3.StringUtils; + +import java.util.List; +import java.util.Locale; + +public class ViewModel { + private final String name; + + private SQLCommonQuery query; + private List> expressions; + + private String sql; + + public ViewModel(String name) { + this.name = StringUtils.upperCase(name, Locale.US); + } + + public String getName() { + return name; + } + + public SQLCommonQuery getQuery() { + return query; + } + + public void setQuery(SQLCommonQuery query) { + this.query = query; + } + + public List> getExpressions() { + return expressions; + } + + public void setExpressions(List> expressions) { + this.expressions = expressions; + } + + public String getSql() { + return sql; + } + + public void setSql(String sql) { + this.sql = sql; + } +} diff --git a/dynamic-orm-core/src/main/java/com/github/vzakharchenko/dynamic/orm/core/dynamic/column/QTableColumnContext.java b/dynamic-orm-core/src/main/java/com/github/vzakharchenko/dynamic/orm/core/dynamic/column/QTableColumnContext.java index 06dac9f..567a100 100644 --- a/dynamic-orm-core/src/main/java/com/github/vzakharchenko/dynamic/orm/core/dynamic/column/QTableColumnContext.java +++ b/dynamic-orm-core/src/main/java/com/github/vzakharchenko/dynamic/orm/core/dynamic/column/QTableColumnContext.java @@ -1,6 +1,7 @@ package com.github.vzakharchenko.dynamic.orm.core.dynamic.column; -import com.github.vzakharchenko.dynamic.orm.core.dynamic.QDynamicContextHolder; +import com.github.vzakharchenko.dynamic.orm.core.dynamic.QDynamicBuilderContext; -public interface QTableColumnContext extends QTableColumn, QDynamicContextHolder { +public interface QTableColumnContext extends QTableColumn { + QDynamicBuilderContext getContext(); } 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 698f78a..02e1921 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 @@ -5,94 +5,91 @@ import com.github.vzakharchenko.dynamic.orm.core.dynamic.column.builder.QNumberColumnBuilder; import com.github.vzakharchenko.dynamic.orm.core.dynamic.column.builder.QSizeColumnBuilder; -import javax.sql.DataSource; -import java.util.Map; - public class QTableColumnContextImpl implements QTableColumnContext { private final QDynamicBuilderContext builderContext; + private final QTableBuilder qTableBuilder; + private final QDynamicTable dynamicTable; - public QTableColumnContextImpl(QDynamicBuilderContext builderContext) { + public QTableColumnContextImpl(QDynamicBuilderContext builderContext, + QTableBuilder qTableBuilder, + QDynamicTable dynamicTable) { this.builderContext = builderContext; - } - - @Override - public DataSource getDataSource() { - return builderContext.getDataSource(); - } - - @Override - public QDynamicTable getDynamicTable() { - return builderContext.getDynamicTable(); - } - - @Override - public DynamicContext getDynamicContext() { - return builderContext.getDynamicContext(); - } - - @Override - public Map getContextTables() { - return builderContext.getContextTables(); + this.qTableBuilder = qTableBuilder; + this.dynamicTable = dynamicTable; } @Override public QSizeColumnBuilder> addStringColumn(String columnName) { - return new QStringBuilder(this, columnName); + return new QStringBuilder(this, + dynamicTable, columnName); } @Override public QSizeColumnBuilder> addCharColumn(String columnName) { - return new QCharBuilder(this, columnName); + return new QCharBuilder(this, + dynamicTable, columnName); } @Override public QSizeColumnBuilder> addClobColumn(String columnName) { - return new QClobBuilder(this, columnName); + return new QClobBuilder(this, dynamicTable, + columnName); } @Override public QColumnBuilder> addBooleanColumn(String columnName) { - return new QBooleanBuilder(this, columnName); + return new QBooleanBuilder(this, + dynamicTable, columnName); } @Override public QSizeColumnBuilder> addBlobColumn(String columnName) { - return new QBlobBuilder(this, columnName); + return new QBlobBuilder(this, + dynamicTable, columnName); } @Override public > QNumberColumnBuilder> addNumberColumn(String columnName, Class typeClass) { - return new QNumberBuilder(this, columnName, typeClass); + return new QNumberBuilder(this, + dynamicTable, columnName, typeClass); } @Override public QSizeColumnBuilder> addDateColumn(String columnName) { - return new QDateBuilder(this, columnName); + return new QDateBuilder(this, + dynamicTable, columnName); } @Override public QSizeColumnBuilder> addDateTimeColumn(String columnName) { - return new QDateTimeBuilder(this, columnName); + return new QDateTimeBuilder(this, + dynamicTable, columnName); } @Override public QSizeColumnBuilder> addTimeColumn(String columnName) { - return new QTimeBuilder(this, columnName); + return new QTimeBuilder(this, + dynamicTable, columnName); } @Override public QTableBuilder finish() { + return qTableBuilder; + } + + @Override + public QDynamicBuilderContext getContext() { return builderContext; } } diff --git a/dynamic-orm-core/src/main/java/com/github/vzakharchenko/dynamic/orm/core/dynamic/column/builder/QDefaultColumnBuilder.java b/dynamic-orm-core/src/main/java/com/github/vzakharchenko/dynamic/orm/core/dynamic/column/builder/QDefaultColumnBuilder.java index 0392134..e525493 100644 --- a/dynamic-orm-core/src/main/java/com/github/vzakharchenko/dynamic/orm/core/dynamic/column/builder/QDefaultColumnBuilder.java +++ b/dynamic-orm-core/src/main/java/com/github/vzakharchenko/dynamic/orm/core/dynamic/column/builder/QDefaultColumnBuilder.java @@ -15,11 +15,13 @@ public abstract class QDefaultColumnBuilder { protected final COLUMN_TYPE columnType; private final QTableColumnContext qTableColumn; + private final QDynamicTable qDynamicTable; protected QDefaultColumnBuilder(QTableColumnContext qTableColumnContext, - String columnName) { + QDynamicTable dynamicTable, String columnName) { this.columnType = construct(columnName); this.qTableColumn = qTableColumnContext; + this.qDynamicTable = dynamicTable; } protected abstract COLUMN_TYPE construct(String columnName); @@ -60,11 +62,12 @@ protected abstract void createColumn(QDynamicTable dynamicTable, private void createColumn() { - DataSource dataSource = qTableColumn.getDataSource(); + DataSource dataSource = qTableColumn.getContext().getDataSource(); Connection connection = DataSourceUtils.getConnection(dataSource); try { - createColumn(qTableColumn.getDynamicTable(), - qTableColumn.getDynamicContext().getDatabase(connection)); + createColumn(qDynamicTable, + qTableColumn.getContext() + .getDynamicContext().getDatabase(connection)); } finally { DataSourceUtils.releaseConnection(connection, dataSource); } diff --git a/dynamic-orm-core/src/main/java/com/github/vzakharchenko/dynamic/orm/core/dynamic/column/builder/QSizeColumnBuilderImpl.java b/dynamic-orm-core/src/main/java/com/github/vzakharchenko/dynamic/orm/core/dynamic/column/builder/QSizeColumnBuilderImpl.java index 9598644..7540af1 100644 --- a/dynamic-orm-core/src/main/java/com/github/vzakharchenko/dynamic/orm/core/dynamic/column/builder/QSizeColumnBuilderImpl.java +++ b/dynamic-orm-core/src/main/java/com/github/vzakharchenko/dynamic/orm/core/dynamic/column/builder/QSizeColumnBuilderImpl.java @@ -1,5 +1,6 @@ package com.github.vzakharchenko.dynamic.orm.core.dynamic.column.builder; +import com.github.vzakharchenko.dynamic.orm.core.dynamic.QDynamicTable; import com.github.vzakharchenko.dynamic.orm.core.dynamic.column.QSizeColumnImpl; import com.github.vzakharchenko.dynamic.orm.core.dynamic.column.QTableColumn; import com.github.vzakharchenko.dynamic.orm.core.dynamic.column.QTableColumnContext; @@ -12,8 +13,8 @@ public abstract class QSizeColumnBuilderImpl columns = new HashMap<>(); - private final QDynamicTable qDynamicTable; + private Map columns = new HashMap<>(); public DynamicTableModel(QDynamicTable qDynamicTable) { this.qDynamicTable = qDynamicTable; diff --git a/dynamic-orm-core/src/main/java/com/github/vzakharchenko/dynamic/orm/core/dynamic/structure/DynamicStructureSaver.java b/dynamic-orm-core/src/main/java/com/github/vzakharchenko/dynamic/orm/core/dynamic/structure/DynamicStructureSaver.java index bfa388e..4d8dd2c 100644 --- a/dynamic-orm-core/src/main/java/com/github/vzakharchenko/dynamic/orm/core/dynamic/structure/DynamicStructureSaver.java +++ b/dynamic-orm-core/src/main/java/com/github/vzakharchenko/dynamic/orm/core/dynamic/structure/DynamicStructureSaver.java @@ -1,11 +1,9 @@ package com.github.vzakharchenko.dynamic.orm.core.dynamic.structure; -import com.github.vzakharchenko.dynamic.orm.core.dynamic.QDynamicTable; import com.github.vzakharchenko.dynamic.orm.core.dynamic.structure.liquibase.DynamicDatabaseSnapshot; import com.github.vzakharchenko.dynamic.orm.core.dynamic.structure.liquibase.DynamicDatabaseSnapshotFactory; import com.github.vzakharchenko.dynamic.orm.structure.SimpleDbStructure; import com.github.vzakharchenko.dynamic.orm.structure.exception.UpdateException; -import com.google.common.collect.Maps; import liquibase.changelog.ChangeSet; import liquibase.database.Database; import liquibase.diff.DiffGeneratorFactory; @@ -21,7 +19,6 @@ import org.apache.commons.collections.CollectionUtils; import org.apache.commons.io.FileUtils; import org.apache.commons.io.FilenameUtils; -import org.apache.commons.lang3.StringUtils; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.jdbc.datasource.DataSourceUtils; @@ -33,7 +30,10 @@ import java.nio.charset.Charset; import java.sql.Connection; import java.text.SimpleDateFormat; -import java.util.*; +import java.util.Date; +import java.util.List; +import java.util.Locale; +import java.util.Set; /** * @@ -104,7 +104,7 @@ private void createDiff( } private void update0(Connection connection, - Map qDynamicMap) throws IOException, + LiquibaseHolder liquibaseHolder) throws IOException, DatabaseException, InvalidExampleException, UpdateException { @@ -112,7 +112,7 @@ private void update0(Connection connection, Database referenceDatabase = currentDataBase(connection); // generate snapshot database for definition DynamicDatabaseSnapshot databaseSnapshot = DynamicDatabaseSnapshotFactory - .build(referenceDatabase, qDynamicMap.values()); + .build(referenceDatabase, liquibaseHolder); // create snapshot for current database Set> compareTypes = getCompareTypes(); DatabaseSnapshot referenceSnapshot = SnapshotGeneratorFactory.getInstance() @@ -127,10 +127,10 @@ private void update0(Connection connection, } @Override - public void update(Map qDynamicMap) { + public void update(LiquibaseHolder liquibaseHolder) { Connection connection = DataSourceUtils.getConnection(dataSource); try { - update0(connection, qDynamicMap); + update0(connection, liquibaseHolder); } catch (RuntimeException e) { throw e; } catch (Exception ex) { @@ -140,21 +140,6 @@ public void update(Map qDynamicMap) { } } - @Override - public void update(QDynamicTable qDynamicTable) { - update(Collections.singletonList(qDynamicTable)); - } - - @Override - public void update(Collection qDynamicTables) { - Map tableMap = Maps - .newHashMapWithExpectedSize(qDynamicTables.size()); - for (QDynamicTable qDynamicTable : qDynamicTables) { - tableMap.put(StringUtils.upperCase(qDynamicTable.getTableName()), qDynamicTable); - } - update(tableMap); - } - protected void createTempDir() throws IOException { FileUtils.forceMkdir(TEMP_DIR); FileUtils.forceMkdir(WORK_DIR); diff --git a/dynamic-orm-core/src/main/java/com/github/vzakharchenko/dynamic/orm/core/dynamic/structure/DynamicStructureUpdater.java b/dynamic-orm-core/src/main/java/com/github/vzakharchenko/dynamic/orm/core/dynamic/structure/DynamicStructureUpdater.java index 0816adf..f0bdada 100644 --- a/dynamic-orm-core/src/main/java/com/github/vzakharchenko/dynamic/orm/core/dynamic/structure/DynamicStructureUpdater.java +++ b/dynamic-orm-core/src/main/java/com/github/vzakharchenko/dynamic/orm/core/dynamic/structure/DynamicStructureUpdater.java @@ -1,17 +1,8 @@ package com.github.vzakharchenko.dynamic.orm.core.dynamic.structure; -import com.github.vzakharchenko.dynamic.orm.core.dynamic.QDynamicTable; - -import java.util.Collection; -import java.util.Map; - /** * */ public interface DynamicStructureUpdater { - void update(Map qDynamicTables); - - void update(QDynamicTable qDynamicTable); - - void update(Collection qDynamicTables); + void update(LiquibaseHolder liquibaseHolder); } diff --git a/dynamic-orm-core/src/main/java/com/github/vzakharchenko/dynamic/orm/core/dynamic/structure/LiquibaseHolder.java b/dynamic-orm-core/src/main/java/com/github/vzakharchenko/dynamic/orm/core/dynamic/structure/LiquibaseHolder.java new file mode 100644 index 0000000..5579d88 --- /dev/null +++ b/dynamic-orm-core/src/main/java/com/github/vzakharchenko/dynamic/orm/core/dynamic/structure/LiquibaseHolder.java @@ -0,0 +1,59 @@ +package com.github.vzakharchenko.dynamic.orm.core.dynamic.structure; + +import com.github.vzakharchenko.dynamic.orm.core.dynamic.QDynamicTable; +import com.github.vzakharchenko.dynamic.orm.core.dynamic.SequanceModel; +import com.github.vzakharchenko.dynamic.orm.core.dynamic.ViewModel; +import com.github.vzakharchenko.dynamic.orm.core.dynamic.structure.liquibase.SequanceFactory; +import com.github.vzakharchenko.dynamic.orm.core.dynamic.structure.liquibase.TableFactory; +import liquibase.structure.core.Sequence; +import liquibase.structure.core.Table; +import liquibase.structure.core.View; + +import java.util.List; +import java.util.Map; +import java.util.stream.Collectors; + +public final class LiquibaseHolder { + private final Map qDynamicTables; + private final Map sequanceModels; + private final Map viewModels; + + private LiquibaseHolder(Map qDynamicTables, + Map sequanceModels, + Map viewModels) { + this.qDynamicTables = qDynamicTables; + this.sequanceModels = sequanceModels; + this.viewModels = viewModels; + } + + public static LiquibaseHolder create(Map qDynamicTables, + Map sequanceModels, + Map viewModels) { + return new LiquibaseHolder(qDynamicTables, sequanceModels, viewModels); + } + + public List getTables() { + return qDynamicTables.values().stream() + .map(TableFactory::createTable) + .collect(Collectors.toList()); + } + + public List getSequencies() { + return sequanceModels.values() + .stream() + .map(SequanceFactory::createSequance) + .collect(Collectors.toList()); + } + + public List getViews() { + return viewModels.values().stream().map(viewModel -> { + View view = new View( + "", + "", + viewModel.getName()); + view.setDefinition(viewModel.getSql()); + view.setContainsFullDefinition(true); + return view; + }).collect(Collectors.toList()); + } +} diff --git a/dynamic-orm-core/src/main/java/com/github/vzakharchenko/dynamic/orm/core/dynamic/structure/liquibase/DynamicDatabaseSnapshotFactory.java b/dynamic-orm-core/src/main/java/com/github/vzakharchenko/dynamic/orm/core/dynamic/structure/liquibase/DynamicDatabaseSnapshotFactory.java index 3375b5a..d146253 100644 --- a/dynamic-orm-core/src/main/java/com/github/vzakharchenko/dynamic/orm/core/dynamic/structure/liquibase/DynamicDatabaseSnapshotFactory.java +++ b/dynamic-orm-core/src/main/java/com/github/vzakharchenko/dynamic/orm/core/dynamic/structure/liquibase/DynamicDatabaseSnapshotFactory.java @@ -1,15 +1,17 @@ package com.github.vzakharchenko.dynamic.orm.core.dynamic.structure.liquibase; -import com.github.vzakharchenko.dynamic.orm.core.dynamic.QDynamicTable; +import com.github.vzakharchenko.dynamic.orm.core.dynamic.structure.LiquibaseHolder; import liquibase.database.Database; +import liquibase.exception.DatabaseException; +import liquibase.snapshot.InvalidExampleException; import liquibase.structure.DatabaseObject; +import liquibase.structure.core.Sequence; import liquibase.structure.core.Table; +import liquibase.structure.core.View; import org.apache.commons.collections.CollectionUtils; -import java.util.Collection; +import java.lang.reflect.InvocationTargetException; import java.util.List; -import java.util.Set; -import java.util.stream.Collectors; /** * @@ -17,11 +19,9 @@ public abstract class DynamicDatabaseSnapshotFactory { public static DynamicDatabaseSnapshot build( - Database databaseType, Collection dynamicTables) { + Database databaseType, LiquibaseHolder liquibaseHolder) { try { - Set
tables = dynamicTables.stream().map(TableFactory::createTable) - .collect(Collectors.toSet()); - return createDatabaseObject(databaseType, tables); + return createDatabaseObject(databaseType, liquibaseHolder); } catch (RuntimeException ex) { throw ex; } catch (Exception e) { @@ -29,22 +29,50 @@ public static DynamicDatabaseSnapshot build( } } + private static void addTables(DynamicDatabaseSnapshot databaseSnapshot, + List
tables) { + for (Table table : tables) { + databaseSnapshot.addDatabaseObject(table); + databaseSnapshot.addDatabaseObject(table.getPrimaryKey()); + addDatabaseObjects(databaseSnapshot, table.getIndexes()); + addDatabaseObjects(databaseSnapshot, table.getOutgoingForeignKeys()); + addDatabaseObjects(databaseSnapshot, table.getUniqueConstraints()); + addDatabaseObjects(databaseSnapshot, table.getColumns()); + //databaseSnapshot.addDatabaseObject(table.getSchema()); + } + } + + private static void addSequences(DynamicDatabaseSnapshot databaseSnapshot, + List sequences) { + for (Sequence sequence : sequences) { + databaseSnapshot.addDatabaseObject(sequence); + } + } + + private static void addViews(DynamicDatabaseSnapshot databaseSnapshot, + List views) { + for (View view : views) { + databaseSnapshot.addDatabaseObject(view); + } + } + + private static DynamicDatabaseSnapshot createDatabaseObject0( + Database databaseType, LiquibaseHolder liquibaseHolder) + throws NoSuchMethodException, IllegalAccessException, + InstantiationException, DatabaseException, + InvalidExampleException, InvocationTargetException { + DynamicDatabaseSnapshot databaseSnapshot = new DynamicDatabaseSnapshot( + databaseType.getClass()); + addTables(databaseSnapshot, liquibaseHolder.getTables()); + addSequences(databaseSnapshot, liquibaseHolder.getSequencies()); + addViews(databaseSnapshot, liquibaseHolder.getViews()); + return databaseSnapshot; + } private static DynamicDatabaseSnapshot createDatabaseObject( - Database databaseType, Collection
tables) { + Database databaseType, LiquibaseHolder liquibaseHolder) { try { - DynamicDatabaseSnapshot databaseSnapshot = new DynamicDatabaseSnapshot( - databaseType.getClass()); - for (Table table : tables) { - databaseSnapshot.addDatabaseObject(table); - databaseSnapshot.addDatabaseObject(table.getPrimaryKey()); - addDatabaseObjects(databaseSnapshot, table.getIndexes()); - addDatabaseObjects(databaseSnapshot, table.getOutgoingForeignKeys()); - addDatabaseObjects(databaseSnapshot, table.getUniqueConstraints()); - addDatabaseObjects(databaseSnapshot, table.getColumns()); - //databaseSnapshot.addDatabaseObject(table.getSchema()); - } - return databaseSnapshot; + return createDatabaseObject0(databaseType, liquibaseHolder); } catch (RuntimeException ex) { throw ex; } catch (Exception ex) { diff --git a/dynamic-orm-core/src/main/java/com/github/vzakharchenko/dynamic/orm/core/dynamic/structure/liquibase/SequanceFactory.java b/dynamic-orm-core/src/main/java/com/github/vzakharchenko/dynamic/orm/core/dynamic/structure/liquibase/SequanceFactory.java new file mode 100644 index 0000000..4e05a19 --- /dev/null +++ b/dynamic-orm-core/src/main/java/com/github/vzakharchenko/dynamic/orm/core/dynamic/structure/liquibase/SequanceFactory.java @@ -0,0 +1,15 @@ +package com.github.vzakharchenko.dynamic.orm.core.dynamic.structure.liquibase; + +import com.github.vzakharchenko.dynamic.orm.core.dynamic.SequanceModel; +import liquibase.structure.core.Sequence; + +public abstract class SequanceFactory { + public static Sequence createSequance(SequanceModel sequanceModel) { + Sequence sequence = new Sequence("", "", sequanceModel.getName()); + sequence.setStartValue(sequanceModel.getInitial()); + sequence.setIncrementBy(sequanceModel.getIncrement()); + sequence.setMinValue(sequanceModel.getMin()); + sequence.setMaxValue(sequanceModel.getMax()); + return sequence; + } +} diff --git a/dynamic-orm-core/src/main/java/com/github/vzakharchenko/dynamic/orm/structure/LiquibaseStructure.java b/dynamic-orm-core/src/main/java/com/github/vzakharchenko/dynamic/orm/structure/LiquibaseStructure.java index b955770..4308652 100644 --- a/dynamic-orm-core/src/main/java/com/github/vzakharchenko/dynamic/orm/structure/LiquibaseStructure.java +++ b/dynamic-orm-core/src/main/java/com/github/vzakharchenko/dynamic/orm/structure/LiquibaseStructure.java @@ -98,6 +98,7 @@ protected Set> getCompareTypes() { compareTypes.add(StoredProcedure.class); compareTypes.add(UniqueConstraint.class); compareTypes.add(Index.class); + compareTypes.add(View.class); if (compareData) { compareTypes.add(Data.class); } diff --git a/dynamic-orm-core/src/test/java/com/github/vzakharchenko/dynamic/orm/DynamicCacheQueryOrm.java b/dynamic-orm-core/src/test/java/com/github/vzakharchenko/dynamic/orm/DynamicCacheQueryOrm.java index d0e64d6..c34ae38 100644 --- a/dynamic-orm-core/src/test/java/com/github/vzakharchenko/dynamic/orm/DynamicCacheQueryOrm.java +++ b/dynamic-orm-core/src/test/java/com/github/vzakharchenko/dynamic/orm/DynamicCacheQueryOrm.java @@ -23,7 +23,7 @@ public class DynamicCacheQueryOrm extends OracleTestQueryOrm { @Test public void testCacheSelect() { - QTableBuilder testTable1 = qDynamicTableFactory.buildTable("testtable1"); + QTableBuilder testTable1 = qDynamicTableFactory.buildTables("testtable1"); // build primary key testTable1.addColumns().addNumberColumn("ID", Integer.class).size(18).decimalDigits(0).useAsPrimaryKey().create(); @@ -33,7 +33,7 @@ public void testCacheSelect() { // validate and create structure - testTable1.buildSchema(); + testTable1.finish().buildSchema(); QDynamicTable qDynamicTable = qDynamicTableFactory.getQDynamicTableByName("testtable1"); assertNotNull(qDynamicTable); @@ -66,7 +66,7 @@ public void testCacheSelect() { @Test public void testCacheSmartSelect() { - QTableBuilder testTable1 = qDynamicTableFactory.buildTable("testtable1"); + QTableBuilder testTable1 = qDynamicTableFactory.buildTables("testtable1"); // build primary key testTable1.addColumns().addNumberColumn("ID", Integer.class).size(18).decimalDigits(0).useAsPrimaryKey().create(); @@ -76,7 +76,7 @@ public void testCacheSmartSelect() { // validate and create structure - testTable1.buildSchema(); + testTable1.finish().buildSchema(); QDynamicTable qDynamicTable = qDynamicTableFactory.getQDynamicTableByName("testtable1"); assertNotNull(qDynamicTable); diff --git a/dynamic-orm-core/src/test/java/com/github/vzakharchenko/dynamic/orm/DynamicIndexTest.java b/dynamic-orm-core/src/test/java/com/github/vzakharchenko/dynamic/orm/DynamicIndexTest.java index e6b1437..2731540 100644 --- a/dynamic-orm-core/src/test/java/com/github/vzakharchenko/dynamic/orm/DynamicIndexTest.java +++ b/dynamic-orm-core/src/test/java/com/github/vzakharchenko/dynamic/orm/DynamicIndexTest.java @@ -10,25 +10,25 @@ public class DynamicIndexTest extends OracleTestQueryOrm { @Test public void indexTest() { - qDynamicTableFactory.buildTable("Test_table_Index") + qDynamicTableFactory.buildTables("Test_table_Index") .addColumns().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().buildIndex("INDEXED_COLUMN", false) - .buildSchema(); + .finish().buildSchema(); } @Test public void indexUniqueTest() { - qDynamicTableFactory.buildTable("Test_table_Index") + qDynamicTableFactory.buildTables("Test_table_Index") .addColumns().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().buildIndex("INDEXED_COLUMN", true) - .buildSchema(); + .finish().buildSchema(); } } diff --git a/dynamic-orm-core/src/test/java/com/github/vzakharchenko/dynamic/orm/DynamicQueryOrm.java b/dynamic-orm-core/src/test/java/com/github/vzakharchenko/dynamic/orm/DynamicQueryOrm.java index 9ac9607..52aeae4 100644 --- a/dynamic-orm-core/src/test/java/com/github/vzakharchenko/dynamic/orm/DynamicQueryOrm.java +++ b/dynamic-orm-core/src/test/java/com/github/vzakharchenko/dynamic/orm/DynamicQueryOrm.java @@ -5,12 +5,16 @@ import com.github.vzakharchenko.dynamic.orm.core.dynamic.dml.DynamicTableModel; import com.github.vzakharchenko.dynamic.orm.core.helper.ModelHelper; 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.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.types.Path; import com.querydsl.core.types.dsl.NumberPath; import com.querydsl.core.types.dsl.StringPath; +import com.querydsl.core.types.dsl.Wildcard; import org.springframework.transaction.annotation.Propagation; import org.springframework.transaction.annotation.Transactional; import org.testng.annotations.Test; @@ -27,7 +31,7 @@ public class DynamicQueryOrm extends OracleTestQueryOrm { @Test public void testBuildOneTable() { - QTableBuilder testTable1 = qDynamicTableFactory.buildTable("dynamicTestTable1"); + QTableBuilder testTable1 = qDynamicTableFactory.buildTables("dynamicTestTable1"); // build primary key testTable1.addColumns().addNumberColumn("ID", Integer.class).size(18).decimalDigits(0).notNull().useAsPrimaryKey().create(); // build String Field @@ -41,7 +45,7 @@ public void testBuildOneTable() { .addForeignKey().buildForeignKey("Test_FK", QTesttable.testtable, id); // validate and create structure - testTable1.buildSchema(); + testTable1.finish().buildSchema(); QDynamicTable qDynamicTable = qDynamicTableFactory.getQDynamicTableByName("dynamicTestTable1"); assertNotNull(qDynamicTable); List> columns = qDynamicTable.getColumns(); @@ -58,7 +62,7 @@ public void testBuildOneTable() { @Test public void testBuildBatchTable() { - QTableBuilder testTable1 = qDynamicTableFactory.buildTable("dynamicTestTable1"); + QTableBuilder testTable1 = qDynamicTableFactory.buildTables("dynamicTestTable1"); // build primary key testTable1.addColumns().addNumberColumn("ID", Integer.class).size(18).decimalDigits(0).nullable().useAsPrimaryKey().create(); @@ -82,7 +86,7 @@ public void testBuildBatchTable() { testTable2.addColumns().addNumberColumn("testTable1_FK", Integer.class).size(18).decimalDigits(0).notNull().create().finish().addForeignKey().buildForeignKey("testTable1_FK", "dynamicTestTable1"); - testTable2.buildSchema(); + testTable2.finish().buildSchema(); QDynamicTable qDynamicTable1 = qDynamicTableFactory.getQDynamicTableByName("dynamicTestTable1"); QDynamicTable qDynamicTable2 = qDynamicTableFactory.getQDynamicTableByName("dynamicTestTable2"); @@ -114,7 +118,7 @@ public void testBuildBatchTable() { @Test public void testInsertToTable() { - QTableBuilder testTable1 = qDynamicTableFactory.buildTable("dynamicTestTable1"); + QTableBuilder testTable1 = qDynamicTableFactory.buildTables("dynamicTestTable1"); // build primary key testTable1.addColumns().addNumberColumn("ID", Integer.class).size(18).decimalDigits(0).notNull().useAsPrimaryKey().create(); @@ -124,7 +128,7 @@ public void testInsertToTable() { // validate and create structure - testTable1.buildSchema(); + testTable1.finish().buildSchema(); QDynamicTable qDynamicTable = qDynamicTableFactory.getQDynamicTableByName("dynamicTestTable1"); assertNotNull(qDynamicTable); @@ -153,7 +157,7 @@ public void testInsertToTable() { @Test public void testSimpleInsertToTable() { - QTableBuilder testTable1 = qDynamicTableFactory.buildTable("dynamicTestTable1"); + QTableBuilder testTable1 = qDynamicTableFactory.buildTables("dynamicTestTable1"); // build primary key testTable1.addColumns().addNumberColumn("ID", Integer.class).size(18).decimalDigits(0).notNull().create().finish() .addPrimaryKey().addPrimaryKey("ID").addPrimaryKeyGenerator(PKGeneratorInteger.getInstance()).finish(); @@ -164,7 +168,7 @@ public void testSimpleInsertToTable() { // validate and create structure - testTable1.buildSchema(); + testTable1.finish().buildSchema(); QDynamicTable qDynamicTable = qDynamicTableFactory.getQDynamicTableByName("dynamicTestTable1"); assertNotNull(qDynamicTable); @@ -193,7 +197,7 @@ public void testSimpleInsertToTable() { @Test public void testDeleteFromTable() { - QTableBuilder testTable1 = qDynamicTableFactory.buildTable("dynamicTestTable1"); + QTableBuilder testTable1 = qDynamicTableFactory.buildTables("dynamicTestTable1"); // build primary key testTable1.addColumns().addNumberColumn("ID", Integer.class).size(18).decimalDigits(0).useAsPrimaryKey().create(); @@ -203,7 +207,7 @@ public void testDeleteFromTable() { // validate and create structure - testTable1.buildSchema(); + testTable1.finish().buildSchema(); QDynamicTable qDynamicTable = qDynamicTableFactory.getQDynamicTableByName("dynamicTestTable1"); assertNotNull(qDynamicTable); @@ -240,7 +244,7 @@ public void testDeleteFromTable() { @Test public void testUpdateTable() { - QTableBuilder testTable1 = qDynamicTableFactory.buildTable("dynamicTestTable1"); + QTableBuilder testTable1 = qDynamicTableFactory.buildTables("dynamicTestTable1"); // build primary key testTable1.addColumns().addNumberColumn("ID", Integer.class).size(18).decimalDigits(0).useAsPrimaryKey().create(); @@ -250,7 +254,7 @@ public void testUpdateTable() { // validate and create structure - testTable1.buildSchema(); + testTable1.finish().buildSchema(); QDynamicTable qDynamicTable = qDynamicTableFactory.getQDynamicTableByName("dynamicTestTable1"); assertNotNull(qDynamicTable); @@ -291,7 +295,7 @@ public void testUpdateTable() { @Transactional(propagation = Propagation.NOT_SUPPORTED) public void testDynamicSchema() { ormQueryFactory.transactionManager().startTransactionIfNeeded(); - qDynamicTableFactory.buildTable("dynamicTestTable") + qDynamicTableFactory.buildTables("dynamicTestTable") .addColumns().addNumberColumn("ID", Integer.class).useAsPrimaryKey().create() .addStringColumn("test").create() .addDateTimeColumn("dateTime").create() @@ -306,34 +310,159 @@ public void testDynamicSchema() { .addNumberColumn("fk3", Integer.class).create() .finish() .addForeignKey().buildForeignKey("fk2", QTestTableVersion.qTestTableVersion) - .buildSchema(); + .finish().buildSchema(); ormQueryFactory.transactionManager().commit(); QDynamicTable dynamicTestTable = qDynamicTableFactory.getQDynamicTableByName("dynamicTestTable"); ormQueryFactory.transactionManager().startTransactionIfNeeded(); - qDynamicTableFactory.buildTable("dynamicTestTable") + qDynamicTableFactory.buildTables("dynamicTestTable") .addForeignKey().buildForeignKey( dynamicTestTable.getNumberColumnByName("fk1"), QTestTableVersion.qTestTableVersion, QTestTableVersion.qTestTableVersion.id - ).buildSchema(); + ).finish().buildSchema(); ormQueryFactory.transactionManager().commit(); ormQueryFactory.transactionManager().startTransactionIfNeeded(); - qDynamicTableFactory.buildTable("dynamicTestTable") + qDynamicTableFactory.buildTables("dynamicTestTable") .addVersionColumn( - dynamicTestTable.getDateTimeColumnByName("dateTime") - ).buildSchema(); + dynamicTestTable.getDateTimeColumnByName("dateTime") + ).finish().buildSchema(); ormQueryFactory.transactionManager().commit(); ormQueryFactory.transactionManager().startTransactionIfNeeded(); - qDynamicTableFactory.buildTable("dynamicTestTable") + qDynamicTableFactory.buildTables("dynamicTestTable") .addIndex().buildIndex( dynamicTestTable.getStringColumnByName("test"), true - ).buildSchema(); + ).finish().buildSchema(); ormQueryFactory.transactionManager().commit(); } -} + @Test + public void testSequanceTestSUCCESS() { + qDynamicTableFactory.buildTables("dynamicTestTable") + .addColumns().addNumberColumn("ID", Integer.class).useAsPrimaryKey().create() + .addStringColumn("testColumn").size(100).create() + .finish() + .addPrimaryKey().addPrimaryKeyGenerator(new PKGeneratorSequence("dynamicTestTableSequance1")).finish() + .finish() + .createSequence("dynamicTestTableSequance1") + .initialValue(1000L) + .increment(10L) + .finish() + .buildSchema(); + } + + @Test(expectedExceptions = IllegalStateException.class) + public void testSequanceTestFailed() { + qDynamicTableFactory.buildTables("dynamicTestTable") + .addColumns().addNumberColumn("ID", Integer.class).useAsPrimaryKey().create() + .addStringColumn("testColumn").size(100).create() + .finish() + .addPrimaryKey().addPrimaryKeyGenerator(new PKGeneratorSequence("dynamicTestTableSequance1")).finish() + .finish() + .createSequence("dynamicTestTableSequance1") + .initialValue(1000L) + .increment(10L) + .min(1000L) + .max(10000L) + .finish() + .buildSchema(); + } + @Test + public void testViewTest() { + qDynamicTableFactory + .createView("testView").resultSet(ormQueryFactory.buildQuery() + .from(QTestTableVersionAnnotation.qTestTableVersionAnnotation), QTestTableVersionAnnotation.qTestTableVersionAnnotation.id).finish() + .buildSchema(); + } + @Test(expectedExceptions = Exception.class) + public void testViewTestUnsupported() { + qDynamicTableFactory + .createView("testView").resultSet(ormQueryFactory.buildQuery() + .from(QTestTableVersionAnnotation.qTestTableVersionAnnotation), QTestTableVersionAnnotation.qTestTableVersionAnnotation.id).finish() + .buildSchema(); + + QDynamicTable testView = qDynamicTableFactory.getQDynamicTableByName("testView"); + assertNotNull(testView); + + TestTableVersionAnnotation testTableVersionAnnotation = new TestTableVersionAnnotation(); + ormQueryFactory.insert(testTableVersionAnnotation); + + // select from table + TestTableVersionAnnotation versionAnnotation = ormQueryFactory.select() + .findOne(ormQueryFactory.buildQuery(), TestTableVersionAnnotation.class); + assertNotNull(versionAnnotation); + + + // select from View + Object[] one = ormQueryFactory.select() + .findOne(ormQueryFactory.buildQuery().from(testView), Wildcard.all); + assertNotNull(one); + } + + @Test + public void testViewAlias() { + qDynamicTableFactory + .createView("testView").resultSet(ormQueryFactory.buildQuery() + .from(QTestTableVersionAnnotation.qTestTableVersionAnnotation), + QTestTableVersionAnnotation.qTestTableVersionAnnotation.id.as("id"), + QTestTableVersionAnnotation.qTestTableVersionAnnotation.version.as("version") + ).finish() + .buildSchema(); + + QDynamicTable testView = qDynamicTableFactory.getQDynamicTableByName("testView"); + assertNotNull(testView); + + } + + @Test + public void testViewSizeColumn() { + qDynamicTableFactory.buildTables("table") + .addColumns().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() + .buildSchema(); + QDynamicTable qDynamicTable = qDynamicTableFactory.getQDynamicTableByName("table"); + + qDynamicTableFactory.createView("testView").resultSet( + ormQueryFactory.buildQuery().from(qDynamicTable), + qDynamicTable.getStringColumnByName("string1"), + qDynamicTable.getStringColumnByName("string2").as("someString"), + qDynamicTable.getTimeColumnByName("time1"), + qDynamicTable.getTimeColumnByName("time2").as("someTime"), + qDynamicTable.getDateColumnByName("date1"), + qDynamicTable.getDateColumnByName("date2").as("someDate"), + qDynamicTable.getDateTimeColumnByName("datetime1"), + qDynamicTable.getDateTimeColumnByName("datetime2").as("someDateTime"), + qDynamicTable.getCharColumnByName("char1"), + qDynamicTable.getCharColumnByName("char2").as("someChar"), + qDynamicTable.getClobColumnByName("clob1"), + qDynamicTable.getClobColumnByName("clob2").as("someClob"), + qDynamicTable.getBlobColumnByName("blob1"), + qDynamicTable.getBlobColumnByName("blob2").as("someBlob"), + qDynamicTable.getBooleanColumnByName("boolean1"), + qDynamicTable.getBooleanColumnByName("boolean2").as("someBoolean") + ).finish().buildSchema(); + + QDynamicTable testView = qDynamicTableFactory.getQDynamicTableByName("testView"); + assertNotNull(testView); + + } +} \ No newline at end of file diff --git a/dynamic-orm-core/src/test/java/com/github/vzakharchenko/dynamic/orm/SequanceTest.java b/dynamic-orm-core/src/test/java/com/github/vzakharchenko/dynamic/orm/SequanceTest.java index 0fb1688..26d8a6f 100644 --- a/dynamic-orm-core/src/test/java/com/github/vzakharchenko/dynamic/orm/SequanceTest.java +++ b/dynamic-orm-core/src/test/java/com/github/vzakharchenko/dynamic/orm/SequanceTest.java @@ -43,12 +43,12 @@ public void insertModel() { @Test public void insertDynamicModel() { - qDynamicTableFactory.buildTable("new_test_Dynamic_Table") + qDynamicTableFactory.buildTables("new_test_Dynamic_Table") .addColumns().addNumberColumn("ID", Integer.class).size(18).decimalDigits(0).useAsPrimaryKey().create() .addStringColumn("test_column").size(200).create() .finish() .addPrimaryKey().addPrimaryKeyGenerator(new PKGeneratorSequence<>("TEST_SEQUENCE")).finish() - .buildSchema(); + .finish().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/SoftDeleteTest.java b/dynamic-orm-core/src/test/java/com/github/vzakharchenko/dynamic/orm/SoftDeleteTest.java index 2238091..cec009a 100644 --- a/dynamic-orm-core/src/test/java/com/github/vzakharchenko/dynamic/orm/SoftDeleteTest.java +++ b/dynamic-orm-core/src/test/java/com/github/vzakharchenko/dynamic/orm/SoftDeleteTest.java @@ -46,7 +46,7 @@ public void testSoftDelete() { @Test public void testDynamicSoftDelete() { - qDynamicTableFactory.buildTable("TEST_DYNAMIC_SOFT_DELETE_TABLE") + qDynamicTableFactory.buildTables("TEST_DYNAMIC_SOFT_DELETE_TABLE") .addColumns().addStringColumn("ID").size(100).useAsPrimaryKey().create() .addNumberColumn("VERSION", Integer.class).size(38).decimalDigits(0).notNull().create() .addNumberColumn("STATUS", Integer.class).size(38).decimalDigits(0).notNull().create() @@ -55,7 +55,7 @@ public void testDynamicSoftDelete() { .addPrimaryKey().addPrimaryKeyGenerator(UUIDPKGenerator.getInstance()).finish() .addSoftDeleteColumn("STATUS", -1, 0) .addVersionColumn("VERSION") - .buildSchema(); + .finish().buildSchema(); QDynamicTable qDynamicTable = qDynamicTableFactory.getQDynamicTableByName("TEST_DYNAMIC_SOFT_DELETE_TABLE"); DynamicTableModel testTableVersion = new DynamicTableModel(qDynamicTable); diff --git a/dynamic-orm-core/src/test/java/com/github/vzakharchenko/dynamic/orm/VersionTest.java b/dynamic-orm-core/src/test/java/com/github/vzakharchenko/dynamic/orm/VersionTest.java index 302351a..f75134d 100644 --- a/dynamic-orm-core/src/test/java/com/github/vzakharchenko/dynamic/orm/VersionTest.java +++ b/dynamic-orm-core/src/test/java/com/github/vzakharchenko/dynamic/orm/VersionTest.java @@ -40,16 +40,19 @@ public void testAnnotationInsert() { assertNotNull(testTableVersion.getId()); assertNotNull(testTableVersion.getVersion()); assertEquals(testTableVersion.getVersion(), Integer.valueOf(0)); + String sql = ormQueryFactory.select().showSql(ormQueryFactory.buildQuery(), TestTableVersionAnnotation.class); + assertEquals(sql,"select \"TEST_TABLE_VERSION_ANNOTATION\".\"ID\", \"TEST_TABLE_VERSION_ANNOTATION\".\"VERSION\"\n" + + "from \"TEST_TABLE_VERSION_ANNOTATION\" \"TEST_TABLE_VERSION_ANNOTATION\""); } @Test public void testDynamicInsert() { - qDynamicTableFactory.buildTable("TEST_DYNAMIC_TABLE") + qDynamicTableFactory.buildTables("TEST_DYNAMIC_TABLE") .addColumns().addStringColumn("ID").size(100).useAsPrimaryKey().create() .addNumberColumn("VERSION", Integer.class).size(38).decimalDigits(0).notNull().create() .finish() .addPrimaryKey().addPrimaryKeyGenerator(UUIDPKGenerator.getInstance()).finish() - .buildSchema(); + .finish().buildSchema(); QDynamicTable qDynamicTable = qDynamicTableFactory.getQDynamicTableByName("TEST_DYNAMIC_TABLE"); DynamicTableModel testTableVersion = new DynamicTableModel(qDynamicTable); ormQueryFactory.modify(qDynamicTable, DynamicTableModel.class) @@ -62,13 +65,13 @@ public void testDynamicInsert() { @Test public void testDynamicPresetInsert() { - qDynamicTableFactory.buildTable("TEST_DYNAMIC_TABLE") + qDynamicTableFactory.buildTables("TEST_DYNAMIC_TABLE") .addColumns().addStringColumn("ID").size(100).useAsPrimaryKey().create() .addNumberColumn("VERSION", Integer.class).size(38).decimalDigits(0).notNull().create() .finish() .addPrimaryKey().addPrimaryKeyGenerator(UUIDPKGenerator.getInstance()).finish() .addVersionColumn("VERSION") - .buildSchema(); + .finish().buildSchema(); QDynamicTable qDynamicTable = qDynamicTableFactory.getQDynamicTableByName("TEST_DYNAMIC_TABLE"); DynamicTableModel testTableVersion = new DynamicTableModel(qDynamicTable); ormQueryFactory.insert(testTableVersion); @@ -191,12 +194,12 @@ public void testConcurrentlyUpdateFail() throws InterruptedException, ExecutionE @Test public void testDynamicUpdate() { - qDynamicTableFactory.buildTable("TEST_DYNAMIC_TABLE") + qDynamicTableFactory.buildTables("TEST_DYNAMIC_TABLE") .addColumns().addStringColumn("ID").size(100).useAsPrimaryKey().create() .addNumberColumn("VERSION", Integer.class).size(38).decimalDigits(0).notNull().create() .finish() .addPrimaryKey().addPrimaryKeyGenerator(UUIDPKGenerator.getInstance()).finish() - .buildSchema(); + .finish().buildSchema(); QDynamicTable qDynamicTable = qDynamicTableFactory.getQDynamicTableByName("TEST_DYNAMIC_TABLE"); DynamicTableModel testTableVersion = new DynamicTableModel(qDynamicTable); CrudBuilder builder = ormQueryFactory.modify(qDynamicTable, DynamicTableModel.class) @@ -225,12 +228,12 @@ public void testDynamicUpdate() { public void testConcurrentlyDynamicUpdateFail() throws InterruptedException, ExecutionException { ormQueryFactory.transactionManager().startTransactionIfNeeded(); - qDynamicTableFactory.buildTable("TEST_DYNAMIC_TABLE") + qDynamicTableFactory.buildTables("TEST_DYNAMIC_TABLE") .addColumns().addStringColumn("ID").size(100).useAsPrimaryKey().create() .addNumberColumn("VERSION", Integer.class).size(38).decimalDigits(0).notNull().create() .finish() .addPrimaryKey().addPrimaryKeyGenerator(UUIDPKGenerator.getInstance()).finish() - .buildSchema(); + .finish().buildSchema(); QDynamicTable qDynamicTable = qDynamicTableFactory.getQDynamicTableByName("TEST_DYNAMIC_TABLE"); DynamicTableModel testTableVersion = new DynamicTableModel(qDynamicTable); CrudBuilder builder = ormQueryFactory.modify(qDynamicTable, DynamicTableModel.class) 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 e8caf9b..e65c2df 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 @@ -23,7 +23,7 @@ public void testQuery() { TransactionBuilder transactionManager = ormQueryFactory.transactionManager(); transactionManager.startTransactionIfNeeded(); // build schema - qDynamicTableFactory.buildTable("firstTable") + qDynamicTableFactory.buildTables("firstTable") .addColumns().addStringColumn("Id") .size(255).useAsPrimaryKey().create() .addStringColumn("TestStringColumn").size(255).create() @@ -45,7 +45,7 @@ public void testQuery() { .addVersionColumn("modificationTime") .addIndex().buildIndex("uniqValue", true) .addForeignKey().buildForeignKey("linkToFirstTable", "firstTable") - .buildSchema(); + .finish().buildSchema(); transactionManager.commit(); QDynamicTable firstTable = qDynamicTableFactory.getQDynamicTableByName("firstTable"); @@ -72,9 +72,9 @@ public void testQuery() { // add integer column to table1 transactionManager.startTransactionIfNeeded(); - qDynamicTableFactory.buildTable("firstTable") + qDynamicTableFactory.buildTables("firstTable") .addColumns().addNumberColumn("newColumn", Integer.class).create().finish() - .buildSchema(); + .finish().buildSchema(); transactionManager.commit(); 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 289db88..4949590 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 @@ -30,7 +30,7 @@ public void testQuery() { transactionManager.startTransactionIfNeeded(); // build dynamic Table with foreign Key to Static Table - qDynamicTableFactory.buildTable("relatedTable") + qDynamicTableFactory.buildTables("relatedTable") .addColumns().addStringColumn("Id").size(255).useAsPrimaryKey().create() .addNumberColumn("StaticId", Integer.class).create() .addDateTimeColumn("modificationTime").notNull().create() @@ -38,7 +38,7 @@ public void testQuery() { .addPrimaryKey().addPrimaryKeyGenerator(UUIDPKGenerator.getInstance()).finish() .addVersionColumn("modificationTime") .addForeignKey().buildForeignKey("StaticId", QTestTableVersionAnnotation.qTestTableVersionAnnotation, QTestTableVersionAnnotation.qTestTableVersionAnnotation.id) - .buildSchema(); + .finish().buildSchema(); // get dynamic table metadata QDynamicTable relatedTable = qDynamicTableFactory.getQDynamicTableByName("relatedTable");