diff options
Diffstat (limited to 'model-data/src/main/java/org/eclipse/viatra/solver/data/query/view')
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; | |||
8 | public class FunctionalRelationView<D> extends RelationView<D> { | 8 | public 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 @@ | |||
1 | package org.eclipse.viatra.solver.data.query.view; | 1 | package org.eclipse.viatra.solver.data.query.view; |
2 | 2 | ||
3 | import java.util.Objects; | ||
4 | |||
5 | import org.eclipse.viatra.query.runtime.matchers.context.common.BaseInputKeyWrapper; | ||
3 | import org.eclipse.viatra.solver.data.map.CursorAsIterator; | 6 | import org.eclipse.viatra.solver.data.map.CursorAsIterator; |
4 | import org.eclipse.viatra.solver.data.model.Model; | 7 | import org.eclipse.viatra.solver.data.model.Model; |
5 | import org.eclipse.viatra.solver.data.model.Tuple; | 8 | import org.eclipse.viatra.solver.data.model.Tuple; |
6 | import org.eclipse.viatra.solver.data.model.representation.Relation; | 9 | import org.eclipse.viatra.solver.data.model.representation.Relation; |
7 | import 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 | */ |
15 | public abstract class RelationView<D>{ | 18 | public 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 | } |