diff options
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.java | 33 |
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 | */ |
6 | package tools.refinery.store.query.viatra.internal.context; | 6 | package tools.refinery.store.query.viatra.internal.context; |
7 | 7 | ||
8 | import org.eclipse.viatra.query.runtime.matchers.context.*; | 8 | import tools.refinery.viatra.runtime.CancellationToken; |
9 | import org.eclipse.viatra.query.runtime.matchers.tuple.ITuple; | 9 | import tools.refinery.viatra.runtime.matchers.context.*; |
10 | import org.eclipse.viatra.query.runtime.matchers.tuple.Tuple; | 10 | import tools.refinery.viatra.runtime.matchers.tuple.ITuple; |
11 | import org.eclipse.viatra.query.runtime.matchers.tuple.TupleMask; | 11 | import tools.refinery.viatra.runtime.matchers.tuple.Tuple; |
12 | import org.eclipse.viatra.query.runtime.matchers.tuple.Tuples; | 12 | import tools.refinery.viatra.runtime.matchers.tuple.TupleMask; |
13 | import org.eclipse.viatra.query.runtime.matchers.util.Accuracy; | 13 | import tools.refinery.viatra.runtime.matchers.tuple.Tuples; |
14 | import tools.refinery.viatra.runtime.matchers.util.Accuracy; | ||
14 | import tools.refinery.store.model.Model; | 15 | import tools.refinery.store.model.Model; |
15 | import tools.refinery.store.query.viatra.internal.ViatraModelQueryAdapterImpl; | 16 | import tools.refinery.store.query.viatra.internal.ViatraModelQueryAdapterImpl; |
16 | import tools.refinery.store.query.viatra.internal.pquery.SymbolViewWrapper; | 17 | import 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 | } |