6

jdbc 接続を使用せずに apache calcite api raw を使用したいと思います。jdbc API は問題なく使用できますが、API を使用しようとすると null ptr 例外が発生します。私がこれまでに行ったことは次のとおりです。

package calcite.examples

import java.util.Properties

import calcite.demo.DemoSchema
import org.apache.calcite.DataContext
import org.apache.calcite.config.CalciteConnectionConfigImpl
import org.apache.calcite.jdbc.CalcitePrepare.Query
import org.apache.calcite.jdbc.{CalcitePrepare, CalciteSchema, JavaTypeFactoryImpl}
import org.apache.calcite.prepare.CalcitePrepareImpl

import scala.collection.JavaConverters._

object TryIt extends App
{
    val ctx = new AdapterContext
    val sql = Query.of[Any]("SELECT * FROM dep")
    //  assert(sql.rel != null)

    val elementType = classOf[Array[Object]]
    val prepared = new CalcitePrepareImpl().prepareSql(ctx, sql, elementType, -1)
    val enumerable = prepared.enumerable(new MyDataContext)
}

class AdapterContext extends CalcitePrepare.Context
{
    private val properties = new Properties
    private val rootSchema = CalciteSchema.createRootSchema(true)
    rootSchema.add("default", new DemoSchema)

    // default schema names
    override def getDefaultSchemaPath = List("default").asJava

    override def spark() = {
        val enable = config.spark
        CalcitePrepare.Dummy.getSparkHandler(enable)
    }

    override val config = new CalciteConnectionConfigImpl(properties)

    override val getTypeFactory = new JavaTypeFactoryImpl

    override def getRootSchema = rootSchema

    override def getDataContext = new MyDataContext
}

class MyDataContext extends DataContext
{
    override def get(name: String) = {
        println(s"MyDataContext name=$name")
        null
    }

    override def getTypeFactory = ???

    override def getQueryProvider = ???

    override def getRootSchema = ???
}

しかし、これを実行すると

MyDataContext name=v0stashed

Exception in thread "main" java.lang.NullPointerException
at org.apache.calcite.interpreter.Interpreter.<init>(Interpreter.java:71)
at Baz.bind(Unknown Source)
at org.apache.calcite.jdbc.CalcitePrepare$CalciteSignature.enumerable(CalcitePrepare.java:327)
at calcite.examples.TryIt$.delayedEndpoint$calcite$examples$TryIt$1(TryIt.scala:26)
at calcite.examples.TryIt$delayedInit$body.apply(TryIt.scala:18)
at scala.Function0$class.apply$mcV$sp(Function0.scala:34)
at scala.runtime.AbstractFunction0.apply$mcV$sp(AbstractFunction0.scala:12)
at scala.App$$anonfun$main$1.apply(App.scala:76)
at scala.App$$anonfun$main$1.apply(App.scala:76)
at scala.collection.immutable.List.foreach(List.scala:381)
at scala.collection.generic.TraversableForwarder$class.foreach(TraversableForwarder.scala:35)
at scala.App$class.main(App.scala:76)
at calcite.examples.TryIt$.main(TryIt.scala:18)
at calcite.examples.TryIt.main(TryIt.scala)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:497)
at com.intellij.rt.execution.application.AppMain.main(AppMain.java:144)

コンテキストから v0stashed を取得しようとしていることに注意してください。これはどうあるべきかわかりません。私が目にする唯一の CalcitePrepare.Context impl は、使用を避けようとしている CalciteConnection を使用するものです。また、方解石のドキュメントからコードのスニペットを取得しましたが、方解石 1.7 では古くなっています。

アイデア?

4

2 に答える 2

0

これはほとんど動作するはずJdbcSchemaです。あなたは Spark スキーマを使おうとしているのだと思いますが、Calcite のバージョン番号から判断すると、あまりうまく維持されていないと思います。リフレクティブ HR スキーマや JDBC スキーマなど、より単純なスキーマを試してみてください。既存のものに少し変更を加えるだけでうまくいくはずです。

于 2016-04-12T22:40:22.907 に答える