package edu.brown.hstore.txns;
import java.util.Random;
import org.voltdb.StoredProcedureInvocation;
import org.voltdb.VoltMapReduceProcedure;
import org.voltdb.VoltProcedure;
import org.voltdb.VoltTable;
import org.voltdb.VoltTableRow;
import org.voltdb.catalog.Procedure;
import org.voltdb.utils.VoltTypeUtil;
import edu.brown.BaseTestCase;
import edu.brown.benchmark.mapreduce.procedures.MockMapReduce;
import edu.brown.hstore.MockHStoreSite;
import edu.brown.hstore.MockPartitionExecutor;
import edu.brown.hstore.conf.HStoreConf;
import edu.brown.utils.ClassUtil;
import edu.brown.utils.ProjectType;
public class TestMapReduceTransaction extends BaseTestCase{
static final int NUM_ROWS = 10;
static final Random rand = new Random();
static Class<? extends VoltProcedure> TARGET_PROCEDURE = MockMapReduce.class;
private VoltTable table;
private VoltMapReduceProcedure<?> voltProc;
private VoltTable.ColumnInfo[] schema;
private final int NUM_HOSTS = 1;
private final int NUM_SITES_PER_HOST = 4;
private final int NUM_PARTITIONS_PER_SITE = 2;
private final int NUM_SITES = (NUM_HOSTS * NUM_SITES_PER_HOST);
private final MockHStoreSite sites[] = new MockHStoreSite[NUM_SITES_PER_HOST];
// private final HStoreCoordinator messengers[] = new HStoreCoordinator[NUM_SITES_PER_HOST];
@Override
protected void setUp() throws Exception {
super.setUp(ProjectType.MAPREDUCE);
// Create a fake cluster of two HStoreSites, each with two partitions
// This will allow us to test same site communication as well as cross-site communication
this.initializeCatalog(NUM_HOSTS, NUM_SITES_PER_HOST, NUM_PARTITIONS_PER_SITE);
for (int i = 0; i < NUM_SITES; i++) {
this.sites[i] = new MockHStoreSite(i, catalogContext, HStoreConf.singleton());
// We have to make our fake ExecutionSites for each Partition at this site
for (int p : this.sites[i].getLocalPartitionIds().values()) {
MockPartitionExecutor executor = new MockPartitionExecutor(p, catalogContext, p_estimator);
this.sites[i].addPartitionExecutor(p, executor);
} // FOR
} // FOR
this.voltProc = (VoltMapReduceProcedure<?>)ClassUtil.newInstance(TARGET_PROCEDURE, new Object[0], new Class<?>[0]);
assertNotNull(this.voltProc);
this.schema = this.voltProc.getMapOutputSchema();
assertNotNull(this.schema);
assert(this.schema.length > 0);
this.table = new VoltTable(schema);
Object row[] = new Object[this.schema.length];
for (int i = 0; i < NUM_ROWS; i++) {
for (int j = 0; j < row.length; j++) {
row[j] = VoltTypeUtil.getRandomValue(schema[j].getType());
} // FOR
this.table.addRow(row);
} // FOR
assertEquals(NUM_ROWS, this.table.getRowCount());
}
private void compareTables(VoltTable vt0, VoltTable vt1) {
assertEquals(vt0.getRowCount(), vt1.getRowCount());
assertEquals(vt0.getColumnCount(), vt1.getColumnCount());
assert(vt1.getColumnCount() > 0);
int rows = 0;
while (vt0.advanceRow() && vt1.advanceRow()) {
VoltTableRow row0 = vt0.fetchRow(vt0.getActiveRowIndex());
VoltTableRow row1 = vt1.fetchRow(vt1.getActiveRowIndex());
for (int i = 0; i < vt0.getColumnCount(); i++) {
// System.err.println(i + ": " + row1.get(i));
assertEquals(row0.get(i), row1.get(i));
} // FOR
rows++;
} // WHILE
assert(rows > 0);
}
public void testStoreData() throws Exception {
MapReduceTransaction ts = new MapReduceTransaction(this.sites[0]);
StoredProcedureInvocation request = new StoredProcedureInvocation(-1, TARGET_PROCEDURE.getSimpleName());
Procedure catalog_proc = this.getProcedure(TARGET_PROCEDURE);
// Collection<Integer> local_partitions = this.sites[0].getLocalPartitionIds();
// System.err.println(local_partitions);
// ts.init(123456789l, 0, 0, local_partitions, false, true, catalog_proc, request, null);
// ts.storeData(1, table);
//
// VoltTable result = ts.getReduceInputByPartition(1);
// assertNotNull(result);
// this.compareTables(this.table, result);
}
}