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 ++--- .../tools/refinery/store/query/EmptyResultSet.java | 8 ++-- .../java/tools/refinery/store/query/ResultSet.java | 5 +-- .../java/tools/refinery/store/map/Cursors.java | 36 ++++++++++++++++++ 6 files changed, 94 insertions(+), 17 deletions(-) create mode 100644 subprojects/store-query-viatra/src/main/java/tools/refinery/store/query/viatra/internal/pquery/ResultSetCursor.java create mode 100644 subprojects/store/src/main/java/tools/refinery/store/map/Cursors.java 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); diff --git a/subprojects/store-query/src/main/java/tools/refinery/store/query/EmptyResultSet.java b/subprojects/store-query/src/main/java/tools/refinery/store/query/EmptyResultSet.java index 0c2e07d6..9ff6df26 100644 --- a/subprojects/store-query/src/main/java/tools/refinery/store/query/EmptyResultSet.java +++ b/subprojects/store-query/src/main/java/tools/refinery/store/query/EmptyResultSet.java @@ -1,9 +1,9 @@ package tools.refinery.store.query; +import tools.refinery.store.map.Cursor; +import tools.refinery.store.map.Cursors; import tools.refinery.store.tuple.TupleLike; -import java.util.stream.Stream; - public class EmptyResultSet implements ResultSet { @Override public boolean hasResult(TupleLike parameters) { @@ -11,8 +11,8 @@ public class EmptyResultSet implements ResultSet { } @Override - public Stream allResults() { - return Stream.of(); + public Cursor allResults() { + return Cursors.empty(); } @Override diff --git a/subprojects/store-query/src/main/java/tools/refinery/store/query/ResultSet.java b/subprojects/store-query/src/main/java/tools/refinery/store/query/ResultSet.java index 407cf075..d2b8c9dd 100644 --- a/subprojects/store-query/src/main/java/tools/refinery/store/query/ResultSet.java +++ b/subprojects/store-query/src/main/java/tools/refinery/store/query/ResultSet.java @@ -1,9 +1,8 @@ package tools.refinery.store.query; +import tools.refinery.store.map.Cursor; import tools.refinery.store.tuple.TupleLike; -import java.util.stream.Stream; - public interface ResultSet { default boolean hasResult() { return countResults() > 0; @@ -11,7 +10,7 @@ public interface ResultSet { boolean hasResult(TupleLike parameters); - Stream allResults(); + Cursor allResults(); int countResults(); } diff --git a/subprojects/store/src/main/java/tools/refinery/store/map/Cursors.java b/subprojects/store/src/main/java/tools/refinery/store/map/Cursors.java new file mode 100644 index 00000000..fc8e628b --- /dev/null +++ b/subprojects/store/src/main/java/tools/refinery/store/map/Cursors.java @@ -0,0 +1,36 @@ +package tools.refinery.store.map; + +public final class Cursors { + private Cursors() { + throw new IllegalStateException("This is a static utility class and should not be instantiated directly"); + } + + public static Cursor empty() { + return new Empty<>(); + } + + private static class Empty implements Cursor { + private boolean terminated = false; + + @Override + public K getKey() { + return null; + } + + @Override + public V getValue() { + return null; + } + + @Override + public boolean isTerminated() { + return terminated; + } + + @Override + public boolean move() { + terminated = true; + return false; + } + } +} -- cgit v1.2.3-70-g09d2