/* * Licensed to the Apache Software Foundation (ASF) under one or more * contributor license agreements. See the NOTICE file distributed with * this work for additional information regarding copyright ownership. * The ASF licenses this file to You under the Apache License, Version 2.0 * (the "License"); you may not use this file except in compliance with * the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package org.apache.nifi.provenance.index; import java.io.Closeable; import java.io.IOException; import java.util.Map; import org.apache.nifi.authorization.user.NiFiUser; import org.apache.nifi.provenance.ProvenanceEventRecord; import org.apache.nifi.provenance.authorization.EventAuthorizer; import org.apache.nifi.provenance.lineage.ComputeLineageSubmission; import org.apache.nifi.provenance.search.Query; import org.apache.nifi.provenance.search.QuerySubmission; import org.apache.nifi.provenance.serialization.StorageSummary; import org.apache.nifi.provenance.store.EventStore; /** * An Event Index is responsible for indexing Provenance Events in such a way that the index can be quickly * searched to in order to retrieve events of interest. */ public interface EventIndex extends Closeable { /** * Initializes the Event Index, providing it access to the Event Store, in case it is necessary for performing * initialization tasks * * @param eventStore the EventStore that holds the events that have been given to the repository. */ void initialize(EventStore eventStore); /** * Adds the given events to the index so that they can be queried later. * * @param events the events to index along with their associated Storage Summaries */ void addEvents(Map<ProvenanceEventRecord, StorageSummary> events); /** * Replaces the entries in the appropriate index with the given events * * @param events the events to add or replace along with their associated Storage Summaries */ void reindexEvents(Map<ProvenanceEventRecord, StorageSummary> events); /** * @return the number of bytes that are utilized by the Event Index */ long getSize(); /** * Submits a Query asynchronously and returns a QuerySubmission that can be used to obtain the results * * @param query the query to perform * @param authorizer the authorizer to use in order to determine whether or not a particular event should be included in the result * @param userId the ID of the user on whose behalf the query is being submitted * * @return a QuerySubmission that can be used to retrieve the results later */ QuerySubmission submitQuery(Query query, EventAuthorizer authorizer, String userId); /** * Asynchronously computes the lineage for the FlowFile that is identified by the Provenance Event with the given ID. * * @param eventId the ID of the Provenance Event for which the lineage should be calculated * @param user the NiFi user on whose behalf the computing is being performed * @param authorizer the authorizer to use in order to determine whether or not a particular event should be included in the result * * @return a ComputeLineageSubmission that can be used to retrieve the results later */ ComputeLineageSubmission submitLineageComputation(long eventId, NiFiUser user, EventAuthorizer authorizer); /** * Asynchronously computes the lineage for the FlowFile that has the given FlowFile UUID. * * @param flowFileUuid the UUID of the FlowFile for which the lineage should be computed * @param user the NiFi user on whose behalf the computing is being performed * @param authorizer the authorizer to use in order to determine whether or not a particular event should be included in the result * * @return a ComputeLineageSubmission that can be used to retrieve the results later */ ComputeLineageSubmission submitLineageComputation(String flowFileUuid, NiFiUser user, EventAuthorizer authorizer); /** * Asynchronously computes the lineage that makes up the 'child flowfiles' generated by the event with the given ID. This method is * valid only for Events that produce 'child flowfiles' such as FORK, CLONE, REPLAY, etc. * * @param eventId the ID of the Provenance Event for which the lineage should be calculated * @param user the NiFi user on whose behalf the computing is being performed * @param authorizer the authorizer to use in order to determine whether or not a particular event should be included in the result * * @return a ComputeLineageSubmission that can be used to retrieve the results later */ ComputeLineageSubmission submitExpandChildren(long eventId, NiFiUser user, EventAuthorizer authorizer); /** * Asynchronously computes the lineage that makes up the 'parent flowfiles' that were involved in the event with the given ID. This method * is valid only for Events that have 'parent flowfiles' such as FORK, JOIN, etc. * * @param eventId the ID of the Provenance Event for which the lineage should be calculated * @param user the NiFi user on whose behalf the computing is being performed * @param authorizer the authorizer to use in order to determine whether or not a particular event should be included in the result * * @return a ComputeLineageSubmission that can be used to retrieve the results later */ ComputeLineageSubmission submitExpandParents(long eventId, NiFiUser user, EventAuthorizer authorizer); /** * Retrieves the ComputeLineageSubmission that was returned by the 'submitLineageComputation' methods * * @param lineageIdentifier the identifier of the linage * @param user the NiFi user on whose behalf the retrieval is being performed * @return the ComputeLineageSubmission that represents the asynchronous lineage computation that is being performed under the given * identifier, or <code>null</code> if the identifier cannot be found. */ ComputeLineageSubmission retrieveLineageSubmission(String lineageIdentifier, NiFiUser user); /** * Retrieves the QuerySubmission that was returned by the 'submitQuery' method * * @param queryIdentifier the identifier of the query * @param user the NiFi user on whose behalf the retrieval is being performed * @return the QuerySubmission that represents the asynchronous query that is being performed under the given * identifier, or <code>null</code> if the identifier cannot be found. */ QuerySubmission retrieveQuerySubmission(String queryIdentifier, NiFiUser user); /** * Upon restart of NiFi, it is possible that the Event Index will have lost some events due to frequency of committing the index. * In such as case, this method is responsible for returning the minimum Provenance Event ID that it knows is safely indexed. If * any Provenance Event exists in the Event Store with an ID greater than the value returned, that Event should be re-indexed. * * @param partitionName the name of the Partition for which the minimum Event ID is desired * @return the minimum Provenance Event ID that the Index knows is safely indexed for the given partition */ long getMinimumEventIdToReindex(String partitionName); /** * Instructs the Event Index to commit any changes that have been made to the partition with the given name * * @param partitionName the name of the partition to commit changes * @throws IOException if unable to commit the changes */ void commitChanges(String partitionName) throws IOException; }