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;