working slice-all queries (SELECT *)

Patch by eevans

git-svn-id: https://svn.apache.org/repos/asf/cassandra/trunk@1082662 13f79535-47bb-0310-9956-ffa450edef68
This commit is contained in:
Eric Evans 2011-03-17 19:40:56 +00:00
parent ace6da50b4
commit a05f951a6c
3 changed files with 45 additions and 9 deletions

View File

@ -143,6 +143,7 @@ selectExpression returns [SelectExpression expr]
( first=term { $expr = new SelectExpression(first, count, reversed); }
(',' next=term { $expr.and(next); })*
| start=term RANGEOP finish=term { $expr = new SelectExpression(start, finish, count, reversed); }
| '\*' { $expr = new SelectExpression(new Term(), new Term(), count, reversed); }
)
;

View File

@ -100,15 +100,15 @@ public class QueryProcessor
// ...a range (slice) of column names
else
{
validateColumnNames(keyspace,
select.getColumnFamily(),
select.getColumnStart().getByteBuffer(comparator),
select.getColumnFinish().getByteBuffer(comparator));
ByteBuffer start = select.getColumnStart().getByteBuffer(comparator);
ByteBuffer finish = select.getColumnFinish().getByteBuffer(comparator);
validateSliceRange(keyspace, select.getColumnFamily(), start, finish, select.isColumnsReversed());
commands.add(new SliceFromReadCommand(keyspace,
key,
queryPath,
select.getColumnStart().getByteBuffer(comparator),
select.getColumnFinish().getByteBuffer(comparator),
start,
finish,
select.isColumnsReversed(),
select.getColumnsLimit()));
}
@ -370,9 +370,11 @@ public class QueryProcessor
for (ByteBuffer name : columns)
{
if (name.remaining() > IColumn.MAX_NAME_LENGTH)
throw new InvalidRequestException();
throw new InvalidRequestException(String.format("column name is too long (%s > %s)",
name.remaining(),
IColumn.MAX_NAME_LENGTH));
if (name.remaining() == 0)
throw new InvalidRequestException();
throw new InvalidRequestException("zero-length column name");
try
{
comparator.validate(name);
@ -419,11 +421,36 @@ public class QueryProcessor
throws InvalidRequestException
{
if (predicate.slice_range != null)
validateColumnNames(keyspace, columnFamily, predicate.slice_range.start, predicate.slice_range.finish);
validateSliceRange(keyspace, columnFamily, predicate.slice_range);
else
validateColumnNames(keyspace, columnFamily, predicate.column_names);
}
private static void validateSliceRange(String keyspace, String columnFamily, SliceRange range)
throws InvalidRequestException
{
validateSliceRange(keyspace, columnFamily, range.start, range.finish, range.reversed);
}
private static void validateSliceRange(String keyspace, String columnFamily, ByteBuffer start, ByteBuffer finish, boolean reversed)
throws InvalidRequestException
{
AbstractType<?> comparator = ColumnFamily.getComparatorFor(keyspace, columnFamily, null);
try
{
comparator.validate(start);
comparator.validate(finish);
}
catch (MarshalException e)
{
throw new InvalidRequestException(e.getMessage());
}
Comparator<ByteBuffer> orderedComparator = reversed ? comparator.reverseComparator: comparator;
if (start.remaining() > 0 && finish.remaining() > 0 && orderedComparator.compare(start, finish) > 0)
throw new InvalidRequestException("range finish must come after start in traversal order");
}
// Copypasta from CassandraServer (where it is private).
private static void validateSchemaAgreement() throws SchemaDisagreementException
{

View File

@ -187,6 +187,14 @@ class TestCql(ThriftTester):
assert r[0].columns[0].value == "a"
assert r[0].columns[1].value == "b"
assert r[0].columns[2].value == "c"
def test_select_columns_slice_all(self):
"slice all columns in a row"
conn = init()
r = conn.execute("SELECT * FROM StandardString1 WHERE KEY = 'ka';")
assert len(r[0].columns) == 2
r = conn.execute("SELECT ''..'' FROM StandardString1 WHERE KEY = 'ka';")
assert len(r[0].columns) == 2
def test_select_columns_slice_with_limit(self):
"range of columns (slice) by row with limit"