From 8cece6d200225bbc200fdb4bca6650456f4bcd43 Mon Sep 17 00:00:00 2001 From: Kristóf Marussy Date: Thu, 20 Apr 2023 20:10:20 +0200 Subject: refactor: lambda-based Dnf and Query factory * Helps keeping variable scoping clear by limiting variable scopes to the body of the corresponding lambda. * Overloads for convenience where variables are automatically created for lambda parameters. --- .../store/query/viatra/DiagonalQueryTest.java | 224 +++++++--------- .../store/query/viatra/FunctionalQueryTest.java | 229 ++++++---------- .../refinery/store/query/viatra/QueryTest.java | 297 ++++++++------------- .../store/query/viatra/QueryTransactionTest.java | 58 +--- 4 files changed, 292 insertions(+), 516 deletions(-) (limited to 'subprojects/store-query-viatra/src') 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 5cffef71..3ff01064 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 @@ -10,13 +10,13 @@ import tools.refinery.store.model.ModelStore; import tools.refinery.store.query.ModelQuery; import tools.refinery.store.query.dnf.Dnf; import tools.refinery.store.query.dnf.Query; -import tools.refinery.store.query.term.Variable; import tools.refinery.store.query.viatra.tests.QueryEngineTest; import tools.refinery.store.query.view.FunctionView; import tools.refinery.store.query.view.KeyOnlyView; import tools.refinery.store.representation.Symbol; import tools.refinery.store.tuple.Tuple; +import java.util.List; import java.util.Map; import java.util.Optional; @@ -33,15 +33,10 @@ class DiagonalQueryTest { var personView = new KeyOnlyView<>(person); var symbolView = new KeyOnlyView<>(symbol); - var p1 = Variable.of("p1"); - var p2 = Variable.of("p2"); - var query = Query.builder("Diagonal") - .parameter(p1) - .clause( - personView.call(p1), - not(symbolView.call(p1, p1, p2, p2)) - ) - .build(); + var query = Query.of("Diagonal", (builder, p1) -> builder.clause(p2 -> List.of( + personView.call(p1), + not(symbolView.call(p1, p1, p2, p2)) + ))); var store = ModelStore.builder() .symbols(person, symbol) @@ -81,28 +76,24 @@ class DiagonalQueryTest { var personView = new KeyOnlyView<>(person); var symbolView = new KeyOnlyView<>(symbol); - var p1 = Variable.of("p1"); - var p2 = Variable.of("p2"); - var p3 = Variable.of("p3"); - var p4 = Variable.of("p4"); - var subQuery = Dnf.builder("SubQuery") - .parameters(p1, p2, p3, p4) - .clause( - personView.call(p1), - symbolView.call(p1, p2, p3, p4) - ) - .clause( - personView.call(p2), - symbolView.call(p1, p2, p3, p4) - ) - .build(); - var query = Query.builder("Diagonal") - .parameter(p1) - .clause( - personView.call(p1), - not(subQuery.call(p1, p1, p2, p2)) - ) - .build(); + var subQuery = Dnf.of("SubQuery", builder -> { + var p1 = builder.parameter("p1"); + var p2 = builder.parameter("p2"); + var p3 = builder.parameter("p3"); + var p4 = builder.parameter("p4"); + builder.clause( + personView.call(p1), + symbolView.call(p1, p2, p3, p4) + ); + builder.clause( + personView.call(p2), + symbolView.call(p1, p2, p3, p4) + ); + }); + var query = Query.of("Diagonal", (builder, p1) -> builder.clause(p2 -> List.of( + personView.call(p1), + not(subQuery.call(p1, p1, p2, p2)) + ))); var store = ModelStore.builder() .symbols(person, symbol) @@ -142,17 +133,10 @@ class DiagonalQueryTest { var personView = new KeyOnlyView<>(person); var symbolView = new KeyOnlyView<>(symbol); - var p1 = Variable.of("p1"); - var p2 = Variable.of("p2"); - var x = Variable.of("x", Integer.class); - var query = Query.builder("Diagonal") - .parameter(p1) - .output(x) - .clause( - personView.call(p1), - x.assign(symbolView.count(p1, p1, p2, p2)) - ) - .build(); + var query = Query.of("Diagonal", Integer.class, (builder, p1, output) -> builder.clause(p2 -> List.of( + personView.call(p1), + output.assign(symbolView.count(p1, p1, p2, p2)) + ))); var store = ModelStore.builder() .symbols(person, symbol) @@ -193,30 +177,24 @@ class DiagonalQueryTest { var personView = new KeyOnlyView<>(person); var symbolView = new KeyOnlyView<>(symbol); - var p1 = Variable.of("p1"); - var p2 = Variable.of("p2"); - var p3 = Variable.of("p3"); - var p4 = Variable.of("p4"); - var x = Variable.of("x", Integer.class); - var subQuery = Dnf.builder("SubQuery") - .parameters(p1, p2, p3, p4) - .clause( - personView.call(p1), - symbolView.call(p1, p2, p3, p4) - ) - .clause( - personView.call(p2), - symbolView.call(p1, p2, p3, p4) - ) - .build(); - var query = Query.builder("Diagonal") - .parameter(p1) - .output(x) - .clause( - personView.call(p1), - x.assign(subQuery.count(p1, p1, p2, p2)) - ) - .build(); + var subQuery = Dnf.of("SubQuery", builder -> { + var p1 = builder.parameter("p1"); + var p2 = builder.parameter("p2"); + var p3 = builder.parameter("p3"); + var p4 = builder.parameter("p4"); + builder.clause( + personView.call(p1), + symbolView.call(p1, p2, p3, p4) + ); + builder.clause( + personView.call(p2), + symbolView.call(p1, p2, p3, p4) + ); + }); + var query = Query.of("Diagonal", Integer.class, (builder, p1, output) -> builder.clause(p2 -> List.of( + personView.call(p1), + output.assign(subQuery.count(p1, p1, p2, p2)) + ))); var store = ModelStore.builder() .symbols(person, symbol) @@ -257,18 +235,11 @@ class DiagonalQueryTest { var personView = new KeyOnlyView<>(person); var symbolView = new FunctionView<>(symbol); - var p1 = Variable.of("p1"); - var p2 = Variable.of("p2"); - var x = Variable.of("x", Integer.class); - var y = Variable.of("y", Integer.class); - var query = Query.builder("Diagonal") - .parameter(p1) - .output(x) - .clause( + var query = Query.of("Diagonal", Integer.class, (builder, p1, output) -> builder.clause(Integer.class, + (p2, y) -> List.of( personView.call(p1), - x.assign(symbolView.aggregate(y, INT_SUM, p1, p1, p2, p2, y)) - ) - .build(); + output.assign(symbolView.aggregate(y, INT_SUM, p1, p1, p2, p2, y)) + ))); var store = ModelStore.builder() .symbols(person, symbol) @@ -309,34 +280,29 @@ class DiagonalQueryTest { var personView = new KeyOnlyView<>(person); var symbolView = new FunctionView<>(symbol); - var p1 = Variable.of("p1"); - var p2 = Variable.of("p2"); - var p3 = Variable.of("p3"); - var p4 = Variable.of("p4"); - var x = Variable.of("x", Integer.class); - var y = Variable.of("y", Integer.class); - var z = Variable.of("z", Integer.class); - var subQuery = Dnf.builder("SubQuery") - .parameters(p1, p2, p3, p4, x, y) - .clause( - personView.call(p1), - symbolView.call(p1, p2, p3, p4, x), - y.assign(x) - ) - .clause( - personView.call(p2), - symbolView.call(p1, p2, p3, p4, x), - y.assign(x) - ) - .build(); - var query = Query.builder("Diagonal") - .parameter(p1) - .output(x) - .clause( + var subQuery = Dnf.of("SubQuery", builder -> { + var p1 = builder.parameter("p1"); + var p2 = builder.parameter("p2"); + var p3 = builder.parameter("p3"); + var p4 = builder.parameter("p4"); + var x = builder.parameter("x", Integer.class); + var y = builder.parameter("y", Integer.class); + builder.clause( + personView.call(p1), + symbolView.call(p1, p2, p3, p4, x), + y.assign(x) + ); + builder.clause( + personView.call(p2), + symbolView.call(p1, p2, p3, p4, x), + y.assign(x) + ); + }); + var query = Query.of("Diagonal", Integer.class, (builder, p1, output) -> builder.clause(Integer.class, + (p2, y) -> List.of( personView.call(p1), - x.assign(subQuery.aggregate(z, INT_SUM, p1, p1, p2, p2, z, z)) - ) - .build(); + output.assign(subQuery.aggregate(y, INT_SUM, p1, p1, p2, p2, y, y)) + ))); var store = ModelStore.builder() .symbols(person, symbol) @@ -377,14 +343,10 @@ class DiagonalQueryTest { var personView = new KeyOnlyView<>(person); var symbolView = new KeyOnlyView<>(symbol); - var p1 = Variable.of("p1"); - var query = Query.builder("Diagonal") - .parameter(p1) - .clause( - personView.call(p1), - symbolView.callTransitive(p1, p1) - ) - .build(); + var query = Query.of("Diagonal", (builder, p1) -> builder.clause( + personView.call(p1), + symbolView.callTransitive(p1, p1) + )); var store = ModelStore.builder() .symbols(person, symbol) @@ -423,26 +385,22 @@ class DiagonalQueryTest { var personView = new KeyOnlyView<>(person); var symbolView = new KeyOnlyView<>(symbol); - var p1 = Variable.of("p1"); - var p2 = Variable.of("p2"); - var subQuery = Dnf.builder("SubQuery") - .parameters(p1, p2) - .clause( - personView.call(p1), - symbolView.call(p1, p2) - ) - .clause( - personView.call(p2), - symbolView.call(p1, p2) - ) - .build(); - var query = Query.builder("Diagonal") - .parameter(p1) - .clause( - personView.call(p1), - subQuery.callTransitive(p1, p1) - ) - .build(); + var subQuery = Dnf.of("SubQuery", builder -> { + var p1 = builder.parameter("p1"); + var p2 = builder.parameter("p2"); + builder.clause( + personView.call(p1), + symbolView.call(p1, p2) + ); + builder.clause( + personView.call(p2), + symbolView.call(p1, p2) + ); + }); + var query = Query.of("Diagonal", (builder, p1) -> builder.clause( + personView.call(p1), + subQuery.callTransitive(p1, p1) + )); var store = ModelStore.builder() .symbols(person, symbol) 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 19584273..ffa5e60b 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 @@ -20,6 +20,7 @@ import tools.refinery.store.representation.Symbol; import tools.refinery.store.representation.TruthValue; import tools.refinery.store.tuple.Tuple; +import java.util.List; import java.util.Map; import java.util.Optional; @@ -41,16 +42,10 @@ class FunctionalQueryTest { var personView = new KeyOnlyView<>(person); var ageView = new FunctionView<>(age); - var p1 = Variable.of("p1"); - var x = Variable.of("x", Integer.class); - var query = Query.builder("InputKey") - .parameter(p1) - .output(x) - .clause( - personView.call(p1), - ageView.call(p1, x) - ) - .build(); + var query = Query.of("InputKey", Integer.class, (builder, p1, output) -> builder.clause( + personView.call(p1), + ageView.call(p1, output) + )); var store = ModelStore.builder() .symbols(person, age) @@ -87,23 +82,18 @@ class FunctionalQueryTest { var personView = new KeyOnlyView<>(person); var ageView = new FunctionView<>(age); - var p1 = Variable.of("p1"); - var x = Variable.of("x", Integer.class); - var subQuery = Dnf.builder("SubQuery") - .parameters(p1, x) - .clause( - personView.call(p1), - ageView.call(p1, x) - ) - .build(); - var query = Query.builder("Predicate") - .parameter(p1) - .output(x) - .clause( - personView.call(p1), - subQuery.call(p1, x) - ) - .build(); + var subQuery = Dnf.of("SubQuery", builder -> { + var p1 = builder.parameter("p1"); + var x = builder.parameter("x", Integer.class); + builder.clause( + personView.call(p1), + ageView.call(p1, x) + ); + }); + var query = Query.of("Predicate", Integer.class, (builder, p1, output) -> builder.clause( + personView.call(p1), + subQuery.call(p1, output) + )); var store = ModelStore.builder() .symbols(person, age) @@ -140,18 +130,14 @@ class FunctionalQueryTest { var personView = new KeyOnlyView<>(person); var ageView = new FunctionView<>(age); - var p1 = Variable.of("p1"); - var x = Variable.of("x", Integer.class); - var y = Variable.of("y", Integer.class); - var query = Query.builder("Computation") - .parameter(p1) - .output(y) - .clause( - personView.call(p1), - ageView.call(p1, x), - y.assign(mul(x, constant(7))) - ) - .build(); + var query = Query.of("Computation", Integer.class, (builder, p1, output) -> builder.clause(() -> { + var x = Variable.of("x", Integer.class); + return List.of( + personView.call(p1), + ageView.call(p1, x), + output.assign(mul(x, constant(7))) + ); + })); var store = ModelStore.builder() .symbols(person, age) @@ -187,17 +173,10 @@ class FunctionalQueryTest { var personView = new KeyOnlyView<>(person); var friendMustView = new FilteredView<>(friend, "must", TruthValue::must); - var p1 = Variable.of("p1"); - var p2 = Variable.of("p2"); - var x = Variable.of("x", Integer.class); - var query = Query.builder("Count") - .parameter(p1) - .output(x) - .clause( - personView.call(p1), - x.assign(friendMustView.count(p1, p2)) - ) - .build(); + var query = Query.of("Count", Integer.class, (builder, p1, output) -> builder.clause( + personView.call(p1), + output.assign(friendMustView.count(p1, Variable.of())) + )); var store = ModelStore.builder() .symbols(person, friend) @@ -236,25 +215,19 @@ class FunctionalQueryTest { var personView = new KeyOnlyView<>(person); var friendMustView = new FilteredView<>(friend, "must", TruthValue::must); - var p1 = Variable.of("p1"); - var p2 = Variable.of("p2"); - var x = Variable.of("x", Integer.class); - var subQuery = Dnf.builder("SubQuery") - .parameters(p1, p2) - .clause( - personView.call(p1), - personView.call(p2), - friendMustView.call(p1, p2) - ) - .build(); - var query = Query.builder("Count") - .parameter(p1) - .output(x) - .clause( - personView.call(p1), - x.assign(subQuery.count(p1, p2)) - ) - .build(); + var subQuery = Dnf.of("SubQuery", builder -> { + var p1 = builder.parameter("p1"); + var p2 = builder.parameter("p2"); + builder.clause( + personView.call(p1), + personView.call(p2), + friendMustView.call(p1, p2) + ); + }); + var query = Query.of("Count", Integer.class, (builder, p1, output) -> builder.clause( + personView.call(p1), + output.assign(subQuery.count(p1, Variable.of())) + )); var store = ModelStore.builder() .symbols(person, friend) @@ -291,15 +264,8 @@ class FunctionalQueryTest { var age = new Symbol<>("age", 1, Integer.class, null); var ageView = new FunctionView<>(age); - var p1 = Variable.of("p1"); - var x = Variable.of("x", Integer.class); - var y = Variable.of("y", Integer.class); - var query = Query.builder("Aggregate") - .output(x) - .clause( - x.assign(ageView.aggregate(y, INT_SUM, p1, y)) - ) - .build(); + var query = Query.of("Aggregate", Integer.class, (builder, output) -> builder.clause(Integer.class, + (y) -> List.of(output.assign(ageView.aggregate(y, INT_SUM, Variable.of(), y))))); var store = ModelStore.builder() .symbols(age) @@ -327,22 +293,16 @@ class FunctionalQueryTest { var personView = new KeyOnlyView<>(person); var ageView = new FunctionView<>(age); - var p1 = Variable.of("p1"); - var x = Variable.of("x", Integer.class); - var y = Variable.of("y", Integer.class); - var subQuery = Dnf.builder("SubQuery") - .parameters(p1, x) - .clause( - personView.call(p1), - ageView.call(p1, x) - ) - .build(); - var query = Query.builder("Aggregate") - .output(x) - .clause( - x.assign(subQuery.aggregate(y, INT_SUM, p1, y)) - ) - .build(); + var subQuery = Dnf.of("SubQuery", builder -> { + var p1 = builder.parameter("p1"); + var x = builder.parameter("x", Integer.class); + builder.clause( + personView.call(p1), + ageView.call(p1, x) + ); + }); + var query = Query.of("Aggregate", Integer.class, (builder, output) -> builder.clause(Integer.class, + (y) -> List.of(output.assign(subQuery.aggregate(y, INT_SUM, Variable.of(), y))))); var store = ModelStore.builder() .symbols(person, age) @@ -374,29 +334,18 @@ class FunctionalQueryTest { var personView = new KeyOnlyView<>(person); var friendMustView = new FilteredView<>(friend, "must", TruthValue::must); - var p1 = Variable.of("p1"); - var p2 = Variable.of("p2"); - var x = Variable.of("x", Integer.class); - var y = Variable.of("y", Integer.class); - var subQuery = Dnf.builder("SubQuery") - .parameters(p1, x) - .clause( - personView.call(p1), - x.assign(friendMustView.count(p1, p2)) - ) - .build(); - var minQuery = Query.builder("Min") - .output(x) - .clause( - x.assign(subQuery.aggregate(y, INT_MIN, p1, y)) - ) - .build(); - var maxQuery = Query.builder("Max") - .output(x) - .clause( - x.assign(subQuery.aggregate(y, INT_MAX, p1, y)) - ) - .build(); + var subQuery = Dnf.of("SubQuery", builder -> { + var p1 = builder.parameter("p1"); + var x = builder.parameter("x", Integer.class); + builder.clause( + personView.call(p1), + x.assign(friendMustView.count(p1, Variable.of())) + ); + }); + var minQuery = Query.of("Min", Integer.class, (builder, output) -> builder.clause(Integer.class, + (y) -> List.of(output.assign(subQuery.aggregate(y, INT_MIN, Variable.of(), y))))); + var maxQuery = Query.of("Max", Integer.class, (builder, output) -> builder.clause(Integer.class, + (y) -> List.of(output.assign(subQuery.aggregate(y, INT_MAX, Variable.of(), y))))); var store = ModelStore.builder() .symbols(person, friend) @@ -450,18 +399,12 @@ class FunctionalQueryTest { var personView = new KeyOnlyView<>(person); var ageView = new FunctionView<>(age); - var p1 = Variable.of("p1"); - var x = Variable.of("x", Integer.class); - var y = Variable.of("y", Integer.class); - var query = Query.builder("InvalidComputation") - .parameter(p1) - .output(y) - .clause( + var query = Query.of("InvalidComputation", Integer.class, + (builder, p1, output) -> builder.clause(Integer.class, (x) -> List.of( personView.call(p1), ageView.call(p1, x), - y.assign(div(constant(120), x)) - ) - .build(); + output.assign(div(constant(120), x)) + ))); var store = ModelStore.builder() .symbols(person, age) @@ -497,16 +440,11 @@ class FunctionalQueryTest { var personView = new KeyOnlyView<>(person); var ageView = new FunctionView<>(age); - var p1 = Variable.of("p1"); - var x = Variable.of("x", Integer.class); - var query = Query.builder("InvalidComputation") - .parameter(p1) - .clause( - personView.call(p1), - ageView.call(p1, x), - assume(lessEq(div(constant(120), x), constant(5))) - ) - .build(); + var query = Query.of("InvalidAssume", (builder, p1) -> builder.clause(Integer.class, (x) -> List.of( + personView.call(p1), + ageView.call(p1, x), + assume(lessEq(div(constant(120), x), constant(5))) + ))); var store = ModelStore.builder() .symbols(person, age) @@ -547,18 +485,11 @@ class FunctionalQueryTest { var ageView = new FunctionView<>(age); var friendMustView = new FilteredView<>(friend, "must", TruthValue::must); - var p1 = Variable.of("p1"); - var p2 = Variable.of("p2"); - var x = Variable.of("x", Integer.class); - var query = Query.builder("NotFunctional") - .parameter(p1) - .output(x) - .clause( - personView.call(p1), - friendMustView.call(p1, p2), - ageView.call(p2, x) - ) - .build(); + var query = Query.of("NotFunctional", Integer.class, (builder, p1, output) -> builder.clause((p2) -> List.of( + personView.call(p1), + friendMustView.call(p1, p2), + ageView.call(p2, output) + ))); var store = ModelStore.builder() .symbols(person, age, friend) 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 11ee98f5..a90889c6 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 @@ -20,6 +20,7 @@ import tools.refinery.store.representation.Symbol; import tools.refinery.store.representation.TruthValue; import tools.refinery.store.tuple.Tuple; +import java.util.List; import java.util.Map; import static org.junit.jupiter.api.Assertions.assertThrows; @@ -36,11 +37,7 @@ class QueryTest { var asset = new Symbol<>("Asset", 1, Boolean.class, false); var personView = new KeyOnlyView<>(person); - var p1 = Variable.of("p1"); - var predicate = Query.builder("TypeConstraint") - .parameters(p1) - .clause(personView.call(p1)) - .build(); + var predicate = Query.of("TypeConstraint", (builder, p1) -> builder.clause(personView.call(p1))); var store = ModelStore.builder() .symbols(person, asset) @@ -76,16 +73,11 @@ class QueryTest { var personView = new KeyOnlyView<>(person); var friendMustView = new FilteredView<>(friend, "must", TruthValue::must); - var p1 = Variable.of("p1"); - var p2 = Variable.of("p2"); - var predicate = Query.builder("RelationConstraint") - .parameters(p1, p2) - .clause( - personView.call(p1), - personView.call(p2), - friendMustView.call(p1, p2) - ) - .build(); + var predicate = Query.of("RelationConstraint", (builder, p1, p2) -> builder.clause( + personView.call(p1), + personView.call(p2), + friendMustView.call(p1, p2) + )); var store = ModelStore.builder() .symbols(person, friend) @@ -125,16 +117,11 @@ class QueryTest { var personView = new KeyOnlyView<>(person); var friendMustView = new FilteredView<>(friend, "must", TruthValue::must); - var p1 = Variable.of("p1"); - var p2 = Variable.of("p2"); - var predicate = Query.builder("RelationConstraint") - .parameters(p1) - .clause( - personView.call(p1), - personView.call(p2), - friendMustView.call(p1, p2) - ) - .build(); + var predicate = Query.of("Exists", (builder, p1) -> builder.clause((p2) -> List.of( + personView.call(p1), + personView.call(p2), + friendMustView.call(p1, p2) + ))); var store = ModelStore.builder() .symbols(person, friend) @@ -176,21 +163,15 @@ class QueryTest { var animalView = new KeyOnlyView<>(animal); var friendMustView = new FilteredView<>(friend, "must", TruthValue::must); - var p1 = Variable.of("p1"); - var p2 = Variable.of("p2"); - var predicate = Query.builder("Or") - .parameters(p1, p2) - .clause( - personView.call(p1), - personView.call(p2), - friendMustView.call(p1, p2) - ) - .clause( - animalView.call(p1), - animalView.call(p2), - friendMustView.call(p1, p2) - ) - .build(); + var predicate = Query.of("Or", (builder, p1, p2) -> builder.clause( + personView.call(p1), + personView.call(p2), + friendMustView.call(p1, p2) + ).clause( + animalView.call(p1), + animalView.call(p2), + friendMustView.call(p1, p2) + )); var store = ModelStore.builder() .symbols(person, animal, friend) @@ -232,16 +213,11 @@ class QueryTest { var person = new Symbol<>("Person", 1, Boolean.class, false); var personView = new KeyOnlyView<>(person); - var p1 = Variable.of("p1"); - var p2 = Variable.of("p2"); - var predicate = Query.builder("Equality") - .parameters(p1, p2) - .clause( - personView.call(p1), - personView.call(p2), - p1.isEquivalent(p2) - ) - .build(); + var predicate = Query.of("Equality", (builder, p1, p2) -> builder.clause( + personView.call(p1), + personView.call(p2), + p1.isEquivalent(p2) + )); var store = ModelStore.builder() .symbols(person) @@ -276,19 +252,13 @@ class QueryTest { var personView = new KeyOnlyView<>(person); var friendMustView = new FilteredView<>(friend, "must", TruthValue::must); - var p1 = Variable.of("p1"); - var p2 = Variable.of("p2"); - var p3 = Variable.of("p3"); - var predicate = Query.builder("Inequality") - .parameters(p1, p2, p3) - .clause( - personView.call(p1), - personView.call(p2), - friendMustView.call(p1, p3), - friendMustView.call(p2, p3), - p1.notEquivalent(p2) - ) - .build(); + var predicate = Query.of("Inequality", (builder, p1, p2, p3) -> builder.clause( + personView.call(p1), + personView.call(p2), + friendMustView.call(p1, p3), + friendMustView.call(p2, p3), + p1.notEquivalent(p2) + )); var store = ModelStore.builder() .symbols(person, friend) @@ -325,27 +295,20 @@ class QueryTest { var personView = new KeyOnlyView<>(person); var friendMustView = new FilteredView<>(friend, "must", TruthValue::must); - var p1 = Variable.of("p1"); - var p2 = Variable.of("p2"); - var friendPredicate = Dnf.builder("RelationConstraint") - .parameters(p1, p2) - .clause( - personView.call(p1), - personView.call(p2), - friendMustView.call(p1, p2) - ) - .build(); - - var p3 = Variable.of("p3"); - var p4 = Variable.of("p4"); - var predicate = Query.builder("PositivePatternCall") - .parameters(p3, p4) - .clause( - personView.call(p3), - personView.call(p4), - friendPredicate.call(p3, p4) - ) - .build(); + var friendPredicate = Dnf.of("Friend", builder -> { + var p1 = builder.parameter("p1"); + var p2 = builder.parameter("p2"); + builder.clause( + personView.call(p1), + personView.call(p2), + friendMustView.call(p1, p2) + ); + }); + var predicate = Query.of("PositivePatternCall", (builder, p3, p4) -> builder.clause( + personView.call(p3), + personView.call(p4), + friendPredicate.call(p3, p4) + )); var store = ModelStore.builder() .symbols(person, friend) @@ -384,16 +347,11 @@ class QueryTest { var personView = new KeyOnlyView<>(person); var friendMustView = new FilteredView<>(friend, "must", TruthValue::must); - var p1 = Variable.of("p1"); - var p2 = Variable.of("p2"); - var predicate = Query.builder("NegativePatternCall") - .parameters(p1, p2) - .clause( - personView.call(p1), - personView.call(p2), - not(friendMustView.call(p1, p2)) - ) - .build(); + var predicate = Query.of("NegativePatternCall", (builder, p1, p2) -> builder.clause( + personView.call(p1), + personView.call(p2), + not(friendMustView.call(p1, p2)) + )); var store = ModelStore.builder() .symbols(person, friend) @@ -438,27 +396,20 @@ class QueryTest { var personView = new KeyOnlyView<>(person); var friendMustView = new FilteredView<>(friend, "must", TruthValue::must); - var p1 = Variable.of("p1"); - var p2 = Variable.of("p2"); - var friendPredicate = Dnf.builder("RelationConstraint") - .parameters(p1, p2) - .clause( - personView.call(p1), - personView.call(p2), - friendMustView.call(p1, p2) - ) - .build(); - - var p3 = Variable.of("p3"); - var p4 = Variable.of("p4"); - var predicate = Query.builder("NegativePatternCall") - .parameters(p3, p4) - .clause( - personView.call(p3), - personView.call(p4), - not(friendPredicate.call(p3, p4)) - ) - .build(); + var friendPredicate = Dnf.of("Friend", builder -> { + var p1 = builder.parameter("p1"); + var p2 = builder.parameter("p2"); + builder.clause( + personView.call(p1), + personView.call(p2), + friendMustView.call(p1, p2) + ); + }); + var predicate = Query.of("NegativePatternCall", (builder, p3, p4) -> builder.clause( + personView.call(p3), + personView.call(p4), + not(friendPredicate.call(p3, p4)) + )); var store = ModelStore.builder() .symbols(person, friend) @@ -503,16 +454,10 @@ class QueryTest { var personView = new KeyOnlyView<>(person); var friendMustView = new FilteredView<>(friend, "must", TruthValue::must); - var p1 = Variable.of("p1"); - var p2 = Variable.of("p2"); - - var predicate = Query.builder("Count") - .parameters(p1) - .clause( - personView.call(p1), - not(friendMustView.call(p1, p2)) - ) - .build(); + var predicate = Query.of("Negative", (builder, p1) -> builder.clause( + personView.call(p1), + not(friendMustView.call(p1, Variable.of())) + )); var store = ModelStore.builder() .symbols(person, friend) @@ -550,25 +495,19 @@ class QueryTest { var personView = new KeyOnlyView<>(person); var friendMustView = new FilteredView<>(friend, "must", TruthValue::must); - var p1 = Variable.of("p1"); - var p2 = Variable.of("p2"); - - var called = Dnf.builder("Called") - .parameters(p1, p2) - .clause( - personView.call(p1), - personView.call(p2), - friendMustView.call(p1, p2) - ) - .build(); - - var predicate = Query.builder("Count") - .parameters(p1) - .clause( - personView.call(p1), - not(called.call(p1, p2)) - ) - .build(); + var called = Dnf.of("Called", builder -> { + var p1 = builder.parameter("p1"); + var p2 = builder.parameter("p2"); + builder.clause( + personView.call(p1), + personView.call(p2), + friendMustView.call(p1, p2) + ); + }); + var predicate = Query.of("Negative", (builder, p1) -> builder.clause( + personView.call(p1), + not(called.call(p1, Variable.of())) + )); var store = ModelStore.builder() .symbols(person, friend) @@ -606,16 +545,11 @@ class QueryTest { var personView = new KeyOnlyView<>(person); var friendMustView = new FilteredView<>(friend, "must", TruthValue::must); - var p1 = Variable.of("p1"); - var p2 = Variable.of("p2"); - var predicate = Query.builder("TransitivePatternCall") - .parameters(p1, p2) - .clause( - personView.call(p1), - personView.call(p2), - friendMustView.callTransitive(p1, p2) - ) - .build(); + var predicate = Query.of("Transitive", (builder, p1, p2) -> builder.clause( + personView.call(p1), + personView.call(p2), + friendMustView.callTransitive(p1, p2) + )); var store = ModelStore.builder() .symbols(person, friend) @@ -659,27 +593,20 @@ class QueryTest { var personView = new KeyOnlyView<>(person); var friendMustView = new FilteredView<>(friend, "must", TruthValue::must); - var p1 = Variable.of("p1"); - var p2 = Variable.of("p2"); - var friendPredicate = Dnf.builder("RelationConstraint") - .parameters(p1, p2) - .clause( - personView.call(p1), - personView.call(p2), - friendMustView.call(p1, p2) - ) - .build(); - - var p3 = Variable.of("p3"); - var p4 = Variable.of("p4"); - var predicate = Query.builder("TransitivePatternCall") - .parameters(p3, p4) - .clause( - personView.call(p3), - personView.call(p4), - friendPredicate.callTransitive(p3, p4) - ) - .build(); + var called = Dnf.of("Called", builder -> { + var p1 = builder.parameter("p1"); + var p2 = builder.parameter("p2"); + builder.clause( + personView.call(p1), + personView.call(p2), + friendMustView.call(p1, p2) + ); + }); + var predicate = Query.of("Transitive", (builder, p1, p2) -> builder.clause( + personView.call(p1), + personView.call(p2), + called.callTransitive(p1, p2) + )); var store = ModelStore.builder() .symbols(person, friend) @@ -723,16 +650,11 @@ class QueryTest { var personView = new KeyOnlyView<>(person); var ageView = new FunctionView<>(age); - var p1 = Variable.of("p1"); - var x = Variable.of("x", Integer.class); - var query = Query.builder("Constraint") - .parameter(p1) - .clause( - personView.call(p1), - ageView.call(p1, x), - assume(greaterEq(x, constant(18))) - ) - .build(); + var query = Query.of("Constraint", (builder, p1) -> builder.clause(Integer.class, (x) -> List.of( + personView.call(p1), + ageView.call(p1, x), + assume(greaterEq(x, constant(18))) + ))); var store = ModelStore.builder() .symbols(person, age) @@ -765,8 +687,7 @@ class QueryTest { void alwaysFalseTest() { var person = new Symbol<>("Person", 1, Boolean.class, false); - var p1 = Variable.of("p1"); - var predicate = Query.builder("AlwaysFalse").parameters(p1).build(); + var predicate = Query.of("AlwaysFalse", builder -> builder.parameter("p1")); var store = ModelStore.builder() .symbols(person) @@ -789,8 +710,6 @@ class QueryTest { @Test void alwaysTrueTest() { - var person = new Symbol<>("Person", 1, Boolean.class, false); - var p1 = Variable.of("p1"); var predicate = Query.builder("AlwaysTrue").parameters(p1).clause().build(); 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 bd6b6b81..9de2655f 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,7 +11,6 @@ import org.junit.jupiter.api.Test; import tools.refinery.store.model.ModelStore; import tools.refinery.store.query.ModelQuery; import tools.refinery.store.query.dnf.Query; -import tools.refinery.store.query.term.Variable; import tools.refinery.store.query.view.FilteredView; import tools.refinery.store.query.view.FunctionView; import tools.refinery.store.query.view.KeyOnlyView; @@ -32,11 +31,7 @@ class QueryTransactionTest { var person = new Symbol<>("Person", 1, Boolean.class, false); var personView = new KeyOnlyView<>(person); - var p1 = Variable.of("p1"); - var predicate = Query.builder("TypeConstraint") - .parameters(p1) - .clause(personView.call(p1)) - .build(); + var predicate = Query.of("TypeConstraint", (builder, p1) -> builder.clause(personView.call(p1))); var store = ModelStore.builder() .symbols(person) @@ -103,11 +98,7 @@ class QueryTransactionTest { var person = new Symbol<>("Person", 1, Boolean.class, false); var personView = new KeyOnlyView<>(person); - var p1 = Variable.of("p1"); - var predicate = Query.builder("TypeConstraint") - .parameters(p1) - .clause(personView.call(p1)) - .build(); + var predicate = Query.of("TypeConstraint", (builder, p1) -> builder.clause(personView.call(p1))); var store = ModelStore.builder() .symbols(person) @@ -158,11 +149,7 @@ class QueryTransactionTest { var asset = new Symbol<>("Asset", 1, Boolean.class, false); var personView = new KeyOnlyView<>(person); - var p1 = Variable.of("p1"); - var predicate = Query.builder("TypeConstraint") - .parameters(p1) - .clause(personView.call(p1)) - .build(); + var predicate = Query.of("TypeConstraint", (builder, p1) -> builder.clause(personView.call(p1))); var store = ModelStore.builder() .symbols(person, asset) @@ -232,16 +219,10 @@ class QueryTransactionTest { var personView = new KeyOnlyView<>(person); var ageView = new FunctionView<>(age); - var p1 = Variable.of("p1"); - var x = Variable.of("x", Integer.class); - var query = Query.builder() - .parameter(p1) - .output(x) - .clause( - personView.call(p1), - ageView.call(p1, x) - ) - .build(); + var query = Query.of("TypeConstraint", Integer.class, (builder, p1, output) -> builder.clause( + personView.call(p1), + ageView.call(p1, output) + )); var store = ModelStore.builder() .symbols(person, age) @@ -280,15 +261,10 @@ class QueryTransactionTest { var personView = new KeyOnlyView<>(person); var adultView = new FilteredView<>(age, "adult", n -> n != null && n >= 18); - var p1 = Variable.of("p1"); - var x = Variable.of("x", Integer.class); - var query = Query.builder() - .parameter(p1) - .clause( - personView.call(p1), - adultView.call(p1) - ) - .build(); + var query = Query.of("TypeConstraint", (builder, p1) -> builder.clause( + personView.call(p1), + adultView.call(p1) + )); var store = ModelStore.builder() .symbols(person, age) @@ -326,11 +302,7 @@ class QueryTransactionTest { var person = new Symbol<>("Person", 1, Boolean.class, false); var personView = new KeyOnlyView<>(person); - var p1 = Variable.of("p1"); - var predicate = Query.builder("TypeConstraint") - .parameters(p1) - .clause(personView.call(p1)) - .build(); + var predicate = Query.of("TypeConstraint", (builder, p1) -> builder.clause(personView.call(p1))); var store = ModelStore.builder() .symbols(person) @@ -384,11 +356,7 @@ class QueryTransactionTest { var person = new Symbol<>("Person", 1, Boolean.class, false); var personView = new KeyOnlyView<>(person); - var p1 = Variable.of("p1"); - var predicate = Query.builder("TypeConstraint") - .parameters(p1) - .clause(personView.call(p1)) - .build(); + var predicate = Query.of("TypeConstraint", (builder, p1) -> builder.clause(personView.call(p1))); var store = ModelStore.builder() .symbols(person) -- cgit v1.2.3-70-g09d2