This is an automated email from the ASF dual-hosted git repository.
gian pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/druid.git
The following commit(s) were added to refs/heads/master by this push:
new ee77fa7fb3c Add tests for CASE decomposition. (#15639)
ee77fa7fb3c is described below
commit ee77fa7fb3ca58c6550be7304f53b9c2bf545232
Author: Gian Merlino <[email protected]>
AuthorDate: Wed Jan 10 13:24:24 2024 -0800
Add tests for CASE decomposition. (#15639)
I was looking into adding a rule to do this, and found that it was already
happening as part of Calcite's RexSimplify. So this patch simply adds some
tests to ensure that it continues to happen.
---
.../apache/druid/sql/calcite/CalciteQueryTest.java | 82 ++++++++++++++++++++++
1 file changed, 82 insertions(+)
diff --git
a/sql/src/test/java/org/apache/druid/sql/calcite/CalciteQueryTest.java
b/sql/src/test/java/org/apache/druid/sql/calcite/CalciteQueryTest.java
index b0e607b61a0..2f795f54ed7 100644
--- a/sql/src/test/java/org/apache/druid/sql/calcite/CalciteQueryTest.java
+++ b/sql/src/test/java/org/apache/druid/sql/calcite/CalciteQueryTest.java
@@ -3209,6 +3209,88 @@ public class CalciteQueryTest extends
BaseCalciteQueryTest
);
}
+ @Test
+ public void testDecomposeCaseWhenThreeArg()
+ {
+ // Cannot vectorize due to virtual columns.
+ cannotVectorize();
+
+ testQuery(
+ "SELECT\n"
+ + " dim1, dim2, CASE WHEN dim1 = 'abc' THEN dim1 ELSE dim2 END\n"
+ + "FROM druid.foo\n"
+ + "WHERE\n"
+ + " CASE WHEN dim1 = 'abc' THEN dim1 ELSE dim2 END = 'abc'",
+ ImmutableList.of(
+ newScanQueryBuilder()
+ .dataSource(CalciteTests.DATASOURCE1)
+ .virtualColumns(
+ expressionVirtualColumn(
+ "v0",
+ "case_searched((\"dim1\" == 'abc'),\"dim1\",\"dim2\")",
+ ColumnType.STRING
+ )
+ )
+ .intervals(querySegmentSpec(Filtration.eternity()))
+ .filters(
+ or(
+ equality("dim1", "abc", ColumnType.STRING),
+ and(
+ equality("dim2", "abc", ColumnType.STRING),
+ NullHandling.sqlCompatible()
+ ? not(istrue(equality("dim1", "abc",
ColumnType.STRING)))
+ : not(equality("dim1", "abc", ColumnType.STRING))
+ )
+ )
+ )
+ .columns("dim1", "dim2", "v0")
+ .build()
+ ),
+ ImmutableList.of(
+ new Object[]{"def", "abc", "abc"},
+ new Object[]{"abc", NullHandling.defaultStringValue(), "abc"}
+ )
+ );
+ }
+
+ @Test
+ public void testDecomposeCaseWhenTwoArg()
+ {
+ // Cannot vectorize due to virtual columns.
+ cannotVectorize();
+
+ testQuery(
+ "SELECT\n"
+ + " dim1, dim2, CASE WHEN dim1 = 'def' THEN dim2 END\n"
+ + "FROM druid.foo\n"
+ + "WHERE\n"
+ + " CASE WHEN dim1 = 'def' THEN dim2 END = 'abc'",
+ ImmutableList.of(
+ newScanQueryBuilder()
+ .dataSource(CalciteTests.DATASOURCE1)
+ .virtualColumns(
+ expressionVirtualColumn(
+ "v0",
+ "case_searched((\"dim1\" == 'def'),\"dim2\",null)",
+ ColumnType.STRING
+ )
+ )
+ .intervals(querySegmentSpec(Filtration.eternity()))
+ .filters(
+ and(
+ equality("dim1", "def", ColumnType.STRING),
+ equality("dim2", "abc", ColumnType.STRING)
+ )
+ )
+ .columns("dim1", "dim2", "v0")
+ .build()
+ ),
+ ImmutableList.of(
+ new Object[]{"def", "abc", "abc"}
+ )
+ );
+ }
+
@Test
public void testGroupByCaseWhenOfTripleAnd()
{
---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]