[ 
https://issues.apache.org/jira/browse/CASSANDRA-7396?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel
 ]

Robert Stupp updated CASSANDRA-7396:
------------------------------------
    Status: Patch Available  (was: In Progress)

[Branch|https://github.com/apache/cassandra/compare/trunk...snazy:7396-coll-slice]
[utests|http://cassci.datastax.com/view/Dev/view/snazy/job/snazy-7396-coll-slice-testall/lastSuccessfulBuild/]
[dtests|http://cassci.datastax.com/view/Dev/view/snazy/job/snazy-7396-coll-slice-dtest/lastSuccessfulBuild/]

It allows single element and slice selections on sets, maps and lists - both 
frozen and non-frozen ones.

Syntax for single element selections is {{collection_column\[element_term\]}}.
Syntax for slice selections is {{collection_column\[from_term..to_term\]}}. 
Either {{from_term}} or {{to_term}} can be omitted to make either one unbounded.
All kinds of terms are allowed - including bind markers and function calls. 
Single element and slice selections can also be passed to functions/aggregates.
The resulting type of any element or slice selection is the same as the 
collection type. For example, {{set_column\[element\]}} will return a set (not 
a boolean).

Non-frozen collections (complex data) except lists are treated special. It uses 
{{ColumnFilter}} to filter only those values, that are within the bounds of the 
slice(s).

{{CollectionSerializer.serializeForNativeProtocol}} (moved from 
{{CollectionType}}) now takes additional parameters to prevent superfluous 
serialization - this works for non-frozen lists, too.
{{CollectionSerializer.reserializeForNativeProtocol}} performs similar work for 
frozen types.

{{SelectStatement}} tries to use one {{ColumnFilter}} instance for all 
executions of a (prepared) statement. In case the terms for the element/slice 
sub-selection are dynamic ones (bound parameters, function calls), a new 
{{ColumnFilter}} needs to be created for each execution in order to benefit 
from its select/slice capabilities.

The new class {{SelectionRestriction}} is used as a descriptor of column 
element/slice/full selections. Each individual selection has its own 
{{SelectionRestriction}} instance.

{{Term.Raw}} got a new function {{isConstant}}, which is needed to determine 
whether a {{SelectionRestriction}} refers to a constant/literal value.

Some {{Selector}} methods now take {{QueryOptions}} instead of {{int 
protocolVersion}}, which is needed to resolve bound variables and functions for 
element/slice bounds.

{{Selection}} now distinguishes between {{ByteBuffer}}s and 
{{ComplexColumnData}}. The {{ComplexColumnData}} is used to use the “raw” cells 
for collection select/slice before these get serialized. That 
{{ComplexColumnData}} is then passed to {{CollectionSerializer}}.

One maybe annoying thing in the syntax is the use of two dots to separate slice 
bounds. Given a {{map<int,text>}} and doing a slice selection like {{SELECT 
col\[1..5\]}} will result in a parser failure, because it interprets {{1.}} as 
the start of a floating point literal and then complains about the 2nd dot. 
Workaround is to put a space between ({{SELECT col\[1 .. 5\]}}). I thought 
about using {{:}} as a separator, but that is the start of a bind parameter. 
{{-}} is already “occupied” by negative numeric values. {{;}} is the end of a 
statement. Using a keyword like {{TO}} makes unbounded slice queried look a bit 
awkward ({{SELECT col\[ TO 5\]}} or {{SELECT col\[5 TO \]}}.

> Allow selecting Map key, List index
> -----------------------------------
>
>                 Key: CASSANDRA-7396
>                 URL: https://issues.apache.org/jira/browse/CASSANDRA-7396
>             Project: Cassandra
>          Issue Type: New Feature
>          Components: CQL
>            Reporter: Jonathan Ellis
>            Assignee: Robert Stupp
>              Labels: cql
>             Fix For: 3.x
>
>         Attachments: 7396_unit_tests.txt
>
>
> Allow "SELECT map['key]" and "SELECT list[index]."  (Selecting a UDT subfield 
> is already supported.)



--
This message was sent by Atlassian JIRA
(v6.3.4#6332)

Reply via email to