From 55cd8d291ac6c1f7a4891810a755b13ae068493d Mon Sep 17 00:00:00 2001 From: Alessandro Solimando Date: Fri, 21 Jan 2022 12:01:36 +0100 Subject: [PATCH] saving --- .../org/apache/calcite/rex/RexSimplify.java | 1 + .../apache/calcite/rex/RexProgramTest.java | 34 +++++++++++++++++++ 2 files changed, 35 insertions(+) diff --git a/core/src/main/java/org/apache/calcite/rex/RexSimplify.java b/core/src/main/java/org/apache/calcite/rex/RexSimplify.java index 96338ab29c3..0009be36fc5 100644 --- a/core/src/main/java/org/apache/calcite/rex/RexSimplify.java +++ b/core/src/main/java/org/apache/calcite/rex/RexSimplify.java @@ -1956,6 +1956,7 @@ private void ensureParanoidOff() { * Modifies the list in place. */ private RexNode simplifyOrs(List terms, RexUnknownAs unknownAs) { final SargCollector sargCollector = new SargCollector(rexBuilder, false); + simplifyList(terms, unknownAs); final List newTerms = new ArrayList<>(); terms.forEach(t -> sargCollector.accept(t, newTerms)); if (sargCollector.needToFix()) { diff --git a/core/src/test/java/org/apache/calcite/rex/RexProgramTest.java b/core/src/test/java/org/apache/calcite/rex/RexProgramTest.java index 9edb64a0dfc..78874d0f427 100644 --- a/core/src/test/java/org/apache/calcite/rex/RexProgramTest.java +++ b/core/src/test/java/org/apache/calcite/rex/RexProgramTest.java @@ -1857,6 +1857,40 @@ private void checkExponentialCnf(int n) { "IS NOT NULL(?0.int0)"); } + @Test void testHPLO() { + checkSimplify( + and(literal(true), + or(eq(vInt(), literal(1)), + eq(vInt(), literal(2)), + eq(vInt(), literal(3))), + or(and(literal(true), + eq(vInt(), literal(1)), + ge(vIntNotNull(), literal(10))), + and(literal(true), + eq(vInt(), literal(2)), + ge(vIntNotNull(), literal(10)))), + and(ge(vIntNotNull(), literal(10)), le(vIntNotNull(), literal(20)))), + "AND(AND(?0.notNullInt0>=10,?0.notNullInt0=<=20),OR(?0.int0=1, ?0.int0=2)"); + } + + @Test void testHPLO2() { + checkSimplify( + and(or(and(eq(vInt(), literal(1)), + gt(vIntNotNull(), literal(10))), + and(eq(vInt(), literal(2)), + gt(vIntNotNull(), literal(10)))), + and(ge(vIntNotNull(), literal(10)), le(vIntNotNull(), literal(20)))), + "AND(SEARCH(?0.int0, Sarg[1, 2]), SEARCH(?0.notNullInt0, Sarg[[10..20]]))"); + } + + @Test void testHPLO3() { + checkSimplify( + and(or(eq(vInt(), literal(1)), + eq(vInt(), literal(2))), + and(ge(vIntNotNull(), literal(10)), le(vIntNotNull(), literal(20)))), + "AND(SEARCH(?0.int0, Sarg[1, 2]), SEARCH(?0.notNullInt0, Sarg[[10..20]]))"); + } + @Test void testSimplifyUnknown() { final RelDataType intType = typeFactory.createSqlType(SqlTypeName.INTEGER); final RelDataType rowType = typeFactory.builder()