package edu.brown.markov.containers; import java.util.Arrays; import java.util.Collection; import org.apache.log4j.Logger; import org.voltdb.catalog.Procedure; import edu.brown.markov.MarkovGraph; public class TPCCMarkovGraphsContainer extends MarkovGraphsContainer { private static final Logger LOG = Logger.getLogger(TPCCMarkovGraphsContainer.class); private static final boolean d = LOG.isDebugEnabled(); // private boolean neworder_useInt = false; public TPCCMarkovGraphsContainer(Collection<Procedure> procedures) { super(procedures); } @Override public MarkovGraph getFromParams(Long txn_id, int base_partition, Object[] params, Procedure catalog_proc) { MarkovGraph ret = null; String proc_name = catalog_proc.getName(); int id = -1; // NEWORDER if (proc_name.equals("neworder")) { if (d) LOG.debug(String.format("Selecting MarkovGraph using decision tree for %s txn #%d", proc_name, txn_id)); assert(this.hasher != null) : "Missing hasher!"; id = this.processNeworder(txn_id, base_partition, params, catalog_proc, 0); // PAYMENT } else if (proc_name.startsWith("payment")) { if (d) LOG.debug(String.format("Selecting MarkovGraph using decision tree for %s txn #%d", proc_name, txn_id)); assert(this.hasher != null) : "Missing hasher!"; id = this.processPayment(txn_id, base_partition, params, catalog_proc); // DEFAULT } else { if (d) LOG.debug(String.format("Using default MarkovGraph for %s txn #%d", proc_name, txn_id)); id = base_partition; } ret = this.getOrCreate(id, catalog_proc, true); assert(ret != null); return (ret); } public int processNeworder(long txn_id, int base_partition, Object[] params, Procedure catalog_proc, int ctr) { // VALUE(D_ID) // int d_id = -1; // try { // if (this.neworder_useInt) { // d_id = ((Integer)params[1]).intValue(); // } else { // d_id = ((Byte)params[1]).intValue(); // } // } catch (ClassCastException e) { // if (ctr > 10) { // throw e; // } // this.neworder_useInt = (this.neworder_useInt == false); // return (this.processNeworder(txn_id, base_partition, params, catalog_proc, ++ctr)); // } // ARRAYLENGTH(S_W_IDS) Short arr[] = (Short[])params[5]; // SAMEVALUE(S_W_IDS) int other_hash_idx = 0; // int other_hash = -1; for (int i = 0; i < arr.length; i++) { int hash = this.hasher.hash(arr[i]); if (i > 0 && base_partition != hash) { other_hash_idx = i + 1; // other_hash = hash; break; } } // FOR if (d) { int hashes[] = new int[arr.length]; for (int i = 0; i < hashes.length; i++) { hashes[i] = this.hasher.hash(arr[i]); } // FOR LOG.debug(String.format("NEWORDER Txn #%d\n" + // " VALUE(D_ID) = %d\n" + " ARRAYLENGTH(S_W_IDS) = %d / %s\n" + // " SAME_VALUE(S_W_IDS) = %d\n" " FIRST_DIFF(S_W_IDS) = %d\n", txn_id, // d_id, arr.length, Arrays.toString(hashes), other_hash_idx)); } return (arr.length | other_hash_idx<<8); // | other_hash<<16); } public int processPayment(long txn_id, int base_partition, Object[] params, Procedure catalog_proc) { // HASH(W_ID) // int hash_w_id = this.hasher.hash(params[0]); // HASH(C_W_ID) int hash_c_w_id = this.hasher.hash(params[3]); if (d) LOG.debug(String.format("PAYMENT Txn #%d HASH[C_W_ID] = %d / %s", txn_id, hash_c_w_id, params[3])); // return (hash_c_w_id); return (base_partition | hash_c_w_id<<16); } }