You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@jena.apache.org by an...@apache.org on 2016/02/07 18:29:43 UTC

[1/3] jena git commit: Factory for TransactionWithLock.

Repository: jena
Updated Branches:
  refs/heads/master c506a1ad4 -> 0f596380a


Factory for TransactionWithLock.

Project: http://git-wip-us.apache.org/repos/asf/jena/repo
Commit: http://git-wip-us.apache.org/repos/asf/jena/commit/9f4e2ddb
Tree: http://git-wip-us.apache.org/repos/asf/jena/tree/9f4e2ddb
Diff: http://git-wip-us.apache.org/repos/asf/jena/diff/9f4e2ddb

Branch: refs/heads/master
Commit: 9f4e2ddb05461d6feba3a824028bdaf2a8208da3
Parents: c506a1a
Author: Andy Seaborne <an...@apache.org>
Authored: Sat Feb 6 21:25:25 2016 +0000
Committer: Andy Seaborne <an...@apache.org>
Committed: Sat Feb 6 21:25:25 2016 +0000

----------------------------------------------------------------------
 .../core/DatasetGraphAltDefaultGraph.java       |  67 ----------
 .../jena/sparql/core/DatasetGraphBase.java      |  90 ++++++-------
 .../jena/sparql/core/DatasetGraphMap.java       |   2 +-
 .../jena/sparql/core/DatasetGraphMapLink.java   |   2 +-
 .../jena/sparql/core/DatasetGraphOne.java       |   2 +-
 .../jena/sparql/core/DatasetGraphWithLock.java  |   4 +-
 .../jena/sparql/core/TransactionalLock.java     | 131 +++++++++++++++++++
 .../jena/sparql/core/TransactionalMRSW.java     | 117 -----------------
 .../jena/sparql/core/TransactionalMutex.java    |   2 +-
 .../sparql/core/TransactionalNotSupported.java  |   9 +-
 .../java/org/apache/jena/shared/LockMutex.java  |  16 +--
 11 files changed, 193 insertions(+), 249 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/jena/blob/9f4e2ddb/jena-arq/src/main/java/org/apache/jena/sparql/core/DatasetGraphAltDefaultGraph.java
----------------------------------------------------------------------
diff --git a/jena-arq/src/main/java/org/apache/jena/sparql/core/DatasetGraphAltDefaultGraph.java b/jena-arq/src/main/java/org/apache/jena/sparql/core/DatasetGraphAltDefaultGraph.java
deleted file mode 100644
index e6a5f77..0000000
--- a/jena-arq/src/main/java/org/apache/jena/sparql/core/DatasetGraphAltDefaultGraph.java
+++ /dev/null
@@ -1,67 +0,0 @@
-/**
- * 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.sparql.core;
-
-import java.util.Iterator ;
-
-import org.apache.jena.graph.Graph ;
-import org.apache.jena.graph.Node ;
-
-/** DatasetGraph that switches the default graph to another graph.
- *  This different graph can be one of the underlying dataset or a completely
- *  unconnected graph.   
- *  This wrapper should used with care at scale because it masks the
- *  query execution from storage, so generic query execution happens,
- *  not, for example, TDB quad execution.     
- */
-
-public class DatasetGraphAltDefaultGraph extends DatasetGraphCollection implements TransactionalNotSupported {
-    private Graph defaultGraph ;
-    private final DatasetGraph dsg ;
-
-    public DatasetGraphAltDefaultGraph(boolean x, DatasetGraph dsg, Graph defaultGraph) {  
-        this.defaultGraph = defaultGraph ;
-        this.dsg = dsg ;
-    }
-
-    @Override
-    public Iterator<Node> listGraphNodes() {
-        return dsg.listGraphNodes() ;
-    }
-
-    @Override
-    public Graph getDefaultGraph() {
-        return defaultGraph ;
-    }
-
-    @Override
-    public Graph getGraph(Node graphNode) {
-        return dsg.getGraph(graphNode) ;
-    }
-
-    @Override
-    public void addGraph(Node graphName, Graph graph) { dsg.addGraph(graphName, graph); }
-
-    @Override
-    public void removeGraph(Node graphName)           { dsg.removeGraph(graphName); }
-    
-    
-}    
-
-

http://git-wip-us.apache.org/repos/asf/jena/blob/9f4e2ddb/jena-arq/src/main/java/org/apache/jena/sparql/core/DatasetGraphBase.java
----------------------------------------------------------------------
diff --git a/jena-arq/src/main/java/org/apache/jena/sparql/core/DatasetGraphBase.java b/jena-arq/src/main/java/org/apache/jena/sparql/core/DatasetGraphBase.java
index 1eb29c6..7cdcf56 100644
--- a/jena-arq/src/main/java/org/apache/jena/sparql/core/DatasetGraphBase.java
+++ b/jena-arq/src/main/java/org/apache/jena/sparql/core/DatasetGraphBase.java
@@ -82,86 +82,82 @@ abstract public class DatasetGraphBase implements DatasetGraph
     private static final int DeleteBufferSize = 1000 ;
     @Override
     /** Simple implementation but done without assuming iterator.remove() */
-    public void deleteAny(Node g, Node s, Node p, Node o)
-    {
-        // Delete in slices rather than assume .remove() on the iterator is implemented. 
+    public void deleteAny(Node g, Node s, Node p, Node o) {
+        // Delete in slices rather than assume .remove() on the iterator is
+        // implemented.
         // We keep executing find(g, s, p, o) until we don't get a full slice.
-        Quad[] buffer = new Quad[DeleteBufferSize] ;
-        while(true) {
-            Iterator<Quad> iter = find(g, s, p, o) ;
+        Quad[] buffer = new Quad[DeleteBufferSize];
+        while (true) {
+            Iterator<Quad> iter = find(g, s, p, o);
             // Get a slice
-            int len = 0 ;
-            for (; len < DeleteBufferSize; len++) {
+            int len = 0;
+            for ( ; len < DeleteBufferSize ; len++ ) {
                 if ( !iter.hasNext() )
-                    break ;
-                buffer[len] = iter.next() ;
+                    break;
+                buffer[len] = iter.next();
             }
             // Delete them.
-            for (int i = 0; i < len; i++) {
-                delete(buffer[i]) ;
-                buffer[i] = null ;
+            for ( int i = 0 ; i < len ; i++ ) {
+                delete(buffer[i]);
+                buffer[i] = null;
             }
             // Finished?
             if ( len < DeleteBufferSize )
-                break ;
+                break;
         }
     }
-    
+
     @Override
     public Iterator<Quad> find()
     { return find(Node.ANY, Node.ANY, Node.ANY, Node.ANY) ; }
-    
+
     @Override
-    public Iterator<Quad> find(Quad quad)
-    { 
+    public Iterator<Quad> find(Quad quad) {
         if ( quad == null )
-            return find() ;
-        return find(quad.getGraph(), quad.getSubject(), quad.getPredicate(), quad.getObject()) ; }
-    
+            return find();
+        return find(quad.getGraph(), quad.getSubject(), quad.getPredicate(), quad.getObject());
+    }
+
     @Override
     public boolean contains(Quad quad) { return contains(quad.getGraph(), quad.getSubject(), quad.getPredicate(), quad.getObject()) ; }
 
     @Override
-    public boolean contains(Node g, Node s, Node p , Node o)
-    {
-        Iterator<Quad> iter = find(g, s, p, o) ;
-        boolean b = iter.hasNext() ;
-        Iter.close(iter) ;
-        return b ;
+    public boolean contains(Node g, Node s, Node p, Node o) {
+        Iterator<Quad> iter = find(g, s, p, o);
+        boolean b = iter.hasNext();
+        Iter.close(iter);
+        return b;
     }
     
-    protected static boolean isWildcard(Node g)
-    {
-        return g == null || g == Node.ANY ;
+    protected static boolean isWildcard(Node g) {
+        return g == null || g == Node.ANY;
     }
-    
+
     @Override
-    public void clear()
-    {
-        deleteAny(Node.ANY, Node.ANY, Node.ANY, Node.ANY) ;
+    public void clear() {
+        deleteAny(Node.ANY, Node.ANY, Node.ANY, Node.ANY);
     }
 
     @Override
-    public boolean isEmpty()
-    {
-        return ! contains(Node.ANY, Node.ANY, Node.ANY, Node.ANY) ;
+    public boolean isEmpty() {
+        return !contains(Node.ANY, Node.ANY, Node.ANY, Node.ANY);
     }
 
     @Override
-    public long size() { return -1 ; } 
-    
+    public long size() {
+        return -1;
+    }
+
     @Override
-    public Lock getLock()
-    {
-        return lock ;
+    public Lock getLock() {
+        return lock;
     }
-    
+
     @Override
-    public Context getContext()
-    {
-        return context ;
+    public Context getContext() {
+        return context;
     }
-    
+
     @Override
     public void close()
     { }

http://git-wip-us.apache.org/repos/asf/jena/blob/9f4e2ddb/jena-arq/src/main/java/org/apache/jena/sparql/core/DatasetGraphMap.java
----------------------------------------------------------------------
diff --git a/jena-arq/src/main/java/org/apache/jena/sparql/core/DatasetGraphMap.java b/jena-arq/src/main/java/org/apache/jena/sparql/core/DatasetGraphMap.java
index 50b07bf..167140a 100644
--- a/jena-arq/src/main/java/org/apache/jena/sparql/core/DatasetGraphMap.java
+++ b/jena-arq/src/main/java/org/apache/jena/sparql/core/DatasetGraphMap.java
@@ -57,7 +57,7 @@ public class DatasetGraphMap extends DatasetGraphTriplesQuads
     }
     
     // ----
-    private final Transactional txn                     = new TransactionalMRSW() ;
+    private final Transactional txn                     = TransactionalLock.createMRSW() ;
     @Override public void begin(ReadWrite mode)         { txn.begin(mode) ; }
     @Override public void commit()                      { txn.commit() ; }
     @Override public void abort()                       { txn.abort() ; }

http://git-wip-us.apache.org/repos/asf/jena/blob/9f4e2ddb/jena-arq/src/main/java/org/apache/jena/sparql/core/DatasetGraphMapLink.java
----------------------------------------------------------------------
diff --git a/jena-arq/src/main/java/org/apache/jena/sparql/core/DatasetGraphMapLink.java b/jena-arq/src/main/java/org/apache/jena/sparql/core/DatasetGraphMapLink.java
index 47448e0..1cd7d33 100644
--- a/jena-arq/src/main/java/org/apache/jena/sparql/core/DatasetGraphMapLink.java
+++ b/jena-arq/src/main/java/org/apache/jena/sparql/core/DatasetGraphMapLink.java
@@ -34,7 +34,7 @@ import org.apache.jena.sparql.core.DatasetGraphFactory.GraphMaker ;
  */
 public class DatasetGraphMapLink extends DatasetGraphCollection
 {
-    private final Transactional txn = new TransactionalMRSW() ;
+    private final Transactional txn                     = TransactionalLock.createMRSW() ;
     @Override public void begin(ReadWrite mode)         { txn.begin(mode) ; }
     @Override public void commit()                      { txn.commit() ; }
     @Override public void abort()                       { txn.abort() ; }

http://git-wip-us.apache.org/repos/asf/jena/blob/9f4e2ddb/jena-arq/src/main/java/org/apache/jena/sparql/core/DatasetGraphOne.java
----------------------------------------------------------------------
diff --git a/jena-arq/src/main/java/org/apache/jena/sparql/core/DatasetGraphOne.java b/jena-arq/src/main/java/org/apache/jena/sparql/core/DatasetGraphOne.java
index f21fe04..7a420df 100644
--- a/jena-arq/src/main/java/org/apache/jena/sparql/core/DatasetGraphOne.java
+++ b/jena-arq/src/main/java/org/apache/jena/sparql/core/DatasetGraphOne.java
@@ -40,7 +40,7 @@ public class DatasetGraphOne extends DatasetGraphBaseFind {
         this.graph = graph;
     }
     
-    private final Transactional txn                     = new TransactionalMRSW() ;
+    private final Transactional txn                     = TransactionalLock.createMRSW() ;
     @Override public void begin(ReadWrite mode)         { txn.begin(mode) ; }
     @Override public void commit()                      { txn.commit() ; }
     @Override public void abort()                       { txn.abort() ; }

http://git-wip-us.apache.org/repos/asf/jena/blob/9f4e2ddb/jena-arq/src/main/java/org/apache/jena/sparql/core/DatasetGraphWithLock.java
----------------------------------------------------------------------
diff --git a/jena-arq/src/main/java/org/apache/jena/sparql/core/DatasetGraphWithLock.java b/jena-arq/src/main/java/org/apache/jena/sparql/core/DatasetGraphWithLock.java
index ffcc9a9..8bd1d91 100644
--- a/jena-arq/src/main/java/org/apache/jena/sparql/core/DatasetGraphWithLock.java
+++ b/jena-arq/src/main/java/org/apache/jena/sparql/core/DatasetGraphWithLock.java
@@ -34,7 +34,7 @@ import org.apache.jena.sparql.util.Context ;
 public class DatasetGraphWithLock extends DatasetGraphTrackActive implements Sync {
     private final ThreadLocal<Boolean> writeTxn = ThreadLocal.withInitial(()->false) ;
     private final DatasetGraph dsg ;
-    private final TransactionalMRSW transactional ;  
+    private final TransactionalLock transactional ;  
     // Associated DatasetChanges (if any, may be null)
     private final DatasetChanges dsChanges ;
     private final boolean abortSupported ;
@@ -46,7 +46,7 @@ public class DatasetGraphWithLock extends DatasetGraphTrackActive implements Syn
     public DatasetGraphWithLock(DatasetGraph dsg, boolean abortSupported) {
         this.dsg = dsg ;
         this.dsChanges = findDatasetChanges(dsg) ;
-        this.transactional = new TransactionalMRSW(dsg.getLock()) ;
+        this.transactional = TransactionalLock.create(dsg.getLock()) ;
         this.abortSupported = abortSupported ;
     }
     

http://git-wip-us.apache.org/repos/asf/jena/blob/9f4e2ddb/jena-arq/src/main/java/org/apache/jena/sparql/core/TransactionalLock.java
----------------------------------------------------------------------
diff --git a/jena-arq/src/main/java/org/apache/jena/sparql/core/TransactionalLock.java b/jena-arq/src/main/java/org/apache/jena/sparql/core/TransactionalLock.java
new file mode 100644
index 0000000..a4de693
--- /dev/null
+++ b/jena-arq/src/main/java/org/apache/jena/sparql/core/TransactionalLock.java
@@ -0,0 +1,131 @@
+/*
+ * 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.sparql.core;
+
+import java.util.Objects ;
+
+import org.apache.jena.query.ReadWrite ;
+import org.apache.jena.shared.Lock ;
+import org.apache.jena.shared.LockMRSW ;
+import org.apache.jena.shared.LockMutex ;
+import org.apache.jena.sparql.JenaTransactionException ;
+
+/** An implementation of Tranactional that provides MRSW locking but no abort.
+ *  This is often the best you can do for a system that does not itself provide transactions.
+ *  @apiNote
+ *  To use with implementation inheritance, for when you don't inherit:
+ *  <pre>
+ *      private final Transactional txn                     = TransactionalLock.createMRSW() ;
+ *      {@literal @}Override public void begin(ReadWrite mode)         { txn.begin(mode) ; }
+ *      {@literal @}Override public void commit()                      { txn.commit() ; }
+ *      {@literal @}Override public void abort()                       { txn.abort() ; }
+ *      {@literal @}Override public boolean isInTransaction()          { return txn.isInTransaction() ; }
+ *      {@literal @}Override public void end()                         { txn.end(); }
+ *      {@literal @}Override public boolean supportsTransactions()     { return true ; }
+ *      {@literal @}Override public boolean supportsTransactionAbort() { return false ; }
+ *   </pre>
+ */ 
+public class TransactionalLock implements Transactional {
+/*
+       private final Transactional txn                     = TransactionalLock.createMRSW() ;
+       @Override public void begin(ReadWrite mode)         { txn.begin(mode) ; }
+       @Override public void commit()                      { txn.commit() ; }
+       @Override public void abort()                       { txn.abort() ; }
+       @Override public boolean isInTransaction()          { return txn.isInTransaction() ; }
+       @Override public void end()                         { txn.end(); }
+       @Override public boolean supportsTransactions()     { return true ; }
+       @Override public boolean supportsTransactionAbort() { return false ; }
+ */
+    
+    private final ThreadLocal<ReadWrite> txnMode  = ThreadLocal.withInitial( ()->null ) ;
+    private final Lock lock ;
+
+    public static TransactionalLock create(Lock lock) {
+        return new TransactionalLock(lock) ;
+    }
+
+    public static TransactionalLock createMRSW() {
+        return create(new LockMRSW()) ;
+    }
+    
+    public static TransactionalLock createMutex() {
+        return create(new LockMutex()) ;
+    }
+    
+    private TransactionalLock(Lock lock) {
+        this.lock = lock ;
+    }
+
+    /** Transactional MRSW */
+    private TransactionalLock() {
+        this(new LockMRSW()) ;
+    }
+
+    @Override
+    public void begin(ReadWrite readWrite) {
+        if ( isInTransaction() )
+            error("Already in a transaction") ;
+        boolean isRead = readWrite.equals(ReadWrite.READ) ;
+        lock.enterCriticalSection(isRead) ;
+        txnMode.set(readWrite) ;
+    }
+
+    @Override
+    public void commit() {
+        endOnce() ;
+    }
+
+    @Override
+    public void abort() {
+//        if ( isTransactionType(ReadWrite.WRITE) )
+//            error("Transactional.abort()") ;
+        endOnce() ;
+    }
+
+    @Override
+    public boolean isInTransaction() {
+        return txnMode.get() != null ;
+    }
+
+    public boolean isTransactionType(ReadWrite mode) {
+        return Objects.equals(mode, txnMode.get()) ;
+    }
+
+    private ReadWrite getTransactionType(ReadWrite mode) {
+        return txnMode.get() ;
+    }
+
+    @Override
+    public void end() {
+        if ( isTransactionType(ReadWrite.WRITE) )
+            error("Write transaction - no commit or abort before end()") ;
+        endOnce() ;
+    }
+
+    private void endOnce() {
+        if ( isInTransaction() ) {
+            lock.leaveCriticalSection() ;
+            txnMode.remove();
+        }
+    }
+    
+    private void error(String msg) {
+        throw new JenaTransactionException(msg) ; 
+    }
+}

http://git-wip-us.apache.org/repos/asf/jena/blob/9f4e2ddb/jena-arq/src/main/java/org/apache/jena/sparql/core/TransactionalMRSW.java
----------------------------------------------------------------------
diff --git a/jena-arq/src/main/java/org/apache/jena/sparql/core/TransactionalMRSW.java b/jena-arq/src/main/java/org/apache/jena/sparql/core/TransactionalMRSW.java
deleted file mode 100644
index 16b3540..0000000
--- a/jena-arq/src/main/java/org/apache/jena/sparql/core/TransactionalMRSW.java
+++ /dev/null
@@ -1,117 +0,0 @@
-/*
- * 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.sparql.core;
-
-import java.util.Objects ;
-
-import org.apache.jena.query.ReadWrite ;
-import org.apache.jena.shared.Lock ;
-import org.apache.jena.shared.LockMRSW ;
-import org.apache.jena.sparql.JenaTransactionException ;
-
-/** An implementation of Tranactional that provides MRSW locking but no abort.
- *  This is often the best you can do for a system that does not itself provide transactions.
- *  @apiNote
- *  To use with implementation inheritance, for when you don't inherit:
- *  <pre>
- *      private final Transactional txn                     = new TransactionalMRSW() ;
- *      {@literal @}Override public void begin(ReadWrite mode)         { txn.begin(mode) ; }
- *      {@literal @}Override public void commit()                      { txn.commit() ; }
- *      {@literal @}Override public void abort()                       { txn.abort() ; }
- *      {@literal @}Override public boolean isInTransaction()          { return txn.isInTransaction() ; }
- *      {@literal @}Override public void end()                         { txn.end(); }
- *      {@literal @}Override public boolean supportsTransactions()     { return true ; }
- *      {@literal @}Override public boolean supportsTransactionAbort() { return false ; }
- *   </pre>
- */ 
-public class TransactionalMRSW implements Transactional {
-/*
-       private final Transactional txn                     = new TransactionalMRSW() ;
-       @Override public void begin(ReadWrite mode)         { txn.begin(mode) ; }
-       @Override public void commit()                      { txn.commit() ; }
-       @Override public void abort()                       { txn.abort() ; }
-       @Override public boolean isInTransaction()          { return txn.isInTransaction() ; }
-       @Override public void end()                         { txn.end(); }
-       @Override public boolean supportsTransactions()     { return true ; }
-       @Override public boolean supportsTransactionAbort() { return false ; }
- */
-    
-    private final ThreadLocal<ReadWrite> txnMode  = ThreadLocal.withInitial( ()->null ) ;
-    private final Lock lock ;
-
-    public TransactionalMRSW(Lock lock) {
-        this.lock = lock ;
-    }
-
-    public TransactionalMRSW() {
-        this(new LockMRSW()) ;
-    }
-
-    @Override
-    public void begin(ReadWrite readWrite) {
-        if ( isInTransaction() )
-            error("Already in a transaction") ;
-        boolean isRead = readWrite.equals(ReadWrite.READ) ;
-        lock.enterCriticalSection(isRead) ;
-        txnMode.set(readWrite) ;
-    }
-
-    @Override
-    public void commit() {
-        endOnce() ;
-    }
-
-    @Override
-    public void abort() {
-//        if ( isTransactionType(ReadWrite.WRITE) )
-//            error("Transactional.abort()") ;
-        endOnce() ;
-    }
-
-    @Override
-    public boolean isInTransaction() {
-        return txnMode.get() != null ;
-    }
-
-    public boolean isTransactionType(ReadWrite mode) {
-        return Objects.equals(mode, txnMode.get()) ;
-    }
-
-    private ReadWrite getTransactionType(ReadWrite mode) {
-        return txnMode.get() ;
-    }
-
-    @Override
-    public void end() {
-        if ( isTransactionType(ReadWrite.WRITE) )
-            error("Write transaction - no commit or abort before end()") ;
-        endOnce() ;
-    }
-
-    private void endOnce() {
-        if ( isInTransaction() ) {
-            lock.leaveCriticalSection() ;
-            txnMode.remove();
-        }
-    }
-    
-    private void error(String msg) {
-        throw new JenaTransactionException(msg) ; 
-    }
-}

http://git-wip-us.apache.org/repos/asf/jena/blob/9f4e2ddb/jena-arq/src/main/java/org/apache/jena/sparql/core/TransactionalMutex.java
----------------------------------------------------------------------
diff --git a/jena-arq/src/main/java/org/apache/jena/sparql/core/TransactionalMutex.java b/jena-arq/src/main/java/org/apache/jena/sparql/core/TransactionalMutex.java
index 11e542a..50b2e4d 100644
--- a/jena-arq/src/main/java/org/apache/jena/sparql/core/TransactionalMutex.java
+++ b/jena-arq/src/main/java/org/apache/jena/sparql/core/TransactionalMutex.java
@@ -33,7 +33,7 @@ public class TransactionalMutex implements Transactional
     
     @Override
     public void begin(ReadWrite readWrite) {
-        lock.enterCriticalSection(false);       // Mutex
+        lock.enterCriticalSection(false);       // Always take a write lock - i.e. exclusive.
         isInTransaction.set(true); 
     }
 

http://git-wip-us.apache.org/repos/asf/jena/blob/9f4e2ddb/jena-arq/src/main/java/org/apache/jena/sparql/core/TransactionalNotSupported.java
----------------------------------------------------------------------
diff --git a/jena-arq/src/main/java/org/apache/jena/sparql/core/TransactionalNotSupported.java b/jena-arq/src/main/java/org/apache/jena/sparql/core/TransactionalNotSupported.java
index 8b0e3b5..69100ac 100644
--- a/jena-arq/src/main/java/org/apache/jena/sparql/core/TransactionalNotSupported.java
+++ b/jena-arq/src/main/java/org/apache/jena/sparql/core/TransactionalNotSupported.java
@@ -19,12 +19,15 @@
 package org.apache.jena.sparql.core;
 
 import org.apache.jena.query.ReadWrite ;
+import org.apache.jena.shared.LockMutex ;
 
-/** The "un-Transactional" interface */ 
+/** The "un-Transactional" interface.
+ * Use with {@link LockMutex}.
+ */ 
 public interface TransactionalNotSupported extends Transactional
 {
-    // And sometimes implements wil have to include this code directly
-    // to override super class versions.  
+    // And sometimes implementations will have to include this code
+    // directly to override super class versions.
     
     @Override
     public default void begin(ReadWrite readWrite)

http://git-wip-us.apache.org/repos/asf/jena/blob/9f4e2ddb/jena-core/src/main/java/org/apache/jena/shared/LockMutex.java
----------------------------------------------------------------------
diff --git a/jena-core/src/main/java/org/apache/jena/shared/LockMutex.java b/jena-core/src/main/java/org/apache/jena/shared/LockMutex.java
index db3baa4..5e59fc5 100644
--- a/jena-core/src/main/java/org/apache/jena/shared/LockMutex.java
+++ b/jena-core/src/main/java/org/apache/jena/shared/LockMutex.java
@@ -18,20 +18,18 @@
 
 package org.apache.jena.shared;
 
+import java.util.concurrent.locks.ReentrantLock;
+
+public class LockMutex implements Lock {
+    java.util.concurrent.locks.Lock mutex = new ReentrantLock();
 
-public class LockMutex implements Lock 
-{
-    java.util.concurrent.locks.Lock mutex = new java.util.concurrent.locks.ReentrantLock() ;
-    
     @Override
-    public void enterCriticalSection(boolean readLockRequested)
-    {
+    public void enterCriticalSection(boolean readLockRequested) {
         mutex.lock();
     }
 
     @Override
-    public void leaveCriticalSection()
-    {
-        mutex.unlock() ;
+    public void leaveCriticalSection() {
+        mutex.unlock();
     }
 }


[2/3] jena git commit: Tidy up.

Posted by an...@apache.org.
Tidy up.

Project: http://git-wip-us.apache.org/repos/asf/jena/repo
Commit: http://git-wip-us.apache.org/repos/asf/jena/commit/0fb37093
Tree: http://git-wip-us.apache.org/repos/asf/jena/tree/0fb37093
Diff: http://git-wip-us.apache.org/repos/asf/jena/diff/0fb37093

Branch: refs/heads/master
Commit: 0fb37093115d092e1f4428c583042ccb8cb59d4d
Parents: 9f4e2dd
Author: Andy Seaborne <an...@apache.org>
Authored: Sat Feb 6 21:37:43 2016 +0000
Committer: Andy Seaborne <an...@apache.org>
Committed: Sat Feb 6 21:37:43 2016 +0000

----------------------------------------------------------------------
 .../org/apache/jena/sparql/transaction/TS_Transaction.java     | 4 ++--
 .../apache/jena/sparql/transaction/TestTransactionSupport.java | 3 ---
 .../main/java/org/apache/jena/fuseki/servlets/HttpAction.java  | 6 +++---
 3 files changed, 5 insertions(+), 8 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/jena/blob/0fb37093/jena-arq/src/test/java/org/apache/jena/sparql/transaction/TS_Transaction.java
----------------------------------------------------------------------
diff --git a/jena-arq/src/test/java/org/apache/jena/sparql/transaction/TS_Transaction.java b/jena-arq/src/test/java/org/apache/jena/sparql/transaction/TS_Transaction.java
index cb8689f..7fbbe62 100644
--- a/jena-arq/src/test/java/org/apache/jena/sparql/transaction/TS_Transaction.java
+++ b/jena-arq/src/test/java/org/apache/jena/sparql/transaction/TS_Transaction.java
@@ -24,9 +24,9 @@ import org.junit.runners.Suite.SuiteClasses ;
 
 @RunWith(Suite.class)
 @SuiteClasses( {
-    TestTransactionDSGWithLockNoAbort.class,
-    TestTransactionDSGWithLockWithAbort.class,
     TestTransactionSupport.class
+    , TestTransactionDSGWithLockNoAbort.class
+    , TestTransactionDSGWithLockWithAbort.class
 })
 
 public class TS_Transaction

http://git-wip-us.apache.org/repos/asf/jena/blob/0fb37093/jena-arq/src/test/java/org/apache/jena/sparql/transaction/TestTransactionSupport.java
----------------------------------------------------------------------
diff --git a/jena-arq/src/test/java/org/apache/jena/sparql/transaction/TestTransactionSupport.java b/jena-arq/src/test/java/org/apache/jena/sparql/transaction/TestTransactionSupport.java
index b849144..4eb1cac 100644
--- a/jena-arq/src/test/java/org/apache/jena/sparql/transaction/TestTransactionSupport.java
+++ b/jena-arq/src/test/java/org/apache/jena/sparql/transaction/TestTransactionSupport.java
@@ -32,9 +32,6 @@ import org.junit.runners.Parameterized ;
 import org.junit.runners.Parameterized.Parameters ;
 
 /** "supports" for various DatasetGraph implementations */
-
-//Paramterize?
-
 @RunWith(Parameterized.class)
 public class TestTransactionSupport {
     

http://git-wip-us.apache.org/repos/asf/jena/blob/0fb37093/jena-fuseki2/jena-fuseki-core/src/main/java/org/apache/jena/fuseki/servlets/HttpAction.java
----------------------------------------------------------------------
diff --git a/jena-fuseki2/jena-fuseki-core/src/main/java/org/apache/jena/fuseki/servlets/HttpAction.java b/jena-fuseki2/jena-fuseki-core/src/main/java/org/apache/jena/fuseki/servlets/HttpAction.java
index 4708def..33a77ed 100644
--- a/jena-fuseki2/jena-fuseki-core/src/main/java/org/apache/jena/fuseki/servlets/HttpAction.java
+++ b/jena-fuseki2/jena-fuseki-core/src/main/java/org/apache/jena/fuseki/servlets/HttpAction.java
@@ -39,7 +39,7 @@ import org.apache.jena.sparql.SystemARQ ;
 import org.apache.jena.sparql.core.DatasetGraph ;
 import org.apache.jena.sparql.core.DatasetGraphWrapper ;
 import org.apache.jena.sparql.core.Transactional ;
-import org.apache.jena.sparql.core.TransactionalMutex ;
+import org.apache.jena.sparql.core.TransactionalLock ;
 import org.slf4j.Logger ;
 
 /**
@@ -169,8 +169,8 @@ public class HttpAction
             transactional = dsg ;
             isTransactional = false ;
         } else {
-            // Nothing to build on.  Be safe.
-            transactional = new TransactionalMutex(dsg.getLock()) ;
+            // Nothing to build on.  Be safe. 
+            transactional = TransactionalLock.createMutex() ;
             isTransactional = false ;
         }
     }


[3/3] jena git commit: JENA-1132: LibSDB for the fundamental "find" operations.

Posted by an...@apache.org.
JENA-1132: LibSDB for the fundamental "find" operations.

Project: http://git-wip-us.apache.org/repos/asf/jena/repo
Commit: http://git-wip-us.apache.org/repos/asf/jena/commit/0f596380
Tree: http://git-wip-us.apache.org/repos/asf/jena/tree/0f596380
Diff: http://git-wip-us.apache.org/repos/asf/jena/diff/0f596380

Branch: refs/heads/master
Commit: 0f596380a731b9be83eb90dc891ffcd187a662ea
Parents: 0fb3709
Author: Andy Seaborne <an...@apache.org>
Authored: Sun Feb 7 17:08:09 2016 +0000
Committer: Andy Seaborne <an...@apache.org>
Committed: Sun Feb 7 17:08:09 2016 +0000

----------------------------------------------------------------------
 .../org/apache/jena/sdb/graph/GraphSDB.java     | 246 ++++---------------
 .../apache/jena/sdb/store/DatasetGraphSDB.java  | 105 +++-----
 .../java/org/apache/jena/sdb/store/LibSDB.java  | 150 +++++++++++
 3 files changed, 235 insertions(+), 266 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/jena/blob/0f596380/jena-sdb/src/main/java/org/apache/jena/sdb/graph/GraphSDB.java
----------------------------------------------------------------------
diff --git a/jena-sdb/src/main/java/org/apache/jena/sdb/graph/GraphSDB.java b/jena-sdb/src/main/java/org/apache/jena/sdb/graph/GraphSDB.java
index 45731e7..eafcb2e 100644
--- a/jena-sdb/src/main/java/org/apache/jena/sdb/graph/GraphSDB.java
+++ b/jena-sdb/src/main/java/org/apache/jena/sdb/graph/GraphSDB.java
@@ -18,34 +18,22 @@
 
 package org.apache.jena.sdb.graph;
 
-import java.util.ArrayList ;
-import java.util.List ;
+import java.util.Iterator ;
 
 import org.apache.jena.graph.* ;
 import org.apache.jena.graph.impl.AllCapabilities ;
 import org.apache.jena.graph.impl.GraphBase ;
-import org.apache.jena.query.Query ;
 import org.apache.jena.sdb.SDB ;
 import org.apache.jena.sdb.Store ;
-import org.apache.jena.sdb.core.SDBRequest ;
-import org.apache.jena.sdb.engine.QueryEngineSDB ;
 import org.apache.jena.sdb.sql.SDBConnection ;
 import org.apache.jena.sdb.store.DatasetGraphSDB ;
+import org.apache.jena.sdb.store.LibSDB ;
 import org.apache.jena.sdb.store.StoreLoader ;
 import org.apache.jena.sdb.store.StoreLoaderPlus ;
 import org.apache.jena.shared.PrefixMapping ;
-import org.apache.jena.sparql.algebra.Op ;
-import org.apache.jena.sparql.algebra.op.OpQuadPattern ;
-import org.apache.jena.sparql.core.BasicPattern ;
 import org.apache.jena.sparql.core.Quad ;
-import org.apache.jena.sparql.core.Var ;
-import org.apache.jena.sparql.engine.Plan ;
-import org.apache.jena.sparql.engine.QueryIterator ;
-import org.apache.jena.sparql.engine.binding.Binding ;
-import org.apache.jena.sparql.engine.binding.BindingRoot ;
-import org.apache.jena.sparql.engine.iterator.QueryIterPlainWrapper ;
 import org.apache.jena.util.iterator.ExtendedIterator ;
-import org.apache.jena.util.iterator.NiceIterator ;
+import org.apache.jena.util.iterator.WrappedIterator ;
 import org.slf4j.Logger ;
 import org.slf4j.LoggerFactory ;
 
@@ -61,34 +49,30 @@ public class GraphSDB extends GraphBase implements Graph
     protected Node graphNode = Quad.defaultGraphNodeGenerated ;
     protected DatasetGraphSDB datasetStore = null ;
     
-    public GraphSDB(Store store, String uri)
-    { 
-        this(store, NodeFactory.createURI(uri)) ;
+    public GraphSDB(Store store, String uri) {
+        this(store, NodeFactory.createURI(uri));
     }
-    
-    public GraphSDB(Store store)
-    { 
-        this(store, (Node)null) ;
+
+    public GraphSDB(Store store) {
+        this(store, (Node)null);
     }
 
-    public GraphSDB(Store store, Node graphNode)
-    {
+    public GraphSDB(Store store, Node graphNode) {
         if ( graphNode == null )
-            graphNode = Quad.defaultGraphNodeGenerated ;
+            graphNode = Quad.defaultGraphNodeGenerated;
+
+        this.store = store;
+        this.graphNode = graphNode;
 
-        this.store = store ;
-        this.graphNode = graphNode ;
-        
         // Avoid looping here : DatasetStoreGraph can make GraphSDB's
-        datasetStore = new DatasetGraphSDB(store, this, SDB.getContext().copy()) ;
-        
-        //readPrefixMapping() ;
+        datasetStore = new DatasetGraphSDB(store, this, SDB.getContext().copy());
+
+        // readPrefixMapping() ;
     }
     
     /* We don't support value tests, hence handlesLiteralTyping is false */
     @Override
-    public Capabilities getCapabilities()
-    { 
+    public Capabilities getCapabilities() { 
     	if (capabilities == null)
             capabilities = new AllCapabilities()
         	  { @Override public boolean handlesLiteralTyping() { return false; } };
@@ -100,192 +84,70 @@ public class GraphSDB extends GraphBase implements Graph
     public SDBConnection getConnection() { return store.getConnection() ; }
     
     @Override
-    public PrefixMapping createPrefixMapping()
-    { 
+    public PrefixMapping createPrefixMapping() {
         try {
-            String graphURI = null ;
+            String graphURI = null;
             if ( Quad.isDefaultGraphGenerated(graphNode) )
-                graphURI = "" ;
+                graphURI = "";
             else if ( graphNode.isURI() )
-                graphURI = graphNode.getURI() ; 
-            else
-            {
-                log.warn("Not a URI for graph name") ;
-                graphURI = graphNode.toString() ;
+                graphURI = graphNode.getURI();
+            else {
+                log.warn("Not a URI for graph name");
+                graphURI = graphNode.toString();
             }
 
-            return new PrefixMappingSDB(graphURI, store.getConnection()) ;
-        } catch (Exception ex)
-        { log.warn("Failed to get prefixes: "+ex.getMessage()) ; return null ; }
-    }
-
-    private Quad quad(Triple m)
-    {
-        Node s = m.getMatchSubject() ;
-        Var sVar = null ;
-        if ( s == null )
-        {
-            sVar = Var.alloc("s") ;
-            s = sVar ;
+            return new PrefixMappingSDB(graphURI, store.getConnection());
         }
-        
-        Node p = m.getMatchPredicate() ;
-        Var pVar = null ;
-        if ( p == null )
-        {
-            pVar = Var.alloc("p") ;
-            p = pVar ;
+        catch (Exception ex) {
+            log.warn("Failed to get prefixes: " + ex.getMessage());
+            return null;
         }
-        
-        Node o = m.getMatchObject() ;
-        Var oVar = null ;
-        if ( o == null )
-        {
-            oVar = Var.alloc("o") ;
-            o = oVar ;
-        }
-        
-        return new Quad(graphNode, s, p ,o) ;
     }
 
     @Override
-    protected ExtendedIterator<Triple> graphBaseFind(Triple m)
-    {
-        // Fake a query.
-        SDBRequest cxt = new SDBRequest(getStore(), new Query()) ;
-        
-        // If null, create and remember a variable, else use the node.
-        final Node s = (m.getMatchSubject()==null)   ? Var.alloc("s")   :  m.getMatchSubject() ;
-        final Node p = (m.getMatchPredicate()==null) ? Var.alloc("p")   :  m.getMatchPredicate() ;
-        final Node o = (m.getMatchObject()==null)    ? Var.alloc("o")   :  m.getMatchObject() ;
-
-        Triple triple = new Triple(s, p ,o) ;
-        
-        // Evaluate as an algebra expression
-        BasicPattern pattern = new BasicPattern() ;
-        pattern.add(triple) ;
-        Op op = new OpQuadPattern(graphNode, pattern) ;
-        Plan plan = QueryEngineSDB.getFactory().create(op, datasetStore, BindingRoot.create(), null) ;
-        
-        QueryIterator qIter = plan.iterator() ;
-        
-        if ( SDB.getContext().isTrue(SDB.streamGraphAPI) )
-        {
-            // Dangerous version -- application must close iterator.
-            return new GraphIterator(triple, qIter) ;
-        }
-        else
-        {
-            // ---- Safe version: 
-            List<Binding> bindings = new ArrayList<Binding>() ;
-            while ( qIter.hasNext() ) 
-                bindings.add(qIter.nextBinding()) ;
-            qIter.close();
-            
-            // QueryIterPlainWrapper is just to make it ia QuyerIterator again.
-            return new GraphIterator(triple, new QueryIterPlainWrapper(bindings.iterator())) ;
-        }
-    }
-
-    // Collect ugliness together.
-    private static Triple bindingToTriple(Triple pattern,  
-                                          Binding binding)
-    {
-        Node s = pattern.getSubject() ;
-        Node p = pattern.getPredicate() ;
-        Node o = pattern.getObject() ;
-        
-        Node sResult = s ;
-        Node pResult = p ;
-        Node oResult = o ;
-        
-        if ( Var.isVar(s) )
-            sResult = binding.get(Var.alloc(s)) ;
-        if ( Var.isVar(p) )
-            pResult = binding.get(Var.alloc(p)) ;
-        if ( Var.isVar(o) )
-            oResult = binding.get(Var.alloc(o)) ;
-        
-        Triple resultTriple = new Triple(sResult, pResult, oResult) ;
-        return resultTriple ;
+    protected ExtendedIterator<Triple> graphBaseFind(Triple m) {
+        Iterator<Triple> iter = LibSDB.findTriples(datasetStore, graphNode, m.getSubject(), m.getPredicate(), m.getObject());
+        return WrappedIterator.create(iter);
     }
 
-    class GraphIterator extends NiceIterator<Triple>
-    {
-        QueryIterator qIter ; 
-        Triple current = null ;
-        Triple pattern ;
-        
-        GraphIterator(Triple pattern, QueryIterator qIter)
-        { 
-            this.qIter = qIter ;
-            this.pattern = pattern ;
-        }
-        
-        @Override
-        public void close()
-        {
-            qIter.close() ;
-        }
-        
-        @Override
-        public boolean hasNext()
-        {
-            return qIter.hasNext() ;
-        }
-        
-        @Override
-        public Triple next()
-        {
-            return ( current = bindingToTriple(pattern, qIter.nextBinding() ) ) ;
-        }
-
-        @Override
-        public void remove()
-        { 
-            if ( current != null )
-                delete(current) ;
-        }
-    }
-    
     public StoreLoader getBulkLoader() { return store.getLoader() ; }
     
     @Override
-    public GraphEventManager getEventManager()
-    {
-    	if (gem == null) gem = new EventManagerSDB( );
+    public GraphEventManager getEventManager() {
+        if ( gem == null )
+            gem = new EventManagerSDB();
         return gem;
     }
-    
+
     @Override
-    public void performAdd( Triple triple )
-    {
-    	if (inBulkUpdate == 0) store.getLoader().startBulkUpdate();
-        
+    public void performAdd(Triple triple) {
+        if ( inBulkUpdate == 0 )
+            store.getLoader().startBulkUpdate();
+
         if ( Quad.isDefaultGraphGenerated(graphNode) )
-            store.getLoader().addTriple(triple) ;
-        else
-        {
+            store.getLoader().addTriple(triple);
+        else {
             // XXX
-            StoreLoaderPlus x = (StoreLoaderPlus)store.getLoader() ;
-            x.addQuad(graphNode, triple.getSubject(), triple.getPredicate(), triple.getObject()) ;
+            StoreLoaderPlus x = (StoreLoaderPlus)store.getLoader();
+            x.addQuad(graphNode, triple.getSubject(), triple.getPredicate(), triple.getObject());
         }
-        if (inBulkUpdate == 0) store.getLoader().finishBulkUpdate();
+        if ( inBulkUpdate == 0 )
+            store.getLoader().finishBulkUpdate();
     }
     
     @Override
-    public void performDelete( Triple triple ) 
-    {
-    	if (inBulkUpdate == 0) store.getLoader().startBulkUpdate();
+    public void performDelete(Triple triple) {
+        if ( inBulkUpdate == 0 )
+            store.getLoader().startBulkUpdate();
         if ( Quad.isDefaultGraphGenerated(graphNode) )
-            store.getLoader().deleteTriple(triple) ;
-        else
-        {
+            store.getLoader().deleteTriple(triple);
+        else {
             // XXX
-            StoreLoaderPlus x = (StoreLoaderPlus)store.getLoader() ;
-            x.deleteQuad(graphNode, triple.getSubject(), triple.getPredicate(), triple.getObject()) ;
+            StoreLoaderPlus x = (StoreLoaderPlus)store.getLoader();
+            x.deleteQuad(graphNode, triple.getSubject(), triple.getPredicate(), triple.getObject());
         }
-        if (inBulkUpdate == 0) store.getLoader().finishBulkUpdate();
+        if ( inBulkUpdate == 0 )
+            store.getLoader().finishBulkUpdate();
     }
     
     public void startBulkUpdate()  { inBulkUpdate += 1 ; if (inBulkUpdate == 1) store.getLoader().startBulkUpdate();}

http://git-wip-us.apache.org/repos/asf/jena/blob/0f596380/jena-sdb/src/main/java/org/apache/jena/sdb/store/DatasetGraphSDB.java
----------------------------------------------------------------------
diff --git a/jena-sdb/src/main/java/org/apache/jena/sdb/store/DatasetGraphSDB.java b/jena-sdb/src/main/java/org/apache/jena/sdb/store/DatasetGraphSDB.java
index f958151..3af05c0 100644
--- a/jena-sdb/src/main/java/org/apache/jena/sdb/store/DatasetGraphSDB.java
+++ b/jena-sdb/src/main/java/org/apache/jena/sdb/store/DatasetGraphSDB.java
@@ -20,7 +20,6 @@ package org.apache.jena.sdb.store;
 
 import java.util.Iterator ;
 
-import org.apache.jena.atlas.iterator.Iter ;
 import org.apache.jena.atlas.lib.Closeable ;
 import org.apache.jena.graph.Graph ;
 import org.apache.jena.graph.Node ;
@@ -30,10 +29,7 @@ import org.apache.jena.sdb.graph.GraphSDB ;
 import org.apache.jena.sdb.util.StoreUtils ;
 import org.apache.jena.shared.Lock ;
 import org.apache.jena.shared.LockMRSW ;
-import org.apache.jena.sparql.core.DatasetGraph ;
-import org.apache.jena.sparql.core.DatasetGraphTriplesQuads ;
-import org.apache.jena.sparql.core.Quad ;
-import org.apache.jena.sparql.core.TransactionalNotSupported ;
+import org.apache.jena.sparql.core.* ;
 import org.apache.jena.sparql.util.Context ;
 import org.apache.jena.sparql.util.graph.GraphUtils ;
 
@@ -45,114 +41,75 @@ public class DatasetGraphSDB extends DatasetGraphTriplesQuads
     private final Context context ;
     private GraphSDB defaultGraph;
     
-    public DatasetGraphSDB(Store store, Context context)
-    {
-        this(store, new GraphSDB(store), context) ;
+    public DatasetGraphSDB(Store store, Context context) {
+        this(store, new GraphSDB(store), context);
     }
-    
-    public DatasetGraphSDB(Store store, GraphSDB graph, Context context)
-    {
-        this.store = store ;
+
+    public DatasetGraphSDB(Store store, GraphSDB graph, Context context) {
+        this.store = store;
         // Force the "default" graph
-        this.defaultGraph = graph ;
-        this.context = context ;
+        this.defaultGraph = graph;
+        this.context = context;
     }
-    
-    public Store getStore() { return store ; }
-    
+
+    public Store getStore() {
+        return store;
+    }
+
     @Override
-    public Iterator<Node> listGraphNodes()
-    {
-        return StoreUtils.storeGraphNames(store) ;
+    public Iterator<Node> listGraphNodes() {
+        return StoreUtils.storeGraphNames(store);
     }
 
     @Override
-    public boolean containsGraph(Node graphNode)
-    {
-        return StoreUtils.containsGraph(store, graphNode) ;
+    public boolean containsGraph(Node graphNode) {
+        return StoreUtils.containsGraph(store, graphNode);
     }
 
     @Override
-    public Graph getDefaultGraph()
-    {
-        return defaultGraph ;
+    public Graph getDefaultGraph() {
+        return defaultGraph;
     }
 
     @Override
-    public Graph getGraph(Node graphNode)
-    {
-        return new GraphSDB(store, graphNode) ;
+    public Graph getGraph(Node graphNode) {
+        return new GraphSDB(store, graphNode);
     }
     
-    // Use unsubtle helper versions (the bulk loader copes with large additions).
+    // Use unsubtle versions (the bulk loader copes with large additions).
     @Override
     protected void addToDftGraph(Node s, Node p, Node o)
-    { Helper.addToDftGraph(this, s, p, o) ; }
+    { getDefaultGraph().add(new Triple(s, p, o)) ; }
 
     @Override
     protected void addToNamedGraph(Node g, Node s, Node p, Node o)
-    { Helper.addToNamedGraph(this, g, s, p, o) ; }
+    { getGraph(g).add(new Triple(s, p, o)) ; }
 
     @Override
     protected void deleteFromDftGraph(Node s, Node p, Node o)
-    { Helper.deleteFromDftGraph(this, s, p, o) ; }
+    { getDefaultGraph().delete(new Triple(s, p, o)) ; }
 
     @Override
     protected void deleteFromNamedGraph(Node g, Node s, Node p, Node o)
-    { Helper.deleteFromNamedGraph(this, g, s, p, o) ; }
+    { getGraph(g).delete(new Triple(s, p, o)) ; }
 
     @Override
     protected Iterator<Quad> findInDftGraph(Node s, Node p, Node o)
-    { return Helper.findInDftGraph(this, s, p, o) ; }
+    { return GraphUtils.triples2quadsDftGraph(LibSDB.findTriplesInDftGraph(this, s, p, o)) ; }
 
     @Override
     protected Iterator<Quad> findInAnyNamedGraphs(Node s, Node p, Node o)
-    { return Helper.findInAnyNamedGraphs(this, s, p, o) ; } 
+    { return LibSDB.findInQuads(this, Node.ANY, s, p, o) ; } 
 
     @Override
     protected Iterator<Quad> findInSpecificNamedGraph(Node g, Node s, Node p, Node o)
-    { return Helper.findInSpecificNamedGraph(this, g, s, p, o) ; }
-
+    { return LibSDB.findInQuads(this, g, s, p, o) ; }
+    
     @Override
     public void close()
     { store.close() ; }
 
     // Helper implementations of operations.
     // Not necessarily efficient.
-    
-    private static class Helper {
-        public static void addToDftGraph(DatasetGraph dsg, Node s, Node p, Node o) {
-            dsg.getDefaultGraph().add(new Triple(s, p, o)) ;
-        }
-
-        public static void addToNamedGraph(DatasetGraph dsg, Node g, Node s, Node p, Node o) {
-            dsg.getGraph(g).add(new Triple(s, p, o)) ;
-        }
-
-        public static void deleteFromDftGraph(DatasetGraph dsg, Node s, Node p, Node o) {
-            dsg.getDefaultGraph().delete(new Triple(s, p, o)) ;
-        }
-
-        public static void deleteFromNamedGraph(DatasetGraph dsg, Node g, Node s, Node p, Node o) {
-            dsg.getGraph(g).delete(new Triple(s, p, o)) ;
-        }
-
-        public static Iterator<Quad> findInAnyNamedGraphs(DatasetGraph dsg, Node s, Node p, Node o) {
-            Iterator<Node> iter = dsg.listGraphNodes() ;
-            Iterator<Quad> quads = null ;
-            for ( ; iter.hasNext() ; ) {
-                Node gn = iter.next() ;
-                quads = Iter.append(quads, findInSpecificNamedGraph(dsg, gn, s, p, o)) ;
-            }
-            return quads ;
-        }
-
-        public static Iterator<Quad> findInDftGraph(DatasetGraph dsg, Node s, Node p, Node o) {
-            return GraphUtils.triples2quadsDftGraph(dsg.getDefaultGraph().find(s, p, o)) ;
-        }
-
-        public static Iterator<Quad> findInSpecificNamedGraph(DatasetGraph dsg, Node g, Node s, Node p, Node o) {
-            return GraphUtils.triples2quadsDftGraph(dsg.getGraph(g).find(s, p, o)) ;
-        }
-    }
+
 }

http://git-wip-us.apache.org/repos/asf/jena/blob/0f596380/jena-sdb/src/main/java/org/apache/jena/sdb/store/LibSDB.java
----------------------------------------------------------------------
diff --git a/jena-sdb/src/main/java/org/apache/jena/sdb/store/LibSDB.java b/jena-sdb/src/main/java/org/apache/jena/sdb/store/LibSDB.java
new file mode 100644
index 0000000..4b8cd93
--- /dev/null
+++ b/jena-sdb/src/main/java/org/apache/jena/sdb/store/LibSDB.java
@@ -0,0 +1,150 @@
+/*
+ * 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.sdb.store;
+
+import java.util.Iterator ;
+import java.util.List ;
+
+import org.apache.jena.atlas.iterator.Iter ;
+import org.apache.jena.atlas.lib.InternalErrorException ;
+import org.apache.jena.graph.Node ;
+import org.apache.jena.graph.Triple ;
+import org.apache.jena.sdb.SDB ;
+import org.apache.jena.sdb.engine.QueryEngineSDB ;
+import org.apache.jena.sparql.algebra.Op ;
+import org.apache.jena.sparql.algebra.op.OpBGP ;
+import org.apache.jena.sparql.algebra.op.OpQuadPattern ;
+import org.apache.jena.sparql.core.BasicPattern ;
+import org.apache.jena.sparql.core.DatasetGraph ;
+import org.apache.jena.sparql.core.Quad ;
+import org.apache.jena.sparql.core.Var ;
+import org.apache.jena.sparql.engine.Plan ;
+import org.apache.jena.sparql.engine.QueryIterator ;
+import org.apache.jena.sparql.engine.binding.Binding ;
+import org.apache.jena.sparql.engine.binding.BindingRoot ;
+
+public class LibSDB {
+    
+    /** Match a quad pattern (not triples in the default graph) */
+    public static Iterator<Quad> findInQuads(DatasetGraph dsg, Node g, Node s, Node p, Node o) {
+        // If null, create and remember a variable, else use the node.
+        final Node vg = varOrConst(g,"g") ;
+        final Node vs = varOrConst(s,"s") ;
+        final Node vp = varOrConst(p,"p") ;
+        final Node vo = varOrConst(o,"o") ;
+
+        Triple triple = new Triple(vs, vp ,vo) ;
+        // Evaluate as an algebra expression
+        BasicPattern pattern = new BasicPattern() ;
+        pattern.add(triple);
+        Op op = new OpQuadPattern(vg, pattern) ;
+        
+        Plan plan = QueryEngineSDB.getFactory().create(op, dsg, BindingRoot.create(), null) ;
+        QueryIterator qIter = plan.iterator() ;
+        Iterator<Binding> iter ;
+        if ( SDB.getContext().isTrue(SDB.streamGraphAPI) ) {
+            iter = qIter ;
+        } else {
+            // ---- Safe version: 
+            List<Binding> x = Iter.toList(qIter) ;
+            Iterator<Binding> qIter2 = x.iterator() ;
+            qIter.close();
+            iter = qIter2 ;
+        } 
+        return Iter.map(iter, (b) -> bindingToQuad(vg, vs, vp, vo, b)) ;
+    }
+
+    /** Find triples, in the default graph or a named graph. */
+    public static Iterator<Triple> findTriplesInDftGraph(DatasetGraph dsg, Node s, Node p, Node o) {
+        return findTriples(dsg, null, s, p, o) ; 
+    }
+
+        /** Find triples, in the default graph or a named graph. */
+    public static Iterator<Triple> findTriples(DatasetGraph dsg, Node g, Node s, Node p, Node o) {
+        if ( Var.isVar(g) )
+            throw new InternalErrorException("Graph node is a variable : "+g) ;
+        
+        final Node vs = varOrConst(s,"s") ;
+        final Node vp = varOrConst(p,"p") ;
+        final Node vo = varOrConst(o,"o") ;
+
+        // Evaluate as an algebra expression
+        Triple triple = new Triple(vs, vp ,vo) ;
+        BasicPattern pattern = new BasicPattern() ;
+        pattern.add(triple);
+        Op op = ( g != null ) ? new OpQuadPattern(g, pattern) : new OpBGP(pattern) ;
+        
+        Plan plan = QueryEngineSDB.getFactory().create(op, dsg, BindingRoot.create(), null) ;
+        QueryIterator qIter = plan.iterator() ;
+        Iterator<Binding> iter ;
+        if ( SDB.getContext().isTrue(SDB.streamGraphAPI) ) {
+            // Assumes iterator closed properly.
+            iter = qIter ;
+        } else {
+            // ---- Safe version: 
+            List<Binding> x = Iter.toList(qIter) ;
+            Iterator<Binding> qIter2 = x.iterator() ;
+            qIter.close();
+            iter = qIter2 ;
+        } 
+        return Iter.map(iter, (b) -> bindingToTriple(vs, vp, vo, b)) ;
+    }
+
+    private static Node varOrConst(Node n, String varName) {
+        if ( n != null && n != Node.ANY )
+            return n;
+        return Var.alloc(varName) ;
+    }         
+
+    private static Quad bindingToQuad(Node vg, Node vs, Node vp, Node vo, Binding binding)
+    {
+        Node gResult = vg ;
+        Node sResult = vs ;
+        Node pResult = vp ;
+        Node oResult = vo ;
+
+        if ( Var.isVar(vg) )
+            gResult = binding.get(Var.alloc(vg)) ;
+        if ( Var.isVar(vs) )
+            sResult = binding.get(Var.alloc(vs)) ;
+        if ( Var.isVar(vp) )
+            pResult = binding.get(Var.alloc(vp)) ;
+        if ( Var.isVar(vo) )
+            oResult = binding.get(Var.alloc(vo)) ;
+        
+        return Quad.create(gResult, sResult, pResult, oResult) ;
+    }
+    
+    private static Triple bindingToTriple(Node vs, Node vp, Node vo, Binding binding)
+    {
+        Node sResult = vs ;
+        Node pResult = vp ;
+        Node oResult = vo ;
+
+        if ( Var.isVar(vs) )
+            sResult = binding.get(Var.alloc(vs)) ;
+        if ( Var.isVar(vp) )
+            pResult = binding.get(Var.alloc(vp)) ;
+        if ( Var.isVar(vo) )
+            oResult = binding.get(Var.alloc(vo)) ;
+        
+        return Triple.create(sResult, pResult, oResult) ;
+    }
+
+}
\ No newline at end of file