/*
 * 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.hadoop.hive.metastore;

import java.util.HashMap;
import java.util.Map;

public interface IExtrapolatePartStatus {
  /**
   * The sequence of colStatNames.
   */
  static String[] colStatNames = new String[] { "LONG_LOW_VALUE", "LONG_HIGH_VALUE",
      "DOUBLE_LOW_VALUE", "DOUBLE_HIGH_VALUE", "BIG_DECIMAL_LOW_VALUE", "BIG_DECIMAL_HIGH_VALUE",
      "NUM_NULLS", "NUM_DISTINCTS", "AVG_COL_LEN", "MAX_COL_LEN", "NUM_TRUES", "NUM_FALSES",
      "AVG_NDV_LONG", "AVG_NDV_DOUBLE", "AVG_NDV_DECIMAL", "SUM_NUM_DISTINCTS" };

  /**
   * The indexes for colstats.
   */
  static HashMap<String, Integer[]> indexMaps = new HashMap<String, Integer[]>() {
    {
      put("bigint", new Integer[] { 0, 1, 6, 7, 12, 15 });
      put("int", new Integer[] { 0, 1, 6, 7, 12, 15 });
      put("smallint", new Integer[] { 0, 1, 6, 7, 12, 15 });
      put("tinyint", new Integer[] { 0, 1, 6, 7, 12, 15 });
      put("date", new Integer[] { 0, 1, 6, 7, 12, 15 });
      put("timestamp", new Integer[] { 0, 1, 6, 7, 12, 15 });
      put("long", new Integer[] { 0, 1, 6, 7, 12, 15 });
      put("double", new Integer[] { 2, 3, 6, 7, 13, 15 });
      put("float", new Integer[] { 2, 3, 6, 7, 13, 15 });
      put("varchar", new Integer[] { 8, 9, 6, 7, 15 });
      put("char", new Integer[] { 8, 9, 6, 7, 15 });
      put("string", new Integer[] { 8, 9, 6, 7, 15 });
      put("boolean", new Integer[] { 10, 11, 6, 15 });
      put("binary", new Integer[] { 8, 9, 6, 15 });
      put("decimal", new Integer[] { 4, 5, 6, 7, 14, 15 });
      put("default", new Integer[] { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 15 });
    }
  };

  /**
   * The sequence of colStatTypes.
   */
  static enum ColStatType {
    Long, Double, Decimal
  }

  static ColStatType[] colStatTypes = new ColStatType[] { ColStatType.Long, ColStatType.Long,
      ColStatType.Double, ColStatType.Double, ColStatType.Decimal, ColStatType.Decimal,
      ColStatType.Long, ColStatType.Long, ColStatType.Double, ColStatType.Long, ColStatType.Long,
      ColStatType.Long, ColStatType.Double, ColStatType.Double, ColStatType.Double,
      ColStatType.Long };

  /**
   * The sequence of aggregation function on colStats.
   */
  static enum AggrType {
    Min, Max, Sum, Avg
  }

  static AggrType[] aggrTypes = new AggrType[] { AggrType.Min, AggrType.Max, AggrType.Min,
      AggrType.Max, AggrType.Min, AggrType.Max, AggrType.Sum, AggrType.Max, AggrType.Max,
      AggrType.Max, AggrType.Sum, AggrType.Sum, AggrType.Avg, AggrType.Avg, AggrType.Avg,
      AggrType.Sum };

  public Object extrapolate(Object[] min, Object[] max, int colStatIndex,
      Map<String, Integer> indexMap);

}
