Hello Raja and welcome to Calcite!

I have found it helpful to think of an Avatica server in terms of its main
interfaces Service
<https://github.com/apache/calcite-avatica/blob/519d1ceeb04cd99530bceb60c1a8e0966c413541/core/src/main/java/org/apache/calcite/avatica/remote/Service.java#L59C7-L59C7>
and Meta
<https://github.com/apache/calcite-avatica/blob/519d1ceeb04cd99530bceb60c1a8e0966c413541/core/src/main/java/org/apache/calcite/avatica/Meta.java#L53>.
The service implementation determines what RPC message format to use as
well as what RPCs are available. The meta implementation determines how the
server retrieves metadata, executes queries, etc.
When starting the server we can supply both the service and meta
implementations we want to use. In this case we want the server to access
Calcite locally while using the generic Avatica driver from a JDBC client
like DBeaver. For example (in Kotlin):

class MyJdbcServer(port: Int) {
    val meta: Meta = MyCalciteMetaFactory().create()
    val service: Service = LocalService(meta)
    val server: HttpServer = HttpServer(port, AvaticaJsonHandler(service))

    ... methods to start/stop server etc...
}

class MyCalciteMetaFactory() : Meta.Factory {
    override fun create(args: List<String?>?): Meta {
        val info: Properties = ...some method to generate Calcite
connection props...
        val driver: Driver = Driver()
        val connection: AvaticaConnection = driver.connect("jdbc:calcite:",
info) as AvaticaConnection?

        return driver.createMeta(connection)
    }
}


All RPCs from the JDBC client using the generic Avatica driver should be
handled by the local CalciteMetaImpl
<https://github.com/apache/calcite/blob/main/core/src/main/java/org/apache/calcite/jdbc/CalciteMetaImpl.java>
instance
associated with the server. This is the same as if you had a local Calcite
connection. Note that this will not work behind a load-balancer as local
Calcite connections are "stateful" (see CALCITE-668
<https://issues.apache.org/jira/browse/CALCITE-668>).
I'm sure others might have a better way but this has worked for us so far!

On Wed, Nov 8, 2023 at 9:00 AM Raja Ranjan Senapati <raja.ran...@gmail.com>
wrote:

> Team,
>   I am a newbie to Calcite and am excited about its potential. I have a
> question. According to the status section on the docs page
> <https://calcite.apache.org/docs/>, calcite supports Local and remote JDBC
> drivers using Avatica.  My interpretation of that statement is we can wrap
> any data source using Calcite and expose the data by creating a JDBC
> server. This JDBC server can be accessed remotely using the remote Calcite
> JDBC driver, from tools such as DBeaver/DataGrip.
>
>  I can create a local JDBC wrapper on my data source and use it from the
> same JVM. However, I cannot find any sample code that would create a JDBC
> server and serve remote clients using a remote JDBC server. I explored
> concepts like Avatica Http Server
> <
> https://calcite.apache.org/avatica/javadocAggregate/org/apache/calcite/avatica/server/HttpServer.html
> >but
> could not find any concrete implementation using Calcite. Can you please
> point me to some references/samples? I think it would be awesome if you
> could add this to some FAQ/Tutorial page in Calcite as well.
>
> Thanks,
> Raja Senapati
>


-- 

TJ

Reply via email to