diff options
Diffstat (limited to 'subprojects/store-query-viatra/src/test/java/tools/refinery/store/query/viatra/QueryTest.java')
-rw-r--r-- | subprojects/store-query-viatra/src/test/java/tools/refinery/store/query/viatra/QueryTest.java | 93 |
1 files changed, 90 insertions, 3 deletions
diff --git a/subprojects/store-query-viatra/src/test/java/tools/refinery/store/query/viatra/QueryTest.java b/subprojects/store-query-viatra/src/test/java/tools/refinery/store/query/viatra/QueryTest.java index 25bcb0dc..ce403e3a 100644 --- a/subprojects/store-query-viatra/src/test/java/tools/refinery/store/query/viatra/QueryTest.java +++ b/subprojects/store-query-viatra/src/test/java/tools/refinery/store/query/viatra/QueryTest.java | |||
@@ -5,11 +5,13 @@ | |||
5 | */ | 5 | */ |
6 | package tools.refinery.store.query.viatra; | 6 | package tools.refinery.store.query.viatra; |
7 | 7 | ||
8 | import org.eclipse.viatra.query.runtime.matchers.backend.QueryEvaluationHint; | 8 | import tools.refinery.viatra.runtime.matchers.backend.QueryEvaluationHint; |
9 | import org.junit.jupiter.api.Test; | 9 | import org.junit.jupiter.api.Test; |
10 | import tools.refinery.store.model.ModelStore; | 10 | import tools.refinery.store.model.ModelStore; |
11 | import tools.refinery.store.query.ModelQueryAdapter; | 11 | import tools.refinery.store.query.ModelQueryAdapter; |
12 | import tools.refinery.store.query.dnf.Dnf; | ||
12 | import tools.refinery.store.query.dnf.Query; | 13 | import tools.refinery.store.query.dnf.Query; |
14 | import tools.refinery.store.query.term.ParameterDirection; | ||
13 | import tools.refinery.store.query.term.Variable; | 15 | import tools.refinery.store.query.term.Variable; |
14 | import tools.refinery.store.query.viatra.tests.QueryEngineTest; | 16 | import tools.refinery.store.query.viatra.tests.QueryEngineTest; |
15 | import tools.refinery.store.query.view.AnySymbolView; | 17 | import tools.refinery.store.query.view.AnySymbolView; |
@@ -23,7 +25,7 @@ import tools.refinery.store.tuple.Tuple; | |||
23 | import java.util.List; | 25 | import java.util.List; |
24 | import java.util.Map; | 26 | import java.util.Map; |
25 | 27 | ||
26 | import static tools.refinery.store.query.literal.Literals.assume; | 28 | import static tools.refinery.store.query.literal.Literals.check; |
27 | import static tools.refinery.store.query.literal.Literals.not; | 29 | import static tools.refinery.store.query.literal.Literals.not; |
28 | import static tools.refinery.store.query.term.int_.IntTerms.constant; | 30 | import static tools.refinery.store.query.term.int_.IntTerms.constant; |
29 | import static tools.refinery.store.query.term.int_.IntTerms.greaterEq; | 31 | import static tools.refinery.store.query.term.int_.IntTerms.greaterEq; |
@@ -108,6 +110,44 @@ class QueryTest { | |||
108 | } | 110 | } |
109 | 111 | ||
110 | @QueryEngineTest | 112 | @QueryEngineTest |
113 | void isConstantTest(QueryEvaluationHint hint) { | ||
114 | var predicate = Query.of("RelationConstraint", (builder, p1, p2) -> builder.clause( | ||
115 | personView.call(p1), | ||
116 | p1.isConstant(1), | ||
117 | friendMustView.call(p1, p2) | ||
118 | )); | ||
119 | |||
120 | var store = ModelStore.builder() | ||
121 | .symbols(person, friend) | ||
122 | .with(ViatraModelQueryAdapter.builder() | ||
123 | .defaultHint(hint) | ||
124 | .queries(predicate)) | ||
125 | .build(); | ||
126 | |||
127 | var model = store.createEmptyModel(); | ||
128 | var personInterpretation = model.getInterpretation(person); | ||
129 | var friendInterpretation = model.getInterpretation(friend); | ||
130 | var queryEngine = model.getAdapter(ModelQueryAdapter.class); | ||
131 | var predicateResultSet = queryEngine.getResultSet(predicate); | ||
132 | |||
133 | personInterpretation.put(Tuple.of(0), true); | ||
134 | personInterpretation.put(Tuple.of(1), true); | ||
135 | personInterpretation.put(Tuple.of(2), true); | ||
136 | |||
137 | friendInterpretation.put(Tuple.of(0, 1), TruthValue.TRUE); | ||
138 | friendInterpretation.put(Tuple.of(1, 0), TruthValue.TRUE); | ||
139 | friendInterpretation.put(Tuple.of(1, 2), TruthValue.TRUE); | ||
140 | |||
141 | queryEngine.flushChanges(); | ||
142 | assertResults(Map.of( | ||
143 | Tuple.of(0, 1), false, | ||
144 | Tuple.of(1, 0), true, | ||
145 | Tuple.of(1, 2), true, | ||
146 | Tuple.of(2, 1), false | ||
147 | ), predicateResultSet); | ||
148 | } | ||
149 | |||
150 | @QueryEngineTest | ||
111 | void existTest(QueryEvaluationHint hint) { | 151 | void existTest(QueryEvaluationHint hint) { |
112 | var predicate = Query.of("Exists", (builder, p1) -> builder.clause((p2) -> List.of( | 152 | var predicate = Query.of("Exists", (builder, p1) -> builder.clause((p2) -> List.of( |
113 | personView.call(p1), | 153 | personView.call(p1), |
@@ -312,6 +352,53 @@ class QueryTest { | |||
312 | } | 352 | } |
313 | 353 | ||
314 | @QueryEngineTest | 354 | @QueryEngineTest |
355 | void patternCallInputArgumentTest(QueryEvaluationHint hint) { | ||
356 | var friendPredicate = Dnf.of("Friend", builder -> { | ||
357 | var p1 = builder.parameter("p1", ParameterDirection.IN); | ||
358 | var p2 = builder.parameter("p2", ParameterDirection.IN); | ||
359 | builder.clause( | ||
360 | personView.call(p1), | ||
361 | personView.call(p2), | ||
362 | friendMustView.call(p1, p2) | ||
363 | ); | ||
364 | }); | ||
365 | var predicate = Query.of("PositivePatternCall", (builder, p3, p4) -> builder.clause( | ||
366 | personView.call(p3), | ||
367 | personView.call(p4), | ||
368 | friendPredicate.call(p3, p4) | ||
369 | )); | ||
370 | |||
371 | var store = ModelStore.builder() | ||
372 | .symbols(person, friend) | ||
373 | .with(ViatraModelQueryAdapter.builder() | ||
374 | .defaultHint(hint) | ||
375 | .queries(predicate)) | ||
376 | .build(); | ||
377 | |||
378 | var model = store.createEmptyModel(); | ||
379 | var personInterpretation = model.getInterpretation(person); | ||
380 | var friendInterpretation = model.getInterpretation(friend); | ||
381 | var queryEngine = model.getAdapter(ModelQueryAdapter.class); | ||
382 | var predicateResultSet = queryEngine.getResultSet(predicate); | ||
383 | |||
384 | personInterpretation.put(Tuple.of(0), true); | ||
385 | personInterpretation.put(Tuple.of(1), true); | ||
386 | personInterpretation.put(Tuple.of(2), true); | ||
387 | |||
388 | friendInterpretation.put(Tuple.of(0, 1), TruthValue.TRUE); | ||
389 | friendInterpretation.put(Tuple.of(1, 0), TruthValue.TRUE); | ||
390 | friendInterpretation.put(Tuple.of(1, 2), TruthValue.TRUE); | ||
391 | |||
392 | queryEngine.flushChanges(); | ||
393 | assertResults(Map.of( | ||
394 | Tuple.of(0, 1), true, | ||
395 | Tuple.of(1, 0), true, | ||
396 | Tuple.of(1, 2), true, | ||
397 | Tuple.of(2, 1), false | ||
398 | ), predicateResultSet); | ||
399 | } | ||
400 | |||
401 | @QueryEngineTest | ||
315 | void negativeRelationViewTest(QueryEvaluationHint hint) { | 402 | void negativeRelationViewTest(QueryEvaluationHint hint) { |
316 | var predicate = Query.of("NegativePatternCall", (builder, p1, p2) -> builder.clause( | 403 | var predicate = Query.of("NegativePatternCall", (builder, p1, p2) -> builder.clause( |
317 | personView.call(p1), | 404 | personView.call(p1), |
@@ -652,7 +739,7 @@ class QueryTest { | |||
652 | var query = Query.of("Constraint", (builder, p1) -> builder.clause(Integer.class, (x) -> List.of( | 739 | var query = Query.of("Constraint", (builder, p1) -> builder.clause(Integer.class, (x) -> List.of( |
653 | personView.call(p1), | 740 | personView.call(p1), |
654 | ageView.call(p1, x), | 741 | ageView.call(p1, x), |
655 | assume(greaterEq(x, constant(18))) | 742 | check(greaterEq(x, constant(18))) |
656 | ))); | 743 | ))); |
657 | 744 | ||
658 | var store = ModelStore.builder() | 745 | var store = ModelStore.builder() |