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.calcite.tools;
  
  import org.apache.calcite.materialize.SqlStatisticProvider;
  import org.apache.calcite.plan.Context;
  import org.apache.calcite.plan.RelOptCostFactory;
  import org.apache.calcite.plan.RelOptTable;
  import org.apache.calcite.plan.RelTraitDef;
  import org.apache.calcite.rel.type.RelDataTypeSystem;
  import org.apache.calcite.rex.RexExecutor;
  import org.apache.calcite.schema.SchemaPlus;
  import org.apache.calcite.sql.SqlOperatorTable;
  import org.apache.calcite.sql.parser.SqlParser;
  import org.apache.calcite.sql.validate.SqlValidator;
  import org.apache.calcite.sql2rel.SqlRexConvertletTable;
  import org.apache.calcite.sql2rel.SqlToRelConverter;
  
  import com.google.common.collect.ImmutableList;
  
  import org.checkerframework.checker.nullness.qual.Nullable;
  
  /**
   * Interface that describes how to configure planning sessions generated
   * using the Frameworks tools.
   *
   * @see Frameworks#newConfigBuilder()
   */
  public interface FrameworkConfig {
    /**
     * The configuration of SQL parser.
     */
    SqlParser.Config getParserConfig();
  
    /**
     * The configuration of {@link SqlValidator}.
     */
    SqlValidator.Config getSqlValidatorConfig();
  
    /**
     * The configuration of {@link SqlToRelConverter}.
     */
    SqlToRelConverter.Config getSqlToRelConverterConfig();
  
    /**
     * Returns the default schema that should be checked before looking at the
     * root schema.  Returns null to only consult the root schema.
     */
    @Nullable SchemaPlus getDefaultSchema();
  
    /**
     * Returns the executor used to evaluate constant expressions.
     */
    @Nullable RexExecutor getExecutor();
  
    /**
     * Returns a list of one or more programs used during the course of query
     * evaluation.
     *
     * <p>The common use case is when there is a single program
     * created using {@link Programs#of(RuleSet)}
     * and {@link org.apache.calcite.tools.Planner#transform}
     * will only be called once.
     *
     * <p>However, consumers may also create programs
     * not based on rule sets, register multiple programs,
     * and do multiple repetitions
     * of {@link Planner#transform} planning cycles using different indices.
     *
     * <p>The order of programs provided here determines the zero-based indices
     * of programs elsewhere in this class.
     */
    ImmutableList<Program> getPrograms();
  
    /**
     * Returns operator table that should be used to
     * resolve functions and operators during query validation.
     */
    SqlOperatorTable getOperatorTable();
  
    /**
     * Returns the cost factory that should be used when creating the planner.
     * If null, use the default cost factory for that planner.
     */
    @Nullable RelOptCostFactory getCostFactory();
  
    /**
     * Returns a list of trait definitions.
     *
     * <p>If the list is not null, the planner first de-registers any
     * existing {@link RelTraitDef}s, then registers the {@code RelTraitDef}s in
     * this list.
     *
     * <p>The order of {@code RelTraitDef}s in the list matters if the
     * planner is VolcanoPlanner. The planner calls {@link RelTraitDef#convert} in
     * the order of this list. The most important trait comes first in the list,
     * followed by the second most important one, etc.
     */
    @Nullable ImmutableList<RelTraitDef> getTraitDefs();
  
    /**
     * Returns the convertlet table that should be used when converting from SQL
     * to row expressions.
     */
    SqlRexConvertletTable getConvertletTable();
  
    /**
     * Returns the PlannerContext that should be made available during planning by
     * calling {@link org.apache.calcite.plan.RelOptPlanner#getContext()}.
     */
    Context getContext();
  
    /**
     * Returns the type system.
     */
    RelDataTypeSystem getTypeSystem();
  
    /**
     * Returns whether the lattice suggester should try to widen a lattice when a
     * new query arrives that doesn't quite fit, as opposed to creating a new
     * lattice.
     */
    boolean isEvolveLattice();
  
    /**
     * Returns the source of statistics about tables and columns to be used
     * by the lattice suggester to deduce primary keys, foreign keys, and the
     * direction of relationships.
     */
    SqlStatisticProvider getStatisticProvider();
  
    /**
     * Returns a view expander.
     */
    RelOptTable.@Nullable ViewExpander getViewExpander();
  }
  