private Filter createFilter()

in nifi-framework-bundle/nifi-framework-extensions/nifi-provenance-repository-bundle/nifi-volatile-provenance-repository/src/main/java/org/apache/nifi/provenance/VolatileProvenanceRepository.java [270:415]


    private Filter<ProvenanceEventRecord> createFilter(final Query query, final NiFiUser user) {
        return event -> {
            if (!isAuthorized(event, user)) {
                return false;
            }

            if (query.getStartDate() != null && query.getStartDate().getTime() > event.getEventTime()) {
                return false;
            }

            if (query.getEndDate() != null && query.getEndDate().getTime() < event.getEventTime()) {
                return false;
            }

            if (query.getMaxFileSize() != null) {
                final long maxFileSize = DataUnit.parseDataSize(query.getMaxFileSize(), DataUnit.B).longValue();
                if (event.getFileSize() > maxFileSize) {
                    return false;
                }
            }

            if (query.getMinFileSize() != null) {
                final long minFileSize = DataUnit.parseDataSize(query.getMinFileSize(), DataUnit.B).longValue();
                if (event.getFileSize() < minFileSize) {
                    return false;
                }
            }

            for (final SearchTerm searchTerm : query.getSearchTerms()) {
                final SearchableField searchableField = searchTerm.getSearchableField();
                final String searchValue = searchTerm.getValue();
                final boolean excludeSearchValue = searchTerm.isInverted().booleanValue();

                if (searchableField.isAttribute()) {
                    final String attributeName = searchableField.getIdentifier();

                    final String eventAttributeValue = event.getAttributes().get(attributeName);

                    if (searchValue.contains("?") || searchValue.contains("*")) {
                        if (eventAttributeValue == null || eventAttributeValue.isEmpty()) {
                            if (!excludeSearchValue) {
                                return false;
                            } else {
                                continue;
                            }
                        }

                        final String regex = searchValue.replace("?", ".").replace("*", ".*");
                        final Pattern pattern = Pattern.compile(regex, Pattern.CASE_INSENSITIVE);
                        final boolean patternMatches = pattern.matcher(eventAttributeValue).matches();
                        if ((!patternMatches && !excludeSearchValue)
                                || (patternMatches && excludeSearchValue)) {
                            return false;
                        }
                    } else if (!searchValue.equalsIgnoreCase(eventAttributeValue) && !excludeSearchValue
                            || searchValue.equalsIgnoreCase(eventAttributeValue) && excludeSearchValue) {
                        return false;
                    }
                } else {
                    // if FlowFileUUID, search parent & child UUID's also.
                    if (searchableField.equals(SearchableFields.FlowFileUUID)) {
                        if (searchValue.contains("?") || searchValue.contains("*")) {
                            final String regex = searchValue.replace("?", ".").replace("*", ".*");
                            final Pattern pattern = Pattern.compile(regex, Pattern.CASE_INSENSITIVE);
                            final boolean patternMatches = pattern.matcher(event.getFlowFileUuid()).matches();

                            if (!excludeSearchValue) {
                                if (patternMatches) {
                                    continue;
                                }

                                boolean found = false;
                                for (final String uuid : event.getParentUuids()) {
                                    if (pattern.matcher(uuid).matches()) {
                                        found = true;
                                        break;
                                    }
                                }

                                for (final String uuid : event.getChildUuids()) {
                                    if (pattern.matcher(uuid).matches()) {
                                        found = true;
                                        break;
                                    }
                                }

                                if (found) {
                                    continue;
                                }
                            } else {
                                if (patternMatches) {
                                    return false;
                                }

                                for (final String uuid : event.getParentUuids()) {
                                    if (pattern.matcher(uuid).matches()) {
                                        return false;
                                    }
                                }

                                for (final String uuid : event.getChildUuids()) {
                                    if (pattern.matcher(uuid).matches()) {
                                        return false;
                                    }
                                }
                                continue;
                            }
                        } else if (!excludeSearchValue
                                && (event.getFlowFileUuid().equals(searchValue) || event.getParentUuids().contains(searchValue) || event.getChildUuids().contains(searchValue))) {
                            continue;
                        } else if (excludeSearchValue
                                && (!event.getFlowFileUuid().equals(searchValue) && !event.getParentUuids().contains(searchValue) && !event.getChildUuids().contains(searchValue))) {
                            continue;
                        }

                        return false;
                    }

                    final Object fieldValue = getFieldValue(event, searchableField);
                    if (fieldValue == null) {
                        if (!excludeSearchValue) {
                            return false;
                        } else {
                            continue;
                        }
                    }

                    if (searchValue.contains("?") || searchValue.contains("*")) {
                        final String regex = searchValue.replace("?", ".").replace("*", ".*");
                        final Pattern pattern = Pattern.compile(regex, Pattern.CASE_INSENSITIVE);
                        final boolean patternMatches = pattern.matcher(String.valueOf(fieldValue)).matches();

                        if (!patternMatches && !excludeSearchValue
                                || patternMatches && excludeSearchValue) {
                            return false;
                        }
                    } else if (!searchValue.equalsIgnoreCase(String.valueOf(fieldValue)) && !excludeSearchValue
                            || searchValue.equalsIgnoreCase(String.valueOf(fieldValue)) && excludeSearchValue) {
                        return false;
                    }
                }
            }

            return true;
        };
    }