aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorLibravatar OszkarSemerath <semerath@mit.bme.hu>2021-10-25 11:52:23 +0200
committerLibravatar OszkarSemerath <semerath@mit.bme.hu>2021-10-25 11:52:23 +0200
commit644401bb8023235fa1cbe44f96e09978ac4b94f9 (patch)
tree15f63b969c0408d6be5f553fc63f0f603c972a17
parentanother undeterministic variable export (diff)
downloadrefinery-644401bb8023235fa1cbe44f96e09978ac4b94f9.tar.gz
refinery-644401bb8023235fa1cbe44f96e09978ac4b94f9.tar.zst
refinery-644401bb8023235fa1cbe44f96e09978ac4b94f9.zip
Simple test added for all kinds of query constraints
-rw-r--r--store/src/test/java/tools/refinery/store/query/test/QueryTest.java323
1 files changed, 130 insertions, 193 deletions
diff --git a/store/src/test/java/tools/refinery/store/query/test/QueryTest.java b/store/src/test/java/tools/refinery/store/query/test/QueryTest.java
index e55cb021..6df0a7c3 100644
--- a/store/src/test/java/tools/refinery/store/query/test/QueryTest.java
+++ b/store/src/test/java/tools/refinery/store/query/test/QueryTest.java
@@ -10,12 +10,8 @@ import java.util.List;
10import java.util.Set; 10import java.util.Set;
11import java.util.stream.Stream; 11import java.util.stream.Stream;
12 12
13import org.junit.jupiter.api.Disabled;
14import org.junit.jupiter.api.Test; 13import org.junit.jupiter.api.Test;
15 14
16import tools.refinery.store.model.Model;
17import tools.refinery.store.model.ModelStore;
18import tools.refinery.store.model.ModelStoreImpl;
19import tools.refinery.store.model.Tuple; 15import tools.refinery.store.model.Tuple;
20import tools.refinery.store.model.representation.Relation; 16import tools.refinery.store.model.representation.Relation;
21import tools.refinery.store.model.representation.TruthValue; 17import tools.refinery.store.model.representation.TruthValue;
@@ -33,81 +29,22 @@ import tools.refinery.store.query.view.KeyOnlyRelationView;
33import tools.refinery.store.query.view.RelationView; 29import tools.refinery.store.query.view.RelationView;
34 30
35class QueryTest { 31class QueryTest {
36// @Test 32
37// void minimalTest() { 33 static void compareMatchSets(Stream<Object[]> matchSet, Set<List<Tuple>> expected) {
38// Relation<Boolean> person = new Relation<>("Person", 1, false);
39//
40// RelationView<Boolean> persionView = new KeyOnlyRelationView(person);
41// GenericQuerySpecification<GenericPatternMatcher> personQuery = (new PredicateTranslator("PersonQuery"))
42// .addParameter("p", persionView).addConstraint(persionView, "p").build();
43//
44// ModelStore store = new ModelStoreImpl(Set.of(person));
45// Model model = store.createModel();
46//
47// model.put(person, Tuple.of(0), true);
48// model.put(person, Tuple.of(1), true);
49//
50// RelationalScope scope = new RelationalScope(model, Set.of(persionView));
51//
52// ViatraQueryEngine engine = AdvancedViatraQueryEngine.on(scope);
53// GenericPatternMatcher personMatcher = engine.getMatcher(personQuery);
54//
55// assertEquals(2, personMatcher.countMatches());
56// }
57//
58// void modelBuildingTest() {
59// Relation<Boolean> person = new Relation<>("Person", 1, false);
60// Relation<Integer> age = new Relation<Integer>("age", 1, null);
61// Relation<TruthValue> friend = new Relation<>("friend", 2, TruthValue.FALSE);
62//
63// ModelStore store = new ModelStoreImpl(Set.of(person, age, friend));
64// Model model = store.createModel();
65//
66// model.put(person, Tuple.of(0), true);
67// model.put(person, Tuple.of(1), true);
68// model.put(age, Tuple.of(0), 3);
69// model.put(age, Tuple.of(1), 1);
70// model.put(friend, Tuple.of(0, 1), TruthValue.TRUE);
71// model.put(friend, Tuple.of(1, 0), TruthValue.UNKNOWN);
72//
73// // Sanity check
74// assertTrue(model.get(person, Tuple.of(0)));
75// assertTrue(model.get(person, Tuple.of(1)));
76// assertFalse(model.get(person, Tuple.of(2)));
77//
78// RelationView<Boolean> persionView = new KeyOnlyRelationView(person);
79// RelationView<Integer> ageView = new FunctionalRelationView<>(age);
80// RelationView<TruthValue> friendMustView = new FilteredRelationView<TruthValue>(friend, (k, v) -> v.must());
81// RelationView<TruthValue> friendMayView = new FilteredRelationView<TruthValue>(friend, (k, v) -> v.may());
82//
83// RelationalScope scope = new RelationalScope(model, Set.of(persionView, ageView, friendMustView, friendMayView));
84//
85// GenericQuerySpecification<GenericPatternMatcher> personQuery = (new PredicateTranslator("PersonQuery"))
86// .addParameter("p", persionView).addConstraint(persionView, "p").build();
87//
88// ViatraQueryEngine engine = AdvancedViatraQueryEngine.on(scope);
89// GenericPatternMatcher personMatcher = engine.getMatcher(personQuery);
90// Collection<GenericPatternMatch> personMatches = personMatcher.getAllMatches();
91// for (GenericPatternMatch personMatch : personMatches) {
92// System.out.println(personMatch);
93// }
94// }
95
96 private void compareMatchSets(Stream<Object[]> matchSet, Set<List<Tuple>> expected) {
97 Set<List<Tuple>> translatedMatchSet = new HashSet<>(); 34 Set<List<Tuple>> translatedMatchSet = new HashSet<>();
98 var interator = matchSet.iterator(); 35 var interator = matchSet.iterator();
99 while(interator.hasNext()) { 36 while (interator.hasNext()) {
100 var element = interator.next(); 37 var element = interator.next();
101 List<Tuple> elementToTranslatedMatchSet = new ArrayList<>(); 38 List<Tuple> elementToTranslatedMatchSet = new ArrayList<>();
102 for(int i=0; i<element.length; i++) { 39 for (int i = 0; i < element.length; i++) {
103 elementToTranslatedMatchSet.add((Tuple) element[i]); 40 elementToTranslatedMatchSet.add((Tuple) element[i]);
104 } 41 }
105 translatedMatchSet.add(elementToTranslatedMatchSet); 42 translatedMatchSet.add(elementToTranslatedMatchSet);
106 } 43 }
107 44
108 assertEquals(expected, translatedMatchSet); 45 assertEquals(expected, translatedMatchSet);
109 } 46 }
110 47
111 @Test 48 @Test
112 void typeConstraintTest() { 49 void typeConstraintTest() {
113 Relation<Boolean> person = new Relation<>("Person", 1, false); 50 Relation<Boolean> person = new Relation<>("Person", 1, false);
@@ -118,24 +55,20 @@ class QueryTest {
118 RelationAtom personRelationAtom = new RelationAtom(persionView, parameters); 55 RelationAtom personRelationAtom = new RelationAtom(persionView, parameters);
119 DNFAnd clause = new DNFAnd(Collections.emptySet(), Arrays.asList(personRelationAtom)); 56 DNFAnd clause = new DNFAnd(Collections.emptySet(), Arrays.asList(personRelationAtom));
120 DNFPredicate predicate = new DNFPredicate("TypeConstraint", parameters, Arrays.asList(clause)); 57 DNFPredicate predicate = new DNFPredicate("TypeConstraint", parameters, Arrays.asList(clause));
121 58
122 QueriableModelStore store = new QueriableModelStoreImpl(Set.of(person, asset), Set.of(persionView), Set.of(predicate)); 59 QueriableModelStore store = new QueriableModelStoreImpl(Set.of(person, asset), Set.of(persionView),
60 Set.of(predicate));
123 QueriableModel model = store.createModel(); 61 QueriableModel model = store.createModel();
124 62
125 assertEquals(0, model.countResults(predicate));
126
127 model.put(person, Tuple.of(0), true); 63 model.put(person, Tuple.of(0), true);
128 model.put(person, Tuple.of(1), true); 64 model.put(person, Tuple.of(1), true);
129 model.put(asset, Tuple.of(1), true); 65 model.put(asset, Tuple.of(1), true);
130 model.put(asset, Tuple.of(2), true); 66 model.put(asset, Tuple.of(2), true);
131 67
132 assertEquals(0, model.countResults(predicate)); 68
133
134 model.flushChanges(); 69 model.flushChanges();
135 assertEquals(2, model.countResults(predicate)); 70 assertEquals(2, model.countResults(predicate));
136 compareMatchSets(model.allResults(predicate), Set.of( 71 compareMatchSets(model.allResults(predicate), Set.of(List.of(Tuple.of(0)), List.of(Tuple.of(1))));
137 List.of(Tuple.of(0)),
138 List.of(Tuple.of(1))));
139 } 72 }
140 73
141 @Test 74 @Test
@@ -156,29 +89,27 @@ class QueryTest {
156 Arrays.asList(personRelationAtom1, personRelationAtom2, friendRelationAtom)); 89 Arrays.asList(personRelationAtom1, personRelationAtom2, friendRelationAtom));
157 DNFPredicate predicate = new DNFPredicate("RelationConstraint", parameters, Arrays.asList(clause)); 90 DNFPredicate predicate = new DNFPredicate("RelationConstraint", parameters, Arrays.asList(clause));
158 91
159 QueriableModelStore store = new QueriableModelStoreImpl(Set.of(person, friend), Set.of(persionView,friendMustView), Set.of(predicate)); 92 QueriableModelStore store = new QueriableModelStoreImpl(Set.of(person, friend),
93 Set.of(persionView, friendMustView), Set.of(predicate));
160 QueriableModel model = store.createModel(); 94 QueriableModel model = store.createModel();
161 95
162 assertEquals(0, model.countResults(predicate)); 96 assertEquals(0, model.countResults(predicate));
163 97
164 model.put(person, Tuple.of(0), true); 98 model.put(person, Tuple.of(0), true);
165 model.put(person, Tuple.of(1), true); 99 model.put(person, Tuple.of(1), true);
166 model.put(person, Tuple.of(2), true); 100 model.put(person, Tuple.of(2), true);
167 model.put(friend, Tuple.of(0, 1), TruthValue.TRUE); 101 model.put(friend, Tuple.of(0, 1), TruthValue.TRUE);
168 model.put(friend, Tuple.of(1, 0), TruthValue.TRUE); 102 model.put(friend, Tuple.of(1, 0), TruthValue.TRUE);
169 model.put(friend, Tuple.of(1, 2), TruthValue.TRUE); 103 model.put(friend, Tuple.of(1, 2), TruthValue.TRUE);
170 104
171 assertEquals(0, model.countResults(predicate)); 105 assertEquals(0, model.countResults(predicate));
172 106
173 model.flushChanges(); 107 model.flushChanges();
174 assertEquals(3, model.countResults(predicate)); 108 assertEquals(3, model.countResults(predicate));
175 compareMatchSets(model.allResults(predicate), Set.of( 109 compareMatchSets(model.allResults(predicate), Set.of(List.of(Tuple.of(0), Tuple.of(1)),
176 List.of(Tuple.of(0), Tuple.of(1)), 110 List.of(Tuple.of(1), Tuple.of(0)), List.of(Tuple.of(1), Tuple.of(2))));
177 List.of(Tuple.of(1), Tuple.of(0)),
178 List.of(Tuple.of(1), Tuple.of(2))
179 ));
180 } 111 }
181 112
182 @Test 113 @Test
183 void andTest() { 114 void andTest() {
184 Relation<Boolean> person = new Relation<Boolean>("Person", 1, false); 115 Relation<Boolean> person = new Relation<Boolean>("Person", 1, false);
@@ -198,40 +129,36 @@ class QueryTest {
198 Arrays.asList(personRelationAtom1, personRelationAtom2, friendRelationAtom1, friendRelationAtom2)); 129 Arrays.asList(personRelationAtom1, personRelationAtom2, friendRelationAtom1, friendRelationAtom2));
199 DNFPredicate predicate = new DNFPredicate("RelationConstraint", parameters, Arrays.asList(clause)); 130 DNFPredicate predicate = new DNFPredicate("RelationConstraint", parameters, Arrays.asList(clause));
200 131
201 QueriableModelStore store = new QueriableModelStoreImpl(Set.of(person, friend), Set.of(persionView,friendMustView), Set.of(predicate)); 132 QueriableModelStore store = new QueriableModelStoreImpl(Set.of(person, friend),
133 Set.of(persionView, friendMustView), Set.of(predicate));
202 QueriableModel model = store.createModel(); 134 QueriableModel model = store.createModel();
203 135
204 assertEquals(0, model.countResults(predicate)); 136 assertEquals(0, model.countResults(predicate));
205 137
206 model.put(person, Tuple.of(0), true); 138 model.put(person, Tuple.of(0), true);
207 model.put(person, Tuple.of(1), true); 139 model.put(person, Tuple.of(1), true);
208 model.put(person, Tuple.of(2), true); 140 model.put(person, Tuple.of(2), true);
209 141
210 model.put(friend, Tuple.of(0, 1), TruthValue.TRUE); 142 model.put(friend, Tuple.of(0, 1), TruthValue.TRUE);
211 model.put(friend, Tuple.of(0, 2), TruthValue.TRUE); 143 model.put(friend, Tuple.of(0, 2), TruthValue.TRUE);
212 144
213 model.flushChanges(); 145 model.flushChanges();
214 assertEquals(0, model.countResults(predicate)); 146 assertEquals(0, model.countResults(predicate));
215 147
216 model.put(friend, Tuple.of(1, 0), TruthValue.TRUE); 148 model.put(friend, Tuple.of(1, 0), TruthValue.TRUE);
217 model.flushChanges(); 149 model.flushChanges();
218 assertEquals(2, model.countResults(predicate)); 150 assertEquals(2, model.countResults(predicate));
219 compareMatchSets(model.allResults(predicate), Set.of( 151 compareMatchSets(model.allResults(predicate),
220 List.of(Tuple.of(0), Tuple.of(1)), 152 Set.of(List.of(Tuple.of(0), Tuple.of(1)), List.of(Tuple.of(1), Tuple.of(0))));
221 List.of(Tuple.of(1), Tuple.of(0)) 153
222 ));
223
224 model.put(friend, Tuple.of(2, 0), TruthValue.TRUE); 154 model.put(friend, Tuple.of(2, 0), TruthValue.TRUE);
225 model.flushChanges(); 155 model.flushChanges();
226 assertEquals(4, model.countResults(predicate)); 156 assertEquals(4, model.countResults(predicate));
227 compareMatchSets(model.allResults(predicate), Set.of( 157 compareMatchSets(model.allResults(predicate),
228 List.of(Tuple.of(0), Tuple.of(1)), 158 Set.of(List.of(Tuple.of(0), Tuple.of(1)), List.of(Tuple.of(1), Tuple.of(0)),
229 List.of(Tuple.of(1), Tuple.of(0)), 159 List.of(Tuple.of(0), Tuple.of(2)), List.of(Tuple.of(2), Tuple.of(0))));
230 List.of(Tuple.of(0), Tuple.of(2)),
231 List.of(Tuple.of(2), Tuple.of(0))
232 ));
233 } 160 }
234 161
235 @Test 162 @Test
236 void existTest() { 163 void existTest() {
237 Relation<Boolean> person = new Relation<Boolean>("Person", 1, false); 164 Relation<Boolean> person = new Relation<Boolean>("Person", 1, false);
@@ -250,28 +177,26 @@ class QueryTest {
250 Arrays.asList(personRelationAtom1, personRelationAtom2, friendRelationAtom)); 177 Arrays.asList(personRelationAtom1, personRelationAtom2, friendRelationAtom));
251 DNFPredicate predicate = new DNFPredicate("RelationConstraint", parameters, Arrays.asList(clause)); 178 DNFPredicate predicate = new DNFPredicate("RelationConstraint", parameters, Arrays.asList(clause));
252 179
253 QueriableModelStore store = new QueriableModelStoreImpl(Set.of(person, friend), Set.of(persionView,friendMustView), Set.of(predicate)); 180 QueriableModelStore store = new QueriableModelStoreImpl(Set.of(person, friend),
181 Set.of(persionView, friendMustView), Set.of(predicate));
254 QueriableModel model = store.createModel(); 182 QueriableModel model = store.createModel();
255 183
256 assertEquals(0, model.countResults(predicate)); 184 assertEquals(0, model.countResults(predicate));
257 185
258 model.put(person, Tuple.of(0), true); 186 model.put(person, Tuple.of(0), true);
259 model.put(person, Tuple.of(1), true); 187 model.put(person, Tuple.of(1), true);
260 model.put(person, Tuple.of(2), true); 188 model.put(person, Tuple.of(2), true);
261 model.put(friend, Tuple.of(0, 1), TruthValue.TRUE); 189 model.put(friend, Tuple.of(0, 1), TruthValue.TRUE);
262 model.put(friend, Tuple.of(1, 0), TruthValue.TRUE); 190 model.put(friend, Tuple.of(1, 0), TruthValue.TRUE);
263 model.put(friend, Tuple.of(1, 2), TruthValue.TRUE); 191 model.put(friend, Tuple.of(1, 2), TruthValue.TRUE);
264 192
265 assertEquals(0, model.countResults(predicate)); 193 assertEquals(0, model.countResults(predicate));
266 194
267 model.flushChanges(); 195 model.flushChanges();
268 assertEquals(2, model.countResults(predicate)); 196 assertEquals(2, model.countResults(predicate));
269 compareMatchSets(model.allResults(predicate), Set.of( 197 compareMatchSets(model.allResults(predicate), Set.of(List.of(Tuple.of(0)), List.of(Tuple.of(1))));
270 List.of(Tuple.of(0)),
271 List.of(Tuple.of(1))
272 ));
273 } 198 }
274 199
275 @Test 200 @Test
276 void orTest() { 201 void orTest() {
277 Relation<Boolean> person = new Relation<>("Person", 1, false); 202 Relation<Boolean> person = new Relation<>("Person", 1, false);
@@ -285,21 +210,26 @@ class QueryTest {
285 Variable p2 = new Variable("p2"); 210 Variable p2 = new Variable("p2");
286 List<Variable> parameters = Arrays.asList(p1, p2); 211 List<Variable> parameters = Arrays.asList(p1, p2);
287 212
213 // Person-Person friendship
288 RelationAtom personRelationAtom1 = new RelationAtom(persionView, Arrays.asList(p1)); 214 RelationAtom personRelationAtom1 = new RelationAtom(persionView, Arrays.asList(p1));
289 RelationAtom personRelationAtom2 = new RelationAtom(persionView, Arrays.asList(p2)); 215 RelationAtom personRelationAtom2 = new RelationAtom(persionView, Arrays.asList(p2));
290 RelationAtom friendRelationAtom1 = new RelationAtom(friendMustView, Arrays.asList(p1, p2)); 216 RelationAtom friendRelationAtom1 = new RelationAtom(friendMustView, Arrays.asList(p1, p2));
291 DNFAnd clause1 = new DNFAnd(new HashSet<>(parameters), 217 DNFAnd clause1 = new DNFAnd(new HashSet<>(parameters),
292 Arrays.asList(personRelationAtom1, personRelationAtom2, friendRelationAtom1)); 218 Arrays.asList(personRelationAtom1, personRelationAtom2, friendRelationAtom1));
293 219
220 // Animal-Animal friendship
294 RelationAtom animalRelationAtom1 = new RelationAtom(animalView, Arrays.asList(p1)); 221 RelationAtom animalRelationAtom1 = new RelationAtom(animalView, Arrays.asList(p1));
295 RelationAtom animalRelationAtom2 = new RelationAtom(animalView, Arrays.asList(p2)); 222 RelationAtom animalRelationAtom2 = new RelationAtom(animalView, Arrays.asList(p2));
296 RelationAtom friendRelationAtom2 = new RelationAtom(friendMustView, Arrays.asList(p1, p2)); 223 RelationAtom friendRelationAtom2 = new RelationAtom(friendMustView, Arrays.asList(p1, p2));
297 DNFAnd clause2 = new DNFAnd(new HashSet<>(parameters), 224 DNFAnd clause2 = new DNFAnd(new HashSet<>(parameters),
298 Arrays.asList(animalRelationAtom1, animalRelationAtom2, friendRelationAtom2)); 225 Arrays.asList(animalRelationAtom1, animalRelationAtom2, friendRelationAtom2));
299 226
227 // No inter-species friendship
228
300 DNFPredicate predicate = new DNFPredicate("Or", parameters, Arrays.asList(clause1, clause2)); 229 DNFPredicate predicate = new DNFPredicate("Or", parameters, Arrays.asList(clause1, clause2));
301 230
302 QueriableModelStore store = new QueriableModelStoreImpl(Set.of(person, animal, friend), Set.of(persionView,animalView,friendMustView), Set.of(predicate)); 231 QueriableModelStore store = new QueriableModelStoreImpl(Set.of(person, animal, friend),
232 Set.of(persionView, animalView, friendMustView), Set.of(predicate));
303 QueriableModel model = store.createModel(); 233 QueriableModel model = store.createModel();
304 234
305 model.put(person, Tuple.of(0), true); 235 model.put(person, Tuple.of(0), true);
@@ -313,14 +243,14 @@ class QueryTest {
313 243
314 model.flushChanges(); 244 model.flushChanges();
315 assertEquals(2, model.countResults(predicate)); 245 assertEquals(2, model.countResults(predicate));
246 compareMatchSets(model.allResults(predicate),
247 Set.of(List.of(Tuple.of(0), Tuple.of(1)), List.of(Tuple.of(2), Tuple.of(3))));
316 } 248 }
317 249
318 @Test 250 @Test
319 void patternCallTest() { 251 void equalityTest() {
320 Relation<Boolean> person = new Relation<Boolean>("Person", 1, false); 252 Relation<Boolean> person = new Relation<Boolean>("Person", 1, false);
321 Relation<TruthValue> friend = new Relation<>("friend", 2, TruthValue.FALSE);
322 RelationView<Boolean> persionView = new KeyOnlyRelationView(person); 253 RelationView<Boolean> persionView = new KeyOnlyRelationView(person);
323 RelationView<TruthValue> friendMustView = new FilteredRelationView<TruthValue>(friend, (k, v) -> v.must());
324 254
325 Variable p1 = new Variable("p1"); 255 Variable p1 = new Variable("p1");
326 Variable p2 = new Variable("p2"); 256 Variable p2 = new Variable("p2");
@@ -328,38 +258,26 @@ class QueryTest {
328 258
329 RelationAtom personRelationAtom1 = new RelationAtom(persionView, Arrays.asList(p1)); 259 RelationAtom personRelationAtom1 = new RelationAtom(persionView, Arrays.asList(p1));
330 RelationAtom personRelationAtom2 = new RelationAtom(persionView, Arrays.asList(p2)); 260 RelationAtom personRelationAtom2 = new RelationAtom(persionView, Arrays.asList(p2));
331 RelationAtom friendRelationAtom = new RelationAtom(friendMustView, Arrays.asList(p1, p2)); 261 EquivalenceAtom equivalenceAtom = new EquivalenceAtom(true, p1, p2);
332 DNFAnd clause = new DNFAnd(new HashSet<>(parameters), 262 DNFAnd clause = new DNFAnd(new HashSet<>(parameters),
333 Arrays.asList(personRelationAtom1, personRelationAtom2, friendRelationAtom)); 263 Arrays.asList(personRelationAtom1, personRelationAtom2, equivalenceAtom));
334 DNFPredicate friendPredicate = new DNFPredicate("RelationConstraint", parameters, Arrays.asList(clause)); 264 DNFPredicate predicate = new DNFPredicate("Equality", parameters, Arrays.asList(clause));
335
336 Variable p3 = new Variable("p3");
337 Variable p4 = new Variable("p4");
338 List<Variable> substitution = Arrays.asList(p3, p4);
339 RelationAtom personRelationAtom3 = new RelationAtom(persionView, Arrays.asList(p3));
340 RelationAtom personRelationAtom4 = new RelationAtom(persionView, Arrays.asList(p4));
341 PredicateAtom friendPredicateAtom = new PredicateAtom(true, false, friendPredicate, substitution);
342 DNFAnd patternCallClause = new DNFAnd(new HashSet<>(substitution),
343 Arrays.asList(personRelationAtom3, personRelationAtom4, friendPredicateAtom));
344 DNFPredicate predicate = new DNFPredicate("PatternCall", substitution, Arrays.asList(patternCallClause));
345 265
346 QueriableModelStore store = new QueriableModelStoreImpl(Set.of(person, friend), Set.of(persionView,friendMustView), Set.of(friendPredicate,predicate)); 266 QueriableModelStore store = new QueriableModelStoreImpl(Set.of(person), Set.of(persionView), Set.of(predicate));
347 QueriableModel model = store.createModel(); 267 QueriableModel model = store.createModel();
348 268
349 model.put(person, Tuple.of(0), true); 269 model.put(person, Tuple.of(0), true);
350 model.put(person, Tuple.of(1), true); 270 model.put(person, Tuple.of(1), true);
351 model.put(person, Tuple.of(2), true); 271 model.put(person, Tuple.of(2), true);
352 model.put(friend, Tuple.of(0, 1), TruthValue.TRUE);
353 model.put(friend, Tuple.of(1, 0), TruthValue.TRUE);
354 model.put(friend, Tuple.of(1, 2), TruthValue.TRUE);
355 272
356 model.flushChanges(); 273 model.flushChanges();
357 274 assertEquals(3, model.countResults(predicate));
358 assertEquals(3, model.countResults(friendPredicate)); 275 compareMatchSets(model.allResults(predicate), Set.of(List.of(Tuple.of(0), Tuple.of(0)),
276 List.of(Tuple.of(1), Tuple.of(1)), List.of(Tuple.of(2), Tuple.of(2))));
359 } 277 }
360 278
361 @Test 279 @Test
362 void negativePatternCallTest() { 280 void inequalityTest() {
363 Relation<Boolean> person = new Relation<Boolean>("Person", 1, false); 281 Relation<Boolean> person = new Relation<Boolean>("Person", 1, false);
364 Relation<TruthValue> friend = new Relation<>("friend", 2, TruthValue.FALSE); 282 Relation<TruthValue> friend = new Relation<>("friend", 2, TruthValue.FALSE);
365 RelationView<Boolean> persionView = new KeyOnlyRelationView(person); 283 RelationView<Boolean> persionView = new KeyOnlyRelationView(person);
@@ -367,45 +285,40 @@ class QueryTest {
367 285
368 Variable p1 = new Variable("p1"); 286 Variable p1 = new Variable("p1");
369 Variable p2 = new Variable("p2"); 287 Variable p2 = new Variable("p2");
370 List<Variable> parameters = Arrays.asList(p1, p2); 288 Variable p3 = new Variable("p3");
289 List<Variable> parameters = Arrays.asList(p1, p2, p3);
371 290
372 RelationAtom personRelationAtom1 = new RelationAtom(persionView, Arrays.asList(p1)); 291 RelationAtom personRelationAtom1 = new RelationAtom(persionView, Arrays.asList(p1));
373 RelationAtom personRelationAtom2 = new RelationAtom(persionView, Arrays.asList(p2)); 292 RelationAtom personRelationAtom2 = new RelationAtom(persionView, Arrays.asList(p2));
374 RelationAtom friendRelationAtom = new RelationAtom(friendMustView, Arrays.asList(p1, p2)); 293 RelationAtom friendRelationAtom1 = new RelationAtom(friendMustView, Arrays.asList(p1, p3));
375 DNFAnd clause = new DNFAnd(new HashSet<>(parameters), 294 RelationAtom friendRelationAtom2 = new RelationAtom(friendMustView, Arrays.asList(p2, p3));
376 Arrays.asList(personRelationAtom1, personRelationAtom2, friendRelationAtom)); 295 EquivalenceAtom inequivalenceAtom = new EquivalenceAtom(false, p1, p2);
377 DNFPredicate friendPredicate = new DNFPredicate("RelationConstraint", parameters, Arrays.asList(clause)); 296 DNFAnd clause = new DNFAnd(new HashSet<>(parameters), Arrays.asList(personRelationAtom1, personRelationAtom2,
378 297 friendRelationAtom1, friendRelationAtom2, inequivalenceAtom));
379 Variable p3 = new Variable("p3"); 298 DNFPredicate predicate = new DNFPredicate("Inequality", parameters, Arrays.asList(clause));
380 Variable p4 = new Variable("p4");
381 List<Variable> substitution = Arrays.asList(p3, p4);
382 RelationAtom personRelationAtom3 = new RelationAtom(persionView, Arrays.asList(p3));
383 RelationAtom personRelationAtom4 = new RelationAtom(persionView, Arrays.asList(p4));
384 PredicateAtom friendPredicateAtom = new PredicateAtom(false, false, friendPredicate, substitution);
385 DNFAnd negativePatternCallClause = new DNFAnd(new HashSet<>(substitution),
386 Arrays.asList(personRelationAtom3, personRelationAtom4, friendPredicateAtom));
387 DNFPredicate predicate = new DNFPredicate("NegativePatternCall", substitution,
388 Arrays.asList(negativePatternCallClause));
389 299
390 QueriableModelStore store = new QueriableModelStoreImpl(Set.of(person, friend), Set.of(persionView,friendMustView), Set.of(friendPredicate,predicate)); 300 QueriableModelStore store = new QueriableModelStoreImpl(Set.of(person, friend),
301 Set.of(persionView, friendMustView), Set.of(predicate));
391 QueriableModel model = store.createModel(); 302 QueriableModel model = store.createModel();
392 303
393 model.put(person, Tuple.of(0), true); 304 model.put(person, Tuple.of(0), true);
394 model.put(person, Tuple.of(1), true); 305 model.put(person, Tuple.of(1), true);
395 model.put(person, Tuple.of(2), true); 306 model.put(person, Tuple.of(2), true);
396 model.put(friend, Tuple.of(0, 1), TruthValue.TRUE); 307 model.put(friend, Tuple.of(0, 2), TruthValue.TRUE);
397 model.put(friend, Tuple.of(1, 0), TruthValue.TRUE);
398 model.put(friend, Tuple.of(1, 2), TruthValue.TRUE); 308 model.put(friend, Tuple.of(1, 2), TruthValue.TRUE);
399 309
400 model.flushChanges(); 310 model.flushChanges();
401 assertEquals(6, model.countResults(predicate)); 311 assertEquals(2, model.countResults(predicate));
312 compareMatchSets(model.allResults(predicate),
313 Set.of(List.of(Tuple.of(0), Tuple.of(1), Tuple.of(2)), List.of(Tuple.of(1), Tuple.of(0), Tuple.of(2))));
402 } 314 }
403 315
404 @Test 316 @Test
405 @Disabled 317 void patternCallTest() {
406 void equalityTest() {
407 Relation<Boolean> person = new Relation<Boolean>("Person", 1, false); 318 Relation<Boolean> person = new Relation<Boolean>("Person", 1, false);
319 Relation<TruthValue> friend = new Relation<>("friend", 2, TruthValue.FALSE);
408 RelationView<Boolean> persionView = new KeyOnlyRelationView(person); 320 RelationView<Boolean> persionView = new KeyOnlyRelationView(person);
321 RelationView<TruthValue> friendMustView = new FilteredRelationView<TruthValue>(friend, (k, v) -> v.must());
409 322
410 Variable p1 = new Variable("p1"); 323 Variable p1 = new Variable("p1");
411 Variable p2 = new Variable("p2"); 324 Variable p2 = new Variable("p2");
@@ -413,25 +326,39 @@ class QueryTest {
413 326
414 RelationAtom personRelationAtom1 = new RelationAtom(persionView, Arrays.asList(p1)); 327 RelationAtom personRelationAtom1 = new RelationAtom(persionView, Arrays.asList(p1));
415 RelationAtom personRelationAtom2 = new RelationAtom(persionView, Arrays.asList(p2)); 328 RelationAtom personRelationAtom2 = new RelationAtom(persionView, Arrays.asList(p2));
416 EquivalenceAtom equivalenceAtom = new EquivalenceAtom(true, p1, p2); 329 RelationAtom friendRelationAtom = new RelationAtom(friendMustView, Arrays.asList(p1, p2));
417 DNFAnd clause = new DNFAnd(new HashSet<>(parameters), 330 DNFAnd clause = new DNFAnd(new HashSet<>(parameters),
418 Arrays.asList(personRelationAtom1, personRelationAtom2, equivalenceAtom)); 331 Arrays.asList(personRelationAtom1, personRelationAtom2, friendRelationAtom));
419 DNFPredicate predicate = new DNFPredicate("Equality", parameters, Arrays.asList(clause)); 332 DNFPredicate friendPredicate = new DNFPredicate("RelationConstraint", parameters, Arrays.asList(clause));
420 333
334 Variable p3 = new Variable("p3");
335 Variable p4 = new Variable("p4");
336 List<Variable> substitution = Arrays.asList(p3, p4);
337 RelationAtom personRelationAtom3 = new RelationAtom(persionView, Arrays.asList(p3));
338 RelationAtom personRelationAtom4 = new RelationAtom(persionView, Arrays.asList(p4));
339 PredicateAtom friendPredicateAtom = new PredicateAtom(true, false, friendPredicate, substitution);
340 DNFAnd patternCallClause = new DNFAnd(new HashSet<>(substitution),
341 Arrays.asList(personRelationAtom3, personRelationAtom4, friendPredicateAtom));
342 DNFPredicate predicate = new DNFPredicate("PatternCall", substitution, Arrays.asList(patternCallClause));
421 343
422 ModelStore store = new ModelStoreImpl(Set.of(person)); 344 QueriableModelStore store = new QueriableModelStoreImpl(Set.of(person, friend),
423 Model model = store.createModel(); 345 Set.of(persionView, friendMustView), Set.of(friendPredicate, predicate));
346 QueriableModel model = store.createModel();
424 347
425 model.put(person, Tuple.of(0), true); 348 model.put(person, Tuple.of(0), true);
426 model.put(person, Tuple.of(1), true); 349 model.put(person, Tuple.of(1), true);
427 model.put(person, Tuple.of(2), true); 350 model.put(person, Tuple.of(2), true);
351 model.put(friend, Tuple.of(0, 1), TruthValue.TRUE);
352 model.put(friend, Tuple.of(1, 0), TruthValue.TRUE);
353 model.put(friend, Tuple.of(1, 2), TruthValue.TRUE);
428 354
429 //assertEquals(3, matcher.countMatches()); 355 model.flushChanges();
356
357 assertEquals(3, model.countResults(friendPredicate));
430 } 358 }
431 359
432 @Test 360 @Test
433 @Disabled 361 void negativePatternCallTest() {
434 void inequalityTest() {
435 Relation<Boolean> person = new Relation<Boolean>("Person", 1, false); 362 Relation<Boolean> person = new Relation<Boolean>("Person", 1, false);
436 Relation<TruthValue> friend = new Relation<>("friend", 2, TruthValue.FALSE); 363 Relation<TruthValue> friend = new Relation<>("friend", 2, TruthValue.FALSE);
437 RelationView<Boolean> persionView = new KeyOnlyRelationView(person); 364 RelationView<Boolean> persionView = new KeyOnlyRelationView(person);
@@ -439,32 +366,42 @@ class QueryTest {
439 366
440 Variable p1 = new Variable("p1"); 367 Variable p1 = new Variable("p1");
441 Variable p2 = new Variable("p2"); 368 Variable p2 = new Variable("p2");
442 Variable p3 = new Variable("p3"); 369 List<Variable> parameters = Arrays.asList(p1, p2);
443 List<Variable> parameters = Arrays.asList(p1, p2, p3);
444 370
445 RelationAtom personRelationAtom1 = new RelationAtom(persionView, Arrays.asList(p1)); 371 RelationAtom personRelationAtom1 = new RelationAtom(persionView, Arrays.asList(p1));
446 RelationAtom personRelationAtom2 = new RelationAtom(persionView, Arrays.asList(p2)); 372 RelationAtom personRelationAtom2 = new RelationAtom(persionView, Arrays.asList(p2));
447 RelationAtom friendRelationAtom1 = new RelationAtom(friendMustView, Arrays.asList(p1, p3)); 373 RelationAtom friendRelationAtom = new RelationAtom(friendMustView, Arrays.asList(p1, p2));
448 RelationAtom friendRelationAtom2 = new RelationAtom(friendMustView, Arrays.asList(p2, p3)); 374 DNFAnd clause = new DNFAnd(new HashSet<>(parameters),
449 EquivalenceAtom inequivalenceAtom = new EquivalenceAtom(false, p1, p2); 375 Arrays.asList(personRelationAtom1, personRelationAtom2, friendRelationAtom));
450 DNFAnd clause = new DNFAnd(new HashSet<>(parameters), Arrays.asList(personRelationAtom1, personRelationAtom2, 376 DNFPredicate friendPredicate = new DNFPredicate("RelationConstraint", parameters, Arrays.asList(clause));
451 friendRelationAtom1, friendRelationAtom2, inequivalenceAtom)); 377
452 DNFPredicate predicate = new DNFPredicate("Inequality", parameters, Arrays.asList(clause)); 378 Variable p3 = new Variable("p3");
379 Variable p4 = new Variable("p4");
380 List<Variable> substitution = Arrays.asList(p3, p4);
381 RelationAtom personRelationAtom3 = new RelationAtom(persionView, Arrays.asList(p3));
382 RelationAtom personRelationAtom4 = new RelationAtom(persionView, Arrays.asList(p4));
383 PredicateAtom friendPredicateAtom = new PredicateAtom(false, false, friendPredicate, substitution);
384 DNFAnd negativePatternCallClause = new DNFAnd(new HashSet<>(substitution),
385 Arrays.asList(personRelationAtom3, personRelationAtom4, friendPredicateAtom));
386 DNFPredicate predicate = new DNFPredicate("NegativePatternCall", substitution,
387 Arrays.asList(negativePatternCallClause));
453 388
454 ModelStore store = new ModelStoreImpl(Set.of(person, friend)); 389 QueriableModelStore store = new QueriableModelStoreImpl(Set.of(person, friend),
455 Model model = store.createModel(); 390 Set.of(persionView, friendMustView), Set.of(friendPredicate, predicate));
391 QueriableModel model = store.createModel();
456 392
457 model.put(person, Tuple.of(0), true); 393 model.put(person, Tuple.of(0), true);
458 model.put(person, Tuple.of(1), true); 394 model.put(person, Tuple.of(1), true);
459 model.put(person, Tuple.of(2), true); 395 model.put(person, Tuple.of(2), true);
460 model.put(friend, Tuple.of(0, 2), TruthValue.TRUE); 396 model.put(friend, Tuple.of(0, 1), TruthValue.TRUE);
397 model.put(friend, Tuple.of(1, 0), TruthValue.TRUE);
461 model.put(friend, Tuple.of(1, 2), TruthValue.TRUE); 398 model.put(friend, Tuple.of(1, 2), TruthValue.TRUE);
462 399
463 //assertEquals(2, matcher.countMatches()); 400 model.flushChanges();
401 assertEquals(6, model.countResults(predicate));
464 } 402 }
465 403
466 @Test 404 @Test
467 @Disabled
468 void transitivePatternCallTest() { 405 void transitivePatternCallTest() {
469 Relation<Boolean> person = new Relation<Boolean>("Person", 1, false); 406 Relation<Boolean> person = new Relation<Boolean>("Person", 1, false);
470 Relation<TruthValue> friend = new Relation<>("friend", 2, TruthValue.FALSE); 407 Relation<TruthValue> friend = new Relation<>("friend", 2, TruthValue.FALSE);
@@ -493,17 +430,17 @@ class QueryTest {
493 DNFPredicate predicate = new DNFPredicate("TransitivePatternCall", substitution, 430 DNFPredicate predicate = new DNFPredicate("TransitivePatternCall", substitution,
494 Arrays.asList(patternCallClause)); 431 Arrays.asList(patternCallClause));
495 432
496 ModelStore store = new ModelStoreImpl(Set.of(person, friend)); 433 QueriableModelStore store = new QueriableModelStoreImpl(Set.of(person, friend),
497 Model model = store.createModel(); 434 Set.of(persionView, friendMustView), Set.of(friendPredicate, predicate));
435 QueriableModel model = store.createModel();
498 436
499 model.put(person, Tuple.of(0), true); 437 model.put(person, Tuple.of(0), true);
500 model.put(person, Tuple.of(1), true); 438 model.put(person, Tuple.of(1), true);
501 model.put(person, Tuple.of(2), true); 439 model.put(person, Tuple.of(2), true);
502 model.put(friend, Tuple.of(0, 1), TruthValue.TRUE); 440 model.put(friend, Tuple.of(0, 1), TruthValue.TRUE);
503 model.put(friend, Tuple.of(1, 2), TruthValue.TRUE); 441 model.put(friend, Tuple.of(1, 2), TruthValue.TRUE);
504 442
505 //assertEquals(3, matcher.countMatches()); 443 model.flushChanges();
444 assertEquals(3, model.countResults(predicate));
506 } 445 }
507
508
509} \ No newline at end of file 446} \ No newline at end of file