Minor refactoring
Project: http://git-wip-us.apache.org/repos/asf/jena/repo Commit: http://git-wip-us.apache.org/repos/asf/jena/commit/388583cb Tree: http://git-wip-us.apache.org/repos/asf/jena/tree/388583cb Diff: http://git-wip-us.apache.org/repos/asf/jena/diff/388583cb Branch: refs/heads/master Commit: 388583cb34ed02f3a071fb61db9bd6e6aad2983a Parents: f68776b Author: ajs6f <[email protected]> Authored: Sun Nov 19 16:37:54 2017 -0500 Committer: ajs6f <[email protected]> Committed: Fri Jan 5 09:26:07 2018 -0500 ---------------------------------------------------------------------- .../jena/atlas/lib/IdentityFinishCollector.java | 14 ++- .../apache/jena/util/TestModelCollector.java | 113 +++++++++++++++++++ 2 files changed, 122 insertions(+), 5 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/jena/blob/388583cb/jena-base/src/main/java/org/apache/jena/atlas/lib/IdentityFinishCollector.java ---------------------------------------------------------------------- diff --git a/jena-base/src/main/java/org/apache/jena/atlas/lib/IdentityFinishCollector.java b/jena-base/src/main/java/org/apache/jena/atlas/lib/IdentityFinishCollector.java index 2386b4b..6d9fc47 100644 --- a/jena-base/src/main/java/org/apache/jena/atlas/lib/IdentityFinishCollector.java +++ b/jena-base/src/main/java/org/apache/jena/atlas/lib/IdentityFinishCollector.java @@ -12,8 +12,6 @@ import org.apache.jena.ext.com.google.common.collect.ImmutableSet; public interface IdentityFinishCollector<T, A> extends Collector<T, A, A> { - static Set<Characteristics> CHARACTERISTICS = ImmutableSet.of(IDENTITY_FINISH); - @Override default Function<A, A> finisher() { return Function.identity(); @@ -21,17 +19,23 @@ public interface IdentityFinishCollector<T, A> extends Collector<T, A, A> { @Override default Set<Characteristics> characteristics() { - return CHARACTERISTICS; + return ImmutableSet.of(IDENTITY_FINISH); } public interface UnorderedIdentityFinishCollector<T, A> extends IdentityFinishCollector<T, A> { - static Set<Characteristics> CHARACTERISTICS = ImmutableSet.of(UNORDERED, IDENTITY_FINISH); + @Override + default Set<Characteristics> characteristics() { + return ImmutableSet.of(UNORDERED, IDENTITY_FINISH); + } } public interface ConcurrentUnorderedIdentityFinishCollector<T, A> extends UnorderedIdentityFinishCollector<T, A> { - static Set<Characteristics> CHARACTERISTICS = ImmutableSet.of(UNORDERED, IDENTITY_FINISH); + @Override + default Set<Characteristics> characteristics() { + return ImmutableSet.of(CONCURRENT, UNORDERED, IDENTITY_FINISH); + } } } http://git-wip-us.apache.org/repos/asf/jena/blob/388583cb/jena-core/src/test/java/org/apache/jena/util/TestModelCollector.java ---------------------------------------------------------------------- diff --git a/jena-core/src/test/java/org/apache/jena/util/TestModelCollector.java b/jena-core/src/test/java/org/apache/jena/util/TestModelCollector.java new file mode 100644 index 0000000..157b6ba --- /dev/null +++ b/jena-core/src/test/java/org/apache/jena/util/TestModelCollector.java @@ -0,0 +1,113 @@ +package org.apache.jena.util; + +import static java.util.Collections.singleton; +import static java.util.stream.Collector.Characteristics.*; +import static java.util.stream.Collectors.groupingBy; +import static java.util.stream.Stream.generate; +import static java.util.stream.Stream.iterate; +import static org.apache.jena.ext.com.google.common.collect.Lists.newArrayList; +import static org.apache.jena.graph.NodeFactory.createLiteralByValue; +import static org.apache.jena.rdf.model.ModelFactory.createDefaultModel; +import static org.apache.jena.rdf.model.ModelFactory.createModelForGraph; + +import java.util.*; +import java.util.concurrent.atomic.AtomicInteger; +import java.util.function.Supplier; +import java.util.stream.Collector.Characteristics; +import java.util.stream.Stream; + +import org.apache.jena.atlas.junit.BaseTest; +import org.apache.jena.datatypes.RDFDatatype; +import org.apache.jena.datatypes.TypeMapper; +import org.apache.jena.ext.com.google.common.collect.ImmutableSet; +import org.apache.jena.graph.*; +import org.apache.jena.graph.impl.CollectionGraph; +import org.apache.jena.rdf.model.Model; +import org.apache.jena.rdf.model.ModelFactory; +import org.apache.jena.util.ModelCollector.*; +import org.junit.Test; + +public class TestModelCollector extends BaseTest { + + private static final Model EMPTY_MODEL = ModelFactory.createDefaultModel(); + private static final Node PREDICATE = NodeFactory.createURI("p"); + private static final Node SUBJECT = NodeFactory.createURI("s"); + private static final RDFDatatype INTEGER_TYPE = TypeMapper.getInstance().getTypeByValue(555); + + @Test + public void testCharacteristics() { + Set<Characteristics> characteristics = ImmutableSet.of(UNORDERED, IDENTITY_FINISH); + assertEquals(characteristics, new UnionModelCollector().characteristics()); + assertEquals(characteristics, new IntersectionModelCollector().characteristics()); + characteristics = ImmutableSet.of(CONCURRENT, UNORDERED, IDENTITY_FINISH); + assertEquals(characteristics, new ConcurrentModelCollector(null).characteristics()); + } + + Stream<Model> fromTriples(Supplier<Triple> kernel, byte size) { + AtomicInteger count = new AtomicInteger(); + return generate(kernel).collect(groupingBy(x -> count.incrementAndGet() / size)).values().stream() + .map(CollectionGraph::new).map(ModelFactory::createModelForGraph); + } + + private static void test(Stream<Model> data, Model expectedResults, ModelCollector testCollector) { + assertTrue(data.collect(testCollector).isIsomorphicWith(expectedResults)); + } + + @Test + public void unionOfEmptyStreamOfModelsIsEmpty() { + collectors().forEach(this::unionOfEmptyStreamOfModelsIsEmpty); + } + + private void unionOfEmptyStreamOfModelsIsEmpty(ModelCollector testCollector) { + assertTrue(Stream.<Model>empty().collect(testCollector).isEmpty()); + } + + private static ArrayList<ModelCollector> concurrentCollectors() { + return newArrayList(new UnionModelCollector().concurrent(), new IntersectionModelCollector().concurrent()); + } + + private static ArrayList<ModelCollector> collectors() { + return newArrayList(new UnionModelCollector(), new IntersectionModelCollector()); + } + + @Test + public void unionOfStreamOfEmptyModelsIsEmpty() { + collectors().forEach(this::unionOfStreamOfEmptyModelsIsEmpty); + + } + + private void unionOfStreamOfEmptyModelsIsEmpty(ModelCollector testCollector) { + Stream<Model> models = numbers().limit(10).map(x -> createDefaultModel()); + test(models, EMPTY_MODEL, testCollector); + } + + private Triple sampleFromNum(int i) { + return Triple.create(SUBJECT, PREDICATE, createLiteralByValue(i, INTEGER_TYPE)); + } + + @Test + public void allStatementsPresentInUnionOfDisjointModels() { + ModelCollector testCollector = new UnionModelCollector(); + Model expectedResults = createDefaultModel(); + Stream<Triple> addTestStatementsToRubric = numbers().limit(10).map(this::sampleFromNum) + .peek(t -> expectedResults.add(expectedResults.asStatement(t))); + Stream<Model> models = addTestStatementsToRubric.map(this::intoModel); + test(models, expectedResults, testCollector); + } + + private static Stream<Integer> numbers() { + return generate(new AtomicInteger()::getAndIncrement); + } + + @Test + public void noStatementsPresentInIntersectionOfDisjointModels() { + ModelCollector testCollector = new IntersectionModelCollector(); + Stream<Model> models = iterate(0, i -> i + 1).limit(10).map(this::sampleFromNum).map(this::intoModel); + test(models, EMPTY_MODEL, testCollector); + } + + private Model intoModel(Triple t) { + return createModelForGraph(new CollectionGraph(singleton(t))); + } + +}
