aboutsummaryrefslogtreecommitdiffstats
path: root/model-data/src/main/java/org/eclipse/viatra/solver/data/query/view
diff options
context:
space:
mode:
Diffstat (limited to 'model-data/src/main/java/org/eclipse/viatra/solver/data/query/view')
-rw-r--r--model-data/src/main/java/org/eclipse/viatra/solver/data/query/view/FilteredRelationView.java6
-rw-r--r--model-data/src/main/java/org/eclipse/viatra/solver/data/query/view/FunctionalRelationView.java6
-rw-r--r--model-data/src/main/java/org/eclipse/viatra/solver/data/query/view/RelationView.java76
3 files changed, 61 insertions, 27 deletions
diff --git a/model-data/src/main/java/org/eclipse/viatra/solver/data/query/view/FilteredRelationView.java b/model-data/src/main/java/org/eclipse/viatra/solver/data/query/view/FilteredRelationView.java
index 4602af21..bfa3d13a 100644
--- a/model-data/src/main/java/org/eclipse/viatra/solver/data/query/view/FilteredRelationView.java
+++ b/model-data/src/main/java/org/eclipse/viatra/solver/data/query/view/FilteredRelationView.java
@@ -11,7 +11,7 @@ public class FilteredRelationView<D> extends RelationView<D>{
11 private final BiPredicate<Tuple,D> predicate; 11 private final BiPredicate<Tuple,D> predicate;
12 12
13 public FilteredRelationView(Model model, Relation<D> representation, BiPredicate<Tuple,D> predicate) { 13 public FilteredRelationView(Model model, Relation<D> representation, BiPredicate<Tuple,D> predicate) {
14 super(model, representation); 14 super(representation);
15 this.predicate = predicate; 15 this.predicate = predicate;
16 } 16 }
17 @Override 17 @Override
@@ -19,13 +19,13 @@ public class FilteredRelationView<D> extends RelationView<D>{
19 return toTuple1Array(key); 19 return toTuple1Array(key);
20 } 20 }
21 @Override 21 @Override
22 public boolean get(Object[] tuple) { 22 public boolean get(Model model, Object[] tuple) {
23 int[] content = new int[tuple.length]; 23 int[] content = new int[tuple.length];
24 for(int i = 0; i<tuple.length; i++) { 24 for(int i = 0; i<tuple.length; i++) {
25 content[i] =((Tuple1)tuple[i]).get(0); 25 content[i] =((Tuple1)tuple[i]).get(0);
26 } 26 }
27 Tuple key = Tuple.of(content); 27 Tuple key = Tuple.of(content);
28 D value = this.model.get(representation, key); 28 D value = model.get(representation, key);
29 return filter(key, value); 29 return filter(key, value);
30 } 30 }
31 31
diff --git a/model-data/src/main/java/org/eclipse/viatra/solver/data/query/view/FunctionalRelationView.java b/model-data/src/main/java/org/eclipse/viatra/solver/data/query/view/FunctionalRelationView.java
index b8d0ef72..71759bc5 100644
--- a/model-data/src/main/java/org/eclipse/viatra/solver/data/query/view/FunctionalRelationView.java
+++ b/model-data/src/main/java/org/eclipse/viatra/solver/data/query/view/FunctionalRelationView.java
@@ -8,7 +8,7 @@ import org.eclipse.viatra.solver.data.model.representation.Relation;
8public class FunctionalRelationView<D> extends RelationView<D> { 8public class FunctionalRelationView<D> extends RelationView<D> {
9 9
10 public FunctionalRelationView(Model model, Relation<D> representation) { 10 public FunctionalRelationView(Model model, Relation<D> representation) {
11 super(model, representation); 11 super(representation);
12 } 12 }
13 13
14 @Override 14 @Override
@@ -22,7 +22,7 @@ public class FunctionalRelationView<D> extends RelationView<D> {
22 } 22 }
23 23
24 @Override 24 @Override
25 public boolean get(Object[] tuple) { 25 public boolean get(Model model, Object[] tuple) {
26 int[] content = new int[tuple.length-1]; 26 int[] content = new int[tuple.length-1];
27 for(int i = 0; i<tuple.length-1; i++) { 27 for(int i = 0; i<tuple.length-1; i++) {
28 content[i] =((Tuple1)tuple[i]).get(0); 28 content[i] =((Tuple1)tuple[i]).get(0);
@@ -30,7 +30,7 @@ public class FunctionalRelationView<D> extends RelationView<D> {
30 Tuple key = Tuple.of(content); 30 Tuple key = Tuple.of(content);
31 @SuppressWarnings("unchecked") 31 @SuppressWarnings("unchecked")
32 D valueInTuple = (D) tuple[tuple.length-1]; 32 D valueInTuple = (D) tuple[tuple.length-1];
33 D valueInMap = this.model.get(representation, key); 33 D valueInMap = model.get(representation, key);
34 return valueInTuple.equals(valueInMap); 34 return valueInTuple.equals(valueInMap);
35 } 35 }
36 36
diff --git a/model-data/src/main/java/org/eclipse/viatra/solver/data/query/view/RelationView.java b/model-data/src/main/java/org/eclipse/viatra/solver/data/query/view/RelationView.java
index 18d2692d..c5bc5228 100644
--- a/model-data/src/main/java/org/eclipse/viatra/solver/data/query/view/RelationView.java
+++ b/model-data/src/main/java/org/eclipse/viatra/solver/data/query/view/RelationView.java
@@ -1,51 +1,85 @@
1package org.eclipse.viatra.solver.data.query.view; 1package org.eclipse.viatra.solver.data.query.view;
2 2
3import java.util.Objects;
4
5import org.eclipse.viatra.query.runtime.matchers.context.common.BaseInputKeyWrapper;
3import org.eclipse.viatra.solver.data.map.CursorAsIterator; 6import org.eclipse.viatra.solver.data.map.CursorAsIterator;
4import org.eclipse.viatra.solver.data.model.Model; 7import org.eclipse.viatra.solver.data.model.Model;
5import org.eclipse.viatra.solver.data.model.Tuple; 8import org.eclipse.viatra.solver.data.model.Tuple;
6import org.eclipse.viatra.solver.data.model.representation.Relation; 9import org.eclipse.viatra.solver.data.model.representation.Relation;
7import org.eclipse.viatra.solver.data.query.internal.RelationViewKey;
8 10
9/** 11/**
10 * Represents a view of a {@link Relation} that can be queried. 12 * Represents a view of a {@link Relation} that can be queried.
13 *
11 * @author Oszkar Semerath 14 * @author Oszkar Semerath
12 * 15 *
13 * @param <D> 16 * @param <D>
14 */ 17 */
15public abstract class RelationView<D>{ 18public abstract class RelationView<D> extends BaseInputKeyWrapper<RelationView<D>> {
16 protected final Model model;
17 protected final Relation<D> representation; 19 protected final Relation<D> representation;
18 private final RelationViewKey<D> key; 20
19 21 protected RelationView(Relation<D> representation) {
20 protected RelationView(Model model, Relation<D> representation) { 22 super(null);
21 this.model = model; 23 this.wrappedKey = this;
22 this.representation = representation; 24 this.representation = representation;
23 key = new RelationViewKey<>(this, getArity());
24 } 25 }
25 26
26 public Model getModel() { 27 @Override
27 return model; 28 public String getPrettyPrintableName() {
29 return representation.getName();
30 }
31
32 @Override
33 public String getStringID() {
34 return representation.getName() + this.getClass().getName();
28 } 35 }
36
29 public Relation<D> getRepresentation() { 37 public Relation<D> getRepresentation() {
30 return representation; 38 return representation;
31 } 39 }
32 40
33 public abstract int getArity(); 41 @Override
42 public boolean isEnumerable() {
43 return true;
44 }
45
34 protected abstract boolean filter(Tuple key, D value); 46 protected abstract boolean filter(Tuple key, D value);
47
35 protected abstract Object[] forwardMap(Tuple key, D value); 48 protected abstract Object[] forwardMap(Tuple key, D value);
36 public abstract boolean get(Object[] tuple); 49
50 public abstract boolean get(Model model, Object[] tuple);
37 51
38 public Object[] transform(Tuple tuple, D value) { 52 public Object[] transform(Tuple tuple, D value) {
39 if(filter(tuple, value)) { 53 if (filter(tuple, value)) {
40 return forwardMap(tuple, value); 54 return forwardMap(tuple, value);
41 } else return null; 55 } else
56 return null;
42 } 57 }
43 58
44 public Iterable<Object[]> getAll() { 59 public Iterable<Object[]> getAll(Model model) {
45 return (()->new CursorAsIterator<>(model.getAll(representation), (k,v)->forwardMap(k,v), (k,v)->filter(k,v))); 60 return (() -> new CursorAsIterator<>(model.getAll(representation), (k, v) -> forwardMap(k, v),
61 (k, v) -> filter(k, v)));
46 } 62 }
47 63
48 public RelationViewKey<D> getKey() { 64 @Override
49 return key; 65 public int hashCode() {
66 final int prime = 31;
67 int result = 1;
68 result = prime * result + Objects.hash(representation);
69 return result;
50 } 70 }
71
72 @Override
73 public boolean equals(Object obj) {
74 if (this == obj)
75 return true;
76 if (!super.equals(obj))
77 return false;
78 if (!(obj instanceof RelationView))
79 return false;
80 @SuppressWarnings("unchecked")
81 RelationView<D> other = ((RelationView<D>) obj);
82 return Objects.equals(representation, other.representation);
83 }
84
51} 85}