aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorLibravatar Kristóf Marussy <kristof@marussy.com>2023-04-21 02:12:04 +0200
committerLibravatar Kristóf Marussy <kristof@marussy.com>2023-04-21 02:34:52 +0200
commitea0f09096afe05e2d414c707584e1e33c0c44383 (patch)
tree60763156db85be14e34aaf1b504ccbd1faad8bff
parentfix: REAL_SUM input and result type (diff)
downloadrefinery-ea0f09096afe05e2d414c707584e1e33c0c44383.tar.gz
refinery-ea0f09096afe05e2d414c707584e1e33c0c44383.tar.zst
refinery-ea0f09096afe05e2d414c707584e1e33c0c44383.zip
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.
-rw-r--r--subprojects/store-query-viatra/src/main/java/tools/refinery/store/query/viatra/ViatraModelQuery.java26
-rw-r--r--subprojects/store-query-viatra/src/main/java/tools/refinery/store/query/viatra/ViatraModelQueryAdapter.java5
-rw-r--r--subprojects/store-query-viatra/src/main/java/tools/refinery/store/query/viatra/ViatraModelQueryBuilder.java2
-rw-r--r--subprojects/store-query-viatra/src/main/java/tools/refinery/store/query/viatra/internal/ViatraModelQueryBuilderImpl.java22
-rw-r--r--subprojects/store-query-viatra/src/test/java/tools/refinery/store/query/viatra/DiagonalQueryTest.java66
-rw-r--r--subprojects/store-query-viatra/src/test/java/tools/refinery/store/query/viatra/FunctionalQueryTest.java90
-rw-r--r--subprojects/store-query-viatra/src/test/java/tools/refinery/store/query/viatra/QueryTest.java123
-rw-r--r--subprojects/store-query-viatra/src/test/java/tools/refinery/store/query/viatra/QueryTransactionTest.java46
-rw-r--r--subprojects/store-query/src/main/java/tools/refinery/store/query/ModelQuery.java16
-rw-r--r--subprojects/store-query/src/main/java/tools/refinery/store/query/ModelQueryBuilder.java2
-rw-r--r--subprojects/store-reasoning/src/main/java/tools/refinery/store/reasoning/Reasoning.java29
-rw-r--r--subprojects/store-reasoning/src/main/java/tools/refinery/store/reasoning/ReasoningAdapter.java9
-rw-r--r--subprojects/store-reasoning/src/main/java/tools/refinery/store/reasoning/ReasoningBuilder.java2
-rw-r--r--subprojects/store-reasoning/src/main/java/tools/refinery/store/reasoning/internal/ReasoningAdapterImpl.java2
-rw-r--r--subprojects/store-reasoning/src/main/java/tools/refinery/store/reasoning/internal/ReasoningBuilderImpl.java13
-rw-r--r--subprojects/store-reasoning/src/main/java/tools/refinery/store/reasoning/lifting/DnfLifter.java8
-rw-r--r--subprojects/store-reasoning/src/main/java/tools/refinery/store/reasoning/rule/RelationRefinementAction.java4
-rw-r--r--subprojects/store-reasoning/src/main/java/tools/refinery/store/reasoning/translator/TranslationUnit.java5
-rw-r--r--subprojects/store-reasoning/src/main/java/tools/refinery/store/reasoning/translator/base/BaseDecisionTranslationUnit.java5
-rw-r--r--subprojects/store/src/main/java/tools/refinery/store/adapter/AbstractModelAdapterBuilder.java42
-rw-r--r--subprojects/store/src/main/java/tools/refinery/store/adapter/AdapterList.java102
-rw-r--r--subprojects/store/src/main/java/tools/refinery/store/adapter/AdapterUtils.java33
-rw-r--r--subprojects/store/src/main/java/tools/refinery/store/adapter/AnyModelAdapterType.java24
-rw-r--r--subprojects/store/src/main/java/tools/refinery/store/adapter/ModelAdapterBuilder.java11
-rw-r--r--subprojects/store/src/main/java/tools/refinery/store/adapter/ModelAdapterBuilderFactory.java19
-rw-r--r--subprojects/store/src/main/java/tools/refinery/store/adapter/ModelAdapterType.java84
-rw-r--r--subprojects/store/src/main/java/tools/refinery/store/model/Model.java5
-rw-r--r--subprojects/store/src/main/java/tools/refinery/store/model/ModelStore.java5
-rw-r--r--subprojects/store/src/main/java/tools/refinery/store/model/ModelStoreBuilder.java8
-rw-r--r--subprojects/store/src/main/java/tools/refinery/store/model/internal/ModelImpl.java20
-rw-r--r--subprojects/store/src/main/java/tools/refinery/store/model/internal/ModelStoreBuilderImpl.java59
-rw-r--r--subprojects/store/src/main/java/tools/refinery/store/model/internal/ModelStoreImpl.java26
32 files changed, 316 insertions, 597 deletions
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 @@
1/*
2 * SPDX-FileCopyrightText: 2021-2023 The Refinery Authors <https://refinery.tools/>
3 *
4 * SPDX-License-Identifier: EPL-2.0
5 */
6package tools.refinery.store.query.viatra;
7
8import tools.refinery.store.adapter.ModelAdapterBuilderFactory;
9import tools.refinery.store.model.ModelStoreBuilder;
10import tools.refinery.store.query.ModelQuery;
11import tools.refinery.store.query.viatra.internal.ViatraModelQueryBuilderImpl;
12
13public final class ViatraModelQuery extends ModelAdapterBuilderFactory<ViatraModelQueryAdapter,
14 ViatraModelQueryStoreAdapter, ViatraModelQueryBuilder> {
15 public static final ViatraModelQuery ADAPTER = new ViatraModelQuery();
16
17 private ViatraModelQuery() {
18 super(ViatraModelQueryAdapter.class, ViatraModelQueryStoreAdapter.class, ViatraModelQueryBuilder.class);
19 extendsAdapter(ModelQuery.ADAPTER);
20 }
21
22 @Override
23 public ViatraModelQueryBuilder createBuilder(ModelStoreBuilder storeBuilder) {
24 return new ViatraModelQueryBuilderImpl(storeBuilder);
25 }
26}
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 @@
6package tools.refinery.store.query.viatra; 6package tools.refinery.store.query.viatra;
7 7
8import tools.refinery.store.query.ModelQueryAdapter; 8import tools.refinery.store.query.ModelQueryAdapter;
9import tools.refinery.store.query.viatra.internal.ViatraModelQueryBuilderImpl;
9 10
10public interface ViatraModelQueryAdapter extends ModelQueryAdapter { 11public interface ViatraModelQueryAdapter extends ModelQueryAdapter {
11 @Override 12 @Override
12 ViatraModelQueryStoreAdapter getStoreAdapter(); 13 ViatraModelQueryStoreAdapter getStoreAdapter();
14
15 static ViatraModelQueryBuilder builder() {
16 return new ViatraModelQueryBuilderImpl();
17 }
13} 18}
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 {
50 ViatraModelQueryBuilder hint(Dnf dnf, QueryEvaluationHint queryEvaluationHint); 50 ViatraModelQueryBuilder hint(Dnf dnf, QueryEvaluationHint queryEvaluationHint);
51 51
52 @Override 52 @Override
53 ViatraModelQueryStoreAdapter createStoreAdapter(ModelStore store); 53 ViatraModelQueryStoreAdapter build(ModelStore store);
54} 54}
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;
25import java.util.*; 25import java.util.*;
26import java.util.function.Function; 26import java.util.function.Function;
27 27
28public class ViatraModelQueryBuilderImpl extends AbstractModelAdapterBuilder implements ViatraModelQueryBuilder { 28public class ViatraModelQueryBuilderImpl extends AbstractModelAdapterBuilder<ViatraModelQueryStoreAdapterImpl>
29 implements ViatraModelQueryBuilder {
29 private ViatraQueryEngineOptions.Builder engineOptionsBuilder; 30 private ViatraQueryEngineOptions.Builder engineOptionsBuilder;
30 private QueryEvaluationHint defaultHint = new QueryEvaluationHint(Map.of( 31 private QueryEvaluationHint defaultHint = new QueryEvaluationHint(Map.of(
31 // Use a cost function that ignores the initial (empty) model but allows higher arity input keys. 32 // 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
35 private final Set<AnyQuery> vacuousQueries = new LinkedHashSet<>(); 36 private final Set<AnyQuery> vacuousQueries = new LinkedHashSet<>();
36 private final Map<AnyQuery, IQuerySpecification<RawPatternMatcher>> querySpecifications = new LinkedHashMap<>(); 37 private final Map<AnyQuery, IQuerySpecification<RawPatternMatcher>> querySpecifications = new LinkedHashMap<>();
37 38
38 public ViatraModelQueryBuilderImpl(ModelStoreBuilder storeBuilder) { 39 public ViatraModelQueryBuilderImpl() {
39 super(storeBuilder);
40 engineOptionsBuilder = new ViatraQueryEngineOptions.Builder() 40 engineOptionsBuilder = new ViatraQueryEngineOptions.Builder()
41 .withDefaultBackend(ReteBackendFactory.INSTANCE) 41 .withDefaultBackend(ReteBackendFactory.INSTANCE)
42 .withDefaultCachingBackend(ReteBackendFactory.INSTANCE) 42 .withDefaultCachingBackend(ReteBackendFactory.INSTANCE)
@@ -45,36 +45,42 @@ public class ViatraModelQueryBuilderImpl extends AbstractModelAdapterBuilder imp
45 45
46 @Override 46 @Override
47 public ViatraModelQueryBuilder engineOptions(ViatraQueryEngineOptions engineOptions) { 47 public ViatraModelQueryBuilder engineOptions(ViatraQueryEngineOptions engineOptions) {
48 checkNotConfigured();
48 engineOptionsBuilder = new ViatraQueryEngineOptions.Builder(engineOptions); 49 engineOptionsBuilder = new ViatraQueryEngineOptions.Builder(engineOptions);
49 return this; 50 return this;
50 } 51 }
51 52
52 @Override 53 @Override
53 public ViatraModelQueryBuilder defaultHint(QueryEvaluationHint queryEvaluationHint) { 54 public ViatraModelQueryBuilder defaultHint(QueryEvaluationHint queryEvaluationHint) {
55 checkNotConfigured();
54 defaultHint = defaultHint.overrideBy(queryEvaluationHint); 56 defaultHint = defaultHint.overrideBy(queryEvaluationHint);
55 return this; 57 return this;
56 } 58 }
57 59
58 @Override 60 @Override
59 public ViatraModelQueryBuilder backend(IQueryBackendFactory queryBackendFactory) { 61 public ViatraModelQueryBuilder backend(IQueryBackendFactory queryBackendFactory) {
62 checkNotConfigured();
60 engineOptionsBuilder.withDefaultBackend(queryBackendFactory); 63 engineOptionsBuilder.withDefaultBackend(queryBackendFactory);
61 return this; 64 return this;
62 } 65 }
63 66
64 @Override 67 @Override
65 public ViatraModelQueryBuilder cachingBackend(IQueryBackendFactory queryBackendFactory) { 68 public ViatraModelQueryBuilder cachingBackend(IQueryBackendFactory queryBackendFactory) {
69 checkNotConfigured();
66 engineOptionsBuilder.withDefaultCachingBackend(queryBackendFactory); 70 engineOptionsBuilder.withDefaultCachingBackend(queryBackendFactory);
67 return this; 71 return this;
68 } 72 }
69 73
70 @Override 74 @Override
71 public ViatraModelQueryBuilder searchBackend(IQueryBackendFactory queryBackendFactory) { 75 public ViatraModelQueryBuilder searchBackend(IQueryBackendFactory queryBackendFactory) {
76 checkNotConfigured();
72 engineOptionsBuilder.withDefaultSearchBackend(queryBackendFactory); 77 engineOptionsBuilder.withDefaultSearchBackend(queryBackendFactory);
73 return this; 78 return this;
74 } 79 }
75 80
76 @Override 81 @Override
77 public ViatraModelQueryBuilder query(AnyQuery query) { 82 public ViatraModelQueryBuilder query(AnyQuery query) {
83 checkNotConfigured();
78 if (querySpecifications.containsKey(query) || vacuousQueries.contains(query)) { 84 if (querySpecifications.containsKey(query) || vacuousQueries.contains(query)) {
79 // Ignore duplicate queries. 85 // Ignore duplicate queries.
80 return this; 86 return this;
@@ -103,20 +109,26 @@ public class ViatraModelQueryBuilderImpl extends AbstractModelAdapterBuilder imp
103 109
104 @Override 110 @Override
105 public ViatraModelQueryBuilder computeHint(Function<Dnf, QueryEvaluationHint> computeHint) { 111 public ViatraModelQueryBuilder computeHint(Function<Dnf, QueryEvaluationHint> computeHint) {
112 checkNotConfigured();
106 dnf2PQuery.setComputeHint(computeHint); 113 dnf2PQuery.setComputeHint(computeHint);
107 return this; 114 return this;
108 } 115 }
109 116
110 @Override 117 @Override
111 public ViatraModelQueryBuilder hint(Dnf dnf, QueryEvaluationHint queryEvaluationHint) { 118 public ViatraModelQueryBuilder hint(Dnf dnf, QueryEvaluationHint queryEvaluationHint) {
119 checkNotConfigured();
112 dnf2PQuery.hint(dnf, queryEvaluationHint); 120 dnf2PQuery.hint(dnf, queryEvaluationHint);
113 return this; 121 return this;
114 } 122 }
115 123
116 @Override 124 @Override
117 public ViatraModelQueryStoreAdapterImpl createStoreAdapter(ModelStore store) { 125 public void doConfigure(ModelStoreBuilder storeBuilder) {
118 validateSymbols(store);
119 dnf2PQuery.assertNoUnusedHints(); 126 dnf2PQuery.assertNoUnusedHints();
127 }
128
129 @Override
130 public ViatraModelQueryStoreAdapterImpl doBuild(ModelStore store) {
131 validateSymbols(store);
120 return new ViatraModelQueryStoreAdapterImpl(store, buildEngineOptions(), dnf2PQuery.getSymbolViews(), 132 return new ViatraModelQueryStoreAdapterImpl(store, buildEngineOptions(), dnf2PQuery.getSymbolViews(),
121 Collections.unmodifiableMap(querySpecifications), Collections.unmodifiableSet(vacuousQueries)); 133 Collections.unmodifiableMap(querySpecifications), Collections.unmodifiableSet(vacuousQueries));
122 } 134 }
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;
7 7
8import org.eclipse.viatra.query.runtime.matchers.backend.QueryEvaluationHint; 8import org.eclipse.viatra.query.runtime.matchers.backend.QueryEvaluationHint;
9import tools.refinery.store.model.ModelStore; 9import tools.refinery.store.model.ModelStore;
10import tools.refinery.store.query.ModelQuery; 10import tools.refinery.store.query.ModelQueryAdapter;
11import tools.refinery.store.query.dnf.Dnf; 11import tools.refinery.store.query.dnf.Dnf;
12import tools.refinery.store.query.dnf.Query; 12import tools.refinery.store.query.dnf.Query;
13import tools.refinery.store.query.viatra.tests.QueryEngineTest; 13import tools.refinery.store.query.viatra.tests.QueryEngineTest;
@@ -40,15 +40,15 @@ class DiagonalQueryTest {
40 40
41 var store = ModelStore.builder() 41 var store = ModelStore.builder()
42 .symbols(person, symbol) 42 .symbols(person, symbol)
43 .with(ViatraModelQuery.ADAPTER) 43 .with(ViatraModelQueryAdapter.builder()
44 .defaultHint(hint) 44 .defaultHint(hint)
45 .queries(query) 45 .queries(query))
46 .build(); 46 .build();
47 47
48 var model = store.createEmptyModel(); 48 var model = store.createEmptyModel();
49 var personInterpretation = model.getInterpretation(person); 49 var personInterpretation = model.getInterpretation(person);
50 var symbolInterpretation = model.getInterpretation(symbol); 50 var symbolInterpretation = model.getInterpretation(symbol);
51 var queryEngine = model.getAdapter(ModelQuery.ADAPTER); 51 var queryEngine = model.getAdapter(ModelQueryAdapter.class);
52 var queryResultSet = queryEngine.getResultSet(query); 52 var queryResultSet = queryEngine.getResultSet(query);
53 53
54 personInterpretation.put(Tuple.of(0), true); 54 personInterpretation.put(Tuple.of(0), true);
@@ -97,15 +97,15 @@ class DiagonalQueryTest {
97 97
98 var store = ModelStore.builder() 98 var store = ModelStore.builder()
99 .symbols(person, symbol) 99 .symbols(person, symbol)
100 .with(ViatraModelQuery.ADAPTER) 100 .with(ViatraModelQueryAdapter.builder()
101 .defaultHint(hint) 101 .defaultHint(hint)
102 .queries(query) 102 .queries(query))
103 .build(); 103 .build();
104 104
105 var model = store.createEmptyModel(); 105 var model = store.createEmptyModel();
106 var personInterpretation = model.getInterpretation(person); 106 var personInterpretation = model.getInterpretation(person);
107 var symbolInterpretation = model.getInterpretation(symbol); 107 var symbolInterpretation = model.getInterpretation(symbol);
108 var queryEngine = model.getAdapter(ModelQuery.ADAPTER); 108 var queryEngine = model.getAdapter(ModelQueryAdapter.class);
109 var queryResultSet = queryEngine.getResultSet(query); 109 var queryResultSet = queryEngine.getResultSet(query);
110 110
111 personInterpretation.put(Tuple.of(0), true); 111 personInterpretation.put(Tuple.of(0), true);
@@ -140,15 +140,15 @@ class DiagonalQueryTest {
140 140
141 var store = ModelStore.builder() 141 var store = ModelStore.builder()
142 .symbols(person, symbol) 142 .symbols(person, symbol)
143 .with(ViatraModelQuery.ADAPTER) 143 .with(ViatraModelQueryAdapter.builder()
144 .defaultHint(hint) 144 .defaultHint(hint)
145 .queries(query) 145 .queries(query))
146 .build(); 146 .build();
147 147
148 var model = store.createEmptyModel(); 148 var model = store.createEmptyModel();
149 var personInterpretation = model.getInterpretation(person); 149 var personInterpretation = model.getInterpretation(person);
150 var symbolInterpretation = model.getInterpretation(symbol); 150 var symbolInterpretation = model.getInterpretation(symbol);
151 var queryEngine = model.getAdapter(ModelQuery.ADAPTER); 151 var queryEngine = model.getAdapter(ModelQueryAdapter.class);
152 var queryResultSet = queryEngine.getResultSet(query); 152 var queryResultSet = queryEngine.getResultSet(query);
153 153
154 personInterpretation.put(Tuple.of(0), true); 154 personInterpretation.put(Tuple.of(0), true);
@@ -198,15 +198,15 @@ class DiagonalQueryTest {
198 198
199 var store = ModelStore.builder() 199 var store = ModelStore.builder()
200 .symbols(person, symbol) 200 .symbols(person, symbol)
201 .with(ViatraModelQuery.ADAPTER) 201 .with(ViatraModelQueryAdapter.builder()
202 .defaultHint(hint) 202 .defaultHint(hint)
203 .queries(query) 203 .queries(query))
204 .build(); 204 .build();
205 205
206 var model = store.createEmptyModel(); 206 var model = store.createEmptyModel();
207 var personInterpretation = model.getInterpretation(person); 207 var personInterpretation = model.getInterpretation(person);
208 var symbolInterpretation = model.getInterpretation(symbol); 208 var symbolInterpretation = model.getInterpretation(symbol);
209 var queryEngine = model.getAdapter(ModelQuery.ADAPTER); 209 var queryEngine = model.getAdapter(ModelQueryAdapter.class);
210 var queryResultSet = queryEngine.getResultSet(query); 210 var queryResultSet = queryEngine.getResultSet(query);
211 211
212 personInterpretation.put(Tuple.of(0), true); 212 personInterpretation.put(Tuple.of(0), true);
@@ -243,15 +243,15 @@ class DiagonalQueryTest {
243 243
244 var store = ModelStore.builder() 244 var store = ModelStore.builder()
245 .symbols(person, symbol) 245 .symbols(person, symbol)
246 .with(ViatraModelQuery.ADAPTER) 246 .with(ViatraModelQueryAdapter.builder()
247 .defaultHint(hint) 247 .defaultHint(hint)
248 .queries(query) 248 .queries(query))
249 .build(); 249 .build();
250 250
251 var model = store.createEmptyModel(); 251 var model = store.createEmptyModel();
252 var personInterpretation = model.getInterpretation(person); 252 var personInterpretation = model.getInterpretation(person);
253 var symbolInterpretation = model.getInterpretation(symbol); 253 var symbolInterpretation = model.getInterpretation(symbol);
254 var queryEngine = model.getAdapter(ModelQuery.ADAPTER); 254 var queryEngine = model.getAdapter(ModelQueryAdapter.class);
255 var queryResultSet = queryEngine.getResultSet(query); 255 var queryResultSet = queryEngine.getResultSet(query);
256 256
257 personInterpretation.put(Tuple.of(0), true); 257 personInterpretation.put(Tuple.of(0), true);
@@ -306,15 +306,15 @@ class DiagonalQueryTest {
306 306
307 var store = ModelStore.builder() 307 var store = ModelStore.builder()
308 .symbols(person, symbol) 308 .symbols(person, symbol)
309 .with(ViatraModelQuery.ADAPTER) 309 .with(ViatraModelQueryAdapter.builder()
310 .defaultHint(hint) 310 .defaultHint(hint)
311 .queries(query) 311 .queries(query))
312 .build(); 312 .build();
313 313
314 var model = store.createEmptyModel(); 314 var model = store.createEmptyModel();
315 var personInterpretation = model.getInterpretation(person); 315 var personInterpretation = model.getInterpretation(person);
316 var symbolInterpretation = model.getInterpretation(symbol); 316 var symbolInterpretation = model.getInterpretation(symbol);
317 var queryEngine = model.getAdapter(ModelQuery.ADAPTER); 317 var queryEngine = model.getAdapter(ModelQueryAdapter.class);
318 var queryResultSet = queryEngine.getResultSet(query); 318 var queryResultSet = queryEngine.getResultSet(query);
319 319
320 personInterpretation.put(Tuple.of(0), true); 320 personInterpretation.put(Tuple.of(0), true);
@@ -350,15 +350,15 @@ class DiagonalQueryTest {
350 350
351 var store = ModelStore.builder() 351 var store = ModelStore.builder()
352 .symbols(person, symbol) 352 .symbols(person, symbol)
353 .with(ViatraModelQuery.ADAPTER) 353 .with(ViatraModelQueryAdapter.builder()
354 .defaultHint(hint) 354 .defaultHint(hint)
355 .queries(query) 355 .queries(query))
356 .build(); 356 .build();
357 357
358 var model = store.createEmptyModel(); 358 var model = store.createEmptyModel();
359 var personInterpretation = model.getInterpretation(person); 359 var personInterpretation = model.getInterpretation(person);
360 var symbolInterpretation = model.getInterpretation(symbol); 360 var symbolInterpretation = model.getInterpretation(symbol);
361 var queryEngine = model.getAdapter(ModelQuery.ADAPTER); 361 var queryEngine = model.getAdapter(ModelQueryAdapter.class);
362 var queryResultSet = queryEngine.getResultSet(query); 362 var queryResultSet = queryEngine.getResultSet(query);
363 363
364 personInterpretation.put(Tuple.of(0), true); 364 personInterpretation.put(Tuple.of(0), true);
@@ -404,15 +404,15 @@ class DiagonalQueryTest {
404 404
405 var store = ModelStore.builder() 405 var store = ModelStore.builder()
406 .symbols(person, symbol) 406 .symbols(person, symbol)
407 .with(ViatraModelQuery.ADAPTER) 407 .with(ViatraModelQueryAdapter.builder()
408 .defaultHint(hint) 408 .defaultHint(hint)
409 .queries(query) 409 .queries(query))
410 .build(); 410 .build();
411 411
412 var model = store.createEmptyModel(); 412 var model = store.createEmptyModel();
413 var personInterpretation = model.getInterpretation(person); 413 var personInterpretation = model.getInterpretation(person);
414 var symbolInterpretation = model.getInterpretation(symbol); 414 var symbolInterpretation = model.getInterpretation(symbol);
415 var queryEngine = model.getAdapter(ModelQuery.ADAPTER); 415 var queryEngine = model.getAdapter(ModelQueryAdapter.class);
416 var queryResultSet = queryEngine.getResultSet(query); 416 var queryResultSet = queryEngine.getResultSet(query);
417 417
418 personInterpretation.put(Tuple.of(0), true); 418 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;
8import org.eclipse.viatra.query.runtime.matchers.backend.QueryEvaluationHint; 8import org.eclipse.viatra.query.runtime.matchers.backend.QueryEvaluationHint;
9import tools.refinery.store.map.Cursor; 9import tools.refinery.store.map.Cursor;
10import tools.refinery.store.model.ModelStore; 10import tools.refinery.store.model.ModelStore;
11import tools.refinery.store.query.ModelQuery; 11import tools.refinery.store.query.ModelQueryAdapter;
12import tools.refinery.store.query.dnf.Dnf; 12import tools.refinery.store.query.dnf.Dnf;
13import tools.refinery.store.query.dnf.Query; 13import tools.refinery.store.query.dnf.Query;
14import tools.refinery.store.query.term.Variable; 14import tools.refinery.store.query.term.Variable;
@@ -49,15 +49,15 @@ class FunctionalQueryTest {
49 49
50 var store = ModelStore.builder() 50 var store = ModelStore.builder()
51 .symbols(person, age) 51 .symbols(person, age)
52 .with(ViatraModelQuery.ADAPTER) 52 .with(ViatraModelQueryAdapter.builder()
53 .defaultHint(hint) 53 .defaultHint(hint)
54 .queries(query) 54 .queries(query))
55 .build(); 55 .build();
56 56
57 var model = store.createEmptyModel(); 57 var model = store.createEmptyModel();
58 var personInterpretation = model.getInterpretation(person); 58 var personInterpretation = model.getInterpretation(person);
59 var ageInterpretation = model.getInterpretation(age); 59 var ageInterpretation = model.getInterpretation(age);
60 var queryEngine = model.getAdapter(ModelQuery.ADAPTER); 60 var queryEngine = model.getAdapter(ModelQueryAdapter.class);
61 var queryResultSet = queryEngine.getResultSet(query); 61 var queryResultSet = queryEngine.getResultSet(query);
62 62
63 personInterpretation.put(Tuple.of(0), true); 63 personInterpretation.put(Tuple.of(0), true);
@@ -97,15 +97,15 @@ class FunctionalQueryTest {
97 97
98 var store = ModelStore.builder() 98 var store = ModelStore.builder()
99 .symbols(person, age) 99 .symbols(person, age)
100 .with(ViatraModelQuery.ADAPTER) 100 .with(ViatraModelQueryAdapter.builder()
101 .defaultHint(hint) 101 .defaultHint(hint)
102 .queries(query) 102 .queries(query))
103 .build(); 103 .build();
104 104
105 var model = store.createEmptyModel(); 105 var model = store.createEmptyModel();
106 var personInterpretation = model.getInterpretation(person); 106 var personInterpretation = model.getInterpretation(person);
107 var ageInterpretation = model.getInterpretation(age); 107 var ageInterpretation = model.getInterpretation(age);
108 var queryEngine = model.getAdapter(ModelQuery.ADAPTER); 108 var queryEngine = model.getAdapter(ModelQueryAdapter.class);
109 var queryResultSet = queryEngine.getResultSet(query); 109 var queryResultSet = queryEngine.getResultSet(query);
110 110
111 personInterpretation.put(Tuple.of(0), true); 111 personInterpretation.put(Tuple.of(0), true);
@@ -141,15 +141,15 @@ class FunctionalQueryTest {
141 141
142 var store = ModelStore.builder() 142 var store = ModelStore.builder()
143 .symbols(person, age) 143 .symbols(person, age)
144 .with(ViatraModelQuery.ADAPTER) 144 .with(ViatraModelQueryAdapter.builder()
145 .defaultHint(hint) 145 .defaultHint(hint)
146 .queries(query) 146 .queries(query))
147 .build(); 147 .build();
148 148
149 var model = store.createEmptyModel(); 149 var model = store.createEmptyModel();
150 var personInterpretation = model.getInterpretation(person); 150 var personInterpretation = model.getInterpretation(person);
151 var ageInterpretation = model.getInterpretation(age); 151 var ageInterpretation = model.getInterpretation(age);
152 var queryEngine = model.getAdapter(ModelQuery.ADAPTER); 152 var queryEngine = model.getAdapter(ModelQueryAdapter.class);
153 var queryResultSet = queryEngine.getResultSet(query); 153 var queryResultSet = queryEngine.getResultSet(query);
154 154
155 personInterpretation.put(Tuple.of(0), true); 155 personInterpretation.put(Tuple.of(0), true);
@@ -180,15 +180,15 @@ class FunctionalQueryTest {
180 180
181 var store = ModelStore.builder() 181 var store = ModelStore.builder()
182 .symbols(person, friend) 182 .symbols(person, friend)
183 .with(ViatraModelQuery.ADAPTER) 183 .with(ViatraModelQueryAdapter.builder()
184 .defaultHint(hint) 184 .defaultHint(hint)
185 .queries(query) 185 .queries(query))
186 .build(); 186 .build();
187 187
188 var model = store.createEmptyModel(); 188 var model = store.createEmptyModel();
189 var personInterpretation = model.getInterpretation(person); 189 var personInterpretation = model.getInterpretation(person);
190 var friendInterpretation = model.getInterpretation(friend); 190 var friendInterpretation = model.getInterpretation(friend);
191 var queryEngine = model.getAdapter(ModelQuery.ADAPTER); 191 var queryEngine = model.getAdapter(ModelQueryAdapter.class);
192 var queryResultSet = queryEngine.getResultSet(query); 192 var queryResultSet = queryEngine.getResultSet(query);
193 193
194 personInterpretation.put(Tuple.of(0), true); 194 personInterpretation.put(Tuple.of(0), true);
@@ -231,15 +231,15 @@ class FunctionalQueryTest {
231 231
232 var store = ModelStore.builder() 232 var store = ModelStore.builder()
233 .symbols(person, friend) 233 .symbols(person, friend)
234 .with(ViatraModelQuery.ADAPTER) 234 .with(ViatraModelQueryAdapter.builder()
235 .defaultHint(hint) 235 .defaultHint(hint)
236 .queries(query) 236 .queries(query))
237 .build(); 237 .build();
238 238
239 var model = store.createEmptyModel(); 239 var model = store.createEmptyModel();
240 var personInterpretation = model.getInterpretation(person); 240 var personInterpretation = model.getInterpretation(person);
241 var friendInterpretation = model.getInterpretation(friend); 241 var friendInterpretation = model.getInterpretation(friend);
242 var queryEngine = model.getAdapter(ModelQuery.ADAPTER); 242 var queryEngine = model.getAdapter(ModelQueryAdapter.class);
243 var queryResultSet = queryEngine.getResultSet(query); 243 var queryResultSet = queryEngine.getResultSet(query);
244 244
245 personInterpretation.put(Tuple.of(0), true); 245 personInterpretation.put(Tuple.of(0), true);
@@ -269,14 +269,14 @@ class FunctionalQueryTest {
269 269
270 var store = ModelStore.builder() 270 var store = ModelStore.builder()
271 .symbols(age) 271 .symbols(age)
272 .with(ViatraModelQuery.ADAPTER) 272 .with(ViatraModelQueryAdapter.builder()
273 .defaultHint(hint) 273 .defaultHint(hint)
274 .queries(query) 274 .queries(query))
275 .build(); 275 .build();
276 276
277 var model = store.createEmptyModel(); 277 var model = store.createEmptyModel();
278 var ageInterpretation = model.getInterpretation(age); 278 var ageInterpretation = model.getInterpretation(age);
279 var queryEngine = model.getAdapter(ModelQuery.ADAPTER); 279 var queryEngine = model.getAdapter(ModelQueryAdapter.class);
280 var queryResultSet = queryEngine.getResultSet(query); 280 var queryResultSet = queryEngine.getResultSet(query);
281 281
282 ageInterpretation.put(Tuple.of(0), 12); 282 ageInterpretation.put(Tuple.of(0), 12);
@@ -306,15 +306,15 @@ class FunctionalQueryTest {
306 306
307 var store = ModelStore.builder() 307 var store = ModelStore.builder()
308 .symbols(person, age) 308 .symbols(person, age)
309 .with(ViatraModelQuery.ADAPTER) 309 .with(ViatraModelQueryAdapter.builder()
310 .defaultHint(hint) 310 .defaultHint(hint)
311 .queries(query) 311 .queries(query))
312 .build(); 312 .build();
313 313
314 var model = store.createEmptyModel(); 314 var model = store.createEmptyModel();
315 var personInterpretation = model.getInterpretation(person); 315 var personInterpretation = model.getInterpretation(person);
316 var ageInterpretation = model.getInterpretation(age); 316 var ageInterpretation = model.getInterpretation(age);
317 var queryEngine = model.getAdapter(ModelQuery.ADAPTER); 317 var queryEngine = model.getAdapter(ModelQueryAdapter.class);
318 var queryResultSet = queryEngine.getResultSet(query); 318 var queryResultSet = queryEngine.getResultSet(query);
319 319
320 personInterpretation.put(Tuple.of(0), true); 320 personInterpretation.put(Tuple.of(0), true);
@@ -349,15 +349,15 @@ class FunctionalQueryTest {
349 349
350 var store = ModelStore.builder() 350 var store = ModelStore.builder()
351 .symbols(person, friend) 351 .symbols(person, friend)
352 .with(ViatraModelQuery.ADAPTER) 352 .with(ViatraModelQueryAdapter.builder()
353 .defaultHint(hint) 353 .defaultHint(hint)
354 .queries(minQuery, maxQuery) 354 .queries(minQuery, maxQuery))
355 .build(); 355 .build();
356 356
357 var model = store.createEmptyModel(); 357 var model = store.createEmptyModel();
358 var personInterpretation = model.getInterpretation(person); 358 var personInterpretation = model.getInterpretation(person);
359 var friendInterpretation = model.getInterpretation(friend); 359 var friendInterpretation = model.getInterpretation(friend);
360 var queryEngine = model.getAdapter(ModelQuery.ADAPTER); 360 var queryEngine = model.getAdapter(ModelQueryAdapter.class);
361 var minResultSet = queryEngine.getResultSet(minQuery); 361 var minResultSet = queryEngine.getResultSet(minQuery);
362 var maxResultSet = queryEngine.getResultSet(maxQuery); 362 var maxResultSet = queryEngine.getResultSet(maxQuery);
363 363
@@ -408,15 +408,15 @@ class FunctionalQueryTest {
408 408
409 var store = ModelStore.builder() 409 var store = ModelStore.builder()
410 .symbols(person, age) 410 .symbols(person, age)
411 .with(ViatraModelQuery.ADAPTER) 411 .with(ViatraModelQueryAdapter.builder()
412 .defaultHint(hint) 412 .defaultHint(hint)
413 .queries(query) 413 .queries(query))
414 .build(); 414 .build();
415 415
416 var model = store.createEmptyModel(); 416 var model = store.createEmptyModel();
417 var personInterpretation = model.getInterpretation(person); 417 var personInterpretation = model.getInterpretation(person);
418 var ageInterpretation = model.getInterpretation(age); 418 var ageInterpretation = model.getInterpretation(age);
419 var queryEngine = model.getAdapter(ModelQuery.ADAPTER); 419 var queryEngine = model.getAdapter(ModelQueryAdapter.class);
420 var queryResultSet = queryEngine.getResultSet(query); 420 var queryResultSet = queryEngine.getResultSet(query);
421 421
422 personInterpretation.put(Tuple.of(0), true); 422 personInterpretation.put(Tuple.of(0), true);
@@ -448,15 +448,15 @@ class FunctionalQueryTest {
448 448
449 var store = ModelStore.builder() 449 var store = ModelStore.builder()
450 .symbols(person, age) 450 .symbols(person, age)
451 .with(ViatraModelQuery.ADAPTER) 451 .with(ViatraModelQueryAdapter.builder()
452 .defaultHint(hint) 452 .defaultHint(hint)
453 .queries(query) 453 .queries(query))
454 .build(); 454 .build();
455 455
456 var model = store.createEmptyModel(); 456 var model = store.createEmptyModel();
457 var personInterpretation = model.getInterpretation(person); 457 var personInterpretation = model.getInterpretation(person);
458 var ageInterpretation = model.getInterpretation(age); 458 var ageInterpretation = model.getInterpretation(age);
459 var queryEngine = model.getAdapter(ModelQuery.ADAPTER); 459 var queryEngine = model.getAdapter(ModelQueryAdapter.class);
460 var queryResultSet = queryEngine.getResultSet(query); 460 var queryResultSet = queryEngine.getResultSet(query);
461 461
462 personInterpretation.put(Tuple.of(0), true); 462 personInterpretation.put(Tuple.of(0), true);
@@ -493,16 +493,16 @@ class FunctionalQueryTest {
493 493
494 var store = ModelStore.builder() 494 var store = ModelStore.builder()
495 .symbols(person, age, friend) 495 .symbols(person, age, friend)
496 .with(ViatraModelQuery.ADAPTER) 496 .with(ViatraModelQueryAdapter.builder()
497 .defaultHint(hint) 497 .defaultHint(hint)
498 .query(query) 498 .queries(query))
499 .build(); 499 .build();
500 500
501 var model = store.createEmptyModel(); 501 var model = store.createEmptyModel();
502 var personInterpretation = model.getInterpretation(person); 502 var personInterpretation = model.getInterpretation(person);
503 var ageInterpretation = model.getInterpretation(age); 503 var ageInterpretation = model.getInterpretation(age);
504 var friendInterpretation = model.getInterpretation(friend); 504 var friendInterpretation = model.getInterpretation(friend);
505 var queryEngine = model.getAdapter(ModelQuery.ADAPTER); 505 var queryEngine = model.getAdapter(ModelQueryAdapter.class);
506 var queryResultSet = queryEngine.getResultSet(query); 506 var queryResultSet = queryEngine.getResultSet(query);
507 507
508 personInterpretation.put(Tuple.of(0), true); 508 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;
8import org.eclipse.viatra.query.runtime.matchers.backend.QueryEvaluationHint; 8import org.eclipse.viatra.query.runtime.matchers.backend.QueryEvaluationHint;
9import org.junit.jupiter.api.Test; 9import org.junit.jupiter.api.Test;
10import tools.refinery.store.model.ModelStore; 10import tools.refinery.store.model.ModelStore;
11import tools.refinery.store.query.ModelQuery; 11import tools.refinery.store.query.ModelQueryAdapter;
12import tools.refinery.store.query.dnf.Dnf; 12import tools.refinery.store.query.dnf.Dnf;
13import tools.refinery.store.query.dnf.Query; 13import tools.refinery.store.query.dnf.Query;
14import tools.refinery.store.query.term.Variable; 14import tools.refinery.store.query.term.Variable;
@@ -41,15 +41,15 @@ class QueryTest {
41 41
42 var store = ModelStore.builder() 42 var store = ModelStore.builder()
43 .symbols(person, asset) 43 .symbols(person, asset)
44 .with(ViatraModelQuery.ADAPTER) 44 .with(ViatraModelQueryAdapter.builder()
45 .defaultHint(hint) 45 .defaultHint(hint)
46 .query(predicate) 46 .queries(predicate))
47 .build(); 47 .build();
48 48
49 var model = store.createEmptyModel(); 49 var model = store.createEmptyModel();
50 var personInterpretation = model.getInterpretation(person); 50 var personInterpretation = model.getInterpretation(person);
51 var assetInterpretation = model.getInterpretation(asset); 51 var assetInterpretation = model.getInterpretation(asset);
52 var queryEngine = model.getAdapter(ModelQuery.ADAPTER); 52 var queryEngine = model.getAdapter(ModelQueryAdapter.class);
53 var predicateResultSet = queryEngine.getResultSet(predicate); 53 var predicateResultSet = queryEngine.getResultSet(predicate);
54 54
55 personInterpretation.put(Tuple.of(0), true); 55 personInterpretation.put(Tuple.of(0), true);
@@ -81,15 +81,15 @@ class QueryTest {
81 81
82 var store = ModelStore.builder() 82 var store = ModelStore.builder()
83 .symbols(person, friend) 83 .symbols(person, friend)
84 .with(ViatraModelQuery.ADAPTER) 84 .with(ViatraModelQueryAdapter.builder()
85 .defaultHint(hint) 85 .defaultHint(hint)
86 .queries(predicate) 86 .queries(predicate))
87 .build(); 87 .build();
88 88
89 var model = store.createEmptyModel(); 89 var model = store.createEmptyModel();
90 var personInterpretation = model.getInterpretation(person); 90 var personInterpretation = model.getInterpretation(person);
91 var friendInterpretation = model.getInterpretation(friend); 91 var friendInterpretation = model.getInterpretation(friend);
92 var queryEngine = model.getAdapter(ModelQuery.ADAPTER); 92 var queryEngine = model.getAdapter(ModelQueryAdapter.class);
93 var predicateResultSet = queryEngine.getResultSet(predicate); 93 var predicateResultSet = queryEngine.getResultSet(predicate);
94 94
95 personInterpretation.put(Tuple.of(0), true); 95 personInterpretation.put(Tuple.of(0), true);
@@ -125,15 +125,15 @@ class QueryTest {
125 125
126 var store = ModelStore.builder() 126 var store = ModelStore.builder()
127 .symbols(person, friend) 127 .symbols(person, friend)
128 .with(ViatraModelQuery.ADAPTER) 128 .with(ViatraModelQueryAdapter.builder()
129 .defaultHint(hint) 129 .defaultHint(hint)
130 .queries(predicate) 130 .queries(predicate))
131 .build(); 131 .build();
132 132
133 var model = store.createEmptyModel(); 133 var model = store.createEmptyModel();
134 var personInterpretation = model.getInterpretation(person); 134 var personInterpretation = model.getInterpretation(person);
135 var friendInterpretation = model.getInterpretation(friend); 135 var friendInterpretation = model.getInterpretation(friend);
136 var queryEngine = model.getAdapter(ModelQuery.ADAPTER); 136 var queryEngine = model.getAdapter(ModelQueryAdapter.class);
137 var predicateResultSet = queryEngine.getResultSet(predicate); 137 var predicateResultSet = queryEngine.getResultSet(predicate);
138 138
139 personInterpretation.put(Tuple.of(0), true); 139 personInterpretation.put(Tuple.of(0), true);
@@ -175,16 +175,16 @@ class QueryTest {
175 175
176 var store = ModelStore.builder() 176 var store = ModelStore.builder()
177 .symbols(person, animal, friend) 177 .symbols(person, animal, friend)
178 .with(ViatraModelQuery.ADAPTER) 178 .with(ViatraModelQueryAdapter.builder()
179 .defaultHint(hint) 179 .defaultHint(hint)
180 .queries(predicate) 180 .queries(predicate))
181 .build(); 181 .build();
182 182
183 var model = store.createEmptyModel(); 183 var model = store.createEmptyModel();
184 var personInterpretation = model.getInterpretation(person); 184 var personInterpretation = model.getInterpretation(person);
185 var animalInterpretation = model.getInterpretation(animal); 185 var animalInterpretation = model.getInterpretation(animal);
186 var friendInterpretation = model.getInterpretation(friend); 186 var friendInterpretation = model.getInterpretation(friend);
187 var queryEngine = model.getAdapter(ModelQuery.ADAPTER); 187 var queryEngine = model.getAdapter(ModelQueryAdapter.class);
188 var predicateResultSet = queryEngine.getResultSet(predicate); 188 var predicateResultSet = queryEngine.getResultSet(predicate);
189 189
190 personInterpretation.put(Tuple.of(0), true); 190 personInterpretation.put(Tuple.of(0), true);
@@ -221,14 +221,14 @@ class QueryTest {
221 221
222 var store = ModelStore.builder() 222 var store = ModelStore.builder()
223 .symbols(person) 223 .symbols(person)
224 .with(ViatraModelQuery.ADAPTER) 224 .with(ViatraModelQueryAdapter.builder()
225 .defaultHint(hint) 225 .defaultHint(hint)
226 .queries(predicate) 226 .queries(predicate))
227 .build(); 227 .build();
228 228
229 var model = store.createEmptyModel(); 229 var model = store.createEmptyModel();
230 var personInterpretation = model.getInterpretation(person); 230 var personInterpretation = model.getInterpretation(person);
231 var queryEngine = model.getAdapter(ModelQuery.ADAPTER); 231 var queryEngine = model.getAdapter(ModelQueryAdapter.class);
232 var predicateResultSet = queryEngine.getResultSet(predicate); 232 var predicateResultSet = queryEngine.getResultSet(predicate);
233 233
234 personInterpretation.put(Tuple.of(0), true); 234 personInterpretation.put(Tuple.of(0), true);
@@ -262,15 +262,15 @@ class QueryTest {
262 262
263 var store = ModelStore.builder() 263 var store = ModelStore.builder()
264 .symbols(person, friend) 264 .symbols(person, friend)
265 .with(ViatraModelQuery.ADAPTER) 265 .with(ViatraModelQueryAdapter.builder()
266 .defaultHint(hint) 266 .defaultHint(hint)
267 .queries(predicate) 267 .queries(predicate))
268 .build(); 268 .build();
269 269
270 var model = store.createEmptyModel(); 270 var model = store.createEmptyModel();
271 var personInterpretation = model.getInterpretation(person); 271 var personInterpretation = model.getInterpretation(person);
272 var friendInterpretation = model.getInterpretation(friend); 272 var friendInterpretation = model.getInterpretation(friend);
273 var queryEngine = model.getAdapter(ModelQuery.ADAPTER); 273 var queryEngine = model.getAdapter(ModelQueryAdapter.class);
274 var predicateResultSet = queryEngine.getResultSet(predicate); 274 var predicateResultSet = queryEngine.getResultSet(predicate);
275 275
276 personInterpretation.put(Tuple.of(0), true); 276 personInterpretation.put(Tuple.of(0), true);
@@ -312,15 +312,15 @@ class QueryTest {
312 312
313 var store = ModelStore.builder() 313 var store = ModelStore.builder()
314 .symbols(person, friend) 314 .symbols(person, friend)
315 .with(ViatraModelQuery.ADAPTER) 315 .with(ViatraModelQueryAdapter.builder()
316 .defaultHint(hint) 316 .defaultHint(hint)
317 .queries(predicate) 317 .queries(predicate))
318 .build(); 318 .build();
319 319
320 var model = store.createEmptyModel(); 320 var model = store.createEmptyModel();
321 var personInterpretation = model.getInterpretation(person); 321 var personInterpretation = model.getInterpretation(person);
322 var friendInterpretation = model.getInterpretation(friend); 322 var friendInterpretation = model.getInterpretation(friend);
323 var queryEngine = model.getAdapter(ModelQuery.ADAPTER); 323 var queryEngine = model.getAdapter(ModelQueryAdapter.class);
324 var predicateResultSet = queryEngine.getResultSet(predicate); 324 var predicateResultSet = queryEngine.getResultSet(predicate);
325 325
326 personInterpretation.put(Tuple.of(0), true); 326 personInterpretation.put(Tuple.of(0), true);
@@ -355,15 +355,15 @@ class QueryTest {
355 355
356 var store = ModelStore.builder() 356 var store = ModelStore.builder()
357 .symbols(person, friend) 357 .symbols(person, friend)
358 .with(ViatraModelQuery.ADAPTER) 358 .with(ViatraModelQueryAdapter.builder()
359 .defaultHint(hint) 359 .defaultHint(hint)
360 .queries(predicate) 360 .queries(predicate))
361 .build(); 361 .build();
362 362
363 var model = store.createEmptyModel(); 363 var model = store.createEmptyModel();
364 var personInterpretation = model.getInterpretation(person); 364 var personInterpretation = model.getInterpretation(person);
365 var friendInterpretation = model.getInterpretation(friend); 365 var friendInterpretation = model.getInterpretation(friend);
366 var queryEngine = model.getAdapter(ModelQuery.ADAPTER); 366 var queryEngine = model.getAdapter(ModelQueryAdapter.class);
367 var predicateResultSet = queryEngine.getResultSet(predicate); 367 var predicateResultSet = queryEngine.getResultSet(predicate);
368 368
369 personInterpretation.put(Tuple.of(0), true); 369 personInterpretation.put(Tuple.of(0), true);
@@ -413,15 +413,15 @@ class QueryTest {
413 413
414 var store = ModelStore.builder() 414 var store = ModelStore.builder()
415 .symbols(person, friend) 415 .symbols(person, friend)
416 .with(ViatraModelQuery.ADAPTER) 416 .with(ViatraModelQueryAdapter.builder()
417 .defaultHint(hint) 417 .defaultHint(hint)
418 .queries(predicate) 418 .queries(predicate))
419 .build(); 419 .build();
420 420
421 var model = store.createEmptyModel(); 421 var model = store.createEmptyModel();
422 var personInterpretation = model.getInterpretation(person); 422 var personInterpretation = model.getInterpretation(person);
423 var friendInterpretation = model.getInterpretation(friend); 423 var friendInterpretation = model.getInterpretation(friend);
424 var queryEngine = model.getAdapter(ModelQuery.ADAPTER); 424 var queryEngine = model.getAdapter(ModelQueryAdapter.class);
425 var predicateResultSet = queryEngine.getResultSet(predicate); 425 var predicateResultSet = queryEngine.getResultSet(predicate);
426 426
427 personInterpretation.put(Tuple.of(0), true); 427 personInterpretation.put(Tuple.of(0), true);
@@ -461,15 +461,15 @@ class QueryTest {
461 461
462 var store = ModelStore.builder() 462 var store = ModelStore.builder()
463 .symbols(person, friend) 463 .symbols(person, friend)
464 .with(ViatraModelQuery.ADAPTER) 464 .with(ViatraModelQueryAdapter.builder()
465 .defaultHint(hint) 465 .defaultHint(hint)
466 .queries(predicate) 466 .queries(predicate))
467 .build(); 467 .build();
468 468
469 var model = store.createEmptyModel(); 469 var model = store.createEmptyModel();
470 var personInterpretation = model.getInterpretation(person); 470 var personInterpretation = model.getInterpretation(person);
471 var friendInterpretation = model.getInterpretation(friend); 471 var friendInterpretation = model.getInterpretation(friend);
472 var queryEngine = model.getAdapter(ModelQuery.ADAPTER); 472 var queryEngine = model.getAdapter(ModelQueryAdapter.class);
473 var predicateResultSet = queryEngine.getResultSet(predicate); 473 var predicateResultSet = queryEngine.getResultSet(predicate);
474 474
475 personInterpretation.put(Tuple.of(0), true); 475 personInterpretation.put(Tuple.of(0), true);
@@ -511,15 +511,15 @@ class QueryTest {
511 511
512 var store = ModelStore.builder() 512 var store = ModelStore.builder()
513 .symbols(person, friend) 513 .symbols(person, friend)
514 .with(ViatraModelQuery.ADAPTER) 514 .with(ViatraModelQueryAdapter.builder()
515 .defaultHint(hint) 515 .defaultHint(hint)
516 .queries(predicate) 516 .queries(predicate))
517 .build(); 517 .build();
518 518
519 var model = store.createEmptyModel(); 519 var model = store.createEmptyModel();
520 var personInterpretation = model.getInterpretation(person); 520 var personInterpretation = model.getInterpretation(person);
521 var friendInterpretation = model.getInterpretation(friend); 521 var friendInterpretation = model.getInterpretation(friend);
522 var queryEngine = model.getAdapter(ModelQuery.ADAPTER); 522 var queryEngine = model.getAdapter(ModelQueryAdapter.class);
523 var predicateResultSet = queryEngine.getResultSet(predicate); 523 var predicateResultSet = queryEngine.getResultSet(predicate);
524 524
525 personInterpretation.put(Tuple.of(0), true); 525 personInterpretation.put(Tuple.of(0), true);
@@ -553,15 +553,15 @@ class QueryTest {
553 553
554 var store = ModelStore.builder() 554 var store = ModelStore.builder()
555 .symbols(person, friend) 555 .symbols(person, friend)
556 .with(ViatraModelQuery.ADAPTER) 556 .with(ViatraModelQueryAdapter.builder()
557 .defaultHint(hint) 557 .defaultHint(hint)
558 .queries(predicate) 558 .queries(predicate))
559 .build(); 559 .build();
560 560
561 var model = store.createEmptyModel(); 561 var model = store.createEmptyModel();
562 var personInterpretation = model.getInterpretation(person); 562 var personInterpretation = model.getInterpretation(person);
563 var friendInterpretation = model.getInterpretation(friend); 563 var friendInterpretation = model.getInterpretation(friend);
564 var queryEngine = model.getAdapter(ModelQuery.ADAPTER); 564 var queryEngine = model.getAdapter(ModelQueryAdapter.class);
565 var predicateResultSet = queryEngine.getResultSet(predicate); 565 var predicateResultSet = queryEngine.getResultSet(predicate);
566 566
567 personInterpretation.put(Tuple.of(0), true); 567 personInterpretation.put(Tuple.of(0), true);
@@ -610,15 +610,15 @@ class QueryTest {
610 610
611 var store = ModelStore.builder() 611 var store = ModelStore.builder()
612 .symbols(person, friend) 612 .symbols(person, friend)
613 .with(ViatraModelQuery.ADAPTER) 613 .with(ViatraModelQueryAdapter.builder()
614 .defaultHint(hint) 614 .defaultHint(hint)
615 .queries(predicate) 615 .queries(predicate))
616 .build(); 616 .build();
617 617
618 var model = store.createEmptyModel(); 618 var model = store.createEmptyModel();
619 var personInterpretation = model.getInterpretation(person); 619 var personInterpretation = model.getInterpretation(person);
620 var friendInterpretation = model.getInterpretation(friend); 620 var friendInterpretation = model.getInterpretation(friend);
621 var queryEngine = model.getAdapter(ModelQuery.ADAPTER); 621 var queryEngine = model.getAdapter(ModelQueryAdapter.class);
622 var predicateResultSet = queryEngine.getResultSet(predicate); 622 var predicateResultSet = queryEngine.getResultSet(predicate);
623 623
624 personInterpretation.put(Tuple.of(0), true); 624 personInterpretation.put(Tuple.of(0), true);
@@ -658,15 +658,15 @@ class QueryTest {
658 658
659 var store = ModelStore.builder() 659 var store = ModelStore.builder()
660 .symbols(person, age) 660 .symbols(person, age)
661 .with(ViatraModelQuery.ADAPTER) 661 .with(ViatraModelQueryAdapter.builder()
662 .defaultHint(hint) 662 .defaultHint(hint)
663 .queries(query) 663 .queries(query))
664 .build(); 664 .build();
665 665
666 var model = store.createEmptyModel(); 666 var model = store.createEmptyModel();
667 var personInterpretation = model.getInterpretation(person); 667 var personInterpretation = model.getInterpretation(person);
668 var ageInterpretation = model.getInterpretation(age); 668 var ageInterpretation = model.getInterpretation(age);
669 var queryEngine = model.getAdapter(ModelQuery.ADAPTER); 669 var queryEngine = model.getAdapter(ModelQueryAdapter.class);
670 var queryResultSet = queryEngine.getResultSet(query); 670 var queryResultSet = queryEngine.getResultSet(query);
671 671
672 personInterpretation.put(Tuple.of(0), true); 672 personInterpretation.put(Tuple.of(0), true);
@@ -691,13 +691,13 @@ class QueryTest {
691 691
692 var store = ModelStore.builder() 692 var store = ModelStore.builder()
693 .symbols(person) 693 .symbols(person)
694 .with(ViatraModelQuery.ADAPTER) 694 .with(ViatraModelQueryAdapter.builder()
695 .queries(predicate) 695 .queries(predicate))
696 .build(); 696 .build();
697 697
698 var model = store.createEmptyModel(); 698 var model = store.createEmptyModel();
699 var personInterpretation = model.getInterpretation(person); 699 var personInterpretation = model.getInterpretation(person);
700 var queryEngine = model.getAdapter(ModelQuery.ADAPTER); 700 var queryEngine = model.getAdapter(ModelQueryAdapter.class);
701 var predicateResultSet = queryEngine.getResultSet(predicate); 701 var predicateResultSet = queryEngine.getResultSet(predicate);
702 702
703 personInterpretation.put(Tuple.of(0), true); 703 personInterpretation.put(Tuple.of(0), true);
@@ -713,8 +713,7 @@ class QueryTest {
713 var p1 = Variable.of("p1"); 713 var p1 = Variable.of("p1");
714 var predicate = Query.builder("AlwaysTrue").parameters(p1).clause().build(); 714 var predicate = Query.builder("AlwaysTrue").parameters(p1).clause().build();
715 715
716 var storeBuilder = ModelStore.builder().symbols(person); 716 var queryBuilder = ViatraModelQueryAdapter.builder();
717 var queryBuilder = storeBuilder.with(ViatraModelQuery.ADAPTER);
718 717
719 assertThrows(IllegalArgumentException.class, () -> queryBuilder.queries(predicate)); 718 assertThrows(IllegalArgumentException.class, () -> queryBuilder.queries(predicate));
720 } 719 }
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;
9import org.junit.jupiter.api.Disabled; 9import org.junit.jupiter.api.Disabled;
10import org.junit.jupiter.api.Test; 10import org.junit.jupiter.api.Test;
11import tools.refinery.store.model.ModelStore; 11import tools.refinery.store.model.ModelStore;
12import tools.refinery.store.query.ModelQuery; 12import tools.refinery.store.query.ModelQueryAdapter;
13import tools.refinery.store.query.dnf.Query; 13import tools.refinery.store.query.dnf.Query;
14import tools.refinery.store.query.view.FilteredView; 14import tools.refinery.store.query.view.FilteredView;
15import tools.refinery.store.query.view.FunctionView; 15import tools.refinery.store.query.view.FunctionView;
@@ -35,13 +35,13 @@ class QueryTransactionTest {
35 35
36 var store = ModelStore.builder() 36 var store = ModelStore.builder()
37 .symbols(person) 37 .symbols(person)
38 .with(ViatraModelQuery.ADAPTER) 38 .with(ViatraModelQueryAdapter.builder()
39 .queries(predicate) 39 .queries(predicate))
40 .build(); 40 .build();
41 41
42 var model = store.createEmptyModel(); 42 var model = store.createEmptyModel();
43 var personInterpretation = model.getInterpretation(person); 43 var personInterpretation = model.getInterpretation(person);
44 var queryEngine = model.getAdapter(ModelQuery.ADAPTER); 44 var queryEngine = model.getAdapter(ModelQueryAdapter.class);
45 var predicateResultSet = queryEngine.getResultSet(predicate); 45 var predicateResultSet = queryEngine.getResultSet(predicate);
46 46
47 assertResults(Map.of( 47 assertResults(Map.of(
@@ -102,14 +102,14 @@ class QueryTransactionTest {
102 102
103 var store = ModelStore.builder() 103 var store = ModelStore.builder()
104 .symbols(person) 104 .symbols(person)
105 .with(ViatraModelQuery.ADAPTER) 105 .with(ViatraModelQueryAdapter.builder()
106 .defaultHint(new QueryEvaluationHint(null, QueryEvaluationHint.BackendRequirement.DEFAULT_SEARCH)) 106 .defaultHint(new QueryEvaluationHint(null, QueryEvaluationHint.BackendRequirement.DEFAULT_SEARCH))
107 .queries(predicate) 107 .queries(predicate))
108 .build(); 108 .build();
109 109
110 var model = store.createEmptyModel(); 110 var model = store.createEmptyModel();
111 var personInterpretation = model.getInterpretation(person); 111 var personInterpretation = model.getInterpretation(person);
112 var queryEngine = model.getAdapter(ModelQuery.ADAPTER); 112 var queryEngine = model.getAdapter(ModelQueryAdapter.class);
113 var predicateResultSet = queryEngine.getResultSet(predicate); 113 var predicateResultSet = queryEngine.getResultSet(predicate);
114 114
115 assertResults(Map.of( 115 assertResults(Map.of(
@@ -153,14 +153,14 @@ class QueryTransactionTest {
153 153
154 var store = ModelStore.builder() 154 var store = ModelStore.builder()
155 .symbols(person, asset) 155 .symbols(person, asset)
156 .with(ViatraModelQuery.ADAPTER) 156 .with(ViatraModelQueryAdapter.builder()
157 .queries(predicate) 157 .queries(predicate))
158 .build(); 158 .build();
159 159
160 var model = store.createEmptyModel(); 160 var model = store.createEmptyModel();
161 var personInterpretation = model.getInterpretation(person); 161 var personInterpretation = model.getInterpretation(person);
162 var assetInterpretation = model.getInterpretation(asset); 162 var assetInterpretation = model.getInterpretation(asset);
163 var queryEngine = model.getAdapter(ModelQuery.ADAPTER); 163 var queryEngine = model.getAdapter(ModelQueryAdapter.class);
164 var predicateResultSet = queryEngine.getResultSet(predicate); 164 var predicateResultSet = queryEngine.getResultSet(predicate);
165 165
166 assertFalse(queryEngine.hasPendingChanges()); 166 assertFalse(queryEngine.hasPendingChanges());
@@ -226,14 +226,14 @@ class QueryTransactionTest {
226 226
227 var store = ModelStore.builder() 227 var store = ModelStore.builder()
228 .symbols(person, age) 228 .symbols(person, age)
229 .with(ViatraModelQuery.ADAPTER) 229 .with(ViatraModelQueryAdapter.builder()
230 .query(query) 230 .queries(query))
231 .build(); 231 .build();
232 232
233 var model = store.createEmptyModel(); 233 var model = store.createEmptyModel();
234 var personInterpretation = model.getInterpretation(person); 234 var personInterpretation = model.getInterpretation(person);
235 var ageInterpretation = model.getInterpretation(age); 235 var ageInterpretation = model.getInterpretation(age);
236 var queryEngine = model.getAdapter(ModelQuery.ADAPTER); 236 var queryEngine = model.getAdapter(ModelQueryAdapter.class);
237 var queryResultSet = queryEngine.getResultSet(query); 237 var queryResultSet = queryEngine.getResultSet(query);
238 238
239 personInterpretation.put(Tuple.of(0), true); 239 personInterpretation.put(Tuple.of(0), true);
@@ -268,14 +268,14 @@ class QueryTransactionTest {
268 268
269 var store = ModelStore.builder() 269 var store = ModelStore.builder()
270 .symbols(person, age) 270 .symbols(person, age)
271 .with(ViatraModelQuery.ADAPTER) 271 .with(ViatraModelQueryAdapter.builder()
272 .query(query) 272 .queries(query))
273 .build(); 273 .build();
274 274
275 var model = store.createEmptyModel(); 275 var model = store.createEmptyModel();
276 var personInterpretation = model.getInterpretation(person); 276 var personInterpretation = model.getInterpretation(person);
277 var ageInterpretation = model.getInterpretation(age); 277 var ageInterpretation = model.getInterpretation(age);
278 var queryEngine = model.getAdapter(ModelQuery.ADAPTER); 278 var queryEngine = model.getAdapter(ModelQueryAdapter.class);
279 var queryResultSet = queryEngine.getResultSet(query); 279 var queryResultSet = queryEngine.getResultSet(query);
280 280
281 personInterpretation.put(Tuple.of(0), true); 281 personInterpretation.put(Tuple.of(0), true);
@@ -306,13 +306,13 @@ class QueryTransactionTest {
306 306
307 var store = ModelStore.builder() 307 var store = ModelStore.builder()
308 .symbols(person) 308 .symbols(person)
309 .with(ViatraModelQuery.ADAPTER) 309 .with(ViatraModelQueryAdapter.builder()
310 .queries(predicate) 310 .queries(predicate))
311 .build(); 311 .build();
312 312
313 var model = store.createEmptyModel(); 313 var model = store.createEmptyModel();
314 var personInterpretation = model.getInterpretation(person); 314 var personInterpretation = model.getInterpretation(person);
315 var queryEngine = model.getAdapter(ModelQuery.ADAPTER); 315 var queryEngine = model.getAdapter(ModelQueryAdapter.class);
316 var predicateResultSet = queryEngine.getResultSet(predicate); 316 var predicateResultSet = queryEngine.getResultSet(predicate);
317 317
318 personInterpretation.put(Tuple.of(0), true); 318 personInterpretation.put(Tuple.of(0), true);
@@ -360,13 +360,13 @@ class QueryTransactionTest {
360 360
361 var store = ModelStore.builder() 361 var store = ModelStore.builder()
362 .symbols(person) 362 .symbols(person)
363 .with(ViatraModelQuery.ADAPTER) 363 .with(ViatraModelQueryAdapter.builder()
364 .queries(predicate) 364 .queries(predicate))
365 .build(); 365 .build();
366 366
367 var model = store.createEmptyModel(); 367 var model = store.createEmptyModel();
368 var personInterpretation = model.getInterpretation(person); 368 var personInterpretation = model.getInterpretation(person);
369 var queryEngine = model.getAdapter(ModelQuery.ADAPTER); 369 var queryEngine = model.getAdapter(ModelQueryAdapter.class);
370 var predicateResultSet = queryEngine.getResultSet(predicate); 370 var predicateResultSet = queryEngine.getResultSet(predicate);
371 371
372 personInterpretation.put(Tuple.of(0), true); 372 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 @@
1/*
2 * SPDX-FileCopyrightText: 2021-2023 The Refinery Authors <https://refinery.tools/>
3 *
4 * SPDX-License-Identifier: EPL-2.0
5 */
6package tools.refinery.store.query;
7
8import tools.refinery.store.adapter.ModelAdapterType;
9
10public final class ModelQuery extends ModelAdapterType<ModelQueryAdapter, ModelQueryStoreAdapter, ModelQueryBuilder> {
11 public static final ModelQuery ADAPTER = new ModelQuery();
12
13 private ModelQuery() {
14 super(ModelQueryAdapter.class, ModelQueryStoreAdapter.class, ModelQueryBuilder.class);
15 }
16}
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 {
26 ModelQueryBuilder query(AnyQuery query); 26 ModelQueryBuilder query(AnyQuery query);
27 27
28 @Override 28 @Override
29 ModelQueryStoreAdapter createStoreAdapter(ModelStore store); 29 ModelQueryStoreAdapter build(ModelStore store);
30} 30}
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 @@
1/*
2 * SPDX-FileCopyrightText: 2021-2023 The Refinery Authors <https://refinery.tools/>
3 *
4 * SPDX-License-Identifier: EPL-2.0
5 */
6package tools.refinery.store.reasoning;
7
8import tools.refinery.store.reasoning.internal.ReasoningBuilderImpl;
9import tools.refinery.store.adapter.ModelAdapterBuilderFactory;
10import tools.refinery.store.model.ModelStoreBuilder;
11import tools.refinery.store.reasoning.representation.PartialRelation;
12
13public final class Reasoning extends ModelAdapterBuilderFactory<ReasoningAdapter,
14 ReasoningStoreAdapter, ReasoningBuilder> {
15 public static final Reasoning ADAPTER = new Reasoning();
16
17 public static final PartialRelation EXISTS = new PartialRelation("exists", 1);
18
19 public static final PartialRelation EQUALS = new PartialRelation("equals", 1);
20
21 private Reasoning() {
22 super(ReasoningAdapter.class, ReasoningStoreAdapter.class, ReasoningBuilder.class);
23 }
24
25 @Override
26 public ReasoningBuilder createBuilder(ModelStoreBuilder storeBuilder) {
27 return new ReasoningBuilderImpl(storeBuilder);
28 }
29}
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 @@
6package tools.refinery.store.reasoning; 6package tools.refinery.store.reasoning;
7 7
8import tools.refinery.store.adapter.ModelAdapter; 8import tools.refinery.store.adapter.ModelAdapter;
9import tools.refinery.store.query.ResultSet;
10import tools.refinery.store.query.dnf.Dnf;
9import tools.refinery.store.reasoning.representation.AnyPartialSymbol; 11import tools.refinery.store.reasoning.representation.AnyPartialSymbol;
12import tools.refinery.store.reasoning.representation.PartialRelation;
10import tools.refinery.store.reasoning.representation.PartialSymbol; 13import tools.refinery.store.reasoning.representation.PartialSymbol;
11import tools.refinery.store.query.dnf.Dnf;
12import tools.refinery.store.query.ResultSet;
13 14
14public interface ReasoningAdapter extends ModelAdapter { 15public interface ReasoningAdapter extends ModelAdapter {
16 PartialRelation EXISTS = new PartialRelation("exists", 1);
17
15 @Override 18 @Override
16 ReasoningStoreAdapter getStoreAdapter(); 19 ReasoningStoreAdapter getStoreAdapter();
17 20
@@ -23,5 +26,5 @@ public interface ReasoningAdapter extends ModelAdapter {
23 26
24 <A, C> PartialInterpretation<A, C> getPartialInterpretation(PartialSymbol<A, C> partialSymbol); 27 <A, C> PartialInterpretation<A, C> getPartialInterpretation(PartialSymbol<A, C> partialSymbol);
25 28
26 ResultSet getLiftedResultSet(Dnf query); 29 ResultSet<Boolean> getLiftedResultSet(Dnf query);
27} 30}
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 {
29 Dnf lift(Modality modality, Dnf query); 29 Dnf lift(Modality modality, Dnf query);
30 30
31 @Override 31 @Override
32 ReasoningStoreAdapter createStoreAdapter(ModelStore store); 32 ReasoningStoreAdapter build(ModelStore store);
33} 33}
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 {
37 } 37 }
38 38
39 @Override 39 @Override
40 public ResultSet getLiftedResultSet(Dnf query) { 40 public ResultSet<Boolean> getLiftedResultSet(Dnf query) {
41 return null; 41 return null;
42 } 42 }
43} 43}
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;
7 7
8import tools.refinery.store.adapter.AbstractModelAdapterBuilder; 8import tools.refinery.store.adapter.AbstractModelAdapterBuilder;
9import tools.refinery.store.model.ModelStore; 9import tools.refinery.store.model.ModelStore;
10import tools.refinery.store.model.ModelStoreBuilder; 10import tools.refinery.store.query.dnf.Dnf;
11import tools.refinery.store.reasoning.ReasoningBuilder; 11import tools.refinery.store.reasoning.ReasoningBuilder;
12import tools.refinery.store.reasoning.literal.Modality; 12import tools.refinery.store.reasoning.literal.Modality;
13import tools.refinery.store.query.dnf.Dnf;
14
15public class ReasoningBuilderImpl extends AbstractModelAdapterBuilder implements ReasoningBuilder {
16 public ReasoningBuilderImpl(ModelStoreBuilder storeBuilder) {
17 super(storeBuilder);
18 }
19 13
14public class ReasoningBuilderImpl extends AbstractModelAdapterBuilder<ReasoningStoreAdapterImpl>
15 implements ReasoningBuilder {
20 @Override 16 @Override
21 public ReasoningBuilder liftedQuery(Dnf liftedQuery) { 17 public ReasoningBuilder liftedQuery(Dnf liftedQuery) {
22 return null; 18 return null;
@@ -24,11 +20,12 @@ public class ReasoningBuilderImpl extends AbstractModelAdapterBuilder implements
24 20
25 @Override 21 @Override
26 public Dnf lift(Modality modality, Dnf query) { 22 public Dnf lift(Modality modality, Dnf query) {
23 checkNotConfigured();
27 return null; 24 return null;
28 } 25 }
29 26
30 @Override 27 @Override
31 public ReasoningStoreAdapterImpl createStoreAdapter(ModelStore store) { 28 public ReasoningStoreAdapterImpl doBuild(ModelStore store) {
32 return null; 29 return null;
33 } 30 }
34} 31}
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;
14import tools.refinery.store.query.literal.Literal; 14import tools.refinery.store.query.literal.Literal;
15import tools.refinery.store.query.term.DataVariable; 15import tools.refinery.store.query.term.DataVariable;
16import tools.refinery.store.query.term.Variable; 16import tools.refinery.store.query.term.Variable;
17import tools.refinery.store.reasoning.Reasoning; 17import tools.refinery.store.reasoning.ReasoningAdapter;
18import tools.refinery.store.reasoning.literal.ModalConstraint; 18import tools.refinery.store.reasoning.literal.ModalConstraint;
19import tools.refinery.store.reasoning.literal.Modality; 19import tools.refinery.store.reasoning.literal.Modality;
20import tools.refinery.store.reasoning.literal.PartialLiterals; 20import tools.refinery.store.reasoning.literal.PartialLiterals;
@@ -74,8 +74,8 @@ public class DnfLifter {
74 } 74 }
75 for (var quantifiedVariable : quantifiedVariables) { 75 for (var quantifiedVariable : quantifiedVariables) {
76 // Quantify over data variables that are not already quantified with the expected modality. 76 // Quantify over data variables that are not already quantified with the expected modality.
77 liftedLiterals.add(new CallLiteral(CallPolarity.POSITIVE, new ModalConstraint(modality, Reasoning.EXISTS), 77 liftedLiterals.add(new CallLiteral(CallPolarity.POSITIVE,
78 List.of(quantifiedVariable))); 78 new ModalConstraint(modality, ReasoningAdapter.EXISTS), List.of(quantifiedVariable)));
79 } 79 }
80 builder.clause(liftedLiterals); 80 builder.clause(liftedLiterals);
81 return changed || !quantifiedVariables.isEmpty(); 81 return changed || !quantifiedVariables.isEmpty();
@@ -87,7 +87,7 @@ public class DnfLifter {
87 callLiteral.getPolarity() == CallPolarity.POSITIVE && 87 callLiteral.getPolarity() == CallPolarity.POSITIVE &&
88 callLiteral.getTarget() instanceof ModalConstraint modalConstraint && 88 callLiteral.getTarget() instanceof ModalConstraint modalConstraint &&
89 modalConstraint.modality() == modality && 89 modalConstraint.modality() == modality &&
90 modalConstraint.constraint().equals(Reasoning.EXISTS)) { 90 modalConstraint.constraint().equals(ReasoningAdapter.EXISTS)) {
91 return callLiteral.getArguments().get(0); 91 return callLiteral.getArguments().get(0);
92 } 92 }
93 return null; 93 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 @@
5 */ 5 */
6package tools.refinery.store.reasoning.rule; 6package tools.refinery.store.reasoning.rule;
7 7
8import tools.refinery.store.reasoning.Reasoning; 8import tools.refinery.store.reasoning.ReasoningAdapter;
9import tools.refinery.store.reasoning.representation.PartialRelation; 9import tools.refinery.store.reasoning.representation.PartialRelation;
10import tools.refinery.store.model.Model; 10import tools.refinery.store.model.Model;
11import tools.refinery.store.query.term.Variable; 11import tools.refinery.store.query.term.Variable;
@@ -28,7 +28,7 @@ public record RelationRefinementAction(PartialRelation target, List<Variable> ar
28 28
29 @Override 29 @Override
30 public RuleActionExecutor createExecutor(int[] argumentIndices, Model model) { 30 public RuleActionExecutor createExecutor(int[] argumentIndices, Model model) {
31 var targetInterpretation = model.getAdapter(Reasoning.ADAPTER).getPartialInterpretation(target); 31 var targetInterpretation = model.getAdapter(ReasoningAdapter.class).getPartialInterpretation(target);
32 return activationTuple -> { 32 return activationTuple -> {
33 int arity = argumentIndices.length; 33 int arity = argumentIndices.length;
34 var arguments = new int[arity]; 34 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 @@
6package tools.refinery.store.reasoning.translator; 6package tools.refinery.store.reasoning.translator;
7 7
8import tools.refinery.store.model.Model; 8import tools.refinery.store.model.Model;
9import tools.refinery.store.model.ModelStoreBuilder;
10import tools.refinery.store.reasoning.ReasoningBuilder; 9import tools.refinery.store.reasoning.ReasoningBuilder;
11 10
12import java.util.Collection; 11import java.util.Collection;
@@ -23,10 +22,6 @@ public abstract class TranslationUnit {
23 configureReasoningBuilder(); 22 configureReasoningBuilder();
24 } 23 }
25 24
26 protected ModelStoreBuilder getModelStoreBuilder() {
27 return reasoningBuilder.getStoreBuilder();
28 }
29
30 protected void configureReasoningBuilder() { 25 protected void configureReasoningBuilder() {
31 // Nothing to configure by default. 26 // Nothing to configure by default.
32 } 27 }
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
@@ -37,11 +37,6 @@ public class BaseDecisionTranslationUnit extends TranslationUnit {
37 } 37 }
38 38
39 @Override 39 @Override
40 protected void configureReasoningBuilder() {
41 getModelStoreBuilder().symbol(symbol);
42 }
43
44 @Override
45 public Collection<TranslatedRelation> getTranslatedRelations() { 40 public Collection<TranslatedRelation> getTranslatedRelations() {
46 return List.of(new TranslatedBaseDecision(getReasoningBuilder(), partialRelation, symbol)); 41 return List.of(new TranslatedBaseDecision(getReasoningBuilder(), partialRelation, symbol));
47 } 42 }
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 @@
1package tools.refinery.store.adapter;
1/* 2/*
2 * SPDX-FileCopyrightText: 2021-2023 The Refinery Authors <https://refinery.tools/> 3 * SPDX-FileCopyrightText: 2021-2023 The Refinery Authors <https://refinery.tools/>
3 * 4 *
4 * SPDX-License-Identifier: EPL-2.0 5 * SPDX-License-Identifier: EPL-2.0
5 */ 6 */
6package tools.refinery.store.adapter;
7
8import tools.refinery.store.model.ModelStore; 7import tools.refinery.store.model.ModelStore;
9import tools.refinery.store.model.ModelStoreBuilder; 8import tools.refinery.store.model.ModelStoreBuilder;
10 9
11public abstract class AbstractModelAdapterBuilder implements ModelAdapterBuilder { 10public abstract class AbstractModelAdapterBuilder<T extends ModelStoreAdapter> implements ModelAdapterBuilder {
12 private final ModelStoreBuilder storeBuilder; 11 private boolean configured;
13 12
14 protected AbstractModelAdapterBuilder(ModelStoreBuilder storeBuilder) { 13 @Override
15 this.storeBuilder = storeBuilder; 14 public boolean isConfigured() {
15 return configured;
16 } 16 }
17 17
18 @Override 18 protected void checkConfigured() {
19 public <T extends ModelAdapterBuilder> T with(ModelAdapterBuilderFactory<?, ?, T> adapterBuilderFactory) { 19 if (!configured) {
20 return storeBuilder.with(adapterBuilderFactory); 20 throw new IllegalStateException("Model adapter builder was not configured");
21 }
22 }
23
24 protected void checkNotConfigured() {
25 if (configured) {
26 throw new IllegalStateException("Model adapter builder was already configured");
27 }
28 }
29
30 protected void doConfigure(ModelStoreBuilder storeBuilder) {
31 // Nothing to configure by default.
21 } 32 }
22 33
23 @Override 34 @Override
24 public ModelStoreBuilder getStoreBuilder() { 35 public final void configure(ModelStoreBuilder storeBuilder) {
25 return storeBuilder; 36 checkNotConfigured();
37 doConfigure(storeBuilder);
38 configured = true;
26 } 39 }
27 40
41 protected abstract T doBuild(ModelStore store);
42
28 @Override 43 @Override
29 public ModelStore build() { 44 public final T build(ModelStore store) {
30 return storeBuilder.build(); 45 checkConfigured();
46 return doBuild(store);
31 } 47 }
32} 48}
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 @@
1/*
2 * SPDX-FileCopyrightText: 2021-2023 The Refinery Authors <https://refinery.tools/>
3 *
4 * SPDX-License-Identifier: EPL-2.0
5 */
6package tools.refinery.store.adapter;
7
8import org.jetbrains.annotations.NotNull;
9
10import java.util.*;
11import java.util.function.Consumer;
12
13public class AdapterList<T> implements Iterable<T> {
14 private final List<AnyModelAdapterType> adapterTypes;
15 private final List<T> adapters;
16
17 public AdapterList() {
18 adapterTypes = new ArrayList<>();
19 adapters = new ArrayList<>();
20 }
21
22 public AdapterList(int adapterCount) {
23 adapterTypes = new ArrayList<>(adapterCount);
24 adapters = new ArrayList<>(adapterCount);
25 }
26
27 public int size() {
28 return adapters.size();
29 }
30
31 public void add(AnyModelAdapterType adapterType, T adapter) {
32 adapterTypes.add(adapterType);
33 adapters.add(adapter);
34 }
35
36 public <U extends T> Optional<U> tryGet(AnyModelAdapterType adapterType, Class<? extends U> adapterClass) {
37 int size = size();
38 for (int i = 0; i < size; i++) {
39 if (getType(i).supports(adapterType)) {
40 return Optional.of(adapterClass.cast(get(i)));
41 }
42 }
43 return Optional.empty();
44 }
45
46 public <U extends T> U get(AnyModelAdapterType adapterType, Class<U> adapterClass) {
47 return tryGet(adapterType, adapterClass).orElseThrow(() -> new IllegalArgumentException(
48 "No %s was configured".formatted(adapterType)));
49 }
50
51 public AnyModelAdapterType getType(int i) {
52 return adapterTypes.get(i);
53 }
54
55 public T get(int i) {
56 return adapters.get(i);
57 }
58
59 public Collection<AnyModelAdapterType> getAdapterTypes() {
60 return Collections.unmodifiableCollection(adapterTypes);
61 }
62
63 public Iterable<Entry<T>> withAdapterTypes() {
64 return () -> new Iterator<>() {
65 private int i = 0;
66
67 @Override
68 public boolean hasNext() {
69 return i < size();
70 }
71
72 @Override
73 public Entry<T> next() {
74 if (i >= size()) {
75 throw new NoSuchElementException();
76 }
77 var entry = new Entry<>(getType(i), get(i));
78 i++;
79 return entry;
80 }
81 };
82 }
83
84 @NotNull
85 @Override
86 public Iterator<T> iterator() {
87 return adapters.iterator();
88 }
89
90 @Override
91 public void forEach(Consumer<? super T> action) {
92 adapters.forEach(action);
93 }
94
95 @Override
96 public Spliterator<T> spliterator() {
97 return adapters.spliterator();
98 }
99
100 public record Entry<T>(AnyModelAdapterType adapterType, T adapter) {
101 }
102}
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 @@
1/*
2 * SPDX-FileCopyrightText: 2021-2023 The Refinery Authors <https://refinery.tools/>
3 *
4 * SPDX-License-Identifier: EPL-2.0
5 */
6package tools.refinery.store.adapter;
7
8import java.util.Collection;
9import java.util.Optional;
10
11public class AdapterUtils {
12 private AdapterUtils() {
13 throw new IllegalStateException("This is a static utility class and should not be instantiated directly");
14 }
15
16 public static <T, U extends T> Optional<U> tryGetAdapter(Collection<T> adapters, Class<? extends U> type) {
17 var iterator = adapters.stream().filter(type::isInstance).iterator();
18 if (!iterator.hasNext()) {
19 return Optional.empty();
20 }
21 var adapter = type.cast(iterator.next());
22 if (iterator.hasNext()) {
23 throw new IllegalArgumentException("Ambiguous adapter: both %s and %s match %s"
24 .formatted(adapter.getClass().getName(), iterator.next().getClass().getName(), type.getName()));
25 }
26 return Optional.of(adapter);
27 }
28
29 public static <T> T getAdapter(Collection<? super T> adapters, Class<T> type) {
30 return tryGetAdapter(adapters, type).orElseThrow(() -> new IllegalArgumentException(
31 "No %s adapter was configured".formatted(type.getName())));
32 }
33}
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 @@
1/*
2 * SPDX-FileCopyrightText: 2021-2023 The Refinery Authors <https://refinery.tools/>
3 *
4 * SPDX-License-Identifier: EPL-2.0
5 */
6package tools.refinery.store.adapter;
7
8import java.util.Collection;
9
10public sealed interface AnyModelAdapterType permits ModelAdapterType {
11 Class<? extends ModelAdapter> getModelAdapterClass();
12
13 Class<? extends ModelStoreAdapter> getModelStoreAdapterClass();
14
15 Class<? extends ModelAdapterBuilder> getModelAdapterBuilderClass();
16
17 Collection<AnyModelAdapterType> getSupportedAdapterTypes();
18
19 default boolean supports(AnyModelAdapterType targetAdapter) {
20 return getSupportedAdapterTypes().contains(targetAdapter);
21 }
22
23 String getName();
24}
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;
9import tools.refinery.store.model.ModelStoreBuilder; 9import tools.refinery.store.model.ModelStoreBuilder;
10 10
11public interface ModelAdapterBuilder { 11public interface ModelAdapterBuilder {
12 ModelStoreAdapter createStoreAdapter(ModelStore store); 12 boolean isConfigured();
13 13
14 <T extends ModelAdapterBuilder> T with(ModelAdapterBuilderFactory<?, ?, T> adapterBuilderFactory); 14 void configure(ModelStoreBuilder storeBuilder);
15 15
16 ModelStoreBuilder getStoreBuilder(); 16 ModelStoreAdapter build(ModelStore store);
17
18 default void configure() {
19 }
20
21 ModelStore build();
22} 17}
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 @@
1/*
2 * SPDX-FileCopyrightText: 2021-2023 The Refinery Authors <https://refinery.tools/>
3 *
4 * SPDX-License-Identifier: EPL-2.0
5 */
6package tools.refinery.store.adapter;
7
8import tools.refinery.store.model.ModelStoreBuilder;
9
10public abstract class ModelAdapterBuilderFactory<T1 extends ModelAdapter, T2 extends ModelStoreAdapter,
11 T3 extends ModelAdapterBuilder> extends ModelAdapterType<T1, T2, T3> {
12
13 protected ModelAdapterBuilderFactory(Class<T1> modelAdapterClass, Class<T2> modelStoreAdapterClass,
14 Class<T3> modelAdapterBuilderClass) {
15 super(modelAdapterClass, modelStoreAdapterClass, modelAdapterBuilderClass);
16 }
17
18 public abstract T3 createBuilder(ModelStoreBuilder storeBuilder);
19}
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 @@
1/*
2 * SPDX-FileCopyrightText: 2021-2023 The Refinery Authors <https://refinery.tools/>
3 *
4 * SPDX-License-Identifier: EPL-2.0
5 */
6package tools.refinery.store.adapter;
7
8import tools.refinery.store.model.Model;
9import tools.refinery.store.model.ModelStore;
10
11import java.lang.reflect.Method;
12import java.util.Collection;
13import java.util.Collections;
14import java.util.HashSet;
15import java.util.Set;
16
17public abstract non-sealed class ModelAdapterType<T1 extends ModelAdapter, T2 extends ModelStoreAdapter,
18 T3 extends ModelAdapterBuilder> implements AnyModelAdapterType {
19 private final Class<? extends T1> modelAdapterClass;
20 private final Class<? extends T2> modelStoreAdapterClass;
21 private final Class<? extends T3> modelAdapterBuilderClass;
22 private final Set<AnyModelAdapterType> supportedAdapters = new HashSet<>();
23
24 protected ModelAdapterType(Class<T1> modelAdapterClass, Class<T2> modelStoreAdapterClass,
25 Class<T3> modelAdapterBuilderClass) {
26 checkReturnType(modelAdapterClass, modelStoreAdapterClass, "createModelAdapter", Model.class);
27 checkReturnType(modelStoreAdapterClass, modelAdapterBuilderClass, "createStoreAdapter", ModelStore.class);
28 this.modelAdapterClass = modelAdapterClass;
29 this.modelStoreAdapterClass = modelStoreAdapterClass;
30 this.modelAdapterBuilderClass = modelAdapterBuilderClass;
31 supportedAdapters.add(this);
32 }
33
34 private void checkReturnType(Class<?> expectedReturnType, Class<?> ownerClass, String methodName,
35 Class<?>... argumentTypes) {
36 Method method;
37 try {
38 method = ownerClass.getMethod(methodName, argumentTypes);
39 } catch (NoSuchMethodException e) {
40 throw new IllegalStateException("Invalid %s: %s#%s method is required"
41 .formatted(this, ownerClass.getName(), methodName), e);
42 }
43 var returnType = method.getReturnType();
44 if (!expectedReturnType.isAssignableFrom(returnType)) {
45 throw new IllegalStateException("Invalid %s: %s is not assignable from the return type %s of %s#%s"
46 .formatted(this, expectedReturnType.getName(), returnType.getCanonicalName(),
47 ownerClass.getName(), methodName));
48 }
49 }
50
51 protected void extendsAdapter(ModelAdapterType<? super T1, ? super T2, ? super T3> superAdapter) {
52 supportedAdapters.addAll(superAdapter.supportedAdapters);
53 }
54
55 @Override
56 public final Class<? extends T1> getModelAdapterClass() {
57 return modelAdapterClass;
58 }
59
60 @Override
61 public final Class<? extends T2> getModelStoreAdapterClass() {
62 return modelStoreAdapterClass;
63 }
64
65 @Override
66 public final Class<? extends T3> getModelAdapterBuilderClass() {
67 return modelAdapterBuilderClass;
68 }
69
70 @Override
71 public Collection<AnyModelAdapterType> getSupportedAdapterTypes() {
72 return Collections.unmodifiableCollection(supportedAdapters);
73 }
74
75 @Override
76 public String getName() {
77 return "%s.ADAPTER".formatted(this.getClass().getName());
78 }
79
80 @Override
81 public String toString() {
82 return getName();
83 }
84}
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 @@
6package tools.refinery.store.model; 6package tools.refinery.store.model;
7 7
8import tools.refinery.store.adapter.ModelAdapter; 8import tools.refinery.store.adapter.ModelAdapter;
9import tools.refinery.store.adapter.ModelAdapterType;
10import tools.refinery.store.map.Versioned; 9import tools.refinery.store.map.Versioned;
11import tools.refinery.store.representation.AnySymbol; 10import tools.refinery.store.representation.AnySymbol;
12import tools.refinery.store.representation.Symbol; 11import tools.refinery.store.representation.Symbol;
@@ -30,9 +29,9 @@ public interface Model extends Versioned {
30 29
31 ModelDiffCursor getDiffCursor(long to); 30 ModelDiffCursor getDiffCursor(long to);
32 31
33 <T extends ModelAdapter> Optional<T> tryGetAdapter(ModelAdapterType<? extends T, ?, ?> adapterType); 32 <T extends ModelAdapter> Optional<T> tryGetAdapter(Class<? extends T> adapterType);
34 33
35 <T extends ModelAdapter> T getAdapter(ModelAdapterType<T, ?, ?> adapterType); 34 <T extends ModelAdapter> T getAdapter(Class<T> adapterType);
36 35
37 void addListener(ModelListener listener); 36 void addListener(ModelListener listener);
38 37
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 @@
5 */ 5 */
6package tools.refinery.store.model; 6package tools.refinery.store.model;
7 7
8import tools.refinery.store.adapter.ModelAdapterType;
9import tools.refinery.store.adapter.ModelStoreAdapter; 8import tools.refinery.store.adapter.ModelStoreAdapter;
10import tools.refinery.store.model.internal.ModelStoreBuilderImpl; 9import tools.refinery.store.model.internal.ModelStoreBuilderImpl;
11import tools.refinery.store.representation.AnySymbol; 10import tools.refinery.store.representation.AnySymbol;
@@ -25,9 +24,9 @@ public interface ModelStore {
25 24
26 ModelDiffCursor getDiffCursor(long from, long to); 25 ModelDiffCursor getDiffCursor(long from, long to);
27 26
28 <T extends ModelStoreAdapter> Optional<T> tryGetAdapter(ModelAdapterType<?, ? extends T, ?> adapterType); 27 <T extends ModelStoreAdapter> Optional<T> tryGetAdapter(Class<? extends T> adapterType);
29 28
30 <T extends ModelStoreAdapter> T getAdapter(ModelAdapterType<?, T, ?> adapterType); 29 <T extends ModelStoreAdapter> T getAdapter(Class<T> adapterType);
31 30
32 static ModelStoreBuilder builder() { 31 static ModelStoreBuilder builder() {
33 return new ModelStoreBuilderImpl(); 32 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 @@
6package tools.refinery.store.model; 6package tools.refinery.store.model;
7 7
8import tools.refinery.store.adapter.ModelAdapterBuilder; 8import tools.refinery.store.adapter.ModelAdapterBuilder;
9import tools.refinery.store.adapter.ModelAdapterBuilderFactory;
10import tools.refinery.store.adapter.ModelAdapterType;
11import tools.refinery.store.representation.AnySymbol; 9import tools.refinery.store.representation.AnySymbol;
12import tools.refinery.store.representation.Symbol; 10import tools.refinery.store.representation.Symbol;
13 11
@@ -31,11 +29,11 @@ public interface ModelStoreBuilder {
31 29
32 <T> ModelStoreBuilder symbol(Symbol<T> symbol); 30 <T> ModelStoreBuilder symbol(Symbol<T> symbol);
33 31
34 <T extends ModelAdapterBuilder> T with(ModelAdapterBuilderFactory<?, ?, T> adapterBuilderFactory); 32 <T extends ModelAdapterBuilder> ModelStoreBuilder with(T adapterBuilder);
35 33
36 <T extends ModelAdapterBuilder> Optional<T> tryGetAdapter(ModelAdapterType<?, ?, ? extends T> adapterType); 34 <T extends ModelAdapterBuilder> Optional<T> tryGetAdapter(Class<? extends T> adapterType);
37 35
38 <T extends ModelAdapterBuilder> T getAdapter(ModelAdapterType<?, ?, T> adapterType); 36 <T extends ModelAdapterBuilder> T getAdapter(Class<T> adapterType);
39 37
40 ModelStore build(); 38 ModelStore build();
41} 39}
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 @@
5 */ 5 */
6package tools.refinery.store.model.internal; 6package tools.refinery.store.model.internal;
7 7
8import tools.refinery.store.adapter.AdapterList; 8import tools.refinery.store.adapter.AdapterUtils;
9import tools.refinery.store.adapter.AnyModelAdapterType;
10import tools.refinery.store.adapter.ModelAdapter; 9import tools.refinery.store.adapter.ModelAdapter;
11import tools.refinery.store.adapter.ModelAdapterType;
12import tools.refinery.store.map.DiffCursor; 10import tools.refinery.store.map.DiffCursor;
13import tools.refinery.store.model.*; 11import tools.refinery.store.model.*;
14import tools.refinery.store.representation.AnySymbol; 12import tools.refinery.store.representation.AnySymbol;
@@ -21,7 +19,7 @@ public class ModelImpl implements Model {
21 private final ModelStore store; 19 private final ModelStore store;
22 private long state; 20 private long state;
23 private Map<? extends AnySymbol, ? extends VersionedInterpretation<?>> interpretations; 21 private Map<? extends AnySymbol, ? extends VersionedInterpretation<?>> interpretations;
24 private final AdapterList<ModelAdapter> adapters; 22 private final List<ModelAdapter> adapters;
25 private final List<ModelListener> listeners = new ArrayList<>(); 23 private final List<ModelListener> listeners = new ArrayList<>();
26 private boolean uncommittedChanges; 24 private boolean uncommittedChanges;
27 private ModelAction pendingAction = ModelAction.NONE; 25 private ModelAction pendingAction = ModelAction.NONE;
@@ -30,7 +28,7 @@ public class ModelImpl implements Model {
30 ModelImpl(ModelStore store, long state, int adapterCount) { 28 ModelImpl(ModelStore store, long state, int adapterCount) {
31 this.store = store; 29 this.store = store;
32 this.state = state; 30 this.state = state;
33 adapters = new AdapterList<>(adapterCount); 31 adapters = new ArrayList<>(adapterCount);
34 } 32 }
35 33
36 void setInterpretations(Map<? extends AnySymbol, ? extends VersionedInterpretation<?>> interpretations) { 34 void setInterpretations(Map<? extends AnySymbol, ? extends VersionedInterpretation<?>> interpretations) {
@@ -167,17 +165,17 @@ public class ModelImpl implements Model {
167 } 165 }
168 166
169 @Override 167 @Override
170 public <T extends ModelAdapter> Optional<T> tryGetAdapter(ModelAdapterType<? extends T, ?, ?> adapterType) { 168 public <T extends ModelAdapter> Optional<T> tryGetAdapter(Class<? extends T> adapterType) {
171 return adapters.tryGet(adapterType, adapterType.getModelAdapterClass()); 169 return AdapterUtils.tryGetAdapter(adapters, adapterType);
172 } 170 }
173 171
174 @Override 172 @Override
175 public <T extends ModelAdapter> T getAdapter(ModelAdapterType<T, ?, ?> adapterType) { 173 public <T extends ModelAdapter> T getAdapter(Class<T> adapterType) {
176 return adapters.get(adapterType, adapterType.getModelAdapterClass()); 174 return AdapterUtils.getAdapter(adapters, adapterType);
177 } 175 }
178 176
179 void addAdapter(AnyModelAdapterType adapterType, ModelAdapter adapter) { 177 void addAdapter(ModelAdapter adapter) {
180 adapters.add(adapterType, adapter); 178 adapters.add(adapter);
181 } 179 }
182 180
183 @Override 181 @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 @@
5 */ 5 */
6package tools.refinery.store.model.internal; 6package tools.refinery.store.model.internal;
7 7
8import tools.refinery.store.adapter.AdapterList; 8import tools.refinery.store.adapter.AdapterUtils;
9import tools.refinery.store.adapter.ModelAdapterBuilder; 9import tools.refinery.store.adapter.ModelAdapterBuilder;
10import tools.refinery.store.adapter.ModelAdapterBuilderFactory;
11import tools.refinery.store.adapter.ModelAdapterType;
12import tools.refinery.store.map.VersionedMapStore; 10import tools.refinery.store.map.VersionedMapStore;
13import tools.refinery.store.map.VersionedMapStoreImpl; 11import tools.refinery.store.map.VersionedMapStoreImpl;
14import tools.refinery.store.model.ModelStore; 12import tools.refinery.store.model.ModelStore;
@@ -23,7 +21,7 @@ import java.util.*;
23public class ModelStoreBuilderImpl implements ModelStoreBuilder { 21public class ModelStoreBuilderImpl implements ModelStoreBuilder {
24 private final Set<AnySymbol> allSymbols = new HashSet<>(); 22 private final Set<AnySymbol> allSymbols = new HashSet<>();
25 private final Map<SymbolEquivalenceClass<?>, List<AnySymbol>> equivalenceClasses = new HashMap<>(); 23 private final Map<SymbolEquivalenceClass<?>, List<AnySymbol>> equivalenceClasses = new HashMap<>();
26 private final AdapterList<ModelAdapterBuilder> adapters = new AdapterList<>(); 24 private final List<ModelAdapterBuilder> adapters = new ArrayList<>();
27 25
28 @Override 26 @Override
29 public <T> ModelStoreBuilder symbol(Symbol<T> symbol) { 27 public <T> ModelStoreBuilder symbol(Symbol<T> symbol) {
@@ -38,46 +36,25 @@ public class ModelStoreBuilderImpl implements ModelStoreBuilder {
38 } 36 }
39 37
40 @Override 38 @Override
41 public <T extends ModelAdapterBuilder> T with(ModelAdapterBuilderFactory<?, ?, T> adapterBuilderFactory) { 39 public <T extends ModelAdapterBuilder> ModelStoreBuilder with(T adapterBuilder) {
42 return adapters.<T>tryGet(adapterBuilderFactory, adapterBuilderFactory.getModelAdapterBuilderClass()) 40 for (var existingAdapter : adapters) {
43 .orElseGet(() -> addAdapter(adapterBuilderFactory)); 41 if (existingAdapter.getClass().equals(adapterBuilder.getClass())) {
44 } 42 throw new IllegalArgumentException("%s adapter was already configured for store builder"
45 43 .formatted(adapterBuilder.getClass().getName()));
46 private <T extends ModelAdapterBuilder> T addAdapter(ModelAdapterBuilderFactory<?, ?, T> adapterBuilderFactory) {
47 for (var configuredAdapterType : adapters.getAdapterTypes()) {
48 var intersection = new HashSet<>(adapterBuilderFactory.getSupportedAdapterTypes());
49 intersection.retainAll(configuredAdapterType.getSupportedAdapterTypes());
50 if (!intersection.isEmpty()) {
51 if (configuredAdapterType.supports(adapterBuilderFactory)) {
52 // Impossible to end up here from <code>#with</code>, because we should have returned
53 // the existing adapter there instead of adding a new one.
54 throw new IllegalArgumentException(
55 "Cannot add %s, because it is already provided by configured adapter %s"
56 .formatted(adapterBuilderFactory, configuredAdapterType));
57 } else if (adapterBuilderFactory.supports(configuredAdapterType)) {
58 throw new IllegalArgumentException(
59 "Cannot add %s, because it provides already configured adapter %s"
60 .formatted(adapterBuilderFactory, configuredAdapterType));
61 } else {
62 throw new IllegalArgumentException(
63 "Cannot add %s, because configured adapter %s already provides %s"
64 .formatted(adapterBuilderFactory, configuredAdapterType, intersection));
65 }
66 } 44 }
67 } 45 }
68 var newAdapter = adapterBuilderFactory.createBuilder(this); 46 adapters.add(adapterBuilder);
69 adapters.add(adapterBuilderFactory, newAdapter); 47 return this;
70 return newAdapter;
71 } 48 }
72 49
73 @Override 50 @Override
74 public <T extends ModelAdapterBuilder> Optional<T> tryGetAdapter(ModelAdapterType<?, ?, ? extends T> adapterType) { 51 public <T extends ModelAdapterBuilder> Optional<T> tryGetAdapter(Class<? extends T> adapterType) {
75 return adapters.tryGet(adapterType, adapterType.getModelAdapterBuilderClass()); 52 return AdapterUtils.tryGetAdapter(adapters, adapterType);
76 } 53 }
77 54
78 @Override 55 @Override
79 public <T extends ModelAdapterBuilder> T getAdapter(ModelAdapterType<?, ?, T> adapterType) { 56 public <T extends ModelAdapterBuilder> T getAdapter(Class<T> adapterType) {
80 return adapters.get(adapterType, adapterType.getModelAdapterBuilderClass()); 57 return AdapterUtils.getAdapter(adapters, adapterType);
81 } 58 }
82 59
83 @Override 60 @Override
@@ -86,13 +63,13 @@ public class ModelStoreBuilderImpl implements ModelStoreBuilder {
86 for (var entry : equivalenceClasses.entrySet()) { 63 for (var entry : equivalenceClasses.entrySet()) {
87 createStores(stores, entry.getKey(), entry.getValue()); 64 createStores(stores, entry.getKey(), entry.getValue());
88 } 65 }
89 var modelStore = new ModelStoreImpl(stores, adapters.size());
90 for (int i = adapters.size() - 1; i >= 0; i--) { 66 for (int i = adapters.size() - 1; i >= 0; i--) {
91 adapters.get(i).configure(); 67 adapters.get(i).configure(this);
92 } 68 }
93 for (var entry : adapters.withAdapterTypes()) { 69 var modelStore = new ModelStoreImpl(stores, adapters.size());
94 var adapter = entry.adapter().createStoreAdapter(modelStore); 70 for (var adapterBuilder : adapters) {
95 modelStore.addAdapter(entry.adapterType(), adapter); 71 var storeAdapter = adapterBuilder.build(modelStore);
72 modelStore.addAdapter(storeAdapter);
96 } 73 }
97 return modelStore; 74 return modelStore;
98 } 75 }
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 @@
5 */ 5 */
6package tools.refinery.store.model.internal; 6package tools.refinery.store.model.internal;
7 7
8import tools.refinery.store.adapter.AdapterList; 8import tools.refinery.store.adapter.AdapterUtils;
9import tools.refinery.store.adapter.AnyModelAdapterType;
10import tools.refinery.store.adapter.ModelAdapterType;
11import tools.refinery.store.adapter.ModelStoreAdapter; 9import tools.refinery.store.adapter.ModelStoreAdapter;
12import tools.refinery.store.map.DiffCursor; 10import tools.refinery.store.map.DiffCursor;
13import tools.refinery.store.map.VersionedMapStore; 11import tools.refinery.store.map.VersionedMapStore;
@@ -21,11 +19,11 @@ import java.util.*;
21 19
22public class ModelStoreImpl implements ModelStore { 20public class ModelStoreImpl implements ModelStore {
23 private final Map<? extends AnySymbol, ? extends VersionedMapStore<Tuple, ?>> stores; 21 private final Map<? extends AnySymbol, ? extends VersionedMapStore<Tuple, ?>> stores;
24 private final AdapterList<ModelStoreAdapter> adapters; 22 private final List<ModelStoreAdapter> adapters;
25 23
26 ModelStoreImpl(Map<? extends AnySymbol, ? extends VersionedMapStore<Tuple, ?>> stores, int adapterCount) { 24 ModelStoreImpl(Map<? extends AnySymbol, ? extends VersionedMapStore<Tuple, ?>> stores, int adapterCount) {
27 this.stores = stores; 25 this.stores = stores;
28 adapters = new AdapterList<>(adapterCount); 26 adapters = new ArrayList<>(adapterCount);
29 } 27 }
30 28
31 @Override 29 @Override
@@ -64,9 +62,9 @@ public class ModelStoreImpl implements ModelStore {
64 } 62 }
65 63
66 private void adaptModel(ModelImpl model) { 64 private void adaptModel(ModelImpl model) {
67 for (var entry : adapters.withAdapterTypes()) { 65 for (var storeAdapter : adapters) {
68 var adapter = entry.adapter().createModelAdapter(model); 66 var adapter = storeAdapter.createModelAdapter(model);
69 model.addAdapter(entry.adapterType(), adapter); 67 model.addAdapter(adapter);
70 } 68 }
71 } 69 }
72 70
@@ -91,16 +89,16 @@ public class ModelStoreImpl implements ModelStore {
91 } 89 }
92 90
93 @Override 91 @Override
94 public <T extends ModelStoreAdapter> Optional<T> tryGetAdapter(ModelAdapterType<?, ? extends T, ?> adapterType) { 92 public <T extends ModelStoreAdapter> Optional<T> tryGetAdapter(Class<? extends T> adapterType) {
95 return adapters.tryGet(adapterType, adapterType.getModelStoreAdapterClass()); 93 return AdapterUtils.tryGetAdapter(adapters, adapterType);
96 } 94 }
97 95
98 @Override 96 @Override
99 public <T extends ModelStoreAdapter> T getAdapter(ModelAdapterType<?, T, ?> adapterType) { 97 public <T extends ModelStoreAdapter> T getAdapter(Class<T> adapterType) {
100 return adapters.get(adapterType, adapterType.getModelStoreAdapterClass()); 98 return AdapterUtils.getAdapter(adapters, adapterType);
101 } 99 }
102 100
103 void addAdapter(AnyModelAdapterType adapterType, ModelStoreAdapter adapter) { 101 void addAdapter(ModelStoreAdapter adapter) {
104 adapters.add(adapterType, adapter); 102 adapters.add(adapter);
105 } 103 }
106} 104}