From c2438a794fad4b0222fbe67f9af74080e0c9be88 Mon Sep 17 00:00:00 2001 From: zkyoma Date: Thu, 6 Jul 2023 15:06:27 +0800 Subject: [PATCH] =?UTF-8?q?=E5=9F=BA=E4=BA=8Eundo=E6=97=A5=E5=BF=97?= =?UTF-8?q?=E5=AE=9E=E7=8E=B0delete=EF=BC=8Cinsert=E8=AF=AD=E5=8F=A5?= =?UTF-8?q?=E7=9A=84=E8=87=AA=E5=8A=A8revert=20(#352)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * 基于undo日志实现delete,insert语句的自动revert * 增加 InsertSQLImageMapper 和 DeleteSQLImageMapper 的测试用例 --- .../core/image/impl/DeleteSQLImageMapper.java | 8 +- .../core/image/impl/InsertSQLImageMapper.java | 8 +- .../core/image/impl/SQLImageMapperTest.java | 76 +++++++++++++++++++ 3 files changed, 90 insertions(+), 2 deletions(-) create mode 100644 hmily-tac/hmily-tac-sqlrevert/hmily-tac-sqlrevert-core/src/test/java/org/dromara/hmily/tac/sqlrevert/core/image/impl/SQLImageMapperTest.java diff --git a/hmily-tac/hmily-tac-sqlrevert/hmily-tac-sqlrevert-core/src/main/java/org/dromara/hmily/tac/sqlrevert/core/image/impl/DeleteSQLImageMapper.java b/hmily-tac/hmily-tac-sqlrevert/hmily-tac-sqlrevert-core/src/main/java/org/dromara/hmily/tac/sqlrevert/core/image/impl/DeleteSQLImageMapper.java index bada24b9..0ffb4f0b 100644 --- a/hmily-tac/hmily-tac-sqlrevert/hmily-tac-sqlrevert-core/src/main/java/org/dromara/hmily/tac/sqlrevert/core/image/impl/DeleteSQLImageMapper.java +++ b/hmily-tac/hmily-tac-sqlrevert/hmily-tac-sqlrevert-core/src/main/java/org/dromara/hmily/tac/sqlrevert/core/image/impl/DeleteSQLImageMapper.java @@ -17,9 +17,12 @@ package org.dromara.hmily.tac.sqlrevert.core.image.impl; import lombok.RequiredArgsConstructor; +import org.dromara.hmily.tac.sqlrevert.core.image.CreateSQLUtil; import org.dromara.hmily.tac.sqlrevert.core.image.RevertSQLUnit; import org.dromara.hmily.tac.sqlrevert.core.image.SQLImageMapper; +import java.util.LinkedList; +import java.util.List; import java.util.Map; /** @@ -36,6 +39,9 @@ public final class DeleteSQLImageMapper implements SQLImageMapper { @Override public RevertSQLUnit cast() { - return null; + String sql = String.format("INSERT `%s` %s", + tableName, CreateSQLUtil.getInsertValuesClause(beforeImages.keySet())); + List parameters = new LinkedList<>(beforeImages.values()); + return new RevertSQLUnit(sql, parameters); } } diff --git a/hmily-tac/hmily-tac-sqlrevert/hmily-tac-sqlrevert-core/src/main/java/org/dromara/hmily/tac/sqlrevert/core/image/impl/InsertSQLImageMapper.java b/hmily-tac/hmily-tac-sqlrevert/hmily-tac-sqlrevert-core/src/main/java/org/dromara/hmily/tac/sqlrevert/core/image/impl/InsertSQLImageMapper.java index 2c5ddc2e..6c8d5217 100644 --- a/hmily-tac/hmily-tac-sqlrevert/hmily-tac-sqlrevert-core/src/main/java/org/dromara/hmily/tac/sqlrevert/core/image/impl/InsertSQLImageMapper.java +++ b/hmily-tac/hmily-tac-sqlrevert/hmily-tac-sqlrevert-core/src/main/java/org/dromara/hmily/tac/sqlrevert/core/image/impl/InsertSQLImageMapper.java @@ -17,9 +17,12 @@ package org.dromara.hmily.tac.sqlrevert.core.image.impl; import lombok.RequiredArgsConstructor; +import org.dromara.hmily.tac.sqlrevert.core.image.CreateSQLUtil; import org.dromara.hmily.tac.sqlrevert.core.image.RevertSQLUnit; import org.dromara.hmily.tac.sqlrevert.core.image.SQLImageMapper; +import java.util.LinkedList; +import java.util.List; import java.util.Map; /** @@ -36,6 +39,9 @@ public final class InsertSQLImageMapper implements SQLImageMapper { @Override public RevertSQLUnit cast() { - return null; + String sql = String.format("DELETE FROM `%s` WHERE %s", + tableName, CreateSQLUtil.getKeyValueClause(afterImages.keySet(), " AND ")); + List parameters = new LinkedList<>(afterImages.values()); + return new RevertSQLUnit(sql, parameters); } } diff --git a/hmily-tac/hmily-tac-sqlrevert/hmily-tac-sqlrevert-core/src/test/java/org/dromara/hmily/tac/sqlrevert/core/image/impl/SQLImageMapperTest.java b/hmily-tac/hmily-tac-sqlrevert/hmily-tac-sqlrevert-core/src/test/java/org/dromara/hmily/tac/sqlrevert/core/image/impl/SQLImageMapperTest.java new file mode 100644 index 00000000..d90eb443 --- /dev/null +++ b/hmily-tac/hmily-tac-sqlrevert/hmily-tac-sqlrevert-core/src/test/java/org/dromara/hmily/tac/sqlrevert/core/image/impl/SQLImageMapperTest.java @@ -0,0 +1,76 @@ +package org.dromara.hmily.tac.sqlrevert.core.image.impl; + +import org.dromara.hmily.repository.spi.entity.tuple.HmilySQLManipulation; +import org.dromara.hmily.repository.spi.entity.tuple.HmilySQLTuple; +import org.dromara.hmily.tac.sqlrevert.core.image.RevertSQLUnit; +import org.dromara.hmily.tac.sqlrevert.core.image.SQLImageMapper; +import org.dromara.hmily.tac.sqlrevert.core.image.SQLImageMapperFactory; +import org.junit.Assert; +import org.junit.Test; + +import java.util.Arrays; +import java.util.HashMap; +import java.util.Map; + +/** + * @Author zhangzhi + * @Date: 2023/7/4 15:59 + */ +public class SQLImageMapperTest { + + private SQLImageMapper sqlImageMapper; + + @Test + public void testInsertSQLImageMapper() { + // insert sql: insert `t_user` (ID,NAME,AGE) values ('1','zhangsan',23) + + // revertSql: DELETE FROM `t_user` WHERE ID=? AND NAME=? AND AGE=? + // parameters: [1, zhangsan, 23] + RevertSQLUnit targetRevertSQLUnit = new RevertSQLUnit( + "DELETE FROM `t_user` WHERE ID=? AND NAME=? AND AGE=?", + Arrays.asList("1", "zhangsan", 23)); + + // 创建测试 insert sql 的 HmilySQLTuple 对象 + HmilySQLTuple hmilySQLTuple = new HmilySQLTuple(); + hmilySQLTuple.setTableName("t_user"); + Map afterImage = new HashMap<>(); + afterImage.put("ID", "1"); + afterImage.put("NAME", "zhangsan"); + afterImage.put("AGE", "23"); + hmilySQLTuple.setAfterImage(afterImage); + hmilySQLTuple.setManipulationType(HmilySQLManipulation.INSERT); + sqlImageMapper = SQLImageMapperFactory.newInstance(hmilySQLTuple); + + RevertSQLUnit revertSQLUnit = sqlImageMapper.cast(); + + Assert.assertEquals(revertSQLUnit.getSql(), targetRevertSQLUnit.getSql()); + Assert.assertEquals(revertSQLUnit.getParameters().toString(), targetRevertSQLUnit.getParameters().toString()); + } + + @Test + public void testDeleteSQLImageMapper() { + // delete sql: DELETE FROM `t_user` WHERE ID='1' AND NAME='zhangsan' AND AGE=23 + + // revertSql: INSERT `t_user` (ID,NAME,AGE) VALUES (?,?,?) + // parameters: [1, zhangsan, 23] + RevertSQLUnit targetRevertSQLUnit = new RevertSQLUnit( + "INSERT `t_user` (ID,NAME,AGE) VALUES (?,?,?)", + Arrays.asList("1", "zhangsan", 23)); + + // 创建测试 delete sql 的 HmilySQLTuple 对象 + HmilySQLTuple hmilySQLTuple = new HmilySQLTuple(); + hmilySQLTuple.setTableName("t_user"); + Map beforeImage = new HashMap<>(); + beforeImage.put("ID", "1"); + beforeImage.put("NAME", "zhangsan"); + beforeImage.put("AGE", "23"); + hmilySQLTuple.setBeforeImage(beforeImage); + hmilySQLTuple.setManipulationType(HmilySQLManipulation.DELETE); + sqlImageMapper = SQLImageMapperFactory.newInstance(hmilySQLTuple); + + RevertSQLUnit revertSQLUnit = sqlImageMapper.cast(); + + Assert.assertEquals(revertSQLUnit.getSql(), targetRevertSQLUnit.getSql()); + Assert.assertEquals(revertSQLUnit.getParameters().toString(), targetRevertSQLUnit.getParameters().toString()); + } +}