From ea0f09096afe05e2d414c707584e1e33c0c44383 Mon Sep 17 00:00:00 2001 From: Kristóf Marussy Date: Fri, 21 Apr 2023 02:12:04 +0200 Subject: refactor: simplify ModelAdapter * Remove the reflection-based machinery around adapter types. * Adapter builders, store adapters, and model adapters are now only associated with each other based on static and runtime types. * Simplifies writing new adapters. * Hierarchical syntax for adding adapter builders to the store builder. --- .../store/query/viatra/ViatraModelQuery.java | 26 ----- .../query/viatra/ViatraModelQueryAdapter.java | 5 + .../query/viatra/ViatraModelQueryBuilder.java | 2 +- .../internal/ViatraModelQueryBuilderImpl.java | 22 +++- .../store/query/viatra/DiagonalQueryTest.java | 66 +++++------ .../store/query/viatra/FunctionalQueryTest.java | 90 +++++++-------- .../refinery/store/query/viatra/QueryTest.java | 123 ++++++++++----------- .../store/query/viatra/QueryTransactionTest.java | 46 ++++---- .../tools/refinery/store/query/ModelQuery.java | 16 --- .../refinery/store/query/ModelQueryBuilder.java | 2 +- .../tools/refinery/store/reasoning/Reasoning.java | 29 ----- .../refinery/store/reasoning/ReasoningAdapter.java | 9 +- .../refinery/store/reasoning/ReasoningBuilder.java | 2 +- .../reasoning/internal/ReasoningAdapterImpl.java | 2 +- .../reasoning/internal/ReasoningBuilderImpl.java | 13 +-- .../store/reasoning/lifting/DnfLifter.java | 8 +- .../reasoning/rule/RelationRefinementAction.java | 4 +- .../reasoning/translator/TranslationUnit.java | 5 - .../base/BaseDecisionTranslationUnit.java | 5 - .../store/adapter/AbstractModelAdapterBuilder.java | 42 ++++--- .../tools/refinery/store/adapter/AdapterList.java | 102 ----------------- .../tools/refinery/store/adapter/AdapterUtils.java | 33 ++++++ .../store/adapter/AnyModelAdapterType.java | 24 ---- .../store/adapter/ModelAdapterBuilder.java | 11 +- .../store/adapter/ModelAdapterBuilderFactory.java | 19 ---- .../refinery/store/adapter/ModelAdapterType.java | 84 -------------- .../java/tools/refinery/store/model/Model.java | 5 +- .../tools/refinery/store/model/ModelStore.java | 5 +- .../refinery/store/model/ModelStoreBuilder.java | 8 +- .../refinery/store/model/internal/ModelImpl.java | 20 ++-- .../model/internal/ModelStoreBuilderImpl.java | 59 +++------- .../store/model/internal/ModelStoreImpl.java | 26 ++--- 32 files changed, 316 insertions(+), 597 deletions(-) delete mode 100644 subprojects/store-query-viatra/src/main/java/tools/refinery/store/query/viatra/ViatraModelQuery.java delete mode 100644 subprojects/store-query/src/main/java/tools/refinery/store/query/ModelQuery.java delete mode 100644 subprojects/store-reasoning/src/main/java/tools/refinery/store/reasoning/Reasoning.java delete mode 100644 subprojects/store/src/main/java/tools/refinery/store/adapter/AdapterList.java create mode 100644 subprojects/store/src/main/java/tools/refinery/store/adapter/AdapterUtils.java delete mode 100644 subprojects/store/src/main/java/tools/refinery/store/adapter/AnyModelAdapterType.java delete mode 100644 subprojects/store/src/main/java/tools/refinery/store/adapter/ModelAdapterBuilderFactory.java delete mode 100644 subprojects/store/src/main/java/tools/refinery/store/adapter/ModelAdapterType.java (limited to 'subprojects') diff --git a/subprojects/store-query-viatra/src/main/java/tools/refinery/store/query/viatra/ViatraModelQuery.java b/subprojects/store-query-viatra/src/main/java/tools/refinery/store/query/viatra/ViatraModelQuery.java deleted file mode 100644 index 3fff6f2e..00000000 --- a/subprojects/store-query-viatra/src/main/java/tools/refinery/store/query/viatra/ViatraModelQuery.java +++ /dev/null @@ -1,26 +0,0 @@ -/* - * SPDX-FileCopyrightText: 2021-2023 The Refinery Authors - * - * SPDX-License-Identifier: EPL-2.0 - */ -package tools.refinery.store.query.viatra; - -import tools.refinery.store.adapter.ModelAdapterBuilderFactory; -import tools.refinery.store.model.ModelStoreBuilder; -import tools.refinery.store.query.ModelQuery; -import tools.refinery.store.query.viatra.internal.ViatraModelQueryBuilderImpl; - -public final class ViatraModelQuery extends ModelAdapterBuilderFactory { - public static final ViatraModelQuery ADAPTER = new ViatraModelQuery(); - - private ViatraModelQuery() { - super(ViatraModelQueryAdapter.class, ViatraModelQueryStoreAdapter.class, ViatraModelQueryBuilder.class); - extendsAdapter(ModelQuery.ADAPTER); - } - - @Override - public ViatraModelQueryBuilder createBuilder(ModelStoreBuilder storeBuilder) { - return new ViatraModelQueryBuilderImpl(storeBuilder); - } -} diff --git a/subprojects/store-query-viatra/src/main/java/tools/refinery/store/query/viatra/ViatraModelQueryAdapter.java b/subprojects/store-query-viatra/src/main/java/tools/refinery/store/query/viatra/ViatraModelQueryAdapter.java index 411e251e..12c93f62 100644 --- a/subprojects/store-query-viatra/src/main/java/tools/refinery/store/query/viatra/ViatraModelQueryAdapter.java +++ b/subprojects/store-query-viatra/src/main/java/tools/refinery/store/query/viatra/ViatraModelQueryAdapter.java @@ -6,8 +6,13 @@ package tools.refinery.store.query.viatra; import tools.refinery.store.query.ModelQueryAdapter; +import tools.refinery.store.query.viatra.internal.ViatraModelQueryBuilderImpl; public interface ViatraModelQueryAdapter extends ModelQueryAdapter { @Override ViatraModelQueryStoreAdapter getStoreAdapter(); + + static ViatraModelQueryBuilder builder() { + return new ViatraModelQueryBuilderImpl(); + } } diff --git a/subprojects/store-query-viatra/src/main/java/tools/refinery/store/query/viatra/ViatraModelQueryBuilder.java b/subprojects/store-query-viatra/src/main/java/tools/refinery/store/query/viatra/ViatraModelQueryBuilder.java index 310171e8..931a07aa 100644 --- a/subprojects/store-query-viatra/src/main/java/tools/refinery/store/query/viatra/ViatraModelQueryBuilder.java +++ b/subprojects/store-query-viatra/src/main/java/tools/refinery/store/query/viatra/ViatraModelQueryBuilder.java @@ -50,5 +50,5 @@ public interface ViatraModelQueryBuilder extends ModelQueryBuilder { ViatraModelQueryBuilder hint(Dnf dnf, QueryEvaluationHint queryEvaluationHint); @Override - ViatraModelQueryStoreAdapter createStoreAdapter(ModelStore store); + ViatraModelQueryStoreAdapter build(ModelStore store); } diff --git a/subprojects/store-query-viatra/src/main/java/tools/refinery/store/query/viatra/internal/ViatraModelQueryBuilderImpl.java b/subprojects/store-query-viatra/src/main/java/tools/refinery/store/query/viatra/internal/ViatraModelQueryBuilderImpl.java index 44ed1505..ce2467b4 100644 --- a/subprojects/store-query-viatra/src/main/java/tools/refinery/store/query/viatra/internal/ViatraModelQueryBuilderImpl.java +++ b/subprojects/store-query-viatra/src/main/java/tools/refinery/store/query/viatra/internal/ViatraModelQueryBuilderImpl.java @@ -25,7 +25,8 @@ import tools.refinery.store.query.viatra.internal.pquery.Dnf2PQuery; import java.util.*; import java.util.function.Function; -public class ViatraModelQueryBuilderImpl extends AbstractModelAdapterBuilder implements ViatraModelQueryBuilder { +public class ViatraModelQueryBuilderImpl extends AbstractModelAdapterBuilder + implements ViatraModelQueryBuilder { private ViatraQueryEngineOptions.Builder engineOptionsBuilder; private QueryEvaluationHint defaultHint = new QueryEvaluationHint(Map.of( // Use a cost function that ignores the initial (empty) model but allows higher arity input keys. @@ -35,8 +36,7 @@ public class ViatraModelQueryBuilderImpl extends AbstractModelAdapterBuilder imp private final Set vacuousQueries = new LinkedHashSet<>(); private final Map> querySpecifications = new LinkedHashMap<>(); - public ViatraModelQueryBuilderImpl(ModelStoreBuilder storeBuilder) { - super(storeBuilder); + public ViatraModelQueryBuilderImpl() { engineOptionsBuilder = new ViatraQueryEngineOptions.Builder() .withDefaultBackend(ReteBackendFactory.INSTANCE) .withDefaultCachingBackend(ReteBackendFactory.INSTANCE) @@ -45,36 +45,42 @@ public class ViatraModelQueryBuilderImpl extends AbstractModelAdapterBuilder imp @Override public ViatraModelQueryBuilder engineOptions(ViatraQueryEngineOptions engineOptions) { + checkNotConfigured(); engineOptionsBuilder = new ViatraQueryEngineOptions.Builder(engineOptions); return this; } @Override public ViatraModelQueryBuilder defaultHint(QueryEvaluationHint queryEvaluationHint) { + checkNotConfigured(); defaultHint = defaultHint.overrideBy(queryEvaluationHint); return this; } @Override public ViatraModelQueryBuilder backend(IQueryBackendFactory queryBackendFactory) { + checkNotConfigured(); engineOptionsBuilder.withDefaultBackend(queryBackendFactory); return this; } @Override public ViatraModelQueryBuilder cachingBackend(IQueryBackendFactory queryBackendFactory) { + checkNotConfigured(); engineOptionsBuilder.withDefaultCachingBackend(queryBackendFactory); return this; } @Override public ViatraModelQueryBuilder searchBackend(IQueryBackendFactory queryBackendFactory) { + checkNotConfigured(); engineOptionsBuilder.withDefaultSearchBackend(queryBackendFactory); return this; } @Override public ViatraModelQueryBuilder query(AnyQuery query) { + checkNotConfigured(); if (querySpecifications.containsKey(query) || vacuousQueries.contains(query)) { // Ignore duplicate queries. return this; @@ -103,20 +109,26 @@ public class ViatraModelQueryBuilderImpl extends AbstractModelAdapterBuilder imp @Override public ViatraModelQueryBuilder computeHint(Function computeHint) { + checkNotConfigured(); dnf2PQuery.setComputeHint(computeHint); return this; } @Override public ViatraModelQueryBuilder hint(Dnf dnf, QueryEvaluationHint queryEvaluationHint) { + checkNotConfigured(); dnf2PQuery.hint(dnf, queryEvaluationHint); return this; } @Override - public ViatraModelQueryStoreAdapterImpl createStoreAdapter(ModelStore store) { - validateSymbols(store); + public void doConfigure(ModelStoreBuilder storeBuilder) { dnf2PQuery.assertNoUnusedHints(); + } + + @Override + public ViatraModelQueryStoreAdapterImpl doBuild(ModelStore store) { + validateSymbols(store); return new ViatraModelQueryStoreAdapterImpl(store, buildEngineOptions(), dnf2PQuery.getSymbolViews(), Collections.unmodifiableMap(querySpecifications), Collections.unmodifiableSet(vacuousQueries)); } diff --git a/subprojects/store-query-viatra/src/test/java/tools/refinery/store/query/viatra/DiagonalQueryTest.java b/subprojects/store-query-viatra/src/test/java/tools/refinery/store/query/viatra/DiagonalQueryTest.java index 3ff01064..56ddb9b4 100644 --- a/subprojects/store-query-viatra/src/test/java/tools/refinery/store/query/viatra/DiagonalQueryTest.java +++ b/subprojects/store-query-viatra/src/test/java/tools/refinery/store/query/viatra/DiagonalQueryTest.java @@ -7,7 +7,7 @@ package tools.refinery.store.query.viatra; import org.eclipse.viatra.query.runtime.matchers.backend.QueryEvaluationHint; import tools.refinery.store.model.ModelStore; -import tools.refinery.store.query.ModelQuery; +import tools.refinery.store.query.ModelQueryAdapter; import tools.refinery.store.query.dnf.Dnf; import tools.refinery.store.query.dnf.Query; import tools.refinery.store.query.viatra.tests.QueryEngineTest; @@ -40,15 +40,15 @@ class DiagonalQueryTest { var store = ModelStore.builder() .symbols(person, symbol) - .with(ViatraModelQuery.ADAPTER) - .defaultHint(hint) - .queries(query) + .with(ViatraModelQueryAdapter.builder() + .defaultHint(hint) + .queries(query)) .build(); var model = store.createEmptyModel(); var personInterpretation = model.getInterpretation(person); var symbolInterpretation = model.getInterpretation(symbol); - var queryEngine = model.getAdapter(ModelQuery.ADAPTER); + var queryEngine = model.getAdapter(ModelQueryAdapter.class); var queryResultSet = queryEngine.getResultSet(query); personInterpretation.put(Tuple.of(0), true); @@ -97,15 +97,15 @@ class DiagonalQueryTest { var store = ModelStore.builder() .symbols(person, symbol) - .with(ViatraModelQuery.ADAPTER) - .defaultHint(hint) - .queries(query) + .with(ViatraModelQueryAdapter.builder() + .defaultHint(hint) + .queries(query)) .build(); var model = store.createEmptyModel(); var personInterpretation = model.getInterpretation(person); var symbolInterpretation = model.getInterpretation(symbol); - var queryEngine = model.getAdapter(ModelQuery.ADAPTER); + var queryEngine = model.getAdapter(ModelQueryAdapter.class); var queryResultSet = queryEngine.getResultSet(query); personInterpretation.put(Tuple.of(0), true); @@ -140,15 +140,15 @@ class DiagonalQueryTest { var store = ModelStore.builder() .symbols(person, symbol) - .with(ViatraModelQuery.ADAPTER) - .defaultHint(hint) - .queries(query) + .with(ViatraModelQueryAdapter.builder() + .defaultHint(hint) + .queries(query)) .build(); var model = store.createEmptyModel(); var personInterpretation = model.getInterpretation(person); var symbolInterpretation = model.getInterpretation(symbol); - var queryEngine = model.getAdapter(ModelQuery.ADAPTER); + var queryEngine = model.getAdapter(ModelQueryAdapter.class); var queryResultSet = queryEngine.getResultSet(query); personInterpretation.put(Tuple.of(0), true); @@ -198,15 +198,15 @@ class DiagonalQueryTest { var store = ModelStore.builder() .symbols(person, symbol) - .with(ViatraModelQuery.ADAPTER) - .defaultHint(hint) - .queries(query) + .with(ViatraModelQueryAdapter.builder() + .defaultHint(hint) + .queries(query)) .build(); var model = store.createEmptyModel(); var personInterpretation = model.getInterpretation(person); var symbolInterpretation = model.getInterpretation(symbol); - var queryEngine = model.getAdapter(ModelQuery.ADAPTER); + var queryEngine = model.getAdapter(ModelQueryAdapter.class); var queryResultSet = queryEngine.getResultSet(query); personInterpretation.put(Tuple.of(0), true); @@ -243,15 +243,15 @@ class DiagonalQueryTest { var store = ModelStore.builder() .symbols(person, symbol) - .with(ViatraModelQuery.ADAPTER) - .defaultHint(hint) - .queries(query) + .with(ViatraModelQueryAdapter.builder() + .defaultHint(hint) + .queries(query)) .build(); var model = store.createEmptyModel(); var personInterpretation = model.getInterpretation(person); var symbolInterpretation = model.getInterpretation(symbol); - var queryEngine = model.getAdapter(ModelQuery.ADAPTER); + var queryEngine = model.getAdapter(ModelQueryAdapter.class); var queryResultSet = queryEngine.getResultSet(query); personInterpretation.put(Tuple.of(0), true); @@ -306,15 +306,15 @@ class DiagonalQueryTest { var store = ModelStore.builder() .symbols(person, symbol) - .with(ViatraModelQuery.ADAPTER) - .defaultHint(hint) - .queries(query) + .with(ViatraModelQueryAdapter.builder() + .defaultHint(hint) + .queries(query)) .build(); var model = store.createEmptyModel(); var personInterpretation = model.getInterpretation(person); var symbolInterpretation = model.getInterpretation(symbol); - var queryEngine = model.getAdapter(ModelQuery.ADAPTER); + var queryEngine = model.getAdapter(ModelQueryAdapter.class); var queryResultSet = queryEngine.getResultSet(query); personInterpretation.put(Tuple.of(0), true); @@ -350,15 +350,15 @@ class DiagonalQueryTest { var store = ModelStore.builder() .symbols(person, symbol) - .with(ViatraModelQuery.ADAPTER) - .defaultHint(hint) - .queries(query) + .with(ViatraModelQueryAdapter.builder() + .defaultHint(hint) + .queries(query)) .build(); var model = store.createEmptyModel(); var personInterpretation = model.getInterpretation(person); var symbolInterpretation = model.getInterpretation(symbol); - var queryEngine = model.getAdapter(ModelQuery.ADAPTER); + var queryEngine = model.getAdapter(ModelQueryAdapter.class); var queryResultSet = queryEngine.getResultSet(query); personInterpretation.put(Tuple.of(0), true); @@ -404,15 +404,15 @@ class DiagonalQueryTest { var store = ModelStore.builder() .symbols(person, symbol) - .with(ViatraModelQuery.ADAPTER) - .defaultHint(hint) - .queries(query) + .with(ViatraModelQueryAdapter.builder() + .defaultHint(hint) + .queries(query)) .build(); var model = store.createEmptyModel(); var personInterpretation = model.getInterpretation(person); var symbolInterpretation = model.getInterpretation(symbol); - var queryEngine = model.getAdapter(ModelQuery.ADAPTER); + var queryEngine = model.getAdapter(ModelQueryAdapter.class); var queryResultSet = queryEngine.getResultSet(query); personInterpretation.put(Tuple.of(0), true); 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 ffa5e60b..98c8cd92 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 @@ -8,7 +8,7 @@ package tools.refinery.store.query.viatra; import org.eclipse.viatra.query.runtime.matchers.backend.QueryEvaluationHint; import tools.refinery.store.map.Cursor; import tools.refinery.store.model.ModelStore; -import tools.refinery.store.query.ModelQuery; +import tools.refinery.store.query.ModelQueryAdapter; import tools.refinery.store.query.dnf.Dnf; import tools.refinery.store.query.dnf.Query; import tools.refinery.store.query.term.Variable; @@ -49,15 +49,15 @@ class FunctionalQueryTest { var store = ModelStore.builder() .symbols(person, age) - .with(ViatraModelQuery.ADAPTER) - .defaultHint(hint) - .queries(query) + .with(ViatraModelQueryAdapter.builder() + .defaultHint(hint) + .queries(query)) .build(); var model = store.createEmptyModel(); var personInterpretation = model.getInterpretation(person); var ageInterpretation = model.getInterpretation(age); - var queryEngine = model.getAdapter(ModelQuery.ADAPTER); + var queryEngine = model.getAdapter(ModelQueryAdapter.class); var queryResultSet = queryEngine.getResultSet(query); personInterpretation.put(Tuple.of(0), true); @@ -97,15 +97,15 @@ class FunctionalQueryTest { var store = ModelStore.builder() .symbols(person, age) - .with(ViatraModelQuery.ADAPTER) - .defaultHint(hint) - .queries(query) + .with(ViatraModelQueryAdapter.builder() + .defaultHint(hint) + .queries(query)) .build(); var model = store.createEmptyModel(); var personInterpretation = model.getInterpretation(person); var ageInterpretation = model.getInterpretation(age); - var queryEngine = model.getAdapter(ModelQuery.ADAPTER); + var queryEngine = model.getAdapter(ModelQueryAdapter.class); var queryResultSet = queryEngine.getResultSet(query); personInterpretation.put(Tuple.of(0), true); @@ -141,15 +141,15 @@ class FunctionalQueryTest { var store = ModelStore.builder() .symbols(person, age) - .with(ViatraModelQuery.ADAPTER) - .defaultHint(hint) - .queries(query) + .with(ViatraModelQueryAdapter.builder() + .defaultHint(hint) + .queries(query)) .build(); var model = store.createEmptyModel(); var personInterpretation = model.getInterpretation(person); var ageInterpretation = model.getInterpretation(age); - var queryEngine = model.getAdapter(ModelQuery.ADAPTER); + var queryEngine = model.getAdapter(ModelQueryAdapter.class); var queryResultSet = queryEngine.getResultSet(query); personInterpretation.put(Tuple.of(0), true); @@ -180,15 +180,15 @@ class FunctionalQueryTest { var store = ModelStore.builder() .symbols(person, friend) - .with(ViatraModelQuery.ADAPTER) - .defaultHint(hint) - .queries(query) + .with(ViatraModelQueryAdapter.builder() + .defaultHint(hint) + .queries(query)) .build(); var model = store.createEmptyModel(); var personInterpretation = model.getInterpretation(person); var friendInterpretation = model.getInterpretation(friend); - var queryEngine = model.getAdapter(ModelQuery.ADAPTER); + var queryEngine = model.getAdapter(ModelQueryAdapter.class); var queryResultSet = queryEngine.getResultSet(query); personInterpretation.put(Tuple.of(0), true); @@ -231,15 +231,15 @@ class FunctionalQueryTest { var store = ModelStore.builder() .symbols(person, friend) - .with(ViatraModelQuery.ADAPTER) - .defaultHint(hint) - .queries(query) + .with(ViatraModelQueryAdapter.builder() + .defaultHint(hint) + .queries(query)) .build(); var model = store.createEmptyModel(); var personInterpretation = model.getInterpretation(person); var friendInterpretation = model.getInterpretation(friend); - var queryEngine = model.getAdapter(ModelQuery.ADAPTER); + var queryEngine = model.getAdapter(ModelQueryAdapter.class); var queryResultSet = queryEngine.getResultSet(query); personInterpretation.put(Tuple.of(0), true); @@ -269,14 +269,14 @@ class FunctionalQueryTest { var store = ModelStore.builder() .symbols(age) - .with(ViatraModelQuery.ADAPTER) - .defaultHint(hint) - .queries(query) + .with(ViatraModelQueryAdapter.builder() + .defaultHint(hint) + .queries(query)) .build(); var model = store.createEmptyModel(); var ageInterpretation = model.getInterpretation(age); - var queryEngine = model.getAdapter(ModelQuery.ADAPTER); + var queryEngine = model.getAdapter(ModelQueryAdapter.class); var queryResultSet = queryEngine.getResultSet(query); ageInterpretation.put(Tuple.of(0), 12); @@ -306,15 +306,15 @@ class FunctionalQueryTest { var store = ModelStore.builder() .symbols(person, age) - .with(ViatraModelQuery.ADAPTER) - .defaultHint(hint) - .queries(query) + .with(ViatraModelQueryAdapter.builder() + .defaultHint(hint) + .queries(query)) .build(); var model = store.createEmptyModel(); var personInterpretation = model.getInterpretation(person); var ageInterpretation = model.getInterpretation(age); - var queryEngine = model.getAdapter(ModelQuery.ADAPTER); + var queryEngine = model.getAdapter(ModelQueryAdapter.class); var queryResultSet = queryEngine.getResultSet(query); personInterpretation.put(Tuple.of(0), true); @@ -349,15 +349,15 @@ class FunctionalQueryTest { var store = ModelStore.builder() .symbols(person, friend) - .with(ViatraModelQuery.ADAPTER) - .defaultHint(hint) - .queries(minQuery, maxQuery) + .with(ViatraModelQueryAdapter.builder() + .defaultHint(hint) + .queries(minQuery, maxQuery)) .build(); var model = store.createEmptyModel(); var personInterpretation = model.getInterpretation(person); var friendInterpretation = model.getInterpretation(friend); - var queryEngine = model.getAdapter(ModelQuery.ADAPTER); + var queryEngine = model.getAdapter(ModelQueryAdapter.class); var minResultSet = queryEngine.getResultSet(minQuery); var maxResultSet = queryEngine.getResultSet(maxQuery); @@ -408,15 +408,15 @@ class FunctionalQueryTest { var store = ModelStore.builder() .symbols(person, age) - .with(ViatraModelQuery.ADAPTER) - .defaultHint(hint) - .queries(query) + .with(ViatraModelQueryAdapter.builder() + .defaultHint(hint) + .queries(query)) .build(); var model = store.createEmptyModel(); var personInterpretation = model.getInterpretation(person); var ageInterpretation = model.getInterpretation(age); - var queryEngine = model.getAdapter(ModelQuery.ADAPTER); + var queryEngine = model.getAdapter(ModelQueryAdapter.class); var queryResultSet = queryEngine.getResultSet(query); personInterpretation.put(Tuple.of(0), true); @@ -448,15 +448,15 @@ class FunctionalQueryTest { var store = ModelStore.builder() .symbols(person, age) - .with(ViatraModelQuery.ADAPTER) - .defaultHint(hint) - .queries(query) + .with(ViatraModelQueryAdapter.builder() + .defaultHint(hint) + .queries(query)) .build(); var model = store.createEmptyModel(); var personInterpretation = model.getInterpretation(person); var ageInterpretation = model.getInterpretation(age); - var queryEngine = model.getAdapter(ModelQuery.ADAPTER); + var queryEngine = model.getAdapter(ModelQueryAdapter.class); var queryResultSet = queryEngine.getResultSet(query); personInterpretation.put(Tuple.of(0), true); @@ -493,16 +493,16 @@ class FunctionalQueryTest { var store = ModelStore.builder() .symbols(person, age, friend) - .with(ViatraModelQuery.ADAPTER) - .defaultHint(hint) - .query(query) + .with(ViatraModelQueryAdapter.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(ModelQuery.ADAPTER); + var queryEngine = model.getAdapter(ModelQueryAdapter.class); var queryResultSet = queryEngine.getResultSet(query); personInterpretation.put(Tuple.of(0), true); diff --git a/subprojects/store-query-viatra/src/test/java/tools/refinery/store/query/viatra/QueryTest.java b/subprojects/store-query-viatra/src/test/java/tools/refinery/store/query/viatra/QueryTest.java index a90889c6..46ce37b4 100644 --- a/subprojects/store-query-viatra/src/test/java/tools/refinery/store/query/viatra/QueryTest.java +++ b/subprojects/store-query-viatra/src/test/java/tools/refinery/store/query/viatra/QueryTest.java @@ -8,7 +8,7 @@ package tools.refinery.store.query.viatra; import org.eclipse.viatra.query.runtime.matchers.backend.QueryEvaluationHint; import org.junit.jupiter.api.Test; import tools.refinery.store.model.ModelStore; -import tools.refinery.store.query.ModelQuery; +import tools.refinery.store.query.ModelQueryAdapter; import tools.refinery.store.query.dnf.Dnf; import tools.refinery.store.query.dnf.Query; import tools.refinery.store.query.term.Variable; @@ -41,15 +41,15 @@ class QueryTest { var store = ModelStore.builder() .symbols(person, asset) - .with(ViatraModelQuery.ADAPTER) - .defaultHint(hint) - .query(predicate) + .with(ViatraModelQueryAdapter.builder() + .defaultHint(hint) + .queries(predicate)) .build(); var model = store.createEmptyModel(); var personInterpretation = model.getInterpretation(person); var assetInterpretation = model.getInterpretation(asset); - var queryEngine = model.getAdapter(ModelQuery.ADAPTER); + var queryEngine = model.getAdapter(ModelQueryAdapter.class); var predicateResultSet = queryEngine.getResultSet(predicate); personInterpretation.put(Tuple.of(0), true); @@ -81,15 +81,15 @@ class QueryTest { var store = ModelStore.builder() .symbols(person, friend) - .with(ViatraModelQuery.ADAPTER) - .defaultHint(hint) - .queries(predicate) + .with(ViatraModelQueryAdapter.builder() + .defaultHint(hint) + .queries(predicate)) .build(); var model = store.createEmptyModel(); var personInterpretation = model.getInterpretation(person); var friendInterpretation = model.getInterpretation(friend); - var queryEngine = model.getAdapter(ModelQuery.ADAPTER); + var queryEngine = model.getAdapter(ModelQueryAdapter.class); var predicateResultSet = queryEngine.getResultSet(predicate); personInterpretation.put(Tuple.of(0), true); @@ -125,15 +125,15 @@ class QueryTest { var store = ModelStore.builder() .symbols(person, friend) - .with(ViatraModelQuery.ADAPTER) - .defaultHint(hint) - .queries(predicate) + .with(ViatraModelQueryAdapter.builder() + .defaultHint(hint) + .queries(predicate)) .build(); var model = store.createEmptyModel(); var personInterpretation = model.getInterpretation(person); var friendInterpretation = model.getInterpretation(friend); - var queryEngine = model.getAdapter(ModelQuery.ADAPTER); + var queryEngine = model.getAdapter(ModelQueryAdapter.class); var predicateResultSet = queryEngine.getResultSet(predicate); personInterpretation.put(Tuple.of(0), true); @@ -175,16 +175,16 @@ class QueryTest { var store = ModelStore.builder() .symbols(person, animal, friend) - .with(ViatraModelQuery.ADAPTER) - .defaultHint(hint) - .queries(predicate) + .with(ViatraModelQueryAdapter.builder() + .defaultHint(hint) + .queries(predicate)) .build(); var model = store.createEmptyModel(); var personInterpretation = model.getInterpretation(person); var animalInterpretation = model.getInterpretation(animal); var friendInterpretation = model.getInterpretation(friend); - var queryEngine = model.getAdapter(ModelQuery.ADAPTER); + var queryEngine = model.getAdapter(ModelQueryAdapter.class); var predicateResultSet = queryEngine.getResultSet(predicate); personInterpretation.put(Tuple.of(0), true); @@ -221,14 +221,14 @@ class QueryTest { var store = ModelStore.builder() .symbols(person) - .with(ViatraModelQuery.ADAPTER) - .defaultHint(hint) - .queries(predicate) + .with(ViatraModelQueryAdapter.builder() + .defaultHint(hint) + .queries(predicate)) .build(); var model = store.createEmptyModel(); var personInterpretation = model.getInterpretation(person); - var queryEngine = model.getAdapter(ModelQuery.ADAPTER); + var queryEngine = model.getAdapter(ModelQueryAdapter.class); var predicateResultSet = queryEngine.getResultSet(predicate); personInterpretation.put(Tuple.of(0), true); @@ -262,15 +262,15 @@ class QueryTest { var store = ModelStore.builder() .symbols(person, friend) - .with(ViatraModelQuery.ADAPTER) - .defaultHint(hint) - .queries(predicate) + .with(ViatraModelQueryAdapter.builder() + .defaultHint(hint) + .queries(predicate)) .build(); var model = store.createEmptyModel(); var personInterpretation = model.getInterpretation(person); var friendInterpretation = model.getInterpretation(friend); - var queryEngine = model.getAdapter(ModelQuery.ADAPTER); + var queryEngine = model.getAdapter(ModelQueryAdapter.class); var predicateResultSet = queryEngine.getResultSet(predicate); personInterpretation.put(Tuple.of(0), true); @@ -312,15 +312,15 @@ class QueryTest { var store = ModelStore.builder() .symbols(person, friend) - .with(ViatraModelQuery.ADAPTER) - .defaultHint(hint) - .queries(predicate) + .with(ViatraModelQueryAdapter.builder() + .defaultHint(hint) + .queries(predicate)) .build(); var model = store.createEmptyModel(); var personInterpretation = model.getInterpretation(person); var friendInterpretation = model.getInterpretation(friend); - var queryEngine = model.getAdapter(ModelQuery.ADAPTER); + var queryEngine = model.getAdapter(ModelQueryAdapter.class); var predicateResultSet = queryEngine.getResultSet(predicate); personInterpretation.put(Tuple.of(0), true); @@ -355,15 +355,15 @@ class QueryTest { var store = ModelStore.builder() .symbols(person, friend) - .with(ViatraModelQuery.ADAPTER) - .defaultHint(hint) - .queries(predicate) + .with(ViatraModelQueryAdapter.builder() + .defaultHint(hint) + .queries(predicate)) .build(); var model = store.createEmptyModel(); var personInterpretation = model.getInterpretation(person); var friendInterpretation = model.getInterpretation(friend); - var queryEngine = model.getAdapter(ModelQuery.ADAPTER); + var queryEngine = model.getAdapter(ModelQueryAdapter.class); var predicateResultSet = queryEngine.getResultSet(predicate); personInterpretation.put(Tuple.of(0), true); @@ -413,15 +413,15 @@ class QueryTest { var store = ModelStore.builder() .symbols(person, friend) - .with(ViatraModelQuery.ADAPTER) - .defaultHint(hint) - .queries(predicate) + .with(ViatraModelQueryAdapter.builder() + .defaultHint(hint) + .queries(predicate)) .build(); var model = store.createEmptyModel(); var personInterpretation = model.getInterpretation(person); var friendInterpretation = model.getInterpretation(friend); - var queryEngine = model.getAdapter(ModelQuery.ADAPTER); + var queryEngine = model.getAdapter(ModelQueryAdapter.class); var predicateResultSet = queryEngine.getResultSet(predicate); personInterpretation.put(Tuple.of(0), true); @@ -461,15 +461,15 @@ class QueryTest { var store = ModelStore.builder() .symbols(person, friend) - .with(ViatraModelQuery.ADAPTER) - .defaultHint(hint) - .queries(predicate) + .with(ViatraModelQueryAdapter.builder() + .defaultHint(hint) + .queries(predicate)) .build(); var model = store.createEmptyModel(); var personInterpretation = model.getInterpretation(person); var friendInterpretation = model.getInterpretation(friend); - var queryEngine = model.getAdapter(ModelQuery.ADAPTER); + var queryEngine = model.getAdapter(ModelQueryAdapter.class); var predicateResultSet = queryEngine.getResultSet(predicate); personInterpretation.put(Tuple.of(0), true); @@ -511,15 +511,15 @@ class QueryTest { var store = ModelStore.builder() .symbols(person, friend) - .with(ViatraModelQuery.ADAPTER) - .defaultHint(hint) - .queries(predicate) + .with(ViatraModelQueryAdapter.builder() + .defaultHint(hint) + .queries(predicate)) .build(); var model = store.createEmptyModel(); var personInterpretation = model.getInterpretation(person); var friendInterpretation = model.getInterpretation(friend); - var queryEngine = model.getAdapter(ModelQuery.ADAPTER); + var queryEngine = model.getAdapter(ModelQueryAdapter.class); var predicateResultSet = queryEngine.getResultSet(predicate); personInterpretation.put(Tuple.of(0), true); @@ -553,15 +553,15 @@ class QueryTest { var store = ModelStore.builder() .symbols(person, friend) - .with(ViatraModelQuery.ADAPTER) - .defaultHint(hint) - .queries(predicate) + .with(ViatraModelQueryAdapter.builder() + .defaultHint(hint) + .queries(predicate)) .build(); var model = store.createEmptyModel(); var personInterpretation = model.getInterpretation(person); var friendInterpretation = model.getInterpretation(friend); - var queryEngine = model.getAdapter(ModelQuery.ADAPTER); + var queryEngine = model.getAdapter(ModelQueryAdapter.class); var predicateResultSet = queryEngine.getResultSet(predicate); personInterpretation.put(Tuple.of(0), true); @@ -610,15 +610,15 @@ class QueryTest { var store = ModelStore.builder() .symbols(person, friend) - .with(ViatraModelQuery.ADAPTER) - .defaultHint(hint) - .queries(predicate) + .with(ViatraModelQueryAdapter.builder() + .defaultHint(hint) + .queries(predicate)) .build(); var model = store.createEmptyModel(); var personInterpretation = model.getInterpretation(person); var friendInterpretation = model.getInterpretation(friend); - var queryEngine = model.getAdapter(ModelQuery.ADAPTER); + var queryEngine = model.getAdapter(ModelQueryAdapter.class); var predicateResultSet = queryEngine.getResultSet(predicate); personInterpretation.put(Tuple.of(0), true); @@ -658,15 +658,15 @@ class QueryTest { var store = ModelStore.builder() .symbols(person, age) - .with(ViatraModelQuery.ADAPTER) - .defaultHint(hint) - .queries(query) + .with(ViatraModelQueryAdapter.builder() + .defaultHint(hint) + .queries(query)) .build(); var model = store.createEmptyModel(); var personInterpretation = model.getInterpretation(person); var ageInterpretation = model.getInterpretation(age); - var queryEngine = model.getAdapter(ModelQuery.ADAPTER); + var queryEngine = model.getAdapter(ModelQueryAdapter.class); var queryResultSet = queryEngine.getResultSet(query); personInterpretation.put(Tuple.of(0), true); @@ -691,13 +691,13 @@ class QueryTest { var store = ModelStore.builder() .symbols(person) - .with(ViatraModelQuery.ADAPTER) - .queries(predicate) + .with(ViatraModelQueryAdapter.builder() + .queries(predicate)) .build(); var model = store.createEmptyModel(); var personInterpretation = model.getInterpretation(person); - var queryEngine = model.getAdapter(ModelQuery.ADAPTER); + var queryEngine = model.getAdapter(ModelQueryAdapter.class); var predicateResultSet = queryEngine.getResultSet(predicate); personInterpretation.put(Tuple.of(0), true); @@ -713,8 +713,7 @@ class QueryTest { var p1 = Variable.of("p1"); var predicate = Query.builder("AlwaysTrue").parameters(p1).clause().build(); - var storeBuilder = ModelStore.builder().symbols(person); - var queryBuilder = storeBuilder.with(ViatraModelQuery.ADAPTER); + var queryBuilder = ViatraModelQueryAdapter.builder(); assertThrows(IllegalArgumentException.class, () -> queryBuilder.queries(predicate)); } diff --git a/subprojects/store-query-viatra/src/test/java/tools/refinery/store/query/viatra/QueryTransactionTest.java b/subprojects/store-query-viatra/src/test/java/tools/refinery/store/query/viatra/QueryTransactionTest.java index 9de2655f..6860ece9 100644 --- a/subprojects/store-query-viatra/src/test/java/tools/refinery/store/query/viatra/QueryTransactionTest.java +++ b/subprojects/store-query-viatra/src/test/java/tools/refinery/store/query/viatra/QueryTransactionTest.java @@ -9,7 +9,7 @@ import org.eclipse.viatra.query.runtime.matchers.backend.QueryEvaluationHint; import org.junit.jupiter.api.Disabled; import org.junit.jupiter.api.Test; import tools.refinery.store.model.ModelStore; -import tools.refinery.store.query.ModelQuery; +import tools.refinery.store.query.ModelQueryAdapter; import tools.refinery.store.query.dnf.Query; import tools.refinery.store.query.view.FilteredView; import tools.refinery.store.query.view.FunctionView; @@ -35,13 +35,13 @@ class QueryTransactionTest { var store = ModelStore.builder() .symbols(person) - .with(ViatraModelQuery.ADAPTER) - .queries(predicate) + .with(ViatraModelQueryAdapter.builder() + .queries(predicate)) .build(); var model = store.createEmptyModel(); var personInterpretation = model.getInterpretation(person); - var queryEngine = model.getAdapter(ModelQuery.ADAPTER); + var queryEngine = model.getAdapter(ModelQueryAdapter.class); var predicateResultSet = queryEngine.getResultSet(predicate); assertResults(Map.of( @@ -102,14 +102,14 @@ class QueryTransactionTest { var store = ModelStore.builder() .symbols(person) - .with(ViatraModelQuery.ADAPTER) - .defaultHint(new QueryEvaluationHint(null, QueryEvaluationHint.BackendRequirement.DEFAULT_SEARCH)) - .queries(predicate) + .with(ViatraModelQueryAdapter.builder() + .defaultHint(new QueryEvaluationHint(null, QueryEvaluationHint.BackendRequirement.DEFAULT_SEARCH)) + .queries(predicate)) .build(); var model = store.createEmptyModel(); var personInterpretation = model.getInterpretation(person); - var queryEngine = model.getAdapter(ModelQuery.ADAPTER); + var queryEngine = model.getAdapter(ModelQueryAdapter.class); var predicateResultSet = queryEngine.getResultSet(predicate); assertResults(Map.of( @@ -153,14 +153,14 @@ class QueryTransactionTest { var store = ModelStore.builder() .symbols(person, asset) - .with(ViatraModelQuery.ADAPTER) - .queries(predicate) + .with(ViatraModelQueryAdapter.builder() + .queries(predicate)) .build(); var model = store.createEmptyModel(); var personInterpretation = model.getInterpretation(person); var assetInterpretation = model.getInterpretation(asset); - var queryEngine = model.getAdapter(ModelQuery.ADAPTER); + var queryEngine = model.getAdapter(ModelQueryAdapter.class); var predicateResultSet = queryEngine.getResultSet(predicate); assertFalse(queryEngine.hasPendingChanges()); @@ -226,14 +226,14 @@ class QueryTransactionTest { var store = ModelStore.builder() .symbols(person, age) - .with(ViatraModelQuery.ADAPTER) - .query(query) + .with(ViatraModelQueryAdapter.builder() + .queries(query)) .build(); var model = store.createEmptyModel(); var personInterpretation = model.getInterpretation(person); var ageInterpretation = model.getInterpretation(age); - var queryEngine = model.getAdapter(ModelQuery.ADAPTER); + var queryEngine = model.getAdapter(ModelQueryAdapter.class); var queryResultSet = queryEngine.getResultSet(query); personInterpretation.put(Tuple.of(0), true); @@ -268,14 +268,14 @@ class QueryTransactionTest { var store = ModelStore.builder() .symbols(person, age) - .with(ViatraModelQuery.ADAPTER) - .query(query) + .with(ViatraModelQueryAdapter.builder() + .queries(query)) .build(); var model = store.createEmptyModel(); var personInterpretation = model.getInterpretation(person); var ageInterpretation = model.getInterpretation(age); - var queryEngine = model.getAdapter(ModelQuery.ADAPTER); + var queryEngine = model.getAdapter(ModelQueryAdapter.class); var queryResultSet = queryEngine.getResultSet(query); personInterpretation.put(Tuple.of(0), true); @@ -306,13 +306,13 @@ class QueryTransactionTest { var store = ModelStore.builder() .symbols(person) - .with(ViatraModelQuery.ADAPTER) - .queries(predicate) + .with(ViatraModelQueryAdapter.builder() + .queries(predicate)) .build(); var model = store.createEmptyModel(); var personInterpretation = model.getInterpretation(person); - var queryEngine = model.getAdapter(ModelQuery.ADAPTER); + var queryEngine = model.getAdapter(ModelQueryAdapter.class); var predicateResultSet = queryEngine.getResultSet(predicate); personInterpretation.put(Tuple.of(0), true); @@ -360,13 +360,13 @@ class QueryTransactionTest { var store = ModelStore.builder() .symbols(person) - .with(ViatraModelQuery.ADAPTER) - .queries(predicate) + .with(ViatraModelQueryAdapter.builder() + .queries(predicate)) .build(); var model = store.createEmptyModel(); var personInterpretation = model.getInterpretation(person); - var queryEngine = model.getAdapter(ModelQuery.ADAPTER); + var queryEngine = model.getAdapter(ModelQueryAdapter.class); var predicateResultSet = queryEngine.getResultSet(predicate); personInterpretation.put(Tuple.of(0), true); diff --git a/subprojects/store-query/src/main/java/tools/refinery/store/query/ModelQuery.java b/subprojects/store-query/src/main/java/tools/refinery/store/query/ModelQuery.java deleted file mode 100644 index 60698498..00000000 --- a/subprojects/store-query/src/main/java/tools/refinery/store/query/ModelQuery.java +++ /dev/null @@ -1,16 +0,0 @@ -/* - * SPDX-FileCopyrightText: 2021-2023 The Refinery Authors - * - * SPDX-License-Identifier: EPL-2.0 - */ -package tools.refinery.store.query; - -import tools.refinery.store.adapter.ModelAdapterType; - -public final class ModelQuery extends ModelAdapterType { - public static final ModelQuery ADAPTER = new ModelQuery(); - - private ModelQuery() { - super(ModelQueryAdapter.class, ModelQueryStoreAdapter.class, ModelQueryBuilder.class); - } -} diff --git a/subprojects/store-query/src/main/java/tools/refinery/store/query/ModelQueryBuilder.java b/subprojects/store-query/src/main/java/tools/refinery/store/query/ModelQueryBuilder.java index 76d6c3ba..c62a95b5 100644 --- a/subprojects/store-query/src/main/java/tools/refinery/store/query/ModelQueryBuilder.java +++ b/subprojects/store-query/src/main/java/tools/refinery/store/query/ModelQueryBuilder.java @@ -26,5 +26,5 @@ public interface ModelQueryBuilder extends ModelAdapterBuilder { ModelQueryBuilder query(AnyQuery query); @Override - ModelQueryStoreAdapter createStoreAdapter(ModelStore store); + ModelQueryStoreAdapter build(ModelStore store); } diff --git a/subprojects/store-reasoning/src/main/java/tools/refinery/store/reasoning/Reasoning.java b/subprojects/store-reasoning/src/main/java/tools/refinery/store/reasoning/Reasoning.java deleted file mode 100644 index 3d3df2b2..00000000 --- a/subprojects/store-reasoning/src/main/java/tools/refinery/store/reasoning/Reasoning.java +++ /dev/null @@ -1,29 +0,0 @@ -/* - * SPDX-FileCopyrightText: 2021-2023 The Refinery Authors - * - * SPDX-License-Identifier: EPL-2.0 - */ -package tools.refinery.store.reasoning; - -import tools.refinery.store.reasoning.internal.ReasoningBuilderImpl; -import tools.refinery.store.adapter.ModelAdapterBuilderFactory; -import tools.refinery.store.model.ModelStoreBuilder; -import tools.refinery.store.reasoning.representation.PartialRelation; - -public final class Reasoning extends ModelAdapterBuilderFactory { - public static final Reasoning ADAPTER = new Reasoning(); - - public static final PartialRelation EXISTS = new PartialRelation("exists", 1); - - public static final PartialRelation EQUALS = new PartialRelation("equals", 1); - - private Reasoning() { - super(ReasoningAdapter.class, ReasoningStoreAdapter.class, ReasoningBuilder.class); - } - - @Override - public ReasoningBuilder createBuilder(ModelStoreBuilder storeBuilder) { - return new ReasoningBuilderImpl(storeBuilder); - } -} diff --git a/subprojects/store-reasoning/src/main/java/tools/refinery/store/reasoning/ReasoningAdapter.java b/subprojects/store-reasoning/src/main/java/tools/refinery/store/reasoning/ReasoningAdapter.java index 8dedddf7..8f319242 100644 --- a/subprojects/store-reasoning/src/main/java/tools/refinery/store/reasoning/ReasoningAdapter.java +++ b/subprojects/store-reasoning/src/main/java/tools/refinery/store/reasoning/ReasoningAdapter.java @@ -6,12 +6,15 @@ package tools.refinery.store.reasoning; import tools.refinery.store.adapter.ModelAdapter; +import tools.refinery.store.query.ResultSet; +import tools.refinery.store.query.dnf.Dnf; import tools.refinery.store.reasoning.representation.AnyPartialSymbol; +import tools.refinery.store.reasoning.representation.PartialRelation; import tools.refinery.store.reasoning.representation.PartialSymbol; -import tools.refinery.store.query.dnf.Dnf; -import tools.refinery.store.query.ResultSet; public interface ReasoningAdapter extends ModelAdapter { + PartialRelation EXISTS = new PartialRelation("exists", 1); + @Override ReasoningStoreAdapter getStoreAdapter(); @@ -23,5 +26,5 @@ public interface ReasoningAdapter extends ModelAdapter { PartialInterpretation getPartialInterpretation(PartialSymbol partialSymbol); - ResultSet getLiftedResultSet(Dnf query); + ResultSet getLiftedResultSet(Dnf query); } diff --git a/subprojects/store-reasoning/src/main/java/tools/refinery/store/reasoning/ReasoningBuilder.java b/subprojects/store-reasoning/src/main/java/tools/refinery/store/reasoning/ReasoningBuilder.java index df7b6e4d..d3a337e8 100644 --- a/subprojects/store-reasoning/src/main/java/tools/refinery/store/reasoning/ReasoningBuilder.java +++ b/subprojects/store-reasoning/src/main/java/tools/refinery/store/reasoning/ReasoningBuilder.java @@ -29,5 +29,5 @@ public interface ReasoningBuilder extends ModelAdapterBuilder { Dnf lift(Modality modality, Dnf query); @Override - ReasoningStoreAdapter createStoreAdapter(ModelStore store); + ReasoningStoreAdapter build(ModelStore store); } diff --git a/subprojects/store-reasoning/src/main/java/tools/refinery/store/reasoning/internal/ReasoningAdapterImpl.java b/subprojects/store-reasoning/src/main/java/tools/refinery/store/reasoning/internal/ReasoningAdapterImpl.java index 96514d36..33b6f3c6 100644 --- a/subprojects/store-reasoning/src/main/java/tools/refinery/store/reasoning/internal/ReasoningAdapterImpl.java +++ b/subprojects/store-reasoning/src/main/java/tools/refinery/store/reasoning/internal/ReasoningAdapterImpl.java @@ -37,7 +37,7 @@ public class ReasoningAdapterImpl implements ReasoningAdapter { } @Override - public ResultSet getLiftedResultSet(Dnf query) { + public ResultSet getLiftedResultSet(Dnf query) { return null; } } diff --git a/subprojects/store-reasoning/src/main/java/tools/refinery/store/reasoning/internal/ReasoningBuilderImpl.java b/subprojects/store-reasoning/src/main/java/tools/refinery/store/reasoning/internal/ReasoningBuilderImpl.java index 49f7c7d3..aa71496c 100644 --- a/subprojects/store-reasoning/src/main/java/tools/refinery/store/reasoning/internal/ReasoningBuilderImpl.java +++ b/subprojects/store-reasoning/src/main/java/tools/refinery/store/reasoning/internal/ReasoningBuilderImpl.java @@ -7,16 +7,12 @@ package tools.refinery.store.reasoning.internal; import tools.refinery.store.adapter.AbstractModelAdapterBuilder; import tools.refinery.store.model.ModelStore; -import tools.refinery.store.model.ModelStoreBuilder; +import tools.refinery.store.query.dnf.Dnf; import tools.refinery.store.reasoning.ReasoningBuilder; import tools.refinery.store.reasoning.literal.Modality; -import tools.refinery.store.query.dnf.Dnf; - -public class ReasoningBuilderImpl extends AbstractModelAdapterBuilder implements ReasoningBuilder { - public ReasoningBuilderImpl(ModelStoreBuilder storeBuilder) { - super(storeBuilder); - } +public class ReasoningBuilderImpl extends AbstractModelAdapterBuilder + implements ReasoningBuilder { @Override public ReasoningBuilder liftedQuery(Dnf liftedQuery) { return null; @@ -24,11 +20,12 @@ public class ReasoningBuilderImpl extends AbstractModelAdapterBuilder implements @Override public Dnf lift(Modality modality, Dnf query) { + checkNotConfigured(); return null; } @Override - public ReasoningStoreAdapterImpl createStoreAdapter(ModelStore store) { + public ReasoningStoreAdapterImpl doBuild(ModelStore store) { return null; } } diff --git a/subprojects/store-reasoning/src/main/java/tools/refinery/store/reasoning/lifting/DnfLifter.java b/subprojects/store-reasoning/src/main/java/tools/refinery/store/reasoning/lifting/DnfLifter.java index 157f06e8..594005f1 100644 --- a/subprojects/store-reasoning/src/main/java/tools/refinery/store/reasoning/lifting/DnfLifter.java +++ b/subprojects/store-reasoning/src/main/java/tools/refinery/store/reasoning/lifting/DnfLifter.java @@ -14,7 +14,7 @@ import tools.refinery.store.query.literal.CallPolarity; import tools.refinery.store.query.literal.Literal; import tools.refinery.store.query.term.DataVariable; import tools.refinery.store.query.term.Variable; -import tools.refinery.store.reasoning.Reasoning; +import tools.refinery.store.reasoning.ReasoningAdapter; import tools.refinery.store.reasoning.literal.ModalConstraint; import tools.refinery.store.reasoning.literal.Modality; import tools.refinery.store.reasoning.literal.PartialLiterals; @@ -74,8 +74,8 @@ public class DnfLifter { } for (var quantifiedVariable : quantifiedVariables) { // Quantify over data variables that are not already quantified with the expected modality. - liftedLiterals.add(new CallLiteral(CallPolarity.POSITIVE, new ModalConstraint(modality, Reasoning.EXISTS), - List.of(quantifiedVariable))); + liftedLiterals.add(new CallLiteral(CallPolarity.POSITIVE, + new ModalConstraint(modality, ReasoningAdapter.EXISTS), List.of(quantifiedVariable))); } builder.clause(liftedLiterals); return changed || !quantifiedVariables.isEmpty(); @@ -87,7 +87,7 @@ public class DnfLifter { callLiteral.getPolarity() == CallPolarity.POSITIVE && callLiteral.getTarget() instanceof ModalConstraint modalConstraint && modalConstraint.modality() == modality && - modalConstraint.constraint().equals(Reasoning.EXISTS)) { + modalConstraint.constraint().equals(ReasoningAdapter.EXISTS)) { return callLiteral.getArguments().get(0); } return null; diff --git a/subprojects/store-reasoning/src/main/java/tools/refinery/store/reasoning/rule/RelationRefinementAction.java b/subprojects/store-reasoning/src/main/java/tools/refinery/store/reasoning/rule/RelationRefinementAction.java index e4c702ea..0beee248 100644 --- a/subprojects/store-reasoning/src/main/java/tools/refinery/store/reasoning/rule/RelationRefinementAction.java +++ b/subprojects/store-reasoning/src/main/java/tools/refinery/store/reasoning/rule/RelationRefinementAction.java @@ -5,7 +5,7 @@ */ package tools.refinery.store.reasoning.rule; -import tools.refinery.store.reasoning.Reasoning; +import tools.refinery.store.reasoning.ReasoningAdapter; import tools.refinery.store.reasoning.representation.PartialRelation; import tools.refinery.store.model.Model; import tools.refinery.store.query.term.Variable; @@ -28,7 +28,7 @@ public record RelationRefinementAction(PartialRelation target, List ar @Override public RuleActionExecutor createExecutor(int[] argumentIndices, Model model) { - var targetInterpretation = model.getAdapter(Reasoning.ADAPTER).getPartialInterpretation(target); + var targetInterpretation = model.getAdapter(ReasoningAdapter.class).getPartialInterpretation(target); return activationTuple -> { int arity = argumentIndices.length; var arguments = new int[arity]; diff --git a/subprojects/store-reasoning/src/main/java/tools/refinery/store/reasoning/translator/TranslationUnit.java b/subprojects/store-reasoning/src/main/java/tools/refinery/store/reasoning/translator/TranslationUnit.java index 7f01122b..6e44a7d7 100644 --- a/subprojects/store-reasoning/src/main/java/tools/refinery/store/reasoning/translator/TranslationUnit.java +++ b/subprojects/store-reasoning/src/main/java/tools/refinery/store/reasoning/translator/TranslationUnit.java @@ -6,7 +6,6 @@ package tools.refinery.store.reasoning.translator; import tools.refinery.store.model.Model; -import tools.refinery.store.model.ModelStoreBuilder; import tools.refinery.store.reasoning.ReasoningBuilder; import java.util.Collection; @@ -23,10 +22,6 @@ public abstract class TranslationUnit { configureReasoningBuilder(); } - protected ModelStoreBuilder getModelStoreBuilder() { - return reasoningBuilder.getStoreBuilder(); - } - protected void configureReasoningBuilder() { // Nothing to configure by default. } diff --git a/subprojects/store-reasoning/src/main/java/tools/refinery/store/reasoning/translator/base/BaseDecisionTranslationUnit.java b/subprojects/store-reasoning/src/main/java/tools/refinery/store/reasoning/translator/base/BaseDecisionTranslationUnit.java index d41e11c6..405e58ac 100644 --- a/subprojects/store-reasoning/src/main/java/tools/refinery/store/reasoning/translator/base/BaseDecisionTranslationUnit.java +++ b/subprojects/store-reasoning/src/main/java/tools/refinery/store/reasoning/translator/base/BaseDecisionTranslationUnit.java @@ -36,11 +36,6 @@ public class BaseDecisionTranslationUnit extends TranslationUnit { this(partialRelation, new UniformSeed<>(partialRelation.arity(), TruthValue.UNKNOWN)); } - @Override - protected void configureReasoningBuilder() { - getModelStoreBuilder().symbol(symbol); - } - @Override public Collection getTranslatedRelations() { return List.of(new TranslatedBaseDecision(getReasoningBuilder(), partialRelation, symbol)); diff --git a/subprojects/store/src/main/java/tools/refinery/store/adapter/AbstractModelAdapterBuilder.java b/subprojects/store/src/main/java/tools/refinery/store/adapter/AbstractModelAdapterBuilder.java index 70602ef5..8d3e998e 100644 --- a/subprojects/store/src/main/java/tools/refinery/store/adapter/AbstractModelAdapterBuilder.java +++ b/subprojects/store/src/main/java/tools/refinery/store/adapter/AbstractModelAdapterBuilder.java @@ -1,32 +1,48 @@ +package tools.refinery.store.adapter; /* * SPDX-FileCopyrightText: 2021-2023 The Refinery Authors * * SPDX-License-Identifier: EPL-2.0 */ -package tools.refinery.store.adapter; - import tools.refinery.store.model.ModelStore; import tools.refinery.store.model.ModelStoreBuilder; -public abstract class AbstractModelAdapterBuilder implements ModelAdapterBuilder { - private final ModelStoreBuilder storeBuilder; +public abstract class AbstractModelAdapterBuilder implements ModelAdapterBuilder { + private boolean configured; - protected AbstractModelAdapterBuilder(ModelStoreBuilder storeBuilder) { - this.storeBuilder = storeBuilder; + @Override + public boolean isConfigured() { + return configured; } - @Override - public T with(ModelAdapterBuilderFactory adapterBuilderFactory) { - return storeBuilder.with(adapterBuilderFactory); + protected void checkConfigured() { + if (!configured) { + throw new IllegalStateException("Model adapter builder was not configured"); + } + } + + protected void checkNotConfigured() { + if (configured) { + throw new IllegalStateException("Model adapter builder was already configured"); + } + } + + protected void doConfigure(ModelStoreBuilder storeBuilder) { + // Nothing to configure by default. } @Override - public ModelStoreBuilder getStoreBuilder() { - return storeBuilder; + public final void configure(ModelStoreBuilder storeBuilder) { + checkNotConfigured(); + doConfigure(storeBuilder); + configured = true; } + protected abstract T doBuild(ModelStore store); + @Override - public ModelStore build() { - return storeBuilder.build(); + public final T build(ModelStore store) { + checkConfigured(); + return doBuild(store); } } diff --git a/subprojects/store/src/main/java/tools/refinery/store/adapter/AdapterList.java b/subprojects/store/src/main/java/tools/refinery/store/adapter/AdapterList.java deleted file mode 100644 index e896d8d9..00000000 --- a/subprojects/store/src/main/java/tools/refinery/store/adapter/AdapterList.java +++ /dev/null @@ -1,102 +0,0 @@ -/* - * SPDX-FileCopyrightText: 2021-2023 The Refinery Authors - * - * SPDX-License-Identifier: EPL-2.0 - */ -package tools.refinery.store.adapter; - -import org.jetbrains.annotations.NotNull; - -import java.util.*; -import java.util.function.Consumer; - -public class AdapterList implements Iterable { - private final List adapterTypes; - private final List adapters; - - public AdapterList() { - adapterTypes = new ArrayList<>(); - adapters = new ArrayList<>(); - } - - public AdapterList(int adapterCount) { - adapterTypes = new ArrayList<>(adapterCount); - adapters = new ArrayList<>(adapterCount); - } - - public int size() { - return adapters.size(); - } - - public void add(AnyModelAdapterType adapterType, T adapter) { - adapterTypes.add(adapterType); - adapters.add(adapter); - } - - public Optional tryGet(AnyModelAdapterType adapterType, Class adapterClass) { - int size = size(); - for (int i = 0; i < size; i++) { - if (getType(i).supports(adapterType)) { - return Optional.of(adapterClass.cast(get(i))); - } - } - return Optional.empty(); - } - - public U get(AnyModelAdapterType adapterType, Class adapterClass) { - return tryGet(adapterType, adapterClass).orElseThrow(() -> new IllegalArgumentException( - "No %s was configured".formatted(adapterType))); - } - - public AnyModelAdapterType getType(int i) { - return adapterTypes.get(i); - } - - public T get(int i) { - return adapters.get(i); - } - - public Collection getAdapterTypes() { - return Collections.unmodifiableCollection(adapterTypes); - } - - public Iterable> withAdapterTypes() { - return () -> new Iterator<>() { - private int i = 0; - - @Override - public boolean hasNext() { - return i < size(); - } - - @Override - public Entry next() { - if (i >= size()) { - throw new NoSuchElementException(); - } - var entry = new Entry<>(getType(i), get(i)); - i++; - return entry; - } - }; - } - - @NotNull - @Override - public Iterator iterator() { - return adapters.iterator(); - } - - @Override - public void forEach(Consumer action) { - adapters.forEach(action); - } - - @Override - public Spliterator spliterator() { - return adapters.spliterator(); - } - - public record Entry(AnyModelAdapterType adapterType, T adapter) { - } -} diff --git a/subprojects/store/src/main/java/tools/refinery/store/adapter/AdapterUtils.java b/subprojects/store/src/main/java/tools/refinery/store/adapter/AdapterUtils.java new file mode 100644 index 00000000..556e99f0 --- /dev/null +++ b/subprojects/store/src/main/java/tools/refinery/store/adapter/AdapterUtils.java @@ -0,0 +1,33 @@ +/* + * SPDX-FileCopyrightText: 2021-2023 The Refinery Authors + * + * SPDX-License-Identifier: EPL-2.0 + */ +package tools.refinery.store.adapter; + +import java.util.Collection; +import java.util.Optional; + +public class AdapterUtils { + private AdapterUtils() { + throw new IllegalStateException("This is a static utility class and should not be instantiated directly"); + } + + public static Optional tryGetAdapter(Collection adapters, Class type) { + var iterator = adapters.stream().filter(type::isInstance).iterator(); + if (!iterator.hasNext()) { + return Optional.empty(); + } + var adapter = type.cast(iterator.next()); + if (iterator.hasNext()) { + throw new IllegalArgumentException("Ambiguous adapter: both %s and %s match %s" + .formatted(adapter.getClass().getName(), iterator.next().getClass().getName(), type.getName())); + } + return Optional.of(adapter); + } + + public static T getAdapter(Collection adapters, Class type) { + return tryGetAdapter(adapters, type).orElseThrow(() -> new IllegalArgumentException( + "No %s adapter was configured".formatted(type.getName()))); + } +} diff --git a/subprojects/store/src/main/java/tools/refinery/store/adapter/AnyModelAdapterType.java b/subprojects/store/src/main/java/tools/refinery/store/adapter/AnyModelAdapterType.java deleted file mode 100644 index f161a60b..00000000 --- a/subprojects/store/src/main/java/tools/refinery/store/adapter/AnyModelAdapterType.java +++ /dev/null @@ -1,24 +0,0 @@ -/* - * SPDX-FileCopyrightText: 2021-2023 The Refinery Authors - * - * SPDX-License-Identifier: EPL-2.0 - */ -package tools.refinery.store.adapter; - -import java.util.Collection; - -public sealed interface AnyModelAdapterType permits ModelAdapterType { - Class getModelAdapterClass(); - - Class getModelStoreAdapterClass(); - - Class getModelAdapterBuilderClass(); - - Collection getSupportedAdapterTypes(); - - default boolean supports(AnyModelAdapterType targetAdapter) { - return getSupportedAdapterTypes().contains(targetAdapter); - } - - String getName(); -} diff --git a/subprojects/store/src/main/java/tools/refinery/store/adapter/ModelAdapterBuilder.java b/subprojects/store/src/main/java/tools/refinery/store/adapter/ModelAdapterBuilder.java index 709cbb3e..75e5e07d 100644 --- a/subprojects/store/src/main/java/tools/refinery/store/adapter/ModelAdapterBuilder.java +++ b/subprojects/store/src/main/java/tools/refinery/store/adapter/ModelAdapterBuilder.java @@ -9,14 +9,9 @@ import tools.refinery.store.model.ModelStore; import tools.refinery.store.model.ModelStoreBuilder; public interface ModelAdapterBuilder { - ModelStoreAdapter createStoreAdapter(ModelStore store); + boolean isConfigured(); - T with(ModelAdapterBuilderFactory adapterBuilderFactory); + void configure(ModelStoreBuilder storeBuilder); - ModelStoreBuilder getStoreBuilder(); - - default void configure() { - } - - ModelStore build(); + ModelStoreAdapter build(ModelStore store); } diff --git a/subprojects/store/src/main/java/tools/refinery/store/adapter/ModelAdapterBuilderFactory.java b/subprojects/store/src/main/java/tools/refinery/store/adapter/ModelAdapterBuilderFactory.java deleted file mode 100644 index 1d549d5b..00000000 --- a/subprojects/store/src/main/java/tools/refinery/store/adapter/ModelAdapterBuilderFactory.java +++ /dev/null @@ -1,19 +0,0 @@ -/* - * SPDX-FileCopyrightText: 2021-2023 The Refinery Authors - * - * SPDX-License-Identifier: EPL-2.0 - */ -package tools.refinery.store.adapter; - -import tools.refinery.store.model.ModelStoreBuilder; - -public abstract class ModelAdapterBuilderFactory extends ModelAdapterType { - - protected ModelAdapterBuilderFactory(Class modelAdapterClass, Class modelStoreAdapterClass, - Class modelAdapterBuilderClass) { - super(modelAdapterClass, modelStoreAdapterClass, modelAdapterBuilderClass); - } - - public abstract T3 createBuilder(ModelStoreBuilder storeBuilder); -} diff --git a/subprojects/store/src/main/java/tools/refinery/store/adapter/ModelAdapterType.java b/subprojects/store/src/main/java/tools/refinery/store/adapter/ModelAdapterType.java deleted file mode 100644 index 6255fe52..00000000 --- a/subprojects/store/src/main/java/tools/refinery/store/adapter/ModelAdapterType.java +++ /dev/null @@ -1,84 +0,0 @@ -/* - * SPDX-FileCopyrightText: 2021-2023 The Refinery Authors - * - * SPDX-License-Identifier: EPL-2.0 - */ -package tools.refinery.store.adapter; - -import tools.refinery.store.model.Model; -import tools.refinery.store.model.ModelStore; - -import java.lang.reflect.Method; -import java.util.Collection; -import java.util.Collections; -import java.util.HashSet; -import java.util.Set; - -public abstract non-sealed class ModelAdapterType implements AnyModelAdapterType { - private final Class modelAdapterClass; - private final Class modelStoreAdapterClass; - private final Class modelAdapterBuilderClass; - private final Set supportedAdapters = new HashSet<>(); - - protected ModelAdapterType(Class modelAdapterClass, Class modelStoreAdapterClass, - Class modelAdapterBuilderClass) { - checkReturnType(modelAdapterClass, modelStoreAdapterClass, "createModelAdapter", Model.class); - checkReturnType(modelStoreAdapterClass, modelAdapterBuilderClass, "createStoreAdapter", ModelStore.class); - this.modelAdapterClass = modelAdapterClass; - this.modelStoreAdapterClass = modelStoreAdapterClass; - this.modelAdapterBuilderClass = modelAdapterBuilderClass; - supportedAdapters.add(this); - } - - private void checkReturnType(Class expectedReturnType, Class ownerClass, String methodName, - Class... argumentTypes) { - Method method; - try { - method = ownerClass.getMethod(methodName, argumentTypes); - } catch (NoSuchMethodException e) { - throw new IllegalStateException("Invalid %s: %s#%s method is required" - .formatted(this, ownerClass.getName(), methodName), e); - } - var returnType = method.getReturnType(); - if (!expectedReturnType.isAssignableFrom(returnType)) { - throw new IllegalStateException("Invalid %s: %s is not assignable from the return type %s of %s#%s" - .formatted(this, expectedReturnType.getName(), returnType.getCanonicalName(), - ownerClass.getName(), methodName)); - } - } - - protected void extendsAdapter(ModelAdapterType superAdapter) { - supportedAdapters.addAll(superAdapter.supportedAdapters); - } - - @Override - public final Class getModelAdapterClass() { - return modelAdapterClass; - } - - @Override - public final Class getModelStoreAdapterClass() { - return modelStoreAdapterClass; - } - - @Override - public final Class getModelAdapterBuilderClass() { - return modelAdapterBuilderClass; - } - - @Override - public Collection getSupportedAdapterTypes() { - return Collections.unmodifiableCollection(supportedAdapters); - } - - @Override - public String getName() { - return "%s.ADAPTER".formatted(this.getClass().getName()); - } - - @Override - public String toString() { - return getName(); - } -} diff --git a/subprojects/store/src/main/java/tools/refinery/store/model/Model.java b/subprojects/store/src/main/java/tools/refinery/store/model/Model.java index f4131756..d58d91c3 100644 --- a/subprojects/store/src/main/java/tools/refinery/store/model/Model.java +++ b/subprojects/store/src/main/java/tools/refinery/store/model/Model.java @@ -6,7 +6,6 @@ package tools.refinery.store.model; import tools.refinery.store.adapter.ModelAdapter; -import tools.refinery.store.adapter.ModelAdapterType; import tools.refinery.store.map.Versioned; import tools.refinery.store.representation.AnySymbol; import tools.refinery.store.representation.Symbol; @@ -30,9 +29,9 @@ public interface Model extends Versioned { ModelDiffCursor getDiffCursor(long to); - Optional tryGetAdapter(ModelAdapterType adapterType); + Optional tryGetAdapter(Class adapterType); - T getAdapter(ModelAdapterType adapterType); + T getAdapter(Class adapterType); void addListener(ModelListener listener); diff --git a/subprojects/store/src/main/java/tools/refinery/store/model/ModelStore.java b/subprojects/store/src/main/java/tools/refinery/store/model/ModelStore.java index a72399f7..b10eb8a4 100644 --- a/subprojects/store/src/main/java/tools/refinery/store/model/ModelStore.java +++ b/subprojects/store/src/main/java/tools/refinery/store/model/ModelStore.java @@ -5,7 +5,6 @@ */ package tools.refinery.store.model; -import tools.refinery.store.adapter.ModelAdapterType; import tools.refinery.store.adapter.ModelStoreAdapter; import tools.refinery.store.model.internal.ModelStoreBuilderImpl; import tools.refinery.store.representation.AnySymbol; @@ -25,9 +24,9 @@ public interface ModelStore { ModelDiffCursor getDiffCursor(long from, long to); - Optional tryGetAdapter(ModelAdapterType adapterType); + Optional tryGetAdapter(Class adapterType); - T getAdapter(ModelAdapterType adapterType); + T getAdapter(Class adapterType); static ModelStoreBuilder builder() { return new ModelStoreBuilderImpl(); diff --git a/subprojects/store/src/main/java/tools/refinery/store/model/ModelStoreBuilder.java b/subprojects/store/src/main/java/tools/refinery/store/model/ModelStoreBuilder.java index d9354bdb..3a4024b5 100644 --- a/subprojects/store/src/main/java/tools/refinery/store/model/ModelStoreBuilder.java +++ b/subprojects/store/src/main/java/tools/refinery/store/model/ModelStoreBuilder.java @@ -6,8 +6,6 @@ package tools.refinery.store.model; import tools.refinery.store.adapter.ModelAdapterBuilder; -import tools.refinery.store.adapter.ModelAdapterBuilderFactory; -import tools.refinery.store.adapter.ModelAdapterType; import tools.refinery.store.representation.AnySymbol; import tools.refinery.store.representation.Symbol; @@ -31,11 +29,11 @@ public interface ModelStoreBuilder { ModelStoreBuilder symbol(Symbol symbol); - T with(ModelAdapterBuilderFactory adapterBuilderFactory); + ModelStoreBuilder with(T adapterBuilder); - Optional tryGetAdapter(ModelAdapterType adapterType); + Optional tryGetAdapter(Class adapterType); - T getAdapter(ModelAdapterType adapterType); + T getAdapter(Class adapterType); ModelStore build(); } diff --git a/subprojects/store/src/main/java/tools/refinery/store/model/internal/ModelImpl.java b/subprojects/store/src/main/java/tools/refinery/store/model/internal/ModelImpl.java index 50a408da..c5475a1a 100644 --- a/subprojects/store/src/main/java/tools/refinery/store/model/internal/ModelImpl.java +++ b/subprojects/store/src/main/java/tools/refinery/store/model/internal/ModelImpl.java @@ -5,10 +5,8 @@ */ package tools.refinery.store.model.internal; -import tools.refinery.store.adapter.AdapterList; -import tools.refinery.store.adapter.AnyModelAdapterType; +import tools.refinery.store.adapter.AdapterUtils; import tools.refinery.store.adapter.ModelAdapter; -import tools.refinery.store.adapter.ModelAdapterType; import tools.refinery.store.map.DiffCursor; import tools.refinery.store.model.*; import tools.refinery.store.representation.AnySymbol; @@ -21,7 +19,7 @@ public class ModelImpl implements Model { private final ModelStore store; private long state; private Map> interpretations; - private final AdapterList adapters; + private final List adapters; private final List listeners = new ArrayList<>(); private boolean uncommittedChanges; private ModelAction pendingAction = ModelAction.NONE; @@ -30,7 +28,7 @@ public class ModelImpl implements Model { ModelImpl(ModelStore store, long state, int adapterCount) { this.store = store; this.state = state; - adapters = new AdapterList<>(adapterCount); + adapters = new ArrayList<>(adapterCount); } void setInterpretations(Map> interpretations) { @@ -167,17 +165,17 @@ public class ModelImpl implements Model { } @Override - public Optional tryGetAdapter(ModelAdapterType adapterType) { - return adapters.tryGet(adapterType, adapterType.getModelAdapterClass()); + public Optional tryGetAdapter(Class adapterType) { + return AdapterUtils.tryGetAdapter(adapters, adapterType); } @Override - public T getAdapter(ModelAdapterType adapterType) { - return adapters.get(adapterType, adapterType.getModelAdapterClass()); + public T getAdapter(Class adapterType) { + return AdapterUtils.getAdapter(adapters, adapterType); } - void addAdapter(AnyModelAdapterType adapterType, ModelAdapter adapter) { - adapters.add(adapterType, adapter); + void addAdapter(ModelAdapter adapter) { + adapters.add(adapter); } @Override diff --git a/subprojects/store/src/main/java/tools/refinery/store/model/internal/ModelStoreBuilderImpl.java b/subprojects/store/src/main/java/tools/refinery/store/model/internal/ModelStoreBuilderImpl.java index 70bccb96..aafbe130 100644 --- a/subprojects/store/src/main/java/tools/refinery/store/model/internal/ModelStoreBuilderImpl.java +++ b/subprojects/store/src/main/java/tools/refinery/store/model/internal/ModelStoreBuilderImpl.java @@ -5,10 +5,8 @@ */ package tools.refinery.store.model.internal; -import tools.refinery.store.adapter.AdapterList; +import tools.refinery.store.adapter.AdapterUtils; import tools.refinery.store.adapter.ModelAdapterBuilder; -import tools.refinery.store.adapter.ModelAdapterBuilderFactory; -import tools.refinery.store.adapter.ModelAdapterType; import tools.refinery.store.map.VersionedMapStore; import tools.refinery.store.map.VersionedMapStoreImpl; import tools.refinery.store.model.ModelStore; @@ -23,7 +21,7 @@ import java.util.*; public class ModelStoreBuilderImpl implements ModelStoreBuilder { private final Set allSymbols = new HashSet<>(); private final Map, List> equivalenceClasses = new HashMap<>(); - private final AdapterList adapters = new AdapterList<>(); + private final List adapters = new ArrayList<>(); @Override public ModelStoreBuilder symbol(Symbol symbol) { @@ -38,46 +36,25 @@ public class ModelStoreBuilderImpl implements ModelStoreBuilder { } @Override - public T with(ModelAdapterBuilderFactory adapterBuilderFactory) { - return adapters.tryGet(adapterBuilderFactory, adapterBuilderFactory.getModelAdapterBuilderClass()) - .orElseGet(() -> addAdapter(adapterBuilderFactory)); - } - - private T addAdapter(ModelAdapterBuilderFactory adapterBuilderFactory) { - for (var configuredAdapterType : adapters.getAdapterTypes()) { - var intersection = new HashSet<>(adapterBuilderFactory.getSupportedAdapterTypes()); - intersection.retainAll(configuredAdapterType.getSupportedAdapterTypes()); - if (!intersection.isEmpty()) { - if (configuredAdapterType.supports(adapterBuilderFactory)) { - // Impossible to end up here from #with, because we should have returned - // the existing adapter there instead of adding a new one. - throw new IllegalArgumentException( - "Cannot add %s, because it is already provided by configured adapter %s" - .formatted(adapterBuilderFactory, configuredAdapterType)); - } else if (adapterBuilderFactory.supports(configuredAdapterType)) { - throw new IllegalArgumentException( - "Cannot add %s, because it provides already configured adapter %s" - .formatted(adapterBuilderFactory, configuredAdapterType)); - } else { - throw new IllegalArgumentException( - "Cannot add %s, because configured adapter %s already provides %s" - .formatted(adapterBuilderFactory, configuredAdapterType, intersection)); - } + public ModelStoreBuilder with(T adapterBuilder) { + for (var existingAdapter : adapters) { + if (existingAdapter.getClass().equals(adapterBuilder.getClass())) { + throw new IllegalArgumentException("%s adapter was already configured for store builder" + .formatted(adapterBuilder.getClass().getName())); } } - var newAdapter = adapterBuilderFactory.createBuilder(this); - adapters.add(adapterBuilderFactory, newAdapter); - return newAdapter; + adapters.add(adapterBuilder); + return this; } @Override - public Optional tryGetAdapter(ModelAdapterType adapterType) { - return adapters.tryGet(adapterType, adapterType.getModelAdapterBuilderClass()); + public Optional tryGetAdapter(Class adapterType) { + return AdapterUtils.tryGetAdapter(adapters, adapterType); } @Override - public T getAdapter(ModelAdapterType adapterType) { - return adapters.get(adapterType, adapterType.getModelAdapterBuilderClass()); + public T getAdapter(Class adapterType) { + return AdapterUtils.getAdapter(adapters, adapterType); } @Override @@ -86,13 +63,13 @@ public class ModelStoreBuilderImpl implements ModelStoreBuilder { for (var entry : equivalenceClasses.entrySet()) { createStores(stores, entry.getKey(), entry.getValue()); } - var modelStore = new ModelStoreImpl(stores, adapters.size()); for (int i = adapters.size() - 1; i >= 0; i--) { - adapters.get(i).configure(); + adapters.get(i).configure(this); } - for (var entry : adapters.withAdapterTypes()) { - var adapter = entry.adapter().createStoreAdapter(modelStore); - modelStore.addAdapter(entry.adapterType(), adapter); + var modelStore = new ModelStoreImpl(stores, adapters.size()); + for (var adapterBuilder : adapters) { + var storeAdapter = adapterBuilder.build(modelStore); + modelStore.addAdapter(storeAdapter); } return modelStore; } diff --git a/subprojects/store/src/main/java/tools/refinery/store/model/internal/ModelStoreImpl.java b/subprojects/store/src/main/java/tools/refinery/store/model/internal/ModelStoreImpl.java index bfae7181..60b735e6 100644 --- a/subprojects/store/src/main/java/tools/refinery/store/model/internal/ModelStoreImpl.java +++ b/subprojects/store/src/main/java/tools/refinery/store/model/internal/ModelStoreImpl.java @@ -5,9 +5,7 @@ */ package tools.refinery.store.model.internal; -import tools.refinery.store.adapter.AdapterList; -import tools.refinery.store.adapter.AnyModelAdapterType; -import tools.refinery.store.adapter.ModelAdapterType; +import tools.refinery.store.adapter.AdapterUtils; import tools.refinery.store.adapter.ModelStoreAdapter; import tools.refinery.store.map.DiffCursor; import tools.refinery.store.map.VersionedMapStore; @@ -21,11 +19,11 @@ import java.util.*; public class ModelStoreImpl implements ModelStore { private final Map> stores; - private final AdapterList adapters; + private final List adapters; ModelStoreImpl(Map> stores, int adapterCount) { this.stores = stores; - adapters = new AdapterList<>(adapterCount); + adapters = new ArrayList<>(adapterCount); } @Override @@ -64,9 +62,9 @@ public class ModelStoreImpl implements ModelStore { } private void adaptModel(ModelImpl model) { - for (var entry : adapters.withAdapterTypes()) { - var adapter = entry.adapter().createModelAdapter(model); - model.addAdapter(entry.adapterType(), adapter); + for (var storeAdapter : adapters) { + var adapter = storeAdapter.createModelAdapter(model); + model.addAdapter(adapter); } } @@ -91,16 +89,16 @@ public class ModelStoreImpl implements ModelStore { } @Override - public Optional tryGetAdapter(ModelAdapterType adapterType) { - return adapters.tryGet(adapterType, adapterType.getModelStoreAdapterClass()); + public Optional tryGetAdapter(Class adapterType) { + return AdapterUtils.tryGetAdapter(adapters, adapterType); } @Override - public T getAdapter(ModelAdapterType adapterType) { - return adapters.get(adapterType, adapterType.getModelStoreAdapterClass()); + public T getAdapter(Class adapterType) { + return AdapterUtils.getAdapter(adapters, adapterType); } - void addAdapter(AnyModelAdapterType adapterType, ModelStoreAdapter adapter) { - adapters.add(adapterType, adapter); + void addAdapter(ModelStoreAdapter adapter) { + adapters.add(adapter); } } -- cgit v1.2.3-54-g00ecf