content: /*
   * 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.server.api.query;
  
  import java.util.Map;
  import java.util.Set;
  
  import org.apache.ambari.server.api.query.render.Renderer;
  import org.apache.ambari.server.api.services.Result;
  import org.apache.ambari.server.controller.spi.NoSuchParentResourceException;
  import org.apache.ambari.server.controller.spi.NoSuchResourceException;
  import org.apache.ambari.server.controller.spi.PageRequest;
  import org.apache.ambari.server.controller.spi.Predicate;
  import org.apache.ambari.server.controller.spi.SortRequest;
  import org.apache.ambari.server.controller.spi.SystemException;
  import org.apache.ambari.server.controller.spi.TemporalInfo;
  import org.apache.ambari.server.controller.spi.UnsupportedPropertyException;
  
  
  /**
   * Responsible for querying the back end for read requests
   */
  public interface Query {
  
    /**
     * Add a property to the query.
     * This is the select portion of the query.
     *
     * @param propertyId    the property id
     * @param temporalInfo  temporal information for the property
     */
    void addProperty(String propertyId, TemporalInfo temporalInfo);
  
    /**
     * Add a local (not sub-resource) property to the query.
     * This is the select portion of the query.
     *
     * @param property the property id which contains the group, property name
     *                 and whether the property is temporal
     */
    void addLocalProperty(String property);
  
    /**
     * Obtain the properties of the query.
     * These are the properties that make up the select portion of the query for which
     * values are to be retrieved.
     *
     * @return the query properties
     */
    Set<String> getProperties();
  
    /**
     * Execute the query.
     *
     * @return the result of the query.
     *
     * @throws UnsupportedPropertyException if the query or query predicate contains invalid non-existent properties
     * @throws SystemException an internal error occurred
     * @throws NoSuchResourceException the query didn't match any resources
     * @throws NoSuchParentResourceException a specified parent resource doesn't exist
     */
    Result execute()
        throws UnsupportedPropertyException, SystemException, NoSuchResourceException, NoSuchParentResourceException;
  
    /**
     * Return the predicate used to identify the associated resource.  This includes the primary key and
     * all parent id's;
     *
     * @return the predicate used to identify the associated resource
     */
    Predicate getPredicate();
  
    /**
     * Set the user provided predicated on this query.
     * This predicate will be "AND'd" with the internal query to produce the final predicate.
     *
     * @param predicate  the user provided predicate
     */
    void setUserPredicate(Predicate predicate);
  
    /**
     * Set the page request information for this query.
     *
     * @param pageRequest  the page request information
     */
    void setPageRequest(PageRequest pageRequest);
  
    /**
     * Set the order request information on the query
     *
     * @param sortRequest the ordering info
     */
    void setSortRequest(SortRequest sortRequest);
  
    /**
     * Set the corresponding renderer.
     * The renderer is responsible for the rendering of the query result, including which
     * properties are contained and the format of the result.
     *
     * @param renderer  renderer for the query
     */
    void setRenderer(Renderer renderer);
  
    /**
     * Set this Query's requestInfoProperties from the original request.  This will contain information
     * such as directives.
     *
     * @param requestInfoProperties a map a request info properties
     */
    void setRequestInfoProps(Map<String, String> requestInfoProperties);
  
    /**
     * Get this Query's requestInfoProperties from the original request.  This will contain information
     * such as directives.
     *
     * @return a map a request info properties
     */
    Map<String, String> getRequestInfoProps();
  }
  