From 810b937df6cb1315e0653d763463fd9dc9db9339 Mon Sep 17 00:00:00 2001 From: Kristóf Marussy Date: Tue, 19 Sep 2023 19:24:29 +0200 Subject: fix(query-interpreter): functional dependencies --- .../interpreter/internal/pquery/Dnf2PQuery.java | 7 ++- .../query/interpreter/FunctionalQueryTest.java | 53 ++++++++++++++++++++++ 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 @@ */ package tools.refinery.store.query.interpreter.internal.pquery; +import tools.refinery.interpreter.matchers.psystem.annotations.ParameterReference; import tools.refinery.interpreter.matchers.psystem.basicdeferred.*; import tools.refinery.interpreter.matchers.psystem.basicenumerables.*; import tools.refinery.interpreter.matchers.psystem.basicenumerables.Connectivity; @@ -80,10 +81,12 @@ public class Dnf2PQuery { for (var functionalDependency : dnfQuery.getFunctionalDependencies()) { var functionalDependencyAnnotation = new PAnnotation("FunctionalDependency"); for (var forEachVariable : functionalDependency.forEach()) { - functionalDependencyAnnotation.addAttribute("forEach", forEachVariable.getUniqueName()); + var reference = new ParameterReference(forEachVariable.getUniqueName()); + functionalDependencyAnnotation.addAttribute("forEach", reference); } for (var uniqueVariable : functionalDependency.unique()) { - functionalDependencyAnnotation.addAttribute("unique", uniqueVariable.getUniqueName()); + var reference = new ParameterReference(uniqueVariable.getUniqueName()); + functionalDependencyAnnotation.addAttribute("unique", reference); } pQuery.addAnnotation(functionalDependencyAnnotation); } 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 { } } + @QueryEngineTest + void multipleFunctionalQueriesTest(QueryEvaluationHint hint) { + var subQuery1 = Query.of("SubQuery1", Integer.class, (builder, p1, output) -> builder.clause( + personView.call(p1), + ageView.call(p1, output) + )); + var subQuery2 = Query.of("SubQuery2", Integer.class, (builder, p1, output) -> builder.clause( + personView.call(p1), + output.assign(friendMustView.count(p1, Variable.of())) + )); + var query = Query.of("Query", Integer.class, (builder, p1, output) -> builder + .clause(Integer.class, Integer.class, (v1, v2) -> List.of( + v1.assign(subQuery1.call(p1)), + v2.assign(subQuery2.call(p1)), + output.assign(add(v1, v2)) + ))); + + var store = ModelStore.builder() + .symbols(person, age, friend) + .with(QueryInterpreterAdapter.builder() + .defaultHint(hint) + .queries(query)) + .build(); + + var model = store.createEmptyModel(); + var personInterpretation = model.getInterpretation(person); + var ageInterpretation = model.getInterpretation(age); + var friendInterpretation = model.getInterpretation(friend); + var queryEngine = model.getAdapter(ModelQueryAdapter.class); + var queryResultSet = queryEngine.getResultSet(query); + + personInterpretation.put(Tuple.of(0), true); + personInterpretation.put(Tuple.of(1), true); + personInterpretation.put(Tuple.of(2), true); + + ageInterpretation.put(Tuple.of(0), 24); + ageInterpretation.put(Tuple.of(1), 30); + ageInterpretation.put(Tuple.of(2), 36); + + friendInterpretation.put(Tuple.of(0, 1), TruthValue.TRUE); + friendInterpretation.put(Tuple.of(1, 0), TruthValue.TRUE); + friendInterpretation.put(Tuple.of(1, 2), TruthValue.TRUE); + + queryEngine.flushChanges(); + queryEngine.flushChanges(); + assertNullableResults(Map.of( + Tuple.of(0), Optional.of(25), + Tuple.of(1), Optional.of(32), + Tuple.of(2), Optional.of(36), + Tuple.of(3), Optional.empty() + ), queryResultSet); + } + private static void enumerateValues(Cursor cursor) { //noinspection StatementWithEmptyBody while (cursor.move()) { -- cgit v1.2.3-54-g00ecf