diff --git a/src/main/java/org/redkale/source/FilterExpress.java b/src/main/java/org/redkale/source/FilterExpress.java
index 28cf8714d..a148086fd 100644
--- a/src/main/java/org/redkale/source/FilterExpress.java
+++ b/src/main/java/org/redkale/source/FilterExpress.java
@@ -20,7 +20,6 @@ public enum FilterExpress {
LESSTHAN("<"),
GREATERTHANOREQUALTO(">="),
LESSTHANOREQUALTO("<="),
-
LIKE("LIKE"),
NOTLIKE("NOT LIKE"),
IGNORECASELIKE("LIKE"), //不区分大小写的 LIKE
@@ -40,6 +39,8 @@ public enum FilterExpress {
OPAND("&"), //与运算 > 0
OPOR("|"), //或运算 > 0
OPANDNO("&"), //与运算 == 0
+ MOD("%"), //取模运算 > 0
+ MODNO("%"), //取模运算 == 0
AND("AND"),
OR("OR");
diff --git a/src/main/java/org/redkale/source/FilterNode.java b/src/main/java/org/redkale/source/FilterNode.java
index 86643f7a3..0012fd4f6 100644
--- a/src/main/java/org/redkale/source/FilterNode.java
+++ b/src/main/java/org/redkale/source/FilterNode.java
@@ -5,17 +5,15 @@
*/
package org.redkale.source;
-import static org.redkale.source.FilterExpress.*;
import java.io.*;
import java.lang.reflect.*;
import java.util.*;
import java.util.function.*;
+import static org.redkale.source.FilterExpress.*;
import org.redkale.util.*;
/**
- * 注意:
- * 在调用 createSQLExpress 之前必须先调用 createSQLJoin
- * 在调用 createPredicate 之前必须先调用 isCacheUseable
+ * 注意: 在调用 createSQLExpress 之前必须先调用 createSQLJoin 在调用 createPredicate 之前必须先调用 isCacheUseable
*
*
* 详情见: http://www.redkale.org
@@ -114,10 +112,10 @@ public class FilterNode {
/**
* 该方法需要重载
*
- * @param Entity类的泛型
- * @param func EntityInfo的加载器
+ * @param Entity类的泛型
+ * @param func EntityInfo的加载器
* @param joinTabalis 关联表集合
- * @param info Entity类的EntityInfo
+ * @param info Entity类的EntityInfo
* @return SQL的join语句 不存在返回null
*/
protected CharSequence createSQLJoin(final Function func, final Map joinTabalis, final EntityInfo info) {
@@ -176,9 +174,9 @@ public class FilterNode {
/**
* 该方法需要重载
*
- * @param Entity类的泛型
+ * @param Entity类的泛型
* @param joinTabalis 关联表的集合
- * @param info EntityInfo
+ * @param info EntityInfo
* @return JOIN的SQL语句
*/
protected CharSequence createSQLExpress(final EntityInfo info, final Map joinTabalis) {
@@ -234,8 +232,10 @@ public class FilterNode {
switch (express) {
case OPAND:
case OPOR:
+ case MOD:
sb.append(express.value()).append(' ').append(val).append(" > 0");
break;
+ case MODNO:
case OPANDNO:
sb.append(express.value()).append(' ').append(val).append(" = 0");
break;
@@ -433,7 +433,8 @@ public class FilterNode {
}
final Serializable val = val0;
switch (express) {
- case EQUAL: return new Predicate() {
+ case EQUAL:
+ return new Predicate() {
@Override
public boolean test(T t) {
@@ -445,7 +446,8 @@ public class FilterNode {
return field + ' ' + express.value() + ' ' + formatToString(val);
}
};
- case NOTEQUAL: return new Predicate() {
+ case NOTEQUAL:
+ return new Predicate() {
@Override
public boolean test(T t) {
@@ -457,7 +459,8 @@ public class FilterNode {
return field + ' ' + express.value() + ' ' + formatToString(val);
}
};
- case GREATERTHAN: return new Predicate() {
+ case GREATERTHAN:
+ return new Predicate() {
@Override
public boolean test(T t) {
@@ -469,7 +472,8 @@ public class FilterNode {
return field + ' ' + express.value() + ' ' + val;
}
};
- case LESSTHAN: return new Predicate() {
+ case LESSTHAN:
+ return new Predicate() {
@Override
public boolean test(T t) {
@@ -481,7 +485,8 @@ public class FilterNode {
return field + ' ' + express.value() + ' ' + val;
}
};
- case GREATERTHANOREQUALTO: return new Predicate() {
+ case GREATERTHANOREQUALTO:
+ return new Predicate() {
@Override
public boolean test(T t) {
@@ -493,7 +498,8 @@ public class FilterNode {
return field + ' ' + express.value() + ' ' + val;
}
};
- case LESSTHANOREQUALTO: return new Predicate() {
+ case LESSTHANOREQUALTO:
+ return new Predicate() {
@Override
public boolean test(T t) {
@@ -506,7 +512,8 @@ public class FilterNode {
}
};
- case OPAND: return new Predicate() {
+ case OPAND:
+ return new Predicate() {
@Override
public boolean test(T t) {
@@ -518,7 +525,21 @@ public class FilterNode {
return field + " & " + val + " > 0";
}
};
- case OPOR: return new Predicate() {
+ case MOD:
+ return new Predicate() {
+
+ @Override
+ public boolean test(T t) {
+ return (((Number) attr.get(t)).longValue() % ((Number) val).longValue()) > 0;
+ }
+
+ @Override
+ public String toString() {
+ return field + " & " + val + " > 0";
+ }
+ };
+ case OPOR:
+ return new Predicate() {
@Override
public boolean test(T t) {
@@ -530,13 +551,27 @@ public class FilterNode {
return field + " | " + val + " > 0";
}
};
- case OPANDNO: return new Predicate() {
+ case OPANDNO:
+ return new Predicate() {
@Override
public boolean test(T t) {
return (((Number) attr.get(t)).longValue() & ((Number) val).longValue()) == 0;
}
+ @Override
+ public String toString() {
+ return field + " & " + val + " = 0";
+ }
+ };
+ case MODNO:
+ return new Predicate() {
+
+ @Override
+ public boolean test(T t) {
+ return (((Number) attr.get(t)).longValue() % ((Number) val).longValue()) == 0;
+ }
+
@Override
public String toString() {
return field + " & " + val + " = 0";