public class ReflectiveRelMetadataProvider extends Object implements RelMetadataProvider, ReflectiveVisitor
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.
| Modifier and Type | Class and Description |
|---|---|
(package private) static class |
ReflectiveRelMetadataProvider.Space
Workspace for computing which methods can act as handlers for
given metadata methods.
|
(package private) static class |
ReflectiveRelMetadataProvider.Space2
Extended work space.
|
| Modifier and Type | Field and Description |
|---|---|
private com.google.common.collect.ImmutableMultimap<Method,MetadataHandler> |
handlerMap |
private ConcurrentMap<Class<RelNode>,UnboundMetadata> |
map |
private Class<? extends Metadata> |
metadataClass0 |
| Modifier | Constructor and Description |
|---|---|
protected |
ReflectiveRelMetadataProvider(ConcurrentMap<Class<RelNode>,UnboundMetadata> map,
Class<? extends Metadata> metadataClass0,
com.google.common.collect.Multimap<Method,MetadataHandler> handlerMap)
Creates a ReflectiveRelMetadataProvider.
|
| Modifier and Type | Method and Description |
|---|---|
<M extends Metadata> |
apply(Class<? extends RelNode> relClass) |
<M extends Metadata> |
apply(Class<? extends RelNode> relClass,
Class<? extends M> metadataClass)
Retrieves metadata of a particular type and for a particular sub-class
of relational expression.
|
private static boolean |
couldImplement(Method handlerMethod,
Method method) |
<M extends Metadata> |
handlers(MetadataDef<M> def) |
private static RelMetadataProvider |
reflectiveSource(MetadataHandler target,
com.google.common.collect.ImmutableList<Method> methods) |
static RelMetadataProvider |
reflectiveSource(MetadataHandler target,
Method... methods)
Returns a reflective metadata provider that implements several
methods.
|
static RelMetadataProvider |
reflectiveSource(Method method,
MetadataHandler target)
Returns an implementation of
RelMetadataProvider that scans for
methods with a preceding argument. |
private final ConcurrentMap<Class<RelNode>,UnboundMetadata> map
private final com.google.common.collect.ImmutableMultimap<Method,MetadataHandler> handlerMap
protected ReflectiveRelMetadataProvider(ConcurrentMap<Class<RelNode>,UnboundMetadata> map, Class<? extends Metadata> metadataClass0, com.google.common.collect.Multimap<Method,MetadataHandler> handlerMap)
map - MapmetadataClass0 - Metadata classhandlerMap - Methods handled and the objects to call them onpublic static RelMetadataProvider reflectiveSource(Method method, MetadataHandler target)
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.
public static RelMetadataProvider reflectiveSource(MetadataHandler target, Method... methods)
private static RelMetadataProvider reflectiveSource(MetadataHandler target, com.google.common.collect.ImmutableList<Method> methods)
public <M extends Metadata> com.google.common.collect.Multimap<Method,MetadataHandler<M>> handlers(MetadataDef<M> def)
handlers in interface RelMetadataProviderpublic <M extends Metadata> UnboundMetadata<M> apply(Class<? extends RelNode> relClass, Class<? extends M> metadataClass)
RelMetadataProviderThe 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);
apply in interface RelMetadataProviderrelClass - Type of relational expressionmetadataClass - Type of metadatapublic <M extends Metadata> UnboundMetadata<M> apply(Class<? extends RelNode> relClass)
Copyright © 2012–2018 The Apache Software Foundation. All rights reserved.