Parallelize assembler for WPG datasets

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

Branch: refs/heads/ThreadPerGraphDataset
Commit: 789af0759b41f5b6377f540d20ff1254881df05c
Parents: da6b910
Author: ajs6f <[email protected]>
Authored: Sat Jan 7 18:29:37 2017 -0500
Committer: ajs6f <[email protected]>
Committed: Sat Jan 7 18:29:57 2017 -0500

----------------------------------------------------------------------
 .../core/assembler/DatasetAssemblerVocab.java   |   3 +-
 .../TransactionalInMemDatasetAssembler.java     |  29 ++--
 .../WriterPerGraphDatasetAssembler.java         |  79 ++++++++--
 .../sparql/core/assembler/TS_Assembler.java     |   2 +-
 .../assembler/TestInMemDatasetAssembler.java    | 145 -------------------
 .../assembler/TestTxnInMemDatasetAssembler.java | 145 +++++++++++++++++++
 6 files changed, 228 insertions(+), 175 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/jena/blob/789af075/jena-arq/src/main/java/org/apache/jena/sparql/core/assembler/DatasetAssemblerVocab.java
----------------------------------------------------------------------
diff --git 
a/jena-arq/src/main/java/org/apache/jena/sparql/core/assembler/DatasetAssemblerVocab.java
 
b/jena-arq/src/main/java/org/apache/jena/sparql/core/assembler/DatasetAssemblerVocab.java
index 1c234d1..260672c 100644
--- 
a/jena-arq/src/main/java/org/apache/jena/sparql/core/assembler/DatasetAssemblerVocab.java
+++ 
b/jena-arq/src/main/java/org/apache/jena/sparql/core/assembler/DatasetAssemblerVocab.java
@@ -34,7 +34,8 @@ public class DatasetAssemblerVocab
     public static final Resource tDatasetTxnMem      = 
ResourceFactory.createResource(NS+"DatasetTxnMem") ;
     // Writer-per-graph txn in-memory dataset
     public static final Resource tDatasetPGraphWriter = 
ResourceFactory.createResource(NS+"DatasetMemWriterPerGraph");
-    
+    public static final Property pParallelize        = 
ResourceFactory.createProperty(NS, "parallelize") ;
+
     public static final Resource tDatasetNull        = 
ResourceFactory.createResource(NS+"DatasetNull") ;
     
     public static final Property pDefaultGraph       = 
ResourceFactory.createProperty(NS, "defaultGraph") ;

http://git-wip-us.apache.org/repos/asf/jena/blob/789af075/jena-arq/src/main/java/org/apache/jena/sparql/core/assembler/TransactionalInMemDatasetAssembler.java
----------------------------------------------------------------------
diff --git 
a/jena-arq/src/main/java/org/apache/jena/sparql/core/assembler/TransactionalInMemDatasetAssembler.java
 
b/jena-arq/src/main/java/org/apache/jena/sparql/core/assembler/TransactionalInMemDatasetAssembler.java
index 12fc1fc..72e23b0 100644
--- 
a/jena-arq/src/main/java/org/apache/jena/sparql/core/assembler/TransactionalInMemDatasetAssembler.java
+++ 
b/jena-arq/src/main/java/org/apache/jena/sparql/core/assembler/TransactionalInMemDatasetAssembler.java
@@ -45,22 +45,27 @@ public abstract class TransactionalInMemDatasetAssembler 
extends AssemblerBase {
 
         dataset.begin(WRITE);
         try {
-            // load data into the default graph
-            if (root.hasProperty(data))
-                multiValueResource(root, data)
-                    .forEach(defaultGraphDocument -> read(dataset, 
defaultGraphDocument.getURI()));
-
-            // load data into named graphs
-            multiValueResource(root, pNamedGraph).forEach(namedGraphResource 
-> {
-                final String graphName = getAsStringValue(namedGraphResource, 
pGraphName);
-                if (namedGraphResource.hasProperty(data))
-                    multiValueResource(namedGraphResource, data)
-                            .forEach(namedGraphData -> 
read(dataset.getNamedModel(graphName), namedGraphData.getURI()));
-            });
+            loadDefaultGraph(root, dataset);
+            loadNamedGraphs(root, dataset);
             dataset.commit();
         } finally {
             dataset.end();
         }
         return dataset;
     }
+
+    protected void loadNamedGraphs(final Resource root, final Dataset dataset) 
{
+        multiValueResource(root, pNamedGraph).forEach(namedGraphResource -> {
+            final String graphName = getAsStringValue(namedGraphResource, 
pGraphName);
+            if (namedGraphResource.hasProperty(data))
+                multiValueResource(namedGraphResource, data)
+                        .forEach(namedGraphData -> 
read(dataset.getNamedModel(graphName), namedGraphData.getURI()));
+        });
+    }
+
+    protected void loadDefaultGraph(final Resource root, final Dataset 
dataset) {
+        if (root.hasProperty(data))
+            multiValueResource(root, data)
+                .forEach(defaultGraphDocument -> read(dataset, 
defaultGraphDocument.getURI()));
+    }
 }

http://git-wip-us.apache.org/repos/asf/jena/blob/789af075/jena-arq/src/main/java/org/apache/jena/sparql/core/assembler/WriterPerGraphDatasetAssembler.java
----------------------------------------------------------------------
diff --git 
a/jena-arq/src/main/java/org/apache/jena/sparql/core/assembler/WriterPerGraphDatasetAssembler.java
 
b/jena-arq/src/main/java/org/apache/jena/sparql/core/assembler/WriterPerGraphDatasetAssembler.java
index 2ebefd9..255e24c 100644
--- 
a/jena-arq/src/main/java/org/apache/jena/sparql/core/assembler/WriterPerGraphDatasetAssembler.java
+++ 
b/jena-arq/src/main/java/org/apache/jena/sparql/core/assembler/WriterPerGraphDatasetAssembler.java
@@ -1,27 +1,38 @@
 /*
- * 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
+ * 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
+ * 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.
+ * 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.assembler;
 
+import static java.util.concurrent.Executors.newFixedThreadPool;
+import static org.apache.jena.assembler.JA.data;
+import static org.apache.jena.query.ReadWrite.WRITE;
+import static org.apache.jena.riot.RDFDataMgr.read;
+import static 
org.apache.jena.sparql.core.assembler.DatasetAssemblerVocab.pGraphName;
+import static 
org.apache.jena.sparql.core.assembler.DatasetAssemblerVocab.pNamedGraph;
+import static org.apache.jena.sparql.util.graph.GraphUtils.getAsStringValue;
+import static org.apache.jena.sparql.util.graph.GraphUtils.getResourceValue;
+import static org.apache.jena.sparql.util.graph.GraphUtils.multiValueResource;
+
+import java.util.List;
+import java.util.concurrent.ExecutionException;
+import java.util.concurrent.ExecutorService;
+import java.util.concurrent.Future;
+
 import org.apache.jena.assembler.Assembler;
 import org.apache.jena.query.Dataset;
 import org.apache.jena.query.DatasetFactory;
 import org.apache.jena.rdf.model.Resource;
+import org.apache.jena.shared.JenaException;
 import org.apache.jena.sparql.core.DatasetGraphPerGraphLocking;
 
 /**
@@ -31,11 +42,47 @@ public class WriterPerGraphDatasetAssembler extends 
TransactionalInMemDatasetAss
 
     @Override
     public Resource getType() {
-        return DatasetAssemblerVocab.tDatasetPGraphWriter ;
+        return DatasetAssemblerVocab.tDatasetPGraphWriter;
     }
-    
+
     @Override
     public Dataset createDataset() {
-        return DatasetFactory.wrap(new DatasetGraphPerGraphLocking()) ;
+        return DatasetFactory.wrap(new DatasetGraphPerGraphLocking());
+    }
+
+    @Override
+    protected void loadNamedGraphs(Resource root, Dataset dataset) {
+        List<Resource> namedGraphs = multiValueResource(root, pNamedGraph);
+        Resource parallelizeValue = getResourceValue(root, 
DatasetAssemblerVocab.pParallelize);
+        // defaults to false
+        boolean parallelize = parallelizeValue != null ? 
parallelizeValue.asLiteral().getBoolean() : false;
+        if (parallelize) {
+            // take advantage of writer-per-graph to load in parallel, one 
thread per named graph
+            ExecutorService loaderThreadPool = 
newFixedThreadPool(namedGraphs.size());
+            try {
+                loaderThreadPool
+                        .submit(() -> 
namedGraphs.stream().parallel().forEach(namedGraphResource -> {
+                            dataset.begin(WRITE);
+                            try {
+                                loadNamedGraph(dataset, namedGraphResource);
+                                dataset.commit();
+                            } finally {
+                                dataset.end();
+                            }
+                        })).get();
+            } catch (InterruptedException | ExecutionException e) {
+                loaderThreadPool.shutdownNow();
+                throw new JenaException(e);
+            }
+            loaderThreadPool.shutdown();
+        } else 
+            // load using only this thread, default mode
+            namedGraphs.forEach(namedGraphResource -> loadNamedGraph(dataset, 
namedGraphResource));
+    }
+
+    private static void loadNamedGraph(Dataset dataset, Resource 
namedGraphResource) {
+        final String graphName = getAsStringValue(namedGraphResource, 
pGraphName);
+        if (namedGraphResource.hasProperty(data)) 
multiValueResource(namedGraphResource, data)
+                .forEach(namedGraphData -> 
read(dataset.getNamedModel(graphName), namedGraphData.getURI()));
     }
 }

http://git-wip-us.apache.org/repos/asf/jena/blob/789af075/jena-arq/src/test/java/org/apache/jena/sparql/core/assembler/TS_Assembler.java
----------------------------------------------------------------------
diff --git 
a/jena-arq/src/test/java/org/apache/jena/sparql/core/assembler/TS_Assembler.java
 
b/jena-arq/src/test/java/org/apache/jena/sparql/core/assembler/TS_Assembler.java
index 3dbe1bd..bb27b4c 100644
--- 
a/jena-arq/src/test/java/org/apache/jena/sparql/core/assembler/TS_Assembler.java
+++ 
b/jena-arq/src/test/java/org/apache/jena/sparql/core/assembler/TS_Assembler.java
@@ -23,5 +23,5 @@ import org.junit.runners.Suite;
 import org.junit.runners.Suite.SuiteClasses;
 
 @RunWith(Suite.class)
-@SuiteClasses({ TestInMemDatasetAssembler.class })
+@SuiteClasses({ TestTxnInMemDatasetAssembler.class })
 public class TS_Assembler {}

http://git-wip-us.apache.org/repos/asf/jena/blob/789af075/jena-arq/src/test/java/org/apache/jena/sparql/core/assembler/TestInMemDatasetAssembler.java
----------------------------------------------------------------------
diff --git 
a/jena-arq/src/test/java/org/apache/jena/sparql/core/assembler/TestInMemDatasetAssembler.java
 
b/jena-arq/src/test/java/org/apache/jena/sparql/core/assembler/TestInMemDatasetAssembler.java
deleted file mode 100644
index ad4114c..0000000
--- 
a/jena-arq/src/test/java/org/apache/jena/sparql/core/assembler/TestInMemDatasetAssembler.java
+++ /dev/null
@@ -1,145 +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.assembler;
-
-import static java.nio.file.Files.createTempFile;
-import static org.apache.jena.assembler.JA.MemoryModel ;
-import static org.apache.jena.assembler.JA.data ;
-import static org.apache.jena.assembler.Mode.DEFAULT;
-import static org.apache.jena.query.DatasetFactory.createTxnMem;
-import static org.apache.jena.rdf.model.ModelFactory.createDefaultModel;
-import static org.apache.jena.riot.Lang.NQUADS;
-import static org.apache.jena.riot.RDFDataMgr.write;
-import static org.apache.jena.riot.RDFFormat.NTRIPLES;
-import static 
org.apache.jena.sparql.core.assembler.DatasetAssemblerVocab.pGraphName;
-import static 
org.apache.jena.sparql.core.assembler.DatasetAssemblerVocab.pNamedGraph;
-import static org.apache.jena.vocabulary.RDF.type;
-
-import java.io.FileOutputStream;
-import java.io.IOException;
-import java.io.OutputStream;
-import java.nio.file.Path;
-import java.util.Iterator;
-
-import org.apache.jena.assembler.JA ;
-import org.apache.jena.assembler.exceptions.CannotConstructException;
-import org.apache.jena.graph.Node;
-import org.apache.jena.query.Dataset;
-import org.apache.jena.rdf.model.Model;
-import org.apache.jena.rdf.model.Resource;
-import org.apache.jena.rdf.model.Statement;
-import org.apache.jena.sparql.core.DatasetGraph;
-import org.apache.jena.sparql.core.Quad;
-import org.junit.Assert;
-import org.junit.Test;
-
-/**
- * Tests for {@link TxnInMemDatasetAssembler}
- *
- */
-public class TestInMemDatasetAssembler extends Assert {
-
-    private Dataset assemble(final Resource example) {
-           Model model = example.getModel() ;
-           model.setNsPrefix("ja", JA.getURI()) ;
-//         System.out.println("-------------");
-//         RDFDataMgr.write(System.out, model, Lang.TTL) ;
-           final TxnInMemDatasetAssembler testAssembler = new 
TxnInMemDatasetAssembler();
-               return testAssembler.open(testAssembler, example, DEFAULT);
-       }
-       
-       @Test
-       public void emptyDataset() {
-           final Model model = createDefaultModel();
-           final Resource empty = model.createResource("test:empty");
-           empty.addProperty(type, DatasetAssemblerVocab.tDatasetTxnMem) ;
-           Dataset dataset = assemble(empty) ;
-           assertFalse(dataset.asDatasetGraph().find().hasNext()) ;
-       }
-
-       @Test
-       public void directDataLinkForDefaultAndNamedGraphs() throws IOException 
{
-               // first make a file of triples to load later
-               final Model model = createDefaultModel();
-               final Path triples = createTempFile("simpleExample", ".nt");
-               final Resource triplesURI = 
model.createResource(triples.toFile().toURI().toString());
-               final Resource simpleExample = 
model.createResource("test:simpleExample");
-               simpleExample.addProperty(type, 
DatasetAssemblerVocab.tDatasetTxnMem);
-               // add a default graph
-               simpleExample.addProperty(data, triplesURI);
-               // add a named graph
-               final Resource namedGraphDef = 
model.createResource("test:namedGraphDef");
-               simpleExample.addProperty(pNamedGraph, namedGraphDef);
-               final Resource namedGraphName = 
model.createResource("test:namedGraphExample");
-               namedGraphDef.addProperty(type, MemoryModel);
-               namedGraphDef.addProperty(pGraphName, namedGraphName);
-               namedGraphDef.addProperty(data, triplesURI);
-
-               try (OutputStream out = new FileOutputStream(triples.toFile())) 
{
-                       write(out, model, NTRIPLES);
-               }
-
-               final Dataset dataset = assemble(simpleExample);
-               final Model assembledDefaultModel = dataset.getDefaultModel();
-               final Model assembledNamedModel = 
dataset.getNamedModel(namedGraphName.getURI());
-
-               // we put the same triples in each model, so we check for the 
same triples in each model
-               for (final Model m : new Model[] { assembledDefaultModel, 
assembledNamedModel }) {
-                       assertTrue(m.contains(simpleExample, pNamedGraph, 
namedGraphDef));
-                       assertTrue(m.contains(namedGraphDef, pGraphName, 
namedGraphName));
-                       assertTrue(m.contains(simpleExample, data, triplesURI));
-
-               }
-               final Iterator<Node> graphNodes = 
dataset.asDatasetGraph().listGraphNodes();
-               assertTrue(graphNodes.hasNext());
-               assertEquals(namedGraphName.asNode(), graphNodes.next());
-               assertFalse(graphNodes.hasNext());
-       }
-
-       @Test
-       public void directDataLinkToQuads() throws IOException {
-               // first make a file of quads to load later
-               final Model model = createDefaultModel();
-               final Path quads = createTempFile("quadExample", ".nq");
-               final Resource quadsURI = 
model.createResource(quads.toFile().toURI().toString());
-               final Resource simpleExample = 
model.createResource("test:simpleExample");
-               simpleExample.addProperty(type, 
DatasetAssemblerVocab.tDatasetTxnMem);
-               simpleExample.addProperty(data, quadsURI);
-
-               final DatasetGraph dsg = createTxnMem().asDatasetGraph();
-               model.listStatements().mapWith(Statement::asTriple).mapWith(t 
-> new Quad(quadsURI.asNode(), t))
-                               .forEachRemaining(dsg::add);
-               try (OutputStream out = new FileOutputStream(quads.toFile())) {
-                       write(out, dsg, NQUADS);
-               }
-
-               final Dataset dataset = assemble(simpleExample);
-               final Model assembledDefaultModel = dataset.getDefaultModel();
-               final Model assembledNamedModel = 
dataset.getNamedModel(quadsURI.getURI());
-               assertTrue(assembledDefaultModel.isEmpty());
-               
assertTrue(assembledNamedModel.contains(assembledNamedModel.createStatement(simpleExample,
 data, quadsURI)));
-       }
-
-       @Test(expected = CannotConstructException.class)
-       public void wrongKindOfAssemblerDefinition() {
-               final Model model = createDefaultModel();
-               final Resource badExample = 
model.createResource("test:badExample");
-               assemble(badExample);
-       }
-}

http://git-wip-us.apache.org/repos/asf/jena/blob/789af075/jena-arq/src/test/java/org/apache/jena/sparql/core/assembler/TestTxnInMemDatasetAssembler.java
----------------------------------------------------------------------
diff --git 
a/jena-arq/src/test/java/org/apache/jena/sparql/core/assembler/TestTxnInMemDatasetAssembler.java
 
b/jena-arq/src/test/java/org/apache/jena/sparql/core/assembler/TestTxnInMemDatasetAssembler.java
new file mode 100644
index 0000000..3c2b8c9
--- /dev/null
+++ 
b/jena-arq/src/test/java/org/apache/jena/sparql/core/assembler/TestTxnInMemDatasetAssembler.java
@@ -0,0 +1,145 @@
+/*
+ * 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.assembler;
+
+import static java.nio.file.Files.createTempFile;
+import static org.apache.jena.assembler.JA.MemoryModel ;
+import static org.apache.jena.assembler.JA.data ;
+import static org.apache.jena.assembler.Mode.DEFAULT;
+import static org.apache.jena.query.DatasetFactory.createTxnMem;
+import static org.apache.jena.rdf.model.ModelFactory.createDefaultModel;
+import static org.apache.jena.riot.Lang.NQUADS;
+import static org.apache.jena.riot.RDFDataMgr.write;
+import static org.apache.jena.riot.RDFFormat.NTRIPLES;
+import static 
org.apache.jena.sparql.core.assembler.DatasetAssemblerVocab.pGraphName;
+import static 
org.apache.jena.sparql.core.assembler.DatasetAssemblerVocab.pNamedGraph;
+import static org.apache.jena.vocabulary.RDF.type;
+
+import java.io.FileOutputStream;
+import java.io.IOException;
+import java.io.OutputStream;
+import java.nio.file.Path;
+import java.util.Iterator;
+
+import org.apache.jena.assembler.JA ;
+import org.apache.jena.assembler.exceptions.CannotConstructException;
+import org.apache.jena.graph.Node;
+import org.apache.jena.query.Dataset;
+import org.apache.jena.rdf.model.Model;
+import org.apache.jena.rdf.model.Resource;
+import org.apache.jena.rdf.model.Statement;
+import org.apache.jena.sparql.core.DatasetGraph;
+import org.apache.jena.sparql.core.Quad;
+import org.junit.Assert;
+import org.junit.Test;
+
+/**
+ * Tests for {@link TxnInMemDatasetAssembler}
+ *
+ */
+public class TestTxnInMemDatasetAssembler extends Assert {
+
+    private Dataset assemble(final Resource example) {
+           Model model = example.getModel() ;
+           model.setNsPrefix("ja", JA.getURI()) ;
+//         System.out.println("-------------");
+//         RDFDataMgr.write(System.out, model, Lang.TTL) ;
+           final TxnInMemDatasetAssembler testAssembler = new 
TxnInMemDatasetAssembler();
+               return testAssembler.open(testAssembler, example, DEFAULT);
+       }
+       
+       @Test
+       public void emptyDataset() {
+           final Model model = createDefaultModel();
+           final Resource empty = model.createResource("test:empty");
+           empty.addProperty(type, DatasetAssemblerVocab.tDatasetTxnMem) ;
+           Dataset dataset = assemble(empty) ;
+           assertFalse(dataset.asDatasetGraph().find().hasNext()) ;
+       }
+
+       @Test
+       public void directDataLinkForDefaultAndNamedGraphs() throws IOException 
{
+               // first make a file of triples to load later
+               final Model model = createDefaultModel();
+               final Path triples = createTempFile("simpleExample", ".nt");
+               final Resource triplesURI = 
model.createResource(triples.toFile().toURI().toString());
+               final Resource simpleExample = 
model.createResource("test:simpleExample");
+               simpleExample.addProperty(type, 
DatasetAssemblerVocab.tDatasetTxnMem);
+               // add a default graph
+               simpleExample.addProperty(data, triplesURI);
+               // add a named graph
+               final Resource namedGraphDef = 
model.createResource("test:namedGraphDef");
+               simpleExample.addProperty(pNamedGraph, namedGraphDef);
+               final Resource namedGraphName = 
model.createResource("test:namedGraphExample");
+               namedGraphDef.addProperty(type, MemoryModel);
+               namedGraphDef.addProperty(pGraphName, namedGraphName);
+               namedGraphDef.addProperty(data, triplesURI);
+
+               try (OutputStream out = new FileOutputStream(triples.toFile())) 
{
+                       write(out, model, NTRIPLES);
+               }
+
+               final Dataset dataset = assemble(simpleExample);
+               final Model assembledDefaultModel = dataset.getDefaultModel();
+               final Model assembledNamedModel = 
dataset.getNamedModel(namedGraphName.getURI());
+
+               // we put the same triples in each model, so we check for the 
same triples in each model
+               for (final Model m : new Model[] { assembledDefaultModel, 
assembledNamedModel }) {
+                       assertTrue(m.contains(simpleExample, pNamedGraph, 
namedGraphDef));
+                       assertTrue(m.contains(namedGraphDef, pGraphName, 
namedGraphName));
+                       assertTrue(m.contains(simpleExample, data, triplesURI));
+
+               }
+               final Iterator<Node> graphNodes = 
dataset.asDatasetGraph().listGraphNodes();
+               assertTrue(graphNodes.hasNext());
+               assertEquals(namedGraphName.asNode(), graphNodes.next());
+               assertFalse(graphNodes.hasNext());
+       }
+
+       @Test
+       public void directDataLinkToQuads() throws IOException {
+               // first make a file of quads to load later
+               final Model model = createDefaultModel();
+               final Path quads = createTempFile("quadExample", ".nq");
+               final Resource quadsURI = 
model.createResource(quads.toFile().toURI().toString());
+               final Resource simpleExample = 
model.createResource("test:simpleExample");
+               simpleExample.addProperty(type, 
DatasetAssemblerVocab.tDatasetTxnMem);
+               simpleExample.addProperty(data, quadsURI);
+
+               final DatasetGraph dsg = createTxnMem().asDatasetGraph();
+               model.listStatements().mapWith(Statement::asTriple).mapWith(t 
-> new Quad(quadsURI.asNode(), t))
+                               .forEachRemaining(dsg::add);
+               try (OutputStream out = new FileOutputStream(quads.toFile())) {
+                       write(out, dsg, NQUADS);
+               }
+
+               final Dataset dataset = assemble(simpleExample);
+               final Model assembledDefaultModel = dataset.getDefaultModel();
+               final Model assembledNamedModel = 
dataset.getNamedModel(quadsURI.getURI());
+               assertTrue(assembledDefaultModel.isEmpty());
+               
assertTrue(assembledNamedModel.contains(assembledNamedModel.createStatement(simpleExample,
 data, quadsURI)));
+       }
+
+       @Test(expected = CannotConstructException.class)
+       public void wrongKindOfAssemblerDefinition() {
+               final Model model = createDefaultModel();
+               final Resource badExample = 
model.createResource("test:badExample");
+               assemble(badExample);
+       }
+}

Reply via email to