package edu.uci.ics.asterix.optimizer.rules.am;

import edu.uci.ics.hyracks.algebricks.core.algebra.base.LogicalVariable;
import edu.uci.ics.hyracks.algebricks.core.algebra.expressions.AbstractFunctionCallExpression;
import edu.uci.ics.hyracks.algebricks.core.algebra.expressions.IAlgebricksConstantValue;

/**
 * General-purpose implementation of IOptimizableFuncExpr that supports any
 * number of constant args, variable args and field names.
 */
public class OptimizableFuncExpr implements IOptimizableFuncExpr {
	protected final AbstractFunctionCallExpression funcExpr;
    protected final LogicalVariable[] logicalVars;
    protected final String[] fieldNames;
    protected final OptimizableOperatorSubTree[] subTrees;
    protected final IAlgebricksConstantValue[] constantVals;
    
    public OptimizableFuncExpr(AbstractFunctionCallExpression funcExpr, LogicalVariable[] logicalVars, IAlgebricksConstantValue[] constantVals) {
    	this.funcExpr = funcExpr;
    	this.logicalVars = logicalVars;
    	this.constantVals = constantVals;
    	this.fieldNames = new String[logicalVars.length];
    	this.subTrees = new OptimizableOperatorSubTree[logicalVars.length];
    }
    
    // Special, more convenient c'tor for simple binary functions.
    public OptimizableFuncExpr(AbstractFunctionCallExpression funcExpr, LogicalVariable logicalVar, IAlgebricksConstantValue constantVal) {
    	this.funcExpr = funcExpr;
    	this.logicalVars = new LogicalVariable[] { logicalVar };
    	this.constantVals = new IAlgebricksConstantValue[] { constantVal };
    	this.fieldNames = new String[logicalVars.length];
    	this.subTrees = new OptimizableOperatorSubTree[logicalVars.length];
    }
    
	@Override
	public AbstractFunctionCallExpression getFuncExpr() {
		return funcExpr;
	}
	
	@Override
	public int getNumLogicalVars() {
		return logicalVars.length;
	}
	
	@Override
	public int getNumConstantVals() {
		return constantVals.length;
	}
	
	@Override	
	public LogicalVariable getLogicalVar(int index) {
		return logicalVars[index];
	}
	
	@Override
	public void setFieldName(int index, String fieldName) {
		fieldNames[index] = fieldName;
	}
	
	@Override
	public String getFieldName(int index) {
		return fieldNames[index];
	}
	
	@Override
	public IAlgebricksConstantValue getConstantVal(int index) {
		return constantVals[index];
	}

    @Override
    public int findLogicalVar(LogicalVariable var) {
        for (int i = 0; i < logicalVars.length; i++) {
            if (var == logicalVars[i]) {
                return i;
            }
        }
        return -1;
    }

    @Override
    public int findFieldName(String fieldName) {
        for (int i = 0; i < fieldNames.length; i++) {
            if (fieldName.equals(fieldNames[i])) {
                return i;
            }
        }
        return -1;
    }

    @Override
    public void setOptimizableSubTree(int index, OptimizableOperatorSubTree subTree) {
        subTrees[index] = subTree;
    }

    @Override
    public OptimizableOperatorSubTree getOperatorSubTree(int index) {
        return subTrees[index];
    }
}
