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 2017/11/06 17:02:56 UTC

calcite git commit: [CALCITE-1990] Make RelDistribution extend RelMultipleTrait (LeoWangLZ)

Repository: calcite
Updated Branches:
  refs/heads/master d7c4627c7 -> 9c5ebe340


[CALCITE-1990] Make RelDistribution extend RelMultipleTrait (LeoWangLZ)

Close apache/calcite#541


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

Branch: refs/heads/master
Commit: 9c5ebe340ac45d2d71f3dd3cde391d04ca19a771
Parents: d7c4627
Author: LeoWangLZ <wa...@163.com>
Authored: Fri Sep 22 10:15:34 2017 +0800
Committer: Julian Hyde <jh...@apache.org>
Committed: Sat Nov 4 16:28:01 2017 -0700

----------------------------------------------------------------------
 .../org/apache/calcite/rel/RelDistribution.java |  4 +-
 .../apache/calcite/rel/RelDistributions.java    | 18 +++++++
 .../apache/calcite/rel/RelDistributionTest.java | 53 ++++++++++++++++++++
 .../org/apache/calcite/test/CalciteSuite.java   |  2 +
 4 files changed, 75 insertions(+), 2 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/calcite/blob/9c5ebe34/core/src/main/java/org/apache/calcite/rel/RelDistribution.java
----------------------------------------------------------------------
diff --git a/core/src/main/java/org/apache/calcite/rel/RelDistribution.java b/core/src/main/java/org/apache/calcite/rel/RelDistribution.java
index 16f3f7c..22b722e 100644
--- a/core/src/main/java/org/apache/calcite/rel/RelDistribution.java
+++ b/core/src/main/java/org/apache/calcite/rel/RelDistribution.java
@@ -16,7 +16,7 @@
  */
 package org.apache.calcite.rel;
 
-import org.apache.calcite.plan.RelTrait;
+import org.apache.calcite.plan.RelMultipleTrait;
 import org.apache.calcite.util.mapping.Mappings;
 
 import java.util.List;
@@ -35,7 +35,7 @@ import javax.annotation.Nonnull;
  *       registered with the planner that are not trait-defs.
  * </ul>
  */
-public interface RelDistribution extends RelTrait {
+public interface RelDistribution extends RelMultipleTrait {
   /** Returns the type of distribution. */
   @Nonnull Type getType();
 

http://git-wip-us.apache.org/repos/asf/calcite/blob/9c5ebe34/core/src/main/java/org/apache/calcite/rel/RelDistributions.java
----------------------------------------------------------------------
diff --git a/core/src/main/java/org/apache/calcite/rel/RelDistributions.java b/core/src/main/java/org/apache/calcite/rel/RelDistributions.java
index f739da8..3c5dc4a 100644
--- a/core/src/main/java/org/apache/calcite/rel/RelDistributions.java
+++ b/core/src/main/java/org/apache/calcite/rel/RelDistributions.java
@@ -16,6 +16,7 @@
  */
 package org.apache.calcite.rel;
 
+import org.apache.calcite.plan.RelMultipleTrait;
 import org.apache.calcite.plan.RelOptPlanner;
 import org.apache.calcite.plan.RelTrait;
 import org.apache.calcite.util.ImmutableIntList;
@@ -82,6 +83,8 @@ public class RelDistributions {
 
   /** Implementation of {@link org.apache.calcite.rel.RelDistribution}. */
   private static class RelDistributionImpl implements RelDistribution {
+    private static final Ordering<Iterable<Integer>> ORDERING =
+        Ordering.<Integer>natural().lexicographical();
     private final Type type;
     private final ImmutableIntList keys;
 
@@ -170,6 +173,21 @@ public class RelDistributions {
 
     public void register(RelOptPlanner planner) {
     }
+
+    @Override public boolean isTop() {
+      return type == Type.ANY;
+    }
+
+    @Override public int compareTo(@Nonnull RelMultipleTrait o) {
+      final RelDistribution distribution = (RelDistribution) o;
+      if (type == distribution.getType()
+          && (type == Type.HASH_DISTRIBUTED
+              || type == Type.RANGE_DISTRIBUTED)) {
+        return ORDERING.compare(getKeys(), distribution.getKeys());
+      }
+
+      return type.compareTo(distribution.getType());
+    }
   }
 }
 

http://git-wip-us.apache.org/repos/asf/calcite/blob/9c5ebe34/core/src/test/java/org/apache/calcite/rel/RelDistributionTest.java
----------------------------------------------------------------------
diff --git a/core/src/test/java/org/apache/calcite/rel/RelDistributionTest.java b/core/src/test/java/org/apache/calcite/rel/RelDistributionTest.java
new file mode 100644
index 0000000..1621855
--- /dev/null
+++ b/core/src/test/java/org/apache/calcite/rel/RelDistributionTest.java
@@ -0,0 +1,53 @@
+/*
+ * 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.calcite.rel;
+
+import org.apache.calcite.plan.RelTraitSet;
+
+import com.google.common.collect.ImmutableList;
+
+import org.junit.Test;
+
+import static org.hamcrest.CoreMatchers.is;
+import static org.junit.Assert.assertThat;
+
+/**
+ * Tests for {@link RelDistribution}.
+ */
+public class RelDistributionTest {
+  @Test public void testRelDistributionSatisfy() {
+    RelDistribution distribution1 = RelDistributions.hash(ImmutableList.of(0));
+    RelDistribution distribution2 = RelDistributions.hash(ImmutableList.of(1));
+
+    RelTraitSet traitSet = RelTraitSet.createEmpty();
+    RelTraitSet simpleTrait1 = traitSet.plus(distribution1);
+    RelTraitSet simpleTrait2 = traitSet.plus(distribution2);
+    RelTraitSet compositeTrait =
+        traitSet.replace(RelDistributionTraitDef.INSTANCE,
+            ImmutableList.of(distribution1, distribution2));
+
+    assertThat(compositeTrait.satisfies(simpleTrait1), is(true));
+    assertThat(compositeTrait.satisfies(simpleTrait2), is(true));
+
+    assertThat(distribution1.compareTo(distribution2), is(-1));
+    assertThat(distribution2.compareTo(distribution1), is(1));
+    //noinspection EqualsWithItself
+    assertThat(distribution2.compareTo(distribution2), is(0));
+  }
+}
+
+// End RelDistributionTest.java

http://git-wip-us.apache.org/repos/asf/calcite/blob/9c5ebe34/core/src/test/java/org/apache/calcite/test/CalciteSuite.java
----------------------------------------------------------------------
diff --git a/core/src/test/java/org/apache/calcite/test/CalciteSuite.java b/core/src/test/java/org/apache/calcite/test/CalciteSuite.java
index 4f9b075..b6f2b9f 100644
--- a/core/src/test/java/org/apache/calcite/test/CalciteSuite.java
+++ b/core/src/test/java/org/apache/calcite/test/CalciteSuite.java
@@ -29,6 +29,7 @@ import org.apache.calcite.plan.volcano.VolcanoPlannerTest;
 import org.apache.calcite.plan.volcano.VolcanoPlannerTraitTest;
 import org.apache.calcite.prepare.LookupOperatorOverloadsTest;
 import org.apache.calcite.rel.RelCollationTest;
+import org.apache.calcite.rel.RelDistributionTest;
 import org.apache.calcite.rel.rel2sql.RelToSqlConverterTest;
 import org.apache.calcite.rel.rules.DateRangeRulesTest;
 import org.apache.calcite.rex.RexBuilderTest;
@@ -99,6 +100,7 @@ import org.junit.runners.Suite;
     VolcanoPlannerTest.class,
     HepPlannerTest.class,
     TraitPropagationTest.class,
+    RelDistributionTest.class,
     RelWriterTest.class,
     RexProgramTest.class,
     SqlOperatorBindingTest.class,