/**
 * 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.hcatalog.mapreduce;

import java.io.IOException;
import java.io.Serializable;

import org.apache.hadoop.hive.metastore.MetaStoreUtils;
import org.apache.hadoop.hive.metastore.api.Table;
import org.apache.hcatalog.common.HCatUtil;
import org.apache.hcatalog.data.schema.HCatSchema;

/**
 *
 * HCatTableInfo - class to communicate table information to {@link HCatInputFormat}
 * and {@link HCatOutputFormat}
 *
 */
public class HCatTableInfo implements Serializable {


  private static final long serialVersionUID = 1L;

  /** The db and table names */
  private final String databaseName;
  private final String tableName;

  /** The table schema. */
  private final HCatSchema dataColumns;
  private final HCatSchema partitionColumns;

  /** The table being written to */
  private final Table table;

  /** The storer info */
  private StorerInfo storerInfo;

  /**
   * Initializes a new HCatTableInfo instance to be used with {@link HCatInputFormat}
   * for reading data from a table.
   * work with hadoop security, the kerberos principal name of the server - else null
   * The principal name should be of the form:
   * <servicename>/_HOST@<realm> like "hcat/_HOST@myrealm.com"
   * The special string _HOST will be replaced automatically with the correct host name
   * @param databaseName the db name
   * @param tableName the table name
   * @param dataColumns schema of columns which contain data
   * @param partitionColumns schema of partition columns
   * @param storerInfo information about storage descriptor
   * @param table hive metastore table class
   */
  HCatTableInfo(
      String databaseName,
      String tableName,
      HCatSchema dataColumns,
      HCatSchema partitionColumns,
      StorerInfo storerInfo,
      Table table) {
    this.databaseName = (databaseName == null) ? MetaStoreUtils.DEFAULT_DATABASE_NAME : databaseName;
    this.tableName = tableName;
    this.dataColumns = dataColumns;
    this.table = table;
    this.storerInfo = storerInfo;
    this.partitionColumns = partitionColumns;
  }

  /**
   * Gets the value of databaseName
   * @return the databaseName
   */
  public String getDatabaseName() {
    return databaseName;
  }

  /**
   * Gets the value of tableName
   * @return the tableName
   */
  public String getTableName() {
    return tableName;
  }

  /**
   * @return return schema of data columns as defined in meta store
   */
  public HCatSchema getDataColumns() {
    return dataColumns;
  }

  /**
   * @return schema of partition columns
   */
  public HCatSchema getPartitionColumns() {
    return partitionColumns;
  }

  /**
   * @return the storerInfo
   */
  public StorerInfo getStorerInfo() {
    return storerInfo;
  }

  public String getTableLocation() {
      return table.getSd().getLocation();
  }

  /**
   * minimize dependency on hive classes so this is package private
   * this should eventually no longer be used
   * @return hive metastore representation of table
   */
  Table getTable() {
    return table;
  }

  /**
   * create an HCatTableInfo instance from the supplied Hive Table instance
   * @param table to create an instance from
   * @return HCatTableInfo
   * @throws IOException
   */
  static HCatTableInfo valueOf(Table table) throws IOException {
    // Explicitly use {@link org.apache.hadoop.hive.ql.metadata.Table} when getting the schema,
    // but store @{link org.apache.hadoop.hive.metastore.api.Table} as this class is serialized
    // into the job conf.
    org.apache.hadoop.hive.ql.metadata.Table mTable =
        new org.apache.hadoop.hive.ql.metadata.Table(table);
    HCatSchema schema = HCatUtil.extractSchema(mTable);
    StorerInfo storerInfo =
        InternalUtil.extractStorerInfo(table.getSd(), table.getParameters());
    HCatSchema partitionColumns = HCatUtil.getPartitionColumns(mTable);
    return new HCatTableInfo(table.getDbName(), table.getTableName(), schema,
        partitionColumns, storerInfo, table);
  }

  @Override
  public boolean equals(Object o) {
    if (this == o) return true;
    if (o == null || getClass() != o.getClass()) return false;

    HCatTableInfo tableInfo = (HCatTableInfo) o;

    if (dataColumns != null ? !dataColumns.equals(tableInfo.dataColumns) : tableInfo.dataColumns != null) return false;
    if (databaseName != null ? !databaseName.equals(tableInfo.databaseName) : tableInfo.databaseName != null) return false;
    if (partitionColumns != null ? !partitionColumns.equals(tableInfo.partitionColumns) : tableInfo.partitionColumns != null)
      return false;
    if (storerInfo != null ? !storerInfo.equals(tableInfo.storerInfo) : tableInfo.storerInfo != null) return false;
    if (table != null ? !table.equals(tableInfo.table) : tableInfo.table != null) return false;
    if (tableName != null ? !tableName.equals(tableInfo.tableName) : tableInfo.tableName != null) return false;

    return true;
  }


  @Override
  public int hashCode() {
    int result = databaseName != null ? databaseName.hashCode() : 0;
    result = 31 * result + (tableName != null ? tableName.hashCode() : 0);
    result = 31 * result + (dataColumns != null ? dataColumns.hashCode() : 0);
    result = 31 * result + (partitionColumns != null ? partitionColumns.hashCode() : 0);
    result = 31 * result + (table != null ? table.hashCode() : 0);
    result = 31 * result + (storerInfo != null ? storerInfo.hashCode() : 0);
    return result;
  }

}

