diff options
Diffstat (limited to 'subprojects/store-query')
5 files changed, 37 insertions, 21 deletions
diff --git a/subprojects/store-query/src/main/java/tools/refinery/store/query/Constraint.java b/subprojects/store-query/src/main/java/tools/refinery/store/query/Constraint.java index c0995e53..916fb35c 100644 --- a/subprojects/store-query/src/main/java/tools/refinery/store/query/Constraint.java +++ b/subprojects/store-query/src/main/java/tools/refinery/store/query/Constraint.java | |||
@@ -60,13 +60,13 @@ public interface Constraint { | |||
60 | return count(List.of(arguments)); | 60 | return count(List.of(arguments)); |
61 | } | 61 | } |
62 | 62 | ||
63 | default <R, T> AssignedValue<R> aggregate(DataVariable<T> inputVariable, Aggregator<R, T> aggregator, | 63 | default <R, T> AssignedValue<R> aggregateBy(DataVariable<T> inputVariable, Aggregator<R, T> aggregator, |
64 | List<Variable> arguments) { | 64 | List<Variable> arguments) { |
65 | return targetVariable -> new AggregationLiteral<>(targetVariable, aggregator, inputVariable, this, arguments); | 65 | return targetVariable -> new AggregationLiteral<>(targetVariable, aggregator, inputVariable, this, arguments); |
66 | } | 66 | } |
67 | 67 | ||
68 | default <R, T> AssignedValue<R> aggregate(DataVariable<T> inputVariable, Aggregator<R, T> aggregator, | 68 | default <R, T> AssignedValue<R> aggregateBy(DataVariable<T> inputVariable, Aggregator<R, T> aggregator, |
69 | Variable... arguments) { | 69 | Variable... arguments) { |
70 | return aggregate(inputVariable, aggregator, List.of(arguments)); | 70 | return aggregateBy(inputVariable, aggregator, List.of(arguments)); |
71 | } | 71 | } |
72 | } | 72 | } |
diff --git a/subprojects/store-query/src/main/java/tools/refinery/store/query/dnf/FunctionalQuery.java b/subprojects/store-query/src/main/java/tools/refinery/store/query/dnf/FunctionalQuery.java index 6f253012..5a32b1ba 100644 --- a/subprojects/store-query/src/main/java/tools/refinery/store/query/dnf/FunctionalQuery.java +++ b/subprojects/store-query/src/main/java/tools/refinery/store/query/dnf/FunctionalQuery.java | |||
@@ -74,7 +74,7 @@ public final class FunctionalQuery<T> extends Query<T> { | |||
74 | argumentsWithPlaceholder.addAll(arguments); | 74 | argumentsWithPlaceholder.addAll(arguments); |
75 | argumentsWithPlaceholder.add(placeholderVariable); | 75 | argumentsWithPlaceholder.add(placeholderVariable); |
76 | return getDnf() | 76 | return getDnf() |
77 | .aggregate(placeholderVariable, aggregator, argumentsWithPlaceholder) | 77 | .aggregateBy(placeholderVariable, aggregator, argumentsWithPlaceholder) |
78 | .toLiteral(targetVariable); | 78 | .toLiteral(targetVariable); |
79 | }; | 79 | }; |
80 | } | 80 | } |
diff --git a/subprojects/store-query/src/main/java/tools/refinery/store/query/view/FunctionView.java b/subprojects/store-query/src/main/java/tools/refinery/store/query/view/FunctionView.java index 1b89e77c..74a5be07 100644 --- a/subprojects/store-query/src/main/java/tools/refinery/store/query/view/FunctionView.java +++ b/subprojects/store-query/src/main/java/tools/refinery/store/query/view/FunctionView.java | |||
@@ -5,10 +5,12 @@ | |||
5 | */ | 5 | */ |
6 | package tools.refinery.store.query.view; | 6 | package tools.refinery.store.query.view; |
7 | 7 | ||
8 | import tools.refinery.store.query.term.Parameter; | 8 | import tools.refinery.store.query.term.*; |
9 | import tools.refinery.store.query.term.ParameterDirection; | ||
10 | import tools.refinery.store.representation.Symbol; | 9 | import tools.refinery.store.representation.Symbol; |
11 | 10 | ||
11 | import java.util.ArrayList; | ||
12 | import java.util.List; | ||
13 | |||
12 | public final class FunctionView<T> extends AbstractFunctionView<T> { | 14 | public final class FunctionView<T> extends AbstractFunctionView<T> { |
13 | public FunctionView(Symbol<T> symbol, String name) { | 15 | public FunctionView(Symbol<T> symbol, String name) { |
14 | super(symbol, name, new Parameter(symbol.valueType(), ParameterDirection.OUT)); | 16 | super(symbol, name, new Parameter(symbol.valueType(), ParameterDirection.OUT)); |
@@ -17,4 +19,18 @@ public final class FunctionView<T> extends AbstractFunctionView<T> { | |||
17 | public FunctionView(Symbol<T> symbol) { | 19 | public FunctionView(Symbol<T> symbol) { |
18 | this(symbol, "function"); | 20 | this(symbol, "function"); |
19 | } | 21 | } |
22 | |||
23 | public <R> AssignedValue<R> aggregate(Aggregator<R, T> aggregator, List<NodeVariable> arguments) { | ||
24 | return targetVariable -> { | ||
25 | var placeholderVariable = Variable.of(getSymbol().valueType()); | ||
26 | var argumentsWithPlaceholder = new ArrayList<Variable>(arguments.size() + 1); | ||
27 | argumentsWithPlaceholder.addAll(arguments); | ||
28 | argumentsWithPlaceholder.add(placeholderVariable); | ||
29 | return aggregateBy(placeholderVariable, aggregator, argumentsWithPlaceholder).toLiteral(targetVariable); | ||
30 | }; | ||
31 | } | ||
32 | |||
33 | public <R> AssignedValue<R> aggregate(Aggregator<R, T> aggregator, NodeVariable... arguments) { | ||
34 | return aggregate(aggregator, List.of(arguments)); | ||
35 | } | ||
20 | } | 36 | } |
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 3608d09e..c52d26b2 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 | |||
@@ -38,7 +38,7 @@ class VariableDirectionTest { | |||
38 | private static final Symbol<Integer> age = Symbol.of("age", 1, Integer.class); | 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 FunctionView<Integer> ageView = new FunctionView<>(age); |
42 | private static final NodeVariable p = Variable.of("p"); | 42 | private static final NodeVariable p = Variable.of("p"); |
43 | private static final NodeVariable q = Variable.of("q"); | 43 | private static final NodeVariable q = Variable.of("q"); |
44 | private static final DataVariable<Integer> x = Variable.of("x", Integer.class); | 44 | private static final DataVariable<Integer> x = Variable.of("x", Integer.class); |
@@ -149,10 +149,10 @@ class VariableDirectionTest { | |||
149 | return Stream.of( | 149 | return Stream.of( |
150 | Arguments.of(not(friendView.call(p, q))), | 150 | Arguments.of(not(friendView.call(p, q))), |
151 | Arguments.of(y.assign(friendView.count(p, q))), | 151 | Arguments.of(y.assign(friendView.count(p, q))), |
152 | Arguments.of(y.assign(ageView.aggregate(z, INT_SUM, p, z))), | 152 | Arguments.of(y.assign(ageView.aggregate(INT_SUM, p))), |
153 | Arguments.of(not(dnfWithOutput.call(p, q))), | 153 | Arguments.of(not(dnfWithOutput.call(p, q))), |
154 | Arguments.of(y.assign(dnfWithOutput.count(p, q))), | 154 | Arguments.of(y.assign(dnfWithOutput.count(p, q))), |
155 | Arguments.of(y.assign(dnfWithOutputToAggregate.aggregate(z, INT_SUM, p, q, z))) | 155 | Arguments.of(y.assign(dnfWithOutputToAggregate.aggregateBy(z, INT_SUM, p, q, z))) |
156 | ); | 156 | ); |
157 | } | 157 | } |
158 | 158 | ||
@@ -192,8 +192,8 @@ class VariableDirectionTest { | |||
192 | Arguments.of(not(dnfWithInput.call(p, p))), | 192 | Arguments.of(not(dnfWithInput.call(p, p))), |
193 | Arguments.of(y.assign(dnfWithInput.count(p, q))), | 193 | Arguments.of(y.assign(dnfWithInput.count(p, q))), |
194 | Arguments.of(y.assign(dnfWithInput.count(p, p))), | 194 | Arguments.of(y.assign(dnfWithInput.count(p, p))), |
195 | Arguments.of(y.assign(dnfWithInputToAggregate.aggregate(z, INT_SUM, p, q, z))), | 195 | Arguments.of(y.assign(dnfWithInputToAggregate.aggregateBy(z, INT_SUM, p, q, z))), |
196 | Arguments.of(y.assign(dnfWithInputToAggregate.aggregate(z, INT_SUM, p, p, z))) | 196 | Arguments.of(y.assign(dnfWithInputToAggregate.aggregateBy(z, INT_SUM, p, p, z))) |
197 | ); | 197 | ); |
198 | } | 198 | } |
199 | 199 | ||
@@ -357,7 +357,7 @@ class VariableDirectionTest { | |||
357 | Arguments.of(dnfWithInput.call(x, q)), | 357 | Arguments.of(dnfWithInput.call(x, q)), |
358 | Arguments.of(not(dnfWithInput.call(x, q))), | 358 | Arguments.of(not(dnfWithInput.call(x, q))), |
359 | Arguments.of(y.assign(dnfWithInput.count(x, q))), | 359 | Arguments.of(y.assign(dnfWithInput.count(x, q))), |
360 | Arguments.of(y.assign(dnfWithInputToAggregate.aggregate(z, INT_SUM, x, q, z))) | 360 | Arguments.of(y.assign(dnfWithInputToAggregate.aggregateBy(z, INT_SUM, x, q, z))) |
361 | ); | 361 | ); |
362 | } | 362 | } |
363 | 363 | ||
@@ -415,10 +415,10 @@ class VariableDirectionTest { | |||
415 | Arguments.of(x.assign(constant(24))), | 415 | Arguments.of(x.assign(constant(24))), |
416 | Arguments.of(ageView.call(q, x)), | 416 | Arguments.of(ageView.call(q, x)), |
417 | Arguments.of(x.assign(personView.count(q))), | 417 | Arguments.of(x.assign(personView.count(q))), |
418 | Arguments.of(x.assign(ageView.aggregate(z, INT_SUM, q, z))), | 418 | Arguments.of(x.assign(ageView.aggregate(INT_SUM, q))), |
419 | Arguments.of(dnfWithDataOutput.call(x, q)), | 419 | Arguments.of(dnfWithDataOutput.call(x, q)), |
420 | Arguments.of(x.assign(dnfWithOutput.count(q))), | 420 | Arguments.of(x.assign(dnfWithOutput.count(q))), |
421 | Arguments.of(x.assign(dnfWithOutputToAggregate.aggregate(z, INT_SUM, q, z))) | 421 | Arguments.of(x.assign(dnfWithOutputToAggregate.aggregateBy(z, INT_SUM, q, z))) |
422 | ); | 422 | ); |
423 | } | 423 | } |
424 | 424 | ||
diff --git a/subprojects/store-query/src/test/java/tools/refinery/store/query/literal/AggregationLiteralTest.java b/subprojects/store-query/src/test/java/tools/refinery/store/query/literal/AggregationLiteralTest.java index 5293b273..35910e08 100644 --- a/subprojects/store-query/src/test/java/tools/refinery/store/query/literal/AggregationLiteralTest.java +++ b/subprojects/store-query/src/test/java/tools/refinery/store/query/literal/AggregationLiteralTest.java | |||
@@ -44,7 +44,7 @@ class AggregationLiteralTest { | |||
44 | 44 | ||
45 | @Test | 45 | @Test |
46 | void parameterDirectionTest() { | 46 | void parameterDirectionTest() { |
47 | var literal = x.assign(fakeConstraint.aggregate(y, INT_SUM, p, y)); | 47 | var literal = x.assign(fakeConstraint.aggregateBy(y, INT_SUM, p, y)); |
48 | assertAll( | 48 | assertAll( |
49 | () -> assertThat(literal.getOutputVariables(), containsInAnyOrder(x)), | 49 | () -> assertThat(literal.getOutputVariables(), containsInAnyOrder(x)), |
50 | () -> assertThat(literal.getInputVariables(Set.of()), empty()), | 50 | () -> assertThat(literal.getInputVariables(Set.of()), empty()), |
@@ -56,13 +56,13 @@ class AggregationLiteralTest { | |||
56 | 56 | ||
57 | @Test | 57 | @Test |
58 | void missingAggregationVariableTest() { | 58 | void missingAggregationVariableTest() { |
59 | var aggregation = fakeConstraint.aggregate(y, INT_SUM, p, z); | 59 | var aggregation = fakeConstraint.aggregateBy(y, INT_SUM, p, z); |
60 | assertThrows(IllegalArgumentException.class, () -> x.assign(aggregation)); | 60 | assertThrows(IllegalArgumentException.class, () -> x.assign(aggregation)); |
61 | } | 61 | } |
62 | 62 | ||
63 | @Test | 63 | @Test |
64 | void circularAggregationVariableTest() { | 64 | void circularAggregationVariableTest() { |
65 | var aggregation = fakeConstraint.aggregate(x, INT_SUM, p, x); | 65 | var aggregation = fakeConstraint.aggregateBy(x, INT_SUM, p, x); |
66 | assertThrows(IllegalArgumentException.class, () -> x.assign(aggregation)); | 66 | assertThrows(IllegalArgumentException.class, () -> x.assign(aggregation)); |
67 | } | 67 | } |
68 | 68 | ||
@@ -71,7 +71,7 @@ class AggregationLiteralTest { | |||
71 | var builder = Dnf.builder() | 71 | var builder = Dnf.builder() |
72 | .clause( | 72 | .clause( |
73 | not(fakeConstraint.call(p, y)), | 73 | not(fakeConstraint.call(p, y)), |
74 | x.assign(fakeConstraint.aggregate(y, INT_SUM, p, y)) | 74 | x.assign(fakeConstraint.aggregateBy(y, INT_SUM, p, y)) |
75 | ); | 75 | ); |
76 | assertThrows(IllegalArgumentException.class, builder::build); | 76 | assertThrows(IllegalArgumentException.class, builder::build); |
77 | } | 77 | } |
@@ -81,7 +81,7 @@ class AggregationLiteralTest { | |||
81 | var builder = Dnf.builder() | 81 | var builder = Dnf.builder() |
82 | .clause( | 82 | .clause( |
83 | y.assign(constant(27)), | 83 | y.assign(constant(27)), |
84 | x.assign(fakeConstraint.aggregate(y, INT_SUM, p, y)) | 84 | x.assign(fakeConstraint.aggregateBy(y, INT_SUM, p, y)) |
85 | ); | 85 | ); |
86 | assertThrows(IllegalArgumentException.class, builder::build); | 86 | assertThrows(IllegalArgumentException.class, builder::build); |
87 | } | 87 | } |