Yeah, not easy. Calcite/Avatica could provide a Map of connection state, and 
another Map of statement state, that each piece of generated code could use to 
persist state across calls. It would be analogous to how web containers give 
servlets a place to put their session state.

Julian

> On Aug 4, 2016, at 7:02 PM, Michael Mior <[email protected]> wrote:
> 
> In the second approach, where would the Cassandra prepared statement be
> stored? I'm not sure I understand the lifecycle of Calcite statements. Is
> there ever a case where the same statement will be reused? If there's a
> convenient object to attach the Cassandra prepared statement to, that's
> great. If it's going to be necessary to maintain some sort of cache of
> these prepared statements, then I don't think it's worth it.
> 
> --
> Michael Mior
> [email protected]
> 
> 2016-08-04 21:07 GMT-04:00 Julian Hyde <[email protected]>:
> 
>> I don’t recall whether there is a convenient “hook” in the adapter that
>> gets called when Calcite prepares a statement. Maybe after the best plan
>> has been found, and a CassandraRel.Implementor has finished walking over a
>> tree of CassandraRel nodes the Implementor could send the statement to
>> Cassandra and stash the resulting handle somewhere that it can be retrieved
>> when the statement is executed. But the problem is where to stash that
>> handle, and ensuring that the Cassandra connection lifecycle matches
>> Calcite’s statement lifecycle.
>> 
>> A simpler approach is to prepare the Cassandra statement the first time
>> the Calcite statement is executed, and re-use that same statement for
>> subsequent executions. The first execute will take a little longer than the
>> previous approach, but the lifecycle is simpler.
>> 
>> Julian
>> 
>>> On Aug 4, 2016, at 3:51 PM, Michael Mior <[email protected]> wrote:
>>> 
>>> Great! Looking forward to reviewing the PR. Unfortunately I'm not really
>>> familiar with the PreparedStatement implementation in Calcite but I don't
>>> believe it's currently possible to implement adapter-specific behaviour
>>> prepared statements. At this point I think preparing statements only
>> serves
>>> to remove the overhead of parsing the query. I'm happy to have someone
>> else
>>> correct me if this is not the case.
>>> 
>>> --
>>> Michael Mior
>>> [email protected]
>>> 
>>> 2016-08-04 3:33 GMT-04:00 Shuyi Chen <[email protected]>:
>>> 
>>>> Thanks a lot, Michael and Jordan. I got it working with the suggestion.
>>>> I'll send a pull request later for you guys to help review.
>>>> 
>>>> Also, I got another question. When I run a PrepareStatement in calcite,
>> I
>>>> also want to push down part of the PrepareStatement in CQL to cassandra.
>>>> For example,
>>>> 
>>>> Assuming the cassandra table contains field: a, b, c, and a is the only
>>>> primary key.
>>>> 
>>>> calcite PrepareStatement is:  select a, b, c from table1 where a = ?
>> and b
>>>> < ?;
>>>> 
>>>> I want to push down CQL PrepareStatement: select a, b, c from table1
>> where
>>>> a = ? to cassandra, and store the cassandra PrepareStatement inside the
>>>> calcite PrepareStatement.
>>>> 
>>>> And when we bind the data to execute the calcite PrepareStatement, I
>> need
>>>> to be able to retrieve the stored cassandra PrepareStatement and bind
>> the
>>>> data for it to execute the cassandra query.
>>>> 
>>>> I would love to get some advice on how to implement this. Thanks a lot.
>>>> 
>>>> 
>>>> 
>>>> 
>>>> On Wed, Aug 3, 2016 at 1:22 PM, [email protected] <
>>>> [email protected]> wrote:
>>>> 
>>>>> Sure, I'm no Cassandra expert and obviously the implementation needs to
>>>>> handle whatever actually can be pushed down to C*. One should not
>> follow
>>>> my
>>>>> advice precisely. The methods that are required to determine whether a
>>>>> predicate is supported are already present in CassandraFilterRule. I
>> was
>>>>> just commenting on how one would go about splitting a filter based on
>>>> what
>>>>> is supported/not supported. So, replace "equality predicate" with
>>>> "whatever
>>>>> Cassandra supports" and use the existing isEqualityOnKey method.
>>>>> 
>>>>>> On Aug 3, 2016, at 11:44 AM, Michael Mior <[email protected]> wrote:
>>>>>> 
>>>>>> It's more complicated than that. For equality predicates, it's a
>> matter
>>>>> of
>>>>>> splitting out equality predicates involving a field and a literal.
>>>>>> Cassandra can't handle predicates involving expressions or equality
>>>>> between
>>>>>> fields. Cassandra can also handle some range predicates if the
>>>> partition
>>>>>> key is already restricted by an equality predicate and the range
>>>>> predicate
>>>>>> is part o the clustering key.
>>>>>> 
>>>>>> Cheers,
>>>>>> --
>>>>>> Michael Mior
>>>>>> [email protected]
>>>>>> 
>>>>>> 2016-08-03 14:21 GMT-04:00 [email protected] <
>>>>>> [email protected]>:
>>>>>> 
>>>>>>> It's just a matter of splitting out equality predicates. What I would
>>>> do
>>>>>>> is create a Filter rule that splits the filter based on whether a
>>>>> predicate
>>>>>>> is an equality. If the Filter is split, the rule returns a Filter
>> with
>>>>> the
>>>>>>> equality predicates as inputs to the non-equality predicates. That
>>>>> should
>>>>>>> allow the CassandraFilterRule to convert the Filter with equality
>>>>>>> predicates and for the rest of the predicates above to be implemented
>>>> in
>>>>>>> Enumerable convention.
>>>>>>> 
>>>>>>> You can look at the rules in core for some examples of splitting
>>>>>>> expressions. Just ensure equality predicates are pushed down or you
>>>> can
>>>>>>> implement a rule for pushing them down past other filters.
>>>>>>> 
>>>>>>>> On Aug 3, 2016, at 10:57 AM, Shuyi Chen <[email protected]> wrote:
>>>>>>>> 
>>>>>>>> Hi,
>>>>>>>> 
>>>>>>>> I am working on improving the cassandra adapter. Right now, I found
>>>>> that
>>>>>>> if
>>>>>>>> my filter contains non-primary keys, calcite will just reject the
>>>>> filter
>>>>>>>> and just execute a no-filter cql query  which is bad. I am wondering
>>>>> how
>>>>>>> I
>>>>>>>> can split the filter into cassandra supported part and
>>>>>>>> cassandra-non-supported part, and push down the cassandra supported
>>>>> part
>>>>>>> to
>>>>>>>> cql. Below is an example.
>>>>>>>> 
>>>>>>>> Assuming the cassandra table contains field: a, b, c, and a is the
>>>> only
>>>>>>>> primary key.
>>>>>>>> 
>>>>>>>> calcite sql is:  select a, b, c from table1 where a = 'xxx' and b <
>>>>> 3223;
>>>>>>>> 
>>>>>>>> I want to push down cql: select a, b, c from table1 where a = 'xxx'
>>>> to
>>>>>>>> cassandra,
>>>>>>>> 
>>>>>>>> But right now, the cassandra adapter will only push down: select a,
>>>> b,
>>>>> c
>>>>>>>> from table1, which is bad for cassandra.
>>>>>>>> 
>>>>>>>> Thanks a lot.
>>>>>>>> Shuyi
>>>>>>>> 
>>>>>>>> --
>>>>>>>> "So you have to trust that the dots will somehow connect in your
>>>>> future."
>>>>>>> 
>>>>> 
>>>> 
>>>> 
>>>> 
>>>> --
>>>> "So you have to trust that the dots will somehow connect in your
>> future."
>>>> 
>> 
>> 

Reply via email to