Tests for UnionDatasetCollector
Project: http://git-wip-us.apache.org/repos/asf/jena/repo Commit: http://git-wip-us.apache.org/repos/asf/jena/commit/67f3e75c Tree: http://git-wip-us.apache.org/repos/asf/jena/tree/67f3e75c Diff: http://git-wip-us.apache.org/repos/asf/jena/diff/67f3e75c Branch: refs/heads/master Commit: 67f3e75c41931b93d2cbfb56636a622adb4cad40 Parents: f665fa1 Author: ajs6f <[email protected]> Authored: Sun Dec 31 13:45:09 2017 -0500 Committer: ajs6f <[email protected]> Committed: Fri Jan 5 09:32:55 2018 -0500 ---------------------------------------------------------------------- .../jena/query/util/DatasetCollector.java | 39 +++++++++++++------- .../jena/query/util/TestDatasetCollector.java | 27 ++++++++++++++ .../util/TestIntersectionDatasetCollector.java | 20 ++++++++-- .../query/util/TestUnionDatasetCollector.java | 31 +++++++++++----- 4 files changed, 91 insertions(+), 26 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/jena/blob/67f3e75c/jena-arq/src/main/java/org/apache/jena/query/util/DatasetCollector.java ---------------------------------------------------------------------- diff --git a/jena-arq/src/main/java/org/apache/jena/query/util/DatasetCollector.java b/jena-arq/src/main/java/org/apache/jena/query/util/DatasetCollector.java index b70026a..092b8f8 100644 --- a/jena-arq/src/main/java/org/apache/jena/query/util/DatasetCollector.java +++ b/jena-arq/src/main/java/org/apache/jena/query/util/DatasetCollector.java @@ -76,17 +76,22 @@ public abstract class DatasetCollector implements UnorderedIdentityFinishCollect public BiConsumer<Dataset, Dataset> accumulator() { return (d1, d2) -> { d1.getDefaultModel().add(d2.getDefaultModel()); - d2.listNames().forEachRemaining( - name -> { - Model union = d1.getNamedModel(name).union(d2.getNamedModel(name)); - d1.replaceNamedModel(name, union); - }); + d2.listNames().forEachRemaining(name -> { + Model union = d1.getNamedModel(name).union(d2.getNamedModel(name)); + d1.replaceNamedModel(name, union); + }); }; } } public static class IntersectionDatasetCollector extends DatasetCollector { + /** + * The first element is treated differently because {@link DatasetCollector#supplier()} does + * not provide an identity element for intersection. + */ + boolean afterFirstElement = false; + @Override public BinaryOperator<Dataset> combiner() { return DatasetLib::intersection; @@ -95,20 +100,26 @@ public abstract class DatasetCollector implements UnorderedIdentityFinishCollect @Override public BiConsumer<Dataset, Dataset> accumulator() { return (d1, d2) -> { - d1.setDefaultModel(d1.getDefaultModel().intersection(d2.getDefaultModel())); - filter(d2.listNames(), d1::containsNamedModel).forEachRemaining(name -> { - Model intersection = d1.getNamedModel(name).intersection(d2.getNamedModel(name)); - d1.replaceNamedModel(name, intersection); - }); + if (afterFirstElement) { + d1.setDefaultModel(d1.getDefaultModel().intersection(d2.getDefaultModel())); + filter(d1.listNames(), d2::containsNamedModel).forEachRemaining(name -> { + Model intersection = d1.getNamedModel(name).intersection(d2.getNamedModel(name)); + d1.replaceNamedModel(name, intersection); + }); + } else { + d1.setDefaultModel(d2.getDefaultModel()); + d2.listNames().forEachRemaining(name -> d1.addNamedModel(name, d2.getNamedModel(name))); + afterFirstElement = true; + } }; } } - - static DatasetCollector union() { + + static DatasetCollector union() { return new UnionDatasetCollector(); } - - static DatasetCollector intersect() { + + static DatasetCollector intersect() { return new IntersectionDatasetCollector(); } } http://git-wip-us.apache.org/repos/asf/jena/blob/67f3e75c/jena-arq/src/test/java/org/apache/jena/query/util/TestDatasetCollector.java ---------------------------------------------------------------------- diff --git a/jena-arq/src/test/java/org/apache/jena/query/util/TestDatasetCollector.java b/jena-arq/src/test/java/org/apache/jena/query/util/TestDatasetCollector.java index 83093e9..539974c 100644 --- a/jena-arq/src/test/java/org/apache/jena/query/util/TestDatasetCollector.java +++ b/jena-arq/src/test/java/org/apache/jena/query/util/TestDatasetCollector.java @@ -1,9 +1,15 @@ package org.apache.jena.query.util; +import static org.apache.jena.rdf.model.ModelFactory.createModelForGraph; +import static org.apache.jena.sparql.sse.SSE.parseGraph; + import java.util.stream.Stream; +import org.apache.jena.ext.com.google.common.collect.Maps; +import org.apache.jena.graph.*; import org.apache.jena.query.Dataset; import org.apache.jena.query.DatasetFactory; +import org.apache.jena.rdf.model.Model; import org.junit.Assert; import org.junit.Test; @@ -31,4 +37,25 @@ public abstract class TestDatasetCollector extends Assert { public void noNullDatasetsAllowed() { Stream.<Dataset>builder().add(null).build().collect(testInstance()); } + + @Test + public void collectingOneDatasetGivesThatDataset() { + Graph graph = parseGraph("(graph (triple <s1> <p1> <o1> ))"); + Model model = createModelForGraph(graph); + Dataset dataset = DatasetFactory.create(model); + Node graphName = NodeFactory.createBlankNode(); + dataset.addNamedModel(graphName.toString(), model); + Dataset collection = Stream.<Dataset>builder().add(dataset).build().collect(testInstance()); + assertDatasetsAreIsomorphicPerGraph(dataset, collection); + } + + protected static void assertDatasetsAreIsomorphicPerGraph(Dataset dataset1, Dataset dataset2) { + assertGraphsAreIsomorphic(dataset1.getDefaultModel(), dataset2.getDefaultModel()); + dataset1.listNames().forEachRemaining(graphName -> + assertGraphsAreIsomorphic(dataset1.getNamedModel(graphName), dataset2.getNamedModel(graphName))); + } + + protected static void assertGraphsAreIsomorphic(Model graph1, Model graph2) { + assertTrue(graph1.isIsomorphicWith(graph2)); + } } http://git-wip-us.apache.org/repos/asf/jena/blob/67f3e75c/jena-arq/src/test/java/org/apache/jena/query/util/TestIntersectionDatasetCollector.java ---------------------------------------------------------------------- diff --git a/jena-arq/src/test/java/org/apache/jena/query/util/TestIntersectionDatasetCollector.java b/jena-arq/src/test/java/org/apache/jena/query/util/TestIntersectionDatasetCollector.java index a8b1285..aa7f040 100644 --- a/jena-arq/src/test/java/org/apache/jena/query/util/TestIntersectionDatasetCollector.java +++ b/jena-arq/src/test/java/org/apache/jena/query/util/TestIntersectionDatasetCollector.java @@ -1,12 +1,26 @@ package org.apache.jena.query.util; -public class TestIntersectionDatasetCollector extends TestDatasetCollector{ +import static org.apache.jena.rdf.model.ModelFactory.createModelForGraph; +import static org.apache.jena.sparql.sse.SSE.parseGraph; + +import org.apache.jena.graph.Graph; +import org.apache.jena.query.Dataset; +import org.apache.jena.query.DatasetFactory; +import org.apache.jena.rdf.model.Model; +import org.junit.Test; + +public class TestIntersectionDatasetCollector extends TestDatasetCollector { @Override public DatasetCollector testInstance() { return DatasetLib.collectors().intersect(); } - - + @Test + public void testIntersection() { + Graph graph = parseGraph("(graph (triple <s1> <p1> <o1> ))"); + Model model = createModelForGraph(graph); + Dataset dataset = DatasetFactory.create(model); + } + } http://git-wip-us.apache.org/repos/asf/jena/blob/67f3e75c/jena-arq/src/test/java/org/apache/jena/query/util/TestUnionDatasetCollector.java ---------------------------------------------------------------------- diff --git a/jena-arq/src/test/java/org/apache/jena/query/util/TestUnionDatasetCollector.java b/jena-arq/src/test/java/org/apache/jena/query/util/TestUnionDatasetCollector.java index 65b94d0..fe10711 100644 --- a/jena-arq/src/test/java/org/apache/jena/query/util/TestUnionDatasetCollector.java +++ b/jena-arq/src/test/java/org/apache/jena/query/util/TestUnionDatasetCollector.java @@ -5,10 +5,13 @@ import static org.apache.jena.sparql.sse.SSE.parseGraph; import java.util.stream.Stream; +import org.apache.jena.atlas.iterator.Iter; import org.apache.jena.graph.Graph; +import org.apache.jena.graph.NodeFactory; import org.apache.jena.query.Dataset; import org.apache.jena.query.DatasetFactory; import org.apache.jena.rdf.model.Model; +import org.junit.Assert; import org.junit.Test; public class TestUnionDatasetCollector extends TestDatasetCollector { @@ -19,14 +22,24 @@ public class TestUnionDatasetCollector extends TestDatasetCollector { } @Test - public void collectingOneDatasetGivesOneDataset() { - Graph graph = parseGraph("(graph (triple <s1> <p1> <o1> ))"); - Model model = createModelForGraph(graph); - Dataset dataset = DatasetFactory.create(model); - Dataset collection = Stream.<Dataset>builder().add(dataset).build().collect(testInstance()); - assertTrue(dataset.getDefaultModel().isIsomorphicWith(collection.getDefaultModel())); - dataset.listNames().forEachRemaining(graphName -> assertTrue( - dataset.getNamedModel(graphName).isIsomorphicWith(collection.getNamedModel(graphName)))); - } + public void testUnion() { + final Graph g1 = parseGraph("(graph (triple <s1> <p1> <o1> ))"); + final Model m1 = createModelForGraph(g1); + final Dataset dsg1 = DatasetFactory.create(m1); + final String graphName1 = NodeFactory.createBlankNode().toString(); + dsg1.addNamedModel(graphName1, m1); + final Graph g2 = parseGraph("(graph (triple <s2> <p2> <o2> ))"); + final Dataset dsg2 = DatasetFactory.create(createModelForGraph(g2)); + final Model m2 = createModelForGraph(g2); + final String graphName2 = NodeFactory.createBlankNode().toString(); + dsg2.addNamedModel(graphName2, m2); + Dataset dataset = Stream.<Dataset>builder().add(dsg1).add(dsg2).build().collect(testInstance()); + assertEquals(2, Iter.count(dataset.listNames())); + assertTrue(m1.isIsomorphicWith(dataset.getNamedModel(graphName1))); + assertTrue(m2.isIsomorphicWith(dataset.getNamedModel(graphName2))); + m1.listStatements().mapWith(dataset.getDefaultModel()::contains).forEachRemaining(Assert::assertTrue); + m2.listStatements().mapWith(dataset.getDefaultModel()::contains).forEachRemaining(Assert::assertTrue); + } + }
