aboutsummaryrefslogtreecommitdiffstats
path: root/subprojects/store-query-viatra/src/main/java/tools/refinery/store/query/viatra/internal/viewupdate/ViewUpdateTranslator.java
blob: 2f7f9a9c7a6fe3cc29d90f46da0f8e1eba6be1ad (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
package tools.refinery.store.query.viatra.internal.viewupdate;

import org.eclipse.viatra.query.runtime.matchers.context.IQueryRuntimeContextListener;
import org.eclipse.viatra.query.runtime.matchers.tuple.ITuple;
import org.eclipse.viatra.query.runtime.matchers.tuple.Tuples;
import tools.refinery.store.model.Tuple;
import tools.refinery.store.query.view.RelationView;

import java.util.Objects;

public class ViewUpdateTranslator<D> {
	private final RelationView<D> key;

	private final ITuple filter;

	private final IQueryRuntimeContextListener listener;

	public ViewUpdateTranslator(RelationView<D> key, ITuple filter, IQueryRuntimeContextListener listener) {
		super();
		this.key = key;
		this.filter = filter;
		this.listener = listener;
	}

	public boolean equals(RelationView<?> relationView, ITuple seed, IQueryRuntimeContextListener listener) {
		return key == relationView && filter.equals(seed) && this.listener == listener;
	}

	public void processChange(ViewUpdate change) {
		listener.update(key, Tuples.flatTupleOf(change.tuple()), change.isInsertion());
	}

	public Object[] isMatching(Tuple tuple, D value) {
		return isMatching(key.getWrappedKey().transform(tuple, value), filter);
	}

	@SuppressWarnings("squid:S1168")
	private Object[] isMatching(Object[] tuple, ITuple filter) {
		for (int i = 0; i < filter.getSize(); i++) {
			final Object filterObject = filter.get(i);
			if (filterObject != null && !filterObject.equals(tuple[i])) {
				return null;
			}
		}
		return tuple;
	}

	@Override
	public int hashCode() {
		return Objects.hash(filter, key, listener);
	}

	@Override
	public boolean equals(Object obj) {
		if (this == obj)
			return true;
		if (!(obj instanceof ViewUpdateTranslator<?> other))
			return false;
		return Objects.equals(filter, other.filter) && Objects.equals(key, other.key)
				&& Objects.equals(listener, other.listener);
	}
}