The idea of converting literals into bind variables is called “hoisting”. We 
had the idea a while ago but have not implemented it. 

https://issues.apache.org/jira/browse/CALCITE-963

Until that feature is implemented, you will need to create bind variables 
explicitly, and bind them before executing the query. 

Julian

> On Sep 13, 2019, at 4:39 PM, Scott Reynolds <sdrreyno...@gmail.com> wrote:
> 
> Hi,
> 
> Spent a bunch of time researching and staring at code today to understand
> the code compilation path within Calcite. I started down this path because
> we noticed whenever we changed the `startDate` or `endDate` for the query
> it went through compilation process again. We expected it to use the
> previous classes `bind` it with the new RexLiterals. I was *hoping*  the
> RexLiterals were passed into the `bind()` method but that does not appear
> to be the main goal of `DataContext` objects.
> 
> We also found the trick Kylin did to improve their query compilation with
> prepared statements:
> https://issues.apache.org/jira/browse/KYLIN-3434 but PreparedStatement is
> stateful and I don't believe a good way to solve this issue.
> 
> I would like to propose a change to Calcite so that Filters are passed into
> the `bind()` call alongside or within DataContext. This would allow the
> `EnumerableRel` implementations to reference the `Filters` as arguments.
> This -- I believe -- would cause any change to the filters to use
> the previously compiled class instead of generating a brand new one.
> 
> I am emailing everyone on this list for two reasons:
> 1. Is this a bad idea ?
> 2. I don't have a design yet so would love any ideas. Should we stick more
> stuff into `DataContext`? Should `EnumerableRel` have another method that
> is used to gather these RexLiterals?

Reply via email to