diff options
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 | */ |
6 | package tools.refinery.store.query.interpreter.internal.pquery; | 6 | package tools.refinery.store.query.interpreter.internal.pquery; |
7 | 7 | ||
8 | import tools.refinery.interpreter.matchers.psystem.annotations.ParameterReference; | ||
8 | import tools.refinery.interpreter.matchers.psystem.basicdeferred.*; | 9 | import tools.refinery.interpreter.matchers.psystem.basicdeferred.*; |
9 | import tools.refinery.interpreter.matchers.psystem.basicenumerables.*; | 10 | import tools.refinery.interpreter.matchers.psystem.basicenumerables.*; |
10 | import tools.refinery.interpreter.matchers.psystem.basicenumerables.Connectivity; | 11 | import 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()) { |