Search in sources :

Example 1 with Filter

use of org.apache.nifi.util.RingBuffer.Filter in project nifi by apache.

the class VolatileProvenanceRepository method createFilter.

private Filter<ProvenanceEventRecord> createFilter(final Query query, final NiFiUser user) {
    return new Filter<ProvenanceEventRecord>() {

        @Override
        public boolean select(final ProvenanceEventRecord 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();
                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()) {
                            return false;
                        }
                        final String regex = searchValue.replace("?", ".").replace("*", ".*");
                        final Pattern pattern = Pattern.compile(regex, Pattern.CASE_INSENSITIVE);
                        if (!pattern.matcher(eventAttributeValue).matches()) {
                            return false;
                        }
                    } else if (!searchValue.equalsIgnoreCase(eventAttributeValue)) {
                        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);
                            if (pattern.matcher(event.getFlowFileUuid()).matches()) {
                                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 (event.getFlowFileUuid().equals(searchValue) || event.getParentUuids().contains(searchValue) || event.getChildUuids().contains(searchValue)) {
                            continue;
                        }
                        return false;
                    }
                    final Object fieldValue = getFieldValue(event, searchableField);
                    if (fieldValue == null) {
                        return false;
                    }
                    if (searchValue.contains("?") || searchValue.contains("*")) {
                        final String regex = searchValue.replace("?", ".").replace("*", ".*");
                        final Pattern pattern = Pattern.compile(regex, Pattern.CASE_INSENSITIVE);
                        if (!pattern.matcher(String.valueOf(fieldValue)).matches()) {
                            return false;
                        }
                    } else if (!searchValue.equalsIgnoreCase(String.valueOf(fieldValue))) {
                        return false;
                    }
                }
            }
            return true;
        }
    };
}
Also used : Pattern(java.util.regex.Pattern) Filter(org.apache.nifi.util.RingBuffer.Filter) SearchableField(org.apache.nifi.provenance.search.SearchableField) SearchTerm(org.apache.nifi.provenance.search.SearchTerm)

Aggregations

Pattern (java.util.regex.Pattern)1 SearchTerm (org.apache.nifi.provenance.search.SearchTerm)1 SearchableField (org.apache.nifi.provenance.search.SearchableField)1 Filter (org.apache.nifi.util.RingBuffer.Filter)1