// 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.impala.catalog;

import java.util.Comparator;
import java.util.List;
import java.util.Set;

import org.apache.hadoop.hive.metastore.api.SQLForeignKey;
import org.apache.hadoop.hive.metastore.api.SQLPrimaryKey;
import org.apache.hadoop.hive.metastore.api.Table;
import org.apache.impala.analysis.TableName;
import org.apache.impala.common.NotImplementedException;
import org.apache.impala.thrift.TCatalogObjectType;
import org.apache.impala.thrift.TTableDescriptor;
import org.apache.impala.thrift.TTableStats;

/**
 * Frontend interface for interacting with a table.
 */
public interface FeTable {

  Comparator<FeTable> NAME_COMPARATOR = new Comparator<FeTable>() {
    @Override
    public int compare(FeTable t1, FeTable t2) {
      return t1.getFullName().compareTo(t2.getFullName());
    }
  };

  /** @see CatalogObject#isLoaded() */
  boolean isLoaded();

  /**
   * @return the metastore.api.Table object this Table was created from. Returns null
   * if the derived Table object was not created from a metastore Table (ex. InlineViews).
   */
  Table getMetaStoreTable();

  /**
   * @return the Hive StorageHandler class name that should be used for this table,
   * or null if no storage handler is needed.
   */
  String getStorageHandlerClassName();

  /**
   * @return the type of catalog object -- either TABLE or VIEW.
   */
  TCatalogObjectType getCatalogObjectType();

  /**
   * @return the short name of this table (e.g. "my_table")
   */
  String getName();

  /**
   * @return the full name of this table (e.g. "my_db.my_table")
   */
  String getFullName();

  /**
   * @return the table name in structured form
   */
  TableName getTableName();

  /**
   * @return the columns in this table
   */
  List<Column> getColumns();

  /**
   * @return an unmodifiable list of all columns, but with partition columns at the end of
   * the list rather than the beginning. This is equivalent to the order in
   * which Hive enumerates columns.
   */
  List<Column> getColumnsInHiveOrder();

  /**
   * @return a list of the column names ordered by position.
   */
  List<String> getColumnNames();

  /**
   * @return the list of primary keys for this table.
   */
  List<SQLPrimaryKey> getPrimaryKeys();

  /**
   * @return the list of foreign keys for this table.
   */
  List<SQLForeignKey> getForeignKeys();

  /**
   * @return an unmodifiable list of all partition columns.
   */
  List<Column> getClusteringColumns();

  /**
   * @return an unmodifiable list of all columns excluding any partition columns.
   */
  List<Column> getNonClusteringColumns();

  int getNumClusteringCols();

  boolean isClusteringColumn(Column c);

  /**
   * Case-insensitive lookup.
   *
   * @return null if the column with 'name' is not found.
   */
  Column getColumn(String name);

  /**
   * @return the type of this table (array of struct) that mirrors the columns.
   */
  ArrayType getType();

  /**
   * @return the database that that contains this table
   */
  FeDb getDb();

  /**
   * @return the estimated number of rows in this table (or -1 if unknown)
   */
  long getNumRows();

  /**
   * @return the stats for this table
   */
  TTableStats getTTableStats();

  /**
   * @return the Thrift table descriptor for this table
   */
  TTableDescriptor toThriftDescriptor(int tableId, Set<Long> referencedPartitions);

  /**
   * @return the write id for this table
   */
  long getWriteId();

  /**
   * @return the valid write id list for this table
   */
  String getValidWriteIds();

  /**
   * @return the owner user for this table. If the table is not loaded or the owner is
   * missing returns null.
   */
  String getOwnerUser();

}
