You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@druid.apache.org by GitBox <gi...@apache.org> on 2020/01/31 01:17:19 UTC

[GitHub] [druid] jon-wei commented on a change in pull request #9294: SQL join support for lookups.

jon-wei commented on a change in pull request #9294: SQL join support for lookups.
URL: https://github.com/apache/druid/pull/9294#discussion_r373243510
 
 

 ##########
 File path: sql/src/main/java/org/apache/druid/sql/calcite/rel/DruidJoinQueryRel.java
 ##########
 @@ -0,0 +1,344 @@
+/*
+ * 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.core.JsonProcessingException;
+import com.google.common.base.Preconditions;
+import com.google.common.collect.ImmutableList;
+import org.apache.calcite.plan.RelOptCluster;
+import org.apache.calcite.plan.RelOptCost;
+import org.apache.calcite.plan.RelOptPlanner;
+import org.apache.calcite.plan.RelOptRule;
+import org.apache.calcite.plan.RelTraitSet;
+import org.apache.calcite.rel.RelNode;
+import org.apache.calcite.rel.RelWriter;
+import org.apache.calcite.rel.core.Join;
+import org.apache.calcite.rel.core.JoinRelType;
+import org.apache.calcite.rel.metadata.RelMetadataQuery;
+import org.apache.calcite.rel.type.RelDataType;
+import org.apache.calcite.rex.RexNode;
+import org.apache.druid.java.util.common.IAE;
+import org.apache.druid.java.util.common.Pair;
+import org.apache.druid.java.util.common.StringUtils;
+import org.apache.druid.java.util.common.guava.Sequence;
+import org.apache.druid.query.DataSource;
+import org.apache.druid.query.JoinDataSource;
+import org.apache.druid.query.QueryDataSource;
+import org.apache.druid.query.TableDataSource;
+import org.apache.druid.segment.join.JoinType;
+import org.apache.druid.sql.calcite.expression.DruidExpression;
+import org.apache.druid.sql.calcite.expression.Expressions;
+import org.apache.druid.sql.calcite.planner.Calcites;
+import org.apache.druid.sql.calcite.table.RowSignature;
+
+import java.util.HashSet;
+import java.util.List;
+import java.util.Set;
+import java.util.stream.Collectors;
+
+/**
+ * DruidRel that uses a {@link JoinDataSource}.
+ */
+public class DruidJoinQueryRel extends DruidRel<DruidJoinQueryRel>
+{
+  private static final TableDataSource DUMMY_DATA_SOURCE = new TableDataSource("__join__");
+  private static final double COST_FACTOR = 100.0;
+
+  private final PartialDruidQuery partialQuery;
+  private final Join joinRel;
+  private RelNode left;
+  private RelNode right;
+
+  private DruidJoinQueryRel(
+      RelOptCluster cluster,
+      RelTraitSet traitSet,
+      Join joinRel,
+      PartialDruidQuery partialQuery,
+      QueryMaker queryMaker
+  )
+  {
+    super(cluster, traitSet, queryMaker);
+    this.joinRel = joinRel;
+    this.left = joinRel.getLeft();
+    this.right = joinRel.getRight();
+    this.partialQuery = partialQuery;
+  }
+
+  public static DruidJoinQueryRel create(final Join joinRel, final QueryMaker queryMaker)
+  {
+    return new DruidJoinQueryRel(
+        joinRel.getCluster(),
+        joinRel.getTraitSet(),
+        joinRel,
+        PartialDruidQuery.create(joinRel),
+        queryMaker
+    );
+  }
+
+  @Override
+  public PartialDruidQuery getPartialDruidQuery()
+  {
+    return partialQuery;
+  }
+
+  @Override
+  public Sequence<Object[]> runQuery()
+  {
+    // runQuery doesn't need to finalize aggregations, because the fact that runQuery is happening suggests this
+    // is the outermost query and it will actually get run as a native query. Druid's native query layer will
+    // finalize aggregations for the outermost query even if we don't explicitly ask it to.
+
+    final DruidQuery query = toDruidQuery(false);
+    return getQueryMaker().runQuery(query);
+  }
+
+  @Override
+  public DruidJoinQueryRel withPartialQuery(final PartialDruidQuery newQueryBuilder)
+  {
+    return new DruidJoinQueryRel(
+        getCluster(),
+        getTraitSet().plusAll(newQueryBuilder.getRelTraits()),
+        joinRel,
+        newQueryBuilder,
+        getQueryMaker()
+    );
+  }
+
+  @Override
+  public int getQueryCount()
+  {
+    return ((DruidRel<?>) left).getQueryCount() + ((DruidRel<?>) right).getQueryCount();
+  }
+
+  @Override
+  public DruidQuery toDruidQuery(final boolean finalizeAggregations)
+  {
+    final DruidRel<?> leftDruidRel = (DruidRel<?>) left;
+    final DruidQuery leftQuery = Preconditions.checkNotNull((leftDruidRel).toDruidQuery(false), "leftQuery");
+    final RowSignature leftSignature = leftQuery.getOutputRowSignature();
+    final DataSource leftDataSource;
+
+    final DruidRel<?> rightDruidRel = (DruidRel<?>) right;
+    final DruidQuery rightQuery = Preconditions.checkNotNull(rightDruidRel.toDruidQuery(false), "rightQuery");
+    final RowSignature rightSignature = rightQuery.getOutputRowSignature();
+    final DataSource rightDataSource;
+
+    // Left rel: allow direct embedding of scans/mappings including those of joins.
+    if (DruidRels.isScanOrMapping(leftDruidRel, true)) {
+      leftDataSource = leftQuery.getDataSource();
+    } else {
+      leftDataSource = new QueryDataSource(leftQuery.getQuery());
+    }
+
+    // Right rel: allow direct embedding of scans/mappings, excluduing joins (those must be done as subqueries).
 
 Review comment:
   excluduing -> excluding

----------------------------------------------------------------
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.
 
For queries about this service, please contact Infrastructure at:
users@infra.apache.org


With regards,
Apache Git Services

---------------------------------------------------------------------
To unsubscribe, e-mail: commits-unsubscribe@druid.apache.org
For additional commands, e-mail: commits-help@druid.apache.org