Skip to content

Commit

Permalink
Added API to specify Mock action for SQL update/batch process
Browse files Browse the repository at this point in the history
  • Loading branch information
HidekiSugimoto189 committed Oct 11, 2022
1 parent 9be62ec commit d0d47cd
Show file tree
Hide file tree
Showing 5 changed files with 110 additions and 2 deletions.
9 changes: 9 additions & 0 deletions src/main/java/jp/co/future/uroborosql/SqlAgentImpl.java
Expand Up @@ -274,6 +274,11 @@ public List<Map<String, Object>> query(final SqlContext sqlContext, final CaseFo
*/
@Override
public int update(final SqlContext sqlContext) throws SQLException {
if (sqlContext.getUpdateMockAction() != null) {
LOG.debug("Performs Mock action of update process");
return sqlContext.getUpdateMockAction().apply(sqlContext);
}

// パラメータログを出力する
MDC.put(SUPPRESS_PARAMETER_LOG_OUTPUT, Boolean.FALSE.toString());

Expand Down Expand Up @@ -400,6 +405,10 @@ protected void afterUpdate(final SqlContext sqlContext) {
*/
@Override
public int[] batch(final SqlContext sqlContext) throws SQLException {
if (sqlContext.getUpdateMockAction() != null) {
LOG.debug("Performs Mock action of batch process");
return new int[] { sqlContext.getUpdateMockAction().apply(sqlContext) };
}
// バッチ処理の場合大量のログが出力されるため、パラメータログの出力を抑止する
MDC.put(SUPPRESS_PARAMETER_LOG_OUTPUT, Boolean.TRUE.toString());

Expand Down
20 changes: 20 additions & 0 deletions src/main/java/jp/co/future/uroborosql/context/SqlContext.java
Expand Up @@ -12,6 +12,7 @@
import java.sql.SQLException;
import java.sql.SQLType;
import java.util.Map;
import java.util.function.Function;

import jp.co.future.uroborosql.enums.SqlKind;
import jp.co.future.uroborosql.fluent.ProcedureFluent;
Expand Down Expand Up @@ -287,4 +288,23 @@ default void addDefineColumnType(final int column, final SQLType type) {
* @param generatedKeyValues 自動採番するキーカラム値の配列
*/
void setGeneratedKeyValues(Object[] generatedKeyValues);

/**
* 更新処理実行時に通常の更新SQL発行の代わりに疑似的に実行する処理を取得する.<br>
* デフォルト実装は<code>null</code> を返却する. 必要に応じて子クラスでオーバーライドすること.
*
* @return 通常の更新SQL発行の代わりに行う疑似動作. <code>null</code> が返る場合は通常の更新処理を行う.
*/
default Function<SqlContext, Integer> getUpdateMockAction() {
return null;
}

/**
* 更新処理実行時に通常の更新SQL発行の代わりに疑似的に実行する処理を設定する.
*
* @param updateMockAction 通常の更新SQL発行の代わりに行う疑似動作. <code>null</code> を設定した場合は通常の更新処理を行う.
* @return 自身のSqlContext
*/
SqlContext setUpdateMockAction(Function<SqlContext, Integer> updateMockAction);

}
26 changes: 26 additions & 0 deletions src/main/java/jp/co/future/uroborosql/context/SqlContextImpl.java
Expand Up @@ -25,6 +25,7 @@
import java.util.Objects;
import java.util.Set;
import java.util.function.Consumer;
import java.util.function.Function;
import java.util.function.Supplier;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
Expand Down Expand Up @@ -163,8 +164,12 @@ public boolean contains(final Object o) {
/** パラメータ変換マネージャ */
private BindParameterMapperManager parameterMapperManager;

/** パラメータ名Set */
private ParameterNames parameterNames;

/** 更新処理実行時に通常の更新SQL発行の代わりに疑似的に実行する処理. */
private Function<SqlContext, Integer> updateMockAction;

/**
* コンストラクタ。
*/
Expand Down Expand Up @@ -1229,4 +1234,25 @@ public boolean hasGeneratedKeyColumns() {
return getGeneratedKeyColumns() != null && getGeneratedKeyColumns().length > 0;
}

/**
* {@inheritDoc}
*
* @see jp.co.future.uroborosql.context.SqlContext#getUpdateMockAction()
*/
@Override
public Function<SqlContext, Integer> getUpdateMockAction() {
return this.updateMockAction;
}

/**
* {@inheritDoc}
*
* @see jp.co.future.uroborosql.context.SqlContext#setUpdateMockAction(java.util.function.Function)
*/
@Override
public SqlContext setUpdateMockAction(Function<SqlContext, Integer> updateMockAction) {
this.updateMockAction = updateMockAction;
return this;
}

}
34 changes: 33 additions & 1 deletion src/test/java/jp/co/future/uroborosql/SqlBatchTest.java
@@ -1,6 +1,9 @@
package jp.co.future.uroborosql;

import static org.junit.Assert.*;
import static org.hamcrest.CoreMatchers.is;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertThat;
import static org.junit.Assert.fail;

import java.math.BigDecimal;
import java.nio.file.Paths;
Expand All @@ -19,6 +22,7 @@
import jp.co.future.uroborosql.context.SqlContext;
import jp.co.future.uroborosql.converter.MapResultSetConverter;
import jp.co.future.uroborosql.exception.UroborosqlRuntimeException;
import jp.co.future.uroborosql.fluent.SqlBatch;
import jp.co.future.uroborosql.utils.CaseFormat;

public class SqlBatchTest extends AbstractDbTest {
Expand Down Expand Up @@ -376,4 +380,32 @@ public void testNotFoundFile() throws Exception {
}
}

/**
* updateMockActionが指定された場合のテストケース。
*/
@Test
public void testUpdateMockAction() throws Exception {
Timestamp currentDatetime = Timestamp.valueOf("2005-12-12 10:10:10.000000000");
List<Map<String, Object>> rows = new ArrayList<>();
for (int i = 1; i <= 1000; i++) {
Map<String, Object> row = new HashMap<>();
row.put("product_id", i);
row.put("product_name", "商品名" + i);
row.put("product_kana_name", "ショウヒンメイ" + i);
row.put("jan_code", "1234567890124");
row.put("product_description", i + "番目の商品");
row.put("ins_datetime", currentDatetime);
row.put("upd_datetime", currentDatetime);
row.put("version_no", 1);
rows.add(row);
}
// 処理実行
SqlBatch batch = agent.batch("example/insert_product")
.paramStream(rows.stream());
SqlContext ctx = batch.context();
ctx.setUpdateMockAction(context -> 2);

assertThat(batch.count(), is(4));
}

}
23 changes: 22 additions & 1 deletion src/test/java/jp/co/future/uroborosql/SqlUpdateTest.java
@@ -1,6 +1,10 @@
package jp.co.future.uroborosql;

import static org.junit.Assert.*;
import static org.hamcrest.CoreMatchers.is;
import static org.hamcrest.MatcherAssert.assertThat;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertNull;
import static org.junit.Assert.fail;

import java.math.BigDecimal;
import java.nio.file.Paths;
Expand All @@ -16,6 +20,7 @@
import jp.co.future.uroborosql.context.SqlContext;
import jp.co.future.uroborosql.converter.MapResultSetConverter;
import jp.co.future.uroborosql.exception.UroborosqlRuntimeException;
import jp.co.future.uroborosql.fluent.SqlUpdate;
import jp.co.future.uroborosql.utils.CaseFormat;

public class SqlUpdateTest extends AbstractDbTest {
Expand Down Expand Up @@ -106,4 +111,20 @@ public void testNotFoundFile() throws Exception {
fail(e.getMessage());
}
}

/**
* updateMockActionが指定された場合のテストケース。
*/
@Test
public void testUpdateMockAction() throws Exception {
SqlUpdate update = agent.update("example/selectinsert_product")
.param("product_id", new BigDecimal("0"), JDBCType.DECIMAL)
.param("jan_code", "1234567890123", Types.CHAR);
SqlContext ctx = update.context();
ctx.setUpdateMockAction(context -> 2);

assertThat(update.count(), is(2));

}

}

0 comments on commit d0d47cd

Please sign in to comment.