package edu.brown.designer.partitioners.plan; import java.util.Collection; import java.util.HashMap; import java.util.Map; import org.json.JSONObject; import org.junit.Test; import org.voltdb.benchmark.tpcc.procedures.delivery; import org.voltdb.benchmark.tpcc.procedures.neworder; import org.voltdb.benchmark.tpcc.procedures.ostatByCustomerId; import org.voltdb.benchmark.tpcc.procedures.ostatByCustomerName; import org.voltdb.benchmark.tpcc.procedures.paymentByCustomerId; import org.voltdb.benchmark.tpcc.procedures.paymentByCustomerName; import org.voltdb.benchmark.tpcc.procedures.slev; import org.voltdb.catalog.CatalogType; import org.voltdb.catalog.Column; import org.voltdb.catalog.Table; import edu.brown.BaseTestCase; import edu.brown.catalog.special.MultiColumn; import edu.brown.catalog.special.MultiProcParameter; import edu.brown.catalog.special.ReplicatedColumn; import edu.brown.utils.CollectionUtil; import edu.brown.utils.ProjectType; import edu.brown.utils.StringUtil; public class TestPartitionPlan extends BaseTestCase { @Override protected void setUp() throws Exception { super.setUp(ProjectType.TPCC); } /** * testGetChangedEntries */ @Test public void testGetChangedEntries() { Table catalog_tbl = this.getTable("WAREHOUSE"); Column catalog_col = this.getColumn(catalog_tbl, "W_NAME"); // First check they are the same final PartitionPlan pplan0 = PartitionPlan.createFromCatalog(catalog_db); assertNotNull(pplan0); final PartitionPlan pplan1 = PartitionPlan.createFromCatalog(catalog_db); assertNotNull(pplan1); Collection<CatalogType> changed = pplan0.getChangedEntries(pplan1); assertNotNull(changed); assert(changed.isEmpty()) : changed; // Now change the table's partitioning column and check that it comes back as changed TableEntry pentry = pplan1.getTableEntry(catalog_tbl); pentry.setAttribute(catalog_col); changed = pplan0.getChangedEntries(pplan1); assertNotNull(changed); assertEquals(1, changed.size()); assertEquals(catalog_tbl, CollectionUtil.first(changed)); changed = pplan1.getChangedEntries(pplan0); assertNotNull(changed); assertEquals(1, changed.size()); assertEquals(catalog_tbl, CollectionUtil.first(changed)); // Remove the entry from pplan1 and make sure that it comes back as changed for pplan0 but not pplan1 pplan1.getTableEntries().remove(catalog_tbl); changed = pplan0.getChangedEntries(pplan1); assertNotNull(changed); assertEquals(1, changed.size()); assertEquals(catalog_tbl, CollectionUtil.first(changed)); changed = pplan1.getChangedEntries(pplan0); assertNotNull(changed); assert(changed.isEmpty()) : changed; } /** * testMultiColumn */ @Test public void testMultiColumn() throws Exception { Map<CatalogType, CatalogType> m = new HashMap<CatalogType, CatalogType>(); // Replication! m.put(this.getTable("WAREHOUSE"), ReplicatedColumn.get(this.getTable("WAREHOUSE"))); m.put(this.getTable("ITEM"), ReplicatedColumn.get(this.getTable("ITEM"))); // Straight-up! m.put(this.getTable("STOCK"), this.getColumn("STOCK", "S_W_ID")); // Multi-Column! m.put(this.getTable("DISTRICT"), MultiColumn.get(this.getColumn("DISTRICT", "D_W_ID"), this.getColumn("DISTRICT", "D_ID"))); m.put(this.getTable("CUSTOMER"), MultiColumn.get(this.getColumn("CUSTOMER", "C_W_ID"), this.getColumn("CUSTOMER", "C_D_ID"))); m.put(this.getTable("ORDERS"), MultiColumn.get(this.getColumn("ORDERS", "O_W_ID"), this.getColumn("ORDERS", "O_D_ID"))); m.put(this.getTable("ORDER_LINE"), MultiColumn.get(this.getColumn("ORDER_LINE", "OL_W_ID"), this.getColumn("ORDER_LINE", "OL_D_ID"))); m.put(this.getTable("NEW_ORDER"), MultiColumn.get(this.getColumn("NEW_ORDER", "NO_W_ID"), this.getColumn("NEW_ORDER", "NO_D_ID"))); m.put(this.getTable("HISTORY"), MultiColumn.get(this.getColumn("HISTORY", "H_W_ID"), this.getColumn("HISTORY", "H_D_ID"))); // Procedures! m.put(this.getProcedure(delivery.class), this.getProcParameter(delivery.class, 0)); // MultiProcParameters! // IMPORTANT: The ordering of columns in the tables is <D_ID, W_ID> but the ordering of the params (according // to their index values) is <W_ID, D_ID>. We need to make the two orders match! m.put(this.getProcedure(neworder.class), MultiProcParameter.get(this.getProcParameter(neworder.class, 1), this.getProcParameter(neworder.class, 0))); m.put(this.getProcedure(ostatByCustomerId.class), MultiProcParameter.get(this.getProcParameter(ostatByCustomerId.class, 1), this.getProcParameter(ostatByCustomerId.class, 0))); m.put(this.getProcedure(ostatByCustomerName.class), MultiProcParameter.get(this.getProcParameter(ostatByCustomerName.class, 1), this.getProcParameter(ostatByCustomerName.class, 0))); m.put(this.getProcedure(paymentByCustomerId.class), MultiProcParameter.get(this.getProcParameter(paymentByCustomerId.class, 1), this.getProcParameter(paymentByCustomerId.class, 0))); // m.put(this.getProcedure(paymentByCustomerIdC.class), // MultiProcParameter.get(this.getProcParameter(paymentByCustomerIdC.class, 1), // this.getProcParameter(paymentByCustomerIdC.class, 0))); // m.put(this.getProcedure(paymentByCustomerIdW.class), // MultiProcParameter.get(this.getProcParameter(paymentByCustomerIdW.class, 1), // this.getProcParameter(paymentByCustomerIdW.class, 0))); m.put(this.getProcedure(paymentByCustomerName.class), MultiProcParameter.get(this.getProcParameter(paymentByCustomerName.class, 1), this.getProcParameter(paymentByCustomerName.class, 0))); // m.put(this.getProcedure(paymentByCustomerNameC.class), // MultiProcParameter.get(this.getProcParameter(paymentByCustomerNameC.class, 1), // this.getProcParameter(paymentByCustomerNameC.class, 0))); // m.put(this.getProcedure(paymentByCustomerNameW.class), // MultiProcParameter.get(this.getProcParameter(paymentByCustomerNameW.class, 1), // this.getProcParameter(paymentByCustomerNameW.class, 0))); m.put(this.getProcedure(slev.class), MultiProcParameter.get(this.getProcParameter(slev.class, 1), this.getProcParameter(slev.class, 0))); PartitionPlan pplan = PartitionPlan.createFromMap(m); assertNotNull(pplan); // pplan.save("/tmp/tpcc.50w.manual.pplan"); String json = pplan.toJSONString(); assertFalse(json.isEmpty()); JSONObject json_object = new JSONObject(json); assertNotNull(json_object); PartitionPlan clone = new PartitionPlan(); clone.fromJSON(json_object, catalog_db); if (pplan.equals(clone) == false) { System.err.println(StringUtil.columns("ORIGINAL:\n" + pplan, "CLONE:\n" + clone)); } assertEquals("Clone failed", pplan, clone); // System.err.println(clone); } }