aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--subprojects/language-semantics/src/main/java/tools/refinery/language/semantics/model/ModelInitializer.java4
-rw-r--r--subprojects/store-query-viatra/src/test/java/tools/refinery/store/query/viatra/DiagonalQueryTest.java110
-rw-r--r--subprojects/store-query-viatra/src/test/java/tools/refinery/store/query/viatra/FunctionalQueryTest.java63
-rw-r--r--subprojects/store-query-viatra/src/test/java/tools/refinery/store/query/viatra/QueryTest.java75
-rw-r--r--subprojects/store-query-viatra/src/test/java/tools/refinery/store/query/viatra/QueryTransactionTest.java43
-rw-r--r--subprojects/store-query/src/test/java/tools/refinery/store/query/dnf/DnfBuilderLiteralEliminationTest.java2
-rw-r--r--subprojects/store-query/src/test/java/tools/refinery/store/query/dnf/DnfBuilderVariableUnificationTest.java4
-rw-r--r--subprojects/store-query/src/test/java/tools/refinery/store/query/dnf/DnfToDefinitionStringTest.java43
-rw-r--r--subprojects/store-query/src/test/java/tools/refinery/store/query/dnf/TopologicalSortTest.java2
-rw-r--r--subprojects/store-query/src/test/java/tools/refinery/store/query/dnf/VariableDirectionTest.java6
-rw-r--r--subprojects/store-query/src/test/java/tools/refinery/store/query/tests/StructurallyEqualToRawTest.java48
-rw-r--r--subprojects/store-query/src/test/java/tools/refinery/store/query/tests/StructurallyEqualToTest.java48
-rw-r--r--subprojects/store-reasoning/src/main/java/tools/refinery/store/reasoning/translator/base/BaseDecisionTranslationUnit.java2
-rw-r--r--subprojects/store-reasoning/src/main/java/tools/refinery/store/reasoning/translator/typehierarchy/TypeHierarchyTranslationUnit.java4
-rw-r--r--subprojects/store/src/main/java/tools/refinery/store/representation/Symbol.java19
-rw-r--r--subprojects/store/src/test/java/tools/refinery/store/model/tests/ModelTest.java24
16 files changed, 121 insertions, 376 deletions
diff --git a/subprojects/language-semantics/src/main/java/tools/refinery/language/semantics/model/ModelInitializer.java b/subprojects/language-semantics/src/main/java/tools/refinery/language/semantics/model/ModelInitializer.java
index 41b4fcb0..06b8ad77 100644
--- a/subprojects/language-semantics/src/main/java/tools/refinery/language/semantics/model/ModelInitializer.java
+++ b/subprojects/language-semantics/src/main/java/tools/refinery/language/semantics/model/ModelInitializer.java
@@ -44,8 +44,8 @@ public class ModelInitializer {
44 var isEqualsRelation = relation == builtinSymbols.equals(); 44 var isEqualsRelation = relation == builtinSymbols.equals();
45 var decisionTree = mergeAssertions(relationInfo, isEqualsRelation); 45 var decisionTree = mergeAssertions(relationInfo, isEqualsRelation);
46 var defaultValue = isEqualsRelation ? TruthValue.FALSE : TruthValue.UNKNOWN; 46 var defaultValue = isEqualsRelation ? TruthValue.FALSE : TruthValue.UNKNOWN;
47 relationTrace.put(relation, new Symbol<>(relationInfo.name(), relationInfo.arity(), TruthValue.class, defaultValue 47 relationTrace.put(relation, Symbol.of(
48 )); 48 relationInfo.name(), relationInfo.arity(), TruthValue.class, defaultValue));
49 } 49 }
50 } 50 }
51 51
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 86a27f5b..b21c254c 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
@@ -11,6 +11,7 @@ import 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;
14import tools.refinery.store.query.view.AnySymbolView;
14import tools.refinery.store.query.view.FunctionView; 15import tools.refinery.store.query.view.FunctionView;
15import tools.refinery.store.query.view.KeyOnlyView; 16import tools.refinery.store.query.view.KeyOnlyView;
16import tools.refinery.store.representation.Symbol; 17import tools.refinery.store.representation.Symbol;
@@ -26,13 +27,17 @@ import static tools.refinery.store.query.viatra.tests.QueryAssertions.assertNull
26import static tools.refinery.store.query.viatra.tests.QueryAssertions.assertResults; 27import static tools.refinery.store.query.viatra.tests.QueryAssertions.assertResults;
27 28
28class DiagonalQueryTest { 29class DiagonalQueryTest {
30 private static final Symbol<Boolean> person = Symbol.of("Person", 1);
31 private static final Symbol<Boolean> friend = Symbol.of("friend", 2);
32 private static final Symbol<Boolean> symbol = Symbol.of("symbol", 4);
33 private static final Symbol<Integer> intSymbol = Symbol.of("intSymbol", 4, Integer.class);
34 private static final AnySymbolView personView = new KeyOnlyView<>(person);
35 private static final AnySymbolView friendView = new KeyOnlyView<>(friend);
36 private static final AnySymbolView symbolView = new KeyOnlyView<>(symbol);
37 private static final AnySymbolView intSymbolView = new FunctionView<>(intSymbol);
38
29 @QueryEngineTest 39 @QueryEngineTest
30 void inputKeyNegationTest(QueryEvaluationHint hint) { 40 void inputKeyNegationTest(QueryEvaluationHint hint) {
31 var person = new Symbol<>("Person", 1, Boolean.class, false);
32 var symbol = new Symbol<>("symbol", 4, Boolean.class, false);
33 var personView = new KeyOnlyView<>(person);
34 var symbolView = new KeyOnlyView<>(symbol);
35
36 var query = Query.of("Diagonal", (builder, p1) -> builder.clause(p2 -> List.of( 41 var query = Query.of("Diagonal", (builder, p1) -> builder.clause(p2 -> List.of(
37 personView.call(p1), 42 personView.call(p1),
38 not(symbolView.call(p1, p1, p2, p2)) 43 not(symbolView.call(p1, p1, p2, p2))
@@ -71,11 +76,6 @@ class DiagonalQueryTest {
71 76
72 @QueryEngineTest 77 @QueryEngineTest
73 void subQueryNegationTest(QueryEvaluationHint hint) { 78 void subQueryNegationTest(QueryEvaluationHint hint) {
74 var person = new Symbol<>("Person", 1, Boolean.class, false);
75 var symbol = new Symbol<>("symbol", 4, Boolean.class, false);
76 var personView = new KeyOnlyView<>(person);
77 var symbolView = new KeyOnlyView<>(symbol);
78
79 var subQuery = Dnf.of("SubQuery", builder -> { 79 var subQuery = Dnf.of("SubQuery", builder -> {
80 var p1 = builder.parameter("p1"); 80 var p1 = builder.parameter("p1");
81 var p2 = builder.parameter("p2"); 81 var p2 = builder.parameter("p2");
@@ -128,11 +128,6 @@ class DiagonalQueryTest {
128 128
129 @QueryEngineTest 129 @QueryEngineTest
130 void inputKeyCountTest(QueryEvaluationHint hint) { 130 void inputKeyCountTest(QueryEvaluationHint hint) {
131 var person = new Symbol<>("Person", 1, Boolean.class, false);
132 var symbol = new Symbol<>("symbol", 4, Boolean.class, false);
133 var personView = new KeyOnlyView<>(person);
134 var symbolView = new KeyOnlyView<>(symbol);
135
136 var query = Query.of("Diagonal", Integer.class, (builder, p1, output) -> builder.clause(p2 -> List.of( 131 var query = Query.of("Diagonal", Integer.class, (builder, p1, output) -> builder.clause(p2 -> List.of(
137 personView.call(p1), 132 personView.call(p1),
138 output.assign(symbolView.count(p1, p1, p2, p2)) 133 output.assign(symbolView.count(p1, p1, p2, p2))
@@ -172,11 +167,6 @@ class DiagonalQueryTest {
172 167
173 @QueryEngineTest 168 @QueryEngineTest
174 void subQueryCountTest(QueryEvaluationHint hint) { 169 void subQueryCountTest(QueryEvaluationHint hint) {
175 var person = new Symbol<>("Person", 1, Boolean.class, false);
176 var symbol = new Symbol<>("symbol", 4, Boolean.class, false);
177 var personView = new KeyOnlyView<>(person);
178 var symbolView = new KeyOnlyView<>(symbol);
179
180 var subQuery = Dnf.of("SubQuery", builder -> { 170 var subQuery = Dnf.of("SubQuery", builder -> {
181 var p1 = builder.parameter("p1"); 171 var p1 = builder.parameter("p1");
182 var p2 = builder.parameter("p2"); 172 var p2 = builder.parameter("p2");
@@ -230,19 +220,14 @@ class DiagonalQueryTest {
230 220
231 @QueryEngineTest 221 @QueryEngineTest
232 void inputKeyAggregationTest(QueryEvaluationHint hint) { 222 void inputKeyAggregationTest(QueryEvaluationHint hint) {
233 var person = new Symbol<>("Person", 1, Boolean.class, false);
234 var symbol = new Symbol<>("symbol", 4, Integer.class, null);
235 var personView = new KeyOnlyView<>(person);
236 var symbolView = new FunctionView<>(symbol);
237
238 var query = Query.of("Diagonal", Integer.class, (builder, p1, output) -> builder.clause(Integer.class, 223 var query = Query.of("Diagonal", Integer.class, (builder, p1, output) -> builder.clause(Integer.class,
239 (p2, y) -> List.of( 224 (p2, y) -> List.of(
240 personView.call(p1), 225 personView.call(p1),
241 output.assign(symbolView.aggregate(y, INT_SUM, p1, p1, p2, p2, y)) 226 output.assign(intSymbolView.aggregate(y, INT_SUM, p1, p1, p2, p2, y))
242 ))); 227 )));
243 228
244 var store = ModelStore.builder() 229 var store = ModelStore.builder()
245 .symbols(person, symbol) 230 .symbols(person, intSymbol)
246 .with(ViatraModelQueryAdapter.builder() 231 .with(ViatraModelQueryAdapter.builder()
247 .defaultHint(hint) 232 .defaultHint(hint)
248 .queries(query)) 233 .queries(query))
@@ -250,7 +235,7 @@ class DiagonalQueryTest {
250 235
251 var model = store.createEmptyModel(); 236 var model = store.createEmptyModel();
252 var personInterpretation = model.getInterpretation(person); 237 var personInterpretation = model.getInterpretation(person);
253 var symbolInterpretation = model.getInterpretation(symbol); 238 var intSymbolInterpretation = model.getInterpretation(intSymbol);
254 var queryEngine = model.getAdapter(ModelQueryAdapter.class); 239 var queryEngine = model.getAdapter(ModelQueryAdapter.class);
255 var queryResultSet = queryEngine.getResultSet(query); 240 var queryResultSet = queryEngine.getResultSet(query);
256 241
@@ -258,11 +243,11 @@ class DiagonalQueryTest {
258 personInterpretation.put(Tuple.of(1), true); 243 personInterpretation.put(Tuple.of(1), true);
259 personInterpretation.put(Tuple.of(2), true); 244 personInterpretation.put(Tuple.of(2), true);
260 245
261 symbolInterpretation.put(Tuple.of(0, 0, 1, 1), 1); 246 intSymbolInterpretation.put(Tuple.of(0, 0, 1, 1), 1);
262 symbolInterpretation.put(Tuple.of(0, 0, 2, 2), 2); 247 intSymbolInterpretation.put(Tuple.of(0, 0, 2, 2), 2);
263 symbolInterpretation.put(Tuple.of(0, 0, 1, 2), 10); 248 intSymbolInterpretation.put(Tuple.of(0, 0, 1, 2), 10);
264 symbolInterpretation.put(Tuple.of(1, 1, 0, 1), 11); 249 intSymbolInterpretation.put(Tuple.of(1, 1, 0, 1), 11);
265 symbolInterpretation.put(Tuple.of(1, 2, 1, 1), 12); 250 intSymbolInterpretation.put(Tuple.of(1, 2, 1, 1), 12);
266 251
267 queryEngine.flushChanges(); 252 queryEngine.flushChanges();
268 assertNullableResults(Map.of( 253 assertNullableResults(Map.of(
@@ -275,11 +260,6 @@ class DiagonalQueryTest {
275 260
276 @QueryEngineTest 261 @QueryEngineTest
277 void subQueryAggregationTest(QueryEvaluationHint hint) { 262 void subQueryAggregationTest(QueryEvaluationHint hint) {
278 var person = new Symbol<>("Person", 1, Boolean.class, false);
279 var symbol = new Symbol<>("symbol", 4, Integer.class, null);
280 var personView = new KeyOnlyView<>(person);
281 var symbolView = new FunctionView<>(symbol);
282
283 var subQuery = Dnf.of("SubQuery", builder -> { 263 var subQuery = Dnf.of("SubQuery", builder -> {
284 var p1 = builder.parameter("p1"); 264 var p1 = builder.parameter("p1");
285 var p2 = builder.parameter("p2"); 265 var p2 = builder.parameter("p2");
@@ -289,12 +269,12 @@ class DiagonalQueryTest {
289 var y = builder.parameter("y", Integer.class); 269 var y = builder.parameter("y", Integer.class);
290 builder.clause( 270 builder.clause(
291 personView.call(p1), 271 personView.call(p1),
292 symbolView.call(p1, p2, p3, p4, x), 272 intSymbolView.call(p1, p2, p3, p4, x),
293 y.assign(x) 273 y.assign(x)
294 ); 274 );
295 builder.clause( 275 builder.clause(
296 personView.call(p2), 276 personView.call(p2),
297 symbolView.call(p1, p2, p3, p4, x), 277 intSymbolView.call(p1, p2, p3, p4, x),
298 y.assign(x) 278 y.assign(x)
299 ); 279 );
300 }); 280 });
@@ -305,7 +285,7 @@ class DiagonalQueryTest {
305 ))); 285 )));
306 286
307 var store = ModelStore.builder() 287 var store = ModelStore.builder()
308 .symbols(person, symbol) 288 .symbols(person, intSymbol)
309 .with(ViatraModelQueryAdapter.builder() 289 .with(ViatraModelQueryAdapter.builder()
310 .defaultHint(hint) 290 .defaultHint(hint)
311 .queries(query)) 291 .queries(query))
@@ -313,7 +293,7 @@ class DiagonalQueryTest {
313 293
314 var model = store.createEmptyModel(); 294 var model = store.createEmptyModel();
315 var personInterpretation = model.getInterpretation(person); 295 var personInterpretation = model.getInterpretation(person);
316 var symbolInterpretation = model.getInterpretation(symbol); 296 var intSymbolInterpretation = model.getInterpretation(intSymbol);
317 var queryEngine = model.getAdapter(ModelQueryAdapter.class); 297 var queryEngine = model.getAdapter(ModelQueryAdapter.class);
318 var queryResultSet = queryEngine.getResultSet(query); 298 var queryResultSet = queryEngine.getResultSet(query);
319 299
@@ -321,11 +301,11 @@ class DiagonalQueryTest {
321 personInterpretation.put(Tuple.of(1), true); 301 personInterpretation.put(Tuple.of(1), true);
322 personInterpretation.put(Tuple.of(2), true); 302 personInterpretation.put(Tuple.of(2), true);
323 303
324 symbolInterpretation.put(Tuple.of(0, 0, 1, 1), 1); 304 intSymbolInterpretation.put(Tuple.of(0, 0, 1, 1), 1);
325 symbolInterpretation.put(Tuple.of(0, 0, 2, 2), 2); 305 intSymbolInterpretation.put(Tuple.of(0, 0, 2, 2), 2);
326 symbolInterpretation.put(Tuple.of(0, 0, 1, 2), 10); 306 intSymbolInterpretation.put(Tuple.of(0, 0, 1, 2), 10);
327 symbolInterpretation.put(Tuple.of(1, 1, 0, 1), 11); 307 intSymbolInterpretation.put(Tuple.of(1, 1, 0, 1), 11);
328 symbolInterpretation.put(Tuple.of(1, 2, 1, 1), 12); 308 intSymbolInterpretation.put(Tuple.of(1, 2, 1, 1), 12);
329 309
330 queryEngine.flushChanges(); 310 queryEngine.flushChanges();
331 assertNullableResults(Map.of( 311 assertNullableResults(Map.of(
@@ -338,18 +318,13 @@ class DiagonalQueryTest {
338 318
339 @QueryEngineTest 319 @QueryEngineTest
340 void inputKeyTransitiveTest(QueryEvaluationHint hint) { 320 void inputKeyTransitiveTest(QueryEvaluationHint hint) {
341 var person = new Symbol<>("Person", 1, Boolean.class, false);
342 var symbol = new Symbol<>("symbol", 2, Boolean.class, false);
343 var personView = new KeyOnlyView<>(person);
344 var symbolView = new KeyOnlyView<>(symbol);
345
346 var query = Query.of("Diagonal", (builder, p1) -> builder.clause( 321 var query = Query.of("Diagonal", (builder, p1) -> builder.clause(
347 personView.call(p1), 322 personView.call(p1),
348 symbolView.callTransitive(p1, p1) 323 friendView.callTransitive(p1, p1)
349 )); 324 ));
350 325
351 var store = ModelStore.builder() 326 var store = ModelStore.builder()
352 .symbols(person, symbol) 327 .symbols(person, friend)
353 .with(ViatraModelQueryAdapter.builder() 328 .with(ViatraModelQueryAdapter.builder()
354 .defaultHint(hint) 329 .defaultHint(hint)
355 .queries(query)) 330 .queries(query))
@@ -357,7 +332,7 @@ class DiagonalQueryTest {
357 332
358 var model = store.createEmptyModel(); 333 var model = store.createEmptyModel();
359 var personInterpretation = model.getInterpretation(person); 334 var personInterpretation = model.getInterpretation(person);
360 var symbolInterpretation = model.getInterpretation(symbol); 335 var friendInterpretation = model.getInterpretation(friend);
361 var queryEngine = model.getAdapter(ModelQueryAdapter.class); 336 var queryEngine = model.getAdapter(ModelQueryAdapter.class);
362 var queryResultSet = queryEngine.getResultSet(query); 337 var queryResultSet = queryEngine.getResultSet(query);
363 338
@@ -365,9 +340,9 @@ class DiagonalQueryTest {
365 personInterpretation.put(Tuple.of(1), true); 340 personInterpretation.put(Tuple.of(1), true);
366 personInterpretation.put(Tuple.of(2), true); 341 personInterpretation.put(Tuple.of(2), true);
367 342
368 symbolInterpretation.put(Tuple.of(0, 0), true); 343 friendInterpretation.put(Tuple.of(0, 0), true);
369 symbolInterpretation.put(Tuple.of(0, 1), true); 344 friendInterpretation.put(Tuple.of(0, 1), true);
370 symbolInterpretation.put(Tuple.of(1, 2), true); 345 friendInterpretation.put(Tuple.of(1, 2), true);
371 346
372 queryEngine.flushChanges(); 347 queryEngine.flushChanges();
373 assertResults(Map.of( 348 assertResults(Map.of(
@@ -380,21 +355,16 @@ class DiagonalQueryTest {
380 355
381 @QueryEngineTest 356 @QueryEngineTest
382 void subQueryTransitiveTest(QueryEvaluationHint hint) { 357 void subQueryTransitiveTest(QueryEvaluationHint hint) {
383 var person = new Symbol<>("Person", 1, Boolean.class, false);
384 var symbol = new Symbol<>("symbol", 2, Boolean.class, false);
385 var personView = new KeyOnlyView<>(person);
386 var symbolView = new KeyOnlyView<>(symbol);
387
388 var subQuery = Dnf.of("SubQuery", builder -> { 358 var subQuery = Dnf.of("SubQuery", builder -> {
389 var p1 = builder.parameter("p1"); 359 var p1 = builder.parameter("p1");
390 var p2 = builder.parameter("p2"); 360 var p2 = builder.parameter("p2");
391 builder.clause( 361 builder.clause(
392 personView.call(p1), 362 personView.call(p1),
393 symbolView.call(p1, p2) 363 friendView.call(p1, p2)
394 ); 364 );
395 builder.clause( 365 builder.clause(
396 personView.call(p2), 366 personView.call(p2),
397 symbolView.call(p1, p2) 367 friendView.call(p1, p2)
398 ); 368 );
399 }); 369 });
400 var query = Query.of("Diagonal", (builder, p1) -> builder.clause( 370 var query = Query.of("Diagonal", (builder, p1) -> builder.clause(
@@ -403,7 +373,7 @@ class DiagonalQueryTest {
403 )); 373 ));
404 374
405 var store = ModelStore.builder() 375 var store = ModelStore.builder()
406 .symbols(person, symbol) 376 .symbols(person, friend)
407 .with(ViatraModelQueryAdapter.builder() 377 .with(ViatraModelQueryAdapter.builder()
408 .defaultHint(hint) 378 .defaultHint(hint)
409 .queries(query)) 379 .queries(query))
@@ -411,7 +381,7 @@ class DiagonalQueryTest {
411 381
412 var model = store.createEmptyModel(); 382 var model = store.createEmptyModel();
413 var personInterpretation = model.getInterpretation(person); 383 var personInterpretation = model.getInterpretation(person);
414 var symbolInterpretation = model.getInterpretation(symbol); 384 var friendInterpretation = model.getInterpretation(friend);
415 var queryEngine = model.getAdapter(ModelQueryAdapter.class); 385 var queryEngine = model.getAdapter(ModelQueryAdapter.class);
416 var queryResultSet = queryEngine.getResultSet(query); 386 var queryResultSet = queryEngine.getResultSet(query);
417 387
@@ -419,9 +389,9 @@ class DiagonalQueryTest {
419 personInterpretation.put(Tuple.of(1), true); 389 personInterpretation.put(Tuple.of(1), true);
420 personInterpretation.put(Tuple.of(2), true); 390 personInterpretation.put(Tuple.of(2), true);
421 391
422 symbolInterpretation.put(Tuple.of(0, 0), true); 392 friendInterpretation.put(Tuple.of(0, 0), true);
423 symbolInterpretation.put(Tuple.of(0, 1), true); 393 friendInterpretation.put(Tuple.of(0, 1), true);
424 symbolInterpretation.put(Tuple.of(1, 2), true); 394 friendInterpretation.put(Tuple.of(1, 2), true);
425 395
426 queryEngine.flushChanges(); 396 queryEngine.flushChanges();
427 assertResults(Map.of( 397 assertResults(Map.of(
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 98c8cd92..723e9180 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
@@ -13,6 +13,7 @@ import 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;
15import tools.refinery.store.query.viatra.tests.QueryEngineTest; 15import tools.refinery.store.query.viatra.tests.QueryEngineTest;
16import tools.refinery.store.query.view.AnySymbolView;
16import tools.refinery.store.query.view.FilteredView; 17import tools.refinery.store.query.view.FilteredView;
17import tools.refinery.store.query.view.FunctionView; 18import tools.refinery.store.query.view.FunctionView;
18import tools.refinery.store.query.view.KeyOnlyView; 19import tools.refinery.store.query.view.KeyOnlyView;
@@ -35,13 +36,15 @@ import static tools.refinery.store.query.viatra.tests.QueryAssertions.assertNull
35import static tools.refinery.store.query.viatra.tests.QueryAssertions.assertResults; 36import static tools.refinery.store.query.viatra.tests.QueryAssertions.assertResults;
36 37
37class FunctionalQueryTest { 38class FunctionalQueryTest {
39 private static final Symbol<Boolean> person = Symbol.of("Person", 1);
40 private static final Symbol<Integer> age = Symbol.of("age", 1, Integer.class);
41 private static final Symbol<TruthValue> friend = Symbol.of("friend", 2, TruthValue.class, TruthValue.FALSE);
42 private static final AnySymbolView personView = new KeyOnlyView<>(person);
43 private static final AnySymbolView ageView = new FunctionView<>(age);
44 private static final AnySymbolView friendMustView = new FilteredView<>(friend, "must", TruthValue::must);
45
38 @QueryEngineTest 46 @QueryEngineTest
39 void inputKeyTest(QueryEvaluationHint hint) { 47 void inputKeyTest(QueryEvaluationHint hint) {
40 var person = new Symbol<>("Person", 1, Boolean.class, false);
41 var age = new Symbol<>("age", 1, Integer.class, null);
42 var personView = new KeyOnlyView<>(person);
43 var ageView = new FunctionView<>(age);
44
45 var query = Query.of("InputKey", Integer.class, (builder, p1, output) -> builder.clause( 48 var query = Query.of("InputKey", Integer.class, (builder, p1, output) -> builder.clause(
46 personView.call(p1), 49 personView.call(p1),
47 ageView.call(p1, output) 50 ageView.call(p1, output)
@@ -77,11 +80,6 @@ class FunctionalQueryTest {
77 80
78 @QueryEngineTest 81 @QueryEngineTest
79 void predicateTest(QueryEvaluationHint hint) { 82 void predicateTest(QueryEvaluationHint hint) {
80 var person = new Symbol<>("Person", 1, Boolean.class, false);
81 var age = new Symbol<>("age", 1, Integer.class, null);
82 var personView = new KeyOnlyView<>(person);
83 var ageView = new FunctionView<>(age);
84
85 var subQuery = Dnf.of("SubQuery", builder -> { 83 var subQuery = Dnf.of("SubQuery", builder -> {
86 var p1 = builder.parameter("p1"); 84 var p1 = builder.parameter("p1");
87 var x = builder.parameter("x", Integer.class); 85 var x = builder.parameter("x", Integer.class);
@@ -125,11 +123,6 @@ class FunctionalQueryTest {
125 123
126 @QueryEngineTest 124 @QueryEngineTest
127 void computationTest(QueryEvaluationHint hint) { 125 void computationTest(QueryEvaluationHint hint) {
128 var person = new Symbol<>("Person", 1, Boolean.class, false);
129 var age = new Symbol<>("age", 1, Integer.class, null);
130 var personView = new KeyOnlyView<>(person);
131 var ageView = new FunctionView<>(age);
132
133 var query = Query.of("Computation", Integer.class, (builder, p1, output) -> builder.clause(() -> { 126 var query = Query.of("Computation", Integer.class, (builder, p1, output) -> builder.clause(() -> {
134 var x = Variable.of("x", Integer.class); 127 var x = Variable.of("x", Integer.class);
135 return List.of( 128 return List.of(
@@ -168,11 +161,6 @@ class FunctionalQueryTest {
168 161
169 @QueryEngineTest 162 @QueryEngineTest
170 void inputKeyCountTest(QueryEvaluationHint hint) { 163 void inputKeyCountTest(QueryEvaluationHint hint) {
171 var person = new Symbol<>("Person", 1, Boolean.class, false);
172 var friend = new Symbol<>("friend", 2, TruthValue.class, TruthValue.FALSE);
173 var personView = new KeyOnlyView<>(person);
174 var friendMustView = new FilteredView<>(friend, "must", TruthValue::must);
175
176 var query = Query.of("Count", Integer.class, (builder, p1, output) -> builder.clause( 164 var query = Query.of("Count", Integer.class, (builder, p1, output) -> builder.clause(
177 personView.call(p1), 165 personView.call(p1),
178 output.assign(friendMustView.count(p1, Variable.of())) 166 output.assign(friendMustView.count(p1, Variable.of()))
@@ -210,11 +198,6 @@ class FunctionalQueryTest {
210 198
211 @QueryEngineTest 199 @QueryEngineTest
212 void predicateCountTest(QueryEvaluationHint hint) { 200 void predicateCountTest(QueryEvaluationHint hint) {
213 var person = new Symbol<>("Person", 1, Boolean.class, false);
214 var friend = new Symbol<>("friend", 2, TruthValue.class, TruthValue.FALSE);
215 var personView = new KeyOnlyView<>(person);
216 var friendMustView = new FilteredView<>(friend, "must", TruthValue::must);
217
218 var subQuery = Dnf.of("SubQuery", builder -> { 201 var subQuery = Dnf.of("SubQuery", builder -> {
219 var p1 = builder.parameter("p1"); 202 var p1 = builder.parameter("p1");
220 var p2 = builder.parameter("p2"); 203 var p2 = builder.parameter("p2");
@@ -261,9 +244,6 @@ class FunctionalQueryTest {
261 244
262 @QueryEngineTest 245 @QueryEngineTest
263 void inputKeyAggregationTest(QueryEvaluationHint hint) { 246 void inputKeyAggregationTest(QueryEvaluationHint hint) {
264 var age = new Symbol<>("age", 1, Integer.class, null);
265 var ageView = new FunctionView<>(age);
266
267 var query = Query.of("Aggregate", Integer.class, (builder, output) -> builder.clause(Integer.class, 247 var query = Query.of("Aggregate", Integer.class, (builder, output) -> builder.clause(Integer.class,
268 (y) -> List.of(output.assign(ageView.aggregate(y, INT_SUM, Variable.of(), y))))); 248 (y) -> List.of(output.assign(ageView.aggregate(y, INT_SUM, Variable.of(), y)))));
269 249
@@ -288,11 +268,6 @@ class FunctionalQueryTest {
288 268
289 @QueryEngineTest 269 @QueryEngineTest
290 void predicateAggregationTest(QueryEvaluationHint hint) { 270 void predicateAggregationTest(QueryEvaluationHint hint) {
291 var person = new Symbol<>("Person", 1, Boolean.class, false);
292 var age = new Symbol<>("age", 1, Integer.class, null);
293 var personView = new KeyOnlyView<>(person);
294 var ageView = new FunctionView<>(age);
295
296 var subQuery = Dnf.of("SubQuery", builder -> { 271 var subQuery = Dnf.of("SubQuery", builder -> {
297 var p1 = builder.parameter("p1"); 272 var p1 = builder.parameter("p1");
298 var x = builder.parameter("x", Integer.class); 273 var x = builder.parameter("x", Integer.class);
@@ -329,11 +304,6 @@ class FunctionalQueryTest {
329 304
330 @QueryEngineTest 305 @QueryEngineTest
331 void extremeValueTest(QueryEvaluationHint hint) { 306 void extremeValueTest(QueryEvaluationHint hint) {
332 var person = new Symbol<>("Person", 1, Boolean.class, false);
333 var friend = new Symbol<>("friend", 2, TruthValue.class, TruthValue.FALSE);
334 var personView = new KeyOnlyView<>(person);
335 var friendMustView = new FilteredView<>(friend, "must", TruthValue::must);
336
337 var subQuery = Dnf.of("SubQuery", builder -> { 307 var subQuery = Dnf.of("SubQuery", builder -> {
338 var p1 = builder.parameter("p1"); 308 var p1 = builder.parameter("p1");
339 var x = builder.parameter("x", Integer.class); 309 var x = builder.parameter("x", Integer.class);
@@ -394,11 +364,6 @@ class FunctionalQueryTest {
394 364
395 @QueryEngineTest 365 @QueryEngineTest
396 void invalidComputationTest(QueryEvaluationHint hint) { 366 void invalidComputationTest(QueryEvaluationHint hint) {
397 var person = new Symbol<>("Person", 1, Boolean.class, false);
398 var age = new Symbol<>("age", 1, Integer.class, null);
399 var personView = new KeyOnlyView<>(person);
400 var ageView = new FunctionView<>(age);
401
402 var query = Query.of("InvalidComputation", Integer.class, 367 var query = Query.of("InvalidComputation", Integer.class,
403 (builder, p1, output) -> builder.clause(Integer.class, (x) -> List.of( 368 (builder, p1, output) -> builder.clause(Integer.class, (x) -> List.of(
404 personView.call(p1), 369 personView.call(p1),
@@ -435,11 +400,6 @@ class FunctionalQueryTest {
435 400
436 @QueryEngineTest 401 @QueryEngineTest
437 void invalidAssumeTest(QueryEvaluationHint hint) { 402 void invalidAssumeTest(QueryEvaluationHint hint) {
438 var person = new Symbol<>("Person", 1, Boolean.class, false);
439 var age = new Symbol<>("age", 1, Integer.class, null);
440 var personView = new KeyOnlyView<>(person);
441 var ageView = new FunctionView<>(age);
442
443 var query = Query.of("InvalidAssume", (builder, p1) -> builder.clause(Integer.class, (x) -> List.of( 403 var query = Query.of("InvalidAssume", (builder, p1) -> builder.clause(Integer.class, (x) -> List.of(
444 personView.call(p1), 404 personView.call(p1),
445 ageView.call(p1, x), 405 ageView.call(p1, x),
@@ -478,13 +438,6 @@ class FunctionalQueryTest {
478 438
479 @QueryEngineTest 439 @QueryEngineTest
480 void notFunctionalTest(QueryEvaluationHint hint) { 440 void notFunctionalTest(QueryEvaluationHint hint) {
481 var person = new Symbol<>("Person", 1, Boolean.class, false);
482 var age = new Symbol<>("age", 1, Integer.class, null);
483 var friend = new Symbol<>("friend", 2, TruthValue.class, TruthValue.FALSE);
484 var personView = new KeyOnlyView<>(person);
485 var ageView = new FunctionView<>(age);
486 var friendMustView = new FilteredView<>(friend, "must", TruthValue::must);
487
488 var query = Query.of("NotFunctional", Integer.class, (builder, p1, output) -> builder.clause((p2) -> List.of( 441 var query = Query.of("NotFunctional", Integer.class, (builder, p1, output) -> builder.clause((p2) -> List.of(
489 personView.call(p1), 442 personView.call(p1),
490 friendMustView.call(p1, p2), 443 friendMustView.call(p1, p2),
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 a9a2f71c..de0e6da1 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
@@ -13,6 +13,7 @@ import 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;
15import tools.refinery.store.query.viatra.tests.QueryEngineTest; 15import tools.refinery.store.query.viatra.tests.QueryEngineTest;
16import tools.refinery.store.query.view.AnySymbolView;
16import tools.refinery.store.query.view.FilteredView; 17import tools.refinery.store.query.view.FilteredView;
17import tools.refinery.store.query.view.FunctionView; 18import tools.refinery.store.query.view.FunctionView;
18import tools.refinery.store.query.view.KeyOnlyView; 19import tools.refinery.store.query.view.KeyOnlyView;
@@ -30,11 +31,14 @@ import static tools.refinery.store.query.term.int_.IntTerms.greaterEq;
30import static tools.refinery.store.query.viatra.tests.QueryAssertions.assertResults; 31import static tools.refinery.store.query.viatra.tests.QueryAssertions.assertResults;
31 32
32class QueryTest { 33class QueryTest {
34 private static final Symbol<Boolean> person = Symbol.of("Person", 1);
35 private static final Symbol<TruthValue> friend = Symbol.of("friend", 2, TruthValue.class, TruthValue.FALSE);
36 private static final AnySymbolView personView = new KeyOnlyView<>(person);
37 private static final AnySymbolView friendMustView = new FilteredView<>(friend, "must", TruthValue::must);
38
33 @QueryEngineTest 39 @QueryEngineTest
34 void typeConstraintTest(QueryEvaluationHint hint) { 40 void typeConstraintTest(QueryEvaluationHint hint) {
35 var person = new Symbol<>("Person", 1, Boolean.class, false); 41 var asset = Symbol.of("Asset", 1);
36 var asset = new Symbol<>("Asset", 1, Boolean.class, false);
37 var personView = new KeyOnlyView<>(person);
38 42
39 var predicate = Query.of("TypeConstraint", (builder, p1) -> builder.clause(personView.call(p1))); 43 var predicate = Query.of("TypeConstraint", (builder, p1) -> builder.clause(personView.call(p1)));
40 44
@@ -67,11 +71,6 @@ class QueryTest {
67 71
68 @QueryEngineTest 72 @QueryEngineTest
69 void relationConstraintTest(QueryEvaluationHint hint) { 73 void relationConstraintTest(QueryEvaluationHint hint) {
70 var person = new Symbol<>("Person", 1, Boolean.class, false);
71 var friend = new Symbol<>("friend", 2, TruthValue.class, TruthValue.FALSE);
72 var personView = new KeyOnlyView<>(person);
73 var friendMustView = new FilteredView<>(friend, "must", TruthValue::must);
74
75 var predicate = Query.of("RelationConstraint", (builder, p1, p2) -> builder.clause( 74 var predicate = Query.of("RelationConstraint", (builder, p1, p2) -> builder.clause(
76 personView.call(p1), 75 personView.call(p1),
77 personView.call(p2), 76 personView.call(p2),
@@ -111,11 +110,6 @@ class QueryTest {
111 110
112 @QueryEngineTest 111 @QueryEngineTest
113 void existTest(QueryEvaluationHint hint) { 112 void existTest(QueryEvaluationHint hint) {
114 var person = new Symbol<>("Person", 1, Boolean.class, false);
115 var friend = new Symbol<>("friend", 2, TruthValue.class, TruthValue.FALSE);
116 var personView = new KeyOnlyView<>(person);
117 var friendMustView = new FilteredView<>(friend, "must", TruthValue::must);
118
119 var predicate = Query.of("Exists", (builder, p1) -> builder.clause((p2) -> List.of( 113 var predicate = Query.of("Exists", (builder, p1) -> builder.clause((p2) -> List.of(
120 personView.call(p1), 114 personView.call(p1),
121 personView.call(p2), 115 personView.call(p2),
@@ -155,12 +149,8 @@ class QueryTest {
155 149
156 @QueryEngineTest 150 @QueryEngineTest
157 void orTest(QueryEvaluationHint hint) { 151 void orTest(QueryEvaluationHint hint) {
158 var person = new Symbol<>("Person", 1, Boolean.class, false); 152 var animal = Symbol.of("Animal", 1);
159 var animal = new Symbol<>("Animal", 1, Boolean.class, false);
160 var friend = new Symbol<>("friend", 2, TruthValue.class, TruthValue.FALSE);
161 var personView = new KeyOnlyView<>(person);
162 var animalView = new KeyOnlyView<>(animal); 153 var animalView = new KeyOnlyView<>(animal);
163 var friendMustView = new FilteredView<>(friend, "must", TruthValue::must);
164 154
165 var predicate = Query.of("Or", (builder, p1, p2) -> builder.clause( 155 var predicate = Query.of("Or", (builder, p1, p2) -> builder.clause(
166 personView.call(p1), 156 personView.call(p1),
@@ -209,9 +199,6 @@ class QueryTest {
209 199
210 @QueryEngineTest 200 @QueryEngineTest
211 void equalityTest(QueryEvaluationHint hint) { 201 void equalityTest(QueryEvaluationHint hint) {
212 var person = new Symbol<>("Person", 1, Boolean.class, false);
213 var personView = new KeyOnlyView<>(person);
214
215 var predicate = Query.of("Equality", (builder, p1, p2) -> builder.clause( 202 var predicate = Query.of("Equality", (builder, p1, p2) -> builder.clause(
216 personView.call(p1), 203 personView.call(p1),
217 personView.call(p2), 204 personView.call(p2),
@@ -246,11 +233,6 @@ class QueryTest {
246 233
247 @QueryEngineTest 234 @QueryEngineTest
248 void inequalityTest(QueryEvaluationHint hint) { 235 void inequalityTest(QueryEvaluationHint hint) {
249 var person = new Symbol<>("Person", 1, Boolean.class, false);
250 var friend = new Symbol<>("friend", 2, TruthValue.class, TruthValue.FALSE);
251 var personView = new KeyOnlyView<>(person);
252 var friendMustView = new FilteredView<>(friend, "must", TruthValue::must);
253
254 var predicate = Query.of("Inequality", (builder, p1, p2, p3) -> builder.clause( 236 var predicate = Query.of("Inequality", (builder, p1, p2, p3) -> builder.clause(
255 personView.call(p1), 237 personView.call(p1),
256 personView.call(p2), 238 personView.call(p2),
@@ -289,11 +271,6 @@ class QueryTest {
289 271
290 @QueryEngineTest 272 @QueryEngineTest
291 void patternCallTest(QueryEvaluationHint hint) { 273 void patternCallTest(QueryEvaluationHint hint) {
292 var person = new Symbol<>("Person", 1, Boolean.class, false);
293 var friend = new Symbol<>("friend", 2, TruthValue.class, TruthValue.FALSE);
294 var personView = new KeyOnlyView<>(person);
295 var friendMustView = new FilteredView<>(friend, "must", TruthValue::must);
296
297 var friendPredicate = Dnf.of("Friend", builder -> { 274 var friendPredicate = Dnf.of("Friend", builder -> {
298 var p1 = builder.parameter("p1"); 275 var p1 = builder.parameter("p1");
299 var p2 = builder.parameter("p2"); 276 var p2 = builder.parameter("p2");
@@ -341,11 +318,6 @@ class QueryTest {
341 318
342 @QueryEngineTest 319 @QueryEngineTest
343 void negativeRelationViewTest(QueryEvaluationHint hint) { 320 void negativeRelationViewTest(QueryEvaluationHint hint) {
344 var person = new Symbol<>("Person", 1, Boolean.class, false);
345 var friend = new Symbol<>("friend", 2, TruthValue.class, TruthValue.FALSE);
346 var personView = new KeyOnlyView<>(person);
347 var friendMustView = new FilteredView<>(friend, "must", TruthValue::must);
348
349 var predicate = Query.of("NegativePatternCall", (builder, p1, p2) -> builder.clause( 321 var predicate = Query.of("NegativePatternCall", (builder, p1, p2) -> builder.clause(
350 personView.call(p1), 322 personView.call(p1),
351 personView.call(p2), 323 personView.call(p2),
@@ -390,11 +362,6 @@ class QueryTest {
390 362
391 @QueryEngineTest 363 @QueryEngineTest
392 void negativePatternCallTest(QueryEvaluationHint hint) { 364 void negativePatternCallTest(QueryEvaluationHint hint) {
393 var person = new Symbol<>("Person", 1, Boolean.class, false);
394 var friend = new Symbol<>("friend", 2, TruthValue.class, TruthValue.FALSE);
395 var personView = new KeyOnlyView<>(person);
396 var friendMustView = new FilteredView<>(friend, "must", TruthValue::must);
397
398 var friendPredicate = Dnf.of("Friend", builder -> { 365 var friendPredicate = Dnf.of("Friend", builder -> {
399 var p1 = builder.parameter("p1"); 366 var p1 = builder.parameter("p1");
400 var p2 = builder.parameter("p2"); 367 var p2 = builder.parameter("p2");
@@ -448,11 +415,6 @@ class QueryTest {
448 415
449 @QueryEngineTest 416 @QueryEngineTest
450 void negativeRelationViewWithQuantificationTest(QueryEvaluationHint hint) { 417 void negativeRelationViewWithQuantificationTest(QueryEvaluationHint hint) {
451 var person = new Symbol<>("Person", 1, Boolean.class, false);
452 var friend = new Symbol<>("friend", 2, TruthValue.class, TruthValue.FALSE);
453 var personView = new KeyOnlyView<>(person);
454 var friendMustView = new FilteredView<>(friend, "must", TruthValue::must);
455
456 var predicate = Query.of("Negative", (builder, p1) -> builder.clause( 418 var predicate = Query.of("Negative", (builder, p1) -> builder.clause(
457 personView.call(p1), 419 personView.call(p1),
458 not(friendMustView.call(p1, Variable.of())) 420 not(friendMustView.call(p1, Variable.of()))
@@ -489,11 +451,6 @@ class QueryTest {
489 451
490 @QueryEngineTest 452 @QueryEngineTest
491 void negativeWithQuantificationTest(QueryEvaluationHint hint) { 453 void negativeWithQuantificationTest(QueryEvaluationHint hint) {
492 var person = new Symbol<>("Person", 1, Boolean.class, false);
493 var friend = new Symbol<>("friend", 2, TruthValue.class, TruthValue.FALSE);
494 var personView = new KeyOnlyView<>(person);
495 var friendMustView = new FilteredView<>(friend, "must", TruthValue::must);
496
497 var called = Dnf.of("Called", builder -> { 454 var called = Dnf.of("Called", builder -> {
498 var p1 = builder.parameter("p1"); 455 var p1 = builder.parameter("p1");
499 var p2 = builder.parameter("p2"); 456 var p2 = builder.parameter("p2");
@@ -539,11 +496,6 @@ class QueryTest {
539 496
540 @QueryEngineTest 497 @QueryEngineTest
541 void transitiveRelationViewTest(QueryEvaluationHint hint) { 498 void transitiveRelationViewTest(QueryEvaluationHint hint) {
542 var person = new Symbol<>("Person", 1, Boolean.class, false);
543 var friend = new Symbol<>("friend", 2, TruthValue.class, TruthValue.FALSE);
544 var personView = new KeyOnlyView<>(person);
545 var friendMustView = new FilteredView<>(friend, "must", TruthValue::must);
546
547 var predicate = Query.of("Transitive", (builder, p1, p2) -> builder.clause( 499 var predicate = Query.of("Transitive", (builder, p1, p2) -> builder.clause(
548 personView.call(p1), 500 personView.call(p1),
549 personView.call(p2), 501 personView.call(p2),
@@ -587,11 +539,6 @@ class QueryTest {
587 539
588 @QueryEngineTest 540 @QueryEngineTest
589 void transitivePatternCallTest(QueryEvaluationHint hint) { 541 void transitivePatternCallTest(QueryEvaluationHint hint) {
590 var person = new Symbol<>("Person", 1, Boolean.class, false);
591 var friend = new Symbol<>("friend", 2, TruthValue.class, TruthValue.FALSE);
592 var personView = new KeyOnlyView<>(person);
593 var friendMustView = new FilteredView<>(friend, "must", TruthValue::must);
594
595 var called = Dnf.of("Called", builder -> { 542 var called = Dnf.of("Called", builder -> {
596 var p1 = builder.parameter("p1"); 543 var p1 = builder.parameter("p1");
597 var p2 = builder.parameter("p2"); 544 var p2 = builder.parameter("p2");
@@ -644,9 +591,7 @@ class QueryTest {
644 591
645 @QueryEngineTest 592 @QueryEngineTest
646 void assumeTest(QueryEvaluationHint hint) { 593 void assumeTest(QueryEvaluationHint hint) {
647 var person = new Symbol<>("Person", 1, Boolean.class, false); 594 var age = Symbol.of("age", 1, Integer.class);
648 var age = new Symbol<>("age", 1, Integer.class, null);
649 var personView = new KeyOnlyView<>(person);
650 var ageView = new FunctionView<>(age); 595 var ageView = new FunctionView<>(age);
651 596
652 var query = Query.of("Constraint", (builder, p1) -> builder.clause(Integer.class, (x) -> List.of( 597 var query = Query.of("Constraint", (builder, p1) -> builder.clause(Integer.class, (x) -> List.of(
@@ -684,8 +629,6 @@ class QueryTest {
684 629
685 @Test 630 @Test
686 void alwaysFalseTest() { 631 void alwaysFalseTest() {
687 var person = new Symbol<>("Person", 1, Boolean.class, false);
688
689 var predicate = Query.of("AlwaysFalse", builder -> builder.parameter("p1")); 632 var predicate = Query.of("AlwaysFalse", builder -> builder.parameter("p1"));
690 633
691 var store = ModelStore.builder() 634 var store = ModelStore.builder()
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 6860ece9..66f043c6 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
@@ -11,6 +11,8 @@ import org.junit.jupiter.api.Test;
11import tools.refinery.store.model.ModelStore; 11import tools.refinery.store.model.ModelStore;
12import tools.refinery.store.query.ModelQueryAdapter; 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.dnf.RelationalQuery;
15import tools.refinery.store.query.view.AnySymbolView;
14import tools.refinery.store.query.view.FilteredView; 16import tools.refinery.store.query.view.FilteredView;
15import tools.refinery.store.query.view.FunctionView; 17import tools.refinery.store.query.view.FunctionView;
16import tools.refinery.store.query.view.KeyOnlyView; 18import tools.refinery.store.query.view.KeyOnlyView;
@@ -26,13 +28,15 @@ import static tools.refinery.store.query.viatra.tests.QueryAssertions.assertNull
26import static tools.refinery.store.query.viatra.tests.QueryAssertions.assertResults; 28import static tools.refinery.store.query.viatra.tests.QueryAssertions.assertResults;
27 29
28class QueryTransactionTest { 30class QueryTransactionTest {
31 private static final Symbol<Boolean> person = Symbol.of("Person", 1);
32 private static final Symbol<Integer> age = Symbol.of("age", 1, Integer.class);
33 private static final AnySymbolView personView = new KeyOnlyView<>(person);
34 private static final AnySymbolView ageView = new FunctionView<>(age);
35 private static final RelationalQuery predicate = Query.of("TypeConstraint", (builder, p1) ->
36 builder.clause(personView.call(p1)));
37
29 @Test 38 @Test
30 void flushTest() { 39 void flushTest() {
31 var person = new Symbol<>("Person", 1, Boolean.class, false);
32 var personView = new KeyOnlyView<>(person);
33
34 var predicate = Query.of("TypeConstraint", (builder, p1) -> builder.clause(personView.call(p1)));
35
36 var store = ModelStore.builder() 40 var store = ModelStore.builder()
37 .symbols(person) 41 .symbols(person)
38 .with(ViatraModelQueryAdapter.builder() 42 .with(ViatraModelQueryAdapter.builder()
@@ -95,11 +99,6 @@ class QueryTransactionTest {
95 99
96 @Test 100 @Test
97 void localSearchTest() { 101 void localSearchTest() {
98 var person = new Symbol<>("Person", 1, Boolean.class, false);
99 var personView = new KeyOnlyView<>(person);
100
101 var predicate = Query.of("TypeConstraint", (builder, p1) -> builder.clause(personView.call(p1)));
102
103 var store = ModelStore.builder() 102 var store = ModelStore.builder()
104 .symbols(person) 103 .symbols(person)
105 .with(ViatraModelQueryAdapter.builder() 104 .with(ViatraModelQueryAdapter.builder()
@@ -145,11 +144,7 @@ class QueryTransactionTest {
145 144
146 @Test 145 @Test
147 void unrelatedChangesTest() { 146 void unrelatedChangesTest() {
148 var person = new Symbol<>("Person", 1, Boolean.class, false); 147 var asset = Symbol.of("Asset", 1);
149 var asset = new Symbol<>("Asset", 1, Boolean.class, false);
150 var personView = new KeyOnlyView<>(person);
151
152 var predicate = Query.of("TypeConstraint", (builder, p1) -> builder.clause(personView.call(p1)));
153 148
154 var store = ModelStore.builder() 149 var store = ModelStore.builder()
155 .symbols(person, asset) 150 .symbols(person, asset)
@@ -214,11 +209,6 @@ class QueryTransactionTest {
214 209
215 @Test 210 @Test
216 void tupleChangingChangeTest() { 211 void tupleChangingChangeTest() {
217 var person = new Symbol<>("Person", 1, Boolean.class, false);
218 var age = new Symbol<>("age", 1, Integer.class, null);
219 var personView = new KeyOnlyView<>(person);
220 var ageView = new FunctionView<>(age);
221
222 var query = Query.of("TypeConstraint", Integer.class, (builder, p1, output) -> builder.clause( 212 var query = Query.of("TypeConstraint", Integer.class, (builder, p1, output) -> builder.clause(
223 personView.call(p1), 213 personView.call(p1),
224 ageView.call(p1, output) 214 ageView.call(p1, output)
@@ -256,9 +246,6 @@ class QueryTransactionTest {
256 246
257 @Test 247 @Test
258 void tuplePreservingUnchangedTest() { 248 void tuplePreservingUnchangedTest() {
259 var person = new Symbol<>("Person", 1, Boolean.class, false);
260 var age = new Symbol<>("age", 1, Integer.class, null);
261 var personView = new KeyOnlyView<>(person);
262 var adultView = new FilteredView<>(age, "adult", n -> n != null && n >= 18); 249 var adultView = new FilteredView<>(age, "adult", n -> n != null && n >= 18);
263 250
264 var query = Query.of("TypeConstraint", (builder, p1) -> builder.clause( 251 var query = Query.of("TypeConstraint", (builder, p1) -> builder.clause(
@@ -299,11 +286,6 @@ class QueryTransactionTest {
299 @Disabled("TODO Fix DiffCursor") 286 @Disabled("TODO Fix DiffCursor")
300 @Test 287 @Test
301 void commitAfterFlushTest() { 288 void commitAfterFlushTest() {
302 var person = new Symbol<>("Person", 1, Boolean.class, false);
303 var personView = new KeyOnlyView<>(person);
304
305 var predicate = Query.of("TypeConstraint", (builder, p1) -> builder.clause(personView.call(p1)));
306
307 var store = ModelStore.builder() 289 var store = ModelStore.builder()
308 .symbols(person) 290 .symbols(person)
309 .with(ViatraModelQueryAdapter.builder() 291 .with(ViatraModelQueryAdapter.builder()
@@ -353,11 +335,6 @@ class QueryTransactionTest {
353 @Disabled("TODO Fix DiffCursor") 335 @Disabled("TODO Fix DiffCursor")
354 @Test 336 @Test
355 void commitWithoutFlushTest() { 337 void commitWithoutFlushTest() {
356 var person = new Symbol<>("Person", 1, Boolean.class, false);
357 var personView = new KeyOnlyView<>(person);
358
359 var predicate = Query.of("TypeConstraint", (builder, p1) -> builder.clause(personView.call(p1)));
360
361 var store = ModelStore.builder() 338 var store = ModelStore.builder()
362 .symbols(person) 339 .symbols(person)
363 .with(ViatraModelQueryAdapter.builder() 340 .with(ViatraModelQueryAdapter.builder()
diff --git a/subprojects/store-query/src/test/java/tools/refinery/store/query/dnf/DnfBuilderLiteralEliminationTest.java b/subprojects/store-query/src/test/java/tools/refinery/store/query/dnf/DnfBuilderLiteralEliminationTest.java
index 687b06db..e17496e3 100644
--- a/subprojects/store-query/src/test/java/tools/refinery/store/query/dnf/DnfBuilderLiteralEliminationTest.java
+++ b/subprojects/store-query/src/test/java/tools/refinery/store/query/dnf/DnfBuilderLiteralEliminationTest.java
@@ -25,7 +25,7 @@ import static tools.refinery.store.query.literal.Literals.not;
25import static tools.refinery.store.query.tests.QueryMatchers.structurallyEqualTo; 25import static tools.refinery.store.query.tests.QueryMatchers.structurallyEqualTo;
26 26
27class DnfBuilderLiteralEliminationTest { 27class DnfBuilderLiteralEliminationTest {
28 private final Symbol<Boolean> friend = new Symbol<>("friend", 2, Boolean.class, false); 28 private final Symbol<Boolean> friend = Symbol.of("friend", 2);
29 private final SymbolView<Boolean> friendView = new KeyOnlyView<>(friend); 29 private final SymbolView<Boolean> friendView = new KeyOnlyView<>(friend);
30 private final NodeVariable p = Variable.of("p"); 30 private final NodeVariable p = Variable.of("p");
31 private final NodeVariable q = Variable.of("q"); 31 private final NodeVariable q = Variable.of("q");
diff --git a/subprojects/store-query/src/test/java/tools/refinery/store/query/dnf/DnfBuilderVariableUnificationTest.java b/subprojects/store-query/src/test/java/tools/refinery/store/query/dnf/DnfBuilderVariableUnificationTest.java
index 4a85fe32..fc40c7b3 100644
--- a/subprojects/store-query/src/test/java/tools/refinery/store/query/dnf/DnfBuilderVariableUnificationTest.java
+++ b/subprojects/store-query/src/test/java/tools/refinery/store/query/dnf/DnfBuilderVariableUnificationTest.java
@@ -18,8 +18,8 @@ import static org.hamcrest.MatcherAssert.assertThat;
18import static tools.refinery.store.query.tests.QueryMatchers.structurallyEqualTo; 18import static tools.refinery.store.query.tests.QueryMatchers.structurallyEqualTo;
19 19
20class DnfBuilderVariableUnificationTest { 20class DnfBuilderVariableUnificationTest {
21 private final Symbol<Boolean> friend = new Symbol<>("friend", 2, Boolean.class, false); 21 private final Symbol<Boolean> friend = Symbol.of("friend", 2);
22 private final Symbol<Boolean> children = new Symbol<>("children", 2, Boolean.class, false); 22 private final Symbol<Boolean> children = Symbol.of("children", 2);
23 private final SymbolView<Boolean> friendView = new KeyOnlyView<>(friend); 23 private final SymbolView<Boolean> friendView = new KeyOnlyView<>(friend);
24 private final SymbolView<Boolean> childrenView = new KeyOnlyView<>(children); 24 private final SymbolView<Boolean> childrenView = new KeyOnlyView<>(children);
25 25
diff --git a/subprojects/store-query/src/test/java/tools/refinery/store/query/dnf/DnfToDefinitionStringTest.java b/subprojects/store-query/src/test/java/tools/refinery/store/query/dnf/DnfToDefinitionStringTest.java
index 63310a78..d75d7f17 100644
--- a/subprojects/store-query/src/test/java/tools/refinery/store/query/dnf/DnfToDefinitionStringTest.java
+++ b/subprojects/store-query/src/test/java/tools/refinery/store/query/dnf/DnfToDefinitionStringTest.java
@@ -6,8 +6,10 @@
6package tools.refinery.store.query.dnf; 6package tools.refinery.store.query.dnf;
7 7
8import org.junit.jupiter.api.Test; 8import org.junit.jupiter.api.Test;
9import tools.refinery.store.query.term.NodeVariable;
9import tools.refinery.store.query.term.ParameterDirection; 10import tools.refinery.store.query.term.ParameterDirection;
10import tools.refinery.store.query.term.Variable; 11import tools.refinery.store.query.term.Variable;
12import tools.refinery.store.query.view.AnySymbolView;
11import tools.refinery.store.query.view.KeyOnlyView; 13import tools.refinery.store.query.view.KeyOnlyView;
12import tools.refinery.store.representation.Symbol; 14import tools.refinery.store.representation.Symbol;
13 15
@@ -16,9 +18,15 @@ import static org.hamcrest.Matchers.is;
16import static tools.refinery.store.query.literal.Literals.not; 18import static tools.refinery.store.query.literal.Literals.not;
17 19
18class DnfToDefinitionStringTest { 20class DnfToDefinitionStringTest {
21 private static final Symbol<Boolean> person = Symbol.of("person", 1);
22 private static final Symbol<Boolean> friend = Symbol.of("friend", 2);
23 private static final AnySymbolView personView = new KeyOnlyView<>(person);
24 private static final AnySymbolView friendView = new KeyOnlyView<>(friend);
25 private static final NodeVariable p = Variable.of("p");
26 private static final NodeVariable q = Variable.of("q");
27
19 @Test 28 @Test
20 void noClausesTest() { 29 void noClausesTest() {
21 var p = Variable.of("p");
22 var dnf = Dnf.builder("Example").parameter(p).build(); 30 var dnf = Dnf.builder("Example").parameter(p).build();
23 31
24 assertThat(dnf.toDefinitionString(), is(""" 32 assertThat(dnf.toDefinitionString(), is("""
@@ -39,7 +47,6 @@ class DnfToDefinitionStringTest {
39 47
40 @Test 48 @Test
41 void emptyClauseTest() { 49 void emptyClauseTest() {
42 var p = Variable.of("p");
43 var dnf = Dnf.builder("Example").parameter(p, ParameterDirection.IN).clause().build(); 50 var dnf = Dnf.builder("Example").parameter(p, ParameterDirection.IN).clause().build();
44 51
45 assertThat(dnf.toDefinitionString(), is(""" 52 assertThat(dnf.toDefinitionString(), is("""
@@ -50,10 +57,6 @@ class DnfToDefinitionStringTest {
50 57
51 @Test 58 @Test
52 void relationViewPositiveTest() { 59 void relationViewPositiveTest() {
53 var p = Variable.of("p");
54 var q = Variable.of("q");
55 var friend = new Symbol<>("friend", 2, Boolean.class, false);
56 var friendView = new KeyOnlyView<>(friend);
57 var dnf = Dnf.builder("Example").parameter(p).clause(friendView.call(p, q)).build(); 60 var dnf = Dnf.builder("Example").parameter(p).clause(friendView.call(p, q)).build();
58 61
59 assertThat(dnf.toDefinitionString(), is(""" 62 assertThat(dnf.toDefinitionString(), is("""
@@ -64,10 +67,6 @@ class DnfToDefinitionStringTest {
64 67
65 @Test 68 @Test
66 void relationViewNegativeTest() { 69 void relationViewNegativeTest() {
67 var p = Variable.of("p");
68 var q = Variable.of("q");
69 var friend = new Symbol<>("friend", 2, Boolean.class, false);
70 var friendView = new KeyOnlyView<>(friend);
71 var dnf = Dnf.builder("Example") 70 var dnf = Dnf.builder("Example")
72 .parameter(p, ParameterDirection.IN) 71 .parameter(p, ParameterDirection.IN)
73 .clause(not(friendView.call(p, q))) 72 .clause(not(friendView.call(p, q)))
@@ -81,10 +80,6 @@ class DnfToDefinitionStringTest {
81 80
82 @Test 81 @Test
83 void relationViewTransitiveTest() { 82 void relationViewTransitiveTest() {
84 var p = Variable.of("p");
85 var q = Variable.of("q");
86 var friend = new Symbol<>("friend", 2, Boolean.class, false);
87 var friendView = new KeyOnlyView<>(friend);
88 var dnf = Dnf.builder("Example").parameter(p).clause(friendView.callTransitive(p, q)).build(); 83 var dnf = Dnf.builder("Example").parameter(p).clause(friendView.callTransitive(p, q)).build();
89 84
90 assertThat(dnf.toDefinitionString(), is(""" 85 assertThat(dnf.toDefinitionString(), is("""
@@ -95,10 +90,6 @@ class DnfToDefinitionStringTest {
95 90
96 @Test 91 @Test
97 void multipleParametersTest() { 92 void multipleParametersTest() {
98 var p = Variable.of("p");
99 var q = Variable.of("q");
100 var friend = new Symbol<>("friend", 2, Boolean.class, false);
101 var friendView = new KeyOnlyView<>(friend);
102 var dnf = Dnf.builder("Example").parameters(p, q).clause(friendView.call(p, q)).build(); 93 var dnf = Dnf.builder("Example").parameters(p, q).clause(friendView.call(p, q)).build();
103 94
104 assertThat(dnf.toDefinitionString(), is(""" 95 assertThat(dnf.toDefinitionString(), is("""
@@ -109,12 +100,6 @@ class DnfToDefinitionStringTest {
109 100
110 @Test 101 @Test
111 void multipleLiteralsTest() { 102 void multipleLiteralsTest() {
112 var p = Variable.of("p");
113 var q = Variable.of("q");
114 var person = new Symbol<>("person", 1, Boolean.class, false);
115 var personView = new KeyOnlyView<>(person);
116 var friend = new Symbol<>("friend", 2, Boolean.class, false);
117 var friendView = new KeyOnlyView<>(friend);
118 var dnf = Dnf.builder("Example") 103 var dnf = Dnf.builder("Example")
119 .parameter(p) 104 .parameter(p)
120 .clause( 105 .clause(
@@ -134,10 +119,6 @@ class DnfToDefinitionStringTest {
134 119
135 @Test 120 @Test
136 void multipleClausesTest() { 121 void multipleClausesTest() {
137 var p = Variable.of("p");
138 var q = Variable.of("q");
139 var friend = new Symbol<>("friend", 2, Boolean.class, false);
140 var friendView = new KeyOnlyView<>(friend);
141 var dnf = Dnf.builder("Example") 122 var dnf = Dnf.builder("Example")
142 .parameter(p) 123 .parameter(p)
143 .clause(friendView.call(p, q)) 124 .clause(friendView.call(p, q))
@@ -154,14 +135,8 @@ class DnfToDefinitionStringTest {
154 135
155 @Test 136 @Test
156 void dnfTest() { 137 void dnfTest() {
157 var p = Variable.of("p");
158 var q = Variable.of("q");
159 var r = Variable.of("r"); 138 var r = Variable.of("r");
160 var s = Variable.of("s"); 139 var s = Variable.of("s");
161 var person = new Symbol<>("person", 1, Boolean.class, false);
162 var personView = new KeyOnlyView<>(person);
163 var friend = new Symbol<>("friend", 2, Boolean.class, false);
164 var friendView = new KeyOnlyView<>(friend);
165 var called = Dnf.builder("Called").parameters(r, s).clause(friendView.call(r, s)).build(); 140 var called = Dnf.builder("Called").parameters(r, s).clause(friendView.call(r, s)).build();
166 var dnf = Dnf.builder("Example") 141 var dnf = Dnf.builder("Example")
167 .parameter(p) 142 .parameter(p)
diff --git a/subprojects/store-query/src/test/java/tools/refinery/store/query/dnf/TopologicalSortTest.java b/subprojects/store-query/src/test/java/tools/refinery/store/query/dnf/TopologicalSortTest.java
index 6d53f184..e22dbb21 100644
--- a/subprojects/store-query/src/test/java/tools/refinery/store/query/dnf/TopologicalSortTest.java
+++ b/subprojects/store-query/src/test/java/tools/refinery/store/query/dnf/TopologicalSortTest.java
@@ -21,7 +21,7 @@ import static tools.refinery.store.query.literal.Literals.not;
21import static tools.refinery.store.query.tests.QueryMatchers.structurallyEqualTo; 21import static tools.refinery.store.query.tests.QueryMatchers.structurallyEqualTo;
22 22
23class TopologicalSortTest { 23class TopologicalSortTest {
24 private static final Symbol<Boolean> friend = new Symbol<>("friend", 2, Boolean.class, false); 24 private static final Symbol<Boolean> friend = Symbol.of("friend", 2);
25 private static final AnySymbolView friendView = new KeyOnlyView<>(friend); 25 private static final AnySymbolView friendView = new KeyOnlyView<>(friend);
26 private static final Dnf example = Dnf.of("example", builder -> { 26 private static final Dnf example = Dnf.of("example", builder -> {
27 var a = builder.parameter("a", ParameterDirection.IN); 27 var a = builder.parameter("a", ParameterDirection.IN);
diff --git a/subprojects/store-query/src/test/java/tools/refinery/store/query/dnf/VariableDirectionTest.java b/subprojects/store-query/src/test/java/tools/refinery/store/query/dnf/VariableDirectionTest.java
index 0a44664e..3608d09e 100644
--- a/subprojects/store-query/src/test/java/tools/refinery/store/query/dnf/VariableDirectionTest.java
+++ b/subprojects/store-query/src/test/java/tools/refinery/store/query/dnf/VariableDirectionTest.java
@@ -33,9 +33,9 @@ import static tools.refinery.store.query.literal.Literals.not;
33import static tools.refinery.store.query.term.int_.IntTerms.*; 33import static tools.refinery.store.query.term.int_.IntTerms.*;
34 34
35class VariableDirectionTest { 35class VariableDirectionTest {
36 private static final Symbol<Boolean> person = new Symbol<>("Person", 1, Boolean.class, false); 36 private static final Symbol<Boolean> person = Symbol.of("Person", 1);
37 private static final Symbol<Boolean> friend = new Symbol<>("friend", 2, Boolean.class, false); 37 private static final Symbol<Boolean> friend = Symbol.of("friend", 2);
38 private static final Symbol<Integer> age = new Symbol<>("age", 1, Integer.class, null); 38 private static final Symbol<Integer> age = Symbol.of("age", 1, Integer.class);
39 private static final AnySymbolView personView = new KeyOnlyView<>(person); 39 private static final AnySymbolView personView = new KeyOnlyView<>(person);
40 private static final AnySymbolView friendView = new KeyOnlyView<>(friend); 40 private static final AnySymbolView friendView = new KeyOnlyView<>(friend);
41 private static final AnySymbolView ageView = new FunctionView<>(age); 41 private static final AnySymbolView ageView = new FunctionView<>(age);
diff --git a/subprojects/store-query/src/test/java/tools/refinery/store/query/tests/StructurallyEqualToRawTest.java b/subprojects/store-query/src/test/java/tools/refinery/store/query/tests/StructurallyEqualToRawTest.java
index 07a55ff3..d447e99c 100644
--- a/subprojects/store-query/src/test/java/tools/refinery/store/query/tests/StructurallyEqualToRawTest.java
+++ b/subprojects/store-query/src/test/java/tools/refinery/store/query/tests/StructurallyEqualToRawTest.java
@@ -8,8 +8,10 @@ package tools.refinery.store.query.tests;
8import org.junit.jupiter.api.Test; 8import org.junit.jupiter.api.Test;
9import tools.refinery.store.query.dnf.Dnf; 9import tools.refinery.store.query.dnf.Dnf;
10import tools.refinery.store.query.dnf.SymbolicParameter; 10import tools.refinery.store.query.dnf.SymbolicParameter;
11import tools.refinery.store.query.term.NodeVariable;
11import tools.refinery.store.query.term.ParameterDirection; 12import tools.refinery.store.query.term.ParameterDirection;
12import tools.refinery.store.query.term.Variable; 13import tools.refinery.store.query.term.Variable;
14import tools.refinery.store.query.view.AnySymbolView;
13import tools.refinery.store.query.view.KeyOnlyView; 15import tools.refinery.store.query.view.KeyOnlyView;
14import tools.refinery.store.representation.Symbol; 16import tools.refinery.store.representation.Symbol;
15 17
@@ -22,13 +24,15 @@ import static org.junit.jupiter.api.Assertions.assertThrows;
22import static tools.refinery.store.query.tests.QueryMatchers.structurallyEqualTo; 24import static tools.refinery.store.query.tests.QueryMatchers.structurallyEqualTo;
23 25
24class StructurallyEqualToRawTest { 26class StructurallyEqualToRawTest {
27 private static final Symbol<Boolean> person = Symbol.of("Person", 1);
28 private static final Symbol<Boolean> friend = Symbol.of("friend", 2);
29 private static final AnySymbolView personView = new KeyOnlyView<>(person);
30 private static final AnySymbolView friendView = new KeyOnlyView<>(friend);
31 private static final NodeVariable p = Variable.of("p");
32 private static final NodeVariable q = Variable.of("q");
33
25 @Test 34 @Test
26 void flatEqualsTest() { 35 void flatEqualsTest() {
27 var p = Variable.of("p");
28 var q = Variable.of("q");
29 var person = new Symbol<>("Person", 1, Boolean.class, false);
30 var personView = new KeyOnlyView<>(person);
31
32 var actual = Dnf.builder("Actual").parameters(p).clause(personView.call(p)).build(); 36 var actual = Dnf.builder("Actual").parameters(p).clause(personView.call(p)).build();
33 37
34 assertThat(actual, structurallyEqualTo( 38 assertThat(actual, structurallyEqualTo(
@@ -39,11 +43,6 @@ class StructurallyEqualToRawTest {
39 43
40 @Test 44 @Test
41 void flatNotEqualsTest() { 45 void flatNotEqualsTest() {
42 var p = Variable.of("p");
43 var q = Variable.of("q");
44 var friend = new Symbol<>("friend", 2, Boolean.class, false);
45 var friendView = new KeyOnlyView<>(friend);
46
47 var actual = Dnf.builder("Actual").parameters(p).clause(friendView.call(p, q)).build(); 46 var actual = Dnf.builder("Actual").parameters(p).clause(friendView.call(p, q)).build();
48 47
49 var assertion = structurallyEqualTo( 48 var assertion = structurallyEqualTo(
@@ -55,11 +54,6 @@ class StructurallyEqualToRawTest {
55 54
56 @Test 55 @Test
57 void deepEqualsTest() { 56 void deepEqualsTest() {
58 var p = Variable.of("p");
59 var q = Variable.of("q");
60 var person = new Symbol<>("Person", 1, Boolean.class, false);
61 var personView = new KeyOnlyView<>(person);
62
63 var actual = Dnf.builder("Actual").parameters(q).clause( 57 var actual = Dnf.builder("Actual").parameters(q).clause(
64 Dnf.builder("Actual2").parameters(p).clause(personView.call(p)).build().call(q) 58 Dnf.builder("Actual2").parameters(p).clause(personView.call(p)).build().call(q)
65 ).build(); 59 ).build();
@@ -76,11 +70,6 @@ class StructurallyEqualToRawTest {
76 70
77 @Test 71 @Test
78 void deepNotEqualsTest() { 72 void deepNotEqualsTest() {
79 var p = Variable.of("p");
80 var q = Variable.of("q");
81 var friend = new Symbol<>("friend", 2, Boolean.class, false);
82 var friendView = new KeyOnlyView<>(friend);
83
84 var actual = Dnf.builder("Actual").parameter(q).clause( 73 var actual = Dnf.builder("Actual").parameter(q).clause(
85 Dnf.builder("Actual2").parameters(p).clause(friendView.call(p, q)).build().call(q) 74 Dnf.builder("Actual2").parameters(p).clause(friendView.call(p, q)).build().call(q)
86 ).build(); 75 ).build();
@@ -103,11 +92,6 @@ class StructurallyEqualToRawTest {
103 92
104 @Test 93 @Test
105 void parameterListLengthMismatchTest() { 94 void parameterListLengthMismatchTest() {
106 var p = Variable.of("p");
107 var q = Variable.of("q");
108 var friend = new Symbol<>("friend", 2, Boolean.class, false);
109 var friendView = new KeyOnlyView<>(friend);
110
111 var actual = Dnf.builder("Actual").parameters(p, q).clause( 95 var actual = Dnf.builder("Actual").parameters(p, q).clause(
112 friendView.call(p, q) 96 friendView.call(p, q)
113 ).build(); 97 ).build();
@@ -122,10 +106,6 @@ class StructurallyEqualToRawTest {
122 106
123 @Test 107 @Test
124 void parameterDirectionMismatchTest() { 108 void parameterDirectionMismatchTest() {
125 var p = Variable.of("p");
126 var person = new Symbol<>("Person", 1, Boolean.class, false);
127 var personView = new KeyOnlyView<>(person);
128
129 var actual = Dnf.builder("Actual").parameter(p, ParameterDirection.IN).clause( 109 var actual = Dnf.builder("Actual").parameter(p, ParameterDirection.IN).clause(
130 personView.call(p) 110 personView.call(p)
131 ).build(); 111 ).build();
@@ -140,11 +120,6 @@ class StructurallyEqualToRawTest {
140 120
141 @Test 121 @Test
142 void clauseCountMismatchTest() { 122 void clauseCountMismatchTest() {
143 var p = Variable.of("p");
144 var q = Variable.of("q");
145 var friend = new Symbol<>("friend", 2, Boolean.class, false);
146 var friendView = new KeyOnlyView<>(friend);
147
148 var actual = Dnf.builder("Actual").parameters(p, q).clause( 123 var actual = Dnf.builder("Actual").parameters(p, q).clause(
149 friendView.call(p, q) 124 friendView.call(p, q)
150 ).build(); 125 ).build();
@@ -165,11 +140,6 @@ class StructurallyEqualToRawTest {
165 140
166 @Test 141 @Test
167 void literalCountMismatchTest() { 142 void literalCountMismatchTest() {
168 var p = Variable.of("p");
169 var q = Variable.of("q");
170 var friend = new Symbol<>("friend", 2, Boolean.class, false);
171 var friendView = new KeyOnlyView<>(friend);
172
173 var actual = Dnf.builder("Actual").parameters(p, q).clause( 143 var actual = Dnf.builder("Actual").parameters(p, q).clause(
174 friendView.call(p, q) 144 friendView.call(p, q)
175 ).build(); 145 ).build();
diff --git a/subprojects/store-query/src/test/java/tools/refinery/store/query/tests/StructurallyEqualToTest.java b/subprojects/store-query/src/test/java/tools/refinery/store/query/tests/StructurallyEqualToTest.java
index e2983a3a..f716b805 100644
--- a/subprojects/store-query/src/test/java/tools/refinery/store/query/tests/StructurallyEqualToTest.java
+++ b/subprojects/store-query/src/test/java/tools/refinery/store/query/tests/StructurallyEqualToTest.java
@@ -7,8 +7,10 @@ package tools.refinery.store.query.tests;
7 7
8import org.junit.jupiter.api.Test; 8import org.junit.jupiter.api.Test;
9import tools.refinery.store.query.dnf.Dnf; 9import tools.refinery.store.query.dnf.Dnf;
10import tools.refinery.store.query.term.NodeVariable;
10import tools.refinery.store.query.term.ParameterDirection; 11import tools.refinery.store.query.term.ParameterDirection;
11import tools.refinery.store.query.term.Variable; 12import tools.refinery.store.query.term.Variable;
13import tools.refinery.store.query.view.AnySymbolView;
12import tools.refinery.store.query.view.KeyOnlyView; 14import tools.refinery.store.query.view.KeyOnlyView;
13import tools.refinery.store.representation.Symbol; 15import tools.refinery.store.representation.Symbol;
14 16
@@ -18,13 +20,15 @@ import static org.junit.jupiter.api.Assertions.assertThrows;
18import static tools.refinery.store.query.tests.QueryMatchers.structurallyEqualTo; 20import static tools.refinery.store.query.tests.QueryMatchers.structurallyEqualTo;
19 21
20class StructurallyEqualToTest { 22class StructurallyEqualToTest {
23 private static final Symbol<Boolean> person = Symbol.of("Person", 1);
24 private static final Symbol<Boolean> friend = Symbol.of("friend", 2);
25 private static final AnySymbolView personView = new KeyOnlyView<>(person);
26 private static final AnySymbolView friendView = new KeyOnlyView<>(friend);
27 private static final NodeVariable p = Variable.of("p");
28 private static final NodeVariable q = Variable.of("q");
29
21 @Test 30 @Test
22 void flatEqualsTest() { 31 void flatEqualsTest() {
23 var p = Variable.of("p");
24 var q = Variable.of("q");
25 var person = new Symbol<>("Person", 1, Boolean.class, false);
26 var personView = new KeyOnlyView<>(person);
27
28 var expected = Dnf.builder("Expected").parameters(q).clause(personView.call(q)).build(); 32 var expected = Dnf.builder("Expected").parameters(q).clause(personView.call(q)).build();
29 var actual = Dnf.builder("Actual").parameters(p).clause(personView.call(p)).build(); 33 var actual = Dnf.builder("Actual").parameters(p).clause(personView.call(p)).build();
30 34
@@ -33,11 +37,6 @@ class StructurallyEqualToTest {
33 37
34 @Test 38 @Test
35 void flatNotEqualsTest() { 39 void flatNotEqualsTest() {
36 var p = Variable.of("p");
37 var q = Variable.of("q");
38 var friend = new Symbol<>("friend", 2, Boolean.class, false);
39 var friendView = new KeyOnlyView<>(friend);
40
41 var expected = Dnf.builder("Expected").parameters(q).clause(friendView.call(q, q)).build(); 40 var expected = Dnf.builder("Expected").parameters(q).clause(friendView.call(q, q)).build();
42 var actual = Dnf.builder("Actual").parameters(p).clause(friendView.call(p, q)).build(); 41 var actual = Dnf.builder("Actual").parameters(p).clause(friendView.call(p, q)).build();
43 42
@@ -47,11 +46,6 @@ class StructurallyEqualToTest {
47 46
48 @Test 47 @Test
49 void deepEqualsTest() { 48 void deepEqualsTest() {
50 var p = Variable.of("p");
51 var q = Variable.of("q");
52 var person = new Symbol<>("Person", 1, Boolean.class, false);
53 var personView = new KeyOnlyView<>(person);
54
55 var expected = Dnf.builder("Expected").parameters(q).clause( 49 var expected = Dnf.builder("Expected").parameters(q).clause(
56 Dnf.builder("Expected2").parameters(p).clause(personView.call(p)).build().call(q) 50 Dnf.builder("Expected2").parameters(p).clause(personView.call(p)).build().call(q)
57 ).build(); 51 ).build();
@@ -64,11 +58,6 @@ class StructurallyEqualToTest {
64 58
65 @Test 59 @Test
66 void deepNotEqualsTest() { 60 void deepNotEqualsTest() {
67 var p = Variable.of("p");
68 var q = Variable.of("q");
69 var friend = new Symbol<>("friend", 2, Boolean.class, false);
70 var friendView = new KeyOnlyView<>(friend);
71
72 var expected = Dnf.builder("Expected").parameters(q).clause( 61 var expected = Dnf.builder("Expected").parameters(q).clause(
73 Dnf.builder("Expected2").parameters(p).clause(friendView.call(p, p)).build().call(q) 62 Dnf.builder("Expected2").parameters(p).clause(friendView.call(p, p)).build().call(q)
74 ).build(); 63 ).build();
@@ -83,11 +72,6 @@ class StructurallyEqualToTest {
83 72
84 @Test 73 @Test
85 void parameterListLengthMismatchTest() { 74 void parameterListLengthMismatchTest() {
86 var p = Variable.of("p");
87 var q = Variable.of("q");
88 var friend = new Symbol<>("friend", 2, Boolean.class, false);
89 var friendView = new KeyOnlyView<>(friend);
90
91 var expected = Dnf.builder("Expected").parameter(p).clause( 75 var expected = Dnf.builder("Expected").parameter(p).clause(
92 friendView.call(p, p) 76 friendView.call(p, p)
93 ).build(); 77 ).build();
@@ -101,10 +85,6 @@ class StructurallyEqualToTest {
101 85
102 @Test 86 @Test
103 void parameterDirectionMismatchTest() { 87 void parameterDirectionMismatchTest() {
104 var p = Variable.of("p");
105 var person = new Symbol<>("Person", 1, Boolean.class, false);
106 var personView = new KeyOnlyView<>(person);
107
108 var expected = Dnf.builder("Expected").parameter(p, ParameterDirection.OUT).clause( 88 var expected = Dnf.builder("Expected").parameter(p, ParameterDirection.OUT).clause(
109 personView.call(p) 89 personView.call(p)
110 ).build(); 90 ).build();
@@ -118,11 +98,6 @@ class StructurallyEqualToTest {
118 98
119 @Test 99 @Test
120 void clauseCountMismatchTest() { 100 void clauseCountMismatchTest() {
121 var p = Variable.of("p");
122 var q = Variable.of("q");
123 var friend = new Symbol<>("friend", 2, Boolean.class, false);
124 var friendView = new KeyOnlyView<>(friend);
125
126 var expected = Dnf.builder("Expected") 101 var expected = Dnf.builder("Expected")
127 .parameters(p, q) 102 .parameters(p, q)
128 .clause(friendView.call(p, q)) 103 .clause(friendView.call(p, q))
@@ -138,11 +113,6 @@ class StructurallyEqualToTest {
138 113
139 @Test 114 @Test
140 void literalCountMismatchTest() { 115 void literalCountMismatchTest() {
141 var p = Variable.of("p");
142 var q = Variable.of("q");
143 var friend = new Symbol<>("friend", 2, Boolean.class, false);
144 var friendView = new KeyOnlyView<>(friend);
145
146 var expected = Dnf.builder("Expected").parameters(p, q).clause( 116 var expected = Dnf.builder("Expected").parameters(p, q).clause(
147 friendView.call(p, q), 117 friendView.call(p, q),
148 friendView.call(q, p) 118 friendView.call(q, p)
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 405e58ac..a1e4b816 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
@@ -29,7 +29,7 @@ public class BaseDecisionTranslationUnit extends TranslationUnit {
29 } 29 }
30 this.partialRelation = partialRelation; 30 this.partialRelation = partialRelation;
31 this.seed = seed; 31 this.seed = seed;
32 symbol = new Symbol<>(partialRelation.name(), partialRelation.arity(), TruthValue.class, TruthValue.UNKNOWN); 32 symbol = Symbol.of(partialRelation.name(), partialRelation.arity(), TruthValue.class, TruthValue.UNKNOWN);
33 } 33 }
34 34
35 public BaseDecisionTranslationUnit(PartialRelation partialRelation) { 35 public BaseDecisionTranslationUnit(PartialRelation partialRelation) {
diff --git a/subprojects/store-reasoning/src/main/java/tools/refinery/store/reasoning/translator/typehierarchy/TypeHierarchyTranslationUnit.java b/subprojects/store-reasoning/src/main/java/tools/refinery/store/reasoning/translator/typehierarchy/TypeHierarchyTranslationUnit.java
index e1aa2014..06e3c05f 100644
--- a/subprojects/store-reasoning/src/main/java/tools/refinery/store/reasoning/translator/typehierarchy/TypeHierarchyTranslationUnit.java
+++ b/subprojects/store-reasoning/src/main/java/tools/refinery/store/reasoning/translator/typehierarchy/TypeHierarchyTranslationUnit.java
@@ -16,8 +16,8 @@ import java.util.List;
16import java.util.Map; 16import java.util.Map;
17 17
18public class TypeHierarchyTranslationUnit extends TranslationUnit { 18public class TypeHierarchyTranslationUnit extends TranslationUnit {
19 static final Symbol<InferredType> INFERRED_TYPE_SYMBOL = new Symbol<>("inferredType", 1, 19 static final Symbol<InferredType> INFERRED_TYPE_SYMBOL = Symbol.of(
20 InferredType.class, InferredType.UNTYPED); 20 "inferredType", 1, InferredType.class, InferredType.UNTYPED);
21 21
22 private final TypeAnalyzer typeAnalyzer; 22 private final TypeAnalyzer typeAnalyzer;
23 23
diff --git a/subprojects/store/src/main/java/tools/refinery/store/representation/Symbol.java b/subprojects/store/src/main/java/tools/refinery/store/representation/Symbol.java
index aad88921..cc748180 100644
--- a/subprojects/store/src/main/java/tools/refinery/store/representation/Symbol.java
+++ b/subprojects/store/src/main/java/tools/refinery/store/representation/Symbol.java
@@ -7,18 +7,19 @@ package tools.refinery.store.representation;
7 7
8public record Symbol<T>(String name, int arity, Class<T> valueType, T defaultValue) implements AnySymbol { 8public record Symbol<T>(String name, int arity, Class<T> valueType, T defaultValue) implements AnySymbol {
9 @Override 9 @Override
10 public boolean equals(Object o) { 10 public String toString() {
11 return this == o; 11 return "%s/%d".formatted(name, arity);
12 } 12 }
13 13
14 @Override 14 public static Symbol<Boolean> of(String name, int arity) {
15 public int hashCode() { 15 return of(name, arity, Boolean.class, false);
16 // Compare by identity to make hash table lookups more efficient.
17 return System.identityHashCode(this);
18 } 16 }
19 17
20 @Override 18 public static <T> Symbol<T> of(String name, int arity, Class<T> valueType) {
21 public String toString() { 19 return of(name, arity, valueType, null);
22 return "%s/%d".formatted(name, arity); 20 }
21
22 public static <T> Symbol<T> of(String name, int arity, Class<T> valueType, T defaultValue) {
23 return new Symbol<>(name, arity, valueType, defaultValue);
23 } 24 }
24} 25}
diff --git a/subprojects/store/src/test/java/tools/refinery/store/model/tests/ModelTest.java b/subprojects/store/src/test/java/tools/refinery/store/model/tests/ModelTest.java
index 1017ff28..56b75804 100644
--- a/subprojects/store/src/test/java/tools/refinery/store/model/tests/ModelTest.java
+++ b/subprojects/store/src/test/java/tools/refinery/store/model/tests/ModelTest.java
@@ -14,27 +14,24 @@ import tools.refinery.store.tuple.Tuple;
14import static org.junit.jupiter.api.Assertions.*; 14import static org.junit.jupiter.api.Assertions.*;
15 15
16class ModelTest { 16class ModelTest {
17 private static final Symbol<Boolean> person = Symbol.of("Person", 1);
18 private static final Symbol<Integer> age = Symbol.of("age", 1, Integer.class);
19 private static final Symbol<Boolean> friend = Symbol.of("friend", 2);
20
17 @Test 21 @Test
18 void modelConstructionTest() { 22 void modelConstructionTest() {
19 var person = new Symbol<>("Person", 1, Boolean.class, false);
20 var friend = new Symbol<>("friend", 2, Boolean.class, false);
21
22 var store = ModelStore.builder().symbols(person, friend).build(); 23 var store = ModelStore.builder().symbols(person, friend).build();
23 var symbols = store.getSymbols(); 24 var symbols = store.getSymbols();
24 25
25 assertTrue(symbols.contains(person)); 26 assertTrue(symbols.contains(person));
26 assertTrue(symbols.contains(friend)); 27 assertTrue(symbols.contains(friend));
27 28
28 var other = new Symbol<>("other", 2, Integer.class, null); 29 var other = Symbol.of("other", 2, Integer.class);
29 assertFalse(symbols.contains(other)); 30 assertFalse(symbols.contains(other));
30 } 31 }
31 32
32 @Test 33 @Test
33 void modelBuildingTest() { 34 void modelBuildingTest() {
34 var person = new Symbol<>("Person", 1, Boolean.class, false);
35 var age = new Symbol<>("age", 1, Integer.class, null);
36 var friend = new Symbol<>("friend", 2, Boolean.class, false);
37
38 var store = ModelStore.builder().symbols(person, age, friend).build(); 35 var store = ModelStore.builder().symbols(person, age, friend).build();
39 var model = store.createEmptyModel(); 36 var model = store.createEmptyModel();
40 var personInterpretation = model.getInterpretation(person); 37 var personInterpretation = model.getInterpretation(person);
@@ -62,8 +59,6 @@ class ModelTest {
62 59
63 @Test 60 @Test
64 void modelBuildingArityFailTest() { 61 void modelBuildingArityFailTest() {
65 var person = new Symbol<>("Person", 1, Boolean.class, false);
66
67 var store = ModelStore.builder().symbols(person).build(); 62 var store = ModelStore.builder().symbols(person).build();
68 var model = store.createEmptyModel(); 63 var model = store.createEmptyModel();
69 var personInterpretation = model.getInterpretation(person); 64 var personInterpretation = model.getInterpretation(person);
@@ -75,8 +70,6 @@ class ModelTest {
75 70
76 @Test 71 @Test
77 void modelBuildingNullFailTest() { 72 void modelBuildingNullFailTest() {
78 var age = new Symbol<>("age", 1, Integer.class, null);
79
80 var store = ModelStore.builder().symbols(age).build(); 73 var store = ModelStore.builder().symbols(age).build();
81 var model = store.createEmptyModel(); 74 var model = store.createEmptyModel();
82 var ageInterpretation = model.getInterpretation(age); 75 var ageInterpretation = model.getInterpretation(age);
@@ -89,10 +82,6 @@ class ModelTest {
89 82
90 @Test 83 @Test
91 void modelUpdateTest() { 84 void modelUpdateTest() {
92 var person = new Symbol<>("Person", 1, Boolean.class, false);
93 var age = new Symbol<>("age", 1, Integer.class, null);
94 var friend = new Symbol<>("friend", 2, Boolean.class, false);
95
96 var store = ModelStore.builder().symbols(person, age, friend).build(); 85 var store = ModelStore.builder().symbols(person, age, friend).build();
97 var model = store.createEmptyModel(); 86 var model = store.createEmptyModel();
98 var personInterpretation = model.getInterpretation(person); 87 var personInterpretation = model.getInterpretation(person);
@@ -118,9 +107,6 @@ class ModelTest {
118 107
119 @Test 108 @Test
120 void restoreTest() { 109 void restoreTest() {
121 var person = new Symbol<>("Person", 1, Boolean.class, false);
122 var friend = new Symbol<>("friend", 2, Boolean.class, false);
123
124 var store = ModelStore.builder().symbols(person, friend).build(); 110 var store = ModelStore.builder().symbols(person, friend).build();
125 var model = store.createEmptyModel(); 111 var model = store.createEmptyModel();
126 var personInterpretation = model.getInterpretation(person); 112 var personInterpretation = model.getInterpretation(person);