diff --git a/src/com/wentch/redkale/source/FilterColumn.java b/src/com/wentch/redkale/source/FilterColumn.java index 9f4e86cf2..6944a9601 100644 --- a/src/com/wentch/redkale/source/FilterColumn.java +++ b/src/com/wentch/redkale/source/FilterColumn.java @@ -34,10 +34,11 @@ public @interface FilterColumn { long least() default 1; /** - * LIKE、NOT LIKE时是否区分大小写 + * LIKE、NOT LIKE时是否区分大小写, 由IGNORECASELIKE、IGNORECASENOTLIKE代替 *

* @return */ + @Deprecated boolean ignoreCase() default false; /** diff --git a/src/com/wentch/redkale/source/FilterExpress.java b/src/com/wentch/redkale/source/FilterExpress.java index 33a372a51..2e04189be 100644 --- a/src/com/wentch/redkale/source/FilterExpress.java +++ b/src/com/wentch/redkale/source/FilterExpress.java @@ -19,6 +19,8 @@ public enum FilterExpress { LESSTHANOREQUALTO("<="), LIKE("LIKE"), NOTLIKE("NOT LIKE"), + IGNORECASELIKE("LIKE"), + IGNORECASENOTLIKE("NOT LIKE"), BETWEEN("BETWEEN"), NOTBETWEEN("NOT BETWEEN"), IN("IN"), diff --git a/src/com/wentch/redkale/source/FilterNode.java b/src/com/wentch/redkale/source/FilterNode.java index b357213c5..09e250e3a 100644 --- a/src/com/wentch/redkale/source/FilterNode.java +++ b/src/com/wentch/redkale/source/FilterNode.java @@ -201,7 +201,12 @@ public class FilterNode { if (val == null) return null; StringBuilder sb = new StringBuilder(32); if (tabalis != null) sb.append(tabalis).append('.'); - sb.append(info.getSQLColumn(column)).append(' '); + if (express == IGNORECASELIKE || express == IGNORECASENOTLIKE) { + sb.append("LOWER(").append(info.getSQLColumn(column)).append(')'); + } else { + sb.append(info.getSQLColumn(column)); + } + sb.append(' '); switch (express) { case OPAND: case OPOR: @@ -510,6 +515,21 @@ public class FilterNode { return attr.field() + ' ' + express.value() + ' ' + val; } }; + case IGNORECASELIKE: + final String valstr = val.toString().toLowerCase(); + return new Predicate() { + + @Override + public boolean test(T t) { + Object rs = attr.get(t); + return rs != null && rs.toString().toLowerCase().contains(valstr); + } + + @Override + public String toString() { + return "LOWER(" + attr.field() + ") " + express.value() + ' ' + valstr; + } + }; case NOTLIKE: return new Predicate() { @@ -524,6 +544,21 @@ public class FilterNode { return attr.field() + ' ' + express.value() + ' ' + val; } }; + case IGNORECASENOTLIKE: + final String valstr2 = val.toString().toLowerCase(); + return new Predicate() { + + @Override + public boolean test(T t) { + Object rs = attr.get(t); + return rs == null || !rs.toString().toLowerCase().contains(valstr2); + } + + @Override + public String toString() { + return "LOWER(" + attr.field() + ") " + express.value() + ' ' + valstr2; + } + }; case BETWEEN: case NOTBETWEEN: Range range = (Range) val; @@ -756,7 +791,7 @@ public class FilterNode { if (express == ISNULL || express == ISNOTNULL) { sb.append(column).append(' ').append(express.value()); } else if (ev != null) { - sb.append(column).append(' ').append(express.value()).append(' ').append(formatToString(express, ev)); + sb.append((express == IGNORECASELIKE || express == IGNORECASENOTLIKE) ? ("LOWER(" + column + ')') : column).append(' ').append(express.value()).append(' ').append(formatToString(express, ev)); } } } else { @@ -767,7 +802,7 @@ public class FilterNode { sb.append('(').append(column).append(' ').append(express.value()); more = true; } else if (ev != null) { - sb.append('(').append(column).append(' ').append(express.value()).append(' ').append(formatToString(express, ev)); + sb.append('(').append((express == IGNORECASELIKE || express == IGNORECASENOTLIKE) ? ("LOWER(" + column + ')') : column).append(' ').append(express.value()).append(' ').append(formatToString(express, ev)); more = true; } } @@ -791,7 +826,11 @@ public class FilterNode { if (value == null) return null; if (value instanceof Number) return new StringBuilder().append(value); if (value instanceof CharSequence) { - if (express == LIKE || express == NOTLIKE) value = "%" + value + '%'; + if (express == LIKE || express == NOTLIKE) { + value = "%" + value + '%'; + } else if (express == IGNORECASELIKE || express == IGNORECASENOTLIKE) { + value = "%" + value.toString().toLowerCase() + '%'; + } return new StringBuilder().append('\'').append(value.toString().replace("'", "\\'")).append('\''); } else if (value instanceof Range) { Range range = (Range) value;