Author: jbellis
Date: Mon Dec 21 17:28:57 2009
New Revision: 892891

URL: http://svn.apache.org/viewvc?rev=892891&view=rev
Log:
return an InvalidRequestException if a SlicePredicate does not specify exactly 
one of range and column_names.  patch by jbellis; reviewed by Jonathan Hseu for 
CASSANDRA-643

Modified:
    incubator/cassandra/branches/cassandra-0.5/CHANGES.txt
    
incubator/cassandra/branches/cassandra-0.5/src/java/org/apache/cassandra/service/CassandraServer.java
    
incubator/cassandra/branches/cassandra-0.5/src/java/org/apache/cassandra/service/ThriftValidation.java

Modified: incubator/cassandra/branches/cassandra-0.5/CHANGES.txt
URL: 
http://svn.apache.org/viewvc/incubator/cassandra/branches/cassandra-0.5/CHANGES.txt?rev=892891&r1=892890&r2=892891&view=diff
==============================================================================
--- incubator/cassandra/branches/cassandra-0.5/CHANGES.txt (original)
+++ incubator/cassandra/branches/cassandra-0.5/CHANGES.txt Mon Dec 21 17:28:57 
2009
@@ -11,6 +11,8 @@
    one or more nodes is down when the movement occurs (CASSANDRA-572)
  * Include dead nodes in gossip to avoid a variety of problems
    (CASSANDRA-634)
+ * return an InvalidRequestException for mal-formed SlicePredicates
+   (CASSANDRA-643)
 
 
 0.5.0 beta 2

Modified: 
incubator/cassandra/branches/cassandra-0.5/src/java/org/apache/cassandra/service/CassandraServer.java
URL: 
http://svn.apache.org/viewvc/incubator/cassandra/branches/cassandra-0.5/src/java/org/apache/cassandra/service/CassandraServer.java?rev=892891&r1=892890&r2=892891&view=diff
==============================================================================
--- 
incubator/cassandra/branches/cassandra-0.5/src/java/org/apache/cassandra/service/CassandraServer.java
 (original)
+++ 
incubator/cassandra/branches/cassandra-0.5/src/java/org/apache/cassandra/service/CassandraServer.java
 Mon Dec 21 17:28:57 2009
@@ -221,9 +221,9 @@
     throws InvalidRequestException, UnavailableException, TimedOutException
     {
         ThriftValidation.validateColumnParent(keyspace, column_parent);
-        List<ReadCommand> commands = new ArrayList<ReadCommand>();
-        SliceRange range = predicate.slice_range;
+        ThriftValidation.validatePredicate(keyspace, column_parent, predicate);
 
+        List<ReadCommand> commands = new ArrayList<ReadCommand>();
         if (predicate.column_names != null)
         {
             for (String key: keys)
@@ -231,16 +231,15 @@
                 ThriftValidation.validateKey(key);
                 commands.add(new SliceByNamesReadCommand(keyspace, key, 
column_parent, predicate.column_names));
             }
-            ThriftValidation.validateColumns(keyspace, column_parent, 
predicate.column_names);
         }
         else
         {
+            SliceRange range = predicate.slice_range;
             for (String key: keys)
             {
                 ThriftValidation.validateKey(key);
                 commands.add(new SliceFromReadCommand(keyspace, key, 
column_parent, range.start, range.finish, range.reversed, range.count));
             }
-            ThriftValidation.validateRange(keyspace, column_parent, range);
         }
 
         return getSlice(commands, consistency_level);
@@ -556,10 +555,7 @@
     {
         if (logger.isDebugEnabled())
             logger.debug("range_slice");
-        if (predicate.getSlice_range() != null)
-            ThriftValidation.validateRange(keyspace, column_parent, 
predicate.getSlice_range());
-        else
-            ThriftValidation.validateColumns(keyspace, column_parent, 
predicate.getColumn_names());
+        ThriftValidation.validatePredicate(keyspace, column_parent, predicate);
         if (!StorageService.getPartitioner().preservesOrder())
         {
             throw new InvalidRequestException("range queries may only be 
performed against an order-preserving partitioner");

Modified: 
incubator/cassandra/branches/cassandra-0.5/src/java/org/apache/cassandra/service/ThriftValidation.java
URL: 
http://svn.apache.org/viewvc/incubator/cassandra/branches/cassandra-0.5/src/java/org/apache/cassandra/service/ThriftValidation.java?rev=892891&r1=892890&r2=892891&view=diff
==============================================================================
--- 
incubator/cassandra/branches/cassandra-0.5/src/java/org/apache/cassandra/service/ThriftValidation.java
 (original)
+++ 
incubator/cassandra/branches/cassandra-0.5/src/java/org/apache/cassandra/service/ThriftValidation.java
 Mon Dec 21 17:28:57 2009
@@ -205,4 +205,18 @@
             throw new InvalidRequestException("range finish must come after 
start in the order of traversal");
         }
     }
+
+    public static void validatePredicate(String keyspace, ColumnParent 
column_parent, SlicePredicate predicate)
+            throws InvalidRequestException
+    {
+        if (predicate.column_names == null && predicate.slice_range == null)
+            throw new InvalidRequestException("predicate column_names and 
slice_range may not both be null");
+        if (predicate.column_names != null && predicate.slice_range != null)
+            throw new InvalidRequestException("predicate column_names and 
slice_range may not both be present");
+
+        if (predicate.getSlice_range() != null)
+            validateRange(keyspace, column_parent, predicate.slice_range);
+        else
+            validateColumns(keyspace, column_parent, predicate.column_names);
+    }
 }


Reply via email to