Author: jbellis
Date: Tue Mar 29 21:26:48 2011
New Revision: 1086755

URL: http://svn.apache.org/viewvc?rev=1086755&view=rev
Log:
merge validateKey/validateKeyType, add CF validation to cql, add comparator to 
cql name validation.  fixes test NPE.
patch by jbellis

Modified:
    cassandra/trunk/src/java/org/apache/cassandra/config/CFMetaData.java
    cassandra/trunk/src/java/org/apache/cassandra/cql/QueryProcessor.java
    cassandra/trunk/src/java/org/apache/cassandra/thrift/CassandraServer.java
    cassandra/trunk/src/java/org/apache/cassandra/thrift/ThriftValidation.java

Modified: cassandra/trunk/src/java/org/apache/cassandra/config/CFMetaData.java
URL: 
http://svn.apache.org/viewvc/cassandra/trunk/src/java/org/apache/cassandra/config/CFMetaData.java?rev=1086755&r1=1086754&r2=1086755&view=diff
==============================================================================
--- cassandra/trunk/src/java/org/apache/cassandra/config/CFMetaData.java 
(original)
+++ cassandra/trunk/src/java/org/apache/cassandra/config/CFMetaData.java Tue 
Mar 29 21:26:48 2011
@@ -730,6 +730,7 @@ public final class CFMetaData
         def.memtable_throughput_in_mb = cfm.memtableThroughputInMb;
         def.memtable_operations_in_millions = cfm.memtableOperationsInMillions;
         def.merge_shards_chance = cfm.mergeShardsChance;
+        def.key_validation_class = cfm.keyValidator.getClass().getName();
         List<org.apache.cassandra.db.migration.avro.ColumnDef> column_meta = 
new 
ArrayList<org.apache.cassandra.db.migration.avro.ColumnDef>(cfm.column_metadata.size());
         for (ColumnDefinition cd : cfm.column_metadata.values())
         {

Modified: cassandra/trunk/src/java/org/apache/cassandra/cql/QueryProcessor.java
URL: 
http://svn.apache.org/viewvc/cassandra/trunk/src/java/org/apache/cassandra/cql/QueryProcessor.java?rev=1086755&r1=1086754&r2=1086755&view=diff
==============================================================================
--- cassandra/trunk/src/java/org/apache/cassandra/cql/QueryProcessor.java 
(original)
+++ cassandra/trunk/src/java/org/apache/cassandra/cql/QueryProcessor.java Tue 
Mar 29 21:26:48 2011
@@ -69,7 +69,7 @@ import com.google.common.collect.Maps;
 
 import static org.apache.cassandra.thrift.ThriftValidation.validateKey;
 import static 
org.apache.cassandra.thrift.ThriftValidation.validateColumnFamily;
-import static org.apache.cassandra.thrift.ThriftValidation.validateKeyType;
+import static org.apache.cassandra.thrift.ThriftValidation.validateColumnNames;
 
 public class QueryProcessor
 {
@@ -86,8 +86,9 @@ public class QueryProcessor
         assert select.getKeys().size() == 1;
         
         ByteBuffer key = 
select.getKeys().get(0).getByteBuffer(AsciiType.instance);
-        validateKey(key);
-        
+        CFMetaData metadata = validateColumnFamily(keyspace, 
select.getColumnFamily(), false);
+        validateKey(metadata, key);
+
         // ...of a list of column names
         if (!select.isColumnRange())
         {
@@ -95,7 +96,7 @@ public class QueryProcessor
             for (Term column : select.getColumnNames())
                 columnNames.add(column.getByteBuffer(comparator));
             
-            validateColumnNames(keyspace, select.getColumnFamily(), 
columnNames);
+            validateColumnNames(metadata, null, columnNames);
             commands.add(new SliceByNamesReadCommand(keyspace, key, queryPath, 
columnNames));
         }
         // ...a range (slice) of column names
@@ -104,7 +105,7 @@ public class QueryProcessor
             ByteBuffer start = 
select.getColumnStart().getByteBuffer(comparator);
             ByteBuffer finish = 
select.getColumnFinish().getByteBuffer(comparator);
             
-            validateSliceRange(keyspace, select.getColumnFamily(), start, 
finish, select.isColumnsReversed());
+            validateSliceRange(metadata, start, finish, 
select.isColumnsReversed());
             commands.add(new SliceFromReadCommand(keyspace,
                                                   key,
                                                   queryPath,
@@ -140,10 +141,11 @@ public class QueryProcessor
         IPartitioner<?> p = StorageService.getPartitioner();
         AbstractBounds bounds = new Bounds(p.getToken(startKey), 
p.getToken(finishKey));
         
-        AbstractType<?> comparator = select.getComparator(keyspace);
+        CFMetaData metadata = validateColumnFamily(keyspace, 
select.getColumnFamily(), false);
+        AbstractType<?> comparator = metadata.getComparatorFor(null);
         // XXX: Our use of Thrift structs internally makes me Sad. :(
         SlicePredicate thriftSlicePredicate = slicePredicateFromSelect(select, 
comparator);
-        validateSlicePredicate(keyspace, select.getColumnFamily(), 
thriftSlicePredicate);
+        validateSlicePredicate(metadata, thriftSlicePredicate);
 
         try
         {
@@ -174,10 +176,11 @@ public class QueryProcessor
     private static List<org.apache.cassandra.db.Row> getIndexedSlices(String 
keyspace, SelectStatement select)
     throws TimedOutException, UnavailableException, InvalidRequestException
     {
-        AbstractType<?> comparator = select.getComparator(keyspace);
+        CFMetaData metadata = validateColumnFamily(keyspace, 
select.getColumnFamily(), false);
+        AbstractType<?> comparator = metadata.getComparatorFor(null);
         // XXX: Our use of Thrift structs internally (still) makes me Sad. :~(
         SlicePredicate thriftSlicePredicate = slicePredicateFromSelect(select, 
comparator);
-        validateSlicePredicate(keyspace, select.getColumnFamily(), 
thriftSlicePredicate);
+        validateSlicePredicate(metadata, thriftSlicePredicate);
         
         List<IndexExpression> expressions = new ArrayList<IndexExpression>();
         for (Relation columnRelation : select.getColumnRelations())
@@ -225,7 +228,7 @@ public class QueryProcessor
 
         for (UpdateStatement update : updateStatements)
         {
-            String cfname = update.getColumnFamily();
+            CFMetaData metadata = validateColumnFamily(keyspace, 
update.getColumnFamily(), false);
             // Avoid unnecessary authorizations.
             if (!(cfamsSeen.contains(update.getColumnFamily())))
             {
@@ -235,9 +238,7 @@ public class QueryProcessor
             
             // FIXME: keys as ascii is not a Real Solution
             ByteBuffer key = update.getKey().getByteBuffer(AsciiType.instance);
-            validateKey(key);
-            validateColumnFamily(keyspace, update.getColumnFamily(), false);
-            validateKeyType(key, keyspace, cfname);
+            validateKey(metadata, key);
             AbstractType<?> comparator = update.getComparator(keyspace);
             
             RowMutation rm = new RowMutation(keyspace, key);
@@ -246,7 +247,7 @@ public class QueryProcessor
                 ByteBuffer colName = column.getKey().getByteBuffer(comparator);
                 ByteBuffer colValue = 
column.getValue().getByteBuffer(update.getValueValidator(keyspace, colName));
                 
-                validateColumn(keyspace, update.getColumnFamily(), colName, 
colValue);
+                validateColumn(metadata, colName, colValue);
                 rm.add(new QueryPath(update.getColumnFamily(), null, colName), 
colValue, System.currentTimeMillis());
             }
             
@@ -365,33 +366,19 @@ public class QueryProcessor
             }
         }
     }
-
-    private static void validateColumnNames(String keyspace, String 
columnFamily, Iterable<ByteBuffer> columns)
-    throws InvalidRequestException
-    {
-        for (ByteBuffer name : columns)
-        {
-            if (name.remaining() > IColumn.MAX_NAME_LENGTH)
-                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("zero-length column name");
-        }
-    }
     
-    private static void validateColumnName(String keyspace, String 
columnFamily, ByteBuffer column)
+    private static void validateColumnName(CFMetaData metadata, ByteBuffer 
column)
     throws InvalidRequestException
     {
-        validateColumnNames(keyspace, columnFamily, Arrays.asList(column));
+        validateColumnNames(metadata, null, Arrays.asList(column));
     }
     
-    private static void validateColumn(String keyspace, String columnFamily, 
ByteBuffer name, ByteBuffer value)
+    private static void validateColumn(CFMetaData metadata, ByteBuffer name, 
ByteBuffer value)
     throws InvalidRequestException
     {
-        validateColumnName(keyspace, columnFamily, name);
-        AbstractType<?> validator = 
DatabaseDescriptor.getValueValidator(keyspace, columnFamily, name);
-        
+        validateColumnName(metadata, name);
+        AbstractType<?> validator = metadata.getValueValidator(name);
+
         try
         {
             if (validator != null)
@@ -405,25 +392,25 @@ public class QueryProcessor
         }
     }
     
-    private static void validateSlicePredicate(String keyspace, String 
columnFamily, SlicePredicate predicate)
+    private static void validateSlicePredicate(CFMetaData metadata, 
SlicePredicate predicate)
     throws InvalidRequestException
     {
         if (predicate.slice_range != null)
-            validateSliceRange(keyspace, columnFamily, predicate.slice_range);
+            validateSliceRange(metadata, predicate.slice_range);
         else
-            validateColumnNames(keyspace, columnFamily, 
predicate.column_names);
+            validateColumnNames(metadata, null, predicate.column_names);
     }
     
-    private static void validateSliceRange(String keyspace, String 
columnFamily, SliceRange range)
+    private static void validateSliceRange(CFMetaData metadata, SliceRange 
range)
     throws InvalidRequestException
     {
-        validateSliceRange(keyspace, columnFamily, range.start, range.finish, 
range.reversed);
+        validateSliceRange(metadata, range.start, range.finish, 
range.reversed);
     }
     
-    private static void validateSliceRange(String keyspace, String 
columnFamily, ByteBuffer start, ByteBuffer finish, boolean reversed)
+    private static void validateSliceRange(CFMetaData metadata, ByteBuffer 
start, ByteBuffer finish, boolean reversed)
     throws InvalidRequestException
     {
-        AbstractType<?> comparator = ColumnFamily.getComparatorFor(keyspace, 
columnFamily, null);
+        AbstractType<?> comparator = metadata.getComparatorFor(null);
         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");
@@ -577,8 +564,9 @@ public class QueryProcessor
             case DELETE:
                 DeleteStatement delete = (DeleteStatement)statement.statement;
                 clientState.hasColumnFamilyAccess(delete.getColumnFamily(), 
Permission.WRITE);
-                AbstractType<?> comparator = 
DatabaseDescriptor.getComparator(keyspace, delete.getColumnFamily());
-                
+                CFMetaData metadata = validateColumnFamily(keyspace, 
delete.getColumnFamily(), false);
+                AbstractType<?> comparator = metadata.getComparatorFor(null);
+
                 List<RowMutation> rowMutations = new ArrayList<RowMutation>();
                 for (Term key : delete.getKeys())
                 {
@@ -590,7 +578,7 @@ public class QueryProcessor
                         for (Term column : delete.getColumns())
                         {
                             ByteBuffer columnName = 
column.getByteBuffer(comparator);
-                            validateColumnName(keyspace, 
delete.getColumnFamily(), columnName);
+                            validateColumnName(metadata, columnName);
                             rm.delete(new QueryPath(delete.getColumnFamily(), 
null, columnName),
                                       System.currentTimeMillis());
                         }

Modified: 
cassandra/trunk/src/java/org/apache/cassandra/thrift/CassandraServer.java
URL: 
http://svn.apache.org/viewvc/cassandra/trunk/src/java/org/apache/cassandra/thrift/CassandraServer.java?rev=1086755&r1=1086754&r2=1086755&view=diff
==============================================================================
--- cassandra/trunk/src/java/org/apache/cassandra/thrift/CassandraServer.java 
(original)
+++ cassandra/trunk/src/java/org/apache/cassandra/thrift/CassandraServer.java 
Tue Mar 29 21:26:48 2011
@@ -265,7 +265,7 @@ public class CassandraServer implements 
         {
             for (ByteBuffer key: keys)
             {
-                ThriftValidation.validateKey(key);
+                ThriftValidation.validateKey(metadata, key);
                 commands.add(new SliceByNamesReadCommand(keyspace, key, 
column_parent, predicate.column_names));
             }
         }
@@ -274,7 +274,7 @@ public class CassandraServer implements 
             SliceRange range = predicate.slice_range;
             for (ByteBuffer key: keys)
             {
-                ThriftValidation.validateKey(key);
+                ThriftValidation.validateKey(metadata, key);
                 commands.add(new SliceFromReadCommand(keyspace, key, 
column_parent, range.start, range.finish, range.reversed, range.count));
             }
         }
@@ -293,7 +293,7 @@ public class CassandraServer implements 
 
         QueryPath path = new QueryPath(column_path.column_family, 
column_path.column == null ? null : column_path.super_column);
         List<ByteBuffer> nameAsList = Arrays.asList(column_path.column == null 
? column_path.super_column : column_path.column);
-        ThriftValidation.validateKey(key);
+        ThriftValidation.validateKey(metadata, key);
         ReadCommand command = new SliceByNamesReadCommand(keyspace, key, path, 
nameAsList);
 
         Map<DecoratedKey, ColumnFamily> cfamilies = 
readColumnFamily(Arrays.asList(command), consistency_level);
@@ -349,11 +349,10 @@ public class CassandraServer implements 
     {
         state().hasColumnFamilyAccess(column_parent.column_family, 
Permission.WRITE);
 
-        ThriftValidation.validateKey(key);
         CFMetaData metadata = 
ThriftValidation.validateColumnFamily(state().getKeyspace(), 
column_parent.column_family, isCommutativeOp);
+        ThriftValidation.validateKey(metadata, key);
         if (isCommutativeOp)
             ThriftValidation.validateCommutativeForWrite(metadata, 
consistency_level);
-        ThriftValidation.validateKeyType(key, state().getKeyspace(), 
column_parent.column_family);
         ThriftValidation.validateColumnNames(metadata, column_parent, 
Arrays.asList(column.name));
         ThriftValidation.validateColumnData(metadata, column);
 
@@ -387,12 +386,12 @@ public class CassandraServer implements 
         {
             ByteBuffer key = mutationEntry.getKey();
 
-            ThriftValidation.validateKey(key);
             Map<String, List<Mutation>> columnFamilyToMutations = 
mutationEntry.getValue();
             for (Map.Entry<String, List<Mutation>> columnFamilyMutations : 
columnFamilyToMutations.entrySet())
             {
                 String cfName = columnFamilyMutations.getKey();
-                ThriftValidation.validateKeyType(key, state().getKeyspace(), 
cfName);
+                CFMetaData metadata = 
ThriftValidation.validateColumnFamily(state().getKeyspace(), cfName, 
isCommutativeOp);
+                ThriftValidation.validateKey(metadata, key);
 
                 // Avoid unneeded authorizations
                 if (!(cfamsSeen.contains(cfName)))
@@ -401,7 +400,6 @@ public class CassandraServer implements 
                     cfamsSeen.add(cfName);
                 }
 
-                CFMetaData metadata = 
ThriftValidation.validateColumnFamily(state().getKeyspace(), cfName, 
isCommutativeOp);
                 if (isCommutativeOp)
                     ThriftValidation.validateCommutativeForWrite(metadata, 
consistency_level);
 
@@ -431,11 +429,11 @@ public class CassandraServer implements 
     {
         state().hasColumnFamilyAccess(column_path.column_family, 
Permission.WRITE);
 
-        ThriftValidation.validateKey(key);
         CFMetaData metadata = 
ThriftValidation.validateColumnFamily(state().getKeyspace(), 
column_path.column_family, isCommutativeOp);
+        ThriftValidation.validateKey(metadata, key);
+        ThriftValidation.validateColumnPathOrParent(metadata, column_path);
         if (isCommutativeOp)
             ThriftValidation.validateCommutativeForWrite(metadata, 
consistency_level);
-        ThriftValidation.validateKeyType(key, state().getKeyspace(), 
column_path.column_family);
 
         RowMutation rm = new RowMutation(state().getKeyspace(), key);
         rm.delete(new QueryPath(column_path), timestamp); 

Modified: 
cassandra/trunk/src/java/org/apache/cassandra/thrift/ThriftValidation.java
URL: 
http://svn.apache.org/viewvc/cassandra/trunk/src/java/org/apache/cassandra/thrift/ThriftValidation.java?rev=1086755&r1=1086754&r2=1086755&view=diff
==============================================================================
--- cassandra/trunk/src/java/org/apache/cassandra/thrift/ThriftValidation.java 
(original)
+++ cassandra/trunk/src/java/org/apache/cassandra/thrift/ThriftValidation.java 
Tue Mar 29 21:26:48 2011
@@ -47,30 +47,27 @@ import org.apache.cassandra.utils.FBUtil
  */
 public class ThriftValidation
 {
-    public static void validateKey(ByteBuffer key) throws 
InvalidRequestException
+    public static void validateKey(CFMetaData metadata, ByteBuffer key) throws 
InvalidRequestException
     {
         if (key == null || key.remaining() == 0)
         {
             throw new InvalidRequestException("Key may not be empty");
         }
+
         // check that key can be handled by FBUtilities.writeShortByteArray
         if (key.remaining() > FBUtilities.MAX_UNSIGNED_SHORT)
         {
             throw new InvalidRequestException("Key length of " + 
key.remaining() +
                                               " is longer than maximum of " + 
FBUtilities.MAX_UNSIGNED_SHORT);
         }
-    }
 
-    public static void validateKeyType(ByteBuffer key, String ksname, String 
cfname) throws InvalidRequestException
-    {
         try
         {
-            AbstractType<?> keyValidator = 
DatabaseDescriptor.getCFMetaData(ksname, cfname).getKeyValidator();
-            keyValidator.validate(key);
+            metadata.getKeyValidator().validate(key);
         }
         catch (MarshalException e)
         {
-            throw new InvalidRequestException(e.toString());
+            throw new InvalidRequestException(e.getMessage());
         }
     }
 


Reply via email to