Hey Julian, If the convertlets were customizable with a FrameworkConfig, how would I use that configure the JDBC driver (given that I'm doing it with the code upthread)? Or would that suggest using a different approach to embedding Calcite?
Gian On Thu, Nov 17, 2016 at 4:02 PM, Julian Hyde <jh...@apache.org> wrote: > Convertlets have a similar effect to planner rules (albeit they act on > scalar expressions, not relational expressions) so people should be able to > change the set of active convertlets. > > Would you like to propose a change that makes the convertlet table > pluggable? Maybe as part of FrameworkConfig? Regardless, please log a JIRA > to track this. > > And by the way, RexImpTable, which defines how operators are implemented > by generating java code, should also be pluggable. It’s been on my mind for > a long time to allow the “engine” — related to the data format, and how > code is generated to access fields and evaluate expressions and operators — > to be pluggable. > > Regarding whether the JDBC driver is the right way to embed Calcite. > There’s no easy answer. You might want to embed Calcite as a library in > your own server (as Drill and Hive do). Or you might want to make yourself > just an adapter that runs inside a Calcite JDBC server (as the CSV adapter > does). Or something in the middle, like what Phoenix does: using Calcite > for JDBC, SQL, planning, but with your own metadata and runtime engine. > > As long as you build the valuable stuff into planner rules, new relational > operators (if necessary) and use the schema SPI, you should be able to > change packaging in the future. > > Julian > > > > > > On Nov 17, 2016, at 1:59 PM, Gian Merlino <g...@imply.io> wrote: > > > > Hey Calcites, > > > > I'm working on embedding Calcite into Druid (http://druid.io/, > > https://github.com/druid-io/druid/pull/3682) and am running into a > problem > > that is making me wonder if the approach I'm using makes sense. > > > > Consider the expression EXTRACT(YEAR FROM __time). Calcite has a standard > > convertlet rule "convertExtract" that changes this into some arithmetic > on > > __time casted to an int type. But Druid has some builtin functions to do > > this, and I'd rather use those than arithmetic (for a bunch of reasons). > > Ideally, in my RelOptRules that convert Calcite rels to Druid queries, > I'd > > see the EXTRACT as a normal RexCall with the time flag and an expression > to > > apply it to. That's a lot easier to translate than the arithmetic stuff, > > which I'd have to pattern match and undo first before translating. > > > > So the problem I have is that I want to disable convertExtract, but I > don't > > see a way to do that or to swap out the convertlet table. > > > > The code I'm using to set up a connection is: > > > > public CalciteConnection createCalciteConnection( > > final DruidSchema druidSchema > > ) throws SQLException > > { > > final Properties props = new Properties(); > > props.setProperty("caseSensitive", "true"); > > props.setProperty("unquotedCasing", "UNCHANGED"); > > final Connection connection = > > DriverManager.getConnection("jdbc:calcite:", props); > > final CalciteConnection calciteConnection = > > connection.unwrap(CalciteConnection.class); > > calciteConnection.getRootSchema().setCacheEnabled(false); > > calciteConnection.getRootSchema().add(DRUID_SCHEMA_NAME, > druidSchema); > > return calciteConnection; > > } > > > > This CalciteConnection is then used by the Druid HTTP server to offer a > SQL > > API. > > > > Is there some way to swap out the convertlet table that I'm missing? > > > > Also, just in general, am I going about this the right way? Is using the > > JDBC driver the right way to embed Calcite? Or should I be calling into > it > > at some lower level? > > > > Thanks! > > > > Gian > >