[ 
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)

Reply via email to