aboutsummaryrefslogtreecommitdiffstats
path: root/store/src/main/java/tools/refinery/data/query/internal/RelationUpdateListenerEntry.java
diff options
context:
space:
mode:
Diffstat (limited to 'store/src/main/java/tools/refinery/data/query/internal/RelationUpdateListenerEntry.java')
-rw-r--r--store/src/main/java/tools/refinery/data/query/internal/RelationUpdateListenerEntry.java64
1 files changed, 64 insertions, 0 deletions
diff --git a/store/src/main/java/tools/refinery/data/query/internal/RelationUpdateListenerEntry.java b/store/src/main/java/tools/refinery/data/query/internal/RelationUpdateListenerEntry.java
new file mode 100644
index 00000000..45be26b1
--- /dev/null
+++ b/store/src/main/java/tools/refinery/data/query/internal/RelationUpdateListenerEntry.java
@@ -0,0 +1,64 @@
1package tools.refinery.data.query.internal;
2
3import java.util.Arrays;
4import java.util.Objects;
5
6import org.eclipse.viatra.query.runtime.matchers.context.IQueryRuntimeContextListener;
7import org.eclipse.viatra.query.runtime.matchers.tuple.ITuple;
8import org.eclipse.viatra.query.runtime.matchers.tuple.Tuples;
9
10import tools.refinery.data.model.Tuple;
11import tools.refinery.data.query.view.RelationView;
12
13public class RelationUpdateListenerEntry<D> {
14 final RelationView<D> key;
15 final ITuple filter;
16 final IQueryRuntimeContextListener listener;
17
18 public RelationUpdateListenerEntry(RelationView<D> key, ITuple filter, IQueryRuntimeContextListener listener) {
19 super();
20 this.key = key;
21 this.filter = filter;
22 this.listener = listener;
23 }
24
25 public void processChange(Tuple tuple, D oldValue, D newValue) {
26 Object[] oldTuple = isMatching(key.getWrappedKey().transform(tuple, oldValue), filter);
27 Object[] newTuple = isMatching(key.getWrappedKey().transform(tuple, newValue), filter);
28
29 if(!Arrays.equals(oldTuple, newTuple)) {
30 if(oldTuple != null) {
31 listener.update(key, Tuples.flatTupleOf(oldTuple), false);
32 }
33 if(newTuple != null) {
34 listener.update(key, Tuples.flatTupleOf(newTuple), true);
35 }
36 }
37 }
38
39 private Object[] isMatching(Object[] tuple, ITuple filter) {
40 for(int i = 0; i<filter.getSize(); i++) {
41 final Object filterObject = filter.get(i);
42 if(filterObject != null && !filterObject.equals(tuple[i])) {
43 return null;
44 }
45 }
46 return tuple;
47 }
48
49 @Override
50 public int hashCode() {
51 return Objects.hash(filter, key, listener);
52 }
53
54 @Override
55 public boolean equals(Object obj) {
56 if (this == obj)
57 return true;
58 if (!(obj instanceof RelationUpdateListenerEntry))
59 return false;
60 RelationUpdateListenerEntry<?> other = (RelationUpdateListenerEntry<?>) obj;
61 return Objects.equals(filter, other.filter) && Objects.equals(key, other.key)
62 && Objects.equals(listener, other.listener);
63 }
64}