Skip to content

Commit

Permalink
Merge pull request #155 from zero88/feature/add-dml-shortcut
Browse files Browse the repository at this point in the history
Feature/add dml shortcut
  • Loading branch information
zero88 authored Jan 14, 2023
2 parents 38738f7 + aeebb56 commit d56c2b2
Show file tree
Hide file tree
Showing 18 changed files with 461 additions and 234 deletions.
11 changes: 11 additions & 0 deletions core/src/main/java/io/github/zero88/jooqx/HasExecutor.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
package io.github.zero88.jooqx;

import org.jetbrains.annotations.ApiStatus.Internal;

@Internal
public interface HasExecutor {

@Internal
SQLStatementExecutor executor();

}
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@
import javax.sql.DataSource;

import org.jetbrains.annotations.NotNull;
import org.jooq.Configuration;
import org.jooq.DSLContext;
import org.jooq.SQLDialect;
import org.jooq.impl.DSL;
Expand All @@ -27,12 +28,16 @@ public interface JooqDSLProvider {

@NotNull
static JooqDSLProvider create(SQLDialect dialect) {
return () -> DSL.using(new DefaultConfiguration().set(dialect));
return create(new DefaultConfiguration().set(dialect));
}

@NotNull
static JooqDSLProvider create(SQLDialect dialect, DataSource dataSource) {
return () -> DSL.using(new DefaultConfiguration().derive(dialect).derive(dataSource));
return create(new DefaultConfiguration().derive(dialect).derive(dataSource));
}

static JooqDSLProvider create(Configuration configuration) {
return () -> DSL.using(configuration);
}

}
31 changes: 8 additions & 23 deletions core/src/main/java/io/github/zero88/jooqx/JooqxSQLImpl.java
Original file line number Diff line number Diff line change
Expand Up @@ -13,17 +13,16 @@
import java.util.stream.IntStream;

import org.jetbrains.annotations.NotNull;
import org.jooq.DDLQuery;
import org.jooq.DSLContext;
import org.jooq.Param;
import org.jooq.Parameter;
import org.jooq.Query;
import org.jooq.Record;
import org.jooq.Routine;
import org.jooq.RowCountQuery;
import org.jooq.conf.ParamType;
import org.jooq.conf.Settings;
import org.jooq.exception.TooManyRowsException;
import org.jooq.impl.DSL;

import io.github.zero88.jooqx.SQLImpl.SQLEI;
import io.github.zero88.jooqx.SQLImpl.SQLExecutorBuilderImpl;
Expand Down Expand Up @@ -244,6 +243,13 @@ private void tweakDSLSetting() {
.otherwise(errorConverter()::reThrowError);
}

public Future<Integer> execute(@NotNull RowCountQuery statement) {
return sqlClient().preparedQuery(preparedQuery().sql(dsl().configuration(), statement))
.execute(preparedQuery().bindValues(statement, typeMapperRegistry()))
.map(SqlResult::rowCount)
.otherwise(errorConverter()::reThrowError);
}

@Override
public Future<BatchResult> batch(@NotNull Query query, @NotNull BindBatchValues bindValues) {
return sqlClient().preparedQuery(preparedQuery().sql(dsl().configuration(), query))
Expand Down Expand Up @@ -281,27 +287,6 @@ public Future<BlockResult> block(@NotNull BlockQuery blockQuery) {
.otherwise(errorConverter()::reThrowError);
}

@Override
public Future<Integer> ddl(@NotNull DDLQuery statement) {
return sqlClient().query(preparedQuery().sql(dsl().configuration(), statement))
.execute()
.map(SqlResult::rowCount)
.otherwise(errorConverter()::reThrowError);
}

@Override
public Future<Integer> sql(@NotNull String statement) {
return sqlClient().query(preparedQuery().sql(dsl().configuration(), DSL.query(statement)))
.execute()
.map(SqlResult::rowCount)
.otherwise(errorConverter()::reThrowError);
}

@Override
public <T, R> Future<@Nullable R> sqlQuery(@NotNull String statement, @NotNull SQLResultAdapter<T, R> adapter) {
return execute(dsl -> dsl.resultQuery(statement), adapter);
}

@Override
protected @NotNull JooqxPreparedQuery defPrepareQuery() { return JooqxPreparedQuery.create(); }

Expand Down
29 changes: 8 additions & 21 deletions core/src/main/java/io/github/zero88/jooqx/LegacySQLImpl.java
Original file line number Diff line number Diff line change
Expand Up @@ -11,15 +11,14 @@
import java.util.stream.IntStream;

import org.jetbrains.annotations.NotNull;
import org.jooq.DDLQuery;
import org.jooq.DSLContext;
import org.jooq.Param;
import org.jooq.Parameter;
import org.jooq.Query;
import org.jooq.Record;
import org.jooq.Routine;
import org.jooq.RowCountQuery;
import org.jooq.exception.TooManyRowsException;
import org.jooq.impl.DSL;

import io.github.zero88.jooqx.SQLImpl.SQLEI;
import io.github.zero88.jooqx.SQLImpl.SQLExecutorBuilderImpl;
Expand Down Expand Up @@ -146,6 +145,13 @@ abstract static class LegacySQLEI<S extends SQLOperations>
.otherwise(errorConverter()::reThrowError);
}

@Override
public Future<Integer> execute(@NotNull RowCountQuery statement) {
final Promise<UpdateResult> promise = Promise.promise();
sqlClient().update(preparedQuery().sql(dsl().configuration(), statement), promise);
return promise.future().map(UpdateResult::getUpdated).otherwise(errorConverter()::reThrowError);
}

@Override
public final Future<BatchResult> batch(@NotNull Query query, @NotNull BindBatchValues bindBatchValues) {
final Promise<List<Integer>> promise = Promise.promise();
Expand All @@ -166,25 +172,6 @@ public Future<BlockResult> block(@NotNull BlockQuery blockQuery) {
.otherwise(errorConverter()::reThrowError);
}

@Override
public Future<Integer> ddl(@NotNull DDLQuery statement) {
final Promise<UpdateResult> promise = Promise.promise();
sqlClient().update(preparedQuery().sql(dsl().configuration(), statement), promise);
return promise.future().map(UpdateResult::getUpdated).otherwise(errorConverter()::reThrowError);
}

@Override
public Future<Integer> sql(@NotNull String statement) {
final Promise<UpdateResult> promise = Promise.promise();
sqlClient().update(preparedQuery().sql(dsl().configuration(), DSL.query(statement)), promise);
return promise.future().map(UpdateResult::getUpdated).otherwise(errorConverter()::reThrowError);
}

@Override
public <T, R> Future<@Nullable R> sqlQuery(@NotNull String statement, @NotNull SQLResultAdapter<T, R> adapter) {
return execute(dsl -> dsl.resultQuery(statement), adapter);
}

protected abstract Future<SQLConnection> openConn();

@Override
Expand Down
6 changes: 4 additions & 2 deletions core/src/main/java/io/github/zero88/jooqx/SQLDDLExecutor.java
Original file line number Diff line number Diff line change
Expand Up @@ -18,7 +18,7 @@
* @since 2.0.0
*/
@VertxGen(concrete = false)
public interface SQLDDLExecutor extends JooqDSLProvider {
public interface SQLDDLExecutor extends JooqDSLProvider, HasExecutor {

/**
* Execute DDL statement
Expand Down Expand Up @@ -65,6 +65,8 @@ default void ddl(@NotNull DDLQuery statement, @NotNull Handler<AsyncResult<Integ
* @since 2.0.0
*/
@GenIgnore(GenIgnore.PERMITTED_TYPE)
Future<Integer> ddl(@NotNull DDLQuery statement);
default Future<Integer> ddl(@NotNull DDLQuery statement) {
return executor().execute(statement);
}

}
186 changes: 186 additions & 0 deletions core/src/main/java/io/github/zero88/jooqx/SQLDMLExecutor.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,186 @@
package io.github.zero88.jooqx;

import java.util.function.Function;

import org.jetbrains.annotations.NotNull;
import org.jooq.DSLContext;
import org.jooq.Delete;
import org.jooq.DeleteQuery;
import org.jooq.Insert;
import org.jooq.InsertQuery;
import org.jooq.Record;
import org.jooq.Update;
import org.jooq.UpdateQuery;

import io.vertx.codegen.annotations.GenIgnore;
import io.vertx.codegen.annotations.VertxGen;
import io.vertx.core.AsyncResult;
import io.vertx.core.Future;
import io.vertx.core.Handler;

/**
* Represents for a {@code DML executor} that executes {@code INSERT}, {@code UPDATE}, {@code DELETE} statements.
*
* @since 2.0.0
*/
@VertxGen(concrete = false)
public interface SQLDMLExecutor extends JooqDSLProvider, HasExecutor {

@GenIgnore
default <R extends Record> void insert(@NotNull Function<DSLContext, Insert<R>> insertFn,
@NotNull Handler<AsyncResult<Integer>> handler) {
insert(insertFn).onComplete(handler);
}

@GenIgnore
default <R extends Record> Future<Integer> insert(@NotNull Function<DSLContext, Insert<R>> insertFn) {
return insert(insertFn.apply(dsl()));
}

@GenIgnore
default <R extends Record> void insert(@NotNull Insert<R> statement,
@NotNull Handler<AsyncResult<Integer>> handler) {
insert(statement).onComplete(handler);
}

/**
* @param statement Insert statement
* @return a {@code Future} of the asynchronous result
* @since 2.0.0
*/
@GenIgnore
default <R extends Record> Future<Integer> insert(@NotNull Insert<R> statement) {
return executor().execute(statement);
}

@GenIgnore
default <R extends Record> void insertQuery(@NotNull Function<DSLContext, InsertQuery<R>> insertFn,
@NotNull Handler<AsyncResult<Integer>> handler) {
insertQuery(insertFn).onComplete(handler);
}

@GenIgnore
default <R extends Record> Future<Integer> insertQuery(@NotNull Function<DSLContext, InsertQuery<R>> insertFn) {
return insertQuery(insertFn.apply(dsl()));
}

@GenIgnore
default <R extends Record> void insertQuery(@NotNull InsertQuery<R> statement,
@NotNull Handler<AsyncResult<Integer>> handler) {
insertQuery(statement).onComplete(handler);
}

@GenIgnore
default <R extends Record> Future<Integer> insertQuery(@NotNull InsertQuery<R> statement) {
return executor().execute(statement);
}

@GenIgnore
default <R extends Record> void update(@NotNull Function<DSLContext, Update<R>> updateFn,
@NotNull Handler<AsyncResult<Integer>> handler) {
update(updateFn).onComplete(handler);
}

@GenIgnore
default <R extends Record> Future<Integer> update(@NotNull Function<DSLContext, Update<R>> updateFn) {
return update(updateFn.apply(dsl()));
}

@GenIgnore
default <R extends Record> void update(@NotNull Update<R> statement,
@NotNull Handler<AsyncResult<Integer>> handler) {
update(statement).onComplete(handler);
}

/**
* @param statement Update statement
* @return a {@code Future} of the asynchronous result
* @since 2.0.0
*/
@GenIgnore
default <R extends Record> Future<Integer> update(@NotNull Update<R> statement) {
return executor().execute(statement);
}

@GenIgnore
default <R extends Record> void updateQuery(@NotNull Function<DSLContext, UpdateQuery<R>> updateFn,
@NotNull Handler<AsyncResult<Integer>> handler) {
updateQuery(updateFn).onComplete(handler);
}

@GenIgnore
default <R extends Record> Future<Integer> updateQuery(@NotNull Function<DSLContext, UpdateQuery<R>> updateFn) {
return updateQuery(updateFn.apply(dsl()));
}

@GenIgnore
default <R extends Record> void updateQuery(@NotNull UpdateQuery<R> statement,
@NotNull Handler<AsyncResult<Integer>> handler) {
updateQuery(statement).onComplete(handler);
}

/**
* @param statement Update statement
* @return a {@code Future} of the asynchronous result
* @since 2.0.0
*/
@GenIgnore
default <R extends Record> Future<Integer> updateQuery(@NotNull UpdateQuery<R> statement) {
return executor().execute(statement);
}

@GenIgnore
default <R extends Record> void delete(@NotNull Function<DSLContext, Delete<R>> deleteFn,
@NotNull Handler<AsyncResult<Integer>> handler) {
delete(deleteFn).onComplete(handler);
}

@GenIgnore
default <R extends Record> Future<Integer> delete(@NotNull Function<DSLContext, Delete<R>> deleteFn) {
return delete(deleteFn.apply(dsl()));
}

@GenIgnore
default <R extends Record> void delete(@NotNull Delete<R> statement,
@NotNull Handler<AsyncResult<Integer>> handler) {
delete(statement).onComplete(handler);
}

/**
* @param statement Delete statement
* @return a {@code Future} of the asynchronous result
* @since 2.0.0
*/
@GenIgnore
default <R extends Record> Future<Integer> delete(@NotNull Delete<R> statement) {
return executor().execute(statement);
}

@GenIgnore
default <R extends Record> void deleteQuery(@NotNull Function<DSLContext, DeleteQuery<R>> deleteFn,
@NotNull Handler<AsyncResult<Integer>> handler) {
deleteQuery(deleteFn).onComplete(handler);
}

@GenIgnore
default <R extends Record> Future<Integer> deleteQuery(@NotNull Function<DSLContext, DeleteQuery<R>> deleteFn) {
return deleteQuery(deleteFn.apply(dsl()));
}

@GenIgnore
default <R extends Record> void deleteQuery(@NotNull DeleteQuery<R> statement,
@NotNull Handler<AsyncResult<Integer>> handler) {
deleteQuery(statement).onComplete(handler);
}

/**
* @param statement Delete statement
* @return a {@code Future} of the asynchronous result
* @since 2.0.0
*/
@GenIgnore
default <R extends Record> Future<Integer> deleteQuery(@NotNull DeleteQuery<R> statement) {
return executor().execute(statement);
}

}
Loading

0 comments on commit d56c2b2

Please sign in to comment.