From 8a8d45e642c71af6967d539e9b5f85815eb9470a Mon Sep 17 00:00:00 2001 From: Redkale <8730487+redkale@users.noreply.github.com> Date: Mon, 11 Nov 2019 11:10:32 +0800 Subject: [PATCH] =?UTF-8?q?DataSource=E5=A2=9E=E5=8A=A0=E5=88=A4=E6=96=AD?= =?UTF-8?q?=E5=AD=97=E7=AC=A6=E4=B8=B2=E5=AD=97=E6=AE=B5=E5=80=BC=E9=95=BF?= =?UTF-8?q?=E5=BA=A6=E7=9A=84FilterExpress?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/org/redkale/source/FilterExpress.java | 5 ++ src/org/redkale/source/FilterNode.java | 80 +++++++++++++++++++++- src/org/redkale/source/FilterNodeBean.java | 3 + 3 files changed, 87 insertions(+), 1 deletion(-) diff --git a/src/org/redkale/source/FilterExpress.java b/src/org/redkale/source/FilterExpress.java index 92df8f5bc..290ade443 100644 --- a/src/org/redkale/source/FilterExpress.java +++ b/src/org/redkale/source/FilterExpress.java @@ -31,6 +31,11 @@ public enum FilterExpress { NOTLIKE("NOT LIKE"), IGNORECASELIKE("LIKE"), //不区分大小写的 LIKE IGNORECASENOTLIKE("NOT LIKE"), //不区分大小写的 NOT LIKE + LENGTH_EQUAL("="), //字符串值的长度 + LENGTH_LESSTHAN("<"), //字符串值的长度 < + LENGTH_LESSTHANOREQUALTO("<="), //字符串值的长度 <= + LENGTH_GREATERTHAN(">"), //字符串值的长度 > + LENGTH_GREATERTHANOREQUALTO(">="), //字符串值的长度 >= CONTAIN("CONTAIN"), //包含, 相当于反向LIKE NOTCONTAIN("NOT CONTAIN"), //不包含, 相当于反向LIKE diff --git a/src/org/redkale/source/FilterNode.java b/src/org/redkale/source/FilterNode.java index a988f118a..15a319233 100644 --- a/src/org/redkale/source/FilterNode.java +++ b/src/org/redkale/source/FilterNode.java @@ -397,7 +397,10 @@ public class FilterNode { //FilterNode 不能实现Serializable接口, 否则 if (express == NOTCONTAIN) return info.notcontainSQL.replace("${column}", info.getSQLColumn(talis, column)).replace("${keystr}", val); if (express == IGNORECASENOTCONTAIN) return info.notcontainSQL.replace("${column}", "LOWER(" + info.getSQLColumn(talis, column) + ")").replace("${keystr}", val); - if (express == IGNORECASEEQUAL || express == IGNORECASENOTEQUAL || express == IGNORECASELIKE || express == IGNORECASENOTLIKE) { + if (express == LENGTH_EQUAL || express == LENGTH_LESSTHAN || express == LENGTH_LESSTHANOREQUALTO + || express == LENGTH_GREATERTHAN || express == LENGTH_GREATERTHANOREQUALTO) { + sb.append("LENGTH(").append(info.getSQLColumn(talis, column)).append(')'); + } else if (express == IGNORECASEEQUAL || express == IGNORECASENOTEQUAL || express == IGNORECASELIKE || express == IGNORECASENOTLIKE) { sb.append("LOWER(").append(info.getSQLColumn(talis, column)).append(')'); if (fk) val = "LOWER(" + info.getSQLColumn(talis, ((FilterKey) val0).getColumn()) + ')'; } else { @@ -1406,6 +1409,81 @@ public class FilterNode { //FilterNode 不能实现Serializable接口, 否则 return "LOWER(" + field + ") " + express.value() + ' ' + formatToString(valstr2); } }; + case LENGTH_EQUAL: + final int intval = ((Number) val).intValue(); + return new Predicate() { + + @Override + public boolean test(T t) { + Object rs = attr.get(t); + return (rs == null && 0 == intval) || (rs != null && rs.toString().length() == intval); + } + + @Override + public String toString() { + return "LENGTH(" + field + ") " + express.value() + ' ' + intval; + } + }; + case LENGTH_LESSTHAN: + final int intval2 = ((Number) val).intValue(); + return new Predicate() { + + @Override + public boolean test(T t) { + Object rs = attr.get(t); + return (rs == null && 0 < intval2) || (rs != null && rs.toString().length() < intval2); + } + + @Override + public String toString() { + return "LENGTH(" + field + ") " + express.value() + ' ' + intval2; + } + }; + case LENGTH_LESSTHANOREQUALTO: + final int intval3 = ((Number) val).intValue(); + return new Predicate() { + + @Override + public boolean test(T t) { + Object rs = attr.get(t); + return (rs == null && 0 <= intval3) || (rs != null && rs.toString().length() <= intval3); + } + + @Override + public String toString() { + return "LENGTH(" + field + ") " + express.value() + ' ' + intval3; + } + }; + case LENGTH_GREATERTHAN: + final int intval4 = ((Number) val).intValue(); + return new Predicate() { + + @Override + public boolean test(T t) { + Object rs = attr.get(t); + return (rs == null && 0 > intval4) || (rs != null && rs.toString().length() > intval4); + } + + @Override + public String toString() { + return "LENGTH(" + field + ") " + express.value() + ' ' + intval4; + } + }; + case LENGTH_GREATERTHANOREQUALTO: + final int intval5 = ((Number) val).intValue(); + return new Predicate() { + + @Override + public boolean test(T t) { + Object rs = attr.get(t); + return (rs == null && 0 >= intval5) || (rs != null && rs.toString().length() >= intval5); + } + + @Override + public String toString() { + return "LENGTH(" + field + ") " + express.value() + ' ' + intval5; + } + }; case CONTAIN: return fk ? new Predicate() { diff --git a/src/org/redkale/source/FilterNodeBean.java b/src/org/redkale/source/FilterNodeBean.java index 068410e4e..3a9bbfbae 100644 --- a/src/org/redkale/source/FilterNodeBean.java +++ b/src/org/redkale/source/FilterNodeBean.java @@ -363,6 +363,9 @@ public final class FilterNodeBean implements Comparable