mirror of
https://gitee.com/mybatis-flex/mybatis-flex.git
synced 2025-12-08 01:28:24 +08:00
在 QueryColumnBehavior 中新增静态字段 conditionCaster ,用于全局设置在满足一定条件后,将原条件转换为指定条件,例如将 column = null 转换为 column is null 。可兼容原有的 in 到 = 的智能转换。当智能转换被打开时,会先执行智能转换再执行 conditionCaster 的方法。
对应的测试方法在 DynamicConditionTest 中。
This commit is contained in:
parent
46fb406e1e
commit
3b21443d80
@ -15,7 +15,12 @@
|
||||
*/
|
||||
package com.mybatisflex.core.query;
|
||||
|
||||
import com.mybatisflex.core.constant.SqlConsts;
|
||||
import com.mybatisflex.core.constant.SqlOperator;
|
||||
|
||||
import java.util.Iterator;
|
||||
import java.util.Objects;
|
||||
import java.util.function.Function;
|
||||
import java.util.function.Predicate;
|
||||
|
||||
/**
|
||||
@ -23,6 +28,7 @@ import java.util.function.Predicate;
|
||||
*
|
||||
* @author michael
|
||||
* @author 王帅
|
||||
* @author CloudPlayer
|
||||
*/
|
||||
public class QueryColumnBehavior {
|
||||
|
||||
@ -36,11 +42,54 @@ public class QueryColumnBehavior {
|
||||
public static final Predicate<Object> IGNORE_EMPTY = o -> o == null || "".equals(o);
|
||||
public static final Predicate<Object> IGNORE_BLANK = o -> o == null || "".equals(o.toString().trim());
|
||||
|
||||
/**
|
||||
* 在满足输入的数组或可迭代对象中的容量为 1 (即只有一个元素)时,自动将条件中的 in 转换为 =
|
||||
*/
|
||||
public static final Function<? super QueryCondition, ? extends QueryCondition> CONVERT_IN_TO_EQUALS = it -> {
|
||||
Object value = it.value;
|
||||
if (value == null) {
|
||||
return it;
|
||||
}
|
||||
if (it.logic.equalsIgnoreCase(SqlConsts.IN)) {
|
||||
Object firstValue;
|
||||
if (value instanceof Iterable<?>) {
|
||||
Iterator<?> iter = ((Iterable<?>) value).iterator();
|
||||
if (!iter.hasNext()) { // 没有元素,直接返回原条件
|
||||
return it;
|
||||
}
|
||||
firstValue = iter.next(); // 取第一个元素
|
||||
if (iter.hasNext()) { // 如果有后续元素,则直接返回原条件
|
||||
return it;
|
||||
}
|
||||
} else if (value instanceof Object[]) {
|
||||
Object[] array = (Object[]) value;
|
||||
if (array.length != 1) { // 如果不是单元素的数组就直接返回
|
||||
return it;
|
||||
}
|
||||
firstValue = array[0]; // 取第一个元素
|
||||
} else {
|
||||
return it;
|
||||
}
|
||||
return QueryCondition.create(it.column, SqlOperator.EQUALS, firstValue); // 将 in 转换为 =
|
||||
} else {
|
||||
return it;
|
||||
}
|
||||
};
|
||||
|
||||
/**
|
||||
* 如果使用了 = 来比较 null ,则将其转为 is null 。
|
||||
*/
|
||||
public static final Function<? super QueryCondition, ? extends QueryCondition> CONVERT_EQUALS_TO_IS_NULL = it -> it.value == null ? it.column.isNull() : it;
|
||||
/**
|
||||
* 自定义全局的自动忽略参数的方法。
|
||||
*/
|
||||
private static Predicate<Object> ignoreFunction = IGNORE_NULL;
|
||||
|
||||
/**
|
||||
* 自定义全局的自动转换条件的方法。
|
||||
*/
|
||||
private static Function<? super QueryCondition, ? extends QueryCondition> conditionCaster = Function.identity();
|
||||
|
||||
/**
|
||||
* 当 {@code IN(...)} 条件只有 1 个参数时,是否自动把的内容转换为相等。
|
||||
*/
|
||||
@ -66,4 +115,15 @@ public class QueryColumnBehavior {
|
||||
return ignoreFunction.test(value);
|
||||
}
|
||||
|
||||
public static Function<? super QueryCondition, ? extends QueryCondition> getConditionCaster() {
|
||||
return smartConvertInToEquals ? CONVERT_IN_TO_EQUALS.andThen(conditionCaster) : conditionCaster;
|
||||
}
|
||||
|
||||
public static void setConditionCaster(Function<? super QueryCondition, ? extends QueryCondition> conditionCaster) {
|
||||
QueryColumnBehavior.conditionCaster = conditionCaster;
|
||||
}
|
||||
|
||||
public static QueryCondition castCondition(QueryCondition condition) {
|
||||
return getConditionCaster().apply(condition);
|
||||
}
|
||||
}
|
||||
|
||||
@ -17,14 +17,19 @@
|
||||
package com.mybatisflex.coretest;
|
||||
|
||||
import com.mybatisflex.core.constant.SqlConnector;
|
||||
import com.mybatisflex.core.constant.SqlOperator;
|
||||
import com.mybatisflex.core.query.*;
|
||||
import com.mybatisflex.core.util.StringUtil;
|
||||
import org.junit.Assert;
|
||||
import org.junit.Test;
|
||||
|
||||
import java.util.Arrays;
|
||||
import java.util.Collections;
|
||||
import java.util.List;
|
||||
import java.util.Objects;
|
||||
|
||||
import static com.mybatisflex.core.query.QueryColumnBehavior.CONVERT_EQUALS_TO_IS_NULL;
|
||||
import static com.mybatisflex.core.query.QueryColumnBehavior.getConditionCaster;
|
||||
import static com.mybatisflex.core.query.QueryMethods.bracket;
|
||||
import static com.mybatisflex.core.query.QueryMethods.raw;
|
||||
import static com.mybatisflex.coretest.table.AccountTableDef.ACCOUNT;
|
||||
@ -227,4 +232,80 @@ public class DynamicConditionTest {
|
||||
System.out.println(qw.toSQL());
|
||||
}
|
||||
|
||||
|
||||
private void assertConditionEquals(QueryCondition expect, QueryCondition actual) {
|
||||
Assert.assertEquals(expect.getColumn(), actual.getColumn());
|
||||
Assert.assertEquals(expect.getLogic(), actual.getLogic());
|
||||
Assert.assertEquals(expect.getValue(), actual.getValue());
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testCastFunction1() {
|
||||
QueryCondition condition = QueryCondition.create(new QueryColumn("id"), SqlOperator.IN, new Object[] {null});
|
||||
Assert.assertSame(condition, getConditionCaster().apply(condition));
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testCastFunction2() {
|
||||
QueryColumn column = new QueryColumn("id");
|
||||
QueryColumnBehavior.setConditionCaster(CONVERT_EQUALS_TO_IS_NULL);
|
||||
|
||||
QueryCondition condition = QueryCondition.create(column, SqlOperator.EQUALS, null);
|
||||
QueryCondition expect = column.isNull();
|
||||
QueryCondition actual = getConditionCaster().apply(condition);
|
||||
|
||||
assertConditionEquals(expect, actual);
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testCastFunction3() {
|
||||
QueryColumn column = new QueryColumn("id");
|
||||
QueryColumnBehavior.setConditionCaster(CONVERT_EQUALS_TO_IS_NULL);
|
||||
QueryColumnBehavior.setSmartConvertInToEquals(true);
|
||||
|
||||
QueryCondition condition = QueryCondition.create(column, SqlOperator.EQUALS, null);
|
||||
QueryCondition expect = column.isNull();
|
||||
QueryCondition actual = getConditionCaster().apply(condition);
|
||||
|
||||
assertConditionEquals(expect, actual);
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testCastFunction4() {
|
||||
QueryColumn column = new QueryColumn("id");
|
||||
QueryColumnBehavior.setConditionCaster(CONVERT_EQUALS_TO_IS_NULL);
|
||||
QueryColumnBehavior.setSmartConvertInToEquals(true);
|
||||
|
||||
QueryCondition condition = QueryCondition.create(column, SqlOperator.IN, new Object[] { 1 });
|
||||
QueryCondition expect = QueryCondition.create(column, SqlOperator.EQUALS, 1);
|
||||
QueryCondition actual = getConditionCaster().apply(condition);
|
||||
|
||||
assertConditionEquals(expect, actual);
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testCastFunction5() {
|
||||
QueryColumn column = new QueryColumn("id");
|
||||
QueryColumnBehavior.setConditionCaster(CONVERT_EQUALS_TO_IS_NULL);
|
||||
QueryColumnBehavior.setSmartConvertInToEquals(true);
|
||||
|
||||
QueryCondition condition = QueryCondition.create(column, SqlOperator.IN, new Object[] { null });
|
||||
QueryCondition expect = column.isNull();
|
||||
QueryCondition actual = getConditionCaster().apply(condition);
|
||||
|
||||
assertConditionEquals(expect, actual);
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testCastFunction6() {
|
||||
QueryColumn column = new QueryColumn("id");
|
||||
QueryColumnBehavior.setConditionCaster(CONVERT_EQUALS_TO_IS_NULL);
|
||||
QueryColumnBehavior.setSmartConvertInToEquals(true);
|
||||
|
||||
QueryCondition condition = QueryCondition.create(column, SqlOperator.IN, Collections.singletonList(null));
|
||||
QueryCondition expect = column.isNull();
|
||||
QueryCondition actual = getConditionCaster().apply(condition);
|
||||
|
||||
assertConditionEquals(expect, actual);
|
||||
}
|
||||
}
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user