2016-03-29 4 views
3

Ich möchte die Apache Calcit API roh verwenden, ohne jdbc Verbindungen zu verwenden. Ich kann die jdbc-API gut verwenden, aber ich bekomme null ptr Ausnahmen, wenn Sie versuchen, die API zu verwenden. Was ich tat, so weit ist:Apache Calcit, Abfrage ohne Verwendung der jdbc api

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 = ??? 
} 

Aber wenn ich dies laufe ich bekommen

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) 

Beachten Sie, dass es versucht, aus dem Kontext zu bekommen v0stashed, die ich don Ich weiß nicht, was es sein soll. Das einzige CalcitePrepare.Context-Impl, das ich sehe, ist eines, das eine CalciteConnection verwendet, die ich zu vermeiden versuche. Auch ich nahm Codeschnipsel aus der Calcit-Dokumentation, aber es war veraltet mit Calcit 1.7

Ideen?

Antwort

0

Das sollte fast funktionieren, ich habe die gleiche Sache mit einigen Sachen geändert mit der JdbcSchema. Meine Vermutung ist, dass Sie versuchen, ein Spark-Schema zu verwenden, und nach den Versionsnummern in Calcite zu urteilen, glaube ich nicht, dass es sehr gut aufrechterhalten wird. Versuchen Sie ein einfacheres Schema, wie das reflektierende HR oder das JDBC-Schema, und es sollte funktionieren, mit einigen kleinen Änderungen an dem, was Sie haben.

Verwandte Themen