From 8d9b031e3be7635bb57871df588a27df57f44e78 Mon Sep 17 00:00:00 2001 From: Kristóf Marussy Date: Wed, 1 Feb 2023 20:22:28 +0100 Subject: refactor: VIATRA adapter fixes --- .../viatra/internal/context/DummyBaseIndexer.java | 8 +++--- .../context/RelationalQueryMetaContext.java | 5 ++++ .../internal/context/RelationalRuntimeContext.java | 1 - .../query/viatra/internal/pquery/DNF2PQuery.java | 29 ++++++++++++++-------- .../TupleChangingRelationViewUpdateListener.java | 2 +- 5 files changed, 28 insertions(+), 17 deletions(-) (limited to 'subprojects/store-query-viatra') diff --git a/subprojects/store-query-viatra/src/main/java/tools/refinery/store/query/viatra/internal/context/DummyBaseIndexer.java b/subprojects/store-query-viatra/src/main/java/tools/refinery/store/query/viatra/internal/context/DummyBaseIndexer.java index 4b311a64..29f0536c 100644 --- a/subprojects/store-query-viatra/src/main/java/tools/refinery/store/query/viatra/internal/context/DummyBaseIndexer.java +++ b/subprojects/store-query-viatra/src/main/java/tools/refinery/store/query/viatra/internal/context/DummyBaseIndexer.java @@ -38,21 +38,21 @@ public class DummyBaseIndexer implements IBaseIndex { @Override public boolean addIndexingErrorListener(IIndexingErrorListener listener) { - return true; + return false; } @Override public boolean removeIndexingErrorListener(IIndexingErrorListener listener) { - return true; + return false; } @Override public boolean addInstanceObserver(IInstanceObserver observer, Object observedObject) { - return true; + return false; } @Override public boolean removeInstanceObserver(IInstanceObserver observer, Object observedObject) { - return true; + return false; } } diff --git a/subprojects/store-query-viatra/src/main/java/tools/refinery/store/query/viatra/internal/context/RelationalQueryMetaContext.java b/subprojects/store-query-viatra/src/main/java/tools/refinery/store/query/viatra/internal/context/RelationalQueryMetaContext.java index 47b83634..81046b2a 100644 --- a/subprojects/store-query-viatra/src/main/java/tools/refinery/store/query/viatra/internal/context/RelationalQueryMetaContext.java +++ b/subprojects/store-query-viatra/src/main/java/tools/refinery/store/query/viatra/internal/context/RelationalQueryMetaContext.java @@ -25,6 +25,11 @@ public class RelationalQueryMetaContext extends AbstractQueryMetaContext { return true; } + @Override + public boolean canLeadOutOfScope(IInputKey key) { + return false; + } + @Override public Collection getImplications(IInputKey implyingKey) { ensureValidKey(implyingKey); diff --git a/subprojects/store-query-viatra/src/main/java/tools/refinery/store/query/viatra/internal/context/RelationalRuntimeContext.java b/subprojects/store-query-viatra/src/main/java/tools/refinery/store/query/viatra/internal/context/RelationalRuntimeContext.java index 7375b240..9c1d966c 100644 --- a/subprojects/store-query-viatra/src/main/java/tools/refinery/store/query/viatra/internal/context/RelationalRuntimeContext.java +++ b/subprojects/store-query-viatra/src/main/java/tools/refinery/store/query/viatra/internal/context/RelationalRuntimeContext.java @@ -10,7 +10,6 @@ import tools.refinery.store.model.Model; import tools.refinery.store.query.viatra.internal.pquery.RelationViewWrapper; import tools.refinery.store.query.viatra.internal.update.ModelUpdateListener; import tools.refinery.store.query.view.AnyRelationView; -import tools.refinery.store.query.view.RelationView; import java.lang.reflect.InvocationTargetException; import java.util.Iterator; 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 eb815588..f2cb8d8d 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 @@ -27,6 +27,8 @@ import java.util.function.Function; import java.util.stream.Collectors; public class DNF2PQuery { + private static final Object P_CONSTRAINT_LOCK = new Object(); + private final Set translating = new LinkedHashSet<>(); private final Map dnf2PQueryMap = new HashMap<>(); @@ -84,17 +86,22 @@ public class DNF2PQuery { } pQuery.setParameters(parameterList); - for (DNFAnd clause : dnfQuery.getClauses()) { - PBody body = new PBody(pQuery); - List symbolicParameters = new ArrayList<>(); - for (var param : dnfQuery.getParameters()) { - PVariable pVar = body.getOrCreateVariableByName(param.getUniqueName()); - symbolicParameters.add(new ExportedParameter(body, pVar, parameters.get(param))); - } - body.setSymbolicParameters(symbolicParameters); - pQuery.addBody(body); - for (DNFAtom constraint : clause.constraints()) { - translateDNFAtom(constraint, body); + // The constructor of {@link org.eclipse.viatra.query.runtime.matchers.psystem.BasePConstraint} mutates + // global static state (nextID) without locking. Therefore, we need to synchronize before creating + // any query constraints to avoid a data race. + synchronized (P_CONSTRAINT_LOCK) { + for (DNFAnd clause : dnfQuery.getClauses()) { + PBody body = new PBody(pQuery); + List symbolicParameters = new ArrayList<>(); + for (var param : dnfQuery.getParameters()) { + PVariable pVar = body.getOrCreateVariableByName(param.getUniqueName()); + symbolicParameters.add(new ExportedParameter(body, pVar, parameters.get(param))); + } + body.setSymbolicParameters(symbolicParameters); + pQuery.addBody(body); + for (DNFAtom constraint : clause.constraints()) { + translateDNFAtom(constraint, body); + } } } diff --git a/subprojects/store-query-viatra/src/main/java/tools/refinery/store/query/viatra/internal/update/TupleChangingRelationViewUpdateListener.java b/subprojects/store-query-viatra/src/main/java/tools/refinery/store/query/viatra/internal/update/TupleChangingRelationViewUpdateListener.java index c17e826d..0d43eac1 100644 --- a/subprojects/store-query-viatra/src/main/java/tools/refinery/store/query/viatra/internal/update/TupleChangingRelationViewUpdateListener.java +++ b/subprojects/store-query-viatra/src/main/java/tools/refinery/store/query/viatra/internal/update/TupleChangingRelationViewUpdateListener.java @@ -28,7 +28,7 @@ public class TupleChangingRelationViewUpdateListener extends RelationViewUpda } else { // fromValue disappears processUpdate(Tuples.flatTupleOf(relationView.forwardMap(key, fromValue)), false); } - } else if (toPresent) { // toValue disappears + } else if (toPresent) { // toValue appears processUpdate(Tuples.flatTupleOf(relationView.forwardMap(key, toValue)), true); } } -- cgit v1.2.3-54-g00ecf