aboutsummaryrefslogtreecommitdiffstats
path: root/subprojects/store-query-viatra/src/main/java/tools/refinery/store/query/viatra/internal/context/RelationalRuntimeContext.java
diff options
context:
space:
mode:
Diffstat (limited to 'subprojects/store-query-viatra/src/main/java/tools/refinery/store/query/viatra/internal/context/RelationalRuntimeContext.java')
-rw-r--r--subprojects/store-query-viatra/src/main/java/tools/refinery/store/query/viatra/internal/context/RelationalRuntimeContext.java33
1 files changed, 26 insertions, 7 deletions
diff --git a/subprojects/store-query-viatra/src/main/java/tools/refinery/store/query/viatra/internal/context/RelationalRuntimeContext.java b/subprojects/store-query-viatra/src/main/java/tools/refinery/store/query/viatra/internal/context/RelationalRuntimeContext.java
index 0f2daca8..dadab5dd 100644
--- a/subprojects/store-query-viatra/src/main/java/tools/refinery/store/query/viatra/internal/context/RelationalRuntimeContext.java
+++ b/subprojects/store-query-viatra/src/main/java/tools/refinery/store/query/viatra/internal/context/RelationalRuntimeContext.java
@@ -5,12 +5,13 @@
5 */ 5 */
6package tools.refinery.store.query.viatra.internal.context; 6package tools.refinery.store.query.viatra.internal.context;
7 7
8import org.eclipse.viatra.query.runtime.matchers.context.*; 8import tools.refinery.viatra.runtime.CancellationToken;
9import org.eclipse.viatra.query.runtime.matchers.tuple.ITuple; 9import tools.refinery.viatra.runtime.matchers.context.*;
10import org.eclipse.viatra.query.runtime.matchers.tuple.Tuple; 10import tools.refinery.viatra.runtime.matchers.tuple.ITuple;
11import org.eclipse.viatra.query.runtime.matchers.tuple.TupleMask; 11import tools.refinery.viatra.runtime.matchers.tuple.Tuple;
12import org.eclipse.viatra.query.runtime.matchers.tuple.Tuples; 12import tools.refinery.viatra.runtime.matchers.tuple.TupleMask;
13import org.eclipse.viatra.query.runtime.matchers.util.Accuracy; 13import tools.refinery.viatra.runtime.matchers.tuple.Tuples;
14import tools.refinery.viatra.runtime.matchers.util.Accuracy;
14import tools.refinery.store.model.Model; 15import tools.refinery.store.model.Model;
15import tools.refinery.store.query.viatra.internal.ViatraModelQueryAdapterImpl; 16import tools.refinery.store.query.viatra.internal.ViatraModelQueryAdapterImpl;
16import tools.refinery.store.query.viatra.internal.pquery.SymbolViewWrapper; 17import tools.refinery.store.query.viatra.internal.pquery.SymbolViewWrapper;
@@ -32,10 +33,13 @@ public class RelationalRuntimeContext implements IQueryRuntimeContext {
32 33
33 private final Model model; 34 private final Model model;
34 35
36 private final CancellationToken cancellationToken;
37
35 RelationalRuntimeContext(ViatraModelQueryAdapterImpl adapter) { 38 RelationalRuntimeContext(ViatraModelQueryAdapterImpl adapter) {
36 model = adapter.getModel(); 39 model = adapter.getModel();
37 metaContext = new RelationalQueryMetaContext(adapter.getStoreAdapter().getInputKeys()); 40 metaContext = new RelationalQueryMetaContext(adapter.getStoreAdapter().getInputKeys());
38 modelUpdateListener = new ModelUpdateListener(adapter); 41 modelUpdateListener = new ModelUpdateListener(adapter);
42 cancellationToken = adapter.getCancellationToken();
39 } 43 }
40 44
41 @Override 45 @Override
@@ -119,10 +123,20 @@ public class RelationalRuntimeContext implements IQueryRuntimeContext {
119 123
120 private Iterable<Object[]> enumerate(IInputKey key, TupleMask seedMask, ITuple seed) { 124 private Iterable<Object[]> enumerate(IInputKey key, TupleMask seedMask, ITuple seed) {
121 var relationViewKey = checkKey(key); 125 var relationViewKey = checkKey(key);
122 Iterable<Object[]> allObjects = relationViewKey.getAll(model); 126 Iterable<Object[]> allObjects = getAllObjects(relationViewKey, seedMask, seed);
123 return filter(allObjects, objectArray -> isMatching(objectArray, seedMask, seed)); 127 return filter(allObjects, objectArray -> isMatching(objectArray, seedMask, seed));
124 } 128 }
125 129
130 private Iterable<Object[]> getAllObjects(AnySymbolView key, TupleMask seedMask, ITuple seed) {
131 for (int i = 0; i < seedMask.indices.length; i++) {
132 int slot = seedMask.indices[i];
133 if (key.canIndexSlot(slot)) {
134 return key.getAdjacent(model, slot, seed.get(i));
135 }
136 }
137 return key.getAll(model);
138 }
139
126 private static boolean isMatching(Object[] tuple, TupleMask seedMask, ITuple seed) { 140 private static boolean isMatching(Object[] tuple, TupleMask seedMask, ITuple seed) {
127 for (int i = 0; i < seedMask.indices.length; i++) { 141 for (int i = 0; i < seedMask.indices.length; i++) {
128 final Object seedElement = seed.get(i); 142 final Object seedElement = seed.get(i);
@@ -182,4 +196,9 @@ public class RelationalRuntimeContext implements IQueryRuntimeContext {
182 public void executeAfterTraversal(Runnable runnable) { 196 public void executeAfterTraversal(Runnable runnable) {
183 runnable.run(); 197 runnable.run();
184 } 198 }
199
200 @Override
201 public CancellationToken getCancellationToken() {
202 return cancellationToken;
203 }
185} 204}