You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@cassandra.apache.org by ee...@apache.org on 2011/03/30 01:41:44 UTC

svn commit: r1086806 - in /cassandra/trunk: src/java/org/apache/cassandra/cql/ test/system/

Author: eevans
Date: Tue Mar 29 23:41:43 2011
New Revision: 1086806

URL: http://svn.apache.org/viewvc?rev=1086806&view=rev
Log:
CQL support for typed keys

Patch by eevans

Modified:
    cassandra/trunk/src/java/org/apache/cassandra/cql/Cql.g
    cassandra/trunk/src/java/org/apache/cassandra/cql/CreateColumnFamilyStatement.java
    cassandra/trunk/src/java/org/apache/cassandra/cql/QueryProcessor.java
    cassandra/trunk/src/java/org/apache/cassandra/cql/UpdateStatement.java
    cassandra/trunk/test/system/test_cql.py

Modified: cassandra/trunk/src/java/org/apache/cassandra/cql/Cql.g
URL: http://svn.apache.org/viewvc/cassandra/trunk/src/java/org/apache/cassandra/cql/Cql.g?rev=1086806&r1=1086805&r2=1086806&view=diff
==============================================================================
--- cassandra/trunk/src/java/org/apache/cassandra/cql/Cql.g (original)
+++ cassandra/trunk/src/java/org/apache/cassandra/cql/Cql.g Tue Mar 29 23:41:43 2011
@@ -270,16 +270,18 @@ createKeyspaceStatement returns [CreateK
  */
 createColumnFamilyStatement returns [CreateColumnFamilyStatement expr]
     : K_CREATE K_COLUMNFAMILY name=( IDENT | STRING_LITERAL | INTEGER ) { $expr = new CreateColumnFamilyStatement($name.text); }
-      ( '('
-          col1=term v1=createCfamColumnValidator { $expr.addColumn(col1, $v1.validator); } ( ','
-          colN=term vN=createCfamColumnValidator { $expr.addColumn(colN, $vN.validator); } )*
-      ')' )?
+      ( '(' createCfamColumns[expr] ( ',' createCfamColumns[expr] )* ')' )?
       ( K_WITH prop1=IDENT '=' arg1=createCfamKeywordArgument { $expr.addProperty($prop1.text, $arg1.arg); }
           ( K_AND propN=IDENT '=' argN=createCfamKeywordArgument { $expr.addProperty($propN.text, $argN.arg); } )*
       )?
       endStmnt
     ;
 
+createCfamColumns[CreateColumnFamilyStatement expr]
+    : n=term v=createCfamColumnValidator { $expr.addColumn(n, $v.validator); }
+    | K_KEY v=createCfamColumnValidator K_PRIMARY K_KEY { $expr.setKeyType($v.validator); }
+    ;
+
 createCfamColumnValidator returns [String validator]
     : comparatorType { $validator = $comparatorType.text; }
     | STRING_LITERAL { $validator = $STRING_LITERAL.text; }
@@ -378,6 +380,7 @@ K_COLUMNFAMILY: C O L U M N F A M I L Y;
 K_INDEX:       I N D E X;
 K_ON:          O N;
 K_DROP:        D R O P;
+K_PRIMARY:     P R I M A R Y;
 
 // Case-insensitive alpha characters
 fragment A: ('a'|'A');

Modified: cassandra/trunk/src/java/org/apache/cassandra/cql/CreateColumnFamilyStatement.java
URL: http://svn.apache.org/viewvc/cassandra/trunk/src/java/org/apache/cassandra/cql/CreateColumnFamilyStatement.java?rev=1086806&r1=1086805&r2=1086806&view=diff
==============================================================================
--- cassandra/trunk/src/java/org/apache/cassandra/cql/CreateColumnFamilyStatement.java (original)
+++ cassandra/trunk/src/java/org/apache/cassandra/cql/CreateColumnFamilyStatement.java Tue Mar 29 23:41:43 2011
@@ -87,6 +87,7 @@ public class CreateColumnFamilyStatement
     private final String name;
     private final Map<Term, String> columns = new HashMap<Term, String>();
     private final Map<String, String> properties = new HashMap<String, String>();
+    private String keyValidator;
     
     public CreateColumnFamilyStatement(String name)
     {
@@ -157,6 +158,11 @@ public class CreateColumnFamilyStatement
         columns.put(term, comparator);
     }
     
+    public void setKeyType(String validator)
+    {
+        this.keyValidator = validator;
+    }
+    
     /** Map a keyword to the corresponding value */
     public void addProperty(String name, String value)
     {
@@ -180,7 +186,7 @@ public class CreateColumnFamilyStatement
             {
                 ByteBuffer columnName = col.getKey().getByteBuffer(comparator);
                 String validatorClassName = comparators.containsKey(col.getValue()) ? comparators.get(col.getValue()) : col.getValue();
-                AbstractType validator = DatabaseDescriptor.getComparator(validatorClassName);
+                AbstractType<?> validator = DatabaseDescriptor.getComparator(validatorClassName);
                 columnDefs.put(columnName, new ColumnDefinition(columnName, validator, null, null));
             }
             catch (ConfigurationException e)
@@ -212,6 +218,7 @@ public class CreateColumnFamilyStatement
             // RPC uses BytesType as the default validator/comparator but BytesType expects hex for string terms, (not convenient).
             AbstractType<?> comparator = DatabaseDescriptor.getComparator(comparators.get(getPropertyString(KW_COMPARATOR, "utf8")));
             String validator = getPropertyString(KW_DEFAULTVALIDATION, "utf8");
+            AbstractType<?> keyType = DatabaseDescriptor.getComparator(comparators.get((keyValidator != null) ? keyValidator : "utf8"));
 
             newCFMD = new CFMetaData(keyspace,
                                      name,
@@ -234,7 +241,8 @@ public class CreateColumnFamilyStatement
                    .memSize(getPropertyInt(KW_MEMTABLESIZEINMB, CFMetaData.DEFAULT_MEMTABLE_THROUGHPUT_IN_MB))
                    .memOps(getPropertyDouble(KW_MEMTABLEOPSINMILLIONS, CFMetaData.DEFAULT_MEMTABLE_OPERATIONS_IN_MILLIONS))
                    .mergeShardsChance(0.0)
-                   .columnMetadata(getColumns(comparator));
+                   .columnMetadata(getColumns(comparator))
+                   .keyValidator(keyType);
         }
         catch (ConfigurationException e)
         {

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=1086806&r1=1086805&r2=1086806&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 23:41:43 2011
@@ -51,7 +51,6 @@ import org.apache.cassandra.db.migration
 import org.apache.cassandra.db.migration.UpdateColumnFamily;
 import org.apache.cassandra.db.migration.avro.CfDef;
 import org.apache.cassandra.db.marshal.AbstractType;
-import org.apache.cassandra.db.marshal.AsciiType;
 import org.apache.cassandra.db.marshal.MarshalException;
 import org.apache.cassandra.dht.AbstractBounds;
 import org.apache.cassandra.dht.Bounds;
@@ -84,8 +83,8 @@ public class QueryProcessor
         
         assert select.getKeys().size() == 1;
         
-        ByteBuffer key = select.getKeys().get(0).getByteBuffer(AsciiType.instance);
         CFMetaData metadata = validateColumnFamily(keyspace, select.getColumnFamily(), false);
+        ByteBuffer key = select.getKeys().get(0).getByteBuffer(metadata.getKeyValidator());
         validateKey(key);
 
         // ...of a list of column names
@@ -135,8 +134,10 @@ public class QueryProcessor
     {
         List<org.apache.cassandra.db.Row> rows = null;
         
-        ByteBuffer startKey = (select.getKeyStart() != null) ? select.getKeyStart().getByteBuffer(AsciiType.instance) : (new Term()).getByteBuffer();
-        ByteBuffer finishKey = (select.getKeyFinish() != null) ? select.getKeyFinish().getByteBuffer(AsciiType.instance) : (new Term()).getByteBuffer();
+        AbstractType<?> keyType = DatabaseDescriptor.getCFMetaData(keyspace,
+                                                                   select.getColumnFamily()).getKeyValidator();
+        ByteBuffer startKey = (select.getKeyStart() != null) ? select.getKeyStart().getByteBuffer(keyType) : (new Term()).getByteBuffer();
+        ByteBuffer finishKey = (select.getKeyFinish() != null) ? select.getKeyFinish().getByteBuffer(keyType) : (new Term()).getByteBuffer();
         IPartitioner<?> p = StorageService.getPartitioner();
         AbstractBounds bounds = new Bounds(p.getToken(startKey), p.getToken(finishKey));
         
@@ -193,8 +194,9 @@ public class QueryProcessor
                                                 value));
         }
         
-        // FIXME: keys as ascii is not a Real Solution
-        ByteBuffer startKey = (!select.isKeyRange()) ? (new Term()).getByteBuffer() : select.getKeyStart().getByteBuffer(AsciiType.instance);
+        AbstractType<?> keyType = DatabaseDescriptor.getCFMetaData(keyspace,
+                                                                   select.getColumnFamily()).getKeyValidator();
+        ByteBuffer startKey = (!select.isKeyRange()) ? (new Term()).getByteBuffer() : select.getKeyStart().getByteBuffer(keyType);
         IndexClause thriftIndexClause = new IndexClause(expressions, startKey, select.getNumRecords());
         
         List<org.apache.cassandra.db.Row> rows;
@@ -235,8 +237,7 @@ public class QueryProcessor
                 cfamsSeen.add(update.getColumnFamily());
             }
             
-            // FIXME: keys as ascii is not a Real Solution
-            ByteBuffer key = update.getKey().getByteBuffer(AsciiType.instance);
+            ByteBuffer key = update.getKey().getByteBuffer(update.getKeyType(keyspace));
             validateKey(key);
             AbstractType<?> comparator = update.getComparator(keyspace);
             
@@ -594,11 +595,13 @@ public class QueryProcessor
                 clientState.hasColumnFamilyAccess(delete.getColumnFamily(), Permission.WRITE);
                 CFMetaData metadata = validateColumnFamily(keyspace, delete.getColumnFamily(), false);
                 AbstractType<?> comparator = metadata.getComparatorFor(null);
-
+                AbstractType<?> keyType = DatabaseDescriptor.getCFMetaData(keyspace,
+                                                                           delete.getColumnFamily()).getKeyValidator();
+                
                 List<RowMutation> rowMutations = new ArrayList<RowMutation>();
                 for (Term key : delete.getKeys())
                 {
-                    RowMutation rm = new RowMutation(keyspace, key.getByteBuffer(AsciiType.instance));
+                    RowMutation rm = new RowMutation(keyspace, key.getByteBuffer(keyType));
                     if (delete.getColumns().size() < 1)     // No columns, delete the row
                         rm.delete(new QueryPath(delete.getColumnFamily()), System.currentTimeMillis());
                     else    // Delete specific columns

Modified: cassandra/trunk/src/java/org/apache/cassandra/cql/UpdateStatement.java
URL: http://svn.apache.org/viewvc/cassandra/trunk/src/java/org/apache/cassandra/cql/UpdateStatement.java?rev=1086806&r1=1086805&r2=1086806&view=diff
==============================================================================
--- cassandra/trunk/src/java/org/apache/cassandra/cql/UpdateStatement.java (original)
+++ cassandra/trunk/src/java/org/apache/cassandra/cql/UpdateStatement.java Tue Mar 29 23:41:43 2011
@@ -114,12 +114,17 @@ public class UpdateStatement
                              cLevel);
     }
     
-    public AbstractType getComparator(String keyspace)
+    public AbstractType<?> getKeyType(String keyspace)
+    {
+        return DatabaseDescriptor.getCFMetaData(keyspace, columnFamily).getKeyValidator();
+    }
+    
+    public AbstractType<?> getComparator(String keyspace)
     {
         return DatabaseDescriptor.getComparator(keyspace, columnFamily);
     }
     
-    public AbstractType getValueValidator(String keyspace, ByteBuffer column)
+    public AbstractType<?> getValueValidator(String keyspace, ByteBuffer column)
     {
         return DatabaseDescriptor.getValueValidator(keyspace, columnFamily, column);
     }

Modified: cassandra/trunk/test/system/test_cql.py
URL: http://svn.apache.org/viewvc/cassandra/trunk/test/system/test_cql.py?rev=1086806&r1=1086805&r2=1086806&view=diff
==============================================================================
--- cassandra/trunk/test/system/test_cql.py (original)
+++ cassandra/trunk/test/system/test_cql.py Tue Mar 29 23:41:43 2011
@@ -40,36 +40,36 @@ def uuid1bytes_to_millis(uuidbytes):
 
 def load_sample(dbconn):
     dbconn.execute("""
-        CREATE COLUMNFAMILY StandardString1 WITH comparator = ascii
-            AND default_validation = ascii;
+        CREATE COLUMNFAMILY StandardString1 (KEY utf8 PRIMARY KEY)
+            WITH comparator = ascii AND default_validation = ascii;
     """)
     dbconn.execute("""
-        CREATE COLUMNFAMILY StandardUtf82 WITH comparator = utf8
-            AND default_validation = ascii;
+        CREATE COLUMNFAMILY StandardUtf82 (KEY utf8 PRIMARY KEY)
+            WITH comparator = utf8 AND default_validation = ascii;
     """)
     dbconn.execute("""
-        CREATE COLUMNFAMILY StandardLongA WITH comparator = long
-            AND default_validation = ascii;
+        CREATE COLUMNFAMILY StandardLongA (KEY utf8 PRIMARY KEY)
+            WITH comparator = long AND default_validation = ascii;
     """)
     dbconn.execute("""
-        CREATE COLUMNFAMILY StandardIntegerA WITH comparator = int
-            AND default_validation = ascii;
+        CREATE COLUMNFAMILY StandardIntegerA (KEY utf8 PRIMARY KEY)
+            WITH comparator = int AND default_validation = ascii;
     """)
     dbconn.execute("""
-        CREATE COLUMNFAMILY StandardUUID WITH comparator = uuid
-            AND default_validation = ascii;
+        CREATE COLUMNFAMILY StandardUUID (KEY utf8 PRIMARY KEY)
+            WITH comparator = uuid AND default_validation = ascii;
     """)
     dbconn.execute("""
-        CREATE COLUMNFAMILY StandardTimeUUID WITH comparator = timeuuid
-            AND default_validation = ascii;
+        CREATE COLUMNFAMILY StandardTimeUUID (KEY utf8 PRIMARY KEY)
+            WITH comparator = timeuuid AND default_validation = ascii;
     """)
     dbconn.execute("""
-        CREATE COLUMNFAMILY StandardTimeUUIDValues WITH comparator = ascii
-            AND default_validation = timeuuid;
+        CREATE COLUMNFAMILY StandardTimeUUIDValues (KEY utf8 PRIMARY KEY)
+            WITH comparator = ascii AND default_validation = timeuuid;
     """)
     dbconn.execute("""
-        CREATE COLUMNFAMILY IndexedA ('birthdate' long) WITH comparator = ascii
-            AND default_validation = ascii;
+        CREATE COLUMNFAMILY IndexedA (KEY utf8 PRIMARY KEY, 'birthdate' long)
+            WITH comparator = ascii AND default_validation = ascii;
     """)
     dbconn.execute("CREATE INDEX ON IndexedA ('birthdate');")