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/04/02 21:26:42 UTC

svn commit: r1463707 - in /jena/Experimental/jena-jdbc: jena-jdbc-core/ jena-jdbc-core/src/main/java/org/apache/jena/jdbc/results/ jena-jdbc-core/src/test/java/org/apache/jena/jdbc/ jena-jdbc-core/src/test/java/org/apache/jena/jdbc/results/ jena-jdbc-c...

Author: rvesse
Date: Tue Apr  2 19:26:41 2013
New Revision: 1463707

URL: http://svn.apache.org/r1463707
Log:
Start fleshing out tests for result sets around marshalling nodes into Java primitive types

Added:
    jena/Experimental/jena-jdbc/jena-jdbc-core/src/test/java/org/apache/jena/jdbc/results/
    jena/Experimental/jena-jdbc/jena-jdbc-core/src/test/java/org/apache/jena/jdbc/results/AbstractResultSetTests.java
    jena/Experimental/jena-jdbc/jena-jdbc-core/src/test/java/org/apache/jena/jdbc/utils/
    jena/Experimental/jena-jdbc/jena-jdbc-core/src/test/java/org/apache/jena/jdbc/utils/TestUtils.java
    jena/Experimental/jena-jdbc/jena-jdbc-driver-mem/src/test/java/org/apache/jena/jdbc/mem/AbstractDatasetResultSetTests.java
    jena/Experimental/jena-jdbc/jena-jdbc-driver-mem/src/test/java/org/apache/jena/jdbc/mem/DebugDatasetConnection.java
    jena/Experimental/jena-jdbc/jena-jdbc-driver-mem/src/test/java/org/apache/jena/jdbc/mem/TestResultSets.java
    jena/Experimental/jena-jdbc/jena-jdbc-driver-tdb/src/test/java/org/apache/jena/jdbc/tdb/TestTdbDiskResultSets.java
    jena/Experimental/jena-jdbc/jena-jdbc-driver-tdb/src/test/java/org/apache/jena/jdbc/tdb/TestTdbMemResultSets.java
Modified:
    jena/Experimental/jena-jdbc/jena-jdbc-core/   (props changed)
    jena/Experimental/jena-jdbc/jena-jdbc-core/src/main/java/org/apache/jena/jdbc/results/JenaJdbcResultSet.java
    jena/Experimental/jena-jdbc/jena-jdbc-core/src/test/java/org/apache/jena/jdbc/AbstractJenaJdbcDriverTests.java
    jena/Experimental/jena-jdbc/jena-jdbc-driver-mem/pom.xml
    jena/Experimental/jena-jdbc/jena-jdbc-driver-mem/src/main/java/org/apache/jena/jdbc/mem/DatasetConnection.java
    jena/Experimental/jena-jdbc/jena-jdbc-driver-tdb/pom.xml
    jena/Experimental/jena-jdbc/jena-jdbc-driver-tdb/src/test/java/org/apache/jena/jdbc/tdb/TestJenaJdbcTdbDiskConnection.java
    jena/Experimental/jena-jdbc/jena-jdbc-driver-tdb/src/test/java/org/apache/jena/jdbc/tdb/TestJenaJdbcTdbMemConnection.java

Propchange: jena/Experimental/jena-jdbc/jena-jdbc-core/
------------------------------------------------------------------------------
--- svn:ignore (original)
+++ svn:ignore Tue Apr  2 19:26:41 2013
@@ -2,3 +2,4 @@
 .settings
 .project
 target
+test-output

Modified: jena/Experimental/jena-jdbc/jena-jdbc-core/src/main/java/org/apache/jena/jdbc/results/JenaJdbcResultSet.java
URL: http://svn.apache.org/viewvc/jena/Experimental/jena-jdbc/jena-jdbc-core/src/main/java/org/apache/jena/jdbc/results/JenaJdbcResultSet.java?rev=1463707&r1=1463706&r2=1463707&view=diff
==============================================================================
--- jena/Experimental/jena-jdbc/jena-jdbc-core/src/main/java/org/apache/jena/jdbc/results/JenaJdbcResultSet.java (original)
+++ jena/Experimental/jena-jdbc/jena-jdbc-core/src/main/java/org/apache/jena/jdbc/results/JenaJdbcResultSet.java Tue Apr  2 19:26:41 2013
@@ -155,7 +155,7 @@ public abstract class JenaJdbcResultSet 
             this.setNull(true);
             return null;
         } else {
-            // Try to marshal into a boolean
+            // Try to marshal into a decimal
             this.setNull(false);
             return JenaJdbcNodeUtils.toDecimal(n);
         }

Modified: jena/Experimental/jena-jdbc/jena-jdbc-core/src/test/java/org/apache/jena/jdbc/AbstractJenaJdbcDriverTests.java
URL: http://svn.apache.org/viewvc/jena/Experimental/jena-jdbc/jena-jdbc-core/src/test/java/org/apache/jena/jdbc/AbstractJenaJdbcDriverTests.java?rev=1463707&r1=1463706&r2=1463707&view=diff
==============================================================================
--- jena/Experimental/jena-jdbc/jena-jdbc-core/src/test/java/org/apache/jena/jdbc/AbstractJenaJdbcDriverTests.java (original)
+++ jena/Experimental/jena-jdbc/jena-jdbc-core/src/test/java/org/apache/jena/jdbc/AbstractJenaJdbcDriverTests.java Tue Apr  2 19:26:41 2013
@@ -33,8 +33,6 @@ import com.hp.hpl.jena.query.ARQ;
 /**
  * Abstract tests for {@link JenaJdbcDriver} implementations
  * 
- * @author rvesse
- * 
  */
 public abstract class AbstractJenaJdbcDriverTests {
 

Added: 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=1463707&view=auto
==============================================================================
--- jena/Experimental/jena-jdbc/jena-jdbc-core/src/test/java/org/apache/jena/jdbc/results/AbstractResultSetTests.java (added)
+++ jena/Experimental/jena-jdbc/jena-jdbc-core/src/test/java/org/apache/jena/jdbc/results/AbstractResultSetTests.java Tue Apr  2 19:26:41 2013
@@ -0,0 +1,355 @@
+/**
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.apache.jena.jdbc.results;
+
+import java.math.BigDecimal;
+import java.sql.ResultSet;
+import java.sql.SQLException;
+import java.util.Calendar;
+
+import org.apache.jena.jdbc.results.metadata.AskResultsMetadata;
+import org.apache.log4j.BasicConfigurator;
+import org.apache.log4j.Level;
+import org.apache.log4j.Logger;
+import org.junit.Assert;
+import org.junit.BeforeClass;
+import org.junit.Test;
+
+import com.hp.hpl.jena.datatypes.TypeMapper;
+import com.hp.hpl.jena.query.ARQ;
+import com.hp.hpl.jena.query.Dataset;
+import com.hp.hpl.jena.query.DatasetFactory;
+import com.hp.hpl.jena.rdf.model.Literal;
+import com.hp.hpl.jena.rdf.model.Model;
+import com.hp.hpl.jena.rdf.model.ModelFactory;
+import com.hp.hpl.jena.rdf.model.Property;
+import com.hp.hpl.jena.rdf.model.Resource;
+import com.hp.hpl.jena.rdf.model.Statement;
+import com.hp.hpl.jena.vocabulary.XSD;
+
+/**
+ * Abstract tests for Jena JDBC {@link ResultSet} implementations
+ *
+ */
+public abstract class AbstractResultSetTests {
+
+    static {
+        // Init Log4j
+        BasicConfigurator.resetConfiguration();
+        BasicConfigurator.configure();
+        Logger.getRootLogger().setLevel(Level.INFO);
+
+        // Init ARQ
+        ARQ.init();
+    }
+    
+    private static Dataset empty, ds;
+    
+    /**
+     * Sets up the datasets used for the tests
+     */
+    @BeforeClass
+    public static void globalSetup() {
+        // Empty dataset
+        if (empty == null) {
+            empty = DatasetFactory.createMem();
+        }
+        
+        // Build a dataset that has one of every type we expect to
+        // commonly see
+        if (ds == null) {
+            ds = DatasetFactory.createMem();
+            
+            // Create model and our RDF terms
+            Model m = ModelFactory.createDefaultModel();
+            Resource subjUri = m.createResource("http://example/subject");
+            Resource subjBlank = m.createResource();
+            Property predUri = m.createProperty("http://example/predicate");
+            Resource objUri = m.createResource("http://example/object");
+            Resource objBlank = m.createResource();
+            Literal objSimpleLiteral = m.createLiteral("simple");
+            Literal objLangLiteral = m.createLiteral("simple", "en");
+            Literal objBoolean = m.createTypedLiteral(true);
+            Literal objByte = m.createTypedLiteral((byte)123);
+            Literal objDate = m.createTypedLiteral(Calendar.getInstance());
+            Literal objChar = m.createTypedLiteral('a');
+            Literal objDecimal = m.createTypedLiteral(new BigDecimal(123.4));
+            Literal objDouble = m.createTypedLiteral(123.4d);
+            Literal objFloat = m.createTypedLiteral(123.4f);
+            Literal objInteger = m.createTypedLiteral(1234);
+            Literal objLong = m.createTypedLiteral(1234l);
+            Literal objString = m.createTypedLiteral("typed");
+            Literal objCustom = m.createTypedLiteral("custom", TypeMapper.getInstance().getSafeTypeByName("http://example/customType"));
+            
+            m.add(new Statement[] {
+                    // Simple triples with URIs and Blank Nodes only
+                    m.createStatement(subjUri, predUri, objUri),
+                    m.createStatement(subjUri, predUri, objBlank),
+                    m.createStatement(subjBlank, predUri, objUri),
+                    m.createStatement(subjBlank, predUri, objBlank),
+                    // Simple triples with simple literals as objects
+                    m.createStatement(subjUri, predUri, objSimpleLiteral),
+                    m.createStatement(subjUri, predUri, objLangLiteral),
+                    // Triples with typed literals as objects
+                    m.createStatement(subjUri, predUri, objBoolean),
+                    m.createStatement(subjUri, predUri, objByte),
+                    m.createStatement(subjUri, predUri, objDate),
+                    m.createStatement(subjUri, predUri, objChar),
+                    m.createStatement(subjUri, predUri, objDecimal),
+                    m.createStatement(subjUri, predUri, objDouble),
+                    m.createStatement(subjUri, predUri, objFloat),
+                    m.createStatement(subjUri, predUri, objInteger),
+                    m.createStatement(subjUri, predUri, objLong),
+                    m.createStatement(subjUri, predUri, objString),
+                    m.createStatement(subjUri, predUri, objCustom)
+            });
+            ds.setDefaultModel(m);
+        }
+    }
+
+    protected abstract ResultSet createAskResult(Dataset ds, String query) throws SQLException;
+    
+    protected abstract ResultSet createSelectResults(Dataset ds, String query) throws SQLException;
+    
+    protected ResultSet createSelectResults(Model m, String query) throws SQLException {
+        Dataset ds = DatasetFactory.createMem();
+        ds.setDefaultModel(m);
+        return createSelectResults(ds, query);
+    }
+    
+    protected abstract ResultSet createConstructResults(Dataset ds, String query) throws SQLException;
+    
+    protected ResultSet createConstructResults(Model m, String query) throws SQLException {
+        Dataset ds = DatasetFactory.createMem();
+        ds.setDefaultModel(m);
+        return createConstructResults(ds, query);
+    }
+    
+    protected abstract ResultSet createDescribeResults(Dataset ds, String query) throws SQLException;
+    
+    protected ResultSet createDescribeResults(Model m, String query) throws SQLException {
+        Dataset ds = DatasetFactory.createMem();
+        ds.setDefaultModel(m);
+        return createDescribeResults(ds, query);
+    }
+    
+    /**
+     * Test ASK results with a true result
+     * @throws SQLException
+     */
+    @Test
+    public void test_results_ask_true() throws SQLException {
+        ResultSet rset = this.createAskResult(AbstractResultSetTests.empty, "ASK { }");
+        Assert.assertFalse(rset.isClosed());
+        Assert.assertTrue(rset.isBeforeFirst());
+        
+        // Try to move to the result row
+        Assert.assertTrue(rset.next());
+        
+        // Check the boolean return value
+        Assert.assertTrue(rset.getBoolean(AskResultsMetadata.COLUMN_LABEL_ASK));
+        
+        // Check no further rows
+        Assert.assertFalse(rset.next());
+        Assert.assertTrue(rset.isAfterLast());
+        
+        // Close and clean up
+        rset.close();
+        Assert.assertTrue(rset.isClosed());
+    }
+    
+    /**
+     * Test ASK results with a false result
+     * @throws SQLException
+     */
+    @Test
+    public void test_results_ask_false() throws SQLException {
+        ResultSet rset = this.createAskResult(AbstractResultSetTests.empty, "ASK { FILTER(false) }");
+        Assert.assertFalse(rset.isClosed());
+        Assert.assertTrue(rset.isBeforeFirst());
+        
+        // Try to move to the result row
+        Assert.assertTrue(rset.next());
+        
+        // Check the boolean return value
+        Assert.assertFalse(rset.getBoolean(AskResultsMetadata.COLUMN_LABEL_ASK));
+        
+        // Check no further rows
+        Assert.assertFalse(rset.next());
+        Assert.assertTrue(rset.isAfterLast());
+        
+        // Close and clean up
+        rset.close();
+        Assert.assertTrue(rset.isClosed());
+    }
+    
+    /**
+     * Tests that SELECT result values can be marshalled to strings OK
+     * @throws SQLException
+     */
+    @Test
+    public void test_results_select_strings() throws SQLException {
+        ResultSet rset = this.createSelectResults(ds, "SELECT (STR(?o) AS ?str) { ?s ?p ?o . FILTER(!ISBLANK(?o)) }");
+        Assert.assertFalse(rset.isClosed());
+        Assert.assertTrue(rset.isBeforeFirst());
+        
+        // Check all rows allow us to marshal strings OK
+        while (rset.next()) {
+            Assert.assertNotNull(rset.getString("str"));
+            Assert.assertFalse(rset.wasNull());
+        }
+        
+        Assert.assertTrue(rset.isAfterLast());
+        rset.close();
+        Assert.assertTrue(rset.isClosed());
+    }
+    
+    /**
+     * Tests that SELECT result values can be marshalled to numerics OK
+     * @throws SQLException
+     */
+    @Test
+    public void test_results_select_numerics() throws SQLException {
+        ResultSet rset = this.createSelectResults(ds, "SELECT ?o { ?s ?p ?o . FILTER(ISNUMERIC(?o)) }");
+        Assert.assertFalse(rset.isClosed());
+        Assert.assertTrue(rset.isBeforeFirst());
+        
+        // Check all rows allow us to marshal strings OK
+        while (rset.next()) {
+            Assert.assertNotNull(rset.getString("o"));
+            // Use decimal since all numeric types should be promotable to decimal
+            Assert.assertNotEquals(0, rset.getBigDecimal("o"));
+            Assert.assertFalse(rset.wasNull());
+        }
+        
+        Assert.assertTrue(rset.isAfterLast());
+        rset.close();
+        Assert.assertTrue(rset.isClosed());
+    }
+    
+    /**
+     * Tests that SELECT result values can be marshalled to integers OK
+     * @throws SQLException
+     */
+    @Test
+    public void test_results_select_integers() throws SQLException {
+        ResultSet rset = this.createSelectResults(ds, "SELECT ?o { ?s ?p ?o . FILTER(DATATYPE(?o) = <" + XSD.integer.toString() + ">) }");
+        Assert.assertFalse(rset.isClosed());
+        Assert.assertTrue(rset.isBeforeFirst());
+        
+        // Check all rows allow us to marshal strings OK
+        while (rset.next()) {
+            Assert.assertNotNull(rset.getString("o"));
+            Assert.assertNotEquals(0, rset.getInt("o"));
+            Assert.assertFalse(rset.wasNull());
+        }
+        
+        Assert.assertTrue(rset.isAfterLast());
+        rset.close();
+        Assert.assertTrue(rset.isClosed());
+    }
+    
+    /**
+     * Tests that SELECT result values can be marshalled to bytes OK
+     * @throws SQLException
+     */
+    @Test
+    public void test_results_select_bytes() throws SQLException {
+        ResultSet rset = this.createSelectResults(ds, "SELECT ?o { ?s ?p ?o . FILTER(DATATYPE(?o) = <" + XSD.xbyte.toString() + ">) }");
+        Assert.assertFalse(rset.isClosed());
+        Assert.assertTrue(rset.isBeforeFirst());
+        
+        // Check all rows allow us to marshal strings OK
+        while (rset.next()) {
+            Assert.assertNotNull(rset.getString("o"));
+            Assert.assertNotEquals(0, rset.getByte("o"));
+            Assert.assertFalse(rset.wasNull());
+        }
+        
+        Assert.assertTrue(rset.isAfterLast());
+        rset.close();
+        Assert.assertTrue(rset.isClosed());
+    }
+    
+    /**
+     * Tests that SELECT result values can be marshalled to bytes OK
+     * @throws SQLException
+     */
+    @Test
+    public void test_results_select_floats() throws SQLException {
+        ResultSet rset = this.createSelectResults(ds, "SELECT ?o { ?s ?p ?o . FILTER(DATATYPE(?o) = <" + XSD.xfloat.toString() + ">) }");
+        Assert.assertFalse(rset.isClosed());
+        Assert.assertTrue(rset.isBeforeFirst());
+        
+        // Check all rows allow us to marshal strings OK
+        while (rset.next()) {
+            Assert.assertNotNull(rset.getString("o"));
+            Assert.assertNotEquals(0, rset.getFloat("o"));
+            Assert.assertFalse(rset.wasNull());
+        }
+        
+        Assert.assertTrue(rset.isAfterLast());
+        rset.close();
+        Assert.assertTrue(rset.isClosed());
+    }
+    
+    /**
+     * Tests that SELECT result values can be marshalled to bytes OK
+     * @throws SQLException
+     */
+    @Test
+    public void test_results_select_doubles() throws SQLException {
+        ResultSet rset = this.createSelectResults(ds, "SELECT ?o { ?s ?p ?o . FILTER(DATATYPE(?o) = <" + XSD.xdouble.toString() + ">) }");
+        Assert.assertFalse(rset.isClosed());
+        Assert.assertTrue(rset.isBeforeFirst());
+        
+        // Check all rows allow us to marshal strings OK
+        while (rset.next()) {
+            Assert.assertNotNull(rset.getString("o"));
+            Assert.assertNotEquals(0, rset.getDouble("o"));
+            Assert.assertFalse(rset.wasNull());
+        }
+        
+        Assert.assertTrue(rset.isAfterLast());
+        rset.close();
+        Assert.assertTrue(rset.isClosed());
+    }
+    
+    /**
+     * Tests that SELECT result values can be marshalled to bytes OK
+     * @throws SQLException
+     */
+    @Test
+    public void test_results_select_longs() throws SQLException {
+        ResultSet rset = this.createSelectResults(ds, "SELECT ?o { ?s ?p ?o . FILTER(DATATYPE(?o) = <" + XSD.xbyte.toString() + ">) }");
+        Assert.assertFalse(rset.isClosed());
+        Assert.assertTrue(rset.isBeforeFirst());
+        
+        // Check all rows allow us to marshal strings OK
+        while (rset.next()) {
+            Assert.assertNotNull(rset.getString("o"));
+            Assert.assertNotEquals(0, rset.getLong("o"));
+            Assert.assertFalse(rset.wasNull());
+        }
+        
+        Assert.assertTrue(rset.isAfterLast());
+        rset.close();
+        Assert.assertTrue(rset.isClosed());
+    }
+}

Added: jena/Experimental/jena-jdbc/jena-jdbc-core/src/test/java/org/apache/jena/jdbc/utils/TestUtils.java
URL: http://svn.apache.org/viewvc/jena/Experimental/jena-jdbc/jena-jdbc-core/src/test/java/org/apache/jena/jdbc/utils/TestUtils.java?rev=1463707&view=auto
==============================================================================
--- jena/Experimental/jena-jdbc/jena-jdbc-core/src/test/java/org/apache/jena/jdbc/utils/TestUtils.java (added)
+++ jena/Experimental/jena-jdbc/jena-jdbc-core/src/test/java/org/apache/jena/jdbc/utils/TestUtils.java Tue Apr  2 19:26:41 2013
@@ -0,0 +1,84 @@
+/*
+ * Copyright 2013 YarcData LLC All Rights Reserved.
+ */
+
+package org.apache.jena.jdbc.utils;
+
+import java.util.Iterator;
+
+import com.hp.hpl.jena.graph.Node;
+import com.hp.hpl.jena.query.Dataset;
+import com.hp.hpl.jena.query.DatasetAccessor;
+import com.hp.hpl.jena.query.DatasetAccessorFactory;
+import com.hp.hpl.jena.sparql.core.DatasetGraph;
+import com.hp.hpl.jena.sparql.core.Quad;
+
+/**
+ * Test utility methods
+ */
+public class TestUtils {
+
+    /**
+     * Copies one dataset to another
+     * 
+     * @param source
+     *            Source Dataset
+     * @param target
+     *            Target Dataset
+     */
+    public static void copyDataset(Dataset source, Dataset target) {
+        TestUtils.copyDataset(source, target, false);
+    }
+
+    /**
+     * Copies one dataset to another
+     * 
+     * @param source
+     *            Source Dataset
+     * @param target
+     *            Target Dataset
+     * @param copyDefaultAsQuads
+     *            Whether the default graph should be copied as quads (required
+     *            for TDB datasets)
+     * 
+     */
+    public static void copyDataset(Dataset source, Dataset target, boolean copyDefaultAsQuads) {
+        // Copy the default graph
+        if (copyDefaultAsQuads) {
+            Iterator<Quad> quads = source.asDatasetGraph().find(Quad.defaultGraphIRI, Node.ANY, Node.ANY, Node.ANY);
+            DatasetGraph targetDSG = target.asDatasetGraph();
+            while (quads.hasNext()) {
+                targetDSG.add(quads.next());
+            }
+        } else {
+            target.setDefaultModel(source.getDefaultModel());
+        }
+
+        // Copy named graphs
+        Iterator<String> uris = source.listNames();
+        while (uris.hasNext()) {
+            String uri = uris.next();
+            target.addNamedModel(uri, source.getNamedModel(uri));
+        }
+    }
+
+    /**
+     * Copies a dataset to a remote service that provides SPARQL 1.1 Graph Store
+     * protocol support
+     * 
+     * @param source
+     *            Source Dataset
+     * @param service
+     *            Remote Graph Store protocol service
+     */
+    public static void copyToRemoteDataset(Dataset source, String service) {
+        DatasetAccessor target = DatasetAccessorFactory.createHTTP(service);
+        target.putModel(source.getDefaultModel());
+        Iterator<String> uris = source.listNames();
+        while (uris.hasNext()) {
+            String uri = uris.next();
+            target.putModel(uri, source.getNamedModel(uri));
+        }
+    }
+
+}

Modified: jena/Experimental/jena-jdbc/jena-jdbc-driver-mem/pom.xml
URL: http://svn.apache.org/viewvc/jena/Experimental/jena-jdbc/jena-jdbc-driver-mem/pom.xml?rev=1463707&r1=1463706&r2=1463707&view=diff
==============================================================================
--- jena/Experimental/jena-jdbc/jena-jdbc-driver-mem/pom.xml (original)
+++ jena/Experimental/jena-jdbc/jena-jdbc-driver-mem/pom.xml Tue Apr  2 19:26:41 2013
@@ -13,14 +13,14 @@
 	<properties>
 		<plugin.license.headerPath>${project.parent.basedir}</plugin.license.headerPath>
 	</properties>
-	
+
 	<dependencies>
 		<dependency>
 			<groupId>org.apache.jena</groupId>
 			<artifactId>jena-jdbc-core</artifactId>
 			<version>0.0.1-SNAPSHOT</version>
 		</dependency>
-		
+
 		<!-- Test Dependencies -->
 		<dependency>
 			<groupId>org.apache.jena</groupId>
@@ -36,4 +36,21 @@
 			<scope>test</scope>
 		</dependency>
 	</dependencies>
+
+	<build>
+		<plugins>
+			<plugin>
+				<groupId>org.apache.maven.plugins</groupId>
+				<artifactId>maven-jar-plugin</artifactId>
+				<version>2.4</version>
+				<executions>
+					<execution>
+						<goals>
+							<goal>test-jar</goal>
+						</goals>
+					</execution>
+				</executions>
+			</plugin>
+		</plugins>
+	</build>
 </project>
\ No newline at end of file

Modified: jena/Experimental/jena-jdbc/jena-jdbc-driver-mem/src/main/java/org/apache/jena/jdbc/mem/DatasetConnection.java
URL: http://svn.apache.org/viewvc/jena/Experimental/jena-jdbc/jena-jdbc-driver-mem/src/main/java/org/apache/jena/jdbc/mem/DatasetConnection.java?rev=1463707&r1=1463706&r2=1463707&view=diff
==============================================================================
--- jena/Experimental/jena-jdbc/jena-jdbc-driver-mem/src/main/java/org/apache/jena/jdbc/mem/DatasetConnection.java (original)
+++ jena/Experimental/jena-jdbc/jena-jdbc-driver-mem/src/main/java/org/apache/jena/jdbc/mem/DatasetConnection.java Tue Apr  2 19:26:41 2013
@@ -36,7 +36,7 @@ import com.hp.hpl.jena.query.Dataset;
  */
 public class DatasetConnection extends JenaJdbcConnection {
     
-    private Dataset ds;
+    protected Dataset ds;
     private List<DatasetStatement> statements = new ArrayList<DatasetStatement>();
     private boolean readonly = false;
     

Added: jena/Experimental/jena-jdbc/jena-jdbc-driver-mem/src/test/java/org/apache/jena/jdbc/mem/AbstractDatasetResultSetTests.java
URL: http://svn.apache.org/viewvc/jena/Experimental/jena-jdbc/jena-jdbc-driver-mem/src/test/java/org/apache/jena/jdbc/mem/AbstractDatasetResultSetTests.java?rev=1463707&view=auto
==============================================================================
--- jena/Experimental/jena-jdbc/jena-jdbc-driver-mem/src/test/java/org/apache/jena/jdbc/mem/AbstractDatasetResultSetTests.java (added)
+++ jena/Experimental/jena-jdbc/jena-jdbc-driver-mem/src/test/java/org/apache/jena/jdbc/mem/AbstractDatasetResultSetTests.java Tue Apr  2 19:26:41 2013
@@ -0,0 +1,81 @@
+/*
+ * Copyright 2013 YarcData LLC All Rights Reserved.
+ */
+
+package org.apache.jena.jdbc.mem;
+
+import java.sql.ResultSet;
+import java.sql.SQLException;
+import java.sql.Statement;
+
+import org.apache.jena.jdbc.results.AbstractResultSetTests;
+import org.junit.AfterClass;
+import org.junit.BeforeClass;
+
+import com.hp.hpl.jena.query.Dataset;
+
+/**
+ * Abstract
+ *
+ */
+public abstract class AbstractDatasetResultSetTests extends AbstractResultSetTests {
+
+    private static DebugDatasetConnection connection;
+
+    /**
+     * Sets up the tests by creating a fake connection for test use
+     * @throws SQLException
+     */
+    @BeforeClass
+    public static void setup() throws SQLException {
+        connection = new DebugDatasetConnection();
+    }
+
+    /**
+     * Cleans up after the tests by closing the fake connection
+     * @throws SQLException
+     */
+    @AfterClass
+    public static void teardown() throws SQLException {
+        connection.close();
+    }
+
+    /**
+     * Method which derived test classes must implement which they can use to turn
+     * the provided dataset (which will be a memory dataset) into the actual
+     * dataset they want to test against
+     * @param ds Dataset
+     * @return Prepared Dataset
+     * @throws SQLException Thrown if the dataset cannot be prepared
+     */
+    protected abstract Dataset prepareDataset(Dataset ds) throws SQLException;
+    
+    @Override
+    protected final ResultSet createAskResult(Dataset ds, String query) throws SQLException {
+        connection.setJenaDataset(this.prepareDataset(ds));
+        Statement stmt = connection.createStatement();
+        return stmt.executeQuery(query);
+    }
+
+    @Override
+    protected final ResultSet createSelectResults(Dataset ds, String query) throws SQLException {
+        connection.setJenaDataset(this.prepareDataset(ds));
+        Statement stmt = connection.createStatement();
+        return stmt.executeQuery(query);
+    }
+
+    @Override
+    protected final ResultSet createConstructResults(Dataset ds, String query) throws SQLException {
+        connection.setJenaDataset(this.prepareDataset(ds));
+        Statement stmt = connection.createStatement();
+        return stmt.executeQuery(query);
+    }
+
+    @Override
+    protected final ResultSet createDescribeResults(Dataset ds, String query) throws SQLException {
+        connection.setJenaDataset(this.prepareDataset(ds));
+        Statement stmt = connection.createStatement();
+        return stmt.executeQuery(query);
+    }
+
+}
\ No newline at end of file

Added: jena/Experimental/jena-jdbc/jena-jdbc-driver-mem/src/test/java/org/apache/jena/jdbc/mem/DebugDatasetConnection.java
URL: http://svn.apache.org/viewvc/jena/Experimental/jena-jdbc/jena-jdbc-driver-mem/src/test/java/org/apache/jena/jdbc/mem/DebugDatasetConnection.java?rev=1463707&view=auto
==============================================================================
--- jena/Experimental/jena-jdbc/jena-jdbc-driver-mem/src/test/java/org/apache/jena/jdbc/mem/DebugDatasetConnection.java (added)
+++ jena/Experimental/jena-jdbc/jena-jdbc-driver-mem/src/test/java/org/apache/jena/jdbc/mem/DebugDatasetConnection.java Tue Apr  2 19:26:41 2013
@@ -0,0 +1,44 @@
+/*
+ * Copyright 2013 YarcData LLC All Rights Reserved.
+ */ 
+
+package org.apache.jena.jdbc.mem;
+
+import java.sql.SQLException;
+
+import org.apache.jena.jdbc.JenaJdbcConnection;
+
+import com.hp.hpl.jena.query.Dataset;
+import com.hp.hpl.jena.query.DatasetFactory;
+
+/**
+ * A test only variant of {@link DatasetConnection} which allows the dataset to be changed on the fly
+ *
+ */
+public class DebugDatasetConnection extends DatasetConnection {
+    
+    /**
+     * Creates a debug dataset connection
+     * @throws SQLException
+     */
+    public DebugDatasetConnection() throws SQLException {
+        this(DatasetFactory.createMem());
+    }
+
+    /**
+     * Creates a debug dataset connection
+     * @param ds Dataset
+     * @throws SQLException
+     */
+    public DebugDatasetConnection(Dataset ds) throws SQLException {
+        super(ds, JenaJdbcConnection.DEFAULT_HOLDABILITY);
+    }
+
+    /**
+     * Sets the Jena dataset in use
+     * @param ds Dataset
+     */
+    public void setJenaDataset(Dataset ds) {
+        this.ds = ds;
+    }
+}

Added: jena/Experimental/jena-jdbc/jena-jdbc-driver-mem/src/test/java/org/apache/jena/jdbc/mem/TestResultSets.java
URL: http://svn.apache.org/viewvc/jena/Experimental/jena-jdbc/jena-jdbc-driver-mem/src/test/java/org/apache/jena/jdbc/mem/TestResultSets.java?rev=1463707&view=auto
==============================================================================
--- jena/Experimental/jena-jdbc/jena-jdbc-driver-mem/src/test/java/org/apache/jena/jdbc/mem/TestResultSets.java (added)
+++ jena/Experimental/jena-jdbc/jena-jdbc-driver-mem/src/test/java/org/apache/jena/jdbc/mem/TestResultSets.java Tue Apr  2 19:26:41 2013
@@ -0,0 +1,22 @@
+/*
+ * Copyright 2013 YarcData LLC All Rights Reserved.
+ */ 
+
+package org.apache.jena.jdbc.mem;
+
+import java.sql.SQLException;
+
+import com.hp.hpl.jena.query.Dataset;
+
+/**
+ * Tests for result sets run against an in-memory dataset {@link DebugDatasetConnection}
+ *
+ */
+public class TestResultSets extends AbstractDatasetResultSetTests {
+
+    @Override
+    protected Dataset prepareDataset(Dataset ds) throws SQLException {
+        // No preparation necessary
+        return ds;
+    }
+}

Modified: jena/Experimental/jena-jdbc/jena-jdbc-driver-tdb/pom.xml
URL: http://svn.apache.org/viewvc/jena/Experimental/jena-jdbc/jena-jdbc-driver-tdb/pom.xml?rev=1463707&r1=1463706&r2=1463707&view=diff
==============================================================================
--- jena/Experimental/jena-jdbc/jena-jdbc-driver-tdb/pom.xml (original)
+++ jena/Experimental/jena-jdbc/jena-jdbc-driver-tdb/pom.xml Tue Apr  2 19:26:41 2013
@@ -45,5 +45,12 @@
 			<classifier>tests</classifier>
 			<scope>test</scope>
 		</dependency>
+		<dependency>
+			<groupId>org.apache.jena</groupId>
+			<artifactId>jena-jdbc-driver-mem</artifactId>
+			<version>0.0.1-SNAPSHOT</version>
+			<classifier>tests</classifier>
+			<scope>test</scope>
+		</dependency>
 	</dependencies>
 </project>
\ No newline at end of file

Modified: jena/Experimental/jena-jdbc/jena-jdbc-driver-tdb/src/test/java/org/apache/jena/jdbc/tdb/TestJenaJdbcTdbDiskConnection.java
URL: http://svn.apache.org/viewvc/jena/Experimental/jena-jdbc/jena-jdbc-driver-tdb/src/test/java/org/apache/jena/jdbc/tdb/TestJenaJdbcTdbDiskConnection.java?rev=1463707&r1=1463706&r2=1463707&view=diff
==============================================================================
--- jena/Experimental/jena-jdbc/jena-jdbc-driver-tdb/src/test/java/org/apache/jena/jdbc/tdb/TestJenaJdbcTdbDiskConnection.java (original)
+++ jena/Experimental/jena-jdbc/jena-jdbc-driver-tdb/src/test/java/org/apache/jena/jdbc/tdb/TestJenaJdbcTdbDiskConnection.java Tue Apr  2 19:26:41 2013
@@ -19,16 +19,14 @@
 package org.apache.jena.jdbc.tdb;
 
 import java.sql.SQLException;
-import java.util.Iterator;
-
 import org.apache.jena.jdbc.AbstractJenaJdbcConnectionTests;
 import org.apache.jena.jdbc.JenaJdbcConnection;
 import org.apache.jena.jdbc.mem.DatasetConnection;
+import org.apache.jena.jdbc.utils.TestUtils;
 import org.junit.Rule;
 import org.junit.rules.TemporaryFolder;
 
 import com.hp.hpl.jena.query.Dataset;
-import com.hp.hpl.jena.sparql.core.Quad;
 import com.hp.hpl.jena.tdb.TDBFactory;
 
 /**
@@ -51,11 +49,7 @@ public class TestJenaJdbcTdbDiskConnecti
     @Override
     protected JenaJdbcConnection getConnection(Dataset ds) throws SQLException {
         Dataset tdb = TDBFactory.createDataset(tempDir.getRoot().getAbsolutePath());
-        
-        Iterator<Quad> qs = ds.asDatasetGraph().find();
-        while (qs.hasNext()) {
-            tdb.asDatasetGraph().add(qs.next());
-        }
+        TestUtils.copyDataset(ds, tdb, true);
         return new DatasetConnection(tdb, JenaJdbcConnection.DEFAULT_HOLDABILITY);
     }
 

Modified: jena/Experimental/jena-jdbc/jena-jdbc-driver-tdb/src/test/java/org/apache/jena/jdbc/tdb/TestJenaJdbcTdbMemConnection.java
URL: http://svn.apache.org/viewvc/jena/Experimental/jena-jdbc/jena-jdbc-driver-tdb/src/test/java/org/apache/jena/jdbc/tdb/TestJenaJdbcTdbMemConnection.java?rev=1463707&r1=1463706&r2=1463707&view=diff
==============================================================================
--- jena/Experimental/jena-jdbc/jena-jdbc-driver-tdb/src/test/java/org/apache/jena/jdbc/tdb/TestJenaJdbcTdbMemConnection.java (original)
+++ jena/Experimental/jena-jdbc/jena-jdbc-driver-tdb/src/test/java/org/apache/jena/jdbc/tdb/TestJenaJdbcTdbMemConnection.java Tue Apr  2 19:26:41 2013
@@ -19,14 +19,12 @@
 package org.apache.jena.jdbc.tdb;
 
 import java.sql.SQLException;
-import java.util.Iterator;
-
 import org.apache.jena.jdbc.AbstractJenaJdbcConnectionTests;
 import org.apache.jena.jdbc.JenaJdbcConnection;
 import org.apache.jena.jdbc.mem.DatasetConnection;
+import org.apache.jena.jdbc.utils.TestUtils;
 
 import com.hp.hpl.jena.query.Dataset;
-import com.hp.hpl.jena.sparql.core.Quad;
 import com.hp.hpl.jena.tdb.TDBFactory;
 
 /**
@@ -43,11 +41,7 @@ public class TestJenaJdbcTdbMemConnectio
     @Override
     protected JenaJdbcConnection getConnection(Dataset ds) throws SQLException {
         Dataset tdb = TDBFactory.createDataset();
-        
-        Iterator<Quad> qs = ds.asDatasetGraph().find();
-        while (qs.hasNext()) {
-            tdb.asDatasetGraph().add(qs.next());
-        }
+        TestUtils.copyDataset(ds, tdb, true);
         return new DatasetConnection(tdb, JenaJdbcConnection.DEFAULT_HOLDABILITY);
     }
 

Added: jena/Experimental/jena-jdbc/jena-jdbc-driver-tdb/src/test/java/org/apache/jena/jdbc/tdb/TestTdbDiskResultSets.java
URL: http://svn.apache.org/viewvc/jena/Experimental/jena-jdbc/jena-jdbc-driver-tdb/src/test/java/org/apache/jena/jdbc/tdb/TestTdbDiskResultSets.java?rev=1463707&view=auto
==============================================================================
--- jena/Experimental/jena-jdbc/jena-jdbc-driver-tdb/src/test/java/org/apache/jena/jdbc/tdb/TestTdbDiskResultSets.java (added)
+++ jena/Experimental/jena-jdbc/jena-jdbc-driver-tdb/src/test/java/org/apache/jena/jdbc/tdb/TestTdbDiskResultSets.java Tue Apr  2 19:26:41 2013
@@ -0,0 +1,36 @@
+/*
+ * Copyright 2013 YarcData LLC All Rights Reserved.
+ */ 
+
+package org.apache.jena.jdbc.tdb;
+
+import java.sql.SQLException;
+
+import org.apache.jena.jdbc.mem.AbstractDatasetResultSetTests;
+import org.apache.jena.jdbc.utils.TestUtils;
+import org.junit.Rule;
+import org.junit.rules.TemporaryFolder;
+
+import com.hp.hpl.jena.query.Dataset;
+import com.hp.hpl.jena.tdb.TDBFactory;
+
+/**
+ * Tests for result sets using a disk backed TDB dataset
+ *
+ */
+public class TestTdbDiskResultSets extends AbstractDatasetResultSetTests {
+
+    /**
+     * Temporary directory rule used to guarantee a unique temporary folder for each test method
+     */
+    @Rule
+    public TemporaryFolder tempDir = new TemporaryFolder();
+
+    
+    @Override
+    protected Dataset prepareDataset(Dataset ds) throws SQLException {
+        Dataset tdb = TDBFactory.createDataset(tempDir.getRoot().getAbsolutePath());
+        TestUtils.copyDataset(ds, tdb, true);
+        return tdb;
+    }
+}

Added: jena/Experimental/jena-jdbc/jena-jdbc-driver-tdb/src/test/java/org/apache/jena/jdbc/tdb/TestTdbMemResultSets.java
URL: http://svn.apache.org/viewvc/jena/Experimental/jena-jdbc/jena-jdbc-driver-tdb/src/test/java/org/apache/jena/jdbc/tdb/TestTdbMemResultSets.java?rev=1463707&view=auto
==============================================================================
--- jena/Experimental/jena-jdbc/jena-jdbc-driver-tdb/src/test/java/org/apache/jena/jdbc/tdb/TestTdbMemResultSets.java (added)
+++ jena/Experimental/jena-jdbc/jena-jdbc-driver-tdb/src/test/java/org/apache/jena/jdbc/tdb/TestTdbMemResultSets.java Tue Apr  2 19:26:41 2013
@@ -0,0 +1,27 @@
+/*
+ * Copyright 2013 YarcData LLC All Rights Reserved.
+ */ 
+
+package org.apache.jena.jdbc.tdb;
+
+import java.sql.SQLException;
+
+import org.apache.jena.jdbc.mem.AbstractDatasetResultSetTests;
+import org.apache.jena.jdbc.utils.TestUtils;
+
+import com.hp.hpl.jena.query.Dataset;
+import com.hp.hpl.jena.tdb.TDBFactory;
+
+/**
+ * Tests for result sets using a in-memory TDB dataset
+ *
+ */
+public class TestTdbMemResultSets extends AbstractDatasetResultSetTests {
+
+    @Override
+    protected Dataset prepareDataset(Dataset ds) throws SQLException {
+        Dataset tdb = TDBFactory.createDataset();
+        TestUtils.copyDataset(ds, tdb, true);
+        return tdb;
+    }
+}