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) )