From bb5a19b338fd73a2a970ea45240b132f62dabe2c Mon Sep 17 00:00:00 2001 From: RedKale <22250530@qq.com> Date: Tue, 22 Mar 2016 18:25:09 +0800 Subject: [PATCH] --- .../org/redkale/source/FilterExpress.java | 6 + .../java/org/redkale/source/FilterNode.java | 116 ++++++++++++------ 2 files changed, 87 insertions(+), 35 deletions(-) diff --git a/src/main/java/org/redkale/source/FilterExpress.java b/src/main/java/org/redkale/source/FilterExpress.java index 94d7d7e11..ceca71bcc 100644 --- a/src/main/java/org/redkale/source/FilterExpress.java +++ b/src/main/java/org/redkale/source/FilterExpress.java @@ -20,6 +20,12 @@ public enum FilterExpress { LESSTHAN("<"), GREATERTHANOREQUALTO(">="), LESSTHANOREQUALTO("<="), + + STARTSWITH("LIKE"), + NOTSTARTSWITH("NOT LIKE"), + ENDSWITH("LIKE"), + NOTENDSWITH("NOT LIKE"), + LIKE("LIKE"), NOTLIKE("NOT LIKE"), IGNORECASELIKE("LIKE"), //不区分大小写的 LIKE diff --git a/src/main/java/org/redkale/source/FilterNode.java b/src/main/java/org/redkale/source/FilterNode.java index 44568e93a..fecb95135 100644 --- a/src/main/java/org/redkale/source/FilterNode.java +++ b/src/main/java/org/redkale/source/FilterNode.java @@ -5,16 +5,16 @@ */ package org.redkale.source; -import java.io.*; -import java.lang.reflect.*; +import java.io.Serializable; +import java.lang.reflect.Array; import java.util.*; import java.util.function.*; import static org.redkale.source.FilterExpress.*; -import org.redkale.util.*; +import org.redkale.util.Attribute; /** * 注意: 在调用 createSQLExpress 之前必须先调用 createSQLJoin 在调用 createPredicate 之前必须先调用 isCacheUseable - * + *

*

* 详情见: http://www.redkale.org * @@ -112,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) { @@ -174,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) { @@ -216,9 +216,9 @@ public class FilterNode { return new StringBuilder().append(info.getSQLColumn(talis, column)).append(' ').append(express.value()); } Object val0 = getValue(); - if(val0 == null) return null; + if (val0 == null) return null; if (express == FV_MOD || express == FV_DIV) { - FilterValue fv = (FilterValue)val0; + FilterValue fv = (FilterValue) val0; return new StringBuilder().append(info.getSQLColumn(talis, column)).append(' ').append(express.value()).append(' ').append(fv.getOptvalue()) .append(' ').append(fv.getExpress().value()).append(' ').append(fv.getDestvalue()); } @@ -531,9 +531,9 @@ public class FilterNode { } }; case FV_MOD: - FilterValue fv0 = (FilterValue)val; - switch(fv0.getExpress()) { - case EQUAL : + FilterValue fv0 = (FilterValue) val; + switch (fv0.getExpress()) { + case EQUAL: return new Predicate() { @Override @@ -546,7 +546,7 @@ public class FilterNode { return field + " " + express.value() + " " + fv0.getOptvalue() + " " + fv0.getExpress().value() + " " + fv0.getDestvalue(); } }; - case NOTEQUAL : + case NOTEQUAL: return new Predicate() { @Override @@ -559,7 +559,7 @@ public class FilterNode { return field + " " + express.value() + " " + fv0.getOptvalue() + " " + fv0.getExpress().value() + " " + fv0.getDestvalue(); } }; - case GREATERTHAN : + case GREATERTHAN: return new Predicate() { @Override @@ -572,7 +572,7 @@ public class FilterNode { return field + " " + express.value() + " " + fv0.getOptvalue() + " " + fv0.getExpress().value() + " " + fv0.getDestvalue(); } }; - case LESSTHAN : + case LESSTHAN: return new Predicate() { @Override @@ -585,7 +585,7 @@ public class FilterNode { return field + " " + express.value() + " " + fv0.getOptvalue() + " " + fv0.getExpress().value() + " " + fv0.getDestvalue(); } }; - case GREATERTHANOREQUALTO : + case GREATERTHANOREQUALTO: return new Predicate() { @Override @@ -598,7 +598,7 @@ public class FilterNode { return field + " " + express.value() + " " + fv0.getOptvalue() + " " + fv0.getExpress().value() + " " + fv0.getDestvalue(); } }; - case LESSTHANOREQUALTO : + case LESSTHANOREQUALTO: return new Predicate() { @Override @@ -611,13 +611,13 @@ public class FilterNode { return field + " " + express.value() + " " + fv0.getOptvalue() + " " + fv0.getExpress().value() + " " + fv0.getDestvalue(); } }; - default : - throw new RuntimeException("(" + fv0 + ")'s express illegal, must be =, !=, <, >, <=, >="); - } + default: + throw new RuntimeException("(" + fv0 + ")'s express illegal, must be =, !=, <, >, <=, >="); + } case FV_DIV: - FilterValue fv1 = (FilterValue)val; - switch(fv1.getExpress()) { - case EQUAL : + FilterValue fv1 = (FilterValue) val; + switch (fv1.getExpress()) { + case EQUAL: return new Predicate() { @Override @@ -630,7 +630,7 @@ public class FilterNode { return field + " " + express.value() + " " + fv1.getOptvalue() + " " + fv1.getExpress().value() + " " + fv1.getDestvalue(); } }; - case NOTEQUAL : + case NOTEQUAL: return new Predicate() { @Override @@ -643,7 +643,7 @@ public class FilterNode { return field + " " + express.value() + " " + fv1.getOptvalue() + " " + fv1.getExpress().value() + " " + fv1.getDestvalue(); } }; - case GREATERTHAN : + case GREATERTHAN: return new Predicate() { @Override @@ -656,7 +656,7 @@ public class FilterNode { return field + " " + express.value() + " " + fv1.getOptvalue() + " " + fv1.getExpress().value() + " " + fv1.getDestvalue(); } }; - case LESSTHAN : + case LESSTHAN: return new Predicate() { @Override @@ -669,7 +669,7 @@ public class FilterNode { return field + " " + express.value() + " " + fv1.getOptvalue() + " " + fv1.getExpress().value() + " " + fv1.getDestvalue(); } }; - case GREATERTHANOREQUALTO : + case GREATERTHANOREQUALTO: return new Predicate() { @Override @@ -682,7 +682,7 @@ public class FilterNode { return field + " " + express.value() + " " + fv1.getOptvalue() + " " + fv1.getExpress().value() + " " + fv1.getDestvalue(); } }; - case LESSTHANOREQUALTO : + case LESSTHANOREQUALTO: return new Predicate() { @Override @@ -695,8 +695,8 @@ public class FilterNode { return field + " " + express.value() + " " + fv1.getOptvalue() + " " + fv1.getExpress().value() + " " + fv1.getDestvalue(); } }; - default : - throw new RuntimeException("(" + fv1 + ")'s express illegal, must be =, !=, <, >, <=, >="); + default: + throw new RuntimeException("(" + fv1 + ")'s express illegal, must be =, !=, <, >, <=, >="); } case OPOR: return new Predicate() { @@ -738,6 +738,34 @@ public class FilterNode { return field + ' ' + express.value() + ' ' + formatToString(val); } }; + case STARTSWITH: + return new Predicate() { + + @Override + public boolean test(T t) { + Object rs = attr.get(t); + return rs != null && rs.toString().startsWith(val.toString()); + } + + @Override + public String toString() { + return field + " STARTSWITH " + formatToString(val); + } + }; + case ENDSWITH: + return new Predicate() { + + @Override + public boolean test(T t) { + Object rs = attr.get(t); + return rs != null && rs.toString().endsWith(val.toString()); + } + + @Override + public String toString() { + return field + " ENDSWITH " + formatToString(val); + } + }; case IGNORECASELIKE: final String valstr = val.toString().toLowerCase(); return new Predicate() { @@ -753,18 +781,32 @@ public class FilterNode { return "LOWER(" + field + ") " + express.value() + ' ' + formatToString(valstr); } }; - case NOTLIKE: + case NOTSTARTSWITH: return new Predicate() { @Override public boolean test(T t) { Object rs = attr.get(t); - return rs == null || !rs.toString().contains(val.toString()); + return rs == null || !rs.toString().startsWith(val.toString()); } @Override public String toString() { - return field + ' ' + express.value() + ' ' + formatToString(val); + return field + " NOT STARTSWITH " + formatToString(val); + } + }; + case NOTENDSWITH: + return new Predicate() { + + @Override + public boolean test(T t) { + Object rs = attr.get(t); + return rs == null || !rs.toString().endsWith(val.toString()); + } + + @Override + public String toString() { + return field + " NOT ENDSWITH " + formatToString(val); } }; case IGNORECASENOTLIKE: @@ -1108,6 +1150,10 @@ public class FilterNode { if (value instanceof CharSequence) { if (express == LIKE || express == NOTLIKE) { value = "%" + value + '%'; + } else if (express == STARTSWITH || express == NOTSTARTSWITH) { + value = value + "%"; + } else if (express == ENDSWITH || express == NOTENDSWITH) { + value = "%" + value; } else if (express == IGNORECASELIKE || express == IGNORECASENOTLIKE) { value = "%" + value.toString().toLowerCase() + '%'; } else if (express == IGNORECASECONTAIN || express == IGNORECASENOTCONTAIN) {