import {SpecQuery} from './spec';
import {Nest, GroupBy} from './groupby';
import {QueryConfig} from '../config';

export interface Query {
  /**
   * **Specification** (`spec`) for describing a collection of queried visualizations. This `spec`'s 
   * syntax follows a structure similar to [Vega-Lite](https://vega.github.io/vega-lite)'s single view 
   * specification.  However, `spec` in CompassQL can have _wildcards_ (or _enumeration specifiers_) 
   * to describe properties that can be enumerated.
   *
   * See the SpecQuery interface for more details.
   */
  spec: SpecQuery;

  /**
   * Methods for grouping queried visualization into groups.  This property is a shorthand for the 
   * `nest` property with one level.
   */
  groupBy?: GroupBy;

  /**
   * Methods for grouping queried visualization into hierarchical groupings.
   */
  nest?: Nest[];

  /**
   * Method for ordering the list of visualization represented by this query (or the list of visualization 
   * groups if `groupBy` or `nest` is specified.)
   */
  orderBy?: string | string[];

  /**
   * Method for ordering the top visualization represented by this query (or the top  visualization group 
   * if `groupBy` or `nest` is specified.)
   */
  chooseBy?: string | string[];

  /**
   * Configuration for customizing query parameters.
   */
  config?: QueryConfig;
}
