Apache Calcite - ReflectiveSchema StackoverflowError

时间:2017-04-04 11:44:32

标签: groovy apache-calcite

我尝试使用ReflectiveSchema创建一个简单的架构,然后尝试投射一个Employee" table"使用Groovy作为我的编程语言。代码如下。

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()
        }
    }
}

我似乎正确地传递了&#34;架构&#34;反对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)

这个例子有什么问题?

1 个答案:

答案 0 :(得分:0)

似乎只需将Employee类移到上面一级,即。使它成为DummySchema类的兄弟,使问题消失。

我认为编写方解码org.apache.calcite.jdbc.JavaTypeFactoryImpl的方式并不能很好地处理Groovy的内部字段。