Skip to content

Commit

Permalink
update documentation
Browse files Browse the repository at this point in the history
  • Loading branch information
vzakharchenko committed Mar 8, 2020
1 parent 358a29f commit d2038f8
Show file tree
Hide file tree
Showing 8 changed files with 310 additions and 10 deletions.
217 changes: 217 additions & 0 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,16 @@
[![Coverage Status](https://coveralls.io/repos/github/vzakharchenko/dynamic-orm/badge.svg?branch=master)](https://coveralls.io/github/vzakharchenko/dynamic-orm?branch=master)
[![Maintainability](https://api.codeclimate.com/v1/badges/5c587a6e77be5e8cbef0/maintainability)](https://codeclimate.com/github/vzakharchenko/dynamic-orm/maintainability)

# supported database
- Oracle
- Postgres
- MySQL
- Hsql
- H2
- Derby
- Firebird
- SQLite
- MSSQL
# Features
- modify database structure on runtime (use Liquibase)
- create tables
Expand Down Expand Up @@ -370,4 +380,211 @@ qDynamicTableFactory.buildTable("firstTable")
assertEquals(firstModelFromJoin.getValue("Id"), firstTableFromDatabase.getValue("Id"));
assertEquals(secondModelFromJoin.getValue("Id"), secondModel1.getValue("Id"));
```
# Static Tables(not Dynamic)
## - QueryDsl Models (Table Metadata)
```java
@Generated("com.querydsl.query.sql.codegen.MetaDataSerializer")
public class QTestTableVersionAnnotation extends RelationalPathBase<QTestTableVersionAnnotation> {

public static final QTestTableVersionAnnotation qTestTableVersionAnnotation = new QTestTableVersionAnnotation("TEST_TABLE_VERSION_ANNOTATION");

public final NumberPath<Integer> id = createNumber("id", Integer.class);

public final NumberPath<Integer> version = createNumber("version", Integer.class);

public final PrimaryKey<QTestTableVersionAnnotation> idPk = createPrimaryKey(id);

public QTestTableVersionAnnotation(String variable) {
super(QTestTableVersionAnnotation.class, forVariable(variable), "", "TEST_TABLE_VERSION_ANNOTATION");
addMetadata();
}

public QTestTableVersionAnnotation(String variable, String schema, String table) {
super(QTestTableVersionAnnotation.class, forVariable(variable), schema, table);
addMetadata();
}

public QTestTableVersionAnnotation(Path<? extends QTestTableVersionAnnotation> path) {
super(path.getType(), path.getMetadata(), "", "TEST_TABLE_VERSION_ANNOTATION");
addMetadata();
}

public QTestTableVersionAnnotation(PathMetadata metadata) {
super(QTestTableVersionAnnotation.class, metadata, "", "TEST_TABLE_VERSION_ANNOTATION");
addMetadata();
}

public void addMetadata() {
addMetadata(id, ColumnMetadata.named("ID").withIndex(1).ofType(Types.INTEGER).withSize(38).notNull());
addMetadata(version, ColumnMetadata.named("VERSION").withIndex(2).ofType(Types.INTEGER).withSize(38).notNull());
}

}
```
## - Static POJO Model
```java
@QueryDslModel(qTableClass = QTestTableVersionAnnotation.class, tableName = "TEST_TABLE_VERSION_ANNOTATION", primaryKeyGenerator = PrimaryKeyGenerators.SEQUENCE)
@SequanceName("TEST_SEQUENCE")
public class TestTableVersionAnnotation implements DMLModel {

private Integer id;
@Version
private Integer version;

public Integer getId() {
return id;
}

public void setId(Integer id) {
this.id = id;
}

public Integer getVersion() {
return version;
}

public void setVersion(Integer version) {
this.version = version;
}
}
```
Annotations:
- **@QueryDslModel** - related QueryDsl model.
- qTableClass - queryDsl class
- tableName - Table name
- primaryKeyGenerator - Primary Key generator
- DEFAULT - does not use PK generator
- INTEGER - integer values
- LONG - long values
- UUID - Universally Unique Identifier values (UUID.randomUUID().toString())
- SEQUENCE - Sql Sequence (if database support)
- **@SequanceName** - Sequance annotation
- **@Version** - mark field as Optimistic locking. (Supports only TimeStamp and numeric column)

## Example of Usage

- insert
```java
TestTableVersionAnnotation testTableVersion = new TestTableVersionAnnotation();
ormQueryFactory.insert(testTableVersion);
```
- update
```java
testTableVersion.setSomeColumn("testColumn")
ormQueryFactory.updateById(testTableVersion);
```
- select Version column and put result to cache
```java
Integer version = ormQueryFactory.selectCache().findOne(
ormQueryFactory.buildQuery()
.from(QTestTableVersionAnnotation.qTestTableVersionAnnotation)
.where(QTestTableVersionAnnotation.qTestTableVersionAnnotation.id.eq(testTableVersion.getId()))
, QTestTableVersionAnnotation.qTestTableVersionAnnotation.version);
```
- join with dynamic table
```java
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)
.addVersionColumn("modificationTime")
.createNumberColumn("StaticId", Integer.class, null, null, false)
.addForeignKey("StaticId", QTestTableVersionAnnotation.qTestTableVersionAnnotation, QTestTableVersionAnnotation.qTestTableVersionAnnotation.id)
.buildSchema();

// get dynamic table metadata
QDynamicTable relatedTable = qDynamicTableFactory.getQDynamicTableByName("relatedTable");

// insert to dynamic table
DynamicTableModel relatedTableData = new DynamicTableModel(relatedTable);
relatedTableData.addColumnValue("StaticId", staticTable.getId());

ormQueryFactory.insert(relatedTableData);

// select with join
DynamicTableModel tableModel = ormQueryFactory
.select()
.findOne(ormQueryFactory
.buildQuery().from(relatedTable)
.innerJoin(QTestTableVersionAnnotation.qTestTableVersionAnnotation)
.on(relatedTable
.getNumberColumnByName("StaticId", Integer.class)
.eq(QTestTableVersionAnnotation
.qTestTableVersionAnnotation.id))
.where(QTestTableVersionAnnotation
.qTestTableVersionAnnotation.id.eq(staticTable.getId())),
relatedTable, DynamicTableModel.class);
assertNotNull(tableModel);
assertEquals(tableModel.getValue("Id"), relatedTableData.getValue("Id"));
```
## Generate QueryDslModel
[Example](dynamic-orm-examples/example-test-qmodels/pom.xml)

pom.xml
```xml
<plugin>
<groupId>com.querydsl</groupId>
<artifactId>querydsl-maven-plugin</artifactId>
<version>${querydsl}</version>

<executions>
<execution>
<phase>generate-sources</phase>
<goals>
<goal>export</goal>
</goals>
</execution>
</executions>
<configuration>
<jdbcDriver>${driver}</jdbcDriver>
<beanPrefix>Q</beanPrefix>
<packageName>${QmodelPackage}</packageName>
<targetFolder>${targetFolder}</targetFolder>
<jdbcUrl>${jdbcUrl}</jdbcUrl>
<jdbcPassword>${jdbcPassword}</jdbcPassword>
<jdbcUser>${jdbcUser}</jdbcUser>
<sourceFolder />
</configuration>
</plugin>
```

## Generate Static POJO Models
[Example](dynamic-orm-examples/example-test-models/pom.xml)

pom.xml

```xml
<build>
<plugins>
<plugin>
<groupId>com.github.vzakharchenko</groupId>
<artifactId>dynamic-orm-plugin</artifactId>
<version>${project.version}</version>
<configuration>
<targetQModelFolder>${targetFolder}</targetQModelFolder>
<modelPackage>${ModelPackage}</modelPackage>
<qmodelPackage>${QmodelPackage}</qmodelPackage>
</configuration>
<executions>
<execution>
<phase>process-sources</phase>
<goals>
<goal>modelGenerator</goal>
</goals>
</execution>
</executions>
<dependencies>
<dependency>
<groupId>com.github.vzakharchenko</groupId>
<artifactId>example-test-qmodels</artifactId>
<version>${project.version}</version>
</dependency>
</dependencies>
</plugin>
</plugins>
</build>
```

Original file line number Diff line number Diff line change
Expand Up @@ -118,6 +118,24 @@ public void testAnnotationUpdate() {

}

@Test()
public void testSelectWithCache() {
TestTableVersionAnnotation testTableVersion = new TestTableVersionAnnotation();

ormQueryFactory.insert(testTableVersion);
assertNotNull(testTableVersion.getId());
assertNotNull(testTableVersion.getVersion());
assertEquals(testTableVersion.getVersion(), Integer.valueOf(0));
ormQueryFactory.updateById(testTableVersion);
Integer version = ormQueryFactory.selectCache().findOne(
ormQueryFactory.buildQuery()
.from(QTestTableVersionAnnotation.qTestTableVersionAnnotation)
.where(QTestTableVersionAnnotation.qTestTableVersionAnnotation.id.eq(testTableVersion.getId()))
, QTestTableVersionAnnotation.qTestTableVersionAnnotation.version);
assertEquals(version, Integer.valueOf(1));

}

@Test(expectedExceptions = ExecutionException.class)
@Transactional(propagation = Propagation.NOT_SUPPORTED)
public void testConcurrentlyUpdateFail() throws InterruptedException, ExecutionException {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -99,8 +99,7 @@ public void testQuery() {

//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)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -44,7 +44,7 @@ public PlatformTransactionManager annotationDrivenTransactionManager() {
@Bean
public DataSource dataSource() {
try {
return DataSourceHelper.getDataSourceHsqldbCreateSchema("jdbc:hsqldb:mem:DATABASE_MYSQL;sql.mys=true");
return DataSourceHelper.getDataSourceHsqldbCreateSchema("jdbc:hsqldb:mem:DATABASE_ORACLE;sql.syntax_ora=true");
} catch (Exception e) {
throw new IllegalStateException(e);
}
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,69 @@
package com.github.vzakharchenko.dynamic.orm.core;

import com.github.vzakharchenko.dynamic.orm.AnnotationTestQueryOrm;
import com.github.vzakharchenko.dynamic.orm.core.dynamic.QDynamicTable;
import com.github.vzakharchenko.dynamic.orm.core.dynamic.dml.DynamicTableModel;
import com.github.vzakharchenko.dynamic.orm.core.pk.UUIDPKGenerator;
import com.github.vzakharchenko.dynamic.orm.core.transaction.TransactionBuilder;
import com.github.vzakharchenko.dynamic.orm.model.TestTableVersionAnnotation;
import com.github.vzakharchenko.dynamic.orm.qModel.QTestTableVersionAnnotation;
import org.springframework.transaction.annotation.Propagation;
import org.springframework.transaction.annotation.Transactional;
import org.testng.annotations.Test;

import static org.testng.Assert.assertEquals;
import static org.testng.Assert.assertNotNull;

public class StaticDynamicQueryAnnotationTest extends AnnotationTestQueryOrm {

@Test
// suspend the current transaction if one exists.
@Transactional(propagation = Propagation.NOT_SUPPORTED)
public void testQuery() {
TransactionBuilder transactionManager = ormQueryFactory.transactionManager();

//insert data to static Table
transactionManager.startTransactionIfNeeded();
TestTableVersionAnnotation staticTable = new TestTableVersionAnnotation();
ormQueryFactory.insert(staticTable);
transactionManager.commit();

transactionManager.startTransactionIfNeeded();
// build dynamic Table with foreign Key to Static Table
qDynamicTableFactory.buildTable("relatedTable")
.addPrimaryStringKey("Id", 255)
.addPrimaryKeyGenerator(UUIDPKGenerator.getInstance())
.createDateTimeColumn("modificationTime", true)
.addVersionColumn("modificationTime")
.createNumberColumn("StaticId", Integer.class, null, null, false)
.addForeignKey("StaticId", QTestTableVersionAnnotation.qTestTableVersionAnnotation, QTestTableVersionAnnotation.qTestTableVersionAnnotation.id)
.buildSchema();

// get dynamic table metadata
QDynamicTable relatedTable = qDynamicTableFactory.getQDynamicTableByName("relatedTable");

// insert to dynamic table
DynamicTableModel relatedTableData = new DynamicTableModel(relatedTable);
relatedTableData.addColumnValue("StaticId", staticTable.getId());

ormQueryFactory.insert(relatedTableData);

// select with join
DynamicTableModel tableModel = ormQueryFactory
.select()
.findOne(ormQueryFactory
.buildQuery().from(relatedTable)
.innerJoin(QTestTableVersionAnnotation.qTestTableVersionAnnotation)
.on(relatedTable
.getNumberColumnByName("StaticId", Integer.class)
.eq(QTestTableVersionAnnotation
.qTestTableVersionAnnotation.id))
.where(QTestTableVersionAnnotation
.qTestTableVersionAnnotation.id.eq(staticTable.getId())),
relatedTable, DynamicTableModel.class);
assertNotNull(tableModel);
assertEquals(tableModel.getValue("Id"), relatedTableData.getValue("Id"));
transactionManager.commit();
}

}
Original file line number Diff line number Diff line change
Expand Up @@ -14,9 +14,6 @@
import static com.querydsl.core.types.PathMetadataFactory.forVariable;


/**
* QSCountryCode is a Querydsl query type for QSCountryCode
*/
@Generated("com.querydsl.query.sql.codegen.MetaDataSerializer")
public class QTesttable extends RelationalPathBase<QTesttable> {

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -32,10 +32,10 @@ public class QRolePermission extends com.querydsl.sql.RelationalPathBase<QRolePe

public final com.querydsl.sql.PrimaryKey<QRolePermission> rolePermissionPkey = createPrimaryKey(id);

public final com.querydsl.sql.ForeignKey<QRole> rolePermission2Fkey = createForeignKey(roleId, "ID");

public final com.querydsl.sql.ForeignKey<QPermission> rolePermission1Fkey = createForeignKey(permissionId, "ID");

public final com.querydsl.sql.ForeignKey<QRole> rolePermission2Fkey = createForeignKey(roleId, "ID");

public QRolePermission(String variable) {
super(QRolePermission.class, forVariable(variable), "PUBLIC", "ROLE_PERMISSION");
addMetadata();
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -32,10 +32,10 @@ public class QUserrole extends com.querydsl.sql.RelationalPathBase<QUserrole> {

public final com.querydsl.sql.PrimaryKey<QUserrole> userrolePkey = createPrimaryKey(id);

public final com.querydsl.sql.ForeignKey<QUserdata> userroleUserIdFkey = createForeignKey(userId, "ID");

public final com.querydsl.sql.ForeignKey<QRole> userroleRoleIdFkey = createForeignKey(roleId, "ID");

public final com.querydsl.sql.ForeignKey<QUserdata> userroleUserIdFkey = createForeignKey(userId, "ID");

public QUserrole(String variable) {
super(QUserrole.class, forVariable(variable), "PUBLIC", "USERROLE");
addMetadata();
Expand Down

0 comments on commit d2038f8

Please sign in to comment.