From 2bf484cd882949c53a82c40e28319f74ef8ae477 Mon Sep 17 00:00:00 2001 From: Kristóf Marussy Date: Wed, 1 Mar 2023 21:20:10 +0100 Subject: refactor: use Cursor in query result sets --- .../viatra/internal/pquery/RawPatternMatcher.java | 10 ++--- .../viatra/internal/pquery/ResultSetCursor.java | 43 ++++++++++++++++++++++ .../refinery/store/query/viatra/QueryTest.java | 9 ++--- 3 files changed, 52 insertions(+), 10 deletions(-) create mode 100644 subprojects/store-query-viatra/src/main/java/tools/refinery/store/query/viatra/internal/pquery/ResultSetCursor.java (limited to 'subprojects/store-query-viatra/src') diff --git a/subprojects/store-query-viatra/src/main/java/tools/refinery/store/query/viatra/internal/pquery/RawPatternMatcher.java b/subprojects/store-query-viatra/src/main/java/tools/refinery/store/query/viatra/internal/pquery/RawPatternMatcher.java index 8f56586e..5924ff15 100644 --- a/subprojects/store-query-viatra/src/main/java/tools/refinery/store/query/viatra/internal/pquery/RawPatternMatcher.java +++ b/subprojects/store-query-viatra/src/main/java/tools/refinery/store/query/viatra/internal/pquery/RawPatternMatcher.java @@ -9,13 +9,13 @@ import org.eclipse.viatra.query.runtime.matchers.tuple.TupleMask; import org.eclipse.viatra.query.runtime.matchers.tuple.Tuples; import org.eclipse.viatra.query.runtime.rete.index.Indexer; import org.eclipse.viatra.query.runtime.rete.matcher.RetePatternMatcher; +import tools.refinery.store.map.Cursor; +import tools.refinery.store.map.Cursors; import tools.refinery.store.query.ResultSet; import tools.refinery.store.query.viatra.ViatraTupleLike; import tools.refinery.store.tuple.Tuple; import tools.refinery.store.tuple.TupleLike; -import java.util.stream.Stream; - /** * Directly access the tuples inside a VIATRA pattern matcher.

* This class neglects calling @@ -64,12 +64,12 @@ public class RawPatternMatcher extends GenericPatternMatcher implements ResultSe } @Override - public Stream allResults() { + public Cursor allResults() { if (emptyMaskIndexer == null) { - return backend.getAllMatches(empty).map(ViatraTupleLike::new); + return new ResultSetCursor(backend.getAllMatches(empty).iterator()); } var matches = emptyMaskIndexer.get(Tuples.staticArityFlatTupleOf()); - return matches == null ? Stream.of() : matches.stream().map(ViatraTupleLike::new); + return matches == null ? Cursors.empty() : new ResultSetCursor(matches.stream().iterator()); } @Override diff --git a/subprojects/store-query-viatra/src/main/java/tools/refinery/store/query/viatra/internal/pquery/ResultSetCursor.java b/subprojects/store-query-viatra/src/main/java/tools/refinery/store/query/viatra/internal/pquery/ResultSetCursor.java new file mode 100644 index 00000000..5e6d1970 --- /dev/null +++ b/subprojects/store-query-viatra/src/main/java/tools/refinery/store/query/viatra/internal/pquery/ResultSetCursor.java @@ -0,0 +1,43 @@ +package tools.refinery.store.query.viatra.internal.pquery; + +import org.eclipse.viatra.query.runtime.matchers.tuple.ITuple; +import tools.refinery.store.map.Cursor; +import tools.refinery.store.query.viatra.ViatraTupleLike; +import tools.refinery.store.tuple.TupleLike; + +import java.util.Iterator; + +class ResultSetCursor implements Cursor { + private final Iterator tuplesIterator; + private boolean terminated; + private TupleLike key; + + public ResultSetCursor(Iterator tuplesIterator) { + this.tuplesIterator = tuplesIterator; + } + + @Override + public TupleLike getKey() { + return key; + } + + @Override + public Boolean getValue() { + return true; + } + + @Override + public boolean isTerminated() { + return terminated; + } + + @Override + public boolean move() { + if (!terminated && tuplesIterator.hasNext()) { + key = new ViatraTupleLike(tuplesIterator.next()); + return true; + } + terminated = true; + return false; + } +} diff --git a/subprojects/store-query-viatra/src/test/java/tools/refinery/store/query/viatra/QueryTest.java b/subprojects/store-query-viatra/src/test/java/tools/refinery/store/query/viatra/QueryTest.java index 3dd517c4..8b25419d 100644 --- a/subprojects/store-query-viatra/src/test/java/tools/refinery/store/query/viatra/QueryTest.java +++ b/subprojects/store-query-viatra/src/test/java/tools/refinery/store/query/viatra/QueryTest.java @@ -1,6 +1,7 @@ package tools.refinery.store.query.viatra; import org.junit.jupiter.api.Test; +import tools.refinery.store.map.Cursor; import tools.refinery.store.model.ModelStore; import tools.refinery.store.query.Dnf; import tools.refinery.store.query.ModelQuery; @@ -14,7 +15,6 @@ import tools.refinery.store.tuple.TupleLike; import java.util.HashSet; import java.util.Set; -import java.util.stream.Stream; import static org.junit.jupiter.api.Assertions.*; import static tools.refinery.store.query.literal.Literals.not; @@ -712,11 +712,10 @@ class QueryTest { assertThrows(IllegalArgumentException.class, () -> queryBuilder.queries(predicate)); } - static void compareMatchSets(Stream matchSet, Set expected) { + private static void compareMatchSets(Cursor cursor, Set expected) { Set translatedMatchSet = new HashSet<>(); - var iterator = matchSet.iterator(); - while (iterator.hasNext()) { - var element = iterator.next(); + while (cursor.move()) { + var element = cursor.getKey(); translatedMatchSet.add(element.toTuple()); } assertEquals(expected, translatedMatchSet); -- cgit v1.2.3-70-g09d2