2017-04-04 14 views
0

ReflectiveSchemaを使用して単純なスキーマを作成し、Groovyをプログラミング言語として使用してEmployee "table"を投影しようとしています。以下のコード。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() 
     } 
    } 
} 

私は正しくReflectiveSchemaクラスのコンストラクタに「スキーマ」オブジェクトを渡しているように見えるが、Employeeクラスのフィールドを取得しようとしながら、私はその失敗を考えます。

は、ここでは、この例と間違っているどのようなエラー

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) 

ですか?

答えて

0

Employeeクラスを上記のレベルに移動するだけであると思われます。それをDummySchemaクラスの兄弟にすると、問題はなくなります。

私は、Calciteのorg.apache.calcite.jdbc.JavaTypeFactoryImplの記述方法はGroovyの内部フィールドをうまく扱えないと思います。

関連する問題