This commit is contained in:
35
src/org/redkale/source/FilterKey.java
Normal file
35
src/org/redkale/source/FilterKey.java
Normal file
@@ -0,0 +1,35 @@
|
|||||||
|
/*
|
||||||
|
* To change this license header, choose License Headers in Project Properties.
|
||||||
|
* To change this template file, choose Tools | Templates
|
||||||
|
* and open the template in the editor.
|
||||||
|
*/
|
||||||
|
package org.redkale.source;
|
||||||
|
|
||||||
|
import java.util.Objects;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* FilterKey主要用于自身字段间的表达式, 如: a.recordid = a.parentid , a.parentid就需要FilterKey来表示 new FilterKey("parent")
|
||||||
|
*
|
||||||
|
* 注意:该类型不支持表达式:FV_XXX、BETWEEN、NOTBETWEEN、IN、NOTIN
|
||||||
|
*
|
||||||
|
* @author zhangjx
|
||||||
|
*/
|
||||||
|
public class FilterKey implements java.io.Serializable {
|
||||||
|
|
||||||
|
private final String column;
|
||||||
|
|
||||||
|
@java.beans.ConstructorProperties({"column"})
|
||||||
|
public FilterKey(String column) {
|
||||||
|
this.column = Objects.requireNonNull(column);
|
||||||
|
}
|
||||||
|
|
||||||
|
public String getColumn() {
|
||||||
|
return column;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public String toString() {
|
||||||
|
return "$." + getColumn();
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
@@ -318,7 +318,8 @@ public class FilterNode {
|
|||||||
return new StringBuilder().append(info.getSQLColumn(talis, column)).append(' ').append(express.value()).append(' ').append(fv.getOptvalue())
|
return new StringBuilder().append(info.getSQLColumn(talis, column)).append(' ').append(express.value()).append(' ').append(fv.getOptvalue())
|
||||||
.append(' ').append(fv.getExpress().value()).append(' ').append(fv.getDestvalue());
|
.append(' ').append(fv.getExpress().value()).append(' ').append(fv.getDestvalue());
|
||||||
}
|
}
|
||||||
CharSequence val = formatToString(express, val0);
|
final boolean fk = (val0 instanceof FilterKey);
|
||||||
|
CharSequence val = fk ? info.getSQLColumn(talis, ((FilterKey) val0).getColumn()) : formatToString(express, val0);
|
||||||
if (val == null) return null;
|
if (val == null) return null;
|
||||||
StringBuilder sb = new StringBuilder(32);
|
StringBuilder sb = new StringBuilder(32);
|
||||||
if (express == CONTAIN) return info.containSQL.replace("${column}", info.getSQLColumn(talis, column)).replace("${keystr}", val);
|
if (express == CONTAIN) return info.containSQL.replace("${column}", info.getSQLColumn(talis, column)).replace("${keystr}", val);
|
||||||
@@ -328,6 +329,7 @@ public class FilterNode {
|
|||||||
|
|
||||||
if (express == IGNORECASELIKE || express == IGNORECASENOTLIKE) {
|
if (express == IGNORECASELIKE || express == IGNORECASENOTLIKE) {
|
||||||
sb.append("LOWER(").append(info.getSQLColumn(talis, column)).append(')');
|
sb.append("LOWER(").append(info.getSQLColumn(talis, column)).append(')');
|
||||||
|
if (fk) val = "LOWER(" + info.getSQLColumn(talis, ((FilterKey) val0).getColumn()) + ')';
|
||||||
} else {
|
} else {
|
||||||
sb.append(info.getSQLColumn(talis, column));
|
sb.append(info.getSQLColumn(talis, column));
|
||||||
}
|
}
|
||||||
@@ -607,9 +609,23 @@ public class FilterNode {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
final Serializable val = (Serializable) val0;
|
final Serializable val = (Serializable) val0;
|
||||||
|
final boolean fk = (val instanceof FilterKey);
|
||||||
|
final Attribute<T, Serializable> fkattr = fk ? cache.getAttribute(((FilterKey) val).getColumn()) : null;
|
||||||
|
if (fk && fkattr == null) throw new RuntimeException(cache.getType() + " not found column(" + ((FilterKey) val).getColumn() + ")");
|
||||||
switch (express) {
|
switch (express) {
|
||||||
case EQUAL:
|
case EQUAL:
|
||||||
return new Predicate<T>() {
|
return fk ? new Predicate<T>() {
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean test(T t) {
|
||||||
|
return Objects.equals(fkattr.get(t), attr.get(t));
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public String toString() {
|
||||||
|
return field + ' ' + express.value() + ' ' + fkattr.field();
|
||||||
|
}
|
||||||
|
} : new Predicate<T>() {
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public boolean test(T t) {
|
public boolean test(T t) {
|
||||||
@@ -622,7 +638,18 @@ public class FilterNode {
|
|||||||
}
|
}
|
||||||
};
|
};
|
||||||
case NOTEQUAL:
|
case NOTEQUAL:
|
||||||
return new Predicate<T>() {
|
return fk ? new Predicate<T>() {
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean test(T t) {
|
||||||
|
return !Objects.equals(fkattr.get(t), attr.get(t));
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public String toString() {
|
||||||
|
return field + ' ' + express.value() + ' ' + fkattr.field();
|
||||||
|
}
|
||||||
|
} : new Predicate<T>() {
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public boolean test(T t) {
|
public boolean test(T t) {
|
||||||
@@ -635,7 +662,18 @@ public class FilterNode {
|
|||||||
}
|
}
|
||||||
};
|
};
|
||||||
case GREATERTHAN:
|
case GREATERTHAN:
|
||||||
return new Predicate<T>() {
|
return fk ? new Predicate<T>() {
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean test(T t) {
|
||||||
|
return ((Number) attr.get(t)).longValue() > ((Number) fkattr.get(t)).longValue();
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public String toString() {
|
||||||
|
return field + ' ' + express.value() + ' ' + fkattr.field();
|
||||||
|
}
|
||||||
|
} : new Predicate<T>() {
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public boolean test(T t) {
|
public boolean test(T t) {
|
||||||
@@ -648,7 +686,18 @@ public class FilterNode {
|
|||||||
}
|
}
|
||||||
};
|
};
|
||||||
case LESSTHAN:
|
case LESSTHAN:
|
||||||
return new Predicate<T>() {
|
return fk ? new Predicate<T>() {
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean test(T t) {
|
||||||
|
return ((Number) attr.get(t)).longValue() < ((Number) fkattr.get(t)).longValue();
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public String toString() {
|
||||||
|
return field + ' ' + express.value() + ' ' + fkattr.field();
|
||||||
|
}
|
||||||
|
} : new Predicate<T>() {
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public boolean test(T t) {
|
public boolean test(T t) {
|
||||||
@@ -661,7 +710,18 @@ public class FilterNode {
|
|||||||
}
|
}
|
||||||
};
|
};
|
||||||
case GREATERTHANOREQUALTO:
|
case GREATERTHANOREQUALTO:
|
||||||
return new Predicate<T>() {
|
return fk ? new Predicate<T>() {
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean test(T t) {
|
||||||
|
return ((Number) attr.get(t)).longValue() >= ((Number) fkattr.get(t)).longValue();
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public String toString() {
|
||||||
|
return field + ' ' + express.value() + ' ' + fkattr.field();
|
||||||
|
}
|
||||||
|
} : new Predicate<T>() {
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public boolean test(T t) {
|
public boolean test(T t) {
|
||||||
@@ -674,7 +734,18 @@ public class FilterNode {
|
|||||||
}
|
}
|
||||||
};
|
};
|
||||||
case LESSTHANOREQUALTO:
|
case LESSTHANOREQUALTO:
|
||||||
return new Predicate<T>() {
|
return fk ? new Predicate<T>() {
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean test(T t) {
|
||||||
|
return ((Number) attr.get(t)).longValue() <= ((Number) fkattr.get(t)).longValue();
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public String toString() {
|
||||||
|
return field + ' ' + express.value() + ' ' + fkattr.field();
|
||||||
|
}
|
||||||
|
} : new Predicate<T>() {
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public boolean test(T t) {
|
public boolean test(T t) {
|
||||||
@@ -687,19 +758,6 @@ public class FilterNode {
|
|||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
case OPAND:
|
|
||||||
return new Predicate<T>() {
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public boolean test(T t) {
|
|
||||||
return (((Number) attr.get(t)).longValue() & ((Number) val).longValue()) > 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public String toString() {
|
|
||||||
return field + " & " + val + " > 0";
|
|
||||||
}
|
|
||||||
};
|
|
||||||
case FV_MOD:
|
case FV_MOD:
|
||||||
FilterValue fv0 = (FilterValue) val;
|
FilterValue fv0 = (FilterValue) val;
|
||||||
switch (fv0.getExpress()) {
|
switch (fv0.getExpress()) {
|
||||||
@@ -868,8 +926,43 @@ public class FilterNode {
|
|||||||
default:
|
default:
|
||||||
throw new RuntimeException("(" + fv1 + ")'s express illegal, must be =, !=, <, >, <=, >=");
|
throw new RuntimeException("(" + fv1 + ")'s express illegal, must be =, !=, <, >, <=, >=");
|
||||||
}
|
}
|
||||||
|
case OPAND:
|
||||||
|
return fk ? new Predicate<T>() {
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean test(T t) {
|
||||||
|
return (((Number) attr.get(t)).longValue() & ((Number) fkattr.get(t)).longValue()) > 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public String toString() {
|
||||||
|
return field + " & " + fkattr.field() + " > 0";
|
||||||
|
}
|
||||||
|
} : new Predicate<T>() {
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean test(T t) {
|
||||||
|
return (((Number) attr.get(t)).longValue() & ((Number) val).longValue()) > 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public String toString() {
|
||||||
|
return field + " & " + val + " > 0";
|
||||||
|
}
|
||||||
|
};
|
||||||
case OPOR:
|
case OPOR:
|
||||||
return new Predicate<T>() {
|
return fk ? new Predicate<T>() {
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean test(T t) {
|
||||||
|
return (((Number) attr.get(t)).longValue() | ((Number) fkattr.get(t)).longValue()) > 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public String toString() {
|
||||||
|
return field + " | " + fkattr.field() + " > 0";
|
||||||
|
}
|
||||||
|
} : new Predicate<T>() {
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public boolean test(T t) {
|
public boolean test(T t) {
|
||||||
@@ -882,7 +975,18 @@ public class FilterNode {
|
|||||||
}
|
}
|
||||||
};
|
};
|
||||||
case OPANDNO:
|
case OPANDNO:
|
||||||
return new Predicate<T>() {
|
return fk ? new Predicate<T>() {
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean test(T t) {
|
||||||
|
return (((Number) attr.get(t)).longValue() & ((Number) fkattr.get(t)).longValue()) == 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public String toString() {
|
||||||
|
return field + " & " + fkattr.field() + " = 0";
|
||||||
|
}
|
||||||
|
} : new Predicate<T>() {
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public boolean test(T t) {
|
public boolean test(T t) {
|
||||||
@@ -895,7 +999,20 @@ public class FilterNode {
|
|||||||
}
|
}
|
||||||
};
|
};
|
||||||
case LIKE:
|
case LIKE:
|
||||||
return new Predicate<T>() {
|
return fk ? new Predicate<T>() {
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean test(T t) {
|
||||||
|
Object rs = attr.get(t);
|
||||||
|
Object rs2 = fkattr.get(t);
|
||||||
|
return rs != null && rs2 != null && rs.toString().contains(rs2.toString());
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public String toString() {
|
||||||
|
return field + ' ' + express.value() + ' ' + fkattr.field();
|
||||||
|
}
|
||||||
|
} : new Predicate<T>() {
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public boolean test(T t) {
|
public boolean test(T t) {
|
||||||
@@ -909,7 +1026,20 @@ public class FilterNode {
|
|||||||
}
|
}
|
||||||
};
|
};
|
||||||
case STARTSWITH:
|
case STARTSWITH:
|
||||||
return new Predicate<T>() {
|
return fk ? new Predicate<T>() {
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean test(T t) {
|
||||||
|
Object rs = attr.get(t);
|
||||||
|
Object rs2 = fkattr.get(t);
|
||||||
|
return rs != null && rs2 != null && rs.toString().startsWith(rs2.toString());
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public String toString() {
|
||||||
|
return field + " STARTSWITH " + fkattr.field();
|
||||||
|
}
|
||||||
|
} : new Predicate<T>() {
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public boolean test(T t) {
|
public boolean test(T t) {
|
||||||
@@ -923,7 +1053,20 @@ public class FilterNode {
|
|||||||
}
|
}
|
||||||
};
|
};
|
||||||
case ENDSWITH:
|
case ENDSWITH:
|
||||||
return new Predicate<T>() {
|
return fk ? new Predicate<T>() {
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean test(T t) {
|
||||||
|
Object rs = attr.get(t);
|
||||||
|
Object rs2 = fkattr.get(t);
|
||||||
|
return rs != null && rs2 != null && rs.toString().endsWith(rs2.toString());
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public String toString() {
|
||||||
|
return field + " ENDSWITH " + fkattr.field();
|
||||||
|
}
|
||||||
|
} : new Predicate<T>() {
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public boolean test(T t) {
|
public boolean test(T t) {
|
||||||
@@ -937,6 +1080,20 @@ public class FilterNode {
|
|||||||
}
|
}
|
||||||
};
|
};
|
||||||
case IGNORECASELIKE:
|
case IGNORECASELIKE:
|
||||||
|
if (fk) return new Predicate<T>() {
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean test(T t) {
|
||||||
|
Object rs = attr.get(t);
|
||||||
|
Object rs2 = fkattr.get(t);
|
||||||
|
return rs != null && rs2 != null && rs.toString().toLowerCase().contains(rs2.toString().toLowerCase());
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public String toString() {
|
||||||
|
return "LOWER(" + field + ") " + express.value() + " LOWER(" + fkattr.field() + ')';
|
||||||
|
}
|
||||||
|
};
|
||||||
final String valstr = val.toString().toLowerCase();
|
final String valstr = val.toString().toLowerCase();
|
||||||
return new Predicate<T>() {
|
return new Predicate<T>() {
|
||||||
|
|
||||||
@@ -952,7 +1109,20 @@ public class FilterNode {
|
|||||||
}
|
}
|
||||||
};
|
};
|
||||||
case NOTSTARTSWITH:
|
case NOTSTARTSWITH:
|
||||||
return new Predicate<T>() {
|
return fk ? new Predicate<T>() {
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean test(T t) {
|
||||||
|
Object rs = attr.get(t);
|
||||||
|
Object rs2 = fkattr.get(t);
|
||||||
|
return rs == null || rs2 == null || !rs.toString().startsWith(rs2.toString());
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public String toString() {
|
||||||
|
return field + " NOT STARTSWITH " + fkattr.field();
|
||||||
|
}
|
||||||
|
} : new Predicate<T>() {
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public boolean test(T t) {
|
public boolean test(T t) {
|
||||||
@@ -966,7 +1136,20 @@ public class FilterNode {
|
|||||||
}
|
}
|
||||||
};
|
};
|
||||||
case NOTENDSWITH:
|
case NOTENDSWITH:
|
||||||
return new Predicate<T>() {
|
return fk ? new Predicate<T>() {
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean test(T t) {
|
||||||
|
Object rs = attr.get(t);
|
||||||
|
Object rs2 = fkattr.get(t);
|
||||||
|
return rs == null || rs2 == null || !rs.toString().endsWith(rs2.toString());
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public String toString() {
|
||||||
|
return field + " NOT ENDSWITH " + fkattr.field();
|
||||||
|
}
|
||||||
|
} : new Predicate<T>() {
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public boolean test(T t) {
|
public boolean test(T t) {
|
||||||
@@ -980,6 +1163,20 @@ public class FilterNode {
|
|||||||
}
|
}
|
||||||
};
|
};
|
||||||
case IGNORECASENOTLIKE:
|
case IGNORECASENOTLIKE:
|
||||||
|
if (fk) return new Predicate<T>() {
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean test(T t) {
|
||||||
|
Object rs = attr.get(t);
|
||||||
|
Object rs2 = fkattr.get(t);
|
||||||
|
return rs == null || rs2 == null || !rs.toString().toLowerCase().contains(rs2.toString().toLowerCase());
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public String toString() {
|
||||||
|
return "LOWER(" + field + ") " + express.value() + " LOWER(" + fkattr.field() + ')';
|
||||||
|
}
|
||||||
|
};
|
||||||
final String valstr2 = val.toString().toLowerCase();
|
final String valstr2 = val.toString().toLowerCase();
|
||||||
return new Predicate<T>() {
|
return new Predicate<T>() {
|
||||||
|
|
||||||
@@ -995,7 +1192,20 @@ public class FilterNode {
|
|||||||
}
|
}
|
||||||
};
|
};
|
||||||
case CONTAIN:
|
case CONTAIN:
|
||||||
return new Predicate<T>() {
|
return fk ? new Predicate<T>() {
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean test(T t) {
|
||||||
|
Object rs = attr.get(t);
|
||||||
|
Object rs2 = fkattr.get(t);
|
||||||
|
return rs != null && rs2 != null && rs2.toString().contains(rs.toString());
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public String toString() {
|
||||||
|
return fkattr.field() + ' ' + express.value() + ' ' + field;
|
||||||
|
}
|
||||||
|
} : new Predicate<T>() {
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public boolean test(T t) {
|
public boolean test(T t) {
|
||||||
@@ -1009,6 +1219,20 @@ public class FilterNode {
|
|||||||
}
|
}
|
||||||
};
|
};
|
||||||
case IGNORECASECONTAIN:
|
case IGNORECASECONTAIN:
|
||||||
|
if (fk) return new Predicate<T>() {
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean test(T t) {
|
||||||
|
Object rs = attr.get(t);
|
||||||
|
Object rs2 = fkattr.get(t);
|
||||||
|
return rs != null && rs2 != null && rs2.toString().toLowerCase().contains(rs.toString().toLowerCase());
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public String toString() {
|
||||||
|
return " LOWER(" + fkattr.field() + ") " + express.value() + ' ' + "LOWER(" + field + ") ";
|
||||||
|
}
|
||||||
|
};
|
||||||
final String valstr3 = val.toString().toLowerCase();
|
final String valstr3 = val.toString().toLowerCase();
|
||||||
return new Predicate<T>() {
|
return new Predicate<T>() {
|
||||||
|
|
||||||
@@ -1024,7 +1248,20 @@ public class FilterNode {
|
|||||||
}
|
}
|
||||||
};
|
};
|
||||||
case NOTCONTAIN:
|
case NOTCONTAIN:
|
||||||
return new Predicate<T>() {
|
return fk ? new Predicate<T>() {
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean test(T t) {
|
||||||
|
Object rs = attr.get(t);
|
||||||
|
Object rs2 = fkattr.get(t);
|
||||||
|
return rs == null || rs2 == null || !rs2.toString().contains(rs.toString());
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public String toString() {
|
||||||
|
return fkattr.field() + ' ' + express.value() + ' ' + field;
|
||||||
|
}
|
||||||
|
} : new Predicate<T>() {
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public boolean test(T t) {
|
public boolean test(T t) {
|
||||||
@@ -1038,6 +1275,20 @@ public class FilterNode {
|
|||||||
}
|
}
|
||||||
};
|
};
|
||||||
case IGNORECASENOTCONTAIN:
|
case IGNORECASENOTCONTAIN:
|
||||||
|
if (fk) return new Predicate<T>() {
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean test(T t) {
|
||||||
|
Object rs = attr.get(t);
|
||||||
|
Object rs2 = fkattr.get(t);
|
||||||
|
return rs == null || rs2 == null || !rs2.toString().toLowerCase().contains(rs.toString().toLowerCase());
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public String toString() {
|
||||||
|
return " LOWER(" + fkattr.field() + ") " + express.value() + ' ' + "LOWER(" + field + ") ";
|
||||||
|
}
|
||||||
|
};
|
||||||
final String valstr4 = val.toString().toLowerCase();
|
final String valstr4 = val.toString().toLowerCase();
|
||||||
return new Predicate<T>() {
|
return new Predicate<T>() {
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user