You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@jena.apache.org by rv...@apache.org on 2013/05/30 22:03:37 UTC

svn commit: r1487992 - in /jena/Experimental/jena-jdbc: jena-jdbc-core/src/main/java/org/apache/jena/jdbc/results/ jena-jdbc-core/src/test/java/org/apache/jena/jdbc/results/ jena-jdbc-driver-mem/src/test/java/org/apache/jena/jdbc/mem/results/ jena-jdbc...

Author: rvesse
Date: Thu May 30 20:03:36 2013
New Revision: 1487992

URL: http://svn.apache.org/r1487992
Log:
Expand test coverage for use of getObject() on result sets, ensure that getObject() does return appropriately typed values

Modified:
    jena/Experimental/jena-jdbc/jena-jdbc-core/src/main/java/org/apache/jena/jdbc/results/JenaResultSet.java
    jena/Experimental/jena-jdbc/jena-jdbc-core/src/main/java/org/apache/jena/jdbc/results/MaterializedSelectResults.java
    jena/Experimental/jena-jdbc/jena-jdbc-core/src/test/java/org/apache/jena/jdbc/results/AbstractResultSetTests.java
    jena/Experimental/jena-jdbc/jena-jdbc-driver-mem/src/test/java/org/apache/jena/jdbc/mem/results/AbstractMemResultSetTests.java
    jena/Experimental/jena-jdbc/jena-jdbc-driver-remote/src/test/java/org/apache/jena/jdbc/remote/results/TestRemoteEndpointResults.java
    jena/Experimental/jena-jdbc/jena-jdbc-driver-remote/src/test/java/org/apache/jena/jdbc/remote/results/TestRemoteEndpointResultsWithGraphUris.java
    jena/Experimental/jena-jdbc/jena-jdbc-driver-tdb/src/test/java/org/apache/jena/jdbc/tdb/results/AbstractTdbResultSetTests.java

Modified: jena/Experimental/jena-jdbc/jena-jdbc-core/src/main/java/org/apache/jena/jdbc/results/JenaResultSet.java
URL: http://svn.apache.org/viewvc/jena/Experimental/jena-jdbc/jena-jdbc-core/src/main/java/org/apache/jena/jdbc/results/JenaResultSet.java?rev=1487992&r1=1487991&r2=1487992&view=diff
==============================================================================
--- jena/Experimental/jena-jdbc/jena-jdbc-core/src/main/java/org/apache/jena/jdbc/results/JenaResultSet.java (original)
+++ jena/Experimental/jena-jdbc/jena-jdbc-core/src/main/java/org/apache/jena/jdbc/results/JenaResultSet.java Thu May 30 20:03:36 2013
@@ -38,6 +38,7 @@ import java.sql.SQLXML;
 import java.sql.Statement;
 import java.sql.Time;
 import java.sql.Timestamp;
+import java.sql.Types;
 import java.util.Calendar;
 import java.util.Map;
 
@@ -353,8 +354,64 @@ public abstract class JenaResultSet impl
             this.setNull(true);
             return null;
         } else {
+            // Need to marshal to an appropriate type based on declared JDBC
+            // type of the column in order to comply with the JDBC semantics of
+            // the getObject() method
+            int jdbcType = this.getMetaData().getColumnType(this.findColumn(columnLabel));
             this.setNull(false);
-            return n;
+            
+            switch (jdbcType) {
+            case Types.ARRAY:
+            case Types.BINARY:
+            case Types.BIT:
+            case Types.BLOB:
+            case Types.CHAR:
+            case Types.CLOB:
+            case Types.DATALINK:
+            case Types.DISTINCT:
+            case Types.LONGNVARCHAR:
+            case Types.LONGVARBINARY:
+            case Types.LONGVARCHAR:
+            case Types.NCHAR:
+            case Types.NCLOB:
+            case Types.NULL:
+            case Types.NUMERIC:
+            case Types.OTHER:
+            case Types.REAL:
+            case Types.REF:
+            case Types.ROWID:
+            case Types.SQLXML:
+            case Types.STRUCT:
+            case Types.VARBINARY:
+            case Types.VARCHAR:
+                throw new SQLException("Unable to marhsal a RDF Node to the declared column type " + jdbcType);
+            case Types.BOOLEAN:
+                return JenaJdbcNodeUtils.toBoolean(n);
+            case Types.DATE:
+                return JenaJdbcNodeUtils.toDate(n);
+            case Types.DECIMAL:
+                return JenaJdbcNodeUtils.toDecimal(n);
+            case Types.DOUBLE:
+                return JenaJdbcNodeUtils.toDouble(n);
+            case Types.FLOAT:
+                return JenaJdbcNodeUtils.toFloat(n);
+            case Types.INTEGER:
+                return JenaJdbcNodeUtils.toInt(n);
+            case Types.JAVA_OBJECT:
+                return n;
+            case Types.NVARCHAR:
+                return JenaJdbcNodeUtils.toString(n);
+            case Types.SMALLINT:
+                return JenaJdbcNodeUtils.toShort(n);
+            case Types.TIME:
+                return JenaJdbcNodeUtils.toTime(n);
+            case Types.TIMESTAMP:
+                return JenaJdbcNodeUtils.toTimestamp(n);
+            case Types.TINYINT:
+                return JenaJdbcNodeUtils.toByte(n);
+            default:
+                throw new SQLException("Unable to marshal a RDF Node to the declared unknown column type " + jdbcType);
+            }
         }
     }
 

Modified: jena/Experimental/jena-jdbc/jena-jdbc-core/src/main/java/org/apache/jena/jdbc/results/MaterializedSelectResults.java
URL: http://svn.apache.org/viewvc/jena/Experimental/jena-jdbc/jena-jdbc-core/src/main/java/org/apache/jena/jdbc/results/MaterializedSelectResults.java?rev=1487992&r1=1487991&r2=1487992&view=diff
==============================================================================
--- jena/Experimental/jena-jdbc/jena-jdbc-core/src/main/java/org/apache/jena/jdbc/results/MaterializedSelectResults.java (original)
+++ jena/Experimental/jena-jdbc/jena-jdbc-core/src/main/java/org/apache/jena/jdbc/results/MaterializedSelectResults.java Thu May 30 20:03:36 2013
@@ -68,6 +68,7 @@ public class MaterializedSelectResults e
         this.innerResults = results;
         this.columns = new ArrayList<String>(this.innerResults.getResultVars());
         this.metadata = new SelectResultsMetadata(this, this.innerResults);
+        this.innerResults.reset();
     }
 
     @Override

Modified: jena/Experimental/jena-jdbc/jena-jdbc-core/src/test/java/org/apache/jena/jdbc/results/AbstractResultSetTests.java
URL: http://svn.apache.org/viewvc/jena/Experimental/jena-jdbc/jena-jdbc-core/src/test/java/org/apache/jena/jdbc/results/AbstractResultSetTests.java?rev=1487992&r1=1487991&r2=1487992&view=diff
==============================================================================
--- jena/Experimental/jena-jdbc/jena-jdbc-core/src/test/java/org/apache/jena/jdbc/results/AbstractResultSetTests.java (original)
+++ jena/Experimental/jena-jdbc/jena-jdbc-core/src/test/java/org/apache/jena/jdbc/results/AbstractResultSetTests.java Thu May 30 20:03:36 2013
@@ -19,10 +19,12 @@
 package org.apache.jena.jdbc.results;
 
 import java.math.BigDecimal;
+import java.sql.Date;
 import java.sql.ResultSet;
 import java.sql.SQLException;
 import java.util.Calendar;
 
+import org.apache.jena.jdbc.JdbcCompatibility;
 import org.apache.jena.jdbc.results.metadata.AskResultsMetadata;
 import org.apache.jena.jdbc.results.metadata.TripleResultsMetadata;
 import org.apache.log4j.BasicConfigurator;
@@ -46,7 +48,9 @@ import com.hp.hpl.jena.rdf.model.Stateme
 import com.hp.hpl.jena.vocabulary.XSD;
 
 /**
- * Abstract tests for Jena JDBC {@link ResultSet} implementations
+ * Abstract tests for Jena JDBC {@link ResultSet} implementations, these tests
+ * assume that implementations use the {@link JdbcCompatibility#HIGH}
+ * compatibility level
  * 
  */
 public abstract class AbstractResultSetTests {
@@ -196,6 +200,88 @@ public abstract class AbstractResultSetT
     }
 
     /**
+     * Tests that SELECT result values are appropriately marshalled when using
+     * getObject()
+     * 
+     * @throws SQLException
+     */
+    @Test
+    public void test_results_select_objects_01() throws SQLException {
+        ResultSet rset = this.createResults(ds, "SELECT (STR(?o) AS ?str) { ?s ?p ?o . FILTER(!ISBLANK(?o)) }");
+        Assert.assertNotNull(rset);
+        Assert.assertFalse(rset.isClosed());
+        Assert.assertTrue(rset.isBeforeFirst());
+        Assert.assertFalse(rset.isLast());
+
+        // Check all rows allow us to obtain appropriately typed values
+        while (rset.next()) {
+            Object obj = rset.getObject("str");
+            Assert.assertNotNull(obj);
+            Assert.assertFalse(rset.wasNull());
+            Assert.assertTrue(obj instanceof String);
+        }
+
+        Assert.assertTrue(rset.isAfterLast());
+        rset.close();
+        Assert.assertTrue(rset.isClosed());
+    }
+
+    /**
+     * Tests that SELECT result values are appropriately marshalled when using
+     * getObject()
+     * 
+     * @throws SQLException
+     */
+    @Test
+    public void test_results_select_objects_02() throws SQLException {
+        ResultSet rset = this.createResults(ds, "SELECT ?o { ?s ?p ?o . FILTER(ISNUMERIC(?o)) }");
+        Assert.assertNotNull(rset);
+        Assert.assertFalse(rset.isClosed());
+        Assert.assertTrue(rset.isBeforeFirst());
+        Assert.assertFalse(rset.isLast());
+
+        // Check all rows allow us to obtain appropriately typed values
+        while (rset.next()) {
+            Object obj = rset.getObject("o");
+            Assert.assertNotNull(obj);
+            Assert.assertFalse(rset.wasNull());
+            Assert.assertTrue(obj instanceof Long || obj instanceof Integer || obj instanceof Short || obj instanceof Byte
+                    || obj instanceof BigDecimal || obj instanceof Double || obj instanceof Float);
+        }
+
+        Assert.assertTrue(rset.isAfterLast());
+        rset.close();
+        Assert.assertTrue(rset.isClosed());
+    }
+    
+    /**
+     * Tests that SELECT result values are appropriately marshalled when using getObject()
+     * 
+     * @throws SQLException
+     */
+    @Test
+    public void test_results_select_objects_03() throws SQLException {
+        ResultSet rset = this.createResults(ds, "SELECT ?o { ?s ?p ?o . FILTER(DATATYPE(?o) = <" + XSD.dateTime.toString()
+                + ">) }");
+        Assert.assertNotNull(rset);
+        Assert.assertFalse(rset.isClosed());
+        Assert.assertTrue(rset.isBeforeFirst());
+        Assert.assertFalse(rset.isLast());
+
+        // Check all rows allow us to marshal strings OK
+        while (rset.next()) {
+            Object obj = rset.getObject("o");
+            Assert.assertNotNull(obj);
+            Assert.assertFalse(rset.wasNull());
+            Assert.assertTrue(obj instanceof Date);
+        }
+
+        Assert.assertTrue(rset.isAfterLast());
+        rset.close();
+        Assert.assertTrue(rset.isClosed());
+    }
+
+    /**
      * Tests that SELECT result values can be marshalled to strings OK
      * 
      * @throws SQLException

Modified: jena/Experimental/jena-jdbc/jena-jdbc-driver-mem/src/test/java/org/apache/jena/jdbc/mem/results/AbstractMemResultSetTests.java
URL: http://svn.apache.org/viewvc/jena/Experimental/jena-jdbc/jena-jdbc-driver-mem/src/test/java/org/apache/jena/jdbc/mem/results/AbstractMemResultSetTests.java?rev=1487992&r1=1487991&r2=1487992&view=diff
==============================================================================
--- jena/Experimental/jena-jdbc/jena-jdbc-driver-mem/src/test/java/org/apache/jena/jdbc/mem/results/AbstractMemResultSetTests.java (original)
+++ jena/Experimental/jena-jdbc/jena-jdbc-driver-mem/src/test/java/org/apache/jena/jdbc/mem/results/AbstractMemResultSetTests.java Thu May 30 20:03:36 2013
@@ -22,6 +22,7 @@ import java.sql.ResultSet;
 import java.sql.SQLException;
 import java.sql.Statement;
 
+import org.apache.jena.jdbc.JdbcCompatibility;
 import org.apache.jena.jdbc.mem.connections.DebugMemConnection;
 import org.apache.jena.jdbc.results.AbstractResultSetTests;
 import org.junit.AfterClass;
@@ -44,6 +45,7 @@ public abstract class AbstractMemResultS
     @BeforeClass
     public static void setup() throws SQLException {
         connection = new DebugMemConnection();
+        connection.setJdbcCompatibilityLevel(JdbcCompatibility.HIGH);
     }
 
     /**

Modified: jena/Experimental/jena-jdbc/jena-jdbc-driver-remote/src/test/java/org/apache/jena/jdbc/remote/results/TestRemoteEndpointResults.java
URL: http://svn.apache.org/viewvc/jena/Experimental/jena-jdbc/jena-jdbc-driver-remote/src/test/java/org/apache/jena/jdbc/remote/results/TestRemoteEndpointResults.java?rev=1487992&r1=1487991&r2=1487992&view=diff
==============================================================================
--- jena/Experimental/jena-jdbc/jena-jdbc-driver-remote/src/test/java/org/apache/jena/jdbc/remote/results/TestRemoteEndpointResults.java (original)
+++ jena/Experimental/jena-jdbc/jena-jdbc-driver-remote/src/test/java/org/apache/jena/jdbc/remote/results/TestRemoteEndpointResults.java Thu May 30 20:03:36 2013
@@ -52,6 +52,7 @@ public class TestRemoteEndpointResults e
         ServerTest.allocServer();
         
         connection = new RemoteEndpointConnection(BaseServerTest.serviceQuery, BaseServerTest.serviceUpdate, JenaConnection.DEFAULT_HOLDABILITY, JdbcCompatibility.DEFAULT);
+        connection.setJdbcCompatibilityLevel(JdbcCompatibility.HIGH);
     }
     
     /**

Modified: jena/Experimental/jena-jdbc/jena-jdbc-driver-remote/src/test/java/org/apache/jena/jdbc/remote/results/TestRemoteEndpointResultsWithGraphUris.java
URL: http://svn.apache.org/viewvc/jena/Experimental/jena-jdbc/jena-jdbc-driver-remote/src/test/java/org/apache/jena/jdbc/remote/results/TestRemoteEndpointResultsWithGraphUris.java?rev=1487992&r1=1487991&r2=1487992&view=diff
==============================================================================
--- jena/Experimental/jena-jdbc/jena-jdbc-driver-remote/src/test/java/org/apache/jena/jdbc/remote/results/TestRemoteEndpointResultsWithGraphUris.java (original)
+++ jena/Experimental/jena-jdbc/jena-jdbc-driver-remote/src/test/java/org/apache/jena/jdbc/remote/results/TestRemoteEndpointResultsWithGraphUris.java Thu May 30 20:03:36 2013
@@ -62,6 +62,7 @@ public class TestRemoteEndpointResultsWi
         List<String> defaultGraphUris = new ArrayList<String>();
         defaultGraphUris.add(DEFAULT_GRAPH_URI);
         connection = new RemoteEndpointConnection(BaseServerTest.serviceQuery, BaseServerTest.serviceUpdate, defaultGraphUris, null, null, null, null, null, JenaConnection.DEFAULT_HOLDABILITY, JdbcCompatibility.DEFAULT);
+        connection.setJdbcCompatibilityLevel(JdbcCompatibility.HIGH);
     }
     
     /**

Modified: jena/Experimental/jena-jdbc/jena-jdbc-driver-tdb/src/test/java/org/apache/jena/jdbc/tdb/results/AbstractTdbResultSetTests.java
URL: http://svn.apache.org/viewvc/jena/Experimental/jena-jdbc/jena-jdbc-driver-tdb/src/test/java/org/apache/jena/jdbc/tdb/results/AbstractTdbResultSetTests.java?rev=1487992&r1=1487991&r2=1487992&view=diff
==============================================================================
--- jena/Experimental/jena-jdbc/jena-jdbc-driver-tdb/src/test/java/org/apache/jena/jdbc/tdb/results/AbstractTdbResultSetTests.java (original)
+++ jena/Experimental/jena-jdbc/jena-jdbc-driver-tdb/src/test/java/org/apache/jena/jdbc/tdb/results/AbstractTdbResultSetTests.java Thu May 30 20:03:36 2013
@@ -22,6 +22,7 @@ import java.sql.ResultSet;
 import java.sql.SQLException;
 import java.sql.Statement;
 
+import org.apache.jena.jdbc.JdbcCompatibility;
 import org.apache.jena.jdbc.results.AbstractResultSetTests;
 import org.apache.jena.jdbc.tdb.connections.DebugTdbConnection;
 import org.junit.AfterClass;
@@ -46,6 +47,7 @@ public abstract class AbstractTdbResultS
     public static void setup() throws SQLException {
         connection = new DebugTdbConnection();
         connection.setHoldability(ResultSet.HOLD_CURSORS_OVER_COMMIT);
+        connection.setJdbcCompatibilityLevel(JdbcCompatibility.HIGH);
     }
 
     /**