Class 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)
      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)
      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><Method,MetadataHandler<M>> handlers(MetadataDef<M> def)
      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)
      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
      relClass - Type of relational expression
      metadataClass - Type of metadata
      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)