Apache 方解石 - ReflectiveSchema StackoverflowError

Apache Calcite - ReflectiveSchema StackoverflowError

我正在尝试使用 ReflectiveSchema 创建一个简单的模式,然后尝试使用 Groovy 作为我的编程语言来投影 Employee "table"。下面的代码。

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

我似乎正确地将 "schema" 对象传递给 ReflectiveSchema class 的构造函数,但我认为它在尝试获取 Employee class 的字段时失败了.

这是错误

java.lang.WhosebugError
    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)

这个例子有什么问题?

似乎只需将 Employee class 移动一个级别,即。使它成为 DummySchema class 的同级,问题就会消失。

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