package org.apache.hadoop.hive.mastiff;
import java.util.Arrays;
import java.util.HashMap;
import java.util.List;
import org.apache.hadoop.hive.mastiff.MastiffHandlerUtil.ColumnDesc;
import org.apache.hadoop.hive.mastiff.MastiffHandlerUtil.MTableDesc;
import org.apache.hadoop.hive.ql.exec.ExprNodeEvaluator;
import org.apache.hadoop.hive.ql.metadata.HiveException;
import org.apache.hadoop.hive.ql.plan.ExprNodeDesc;
import org.apache.hadoop.hive.serde2.objectinspector.ObjectInspector;
import org.apache.hadoop.hive.serde2.objectinspector.PrimitiveObjectInspector;
import cn.ac.ncic.mastiff.ValPair;
public abstract class MastiffEvaluator {
MTableDesc tblDesc;
ObjectInspector cachedMastiffRowOI;
public static final byte ONE = 1;
public static final byte ZERO = 0;
}
class SingleColEvaluator extends MastiffEvaluator {
private HashMap<ExprNodeDesc, RowWritable> cachedRowWritables;
private HashMap<ExprNodeDesc, LazyMastiffRow> cachedLMR;
private HashMap<ExprNodeDesc, ExprNodeEvaluator> cachedEvaluators;
private HashMap<ExprNodeEvaluator, PrimitiveObjectInspector> cachedConditionOI;
public SingleColEvaluator(MTableDesc tblDesc) {
init(tblDesc);
}
public void init(MTableDesc tblDesc) {
this.tblDesc = tblDesc;
cachedMastiffRowOI = MastiffSerDe.createMastiffRowObjectInspector(
Arrays.asList(tblDesc.columnNames), Arrays.asList(tblDesc.columnTypes));
cachedRowWritables = new HashMap<ExprNodeDesc, RowWritable>();
cachedLMR = new HashMap<ExprNodeDesc, LazyMastiffRow>();
cachedEvaluators = new HashMap<ExprNodeDesc, ExprNodeEvaluator>();
cachedConditionOI = new HashMap<ExprNodeEvaluator, PrimitiveObjectInspector>();
}
public Boolean evaluate(MTableDesc tblDesc, ExprNodeDesc filter, List<ValPair> vps) {
if (tblDesc != this.tblDesc && !tblDesc.equals(this.tblDesc)) {
init(tblDesc);
}
RowWritable curRw;
LazyMastiffRow curLrw;
ExprNodeEvaluator curConditionEvaluator = null;
PrimitiveObjectInspector curConditionOI = null;
if (!cachedEvaluators.containsKey(filter)) {
curRw = new RowWritable();
int colId = MastiffHandlerUtil.getColIdFromFilter(tblDesc, filter).get(0);
ColumnDesc cd = MastiffHandlerUtil.getCF(tblDesc, colId);
curRw.set(ONE, vps, Arrays.asList(cd.cf), Arrays.asList(cd.idxInTbl));
cachedRowWritables.put(filter, curRw);
curLrw = new LazyMastiffRow((LazyMastiffRowObjectInspector) cachedMastiffRowOI);
curLrw.init(curRw, tblDesc);
cachedLMR.put(filter, curLrw);
try {
curConditionEvaluator = MastiffExprEvaluatorFactory.get(filter);
} catch (HiveException e1) {
// TODO Auto-generated catch block
e1.printStackTrace();
}
cachedEvaluators.put(filter, curConditionEvaluator);
try {
curConditionOI = (PrimitiveObjectInspector) curConditionEvaluator
.initialize(cachedMastiffRowOI);
cachedConditionOI.put(curConditionEvaluator, curConditionOI);
} catch (HiveException e) {
e.printStackTrace();
}
} else {
curRw = cachedRowWritables.get(filter);
curLrw = cachedLMR.get(filter);
curConditionEvaluator = cachedEvaluators.get(filter);
curConditionOI = cachedConditionOI.get(curConditionEvaluator);
curRw.set(ZERO, vps, null, null);
curLrw.init(curRw, tblDesc);
}
Object cond;
Boolean ret = false;
try {
cond = curConditionEvaluator.evaluate(curLrw);
ret = (Boolean) curConditionOI.getPrimitiveJavaObject(cond);
} catch (HiveException e) {
e.printStackTrace();
}
return ret;
}
}
class RowEvaluator extends MastiffEvaluator {
private RowWritable rw;
private LazyMastiffRow lrw;
private ExprNodeEvaluator evaluator = null;
private PrimitiveObjectInspector conditionOI;
public RowEvaluator(MTableDesc tblDesc, ExprNodeDesc filter) {
this.tblDesc = tblDesc;
this.cachedMastiffRowOI = MastiffSerDe.createMastiffRowObjectInspector(
Arrays.asList(tblDesc.columnNames), Arrays.asList(tblDesc.columnTypes));
try {
this.evaluator = MastiffExprEvaluatorFactory.get(filter);
} catch (HiveException e1) {
// TODO Auto-generated catch block
e1.printStackTrace();
}
try {
this.conditionOI = (PrimitiveObjectInspector) this.evaluator
.initialize(cachedMastiffRowOI);
} catch (HiveException e) {
e.printStackTrace();
}
}
public Boolean evaluate(List<ValPair> vps, List<Integer> filterCfs, List<Integer> filterColumns) {
if (rw == null) {
rw = new RowWritable();
rw.set(ONE, vps, filterCfs, filterColumns);
lrw = new LazyMastiffRow((LazyMastiffRowObjectInspector) cachedMastiffRowOI);
} else {
rw.set(ZERO, vps, null, null);
}
lrw.init(rw, tblDesc);
Object cond;
Boolean ret = false;
try {
cond = evaluator.evaluate(lrw);
ret = (Boolean) conditionOI.getPrimitiveJavaObject(cond);
} catch (HiveException e) {
e.printStackTrace();
}
return ret;
}
}