Author: slebresne
Date: Thu May 19 13:53:06 2011
New Revision: 1124780

URL: http://svn.apache.org/viewvc?rev=1124780&view=rev
Log:
Allow limiting row slices in the cli
patch by slebresne; reviewed by xedin for CASSANDRA-2646

Modified:
    cassandra/branches/cassandra-0.7/src/java/org/apache/cassandra/cli/Cli.g
    
cassandra/branches/cassandra-0.7/src/java/org/apache/cassandra/cli/CliClient.java

Modified: 
cassandra/branches/cassandra-0.7/src/java/org/apache/cassandra/cli/Cli.g
URL: 
http://svn.apache.org/viewvc/cassandra/branches/cassandra-0.7/src/java/org/apache/cassandra/cli/Cli.g?rev=1124780&r1=1124779&r2=1124780&view=diff
==============================================================================
--- cassandra/branches/cassandra-0.7/src/java/org/apache/cassandra/cli/Cli.g 
(original)
+++ cassandra/branches/cassandra-0.7/src/java/org/apache/cassandra/cli/Cli.g 
Thu May 19 13:53:06 2011
@@ -228,10 +228,10 @@ exitStatement
     ;
 
 getStatement
-    : GET columnFamilyExpr ('AS' typeIdentifier)?
-        -> ^(NODE_THRIFT_GET columnFamilyExpr ( ^(CONVERT_TO_TYPE 
typeIdentifier) )? )
-    | GET columnFamily 'WHERE' getCondition ('AND' getCondition)* ('LIMIT' 
limit=IntegerLiteral)*
-        -> ^(NODE_THRIFT_GET_WITH_CONDITIONS columnFamily ^(CONDITIONS 
getCondition+) ^(NODE_LIMIT $limit)*) 
+    : GET columnFamilyExpr ('AS' typeIdentifier)? ('LIMIT' 
limit=IntegerLiteral)?
+        -> ^(NODE_THRIFT_GET columnFamilyExpr ( ^(CONVERT_TO_TYPE 
typeIdentifier) )? ^(NODE_LIMIT $limit)?)
+    | GET columnFamily 'WHERE' getCondition ('AND' getCondition)* ('LIMIT' 
limit=IntegerLiteral)?
+        -> ^(NODE_THRIFT_GET_WITH_CONDITIONS columnFamily ^(CONDITIONS 
getCondition+) ^(NODE_LIMIT $limit)?) 
     ;
 
 getCondition

Modified: 
cassandra/branches/cassandra-0.7/src/java/org/apache/cassandra/cli/CliClient.java
URL: 
http://svn.apache.org/viewvc/cassandra/branches/cassandra-0.7/src/java/org/apache/cassandra/cli/CliClient.java?rev=1124780&r1=1124779&r2=1124780&view=diff
==============================================================================
--- 
cassandra/branches/cassandra-0.7/src/java/org/apache/cassandra/cli/CliClient.java
 (original)
+++ 
cassandra/branches/cassandra-0.7/src/java/org/apache/cassandra/cli/CliClient.java
 Thu May 19 13:53:06 2011
@@ -306,7 +306,7 @@ public class CliClient extends CliUserHe
         sessionState.out.println(String.format("%s removed.", (columnSpecCnt 
== 0) ? "row" : "column"));
     }
 
-    private void doSlice(String keyspace, ByteBuffer key, String columnFamily, 
byte[] superColumnName)
+    private void doSlice(String keyspace, ByteBuffer key, String columnFamily, 
byte[] superColumnName, int limit)
             throws InvalidRequestException, UnavailableException, 
TimedOutException, TException, IllegalAccessException, NotFoundException, 
InstantiationException, NoSuchFieldException
     {
         
@@ -314,7 +314,7 @@ public class CliClient extends CliUserHe
         if(superColumnName != null)
             parent.setSuper_column(superColumnName);
 
-        SliceRange range = new SliceRange(ByteBufferUtil.EMPTY_BYTE_BUFFER, 
ByteBufferUtil.EMPTY_BYTE_BUFFER, false, 1000000);
+        SliceRange range = new SliceRange(ByteBufferUtil.EMPTY_BYTE_BUFFER, 
ByteBufferUtil.EMPTY_BYTE_BUFFER, false, limit);
         List<ColumnOrSuperColumn> columns = thriftClient.get_slice(key, 
parent, new SlicePredicate().setColumn_names(null).setSlice_range(range), 
consistencyLevel);
 
         AbstractType validator;
@@ -401,10 +401,39 @@ public class CliClient extends CliUserHe
         byte[] superColumnName = null;
         ByteBuffer columnName;
 
+        Tree typeTree = null;
+        Tree limitTree = null;
+
+        int limit = 1000000;
+
+        if (statement.getChildCount() >= 2)
+        {
+            if (statement.getChild(1).getType() == CliParser.CONVERT_TO_TYPE)
+            {
+                typeTree = statement.getChild(1).getChild(0);
+                if (statement.getChildCount() == 3)
+                    limitTree = statement.getChild(2).getChild(0);
+            }
+            else
+            {
+                limitTree = statement.getChild(1).getChild(0);
+            }
+        }
+
+        if (limitTree != null)
+        {
+            limit = Integer.parseInt(limitTree.getText());
+
+            if (limit == 0)
+            {
+                throw new IllegalArgumentException("LIMIT should be greater 
than zero.");
+            }
+        }
+
         // table.cf['key'] -- row slice
         if (columnSpecCnt == 0)
         {
-            doSlice(keySpace, key, columnFamily, superColumnName);
+            doSlice(keySpace, key, columnFamily, superColumnName, limit);
             return;
         }
         // table.cf['key']['column'] -- slice of a super, or get of a standard
@@ -415,7 +444,7 @@ public class CliClient extends CliUserHe
             if (isSuper)
             {
                 superColumnName = columnName.array();
-                doSlice(keySpace, key, columnFamily, superColumnName);
+                doSlice(keySpace, key, columnFamily, superColumnName, limit);
                 return;
             }
         }
@@ -433,7 +462,7 @@ public class CliClient extends CliUserHe
         }
 
         AbstractType validator = getValidatorForValue(cfDef, 
TBaseHelper.byteBufferToByteArray(columnName));
-        
+
         // Perform a get()
         ColumnPath path = new ColumnPath(columnFamily);
         if(superColumnName != null) path.setSuper_column(superColumnName);
@@ -451,14 +480,12 @@ public class CliClient extends CliUserHe
 
         byte[] columnValue = column.getValue();       
         String valueAsString;
-        
+
         // we have ^(CONVERT_TO_TYPE <type>) inside of GET statement
         // which means that we should try to represent byte[] value according
         // to specified type
-        if (statement.getChildCount() == 2)
+        if (typeTree != null)
         {
-            // getting ^(CONVERT_TO_TYPE <type>) tree 
-            Tree typeTree = statement.getChild(1).getChild(0);
             // .getText() will give us <type>
             String typeName = CliUtils.unescapeSQLString(typeTree.getText());
             // building AbstractType from <type>


Reply via email to