package edu.brown.markov.features; import java.util.List; import org.voltdb.catalog.ProcParameter; import org.voltdb.catalog.Procedure; import edu.brown.catalog.CatalogUtil; import edu.brown.markov.FeatureSet; import edu.brown.utils.PartitionEstimator; import edu.brown.workload.TransactionTrace; /** * For each ProcParameter that is an array, check whether all of the array * elements have the exact same value * @author pavlo */ public class ParamArrayAllSameValueFeature extends AbstractFeature { private final List<ProcParameter> array_params; public ParamArrayAllSameValueFeature(PartitionEstimator p_estimator, Procedure catalog_proc) { super(p_estimator, catalog_proc, ParamArrayAllSameValueFeature.class); // Get the list of ProcParameters that should be arrays this.array_params = CatalogUtil.getArrayProcParameters(this.catalog_proc); } private Boolean calculate(Object params[]) { Boolean all_same = null; if (params.length > 0) { all_same = true; Object value = null; boolean first = true; for (Object v : params) { if (first) { value = v; first = false; } else if ((value == null && v != null) || (value != null && value.equals(v) == false)) { all_same = false; break; } } // FOR } return (all_same); } @Override public void extract(FeatureSet fset, TransactionTrace txn_trace) throws Exception { for (ProcParameter catalog_param : this.array_params) { Object params[] = (Object[])txn_trace.getParam(catalog_param.getIndex()); Boolean all_same = this.calculate(params); if (all_same != null) fset.addFeature(txn_trace, this.getFeatureKey(catalog_param), all_same); } // FOR } @Override public Object calculate(String key, Object params[]) throws Exception { ProcParameter catalog_param = this.getProcParameter(key); Object inner_params[] = (Object[])params[catalog_param.getIndex()]; return (this.calculate(inner_params)); } }