/*
 * 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.ql.parse;

import java.util.ArrayList;

/**
 * 
 * This class stores all the information specified in the TABLESAMPLE clause.
 * e.g. for the clause "FROM t TABLESAMPLE(1 OUT OF 2 ON c1) it will store the
 * numerator 1, the denominator 2 and the list of expressions(in this case c1)
 * in the appropriate fields. The afore-mentioned sampling clause causes the 1st
 * bucket to be picked out of the 2 buckets created by hashing on c1.
 * 
 */
public class TableSample {

  /**
   * The numerator of the TABLESAMPLE clause.
   */
  private int numerator;

  /**
   * The denominator of the TABLESAMPLE clause.
   */
  private int denominator;

  /**
   * The list of expressions following ON part of the TABLESAMPLE clause. This
   * list is empty in case there are no expressions such as in the clause
   * "FROM t TABLESAMPLE(1 OUT OF 2)". For this expression the sampling is done
   * on the tables clustering column(as specified when the table was created).
   * In case the table does not have any clustering column, the usage of a table
   * sample clause without an ON part is disallowed by the compiler
   */
  private ArrayList<ASTNode> exprs;

  /**
   * Flag to indicate that input files can be pruned.
   */
  private boolean inputPruning;

  /**
   * Constructs the TableSample given the numerator, denominator and the list of
   * ON clause expressions.
   * 
   * @param num
   *          The numerator
   * @param den
   *          The denominator
   * @param exprs
   *          The list of expressions in the ON part of the TABLESAMPLE clause
   */
  public TableSample(String num, String den, ArrayList<ASTNode> exprs) {
    numerator = Integer.parseInt(num);
    denominator = Integer.parseInt(den);
    this.exprs = exprs;
  }

  public TableSample(int num, int den) {
    numerator = num;
    denominator = den;
    exprs = null;
  }

  /**
   * Gets the numerator.
   * 
   * @return int
   */
  public int getNumerator() {
    return numerator;
  }

  /**
   * Sets the numerator.
   * 
   * @param num
   *          The numerator
   */
  public void setNumerator(int num) {
    numerator = num;
  }

  /**
   * Gets the denominator.
   * 
   * @return int
   */
  public int getDenominator() {
    return denominator;
  }

  /**
   * Sets the denominator.
   * 
   * @param den
   *          The denominator
   */
  public void setDenominator(int den) {
    denominator = den;
  }

  /**
   * Gets the ON part's expression list.
   * 
   * @return ArrayList<ASTNode>
   */
  public ArrayList<ASTNode> getExprs() {
    return exprs;
  }

  /**
   * Sets the expression list.
   * 
   * @param exprs
   *          The expression list
   */
  public void setExprs(ArrayList<ASTNode> exprs) {
    this.exprs = exprs;
  }

  /**
   * Gets the flag that indicates whether input pruning is possible.
   * 
   * @return boolean
   */
  public boolean getInputPruning() {
    return inputPruning;
  }

  /**
   * Sets the flag that indicates whether input pruning is possible or not.
   * 
   * @param inputPruning
   *          true if input pruning is possible
   */
  public void setInputPruning(boolean inputPruning) {
    this.inputPruning = inputPruning;
  }
}
