You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@calcite.apache.org by ja...@apache.org on 2021/12/14 00:11:46 UTC

[calcite] branch master updated: [CALCITE-4929] Implement default getDef() methods in MetadataHandler interfaces

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

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


The following commit(s) were added to refs/heads/master by this push:
     new 4ff5fa8  [CALCITE-4929] Implement default getDef() methods in MetadataHandler interfaces
4ff5fa8 is described below

commit 4ff5fa89c180ebc30d8fb324c2a50b0e9797b9ca
Author: Jacques Nadeau <ja...@apache.org>
AuthorDate: Thu Dec 9 15:14:54 2021 -0800

    [CALCITE-4929] Implement default getDef() methods in MetadataHandler interfaces
    
    - Add default getDef() methods.
    - Mark all function metadata handler interfaces as FunctionalInterface where possible.
    - Update MetdataDef and RelMetdataHandlerGeneratorUtil to ignore getDef() methods.
---
 .../calcite/rel/metadata/BuiltInMetadata.java      | 125 +++++++++++++++++++++
 .../apache/calcite/rel/metadata/MetadataDef.java   |   3 +-
 .../janino/RelMetadataHandlerGeneratorUtil.java    |   3 +-
 3 files changed, 129 insertions(+), 2 deletions(-)

diff --git a/core/src/main/java/org/apache/calcite/rel/metadata/BuiltInMetadata.java b/core/src/main/java/org/apache/calcite/rel/metadata/BuiltInMetadata.java
index 614cc15..a2467a4 100644
--- a/core/src/main/java/org/apache/calcite/rel/metadata/BuiltInMetadata.java
+++ b/core/src/main/java/org/apache/calcite/rel/metadata/BuiltInMetadata.java
@@ -61,8 +61,13 @@ public abstract class BuiltInMetadata {
     @Nullable Double getSelectivity(@Nullable RexNode predicate);
 
     /** Handler API. */
+    @FunctionalInterface
     interface Handler extends MetadataHandler<Selectivity> {
       @Nullable Double getSelectivity(RelNode r, RelMetadataQuery mq, @Nullable RexNode predicate);
+
+      @Override default MetadataDef<Selectivity> getDef() {
+        return DEF;
+      }
     }
   }
 
@@ -87,9 +92,14 @@ public abstract class BuiltInMetadata {
     @Nullable Set<ImmutableBitSet> getUniqueKeys(boolean ignoreNulls);
 
     /** Handler API. */
+    @FunctionalInterface
     interface Handler extends MetadataHandler<UniqueKeys> {
       @Nullable Set<ImmutableBitSet> getUniqueKeys(RelNode r, RelMetadataQuery mq,
           boolean ignoreNulls);
+
+      @Override default MetadataDef<UniqueKeys> getDef() {
+        return DEF;
+      }
     }
   }
 
@@ -123,9 +133,14 @@ public abstract class BuiltInMetadata {
     Boolean areColumnsUnique(ImmutableBitSet columns, boolean ignoreNulls);
 
     /** Handler API. */
+    @FunctionalInterface
     interface Handler extends MetadataHandler<ColumnUniqueness> {
       Boolean areColumnsUnique(RelNode r, RelMetadataQuery mq,
           ImmutableBitSet columns, boolean ignoreNulls);
+
+      @Override default MetadataDef<ColumnUniqueness> getDef() {
+        return DEF;
+      }
     }
   }
 
@@ -138,8 +153,13 @@ public abstract class BuiltInMetadata {
     ImmutableList<RelCollation> collations();
 
     /** Handler API. */
+    @FunctionalInterface
     interface Handler extends MetadataHandler<Collation> {
       ImmutableList<RelCollation> collations(RelNode r, RelMetadataQuery mq);
+
+      @Override default MetadataDef<Collation> getDef() {
+        return DEF;
+      }
     }
   }
 
@@ -162,8 +182,13 @@ public abstract class BuiltInMetadata {
     RelDistribution distribution();
 
     /** Handler API. */
+    @FunctionalInterface
     interface Handler extends MetadataHandler<Distribution> {
       RelDistribution distribution(RelNode r, RelMetadataQuery mq);
+
+      @Override default MetadataDef<Distribution> getDef() {
+        return DEF;
+      }
     }
   }
 
@@ -186,9 +211,14 @@ public abstract class BuiltInMetadata {
     @Nullable Multimap<Class<? extends RelNode>, RelNode> getNodeTypes();
 
     /** Handler API. */
+    @FunctionalInterface
     interface Handler extends MetadataHandler<NodeTypes> {
       @Nullable Multimap<Class<? extends RelNode>, RelNode> getNodeTypes(RelNode r,
           RelMetadataQuery mq);
+
+      @Override default MetadataDef<NodeTypes> getDef() {
+        return DEF;
+      }
     }
   }
 
@@ -209,8 +239,13 @@ public abstract class BuiltInMetadata {
     @Nullable Double getRowCount();
 
     /** Handler API. */
+    @FunctionalInterface
     interface Handler extends MetadataHandler<RowCount> {
       @Nullable Double getRowCount(RelNode r, RelMetadataQuery mq);
+
+      @Override default MetadataDef<RowCount> getDef() {
+        return DEF;
+      }
     }
   }
 
@@ -233,8 +268,13 @@ public abstract class BuiltInMetadata {
     @Nullable Double getMaxRowCount();
 
     /** Handler API. */
+    @FunctionalInterface
     interface Handler extends MetadataHandler<MaxRowCount> {
       @Nullable Double getMaxRowCount(RelNode r, RelMetadataQuery mq);
+
+      @Override default MetadataDef<MaxRowCount> getDef() {
+        return DEF;
+      }
     }
   }
 
@@ -256,8 +296,13 @@ public abstract class BuiltInMetadata {
     @Nullable Double getMinRowCount();
 
     /** Handler API. */
+    @FunctionalInterface
     interface Handler extends MetadataHandler<MinRowCount> {
       @Nullable Double getMinRowCount(RelNode r, RelMetadataQuery mq);
+
+      @Override default MetadataDef<MinRowCount> getDef() {
+        return DEF;
+      }
     }
   }
 
@@ -282,9 +327,14 @@ public abstract class BuiltInMetadata {
     @Nullable Double getDistinctRowCount(ImmutableBitSet groupKey, @Nullable RexNode predicate);
 
     /** Handler API. */
+    @FunctionalInterface
     interface Handler extends MetadataHandler<DistinctRowCount> {
       @Nullable Double getDistinctRowCount(RelNode r, RelMetadataQuery mq,
           ImmutableBitSet groupKey, @Nullable RexNode predicate);
+
+      @Override default MetadataDef<DistinctRowCount> getDef() {
+        return DEF;
+      }
     }
   }
 
@@ -307,8 +357,13 @@ public abstract class BuiltInMetadata {
     @Nullable Double getPercentageOriginalRows();
 
     /** Handler API. */
+    @FunctionalInterface
     interface Handler extends MetadataHandler<PercentageOriginalRows> {
       @Nullable Double getPercentageOriginalRows(RelNode r, RelMetadataQuery mq);
+
+      @Override default MetadataDef<PercentageOriginalRows> getDef() {
+        return DEF;
+      }
     }
   }
 
@@ -332,9 +387,14 @@ public abstract class BuiltInMetadata {
     @Nullable Double getPopulationSize(ImmutableBitSet groupKey);
 
     /** Handler API. */
+    @FunctionalInterface
     interface Handler extends MetadataHandler<PopulationSize> {
       @Nullable Double getPopulationSize(RelNode r, RelMetadataQuery mq,
           ImmutableBitSet groupKey);
+
+      @Override default MetadataDef<PopulationSize> getDef() {
+        return DEF;
+      }
     }
   }
 
@@ -373,6 +433,10 @@ public abstract class BuiltInMetadata {
     interface Handler extends MetadataHandler<Size> {
       @Nullable Double averageRowSize(RelNode r, RelMetadataQuery mq);
       @Nullable List<@Nullable Double> averageColumnSizes(RelNode r, RelMetadataQuery mq);
+
+      @Override default MetadataDef<Size> getDef() {
+        return DEF;
+      }
     }
   }
 
@@ -396,9 +460,14 @@ public abstract class BuiltInMetadata {
     @Nullable Set<RelColumnOrigin> getColumnOrigins(int outputColumn);
 
     /** Handler API. */
+    @FunctionalInterface
     interface Handler extends MetadataHandler<ColumnOrigin> {
       @Nullable Set<RelColumnOrigin> getColumnOrigins(RelNode r, RelMetadataQuery mq,
           int outputColumn);
+
+      @Override default MetadataDef<ColumnOrigin> getDef() {
+        return DEF;
+      }
     }
   }
 
@@ -433,9 +502,14 @@ public abstract class BuiltInMetadata {
     @Nullable Set<RexNode> getExpressionLineage(RexNode expression);
 
     /** Handler API. */
+    @FunctionalInterface
     interface Handler extends MetadataHandler<ExpressionLineage> {
       @Nullable Set<RexNode> getExpressionLineage(RelNode r, RelMetadataQuery mq,
           RexNode expression);
+
+      @Override default MetadataDef<ExpressionLineage> getDef() {
+        return DEF;
+      }
     }
   }
 
@@ -463,8 +537,13 @@ public abstract class BuiltInMetadata {
     Set<RelTableRef> getTableReferences();
 
     /** Handler API. */
+    @FunctionalInterface
     interface Handler extends MetadataHandler<TableReferences> {
       Set<RelTableRef> getTableReferences(RelNode r, RelMetadataQuery mq);
+
+      @Override default MetadataDef<TableReferences> getDef() {
+        return DEF;
+      }
     }
   }
 
@@ -487,8 +566,14 @@ public abstract class BuiltInMetadata {
     RelOptCost getCumulativeCost();
 
     /** Handler API. */
+    @FunctionalInterface
     interface Handler extends MetadataHandler<CumulativeCost> {
       RelOptCost getCumulativeCost(RelNode r, RelMetadataQuery mq);
+
+      @Override default MetadataDef<CumulativeCost> getDef() {
+        return DEF;
+      }
+
     }
   }
 
@@ -514,8 +599,14 @@ public abstract class BuiltInMetadata {
     RelOptCost getNonCumulativeCost();
 
     /** Handler API. */
+    @FunctionalInterface
     interface Handler extends MetadataHandler<NonCumulativeCost> {
       RelOptCost getNonCumulativeCost(RelNode r, RelMetadataQuery mq);
+
+      @Override default MetadataDef<NonCumulativeCost> getDef() {
+        return DEF;
+      }
+
     }
   }
 
@@ -535,9 +626,15 @@ public abstract class BuiltInMetadata {
     Boolean isVisibleInExplain(SqlExplainLevel explainLevel);
 
     /** Handler API. */
+    @FunctionalInterface
     interface Handler extends MetadataHandler<ExplainVisibility> {
       Boolean isVisibleInExplain(RelNode r, RelMetadataQuery mq,
           SqlExplainLevel explainLevel);
+
+      @Override default MetadataDef<ExplainVisibility> getDef() {
+        return DEF;
+      }
+
     }
   }
 
@@ -556,8 +653,14 @@ public abstract class BuiltInMetadata {
     RelOptPredicateList getPredicates();
 
     /** Handler API. */
+    @FunctionalInterface
     interface Handler extends MetadataHandler<Predicates> {
       RelOptPredicateList getPredicates(RelNode r, RelMetadataQuery mq);
+
+      @Override default MetadataDef<Predicates> getDef() {
+        return DEF;
+      }
+
     }
   }
 
@@ -584,8 +687,14 @@ public abstract class BuiltInMetadata {
     @Nullable RelOptPredicateList getAllPredicates();
 
     /** Handler API. */
+    @FunctionalInterface
     interface Handler extends MetadataHandler<AllPredicates> {
       @Nullable RelOptPredicateList getAllPredicates(RelNode r, RelMetadataQuery mq);
+
+      @Override default MetadataDef<AllPredicates> getDef() {
+        return DEF;
+      }
+
     }
   }
 
@@ -622,6 +731,11 @@ public abstract class BuiltInMetadata {
     interface Handler extends MetadataHandler<Parallelism> {
       Boolean isPhaseTransition(RelNode r, RelMetadataQuery mq);
       Integer splitCount(RelNode r, RelMetadataQuery mq);
+
+      @Override default MetadataDef<Parallelism> getDef() {
+        return DEF;
+      }
+
     }
   }
 
@@ -634,9 +748,15 @@ public abstract class BuiltInMetadata {
     RelOptCost getLowerBoundCost(VolcanoPlanner planner);
 
     /** Handler API. */
+    @FunctionalInterface
     interface Handler extends MetadataHandler<LowerBoundCost> {
       RelOptCost getLowerBoundCost(
           RelNode r, RelMetadataQuery mq, VolcanoPlanner planner);
+
+      @Override default MetadataDef<LowerBoundCost> getDef() {
+        return DEF;
+      }
+
     }
   }
 
@@ -684,6 +804,11 @@ public abstract class BuiltInMetadata {
       @Nullable Double memory(RelNode r, RelMetadataQuery mq);
       @Nullable Double cumulativeMemoryWithinPhase(RelNode r, RelMetadataQuery mq);
       @Nullable Double cumulativeMemoryWithinPhaseSplit(RelNode r, RelMetadataQuery mq);
+
+      @Override default MetadataDef<Memory> getDef() {
+        return DEF;
+      }
+
     }
   }
 
diff --git a/core/src/main/java/org/apache/calcite/rel/metadata/MetadataDef.java b/core/src/main/java/org/apache/calcite/rel/metadata/MetadataDef.java
index 025a19d..1ee8af0 100644
--- a/core/src/main/java/org/apache/calcite/rel/metadata/MetadataDef.java
+++ b/core/src/main/java/org/apache/calcite/rel/metadata/MetadataDef.java
@@ -40,7 +40,8 @@ public class MetadataDef<M extends Metadata> {
     this.metadataClass = metadataClass;
     this.handlerClass = handlerClass;
     this.methods = ImmutableList.copyOf(methods);
-    final Method[] handlerMethods = handlerClass.getDeclaredMethods();
+    final Method[] handlerMethods = Arrays.stream(handlerClass.getDeclaredMethods())
+        .filter(m -> !m.getName().equals("getDef")).toArray(i -> new Method[i]);
 
     // Handler must have the same methods as Metadata, each method having
     // additional "subclass-of-RelNode, RelMetadataQuery" parameters.
diff --git a/core/src/main/java/org/apache/calcite/rel/metadata/janino/RelMetadataHandlerGeneratorUtil.java b/core/src/main/java/org/apache/calcite/rel/metadata/janino/RelMetadataHandlerGeneratorUtil.java
index ca24798..d68d338 100644
--- a/core/src/main/java/org/apache/calcite/rel/metadata/janino/RelMetadataHandlerGeneratorUtil.java
+++ b/core/src/main/java/org/apache/calcite/rel/metadata/janino/RelMetadataHandlerGeneratorUtil.java
@@ -62,7 +62,8 @@ public class RelMetadataHandlerGeneratorUtil {
         .getName();
     final String name =
         "GeneratedMetadata_" + simpleNameForHandler(handlerClass);
-    final Method[] declaredMethods = handlerClass.getDeclaredMethods();
+    final Method[] declaredMethods = Arrays.stream(handlerClass.getDeclaredMethods())
+        .filter(m -> !m.getName().equals("getDef")).toArray(i -> new Method[i]);
     Arrays.sort(declaredMethods, Comparator.comparing(Method::getName));
 
     final Map<MetadataHandler<?>, String> handlerToName = new LinkedHashMap<>();