package edu.brown.markov.features; import java.util.ArrayList; import java.util.List; import org.voltdb.VoltType; import org.voltdb.catalog.ProcParameter; import org.voltdb.catalog.Procedure; import org.voltdb.utils.Pair; import edu.brown.markov.FeatureSet; import edu.brown.utils.PartitionEstimator; import edu.brown.workload.TransactionTrace; /** * Extract all parameters that have numeric values * @author pavlo * */ public class ParamNumericValuesFeature extends AbstractFeature { private final List<ProcParameter> numeric_params = new ArrayList<ProcParameter>(); public ParamNumericValuesFeature(PartitionEstimator p_estimator, Procedure catalog_proc) { super(p_estimator, catalog_proc, ParamNumericValuesFeature.class); for (ProcParameter catalog_param : catalog_proc.getParameters()) { VoltType type = VoltType.get(catalog_param.getType()); switch (type) { case TINYINT: case SMALLINT: case INTEGER: case BIGINT: // case FLOAT: // case DECIMAL: this.numeric_params.add(catalog_param); break; } // SWITCH } // FOR } @Override public void extract(FeatureSet fset, TransactionTrace txn_trace) throws Exception { for (ProcParameter catalog_param : this.numeric_params) { Object param = txn_trace.getParam(catalog_param.getIndex()); if (catalog_param.getIsarray()) { Object inner[] = (Object[])param; for (int i = 0; i < inner.length; i++) { fset.addFeature(txn_trace, this.getFeatureKey(catalog_param, i), inner[i], FeatureSet.Type.NUMERIC); } // FOR } else { fset.addFeature(txn_trace, this.getFeatureKey(catalog_param), param, FeatureSet.Type.NUMERIC); } } // FOR } @Override public Object calculate(String key, Object params[]) throws Exception { Pair<ProcParameter, Integer> p = this.getProcParameterWithIndex(key); Object param = params[p.getFirst().getIndex()]; if (p.getSecond() != null) { assert(p.getFirst().getIsarray()) : "Invalid: " + key; param = ((Object[])param)[p.getSecond()]; } return (param); } }