use of org.apache.calcite.rex.RexLiteral in project calcite by apache.
the class RexProgramTest method testCnf2.
/**
* Unit test for
* <a href="https://issues.apache.org/jira/browse/CALCITE-394">[CALCITE-394]
* Add RexUtil.toCnf, to convert expressions to conjunctive normal form
* (CNF)</a>.
*/
@Test
public void testCnf2() {
final RelDataType intType = typeFactory.createSqlType(SqlTypeName.INTEGER);
final RelDataType rowType = typeFactory.builder().add("x", intType).add("y", intType).add("z", intType).add("a", intType).add("b", intType).build();
final RexDynamicParam range = rexBuilder.makeDynamicParam(rowType, 0);
final RexNode xRef = rexBuilder.makeFieldAccess(range, 0);
final RexNode yRef = rexBuilder.makeFieldAccess(range, 1);
final RexNode zRef = rexBuilder.makeFieldAccess(range, 2);
final RexNode aRef = rexBuilder.makeFieldAccess(range, 3);
final RexNode bRef = rexBuilder.makeFieldAccess(range, 4);
final RexLiteral literal1 = rexBuilder.makeExactLiteral(BigDecimal.valueOf(1));
final RexLiteral literal2 = rexBuilder.makeExactLiteral(BigDecimal.valueOf(2));
final RexLiteral literal3 = rexBuilder.makeExactLiteral(BigDecimal.valueOf(3));
checkCnf(or(and(eq(xRef, literal1), eq(yRef, literal1), eq(zRef, literal1)), and(eq(xRef, literal2), eq(yRef, literal2), eq(aRef, literal2)), and(eq(xRef, literal3), eq(aRef, literal3), eq(bRef, literal3))), "AND(" + "OR(=(?0.x, 1), =(?0.x, 2), =(?0.x, 3)), " + "OR(=(?0.x, 1), =(?0.x, 2), =(?0.a, 3)), " + "OR(=(?0.x, 1), =(?0.x, 2), =(?0.b, 3)), " + "OR(=(?0.x, 1), =(?0.y, 2), =(?0.x, 3)), " + "OR(=(?0.x, 1), =(?0.y, 2), =(?0.a, 3)), " + "OR(=(?0.x, 1), =(?0.y, 2), =(?0.b, 3)), " + "OR(=(?0.x, 1), =(?0.a, 2), =(?0.x, 3)), " + "OR(=(?0.x, 1), =(?0.a, 2), =(?0.a, 3)), " + "OR(=(?0.x, 1), =(?0.a, 2), =(?0.b, 3)), " + "OR(=(?0.y, 1), =(?0.x, 2), =(?0.x, 3)), " + "OR(=(?0.y, 1), =(?0.x, 2), =(?0.a, 3)), " + "OR(=(?0.y, 1), =(?0.x, 2), =(?0.b, 3)), " + "OR(=(?0.y, 1), =(?0.y, 2), =(?0.x, 3)), " + "OR(=(?0.y, 1), =(?0.y, 2), =(?0.a, 3)), " + "OR(=(?0.y, 1), =(?0.y, 2), =(?0.b, 3)), " + "OR(=(?0.y, 1), =(?0.a, 2), =(?0.x, 3)), " + "OR(=(?0.y, 1), =(?0.a, 2), =(?0.a, 3)), " + "OR(=(?0.y, 1), =(?0.a, 2), =(?0.b, 3)), " + "OR(=(?0.z, 1), =(?0.x, 2), =(?0.x, 3)), " + "OR(=(?0.z, 1), =(?0.x, 2), =(?0.a, 3)), " + "OR(=(?0.z, 1), =(?0.x, 2), =(?0.b, 3)), " + "OR(=(?0.z, 1), =(?0.y, 2), =(?0.x, 3)), " + "OR(=(?0.z, 1), =(?0.y, 2), =(?0.a, 3)), " + "OR(=(?0.z, 1), =(?0.y, 2), =(?0.b, 3)), " + "OR(=(?0.z, 1), =(?0.a, 2), =(?0.x, 3)), " + "OR(=(?0.z, 1), =(?0.a, 2), =(?0.a, 3)), " + "OR(=(?0.z, 1), =(?0.a, 2), =(?0.b, 3)))");
}
use of org.apache.calcite.rex.RexLiteral in project calcite by apache.
the class RexProgramTest method testPullFactors.
/**
* Unit test for {@link org.apache.calcite.rex.RexUtil#pullFactors}.
*/
@Test
public void testPullFactors() {
final RelDataType booleanType = typeFactory.createSqlType(SqlTypeName.BOOLEAN);
final RelDataType intType = typeFactory.createSqlType(SqlTypeName.INTEGER);
final RelDataType rowType = typeFactory.builder().add("a", booleanType).add("b", booleanType).add("c", booleanType).add("d", booleanType).add("e", booleanType).add("f", booleanType).add("g", booleanType).add("h", intType).build();
final RexDynamicParam range = rexBuilder.makeDynamicParam(rowType, 0);
final RexNode aRef = rexBuilder.makeFieldAccess(range, 0);
final RexNode bRef = rexBuilder.makeFieldAccess(range, 1);
final RexNode cRef = rexBuilder.makeFieldAccess(range, 2);
final RexNode dRef = rexBuilder.makeFieldAccess(range, 3);
final RexNode eRef = rexBuilder.makeFieldAccess(range, 4);
final RexNode fRef = rexBuilder.makeFieldAccess(range, 5);
final RexNode gRef = rexBuilder.makeFieldAccess(range, 6);
final RexNode hRef = rexBuilder.makeFieldAccess(range, 7);
final RexLiteral sevenLiteral = rexBuilder.makeExactLiteral(BigDecimal.valueOf(7));
final RexNode hEqSeven = eq(hRef, sevenLiteral);
// Most of the expressions in testCnf are unaffected by pullFactors.
checkPullFactors(or(and(aRef, bRef), and(cRef, aRef, dRef, aRef)), "AND(?0.a, OR(?0.b, AND(?0.c, ?0.d)))");
checkPullFactors(aRef, "?0.a");
checkPullFactors(trueLiteral, "true");
checkPullFactors(falseLiteral, "false");
checkPullFactors(unknownLiteral, "null");
checkPullFactors(and(aRef, bRef), "AND(?0.a, ?0.b)");
checkPullFactors(and(aRef, bRef, cRef), "AND(?0.a, ?0.b, ?0.c)");
checkPullFactorsUnchanged(and(or(aRef, bRef), or(cRef, dRef)));
checkPullFactorsUnchanged(or(and(aRef, bRef), and(cRef, dRef)));
// Input has nested ORs, output ORs are flat; different from CNF
checkPullFactors(or(and(aRef, bRef), or(cRef, dRef)), "OR(AND(?0.a, ?0.b), ?0.c, ?0.d)");
checkPullFactorsUnchanged(or(aRef, not(and(bRef, not(hEqSeven)))));
checkPullFactorsUnchanged(not(or(aRef, not(bRef))));
checkPullFactorsUnchanged(not(or(and(aRef, trueLiteral), not(bRef), falseLiteral)));
checkPullFactorsUnchanged(and(aRef, or(bRef, and(cRef, dRef))));
checkPullFactorsUnchanged(and(aRef, or(bRef, and(cRef, or(dRef, and(eRef, or(fRef, gRef)))))));
checkPullFactorsUnchanged(and(aRef, or(bRef, and(cRef, or(dRef, and(eRef, or(fRef, and(gRef, or(trueLiteral, falseLiteral)))))))));
}
use of org.apache.calcite.rex.RexLiteral in project calcite by apache.
the class RexProgramTest method testSimplifyCastLiteral2.
@Test
public void testSimplifyCastLiteral2() {
final RexLiteral literalAbc = rexBuilder.makeLiteral("abc");
final RexLiteral literalOne = rexBuilder.makeExactLiteral(BigDecimal.ONE);
final RelDataType intType = typeFactory.createSqlType(SqlTypeName.INTEGER);
final RelDataType varcharType = typeFactory.createSqlType(SqlTypeName.VARCHAR, 10);
final RelDataType booleanType = typeFactory.createSqlType(SqlTypeName.BOOLEAN);
final RelDataType dateType = typeFactory.createSqlType(SqlTypeName.DATE);
final RelDataType timestampType = typeFactory.createSqlType(SqlTypeName.TIMESTAMP);
checkSimplifyUnchanged(cast(literalAbc, intType));
checkSimplify(cast(literalOne, intType), "1");
checkSimplify(cast(literalAbc, varcharType), "'abc'");
checkSimplify(cast(literalOne, varcharType), "'1'");
checkSimplifyUnchanged(cast(literalAbc, booleanType));
checkSimplify(cast(literalOne, booleanType), // different from Hive
"false");
checkSimplifyUnchanged(cast(literalAbc, dateType));
checkSimplify(cast(literalOne, dateType), // different from Hive
"1970-01-02");
checkSimplifyUnchanged(cast(literalAbc, timestampType));
checkSimplify(cast(literalOne, timestampType), // different from Hive
"1970-01-01 00:00:00");
}
use of org.apache.calcite.rex.RexLiteral in project calcite by apache.
the class RexProgramTest method testSimplifyIsNotNull.
@Test
public void testSimplifyIsNotNull() {
RelDataType intType = typeFactory.createTypeWithNullability(typeFactory.createSqlType(SqlTypeName.INTEGER), false);
RelDataType intNullableType = typeFactory.createTypeWithNullability(typeFactory.createSqlType(SqlTypeName.INTEGER), true);
final RexInputRef i0 = rexBuilder.makeInputRef(intNullableType, 0);
final RexInputRef i1 = rexBuilder.makeInputRef(intNullableType, 1);
final RexInputRef i2 = rexBuilder.makeInputRef(intType, 2);
final RexInputRef i3 = rexBuilder.makeInputRef(intType, 3);
final RexLiteral one = rexBuilder.makeExactLiteral(BigDecimal.ONE);
final RexLiteral null_ = rexBuilder.makeNullLiteral(intType);
checkSimplify(isNotNull(lt(i0, i1)), "AND(IS NOT NULL($0), IS NOT NULL($1))");
checkSimplify(isNotNull(lt(i0, i2)), "IS NOT NULL($0)");
checkSimplify(isNotNull(lt(i2, i3)), "true");
checkSimplify(isNotNull(lt(i0, one)), "IS NOT NULL($0)");
checkSimplify(isNotNull(lt(i0, null_)), "false");
}
use of org.apache.calcite.rex.RexLiteral in project calcite by apache.
the class RexProgramTest method testSimplifyCastLiteral.
@Test
public void testSimplifyCastLiteral() {
final List<RexLiteral> literals = new ArrayList<>();
literals.add(rexBuilder.makeExactLiteral(BigDecimal.ONE, typeFactory.createSqlType(SqlTypeName.INTEGER)));
literals.add(rexBuilder.makeExactLiteral(BigDecimal.valueOf(2), typeFactory.createSqlType(SqlTypeName.BIGINT)));
literals.add(rexBuilder.makeExactLiteral(BigDecimal.valueOf(3), typeFactory.createSqlType(SqlTypeName.SMALLINT)));
literals.add(rexBuilder.makeExactLiteral(BigDecimal.valueOf(4), typeFactory.createSqlType(SqlTypeName.TINYINT)));
literals.add(rexBuilder.makeExactLiteral(new BigDecimal("1234"), typeFactory.createSqlType(SqlTypeName.DECIMAL, 4, 0)));
literals.add(rexBuilder.makeExactLiteral(new BigDecimal("123.45"), typeFactory.createSqlType(SqlTypeName.DECIMAL, 5, 2)));
literals.add(rexBuilder.makeApproxLiteral(new BigDecimal("3.1415"), typeFactory.createSqlType(SqlTypeName.REAL)));
literals.add(rexBuilder.makeApproxLiteral(BigDecimal.valueOf(Math.E), typeFactory.createSqlType(SqlTypeName.FLOAT)));
literals.add(rexBuilder.makeApproxLiteral(BigDecimal.valueOf(Math.PI), typeFactory.createSqlType(SqlTypeName.DOUBLE)));
literals.add(rexBuilder.makeLiteral(true));
literals.add(rexBuilder.makeLiteral(false));
literals.add(rexBuilder.makeLiteral("hello world"));
literals.add(rexBuilder.makeLiteral("1969-07-20 12:34:56"));
literals.add(rexBuilder.makeLiteral("1969-07-20"));
literals.add(rexBuilder.makeLiteral("12:34:45"));
literals.add((RexLiteral) rexBuilder.makeLiteral(new ByteString(new byte[] { 1, 2, -34, 0, -128 }), typeFactory.createSqlType(SqlTypeName.BINARY, 5), false));
literals.add(rexBuilder.makeDateLiteral(new DateString(1974, 8, 9)));
literals.add(rexBuilder.makeTimeLiteral(new TimeString(1, 23, 45), 0));
literals.add(rexBuilder.makeTimestampLiteral(new TimestampString(1974, 8, 9, 1, 23, 45), 0));
final Multimap<SqlTypeName, RexLiteral> map = LinkedHashMultimap.create();
for (RexLiteral literal : literals) {
map.put(literal.getTypeName(), literal);
}
final List<RelDataType> types = new ArrayList<>();
types.add(typeFactory.createSqlType(SqlTypeName.INTEGER));
types.add(typeFactory.createSqlType(SqlTypeName.BIGINT));
types.add(typeFactory.createSqlType(SqlTypeName.SMALLINT));
types.add(typeFactory.createSqlType(SqlTypeName.TINYINT));
types.add(typeFactory.createSqlType(SqlTypeName.REAL));
types.add(typeFactory.createSqlType(SqlTypeName.FLOAT));
types.add(typeFactory.createSqlType(SqlTypeName.DOUBLE));
types.add(typeFactory.createSqlType(SqlTypeName.BOOLEAN));
types.add(typeFactory.createSqlType(SqlTypeName.VARCHAR, 10));
types.add(typeFactory.createSqlType(SqlTypeName.CHAR, 5));
types.add(typeFactory.createSqlType(SqlTypeName.VARBINARY, 60));
types.add(typeFactory.createSqlType(SqlTypeName.BINARY, 3));
types.add(typeFactory.createSqlType(SqlTypeName.TIMESTAMP));
types.add(typeFactory.createSqlType(SqlTypeName.TIME));
types.add(typeFactory.createSqlType(SqlTypeName.DATE));
for (RelDataType fromType : types) {
for (RelDataType toType : types) {
if (SqlTypeAssignmentRules.instance(false).canCastFrom(toType.getSqlTypeName(), fromType.getSqlTypeName())) {
for (RexLiteral literal : map.get(fromType.getSqlTypeName())) {
final RexNode cast = rexBuilder.makeCast(toType, literal);
if (cast instanceof RexLiteral) {
assertThat(cast.getType(), is(toType));
// makeCast already simplified
continue;
}
final RexNode simplified = simplify.simplify(cast);
boolean expectedSimplify = literal.getTypeName() != toType.getSqlTypeName() || (literal.getTypeName() == SqlTypeName.CHAR && ((NlsString) literal.getValue()).getValue().length() > toType.getPrecision()) || (literal.getTypeName() == SqlTypeName.BINARY && ((ByteString) literal.getValue()).length() > toType.getPrecision());
boolean couldSimplify = !cast.equals(simplified);
final String reason = (expectedSimplify ? "expected to simplify, but could not: " : "simplified, but did not expect to: ") + cast + " --> " + simplified;
assertThat(reason, couldSimplify, is(expectedSimplify));
}
}
}
}
}
Aggregations