/**
* Unit tests for methods in {@link Frameworks}.
*/
public class FrameworksTest {
@Test public void testOptimize() {
RelNode x =
Frameworks.withPlanner(new Frameworks.PlannerAction<RelNode>() {
public RelNode apply(RelOptCluster cluster,
RelOptSchema relOptSchema,
SchemaPlus rootSchema) {
final RelDataTypeFactory typeFactory = cluster.getTypeFactory();
final Table table = new AbstractTable() {
public RelDataType getRowType(RelDataTypeFactory typeFactory) {
final RelDataType stringType =
typeFactory.createJavaType(String.class);
final RelDataType integerType =
typeFactory.createJavaType(Integer.class);
return typeFactory.builder()
.add("s", stringType)
.add("i", integerType)
.build();
}
};
// "SELECT * FROM myTable"
final RelOptAbstractTable relOptTable = new RelOptAbstractTable(
relOptSchema,
"myTable",
table.getRowType(typeFactory)) {
};
final JavaRules.EnumerableTableAccessRel tableRel =
new JavaRules.EnumerableTableAccessRel(
cluster, cluster.traitSetOf(EnumerableConvention.INSTANCE),
relOptTable, Object[].class);
// "WHERE i > 1"
final RexBuilder rexBuilder = cluster.getRexBuilder();
final RexNode condition =
rexBuilder.makeCall(SqlStdOperatorTable.GREATER_THAN,
rexBuilder.makeFieldAccess(
rexBuilder.makeRangeReference(tableRel), "i", true),
rexBuilder.makeExactLiteral(BigDecimal.ONE));
final FilterRel filterRel =
new FilterRel(cluster, tableRel, condition);
// Specify that the result should be in Enumerable convention.
final RelNode rootRel = filterRel;
final RelOptPlanner planner = cluster.getPlanner();
RelTraitSet desiredTraits = rootRel.getTraitSet().replace(
EnumerableConvention.INSTANCE);
final RelNode rootRel2 = planner.changeTraits(rootRel,
desiredTraits);
planner.setRoot(rootRel2);
// Now, plan.
return planner.findBestExp();