【问题标题】:Apache Calcite - ReflectiveSchema StackoverflowErrorApache Calcite - ReflectiveSchema StackoverflowError
【发布时间】:2017-05-11 21:17:35
【问题描述】:

我正在尝试使用 ReflectiveSchema 创建一个简单的模式,然后尝试使用 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()
        }
    }
}

我似乎正确地将“模式”对象传递给 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)

这个例子有什么问题?

【问题讨论】:

    标签: groovy apache-calcite


    【解决方案1】:

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

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

    【讨论】:

      猜你喜欢
      • 2022-12-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-04-08
      • 2018-07-05
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多