Hi Julian,

What about SQL Double, does it corrrespond to java's double too?




------------------ Original ------------------
From:  "Julian Hyde";<jhyde.apa...@gmail.com>;
Send time: Thursday, Feb 24, 2022 3:41 PM
To: "dev"<dev@calcite.apache.org>; 

Subject:  Re: dynamic reflective schema



SQL’s FLOAT type (aka DOUBLE) corresponds to Java’s double. 
SQL’s REAL type corresponds to Java’s float. 

JDBC method names (e.g. getFloat, getDouble) refer to the Java types. 

Julian

> On Feb 23, 2022, at 10:33 PM, xiaobo <guxiaobo1...@qq.com.invalid> wrote:
> 
> When trying to map Java Float Objects to SQL Float, we faild with the 
> following , it seems calcite is trying to convert Float objects to Double 
> even when we expect it to be a float ( we fetch it through getFloat method of 
> resultset ).
> 
> 
> java.lang.ClassCastException: class java.lang.Float cannot be cast to class 
> java.lang.Double (java.lang.Float and java.lang.Double are in module 
> java.base of loader 'bootstrap')
>    at Baz$1$1.current(Unknown Source)
>    at 
> org.apache.calcite.linq4j.Linq4j$EnumeratorIterator.next(Linq4j.java:687)
>    at 
> org.apache.calcite.avatica.util.IteratorCursor.next(IteratorCursor.java:46)
>    at 
> org.apache.calcite.avatica.AvaticaResultSet.next(AvaticaResultSet.java:219)
>    at 
> org.apache.calcite.adapter.json.test.BaseTest.exeGetFloat(BaseTest.java:135)
>    at 
> org.apache.calcite.adapter.json.test.JsonSchemaTest.test10(JsonSchemaTest.java:61)
>    at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native 
> Method)
>    at 
> java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
>    at 
> java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
>    at java.base/java.lang.reflect.Method.invoke(Method.java:566)
>    at 
> org.junit.runners.model.FrameworkMethod$1.runReflectiveCall(FrameworkMethod.java:59)
>    at 
> org.junit.internal.runners.model.ReflectiveCallable.run(ReflectiveCallable.java:12)
>    at 
> org.junit.runners.model.FrameworkMethod.invokeExplosively(FrameworkMethod.java:56)
>    at 
> org.junit.internal.runners.statements.InvokeMethod.evaluate(InvokeMethod.java:17)
>    at org.junit.runners.ParentRunner$3.evaluate(ParentRunner.java:306)
>    at 
> org.junit.runners.BlockJUnit4ClassRunner$1.evaluate(BlockJUnit4ClassRunner.java:100)
>    at org.junit.runners.ParentRunner.runLeaf(ParentRunner.java:366)
>    at 
> org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:103)
>    at 
> org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:63)
>    at org.junit.runners.ParentRunner$4.run(ParentRunner.java:331)
>    at org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:79)
>    at org.junit.runners.ParentRunner.runChildren(ParentRunner.java:329)
>    at org.junit.runners.ParentRunner.access$100(ParentRunner.java:66)
>    at org.junit.runners.ParentRunner$2.evaluate(ParentRunner.java:293)
>    at org.junit.runners.ParentRunner$3.evaluate(ParentRunner.java:306)
>    at org.junit.runners.ParentRunner.run(ParentRunner.java:413)
>    at 
> org.apache.maven.surefire.junit4.JUnit4Provider.execute(JUnit4Provider.java:252)
>    at 
> org.apache.maven.surefire.junit4.JUnit4Provider.executeTestSet(JUnit4Provider.java:141)
>    at 
> org.apache.maven.surefire.junit4.JUnit4Provider.invoke(JUnit4Provider.java:112)
>    at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native 
> Method)
>    at 
> java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
>    at 
> java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
>    at java.base/java.lang.reflect.Method.invoke(Method.java:566)
>    at 
> org.apache.maven.surefire.util.ReflectionUtils.invokeMethodWithArray(ReflectionUtils.java:189)
>    at 
> org.apache.maven.surefire.booter.ProviderFactory$ProviderProxy.invoke(ProviderFactory.java:165)
>    at 
> org.apache.maven.surefire.booter.ProviderFactory.invokeProvider(ProviderFactory.java:85)
>    at 
> org.apache.maven.surefire.booter.ForkedBooter.runSuitesInProcess(ForkedBooter.java:115)
>    at org.apache.maven.surefire.booter.ForkedBooter.main(ForkedBooter.java:75)
> 
> 
> 
> 
> 
> 
> ------------------ Original ------------------
> From:  "xiaobo ";<guxiaobo1...@qq.com>;
> Send time: Thursday, Feb 24, 2022 12:26 PM
> To: "dev"<dev@calcite.apache.org>; 
> 
> Subject:  Re: dynamic reflective schema
> 
> 
> 
> our adapter now supports 
> string,boolean,bigdecimal,long,localdate,localdatetime, and we want to 
> support localtime too, what value should we convert from localtime data , the 
> total seconds since the start of a day?
> 
> 
> 
> ---Original---
> From: "xiaobo "<guxiaobo1...@qq.com>
> Date: Thu, Feb 24, 2022 12:20 PM
> To: "dev"<dev@calcite.apache.org>;
> Subject: Re: dynamic reflective schema
> 
> 
> yes, we call the 
> getRowType(RelDataTypeFactory typeFactory) method in scan method , is this 
> the correct way?
> 
> 
> 
> 
> ---Original---
> From: "Gavin Ray"<ray.gavi...@gmail.com>
> Date: Thu, Feb 24, 2022 00:21 AM
> To: "dev"<dev@calcite.apache.org>;
> Subject: Re: dynamic reflective schema
> 
> 
> Xiabo,
> 
> Your code seems to work for me, I ran the test case and it passes, see the
> image below:
> https://i.imgur.com/D0ajyQH.png
> 
> 
>> On Wed, Feb 23, 2022 at 2:33 AM xiaobo <guxiaobo1...@qq.com.invalid> wrote:
>> 
>> we have put the test coding on github
>> 
>> 
>> https://github.com/guxiaobo/calcite-json-adapter/tree/main/src/test/java/org/apache/calcite/adapter/json/test
>> 
>> 
>> 
>> 
>> 
>> ------------------ Original ------------------
>> From:  "xiaobo ";<guxiaobo1...@qq.com>;
>> Send time: Wednesday, Feb 23, 2022 3:11 PM
>> To: "dev"<dev@calcite.apache.org>;
>> 
>> Subject:  Re:  dynamic reflective schema
>> 
>> 
>> 
>> here is the full output with calcite.debug=true, we know the problem is
>> because the  getRowType(RelDataTypeFactory typeFactory) method is not
>> called by the framework, but don't know why.
>> 
>> 
>> 2022-02-23 15:02:42.228  INFO 78585 --- [           main]
>> c.x.javatest.JavaTestApplication         : Starting JavaTestApplication
>> using Java 11.0.13 on LindadeMacBook-Air.local with PID 78585
>> (/Users/linda/Documents/Github/sw-smart-risk/sw-pbcm/sw-pbcm-test/java-test-proj/target/classes
>> started by linda in
>> /Users/linda/Documents/Github/sw-smart-risk/sw-pbcm/sw-pbcm-test/java-test-proj)
>> 2022-02-23 15:02:42.234  INFO 78585 --- [           main]
>> c.x.javatest.JavaTestApplication         : No active profile set, falling
>> back to default profiles: default
>> 2022-02-23 15:02:43.230  WARN 78585 --- [           main]
>> o.m.s.mapper.ClassPathMapperScanner      : No MyBatis mapper was found in
>> '[com.xsmartware.javatest]' package. Please check your configuration.
>> 2022-02-23 15:02:44.064  INFO 78585 --- [           main]
>> o.s.b.w.embedded.tomcat.TomcatWebServer  : Tomcat initialized with port(s):
>> 8080 (http)
>> 2022-02-23 15:02:44.082  INFO 78585 --- [           main]
>> o.apache.catalina.core.StandardService   : Starting service [Tomcat]
>> 2022-02-23 15:02:44.082  INFO 78585 --- [           main]
>> org.apache.catalina.core.StandardEngine  : Starting Servlet engine: [Apache
>> Tomcat/9.0.56]
>> 2022-02-23 15:02:44.291  INFO 78585 --- [           main]
>> o.a.c.c.C.[Tomcat].[localhost].[/]       : Initializing Spring embedded
>> WebApplicationContext
>> 2022-02-23 15:02:44.292  INFO 78585 --- [           main]
>> w.s.c.ServletWebServerApplicationContext : Root WebApplicationContext:
>> initialization completed in 1970 ms
>> 2022-02-23 15:02:45.374  INFO 78585 --- [           main]
>> o.s.b.w.embedded.tomcat.TomcatWebServer  : Tomcat started on port(s): 8080
>> (http) with context path ''
>> 2022-02-23 15:02:45.393  INFO 78585 --- [           main]
>> c.x.javatest.JavaTestApplication         : Started JavaTestApplication in
>> 3.77 seconds (JVM running for 5.146)
>> /*
>> * Licensed to the Apache Software Foundation (ASF) under one or more
>> * contributor license agreements.  See the NOTICE file distributed with
>> * this work for additional information regarding copyright ownership.
>> * The ASF licenses this file to you under the Apache License, Version 2.0
>> * (the "License"); you may not use this file except in compliance with
>> * the License.  You may obtain a copy of the License at
>> *
>> * http://www.apache.org/licenses/LICENSE-2.0
>> *
>> * Unless required by applicable law or agreed to in writing, software
>> * distributed under the License is distributed on an "AS IS" BASIS,
>> * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
>> * See the License for the specific language governing permissions and
>> * limitations under the License.
>> */
>> package org.apache.calcite.rel.metadata.janino;
>> 
>> public final class GeneratedMetadata_CollationHandler
>>  implements
>> org.apache.calcite.rel.metadata.BuiltInMetadata.Collation.Handler {
>>  private final Object methodKey0 =
>>      new
>> org.apache.calcite.rel.metadata.janino.DescriptiveCacheKey("ImmutableList
>> Handler.collations()");
>>  public final org.apache.calcite.rel.metadata.RelMdCollation provider0;
>>  public GeneratedMetadata_CollationHandler(
>>      org.apache.calcite.rel.metadata.RelMdCollation provider0) {
>>    this.provider0 = provider0;
>>  }
>>  public org.apache.calcite.rel.metadata.MetadataDef getDef() {
>>    return provider0.getDef();
>>  }
>>  public com.google.common.collect.ImmutableList collations(
>>      org.apache.calcite.rel.RelNode r,
>>      org.apache.calcite.rel.metadata.RelMetadataQuery mq) {
>>    while (r instanceof
>> org.apache.calcite.rel.metadata.DelegatingMetadataRel) {
>>      r = ((org.apache.calcite.rel.metadata.DelegatingMetadataRel)
>> r).getMetadataDelegateRel();
>>    }
>>    final Object key;
>>    key = methodKey0;
>>    final Object v = mq.map.get(r, key);
>>    if (v != null) {
>>      if (v == org.apache.calcite.rel.metadata.NullSentinel.ACTIVE) {
>>        throw new
>> org.apache.calcite.rel.metadata.CyclicMetadataException();
>>      }
>>      if (v == org.apache.calcite.rel.metadata.NullSentinel.INSTANCE) {
>>        return null;
>>      }
>>      return (com.google.common.collect.ImmutableList) v;
>>    }
>>    mq.map.put(r, key,org.apache.calcite.rel.metadata.NullSentinel.ACTIVE);
>>    try {
>>      final com.google.common.collect.ImmutableList x = collations_(r, mq);
>>      mq.map.put(r, key,
>> org.apache.calcite.rel.metadata.NullSentinel.mask(x));
>>      return x;
>>    } catch (java.lang.Exception e) {
>>      mq.map.row(r).clear();
>>      throw e;
>>    }
>>  }
>> 
>>  private com.google.common.collect.ImmutableList collations_(
>>      org.apache.calcite.rel.RelNode r,
>>      org.apache.calcite.rel.metadata.RelMetadataQuery mq) {
>>    if (r instanceof
>> org.apache.calcite.adapter.enumerable.EnumerableCorrelate) {
>>      return
>> provider0.collations((org.apache.calcite.adapter.enumerable.EnumerableCorrelate)
>> r, mq);
>>    } else if (r instanceof
>> org.apache.calcite.adapter.enumerable.EnumerableHashJoin) {
>>      return
>> provider0.collations((org.apache.calcite.adapter.enumerable.EnumerableHashJoin)
>> r, mq);
>>    } else if (r instanceof
>> org.apache.calcite.adapter.enumerable.EnumerableMergeJoin) {
>>      return
>> provider0.collations((org.apache.calcite.adapter.enumerable.EnumerableMergeJoin)
>> r, mq);
>>    } else if (r instanceof
>> org.apache.calcite.adapter.enumerable.EnumerableMergeUnion) {
>>      return
>> provider0.collations((org.apache.calcite.adapter.enumerable.EnumerableMergeUnion)
>> r, mq);
>>    } else if (r instanceof
>> org.apache.calcite.adapter.enumerable.EnumerableNestedLoopJoin) {
>>      return
>> provider0.collations((org.apache.calcite.adapter.enumerable.EnumerableNestedLoopJoin)
>> r, mq);
>>    } else if (r instanceof
>> org.apache.calcite.adapter.jdbc.JdbcToEnumerableConverter) {
>>      return
>> provider0.collations((org.apache.calcite.adapter.jdbc.JdbcToEnumerableConverter)
>> r, mq);
>>    } else if (r instanceof org.apache.calcite.plan.hep.HepRelVertex) {
>>      return
>> provider0.collations((org.apache.calcite.plan.hep.HepRelVertex) r, mq);
>>    } else if (r instanceof org.apache.calcite.plan.volcano.RelSubset) {
>>      return
>> provider0.collations((org.apache.calcite.plan.volcano.RelSubset) r, mq);
>>    } else if (r instanceof org.apache.calcite.rel.core.Calc) {
>>      return provider0.collations((org.apache.calcite.rel.core.Calc) r,
>> mq);
>>    } else if (r instanceof org.apache.calcite.rel.core.Filter) {
>>      return provider0.collations((org.apache.calcite.rel.core.Filter) r,
>> mq);
>>    } else if (r instanceof org.apache.calcite.rel.core.Match) {
>>      return provider0.collations((org.apache.calcite.rel.core.Match) r,
>> mq);
>>    } else if (r instanceof org.apache.calcite.rel.core.Project) {
>>      return provider0.collations((org.apache.calcite.rel.core.Project) r,
>> mq);
>>    } else if (r instanceof org.apache.calcite.rel.core.Sort) {
>>      return provider0.collations((org.apache.calcite.rel.core.Sort) r,
>> mq);
>>    } else if (r instanceof org.apache.calcite.rel.core.SortExchange) {
>>      return
>> provider0.collations((org.apache.calcite.rel.core.SortExchange) r, mq);
>>    } else if (r instanceof org.apache.calcite.rel.core.TableModify) {
>>      return
>> provider0.collations((org.apache.calcite.rel.core.TableModify) r, mq);
>>    } else if (r instanceof org.apache.calcite.rel.core.TableScan) {
>>      return provider0.collations((org.apache.calcite.rel.core.TableScan)
>> r, mq);
>>    } else if (r instanceof org.apache.calcite.rel.core.Values) {
>>      return provider0.collations((org.apache.calcite.rel.core.Values) r,
>> mq);
>>    } else if (r instanceof org.apache.calcite.rel.core.Window) {
>>      return provider0.collations((org.apache.calcite.rel.core.Window) r,
>> mq);
>>    } else if (r instanceof org.apache.calcite.rel.RelNode) {
>>      return provider0.collations((org.apache.calcite.rel.RelNode) r, mq);
>>    } else {
>>            throw new java.lang.IllegalArgumentException("No handler for
>> method [public abstract com.google.common.collect.ImmutableList
>> org.apache.calcite.rel.metadata.BuiltInMetadata$Collation$Handler.collations(org.apache.calcite.rel.RelNode,org.apache.calcite.rel.metadata.RelMetadataQuery)]
>> applied to argument of type [" + r.getClass() + "]; we recommend you create
>> a catch-all (RelNode) handler");
>>    }
>>  }
>> 
>> }
>> 
>> /*
>> * Licensed to the Apache Software Foundation (ASF) under one or more
>> * contributor license agreements.  See the NOTICE file distributed with
>> * this work for additional information regarding copyright ownership.
>> * The ASF licenses this file to you under the Apache License, Version 2.0
>> * (the "License"); you may not use this file except in compliance with
>> * the License.  You may obtain a copy of the License at
>> *
>> * http://www.apache.org/licenses/LICENSE-2.0
>> *
>> * Unless required by applicable law or agreed to in writing, software
>> * distributed under the License is distributed on an "AS IS" BASIS,
>> * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
>> * See the License for the specific language governing permissions and
>> * limitations under the License.
>> */
>> package org.apache.calcite.rel.metadata.janino;
>> 
>> public final class GeneratedMetadata_NonCumulativeCostHandler
>>  implements
>> org.apache.calcite.rel.metadata.BuiltInMetadata.NonCumulativeCost.Handler {
>>  private final Object methodKey0 =
>>      new
>> org.apache.calcite.rel.metadata.janino.DescriptiveCacheKey("RelOptCost
>> Handler.getNonCumulativeCost()");
>>  public final
>> org.apache.calcite.rel.metadata.RelMdPercentageOriginalRows$RelMdNonCumulativeCost
>> provider0;
>>  public GeneratedMetadata_NonCumulativeCostHandler(
>> 
>> org.apache.calcite.rel.metadata.RelMdPercentageOriginalRows$RelMdNonCumulativeCost
>> provider0) {
>>    this.provider0 = provider0;
>>  }
>>  public org.apache.calcite.rel.metadata.MetadataDef getDef() {
>>    return provider0.getDef();
>>  }
>>  public org.apache.calcite.plan.RelOptCost getNonCumulativeCost(
>>      org.apache.calcite.rel.RelNode r,
>>      org.apache.calcite.rel.metadata.RelMetadataQuery mq) {
>>    while (r instanceof
>> org.apache.calcite.rel.metadata.DelegatingMetadataRel) {
>>      r = ((org.apache.calcite.rel.metadata.DelegatingMetadataRel)
>> r).getMetadataDelegateRel();
>>    }
>>    final Object key;
>>    key = methodKey0;
>>    final Object v = mq.map.get(r, key);
>>    if (v != null) {
>>      if (v == org.apache.calcite.rel.metadata.NullSentinel.ACTIVE) {
>>        throw new
>> org.apache.calcite.rel.metadata.CyclicMetadataException();
>>      }
>>      if (v == org.apache.calcite.rel.metadata.NullSentinel.INSTANCE) {
>>        return null;
>>      }
>>      return (org.apache.calcite.plan.RelOptCost) v;
>>    }
>>    mq.map.put(r, key,org.apache.calcite.rel.metadata.NullSentinel.ACTIVE);
>>    try {
>>      final org.apache.calcite.plan.RelOptCost x =
>> getNonCumulativeCost_(r, mq);
>>      mq.map.put(r, key,
>> org.apache.calcite.rel.metadata.NullSentinel.mask(x));
>>      return x;
>>    } catch (java.lang.Exception e) {
>>      mq.map.row(r).clear();
>>      throw e;
>>    }
>>  }
>> 
>>  private org.apache.calcite.plan.RelOptCost getNonCumulativeCost_(
>>      org.apache.calcite.rel.RelNode r,
>>      org.apache.calcite.rel.metadata.RelMetadataQuery mq) {
>>    if (r instanceof org.apache.calcite.rel.RelNode) {
>>      return
>> provider0.getNonCumulativeCost((org.apache.calcite.rel.RelNode) r, mq);
>>    } else {
>>            throw new java.lang.IllegalArgumentException("No handler for
>> method [public abstract org.apache.calcite.plan.RelOptCost
>> org.apache.calcite.rel.metadata.BuiltInMetadata$NonCumulativeCost$Handler.getNonCumulativeCost(org.apache.calcite.rel.RelNode,org.apache.calcite.rel.metadata.RelMetadataQuery)]
>> applied to argument of type [" + r.getClass() + "]; we recommend you create
>> a catch-all (RelNode) handler");
>>    }
>>  }
>> 
>> }
>> 
>> /*
>> * Licensed to the Apache Software Foundation (ASF) under one or more
>> * contributor license agreements.  See the NOTICE file distributed with
>> * this work for additional information regarding copyright ownership.
>> * The ASF licenses this file to you under the Apache License, Version 2.0
>> * (the "License"); you may not use this file except in compliance with
>> * the License.  You may obtain a copy of the License at
>> *
>> * http://www.apache.org/licenses/LICENSE-2.0
>> *
>> * Unless required by applicable law or agreed to in writing, software
>> * distributed under the License is distributed on an "AS IS" BASIS,
>> * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
>> * See the License for the specific language governing permissions and
>> * limitations under the License.
>> */
>> package org.apache.calcite.rel.metadata.janino;
>> 
>> public final class GeneratedMetadata_NodeTypesHandler
>>  implements
>> org.apache.calcite.rel.metadata.BuiltInMetadata.NodeTypes.Handler {
>>  private final Object methodKey0 =
>>      new
>> org.apache.calcite.rel.metadata.janino.DescriptiveCacheKey("Multimap
>> Handler.getNodeTypes()");
>>  public final org.apache.calcite.rel.metadata.RelMdNodeTypes provider0;
>>  public GeneratedMetadata_NodeTypesHandler(
>>      org.apache.calcite.rel.metadata.RelMdNodeTypes provider0) {
>>    this.provider0 = provider0;
>>  }
>>  public org.apache.calcite.rel.metadata.MetadataDef getDef() {
>>    return provider0.getDef();
>>  }
>>  public com.google.common.collect.Multimap getNodeTypes(
>>      org.apache.calcite.rel.RelNode r,
>>      org.apache.calcite.rel.metadata.RelMetadataQuery mq) {
>>    while (r instanceof
>> org.apache.calcite.rel.metadata.DelegatingMetadataRel) {
>>      r = ((org.apache.calcite.rel.metadata.DelegatingMetadataRel)
>> r).getMetadataDelegateRel();
>>    }
>>    final Object key;
>>    key = methodKey0;
>>    final Object v = mq.map.get(r, key);
>>    if (v != null) {
>>      if (v == org.apache.calcite.rel.metadata.NullSentinel.ACTIVE) {
>>        throw new
>> org.apache.calcite.rel.metadata.CyclicMetadataException();
>>      }
>>      if (v == org.apache.calcite.rel.metadata.NullSentinel.INSTANCE) {
>>        return null;
>>      }
>>      return (com.google.common.collect.Multimap) v;
>>    }
>>    mq.map.put(r, key,org.apache.calcite.rel.metadata.NullSentinel.ACTIVE);
>>    try {
>>      final com.google.common.collect.Multimap x = getNodeTypes_(r, mq);
>>      mq.map.put(r, key,
>> org.apache.calcite.rel.metadata.NullSentinel.mask(x));
>>      return x;
>>    } catch (java.lang.Exception e) {
>>      mq.map.row(r).clear();
>>      throw e;
>>    }
>>  }
>> 
>>  private com.google.common.collect.Multimap getNodeTypes_(
>>      org.apache.calcite.rel.RelNode r,
>>      org.apache.calcite.rel.metadata.RelMetadataQuery mq) {
>>    if (r instanceof org.apache.calcite.plan.volcano.RelSubset) {
>>      return
>> provider0.getNodeTypes((org.apache.calcite.plan.volcano.RelSubset) r, mq);
>>    } else if (r instanceof org.apache.calcite.rel.core.Aggregate) {
>>      return
>> provider0.getNodeTypes((org.apache.calcite.rel.core.Aggregate) r, mq);
>>    } else if (r instanceof org.apache.calcite.rel.core.Calc) {
>>      return provider0.getNodeTypes((org.apache.calcite.rel.core.Calc) r,
>> mq);
>>    } else if (r instanceof org.apache.calcite.rel.core.Correlate) {
>>      return
>> provider0.getNodeTypes((org.apache.calcite.rel.core.Correlate) r, mq);
>>    } else if (r instanceof org.apache.calcite.rel.core.Exchange) {
>>      return provider0.getNodeTypes((org.apache.calcite.rel.core.Exchange)
>> r, mq);
>>    } else if (r instanceof org.apache.calcite.rel.core.Filter) {
>>      return provider0.getNodeTypes((org.apache.calcite.rel.core.Filter)
>> r, mq);
>>    } else if (r instanceof org.apache.calcite.rel.core.Intersect) {
>>      return
>> provider0.getNodeTypes((org.apache.calcite.rel.core.Intersect) r, mq);
>>    } else if (r instanceof org.apache.calcite.rel.core.Join) {
>>      return provider0.getNodeTypes((org.apache.calcite.rel.core.Join) r,
>> mq);
>>    } else if (r instanceof org.apache.calcite.rel.core.Match) {
>>      return provider0.getNodeTypes((org.apache.calcite.rel.core.Match) r,
>> mq);
>>    } else if (r instanceof org.apache.calcite.rel.core.Minus) {
>>      return provider0.getNodeTypes((org.apache.calcite.rel.core.Minus) r,
>> mq);
>>    } else if (r instanceof org.apache.calcite.rel.core.Project) {
>>      return provider0.getNodeTypes((org.apache.calcite.rel.core.Project)
>> r, mq);
>>    } else if (r instanceof org.apache.calcite.rel.core.Sample) {
>>      return provider0.getNodeTypes((org.apache.calcite.rel.core.Sample)
>> r, mq);
>>    } else if (r instanceof org.apache.calcite.rel.core.Sort) {
>>      return provider0.getNodeTypes((org.apache.calcite.rel.core.Sort) r,
>> mq);
>>    } else if (r instanceof org.apache.calcite.rel.core.TableModify) {
>>      return
>> provider0.getNodeTypes((org.apache.calcite.rel.core.TableModify) r, mq);
>>    } else if (r instanceof org.apache.calcite.rel.core.TableScan) {
>>      return
>> provider0.getNodeTypes((org.apache.calcite.rel.core.TableScan) r, mq);
>>    } else if (r instanceof org.apache.calcite.rel.core.Union) {
>>      return provider0.getNodeTypes((org.apache.calcite.rel.core.Union) r,
>> mq);
>>    } else if (r instanceof org.apache.calcite.rel.core.Values) {
>>      return provider0.getNodeTypes((org.apache.calcite.rel.core.Values)
>> r, mq);
>>    } else if (r instanceof org.apache.calcite.rel.core.Window) {
>>      return provider0.getNodeTypes((org.apache.calcite.rel.core.Window)
>> r, mq);
>>    } else if (r instanceof org.apache.calcite.rel.RelNode) {
>>      return provider0.getNodeTypes((org.apache.calcite.rel.RelNode) r,
>> mq);
>>    } else {
>>            throw new java.lang.IllegalArgumentException("No handler for
>> method [public abstract com.google.common.collect.Multimap
>> org.apache.calcite.rel.metadata.BuiltInMetadata$NodeTypes$Handler.getNodeTypes(org.apache.calcite.rel.RelNode,org.apache.calcite.rel.metadata.RelMetadataQuery)]
>> applied to argument of type [" + r.getClass() + "]; we recommend you create
>> a catch-all (RelNode) handler");
>>    }
>>  }
>> 
>> }
>> 
>> /*
>> * Licensed to the Apache Software Foundation (ASF) under one or more
>> * contributor license agreements.  See the NOTICE file distributed with
>> * this work for additional information regarding copyright ownership.
>> * The ASF licenses this file to you under the Apache License, Version 2.0
>> * (the "License"); you may not use this file except in compliance with
>> * the License.  You may obtain a copy of the License at
>> *
>> * http://www.apache.org/licenses/LICENSE-2.0
>> *
>> * Unless required by applicable law or agreed to in writing, software
>> * distributed under the License is distributed on an "AS IS" BASIS,
>> * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
>> * See the License for the specific language governing permissions and
>> * limitations under the License.
>> */
>> package org.apache.calcite.rel.metadata.janino;
>> 
>> public final class GeneratedMetadata_PredicatesHandler
>>  implements
>> org.apache.calcite.rel.metadata.BuiltInMetadata.Predicates.Handler {
>>  private final Object methodKey0 =
>>      new
>> org.apache.calcite.rel.metadata.janino.DescriptiveCacheKey("RelOptPredicateList
>> Handler.getPredicates()");
>>  public final org.apache.calcite.rel.metadata.RelMdPredicates provider0;
>>  public GeneratedMetadata_PredicatesHandler(
>>      org.apache.calcite.rel.metadata.RelMdPredicates provider0) {
>>    this.provider0 = provider0;
>>  }
>>  public org.apache.calcite.rel.metadata.MetadataDef getDef() {
>>    return provider0.getDef();
>>  }
>>  public org.apache.calcite.plan.RelOptPredicateList getPredicates(
>>      org.apache.calcite.rel.RelNode r,
>>      org.apache.calcite.rel.metadata.RelMetadataQuery mq) {
>>    while (r instanceof
>> org.apache.calcite.rel.metadata.DelegatingMetadataRel) {
>>      r = ((org.apache.calcite.rel.metadata.DelegatingMetadataRel)
>> r).getMetadataDelegateRel();
>>    }
>>    final Object key;
>>    key = methodKey0;
>>    final Object v = mq.map.get(r, key);
>>    if (v != null) {
>>      if (v == org.apache.calcite.rel.metadata.NullSentinel.ACTIVE) {
>>        throw new
>> org.apache.calcite.rel.metadata.CyclicMetadataException();
>>      }
>>      if (v == org.apache.calcite.rel.metadata.NullSentinel.INSTANCE) {
>>        return null;
>>      }
>>      return (org.apache.calcite.plan.RelOptPredicateList) v;
>>    }
>>    mq.map.put(r, key,org.apache.calcite.rel.metadata.NullSentinel.ACTIVE);
>>    try {
>>      final org.apache.calcite.plan.RelOptPredicateList x =
>> getPredicates_(r, mq);
>>      mq.map.put(r, key,
>> org.apache.calcite.rel.metadata.NullSentinel.mask(x));
>>      return x;
>>    } catch (java.lang.Exception e) {
>>      mq.map.row(r).clear();
>>      throw e;
>>    }
>>  }
>> 
>>  private org.apache.calcite.plan.RelOptPredicateList getPredicates_(
>>      org.apache.calcite.rel.RelNode r,
>>      org.apache.calcite.rel.metadata.RelMetadataQuery mq) {
>>    if (r instanceof org.apache.calcite.plan.volcano.RelSubset) {
>>      return
>> provider0.getPredicates((org.apache.calcite.plan.volcano.RelSubset) r, mq);
>>    } else if (r instanceof org.apache.calcite.rel.core.Aggregate) {
>>      return
>> provider0.getPredicates((org.apache.calcite.rel.core.Aggregate) r, mq);
>>    } else if (r instanceof org.apache.calcite.rel.core.Exchange) {
>>      return
>> provider0.getPredicates((org.apache.calcite.rel.core.Exchange) r, mq);
>>    } else if (r instanceof org.apache.calcite.rel.core.Filter) {
>>      return provider0.getPredicates((org.apache.calcite.rel.core.Filter)
>> r, mq);
>>    } else if (r instanceof org.apache.calcite.rel.core.Intersect) {
>>      return
>> provider0.getPredicates((org.apache.calcite.rel.core.Intersect) r, mq);
>>    } else if (r instanceof org.apache.calcite.rel.core.Join) {
>>      return provider0.getPredicates((org.apache.calcite.rel.core.Join) r,
>> mq);
>>    } else if (r instanceof org.apache.calcite.rel.core.Minus) {
>>      return provider0.getPredicates((org.apache.calcite.rel.core.Minus)
>> r, mq);
>>    } else if (r instanceof org.apache.calcite.rel.core.Project) {
>>      return provider0.getPredicates((org.apache.calcite.rel.core.Project)
>> r, mq);
>>    } else if (r instanceof org.apache.calcite.rel.core.Sort) {
>>      return provider0.getPredicates((org.apache.calcite.rel.core.Sort) r,
>> mq);
>>    } else if (r instanceof org.apache.calcite.rel.core.TableModify) {
>>      return
>> provider0.getPredicates((org.apache.calcite.rel.core.TableModify) r, mq);
>>    } else if (r instanceof org.apache.calcite.rel.core.TableScan) {
>>      return
>> provider0.getPredicates((org.apache.calcite.rel.core.TableScan) r, mq);
>>    } else if (r instanceof org.apache.calcite.rel.core.Union) {
>>      return provider0.getPredicates((org.apache.calcite.rel.core.Union)
>> r, mq);
>>    } else if (r instanceof org.apache.calcite.rel.RelNode) {
>>      return provider0.getPredicates((org.apache.calcite.rel.RelNode) r,
>> mq);
>>    } else {
>>            throw new java.lang.IllegalArgumentException("No handler for
>> method [public abstract org.apache.calcite.plan.RelOptPredicateList
>> org.apache.calcite.rel.metadata.BuiltInMetadata$Predicates$Handler.getPredicates(org.apache.calcite.rel.RelNode,org.apache.calcite.rel.metadata.RelMetadataQuery)]
>> applied to argument of type [" + r.getClass() + "]; we recommend you create
>> a catch-all (RelNode) handler");
>>    }
>>  }
>> 
>> }
>> 
>> /*
>> * Licensed to the Apache Software Foundation (ASF) under one or more
>> * contributor license agreements.  See the NOTICE file distributed with
>> * this work for additional information regarding copyright ownership.
>> * The ASF licenses this file to you under the Apache License, Version 2.0
>> * (the "License"); you may not use this file except in compliance with
>> * the License.  You may obtain a copy of the License at
>> *
>> * http://www.apache.org/licenses/LICENSE-2.0
>> *
>> * Unless required by applicable law or agreed to in writing, software
>> * distributed under the License is distributed on an "AS IS" BASIS,
>> * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
>> * See the License for the specific language governing permissions and
>> * limitations under the License.
>> */
>> package org.apache.calcite.rel.metadata.janino;
>> 
>> public final class GeneratedMetadata_RowCountHandler
>>  implements
>> org.apache.calcite.rel.metadata.BuiltInMetadata.RowCount.Handler {
>>  private final Object methodKey0 =
>>      new
>> org.apache.calcite.rel.metadata.janino.DescriptiveCacheKey("Double
>> Handler.getRowCount()");
>>  public final org.apache.calcite.rel.metadata.RelMdRowCount provider0;
>>  public GeneratedMetadata_RowCountHandler(
>>      org.apache.calcite.rel.metadata.RelMdRowCount provider0) {
>>    this.provider0 = provider0;
>>  }
>>  public org.apache.calcite.rel.metadata.MetadataDef getDef() {
>>    return provider0.getDef();
>>  }
>>  public java.lang.Double getRowCount(
>>      org.apache.calcite.rel.RelNode r,
>>      org.apache.calcite.rel.metadata.RelMetadataQuery mq) {
>>    while (r instanceof
>> org.apache.calcite.rel.metadata.DelegatingMetadataRel) {
>>      r = ((org.apache.calcite.rel.metadata.DelegatingMetadataRel)
>> r).getMetadataDelegateRel();
>>    }
>>    final Object key;
>>    key = methodKey0;
>>    final Object v = mq.map.get(r, key);
>>    if (v != null) {
>>      if (v == org.apache.calcite.rel.metadata.NullSentinel.ACTIVE) {
>>        throw new
>> org.apache.calcite.rel.metadata.CyclicMetadataException();
>>      }
>>      if (v == org.apache.calcite.rel.metadata.NullSentinel.INSTANCE) {
>>        return null;
>>      }
>>      return (java.lang.Double) v;
>>    }
>>    mq.map.put(r, key,org.apache.calcite.rel.metadata.NullSentinel.ACTIVE);
>>    try {
>>      final java.lang.Double x = getRowCount_(r, mq);
>>      mq.map.put(r, key,
>> org.apache.calcite.rel.metadata.NullSentinel.mask(x));
>>      return x;
>>    } catch (java.lang.Exception e) {
>>      mq.map.row(r).clear();
>>      throw e;
>>    }
>>  }
>> 
>>  private java.lang.Double getRowCount_(
>>      org.apache.calcite.rel.RelNode r,
>>      org.apache.calcite.rel.metadata.RelMetadataQuery mq) {
>>    if (r instanceof
>> org.apache.calcite.adapter.enumerable.EnumerableLimit) {
>>      return
>> provider0.getRowCount((org.apache.calcite.adapter.enumerable.EnumerableLimit)
>> r, mq);
>>    } else if (r instanceof org.apache.calcite.plan.volcano.RelSubset) {
>>      return
>> provider0.getRowCount((org.apache.calcite.plan.volcano.RelSubset) r, mq);
>>    } else if (r instanceof org.apache.calcite.rel.core.Aggregate) {
>>      return provider0.getRowCount((org.apache.calcite.rel.core.Aggregate)
>> r, mq);
>>    } else if (r instanceof org.apache.calcite.rel.core.Calc) {
>>      return provider0.getRowCount((org.apache.calcite.rel.core.Calc) r,
>> mq);
>>    } else if (r instanceof org.apache.calcite.rel.core.Exchange) {
>>      return provider0.getRowCount((org.apache.calcite.rel.core.Exchange)
>> r, mq);
>>    } else if (r instanceof org.apache.calcite.rel.core.Filter) {
>>      return provider0.getRowCount((org.apache.calcite.rel.core.Filter) r,
>> mq);
>>    } else if (r instanceof org.apache.calcite.rel.core.Intersect) {
>>      return provider0.getRowCount((org.apache.calcite.rel.core.Intersect)
>> r, mq);
>>    } else if (r instanceof org.apache.calcite.rel.core.Join) {
>>      return provider0.getRowCount((org.apache.calcite.rel.core.Join) r,
>> mq);
>>    } else if (r instanceof org.apache.calcite.rel.core.Minus) {
>>      return provider0.getRowCount((org.apache.calcite.rel.core.Minus) r,
>> mq);
>>    } else if (r instanceof org.apache.calcite.rel.core.Project) {
>>      return provider0.getRowCount((org.apache.calcite.rel.core.Project)
>> r, mq);
>>    } else if (r instanceof org.apache.calcite.rel.core.Sort) {
>>      return provider0.getRowCount((org.apache.calcite.rel.core.Sort) r,
>> mq);
>>    } else if (r instanceof org.apache.calcite.rel.core.TableModify) {
>>      return
>> provider0.getRowCount((org.apache.calcite.rel.core.TableModify) r, mq);
>>    } else if (r instanceof org.apache.calcite.rel.core.TableScan) {
>>      return provider0.getRowCount((org.apache.calcite.rel.core.TableScan)
>> r, mq);
>>    } else if (r instanceof org.apache.calcite.rel.core.Union) {
>>      return provider0.getRowCount((org.apache.calcite.rel.core.Union) r,
>> mq);
>>    } else if (r instanceof org.apache.calcite.rel.core.Values) {
>>      return provider0.getRowCount((org.apache.calcite.rel.core.Values) r,
>> mq);
>>    } else if (r instanceof org.apache.calcite.rel.SingleRel) {
>>      return provider0.getRowCount((org.apache.calcite.rel.SingleRel) r,
>> mq);
>>    } else if (r instanceof org.apache.calcite.rel.RelNode) {
>>      return provider0.getRowCount((org.apache.calcite.rel.RelNode) r, mq);
>>    } else {
>>            throw new java.lang.IllegalArgumentException("No handler for
>> method [public abstract java.lang.Double
>> org.apache.calcite.rel.metadata.BuiltInMetadata$RowCount$Handler.getRowCount(org.apache.calcite.rel.RelNode,org.apache.calcite.rel.metadata.RelMetadataQuery)]
>> applied to argument of type [" + r.getClass() + "]; we recommend you create
>> a catch-all (RelNode) handler");
>>    }
>>  }
>> 
>> }
>> 
>> /*
>> * Licensed to the Apache Software Foundation (ASF) under one or more
>> * contributor license agreements.  See the NOTICE file distributed with
>> * this work for additional information regarding copyright ownership.
>> * The ASF licenses this file to you under the Apache License, Version 2.0
>> * (the "License"); you may not use this file except in compliance with
>> * the License.  You may obtain a copy of the License at
>> *
>> * http://www.apache.org/licenses/LICENSE-2.0
>> *
>> * Unless required by applicable law or agreed to in writing, software
>> * distributed under the License is distributed on an "AS IS" BASIS,
>> * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
>> * See the License for the specific language governing permissions and
>> * limitations under the License.
>> */
>> package org.apache.calcite.rel.metadata.janino;
>> 
>> public final class GeneratedMetadata_DistinctRowCountHandler
>>  implements
>> org.apache.calcite.rel.metadata.BuiltInMetadata.DistinctRowCount.Handler {
>>  private final Object methodKey0 =
>>      new
>> org.apache.calcite.rel.metadata.janino.DescriptiveCacheKey("Double
>> Handler.getDistinctRowCount(RelNode, RelMetadataQuery, ImmutableBitSet,
>> RexNode)");
>>  public final org.apache.calcite.rel.metadata.RelMdDistinctRowCount
>> provider0;
>>  public GeneratedMetadata_DistinctRowCountHandler(
>>      org.apache.calcite.rel.metadata.RelMdDistinctRowCount provider0) {
>>    this.provider0 = provider0;
>>  }
>>  public org.apache.calcite.rel.metadata.MetadataDef getDef() {
>>    return provider0.getDef();
>>  }
>>  public java.lang.Double getDistinctRowCount(
>>      org.apache.calcite.rel.RelNode r,
>>      org.apache.calcite.rel.metadata.RelMetadataQuery mq,
>>      org.apache.calcite.util.ImmutableBitSet a2,
>>      org.apache.calcite.rex.RexNode a3) {
>>    while (r instanceof
>> org.apache.calcite.rel.metadata.DelegatingMetadataRel) {
>>      r = ((org.apache.calcite.rel.metadata.DelegatingMetadataRel)
>> r).getMetadataDelegateRel();
>>    }
>>    final Object key;
>>    key = org.apache.calcite.runtime.FlatLists.of(methodKey0,
>> org.apache.calcite.rel.metadata.NullSentinel.mask(a2), a3);
>>    final Object v = mq.map.get(r, key);
>>    if (v != null) {
>>      if (v == org.apache.calcite.rel.metadata.NullSentinel.ACTIVE) {
>>        throw new
>> org.apache.calcite.rel.metadata.CyclicMetadataException();
>>      }
>>      if (v == org.apache.calcite.rel.metadata.NullSentinel.INSTANCE) {
>>        return null;
>>      }
>>      return (java.lang.Double) v;
>>    }
>>    mq.map.put(r, key,org.apache.calcite.rel.metadata.NullSentinel.ACTIVE);
>>    try {
>>      final java.lang.Double x = getDistinctRowCount_(r, mq, a2, a3);
>>      mq.map.put(r, key,
>> org.apache.calcite.rel.metadata.NullSentinel.mask(x));
>>      return x;
>>    } catch (java.lang.Exception e) {
>>      mq.map.row(r).clear();
>>      throw e;
>>    }
>>  }
>> 
>>  private java.lang.Double getDistinctRowCount_(
>>      org.apache.calcite.rel.RelNode r,
>>      org.apache.calcite.rel.metadata.RelMetadataQuery mq,
>>      org.apache.calcite.util.ImmutableBitSet a2,
>>      org.apache.calcite.rex.RexNode a3) {
>>    if (r instanceof org.apache.calcite.plan.volcano.RelSubset) {
>>      return
>> provider0.getDistinctRowCount((org.apache.calcite.plan.volcano.RelSubset)
>> r, mq, a2, a3);
>>    } else if (r instanceof org.apache.calcite.rel.core.Aggregate) {
>>      return
>> provider0.getDistinctRowCount((org.apache.calcite.rel.core.Aggregate) r,
>> mq, a2, a3);
>>    } else if (r instanceof org.apache.calcite.rel.core.Exchange) {
>>      return
>> provider0.getDistinctRowCount((org.apache.calcite.rel.core.Exchange) r, mq,
>> a2, a3);
>>    } else if (r instanceof org.apache.calcite.rel.core.Filter) {
>>      return
>> provider0.getDistinctRowCount((org.apache.calcite.rel.core.Filter) r, mq,
>> a2, a3);
>>    } else if (r instanceof org.apache.calcite.rel.core.Join) {
>>      return
>> provider0.getDistinctRowCount((org.apache.calcite.rel.core.Join) r, mq, a2,
>> a3);
>>    } else if (r instanceof org.apache.calcite.rel.core.Project) {
>>      return
>> provider0.getDistinctRowCount((org.apache.calcite.rel.core.Project) r, mq,
>> a2, a3);
>>    } else if (r instanceof org.apache.calcite.rel.core.Sort) {
>>      return
>> provider0.getDistinctRowCount((org.apache.calcite.rel.core.Sort) r, mq, a2,
>> a3);
>>    } else if (r instanceof org.apache.calcite.rel.core.TableModify) {
>>      return
>> provider0.getDistinctRowCount((org.apache.calcite.rel.core.TableModify) r,
>> mq, a2, a3);
>>    } else if (r instanceof org.apache.calcite.rel.core.Union) {
>>      return
>> provider0.getDistinctRowCount((org.apache.calcite.rel.core.Union) r, mq,
>> a2, a3);
>>    } else if (r instanceof org.apache.calcite.rel.core.Values) {
>>      return
>> provider0.getDistinctRowCount((org.apache.calcite.rel.core.Values) r, mq,
>> a2, a3);
>>    } else if (r instanceof org.apache.calcite.rel.RelNode) {
>>      return
>> provider0.getDistinctRowCount((org.apache.calcite.rel.RelNode) r, mq, a2,
>> a3);
>>    } else {
>>            throw new java.lang.IllegalArgumentException("No handler for
>> method [public abstract java.lang.Double
>> org.apache.calcite.rel.metadata.BuiltInMetadata$DistinctRowCount$Handler.getDistinctRowCount(org.apache.calcite.rel.RelNode,org.apache.calcite.rel.metadata.RelMetadataQuery,org.apache.calcite.util.ImmutableBitSet,org.apache.calcite.rex.RexNode)]
>> applied to argument of type [" + r.getClass() + "]; we recommend you create
>> a catch-all (RelNode) handler");
>>    }
>>  }
>> 
>> }
>> 
>> /*
>> * Licensed to the Apache Software Foundation (ASF) under one or more
>> * contributor license agreements.  See the NOTICE file distributed with
>> * this work for additional information regarding copyright ownership.
>> * The ASF licenses this file to you under the Apache License, Version 2.0
>> * (the "License"); you may not use this file except in compliance with
>> * the License.  You may obtain a copy of the License at
>> *
>> * http://www.apache.org/licenses/LICENSE-2.0
>> *
>> * Unless required by applicable law or agreed to in writing, software
>> * distributed under the License is distributed on an "AS IS" BASIS,
>> * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
>> * See the License for the specific language governing permissions and
>> * limitations under the License.
>> */
>> package org.apache.calcite.rel.metadata.janino;
>> 
>> public final class GeneratedMetadata_ColumnUniquenessHandler
>>  implements
>> org.apache.calcite.rel.metadata.BuiltInMetadata.ColumnUniqueness.Handler {
>>  private final Object methodKey0 =
>>      new
>> org.apache.calcite.rel.metadata.janino.DescriptiveCacheKey("Boolean
>> Handler.areColumnsUnique(RelNode, RelMetadataQuery, ImmutableBitSet,
>> boolean)");
>>  public final org.apache.calcite.rel.metadata.RelMdColumnUniqueness
>> provider0;
>>  public GeneratedMetadata_ColumnUniquenessHandler(
>>      org.apache.calcite.rel.metadata.RelMdColumnUniqueness provider0) {
>>    this.provider0 = provider0;
>>  }
>>  public org.apache.calcite.rel.metadata.MetadataDef getDef() {
>>    return provider0.getDef();
>>  }
>>  public java.lang.Boolean areColumnsUnique(
>>      org.apache.calcite.rel.RelNode r,
>>      org.apache.calcite.rel.metadata.RelMetadataQuery mq,
>>      org.apache.calcite.util.ImmutableBitSet a2,
>>      boolean a3) {
>>    while (r instanceof
>> org.apache.calcite.rel.metadata.DelegatingMetadataRel) {
>>      r = ((org.apache.calcite.rel.metadata.DelegatingMetadataRel)
>> r).getMetadataDelegateRel();
>>    }
>>    final Object key;
>>    key = org.apache.calcite.runtime.FlatLists.of(methodKey0,
>> org.apache.calcite.rel.metadata.NullSentinel.mask(a2), a3);
>>    final Object v = mq.map.get(r, key);
>>    if (v != null) {
>>      if (v == org.apache.calcite.rel.metadata.NullSentinel.ACTIVE) {
>>        throw new
>> org.apache.calcite.rel.metadata.CyclicMetadataException();
>>      }
>>      if (v == org.apache.calcite.rel.metadata.NullSentinel.INSTANCE) {
>>        return null;
>>      }
>>      return (java.lang.Boolean) v;
>>    }
>>    mq.map.put(r, key,org.apache.calcite.rel.metadata.NullSentinel.ACTIVE);
>>    try {
>>      final java.lang.Boolean x = areColumnsUnique_(r, mq, a2, a3);
>>      mq.map.put(r, key,
>> org.apache.calcite.rel.metadata.NullSentinel.mask(x));
>>      return x;
>>    } catch (java.lang.Exception e) {
>>      mq.map.row(r).clear();
>>      throw e;
>>    }
>>  }
>> 
>>  private java.lang.Boolean areColumnsUnique_(
>>      org.apache.calcite.rel.RelNode r,
>>      org.apache.calcite.rel.metadata.RelMetadataQuery mq,
>>      org.apache.calcite.util.ImmutableBitSet a2,
>>      boolean a3) {
>>    if (r instanceof org.apache.calcite.plan.volcano.RelSubset) {
>>      return
>> provider0.areColumnsUnique((org.apache.calcite.plan.volcano.RelSubset) r,
>> mq, a2, a3);
>>    } else if (r instanceof org.apache.calcite.rel.convert.Converter) {
>>      return
>> provider0.areColumnsUnique((org.apache.calcite.rel.convert.Converter) r,
>> mq, a2, a3);
>>    } else if (r instanceof org.apache.calcite.rel.core.Aggregate) {
>>      return
>> provider0.areColumnsUnique((org.apache.calcite.rel.core.Aggregate) r, mq,
>> a2, a3);
>>    } else if (r instanceof org.apache.calcite.rel.core.Calc) {
>>      return provider0.areColumnsUnique((org.apache.calcite.rel.core.Calc)
>> r, mq, a2, a3);
>>    } else if (r instanceof org.apache.calcite.rel.core.Correlate) {
>>      return
>> provider0.areColumnsUnique((org.apache.calcite.rel.core.Correlate) r, mq,
>> a2, a3);
>>    } else if (r instanceof org.apache.calcite.rel.core.Exchange) {
>>      return
>> provider0.areColumnsUnique((org.apache.calcite.rel.core.Exchange) r, mq,
>> a2, a3);
>>    } else if (r instanceof org.apache.calcite.rel.core.Filter) {
>>      return
>> provider0.areColumnsUnique((org.apache.calcite.rel.core.Filter) r, mq, a2,
>> a3);
>>    } else if (r instanceof org.apache.calcite.rel.core.Intersect) {
>>      return
>> provider0.areColumnsUnique((org.apache.calcite.rel.core.Intersect) r, mq,
>> a2, a3);
>>    } else if (r instanceof org.apache.calcite.rel.core.Join) {
>>      return provider0.areColumnsUnique((org.apache.calcite.rel.core.Join)
>> r, mq, a2, a3);
>>    } else if (r instanceof org.apache.calcite.rel.core.Minus) {
>>      return
>> provider0.areColumnsUnique((org.apache.calcite.rel.core.Minus) r, mq, a2,
>> a3);
>>    } else if (r instanceof org.apache.calcite.rel.core.Project) {
>>      return
>> provider0.areColumnsUnique((org.apache.calcite.rel.core.Project) r, mq, a2,
>> a3);
>>    } else if (r instanceof org.apache.calcite.rel.core.SetOp) {
>>      return
>> provider0.areColumnsUnique((org.apache.calcite.rel.core.SetOp) r, mq, a2,
>> a3);
>>    } else if (r instanceof org.apache.calcite.rel.core.Sort) {
>>      return provider0.areColumnsUnique((org.apache.calcite.rel.core.Sort)
>> r, mq, a2, a3);
>>    } else if (r instanceof org.apache.calcite.rel.core.TableModify) {
>>      return
>> provider0.areColumnsUnique((org.apache.calcite.rel.core.TableModify) r, mq,
>> a2, a3);
>>    } else if (r instanceof org.apache.calcite.rel.core.TableScan) {
>>      return
>> provider0.areColumnsUnique((org.apache.calcite.rel.core.TableScan) r, mq,
>> a2, a3);
>>    } else if (r instanceof org.apache.calcite.rel.core.Values) {
>>      return
>> provider0.areColumnsUnique((org.apache.calcite.rel.core.Values) r, mq, a2,
>> a3);
>>    } else if (r instanceof org.apache.calcite.rel.RelNode) {
>>      return provider0.areColumnsUnique((org.apache.calcite.rel.RelNode)
>> r, mq, a2, a3);
>>    } else {
>>            throw new java.lang.IllegalArgumentException("No handler for
>> method [public abstract java.lang.Boolean
>> org.apache.calcite.rel.metadata.BuiltInMetadata$ColumnUniqueness$Handler.areColumnsUnique(org.apache.calcite.rel.RelNode,org.apache.calcite.rel.metadata.RelMetadataQuery,org.apache.calcite.util.ImmutableBitSet,boolean)]
>> applied to argument of type [" + r.getClass() + "]; we recommend you create
>> a catch-all (RelNode) handler");
>>    }
>>  }
>> 
>> }
>> 
>> 
>> /*   1 */ public static class Record1_0 implements java.io.Serializable {
>> /*   2 */   public long f0;
>> /*   3 */   public Record1_0() {}
>> /*   4 */   public boolean equals(Object o) {
>> /*   5 */     if (this == o) {
>> /*   6 */       return true;
>> /*   7 */     }
>> /*   8 */     if (!(o instanceof Record1_0)) {
>> /*   9 */       return false;
>> /*  10 */     }
>> /*  11 */     return this.f0 == ((Record1_0) o).f0;
>> /*  12 */   }
>> /*  13 */
>> /*  14 */   public int hashCode() {
>> /*  15 */     int h = 0;
>> /*  16 */     h = org.apache.calcite.runtime.Utilities.hash(h, this.f0);
>> /*  17 */     return h;
>> /*  18 */   }
>> /*  19 */
>> /*  20 */   public int compareTo(Record1_0 that) {
>> /*  21 */     final int c;
>> /*  22 */     c = org.apache.calcite.runtime.Utilities.compare(this.f0,
>> that.f0);
>> /*  23 */     if (c != 0) {
>> /*  24 */       return c;
>> /*  25 */     }
>> /*  26 */     return 0;
>> /*  27 */   }
>> /*  28 */
>> /*  29 */   public String toString() {
>> /*  30 */     return "{f0=" + this.f0 + "}";
>> /*  31 */   }
>> /*  32 */
>> /*  33 */ }
>> /*  34 */
>> /*  35 */ public org.apache.calcite.linq4j.Enumerable bind(final
>> org.apache.calcite.DataContext root) {
>> /*  36 */   java.util.List accumulatorAdders = new java.util.LinkedList();
>> /*  37 */   accumulatorAdders.add(new
>> org.apache.calcite.linq4j.function.Function2() {
>> /*  38 */     public Record1_0 apply(Record1_0 acc, Object[] in) {
>> /*  39 */       acc.f0++;
>> /*  40 */       return acc;
>> /*  41 */     }
>> /*  42 */     public Record1_0 apply(Object acc, Object in) {
>> /*  43 */       return apply(
>> /*  44 */         (Record1_0) acc,
>> /*  45 */         (Object[]) in);
>> /*  46 */     }
>> /*  47 */   }
>> /*  48 */   );
>> /*  49 */   org.apache.calcite.adapter.enumerable.AggregateLambdaFactory
>> lambdaFactory = new
>> org.apache.calcite.adapter.enumerable.BasicAggregateLambdaFactory(
>> /*  50 */     new org.apache.calcite.linq4j.function.Function0() {
>> /*  51 */       public Object apply() {
>> /*  52 */         long COUNTa0s0;
>> /*  53 */         COUNTa0s0 = 0L;
>> /*  54 */         Record1_0 record0;
>> /*  55 */         record0 = new Record1_0();
>> /*  56 */         record0.f0 = COUNTa0s0;
>> /*  57 */         return record0;
>> /*  58 */       }
>> /*  59 */     }
>> /*  60 */ ,
>> /*  61 */     accumulatorAdders);
>> /*  62 */   return
>> org.apache.calcite.linq4j.Linq4j.singletonEnumerable(org.apache.calcite.schema.Schemas.enumerable((org.apache.calcite.schema.ScannableTable)
>> root.getRootSchema().getSubSchema("js").getTable("t1"),
>> root).aggregate(lambdaFactory.accumulatorInitializer().apply(),
>> lambdaFactory.accumulatorAdder(),
>> lambdaFactory.singleGroupResultSelector(new
>> org.apache.calcite.linq4j.function.Function1() {
>> /*  63 */       public long apply(Record1_0 acc) {
>> /*  64 */         return acc.f0;
>> /*  65 */       }
>> /*  66 */       public Object apply(Object acc) {
>> /*  67 */         return apply(
>> /*  68 */           (Record1_0) acc);
>> /*  69 */       }
>> /*  70 */     }
>> /*  71 */     )));
>> /*  72 */ }
>> /*  73 */
>> /*  74 */
>> /*  75 */ public Class getElementType() {
>> /*  76 */   return long.class;
>> /*  77 */ }
>> /*  78 */
>> /*  79 */
>> 2022-02-23 15:02:59.636  INFO 78585 --- [           main]
>> ConditionEvaluationReportLoggingListener :
>> 
>> Error starting ApplicationContext. To display the conditions report re-run
>> your application with 'debug' enabled.
>> 2022-02-23 15:02:59.703 ERROR 78585 --- [           main]
>> o.s.boot.SpringApplication               : Application run failed
>> 
>> java.lang.IllegalStateException: Failed to execute ApplicationRunner
>>        at
>> org.springframework.boot.SpringApplication.callRunner(SpringApplication.java:761)
>> ~[spring-boot-2.6.2.jar:2.6.2]
>>        at
>> org.springframework.boot.SpringApplication.callRunners(SpringApplication.java:748)
>> ~[spring-boot-2.6.2.jar:2.6.2]
>>        at
>> org.springframework.boot.SpringApplication.run(SpringApplication.java:309)
>> ~[spring-boot-2.6.2.jar:2.6.2]
>>        at
>> org.springframework.boot.SpringApplication.run(SpringApplication.java:1301)
>> ~[spring-boot-2.6.2.jar:2.6.2]
>>        at
>> org.springframework.boot.SpringApplication.run(SpringApplication.java:1290)
>> ~[spring-boot-2.6.2.jar:2.6.2]
>>        at
>> com.xsmartware.javatest.JavaTestApplication.main(JavaTestApplication.java:9)
>> ~[classes/:na]
>> Caused by: java.sql.SQLException: Error while executing SQL "select
>> count(*) from js.t1": null
>>        at
>> org.apache.calcite.avatica.Helper.createException(Helper.java:56)
>> ~[avatica-core-1.20.0.jar:1.20.0]
>>        at
>> org.apache.calcite.avatica.Helper.createException(Helper.java:41)
>> ~[avatica-core-1.20.0.jar:1.20.0]
>>        at
>> org.apache.calcite.avatica.AvaticaStatement.executeInternal(AvaticaStatement.java:163)
>> ~[avatica-core-1.20.0.jar:1.20.0]
>>        at
>> org.apache.calcite.avatica.AvaticaStatement.executeQuery(AvaticaStatement.java:227)
>> ~[avatica-core-1.20.0.jar:1.20.0]
>>        at com.xsmartware.common.util.SQLUtil.exeGetLong(SQLUtil.java:42)
>> ~[classes/:na]
>>        at
>> com.xsmartware.javatest.calcite.CalCiteTest.test10(CalCiteTest.java:145)
>> ~[classes/:na]
>>        at
>> com.xsmartware.javatest.calcite.CalCiteTest.run(CalCiteTest.java:114)
>> ~[classes/:na]
>>        at
>> org.springframework.boot.SpringApplication.callRunner(SpringApplication.java:758)
>> ~[spring-boot-2.6.2.jar:2.6.2]
>>        ... 5 common frames omitted
>> Caused by: java.lang.NullPointerException: null
>>        at
>> org.apache.calcite.adapter.json.JsonEnumerator.<init>(JsonEnumerator.java:49)
>> ~[classes/:na]
>>        at
>> org.apache.calcite.adapter.json.JsonScannableTable$1.enumerator(JsonScannableTable.java:48)
>> ~[classes/:na]
>>        at
>> org.apache.calcite.linq4j.EnumerableDefaults.aggregate(EnumerableDefaults.java:130)
>> ~[calcite-linq4j-1.29.0.jar:1.29.0]
>>        at
>> org.apache.calcite.linq4j.DefaultEnumerable.aggregate(DefaultEnumerable.java:107)
>> ~[calcite-linq4j-1.29.0.jar:1.29.0]
>>        at Baz.bind(Baz.java:62) ~[na:na]
>>        at
>> org.apache.calcite.jdbc.CalcitePrepare$CalciteSignature.enumerable(CalcitePrepare.java:363)
>> ~[calcite-core-1.29.0.jar:1.29.0]
>>        at
>> org.apache.calcite.jdbc.CalciteConnectionImpl.enumerable(CalciteConnectionImpl.java:338)
>> ~[calcite-core-1.29.0.jar:1.29.0]
>>        at
>> org.apache.calcite.jdbc.CalciteMetaImpl._createIterable(CalciteMetaImpl.java:578)
>> ~[calcite-core-1.29.0.jar:1.29.0]
>>        at
>> org.apache.calcite.jdbc.CalciteMetaImpl.createIterable(CalciteMetaImpl.java:569)
>> ~[calcite-core-1.29.0.jar:1.29.0]
>>        at
>> org.apache.calcite.avatica.AvaticaResultSet.execute(AvaticaResultSet.java:184)
>> ~[avatica-core-1.20.0.jar:1.20.0]
>>        at
>> org.apache.calcite.jdbc.CalciteResultSet.execute(CalciteResultSet.java:64)
>> ~[calcite-core-1.29.0.jar:1.29.0]
>>        at
>> org.apache.calcite.jdbc.CalciteResultSet.execute(CalciteResultSet.java:43)
>> ~[calcite-core-1.29.0.jar:1.29.0]
>>        at
>> org.apache.calcite.avatica.AvaticaConnection$1.execute(AvaticaConnection.java:666)
>> ~[avatica-core-1.20.0.jar:1.20.0]
>>        at
>> org.apache.calcite.jdbc.CalciteMetaImpl.prepareAndExecute(CalciteMetaImpl.java:638)
>> ~[calcite-core-1.29.0.jar:1.29.0]
>>        at
>> org.apache.calcite.avatica.AvaticaConnection.prepareAndExecuteInternal(AvaticaConnection.java:674)
>> ~[avatica-core-1.20.0.jar:1.20.0]
>>        at
>> org.apache.calcite.avatica.AvaticaStatement.executeInternal(AvaticaStatement.java:156)
>> ~[avatica-core-1.20.0.jar:1.20.0]
>>        ... 10 common frames omitted
>> 
>> 
>> 
>> 
>> 
>> ------------------ Original ------------------
>> From:  "Julian Hyde";<jhyde.apa...@gmail.com>;
>> Send time: Wednesday, Feb 23, 2022 8:27 AM
>> To: "dev"<dev@calcite.apache.org>;
>> 
>> Subject:  Re: dynamic reflective schema
>> 
>> 
>> 
>> Every time I see "at Baz.bind” I am reminded that I should have chosen a
>> better name for that class than ‘Baz’. :)
>> 
>> I figured ‘it’s generated, no one is ever going to know its name’. How
>> wrong I was. The stack traces are all over the internet.
>> 
>> Julian
>> 
>> 
>>> On Feb 22, 2022, at 3:32 PM, Scott Reynolds <sdrreyno...@gmail.com>
>> wrote:
>>> 
>>> Whenever I see "at Baz.bind(Unknown Source)" I am reminded how important
>> it
>>> is, when debugging, to set the System Property calcite.debug = true
>>> 
>> https://github.com/apache/calcite/blob/a8a6569e6ba75efe9d5725c49338a7f181d3ab5c/core/src/main/java/org/apache/calcite/config/CalciteSystemProperty.java#L59
>>> 
>>> That will get you a good stack trace and will help you figure out the
>>> generated code is attempting to do.
>>> 
>>> On Tue, Feb 22, 2022 at 5:35 AM xiaobo <guxiaobo1...@qq.com.invalid>
>> wrote:
>>> 
>>>> we have static data conbination use cases , reflective shcema&nbsp; is
>> the
>>>> best choice!
>>>> 
>>>> 
>>>> 
>>>> ---Original---
>>>> From: "Gavin Ray"<ray.gavi...@gmail.com&gt;
>>>> Date: Mon, Feb 21, 2022 01:52 AM
>>>> To: "dev"<dev@calcite.apache.org&gt;;
>>>> Subject: Re: dynamic reflective schema
>>>> 
>>>> 
>>>> Ah, you don't want to use ReflectiveSchema, it's a simple schema type
>> meant
>>>> for easily making test schemas
>>>> 
>>>> You want to extend from "AbstractSchema" and override the function
>>>> "Map<String, Table&gt; getTableMap()"
>>>> For the "Table" type, you probably want to use "JsonScannableTable"
>>>> 
>>>> The CsvSchema example does exactly this, if you want to see an example
>>>> implementation:
>>>> 
>>>> 
>> https://github.com/apache/calcite/blob/4bc916619fd286b2c0cc4d5c653c96a68801d74e/example/csv/src/main/java/org/apache/calcite/adapter/csv/CsvSchema.java#L69-L106
>>>> 
>>>> Hope this helps =)
>>>> 
>>>> 
>>>> 
>>>> On Sat, Feb 19, 2022 at 11:03 PM xiaobo <guxiaobo1...@qq.com.invalid
>> &gt;
>>>> wrote:
>>>> 
>>>> &gt; Hi,
>>>> &gt; When using&nbsp; reflectiveSchema we must define a static Java
>> class
>>>> for the
>>>> &gt; schema object, but in our use case the actual data to query is
>>>> dynamic,
>>>> &gt; define JAVA class for each data combination is impossible, we have
>> an
>>>> idea
>>>> &gt; that can we make a JSONSchema which accepts a Map<String,
>>>> &gt; List<JSONObject&gt;&gt;, so that each List will be mapped to a
>> table
>>>> , and each
>>>> &gt; JSONObject mapped to a row, JSONObject keys will be column names.
>> Is
>>>> there
>>>> &gt; anything similar with this?
>>>> &gt;
>>>> &gt;
>>>> &gt; Regards

Reply via email to