package edu.brown.plannodes;
import java.util.*;
import org.voltdb.benchmark.tpcc.procedures.delivery;
import org.voltdb.benchmark.tpcc.procedures.neworder;
import org.voltdb.benchmark.tpcc.procedures.slev;
import org.voltdb.catalog.*;
import org.voltdb.plannodes.*;
import edu.brown.BaseTestCase;
import edu.brown.plannodes.PlanNodeTreeWalker;
import edu.brown.plannodes.PlanNodeUtil;
import edu.brown.utils.CollectionUtil;
import edu.brown.utils.ProjectType;
/**
*
* @author pavlo
*
*/
public class TestPlanNodeUtil2 extends BaseTestCase {
@Override
protected void setUp() throws Exception {
super.setUp(ProjectType.TPCC);
}
/**
* testIsRangeQuery
*/
public void testIsRangeQuery() throws Exception {
Statement stmts[] = null;
// Ranges
stmts = new Statement[] {
this.getStatement(slev.class, "GetStockCount"),
this.getStatement(delivery.class, "getNewOrder"),
};
for (Statement stmt : stmts) {
AbstractPlanNode root = PlanNodeUtil.getRootPlanNodeForStatement(stmt, true);
assertNotNull(stmt.fullName(), root);
assertTrue(stmt.fullName(), PlanNodeUtil.isRangeQuery(root));
} // FOR
// Not ranges
stmts = new Statement[] {
this.getStatement(slev.class, "GetOId"),
this.getStatement(delivery.class, "getCId"),
};
for (Statement stmt : stmts) {
AbstractPlanNode root = PlanNodeUtil.getRootPlanNodeForStatement(stmt, true);
assertNotNull(stmt.fullName(), root);
assertFalse(stmt.fullName(), PlanNodeUtil.isRangeQuery(root));
} // FOR
}
/**
* testGetPlanNodeTreeForPlanFragment
*/
public void testGetPlanNodeTreeForPlanFragment() throws Exception {
Procedure catalog_proc = this.getProcedure(neworder.class);
for (Statement catalog_stmt : catalog_proc.getStatements()) {
assertNotNull(catalog_stmt);
Set<PlanFragment> fragments = new HashSet<PlanFragment>();
fragments.addAll(catalog_stmt.getFragments());
fragments.addAll(catalog_stmt.getMs_fragments());
for (PlanFragment catalog_frag : fragments) {
AbstractPlanNode root = PlanNodeUtil.getPlanNodeTreeForPlanFragment(catalog_frag);
assertNotNull(root);
} // FOR
} // FOR
}
/**
* testGetSortedPlanFragments
*/
public void testGetSortedPlanFragments() throws Exception {
Procedure catalog_proc = this.getProcedure(slev.class);
Statement catalog_stmt = this.getStatement(catalog_proc, "GetStockCount");
List<PlanFragment> unsorted = Arrays.asList(catalog_stmt.getMs_fragments().values());
assertEquals(catalog_stmt.getMs_fragments().size(), unsorted.size());
Collections.shuffle(unsorted);
List<PlanFragment> sorted = PlanNodeUtil.getSortedPlanFragments(catalog_stmt, false);
assertNotNull(sorted);
assertEquals(catalog_stmt.getMs_fragments().size(), sorted.size());
Integer last_id = null;
for (PlanFragment catalog_frag : sorted) {
AbstractPlanNode root = PlanNodeUtil.getPlanNodeTreeForPlanFragment(catalog_frag);
assertNotNull(root);
int id = root.getPlanNodeId();
if (last_id != null) assert(last_id > id) : "Unexpected execution order [" + last_id + " < " + id + "]";
last_id = id;
} // FOR
}
/**
* testGetColumnForStmtParameterSelect
*/
public void testGetColumnForStmtParameterSelect() throws Exception {
Procedure catalog_proc = this.getProcedure("neworder");
Statement catalog_stmt = this.getStatement(catalog_proc, "getWarehouseTaxRate");
StmtParameter catalog_stmt_param = catalog_stmt.getParameters().get(0);
assertNotNull(catalog_stmt_param);
Column catalog_col = PlanNodeUtil.getColumnForStmtParameter(catalog_stmt_param);
assertNotNull(catalog_col);
Column expected = this.getTable("WAREHOUSE").getColumns().get("W_ID");
assertEquals(expected, catalog_col);
// Make sure the cache works
catalog_col = PlanNodeUtil.getColumnForStmtParameter(catalog_stmt_param);
assertEquals(expected, catalog_col);
}
/**
* testGetColumnForStmtParameterUpdate
*/
public void testGetColumnForStmtParameterUpdate() throws Exception {
Procedure catalog_proc = this.getProcedure("neworder");
Statement catalog_stmt = this.getStatement(catalog_proc, "incrementNextOrderId");
StmtParameter catalog_stmt_param = catalog_stmt.getParameters().get(0);
assertNotNull(catalog_stmt_param);
Column catalog_col = PlanNodeUtil.getColumnForStmtParameter(catalog_stmt_param);
assertNotNull(catalog_col);
Column expected = this.getTable("DISTRICT").getColumns().get("D_NEXT_O_ID");
assertEquals(expected, catalog_col);
}
/**
* testDeserializeMultiSiteStatement
*/
public void testDeserializeMultiSiteStatement() throws Exception {
Procedure catalog_proc = this.getProcedure("SelectAll");
Statement catalog_stmt = this.getStatement(catalog_proc, "history");
// Pass the Statement off to get deserialized
// We will inspect it to make sure that it has at least one scan node and a result
AbstractPlanNode root_node = PlanNodeUtil.getRootPlanNodeForStatement(catalog_stmt, false);
assertNotNull(root_node);
List<Class<? extends AbstractPlanNode>> expected = new ArrayList<Class<? extends AbstractPlanNode>>();
expected.add(SendPlanNode.class);
expected.add(ProjectionPlanNode.class);
expected.add(ReceivePlanNode.class);
expected.add(SendPlanNode.class);
expected.add(SeqScanPlanNode.class);
final List<Class<? extends AbstractPlanNode>> found = new ArrayList<Class<? extends AbstractPlanNode>>();
// System.out.println(PlanNodeUtil.debug(root_node));
new PlanNodeTreeWalker() {
@Override
protected void callback(AbstractPlanNode element) {
// Nothing...
}
@Override
protected void callback_before(AbstractPlanNode element) {
found.add(element.getClass());
}
}.traverse(root_node);
assertFalse(found.isEmpty());
assertEquals(expected.size(), found.size());
assertTrue(found.containsAll(expected));
}
/**
* testDeserializeSingleSiteStatement
*/
public void testDeserializeSingleSiteStatement() throws Exception {
Procedure catalog_proc = this.getProcedure("SelectAll");
Statement catalog_stmt = this.getStatement(catalog_proc, "history");
// Pass the Statement off to get deserialized
// We will inspect it to make sure that it has at least one scan node and a result
AbstractPlanNode root_node = PlanNodeUtil.getRootPlanNodeForStatement(catalog_stmt, true);
assertNotNull(root_node);
List<Class<? extends AbstractPlanNode>> expected = new ArrayList<Class<? extends AbstractPlanNode>>();
expected.add(SendPlanNode.class);
expected.add(SeqScanPlanNode.class);
final List<Class<? extends AbstractPlanNode>> found = new ArrayList<Class<? extends AbstractPlanNode>>();
new PlanNodeTreeWalker() {
@Override
protected void callback(AbstractPlanNode element) {
// Nothing...
}
@Override
protected void callback_before(AbstractPlanNode element) {
found.add(element.getClass());
}
}.traverse(root_node);
assertFalse(found.isEmpty());
assertEquals(expected.size(), found.size());
assertTrue(found.containsAll(expected));
}
/**
* testDeserializeSingleSiteStatement
*/
public void testDeserializePlanFragment() throws Exception {
Procedure catalog_proc = this.getProcedure("SelectAll");
Statement catalog_stmt = this.getStatement(catalog_proc, "history");
PlanFragment catalog_frag = CollectionUtil.first(catalog_stmt.getFragments());
assertNotNull(catalog_frag);
// Pass the Fragment off to get deserialized
for (int i = 0; i < 4; i++) {
AbstractPlanNode root_node = PlanNodeUtil.getPlanNodeTreeForPlanFragment(catalog_frag);
assertNotNull(root_node);
List<Class<? extends AbstractPlanNode>> expected = new ArrayList<Class<? extends AbstractPlanNode>>();
expected.add(SendPlanNode.class);
expected.add(SeqScanPlanNode.class);
final List<Class<? extends AbstractPlanNode>> found = new ArrayList<Class<? extends AbstractPlanNode>>();
new PlanNodeTreeWalker() {
@Override
protected void callback(AbstractPlanNode element) {
// Nothing...
}
@Override
protected void callback_before(AbstractPlanNode element) {
found.add(element.getClass());
}
}.traverse(root_node);
assertFalse(found.isEmpty());
assertEquals(expected.size(), found.size());
assertTrue(found.containsAll(expected));
}
}
}