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

kgyrtkirk 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 6710451564b Fix applyPolicies in DruidRel (#17757)
6710451564b is described below

commit 6710451564be9d5f39dfffe9f5e167bb51ab8c55
Author: Cece Mei <[email protected]>
AuthorDate: Wed Feb 26 00:28:56 2025 -0800

    Fix applyPolicies in DruidRel (#17757)
---
 .../planner/querygen/DruidQueryGenerator.java      |   2 +-
 .../sql/calcite/rel/DruidCorrelateUnnestRel.java   |   7 +-
 .../druid/sql/calcite/rel/DruidJoinQueryRel.java   |   6 +-
 .../druid/sql/calcite/rel/DruidOuterQueryRel.java  |   6 +-
 .../apache/druid/sql/calcite/rel/DruidQuery.java   |   6 +-
 .../druid/sql/calcite/rel/DruidQueryRel.java       |  11 +-
 .../sql/calcite/rel/DruidUnionDataSourceRel.java   |   9 +-
 .../druid/sql/calcite/rel/PartialDruidQuery.java   |  12 +-
 .../apache/druid/sql/calcite/rel/DruidRelTest.java | 286 +++++++++++++++++++++
 9 files changed, 319 insertions(+), 26 deletions(-)

diff --git 
a/sql/src/main/java/org/apache/druid/sql/calcite/planner/querygen/DruidQueryGenerator.java
 
b/sql/src/main/java/org/apache/druid/sql/calcite/planner/querygen/DruidQueryGenerator.java
index ddf84f21590..7948e08a77c 100644
--- 
a/sql/src/main/java/org/apache/druid/sql/calcite/planner/querygen/DruidQueryGenerator.java
+++ 
b/sql/src/main/java/org/apache/druid/sql/calcite/planner/querygen/DruidQueryGenerator.java
@@ -313,7 +313,7 @@ public class DruidQueryGenerator
             plannerContext,
             rexBuilder,
             !(topLevel) && tweaks.finalizeSubQuery(),
-            false
+            true
         );
       }
 
diff --git 
a/sql/src/main/java/org/apache/druid/sql/calcite/rel/DruidCorrelateUnnestRel.java
 
b/sql/src/main/java/org/apache/druid/sql/calcite/rel/DruidCorrelateUnnestRel.java
index 37872ee302f..0f3370cf622 100644
--- 
a/sql/src/main/java/org/apache/druid/sql/calcite/rel/DruidCorrelateUnnestRel.java
+++ 
b/sql/src/main/java/org/apache/druid/sql/calcite/rel/DruidCorrelateUnnestRel.java
@@ -78,7 +78,7 @@ import java.util.stream.Collectors;
  */
 public class DruidCorrelateUnnestRel extends DruidRel<DruidCorrelateUnnestRel>
 {
-  private static final TableDataSource DUMMY_DATA_SOURCE = new 
TableDataSource("__correlate_unnest__")
+  static final TableDataSource DUMMY_DATA_SOURCE = new 
TableDataSource("__correlate_unnest__")
   {
     @Override
     public boolean isConcrete()
@@ -317,8 +317,7 @@ public class DruidCorrelateUnnestRel extends 
DruidRel<DruidCorrelateUnnestRel>
         getPlannerContext(),
         getCluster().getRexBuilder(),
         finalizeAggregations,
-        null,
-        false
+        true
     );
   }
 
@@ -340,7 +339,7 @@ public class DruidCorrelateUnnestRel extends 
DruidRel<DruidCorrelateUnnestRel>
         getPlannerContext(),
         getCluster().getRexBuilder(),
         false,
-        true
+        false
     );
   }
 
diff --git 
a/sql/src/main/java/org/apache/druid/sql/calcite/rel/DruidJoinQueryRel.java 
b/sql/src/main/java/org/apache/druid/sql/calcite/rel/DruidJoinQueryRel.java
index 4a1e3bf81da..b74065094d0 100644
--- a/sql/src/main/java/org/apache/druid/sql/calcite/rel/DruidJoinQueryRel.java
+++ b/sql/src/main/java/org/apache/druid/sql/calcite/rel/DruidJoinQueryRel.java
@@ -249,8 +249,8 @@ public class DruidJoinQueryRel extends 
DruidRel<DruidJoinQueryRel>
         getPlannerContext(),
         getCluster().getRexBuilder(),
         finalizeAggregations,
-        sourceDesc.virtualColumnRegistry,
-        false
+        true,
+        sourceDesc.virtualColumnRegistry
     );
   }
 
@@ -266,7 +266,7 @@ public class DruidJoinQueryRel extends 
DruidRel<DruidJoinQueryRel>
         getPlannerContext(),
         getCluster().getRexBuilder(),
         false,
-        true
+        false
     );
   }
 
diff --git 
a/sql/src/main/java/org/apache/druid/sql/calcite/rel/DruidOuterQueryRel.java 
b/sql/src/main/java/org/apache/druid/sql/calcite/rel/DruidOuterQueryRel.java
index 3e1a28b7b15..8e4be94960e 100644
--- a/sql/src/main/java/org/apache/druid/sql/calcite/rel/DruidOuterQueryRel.java
+++ b/sql/src/main/java/org/apache/druid/sql/calcite/rel/DruidOuterQueryRel.java
@@ -47,7 +47,7 @@ import java.util.Set;
  */
 public class DruidOuterQueryRel extends DruidRel<DruidOuterQueryRel>
 {
-  private static final TableDataSource DUMMY_DATA_SOURCE = new 
TableDataSource("__subquery__")
+  static final TableDataSource DUMMY_DATA_SOURCE = new 
TableDataSource("__subquery__")
   {
     @Override
     public boolean isConcrete()
@@ -120,7 +120,7 @@ public class DruidOuterQueryRel extends 
DruidRel<DruidOuterQueryRel>
         getPlannerContext(),
         getCluster().getRexBuilder(),
         finalizeAggregations,
-        false
+        true
     );
   }
 
@@ -136,7 +136,7 @@ public class DruidOuterQueryRel extends 
DruidRel<DruidOuterQueryRel>
         getPlannerContext(),
         getCluster().getRexBuilder(),
         false,
-        true
+        false
     );
   }
 
diff --git a/sql/src/main/java/org/apache/druid/sql/calcite/rel/DruidQuery.java 
b/sql/src/main/java/org/apache/druid/sql/calcite/rel/DruidQuery.java
index 0a3a928b1b4..5d068d3fe0a 100644
--- a/sql/src/main/java/org/apache/druid/sql/calcite/rel/DruidQuery.java
+++ b/sql/src/main/java/org/apache/druid/sql/calcite/rel/DruidQuery.java
@@ -206,8 +206,8 @@ public class DruidQuery
       final PlannerContext plannerContext,
       final RexBuilder rexBuilder,
       final boolean finalizeAggregations,
-      @Nullable VirtualColumnRegistry virtualColumnRegistry,
-      final boolean applyPolicies
+      final boolean applyPolicies,
+      @Nullable VirtualColumnRegistry virtualColumnRegistry
   )
   {
     final RelDataType outputRowType = partialQuery.leafRel().getRowType();
@@ -303,7 +303,7 @@ public class DruidQuery
     }
 
     return new DruidQuery(
-        applyPolicies ? dataSource : 
dataSource.withPolicies(plannerContext.getAuthorizationResult().getPolicyMap()),
+        applyPolicies ? 
dataSource.withPolicies(plannerContext.getAuthorizationResult().getPolicyMap()) 
: dataSource,
         plannerContext,
         filter,
         selectProjection,
diff --git 
a/sql/src/main/java/org/apache/druid/sql/calcite/rel/DruidQueryRel.java 
b/sql/src/main/java/org/apache/druid/sql/calcite/rel/DruidQueryRel.java
index 498c8402321..4ccf944e254 100644
--- a/sql/src/main/java/org/apache/druid/sql/calcite/rel/DruidQueryRel.java
+++ b/sql/src/main/java/org/apache/druid/sql/calcite/rel/DruidQueryRel.java
@@ -132,14 +132,21 @@ public class DruidQueryRel extends DruidRel<DruidQueryRel>
         getPlannerContext(),
         getCluster().getRexBuilder(),
         finalizeAggregations,
-        false
+        true
     );
   }
 
   @Override
   public DruidQuery toDruidQueryForExplaining()
   {
-    return toDruidQuery(false);
+    return partialQuery.build(
+        druidTable.getDataSource(),
+        druidTable.getRowSignature(),
+        getPlannerContext(),
+        getCluster().getRexBuilder(),
+        false,
+        false
+    );
   }
 
   @Override
diff --git 
a/sql/src/main/java/org/apache/druid/sql/calcite/rel/DruidUnionDataSourceRel.java
 
b/sql/src/main/java/org/apache/druid/sql/calcite/rel/DruidUnionDataSourceRel.java
index f815779db16..904149f1b1b 100644
--- 
a/sql/src/main/java/org/apache/druid/sql/calcite/rel/DruidUnionDataSourceRel.java
+++ 
b/sql/src/main/java/org/apache/druid/sql/calcite/rel/DruidUnionDataSourceRel.java
@@ -32,6 +32,7 @@ import org.apache.calcite.rel.metadata.RelMetadataQuery;
 import org.apache.calcite.rel.type.RelDataType;
 import org.apache.druid.java.util.common.StringUtils;
 import org.apache.druid.query.DataSource;
+import org.apache.druid.query.RestrictedDataSource;
 import org.apache.druid.query.TableDataSource;
 import org.apache.druid.query.UnionDataSource;
 import org.apache.druid.segment.column.RowSignature;
@@ -54,7 +55,7 @@ import java.util.stream.Collectors;
  */
 public class DruidUnionDataSourceRel extends DruidRel<DruidUnionDataSourceRel>
 {
-  private static final TableDataSource DUMMY_DATA_SOURCE = new 
TableDataSource("__union__");
+  static final TableDataSource DUMMY_DATA_SOURCE = new 
TableDataSource("__union__");
   private final Union unionRel;
   private final List<String> unionColumnNames;
   private final PartialDruidQuery partialQuery;
@@ -130,7 +131,7 @@ public class DruidUnionDataSourceRel extends 
DruidRel<DruidUnionDataSourceRel>
 
       final DruidQuery query = druidRel.toDruidQuery(false);
       final DataSource dataSource = query.getDataSource();
-      if (!(dataSource instanceof TableDataSource)) {
+      if (!(dataSource instanceof TableDataSource) && !(dataSource instanceof 
RestrictedDataSource)) {
         getPlannerContext().setPlanningError("SQL requires union with input of 
'%s' type that is not supported."
                 + " Union operation is only supported between regular tables. 
",
             dataSource.getClass().getSimpleName());
@@ -166,7 +167,7 @@ public class DruidUnionDataSourceRel extends 
DruidRel<DruidUnionDataSourceRel>
         getPlannerContext(),
         getCluster().getRexBuilder(),
         finalizeAggregations,
-        false
+        true
     );
   }
 
@@ -182,7 +183,7 @@ public class DruidUnionDataSourceRel extends 
DruidRel<DruidUnionDataSourceRel>
         getPlannerContext(),
         getCluster().getRexBuilder(),
         false,
-        true
+        false
     );
   }
 
diff --git 
a/sql/src/main/java/org/apache/druid/sql/calcite/rel/PartialDruidQuery.java 
b/sql/src/main/java/org/apache/druid/sql/calcite/rel/PartialDruidQuery.java
index 6ab804552e2..cabef87a912 100644
--- a/sql/src/main/java/org/apache/druid/sql/calcite/rel/PartialDruidQuery.java
+++ b/sql/src/main/java/org/apache/druid/sql/calcite/rel/PartialDruidQuery.java
@@ -530,8 +530,8 @@ public class PartialDruidQuery
         plannerContext,
         rexBuilder,
         finalizeAggregations,
-        null,
-        applyPolicies
+        applyPolicies,
+        null
     );
   }
 
@@ -541,8 +541,8 @@ public class PartialDruidQuery
       final PlannerContext plannerContext,
       final RexBuilder rexBuilder,
       final boolean finalizeAggregations,
-      @Nullable VirtualColumnRegistry virtualColumnRegistry,
-      final boolean applyPolicies
+      final boolean applyPolicies,
+      @Nullable VirtualColumnRegistry virtualColumnRegistry
   )
   {
     return DruidQuery.fromPartialQuery(
@@ -552,8 +552,8 @@ public class PartialDruidQuery
         plannerContext,
         rexBuilder,
         finalizeAggregations,
-        virtualColumnRegistry,
-        applyPolicies
+        applyPolicies,
+        virtualColumnRegistry
     );
   }
 
diff --git 
a/sql/src/test/java/org/apache/druid/sql/calcite/rel/DruidRelTest.java 
b/sql/src/test/java/org/apache/druid/sql/calcite/rel/DruidRelTest.java
new file mode 100644
index 00000000000..549484b5f9a
--- /dev/null
+++ b/sql/src/test/java/org/apache/druid/sql/calcite/rel/DruidRelTest.java
@@ -0,0 +1,286 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package org.apache.druid.sql.calcite.rel;
+
+import com.fasterxml.jackson.databind.json.JsonMapper;
+import com.google.common.collect.ImmutableList;
+import com.google.common.collect.ImmutableMap;
+import com.google.common.collect.ImmutableSet;
+import org.apache.calcite.jdbc.JavaTypeFactoryImpl;
+import org.apache.calcite.plan.RelOptCluster;
+import org.apache.calcite.plan.RelOptTable;
+import org.apache.calcite.plan.RelTraitSet;
+import org.apache.calcite.rel.core.Correlate;
+import org.apache.calcite.rel.core.CorrelationId;
+import org.apache.calcite.rel.core.JoinRelType;
+import org.apache.calcite.rel.logical.LogicalCorrelate;
+import org.apache.calcite.rel.logical.LogicalJoin;
+import org.apache.calcite.rel.logical.LogicalTableScan;
+import org.apache.calcite.rel.type.RelDataType;
+import org.apache.calcite.rel.type.RelDataTypeFactory;
+import org.apache.calcite.rel.type.RelDataTypeFieldImpl;
+import org.apache.calcite.rel.type.RelDataTypeSystem;
+import org.apache.calcite.rel.type.RelRecordType;
+import org.apache.calcite.rel.type.StructKind;
+import org.apache.calcite.rex.RexBuilder;
+import org.apache.calcite.rex.RexLiteral;
+import org.apache.calcite.sql.type.BasicSqlType;
+import org.apache.calcite.sql.type.SqlTypeName;
+import org.apache.calcite.util.ImmutableBitSet;
+import org.apache.druid.math.expr.Expr;
+import org.apache.druid.math.expr.ExprEval;
+import org.apache.druid.query.JoinAlgorithm;
+import org.apache.druid.query.JoinDataSource;
+import org.apache.druid.query.QueryDataSource;
+import org.apache.druid.query.RestrictedDataSource;
+import org.apache.druid.query.TableDataSource;
+import org.apache.druid.query.UnionDataSource;
+import org.apache.druid.query.UnnestDataSource;
+import org.apache.druid.query.policy.Policy;
+import org.apache.druid.segment.column.ColumnType;
+import org.apache.druid.segment.column.RowSignature;
+import org.apache.druid.server.security.AuthorizationResult;
+import org.apache.druid.sql.calcite.planner.ExpressionParser;
+import org.apache.druid.sql.calcite.planner.PlannerConfig;
+import org.apache.druid.sql.calcite.planner.PlannerContext;
+import org.apache.druid.sql.calcite.rel.logical.DruidUnion;
+import org.apache.druid.sql.calcite.table.DatasourceTable;
+import 
org.apache.druid.sql.calcite.table.DatasourceTable.PhysicalDatasourceMetadata;
+import org.apache.druid.sql.calcite.table.DruidTable;
+import org.junit.Assert;
+import org.junit.Before;
+import org.junit.Test;
+import org.mockito.Mock;
+import org.mockito.MockitoAnnotations;
+
+import java.util.Optional;
+
+import static 
org.apache.druid.sql.calcite.util.CalciteTests.POLICY_RESTRICTION;
+import static org.mockito.ArgumentMatchers.any;
+import static org.mockito.Mockito.mock;
+import static org.mockito.Mockito.spy;
+import static org.mockito.Mockito.when;
+
+public class DruidRelTest
+{
+  private static final RowSignature ROW_SIGNATURE = 
RowSignature.builder().add("col1", ColumnType.LONG).build();
+  private static final RelDataType LONG_TYPE = new 
BasicSqlType(RelDataTypeSystem.DEFAULT, SqlTypeName.BIGINT);
+  private static final RelDataTypeFieldImpl COL1_FIELD = new 
RelDataTypeFieldImpl("col1", 0, LONG_TYPE);
+  private static final RelRecordType REC_TYPE = new 
RelRecordType(StructKind.NONE, ImmutableList.of(COL1_FIELD), true);
+  private static final RelDataTypeFactory DEFAULT_TYPE_FACTORY = new 
JavaTypeFactoryImpl();
+  private static final RexLiteral ALWAYS_TRUE = new 
RexBuilder(DEFAULT_TYPE_FACTORY).makeLiteral(true);
+  private static final Expr EXPR_6L = ExprEval.ofLong(6).toExpr();
+  private static final TableDataSource TABLE = 
TableDataSource.create("restricted_foo");
+  private static final RestrictedDataSource RESTRICTED = 
RestrictedDataSource.create(TABLE, POLICY_RESTRICTION);
+  private static final PhysicalDatasourceMetadata RESTRICTED_METADATA = new 
PhysicalDatasourceMetadata(
+      TABLE,
+      ROW_SIGNATURE,
+      true,
+      false
+  );
+  private static final DruidTable DRUID_TABLE = new 
DatasourceTable(RESTRICTED_METADATA);
+  private static final ImmutableMap<String, Optional<Policy>> RESTRICTIONS = 
ImmutableMap.of(
+      "restricted_foo",
+      Optional.of(POLICY_RESTRICTION)
+  );
+  private static final AuthorizationResult AUTHORIZATION_RESULT = 
AuthorizationResult.allowWithRestriction(RESTRICTIONS);
+
+
+  @Mock
+  private RelOptTable mockRelOptTable;
+  @Mock
+  private RelOptCluster mockRelOptCluster;
+  @Mock
+  private RelTraitSet mockRelTraitSet;
+
+  @Mock
+  private PlannerContext mockPlannerContext;
+  private DruidQueryRel druidQueryRelNode;
+
+  @Before
+  public void setup() throws Exception
+  {
+    MockitoAnnotations.openMocks(this);
+    when(mockRelOptCluster.getTypeFactory()).thenReturn(DEFAULT_TYPE_FACTORY);
+    when(mockRelOptTable.getRowType()).thenReturn(REC_TYPE);
+
+    
when(mockPlannerContext.getPlannerConfig()).thenReturn(PlannerConfig.builder().build());
+    
when(mockPlannerContext.getJsonMapper()).thenReturn(JsonMapper.builder().build());
+    
when(mockPlannerContext.getAuthorizationResult()).thenReturn(AUTHORIZATION_RESULT);
+
+    LogicalTableScan logicalTableScan = new LogicalTableScan(
+        mockRelOptCluster,
+        mockRelTraitSet,
+        ImmutableList.of(),
+        mockRelOptTable
+    );
+    druidQueryRelNode = DruidQueryRel.scanTable(
+        logicalTableScan,
+        mockRelOptTable,
+        DRUID_TABLE,
+        mockPlannerContext
+    );
+  }
+
+  @Test
+  public void testDruidQueryRel()
+  {
+    DruidQuery queryForExplaining = 
druidQueryRelNode.toDruidQueryForExplaining();
+    DruidQuery query = druidQueryRelNode.toDruidQuery(true);
+
+    // explain query should return a TableDataSource.
+    Assert.assertEquals(TABLE, queryForExplaining.getDataSource());
+    // query should return a RestrictedDataSource.
+    Assert.assertEquals(RESTRICTED, query.getDataSource());
+  }
+
+  @Test
+  public void testDruidJoinQueryRel()
+  {
+    // Arrange
+    
when(mockPlannerContext.getJoinAlgorithm()).thenReturn(JoinAlgorithm.SORT_MERGE);
+    mockExpressionParser();
+    LogicalJoin logicalJoin = LogicalJoin.create(
+        druidQueryRelNode,
+        druidQueryRelNode,
+        ImmutableList.of(),
+        ALWAYS_TRUE,
+        ImmutableSet.of(),
+        JoinRelType.INNER
+    );
+    DruidJoinQueryRel joinRel = DruidJoinQueryRel.create(logicalJoin, null, 
mockPlannerContext);
+
+    // Act
+    DruidQuery queryForExplaining = joinRel.toDruidQueryForExplaining();
+    DruidQuery query = joinRel.toDruidQuery(false);
+
+    // Assert
+    Assert.assertEquals(DruidJoinQueryRel.DUMMY_DATA_SOURCE, 
queryForExplaining.getDataSource());
+    JoinDataSource dataSource = (JoinDataSource) query.getDataSource();
+    Assert.assertEquals(RESTRICTED, ((QueryDataSource) 
dataSource.getLeft()).getQuery().getDataSource());
+    Assert.assertEquals(RESTRICTED, ((QueryDataSource) 
dataSource.getRight()).getQuery().getDataSource());
+  }
+
+  @Test
+  public void testDruidUnionQueryRel()
+  {
+    // Arrange
+    DruidUnion union = new DruidUnion(
+        mockRelOptCluster,
+        mockRelTraitSet,
+        ImmutableList.of(),
+        ImmutableList.of(druidQueryRelNode, druidQueryRelNode),
+        true
+    );
+    DruidUnionDataSourceRel rel = DruidUnionDataSourceRel.create(union, 
ImmutableList.of("col1"), mockPlannerContext);
+
+    // Act
+    DruidQuery queryForExplaining = rel.toDruidQueryForExplaining();
+    DruidQuery query = rel.toDruidQuery(false);
+
+    // Assert
+    Assert.assertEquals(DruidUnionDataSourceRel.DUMMY_DATA_SOURCE, 
queryForExplaining.getDataSource());
+    Assert.assertEquals(new UnionDataSource(ImmutableList.of(RESTRICTED, 
RESTRICTED)), query.getDataSource());
+  }
+
+  @Test
+  public void testDruidOuterQueryRel()
+  {
+    // Arrange
+    PartialDruidQuery partialDruidQuerySpy = 
spy(druidQueryRelNode.getPartialDruidQuery());
+    when(partialDruidQuerySpy.getTraitSet(any(), 
any())).thenReturn(mockRelTraitSet);
+    when(mockRelTraitSet.containsIfApplicable(any())).thenReturn(true);
+    PartialDruidQuery inputQuery = PartialDruidQuery.createOuterQuery(
+        partialDruidQuerySpy,
+        druidQueryRelNode.getPlannerContext()
+    );
+    DruidOuterQueryRel rel = DruidOuterQueryRel.create(druidQueryRelNode, 
inputQuery);
+
+    // Act
+    DruidQuery queryForExplaining = rel.toDruidQueryForExplaining();
+    DruidQuery query = rel.toDruidQuery(false);
+
+    // Assert
+    Assert.assertEquals(DruidOuterQueryRel.DUMMY_DATA_SOURCE, 
queryForExplaining.getDataSource());
+    Assert.assertEquals(RESTRICTED, ((QueryDataSource) 
query.getDataSource()).getQuery().getDataSource());
+  }
+
+  @Test
+  public void testDruidCorrelateUnnestRel()
+  {
+    // Arrange
+    mockExpressionParser();
+    DruidUnnestRel right = mock(DruidUnnestRel.class);
+    when(right.getRowType()).thenReturn(REC_TYPE);
+    when(right.getInputRexNode()).thenReturn(ALWAYS_TRUE);
+
+    Correlate correlateRel = LogicalCorrelate.create(
+        druidQueryRelNode,
+        right,
+        ImmutableList.of(),
+        mock(CorrelationId.class),
+        ImmutableBitSet.of(0),
+        JoinRelType.LEFT
+    );
+    DruidCorrelateUnnestRel rel = DruidCorrelateUnnestRel.create(correlateRel, 
mockPlannerContext);
+
+    // Act
+    DruidQuery queryForExplaining = rel.toDruidQueryForExplaining();
+    DruidQuery query = rel.toDruidQuery(false);
+
+    // Assert
+    Assert.assertEquals(DruidCorrelateUnnestRel.DUMMY_DATA_SOURCE, 
queryForExplaining.getDataSource());
+    Assert.assertEquals(RESTRICTED, ((UnnestDataSource) 
query.getDataSource()).getBase());
+  }
+
+  @Test
+  public void testDruidUnnestRel()
+  {
+    DruidUnnestRel rel = DruidUnnestRel.create(mockRelOptCluster, 
mockRelTraitSet, ALWAYS_TRUE, mockPlannerContext);
+
+    CannotBuildQueryException e1 = 
Assert.assertThrows(CannotBuildQueryException.class, 
rel::toDruidQueryForExplaining);
+    CannotBuildQueryException e2 = 
Assert.assertThrows(CannotBuildQueryException.class, () -> 
rel.toDruidQuery(false));
+    Assert.assertEquals("Cannot execute UNNEST directly", e1.getMessage());
+    Assert.assertEquals("Cannot execute UNNEST directly", e2.getMessage());
+  }
+
+  @Test
+  public void testDruidUnionRel()
+  {
+    DruidUnionRel rel = DruidUnionRel.create(mockPlannerContext, REC_TYPE, 
ImmutableList.of(druidQueryRelNode), 1000);
+
+    UnsupportedOperationException e1 = Assert.assertThrows(
+        UnsupportedOperationException.class,
+        rel::toDruidQueryForExplaining
+    );
+    UnsupportedOperationException e2 = Assert.assertThrows(
+        UnsupportedOperationException.class,
+        () -> rel.toDruidQuery(false)
+    );
+  }
+
+  private void mockExpressionParser()
+  {
+    ExpressionParser parser = mock(ExpressionParser.class);
+    when(parser.parse(any())).thenReturn(EXPR_6L);
+    when(mockPlannerContext.getExpressionParser()).thenReturn(parser);
+    when(mockPlannerContext.parseExpression(any())).thenReturn(EXPR_6L);
+  }
+}


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

Reply via email to