2017-04-04 1 views
0

J'essaie de créer un schéma simple en utilisant ReflectiveSchema, puis d'essayer de projeter une "table" Employé en utilisant Groovy comme langage de programmation. Code ci-dessous.Apache Calcite - ReflectiveSchema StackoverflowError

class CalciteDemo { 
    String doDemo() {   
     RelNode node = new CalciteAlgebraBuilder().build() 
     return RelOptUtil.toString(node)     
    } 

    class DummySchema { 
     public final Employee[] emp = [new Employee(1, "Ting"), new Employee(2, "Tong")] 

     @Override 
     String toString() { 
      return "DummySchema" 
     } 

     class Employee { 
      Employee(int id, String name) { 
       this.id = id 
       this.name = name 
      } 
      public final int id 
      public final String name 
     } 
    } 

    class CalciteAlgebraBuilder {   
     FrameworkConfig config 

     CalciteAlgebraBuilder() {    
      SchemaPlus rootSchema = Frameworks.createRootSchema(true) 
      Schema schema = new ReflectiveSchema(new DummySchema()) 
      SchemaPlus rootPlusDummy = rootSchema.add("dummySchema", schema) 
      this.config = Frameworks.newConfigBuilder().parserConfig(SqlParser.Config.DEFAULT).defaultSchema(rootPlusDummy).traitDefs((List<RelTraitDef>)null).build() 
     } 

     RelNode build() { 
      RelBuilder.create(config).scan("emp").build() 
     } 
    } 
} 

Je semblent passer correctement dans l'objet « schéma » au constructeur de la classe ReflectiveSchema, mais je pense que son échec tout en essayant d'obtenir les champs de la classe des employés.

est ici l'erreur

java.lang.StackOverflowError 
    at java.lang.Class.copyFields(Class.java:3115) 
    at java.lang.Class.getFields(Class.java:1557) 
    at org.apache.calcite.jdbc.JavaTypeFactoryImpl.createStructType(JavaTypeFactoryImpl.java:76) 
    at org.apache.calcite.jdbc.JavaTypeFactoryImpl.createType(JavaTypeFactoryImpl.java:160) 
    at org.apache.calcite.jdbc.JavaTypeFactoryImpl.createType(JavaTypeFactoryImpl.java:151) 
    at org.apache.calcite.jdbc.JavaTypeFactoryImpl.createStructType(JavaTypeFactoryImpl.java:84) 
    at org.apache.calcite.jdbc.JavaTypeFactoryImpl.createType(JavaTypeFactoryImpl.java:160) 
    at org.apache.calcite.jdbc.JavaTypeFactoryImpl.createStructType(JavaTypeFactoryImpl.java:84) 

Quel est le problème avec cet exemple?

Répondre

0

Semble que cela simplement en déplaçant la classe Employee un niveau ci-dessus, à savoir. ce qui en fait un frère de la classe DummySchema, fait disparaître le problème.

Je pense que la façon dont org.apache.calcite.jdbc.JavaTypeFactoryImpl de Calcite est écrit ne gère pas bien les champs internes de Groovy.