From 565de1cb116e5e4f116544aaa035be58336656ec Mon Sep 17 00:00:00 2001 From: Kristóf Marussy Date: Sun, 23 Apr 2023 23:39:39 +0200 Subject: refactor: query terms * Separate different operators into different classes to make it easier to add functionality (e.g., simplification) later. * Add UpperCardinality terms. * Move UpperCardinality aggregator and tests into refinery-store-query. --- .../UpperCardinalitySumAggregationOperator.java | 102 --------------------- ...ardinalitySumAggregationOperatorStreamTest.java | 56 ----------- ...UpperCardinalitySumAggregationOperatorTest.java | 92 ------------------- 3 files changed, 250 deletions(-) delete mode 100644 subprojects/store-query-viatra/src/main/java/tools/refinery/store/query/viatra/internal/cardinality/UpperCardinalitySumAggregationOperator.java delete mode 100644 subprojects/store-query-viatra/src/test/java/tools/refinery/store/query/viatra/internal/cardinality/UpperCardinalitySumAggregationOperatorStreamTest.java delete mode 100644 subprojects/store-query-viatra/src/test/java/tools/refinery/store/query/viatra/internal/cardinality/UpperCardinalitySumAggregationOperatorTest.java (limited to 'subprojects/store-query-viatra/src') diff --git a/subprojects/store-query-viatra/src/main/java/tools/refinery/store/query/viatra/internal/cardinality/UpperCardinalitySumAggregationOperator.java b/subprojects/store-query-viatra/src/main/java/tools/refinery/store/query/viatra/internal/cardinality/UpperCardinalitySumAggregationOperator.java deleted file mode 100644 index bfd4c049..00000000 --- a/subprojects/store-query-viatra/src/main/java/tools/refinery/store/query/viatra/internal/cardinality/UpperCardinalitySumAggregationOperator.java +++ /dev/null @@ -1,102 +0,0 @@ -/* - * SPDX-FileCopyrightText: 2021-2023 The Refinery Authors - * - * SPDX-License-Identifier: EPL-2.0 - */ -package tools.refinery.store.query.viatra.internal.cardinality; - -import org.eclipse.viatra.query.runtime.matchers.psystem.aggregations.BoundAggregator; -import org.eclipse.viatra.query.runtime.matchers.psystem.aggregations.IMultisetAggregationOperator; -import tools.refinery.store.representation.cardinality.FiniteUpperCardinality; -import tools.refinery.store.representation.cardinality.UnboundedUpperCardinality; -import tools.refinery.store.representation.cardinality.UpperCardinalities; -import tools.refinery.store.representation.cardinality.UpperCardinality; - -import java.util.stream.Stream; - -public class UpperCardinalitySumAggregationOperator implements IMultisetAggregationOperator { - public static final UpperCardinalitySumAggregationOperator INSTANCE = new UpperCardinalitySumAggregationOperator(); - - public static final BoundAggregator BOUND_AGGREGATOR = new BoundAggregator(INSTANCE, UpperCardinality.class, - UpperCardinality.class); - - private UpperCardinalitySumAggregationOperator() { - // Singleton constructor. - } - - @Override - public String getName() { - return "sum"; - } - - @Override - public String getShortDescription() { - return "%s computes the sum of finite or unbounded upper cardinalities".formatted(getName()); - } - - @Override - public Accumulator createNeutral() { - return new Accumulator(); - } - - @Override - public boolean isNeutral(Accumulator result) { - return result.sumFiniteUpperBounds == 0 && result.countUnbounded == 0; - } - - @Override - public Accumulator update(Accumulator oldResult, UpperCardinality updateValue, boolean isInsertion) { - if (updateValue instanceof FiniteUpperCardinality finiteUpperCardinality) { - int finiteUpperBound = finiteUpperCardinality.finiteUpperBound(); - if (isInsertion) { - oldResult.sumFiniteUpperBounds += finiteUpperBound; - } else { - oldResult.sumFiniteUpperBounds -= finiteUpperBound; - } - } else if (updateValue instanceof UnboundedUpperCardinality) { - if (isInsertion) { - oldResult.countUnbounded += 1; - } else { - oldResult.countUnbounded -= 1; - } - } else { - throw new IllegalArgumentException("Unknown UpperCardinality: " + updateValue); - } - return oldResult; - } - - @Override - public UpperCardinality getAggregate(Accumulator result) { - return result.countUnbounded > 0 ? UpperCardinalities.UNBOUNDED : - UpperCardinalities.valueOf(result.sumFiniteUpperBounds); - } - - @Override - public UpperCardinality aggregateStream(Stream stream) { - var result = stream.collect(this::createNeutral, (accumulator, value) -> update(accumulator, value, true), - (left, right) -> new Accumulator(left.sumFiniteUpperBounds + right.sumFiniteUpperBounds, - left.countUnbounded + right.countUnbounded)); - return getAggregate(result); - } - - @Override - public Accumulator clone(Accumulator original) { - return new Accumulator(original.sumFiniteUpperBounds, original.countUnbounded); - } - - public static class Accumulator { - private int sumFiniteUpperBounds; - - private int countUnbounded; - - private Accumulator(int sumFiniteUpperBounds, int countUnbounded) { - this.sumFiniteUpperBounds = sumFiniteUpperBounds; - this.countUnbounded = countUnbounded; - } - - private Accumulator() { - this(0, 0); - } - } -} diff --git a/subprojects/store-query-viatra/src/test/java/tools/refinery/store/query/viatra/internal/cardinality/UpperCardinalitySumAggregationOperatorStreamTest.java b/subprojects/store-query-viatra/src/test/java/tools/refinery/store/query/viatra/internal/cardinality/UpperCardinalitySumAggregationOperatorStreamTest.java deleted file mode 100644 index 53d03cbd..00000000 --- a/subprojects/store-query-viatra/src/test/java/tools/refinery/store/query/viatra/internal/cardinality/UpperCardinalitySumAggregationOperatorStreamTest.java +++ /dev/null @@ -1,56 +0,0 @@ -/* - * SPDX-FileCopyrightText: 2021-2023 The Refinery Authors - * - * SPDX-License-Identifier: EPL-2.0 - */ -package tools.refinery.store.query.viatra.internal.cardinality; - -import org.junit.jupiter.params.ParameterizedTest; -import org.junit.jupiter.params.provider.Arguments; -import org.junit.jupiter.params.provider.MethodSource; -import tools.refinery.store.representation.cardinality.UpperCardinalities; -import tools.refinery.store.representation.cardinality.UpperCardinality; - -import java.util.List; -import java.util.stream.Stream; - -import static org.hamcrest.MatcherAssert.assertThat; -import static org.hamcrest.Matchers.equalTo; - -class UpperCardinalitySumAggregationOperatorStreamTest { - @ParameterizedTest - @MethodSource - void testStream(List list, UpperCardinality expected) { - var result = UpperCardinalitySumAggregationOperator.INSTANCE.aggregateStream(list.stream()); - assertThat(result, equalTo(expected)); - } - - static Stream testStream() { - return Stream.of( - Arguments.of(List.of(), UpperCardinalities.ZERO), - Arguments.of(List.of(UpperCardinality.of(3)), UpperCardinality.of(3)), - Arguments.of( - List.of( - UpperCardinality.of(2), - UpperCardinality.of(3) - ), - UpperCardinality.of(5) - ), - Arguments.of(List.of(UpperCardinalities.UNBOUNDED), UpperCardinalities.UNBOUNDED), - Arguments.of( - List.of( - UpperCardinalities.UNBOUNDED, - UpperCardinalities.UNBOUNDED - ), - UpperCardinalities.UNBOUNDED - ), - Arguments.of( - List.of( - UpperCardinalities.UNBOUNDED, - UpperCardinality.of(3) - ), - UpperCardinalities.UNBOUNDED - ) - ); - } -} diff --git a/subprojects/store-query-viatra/src/test/java/tools/refinery/store/query/viatra/internal/cardinality/UpperCardinalitySumAggregationOperatorTest.java b/subprojects/store-query-viatra/src/test/java/tools/refinery/store/query/viatra/internal/cardinality/UpperCardinalitySumAggregationOperatorTest.java deleted file mode 100644 index 677eeeac..00000000 --- a/subprojects/store-query-viatra/src/test/java/tools/refinery/store/query/viatra/internal/cardinality/UpperCardinalitySumAggregationOperatorTest.java +++ /dev/null @@ -1,92 +0,0 @@ -/* - * SPDX-FileCopyrightText: 2021-2023 The Refinery Authors - * - * SPDX-License-Identifier: EPL-2.0 - */ -package tools.refinery.store.query.viatra.internal.cardinality; - -import org.junit.jupiter.api.BeforeEach; -import org.junit.jupiter.api.Test; -import tools.refinery.store.representation.cardinality.UpperCardinalities; -import tools.refinery.store.representation.cardinality.UpperCardinality; - -import static org.hamcrest.MatcherAssert.assertThat; -import static org.hamcrest.Matchers.equalTo; - -class UpperCardinalitySumAggregationOperatorTest { - private UpperCardinalitySumAggregationOperator.Accumulator accumulator; - - @BeforeEach - void beforeEach() { - accumulator = UpperCardinalitySumAggregationOperator.INSTANCE.createNeutral(); - } - - @Test - void emptyAggregationTest() { - assertResult(UpperCardinality.of(0)); - } - - @Test - void singleBoundedTest() { - insert(UpperCardinality.of(3)); - assertResult(UpperCardinality.of(3)); - } - - @Test - void multipleBoundedTest() { - insert(UpperCardinality.of(2)); - insert(UpperCardinality.of(3)); - assertResult(UpperCardinality.of(5)); - } - - @Test - void singleUnboundedTest() { - insert(UpperCardinalities.UNBOUNDED); - assertResult(UpperCardinalities.UNBOUNDED); - } - - @Test - void multipleUnboundedTest() { - insert(UpperCardinalities.UNBOUNDED); - insert(UpperCardinalities.UNBOUNDED); - assertResult(UpperCardinalities.UNBOUNDED); - } - - @Test - void removeBoundedTest() { - insert(UpperCardinality.of(2)); - insert(UpperCardinality.of(3)); - remove(UpperCardinality.of(2)); - assertResult(UpperCardinality.of(3)); - } - - @Test - void removeAllUnboundedTest() { - insert(UpperCardinalities.UNBOUNDED); - insert(UpperCardinality.of(3)); - remove(UpperCardinalities.UNBOUNDED); - assertResult(UpperCardinality.of(3)); - } - - @Test - void removeSomeUnboundedTest() { - insert(UpperCardinalities.UNBOUNDED); - insert(UpperCardinalities.UNBOUNDED); - insert(UpperCardinality.of(3)); - remove(UpperCardinalities.UNBOUNDED); - assertResult(UpperCardinalities.UNBOUNDED); - } - - private void insert(UpperCardinality value) { - accumulator = UpperCardinalitySumAggregationOperator.INSTANCE.update(accumulator, value, true); - } - - private void remove(UpperCardinality value) { - accumulator = UpperCardinalitySumAggregationOperator.INSTANCE.update(accumulator, value, false); - } - - private void assertResult(UpperCardinality expected) { - var result = UpperCardinalitySumAggregationOperator.INSTANCE.getAggregate(accumulator); - assertThat(result, equalTo(expected)); - } -} -- cgit v1.2.3-70-g09d2