package edu.brown.hstore;
import java.util.ArrayList;
import java.util.List;
import org.voltdb.ParameterSet;
import org.voltdb.SQLStmt;
import org.voltdb.VoltProcedure;
import org.voltdb.catalog.CatalogMap;
import org.voltdb.catalog.PlanFragment;
import org.voltdb.catalog.Procedure;
import org.voltdb.catalog.Statement;
import edu.brown.BaseTestCase;
import edu.brown.benchmark.mapreduce.procedures.MockMapReduce;
import edu.brown.hashing.DefaultHasher;
import edu.brown.hstore.Hstoreservice.WorkFragment;
import edu.brown.statistics.FastIntHistogram;
import edu.brown.utils.PartitionEstimator;
import edu.brown.utils.PartitionSet;
import edu.brown.utils.ProjectType;
public class TestBatchPlannerMapReduce extends BaseTestCase {
private static final Class<? extends VoltProcedure> MULTISITE_PROCEDURE = MockMapReduce.class;
private static final String MULTISITE_STATEMENT = "mapInputQuery";
private static final Object MULTISITE_PROCEDURE_ARGS[] = {
1
};
private static final Long TXN_ID = 1000l;
private static final int LOCAL_PARTITION = 0;
private static final int NUM_PARTITIONS = 10;
private Procedure catalog_proc;
private Statement catalog_stmt;
private SQLStmt batch[];
private ParameterSet args[];
private int stmtCounters[];
private FastIntHistogram touched_partitions = new FastIntHistogram();
@Override
protected void setUp() throws Exception {
super.setUp(ProjectType.MAPREDUCE);
this.addPartitions(NUM_PARTITIONS);
p_estimator = new PartitionEstimator(catalogContext, new DefaultHasher(catalogContext, NUM_PARTITIONS));
}
private void init(Class<? extends VoltProcedure> volt_proc, String stmt_name, Object raw_args[]) {
this.catalog_proc = this.getProcedure(volt_proc);
assertNotNull(this.catalog_proc);
this.catalog_stmt = this.catalog_proc.getStatements().get(stmt_name);
assertNotNull(this.catalog_stmt);
assertTrue(this.catalog_stmt.fullName(), this.catalog_stmt.getHas_singlesited());
CatalogMap<PlanFragment> fragments = this.catalog_stmt.getFragments();
// Create a SQLStmt batch
this.batch = new SQLStmt[] { new SQLStmt(this.catalog_stmt, fragments) };
this.args = new ParameterSet[] { VoltProcedure.getCleanParams(this.batch[0], raw_args) };
this.stmtCounters = new int[]{ 0 };
}
/**
* testForceSinglePartitionPlan
*/
public void testForceSinglePartitionPlan() throws Exception {
this.init(MULTISITE_PROCEDURE, MULTISITE_STATEMENT, MULTISITE_PROCEDURE_ARGS);
BatchPlanner batchPlan = new BatchPlanner(batch, this.catalog_proc, p_estimator, true);
BatchPlanner.BatchPlan plan = batchPlan.plan(TXN_ID, LOCAL_PARTITION, PartitionSet.singleton(LOCAL_PARTITION), this.touched_partitions, this.args);
assertNotNull(plan);
assertFalse(plan.hasMisprediction());
assertNotNull(plan);
assertFalse(plan.hasMisprediction());
List<WorkFragment.Builder> tasks = new ArrayList<WorkFragment.Builder>();
plan.getWorkFragmentsBuilders(TXN_ID, this.stmtCounters, tasks);
int local_frags = TestBatchPlanner.getLocalFragmentCount(tasks, LOCAL_PARTITION);
int remote_frags = TestBatchPlanner.getRemoteFragmentCount(tasks, LOCAL_PARTITION);
System.err.println(plan);
System.err.println("Fragments: " + tasks);
assertTrue(plan.isLocal());
assertTrue(plan.isSingleSited());
assertEquals(1, local_frags);
assertEquals(0, remote_frags);
}
}