This commit is contained in:
地平线
2015-05-29 20:46:25 +08:00
parent 793cdf31e3
commit c0d0f93175

View File

@@ -108,7 +108,7 @@ public class FilterNode {
<T> Predicate<T> createFilterPredicate(final EntityInfo<T> info) { <T> Predicate<T> createFilterPredicate(final EntityInfo<T> info) {
if (info == null) return null; if (info == null) return null;
Predicate<T> filter = createFilterPredicate(info.getAttribute(column)); Predicate<T> filter = createFilterPredicate(info.getAttribute(column), value);
if (nodes == null) return filter; if (nodes == null) return filter;
for (FilterNode node : this.nodes) { for (FilterNode node : this.nodes) {
Predicate<T> f = node.createFilterPredicate(info); Predicate<T> f = node.createFilterPredicate(info);
@@ -118,34 +118,34 @@ public class FilterNode {
return filter; return filter;
} }
private <T> Predicate<T> createFilterPredicate(final Attribute<T, ?> attr) { private <T> Predicate<T> createFilterPredicate(final Attribute<T, ?> attr, final Serializable val) {
if (attr == null) return null; if (attr == null) return null;
if (value == null && express != ISNULL && express != ISNOTNULL) return null; if (val == null && express != ISNULL && express != ISNOTNULL) return null;
switch (express) { switch (express) {
case EQUAL: return (T t) -> value.equals(attr.get(t)); case EQUAL: return (T t) -> val.equals(attr.get(t));
case NOTEQUAL: return (T t) -> !value.equals(attr.get(t)); case NOTEQUAL: return (T t) -> !val.equals(attr.get(t));
case GREATERTHAN: return (T t) -> ((Number) attr.get(t)).longValue() > ((Number) value).longValue(); case GREATERTHAN: return (T t) -> ((Number) attr.get(t)).longValue() > ((Number) val).longValue();
case LESSTHAN: return (T t) -> ((Number) attr.get(t)).longValue() < ((Number) value).longValue(); case LESSTHAN: return (T t) -> ((Number) attr.get(t)).longValue() < ((Number) val).longValue();
case GREATERTHANOREQUALTO: return (T t) -> ((Number) attr.get(t)).longValue() >= ((Number) value).longValue(); case GREATERTHANOREQUALTO: return (T t) -> ((Number) attr.get(t)).longValue() >= ((Number) val).longValue();
case LESSTHANOREQUALTO: return (T t) -> ((Number) attr.get(t)).longValue() <= ((Number) value).longValue(); case LESSTHANOREQUALTO: return (T t) -> ((Number) attr.get(t)).longValue() <= ((Number) val).longValue();
case ISNULL: return (T t) -> attr.get(t) == null; case ISNULL: return (T t) -> attr.get(t) == null;
case ISNOTNULL: return (T t) -> attr.get(t) != null; case ISNOTNULL: return (T t) -> attr.get(t) != null;
case OPAND: return (T t) -> (((Number) attr.get(t)).longValue() & ((Number) value).longValue()) > 0; case OPAND: return (T t) -> (((Number) attr.get(t)).longValue() & ((Number) val).longValue()) > 0;
case OPOR: return (T t) -> (((Number) attr.get(t)).longValue() | ((Number) value).longValue()) > 0; case OPOR: return (T t) -> (((Number) attr.get(t)).longValue() | ((Number) val).longValue()) > 0;
case OPANDNO: return (T t) -> (((Number) attr.get(t)).longValue() & ((Number) value).longValue()) == 0; case OPANDNO: return (T t) -> (((Number) attr.get(t)).longValue() & ((Number) val).longValue()) == 0;
case LIKE: case LIKE:
return (T t) -> { return (T t) -> {
Object rs = attr.get(t); Object rs = attr.get(t);
return rs != null && rs.toString().contains(value.toString()); return rs != null && rs.toString().contains(val.toString());
}; };
case NOTLIKE: case NOTLIKE:
return (T t) -> { return (T t) -> {
Object rs = attr.get(t); Object rs = attr.get(t);
return rs == null || !rs.toString().contains(value.toString()); return rs == null || !rs.toString().contains(val.toString());
}; };
case BETWEEN: case BETWEEN:
case NOTBETWEEN: case NOTBETWEEN:
Range range = (Range) value; Range range = (Range) val;
final Comparable min = range.getMin(); final Comparable min = range.getMin();
final Comparable max = range.getMax(); final Comparable max = range.getMax();
Predicate<T> p = (T t) -> { Predicate<T> p = (T t) -> {
@@ -159,47 +159,47 @@ public class FilterNode {
case IN: case IN:
case NOTIN: case NOTIN:
Predicate<T> filter; Predicate<T> filter;
if (value instanceof Collection) { if (val instanceof Collection) {
filter = (T t) -> { filter = (T t) -> {
Object rs = attr.get(t); Object rs = attr.get(t);
return rs != null && ((Collection) value).contains(rs); return rs != null && ((Collection) val).contains(rs);
}; };
} else { } else {
Class type = value.getClass(); Class type = val.getClass();
if (type == int[].class) { if (type == int[].class) {
filter = (T t) -> { filter = (T t) -> {
Object rs = attr.get(t); Object rs = attr.get(t);
if (rs == null) return false; if (rs == null) return false;
return Arrays.binarySearch((int[]) value, (int) rs) >= 0; return Arrays.binarySearch((int[]) val, (int) rs) >= 0;
}; };
} else if (type == short[].class) { } else if (type == short[].class) {
filter = (T t) -> { filter = (T t) -> {
Object rs = attr.get(t); Object rs = attr.get(t);
if (rs == null) return false; if (rs == null) return false;
return Arrays.binarySearch((short[]) value, (short) rs) >= 0; return Arrays.binarySearch((short[]) val, (short) rs) >= 0;
}; };
} else if (type == long[].class) { } else if (type == long[].class) {
filter = (T t) -> { filter = (T t) -> {
Object rs = attr.get(t); Object rs = attr.get(t);
if (rs == null) return false; if (rs == null) return false;
return Arrays.binarySearch((long[]) value, (long) rs) >= 0; return Arrays.binarySearch((long[]) val, (long) rs) >= 0;
}; };
} else if (type == float[].class) { } else if (type == float[].class) {
filter = (T t) -> { filter = (T t) -> {
Object rs = attr.get(t); Object rs = attr.get(t);
if (rs == null) return false; if (rs == null) return false;
return Arrays.binarySearch((float[]) value, (float) rs) >= 0; return Arrays.binarySearch((float[]) val, (float) rs) >= 0;
}; };
} else if (type == double[].class) { } else if (type == double[].class) {
filter = (T t) -> { filter = (T t) -> {
Object rs = attr.get(t); Object rs = attr.get(t);
if (rs == null) return false; if (rs == null) return false;
return Arrays.binarySearch((double[]) value, (double) rs) >= 0; return Arrays.binarySearch((double[]) val, (double) rs) >= 0;
}; };
} else { } else {
filter = (T t) -> { filter = (T t) -> {
Object rs = attr.get(t); Object rs = attr.get(t);
return rs != null && Arrays.binarySearch((Object[]) value, rs) > -1; return rs != null && Arrays.binarySearch((Object[]) val, rs) > -1;
}; };
} }
} }