This is an automated email from the ASF dual-hosted git repository.

cwylie pushed a commit to branch 26.0.0
in repository https://gitbox.apache.org/repos/asf/druid.git


The following commit(s) were added to refs/heads/26.0.0 by this push:
     new 6d59d3cc38 Updating segment map function for QueryDataSource to ensure 
group by … (#14112) (#14134)
6d59d3cc38 is described below

commit 6d59d3cc382bc05a7753b0ca0378a10d7f57825b
Author: Clint Wylie <[email protected]>
AuthorDate: Fri Apr 21 11:58:23 2023 -0700

    Updating segment map function for QueryDataSource to ensure group by … 
(#14112) (#14134)
    
    * Updating segment map function for QueryDataSource to ensure group by of 
group by of join data source gets into proper segment map function path
    
    * Adding unit tests for the failed case
    
    * There you go coverage bot, be happy now
    
    Co-authored-by: Soumyava <[email protected]>
---
 .../org/apache/druid/query/QueryDataSource.java    |  3 +-
 .../apache/druid/query/QueryDataSourceTest.java    | 32 +++++++++
 .../druid/sql/calcite/CalciteJoinQueryTest.java    | 84 ++++++++++++++++++++++
 3 files changed, 118 insertions(+), 1 deletion(-)

diff --git 
a/processing/src/main/java/org/apache/druid/query/QueryDataSource.java 
b/processing/src/main/java/org/apache/druid/query/QueryDataSource.java
index f21e3bf1ac..3d889472ea 100644
--- a/processing/src/main/java/org/apache/druid/query/QueryDataSource.java
+++ b/processing/src/main/java/org/apache/druid/query/QueryDataSource.java
@@ -98,7 +98,8 @@ public class QueryDataSource implements DataSource
       AtomicLong cpuTime
   )
   {
-    return Function.identity();
+    final Query<?> subQuery = this.getQuery();
+    return subQuery.getDataSource().createSegmentMapFunction(subQuery, 
cpuTime);
   }
 
   @Override
diff --git 
a/processing/src/test/java/org/apache/druid/query/QueryDataSourceTest.java 
b/processing/src/test/java/org/apache/druid/query/QueryDataSourceTest.java
index d40c969f64..96d8ddd05a 100644
--- a/processing/src/test/java/org/apache/druid/query/QueryDataSourceTest.java
+++ b/processing/src/test/java/org/apache/druid/query/QueryDataSourceTest.java
@@ -22,7 +22,9 @@ package org.apache.druid.query;
 import com.fasterxml.jackson.databind.ObjectMapper;
 import nl.jqno.equalsverifier.EqualsVerifier;
 import org.apache.druid.java.util.common.granularity.Granularities;
+import org.apache.druid.query.groupby.GroupByQuery;
 import org.apache.druid.query.timeseries.TimeseriesQuery;
+import org.apache.druid.segment.SegmentReference;
 import org.apache.druid.segment.TestHelper;
 import org.junit.Assert;
 import org.junit.Rule;
@@ -30,6 +32,8 @@ import org.junit.Test;
 import org.junit.rules.ExpectedException;
 
 import java.util.Collections;
+import java.util.concurrent.atomic.AtomicLong;
+import java.util.function.Function;
 
 public class QueryDataSourceTest
 {
@@ -50,9 +54,19 @@ public class QueryDataSourceTest
             .granularity(Granularities.ALL)
             .build();
 
+
+
   private final QueryDataSource queryOnTableDataSource = new 
QueryDataSource(queryOnTable);
   private final QueryDataSource queryOnLookupDataSource = new 
QueryDataSource(queryOnLookup);
 
+  private final GroupByQuery groupByQuery = new GroupByQuery.Builder()
+      .setDataSource(queryOnTableDataSource)
+      .setGranularity(Granularities.ALL)
+      .setInterval("2000/3000")
+      .build();
+
+  private final QueryDataSource queryDataSource = new 
QueryDataSource(groupByQuery);
+
   @Test
   public void test_getTableNames_table()
   {
@@ -155,4 +169,22 @@ public class QueryDataSourceTest
 
     Assert.assertEquals(queryOnTableDataSource, deserialized);
   }
+
+  @Test
+  public void test_withSegmentMapFunction()
+  {
+    Function<SegmentReference, SegmentReference> parentsegmentMapFunction = 
queryDataSource.createSegmentMapFunction(
+        groupByQuery,
+        new AtomicLong()
+    );
+
+    Function<SegmentReference, SegmentReference> childsegmentMapFunction = 
queryOnTableDataSource.createSegmentMapFunction(
+        groupByQuery,
+        new AtomicLong()
+    );
+    // The segment functions should both be identity functions and equal
+    Assert.assertEquals(parentsegmentMapFunction, childsegmentMapFunction);
+  }
+
+  
 }
diff --git 
a/sql/src/test/java/org/apache/druid/sql/calcite/CalciteJoinQueryTest.java 
b/sql/src/test/java/org/apache/druid/sql/calcite/CalciteJoinQueryTest.java
index be65a64e80..9b53d150bf 100644
--- a/sql/src/test/java/org/apache/druid/sql/calcite/CalciteJoinQueryTest.java
+++ b/sql/src/test/java/org/apache/druid/sql/calcite/CalciteJoinQueryTest.java
@@ -3143,6 +3143,90 @@ public class CalciteJoinQueryTest extends 
BaseCalciteQueryTest
     );
   }
 
+  @Test
+  @Parameters(source = QueryContextForJoinProvider.class)
+  public void 
testGroupByOverGroupByOverInnerJoinOnTwoInlineDataSources(Map<String, Object> 
queryContext)
+  {
+    skipVectorize();
+    cannotVectorize();
+    testQuery(
+        "with abc as\n"
+        + "(\n"
+        + "  SELECT dim1, \"__time\", m1 from foo WHERE \"dim1\" = '10.1'\n"
+        + ")\n"
+        + "SELECT dim1 from (SELECT dim1,__time FROM (SELECT t1.dim1, 
t1.\"__time\" from abc as t1 INNER JOIN abc as t2 on t1.dim1 = t2.dim1) GROUP 
BY 1,2) GROUP BY dim1\n",
+        queryContext,
+        ImmutableList.of(
+            new GroupByQuery.Builder()
+                .setDataSource(
+                    new QueryDataSource(
+                        GroupByQuery.builder()
+                                    .setDataSource(
+                                        join(
+                                            new QueryDataSource(
+                                                newScanQueryBuilder()
+                                                    
.dataSource(CalciteTests.DATASOURCE1)
+                                                    
.intervals(querySegmentSpec(Filtration.eternity()))
+                                                    .filters(new 
SelectorDimFilter("dim1", "10.1", null))
+                                                    
.virtualColumns(expressionVirtualColumn(
+                                                        "v0",
+                                                        "\'10.1\'",
+                                                        ColumnType.STRING
+                                                    ))
+                                                    
.columns(ImmutableList.of("__time", "v0"))
+                                                    
.resultFormat(ScanQuery.ResultFormat.RESULT_FORMAT_COMPACTED_LIST)
+                                                    .context(queryContext)
+                                                    .build()
+                                            ),
+                                            new QueryDataSource(
+                                                newScanQueryBuilder()
+                                                    
.dataSource(CalciteTests.DATASOURCE1)
+                                                    
.intervals(querySegmentSpec(Filtration.eternity()))
+                                                    .filters(new 
SelectorDimFilter("dim1", "10.1", null))
+                                                    
.columns(ImmutableList.of("dim1"))
+                                                    
.resultFormat(ScanQuery.ResultFormat.RESULT_FORMAT_COMPACTED_LIST)
+                                                    .context(queryContext)
+                                                    .build()
+                                            ),
+                                            "j0.",
+                                            equalsCondition(
+                                                makeColumnExpression("v0"),
+                                                makeColumnExpression("j0.dim1")
+                                            ),
+                                            JoinType.INNER
+                                        ))
+                                    
.setInterval(querySegmentSpec(Filtration.eternity()))
+                                    
.setVirtualColumns(expressionVirtualColumn("_v0", "\'10.1\'", 
ColumnType.STRING))
+                                    .setGranularity(Granularities.ALL)
+                                    .setDimensions(new DefaultDimensionSpec(
+                                        "_v0",
+                                        "d0",
+                                        ColumnType.STRING
+                                    ), new DefaultDimensionSpec(
+                                        "__time",
+                                        "d1",
+                                        ColumnType.LONG
+                                    ))
+                                    .setContext(queryContext)
+                                    .build()
+                    )
+                )
+                .setInterval(querySegmentSpec(Filtration.eternity()))
+                .setDimensions(new DefaultDimensionSpec(
+                    "d0",
+                    "_d0",
+                    ColumnType.STRING
+                ))
+                .setContext(queryContext)
+                .setGranularity(Granularities.ALL)
+                .build()
+        ),
+        ImmutableList.of(
+            new Object[]{"10.1"}
+        )
+    );
+  }
+
   @Test
   @Parameters(source = QueryContextForJoinProvider.class)
   public void 
testInnerJoinOnTwoInlineDataSources_withLeftDirectAccess(Map<String, Object> 
queryContext)


---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]

Reply via email to