aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorLibravatar Kristóf Marussy <kristof@marussy.com>2023-09-19 19:24:29 +0200
committerLibravatar Kristóf Marussy <kristof@marussy.com>2023-09-19 19:24:29 +0200
commit810b937df6cb1315e0653d763463fd9dc9db9339 (patch)
treeecbb4d297820fd12460128a057725c7598a3dd38
parentfix(frontend): typo in EditorTheme (diff)
downloadrefinery-810b937df6cb1315e0653d763463fd9dc9db9339.tar.gz
refinery-810b937df6cb1315e0653d763463fd9dc9db9339.tar.zst
refinery-810b937df6cb1315e0653d763463fd9dc9db9339.zip
fix(query-interpreter): functional dependencies
-rw-r--r--subprojects/store-query-interpreter/src/main/java/tools/refinery/store/query/interpreter/internal/pquery/Dnf2PQuery.java7
-rw-r--r--subprojects/store-query-interpreter/src/test/java/tools/refinery/store/query/interpreter/FunctionalQueryTest.java53
2 files changed, 58 insertions, 2 deletions
diff --git a/subprojects/store-query-interpreter/src/main/java/tools/refinery/store/query/interpreter/internal/pquery/Dnf2PQuery.java b/subprojects/store-query-interpreter/src/main/java/tools/refinery/store/query/interpreter/internal/pquery/Dnf2PQuery.java
index 73ce4043..24205cf4 100644
--- a/subprojects/store-query-interpreter/src/main/java/tools/refinery/store/query/interpreter/internal/pquery/Dnf2PQuery.java
+++ b/subprojects/store-query-interpreter/src/main/java/tools/refinery/store/query/interpreter/internal/pquery/Dnf2PQuery.java
@@ -5,6 +5,7 @@
5 */ 5 */
6package tools.refinery.store.query.interpreter.internal.pquery; 6package tools.refinery.store.query.interpreter.internal.pquery;
7 7
8import tools.refinery.interpreter.matchers.psystem.annotations.ParameterReference;
8import tools.refinery.interpreter.matchers.psystem.basicdeferred.*; 9import tools.refinery.interpreter.matchers.psystem.basicdeferred.*;
9import tools.refinery.interpreter.matchers.psystem.basicenumerables.*; 10import tools.refinery.interpreter.matchers.psystem.basicenumerables.*;
10import tools.refinery.interpreter.matchers.psystem.basicenumerables.Connectivity; 11import tools.refinery.interpreter.matchers.psystem.basicenumerables.Connectivity;
@@ -80,10 +81,12 @@ public class Dnf2PQuery {
80 for (var functionalDependency : dnfQuery.getFunctionalDependencies()) { 81 for (var functionalDependency : dnfQuery.getFunctionalDependencies()) {
81 var functionalDependencyAnnotation = new PAnnotation("FunctionalDependency"); 82 var functionalDependencyAnnotation = new PAnnotation("FunctionalDependency");
82 for (var forEachVariable : functionalDependency.forEach()) { 83 for (var forEachVariable : functionalDependency.forEach()) {
83 functionalDependencyAnnotation.addAttribute("forEach", forEachVariable.getUniqueName()); 84 var reference = new ParameterReference(forEachVariable.getUniqueName());
85 functionalDependencyAnnotation.addAttribute("forEach", reference);
84 } 86 }
85 for (var uniqueVariable : functionalDependency.unique()) { 87 for (var uniqueVariable : functionalDependency.unique()) {
86 functionalDependencyAnnotation.addAttribute("unique", uniqueVariable.getUniqueName()); 88 var reference = new ParameterReference(uniqueVariable.getUniqueName());
89 functionalDependencyAnnotation.addAttribute("unique", reference);
87 } 90 }
88 pQuery.addAnnotation(functionalDependencyAnnotation); 91 pQuery.addAnnotation(functionalDependencyAnnotation);
89 } 92 }
diff --git a/subprojects/store-query-interpreter/src/test/java/tools/refinery/store/query/interpreter/FunctionalQueryTest.java b/subprojects/store-query-interpreter/src/test/java/tools/refinery/store/query/interpreter/FunctionalQueryTest.java
index 00721a34..b6c96676 100644
--- a/subprojects/store-query-interpreter/src/test/java/tools/refinery/store/query/interpreter/FunctionalQueryTest.java
+++ b/subprojects/store-query-interpreter/src/test/java/tools/refinery/store/query/interpreter/FunctionalQueryTest.java
@@ -510,6 +510,59 @@ class FunctionalQueryTest {
510 } 510 }
511 } 511 }
512 512
513 @QueryEngineTest
514 void multipleFunctionalQueriesTest(QueryEvaluationHint hint) {
515 var subQuery1 = Query.of("SubQuery1", Integer.class, (builder, p1, output) -> builder.clause(
516 personView.call(p1),
517 ageView.call(p1, output)
518 ));
519 var subQuery2 = Query.of("SubQuery2", Integer.class, (builder, p1, output) -> builder.clause(
520 personView.call(p1),
521 output.assign(friendMustView.count(p1, Variable.of()))
522 ));
523 var query = Query.of("Query", Integer.class, (builder, p1, output) -> builder
524 .clause(Integer.class, Integer.class, (v1, v2) -> List.of(
525 v1.assign(subQuery1.call(p1)),
526 v2.assign(subQuery2.call(p1)),
527 output.assign(add(v1, v2))
528 )));
529
530 var store = ModelStore.builder()
531 .symbols(person, age, friend)
532 .with(QueryInterpreterAdapter.builder()
533 .defaultHint(hint)
534 .queries(query))
535 .build();
536
537 var model = store.createEmptyModel();
538 var personInterpretation = model.getInterpretation(person);
539 var ageInterpretation = model.getInterpretation(age);
540 var friendInterpretation = model.getInterpretation(friend);
541 var queryEngine = model.getAdapter(ModelQueryAdapter.class);
542 var queryResultSet = queryEngine.getResultSet(query);
543
544 personInterpretation.put(Tuple.of(0), true);
545 personInterpretation.put(Tuple.of(1), true);
546 personInterpretation.put(Tuple.of(2), true);
547
548 ageInterpretation.put(Tuple.of(0), 24);
549 ageInterpretation.put(Tuple.of(1), 30);
550 ageInterpretation.put(Tuple.of(2), 36);
551
552 friendInterpretation.put(Tuple.of(0, 1), TruthValue.TRUE);
553 friendInterpretation.put(Tuple.of(1, 0), TruthValue.TRUE);
554 friendInterpretation.put(Tuple.of(1, 2), TruthValue.TRUE);
555
556 queryEngine.flushChanges();
557 queryEngine.flushChanges();
558 assertNullableResults(Map.of(
559 Tuple.of(0), Optional.of(25),
560 Tuple.of(1), Optional.of(32),
561 Tuple.of(2), Optional.of(36),
562 Tuple.of(3), Optional.empty()
563 ), queryResultSet);
564 }
565
513 private static void enumerateValues(Cursor<?, ?> cursor) { 566 private static void enumerateValues(Cursor<?, ?> cursor) {
514 //noinspection StatementWithEmptyBody 567 //noinspection StatementWithEmptyBody
515 while (cursor.move()) { 568 while (cursor.move()) {