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 | 31 |
1 files changed, 18 insertions, 13 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 01d20d3e..854817b1 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 | |||
@@ -54,7 +54,8 @@ public class RelationalRuntimeContext implements IQueryRuntimeContext { | |||
54 | 54 | ||
55 | @Override | 55 | @Override |
56 | public boolean isIndexed(IInputKey key, IndexingService service) { | 56 | public boolean isIndexed(IInputKey key, IndexingService service) { |
57 | if (key instanceof AnyRelationView relationalKey) { | 57 | if (key instanceof RelationViewWrapper wrapper) { |
58 | var relationalKey = wrapper.getWrappedKey(); | ||
58 | return this.modelUpdateListener.containsRelationView(relationalKey); | 59 | return this.modelUpdateListener.containsRelationView(relationalKey); |
59 | } else { | 60 | } else { |
60 | return false; | 61 | return false; |
@@ -83,10 +84,7 @@ public class RelationalRuntimeContext implements IQueryRuntimeContext { | |||
83 | 84 | ||
84 | @Override | 85 | @Override |
85 | public int countTuples(IInputKey key, TupleMask seedMask, ITuple seed) { | 86 | public int countTuples(IInputKey key, TupleMask seedMask, ITuple seed) { |
86 | var relationViewKey = checkKey(key); | 87 | Iterator<Object[]> iterator = enumerate(key, seedMask, seed).iterator(); |
87 | Iterable<Object[]> allObjects = relationViewKey.getAll(model); | ||
88 | Iterable<Object[]> filteredBySeed = filter(allObjects, objectArray -> isMatching(objectArray, seedMask, seed)); | ||
89 | Iterator<Object[]> iterator = filteredBySeed.iterator(); | ||
90 | int result = 0; | 88 | int result = 0; |
91 | while (iterator.hasNext()) { | 89 | while (iterator.hasNext()) { |
92 | iterator.next(); | 90 | iterator.next(); |
@@ -102,13 +100,25 @@ public class RelationalRuntimeContext implements IQueryRuntimeContext { | |||
102 | 100 | ||
103 | @Override | 101 | @Override |
104 | public Iterable<Tuple> enumerateTuples(IInputKey key, TupleMask seedMask, ITuple seed) { | 102 | public Iterable<Tuple> enumerateTuples(IInputKey key, TupleMask seedMask, ITuple seed) { |
103 | var filteredBySeed = enumerate(key, seedMask, seed); | ||
104 | return map(filteredBySeed, Tuples::flatTupleOf); | ||
105 | } | ||
106 | |||
107 | @Override | ||
108 | public Iterable<?> enumerateValues(IInputKey key, TupleMask seedMask, ITuple seed) { | ||
109 | var index = seedMask.getFirstOmittedIndex().orElseThrow( | ||
110 | () -> new IllegalArgumentException("Seed mask does not omit a value")); | ||
111 | var filteredBySeed = enumerate(key, seedMask, seed); | ||
112 | return map(filteredBySeed, array -> array[index]); | ||
113 | } | ||
114 | |||
115 | private Iterable<Object[]> enumerate(IInputKey key, TupleMask seedMask, ITuple seed) { | ||
105 | var relationViewKey = checkKey(key); | 116 | var relationViewKey = checkKey(key); |
106 | Iterable<Object[]> allObjects = relationViewKey.getAll(model); | 117 | Iterable<Object[]> allObjects = relationViewKey.getAll(model); |
107 | Iterable<Object[]> filteredBySeed = filter(allObjects, objectArray -> isMatching(objectArray, seedMask, seed)); | 118 | return filter(allObjects, objectArray -> isMatching(objectArray, seedMask, seed)); |
108 | return map(filteredBySeed, Tuples::flatTupleOf); | ||
109 | } | 119 | } |
110 | 120 | ||
111 | private boolean isMatching(Object[] tuple, TupleMask seedMask, ITuple seed) { | 121 | private static boolean isMatching(Object[] tuple, TupleMask seedMask, ITuple seed) { |
112 | for (int i = 0; i < seedMask.indices.length; i++) { | 122 | for (int i = 0; i < seedMask.indices.length; i++) { |
113 | final Object seedElement = seed.get(i); | 123 | final Object seedElement = seed.get(i); |
114 | final Object tupleElement = tuple[seedMask.indices[i]]; | 124 | final Object tupleElement = tuple[seedMask.indices[i]]; |
@@ -120,11 +130,6 @@ public class RelationalRuntimeContext implements IQueryRuntimeContext { | |||
120 | } | 130 | } |
121 | 131 | ||
122 | @Override | 132 | @Override |
123 | public Iterable<?> enumerateValues(IInputKey key, TupleMask seedMask, ITuple seed) { | ||
124 | return enumerateTuples(key, seedMask, seed); | ||
125 | } | ||
126 | |||
127 | @Override | ||
128 | public boolean containsTuple(IInputKey key, ITuple seed) { | 133 | public boolean containsTuple(IInputKey key, ITuple seed) { |
129 | var relationViewKey = checkKey(key); | 134 | var relationViewKey = checkKey(key); |
130 | return relationViewKey.get(model, seed.getElements()); | 135 | return relationViewKey.get(model, seed.getElements()); |