package edu.uci.ics.hivesterix.logical.plan.visitor.base;

import java.util.ArrayList;
import java.util.List;

import org.apache.commons.lang3.mutable.Mutable;
import org.apache.hadoop.hive.ql.exec.Operator;
import org.apache.hadoop.hive.ql.plan.AggregationDesc;
import org.apache.hadoop.hive.ql.plan.ExprNodeDesc;
import org.apache.hadoop.hive.ql.plan.PartitionDesc;
import org.apache.hadoop.hive.ql.plan.UDTFDesc;
import org.apache.hadoop.hive.serde2.typeinfo.TypeInfo;

import edu.uci.ics.hivesterix.logical.expression.Schema;
import edu.uci.ics.hyracks.algebricks.core.algebra.base.ILogicalExpression;
import edu.uci.ics.hyracks.algebricks.core.algebra.base.ILogicalOperator;
import edu.uci.ics.hyracks.algebricks.core.algebra.base.LogicalVariable;
import edu.uci.ics.hyracks.algebricks.core.algebra.metadata.IMetadataProvider;

@SuppressWarnings("rawtypes")
public interface Translator {

	/**
	 * generate input schema
	 * 
	 * @param operator
	 * @return
	 */
	public Schema generateInputSchema(Operator operator);

	/**
	 * rewrite the names of output columns for feture expression evaluators to
	 * use
	 * 
	 * @param operator
	 */
	public void rewriteOperatorOutputSchema(List<LogicalVariable> vars,
			Operator operator);

	/**
	 * rewrite the names of output columns for feture expression evaluators to
	 * use
	 * 
	 * @param operator
	 */
	public void rewriteOperatorOutputSchema(Operator operator);

	/**
	 * rewrite an expression and substitute variables
	 * 
	 * @param expr
	 *            hive expression
	 */
	public void rewriteExpression(ExprNodeDesc expr);

	/**
	 * rewrite an expression and substitute variables
	 * 
	 * @param expr
	 *            hive expression
	 */
	public void rewriteExpressionPartial(ExprNodeDesc expr);

	/**
	 * get an assign operator as a child of parent
	 * 
	 * @param parent
	 * @param cols
	 * @param variables
	 * @return
	 */
	public ILogicalOperator getAssignOperator(Mutable<ILogicalOperator> parent,
			List<ExprNodeDesc> cols, ArrayList<LogicalVariable> variables);

	/**
	 * get type for a logical variable
	 * 
	 * @param var
	 * @return type info
	 */
	public TypeInfo getType(LogicalVariable var);

	/**
	 * translate an expression from hive to Algebricks
	 * 
	 * @param desc
	 * @return
	 */
	public Mutable<ILogicalExpression> translateScalarFucntion(ExprNodeDesc desc);

	/**
	 * translate an aggregation from hive to Algebricks
	 * 
	 * @param aggregateDesc
	 * @return
	 */
	public Mutable<ILogicalExpression> translateAggregation(
			AggregationDesc aggregateDesc);

	/**
	 * translate unnesting (UDTF) function expression
	 * 
	 * @param aggregator
	 * @return
	 */
	public Mutable<ILogicalExpression> translateUnnestFunction(
			UDTFDesc udtfDesc, Mutable<ILogicalExpression> argument);

	/**
	 * get variable from a schema
	 * 
	 * @param schema
	 * @return
	 */
	public List<LogicalVariable> getVariablesFromSchema(Schema schema);

	/**
	 * get variable from name
	 * 
	 * @param name
	 * @return
	 */
	public LogicalVariable getVariable(String name);

	/**
	 * get variable from field name
	 * 
	 * @param name
	 * @return
	 */
	public LogicalVariable getVariableFromFieldName(String name);

	/**
	 * get variable from name, type
	 * 
	 * @param fieldName
	 * @param type
	 * @return
	 */
	public LogicalVariable getVariable(String fieldName, TypeInfo type);

	/**
	 * get new variable from name, type
	 * 
	 * @param fieldName
	 * @param type
	 * @return
	 */
	public LogicalVariable getNewVariable(String fieldName, TypeInfo type);

	/**
	 * set the metadata provider
	 * 
	 * @param metadata
	 */
	public void setMetadataProvider(
			IMetadataProvider<PartitionDesc, Object> metadata);

	/**
	 * get the metadata provider
	 * 
	 * @param metadata
	 */
	public IMetadataProvider<PartitionDesc, Object> getMetadataProvider();

	/**
	 * replace the variable
	 * 
	 * @param oldVar
	 * @param newVar
	 */
	public void replaceVariable(LogicalVariable oldVar, LogicalVariable newVar);

}
