Skip to content

Commit

Permalink
Merge pull request #2 from vzakharchenko/1.0.1
Browse files Browse the repository at this point in the history
version 1.0.1
  • Loading branch information
vzakharchenko authored Mar 11, 2020
2 parents 8779d48 + bdf3571 commit 53b53cf
Show file tree
Hide file tree
Showing 131 changed files with 4,145 additions and 908 deletions.
161 changes: 120 additions & 41 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -37,6 +37,9 @@
- cache queries based on Primary Key, Column, and Column and Values
- synchronization cache with crud operations
- support clustering( if use distributed cache)
- support create Sql sequence on runtime
- support create/update View on runtime
- save/load dynamic structure

# dependencies
- [querydsl](http://www.querydsl.com/) - crud operation(insert, update, delete), querying (select, union, with)
Expand All @@ -51,7 +54,7 @@
<dependency>
<groupId>com.github.vzakharchenko</groupId>
<artifactId>dynamic-orm-core</artifactId>
<version>1.0.0</version>
<version>1.1.0</version>
</dependency>
</dependencies>
```
Expand Down Expand Up @@ -198,14 +201,27 @@ public class SpringAnnotationTest extends CachingConfigurerSupport {
```java
@Transactional()
public void testQuery() {
qDynamicTableFactory.buildTable("firstTable")
.addPrimaryStringKey("Id", 255)
.addPrimaryKeyGenerator(UUIDPKGenerator.getInstance())
.createStringColumn("TestStringColumn", 255, false)
.createDateTimeColumn("modificationTime", true)
qDynamicTableFactory.buildTables("firstTable")
.addColumns().addStringColumn("Id")
.size(255).useAsPrimaryKey().create()
.addStringColumn("TestStringColumn").size(255).create()
.addDateColumn("modificationTime").create()
.finish()
.addPrimaryKey().addPrimaryKeyGenerator(UUIDPKGenerator.getInstance())
.finish()
.addVersionColumn("modificationTime")
.buildSchema();
.finish().buildSchema();
}
```
- save dynamic structure to file
```java
File file = new File(".", "testSchema.json");
qDynamicTableFactory.saveSchema(SchemaUtils.getFileSaver(file));
```
- load dynamic structure from file
```java
File file = new File(".", "testSchema.json");
qDynamicTableFactory.loadSchema(SchemaUtils.getFileLoader(file));
```
- get table metadata
```java
Expand All @@ -220,9 +236,9 @@ qDynamicTableFactory.buildTable("firstTable")
- modify table metadata
```java
// add integer column to table
qDynamicTableFactory.buildTable("firstTable")
.createNumberColumn("newColumn", Integer.class, null, null, false)
.buildSchema();
qDynamicTableFactory.buildTables("firstTable")
.addColumns().addNumberColumn("newColumn", Integer.class).create().finish()
.finish().buildSchema();
```
- update operation
```java
Expand Down Expand Up @@ -278,27 +294,32 @@ qDynamicTableFactory.buildTable("firstTable")
// suspend the current transaction if one exists.
@Transactional(propagation = Propagation.NOT_SUPPORTED)
public void testQuery() {
TransactionBuilder transactionManager = ormQueryFactory.transactionManager();
TransactionBuilder transactionManager = ormQueryFactory.transactionManager();
transactionManager.startTransactionIfNeeded();
// build schema
qDynamicTableFactory.buildTable("firstTable")
.addPrimaryStringKey("Id", 255)
.addPrimaryKeyGenerator(UUIDPKGenerator.getInstance())
.createStringColumn("TestStringColumn", 255, false)
.createDateTimeColumn("modificationTime", true)
qDynamicTableFactory.buildTables("firstTable")
.addColumns().addStringColumn("Id")
.size(255).useAsPrimaryKey().create()
.addStringColumn("TestStringColumn").size(255).create()
.addDateColumn("modificationTime").create()
.finish()
.addPrimaryKey().addPrimaryKeyGenerator(UUIDPKGenerator.getInstance())
.finish()
.addVersionColumn("modificationTime")
.buildNextTable("secondTable")
.addPrimaryStringKey("Id", 255)
.addPrimaryKeyGenerator(UUIDPKGenerator.getInstance())
.createBooleanColumn("isDeleted", false)
.addColumns().addStringColumn("Id")
.size(255).useAsPrimaryKey().create()
.addBooleanColumn("isDeleted").notNull().create()
.addDateTimeColumn("modificationTime").notNull().create()
.addStringColumn("linkToFirstTable").size(255).create()
.addStringColumn("uniqValue").size(255).create()
.finish()
.addPrimaryKey().addPrimaryKeyGenerator(UUIDPKGenerator.getInstance()).finish()
.addSoftDeleteColumn("isDeleted", true, false)
.createDateTimeColumn("modificationTime", true)
.addVersionColumn("modificationTime")
.createStringColumn("linkToFirstTable", 255, false)
.createStringColumn("uniqValue", 255, false)
.addIndex("uniqValue", true)
.addForeignKey("linkToFirstTable", "firstTable")
.buildSchema();
.addIndex().buildIndex("uniqValue", true)
.addForeignKey().buildForeignKey("linkToFirstTable", "firstTable")
.finish().buildSchema();
transactionManager.commit();

QDynamicTable firstTable = qDynamicTableFactory.getQDynamicTableByName("firstTable");
Expand All @@ -325,9 +346,9 @@ qDynamicTableFactory.buildTable("firstTable")

// add integer column to table1
transactionManager.startTransactionIfNeeded();
qDynamicTableFactory.buildTable("firstTable")
.createNumberColumn("newColumn", Integer.class, null, null, false)
.buildSchema();
qDynamicTableFactory.buildTables("firstTable")
.addColumns().addNumberColumn("newColumn", Integer.class).create().finish()
.finish().buildSchema();
transactionManager.commit();


Expand Down Expand Up @@ -357,14 +378,13 @@ qDynamicTableFactory.buildTable("firstTable")

//soft delete the second row of the second Table
transactionManager.startTransactionIfNeeded();
DynamicTableModel dynamicTableModel = tableModels.get(1);
ormQueryFactory.softDeleteById(dynamicTableModel);
ormQueryFactory.softDeleteById(secondModel2);
transactionManager.commit();

// get new cache records (soft deleted values are not included)
tableModels = ormQueryFactory.selectCache().findAll(secondTable, DynamicTableModel.class);
assertEquals(tableModels.size(), 1);

// select all data from all table
List<RawModel> rawModels = ormQueryFactory.select().rawSelect(
ormQueryFactory.buildQuery().from(firstTable)
Expand All @@ -373,13 +393,14 @@ qDynamicTableFactory.buildTable("firstTable")
firstTable.getStringColumnByName("Id")))
.where(secondTable.getBooleanColumnByName("isDeleted").eq(false)))
.findAll(ArrayUtils.addAll(firstTable.all(), secondTable.all()));

assertEquals(rawModels.size(), 1);
RawModel rawModel = rawModels.get(0);
DynamicTableModel firstModelFromJoin = rawModel.getDynamicModel(firstTable);
DynamicTableModel secondModelFromJoin = rawModel.getDynamicModel(secondTable);
assertEquals(firstModelFromJoin.getValue("Id"), firstTableFromDatabase.getValue("Id"));
assertEquals(secondModelFromJoin.getValue("Id"), secondModel1.getValue("Id"));
}
```
# Static Tables(not Dynamic)
## - QueryDsl Models (Table Metadata)
Expand Down Expand Up @@ -487,14 +508,15 @@ Annotations:
TestTableVersionAnnotation staticTable = new TestTableVersionAnnotation();
ormQueryFactory.insert(staticTable);
// build dynamic Table with foreign Key to Static Table
qDynamicTableFactory.buildTable("relatedTable")
.addPrimaryStringKey("Id", 255)
.addPrimaryKeyGenerator(UUIDPKGenerator.getInstance())
.createDateTimeColumn("modificationTime", true)
qDynamicTableFactory.buildTables("relatedTable")
.addColumns().addStringColumn("Id").size(255).useAsPrimaryKey().create()
.addNumberColumn("StaticId", Integer.class).create()
.addDateTimeColumn("modificationTime").notNull().create()
.finish()
.addPrimaryKey().addPrimaryKeyGenerator(UUIDPKGenerator.getInstance()).finish()
.addVersionColumn("modificationTime")
.createNumberColumn("StaticId", Integer.class, null, null, false)
.addForeignKey("StaticId", QTestTableVersionAnnotation.qTestTableVersionAnnotation, QTestTableVersionAnnotation.qTestTableVersionAnnotation.id)
.buildSchema();
.addForeignKey().buildForeignKey("StaticId", QTestTableVersionAnnotation.qTestTableVersionAnnotation, QTestTableVersionAnnotation.qTestTableVersionAnnotation.id)
.finish().buildSchema();

// get dynamic table metadata
QDynamicTable relatedTable = qDynamicTableFactory.getQDynamicTableByName("relatedTable");
Expand Down Expand Up @@ -563,7 +585,7 @@ pom.xml
<plugin>
<groupId>com.github.vzakharchenko</groupId>
<artifactId>dynamic-orm-plugin</artifactId>
<version>1.0.0</version>
<version>1.1.0</version>
<configuration>
<targetQModelFolder>${targetFolder}</targetQModelFolder>
<modelPackage>${ModelPackage}</modelPackage>
Expand All @@ -582,7 +604,7 @@ pom.xml
</build>
```

# Audit Database changing
# Audit database changes
[Example: Logging Audit](dynamic-orm-examples/example-test-ehcache/src/main/java/orm/query/examples/ehcache/LogAudit.java)
```java
@Component
Expand Down Expand Up @@ -634,4 +656,61 @@ public class LogAudit implements ApplicationListener<CacheEvent> {
}
}
}
```
# Create Dynamic Table With Sequence Primary Key Generator
```java
qDynamicTableFactory.
.createSequence("dynamicTestTableSequance1")
.initialValue(1000L)
.increment(10L)
.min(1000L)
.max(10000L)
.finish()
.buildSchema();
```

# Create SQL Sequence on runtime
```java
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)
.finish()
.buildSchema();
```
# Create SQL View on runtime
```java
qDynamicTableFactory
.createView("testView").resultSet(ormQueryFactory.buildQuery()
.from(QTestTableVersionAnnotation.qTestTableVersionAnnotation), QTestTableVersionAnnotation.qTestTableVersionAnnotation.id)
.finish()
.buildSchema();
```
# use SQL View

```java
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
DynamicTableModel dynamicTableModel = ormQueryFactory.select()
.findOne(ormQueryFactory.buildQuery().from(testView), testView, DynamicTableModel.class);
assertNotNull(dynamicTableModel);
```
3 changes: 1 addition & 2 deletions analizers/exclude-pmd.properties
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,6 @@ com.github.vzakharchenko.dynamic.orm.core.dynamic.QDynamicTable=CyclomaticComple
com.github.vzakharchenko.dynamic.orm.core.cache.event.ModifyEvent=NullAssignment,CloneMethodReturnTypeMustMatchClassName
com.github.vzakharchenko.dynamic.orm.core.dynamic.QAbstractDynamicTable=TooManyMethods
com.github.vzakharchenko.dynamic.orm.core.dynamic.QDynamicTableBuilder=TooManyMethods
com.github.vzakharchenko.dynamic.orm.core.dynamic.QTableBuilder=TooManyMethods
com.github.vzakharchenko.dynamic.orm.core.dynamic.dml.DynamicModel=CloneMethodReturnTypeMustMatchClassName
com.github.vzakharchenko.dynamic.orm.core.helper.ModelHelper=GodClass
com.github.vzakharchenko.dynamic.orm.core.helper.VersionHelper=UnnecessaryLocalBeforeReturn
Expand All @@ -14,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
7 changes: 7 additions & 0 deletions analizers/findbugs-exclude.xml
Original file line number Diff line number Diff line change
Expand Up @@ -65,6 +65,9 @@
<Match>
<Bug pattern="PRMC_POSSIBLY_REDUNDANT_METHOD_CALLS"/>
</Match>
<Match>
<Bug pattern="BC_UNCONFIRMED_CAST"/>
</Match>
<Match>
<Class name="com.github.vzakharchenko.dynamic.orm.core.RawModelImpl"/>
<Bug pattern="SE_TRANSIENT_FIELD_NOT_RESTORED"/>
Expand Down Expand Up @@ -93,4 +96,8 @@
<Class name="com.github.vzakharchenko.dynamic.orm.structure.DbStructureServiceImpl"/>
<Bug pattern="JPAI_NON_PROXIED_TRANSACTION_CALL"/>
</Match>
<Match>
<Class name="com.github.vzakharchenko.dynamic.orm.core.dynamic.column.builder.QDefaultColumnBuilder"/>
<Bug pattern="PCOA_PARTIALLY_CONSTRUCTED_OBJECT_ACCESS"/>
</Match>
</FindBugsFilter>
5 changes: 4 additions & 1 deletion dynamic-orm-core/pom.xml
Original file line number Diff line number Diff line change
Expand Up @@ -137,6 +137,9 @@
<groupId>joda-time</groupId>
<artifactId>joda-time</artifactId>
</dependency>

<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-databind</artifactId>
</dependency>
</dependencies>
</project>
Original file line number Diff line number Diff line change
Expand Up @@ -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 <MODEL extends DMLModel> String showSql(SQLCommonQuery<?> sqlQuery,
RelationalPath<?> qTable,
Expand All @@ -80,4 +73,10 @@ public <MODEL extends DMLModel> 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();
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -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.
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,6 @@
import com.google.common.collect.Maps;
import com.querydsl.core.types.Path;
import com.querydsl.sql.RelationalPath;
import org.apache.commons.lang3.ArrayUtils;
import org.apache.commons.lang3.builder.ToStringBuilder;
import org.springframework.context.ApplicationEvent;

Expand All @@ -27,9 +26,9 @@ public abstract class ModifyEvent<EVENT extends ModifyEvent<EVENT>>

public static final String IS_NOT_FOUND = " is not found: ";
private final RelationalPath<?> qTable;
private final String resourceName;
protected List<EVENT> transactionHistory = new ArrayList<>();
private Class<? extends DMLModel> modelClass0;
private final String resourceName;
private DMLModel oldModel;
private DMLModel newModel;
private Map<Serializable, DiffColumnModel> diffColumnModelMap0;
Expand Down Expand Up @@ -162,10 +161,10 @@ public final CacheEventType cacheEventType() {
return cacheEventType0;
}

public final boolean isOneOf(RelationalPath... qTables) {
int indexOf = ArrayUtils.indexOf(qTables, qTable);
return indexOf > -1;
}
// public final boolean isOneOf(RelationalPath... qTables) {
// int indexOf = ArrayUtils.indexOf(qTables, qTable);
// return indexOf > -1;
// }

public final RelationalPath<?> getQTable() {
return qTable;
Expand Down
Loading

0 comments on commit 53b53cf

Please sign in to comment.