DataSource增加判断字符串字段值长度的FilterExpress

This commit is contained in:
Redkale
2019-11-11 11:10:32 +08:00
parent 52eb7dbc0c
commit 8a8d45e642
3 changed files with 87 additions and 1 deletions

View File

@@ -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

View File

@@ -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<T>() {
@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<T>() {
@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<T>() {
@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<T>() {
@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<T>() {
@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<T>() {

View File

@@ -363,6 +363,9 @@ public final class FilterNodeBean<T extends FilterBean> implements Comparable<Fi
sb.append(col).append(' ').append(express.value());
} else if (express == ISEMPTY || express == ISNOTEMPTY) {
sb.append(col).append(' ').append(express.value()).append(" ''");
} else if (express == LENGTH_EQUAL || express == LENGTH_LESSTHAN || express == LENGTH_LESSTHANOREQUALTO
|| express == LENGTH_GREATERTHAN || express == LENGTH_GREATERTHANOREQUALTO) {
sb.append("LENGTH(").append(col).append(") ").append(express.value()).append(" ?");
} else {
boolean lower = (express == IGNORECASEEQUAL || express == IGNORECASENOTEQUAL || express == IGNORECASELIKE
|| express == IGNORECASENOTLIKE || express == IGNORECASECONTAIN || express == IGNORECASENOTCONTAIN);