You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@pinot.apache.org by ro...@apache.org on 2023/07/19 15:26:51 UTC

[pinot] branch master updated: [multistage] add hint option for table node (#11114)

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

rongr pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/pinot.git


The following commit(s) were added to refs/heads/master by this push:
     new 9824f603f3 [multistage] add hint option for table node (#11114)
9824f603f3 is described below

commit 9824f603f353e86fed8b9de18e3a094ddd9dc5dd
Author: Rong Rong <ro...@apache.org>
AuthorDate: Wed Jul 19 08:26:45 2023 -0700

    [multistage] add hint option for table node (#11114)
    
    Co-authored-by: Rong Rong <ro...@startree.ai>
---
 .../org/apache/calcite/rel/hint/PinotHintOptions.java |  6 ++++++
 .../calcite/rel/hint/PinotHintStrategyTable.java      |  1 +
 .../query/planner/logical/RelToPlanNodeConverter.java |  2 +-
 .../query/planner/plannode/AbstractPlanNode.java      | 19 +++++++++++++++++++
 .../pinot/query/planner/plannode/TableScanNode.java   | 11 ++++++++++-
 5 files changed, 37 insertions(+), 2 deletions(-)

diff --git a/pinot-query-planner/src/main/java/org/apache/calcite/rel/hint/PinotHintOptions.java b/pinot-query-planner/src/main/java/org/apache/calcite/rel/hint/PinotHintOptions.java
index eae6d4cfc8..b68f5a509d 100644
--- a/pinot-query-planner/src/main/java/org/apache/calcite/rel/hint/PinotHintOptions.java
+++ b/pinot-query-planner/src/main/java/org/apache/calcite/rel/hint/PinotHintOptions.java
@@ -28,6 +28,7 @@ package org.apache.calcite.rel.hint;
 public class PinotHintOptions {
   public static final String AGGREGATE_HINT_OPTIONS = "aggOptions";
   public static final String JOIN_HINT_OPTIONS = "joinOptions";
+  public static final String TABLE_HINT_OPTIONS = "tableOptions";
 
   /**
    * Hint to denote that the aggregation node is the final aggregation stage which extracts the final result.
@@ -51,4 +52,9 @@ public class PinotHintOptions {
     public static final String JOIN_STRATEGY = "join_strategy";
     public static final String IS_COLOCATED_BY_JOIN_KEYS = "is_colocated_by_join_keys";
   }
+
+  public static class TableHintOptions {
+    public static final String PARTITION_KEY = "partition_key";
+    public static final String PARTITION_SIZE = "partition_size";
+  }
 }
diff --git a/pinot-query-planner/src/main/java/org/apache/calcite/rel/hint/PinotHintStrategyTable.java b/pinot-query-planner/src/main/java/org/apache/calcite/rel/hint/PinotHintStrategyTable.java
index 543d08f0bc..c1c6bb28db 100644
--- a/pinot-query-planner/src/main/java/org/apache/calcite/rel/hint/PinotHintStrategyTable.java
+++ b/pinot-query-planner/src/main/java/org/apache/calcite/rel/hint/PinotHintStrategyTable.java
@@ -36,6 +36,7 @@ public class PinotHintStrategyTable {
       .hintStrategy(PinotHintOptions.INTERNAL_AGG_OPTIONS, HintPredicates.AGGREGATE)
       .hintStrategy(PinotHintOptions.AGGREGATE_HINT_OPTIONS, HintPredicates.AGGREGATE)
       .hintStrategy(PinotHintOptions.JOIN_HINT_OPTIONS, HintPredicates.JOIN)
+      .hintStrategy(PinotHintOptions.TABLE_HINT_OPTIONS, HintPredicates.TABLE_SCAN)
       .build();
 
   /**
diff --git a/pinot-query-planner/src/main/java/org/apache/pinot/query/planner/logical/RelToPlanNodeConverter.java b/pinot-query-planner/src/main/java/org/apache/pinot/query/planner/logical/RelToPlanNodeConverter.java
index 6b1dc25642..6ffcd6bec0 100644
--- a/pinot-query-planner/src/main/java/org/apache/pinot/query/planner/logical/RelToPlanNodeConverter.java
+++ b/pinot-query-planner/src/main/java/org/apache/pinot/query/planner/logical/RelToPlanNodeConverter.java
@@ -172,7 +172,7 @@ public final class RelToPlanNodeConverter {
     String tableName = node.getTable().getQualifiedName().get(0);
     List<String> columnNames =
         node.getRowType().getFieldList().stream().map(RelDataTypeField::getName).collect(Collectors.toList());
-    return new TableScanNode(currentStageId, toDataSchema(node.getRowType()), tableName, columnNames);
+    return new TableScanNode(currentStageId, toDataSchema(node.getRowType()), node.getHints(), tableName, columnNames);
   }
 
   private static PlanNode convertLogicalJoin(LogicalJoin node, int currentStageId) {
diff --git a/pinot-query-planner/src/main/java/org/apache/pinot/query/planner/plannode/AbstractPlanNode.java b/pinot-query-planner/src/main/java/org/apache/pinot/query/planner/plannode/AbstractPlanNode.java
index ae696ac7f9..c4349097e4 100644
--- a/pinot-query-planner/src/main/java/org/apache/pinot/query/planner/plannode/AbstractPlanNode.java
+++ b/pinot-query-planner/src/main/java/org/apache/pinot/query/planner/plannode/AbstractPlanNode.java
@@ -19,9 +19,13 @@
 package org.apache.pinot.query.planner.plannode;
 
 import java.util.ArrayList;
+import java.util.HashMap;
 import java.util.List;
+import java.util.Map;
+import org.apache.calcite.rel.hint.RelHint;
 import org.apache.pinot.common.proto.Plan;
 import org.apache.pinot.common.utils.DataSchema;
+import org.apache.pinot.query.planner.serde.ProtoProperties;
 import org.apache.pinot.query.planner.serde.ProtoSerializable;
 import org.apache.pinot.query.planner.serde.ProtoSerializationUtils;
 
@@ -81,4 +85,19 @@ public abstract class AbstractPlanNode implements PlanNode, ProtoSerializable {
   public Plan.ObjectField toObjectField() {
     return ProtoSerializationUtils.convertObjectToObjectField(this);
   }
+
+  public static class NodeHint {
+    @ProtoProperties
+    public Map<String, Map<String, String>> _hintOptions;
+    public NodeHint() {
+    }
+
+    public NodeHint(List<RelHint> relHints) {
+      _hintOptions = new HashMap<>();
+      for (RelHint relHint : relHints) {
+        Map<String, String> kvOptions = new HashMap<>(relHint.kvOptions);
+        _hintOptions.put(relHint.hintName, kvOptions);
+      }
+    }
+  }
 }
diff --git a/pinot-query-planner/src/main/java/org/apache/pinot/query/planner/plannode/TableScanNode.java b/pinot-query-planner/src/main/java/org/apache/pinot/query/planner/plannode/TableScanNode.java
index a9c92ca387..070e09d209 100644
--- a/pinot-query-planner/src/main/java/org/apache/pinot/query/planner/plannode/TableScanNode.java
+++ b/pinot-query-planner/src/main/java/org/apache/pinot/query/planner/plannode/TableScanNode.java
@@ -19,11 +19,14 @@
 package org.apache.pinot.query.planner.plannode;
 
 import java.util.List;
+import org.apache.calcite.rel.hint.RelHint;
 import org.apache.pinot.common.utils.DataSchema;
 import org.apache.pinot.query.planner.serde.ProtoProperties;
 
 
 public class TableScanNode extends AbstractPlanNode {
+  @ProtoProperties
+  private NodeHint _nodeHint;
   @ProtoProperties
   private String _tableName;
   @ProtoProperties
@@ -33,9 +36,11 @@ public class TableScanNode extends AbstractPlanNode {
     super(planFragmentId);
   }
 
-  public TableScanNode(int planFragmentId, DataSchema dataSchema, String tableName, List<String> tableScanColumns) {
+  public TableScanNode(int planFragmentId, DataSchema dataSchema, List<RelHint> relHints, String tableName,
+      List<String> tableScanColumns) {
     super(planFragmentId, dataSchema);
     _tableName = tableName;
+    _nodeHint = new NodeHint(relHints);
     _tableScanColumns = tableScanColumns;
   }
 
@@ -47,6 +52,10 @@ public class TableScanNode extends AbstractPlanNode {
     return _tableScanColumns;
   }
 
+  public NodeHint getNodeHint() {
+    return _nodeHint;
+  }
+
   @Override
   public String explain() {
     return "TABLE SCAN (" + _tableName + ")";


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