aboutsummaryrefslogtreecommitdiffstats
path: root/subprojects/store-query-viatra
diff options
context:
space:
mode:
authorLibravatar Kristóf Marussy <kristof@marussy.com>2023-03-01 21:20:10 +0100
committerLibravatar Kristóf Marussy <kristof@marussy.com>2023-03-01 21:20:10 +0100
commit2bf484cd882949c53a82c40e28319f74ef8ae477 (patch)
tree083eb6793b0fc6fd77f402c51cd5579cfa4c56a2 /subprojects/store-query-viatra
parentrefactor: more direct access to VIATRA result set (diff)
downloadrefinery-2bf484cd882949c53a82c40e28319f74ef8ae477.tar.gz
refinery-2bf484cd882949c53a82c40e28319f74ef8ae477.tar.zst
refinery-2bf484cd882949c53a82c40e28319f74ef8ae477.zip
refactor: use Cursor in query result sets
Diffstat (limited to 'subprojects/store-query-viatra')
-rw-r--r--subprojects/store-query-viatra/src/main/java/tools/refinery/store/query/viatra/internal/pquery/RawPatternMatcher.java10
-rw-r--r--subprojects/store-query-viatra/src/main/java/tools/refinery/store/query/viatra/internal/pquery/ResultSetCursor.java43
-rw-r--r--subprojects/store-query-viatra/src/test/java/tools/refinery/store/query/viatra/QueryTest.java9
3 files changed, 52 insertions, 10 deletions
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;
9import org.eclipse.viatra.query.runtime.matchers.tuple.Tuples; 9import org.eclipse.viatra.query.runtime.matchers.tuple.Tuples;
10import org.eclipse.viatra.query.runtime.rete.index.Indexer; 10import org.eclipse.viatra.query.runtime.rete.index.Indexer;
11import org.eclipse.viatra.query.runtime.rete.matcher.RetePatternMatcher; 11import org.eclipse.viatra.query.runtime.rete.matcher.RetePatternMatcher;
12import tools.refinery.store.map.Cursor;
13import tools.refinery.store.map.Cursors;
12import tools.refinery.store.query.ResultSet; 14import tools.refinery.store.query.ResultSet;
13import tools.refinery.store.query.viatra.ViatraTupleLike; 15import tools.refinery.store.query.viatra.ViatraTupleLike;
14import tools.refinery.store.tuple.Tuple; 16import tools.refinery.store.tuple.Tuple;
15import tools.refinery.store.tuple.TupleLike; 17import tools.refinery.store.tuple.TupleLike;
16 18
17import java.util.stream.Stream;
18
19/** 19/**
20 * Directly access the tuples inside a VIATRA pattern matcher.<p> 20 * Directly access the tuples inside a VIATRA pattern matcher.<p>
21 * This class neglects calling 21 * This class neglects calling
@@ -64,12 +64,12 @@ public class RawPatternMatcher extends GenericPatternMatcher implements ResultSe
64 } 64 }
65 65
66 @Override 66 @Override
67 public Stream<TupleLike> allResults() { 67 public Cursor<TupleLike, Boolean> allResults() {
68 if (emptyMaskIndexer == null) { 68 if (emptyMaskIndexer == null) {
69 return backend.getAllMatches(empty).map(ViatraTupleLike::new); 69 return new ResultSetCursor(backend.getAllMatches(empty).iterator());
70 } 70 }
71 var matches = emptyMaskIndexer.get(Tuples.staticArityFlatTupleOf()); 71 var matches = emptyMaskIndexer.get(Tuples.staticArityFlatTupleOf());
72 return matches == null ? Stream.of() : matches.stream().map(ViatraTupleLike::new); 72 return matches == null ? Cursors.empty() : new ResultSetCursor(matches.stream().iterator());
73 } 73 }
74 74
75 @Override 75 @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 @@
1package tools.refinery.store.query.viatra.internal.pquery;
2
3import org.eclipse.viatra.query.runtime.matchers.tuple.ITuple;
4import tools.refinery.store.map.Cursor;
5import tools.refinery.store.query.viatra.ViatraTupleLike;
6import tools.refinery.store.tuple.TupleLike;
7
8import java.util.Iterator;
9
10class ResultSetCursor implements Cursor<TupleLike, Boolean> {
11 private final Iterator<? extends ITuple> tuplesIterator;
12 private boolean terminated;
13 private TupleLike key;
14
15 public ResultSetCursor(Iterator<? extends ITuple> tuplesIterator) {
16 this.tuplesIterator = tuplesIterator;
17 }
18
19 @Override
20 public TupleLike getKey() {
21 return key;
22 }
23
24 @Override
25 public Boolean getValue() {
26 return true;
27 }
28
29 @Override
30 public boolean isTerminated() {
31 return terminated;
32 }
33
34 @Override
35 public boolean move() {
36 if (!terminated && tuplesIterator.hasNext()) {
37 key = new ViatraTupleLike(tuplesIterator.next());
38 return true;
39 }
40 terminated = true;
41 return false;
42 }
43}
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 @@
1package tools.refinery.store.query.viatra; 1package tools.refinery.store.query.viatra;
2 2
3import org.junit.jupiter.api.Test; 3import org.junit.jupiter.api.Test;
4import tools.refinery.store.map.Cursor;
4import tools.refinery.store.model.ModelStore; 5import tools.refinery.store.model.ModelStore;
5import tools.refinery.store.query.Dnf; 6import tools.refinery.store.query.Dnf;
6import tools.refinery.store.query.ModelQuery; 7import tools.refinery.store.query.ModelQuery;
@@ -14,7 +15,6 @@ import tools.refinery.store.tuple.TupleLike;
14 15
15import java.util.HashSet; 16import java.util.HashSet;
16import java.util.Set; 17import java.util.Set;
17import java.util.stream.Stream;
18 18
19import static org.junit.jupiter.api.Assertions.*; 19import static org.junit.jupiter.api.Assertions.*;
20import static tools.refinery.store.query.literal.Literals.not; 20import static tools.refinery.store.query.literal.Literals.not;
@@ -712,11 +712,10 @@ class QueryTest {
712 assertThrows(IllegalArgumentException.class, () -> queryBuilder.queries(predicate)); 712 assertThrows(IllegalArgumentException.class, () -> queryBuilder.queries(predicate));
713 } 713 }
714 714
715 static void compareMatchSets(Stream<TupleLike> matchSet, Set<Tuple> expected) { 715 private static void compareMatchSets(Cursor<TupleLike, Boolean> cursor, Set<Tuple> expected) {
716 Set<Tuple> translatedMatchSet = new HashSet<>(); 716 Set<Tuple> translatedMatchSet = new HashSet<>();
717 var iterator = matchSet.iterator(); 717 while (cursor.move()) {
718 while (iterator.hasNext()) { 718 var element = cursor.getKey();
719 var element = iterator.next();
720 translatedMatchSet.add(element.toTuple()); 719 translatedMatchSet.add(element.toTuple());
721 } 720 }
722 assertEquals(expected, translatedMatchSet); 721 assertEquals(expected, translatedMatchSet);