public static Predicate createPredicate()

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;
            }
        };
    }