Package org.apache.calcite.rel.metadata
Class ReflectiveRelMetadataProvider
- java.lang.Object
-
- org.apache.calcite.rel.metadata.ReflectiveRelMetadataProvider
-
- All Implemented Interfaces:
RelMetadataProvider
,ReflectiveVisitor
public class ReflectiveRelMetadataProvider extends java.lang.Object implements RelMetadataProvider, ReflectiveVisitor
Implementation of theRelMetadataProvider
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
.
-
-
Nested Class Summary
Nested Classes Modifier and Type Class 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.
-
Field Summary
Fields Modifier and Type Field Description private com.google.common.collect.ImmutableMultimap<java.lang.reflect.Method,MetadataHandler>
handlerMap
private java.util.concurrent.ConcurrentMap<java.lang.Class<RelNode>,UnboundMetadata>
map
private java.lang.Class<? extends Metadata>
metadataClass0
-
Constructor Summary
Constructors Modifier Constructor Description protected
ReflectiveRelMetadataProvider(java.util.concurrent.ConcurrentMap<java.lang.Class<RelNode>,UnboundMetadata> map, java.lang.Class<? extends Metadata> metadataClass0, com.google.common.collect.Multimap<java.lang.reflect.Method,MetadataHandler> handlerMap)
Creates a ReflectiveRelMetadataProvider.
-
Method Summary
All Methods Static Methods Instance Methods Concrete Methods Modifier and Type Method Description <M extends Metadata>
UnboundMetadata<M>apply(java.lang.Class<? extends RelNode> relClass)
<M extends Metadata>
UnboundMetadata<M>apply(java.lang.Class<? extends RelNode> relClass, java.lang.Class<? extends M> metadataClass)
Retrieves metadata of a particular type and for a particular sub-class of relational expression.private static boolean
couldImplement(java.lang.reflect.Method handlerMethod, java.lang.reflect.Method method)
<M extends Metadata>
com.google.common.collect.Multimap<java.lang.reflect.Method,MetadataHandler<M>>handlers(MetadataDef<M> def)
static RelMetadataProvider
reflectiveSource(java.lang.reflect.Method method, MetadataHandler target)
Returns an implementation ofRelMetadataProvider
that scans for methods with a preceding argument.private static RelMetadataProvider
reflectiveSource(MetadataHandler target, com.google.common.collect.ImmutableList<java.lang.reflect.Method> methods)
static RelMetadataProvider
reflectiveSource(MetadataHandler target, java.lang.reflect.Method... methods)
Returns a reflective metadata provider that implements several methods.
-
-
-
Field Detail
-
map
private final java.util.concurrent.ConcurrentMap<java.lang.Class<RelNode>,UnboundMetadata> map
-
metadataClass0
private final java.lang.Class<? extends Metadata> metadataClass0
-
handlerMap
private final com.google.common.collect.ImmutableMultimap<java.lang.reflect.Method,MetadataHandler> handlerMap
-
-
Constructor Detail
-
ReflectiveRelMetadataProvider
protected ReflectiveRelMetadataProvider(java.util.concurrent.ConcurrentMap<java.lang.Class<RelNode>,UnboundMetadata> map, java.lang.Class<? extends Metadata> metadataClass0, com.google.common.collect.Multimap<java.lang.reflect.Method,MetadataHandler> handlerMap)
Creates a ReflectiveRelMetadataProvider.- Parameters:
map
- MapmetadataClass0
- Metadata classhandlerMap
- Methods handled and the objects to call them on
-
-
Method Detail
-
reflectiveSource
public static RelMetadataProvider reflectiveSource(java.lang.reflect.Method method, MetadataHandler target)
Returns an implementation ofRelMetadataProvider
that scans for methods with a preceding argument.For example,
BuiltInMetadata.Selectivity
has a methodBuiltInMetadata.Selectivity.getSelectivity(RexNode)
. A classclass 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
orFilter
.
-
reflectiveSource
public static RelMetadataProvider reflectiveSource(MetadataHandler target, java.lang.reflect.Method... methods)
Returns a reflective metadata provider that implements several methods.
-
reflectiveSource
private static RelMetadataProvider reflectiveSource(MetadataHandler target, com.google.common.collect.ImmutableList<java.lang.reflect.Method> methods)
-
handlers
public <M extends Metadata> com.google.common.collect.Multimap<java.lang.reflect.Method,MetadataHandler<M>> handlers(MetadataDef<M> def)
- Specified by:
handlers
in interfaceRelMetadataProvider
-
couldImplement
private static boolean couldImplement(java.lang.reflect.Method handlerMethod, java.lang.reflect.Method method)
-
apply
public <M extends Metadata> UnboundMetadata<M> apply(java.lang.Class<? extends RelNode> relClass, java.lang.Class<? extends 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 interfaceRelMetadataProvider
- Parameters:
relClass
- Type of relational expressionmetadataClass
- Type of metadata- Returns:
- Function that will field a metadata instance; or null if this provider cannot supply metadata of this type
-
apply
public <M extends Metadata> UnboundMetadata<M> apply(java.lang.Class<? extends RelNode> relClass)
-
-