diff --git a/src/java/org/apache/cassandra/service/CassandraServer.java b/src/java/org/apache/cassandra/service/CassandraServer.java index 8d333ea43d..72afb03616 100644 --- a/src/java/org/apache/cassandra/service/CassandraServer.java +++ b/src/java/org/apache/cassandra/service/CassandraServer.java @@ -100,6 +100,11 @@ public class CassandraServer implements Cassandra.Iface } public List thriftifyColumns(Collection columns) + { + return thriftifyColumns(columns, false); + } + + public List thriftifyColumns(Collection columns, boolean reverseOrder) { if (columns == null || columns.isEmpty()) { @@ -117,6 +122,8 @@ public class CassandraServer implements Cassandra.Iface thriftColumns.add(thrift_column); } + if (reverseOrder) + Collections.reverse(thriftColumns); return thriftColumns; } @@ -124,6 +131,11 @@ public class CassandraServer implements Cassandra.Iface private List getSlice(ReadCommand command) throws InvalidRequestException { ColumnFamily cfamily = readColumnFamily(command); + boolean reverseOrder = false; + + if (command instanceof SliceFromReadCommand) + reverseOrder = !((SliceFromReadCommand)command).isAscending; + if (cfamily == null || cfamily.getColumnsMap().size() == 0) { return EMPTY_COLUMNS; @@ -131,9 +143,9 @@ public class CassandraServer implements Cassandra.Iface if (cfamily.isSuper()) { IColumn column = cfamily.getColumnsMap().values().iterator().next(); - return thriftifyColumns(column.getSubColumns()); + return thriftifyColumns(column.getSubColumns(), reverseOrder); } - return thriftifyColumns(cfamily.getSortedColumns()); + return thriftifyColumns(cfamily.getSortedColumns(), reverseOrder); } public List get_slice_by_names(String table, String key, ColumnParent column_parent, List column_names) @@ -305,6 +317,11 @@ public class CassandraServer implements Cassandra.Iface } private List thriftifySuperColumns(Collection columns) + { + return thriftifySuperColumns(columns, false); + } + + private List thriftifySuperColumns(Collection columns, boolean reverseOrder) { if (columns == null || columns.isEmpty()) { @@ -322,6 +339,9 @@ public class CassandraServer implements Cassandra.Iface thriftSuperColumns.add(new SuperColumn(column.name(), subcolumns)); } + if (reverseOrder) + Collections.reverse(thriftSuperColumns); + return thriftSuperColumns; } @@ -340,7 +360,7 @@ public class CassandraServer implements Cassandra.Iface return EMPTY_SUPERCOLUMNS; } Collection columns = cfamily.getSortedColumns(); - return thriftifySuperColumns(columns); + return thriftifySuperColumns(columns, !is_ascending); } diff --git a/test/system/test_server.py b/test/system/test_server.py index e5824734d3..65954964d2 100644 --- a/test/system/test_server.py +++ b/test/system/test_server.py @@ -71,13 +71,35 @@ def _verify_range(): assert result[0].name == 'c1' assert result[1].name == 'c2' + result = client.get_slice('Table1','key1', ColumnParent('Standard1'), 'c3', 'c2', False, 1000) + assert len(result) == 2 + assert result[0].name == 'c3' + assert result[1].name == 'c2' + result = client.get_slice('Table1','key1', ColumnParent('Standard1'), 'a', 'z' , True, 1000) assert len(result) == 3, result result = client.get_slice('Table1','key1', ColumnParent('Standard1'), 'a', 'z' , True, 2) assert len(result) == 2, result - +def _insert_super_range(): + client.insert('Table1', 'key1', ColumnPath('Super1', 'sc1', _i64(4)), 'value4', 0, False) + client.insert('Table1', 'key1', ColumnPath('Super1', 'sc2', _i64(5)), 'value5', 0, False) + client.insert('Table1', 'key1', ColumnPath('Super1', 'sc2', _i64(6)), 'value6', 0, False) + client.insert('Table1', 'key1', ColumnPath('Super1', 'sc3', _i64(7)), 'value7', 0, False) + time.sleep(0.1) + +def _verify_super_range(): + result = client.get_slice_super('Table1','key1', 'Super1', 'sc2', 'sc3', True, 2) + assert len(result) == 2 + assert result[0].name == 'sc2' + assert result[1].name == 'sc3' + + result = client.get_slice_super('Table1','key1', 'Super1', 'sc3', 'sc2', False, 2) + assert len(result) == 2 + assert result[0].name == 'sc3' + assert result[1].name == 'sc2' + def _verify_super(supercf='Super1'): assert client.get_column('Table1', 'key1', ColumnPath(supercf, 'sc1', _i64(4))) == Column(_i64(4), 'value4', 0) slice = client.get_slice_super('Table1', 'key1', 'Super1', '', '', True, 1000) @@ -316,6 +338,10 @@ class TestMutations(CassandraTester): _insert_range() _verify_range() + def test_get_slice_super_range(self): + _insert_super_range() + _verify_super_range() + def test_get_slice_by_names(self): _insert_range() result = client.get_slice_by_names('Table1','key1', ColumnParent('Standard1'), ['c1', 'c2'])