Thank you, TJ and Gavin. Appreciate you taking the time to provide such helpful suggestions. I will try these out and revert, in case I face any more issues.
Best Regards, Raja Senapati On 2023/11/08 18:53:54 TJ Banghart wrote: > 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 <[email protected]> > 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 >
