package edu.uci.ics.hivesterix.logical.plan.visitor;

import java.util.ArrayList;
import java.util.List;

import org.apache.commons.lang3.mutable.Mutable;
import org.apache.commons.lang3.mutable.MutableObject;
import org.apache.hadoop.hive.ql.exec.SelectOperator;
import org.apache.hadoop.hive.ql.plan.ExprNodeDesc;
import org.apache.hadoop.hive.ql.plan.SelectDesc;

import edu.uci.ics.hivesterix.logical.plan.visitor.base.DefaultVisitor;
import edu.uci.ics.hivesterix.logical.plan.visitor.base.Translator;
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.operators.logical.ProjectOperator;

public class ProjectVisitor extends DefaultVisitor {

	/**
	 * translate project operator
	 */
	@Override
	public Mutable<ILogicalOperator> visit(SelectOperator operator,
			Mutable<ILogicalOperator> AlgebricksParentOperator, Translator t) {

		SelectDesc desc = (SelectDesc) operator.getConf();

		if (desc == null)
			return null;

		List<ExprNodeDesc> cols = desc.getColList();

		if (cols == null)
			return null;

		// insert assign operator if necessary
		ArrayList<LogicalVariable> variables = new ArrayList<LogicalVariable>();

		for (ExprNodeDesc expr : cols)
			t.rewriteExpression(expr);

		ILogicalOperator assignOp = t.getAssignOperator(
				AlgebricksParentOperator, cols, variables);
		ILogicalOperator currentOperator = null;
		if (assignOp != null) {
			currentOperator = assignOp;
			AlgebricksParentOperator = new MutableObject<ILogicalOperator>(
					currentOperator);
		}

		currentOperator = new ProjectOperator(variables);
		currentOperator.getInputs().add(AlgebricksParentOperator);
		t.rewriteOperatorOutputSchema(variables, operator);
		return new MutableObject<ILogicalOperator>(currentOperator);
	}

}
