in analysis/heap-dump/api/src/main/java/org/eclipse/jifa/hda/api/SearchPredicate.java [24:113]
public static <T extends Searchable> Predicate<T> createPredicate(String searchText, SearchType searchType) {
if (searchText == null || searchType == null || searchText.isEmpty()) {
return (T record) -> true;
}
Predicate<T> pred;
try {
switch (searchType) {
case BY_NAME:
case BY_CONTEXT_CLASSLOADER_NAME: {
Pattern p = Pattern.compile(searchText);
pred = (T record) -> p.matcher(((String) record.getBySearchType(searchType))).matches();
break;
}
case BY_PERCENT: {
String prefix = extractPrefix(searchText);
double num = Double.parseDouble(extractNumberText(searchText)) / 100.0;
switch (prefix) {
case "==":
pred = (T record) -> Double.compare((double) record.getBySearchType(searchType), num) == 0;
break;
case ">=":
pred = (T record) -> (double) record.getBySearchType(searchType) >= num;
break;
case "<=":
pred = (T record) -> (double) record.getBySearchType(searchType) <= num;
break;
case ">":
pred = (T record) -> (double) record.getBySearchType(searchType) > num;
break;
case "<":
pred = (T record) -> (double) record.getBySearchType(searchType) < num;
break;
case "!=":
pred = (T record) -> Double.compare((double) record.getBySearchType(searchType), num) != 0;
break;
default:
pred = (T record) -> false;
break;
}
break;
}
default: {
final String prefix = extractPrefix(searchText);
final long num = Long.parseLong(extractNumberText(searchText));
switch (prefix) {
case "==":
pred = (T record) -> (long) record.getBySearchType(searchType) == num;
break;
case ">=":
pred = (T record) -> (long) record.getBySearchType(searchType) >= num;
break;
case "<=":
pred = (T record) -> (long) record.getBySearchType(searchType) <= num;
break;
case ">":
pred = (T record) -> (long) record.getBySearchType(searchType) > num;
break;
case "<":
pred = (T record) -> (long) record.getBySearchType(searchType) < num;
break;
case "!=":
pred = (T record) -> (long) record.getBySearchType(searchType) != num;
break;
default:
pred = (T record) -> false;
break;
}
break;
}
}
} catch (RuntimeException ignored) {
log.debug("unexpected exception generating search `" + searchText + "` with type " + searchType.name());
pred = (T record) -> false;
}
// wrap for error handling
final Predicate<T> unwrapped = pred;
return (T record) -> {
try {
return unwrapped.test(record);
} catch (Throwable ignored) {
log.debug("unexpected exception when search `" + searchText + "` with type " + searchType.name());
return false;
}
};
}