You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@calcite.apache.org by jh...@apache.org on 2015/03/10 02:12:19 UTC

[2/2] incubator-calcite git commit: [CALCITE-608] Exception is thrown when RelMdDistribution for Project operator is called (Jesus Camacho Rodriguez)

[CALCITE-608] Exception is thrown when RelMdDistribution for Project operator is called (Jesus Camacho Rodriguez)

Close apache/incubator-calcite#56


Project: http://git-wip-us.apache.org/repos/asf/incubator-calcite/repo
Commit: http://git-wip-us.apache.org/repos/asf/incubator-calcite/commit/03e94498
Tree: http://git-wip-us.apache.org/repos/asf/incubator-calcite/tree/03e94498
Diff: http://git-wip-us.apache.org/repos/asf/incubator-calcite/diff/03e94498

Branch: refs/heads/master
Commit: 03e9449837eee214df8131185a80a560dd192660
Parents: ee3347f
Author: Jesus Camacho Rodriguez <jc...@hortonworks.com>
Authored: Sun Mar 8 18:39:07 2015 -0700
Committer: Julian Hyde <jh...@apache.org>
Committed: Mon Mar 9 17:38:39 2015 -0700

----------------------------------------------------------------------
 .../org/apache/calcite/rel/core/Project.java    | 33 ++++++++++++++++++--
 .../calcite/rel/metadata/RelMdDistribution.java |  3 +-
 2 files changed, 32 insertions(+), 4 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/incubator-calcite/blob/03e94498/core/src/main/java/org/apache/calcite/rel/core/Project.java
----------------------------------------------------------------------
diff --git a/core/src/main/java/org/apache/calcite/rel/core/Project.java b/core/src/main/java/org/apache/calcite/rel/core/Project.java
index 842c0de..af24c58 100644
--- a/core/src/main/java/org/apache/calcite/rel/core/Project.java
+++ b/core/src/main/java/org/apache/calcite/rel/core/Project.java
@@ -276,13 +276,14 @@ public abstract class Project extends SingleRel {
    *
    * @param inputFieldCount Number of input fields
    * @param projects Project expressions
-   * @return Mapping of a set of project expressions
+   * @return Mapping of a set of project expressions, or null if projection is
+   * not a mapping
    */
   public static Mappings.TargetMapping getMapping(int inputFieldCount,
       List<? extends RexNode> projects) {
     Mappings.TargetMapping mapping =
-        Mappings.create(
-            MappingType.INVERSE_SURJECTION, inputFieldCount, projects.size());
+        Mappings.create(MappingType.INVERSE_SURJECTION,
+            inputFieldCount, projects.size());
     for (Ord<RexNode> exp : Ord.zip(projects)) {
       if (!(exp.e instanceof RexInputRef)) {
         return null;
@@ -293,6 +294,32 @@ public abstract class Project extends SingleRel {
   }
 
   /**
+   * Returns a partial mapping of a set of project expressions.
+   *
+   * <p>The mapping is an inverse function.
+   * Every target has a source field, but
+   * a source might have 0, 1 or more targets.
+   * Project expressions that do not consist of
+   * a mapping are ignored.
+   *
+   * @param inputFieldCount Number of input fields
+   * @param projects Project expressions
+   * @return Mapping of a set of project expressions, never null
+   */
+  public static Mappings.TargetMapping getPartialMapping(int inputFieldCount,
+      List<? extends RexNode> projects) {
+    Mappings.TargetMapping mapping =
+        Mappings.create(MappingType.INVERSE_FUNCTION,
+            inputFieldCount, projects.size());
+    for (Ord<RexNode> exp : Ord.zip(projects)) {
+      if (exp.e instanceof RexInputRef) {
+        mapping.set(((RexInputRef) exp.e).getIndex(), exp.i);
+      }
+    }
+    return mapping;
+  }
+
+  /**
    * Returns a permutation, if this projection is merely a permutation of its
    * input fields; otherwise null.
    *

http://git-wip-us.apache.org/repos/asf/incubator-calcite/blob/03e94498/core/src/main/java/org/apache/calcite/rel/metadata/RelMdDistribution.java
----------------------------------------------------------------------
diff --git a/core/src/main/java/org/apache/calcite/rel/metadata/RelMdDistribution.java b/core/src/main/java/org/apache/calcite/rel/metadata/RelMdDistribution.java
index 086cc64..67ac6a2 100644
--- a/core/src/main/java/org/apache/calcite/rel/metadata/RelMdDistribution.java
+++ b/core/src/main/java/org/apache/calcite/rel/metadata/RelMdDistribution.java
@@ -138,7 +138,8 @@ public class RelMdDistribution {
     final RelDistribution inputDistribution =
         RelMetadataQuery.distribution(input);
     final Mappings.TargetMapping mapping =
-        Project.getMapping(input.getRowType().getFieldCount(), projects);
+        Project.getPartialMapping(input.getRowType().getFieldCount(),
+            projects);
     return inputDistribution.apply(mapping);
   }