You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@calcite.apache.org by vl...@apache.org on 2018/09/25 12:57:39 UTC
calcite git commit: Canonize simple cases for composite traits in
trait factory
Repository: calcite
Updated Branches:
refs/heads/master c3215241e -> b31da2246
Canonize simple cases for composite traits in trait factory
This avoids creating distinct subsets for cases like "empty collation trait"
Project: http://git-wip-us.apache.org/repos/asf/calcite/repo
Commit: http://git-wip-us.apache.org/repos/asf/calcite/commit/b31da224
Tree: http://git-wip-us.apache.org/repos/asf/calcite/tree/b31da224
Diff: http://git-wip-us.apache.org/repos/asf/calcite/diff/b31da224
Branch: refs/heads/master
Commit: b31da22465e355cf7a6f3c5f9de9bf9ff0190a4b
Parents: c321524
Author: Vladimir Sitnikov <si...@gmail.com>
Authored: Mon Sep 24 19:33:59 2018 +0300
Committer: Vladimir Sitnikov <si...@gmail.com>
Committed: Tue Sep 25 15:56:01 2018 +0300
----------------------------------------------------------------------
.../apache/calcite/plan/RelCompositeTrait.java | 22 ++-----
.../org/apache/calcite/plan/RelTraitTest.java | 62 ++++++++++++++++++++
.../org/apache/calcite/test/CalciteSuite.java | 2 +
.../calcite/test/MaterializationTest.java | 2 +-
.../org/apache/calcite/test/QuidemTest.java | 3 +
core/src/test/resources/sql/misc.iq | 2 +-
6 files changed, 73 insertions(+), 20 deletions(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/calcite/blob/b31da224/core/src/main/java/org/apache/calcite/plan/RelCompositeTrait.java
----------------------------------------------------------------------
diff --git a/core/src/main/java/org/apache/calcite/plan/RelCompositeTrait.java b/core/src/main/java/org/apache/calcite/plan/RelCompositeTrait.java
index a66bf7b..892088e 100644
--- a/core/src/main/java/org/apache/calcite/plan/RelCompositeTrait.java
+++ b/core/src/main/java/org/apache/calcite/plan/RelCompositeTrait.java
@@ -52,11 +52,13 @@ class RelCompositeTrait<T extends RelMultipleTrait> implements RelTrait {
/** Creates a RelCompositeTrait. The constituent traits are canonized. */
@SuppressWarnings("unchecked")
- static <T extends RelMultipleTrait> RelCompositeTrait<T> of(RelTraitDef def,
+ static <T extends RelMultipleTrait> RelTrait of(RelTraitDef def,
List<T> traitList) {
final RelCompositeTrait<T> compositeTrait;
if (traitList.isEmpty()) {
- compositeTrait = new EmptyCompositeTrait<>(def);
+ return def.getDefault();
+ } else if (traitList.size() == 1) {
+ return def.canonize(traitList.get(0));
} else {
final RelMultipleTrait[] traits =
traitList.toArray(new RelMultipleTrait[0]);
@@ -130,22 +132,6 @@ class RelCompositeTrait<T extends RelMultipleTrait> implements RelTrait {
public int size() {
return traits.length;
}
-
- /** Composite trait with 0 elements.
- *
- * @param <T> trait type */
- private static class EmptyCompositeTrait<T extends RelMultipleTrait>
- extends RelCompositeTrait<T> {
- private EmptyCompositeTrait(RelTraitDef traitDef) {
- //noinspection unchecked
- super(traitDef, (T[]) new RelMultipleTrait[0]);
- }
-
- @Override public boolean satisfies(RelTrait trait) {
- //noinspection unchecked
- return ((T) trait).isTop();
- }
- }
}
// End RelCompositeTrait.java
http://git-wip-us.apache.org/repos/asf/calcite/blob/b31da224/core/src/test/java/org/apache/calcite/plan/RelTraitTest.java
----------------------------------------------------------------------
diff --git a/core/src/test/java/org/apache/calcite/plan/RelTraitTest.java b/core/src/test/java/org/apache/calcite/plan/RelTraitTest.java
new file mode 100644
index 0000000..043a5ab
--- /dev/null
+++ b/core/src/test/java/org/apache/calcite/plan/RelTraitTest.java
@@ -0,0 +1,62 @@
+/*
+ * 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.plan;
+
+import org.apache.calcite.rel.RelCollation;
+import org.apache.calcite.rel.RelCollationTraitDef;
+import org.apache.calcite.rel.RelCollations;
+
+import com.google.common.collect.ImmutableList;
+
+import org.junit.Assert;
+import org.junit.Test;
+
+import java.util.List;
+import java.util.function.Supplier;
+
+/**
+ * Test to verify {@link RelCompositeTrait}.
+ */
+public class RelTraitTest {
+ private static final RelCollationTraitDef COLLATION = RelCollationTraitDef.INSTANCE;
+
+ private void assertCanonical(String message, Supplier<List<RelCollation>> collation) {
+ RelTrait trait1 = RelCompositeTrait.of(COLLATION, collation.get());
+ RelTrait trait2 = RelCompositeTrait.of(COLLATION, collation.get());
+
+ Assert.assertEquals(
+ "RelCompositeTrait.of should return the same instance for " + message,
+ trait1 + " @" + Integer.toHexString(System.identityHashCode(trait1)),
+ trait2 + " @" + Integer.toHexString(System.identityHashCode(trait2)));
+ }
+
+ @Test public void compositeEmpty() {
+ assertCanonical("empty composite", ImmutableList::of);
+ }
+
+ @Test public void compositeOne() {
+ assertCanonical("composite with one element",
+ () -> ImmutableList.of(RelCollations.of(ImmutableList.of())));
+ }
+
+ @Test public void compositeTwo() {
+ assertCanonical("composite with two elements",
+ () -> ImmutableList.of(RelCollations.of(0), RelCollations.of(1)));
+ }
+}
+
+// End RelTraitTest.java
http://git-wip-us.apache.org/repos/asf/calcite/blob/b31da224/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 27c7b1b..4d3e67d 100644
--- a/core/src/test/java/org/apache/calcite/test/CalciteSuite.java
+++ b/core/src/test/java/org/apache/calcite/test/CalciteSuite.java
@@ -21,6 +21,7 @@ import org.apache.calcite.adapter.clone.ArrayTableTest;
import org.apache.calcite.jdbc.CalciteRemoteDriverTest;
import org.apache.calcite.plan.RelOptPlanReaderTest;
import org.apache.calcite.plan.RelOptUtilTest;
+import org.apache.calcite.plan.RelTraitTest;
import org.apache.calcite.plan.RelWriterTest;
import org.apache.calcite.plan.volcano.CollationConversionTest;
import org.apache.calcite.plan.volcano.ComboRuleTest;
@@ -105,6 +106,7 @@ import org.junit.runners.Suite;
InterpreterTest.class,
TestUtilTest.class,
VolcanoPlannerTest.class,
+ RelTraitTest.class,
HepPlannerTest.class,
TraitPropagationTest.class,
RelDistributionTest.class,
http://git-wip-us.apache.org/repos/asf/calcite/blob/b31da224/core/src/test/java/org/apache/calcite/test/MaterializationTest.java
----------------------------------------------------------------------
diff --git a/core/src/test/java/org/apache/calcite/test/MaterializationTest.java b/core/src/test/java/org/apache/calcite/test/MaterializationTest.java
index 1c95b8f..4b465f1 100644
--- a/core/src/test/java/org/apache/calcite/test/MaterializationTest.java
+++ b/core/src/test/java/org/apache/calcite/test/MaterializationTest.java
@@ -545,7 +545,7 @@ public class MaterializationTest {
HR_FKUK_MODEL,
CalciteAssert.checkResultContains(
"EnumerableCalc(expr#0..1=[{inputs}], expr#2=[1], "
- + "expr#3=[+($t1, $t2)], $f0=[$t3], deptno=[$t0])\n"
+ + "expr#3=[+($t1, $t2)], C=[$t3], deptno=[$t0])\n"
+ " EnumerableAggregate(group=[{1}], agg#0=[$SUM0($2)])\n"
+ " EnumerableTableScan(table=[[hr, m0]])"));
}
http://git-wip-us.apache.org/repos/asf/calcite/blob/b31da224/core/src/test/java/org/apache/calcite/test/QuidemTest.java
----------------------------------------------------------------------
diff --git a/core/src/test/java/org/apache/calcite/test/QuidemTest.java b/core/src/test/java/org/apache/calcite/test/QuidemTest.java
index 202b8c1..12e5d2e 100644
--- a/core/src/test/java/org/apache/calcite/test/QuidemTest.java
+++ b/core/src/test/java/org/apache/calcite/test/QuidemTest.java
@@ -200,6 +200,9 @@ public abstract class QuidemTest {
if (cause instanceof Exception) {
throw (Exception) cause;
}
+ if (cause instanceof Error) {
+ throw (Error) cause;
+ }
throw e;
}
} else {
http://git-wip-us.apache.org/repos/asf/calcite/blob/b31da224/core/src/test/resources/sql/misc.iq
----------------------------------------------------------------------
diff --git a/core/src/test/resources/sql/misc.iq b/core/src/test/resources/sql/misc.iq
index 51c99ba..0862a54 100644
--- a/core/src/test/resources/sql/misc.iq
+++ b/core/src/test/resources/sql/misc.iq
@@ -683,7 +683,7 @@ from "sales_fact_1997" as s
join "product_class" as pc on p."product_class_id" = pc."product_class_id"
where c."city" = 'San Francisco'
and pc."product_department" = 'Snacks';
-EnumerableCalc(expr#0..56=[{inputs}], product_id0=[$t20], time_id=[$t21], customer_id=[$t22], promotion_id=[$t23], store_id=[$t24], store_sales=[$t25], store_cost=[$t26], unit_sales=[$t27], customer_id0=[$t28], account_num=[$t29], lname=[$t30], fname=[$t31], mi=[$t32], address1=[$t33], address2=[$t34], address3=[$t35], address4=[$t36], city=[$t37], state_province=[$t38], postal_code=[$t39], country=[$t40], customer_region_id=[$t41], phone1=[$t42], phone2=[$t43], birthdate=[$t44], marital_status=[$t45], yearly_income=[$t46], gender=[$t47], total_children=[$t48], num_children_at_home=[$t49], education=[$t50], date_accnt_opened=[$t51], member_card=[$t52], occupation=[$t53], houseowner=[$t54], num_cars_owned=[$t55], fullname=[$t56], product_class_id0=[$t5], product_id=[$t6], brand_name=[$t7], product_name=[$t8], SKU=[$t9], SRP=[$t10], gross_weight=[$t11], net_weight=[$t12], recyclable_package=[$t13], low_fat=[$t14], units_per_case=[$t15], cases_per_pallet=[$t16], shelf_width=[$t17], she
lf_height=[$t18], shelf_depth=[$t19], product_class_id=[$t0], product_subcategory=[$t1], product_category=[$t2], product_department=[$t3], product_family=[$t4])
+EnumerableCalc(expr#0..56=[{inputs}], product_id=[$t20], time_id=[$t21], customer_id=[$t22], promotion_id=[$t23], store_id=[$t24], store_sales=[$t25], store_cost=[$t26], unit_sales=[$t27], customer_id0=[$t28], account_num=[$t29], lname=[$t30], fname=[$t31], mi=[$t32], address1=[$t33], address2=[$t34], address3=[$t35], address4=[$t36], city=[$t37], state_province=[$t38], postal_code=[$t39], country=[$t40], customer_region_id=[$t41], phone1=[$t42], phone2=[$t43], birthdate=[$t44], marital_status=[$t45], yearly_income=[$t46], gender=[$t47], total_children=[$t48], num_children_at_home=[$t49], education=[$t50], date_accnt_opened=[$t51], member_card=[$t52], occupation=[$t53], houseowner=[$t54], num_cars_owned=[$t55], fullname=[$t56], product_class_id=[$t5], product_id0=[$t6], brand_name=[$t7], product_name=[$t8], SKU=[$t9], SRP=[$t10], gross_weight=[$t11], net_weight=[$t12], recyclable_package=[$t13], low_fat=[$t14], units_per_case=[$t15], cases_per_pallet=[$t16], shelf_width=[$t17], shel
f_height=[$t18], shelf_depth=[$t19], product_class_id0=[$t0], product_subcategory=[$t1], product_category=[$t2], product_department=[$t3], product_family=[$t4])
EnumerableJoin(condition=[=($6, $20)], joinType=[inner])
EnumerableJoin(condition=[=($0, $5)], joinType=[inner])
EnumerableCalc(expr#0..4=[{inputs}], expr#5=['Snacks'], expr#6=[=($t3, $t5)], proj#0..4=[{exprs}], $condition=[$t6])