package edu.uci.ics.hivesterix.runtime.jobgen;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
import java.util.Map;

import edu.uci.ics.hyracks.algebricks.core.algebra.base.LogicalVariable;
import edu.uci.ics.hyracks.algebricks.core.algebra.operators.logical.IOperatorSchema;

public class HiveOperatorSchema implements IOperatorSchema {

    private final Map<LogicalVariable, Integer> varMap;

    private final List<LogicalVariable> varList;

    public HiveOperatorSchema() {
        varMap = new HashMap<LogicalVariable, Integer>();
        varList = new ArrayList<LogicalVariable>();
    }

    @Override
    public void addAllVariables(IOperatorSchema source) {
        for (LogicalVariable v : source) {
            varMap.put(v, varList.size());
            varList.add(v);
        }
    }

    @Override
    public void addAllNewVariables(IOperatorSchema source) {
        for (LogicalVariable v : source) {
            if (varMap.get(v) == null) {
                varMap.put(v, varList.size());
                varList.add(v);
            }
        }
    }

    @Override
    public int addVariable(LogicalVariable var) {
        int idx = varList.size();
        varMap.put(var, idx);
        varList.add(var);
        return idx;
    }

    @Override
    public void clear() {
        varMap.clear();
        varList.clear();
    }

    @Override
    public int findVariable(LogicalVariable var) {
        Integer i = varMap.get(var);
        if (i == null) {
            return -1;
        }
        return i;
    }

    @Override
    public int getSize() {
        return varList.size();
    }

    @Override
    public LogicalVariable getVariable(int index) {
        return varList.get(index);
    }

    @Override
    public Iterator<LogicalVariable> iterator() {
        return varList.iterator();
    }

    @Override
    public String toString() {
        return varMap.toString();
    }

}
