package edu.brown.workload.filters; import java.util.HashMap; import java.util.HashSet; import java.util.Map; import java.util.Map.Entry; import java.util.Set; import org.apache.log4j.Logger; import org.voltdb.catalog.CatalogType; import org.voltdb.catalog.ProcParameter; import edu.brown.workload.AbstractTraceElement; import edu.brown.workload.TransactionTrace; /** * Filters out transactions based on the whether a ProcParameter equals a specific value * @author pavlo */ public class ProcParameterValueFilter extends Filter { private static final Logger LOG = Logger.getLogger(ProcParameterValueFilter.class); private static final boolean d = LOG.isDebugEnabled(); private final Map<Integer, Set<Object>> values = new HashMap<Integer, Set<Object>>(); /** * Add a parameter index and value equality pair * @param param_idx * @param param_value * @return */ public ProcParameterValueFilter include(int param_idx, Object param_value) { Set<Object> values = this.values.get(param_idx); if (values == null) { values = new HashSet<Object>(); this.values.put(param_idx, values); } values.add(param_value); return (this); } /** * Add a ProcParameter and value equality pair * @param catalog_param * @param param_value * @return */ public ProcParameterValueFilter include(ProcParameter catalog_param, Object param_value) { return (this.include(catalog_param.getIndex(), param_value)); } @Override protected void resetImpl() { // Ignore... } @Override protected FilterResult filter(AbstractTraceElement<? extends CatalogType> element) { if (element instanceof TransactionTrace) { TransactionTrace xact = (TransactionTrace)element; boolean allow = true; for (Entry<Integer, Set<Object>> e : this.values.entrySet()) { Object param_val = xact.getParam(e.getKey()); // The parameter must equal at least one of these values for (Object val : e.getValue()) { allow = val.equals(param_val); if (d) LOG.debug(String.format("%s #%02d => [%s (%s) <-> %s (%s)] = %s", xact, e.getKey(), val, val.getClass().getSimpleName(), param_val, param_val.getClass().getSimpleName(), (allow ? FilterResult.ALLOW : FilterResult.SKIP))); if (allow) break; } // FOR // If none of them are equal, then we need to halt here if (allow == false) break; } // FOR return (allow ? FilterResult.ALLOW : FilterResult.SKIP); } return FilterResult.ALLOW; } @Override public String debugImpl() { return (this.getClass().getSimpleName() + "[values=" + this.values + "]"); } }