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