This commit is contained in:
kamhung
2015-11-20 15:31:07 +08:00
parent 616ad0afb8
commit 645e54b19b
3 changed files with 47 additions and 5 deletions

View File

@@ -34,10 +34,11 @@ public @interface FilterColumn {
long least() default 1;
/**
* LIKE、NOT LIKE时是否区分大小写
* LIKE、NOT LIKE时是否区分大小写, 由IGNORECASELIKE、IGNORECASENOTLIKE代替
* <p>
* @return
*/
@Deprecated
boolean ignoreCase() default false;
/**

View File

@@ -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"),

View File

@@ -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<T>() {
@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<T>() {
@@ -524,6 +544,21 @@ public class FilterNode {
return attr.field() + ' ' + express.value() + ' ' + val;
}
};
case IGNORECASENOTLIKE:
final String valstr2 = val.toString().toLowerCase();
return new Predicate<T>() {
@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;