/**
 * 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.ambari.metrics.timeline;

import java.io.IOException;
import java.util.Collection;
import java.util.EnumSet;
import java.util.Set;
import java.util.SortedSet;

import org.apache.hadoop.classification.InterfaceAudience;
import org.apache.hadoop.classification.InterfaceStability;
import org.apache.hadoop.yarn.api.records.timeline.TimelineEntities;
import org.apache.hadoop.yarn.api.records.timeline.TimelineEntity;
import org.apache.hadoop.yarn.api.records.timeline.TimelineEvents;

/**
 * This interface is for retrieving timeline information.
 */
@InterfaceAudience.Private
@InterfaceStability.Unstable
public interface TimelineReader {

  /**
   * Possible fields to retrieve for {@link #getEntities} and {@link #getEntity}
   * .
   */
  enum Field {
    EVENTS,
    RELATED_ENTITIES,
    PRIMARY_FILTERS,
    OTHER_INFO,
    LAST_EVENT_ONLY
  }

  /**
   * Default limit for {@link #getEntities} and {@link #getEntityTimelines}.
   */
  final long DEFAULT_LIMIT = 100;

  /**
   * This method retrieves a list of entity information, {@link TimelineEntity},
   * sorted by the starting timestamp for the entity, descending. The starting
   * timestamp of an entity is a timestamp specified by the client. If it is not
   * explicitly specified, it will be chosen by the store to be the earliest
   * timestamp of the events received in the first put for the entity.
   * 
   * @param entityType
   *          The type of entities to return (required).
   * @param limit
   *          A limit on the number of entities to return. If null, defaults to
   *          {@link #DEFAULT_LIMIT}.
   * @param windowStart
   *          The earliest start timestamp to retrieve (exclusive). If null,
   *          defaults to retrieving all entities until the limit is reached.
   * @param windowEnd
   *          The latest start timestamp to retrieve (inclusive). If null,
   *          defaults to {@link Long#MAX_VALUE}
   * @param fromId
   *          If fromId is not null, retrieve entities earlier than and
   *          including the specified ID. If no start time is found for the
   *          specified ID, an empty list of entities will be returned. The
   *          windowEnd parameter will take precedence if the start time of this
   *          entity falls later than windowEnd.
   * @param fromTs
   *          If fromTs is not null, ignore entities that were inserted into the
   *          store after the given timestamp. The entity's insert timestamp
   *          used for this comparison is the store's system time when the first
   *          put for the entity was received (not the entity's start time).
   * @param primaryFilter
   *          Retrieves only entities that have the specified primary filter. If
   *          null, retrieves all entities. This is an indexed retrieval, and no
   *          entities that do not match the filter are scanned.
   * @param secondaryFilters
   *          Retrieves only entities that have exact matches for all the
   *          specified filters in their primary filters or other info. This is
   *          not an indexed retrieval, so all entities are scanned but only
   *          those matching the filters are returned.
   * @param fieldsToRetrieve
   *          Specifies which fields of the entity object to retrieve (see
   *          {@link Field}). If the set of fields contains
   *          {@link Field#LAST_EVENT_ONLY} and not {@link Field#EVENTS}, the
   *          most recent event for each entity is retrieved. If null, retrieves
   *          all fields.
   * @return An {@link TimelineEntities} object.
   * @throws IOException
   */
  TimelineEntities getEntities(String entityType,
      Long limit, Long windowStart, Long windowEnd, String fromId, Long fromTs,
      NameValuePair primaryFilter, Collection<NameValuePair> secondaryFilters,
      EnumSet<Field> fieldsToRetrieve) throws IOException;

  /**
   * This method retrieves the entity information for a given entity.
   * 
   * @param entityId
   *          The entity whose information will be retrieved.
   * @param entityType
   *          The type of the entity.
   * @param fieldsToRetrieve
   *          Specifies which fields of the entity object to retrieve (see
   *          {@link Field}). If the set of fields contains
   *          {@link Field#LAST_EVENT_ONLY} and not {@link Field#EVENTS}, the
   *          most recent event for each entity is retrieved. If null, retrieves
   *          all fields.
   * @return An {@link TimelineEntity} object.
   * @throws IOException
   */
  TimelineEntity getEntity(String entityId, String entityType, EnumSet<Field>
      fieldsToRetrieve) throws IOException;

  /**
   * This method retrieves the events for a list of entities all of the same
   * entity type. The events for each entity are sorted in order of their
   * timestamps, descending.
   * 
   * @param entityType
   *          The type of entities to retrieve events for.
   * @param entityIds
   *          The entity IDs to retrieve events for.
   * @param limit
   *          A limit on the number of events to return for each entity. If
   *          null, defaults to {@link #DEFAULT_LIMIT} events per entity.
   * @param windowStart
   *          If not null, retrieves only events later than the given time
   *          (exclusive)
   * @param windowEnd
   *          If not null, retrieves only events earlier than the given time
   *          (inclusive)
   * @param eventTypes
   *          Restricts the events returned to the given types. If null, events
   *          of all types will be returned.
   * @return An {@link TimelineEvents} object.
   * @throws IOException
   */
  TimelineEvents getEntityTimelines(String entityType,
      SortedSet<String> entityIds, Long limit, Long windowStart,
      Long windowEnd, Set<String> eventTypes) throws IOException;
}
