You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@cassandra.apache.org by jb...@apache.org on 2011/06/01 18:06:58 UTC

svn commit: r1130201 - in /cassandra/branches/cassandra-0.8/drivers/java: src/org/apache/cassandra/cql/jdbc/ test/org/apache/cassandra/cql/

Author: jbellis
Date: Wed Jun  1 16:06:58 2011
New Revision: 1130201

URL: http://svn.apache.org/viewvc?rev=1130201&view=rev
Log:
add key-as-TypedColumn to CassandraResultSet
patch by amorton; reviewed by jbellis for CASSANDRA-2704

Modified:
    cassandra/branches/cassandra-0.8/drivers/java/src/org/apache/cassandra/cql/jdbc/CResultSet.java
    cassandra/branches/cassandra-0.8/drivers/java/src/org/apache/cassandra/cql/jdbc/CassandraResultSet.java
    cassandra/branches/cassandra-0.8/drivers/java/src/org/apache/cassandra/cql/jdbc/ColumnDecoder.java
    cassandra/branches/cassandra-0.8/drivers/java/test/org/apache/cassandra/cql/JdbcDriverTest.java

Modified: cassandra/branches/cassandra-0.8/drivers/java/src/org/apache/cassandra/cql/jdbc/CResultSet.java
URL: http://svn.apache.org/viewvc/cassandra/branches/cassandra-0.8/drivers/java/src/org/apache/cassandra/cql/jdbc/CResultSet.java?rev=1130201&r1=1130200&r2=1130201&view=diff
==============================================================================
--- cassandra/branches/cassandra-0.8/drivers/java/src/org/apache/cassandra/cql/jdbc/CResultSet.java (original)
+++ cassandra/branches/cassandra-0.8/drivers/java/src/org/apache/cassandra/cql/jdbc/CResultSet.java Wed Jun  1 16:06:58 2011
@@ -48,6 +48,7 @@ public class CResultSet extends Abstract
     
     // the current row key when iterating through results.
     private byte[] curRowKey = null;
+    private TypedColumn typedCurRowKey = null;
     
     /** The values. */
     private List<TypedColumn> values = new ArrayList<TypedColumn>();
@@ -78,6 +79,11 @@ public class CResultSet extends Abstract
         return curRowKey;
     }
 
+    public TypedColumn getTypedKey()
+    {
+        return typedCurRowKey;
+    }
+
     public TypedColumn getColumn(int i)
     {
         return values.get(i);
@@ -379,6 +385,8 @@ public class CResultSet extends Abstract
             CqlRow row = rSetIter.next();
             rowNumber++;
             curRowKey = row.getKey();
+            typedCurRowKey = decoder.makeKeyColumn(keyspace, columnFamily, curRowKey);
+
             List<Column> cols = row.getColumns();
             for (Column col : cols)
             {

Modified: cassandra/branches/cassandra-0.8/drivers/java/src/org/apache/cassandra/cql/jdbc/CassandraResultSet.java
URL: http://svn.apache.org/viewvc/cassandra/branches/cassandra-0.8/drivers/java/src/org/apache/cassandra/cql/jdbc/CassandraResultSet.java?rev=1130201&r1=1130200&r2=1130201&view=diff
==============================================================================
--- cassandra/branches/cassandra-0.8/drivers/java/src/org/apache/cassandra/cql/jdbc/CassandraResultSet.java (original)
+++ cassandra/branches/cassandra-0.8/drivers/java/src/org/apache/cassandra/cql/jdbc/CassandraResultSet.java Wed Jun  1 16:06:58 2011
@@ -30,6 +30,7 @@ public interface CassandraResultSet exte
      * @return the current row key
      */
     public byte[] getKey();
+    public TypedColumn getTypedKey();
 
     /** @return a BigInteger value for the given column offset*/
     public BigInteger getBigInteger(int i);

Modified: cassandra/branches/cassandra-0.8/drivers/java/src/org/apache/cassandra/cql/jdbc/ColumnDecoder.java
URL: http://svn.apache.org/viewvc/cassandra/branches/cassandra-0.8/drivers/java/src/org/apache/cassandra/cql/jdbc/ColumnDecoder.java?rev=1130201&r1=1130200&r2=1130201&view=diff
==============================================================================
--- cassandra/branches/cassandra-0.8/drivers/java/src/org/apache/cassandra/cql/jdbc/ColumnDecoder.java (original)
+++ cassandra/branches/cassandra-0.8/drivers/java/src/org/apache/cassandra/cql/jdbc/ColumnDecoder.java Wed Jun  1 16:06:58 2011
@@ -128,4 +128,14 @@ class ColumnDecoder
                                getNameType(keyspace, columnFamily, column.name),
                                getValueType(keyspace, columnFamily, column.name));
     }
+
+    /** constructs a typed column to hold the key */
+    public TypedColumn makeKeyColumn(String keyspace, String columnFamily, byte[] key)
+    {
+        CFMetaData md = metadata.get(String.format("%s.%s", keyspace, columnFamily));
+        Column column = new Column(md.getKeyName()).setValue(key).setTimestamp(-1);
+        return new TypedColumn(column,
+                               getNameType(keyspace, columnFamily, md.getKeyName()),
+                               getValueType(keyspace, columnFamily, md.getKeyName()));
+    }
 }

Modified: cassandra/branches/cassandra-0.8/drivers/java/test/org/apache/cassandra/cql/JdbcDriverTest.java
URL: http://svn.apache.org/viewvc/cassandra/branches/cassandra-0.8/drivers/java/test/org/apache/cassandra/cql/JdbcDriverTest.java?rev=1130201&r1=1130200&r2=1130201&view=diff
==============================================================================
--- cassandra/branches/cassandra-0.8/drivers/java/test/org/apache/cassandra/cql/JdbcDriverTest.java (original)
+++ cassandra/branches/cassandra-0.8/drivers/java/test/org/apache/cassandra/cql/JdbcDriverTest.java Wed Jun  1 16:06:58 2011
@@ -27,7 +27,10 @@ import java.math.BigInteger;
 import java.nio.ByteBuffer;
 import java.sql.*;
 import java.util.Arrays;
+import java.util.Iterator;
+import java.util.List;
 
+import org.apache.cassandra.cql.jdbc.CassandraResultSet;
 import org.junit.AfterClass;
 import org.junit.BeforeClass;
 import org.junit.Test;
@@ -256,27 +259,31 @@ public class JdbcDriverTest extends Embe
     public void testWithStatement() throws SQLException
     {
         Statement stmt = con.createStatement();
-        
+        List<String> keys = Arrays.asList(jsmith);
         String selectQ = "SELECT 1, 2 FROM JdbcInteger WHERE KEY='" + jsmith + "'";
-        checkResultSet(stmt.executeQuery(selectQ), "Int", 1, "1", "2");
+        checkResultSet(stmt.executeQuery(selectQ), "Int", 1, keys, "1", "2");
         
         selectQ = "SELECT 3, 4 FROM JdbcInteger WHERE KEY='" + jsmith + "'";
-        checkResultSet(stmt.executeQuery(selectQ), "Int", 1, "3", "4");
+        checkResultSet(stmt.executeQuery(selectQ), "Int", 1, keys, "3", "4");
         
         selectQ = "SELECT 1, 2, 3, 4 FROM JdbcInteger WHERE KEY='" + jsmith + "'";
-        checkResultSet(stmt.executeQuery(selectQ), "Int", 1, "1", "2", "3", "4");
+        checkResultSet(stmt.executeQuery(selectQ), "Int", 1, keys, "1", "2", "3", "4");
         
         selectQ = "SELECT 1, 2 FROM JdbcLong WHERE KEY='" + jsmith + "'";
-        checkResultSet(stmt.executeQuery(selectQ), "Long", 1, "1", "2");
+        checkResultSet(stmt.executeQuery(selectQ), "Long", 1, keys, "1", "2");
         
         selectQ = "SELECT 'first', last FROM JdbcAscii WHERE KEY='" + jsmith + "'";
-        checkResultSet(stmt.executeQuery(selectQ), "String", 1, "first", "last");
+        checkResultSet(stmt.executeQuery(selectQ), "String", 1, keys, "first", "last");
         
         selectQ = String.format("SELECT '%s', '%s' FROM JdbcBytes WHERE KEY='%s'", first, last, jsmith);
-        checkResultSet(stmt.executeQuery(selectQ), "Bytes", 1, first, last);
+        checkResultSet(stmt.executeQuery(selectQ), "Bytes", 1, keys, first, last);
         
         selectQ = "SELECT 'first', last FROM JdbcUtf8 WHERE KEY='" + jsmith + "'";
-        checkResultSet(stmt.executeQuery(selectQ), "String", 1, "first", "last");
+        checkResultSet(stmt.executeQuery(selectQ), "String", 1, keys, "first", "last");
+
+        String badKey = FBUtilities.bytesToHex(String.format("jsmith-%s", System.currentTimeMillis()).getBytes());
+        selectQ = "SELECT 1, 2 FROM JdbcInteger WHERE KEY IN ('" + badKey + "', '" + jsmith + "')";
+        checkResultSet(stmt.executeQuery(selectQ), "Int", 1, keys, "1", "2");
     }
     
     @Test
@@ -293,29 +300,35 @@ public class JdbcDriverTest extends Embe
    @Test
     public void testWithPreparedStatement() throws SQLException
     {
+        List<String> keys = Arrays.asList(jsmith);
+
         String selectQ = String.format("SELECT '%s', '%s' FROM Standard1 WHERE KEY='%s'", first, last, jsmith);
-        checkResultSet(executePreparedStatementWithResults(con, selectQ), "Bytes", 1, first, last);
+        checkResultSet(executePreparedStatementWithResults(con, selectQ), "Bytes", 1, keys, first, last);
         
         selectQ = "SELECT 1, 2 FROM JdbcInteger WHERE KEY='" + jsmith + "'";
-        checkResultSet(executePreparedStatementWithResults(con, selectQ), "Int", 1, "1", "2");
+        checkResultSet(executePreparedStatementWithResults(con, selectQ), "Int", 1, keys, "1", "2");
         
         selectQ = "SELECT 3, 4 FROM JdbcInteger WHERE KEY='" + jsmith + "'";
-        checkResultSet(executePreparedStatementWithResults(con, selectQ), "Int", 1, "3", "4");
+        checkResultSet(executePreparedStatementWithResults(con, selectQ), "Int", 1, keys, "3", "4");
         
         selectQ = "SELECT 1, 2, 3, 4 FROM JdbcInteger WHERE KEY='" + jsmith + "'";
-        checkResultSet(executePreparedStatementWithResults(con, selectQ), "Int", 1, "1", "2", "3", "4");
+        checkResultSet(executePreparedStatementWithResults(con, selectQ), "Int", 1, keys, "1", "2", "3", "4");
         
         selectQ = "SELECT 1, 2 FROM JdbcLong WHERE KEY='" + jsmith + "'";
-        checkResultSet(executePreparedStatementWithResults(con, selectQ), "Long", 1, "1", "2");
+        checkResultSet(executePreparedStatementWithResults(con, selectQ), "Long", 1, keys, "1", "2");
         
         selectQ = "SELECT 'first', last FROM JdbcAscii WHERE KEY='" + jsmith + "'";
-        checkResultSet(executePreparedStatementWithResults(con, selectQ), "String", 1, "first", "last");
+        checkResultSet(executePreparedStatementWithResults(con, selectQ), "String", 1, keys, "first", "last");
         
         selectQ = String.format("SELECT '%s', '%s' FROM JdbcBytes WHERE KEY='%s'", first, last, jsmith);
-        checkResultSet(executePreparedStatementWithResults(con, selectQ), "Bytes", 1, first, last);
+        checkResultSet(executePreparedStatementWithResults(con, selectQ), "Bytes", 1, keys, first, last);
         
         selectQ = "SELECT 'first', last FROM JdbcUtf8 WHERE KEY='" + jsmith + "'";
-        checkResultSet(executePreparedStatementWithResults(con, selectQ), "String", 1, "first", "last");
+        checkResultSet(executePreparedStatementWithResults(con, selectQ), "String", 1, keys, "first", "last");
+
+        String badKey = FBUtilities.bytesToHex(String.format("jsmith-%s", System.currentTimeMillis()).getBytes());
+        selectQ = "SELECT 1, 2 FROM JdbcInteger WHERE KEY IN ('" + badKey + "', '" + jsmith + "')";
+        checkResultSet(executePreparedStatementWithResults(con, selectQ), "Int", 1, keys, "1", "2");
     }
 
     /* Method to test with Delete statement. */
@@ -412,11 +425,23 @@ public class JdbcDriverTest extends Embe
     /** iterates over a result set checking columns */
     private static void checkResultSet(ResultSet rs, String accessor, int expectedRows, String... cols) throws SQLException
     {
+        checkResultSet(rs, accessor, expectedRows, null, cols);
+    }
+
+    private static void checkResultSet(ResultSet rs, String accessor, int expectedRows, List<String> keys,  String... cols) throws SQLException
+    {
         int actualRows = 0;
         assert rs != null;
+        Iterator<String> keyIter = (keys == null) ? null : keys.iterator();
+        CassandraResultSet cassandraRs = (CassandraResultSet)rs;
         while (rs.next())
         {
             actualRows++;
+            if (keyIter != null)
+            {
+                assert cassandraRs.getTypedKey().getValueString().equals(keyIter.next());
+            }
+
             for (int c = 0; c < cols.length; c++)
             {
                 // getObject should always work.