[
https://issues.apache.org/jira/browse/CALCITE-604?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=15111708#comment-15111708
]
Julian Hyde commented on CALCITE-604:
-------------------------------------
Here is an example of generated code.
{code}
public class GeneratedMetadataHandler_ColumnUniqueness {
private final java.util.List relClasses;
public final org.apache.calcite.rel.metadata.RelMdColumnUniqueness provider0;
public GeneratedMetadataHandler_ColumnUniqueness(java.util.List relClasses,
org.apache.calcite.rel.metadata.RelMdColumnUniqueness provider0) {
this.relClasses = relClasses;
this.provider0 = provider0;
}
public org.apache.calcite.rel.metadata.MetadataDef getDef() {
return org.apache.calcite.rel.metadata.BuiltInMetadata$ColumnUniqueness.DEF;
}
public java.lang.Boolean areColumnsUnique(
org.apache.calcite.rel.RelNode r,
org.apache.calcite.rel.metadata.RelMetadataQuery mq,
org.apache.calcite.util.ImmutableBitSet a0,
boolean a1) {
final java.util.List key =
org.apache.calcite.runtime.FlatLists.of(org.apache.calcite.rel.metadata.BuiltInMetadata$ColumnUniqueness.DEF,
r, org.apache.calcite.rel.metadata.NullSentinel.mask(a0), a1);
if (!mq.set.add(key)) {
throw org.apache.calcite.rel.metadata.CyclicMetadataException.INSTANCE;
}
try {
switch (relClasses.indexOf(r.getClass())) {
default:
return provider0.areColumnsUnique((org.apache.calcite.rel.RelNode) r,
mq, a0, a1);
case 2:
return
provider0.areColumnsUnique((org.apache.calcite.plan.volcano.RelSubset) r, mq,
a0, a1);
case 3:
return areColumnsUnique(((org.apache.calcite.plan.hep.HepRelVertex)
r).getCurrentRel(), mq, a0, a1);
case 4:
case 5:
return
provider0.areColumnsUnique((org.apache.calcite.rel.convert.Converter) r, mq,
a0, a1);
case 6:
case 24:
case 30:
return
provider0.areColumnsUnique((org.apache.calcite.rel.core.Aggregate) r, mq, a0,
a1);
case 8:
case 32:
return
provider0.areColumnsUnique((org.apache.calcite.rel.core.Correlate) r, mq, a0,
a1);
case 9:
case 33:
return
provider0.areColumnsUnique((org.apache.calcite.rel.core.Exchange) r, mq, a0,
a1);
case 10:
case 25:
case 34:
return provider0.areColumnsUnique((org.apache.calcite.rel.core.Filter)
r, mq, a0, a1);
case 11:
case 35:
return
provider0.areColumnsUnique((org.apache.calcite.rel.core.Intersect) r, mq, a0,
a1);
case 12:
case 27:
case 36:
case 48:
return provider0.areColumnsUnique((org.apache.calcite.rel.core.Join) r,
mq, a0, a1);
case 13:
case 37:
return provider0.areColumnsUnique((org.apache.calcite.rel.core.Minus)
r, mq, a0, a1);
case 14:
case 26:
case 38:
return provider0.areColumnsUnique((org.apache.calcite.rel.core.Project)
r, mq, a0, a1);
case 15:
case 39:
return provider0.areColumnsUnique((org.apache.calcite.rel.core.Sort) r,
mq, a0, a1);
case 18:
case 28:
case 42:
return
provider0.areColumnsUnique((org.apache.calcite.rel.core.TableScan) r, mq, a0,
a1);
case 19:
case 43:
case 50:
return provider0.areColumnsUnique((org.apache.calcite.rel.core.SetOp)
r, mq, a0, a1);
case 20:
case 44:
return provider0.areColumnsUnique((org.apache.calcite.rel.core.Values)
r, mq, a0, a1);
case -1:
throw new
org.apache.calcite.rel.metadata.JaninoRelMetadataProvider$NoHandler(r.getClass());
}
} finally {
mq.set.remove(key);
}
}
}
{code}
Note how 3 sub-classes of Aggregate all end up in the same handler method. The
"default" label handles RelNode and an unspecified other sub-classes. The -1
label deals with RelNode sub-classes that were previously unknown, and will
therefore require a re-generation.
> Invoke metadata providers via MethodHandle rather than reflection
> -----------------------------------------------------------------
>
> Key: CALCITE-604
> URL: https://issues.apache.org/jira/browse/CALCITE-604
> Project: Calcite
> Issue Type: Bug
> Reporter: Julian Hyde
> Assignee: Julian Hyde
>
> JDK 1.7 introduced
> http://docs.oracle.com/javase/7/docs/api/java/lang/invoke/MethodHandle.html,
> a more efficient way to invoke methods. Access control etc. is done when the
> handle is created, not each invocation.
> Currently calls to metadata providers are dispatched via reflection
> (Method.invoke, see ReflectiveRelMetadataProvider, ChainedRelMetadataProvider
> and CachingInvocationHandler), and I suspect that planning a complex query
> (especially with tracing enabled) makes millions of calls. Moving to
> MethodHandle would improve performance.
--
This message was sent by Atlassian JIRA
(v6.3.4#6332)