JENA-1769: TDB2-specific code for listGraphNodes
diff --git a/jena-db/jena-dboe-storage/src/main/java/org/apache/jena/dboe/storage/system/DatasetGraphStorage.java b/jena-db/jena-dboe-storage/src/main/java/org/apache/jena/dboe/storage/system/DatasetGraphStorage.java
index 555d38a..ada0717 100644
--- a/jena-db/jena-dboe-storage/src/main/java/org/apache/jena/dboe/storage/system/DatasetGraphStorage.java
+++ b/jena-db/jena-dboe-storage/src/main/java/org/apache/jena/dboe/storage/system/DatasetGraphStorage.java
@@ -81,6 +81,10 @@
@Override public StoragePrefixes getPrefixes() { return prefixes; }
@Override public Transactional getTransactional() { return txn; }
+ /**
+ * Provide a general implementation of "listGraphNodes". Implementations may wish
+ * to override and do this operation in a more efficient manner.
+ */
@Override
public Iterator<Node> listGraphNodes() {
Iterator<Quad> iter = findNG(null, null, null, null);
diff --git a/jena-db/jena-tdb2/src/main/java/org/apache/jena/tdb2/store/DatasetGraphTDB.java b/jena-db/jena-tdb2/src/main/java/org/apache/jena/tdb2/store/DatasetGraphTDB.java
index ce05524..5ba2771 100644
--- a/jena-db/jena-tdb2/src/main/java/org/apache/jena/tdb2/store/DatasetGraphTDB.java
+++ b/jena-db/jena-tdb2/src/main/java/org/apache/jena/tdb2/store/DatasetGraphTDB.java
@@ -18,6 +18,10 @@
package org.apache.jena.tdb2.store;
+import java.util.Iterator;
+
+import org.apache.jena.atlas.iterator.Iter;
+import org.apache.jena.atlas.lib.tuple.Tuple;
import org.apache.jena.dboe.base.file.Location;
import org.apache.jena.dboe.storage.StoragePrefixes;
import org.apache.jena.dboe.storage.system.DatasetGraphStorage;
@@ -27,6 +31,7 @@
import org.apache.jena.sparql.core.Quad;
import org.apache.jena.sparql.engine.optimizer.reorder.ReorderTransformation;
import org.apache.jena.tdb2.TDBException;
+import org.apache.jena.tdb2.lib.NodeLib;
import org.apache.jena.tdb2.params.StoreParams;
import org.apache.jena.tdb2.store.nodetupletable.NodeTupleTable;
@@ -127,6 +132,18 @@
return GraphTDB.tdb_createUnionGraph(this, getPrefixes());
}
+ @Override
+ public Iterator<Node> listGraphNodes() {
+ checkNotClosed();
+ NodeTupleTable quads = getQuadTable().getNodeTupleTable();
+ Iterator<Tuple<NodeId>> x = quads.findAll();
+ // XXX Future: Ensure we scan a G??? index and use distinctAdjacent.
+ // See TupleTable.chooseScanAllIndex
+ Iterator<NodeId> z = Iter.iter(x).map(t -> t.get(0)).distinct();
+ Iterator<Node> r = NodeLib.nodes(quads.getNodeTable(), z);
+ return r;
+ }
+
public NodeTupleTable chooseNodeTupleTable(Node graphNode) {
checkNotClosed();
if ( graphNode == null || Quad.isDefaultGraph(graphNode) )