Author: jbellis
Date: Mon May  9 04:04:55 2011
New Revision: 1100877

URL: http://svn.apache.org/viewvc?rev=1100877&view=rev
Log:
refactor to make getX(int) and getX(String) methods take a common code path.  
getString no longer [incorrectly] attempts to make sense out of non-String 
types.  getInt will work on both BigInteger and Long columns.  getBigInteger 
added to CassandraRS (otherwise you have to use getObject).
patch by jbellis

Modified:
    
cassandra/branches/cassandra-0.8/drivers/java/src/org/apache/cassandra/cql/jdbc/AbstractResultSet.java
    
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/test/org/apache/cassandra/cql/JdbcDriverTest.java

Modified: 
cassandra/branches/cassandra-0.8/drivers/java/src/org/apache/cassandra/cql/jdbc/AbstractResultSet.java
URL: 
http://svn.apache.org/viewvc/cassandra/branches/cassandra-0.8/drivers/java/src/org/apache/cassandra/cql/jdbc/AbstractResultSet.java?rev=1100877&r1=1100876&r2=1100877&view=diff
==============================================================================
--- 
cassandra/branches/cassandra-0.8/drivers/java/src/org/apache/cassandra/cql/jdbc/AbstractResultSet.java
 (original)
+++ 
cassandra/branches/cassandra-0.8/drivers/java/src/org/apache/cassandra/cql/jdbc/AbstractResultSet.java
 Mon May  9 04:04:55 2011
@@ -299,6 +299,26 @@ class AbstractResultSet
         throw new UnsupportedOperationException("method not supported");
     }
 
+    public BigDecimal getBigDecimal(int arg0) throws SQLException
+    {
+        throw new UnsupportedOperationException("method not supported");
+    }
+
+    public BigDecimal getBigDecimal(String arg0) throws SQLException
+    {
+        throw new UnsupportedOperationException("method not supported");
+    }
+
+    public BigDecimal getBigDecimal(int arg0, int arg1) throws SQLException
+    {
+        throw new UnsupportedOperationException("method not supported");
+    }
+
+    public BigDecimal getBigDecimal(String arg0, int arg1) throws SQLException
+    {
+        throw new UnsupportedOperationException("method not supported");
+    }
+
     //
     // all the update methods are unsupported, requires a separate statement 
in Cassandra
     //

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=1100877&r1=1100876&r2=1100877&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
 Mon May  9 04:04:55 2011
@@ -53,8 +53,7 @@ public class CResultSet extends Abstract
     private List<TypedColumn> values = new ArrayList<TypedColumn>();
     
     /** The value map. */
-    // TODO should map <String, TypedColumn> so we can throw appropriate 
exception if user asks for non-existant column name
-    private Map<String, Object> valueMap = new WeakHashMap<String, Object>();
+    private Map<String, TypedColumn> valueMap = new HashMap<String, 
TypedColumn>();
     
     private final CResultSetMetaData meta;
     
@@ -86,7 +85,7 @@ public class CResultSet extends Abstract
 
     public TypedColumn getColumn(String name)
     {
-        throw new UnsupportedOperationException("need to convert valueMap to 
TypedColumn first");
+        return valueMap.get(name);
     }
 
     public void close() throws SQLException
@@ -95,41 +94,21 @@ public class CResultSet extends Abstract
         values = null;
     }
 
-    public BigDecimal getBigDecimal(int arg0) throws SQLException
+    private byte[] getBytes(TypedColumn column)
     {
-        throw new UnsupportedOperationException("method not supported");
-    }
-
-    public BigDecimal getBigDecimal(String arg0) throws SQLException
-    {
-        throw new UnsupportedOperationException("method not supported");
-    }
-
-    public BigDecimal getBigDecimal(int arg0, int arg1) throws SQLException
-    {
-        throw new UnsupportedOperationException("method not supported");
-    }
-
-    public BigDecimal getBigDecimal(String arg0, int arg1) throws SQLException
-    {
-        throw new UnsupportedOperationException("method not supported");
+        ByteBuffer value = (ByteBuffer) column.getValue();
+        wasNull = value == null;
+        return value == null ? null : ByteBufferUtil.clone(value).array();
     }
 
     public byte[] getBytes(int index) throws SQLException
     {
-        TypedColumn column = values.get(index - 1);
-        assert column != null;
-        Object value = column.getValue();
-        wasNull = value == null;
-        return value == null ? null : ByteBufferUtil.clone((ByteBuffer) 
value).array();
+        return getBytes(values.get(index - 1));
     }
 
     public byte[] getBytes(String name) throws SQLException
     {
-        String nameAsString = decoder.colNameAsString(keyspace, columnFamily, 
name);
-        Object value = valueMap.get(nameAsString);
-        wasNull = value == null;
-        return value == null ? null : ByteBufferUtil.clone((ByteBuffer) 
value).array();
+        return getBytes(valueMap.get(decoder.colNameAsString(keyspace, 
columnFamily, name)));
     }
 
     public Date getDate(int arg0) throws SQLException
@@ -182,39 +161,59 @@ public class CResultSet extends Abstract
         throw new UnsupportedOperationException("method not supported");
     }
 
-    public int getInt(int index) throws SQLException
+    private BigInteger getBigInteger(TypedColumn column)
     {
-        TypedColumn column = values.get(index - 1);
-        assert column != null;
-        Object value = column.getValue();
+        BigInteger value = (BigInteger) column.getValue();
         wasNull = value == null;
-        return value == null ? 0 : ((BigInteger) value).intValue();
+        return value;
+    }
+
+    public BigInteger getBigInteger(int i)
+    {
+        return getBigInteger(values.get(i - 1));
+    }
+
+    public BigInteger getBigInteger(String name)
+    {
+        return getBigInteger(valueMap.get(decoder.colNameAsString(keyspace, 
columnFamily, name)));
+    }
+
+    private int getInt(TypedColumn column) throws SQLException
+    {
+        // bit of a hack, this, but asking for getInt seems so common that we 
should accomodate it
+        if (column.getValue() instanceof BigInteger)
+            return getBigInteger(column).intValue();
+        else if (column.getValue() instanceof Long)
+            return getLong(column).intValue();
+        else
+            throw new SQLException("Non-integer value " + column.getValue());
+    }
+
+    public int getInt(int index) throws SQLException
+    {
+        return getInt(values.get(index - 1));
     }
 
     public int getInt(String name) throws SQLException
     {
-        String nameAsString = decoder.colNameAsString(keyspace, columnFamily, 
name);
-        Object value = valueMap.get(nameAsString);
+        return getInt(valueMap.get(decoder.colNameAsString(keyspace, 
columnFamily, name)));
+    }
+
+    private Long getLong(TypedColumn column)
+    {
+        Long value = (Long) column.getValue();
         wasNull = value == null;
-        return value == null ? 0 : ((BigInteger) value).intValue();
+        return value == null ? 0 : value;
     }
 
     public long getLong(int index) throws SQLException
     {
-        assert values != null;
-        TypedColumn column = values.get(index - 1);
-        assert column != null;
-        Object value = column.getValue();
-        wasNull = value == null;
-        return value == null ? 0 : (Long) value;
+        return getLong(values.get(index - 1));
     }
 
     public long getLong(String name) throws SQLException
     {
-        String nameAsString = decoder.colNameAsString(keyspace, columnFamily, 
name);
-        Object value = valueMap.get(nameAsString);
-        wasNull = value == null;
-        return value == null ? 0 : (Long) value;
+        return getLong(valueMap.get(decoder.colNameAsString(keyspace, 
columnFamily, name)));
     }
 
     public ResultSetMetaData getMetaData() throws SQLException
@@ -222,21 +221,21 @@ public class CResultSet extends Abstract
         return meta;
     }
 
-    public Object getObject(int index) throws SQLException
+    private Object getObject(TypedColumn column)
     {
-        TypedColumn column = values.get(index - 1);
-        assert column != null;
         Object value = column.getValue();
         wasNull = value == null;
         return value;
     }
 
+    public Object getObject(int index) throws SQLException
+    {
+        return getObject(values.get(index - 1));
+    }
+
     public Object getObject(String name) throws SQLException
     {
-        String nameAsString = decoder.colNameAsString(keyspace, columnFamily, 
name);
-        Object value = valueMap.get(nameAsString);
-        wasNull = value == null;
-        return value;
+        return getObject(valueMap.get(decoder.colNameAsString(keyspace, 
columnFamily, name)));
     }
 
     public Object getObject(int arg0, Map<String, Class<?>> arg1) throws 
SQLException
@@ -254,21 +253,21 @@ public class CResultSet extends Abstract
         return rowNumber;
     }
 
-    public String getString(int index) throws SQLException
+    private String getString(TypedColumn column)
     {
-        TypedColumn column = values.get(index - 1);
-        assert column != null;
-        Object value = column.getValue();
+        String value = (String) column.getValue();
         wasNull = value == null;
-        return value == null ? null : ColumnDecoder.colValueAsString(value);
+        return value == null ? null : value;
+    }
+
+    public String getString(int index) throws SQLException
+    {
+        return getString(values.get(index - 1));
     }
 
     public String getString(String name) throws SQLException
     {
-        String nameAsString = this.decoder.colNameAsString(this.keyspace, 
this.columnFamily, name);
-        Object value = valueMap.get(nameAsString);
-        wasNull = value == null;
-        return value == null ? null : ColumnDecoder.colValueAsString(value);
+        return 
getString(valueMap.get(this.decoder.colNameAsString(this.keyspace, 
this.columnFamily, name)));
     }
 
     public Time getTime(int arg0) throws SQLException
@@ -376,7 +375,7 @@ public class CResultSet extends Abstract
 
                 TypedColumn c = decoder.makeCol(keyspace, columnFamily, col);
                 values.add(c);
-                valueMap.put(decoder.colNameAsString(keyspace, columnFamily, 
col.getName()), c.getValue());
+                valueMap.put(decoder.colNameAsString(keyspace, columnFamily, 
col.getName()), c);
             }
             return !(values.isEmpty() && valueMap.isEmpty());
         } 

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=1100877&r1=1100876&r2=1100877&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
 Mon May  9 04:04:55 2011
@@ -1,5 +1,6 @@
 package org.apache.cassandra.cql.jdbc;
 
+import java.math.BigInteger;
 import java.sql.ResultSet;
 
 public interface CassandraResultSet extends ResultSet
@@ -9,13 +10,13 @@ public interface CassandraResultSet exte
      */
     public byte[] getKey();
 
-    /**
-     * @return the raw column data for the given column offset
-     */
-    public TypedColumn getColumn(int i);
+    /** @return a BigInteger value for the given column offset*/
+    public BigInteger getBigInteger(int i);
+    /** @return a BigInteger value for the given column name */
+    public BigInteger getBigInteger(String name);
 
-    /**
-     * @return the raw column data for the given column name
-     */
+    /** @return the raw column data for the given column offset */
+    public TypedColumn getColumn(int i);
+    /** @return the raw column data for the given column name */
     public TypedColumn getColumn(String name);
 }

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=1100877&r1=1100876&r2=1100877&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
 Mon May  9 04:04:55 2011
@@ -108,11 +108,10 @@ public class JdbcDriverTest extends Embe
     {
         String key = FBUtilities.bytesToHex("Integer".getBytes());
         Statement stmt = con.createStatement();
-        stmt.executeUpdate("update JdbcInteger set 1=1111, 2=2222, 
42='fortytwofortytwo' where key='" + key + "'");
+        stmt.executeUpdate("update JdbcInteger set 1=36893488147419103232, 
42='fortytwofortytwo' where key='" + key + "'");
         ResultSet rs = stmt.executeQuery("select 1, 2, 42 from JdbcInteger 
where key='" + key + "'");
         assert rs.next();
-        assert rs.getInt("1") == 1111;
-        assert rs.getInt("2") == 2222;
+        assert rs.getObject("1").equals(new 
BigInteger("36893488147419103232"));
         assert rs.getString("42").equals("fortytwofortytwo") : 
rs.getString("42");
         
         ResultSetMetaData md = rs.getMetaData();
@@ -133,34 +132,7 @@ public class JdbcDriverTest extends Embe
         expectedMetaData(md, 2, String.class.getName(), "JdbcUtf8", 
"Keyspace1", "b", Types.VARCHAR, UTF8Type.class.getSimpleName(), false, true);
         expectedMetaData(md, 3, BigInteger.class.getName(), "JdbcUtf8", 
"Keyspace1", "fortytwo", Types.BIGINT, IntegerType.class.getSimpleName(), true, 
false);
     }
-    
-    @Test 
-    public void testIntegerMetadata() throws SQLException
-    {
-        String key = FBUtilities.bytesToHex("Integer".getBytes());
-        Statement stmt = con.createStatement();
-        stmt.executeUpdate("UPDATE JdbcInteger SET 1=111, 2=222 WHERE KEY = '" 
+ key + "'");
-        ResultSet rs = stmt.executeQuery("SELECT 1, 2 from JdbcInteger WHERE 
KEY = '" + key + "'");
-        assert rs.next();
-        assert rs.getInt("1") == 111;
-        assert rs.getInt("2") == 222;
         
-        ResultSetMetaData md = rs.getMetaData();
-        assert md.getColumnCount() == 2;
-        expectedMetaData(md, 1, BigInteger.class.getName(), "JdbcInteger", 
"Keyspace1", "1", Types.BIGINT, IntegerType.class.getSimpleName(), true, false);
-        expectedMetaData(md, 2, BigInteger.class.getName(), "JdbcInteger", 
"Keyspace1", "2", Types.BIGINT, IntegerType.class.getSimpleName(), true, false);
-
-        for (int i = 0; i < md.getColumnCount(); i++)
-            expectedMetaData(md,
-                             i + 1,
-                             BigInteger.class.getName(),
-                             Types.BIGINT,
-                             IntegerType.class.getSimpleName(),
-                             true,
-                             false);
-        
-    }
-    
     @Test
     public void testLongMetadata() throws SQLException
     {
@@ -257,15 +229,9 @@ public class JdbcDriverTest extends Embe
         expectedMetaData(md, 2, ByteBuffer.class.getName(), "JdbcBytes", 
"Keyspace1", FBUtilities.bytesToHex(b), Types.BINARY, 
BytesType.class.getSimpleName(), false, false);
         
         for (int i = 0; i < md.getColumnCount(); i++)
-            expectedMetaData(md,
-                             i + 1,
-                             ByteBuffer.class.getName(),
-                             Types.BINARY,
-                             BytesType.class.getSimpleName(),
-                             false,
-                             false);
+            expectedMetaData(md, i + 1, ByteBuffer.class.getName(), 
Types.BINARY, BytesType.class.getSimpleName(), false, false);
     }
-    
+
     @Test
     public void testWithStatementBytesType() throws SQLException
     {
@@ -446,9 +412,7 @@ public class JdbcDriverTest extends Embe
             actualRows++;
             for (int c = 0; c < cols.length; c++)
             {
-                // getString and getObject should always work.
-                assert rs.getString(cols[c]) != null;
-                assert rs.getString(c+1) != null;
+                // getObject should always work.
                 assert rs.getObject(cols[c]) != null;
                 assert rs.getObject(c+1) != null;
                 


Reply via email to