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 +- .../store/partial/PartialInterpretation.java | 18 ++++++++++++++ .../store/partial/PartialModelAdapter.java | 24 ++++++++++++++++++ .../store/partial/PartialModelAdapterBuilder.java | 16 ++++++++++++ .../store/partial/PartialModelStoreAdapter.java | 23 +++++++++++++++++ .../refinery/store/query/atom/ModalRelation.java | 17 ------------- 10 files changed, 109 insertions(+), 34 deletions(-) create mode 100644 subprojects/store/src/main/java/tools/refinery/store/partial/PartialInterpretation.java create mode 100644 subprojects/store/src/main/java/tools/refinery/store/partial/PartialModelAdapter.java create mode 100644 subprojects/store/src/main/java/tools/refinery/store/partial/PartialModelAdapterBuilder.java create mode 100644 subprojects/store/src/main/java/tools/refinery/store/partial/PartialModelStoreAdapter.java delete mode 100644 subprojects/store/src/main/java/tools/refinery/store/query/atom/ModalRelation.java (limited to 'subprojects') 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); } } diff --git a/subprojects/store/src/main/java/tools/refinery/store/partial/PartialInterpretation.java b/subprojects/store/src/main/java/tools/refinery/store/partial/PartialInterpretation.java new file mode 100644 index 00000000..7d367937 --- /dev/null +++ b/subprojects/store/src/main/java/tools/refinery/store/partial/PartialInterpretation.java @@ -0,0 +1,18 @@ +package tools.refinery.store.partial; + +import tools.refinery.store.adapter.ModelAdapterBuilderFactory; +import tools.refinery.store.model.ModelStoreBuilder; + +public final class PartialInterpretation extends ModelAdapterBuilderFactory { + public static final PartialInterpretation ADAPTER = new PartialInterpretation(); + + private PartialInterpretation() { + super(PartialModelAdapter.class, PartialModelStoreAdapter.class, PartialModelAdapterBuilder.class); + } + + @Override + public PartialModelAdapterBuilder createBuilder(ModelStoreBuilder storeBuilder) { + return new PartialModelAdapterBuilder(storeBuilder); + } +} diff --git a/subprojects/store/src/main/java/tools/refinery/store/partial/PartialModelAdapter.java b/subprojects/store/src/main/java/tools/refinery/store/partial/PartialModelAdapter.java new file mode 100644 index 00000000..cdab5606 --- /dev/null +++ b/subprojects/store/src/main/java/tools/refinery/store/partial/PartialModelAdapter.java @@ -0,0 +1,24 @@ +package tools.refinery.store.partial; + +import tools.refinery.store.adapter.ModelAdapter; +import tools.refinery.store.model.Model; + +public class PartialModelAdapter implements ModelAdapter { + private final Model model; + private final PartialModelStoreAdapter storeAdapter; + + PartialModelAdapter(Model model, PartialModelStoreAdapter storeAdapter) { + this.model = model; + this.storeAdapter = storeAdapter; + } + + @Override + public Model getModel() { + return model; + } + + @Override + public PartialModelStoreAdapter getStoreAdapter() { + return storeAdapter; + } +} diff --git a/subprojects/store/src/main/java/tools/refinery/store/partial/PartialModelAdapterBuilder.java b/subprojects/store/src/main/java/tools/refinery/store/partial/PartialModelAdapterBuilder.java new file mode 100644 index 00000000..0d4a32b9 --- /dev/null +++ b/subprojects/store/src/main/java/tools/refinery/store/partial/PartialModelAdapterBuilder.java @@ -0,0 +1,16 @@ +package tools.refinery.store.partial; + +import tools.refinery.store.adapter.AbstractModelAdapterBuilder; +import tools.refinery.store.model.ModelStore; +import tools.refinery.store.model.ModelStoreBuilder; + +public class PartialModelAdapterBuilder extends AbstractModelAdapterBuilder { + PartialModelAdapterBuilder(ModelStoreBuilder storeBuilder) { + super(storeBuilder); + } + + @Override + public PartialModelStoreAdapter createStoreAdapter(ModelStore store) { + return null; + } +} diff --git a/subprojects/store/src/main/java/tools/refinery/store/partial/PartialModelStoreAdapter.java b/subprojects/store/src/main/java/tools/refinery/store/partial/PartialModelStoreAdapter.java new file mode 100644 index 00000000..d9432a7d --- /dev/null +++ b/subprojects/store/src/main/java/tools/refinery/store/partial/PartialModelStoreAdapter.java @@ -0,0 +1,23 @@ +package tools.refinery.store.partial; + +import tools.refinery.store.adapter.ModelStoreAdapter; +import tools.refinery.store.model.Model; +import tools.refinery.store.model.ModelStore; + +public class PartialModelStoreAdapter implements ModelStoreAdapter { + private final ModelStore store; + + PartialModelStoreAdapter(ModelStore store) { + this.store = store; + } + + @Override + public ModelStore getStore() { + return store; + } + + @Override + public PartialModelAdapter createModelAdapter(Model model) { + return new PartialModelAdapter(model, this); + } +} diff --git a/subprojects/store/src/main/java/tools/refinery/store/query/atom/ModalRelation.java b/subprojects/store/src/main/java/tools/refinery/store/query/atom/ModalRelation.java deleted file mode 100644 index c2ca1fdb..00000000 --- a/subprojects/store/src/main/java/tools/refinery/store/query/atom/ModalRelation.java +++ /dev/null @@ -1,17 +0,0 @@ -package tools.refinery.store.query.atom; - -import tools.refinery.store.representation.SymbolLike; -import tools.refinery.store.representation.Symbol; -import tools.refinery.store.representation.TruthValue; - -public record ModalRelation(Modality modality, Symbol relation) implements SymbolLike { - @Override - public String name() { - return "%s %s".formatted(modality, relation); - } - - @Override - public int arity() { - return relation.arity(); - } -} -- cgit v1.2.3-70-g09d2