Interface RelMetadataProvider

All Known Implementing Classes:
CachingRelMetadataProvider, ChainedRelMetadataProvider, DefaultRelMetadataProvider, JaninoRelMetadataProvider, ReflectiveRelMetadataProvider, VolcanoRelMetadataProvider

public interface RelMetadataProvider
RelMetadataProvider defines an interface for obtaining metadata about relational expressions. This interface is weakly-typed and is not intended to be called directly in most contexts; instead, use a strongly-typed facade such as RelMetadataQuery.

For background and motivation, see wiki.

If your provider is not a singleton, we recommend that you implement Object.equals(Object) and Object.hashCode() methods. This makes the cache of JaninoRelMetadataProvider more effective.

  • Method Details

    • apply

      @Deprecated <@Nullable M extends @Nullable Metadata> @Nullable UnboundMetadata<M> apply(Class<? extends RelNode> relClass, Class<? extends @Nullable M> metadataClass)
      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);
      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
    • handlers

      @Deprecated <M extends Metadata><Method,MetadataHandler<M>> handlers(MetadataDef<M> def)
    • handlers

      List<MetadataHandler<?>> handlers(Class<? extends MetadataHandler<?>> handlerClass)
      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.