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