Class ReflectiveRelMetadataProvider

java.lang.Object
org.apache.calcite.rel.metadata.ReflectiveRelMetadataProvider
All Implemented Interfaces:
RelMetadataProvider, ReflectiveVisitor

public class ReflectiveRelMetadataProvider extends Object implements RelMetadataProvider, ReflectiveVisitor
Implementation of the RelMetadataProvider interface that dispatches metadata methods to methods on a given object via reflection.

The methods on the target object must be public and non-static, and have the same signature as the implemented metadata method except for an additional first parameter of type RelNode or a sub-class. That parameter gives this provider an indication of that relational expressions it can handle.

For an example, see RelMdColumnOrigins.SOURCE.

  • Constructor Details

  • Method Details

    • reflectiveSource

      @Deprecated public static RelMetadataProvider reflectiveSource(Method method, MetadataHandler target)
      Deprecated.
      Returns an implementation of RelMetadataProvider that scans for methods with a preceding argument.

      For example, BuiltInMetadata.Selectivity has a method BuiltInMetadata.Selectivity.getSelectivity(RexNode). A class

      
       class RelMdSelectivity {
         public Double getSelectivity(Union rel, RexNode predicate) { }
         public Double getSelectivity(Filter rel, RexNode predicate) { }
       

      provides implementations of selectivity for relational expressions that extend Union or Filter.

    • reflectiveSource

      @Deprecated public static RelMetadataProvider reflectiveSource(MetadataHandler target, Method... methods)
      Deprecated.
      Returns a reflective metadata provider that implements several methods.
    • reflectiveSource

      public static <M extends Metadata> RelMetadataProvider reflectiveSource(MetadataHandler<? extends M> handler, Class<? extends MetadataHandler<M>> handlerClass)
    • handlers

      @Deprecated public <M extends Metadata> com.google.common.collect.Multimap<Method,MetadataHandler<M>> handlers(MetadataDef<M> def)
      Deprecated.
      Specified by:
      handlers in interface RelMetadataProvider
    • handlers

      public List<MetadataHandler<?>> handlers(Class<? extends MetadataHandler<?>> handlerClass)
      Description copied from interface: RelMetadataProvider
      Retrieves a list of MetadataHandler for implements a particular MetadataHandler.class. The resolution order is specificity of the relNode class, with preference given to handlers that occur earlier in the list. For instance, given a return list of {A, B, C} where A implements RelNode and Scan, B implements Scan, and C implements LogicalScan and Filter. Scan dispatches to a.method(Scan) LogicalFilter dispatches to c.method(Filter). LogicalScan dispatches to c.method(LogicalScan). Aggregate dispatches to a.method(RelNode). The behavior is undefined if the class hierarchy for dispatching is not a tree.
      Specified by:
      handlers in interface RelMetadataProvider
    • apply

      @Deprecated public <@Nullable M extends @Nullable Metadata> @Nullable UnboundMetadata<M> apply(Class<? extends RelNode> relClass, Class<? extends @Nullable M> metadataClass)
      Deprecated.
      Description copied from interface: RelMetadataProvider
      Retrieves metadata of a particular type and for a particular sub-class of relational expression.

      The object returned is a function. It can be applied to a relational expression of the given type to create a metadata object.

      For example, you might call

       RelMetadataProvider provider;
       LogicalFilter filter;
       RexNode predicate;
       Function<RelNode, Metadata> function =
         provider.apply(LogicalFilter.class, Selectivity.class};
       Selectivity selectivity = function.apply(filter);
       Double d = selectivity.selectivity(predicate);
       
      Specified by:
      apply in interface RelMetadataProvider
      Parameters:
      relClass - Type of relational expression
      metadataClass - Type of metadata
      Returns:
      Function that will field a metadata instance; or null if this provider cannot supply metadata of this type
    • apply

      @Deprecated public <@Nullable M extends @Nullable Metadata> @Nullable UnboundMetadata<M> apply(Class<? extends RelNode> relClass)
      Deprecated.