final RexNode operand = operands.get(i); final RexNode operandCNF = RexUtil.toCnf(rexBuilder, maxCNFNodeCount, operand); final List<RexNode> conjunctions = RelOptUtil.conjunctions(operandCNF);
final RexNode operand = operands.get(i); final RexNode operandCNF = RexUtil.toCnf(rexBuilder, maxCNFNodeCount, operand); final List<RexNode> conjunctions = RelOptUtil.conjunctions(operandCNF);
@Test public void testCBOMaxNumToCNF1() { // OR(=($0, 1), AND(=($0, 0), =($1, 8))) // transformation creates 7 nodes AND(OR(=($0, 1), =($0, 0)), OR(=($0, 1), =($1, 8))) // thus, it is triggered final RelDataTypeFactory typeFactory = new JavaTypeFactoryImpl(); final RexBuilder rexBuilder = new RexBuilder(typeFactory); final RexNode cond = rexBuilder.makeCall(SqlStdOperatorTable.OR, rexBuilder.makeCall(SqlStdOperatorTable.EQUALS, rexBuilder.makeInputRef(typeFactory.createSqlType(SqlTypeName.INTEGER), 0), rexBuilder.makeLiteral(1, typeFactory.createSqlType(SqlTypeName.INTEGER), false)), rexBuilder.makeCall(SqlStdOperatorTable.AND, rexBuilder.makeCall(SqlStdOperatorTable.EQUALS, rexBuilder.makeInputRef(typeFactory.createSqlType(SqlTypeName.INTEGER), 0), rexBuilder.makeLiteral(0, typeFactory.createSqlType(SqlTypeName.INTEGER), false)), rexBuilder.makeCall(SqlStdOperatorTable.EQUALS, rexBuilder.makeInputRef(typeFactory.createSqlType(SqlTypeName.INTEGER), 1), rexBuilder.makeLiteral(8, typeFactory.createSqlType(SqlTypeName.INTEGER), false)))); final RexNode newCond = RexUtil.toCnf(rexBuilder, maxNumNodesCNF, cond); assertEquals(newCond.toString(), "AND(OR(=($0, 1), =($0, 0)), OR(=($0, 1), =($1, 8)))"); }
@Test public void testCBOMaxNumToCNF2() { // OR(=($0, 1), =($0, 2), AND(=($0, 0), =($1, 8))) // transformation creates 9 nodes AND(OR(=($0, 1), =($0, 2), =($0, 0)), OR(=($0, 1), =($0, 2), =($1, 8))) // thus, it is NOT triggered final RelDataTypeFactory typeFactory = new JavaTypeFactoryImpl(); final RexBuilder rexBuilder = new RexBuilder(typeFactory); final RexNode cond = rexBuilder.makeCall(SqlStdOperatorTable.OR, rexBuilder.makeCall(SqlStdOperatorTable.EQUALS, rexBuilder.makeInputRef(typeFactory.createSqlType(SqlTypeName.INTEGER), 0), rexBuilder.makeLiteral(1, typeFactory.createSqlType(SqlTypeName.INTEGER), false)), rexBuilder.makeCall(SqlStdOperatorTable.EQUALS, rexBuilder.makeInputRef(typeFactory.createSqlType(SqlTypeName.INTEGER), 0), rexBuilder.makeLiteral(2, typeFactory.createSqlType(SqlTypeName.INTEGER), false)), rexBuilder.makeCall(SqlStdOperatorTable.AND, rexBuilder.makeCall(SqlStdOperatorTable.EQUALS, rexBuilder.makeInputRef(typeFactory.createSqlType(SqlTypeName.INTEGER), 0), rexBuilder.makeLiteral(0, typeFactory.createSqlType(SqlTypeName.INTEGER), false)), rexBuilder.makeCall(SqlStdOperatorTable.EQUALS, rexBuilder.makeInputRef(typeFactory.createSqlType(SqlTypeName.INTEGER), 1), rexBuilder.makeLiteral(8, typeFactory.createSqlType(SqlTypeName.INTEGER), false)))); final RexNode newCond = RexUtil.toCnf(rexBuilder, maxNumNodesCNF, cond); assertEquals(newCond.toString(), "OR(=($0, 1), =($0, 2), AND(=($0, 0), =($1, 8)))"); }
private void checkThresholdCnf(RexNode node, int threshold, String expected) { assertThat(RexUtil.toCnf(rexBuilder, threshold, node).toString(), equalTo(expected)); }
private void checkCnf(RexNode node, String expected) { assertThat(RexUtil.toCnf(rexBuilder, node).toString(), equalTo(expected)); }
private void checkThresholdCnf(RexNode node, int threshold, String expected) { assertThat(RexUtil.toCnf(rexBuilder, threshold, node).toString(), equalTo(expected)); }
private void checkCnf(RexNode node, String expected) { assertThat(RexUtil.toCnf(rexBuilder, node).toString(), equalTo(expected)); }
final RexNode operand = operands.get(i); final RexNode operandCNF = RexUtil.toCnf(rexBuilder, operand); final List<RexNode> conjunctions = RelOptUtil.conjunctions(operandCNF);
private void checkExponentialCnf(int n) { final RelDataType booleanType = typeFactory.createSqlType(SqlTypeName.BOOLEAN); final RelDataTypeFactory.Builder builder = typeFactory.builder(); for (int i = 0; i < n; i++) { builder.add("x" + i, booleanType) .add("y" + i, booleanType); } final RelDataType rowType3 = builder.build(); final RexDynamicParam range3 = rexBuilder.makeDynamicParam(rowType3, 0); final List<RexNode> list = new ArrayList<>(); for (int i = 0; i < n; i++) { list.add( and(rexBuilder.makeFieldAccess(range3, i * 2), rexBuilder.makeFieldAccess(range3, i * 2 + 1))); } final RexNode cnf = RexUtil.toCnf(rexBuilder, or(list)); final int nodeCount = nodeCount(cnf); assertThat((n + 1) * (int) Math.pow(2, n) + 1, equalTo(nodeCount)); if (n == 3) { assertThat(cnf.toString(), equalTo("AND(OR(?0.x0, ?0.x1, ?0.x2), OR(?0.x0, ?0.x1, ?0.y2)," + " OR(?0.x0, ?0.y1, ?0.x2), OR(?0.x0, ?0.y1, ?0.y2)," + " OR(?0.y0, ?0.x1, ?0.x2), OR(?0.y0, ?0.x1, ?0.y2)," + " OR(?0.y0, ?0.y1, ?0.x2), OR(?0.y0, ?0.y1, ?0.y2))")); } }
private void checkExponentialCnf(int n) { final RelDataType booleanType = typeFactory.createSqlType(SqlTypeName.BOOLEAN); final RelDataTypeFactory.Builder builder = typeFactory.builder(); for (int i = 0; i < n; i++) { builder.add("x" + i, booleanType) .add("y" + i, booleanType); } final RelDataType rowType3 = builder.build(); final RexDynamicParam range3 = rexBuilder.makeDynamicParam(rowType3, 0); final List<RexNode> list = new ArrayList<>(); for (int i = 0; i < n; i++) { list.add( and(rexBuilder.makeFieldAccess(range3, i * 2), rexBuilder.makeFieldAccess(range3, i * 2 + 1))); } final RexNode cnf = RexUtil.toCnf(rexBuilder, or(list)); final int nodeCount = nodeCount(cnf); assertThat((n + 1) * (int) Math.pow(2, n) + 1, equalTo(nodeCount)); if (n == 3) { assertThat(cnf.toString(), equalTo("AND(OR(?0.x0, ?0.x1, ?0.x2), OR(?0.x0, ?0.x1, ?0.y2)," + " OR(?0.x0, ?0.y1, ?0.x2), OR(?0.x0, ?0.y1, ?0.y2)," + " OR(?0.y0, ?0.x1, ?0.x2), OR(?0.y0, ?0.x1, ?0.y2)," + " OR(?0.y0, ?0.y1, ?0.x2), OR(?0.y0, ?0.y1, ?0.y2))")); } }
final List<RexNode> predList = RelOptUtil.conjunctions(RexUtil.toCnf(filter.getCluster().getRexBuilder(), condition));