aboutsummaryrefslogtreecommitdiffstats
path: root/store
diff options
context:
space:
mode:
authorLibravatar OszkarSemerath <semerath@mit.bme.hu>2021-10-22 02:13:47 +0200
committerLibravatar OszkarSemerath <semerath@mit.bme.hu>2021-10-22 02:13:47 +0200
commit575f4b0060fdd7caefdb1b96b1df7f3519b17941 (patch)
tree9739a851598a77e34162ef3e1f00176a7bc7ff24 /store
parentBuffered Model update listener, first version (diff)
downloadrefinery-575f4b0060fdd7caefdb1b96b1df7f3519b17941.tar.gz
refinery-575f4b0060fdd7caefdb1b96b1df7f3519b17941.tar.zst
refinery-575f4b0060fdd7caefdb1b96b1df7f3519b17941.zip
Almost finished QueriableModel and QueryableModelStore
Diffstat (limited to 'store')
-rw-r--r--store/src/main/java/tools/refinery/store/query/QueriableModel.java30
-rw-r--r--store/src/main/java/tools/refinery/store/query/QueriableModelStore.java23
-rw-r--r--store/src/main/java/tools/refinery/store/query/QueriableModelStoreImpl.java127
-rw-r--r--store/src/main/java/tools/refinery/store/query/internal/QueriableModelImpl.java180
4 files changed, 360 insertions, 0 deletions
diff --git a/store/src/main/java/tools/refinery/store/query/QueriableModel.java b/store/src/main/java/tools/refinery/store/query/QueriableModel.java
new file mode 100644
index 00000000..f669b3ed
--- /dev/null
+++ b/store/src/main/java/tools/refinery/store/query/QueriableModel.java
@@ -0,0 +1,30 @@
1package tools.refinery.store.query;
2
3import java.util.Optional;
4import java.util.Set;
5import java.util.stream.Stream;
6
7import tools.refinery.store.model.Model;
8import tools.refinery.store.query.building.DNFPredicate;
9
10public interface QueriableModel extends Model{
11 Set<DNFPredicate> getPredicates();
12
13 void flushChanges();
14
15 boolean hasResult(DNFPredicate predicate);
16
17 boolean hasResult(DNFPredicate predicate, Object[] parameters);
18
19 Optional<Object[]> oneResult(DNFPredicate predicate);
20
21 Optional<Object[]> oneResult(DNFPredicate predicate, Object[] parameters);
22
23 Stream<Object[]> allResults(DNFPredicate predicate);
24
25 Stream<Object[]> allResults(DNFPredicate predicate, Object[] parameters);
26
27 int countResults(DNFPredicate predicate);
28
29 int countResults(DNFPredicate predicate, Object[] parameters);
30}
diff --git a/store/src/main/java/tools/refinery/store/query/QueriableModelStore.java b/store/src/main/java/tools/refinery/store/query/QueriableModelStore.java
new file mode 100644
index 00000000..3a5b51ff
--- /dev/null
+++ b/store/src/main/java/tools/refinery/store/query/QueriableModelStore.java
@@ -0,0 +1,23 @@
1package tools.refinery.store.query;
2
3import java.util.Set;
4
5import tools.refinery.store.model.ModelDiffCursor;
6import tools.refinery.store.model.ModelStore;
7import tools.refinery.store.model.representation.DataRepresentation;
8import tools.refinery.store.query.building.DNFPredicate;
9import tools.refinery.store.query.view.RelationView;
10
11public interface QueriableModelStore extends ModelStore{
12 @SuppressWarnings("squid:S1452")
13 Set<DataRepresentation<?, ?>> getDataRepresentations();
14 @SuppressWarnings("squid:S1452")
15 Set<RelationView<?>> getViews();
16 Set<DNFPredicate> getPredicates();
17
18 QueriableModel createModel();
19 QueriableModel createModel(long state);
20
21 Set<Long> getStates();
22 ModelDiffCursor getDiffCursor(long from, long to);
23}
diff --git a/store/src/main/java/tools/refinery/store/query/QueriableModelStoreImpl.java b/store/src/main/java/tools/refinery/store/query/QueriableModelStoreImpl.java
new file mode 100644
index 00000000..3902e013
--- /dev/null
+++ b/store/src/main/java/tools/refinery/store/query/QueriableModelStoreImpl.java
@@ -0,0 +1,127 @@
1package tools.refinery.store.query;
2
3import java.util.Collections;
4import java.util.HashMap;
5import java.util.Map;
6import java.util.Set;
7
8import org.eclipse.viatra.query.runtime.api.GenericQuerySpecification;
9
10import tools.refinery.store.model.ModelDiffCursor;
11import tools.refinery.store.model.ModelStore;
12import tools.refinery.store.model.ModelStoreImpl;
13import tools.refinery.store.model.representation.DataRepresentation;
14import tools.refinery.store.query.building.DNFAnd;
15import tools.refinery.store.query.building.DNFAtom;
16import tools.refinery.store.query.building.DNFPredicate;
17import tools.refinery.store.query.building.PredicateAtom;
18import tools.refinery.store.query.building.RelationAtom;
19import tools.refinery.store.query.internal.DNF2PQuery;
20import tools.refinery.store.query.internal.RawPatternMatcher;
21import tools.refinery.store.query.view.RelationView;
22
23public class QueriableModelStoreImpl implements QueriableModelStore {
24 protected final ModelStore store;
25 protected final Set<RelationView<?>> relationViews;
26 protected final Map<DNFPredicate, GenericQuerySpecification<RawPatternMatcher>> predicates;
27
28 public QueriableModelStoreImpl(Set<DataRepresentation<?, ?>> dataRepresentations,
29 Set<RelationView<?>> relationViews, Set<DNFPredicate> predicates) {
30 this.store = new ModelStoreImpl(dataRepresentations);
31 validateViews(dataRepresentations, relationViews);
32 this.relationViews = Collections.unmodifiableSet(relationViews);
33 validatePredicates(relationViews, predicates);
34 this.predicates = initPredicates(predicates);
35 }
36
37 private void validateViews(Set<DataRepresentation<?, ?>> dataRepresentations, Set<RelationView<?>> relationViews) {
38 for (RelationView<?> relationView : relationViews) {
39 // TODO: make it work for non-relation representation?
40 if (!dataRepresentations.contains(relationView.getRepresentation())) {
41 throw new IllegalArgumentException(
42 DataRepresentation.class.getSimpleName() + " " + relationView.getStringID() + " added to "
43 + QueriableModelStore.class.getSimpleName() + " without a referred representation.");
44 }
45 }
46 }
47
48 private void validatePredicates(Set<RelationView<?>> relationViews, Set<DNFPredicate> predicates) {
49 for (DNFPredicate dnfPredicate : predicates) {
50 for (DNFAnd clause : dnfPredicate.getClauses()) {
51 for (DNFAtom atom : clause.getConstraints()) {
52 if (atom instanceof RelationAtom relationAtom) {
53 validateRelationAtom(relationViews, dnfPredicate, relationAtom);
54 } else if (atom instanceof PredicateAtom predicateAtom) {
55 validatePredicateAtom(predicates, dnfPredicate, predicateAtom);
56 }
57 }
58 }
59 }
60 }
61
62 private void validateRelationAtom(Set<RelationView<?>> relationViews, DNFPredicate dnfPredicate,
63 RelationAtom relationAtom) {
64 if (!relationViews.contains(relationAtom.getView())) {
65 throw new IllegalArgumentException(DNFPredicate.class.getSimpleName() + " "
66 + dnfPredicate.getUniqueName() + " contains reference to a view of "
67 + relationAtom.getView().getRepresentation().getName()
68 + " that is not in the model.");
69 }
70 }
71 private void validatePredicateAtom(Set<DNFPredicate> predicates, DNFPredicate dnfPredicate,
72 PredicateAtom predicateAtom) {
73 if (!predicates.contains(predicateAtom.getReferred())) {
74 throw new IllegalArgumentException(
75 DNFPredicate.class.getSimpleName() + " " + dnfPredicate.getUniqueName()
76 + " contains reference to a predicate "
77 + predicateAtom.getReferred().getName()
78 + "that is not in the model.");
79 }
80 }
81
82 private Map<DNFPredicate, GenericQuerySpecification<RawPatternMatcher>> initPredicates(Set<DNFPredicate> predicates) {
83 Map<DNFPredicate, GenericQuerySpecification<RawPatternMatcher>> result = new HashMap<>();
84
85 for (DNFPredicate dnfPredicate : predicates) {
86 GenericQuerySpecification<RawPatternMatcher> query = DNF2PQuery.translate(dnfPredicate).build();
87 result.put(dnfPredicate, query);
88 }
89
90 return result;
91 }
92
93 @Override
94 public Set<DataRepresentation<?, ?>> getDataRepresentations() {
95 return store.getDataRepresentations();
96 }
97 @Override
98 public Set<RelationView<?>> getViews() {
99 return this.relationViews;
100 }
101 @Override
102 public Set<DNFPredicate> getPredicates() {
103 return predicates.keySet();
104 }
105
106 @Override
107 public QueriableModel createModel() {
108 // TODO Auto-generated method stub
109 return null;
110 }
111
112 @Override
113 public QueriableModel createModel(long state) {
114 // TODO Auto-generated method stub
115 return null;
116 }
117
118 @Override
119 public Set<Long> getStates() {
120 return this.store.getStates();
121 }
122
123 @Override
124 public ModelDiffCursor getDiffCursor(long from, long to) {
125 return this.store.getDiffCursor(from, to);
126 }
127}
diff --git a/store/src/main/java/tools/refinery/store/query/internal/QueriableModelImpl.java b/store/src/main/java/tools/refinery/store/query/internal/QueriableModelImpl.java
new file mode 100644
index 00000000..5b96ba74
--- /dev/null
+++ b/store/src/main/java/tools/refinery/store/query/internal/QueriableModelImpl.java
@@ -0,0 +1,180 @@
1package tools.refinery.store.query.internal;
2
3import java.util.HashMap;
4import java.util.Map;
5import java.util.Optional;
6import java.util.Set;
7import java.util.stream.Stream;
8
9import org.eclipse.viatra.query.runtime.api.AdvancedViatraQueryEngine;
10import org.eclipse.viatra.query.runtime.api.GenericQueryGroup;
11import org.eclipse.viatra.query.runtime.api.GenericQuerySpecification;
12import org.eclipse.viatra.query.runtime.api.IQueryGroup;
13
14import tools.refinery.store.map.Cursor;
15import tools.refinery.store.model.Model;
16import tools.refinery.store.model.ModelDiffCursor;
17import tools.refinery.store.model.representation.DataRepresentation;
18import tools.refinery.store.query.QueriableModel;
19import tools.refinery.store.query.QueriableModelStore;
20import tools.refinery.store.query.RelationalScope;
21import tools.refinery.store.query.building.DNFPredicate;
22
23public class QueriableModelImpl implements QueriableModel {
24 protected final QueriableModelStore store;
25 protected final Model model;
26
27 protected final AdvancedViatraQueryEngine engine;
28 protected final Map<DNFPredicate, RawPatternMatcher> predicate2Matcher;
29
30 public QueriableModelImpl(QueriableModelStore store, Model model,
31 Map<DNFPredicate, GenericQuerySpecification<RawPatternMatcher>> predicates2PQuery) {
32 this.store = store;
33 this.model = model;
34 this.engine = initEngine(store, model);
35 this.predicate2Matcher = initMatchers(engine, predicates2PQuery);
36 }
37
38 private AdvancedViatraQueryEngine initEngine(QueriableModelStore store, Model model) {
39 RelationalScope scope = new RelationalScope(model, store.getViews());
40 return AdvancedViatraQueryEngine.createUnmanagedEngine(scope);
41 }
42
43 private Map<DNFPredicate, RawPatternMatcher> initMatchers(AdvancedViatraQueryEngine engine,
44 Map<DNFPredicate, GenericQuerySpecification<RawPatternMatcher>> predicates2pQuery) {
45 // 1. prepare group
46 IQueryGroup queryGroup = GenericQueryGroup.of(Set.copyOf(predicates2pQuery.values()));
47 engine.prepareGroup(queryGroup, null);
48
49 // 2. then get all matchers
50 Map<DNFPredicate, RawPatternMatcher> result = new HashMap<>();
51 for (var entry : predicates2pQuery.entrySet()) {
52 var matcher = engine.getMatcher(entry.getValue());
53 result.put(entry.getKey(), matcher);
54 }
55 return result;
56 }
57
58 @Override
59 public Set<DataRepresentation<?, ?>> getDataRepresentations() {
60 return model.getDataRepresentations();
61 }
62
63 @Override
64 public Set<DNFPredicate> getPredicates() {
65 return store.getPredicates();
66 }
67
68 @Override
69 public <K, V> V get(DataRepresentation<K, V> representation, K key) {
70 return model.get(representation, key);
71 }
72
73 @Override
74 public <K, V> Cursor<K, V> getAll(DataRepresentation<K, V> representation) {
75 return model.getAll(representation);
76 }
77
78 @Override
79 public <K, V> V put(DataRepresentation<K, V> representation, K key, V value) {
80 // TODO Auto-generated method stub
81 return null;
82 }
83
84 @Override
85 public <K, V> void putAll(DataRepresentation<K, V> representation, Cursor<K, V> cursor) {
86 // TODO Auto-generated method stub
87
88 }
89
90 @Override
91 public <K, V> long getSize(DataRepresentation<K, V> representation) {
92 return model.getSize(representation);
93 }
94
95 protected PredicateResult getPredicateResult(DNFPredicate predicate) {
96 var result = this.predicate2Matcher.get(predicate);
97 if (result == null) {
98 throw new IllegalArgumentException("Model does not contain predicate " + predicate.getName() + "!");
99 } else
100 return result;
101 }
102
103 protected void validateParameters(DNFPredicate predicate, Object[] parameters) {
104 int predicateArity = predicate.getVariables().size();
105 int parameterArity = parameters.length;
106 if (parameterArity != predicateArity) {
107 throw new IllegalArgumentException("Predicate " + predicate.getName() + " with " + predicateArity
108 + " arity called with different number of parameters (" + parameterArity + ")!");
109 }
110 }
111
112 @Override
113 public boolean hasResult(DNFPredicate predicate) {
114 return getPredicateResult(predicate).hasResult();
115 }
116
117 @Override
118 public boolean hasResult(DNFPredicate predicate, Object[] parameters) {
119 validateParameters(predicate, parameters);
120 return getPredicateResult(predicate).hasResult(parameters);
121 }
122
123 @Override
124 public Optional<Object[]> oneResult(DNFPredicate predicate){
125 return getPredicateResult(predicate).oneResult();
126 }
127
128 @Override
129 public Optional<Object[]> oneResult(DNFPredicate predicate, Object[] parameters){
130 validateParameters(predicate, parameters);
131 return getPredicateResult(predicate).oneResult(parameters);
132 }
133
134 @Override
135 public Stream<Object[]> allResults(DNFPredicate predicate){
136 return getPredicateResult(predicate).allResults();
137 }
138
139 @Override
140 public Stream<Object[]> allResults(DNFPredicate predicate, Object[] parameters){
141 validateParameters(predicate, parameters);
142 return getPredicateResult(predicate).allResults(parameters);
143 }
144
145 @Override
146 public int countResults(DNFPredicate predicate){
147 return getPredicateResult(predicate).countResults();
148 }
149
150 @Override
151 public int countResults(DNFPredicate predicate, Object[] parameters){
152 validateParameters(predicate, parameters);
153 return getPredicateResult(predicate).countResults(parameters);
154
155 }
156 @Override
157 public void flushChanges() {
158 // TODO Auto-generated method stub
159
160 }
161
162 @Override
163 public ModelDiffCursor getDiffCursor(long to) {
164 // TODO Auto-generated method stub
165 return null;
166 }
167
168 @Override
169 public long commit() {
170 // TODO Auto-generated method stub
171 return 0;
172 }
173
174 @Override
175 public void restore(long state) {
176 // TODO Auto-generated method stub
177
178 }
179
180}