From f6440ff43e2e7497116c2cf762f61e07834b229f Mon Sep 17 00:00:00 2001 From: Kristóf Marussy Date: Sun, 9 Jul 2023 19:53:46 +0200 Subject: refactor: enable data variable unification This is needed for demand set transformation of DNFs with input data parameters, where the result of the transformation has an out data parameter that has to be unified with the variable in the parent clause. --- .../query/viatra/internal/pquery/Dnf2PQuery.java | 2 +- .../store/query/viatra/FunctionalQueryTest.java | 36 ++++++++++++++++++++++ 2 files changed, 37 insertions(+), 1 deletion(-) (limited to 'subprojects/store-query-viatra/src') diff --git a/subprojects/store-query-viatra/src/main/java/tools/refinery/store/query/viatra/internal/pquery/Dnf2PQuery.java b/subprojects/store-query-viatra/src/main/java/tools/refinery/store/query/viatra/internal/pquery/Dnf2PQuery.java index 38fd017e..d51bc9fc 100644 --- a/subprojects/store-query-viatra/src/main/java/tools/refinery/store/query/viatra/internal/pquery/Dnf2PQuery.java +++ b/subprojects/store-query-viatra/src/main/java/tools/refinery/store/query/viatra/internal/pquery/Dnf2PQuery.java @@ -88,7 +88,7 @@ public class Dnf2PQuery { List parameterList = new ArrayList<>(); for (var parameter : dnfQuery.getSymbolicParameters()) { var direction = switch (parameter.getDirection()) { - case OUT -> parameter.isUnifiable() ? PParameterDirection.INOUT : PParameterDirection.OUT; + case OUT -> PParameterDirection.INOUT; case IN -> throw new IllegalArgumentException("Query %s with input parameter %s is not supported" .formatted(dnfQuery, parameter.getVariable())); }; diff --git a/subprojects/store-query-viatra/src/test/java/tools/refinery/store/query/viatra/FunctionalQueryTest.java b/subprojects/store-query-viatra/src/test/java/tools/refinery/store/query/viatra/FunctionalQueryTest.java index c4f877c5..7f5c24fe 100644 --- a/subprojects/store-query-viatra/src/test/java/tools/refinery/store/query/viatra/FunctionalQueryTest.java +++ b/subprojects/store-query-viatra/src/test/java/tools/refinery/store/query/viatra/FunctionalQueryTest.java @@ -423,6 +423,42 @@ class FunctionalQueryTest { ), queryResultSet); } + @QueryEngineTest + void multipleAssignmentTest(QueryEvaluationHint hint) { + var query = Query.of("MultipleAssignment", Integer.class, (builder, p1, p2, output) -> builder + .clause(Integer.class, Integer.class, (x1, x2) -> List.of( + ageView.call(p1, x1), + ageView.call(p2, x2), + output.assign(mul(x1, constant(2))), + output.assign(mul(x2, constant(3))) + ))); + + var store = ModelStore.builder() + .symbols(age) + .with(ViatraModelQueryAdapter.builder() + .defaultHint(hint) + .queries(query)) + .build(); + + var model = store.createEmptyModel(); + var ageInterpretation = model.getInterpretation(age); + var queryEngine = model.getAdapter(ModelQueryAdapter.class); + var queryResultSet = queryEngine.getResultSet(query); + + ageInterpretation.put(Tuple.of(0), 3); + ageInterpretation.put(Tuple.of(1), 2); + ageInterpretation.put(Tuple.of(2), 15); + ageInterpretation.put(Tuple.of(3), 10); + + queryEngine.flushChanges(); + assertNullableResults(Map.of( + Tuple.of(0, 1), Optional.of(6), + Tuple.of(1, 0), Optional.empty(), + Tuple.of(2, 3), Optional.of(30), + Tuple.of(3, 2), Optional.empty() + ), queryResultSet); + } + @QueryEngineTest void notFunctionalTest(QueryEvaluationHint hint) { var query = Query.of("NotFunctional", Integer.class, (builder, p1, output) -> builder.clause((p2) -> List.of( -- cgit v1.2.3-70-g09d2