somu-imply commented on code in PR #13934:
URL: https://github.com/apache/druid/pull/13934#discussion_r1140519020
##########
sql/src/test/java/org/apache/druid/sql/calcite/CalciteArraysQueryTest.java:
##########
@@ -3737,4 +3751,384 @@ public void testUnnestWithNotFiltersOnUnnestedColumn()
)
);
}
+
+ @Test
+ public void testUnnestWithSelectorFiltersOnSelectedColumn()
+ {
+ skipVectorize();
+ cannotVectorize();
+ testQuery(
+ "SELECT d3 FROM druid.numfoo, UNNEST(MV_TO_ARRAY(dim3)) as unnested
(d3) where d3='b'",
+ QUERY_CONTEXT_UNNEST,
+ ImmutableList.of(
+ Druids.newScanQueryBuilder()
+ .dataSource(UnnestDataSource.create(
+ new TableDataSource(CalciteTests.DATASOURCE3),
+ expressionVirtualColumn("j0.unnest", "\"dim3\"",
ColumnType.STRING),
+ selector("j0.unnest", "b", null)
+ ))
+ .intervals(querySegmentSpec(Filtration.eternity()))
+
.resultFormat(ScanQuery.ResultFormat.RESULT_FORMAT_COMPACTED_LIST)
+ .legacy(false)
+ .context(QUERY_CONTEXT_UNNEST)
+ .columns(ImmutableList.of("j0.unnest"))
+ .build()
+ ),
+ ImmutableList.of(
+ new Object[]{"b"},
+ new Object[]{"b"}
+ )
+ );
+ }
+
+ @Test
+ public void testUnnestWithSelectorFiltersOnVirtualColumn()
+ {
+ skipVectorize();
+ cannotVectorize();
+ testQuery(
+ "SELECT d12 FROM druid.numfoo, UNNEST(ARRAY[m1,m2]) as unnested (d12)
where d12=1",
+ QUERY_CONTEXT_UNNEST,
+ ImmutableList.of(
+ Druids.newScanQueryBuilder()
+ .dataSource(UnnestDataSource.create(
+ new TableDataSource(CalciteTests.DATASOURCE3),
+ expressionVirtualColumn("j0.unnest",
"array(\"m1\",\"m2\")", ColumnType.FLOAT_ARRAY),
+ selector("j0.unnest", "1", null)
+ ))
+ .intervals(querySegmentSpec(Filtration.eternity()))
+
.resultFormat(ScanQuery.ResultFormat.RESULT_FORMAT_COMPACTED_LIST)
+ .legacy(false)
+ .context(QUERY_CONTEXT_UNNEST)
+ .columns(ImmutableList.of("j0.unnest"))
+ .build()
+ ),
+ ImmutableList.of(
+ new Object[]{1.0f},
+ new Object[]{1.0f}
+ )
+ );
+ }
+
+ @Test
+ public void testUnnestWithSelectorFiltersOnVirtualStringColumn()
+ {
+ skipVectorize();
+ cannotVectorize();
+ testQuery(
+ "SELECT d45 FROM druid.numfoo, UNNEST(ARRAY[dim4,dim5]) as unnested
(d45) where d45 IN ('a','ab')",
+ QUERY_CONTEXT_UNNEST,
+ ImmutableList.of(
+ Druids.newScanQueryBuilder()
+ .dataSource(UnnestDataSource.create(
+ new TableDataSource(CalciteTests.DATASOURCE3),
+ expressionVirtualColumn("j0.unnest",
"array(\"dim4\",\"dim5\")", ColumnType.STRING_ARRAY),
+ new InDimFilter("j0.unnest", ImmutableSet.of("a", "ab"),
null)
+ ))
+ .intervals(querySegmentSpec(Filtration.eternity()))
+
.resultFormat(ScanQuery.ResultFormat.RESULT_FORMAT_COMPACTED_LIST)
+ .legacy(false)
+ .context(QUERY_CONTEXT_UNNEST)
+ .columns(ImmutableList.of("j0.unnest"))
+ .build()
+ ),
+ ImmutableList.of(
+ new Object[]{"a"},
+ new Object[]{"a"},
+ new Object[]{"ab"},
+ new Object[]{"a"},
+ new Object[]{"ab"}
+ )
+ );
+ }
+
+ @Test
+ public void testUnnestWithMultipleAndFiltersOnSelectedColumns()
+ {
+ skipVectorize();
+ cannotVectorize();
+ testQuery(
+ "SELECT d3 FROM druid.numfoo, UNNEST(MV_TO_ARRAY(dim3)) as unnested
(d3) where d3='b' and m1 < 10 and m2 < 10",
+ QUERY_CONTEXT_UNNEST,
+ ImmutableList.of(
+ Druids.newScanQueryBuilder()
+ .dataSource(UnnestDataSource.create(
+ new TableDataSource(CalciteTests.DATASOURCE3),
+ expressionVirtualColumn("j0.unnest", "\"dim3\"",
ColumnType.STRING),
+ selector("j0.unnest", "b", null)
+ ))
+ .intervals(querySegmentSpec(Filtration.eternity()))
+
.resultFormat(ScanQuery.ResultFormat.RESULT_FORMAT_COMPACTED_LIST)
+ .legacy(false)
+ .context(QUERY_CONTEXT_UNNEST)
+ .filters(
+ and(
+ bound("m1", null, "10", false, true, null,
StringComparators.NUMERIC),
+ bound("m2", null, "10", false, true, null,
StringComparators.NUMERIC)
+ )
+ )
+ .columns(ImmutableList.of("j0.unnest"))
+ .build()
+ ),
+ ImmutableList.of(
+ new Object[]{"b"},
+ new Object[]{"b"}
+ )
+ );
+ }
+
+ @Test
+ public void testUnnestWithMultipleOrFiltersOnSelectedColumns()
+ {
+ skipVectorize();
+ cannotVectorize();
+ testQuery(
+ "SELECT d3 FROM druid.numfoo, UNNEST(MV_TO_ARRAY(dim3)) as unnested
(d3) where d3='b' or m1 < 2 ",
+ QUERY_CONTEXT_UNNEST,
+ ImmutableList.of(
+ Druids.newScanQueryBuilder()
+ .dataSource(UnnestDataSource.create(
+ new TableDataSource(CalciteTests.DATASOURCE3),
+ expressionVirtualColumn("j0.unnest", "\"dim3\"",
ColumnType.STRING),
+ null
+ ))
+ .intervals(querySegmentSpec(Filtration.eternity()))
+
.resultFormat(ScanQuery.ResultFormat.RESULT_FORMAT_COMPACTED_LIST)
+ .legacy(false)
+ .context(QUERY_CONTEXT_UNNEST)
+ .filters(
+ or(
+ selector("j0.unnest", "b", null),
+ bound("m1", null, "2", false, true, null,
StringComparators.NUMERIC)
+ )
+ )
+ .columns(ImmutableList.of("j0.unnest"))
+ .build()
+ ),
+ ImmutableList.of(
+ new Object[]{"a"},
+ new Object[]{"b"},
+ new Object[]{"b"}
+ )
+ );
+ }
+
+ @Test
+ public void testUnnestWithMultipleAndFiltersOnSelectedUnnestedColumns()
+ {
+ skipVectorize();
+ cannotVectorize();
+ testQuery(
+ "SELECT d3 FROM druid.numfoo, UNNEST(MV_TO_ARRAY(dim3)) as unnested
(d3) where d3 IN ('a','b') and d3 < 'e' ",
+ QUERY_CONTEXT_UNNEST,
+ ImmutableList.of(
+ Druids.newScanQueryBuilder()
+ .dataSource(UnnestDataSource.create(
+ new TableDataSource(CalciteTests.DATASOURCE3),
+ expressionVirtualColumn("j0.unnest", "\"dim3\"",
ColumnType.STRING),
+ and(
+ new InDimFilter("j0.unnest", ImmutableSet.of("a",
"b"), null),
+ bound("j0.unnest", null, "e", false, true, null,
StringComparators.LEXICOGRAPHIC)
+ )
+ ))
+ .intervals(querySegmentSpec(Filtration.eternity()))
+
.resultFormat(ScanQuery.ResultFormat.RESULT_FORMAT_COMPACTED_LIST)
+ .legacy(false)
+ .context(QUERY_CONTEXT_UNNEST)
+ .columns(ImmutableList.of("j0.unnest"))
+ .build()
+ ),
+ ImmutableList.of(
+ new Object[]{"a"},
+ new Object[]{"b"},
+ new Object[]{"b"}
+ )
+ );
+ }
+
+ @Test
+ public void testUnnestWithMultipleOrFiltersOnUnnestedColumns()
+ {
+ skipVectorize();
+ cannotVectorize();
+ testQuery(
+ "SELECT d3 FROM druid.numfoo, UNNEST(MV_TO_ARRAY(dim3)) as unnested
(d3) where d3='b' or d3='d' ",
+ QUERY_CONTEXT_UNNEST,
+ ImmutableList.of(
+ Druids.newScanQueryBuilder()
+ .dataSource(UnnestDataSource.create(
+ new TableDataSource(CalciteTests.DATASOURCE3),
+ expressionVirtualColumn("j0.unnest", "\"dim3\"",
ColumnType.STRING),
+ new InDimFilter("j0.unnest", ImmutableSet.of("b", "d"),
null)
+ ))
+ .intervals(querySegmentSpec(Filtration.eternity()))
+
.resultFormat(ScanQuery.ResultFormat.RESULT_FORMAT_COMPACTED_LIST)
+ .legacy(false)
+ .context(QUERY_CONTEXT_UNNEST)
+ .columns(ImmutableList.of("j0.unnest"))
+ .build()
+ ),
+ ImmutableList.of(
+ new Object[]{"b"},
+ new Object[]{"b"},
+ new Object[]{"d"}
+ )
+ );
+ }
+
+ @Test
+ public void testUnnestWithMultipleOrFiltersOnVariationsOfUnnestedColumns()
+ {
+ skipVectorize();
+ cannotVectorize();
+ testQuery(
+ "SELECT d3 FROM druid.numfoo, UNNEST(MV_TO_ARRAY(dim3)) as unnested
(d3) where strlen(d3) < 2 or d3='d' ",
+ QUERY_CONTEXT_UNNEST,
+ ImmutableList.of(
+ Druids.newScanQueryBuilder()
+ .dataSource(UnnestDataSource.create(
+ new TableDataSource(CalciteTests.DATASOURCE3),
+ expressionVirtualColumn("j0.unnest", "\"dim3\"",
ColumnType.STRING),
+ or(
+ new ExpressionDimFilter("(strlen(\"j0.unnest\") <
2)", TestExprMacroTable.INSTANCE),
+ selector("j0.unnest", "d", null)
+ )
+ ))
+ .intervals(querySegmentSpec(Filtration.eternity()))
+
.resultFormat(ScanQuery.ResultFormat.RESULT_FORMAT_COMPACTED_LIST)
+ .legacy(false)
+ .context(QUERY_CONTEXT_UNNEST)
+ .columns(ImmutableList.of("j0.unnest"))
+ .build()
+ ),
+ useDefault ?
+ ImmutableList.of(
+ new Object[]{"a"},
+ new Object[]{"b"},
+ new Object[]{"b"},
+ new Object[]{"c"},
+ new Object[]{"d"},
+ new Object[]{""},
+ new Object[]{""},
+ new Object[]{""}
+ ) :
+ ImmutableList.of(
+ new Object[]{"a"},
+ new Object[]{"b"},
+ new Object[]{"b"},
+ new Object[]{"c"},
+ new Object[]{"d"},
+ new Object[]{""}
+ )
+ );
+ }
+
+ @Test
+ public void testUnnestWithMultipleOrFiltersOnSelectedNonUnnestedColumns()
+ {
+ skipVectorize();
+ cannotVectorize();
+ testQuery(
+ "SELECT d3 FROM druid.numfoo, UNNEST(MV_TO_ARRAY(dim3)) as unnested
(d3) where m1 < 2 or m2 < 2 ",
+ QUERY_CONTEXT_UNNEST,
+ ImmutableList.of(
+ Druids.newScanQueryBuilder()
+ .dataSource(UnnestDataSource.create(
+ new TableDataSource(CalciteTests.DATASOURCE3),
+ expressionVirtualColumn("j0.unnest", "\"dim3\"",
ColumnType.STRING),
+ null
+ ))
+ .intervals(querySegmentSpec(Filtration.eternity()))
+
.resultFormat(ScanQuery.ResultFormat.RESULT_FORMAT_COMPACTED_LIST)
+ .legacy(false)
+ .context(QUERY_CONTEXT_UNNEST)
+ .filters(
+ or(
+ bound("m1", null, "2", false, true, null,
StringComparators.NUMERIC),
+ bound("m2", null, "2", false, true, null,
StringComparators.NUMERIC)
+ )
+ )
+ .columns(ImmutableList.of("j0.unnest"))
+ .build()
+ ),
+ ImmutableList.of(
+ new Object[]{"a"},
+ new Object[]{"b"}
+ )
+ );
+ }
+
+ @Test
+ public void testUnnestWithMultipleOrFiltersOnSelectedVirtualColumns()
+ {
+ skipVectorize();
+ cannotVectorize();
+ testQuery(
+ "SELECT d45 FROM druid.numfoo, UNNEST(ARRAY[dim4,dim5]) as unnested
(d45) where d45 IN ('a','aa') or m1 < 2 ",
+ QUERY_CONTEXT_UNNEST,
+ ImmutableList.of(
+ Druids.newScanQueryBuilder()
+ .dataSource(UnnestDataSource.create(
+ new TableDataSource(CalciteTests.DATASOURCE3),
+ expressionVirtualColumn("j0.unnest",
"array(\"dim4\",\"dim5\")", ColumnType.STRING_ARRAY),
+ null
+ ))
+ .intervals(querySegmentSpec(Filtration.eternity()))
+
.resultFormat(ScanQuery.ResultFormat.RESULT_FORMAT_COMPACTED_LIST)
+ .legacy(false)
+ .context(QUERY_CONTEXT_UNNEST)
+ .filters(
+ or(
+ bound("m1", null, "2", false, true, null,
StringComparators.NUMERIC),
+ new InDimFilter("j0.unnest", ImmutableSet.of("a",
"aa"), null)
+ )
+ )
+ .columns(ImmutableList.of("j0.unnest"))
+ .build()
+ ),
+ ImmutableList.of(
+ new Object[]{"a"},
+ new Object[]{"aa"},
+ new Object[]{"a"},
+ new Object[]{"a"},
+ new Object[]{"aa"}
+ )
+ );
+ }
+
+ @Test
+ public void
testUnnestWithMultipleOrFiltersOnUnnestedColumnsAndOnOriginalColumn()
+ {
+ skipVectorize();
+ cannotVectorize();
+ testQuery(
+ "SELECT d3 FROM druid.numfoo, UNNEST(MV_TO_ARRAY(dim3)) as unnested
(d3) where d3='b' or dim3='d' ",
+ QUERY_CONTEXT_UNNEST,
+ ImmutableList.of(
+ Druids.newScanQueryBuilder()
+ .dataSource(UnnestDataSource.create(
+ new TableDataSource(CalciteTests.DATASOURCE3),
+ expressionVirtualColumn("j0.unnest", "\"dim3\"",
ColumnType.STRING),
+ null
+ ))
+ .intervals(querySegmentSpec(Filtration.eternity()))
+
.resultFormat(ScanQuery.ResultFormat.RESULT_FORMAT_COMPACTED_LIST)
+ .filters(
+ or(
+ selector("j0.unnest", "b", null),
+ selector("dim3", "d", null)
+ )
+ )
+ .legacy(false)
+ .context(QUERY_CONTEXT_UNNEST)
+ .columns(ImmutableList.of("j0.unnest"))
+ .build()
+ ),
+ ImmutableList.of(
+ new Object[]{"b"},
+ new Object[]{"b"},
+ new Object[]{"d"}
+ )
+ );
+ }
Review Comment:
Added :)
--
This is an automated message from the Apache Git Service.
To respond to the message, please log on to GitHub and use the
URL above to go to the specific comment.
To unsubscribe, e-mail: [email protected]
For queries about this service, please contact Infrastructure at:
[email protected]
---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]