From 16a9b534adec2c53b50f92a43c1623918b1c59c0 Mon Sep 17 00:00:00 2001 From: Kristóf Marussy Date: Thu, 7 Mar 2024 22:10:42 +0100 Subject: refactor: move terms and DNF into logic subproject --- subprojects/store-query/build.gradle.kts | 3 +- .../tools/refinery/store/query/Constraint.java | 82 ----- .../store/query/InvalidQueryException.java | 23 -- .../refinery/store/query/ModelQueryAdapter.java | 4 +- .../refinery/store/query/ModelQueryBuilder.java | 4 +- .../store/query/ModelQueryStoreAdapter.java | 4 +- .../store/query/dnf/AbstractQueryBuilder.java | 175 ---------- .../tools/refinery/store/query/dnf/AnyQuery.java | 16 - .../store/query/dnf/ClausePostProcessor.java | 362 --------------------- .../java/tools/refinery/store/query/dnf/Dnf.java | 235 ------------- .../tools/refinery/store/query/dnf/DnfBuilder.java | 225 ------------- .../tools/refinery/store/query/dnf/DnfClause.java | 37 --- .../refinery/store/query/dnf/DnfPostProcessor.java | 112 ------- .../tools/refinery/store/query/dnf/DnfUtils.java | 24 -- .../store/query/dnf/FunctionalDependency.java | 22 -- .../refinery/store/query/dnf/FunctionalQuery.java | 126 ------- .../store/query/dnf/FunctionalQueryBuilder.java | 29 -- .../store/query/dnf/InvalidClauseException.java | 35 -- .../java/tools/refinery/store/query/dnf/Query.java | 202 ------------ .../refinery/store/query/dnf/QueryBuilder.java | 27 -- .../refinery/store/query/dnf/RelationalQuery.java | 77 ----- .../store/query/dnf/SymbolicParameter.java | 53 --- .../store/query/dnf/callback/ClauseCallback0.java | 15 - .../query/dnf/callback/ClauseCallback1Data0.java | 16 - .../query/dnf/callback/ClauseCallback1Data1.java | 16 - .../query/dnf/callback/ClauseCallback2Data0.java | 16 - .../query/dnf/callback/ClauseCallback2Data1.java | 17 - .../query/dnf/callback/ClauseCallback2Data2.java | 16 - .../query/dnf/callback/ClauseCallback3Data0.java | 16 - .../query/dnf/callback/ClauseCallback3Data1.java | 17 - .../query/dnf/callback/ClauseCallback3Data2.java | 17 - .../query/dnf/callback/ClauseCallback3Data3.java | 16 - .../query/dnf/callback/ClauseCallback4Data0.java | 16 - .../query/dnf/callback/ClauseCallback4Data1.java | 17 - .../query/dnf/callback/ClauseCallback4Data2.java | 17 - .../query/dnf/callback/ClauseCallback4Data3.java | 17 - .../query/dnf/callback/ClauseCallback4Data4.java | 16 - .../dnf/callback/FunctionalQueryCallback0.java | 14 - .../dnf/callback/FunctionalQueryCallback1.java | 15 - .../dnf/callback/FunctionalQueryCallback2.java | 15 - .../dnf/callback/FunctionalQueryCallback3.java | 16 - .../dnf/callback/FunctionalQueryCallback4.java | 16 - .../store/query/dnf/callback/QueryCallback0.java | 13 - .../store/query/dnf/callback/QueryCallback1.java | 14 - .../store/query/dnf/callback/QueryCallback2.java | 14 - .../store/query/dnf/callback/QueryCallback3.java | 14 - .../store/query/dnf/callback/QueryCallback4.java | 14 - .../query/equality/DeepDnfEqualityChecker.java | 77 ----- .../store/query/equality/DnfEqualityChecker.java | 17 - .../query/equality/LiteralEqualityHelper.java | 27 -- .../query/equality/LiteralHashCodeHelper.java | 17 - .../SubstitutingLiteralEqualityHelper.java | 59 ---- .../SubstitutingLiteralHashCodeHelper.java | 42 --- .../store/query/literal/AbstractCallLiteral.java | 135 -------- .../store/query/literal/AbstractCountLiteral.java | 107 ------ .../store/query/literal/AbstractLiteral.java | 34 -- .../store/query/literal/AggregationLiteral.java | 143 -------- .../store/query/literal/AssignLiteral.java | 88 ----- .../store/query/literal/BooleanLiteral.java | 69 ---- .../refinery/store/query/literal/CallLiteral.java | 134 -------- .../refinery/store/query/literal/CallPolarity.java | 39 --- .../refinery/store/query/literal/CanNegate.java | 10 - .../refinery/store/query/literal/CheckLiteral.java | 95 ------ .../refinery/store/query/literal/Connectivity.java | 18 - .../store/query/literal/ConstantLiteral.java | 73 ----- .../refinery/store/query/literal/CountLiteral.java | 45 --- .../store/query/literal/EquivalenceLiteral.java | 100 ------ .../store/query/literal/LeftJoinLiteral.java | 140 -------- .../refinery/store/query/literal/Literal.java | 32 -- .../refinery/store/query/literal/Literals.java | 22 -- .../refinery/store/query/literal/Reduction.java | 31 -- .../literal/RepresentativeElectionLiteral.java | 119 ------- .../store/query/resultset/AbstractResultSet.java | 2 +- .../store/query/resultset/AnyResultSet.java | 2 +- .../store/query/resultset/EmptyResultSet.java | 2 +- .../store/query/resultset/OrderedResultSet.java | 2 +- .../refinery/store/query/resultset/ResultSet.java | 2 +- .../query/rewriter/AbstractRecursiveRewriter.java | 26 -- .../rewriter/ClauseInputParameterResolver.java | 160 --------- .../store/query/rewriter/CompositeRewriter.java | 29 -- .../refinery/store/query/rewriter/DnfRewriter.java | 24 -- .../store/query/rewriter/DuplicateDnfRemover.java | 98 ------ .../query/rewriter/InputParameterResolver.java | 51 --- .../query/substitution/MapBasedSubstitution.java | 18 - .../query/substitution/RenewingSubstitution.java | 20 -- .../query/substitution/StatelessSubstitution.java | 23 -- .../store/query/substitution/Substitution.java | 29 -- .../query/substitution/SubstitutionBuilder.java | 79 ----- .../refinery/store/query/term/AbstractTerm.java | 47 --- .../refinery/store/query/term/Aggregator.java | 18 - .../refinery/store/query/term/AnyDataVariable.java | 55 ---- .../tools/refinery/store/query/term/AnyTerm.java | 24 -- .../refinery/store/query/term/AssignedValue.java | 13 - .../refinery/store/query/term/BinaryTerm.java | 106 ------ .../refinery/store/query/term/ConstantTerm.java | 67 ---- .../refinery/store/query/term/DataVariable.java | 103 ------ .../store/query/term/ExtremeValueAggregator.java | 108 ------ .../refinery/store/query/term/NodeVariable.java | 71 ---- .../tools/refinery/store/query/term/Parameter.java | 68 ---- .../store/query/term/ParameterDirection.java | 22 -- .../store/query/term/StatefulAggregate.java | 22 -- .../store/query/term/StatefulAggregator.java | 28 -- .../store/query/term/StatelessAggregator.java | 25 -- .../java/tools/refinery/store/query/term/Term.java | 26 -- .../tools/refinery/store/query/term/UnaryTerm.java | 74 ----- .../tools/refinery/store/query/term/Variable.java | 88 ----- .../store/query/term/bool/BoolAndTerm.java | 31 -- .../store/query/term/bool/BoolBinaryTerm.java | 15 - .../store/query/term/bool/BoolNotTerm.java | 31 -- .../refinery/store/query/term/bool/BoolOrTerm.java | 31 -- .../refinery/store/query/term/bool/BoolTerms.java | 35 -- .../store/query/term/bool/BoolXorTerm.java | 31 -- .../query/term/comparable/ComparisonTerm.java | 19 -- .../store/query/term/comparable/EqTerm.java | 30 -- .../store/query/term/comparable/GreaterEqTerm.java | 30 -- .../store/query/term/comparable/GreaterTerm.java | 30 -- .../store/query/term/comparable/LessEqTerm.java | 30 -- .../store/query/term/comparable/LessTerm.java | 30 -- .../store/query/term/comparable/NotEqTerm.java | 30 -- .../refinery/store/query/term/int_/IntAddTerm.java | 31 -- .../store/query/term/int_/IntBinaryTerm.java | 15 - .../refinery/store/query/term/int_/IntDivTerm.java | 31 -- .../refinery/store/query/term/int_/IntMaxTerm.java | 31 -- .../refinery/store/query/term/int_/IntMinTerm.java | 31 -- .../store/query/term/int_/IntMinusTerm.java | 30 -- .../refinery/store/query/term/int_/IntMulTerm.java | 31 -- .../store/query/term/int_/IntPlusTerm.java | 30 -- .../refinery/store/query/term/int_/IntPowTerm.java | 43 --- .../refinery/store/query/term/int_/IntSubTerm.java | 31 -- .../store/query/term/int_/IntSumAggregator.java | 40 --- .../refinery/store/query/term/int_/IntTerms.java | 94 ------ .../store/query/term/int_/IntUnaryTerm.java | 15 - .../store/query/term/int_/RealToIntTerm.java | 31 -- .../store/query/term/real/IntToRealTerm.java | 31 -- .../store/query/term/real/RealAddTerm.java | 31 -- .../store/query/term/real/RealBinaryTerm.java | 15 - .../store/query/term/real/RealDivTerm.java | 31 -- .../store/query/term/real/RealMaxTerm.java | 31 -- .../store/query/term/real/RealMinTerm.java | 31 -- .../store/query/term/real/RealMinusTerm.java | 30 -- .../store/query/term/real/RealMulTerm.java | 31 -- .../store/query/term/real/RealPlusTerm.java | 30 -- .../store/query/term/real/RealPowTerm.java | 31 -- .../store/query/term/real/RealSubTerm.java | 31 -- .../store/query/term/real/RealSumAggregator.java | 90 ----- .../refinery/store/query/term/real/RealTerms.java | 94 ------ .../store/query/term/real/RealUnaryTerm.java | 15 - .../uppercardinality/UpperCardinalityAddTerm.java | 31 -- .../UpperCardinalityBinaryTerm.java | 17 - .../uppercardinality/UpperCardinalityMaxTerm.java | 31 -- .../uppercardinality/UpperCardinalityMinTerm.java | 31 -- .../uppercardinality/UpperCardinalityMulTerm.java | 31 -- .../UpperCardinalitySumAggregator.java | 86 ----- .../uppercardinality/UpperCardinalityTerms.java | 73 ----- .../store/query/valuation/MapBasedValuation.java | 22 -- .../store/query/valuation/RestrictedValuation.java | 21 -- .../query/valuation/SubstitutedValuation.java | 16 - .../refinery/store/query/valuation/Valuation.java | 37 --- .../store/query/valuation/ValuationBuilder.java | 40 --- .../store/query/view/AbstractFunctionView.java | 4 +- .../refinery/store/query/view/AnySymbolView.java | 4 +- .../refinery/store/query/view/FilteredView.java | 2 +- .../refinery/store/query/view/ForbiddenView.java | 2 +- .../refinery/store/query/view/FunctionView.java | 2 +- .../tools/refinery/store/query/view/MayView.java | 2 +- .../tools/refinery/store/query/view/MustView.java | 2 +- .../store/query/view/NodeFunctionView.java | 2 +- .../store/query/view/TuplePreservingView.java | 2 +- .../dnf/DnfBuilderLiteralEliminationTest.java | 259 --------------- .../dnf/DnfBuilderVariableUnificationTest.java | 325 ------------------ .../store/query/dnf/DnfToDefinitionStringTest.java | 157 --------- .../refinery/store/query/dnf/HashCodeTest.java | 67 ---- .../store/query/dnf/TopologicalSortTest.java | 113 ------- .../store/query/dnf/VariableDirectionTest.java | 251 -------------- .../query/literal/AggregationLiteralTest.java | 89 ----- .../store/query/literal/CallLiteralTest.java | 94 ------ .../query/rewriter/DuplicateDnfRemoverTest.java | 164 ---------- .../query/rewriter/InputParameterResolverTest.java | 228 ------------- .../store/query/term/TermSubstitutionTest.java | 97 ------ .../query/term/bool/BoolTermsEvaluateTest.java | 75 ----- .../query/term/int_/IntTermsEvaluateTest.java | 259 --------------- .../query/term/real/RealTermEvaluateTest.java | 238 -------------- .../UpperCardinalitySumAggregatorStreamTest.java | 56 ---- .../UpperCardinalitySumAggregatorTest.java | 80 ----- .../UpperCardinalityTermsEvaluateTest.java | 104 ------ .../query/tests/StructurallyEqualToRawTest.java | 159 --------- .../store/query/tests/StructurallyEqualToTest.java | 127 -------- .../MismatchDescribingDnfEqualityChecker.java | 68 ---- .../refinery/store/query/tests/QueryMatchers.java | 46 --- .../store/query/tests/StructurallyEqualTo.java | 41 --- .../store/query/tests/StructurallyEqualToRaw.java | 51 --- 191 files changed, 23 insertions(+), 10434 deletions(-) delete mode 100644 subprojects/store-query/src/main/java/tools/refinery/store/query/Constraint.java delete mode 100644 subprojects/store-query/src/main/java/tools/refinery/store/query/InvalidQueryException.java delete mode 100644 subprojects/store-query/src/main/java/tools/refinery/store/query/dnf/AbstractQueryBuilder.java delete mode 100644 subprojects/store-query/src/main/java/tools/refinery/store/query/dnf/AnyQuery.java delete mode 100644 subprojects/store-query/src/main/java/tools/refinery/store/query/dnf/ClausePostProcessor.java delete mode 100644 subprojects/store-query/src/main/java/tools/refinery/store/query/dnf/Dnf.java delete mode 100644 subprojects/store-query/src/main/java/tools/refinery/store/query/dnf/DnfBuilder.java delete mode 100644 subprojects/store-query/src/main/java/tools/refinery/store/query/dnf/DnfClause.java delete mode 100644 subprojects/store-query/src/main/java/tools/refinery/store/query/dnf/DnfPostProcessor.java delete mode 100644 subprojects/store-query/src/main/java/tools/refinery/store/query/dnf/DnfUtils.java delete mode 100644 subprojects/store-query/src/main/java/tools/refinery/store/query/dnf/FunctionalDependency.java delete mode 100644 subprojects/store-query/src/main/java/tools/refinery/store/query/dnf/FunctionalQuery.java delete mode 100644 subprojects/store-query/src/main/java/tools/refinery/store/query/dnf/FunctionalQueryBuilder.java delete mode 100644 subprojects/store-query/src/main/java/tools/refinery/store/query/dnf/InvalidClauseException.java delete mode 100644 subprojects/store-query/src/main/java/tools/refinery/store/query/dnf/Query.java delete mode 100644 subprojects/store-query/src/main/java/tools/refinery/store/query/dnf/QueryBuilder.java delete mode 100644 subprojects/store-query/src/main/java/tools/refinery/store/query/dnf/RelationalQuery.java delete mode 100644 subprojects/store-query/src/main/java/tools/refinery/store/query/dnf/SymbolicParameter.java delete mode 100644 subprojects/store-query/src/main/java/tools/refinery/store/query/dnf/callback/ClauseCallback0.java delete mode 100644 subprojects/store-query/src/main/java/tools/refinery/store/query/dnf/callback/ClauseCallback1Data0.java delete mode 100644 subprojects/store-query/src/main/java/tools/refinery/store/query/dnf/callback/ClauseCallback1Data1.java delete mode 100644 subprojects/store-query/src/main/java/tools/refinery/store/query/dnf/callback/ClauseCallback2Data0.java delete mode 100644 subprojects/store-query/src/main/java/tools/refinery/store/query/dnf/callback/ClauseCallback2Data1.java delete mode 100644 subprojects/store-query/src/main/java/tools/refinery/store/query/dnf/callback/ClauseCallback2Data2.java delete mode 100644 subprojects/store-query/src/main/java/tools/refinery/store/query/dnf/callback/ClauseCallback3Data0.java delete mode 100644 subprojects/store-query/src/main/java/tools/refinery/store/query/dnf/callback/ClauseCallback3Data1.java delete mode 100644 subprojects/store-query/src/main/java/tools/refinery/store/query/dnf/callback/ClauseCallback3Data2.java delete mode 100644 subprojects/store-query/src/main/java/tools/refinery/store/query/dnf/callback/ClauseCallback3Data3.java delete mode 100644 subprojects/store-query/src/main/java/tools/refinery/store/query/dnf/callback/ClauseCallback4Data0.java delete mode 100644 subprojects/store-query/src/main/java/tools/refinery/store/query/dnf/callback/ClauseCallback4Data1.java delete mode 100644 subprojects/store-query/src/main/java/tools/refinery/store/query/dnf/callback/ClauseCallback4Data2.java delete mode 100644 subprojects/store-query/src/main/java/tools/refinery/store/query/dnf/callback/ClauseCallback4Data3.java delete mode 100644 subprojects/store-query/src/main/java/tools/refinery/store/query/dnf/callback/ClauseCallback4Data4.java delete mode 100644 subprojects/store-query/src/main/java/tools/refinery/store/query/dnf/callback/FunctionalQueryCallback0.java delete mode 100644 subprojects/store-query/src/main/java/tools/refinery/store/query/dnf/callback/FunctionalQueryCallback1.java delete mode 100644 subprojects/store-query/src/main/java/tools/refinery/store/query/dnf/callback/FunctionalQueryCallback2.java delete mode 100644 subprojects/store-query/src/main/java/tools/refinery/store/query/dnf/callback/FunctionalQueryCallback3.java delete mode 100644 subprojects/store-query/src/main/java/tools/refinery/store/query/dnf/callback/FunctionalQueryCallback4.java delete mode 100644 subprojects/store-query/src/main/java/tools/refinery/store/query/dnf/callback/QueryCallback0.java delete mode 100644 subprojects/store-query/src/main/java/tools/refinery/store/query/dnf/callback/QueryCallback1.java delete mode 100644 subprojects/store-query/src/main/java/tools/refinery/store/query/dnf/callback/QueryCallback2.java delete mode 100644 subprojects/store-query/src/main/java/tools/refinery/store/query/dnf/callback/QueryCallback3.java delete mode 100644 subprojects/store-query/src/main/java/tools/refinery/store/query/dnf/callback/QueryCallback4.java delete mode 100644 subprojects/store-query/src/main/java/tools/refinery/store/query/equality/DeepDnfEqualityChecker.java delete mode 100644 subprojects/store-query/src/main/java/tools/refinery/store/query/equality/DnfEqualityChecker.java delete mode 100644 subprojects/store-query/src/main/java/tools/refinery/store/query/equality/LiteralEqualityHelper.java delete mode 100644 subprojects/store-query/src/main/java/tools/refinery/store/query/equality/LiteralHashCodeHelper.java delete mode 100644 subprojects/store-query/src/main/java/tools/refinery/store/query/equality/SubstitutingLiteralEqualityHelper.java delete mode 100644 subprojects/store-query/src/main/java/tools/refinery/store/query/equality/SubstitutingLiteralHashCodeHelper.java delete mode 100644 subprojects/store-query/src/main/java/tools/refinery/store/query/literal/AbstractCallLiteral.java delete mode 100644 subprojects/store-query/src/main/java/tools/refinery/store/query/literal/AbstractCountLiteral.java delete mode 100644 subprojects/store-query/src/main/java/tools/refinery/store/query/literal/AbstractLiteral.java delete mode 100644 subprojects/store-query/src/main/java/tools/refinery/store/query/literal/AggregationLiteral.java delete mode 100644 subprojects/store-query/src/main/java/tools/refinery/store/query/literal/AssignLiteral.java delete mode 100644 subprojects/store-query/src/main/java/tools/refinery/store/query/literal/BooleanLiteral.java delete mode 100644 subprojects/store-query/src/main/java/tools/refinery/store/query/literal/CallLiteral.java delete mode 100644 subprojects/store-query/src/main/java/tools/refinery/store/query/literal/CallPolarity.java delete mode 100644 subprojects/store-query/src/main/java/tools/refinery/store/query/literal/CanNegate.java delete mode 100644 subprojects/store-query/src/main/java/tools/refinery/store/query/literal/CheckLiteral.java delete mode 100644 subprojects/store-query/src/main/java/tools/refinery/store/query/literal/Connectivity.java delete mode 100644 subprojects/store-query/src/main/java/tools/refinery/store/query/literal/ConstantLiteral.java delete mode 100644 subprojects/store-query/src/main/java/tools/refinery/store/query/literal/CountLiteral.java delete mode 100644 subprojects/store-query/src/main/java/tools/refinery/store/query/literal/EquivalenceLiteral.java delete mode 100644 subprojects/store-query/src/main/java/tools/refinery/store/query/literal/LeftJoinLiteral.java delete mode 100644 subprojects/store-query/src/main/java/tools/refinery/store/query/literal/Literal.java delete mode 100644 subprojects/store-query/src/main/java/tools/refinery/store/query/literal/Literals.java delete mode 100644 subprojects/store-query/src/main/java/tools/refinery/store/query/literal/Reduction.java delete mode 100644 subprojects/store-query/src/main/java/tools/refinery/store/query/literal/RepresentativeElectionLiteral.java delete mode 100644 subprojects/store-query/src/main/java/tools/refinery/store/query/rewriter/AbstractRecursiveRewriter.java delete mode 100644 subprojects/store-query/src/main/java/tools/refinery/store/query/rewriter/ClauseInputParameterResolver.java delete mode 100644 subprojects/store-query/src/main/java/tools/refinery/store/query/rewriter/CompositeRewriter.java delete mode 100644 subprojects/store-query/src/main/java/tools/refinery/store/query/rewriter/DnfRewriter.java delete mode 100644 subprojects/store-query/src/main/java/tools/refinery/store/query/rewriter/DuplicateDnfRemover.java delete mode 100644 subprojects/store-query/src/main/java/tools/refinery/store/query/rewriter/InputParameterResolver.java delete mode 100644 subprojects/store-query/src/main/java/tools/refinery/store/query/substitution/MapBasedSubstitution.java delete mode 100644 subprojects/store-query/src/main/java/tools/refinery/store/query/substitution/RenewingSubstitution.java delete mode 100644 subprojects/store-query/src/main/java/tools/refinery/store/query/substitution/StatelessSubstitution.java delete mode 100644 subprojects/store-query/src/main/java/tools/refinery/store/query/substitution/Substitution.java delete mode 100644 subprojects/store-query/src/main/java/tools/refinery/store/query/substitution/SubstitutionBuilder.java delete mode 100644 subprojects/store-query/src/main/java/tools/refinery/store/query/term/AbstractTerm.java delete mode 100644 subprojects/store-query/src/main/java/tools/refinery/store/query/term/Aggregator.java delete mode 100644 subprojects/store-query/src/main/java/tools/refinery/store/query/term/AnyDataVariable.java delete mode 100644 subprojects/store-query/src/main/java/tools/refinery/store/query/term/AnyTerm.java delete mode 100644 subprojects/store-query/src/main/java/tools/refinery/store/query/term/AssignedValue.java delete mode 100644 subprojects/store-query/src/main/java/tools/refinery/store/query/term/BinaryTerm.java delete mode 100644 subprojects/store-query/src/main/java/tools/refinery/store/query/term/ConstantTerm.java delete mode 100644 subprojects/store-query/src/main/java/tools/refinery/store/query/term/DataVariable.java delete mode 100644 subprojects/store-query/src/main/java/tools/refinery/store/query/term/ExtremeValueAggregator.java delete mode 100644 subprojects/store-query/src/main/java/tools/refinery/store/query/term/NodeVariable.java delete mode 100644 subprojects/store-query/src/main/java/tools/refinery/store/query/term/Parameter.java delete mode 100644 subprojects/store-query/src/main/java/tools/refinery/store/query/term/ParameterDirection.java delete mode 100644 subprojects/store-query/src/main/java/tools/refinery/store/query/term/StatefulAggregate.java delete mode 100644 subprojects/store-query/src/main/java/tools/refinery/store/query/term/StatefulAggregator.java delete mode 100644 subprojects/store-query/src/main/java/tools/refinery/store/query/term/StatelessAggregator.java delete mode 100644 subprojects/store-query/src/main/java/tools/refinery/store/query/term/Term.java delete mode 100644 subprojects/store-query/src/main/java/tools/refinery/store/query/term/UnaryTerm.java delete mode 100644 subprojects/store-query/src/main/java/tools/refinery/store/query/term/Variable.java delete mode 100644 subprojects/store-query/src/main/java/tools/refinery/store/query/term/bool/BoolAndTerm.java delete mode 100644 subprojects/store-query/src/main/java/tools/refinery/store/query/term/bool/BoolBinaryTerm.java delete mode 100644 subprojects/store-query/src/main/java/tools/refinery/store/query/term/bool/BoolNotTerm.java delete mode 100644 subprojects/store-query/src/main/java/tools/refinery/store/query/term/bool/BoolOrTerm.java delete mode 100644 subprojects/store-query/src/main/java/tools/refinery/store/query/term/bool/BoolTerms.java delete mode 100644 subprojects/store-query/src/main/java/tools/refinery/store/query/term/bool/BoolXorTerm.java delete mode 100644 subprojects/store-query/src/main/java/tools/refinery/store/query/term/comparable/ComparisonTerm.java delete mode 100644 subprojects/store-query/src/main/java/tools/refinery/store/query/term/comparable/EqTerm.java delete mode 100644 subprojects/store-query/src/main/java/tools/refinery/store/query/term/comparable/GreaterEqTerm.java delete mode 100644 subprojects/store-query/src/main/java/tools/refinery/store/query/term/comparable/GreaterTerm.java delete mode 100644 subprojects/store-query/src/main/java/tools/refinery/store/query/term/comparable/LessEqTerm.java delete mode 100644 subprojects/store-query/src/main/java/tools/refinery/store/query/term/comparable/LessTerm.java delete mode 100644 subprojects/store-query/src/main/java/tools/refinery/store/query/term/comparable/NotEqTerm.java delete mode 100644 subprojects/store-query/src/main/java/tools/refinery/store/query/term/int_/IntAddTerm.java delete mode 100644 subprojects/store-query/src/main/java/tools/refinery/store/query/term/int_/IntBinaryTerm.java delete mode 100644 subprojects/store-query/src/main/java/tools/refinery/store/query/term/int_/IntDivTerm.java delete mode 100644 subprojects/store-query/src/main/java/tools/refinery/store/query/term/int_/IntMaxTerm.java delete mode 100644 subprojects/store-query/src/main/java/tools/refinery/store/query/term/int_/IntMinTerm.java delete mode 100644 subprojects/store-query/src/main/java/tools/refinery/store/query/term/int_/IntMinusTerm.java delete mode 100644 subprojects/store-query/src/main/java/tools/refinery/store/query/term/int_/IntMulTerm.java delete mode 100644 subprojects/store-query/src/main/java/tools/refinery/store/query/term/int_/IntPlusTerm.java delete mode 100644 subprojects/store-query/src/main/java/tools/refinery/store/query/term/int_/IntPowTerm.java delete mode 100644 subprojects/store-query/src/main/java/tools/refinery/store/query/term/int_/IntSubTerm.java delete mode 100644 subprojects/store-query/src/main/java/tools/refinery/store/query/term/int_/IntSumAggregator.java delete mode 100644 subprojects/store-query/src/main/java/tools/refinery/store/query/term/int_/IntTerms.java delete mode 100644 subprojects/store-query/src/main/java/tools/refinery/store/query/term/int_/IntUnaryTerm.java delete mode 100644 subprojects/store-query/src/main/java/tools/refinery/store/query/term/int_/RealToIntTerm.java delete mode 100644 subprojects/store-query/src/main/java/tools/refinery/store/query/term/real/IntToRealTerm.java delete mode 100644 subprojects/store-query/src/main/java/tools/refinery/store/query/term/real/RealAddTerm.java delete mode 100644 subprojects/store-query/src/main/java/tools/refinery/store/query/term/real/RealBinaryTerm.java delete mode 100644 subprojects/store-query/src/main/java/tools/refinery/store/query/term/real/RealDivTerm.java delete mode 100644 subprojects/store-query/src/main/java/tools/refinery/store/query/term/real/RealMaxTerm.java delete mode 100644 subprojects/store-query/src/main/java/tools/refinery/store/query/term/real/RealMinTerm.java delete mode 100644 subprojects/store-query/src/main/java/tools/refinery/store/query/term/real/RealMinusTerm.java delete mode 100644 subprojects/store-query/src/main/java/tools/refinery/store/query/term/real/RealMulTerm.java delete mode 100644 subprojects/store-query/src/main/java/tools/refinery/store/query/term/real/RealPlusTerm.java delete mode 100644 subprojects/store-query/src/main/java/tools/refinery/store/query/term/real/RealPowTerm.java delete mode 100644 subprojects/store-query/src/main/java/tools/refinery/store/query/term/real/RealSubTerm.java delete mode 100644 subprojects/store-query/src/main/java/tools/refinery/store/query/term/real/RealSumAggregator.java delete mode 100644 subprojects/store-query/src/main/java/tools/refinery/store/query/term/real/RealTerms.java delete mode 100644 subprojects/store-query/src/main/java/tools/refinery/store/query/term/real/RealUnaryTerm.java delete mode 100644 subprojects/store-query/src/main/java/tools/refinery/store/query/term/uppercardinality/UpperCardinalityAddTerm.java delete mode 100644 subprojects/store-query/src/main/java/tools/refinery/store/query/term/uppercardinality/UpperCardinalityBinaryTerm.java delete mode 100644 subprojects/store-query/src/main/java/tools/refinery/store/query/term/uppercardinality/UpperCardinalityMaxTerm.java delete mode 100644 subprojects/store-query/src/main/java/tools/refinery/store/query/term/uppercardinality/UpperCardinalityMinTerm.java delete mode 100644 subprojects/store-query/src/main/java/tools/refinery/store/query/term/uppercardinality/UpperCardinalityMulTerm.java delete mode 100644 subprojects/store-query/src/main/java/tools/refinery/store/query/term/uppercardinality/UpperCardinalitySumAggregator.java delete mode 100644 subprojects/store-query/src/main/java/tools/refinery/store/query/term/uppercardinality/UpperCardinalityTerms.java delete mode 100644 subprojects/store-query/src/main/java/tools/refinery/store/query/valuation/MapBasedValuation.java delete mode 100644 subprojects/store-query/src/main/java/tools/refinery/store/query/valuation/RestrictedValuation.java delete mode 100644 subprojects/store-query/src/main/java/tools/refinery/store/query/valuation/SubstitutedValuation.java delete mode 100644 subprojects/store-query/src/main/java/tools/refinery/store/query/valuation/Valuation.java delete mode 100644 subprojects/store-query/src/main/java/tools/refinery/store/query/valuation/ValuationBuilder.java delete mode 100644 subprojects/store-query/src/test/java/tools/refinery/store/query/dnf/DnfBuilderLiteralEliminationTest.java delete mode 100644 subprojects/store-query/src/test/java/tools/refinery/store/query/dnf/DnfBuilderVariableUnificationTest.java delete mode 100644 subprojects/store-query/src/test/java/tools/refinery/store/query/dnf/DnfToDefinitionStringTest.java delete mode 100644 subprojects/store-query/src/test/java/tools/refinery/store/query/dnf/HashCodeTest.java delete mode 100644 subprojects/store-query/src/test/java/tools/refinery/store/query/dnf/TopologicalSortTest.java delete mode 100644 subprojects/store-query/src/test/java/tools/refinery/store/query/dnf/VariableDirectionTest.java delete mode 100644 subprojects/store-query/src/test/java/tools/refinery/store/query/literal/AggregationLiteralTest.java delete mode 100644 subprojects/store-query/src/test/java/tools/refinery/store/query/literal/CallLiteralTest.java delete mode 100644 subprojects/store-query/src/test/java/tools/refinery/store/query/rewriter/DuplicateDnfRemoverTest.java delete mode 100644 subprojects/store-query/src/test/java/tools/refinery/store/query/rewriter/InputParameterResolverTest.java delete mode 100644 subprojects/store-query/src/test/java/tools/refinery/store/query/term/TermSubstitutionTest.java delete mode 100644 subprojects/store-query/src/test/java/tools/refinery/store/query/term/bool/BoolTermsEvaluateTest.java delete mode 100644 subprojects/store-query/src/test/java/tools/refinery/store/query/term/int_/IntTermsEvaluateTest.java delete mode 100644 subprojects/store-query/src/test/java/tools/refinery/store/query/term/real/RealTermEvaluateTest.java delete mode 100644 subprojects/store-query/src/test/java/tools/refinery/store/query/term/uppercardinality/UpperCardinalitySumAggregatorStreamTest.java delete mode 100644 subprojects/store-query/src/test/java/tools/refinery/store/query/term/uppercardinality/UpperCardinalitySumAggregatorTest.java delete mode 100644 subprojects/store-query/src/test/java/tools/refinery/store/query/term/uppercardinality/UpperCardinalityTermsEvaluateTest.java delete mode 100644 subprojects/store-query/src/test/java/tools/refinery/store/query/tests/StructurallyEqualToRawTest.java delete mode 100644 subprojects/store-query/src/test/java/tools/refinery/store/query/tests/StructurallyEqualToTest.java delete mode 100644 subprojects/store-query/src/testFixtures/java/tools/refinery/store/query/tests/MismatchDescribingDnfEqualityChecker.java delete mode 100644 subprojects/store-query/src/testFixtures/java/tools/refinery/store/query/tests/QueryMatchers.java delete mode 100644 subprojects/store-query/src/testFixtures/java/tools/refinery/store/query/tests/StructurallyEqualTo.java delete mode 100644 subprojects/store-query/src/testFixtures/java/tools/refinery/store/query/tests/StructurallyEqualToRaw.java (limited to 'subprojects/store-query') diff --git a/subprojects/store-query/build.gradle.kts b/subprojects/store-query/build.gradle.kts index 4d8e2605..f5cbdebc 100644 --- a/subprojects/store-query/build.gradle.kts +++ b/subprojects/store-query/build.gradle.kts @@ -6,10 +6,9 @@ plugins { id("tools.refinery.gradle.java-library") - id("tools.refinery.gradle.java-test-fixtures") } dependencies { + api(project(":refinery-logic")) api(project(":refinery-store")) - testFixturesApi(libs.hamcrest) } 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 deleted file mode 100644 index 375c582a..00000000 --- a/subprojects/store-query/src/main/java/tools/refinery/store/query/Constraint.java +++ /dev/null @@ -1,82 +0,0 @@ -/* - * SPDX-FileCopyrightText: 2021-2024 The Refinery Authors - * - * SPDX-License-Identifier: EPL-2.0 - */ -package tools.refinery.store.query; - -import tools.refinery.store.query.equality.LiteralEqualityHelper; -import tools.refinery.store.query.literal.*; -import tools.refinery.store.query.term.*; - -import java.util.List; - -public interface Constraint { - String name(); - - List getParameters(); - - default int arity() { - return getParameters().size(); - } - - default boolean invalidIndex(int i) { - return i < 0 || i >= arity(); - } - - default Reduction getReduction() { - return Reduction.NOT_REDUCIBLE; - } - - default boolean equals(LiteralEqualityHelper helper, Constraint other) { - return equals(other); - } - - default String toReferenceString() { - return name(); - } - - default CallLiteral call(CallPolarity polarity, List arguments) { - return new CallLiteral(polarity, this, arguments); - } - - default CallLiteral call(CallPolarity polarity, Variable... arguments) { - return call(polarity, List.of(arguments)); - } - - default CallLiteral call(Variable... arguments) { - return call(CallPolarity.POSITIVE, arguments); - } - - default CallLiteral callTransitive(NodeVariable left, NodeVariable right) { - return call(CallPolarity.TRANSITIVE, List.of(left, right)); - } - - default AssignedValue count(List arguments) { - return targetVariable -> new CountLiteral(targetVariable, this, arguments); - } - - default AssignedValue count(Variable... arguments) { - return count(List.of(arguments)); - } - - default AssignedValue aggregateBy(DataVariable inputVariable, Aggregator aggregator, - List arguments) { - return targetVariable -> new AggregationLiteral<>(targetVariable, aggregator, inputVariable, this, arguments); - } - - default AssignedValue aggregateBy(DataVariable inputVariable, Aggregator aggregator, - Variable... arguments) { - return aggregateBy(inputVariable, aggregator, List.of(arguments)); - } - - default AssignedValue leftJoinBy(DataVariable placeholderVariable, T defaultValue, - List arguments) { - return targetVariable -> new LeftJoinLiteral<>(targetVariable, placeholderVariable, defaultValue, this, - arguments); - } - - default AssignedValue leftJoinBy(DataVariable inputVariable, T defaultValue, Variable... arguments) { - return leftJoinBy(inputVariable, defaultValue, List.of(arguments)); - } -} diff --git a/subprojects/store-query/src/main/java/tools/refinery/store/query/InvalidQueryException.java b/subprojects/store-query/src/main/java/tools/refinery/store/query/InvalidQueryException.java deleted file mode 100644 index c39277a0..00000000 --- a/subprojects/store-query/src/main/java/tools/refinery/store/query/InvalidQueryException.java +++ /dev/null @@ -1,23 +0,0 @@ -/* - * SPDX-FileCopyrightText: 2023 The Refinery Authors - * - * SPDX-License-Identifier: EPL-2.0 - */ -package tools.refinery.store.query; - -public class InvalidQueryException extends RuntimeException { - public InvalidQueryException() { - } - - public InvalidQueryException(String message) { - super(message); - } - - public InvalidQueryException(String message, Throwable cause) { - super(message, cause); - } - - public InvalidQueryException(Throwable cause) { - super(cause); - } -} diff --git a/subprojects/store-query/src/main/java/tools/refinery/store/query/ModelQueryAdapter.java b/subprojects/store-query/src/main/java/tools/refinery/store/query/ModelQueryAdapter.java index 1fa96a07..513825b7 100644 --- a/subprojects/store-query/src/main/java/tools/refinery/store/query/ModelQueryAdapter.java +++ b/subprojects/store-query/src/main/java/tools/refinery/store/query/ModelQueryAdapter.java @@ -6,8 +6,8 @@ package tools.refinery.store.query; import tools.refinery.store.adapter.ModelAdapter; -import tools.refinery.store.query.dnf.AnyQuery; -import tools.refinery.store.query.dnf.Query; +import tools.refinery.logic.dnf.AnyQuery; +import tools.refinery.logic.dnf.Query; import tools.refinery.store.query.resultset.AnyResultSet; import tools.refinery.store.query.resultset.ResultSet; diff --git a/subprojects/store-query/src/main/java/tools/refinery/store/query/ModelQueryBuilder.java b/subprojects/store-query/src/main/java/tools/refinery/store/query/ModelQueryBuilder.java index 332e6381..71e2c5bf 100644 --- a/subprojects/store-query/src/main/java/tools/refinery/store/query/ModelQueryBuilder.java +++ b/subprojects/store-query/src/main/java/tools/refinery/store/query/ModelQueryBuilder.java @@ -7,8 +7,8 @@ package tools.refinery.store.query; import tools.refinery.store.adapter.ModelAdapterBuilder; import tools.refinery.store.model.ModelStore; -import tools.refinery.store.query.dnf.AnyQuery; -import tools.refinery.store.query.rewriter.DnfRewriter; +import tools.refinery.logic.dnf.AnyQuery; +import tools.refinery.logic.rewriter.DnfRewriter; import java.util.Collection; import java.util.List; diff --git a/subprojects/store-query/src/main/java/tools/refinery/store/query/ModelQueryStoreAdapter.java b/subprojects/store-query/src/main/java/tools/refinery/store/query/ModelQueryStoreAdapter.java index 8b67c5c1..fec8c999 100644 --- a/subprojects/store-query/src/main/java/tools/refinery/store/query/ModelQueryStoreAdapter.java +++ b/subprojects/store-query/src/main/java/tools/refinery/store/query/ModelQueryStoreAdapter.java @@ -7,8 +7,8 @@ package tools.refinery.store.query; import tools.refinery.store.adapter.ModelStoreAdapter; import tools.refinery.store.model.Model; -import tools.refinery.store.query.dnf.AnyQuery; -import tools.refinery.store.query.dnf.Query; +import tools.refinery.logic.dnf.AnyQuery; +import tools.refinery.logic.dnf.Query; import tools.refinery.store.query.view.AnySymbolView; import java.util.Collection; diff --git a/subprojects/store-query/src/main/java/tools/refinery/store/query/dnf/AbstractQueryBuilder.java b/subprojects/store-query/src/main/java/tools/refinery/store/query/dnf/AbstractQueryBuilder.java deleted file mode 100644 index 2a3e3ce0..00000000 --- a/subprojects/store-query/src/main/java/tools/refinery/store/query/dnf/AbstractQueryBuilder.java +++ /dev/null @@ -1,175 +0,0 @@ -/* - * SPDX-FileCopyrightText: 2021-2023 The Refinery Authors - * - * SPDX-License-Identifier: EPL-2.0 - */ -package tools.refinery.store.query.dnf; - -import tools.refinery.store.query.dnf.callback.*; -import tools.refinery.store.query.literal.Literal; -import tools.refinery.store.query.term.NodeVariable; -import tools.refinery.store.query.term.ParameterDirection; -import tools.refinery.store.query.term.Variable; - -import java.util.Collection; -import java.util.List; -import java.util.Set; - -public abstract class AbstractQueryBuilder> { - protected final DnfBuilder dnfBuilder; - - protected AbstractQueryBuilder(DnfBuilder dnfBuilder) { - this.dnfBuilder = dnfBuilder; - } - - protected abstract T self(); - - public NodeVariable parameter() { - return dnfBuilder.parameter(); - } - - public NodeVariable parameter(String name) { - return dnfBuilder.parameter(name); - } - - public NodeVariable parameter(ParameterDirection direction) { - return dnfBuilder.parameter(direction); - } - - public NodeVariable parameter(String name, ParameterDirection direction) { - return dnfBuilder.parameter(name, direction); - } - - public T parameter(NodeVariable variable) { - dnfBuilder.parameter(variable); - return self(); - } - - public T parameter(NodeVariable variable, ParameterDirection direction) { - dnfBuilder.parameter(variable, direction); - return self(); - } - - public T parameters(NodeVariable... variables) { - dnfBuilder.parameters(variables); - return self(); - } - - public T parameters(List variables) { - dnfBuilder.parameters(variables); - return self(); - } - - public T parameters(List variables, ParameterDirection direction) { - dnfBuilder.parameters(variables, direction); - return self(); - } - - public T symbolicParameters(List parameters) { - dnfBuilder.symbolicParameters(parameters); - return self(); - } - - public T functionalDependencies(Collection> functionalDependencies) { - dnfBuilder.functionalDependencies(functionalDependencies); - return self(); - } - - public T functionalDependency(FunctionalDependency functionalDependency) { - dnfBuilder.functionalDependency(functionalDependency); - return self(); - } - - public T functionalDependency(Set forEach, Set unique) { - dnfBuilder.functionalDependency(forEach, unique); - return self(); - } - - public T clause(ClauseCallback0 callback) { - dnfBuilder.clause(callback); - return self(); - } - - public T clause(ClauseCallback1Data0 callback) { - dnfBuilder.clause(callback); - return self(); - } - - public T clause(Class type1, ClauseCallback1Data1 callback) { - dnfBuilder.clause(type1, callback); - return self(); - } - - public T clause(ClauseCallback2Data0 callback) { - dnfBuilder.clause(callback); - return self(); - } - - public T clause(Class type1, ClauseCallback2Data1 callback) { - dnfBuilder.clause(type1, callback); - return self(); - } - - public T clause(Class type1, Class type2, ClauseCallback2Data2 callback) { - dnfBuilder.clause(type1, type2, callback); - return self(); - } - - public T clause(ClauseCallback3Data0 callback) { - dnfBuilder.clause(callback); - return self(); - } - - public T clause(Class type1, ClauseCallback3Data1 callback) { - dnfBuilder.clause(type1, callback); - return self(); - } - - public T clause(Class type1, Class type2, ClauseCallback3Data2 callback) { - dnfBuilder.clause(type1, type2, callback); - return self(); - } - - public T clause(Class type1, Class type2, Class type3, - ClauseCallback3Data3 callback) { - dnfBuilder.clause(type1, type2, type3, callback); - return self(); - } - - public T clause(ClauseCallback4Data0 callback) { - dnfBuilder.clause(callback); - return self(); - } - - public T clause(Class type1, ClauseCallback4Data1 callback) { - dnfBuilder.clause(type1, callback); - return self(); - } - - public T clause(Class type1, Class type2, ClauseCallback4Data2 callback) { - dnfBuilder.clause(type1, type2, callback); - return self(); - } - - public T clause(Class type1, Class type2, Class type3, - ClauseCallback4Data3 callback) { - dnfBuilder.clause(type1, type2, type3, callback); - return self(); - } - - public T clause(Class type1, Class type2, Class type3, Class type4, - ClauseCallback4Data4 callback) { - dnfBuilder.clause(type1, type2, type3, type4, callback); - return self(); - } - - public T clause(Literal... literals) { - dnfBuilder.clause(literals); - return self(); - } - - public T clause(Collection literals) { - dnfBuilder.clause(literals); - return self(); - } -} diff --git a/subprojects/store-query/src/main/java/tools/refinery/store/query/dnf/AnyQuery.java b/subprojects/store-query/src/main/java/tools/refinery/store/query/dnf/AnyQuery.java deleted file mode 100644 index 5e28af68..00000000 --- a/subprojects/store-query/src/main/java/tools/refinery/store/query/dnf/AnyQuery.java +++ /dev/null @@ -1,16 +0,0 @@ -/* - * SPDX-FileCopyrightText: 2021-2023 The Refinery Authors - * - * SPDX-License-Identifier: EPL-2.0 - */ -package tools.refinery.store.query.dnf; - -public sealed interface AnyQuery permits Query { - String name(); - - int arity(); - - Class valueType(); - - Dnf getDnf(); -} diff --git a/subprojects/store-query/src/main/java/tools/refinery/store/query/dnf/ClausePostProcessor.java b/subprojects/store-query/src/main/java/tools/refinery/store/query/dnf/ClausePostProcessor.java deleted file mode 100644 index 7cd05364..00000000 --- a/subprojects/store-query/src/main/java/tools/refinery/store/query/dnf/ClausePostProcessor.java +++ /dev/null @@ -1,362 +0,0 @@ -/* - * SPDX-FileCopyrightText: 2021-2024 The Refinery Authors - * - * SPDX-License-Identifier: EPL-2.0 - */ -package tools.refinery.store.query.dnf; - -import org.jetbrains.annotations.NotNull; -import tools.refinery.store.query.Constraint; -import tools.refinery.store.query.InvalidQueryException; -import tools.refinery.store.query.literal.*; -import tools.refinery.store.query.substitution.MapBasedSubstitution; -import tools.refinery.store.query.substitution.StatelessSubstitution; -import tools.refinery.store.query.substitution.Substitution; -import tools.refinery.store.query.term.ParameterDirection; -import tools.refinery.store.query.term.Variable; - -import java.util.*; -import java.util.function.Function; - -class ClausePostProcessor { - private final Map parameters; - private final List literals; - private final Map representatives = new LinkedHashMap<>(); - private final Map> equivalencePartition = new HashMap<>(); - private List substitutedLiterals; - private final Set existentiallyQuantifiedVariables = new LinkedHashSet<>(); - private Set positiveVariables; - private Map> variableToLiteralInputMap; - private PriorityQueue literalsWithAllInputsBound; - private LinkedHashSet topologicallySortedLiterals; - - public ClausePostProcessor(Map parameters, List literals) { - this.parameters = parameters; - this.literals = literals; - } - - public Result postProcessClause() { - mergeEquivalentNodeVariables(); - substitutedLiterals = new ArrayList<>(literals.size()); - keepParameterEquivalences(); - substituteLiterals(); - computeExistentiallyQuantifiedVariables(); - computePositiveVariables(); - validatePositiveRepresentatives(); - validatePrivateVariables(); - topologicallySortLiterals(); - var filteredLiterals = new ArrayList(topologicallySortedLiterals.size()); - for (var literal : topologicallySortedLiterals) { - var reducedLiteral = literal.reduce(); - if (BooleanLiteral.FALSE.equals(reducedLiteral)) { - return ConstantResult.ALWAYS_FALSE; - } else if (!BooleanLiteral.TRUE.equals(reducedLiteral)) { - filteredLiterals.add(reducedLiteral); - } - } - if (filteredLiterals.isEmpty()) { - return ConstantResult.ALWAYS_TRUE; - } - if (hasContradictoryCall(filteredLiterals)) { - return ConstantResult.ALWAYS_FALSE; - } - var clause = new DnfClause(Collections.unmodifiableSet(positiveVariables), - Collections.unmodifiableList(filteredLiterals)); - return new ClauseResult(clause); - } - - private void mergeEquivalentNodeVariables() { - for (var literal : literals) { - if (isPositiveEquivalence(literal)) { - var equivalenceLiteral = (EquivalenceLiteral) literal; - mergeVariables(equivalenceLiteral.getLeft(), equivalenceLiteral.getRight()); - } - } - } - - private static boolean isPositiveEquivalence(Literal literal) { - return literal instanceof EquivalenceLiteral equivalenceLiteral && equivalenceLiteral.isPositive(); - } - - private void mergeVariables(Variable left, Variable right) { - var leftRepresentative = getRepresentative(left); - var rightRepresentative = getRepresentative(right); - var leftInfo = parameters.get(leftRepresentative); - var rightInfo = parameters.get(rightRepresentative); - if (leftInfo != null && (rightInfo == null || leftInfo.index() <= rightInfo.index())) { - // Prefer the variable occurring earlier in the parameter list as a representative. - doMergeVariables(leftRepresentative, rightRepresentative); - } else { - doMergeVariables(rightRepresentative, leftRepresentative); - } - } - - private void doMergeVariables(Variable parentRepresentative, Variable newChildRepresentative) { - var parentSet = getEquivalentVariables(parentRepresentative); - var childSet = getEquivalentVariables(newChildRepresentative); - parentSet.addAll(childSet); - equivalencePartition.remove(newChildRepresentative); - for (var childEquivalentNodeVariable : childSet) { - representatives.put(childEquivalentNodeVariable, parentRepresentative); - } - } - - private Variable getRepresentative(Variable variable) { - return representatives.computeIfAbsent(variable, Function.identity()); - } - - private Set getEquivalentVariables(Variable variable) { - var representative = getRepresentative(variable); - if (!representative.equals(variable)) { - throw new AssertionError("NodeVariable %s already has a representative %s" - .formatted(variable, representative)); - } - return equivalencePartition.computeIfAbsent(variable, key -> { - var set = HashSet.newHashSet(1); - set.add(key); - return set; - }); - } - - private void keepParameterEquivalences() { - for (var pair : representatives.entrySet()) { - var left = pair.getKey(); - var right = pair.getValue(); - if (!left.equals(right) && parameters.containsKey(left) && parameters.containsKey(right)) { - substitutedLiterals.add(new EquivalenceLiteral(true, left, right)); - } - } - } - - private void substituteLiterals() { - Substitution substitution; - if (representatives.isEmpty()) { - substitution = null; - } else { - substitution = new MapBasedSubstitution(Collections.unmodifiableMap(representatives), - StatelessSubstitution.IDENTITY); - } - for (var literal : literals) { - if (isPositiveEquivalence(literal)) { - // We already retained all equivalences that cannot be replaced with substitutions in - // {@link#keepParameterEquivalences()}. - continue; - } - var substitutedLiteral = substitution == null ? literal : literal.substitute(substitution); - substitutedLiterals.add(substitutedLiteral); - } - } - - private void computeExistentiallyQuantifiedVariables() { - for (var literal : substitutedLiterals) { - existentiallyQuantifiedVariables.addAll(literal.getOutputVariables()); - } - } - - private void computePositiveVariables() { - positiveVariables = new LinkedHashSet<>(); - for (var pair : parameters.entrySet()) { - var variable = pair.getKey(); - if (pair.getValue().direction() == ParameterDirection.IN) { - // Inputs count as positive, because they are already bound when we evaluate literals. - positiveVariables.add(variable); - } else if (!existentiallyQuantifiedVariables.contains(variable)) { - throw new InvalidQueryException("Unbound %s parameter %s" - .formatted(ParameterDirection.OUT, variable)); - } - } - positiveVariables.addAll(existentiallyQuantifiedVariables); - } - - private void validatePositiveRepresentatives() { - for (var pair : equivalencePartition.entrySet()) { - var representative = pair.getKey(); - if (!positiveVariables.contains(representative)) { - var variableSet = pair.getValue(); - throw new InvalidQueryException("Variables %s were merged by equivalence but are not bound" - .formatted(variableSet)); - } - } - } - - private void validatePrivateVariables() { - var negativeVariablesMap = new HashMap(); - for (var literal : substitutedLiterals) { - for (var variable : literal.getPrivateVariables(positiveVariables)) { - var oldLiteral = negativeVariablesMap.put(variable, literal); - if (oldLiteral != null) { - throw new InvalidQueryException("Unbound variable %s appears in multiple literals %s and %s" - .formatted(variable, oldLiteral, literal)); - } - } - } - } - - private void topologicallySortLiterals() { - topologicallySortedLiterals = LinkedHashSet.newLinkedHashSet(substitutedLiterals.size()); - variableToLiteralInputMap = new HashMap<>(); - literalsWithAllInputsBound = new PriorityQueue<>(); - int size = substitutedLiterals.size(); - for (int i = 0; i < size; i++) { - var literal = substitutedLiterals.get(i); - var sortableLiteral = new SortableLiteral(i, literal); - sortableLiteral.enqueue(); - } - while (!literalsWithAllInputsBound.isEmpty()) { - var variable = literalsWithAllInputsBound.remove(); - variable.addToSortedLiterals(); - } - if (!variableToLiteralInputMap.isEmpty()) { - throw new InvalidQueryException("Unbound input variables %s" - .formatted(variableToLiteralInputMap.keySet())); - } - } - - private boolean hasContradictoryCall(Collection filteredLiterals) { - var positiveCalls = new HashMap>(); - for (var literal : filteredLiterals) { - if (literal instanceof CallLiteral callLiteral && callLiteral.getPolarity() == CallPolarity.POSITIVE) { - var callsOfTarget = positiveCalls.computeIfAbsent(callLiteral.getTarget(), key -> new HashSet<>()); - callsOfTarget.add(callLiteral); - } - } - for (var literal : filteredLiterals) { - if (literal instanceof CallLiteral callLiteral && callLiteral.getPolarity() == CallPolarity.NEGATIVE) { - var callsOfTarget = positiveCalls.get(callLiteral.getTarget()); - if (contradicts(callLiteral, callsOfTarget)) { - return true; - } - } - } - return false; - } - - private boolean contradicts(CallLiteral negativeCall, Collection positiveCalls) { - if (positiveCalls == null) { - return false; - } - for (var positiveCall : positiveCalls) { - if (contradicts(negativeCall, positiveCall)) { - return true; - } - } - return false; - } - - private boolean contradicts(CallLiteral negativeCall, CallLiteral positiveCall) { - var privateVariables = negativeCall.getPrivateVariables(positiveVariables); - var negativeArguments = negativeCall.getArguments(); - var positiveArguments = positiveCall.getArguments(); - int arity = negativeArguments.size(); - for (int i = 0; i < arity; i++) { - var negativeArgument = negativeArguments.get(i); - if (privateVariables.contains(negativeArgument)) { - continue; - } - var positiveArgument = positiveArguments.get(i); - if (!negativeArgument.equals(positiveArgument)) { - return false; - } - } - return true; - } - - private class SortableLiteral implements Comparable { - private final int index; - private final Literal literal; - private final Set remainingInputs; - - private SortableLiteral(int index, Literal literal) { - this.index = index; - this.literal = literal; - remainingInputs = new HashSet<>(literal.getInputVariables(positiveVariables)); - for (var pair : parameters.entrySet()) { - if (pair.getValue().direction() == ParameterDirection.IN) { - remainingInputs.remove(pair.getKey()); - } - } - } - - public void enqueue() { - if (allInputsBound()) { - addToAllInputsBoundQueue(); - } else { - addToVariableToLiteralInputMap(); - } - } - - private void bindVariable(Variable input) { - if (!remainingInputs.remove(input)) { - throw new AssertionError("Already processed input %s of literal %s".formatted(input, literal)); - } - if (allInputsBound()) { - addToAllInputsBoundQueue(); - } - } - - private boolean allInputsBound() { - return remainingInputs.isEmpty(); - } - - private void addToVariableToLiteralInputMap() { - for (var inputVariable : remainingInputs) { - var literalSetForInput = variableToLiteralInputMap.computeIfAbsent( - inputVariable, key -> new HashSet<>()); - literalSetForInput.add(this); - } - } - - private void addToAllInputsBoundQueue() { - literalsWithAllInputsBound.add(this); - } - - public void addToSortedLiterals() { - if (!allInputsBound()) { - throw new AssertionError("Inputs %s of %s are not yet bound".formatted(remainingInputs, literal)); - } - // Add literal if we haven't yet added a duplicate of this literal. - topologicallySortedLiterals.add(literal); - for (var variable : literal.getOutputVariables()) { - var literalSetForInput = variableToLiteralInputMap.remove(variable); - if (literalSetForInput == null) { - continue; - } - for (var targetSortableLiteral : literalSetForInput) { - targetSortableLiteral.bindVariable(variable); - } - } - } - - @Override - public int compareTo(@NotNull ClausePostProcessor.SortableLiteral other) { - return Integer.compare(index, other.index); - } - - @Override - public boolean equals(Object o) { - if (this == o) return true; - if (o == null || getClass() != o.getClass()) return false; - SortableLiteral that = (SortableLiteral) o; - return index == that.index && Objects.equals(literal, that.literal); - } - - @Override - public int hashCode() { - return Objects.hash(index, literal); - } - } - - public sealed interface Result permits ClauseResult, ConstantResult { - } - - public record ClauseResult(DnfClause clause) implements Result { - } - - public enum ConstantResult implements Result { - ALWAYS_TRUE, - ALWAYS_FALSE - } - - public record ParameterInfo(ParameterDirection direction, int index) { - } -} diff --git a/subprojects/store-query/src/main/java/tools/refinery/store/query/dnf/Dnf.java b/subprojects/store-query/src/main/java/tools/refinery/store/query/dnf/Dnf.java deleted file mode 100644 index 86a1b6b2..00000000 --- a/subprojects/store-query/src/main/java/tools/refinery/store/query/dnf/Dnf.java +++ /dev/null @@ -1,235 +0,0 @@ -/* - * SPDX-FileCopyrightText: 2021-2023 The Refinery Authors - * - * SPDX-License-Identifier: EPL-2.0 - */ -package tools.refinery.store.query.dnf; - -import tools.refinery.store.query.Constraint; -import tools.refinery.store.query.InvalidQueryException; -import tools.refinery.store.query.equality.DnfEqualityChecker; -import tools.refinery.store.query.equality.LiteralEqualityHelper; -import tools.refinery.store.query.equality.SubstitutingLiteralEqualityHelper; -import tools.refinery.store.query.equality.SubstitutingLiteralHashCodeHelper; -import tools.refinery.store.query.literal.Reduction; -import tools.refinery.store.query.term.Parameter; -import tools.refinery.store.query.term.Variable; - -import java.util.Collection; -import java.util.Collections; -import java.util.List; -import java.util.Set; -import java.util.function.Consumer; -import java.util.stream.Collectors; - -public final class Dnf implements Constraint { - private static final String INDENTATION = " "; - - private final String name; - private final String uniqueName; - private final List symbolicParameters; - private final List> functionalDependencies; - private final List clauses; - - Dnf(String name, List symbolicParameters, - List> functionalDependencies, List clauses) { - validateFunctionalDependencies(symbolicParameters, functionalDependencies); - this.name = name; - this.uniqueName = DnfUtils.generateUniqueName(name); - this.symbolicParameters = symbolicParameters; - this.functionalDependencies = functionalDependencies; - this.clauses = clauses; - } - - private static void validateFunctionalDependencies( - Collection symbolicParameters, - Collection> functionalDependencies) { - var parameterSet = symbolicParameters.stream().map(SymbolicParameter::getVariable).collect(Collectors.toSet()); - for (var functionalDependency : functionalDependencies) { - validateParameters(symbolicParameters, parameterSet, functionalDependency.forEach(), functionalDependency); - validateParameters(symbolicParameters, parameterSet, functionalDependency.unique(), functionalDependency); - } - } - - private static void validateParameters(Collection symbolicParameters, - Set parameterSet, Collection toValidate, - FunctionalDependency functionalDependency) { - for (var variable : toValidate) { - if (!parameterSet.contains(variable)) { - throw new InvalidQueryException( - "Variable %s of functional dependency %s does not appear in the parameter list %s" - .formatted(variable, functionalDependency, symbolicParameters)); - } - } - } - - @Override - public String name() { - return name == null ? uniqueName : name; - } - - public boolean isExplicitlyNamed() { - return name != null; - } - - public String getUniqueName() { - return uniqueName; - } - - public List getSymbolicParameters() { - return symbolicParameters; - } - - public List getParameters() { - return Collections.unmodifiableList(symbolicParameters); - } - - public List> getFunctionalDependencies() { - return functionalDependencies; - } - - @Override - public int arity() { - return symbolicParameters.size(); - } - - public List getClauses() { - return clauses; - } - - public RelationalQuery asRelation() { - return new RelationalQuery(this); - } - - public FunctionalQuery asFunction(Class type) { - return new FunctionalQuery<>(this, type); - } - - @Override - public Reduction getReduction() { - if (clauses.isEmpty()) { - return Reduction.ALWAYS_FALSE; - } - for (var clause : clauses) { - if (clause.literals().isEmpty()) { - return Reduction.ALWAYS_TRUE; - } - } - return Reduction.NOT_REDUCIBLE; - } - - public boolean equalsWithSubstitution(DnfEqualityChecker callEqualityChecker, Dnf other) { - if (arity() != other.arity()) { - return false; - } - for (int i = 0; i < arity(); i++) { - if (!symbolicParameters.get(i).getDirection().equals(other.getSymbolicParameters().get(i).getDirection())) { - return false; - } - } - int numClauses = clauses.size(); - if (numClauses != other.clauses.size()) { - return false; - } - for (int i = 0; i < numClauses; i++) { - var literalEqualityHelper = new SubstitutingLiteralEqualityHelper(callEqualityChecker, symbolicParameters, - other.symbolicParameters); - if (!clauses.get(i).equalsWithSubstitution(literalEqualityHelper, other.clauses.get(i))) { - return false; - } - } - return true; - } - - @Override - public boolean equals(LiteralEqualityHelper helper, Constraint other) { - if (other instanceof Dnf otherDnf) { - return helper.dnfEqual(this, otherDnf); - } - return false; - } - - public int hashCodeWithSubstitution() { - var helper = new SubstitutingLiteralHashCodeHelper(); - int result = 0; - for (var symbolicParameter : symbolicParameters) { - result = result * 31 + symbolicParameter.hashCodeWithSubstitution(helper); - } - for (var clause : clauses) { - result = result * 31 + clause.hashCodeWithSubstitution(helper); - } - return result; - } - - @Override - public String toString() { - return "%s/%d".formatted(name(), arity()); - } - - @Override - public String toReferenceString() { - return "@Dnf " + name(); - } - - public String toDefinitionString() { - var builder = new StringBuilder(); - builder.append("pred ").append(name()).append("("); - var parameterIterator = symbolicParameters.iterator(); - if (parameterIterator.hasNext()) { - builder.append(parameterIterator.next()); - while (parameterIterator.hasNext()) { - builder.append(", ").append(parameterIterator.next()); - } - } - builder.append(") <->"); - var clauseIterator = clauses.iterator(); - if (clauseIterator.hasNext()) { - appendClause(clauseIterator.next(), builder); - while (clauseIterator.hasNext()) { - builder.append("\n;"); - appendClause(clauseIterator.next(), builder); - } - } else { - builder.append("\n").append(INDENTATION).append(""); - } - builder.append(".\n"); - return builder.toString(); - } - - private static void appendClause(DnfClause clause, StringBuilder builder) { - var iterator = clause.literals().iterator(); - if (!iterator.hasNext()) { - builder.append("\n").append(INDENTATION).append(""); - return; - } - builder.append("\n").append(INDENTATION).append(iterator.next()); - while (iterator.hasNext()) { - builder.append(",\n").append(INDENTATION).append(iterator.next()); - } - } - - public static DnfBuilder builder() { - return builder(null); - } - - public static DnfBuilder builder(String name) { - return new DnfBuilder(name); - } - - public static DnfBuilder builderFrom(Dnf original) { - var builder = builder(original.name()); - builder.symbolicParameters(original.getSymbolicParameters()); - builder.functionalDependencies(original.getFunctionalDependencies()); - return builder; - } - - public static Dnf of(Consumer callback) { - return of(null, callback); - } - - public static Dnf of(String name, Consumer callback) { - var builder = builder(name); - callback.accept(builder); - return builder.build(); - } -} diff --git a/subprojects/store-query/src/main/java/tools/refinery/store/query/dnf/DnfBuilder.java b/subprojects/store-query/src/main/java/tools/refinery/store/query/dnf/DnfBuilder.java deleted file mode 100644 index 0f9fd366..00000000 --- a/subprojects/store-query/src/main/java/tools/refinery/store/query/dnf/DnfBuilder.java +++ /dev/null @@ -1,225 +0,0 @@ -/* - * SPDX-FileCopyrightText: 2021-2023 The Refinery Authors - * - * SPDX-License-Identifier: EPL-2.0 - */ -package tools.refinery.store.query.dnf; - -import tools.refinery.store.query.InvalidQueryException; -import tools.refinery.store.query.dnf.callback.*; -import tools.refinery.store.query.literal.Literal; -import tools.refinery.store.query.term.*; - -import java.util.*; - -@SuppressWarnings("UnusedReturnValue") -public final class DnfBuilder { - private final String name; - private final Set parameterVariables = new LinkedHashSet<>(); - private final List parameters = new ArrayList<>(); - private final List> functionalDependencies = new ArrayList<>(); - private final List> clauses = new ArrayList<>(); - - DnfBuilder(String name) { - this.name = name; - } - - public NodeVariable parameter() { - return parameter((String) null); - } - - public NodeVariable parameter(String name) { - return parameter(name, ParameterDirection.OUT); - } - - public NodeVariable parameter(ParameterDirection direction) { - return parameter((String) null, direction); - } - - public NodeVariable parameter(String name, ParameterDirection direction) { - var variable = Variable.of(name); - parameter(variable, direction); - return variable; - } - - public DataVariable parameter(Class type) { - return parameter(null, type); - } - - public DataVariable parameter(String name, Class type) { - return parameter(name, type, ParameterDirection.OUT); - } - - public DataVariable parameter(Class type, ParameterDirection direction) { - return parameter(null, type, direction); - } - - public DataVariable parameter(String name, Class type, ParameterDirection direction) { - var variable = Variable.of(name, type); - parameter(variable, direction); - return variable; - } - - public Variable parameter(Parameter parameter) { - return parameter(null, parameter); - } - - public Variable parameter(String name, Parameter parameter) { - var type = parameter.tryGetType(); - if (type.isPresent()) { - return parameter(name, type.get(), parameter.getDirection()); - } - return parameter(name, parameter.getDirection()); - } - - public DnfBuilder parameter(Variable variable) { - return parameter(variable, ParameterDirection.OUT); - } - - public DnfBuilder parameter(Variable variable, ParameterDirection direction) { - return symbolicParameter(new SymbolicParameter(variable, direction)); - } - - public DnfBuilder parameters(Variable... variables) { - return parameters(List.of(variables)); - } - - public DnfBuilder parameters(Collection variables) { - return parameters(variables, ParameterDirection.OUT); - } - - public DnfBuilder parameters(Collection variables, ParameterDirection direction) { - for (var variable : variables) { - parameter(variable, direction); - } - return this; - } - - public DnfBuilder symbolicParameter(SymbolicParameter symbolicParameter) { - var variable = symbolicParameter.getVariable(); - if (!parameterVariables.add(variable)) { - throw new InvalidQueryException("Variable %s is already on the parameter list %s" - .formatted(variable, parameters)); - } - parameters.add(symbolicParameter); - return this; - } - - public DnfBuilder symbolicParameters(SymbolicParameter... symbolicParameters) { - return symbolicParameters(List.of(symbolicParameters)); - } - - public DnfBuilder symbolicParameters(Collection symbolicParameters) { - for (var symbolicParameter : symbolicParameters) { - symbolicParameter(symbolicParameter); - } - return this; - } - - public DnfBuilder functionalDependencies(Collection> functionalDependencies) { - this.functionalDependencies.addAll(functionalDependencies); - return this; - } - - public DnfBuilder functionalDependency(FunctionalDependency functionalDependency) { - functionalDependencies.add(functionalDependency); - return this; - } - - public DnfBuilder functionalDependency(Set forEach, Set unique) { - return functionalDependency(new FunctionalDependency<>(Set.copyOf(forEach), Set.copyOf(unique))); - } - - public DnfBuilder clause(ClauseCallback0 callback) { - return clause(callback.toLiterals()); - } - - public DnfBuilder clause(ClauseCallback1Data0 callback) { - return clause(callback.toLiterals(Variable.of("v1"))); - } - - public DnfBuilder clause(Class type1, ClauseCallback1Data1 callback) { - return clause(callback.toLiterals(Variable.of("d1", type1))); - } - - public DnfBuilder clause(ClauseCallback2Data0 callback) { - return clause(callback.toLiterals(Variable.of("v1"), Variable.of("v2"))); - } - - public DnfBuilder clause(Class type1, ClauseCallback2Data1 callback) { - return clause(callback.toLiterals(Variable.of("v1"), Variable.of("d1", type1))); - } - - public DnfBuilder clause(Class type1, Class type2, ClauseCallback2Data2 callback) { - return clause(callback.toLiterals(Variable.of("d1", type1), Variable.of("d2", type2))); - } - - public DnfBuilder clause(ClauseCallback3Data0 callback) { - return clause(callback.toLiterals(Variable.of("v1"), Variable.of("v2"), Variable.of("v3"))); - } - - public DnfBuilder clause(Class type1, ClauseCallback3Data1 callback) { - return clause(callback.toLiterals(Variable.of("v1"), Variable.of("v2"), Variable.of("d1", type1))); - } - - public DnfBuilder clause(Class type1, Class type2, ClauseCallback3Data2 callback) { - return clause(callback.toLiterals(Variable.of("v1"), Variable.of("d1", type1), Variable.of("d2", type2))); - } - - public DnfBuilder clause(Class type1, Class type2, Class type3, - ClauseCallback3Data3 callback) { - return clause(callback.toLiterals(Variable.of("d1", type1), Variable.of("d2", type2), - Variable.of("d3", type3))); - } - - public DnfBuilder clause(ClauseCallback4Data0 callback) { - return clause(callback.toLiterals(Variable.of("v1"), Variable.of("v2"), Variable.of("v3"), Variable.of("v4"))); - } - - public DnfBuilder clause(Class type1, ClauseCallback4Data1 callback) { - return clause(callback.toLiterals(Variable.of("v1"), Variable.of("v2"), Variable.of("v3"), Variable.of("d1", - type1))); - } - - public DnfBuilder clause(Class type1, Class type2, ClauseCallback4Data2 callback) { - return clause(callback.toLiterals(Variable.of("v1"), Variable.of("v2"), Variable.of("d1", type1), - Variable.of("d2", type2))); - } - - public DnfBuilder clause(Class type1, Class type2, Class type3, - ClauseCallback4Data3 callback) { - return clause(callback.toLiterals(Variable.of("v1"), Variable.of("d1", type1), Variable.of("d2", type2), - Variable.of("d3", type3))); - } - - public DnfBuilder clause(Class type1, Class type2, Class type3, Class type4, - ClauseCallback4Data4 callback) { - return clause(callback.toLiterals(Variable.of("d1", type1), Variable.of("d2", type2), - Variable.of("d3", type3), Variable.of("d4", type4))); - } - - public DnfBuilder clause(Literal... literals) { - clause(List.of(literals)); - return this; - } - - public DnfBuilder clause(Collection literals) { - clauses.add(List.copyOf(literals)); - return this; - } - - void output(DataVariable outputVariable) { - // Copy parameter variables to exclude the newly added {@code outputVariable}. - var fromParameters = Set.copyOf(parameterVariables); - parameter(outputVariable, ParameterDirection.OUT); - functionalDependency(fromParameters, Set.of(outputVariable)); - } - - public Dnf build() { - var postProcessor = new DnfPostProcessor(parameters, clauses); - var postProcessedClauses = postProcessor.postProcessClauses(); - return new Dnf(name, Collections.unmodifiableList(parameters), - Collections.unmodifiableList(functionalDependencies), - Collections.unmodifiableList(postProcessedClauses)); - } -} diff --git a/subprojects/store-query/src/main/java/tools/refinery/store/query/dnf/DnfClause.java b/subprojects/store-query/src/main/java/tools/refinery/store/query/dnf/DnfClause.java deleted file mode 100644 index 94327bad..00000000 --- a/subprojects/store-query/src/main/java/tools/refinery/store/query/dnf/DnfClause.java +++ /dev/null @@ -1,37 +0,0 @@ -/* - * SPDX-FileCopyrightText: 2021-2023 The Refinery Authors - * - * SPDX-License-Identifier: EPL-2.0 - */ -package tools.refinery.store.query.dnf; - -import tools.refinery.store.query.equality.LiteralEqualityHelper; -import tools.refinery.store.query.equality.LiteralHashCodeHelper; -import tools.refinery.store.query.literal.Literal; -import tools.refinery.store.query.term.Variable; - -import java.util.List; -import java.util.Set; - -public record DnfClause(Set positiveVariables, List literals) { - public boolean equalsWithSubstitution(LiteralEqualityHelper helper, DnfClause other) { - int size = literals.size(); - if (size != other.literals.size()) { - return false; - } - for (int i = 0; i < size; i++) { - if (!literals.get(i).equalsWithSubstitution(helper, other.literals.get(i))) { - return false; - } - } - return true; - } - - public int hashCodeWithSubstitution(LiteralHashCodeHelper helper) { - int result = 0; - for (var literal : literals) { - result = result * 31 + literal.hashCodeWithSubstitution(helper); - } - return result; - } -} diff --git a/subprojects/store-query/src/main/java/tools/refinery/store/query/dnf/DnfPostProcessor.java b/subprojects/store-query/src/main/java/tools/refinery/store/query/dnf/DnfPostProcessor.java deleted file mode 100644 index 01344b59..00000000 --- a/subprojects/store-query/src/main/java/tools/refinery/store/query/dnf/DnfPostProcessor.java +++ /dev/null @@ -1,112 +0,0 @@ -/* - * SPDX-FileCopyrightText: 2023-2024 The Refinery Authors - * - * SPDX-License-Identifier: EPL-2.0 - */ -package tools.refinery.store.query.dnf; - -import tools.refinery.store.query.InvalidQueryException; -import tools.refinery.store.query.equality.DnfEqualityChecker; -import tools.refinery.store.query.equality.SubstitutingLiteralEqualityHelper; -import tools.refinery.store.query.equality.SubstitutingLiteralHashCodeHelper; -import tools.refinery.store.query.literal.Literal; -import tools.refinery.store.query.term.ParameterDirection; -import tools.refinery.store.query.term.Variable; - -import java.util.*; - -class DnfPostProcessor { - private final List parameters; - private final List> clauses; - - public DnfPostProcessor(List parameters, List> clauses) { - this.parameters = parameters; - this.clauses = clauses; - } - - public List postProcessClauses() { - var parameterInfoMap = getParameterInfoMap(); - var postProcessedClauses = LinkedHashSet.newLinkedHashSet(clauses.size()); - int index = 0; - for (var literals : clauses) { - var postProcessor = new ClausePostProcessor(parameterInfoMap, literals); - ClausePostProcessor.Result result; - try { - result = postProcessor.postProcessClause(); - } catch (InvalidQueryException e) { - throw new InvalidClauseException(index, e); - } - if (result instanceof ClausePostProcessor.ClauseResult clauseResult) { - postProcessedClauses.add(new CanonicalClause(clauseResult.clause())); - } else if (result instanceof ClausePostProcessor.ConstantResult constantResult) { - switch (constantResult) { - case ALWAYS_TRUE -> { - var inputVariables = getInputVariables(); - return List.of(new DnfClause(inputVariables, List.of())); - } - case ALWAYS_FALSE -> { - // Skip this clause because it can never match. - } - default -> throw new IllegalStateException("Unexpected ClausePostProcessor.ConstantResult: " + - constantResult); - } - } else { - throw new IllegalStateException("Unexpected ClausePostProcessor.Result: " + result); - } - index++; - } - return postProcessedClauses.stream().map(CanonicalClause::getDnfClause).toList(); - } - - private Map getParameterInfoMap() { - var mutableParameterInfoMap = new LinkedHashMap(); - int arity = parameters.size(); - for (int i = 0; i < arity; i++) { - var parameter = parameters.get(i); - mutableParameterInfoMap.put(parameter.getVariable(), - new ClausePostProcessor.ParameterInfo(parameter.getDirection(), i)); - } - return Collections.unmodifiableMap(mutableParameterInfoMap); - } - - private Set getInputVariables() { - var inputParameters = new LinkedHashSet(); - for (var parameter : parameters) { - if (parameter.getDirection() == ParameterDirection.IN) { - inputParameters.add(parameter.getVariable()); - } - } - return Collections.unmodifiableSet(inputParameters); - } - - private class CanonicalClause { - private final DnfClause dnfClause; - - public CanonicalClause(DnfClause dnfClause) { - this.dnfClause = dnfClause; - } - - public DnfClause getDnfClause() { - return dnfClause; - } - - @Override - public boolean equals(Object obj) { - if (this == obj) { - return true; - } - if (obj == null || getClass() != obj.getClass()) { - return false; - } - var otherCanonicalClause = (CanonicalClause) obj; - var helper = new SubstitutingLiteralEqualityHelper(DnfEqualityChecker.DEFAULT, parameters, parameters); - return dnfClause.equalsWithSubstitution(helper, otherCanonicalClause.dnfClause); - } - - @Override - public int hashCode() { - var helper = new SubstitutingLiteralHashCodeHelper(parameters); - return dnfClause.hashCodeWithSubstitution(helper); - } - } -} diff --git a/subprojects/store-query/src/main/java/tools/refinery/store/query/dnf/DnfUtils.java b/subprojects/store-query/src/main/java/tools/refinery/store/query/dnf/DnfUtils.java deleted file mode 100644 index 65ab3634..00000000 --- a/subprojects/store-query/src/main/java/tools/refinery/store/query/dnf/DnfUtils.java +++ /dev/null @@ -1,24 +0,0 @@ -/* - * SPDX-FileCopyrightText: 2021-2023 The Refinery Authors - * - * SPDX-License-Identifier: EPL-2.0 - */ -package tools.refinery.store.query.dnf; - -import java.util.UUID; - -public final class DnfUtils { - private DnfUtils() { - throw new IllegalStateException("This is a static utility class and should not be instantiated directly"); - } - - public static String generateUniqueName(String originalName) { - UUID uuid = UUID.randomUUID(); - String uniqueString = "_" + uuid.toString().replace('-', '_'); - if (originalName == null) { - return uniqueString; - } else { - return originalName + uniqueString; - } - } -} diff --git a/subprojects/store-query/src/main/java/tools/refinery/store/query/dnf/FunctionalDependency.java b/subprojects/store-query/src/main/java/tools/refinery/store/query/dnf/FunctionalDependency.java deleted file mode 100644 index aef07ee3..00000000 --- a/subprojects/store-query/src/main/java/tools/refinery/store/query/dnf/FunctionalDependency.java +++ /dev/null @@ -1,22 +0,0 @@ -/* - * SPDX-FileCopyrightText: 2021-2023 The Refinery Authors - * - * SPDX-License-Identifier: EPL-2.0 - */ -package tools.refinery.store.query.dnf; - -import tools.refinery.store.query.InvalidQueryException; - -import java.util.HashSet; -import java.util.Set; - -public record FunctionalDependency(Set forEach, Set unique) { - public FunctionalDependency { - var uniqueForEach = new HashSet<>(unique); - uniqueForEach.retainAll(forEach); - if (!uniqueForEach.isEmpty()) { - throw new InvalidQueryException("Variables %s appear on both sides of the functional dependency" - .formatted(uniqueForEach)); - } - } -} 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 deleted file mode 100644 index b0a03c7d..00000000 --- a/subprojects/store-query/src/main/java/tools/refinery/store/query/dnf/FunctionalQuery.java +++ /dev/null @@ -1,126 +0,0 @@ -/* - * SPDX-FileCopyrightText: 2021-2024 The Refinery Authors - * - * SPDX-License-Identifier: EPL-2.0 - */ -package tools.refinery.store.query.dnf; - -import tools.refinery.store.query.InvalidQueryException; -import tools.refinery.store.query.literal.CallPolarity; -import tools.refinery.store.query.term.Aggregator; -import tools.refinery.store.query.term.AssignedValue; -import tools.refinery.store.query.term.NodeVariable; -import tools.refinery.store.query.term.Variable; - -import java.util.ArrayList; -import java.util.List; -import java.util.Objects; - -public final class FunctionalQuery extends Query { - private final Class type; - - FunctionalQuery(Dnf dnf, Class type) { - super(dnf); - var parameters = dnf.getSymbolicParameters(); - int outputIndex = dnf.arity() - 1; - for (int i = 0; i < outputIndex; i++) { - var parameter = parameters.get(i); - var parameterType = parameter.tryGetType(); - if (parameterType.isPresent()) { - throw new InvalidQueryException("Expected parameter %s of %s to be a node variable, got %s instead" - .formatted(parameter, dnf, parameterType.get().getName())); - } - } - var outputParameter = parameters.get(outputIndex); - var outputParameterType = outputParameter.tryGetType(); - if (outputParameterType.isEmpty() || !outputParameterType.get().equals(type)) { - throw new InvalidQueryException("Expected parameter %s of %s to be %s, but got %s instead".formatted( - outputParameter, dnf, type, outputParameterType.map(Class::getName).orElse("node"))); - } - this.type = type; - } - - @Override - public int arity() { - return getDnf().arity() - 1; - } - - @Override - public Class valueType() { - return type; - } - - @Override - public T defaultValue() { - return null; - } - - @Override - protected FunctionalQuery withDnfInternal(Dnf newDnf) { - return newDnf.asFunction(type); - } - - @Override - public FunctionalQuery withDnf(Dnf newDnf) { - return (FunctionalQuery) super.withDnf(newDnf); - } - - public AssignedValue call(List arguments) { - return targetVariable -> { - var argumentsWithTarget = new ArrayList(arguments.size() + 1); - argumentsWithTarget.addAll(arguments); - argumentsWithTarget.add(targetVariable); - return getDnf().call(CallPolarity.POSITIVE, argumentsWithTarget); - }; - } - - public AssignedValue call(NodeVariable... arguments) { - return call(List.of(arguments)); - } - - public AssignedValue aggregate(Aggregator aggregator, List arguments) { - return targetVariable -> { - var placeholderVariable = Variable.of(type); - var argumentsWithPlaceholder = new ArrayList(arguments.size() + 1); - argumentsWithPlaceholder.addAll(arguments); - argumentsWithPlaceholder.add(placeholderVariable); - return getDnf() - .aggregateBy(placeholderVariable, aggregator, argumentsWithPlaceholder) - .toLiteral(targetVariable); - }; - } - - public AssignedValue aggregate(Aggregator aggregator, NodeVariable... arguments) { - return aggregate(aggregator, List.of(arguments)); - } - - public AssignedValue leftJoin(T defaultValue, List arguments) { - return targetVariable -> { - var placeholderVariable = Variable.of(type); - var argumentsWithPlaceholder = new ArrayList(arguments.size() + 1); - argumentsWithPlaceholder.addAll(arguments); - argumentsWithPlaceholder.add(placeholderVariable); - return getDnf() - .leftJoinBy(placeholderVariable, defaultValue, argumentsWithPlaceholder) - .toLiteral(targetVariable); - }; - } - - public AssignedValue leftJoin(T defaultValue, NodeVariable... arguments) { - return leftJoin(defaultValue, List.of(arguments)); - } - - @Override - public boolean equals(Object o) { - if (this == o) return true; - if (o == null || getClass() != o.getClass()) return false; - if (!super.equals(o)) return false; - FunctionalQuery that = (FunctionalQuery) o; - return Objects.equals(type, that.type); - } - - @Override - public int hashCode() { - return Objects.hash(super.hashCode(), type); - } -} diff --git a/subprojects/store-query/src/main/java/tools/refinery/store/query/dnf/FunctionalQueryBuilder.java b/subprojects/store-query/src/main/java/tools/refinery/store/query/dnf/FunctionalQueryBuilder.java deleted file mode 100644 index d1cd7ba8..00000000 --- a/subprojects/store-query/src/main/java/tools/refinery/store/query/dnf/FunctionalQueryBuilder.java +++ /dev/null @@ -1,29 +0,0 @@ -/* - * SPDX-FileCopyrightText: 2021-2023 The Refinery Authors - * - * SPDX-License-Identifier: EPL-2.0 - */ -package tools.refinery.store.query.dnf; - -import tools.refinery.store.query.term.DataVariable; - -public final class FunctionalQueryBuilder extends AbstractQueryBuilder> { - private final DataVariable outputVariable; - private final Class type; - - FunctionalQueryBuilder(DataVariable outputVariable, DnfBuilder dnfBuilder, Class type) { - super(dnfBuilder); - this.outputVariable = outputVariable; - this.type = type; - } - - @Override - protected FunctionalQueryBuilder self() { - return this; - } - - public FunctionalQuery build() { - dnfBuilder.output(outputVariable); - return dnfBuilder.build().asFunction(type); - } -} diff --git a/subprojects/store-query/src/main/java/tools/refinery/store/query/dnf/InvalidClauseException.java b/subprojects/store-query/src/main/java/tools/refinery/store/query/dnf/InvalidClauseException.java deleted file mode 100644 index 747574b9..00000000 --- a/subprojects/store-query/src/main/java/tools/refinery/store/query/dnf/InvalidClauseException.java +++ /dev/null @@ -1,35 +0,0 @@ -/* - * SPDX-FileCopyrightText: 2023 The Refinery Authors - * - * SPDX-License-Identifier: EPL-2.0 - */ -package tools.refinery.store.query.dnf; - -import tools.refinery.store.query.InvalidQueryException; - -public class InvalidClauseException extends InvalidQueryException { - private final int clauseIndex; - - public InvalidClauseException(int clauseIndex) { - this.clauseIndex = clauseIndex; - } - - public InvalidClauseException(int clauseIndex, String message) { - super(message); - this.clauseIndex = clauseIndex; - } - - public InvalidClauseException(int clauseIndex, String message, Throwable cause) { - super(message, cause); - this.clauseIndex = clauseIndex; - } - - public InvalidClauseException(int clauseIndex, Throwable cause) { - super(cause); - this.clauseIndex = clauseIndex; - } - - public int getClauseIndex() { - return clauseIndex; - } -} diff --git a/subprojects/store-query/src/main/java/tools/refinery/store/query/dnf/Query.java b/subprojects/store-query/src/main/java/tools/refinery/store/query/dnf/Query.java deleted file mode 100644 index 83fe6ccd..00000000 --- a/subprojects/store-query/src/main/java/tools/refinery/store/query/dnf/Query.java +++ /dev/null @@ -1,202 +0,0 @@ -/* - * SPDX-FileCopyrightText: 2021-2023 The Refinery Authors - * - * SPDX-License-Identifier: EPL-2.0 - */ -package tools.refinery.store.query.dnf; - -import tools.refinery.store.query.dnf.callback.*; -import tools.refinery.store.query.term.ParameterDirection; -import tools.refinery.store.query.term.Variable; - -import java.util.Objects; - -public abstract sealed class Query implements AnyQuery permits FunctionalQuery, RelationalQuery { - private static final String OUTPUT_VARIABLE_NAME = "output"; - - private final Dnf dnf; - - protected Query(Dnf dnf) { - for (var parameter : dnf.getSymbolicParameters()) { - if (parameter.getDirection() != ParameterDirection.OUT) { - throw new IllegalArgumentException("Query parameter %s with direction %s is not allowed" - .formatted(parameter.getVariable(), parameter.getDirection())); - } - } - this.dnf = dnf; - } - - @Override - public String name() { - return dnf.name(); - } - - @Override - public Dnf getDnf() { - return dnf; - } - - // Allow redeclaration of the method with refined return type. - @SuppressWarnings("squid:S3038") - @Override - public abstract Class valueType(); - - public abstract T defaultValue(); - - public Query withDnf(Dnf newDnf) { - if (dnf.equals(newDnf)) { - return this; - } - int arity = dnf.arity(); - if (newDnf.arity() != arity) { - throw new IllegalArgumentException("Arity of %s and %s do not match".formatted(dnf, newDnf)); - } - var parameters = dnf.getParameters(); - var newParameters = newDnf.getParameters(); - for (int i = 0; i < arity; i++) { - var parameter = parameters.get(i); - var newParameter = newParameters.get(i); - if (!parameter.matches(newParameter)) { - throw new IllegalArgumentException("Parameter #%d mismatch: %s does not match %s" - .formatted(i, parameter, newParameter)); - } - } - return withDnfInternal(newDnf); - } - - protected abstract Query withDnfInternal(Dnf newDnf); - - @Override - public boolean equals(Object o) { - if (this == o) return true; - if (o == null || getClass() != o.getClass()) return false; - Query that = (Query) o; - return Objects.equals(dnf, that.dnf); - } - - @Override - public int hashCode() { - return Objects.hash(dnf); - } - - @Override - public String toString() { - return dnf.toString(); - } - - public static QueryBuilder builder() { - return builder(null); - } - - public static QueryBuilder builder(String name) { - return new QueryBuilder(name); - } - - public static RelationalQuery of(QueryCallback0 callback) { - return of(null, callback); - } - - public static RelationalQuery of(String name, QueryCallback0 callback) { - var builder = builder(name); - callback.accept(builder); - return builder.build(); - } - - public static RelationalQuery of(QueryCallback1 callback) { - return of(null, callback); - } - - public static RelationalQuery of(String name, QueryCallback1 callback) { - var builder = builder(name); - callback.accept(builder, builder.parameter("p1")); - return builder.build(); - } - - public static RelationalQuery of(QueryCallback2 callback) { - return of(null, callback); - } - - public static RelationalQuery of(String name, QueryCallback2 callback) { - var builder = builder(name); - callback.accept(builder, builder.parameter("p1"), builder.parameter("p2")); - return builder.build(); - } - - public static RelationalQuery of(QueryCallback3 callback) { - return of(null, callback); - } - - public static RelationalQuery of(String name, QueryCallback3 callback) { - var builder = builder(name); - callback.accept(builder, builder.parameter("p1"), builder.parameter("p2"), builder.parameter("p3")); - return builder.build(); - } - - public static RelationalQuery of(QueryCallback4 callback) { - return of(null, callback); - } - - public static RelationalQuery of(String name, QueryCallback4 callback) { - var builder = builder(name); - callback.accept(builder, builder.parameter("p1"), builder.parameter("p2"), builder.parameter("p3"), - builder.parameter("p4")); - return builder.build(); - } - - public static FunctionalQuery of(Class type, FunctionalQueryCallback0 callback) { - return of(null, type, callback); - } - - public static FunctionalQuery of(String name, Class type, FunctionalQueryCallback0 callback) { - var outputVariable = Variable.of(OUTPUT_VARIABLE_NAME, type); - var builder = builder(name).output(outputVariable); - callback.accept(builder, outputVariable); - return builder.build(); - } - - public static FunctionalQuery of(Class type, FunctionalQueryCallback1 callback) { - return of(null, type, callback); - } - - public static FunctionalQuery of(String name, Class type, FunctionalQueryCallback1 callback) { - var outputVariable = Variable.of(OUTPUT_VARIABLE_NAME, type); - var builder = builder(name).output(outputVariable); - callback.accept(builder, builder.parameter("p1"), outputVariable); - return builder.build(); - } - - public static FunctionalQuery of(Class type, FunctionalQueryCallback2 callback) { - return of(null, type, callback); - } - - public static FunctionalQuery of(String name, Class type, FunctionalQueryCallback2 callback) { - var outputVariable = Variable.of(OUTPUT_VARIABLE_NAME, type); - var builder = builder(name).output(outputVariable); - callback.accept(builder, builder.parameter("p1"), builder.parameter("p2"), outputVariable); - return builder.build(); - } - - public static FunctionalQuery of(Class type, FunctionalQueryCallback3 callback) { - return of(null, type, callback); - } - - public static FunctionalQuery of(String name, Class type, FunctionalQueryCallback3 callback) { - var outputVariable = Variable.of(OUTPUT_VARIABLE_NAME, type); - var builder = builder(name).output(outputVariable); - callback.accept(builder, builder.parameter("p1"), builder.parameter("p2"), builder.parameter("p3"), - outputVariable); - return builder.build(); - } - - public static FunctionalQuery of(Class type, FunctionalQueryCallback4 callback) { - return of(null, type, callback); - } - - public static FunctionalQuery of(String name, Class type, FunctionalQueryCallback4 callback) { - var outputVariable = Variable.of(OUTPUT_VARIABLE_NAME, type); - var builder = builder(name).output(outputVariable); - callback.accept(builder, builder.parameter("p1"), builder.parameter("p2"), builder.parameter("p3"), - builder.parameter("p4"), outputVariable); - return builder.build(); - } -} diff --git a/subprojects/store-query/src/main/java/tools/refinery/store/query/dnf/QueryBuilder.java b/subprojects/store-query/src/main/java/tools/refinery/store/query/dnf/QueryBuilder.java deleted file mode 100644 index 138911bc..00000000 --- a/subprojects/store-query/src/main/java/tools/refinery/store/query/dnf/QueryBuilder.java +++ /dev/null @@ -1,27 +0,0 @@ -/* - * SPDX-FileCopyrightText: 2021-2023 The Refinery Authors - * - * SPDX-License-Identifier: EPL-2.0 - */ -package tools.refinery.store.query.dnf; - -import tools.refinery.store.query.term.DataVariable; - -public final class QueryBuilder extends AbstractQueryBuilder { - QueryBuilder(String name) { - super(Dnf.builder(name)); - } - - @Override - protected QueryBuilder self() { - return this; - } - - public FunctionalQueryBuilder output(DataVariable outputVariable) { - return new FunctionalQueryBuilder<>(outputVariable, dnfBuilder, outputVariable.getType()); - } - - public RelationalQuery build() { - return dnfBuilder.build().asRelation(); - } -} diff --git a/subprojects/store-query/src/main/java/tools/refinery/store/query/dnf/RelationalQuery.java b/subprojects/store-query/src/main/java/tools/refinery/store/query/dnf/RelationalQuery.java deleted file mode 100644 index 98f71e11..00000000 --- a/subprojects/store-query/src/main/java/tools/refinery/store/query/dnf/RelationalQuery.java +++ /dev/null @@ -1,77 +0,0 @@ -/* - * SPDX-FileCopyrightText: 2021-2023 The Refinery Authors - * - * SPDX-License-Identifier: EPL-2.0 - */ -package tools.refinery.store.query.dnf; - -import tools.refinery.store.query.InvalidQueryException; -import tools.refinery.store.query.literal.CallLiteral; -import tools.refinery.store.query.literal.CallPolarity; -import tools.refinery.store.query.term.AssignedValue; -import tools.refinery.store.query.term.NodeVariable; - -import java.util.Collections; -import java.util.List; - -public final class RelationalQuery extends Query { - RelationalQuery(Dnf dnf) { - super(dnf); - for (var parameter : dnf.getSymbolicParameters()) { - var parameterType = parameter.tryGetType(); - if (parameterType.isPresent()) { - throw new InvalidQueryException("Expected parameter %s of %s to be a node variable, got %s instead" - .formatted(parameter, dnf, parameterType.get().getName())); - } - } - } - - @Override - public int arity() { - return getDnf().arity(); - } - - @Override - public Class valueType() { - return Boolean.class; - } - - @Override - public Boolean defaultValue() { - return false; - } - - @Override - protected RelationalQuery withDnfInternal(Dnf newDnf) { - return newDnf.asRelation(); - } - - @Override - public RelationalQuery withDnf(Dnf newDnf) { - return (RelationalQuery) super.withDnf(newDnf); - } - - public CallLiteral call(CallPolarity polarity, List arguments) { - return getDnf().call(polarity, Collections.unmodifiableList(arguments)); - } - - public CallLiteral call(CallPolarity polarity, NodeVariable... arguments) { - return getDnf().call(polarity, arguments); - } - - public CallLiteral call(NodeVariable... arguments) { - return getDnf().call(arguments); - } - - public CallLiteral callTransitive(NodeVariable left, NodeVariable right) { - return getDnf().callTransitive(left, right); - } - - public AssignedValue count(List arguments) { - return getDnf().count(Collections.unmodifiableList(arguments)); - } - - public AssignedValue count(NodeVariable... arguments) { - return getDnf().count(arguments); - } -} diff --git a/subprojects/store-query/src/main/java/tools/refinery/store/query/dnf/SymbolicParameter.java b/subprojects/store-query/src/main/java/tools/refinery/store/query/dnf/SymbolicParameter.java deleted file mode 100644 index fe9cefcc..00000000 --- a/subprojects/store-query/src/main/java/tools/refinery/store/query/dnf/SymbolicParameter.java +++ /dev/null @@ -1,53 +0,0 @@ -/* - * SPDX-FileCopyrightText: 2023 The Refinery Authors - * - * SPDX-License-Identifier: EPL-2.0 - */ -package tools.refinery.store.query.dnf; - -import tools.refinery.store.query.equality.LiteralHashCodeHelper; -import tools.refinery.store.query.term.Parameter; -import tools.refinery.store.query.term.ParameterDirection; -import tools.refinery.store.query.term.Variable; - -import java.util.Objects; - -public final class SymbolicParameter extends Parameter { - private final Variable variable; - - public SymbolicParameter(Variable variable, ParameterDirection direction) { - super(variable.tryGetType().orElse(null), direction); - this.variable = variable; - } - - public Variable getVariable() { - return variable; - } - - public int hashCodeWithSubstitution(LiteralHashCodeHelper helper) { - return Objects.hash(super.hashCode(), helper.getVariableHashCode(variable)); - } - - @Override - public String toString() { - var direction = getDirection(); - if (direction == ParameterDirection.OUT) { - return variable.toString(); - } - return "%s %s".formatted(getDirection(), variable); - } - - @Override - public boolean equals(Object o) { - if (this == o) return true; - if (o == null || getClass() != o.getClass()) return false; - if (!super.equals(o)) return false; - SymbolicParameter that = (SymbolicParameter) o; - return Objects.equals(variable, that.variable); - } - - @Override - public int hashCode() { - return Objects.hash(super.hashCode(), variable); - } -} diff --git a/subprojects/store-query/src/main/java/tools/refinery/store/query/dnf/callback/ClauseCallback0.java b/subprojects/store-query/src/main/java/tools/refinery/store/query/dnf/callback/ClauseCallback0.java deleted file mode 100644 index d98dda2e..00000000 --- a/subprojects/store-query/src/main/java/tools/refinery/store/query/dnf/callback/ClauseCallback0.java +++ /dev/null @@ -1,15 +0,0 @@ -/* - * SPDX-FileCopyrightText: 2021-2023 The Refinery Authors - * - * SPDX-License-Identifier: EPL-2.0 - */ -package tools.refinery.store.query.dnf.callback; - -import tools.refinery.store.query.literal.Literal; - -import java.util.Collection; - -@FunctionalInterface -public interface ClauseCallback0 { - Collection toLiterals(); -} diff --git a/subprojects/store-query/src/main/java/tools/refinery/store/query/dnf/callback/ClauseCallback1Data0.java b/subprojects/store-query/src/main/java/tools/refinery/store/query/dnf/callback/ClauseCallback1Data0.java deleted file mode 100644 index 4c01a527..00000000 --- a/subprojects/store-query/src/main/java/tools/refinery/store/query/dnf/callback/ClauseCallback1Data0.java +++ /dev/null @@ -1,16 +0,0 @@ -/* - * SPDX-FileCopyrightText: 2021-2023 The Refinery Authors - * - * SPDX-License-Identifier: EPL-2.0 - */ -package tools.refinery.store.query.dnf.callback; - -import tools.refinery.store.query.literal.Literal; -import tools.refinery.store.query.term.NodeVariable; - -import java.util.Collection; - -@FunctionalInterface -public interface ClauseCallback1Data0 { - Collection toLiterals(NodeVariable v1); -} diff --git a/subprojects/store-query/src/main/java/tools/refinery/store/query/dnf/callback/ClauseCallback1Data1.java b/subprojects/store-query/src/main/java/tools/refinery/store/query/dnf/callback/ClauseCallback1Data1.java deleted file mode 100644 index 2c0cb6eb..00000000 --- a/subprojects/store-query/src/main/java/tools/refinery/store/query/dnf/callback/ClauseCallback1Data1.java +++ /dev/null @@ -1,16 +0,0 @@ -/* - * SPDX-FileCopyrightText: 2021-2023 The Refinery Authors - * - * SPDX-License-Identifier: EPL-2.0 - */ -package tools.refinery.store.query.dnf.callback; - -import tools.refinery.store.query.literal.Literal; -import tools.refinery.store.query.term.DataVariable; - -import java.util.Collection; - -@FunctionalInterface -public interface ClauseCallback1Data1 { - Collection toLiterals(DataVariable d1); -} diff --git a/subprojects/store-query/src/main/java/tools/refinery/store/query/dnf/callback/ClauseCallback2Data0.java b/subprojects/store-query/src/main/java/tools/refinery/store/query/dnf/callback/ClauseCallback2Data0.java deleted file mode 100644 index d764bdba..00000000 --- a/subprojects/store-query/src/main/java/tools/refinery/store/query/dnf/callback/ClauseCallback2Data0.java +++ /dev/null @@ -1,16 +0,0 @@ -/* - * SPDX-FileCopyrightText: 2021-2023 The Refinery Authors - * - * SPDX-License-Identifier: EPL-2.0 - */ -package tools.refinery.store.query.dnf.callback; - -import tools.refinery.store.query.literal.Literal; -import tools.refinery.store.query.term.NodeVariable; - -import java.util.Collection; - -@FunctionalInterface -public interface ClauseCallback2Data0 { - Collection toLiterals(NodeVariable v1, NodeVariable v2); -} diff --git a/subprojects/store-query/src/main/java/tools/refinery/store/query/dnf/callback/ClauseCallback2Data1.java b/subprojects/store-query/src/main/java/tools/refinery/store/query/dnf/callback/ClauseCallback2Data1.java deleted file mode 100644 index 140af03a..00000000 --- a/subprojects/store-query/src/main/java/tools/refinery/store/query/dnf/callback/ClauseCallback2Data1.java +++ /dev/null @@ -1,17 +0,0 @@ -/* - * SPDX-FileCopyrightText: 2021-2023 The Refinery Authors - * - * SPDX-License-Identifier: EPL-2.0 - */ -package tools.refinery.store.query.dnf.callback; - -import tools.refinery.store.query.literal.Literal; -import tools.refinery.store.query.term.DataVariable; -import tools.refinery.store.query.term.NodeVariable; - -import java.util.Collection; - -@FunctionalInterface -public interface ClauseCallback2Data1 { - Collection toLiterals(NodeVariable v1, DataVariable x1); -} diff --git a/subprojects/store-query/src/main/java/tools/refinery/store/query/dnf/callback/ClauseCallback2Data2.java b/subprojects/store-query/src/main/java/tools/refinery/store/query/dnf/callback/ClauseCallback2Data2.java deleted file mode 100644 index bfc8637c..00000000 --- a/subprojects/store-query/src/main/java/tools/refinery/store/query/dnf/callback/ClauseCallback2Data2.java +++ /dev/null @@ -1,16 +0,0 @@ -/* - * SPDX-FileCopyrightText: 2021-2023 The Refinery Authors - * - * SPDX-License-Identifier: EPL-2.0 - */ -package tools.refinery.store.query.dnf.callback; - -import tools.refinery.store.query.literal.Literal; -import tools.refinery.store.query.term.DataVariable; - -import java.util.Collection; - -@FunctionalInterface -public interface ClauseCallback2Data2 { - Collection toLiterals(DataVariable x1, DataVariable x2); -} diff --git a/subprojects/store-query/src/main/java/tools/refinery/store/query/dnf/callback/ClauseCallback3Data0.java b/subprojects/store-query/src/main/java/tools/refinery/store/query/dnf/callback/ClauseCallback3Data0.java deleted file mode 100644 index 074df65b..00000000 --- a/subprojects/store-query/src/main/java/tools/refinery/store/query/dnf/callback/ClauseCallback3Data0.java +++ /dev/null @@ -1,16 +0,0 @@ -/* - * SPDX-FileCopyrightText: 2021-2023 The Refinery Authors - * - * SPDX-License-Identifier: EPL-2.0 - */ -package tools.refinery.store.query.dnf.callback; - -import tools.refinery.store.query.literal.Literal; -import tools.refinery.store.query.term.NodeVariable; - -import java.util.Collection; - -@FunctionalInterface -public interface ClauseCallback3Data0 { - Collection toLiterals(NodeVariable v1, NodeVariable v2, NodeVariable v3); -} diff --git a/subprojects/store-query/src/main/java/tools/refinery/store/query/dnf/callback/ClauseCallback3Data1.java b/subprojects/store-query/src/main/java/tools/refinery/store/query/dnf/callback/ClauseCallback3Data1.java deleted file mode 100644 index 24ba5187..00000000 --- a/subprojects/store-query/src/main/java/tools/refinery/store/query/dnf/callback/ClauseCallback3Data1.java +++ /dev/null @@ -1,17 +0,0 @@ -/* - * SPDX-FileCopyrightText: 2021-2023 The Refinery Authors - * - * SPDX-License-Identifier: EPL-2.0 - */ -package tools.refinery.store.query.dnf.callback; - -import tools.refinery.store.query.literal.Literal; -import tools.refinery.store.query.term.DataVariable; -import tools.refinery.store.query.term.NodeVariable; - -import java.util.Collection; - -@FunctionalInterface -public interface ClauseCallback3Data1 { - Collection toLiterals(NodeVariable v1, NodeVariable v2, DataVariable d1); -} diff --git a/subprojects/store-query/src/main/java/tools/refinery/store/query/dnf/callback/ClauseCallback3Data2.java b/subprojects/store-query/src/main/java/tools/refinery/store/query/dnf/callback/ClauseCallback3Data2.java deleted file mode 100644 index 2a2e837a..00000000 --- a/subprojects/store-query/src/main/java/tools/refinery/store/query/dnf/callback/ClauseCallback3Data2.java +++ /dev/null @@ -1,17 +0,0 @@ -/* - * SPDX-FileCopyrightText: 2021-2023 The Refinery Authors - * - * SPDX-License-Identifier: EPL-2.0 - */ -package tools.refinery.store.query.dnf.callback; - -import tools.refinery.store.query.literal.Literal; -import tools.refinery.store.query.term.DataVariable; -import tools.refinery.store.query.term.NodeVariable; - -import java.util.Collection; - -@FunctionalInterface -public interface ClauseCallback3Data2 { - Collection toLiterals(NodeVariable v1, DataVariable d1, DataVariable d2); -} diff --git a/subprojects/store-query/src/main/java/tools/refinery/store/query/dnf/callback/ClauseCallback3Data3.java b/subprojects/store-query/src/main/java/tools/refinery/store/query/dnf/callback/ClauseCallback3Data3.java deleted file mode 100644 index 8f4bdd01..00000000 --- a/subprojects/store-query/src/main/java/tools/refinery/store/query/dnf/callback/ClauseCallback3Data3.java +++ /dev/null @@ -1,16 +0,0 @@ -/* - * SPDX-FileCopyrightText: 2021-2023 The Refinery Authors - * - * SPDX-License-Identifier: EPL-2.0 - */ -package tools.refinery.store.query.dnf.callback; - -import tools.refinery.store.query.literal.Literal; -import tools.refinery.store.query.term.DataVariable; - -import java.util.Collection; - -@FunctionalInterface -public interface ClauseCallback3Data3 { - Collection toLiterals(DataVariable d1, DataVariable d2, DataVariable d3); -} diff --git a/subprojects/store-query/src/main/java/tools/refinery/store/query/dnf/callback/ClauseCallback4Data0.java b/subprojects/store-query/src/main/java/tools/refinery/store/query/dnf/callback/ClauseCallback4Data0.java deleted file mode 100644 index ed0f87b2..00000000 --- a/subprojects/store-query/src/main/java/tools/refinery/store/query/dnf/callback/ClauseCallback4Data0.java +++ /dev/null @@ -1,16 +0,0 @@ -/* - * SPDX-FileCopyrightText: 2021-2023 The Refinery Authors - * - * SPDX-License-Identifier: EPL-2.0 - */ -package tools.refinery.store.query.dnf.callback; - -import tools.refinery.store.query.literal.Literal; -import tools.refinery.store.query.term.NodeVariable; - -import java.util.Collection; - -@FunctionalInterface -public interface ClauseCallback4Data0 { - Collection toLiterals(NodeVariable v1, NodeVariable v2, NodeVariable v3, NodeVariable v4); -} diff --git a/subprojects/store-query/src/main/java/tools/refinery/store/query/dnf/callback/ClauseCallback4Data1.java b/subprojects/store-query/src/main/java/tools/refinery/store/query/dnf/callback/ClauseCallback4Data1.java deleted file mode 100644 index 9b27e2e1..00000000 --- a/subprojects/store-query/src/main/java/tools/refinery/store/query/dnf/callback/ClauseCallback4Data1.java +++ /dev/null @@ -1,17 +0,0 @@ -/* - * SPDX-FileCopyrightText: 2021-2023 The Refinery Authors - * - * SPDX-License-Identifier: EPL-2.0 - */ -package tools.refinery.store.query.dnf.callback; - -import tools.refinery.store.query.literal.Literal; -import tools.refinery.store.query.term.DataVariable; -import tools.refinery.store.query.term.NodeVariable; - -import java.util.Collection; - -@FunctionalInterface -public interface ClauseCallback4Data1 { - Collection toLiterals(NodeVariable v1, NodeVariable v2, NodeVariable v3, DataVariable d1); -} diff --git a/subprojects/store-query/src/main/java/tools/refinery/store/query/dnf/callback/ClauseCallback4Data2.java b/subprojects/store-query/src/main/java/tools/refinery/store/query/dnf/callback/ClauseCallback4Data2.java deleted file mode 100644 index cbc4808e..00000000 --- a/subprojects/store-query/src/main/java/tools/refinery/store/query/dnf/callback/ClauseCallback4Data2.java +++ /dev/null @@ -1,17 +0,0 @@ -/* - * SPDX-FileCopyrightText: 2021-2023 The Refinery Authors - * - * SPDX-License-Identifier: EPL-2.0 - */ -package tools.refinery.store.query.dnf.callback; - -import tools.refinery.store.query.literal.Literal; -import tools.refinery.store.query.term.DataVariable; -import tools.refinery.store.query.term.NodeVariable; - -import java.util.Collection; - -@FunctionalInterface -public interface ClauseCallback4Data2 { - Collection toLiterals(NodeVariable v1, NodeVariable v2, DataVariable d1, DataVariable d2); -} diff --git a/subprojects/store-query/src/main/java/tools/refinery/store/query/dnf/callback/ClauseCallback4Data3.java b/subprojects/store-query/src/main/java/tools/refinery/store/query/dnf/callback/ClauseCallback4Data3.java deleted file mode 100644 index a6258f36..00000000 --- a/subprojects/store-query/src/main/java/tools/refinery/store/query/dnf/callback/ClauseCallback4Data3.java +++ /dev/null @@ -1,17 +0,0 @@ -/* - * SPDX-FileCopyrightText: 2021-2023 The Refinery Authors - * - * SPDX-License-Identifier: EPL-2.0 - */ -package tools.refinery.store.query.dnf.callback; - -import tools.refinery.store.query.literal.Literal; -import tools.refinery.store.query.term.DataVariable; -import tools.refinery.store.query.term.NodeVariable; - -import java.util.Collection; - -@FunctionalInterface -public interface ClauseCallback4Data3 { - Collection toLiterals(NodeVariable v1, DataVariable d1, DataVariable d2, DataVariable d3); -} diff --git a/subprojects/store-query/src/main/java/tools/refinery/store/query/dnf/callback/ClauseCallback4Data4.java b/subprojects/store-query/src/main/java/tools/refinery/store/query/dnf/callback/ClauseCallback4Data4.java deleted file mode 100644 index b52a911a..00000000 --- a/subprojects/store-query/src/main/java/tools/refinery/store/query/dnf/callback/ClauseCallback4Data4.java +++ /dev/null @@ -1,16 +0,0 @@ -/* - * SPDX-FileCopyrightText: 2021-2023 The Refinery Authors - * - * SPDX-License-Identifier: EPL-2.0 - */ -package tools.refinery.store.query.dnf.callback; - -import tools.refinery.store.query.literal.Literal; -import tools.refinery.store.query.term.DataVariable; - -import java.util.Collection; - -@FunctionalInterface -public interface ClauseCallback4Data4 { - Collection toLiterals(DataVariable d1, DataVariable d2, DataVariable d3, DataVariable d4); -} diff --git a/subprojects/store-query/src/main/java/tools/refinery/store/query/dnf/callback/FunctionalQueryCallback0.java b/subprojects/store-query/src/main/java/tools/refinery/store/query/dnf/callback/FunctionalQueryCallback0.java deleted file mode 100644 index 63b3eee6..00000000 --- a/subprojects/store-query/src/main/java/tools/refinery/store/query/dnf/callback/FunctionalQueryCallback0.java +++ /dev/null @@ -1,14 +0,0 @@ -/* - * SPDX-FileCopyrightText: 2021-2023 The Refinery Authors - * - * SPDX-License-Identifier: EPL-2.0 - */ -package tools.refinery.store.query.dnf.callback; - -import tools.refinery.store.query.dnf.FunctionalQueryBuilder; -import tools.refinery.store.query.term.DataVariable; - -@FunctionalInterface -public interface FunctionalQueryCallback0 { - void accept(FunctionalQueryBuilder builder, DataVariable output); -} diff --git a/subprojects/store-query/src/main/java/tools/refinery/store/query/dnf/callback/FunctionalQueryCallback1.java b/subprojects/store-query/src/main/java/tools/refinery/store/query/dnf/callback/FunctionalQueryCallback1.java deleted file mode 100644 index 1295a118..00000000 --- a/subprojects/store-query/src/main/java/tools/refinery/store/query/dnf/callback/FunctionalQueryCallback1.java +++ /dev/null @@ -1,15 +0,0 @@ -/* - * SPDX-FileCopyrightText: 2021-2023 The Refinery Authors - * - * SPDX-License-Identifier: EPL-2.0 - */ -package tools.refinery.store.query.dnf.callback; - -import tools.refinery.store.query.dnf.FunctionalQueryBuilder; -import tools.refinery.store.query.term.DataVariable; -import tools.refinery.store.query.term.NodeVariable; - -@FunctionalInterface -public interface FunctionalQueryCallback1 { - void accept(FunctionalQueryBuilder builder, NodeVariable p1, DataVariable output); -} diff --git a/subprojects/store-query/src/main/java/tools/refinery/store/query/dnf/callback/FunctionalQueryCallback2.java b/subprojects/store-query/src/main/java/tools/refinery/store/query/dnf/callback/FunctionalQueryCallback2.java deleted file mode 100644 index d5b7f9ff..00000000 --- a/subprojects/store-query/src/main/java/tools/refinery/store/query/dnf/callback/FunctionalQueryCallback2.java +++ /dev/null @@ -1,15 +0,0 @@ -/* - * SPDX-FileCopyrightText: 2021-2023 The Refinery Authors - * - * SPDX-License-Identifier: EPL-2.0 - */ -package tools.refinery.store.query.dnf.callback; - -import tools.refinery.store.query.dnf.FunctionalQueryBuilder; -import tools.refinery.store.query.term.DataVariable; -import tools.refinery.store.query.term.NodeVariable; - -@FunctionalInterface -public interface FunctionalQueryCallback2 { - void accept(FunctionalQueryBuilder builder, NodeVariable p1, NodeVariable p2, DataVariable output); -} diff --git a/subprojects/store-query/src/main/java/tools/refinery/store/query/dnf/callback/FunctionalQueryCallback3.java b/subprojects/store-query/src/main/java/tools/refinery/store/query/dnf/callback/FunctionalQueryCallback3.java deleted file mode 100644 index dc8404a0..00000000 --- a/subprojects/store-query/src/main/java/tools/refinery/store/query/dnf/callback/FunctionalQueryCallback3.java +++ /dev/null @@ -1,16 +0,0 @@ -/* - * SPDX-FileCopyrightText: 2021-2023 The Refinery Authors - * - * SPDX-License-Identifier: EPL-2.0 - */ -package tools.refinery.store.query.dnf.callback; - -import tools.refinery.store.query.dnf.FunctionalQueryBuilder; -import tools.refinery.store.query.term.DataVariable; -import tools.refinery.store.query.term.NodeVariable; - -@FunctionalInterface -public interface FunctionalQueryCallback3 { - void accept(FunctionalQueryBuilder builder, NodeVariable p1, NodeVariable p2, NodeVariable p3, - DataVariable output); -} diff --git a/subprojects/store-query/src/main/java/tools/refinery/store/query/dnf/callback/FunctionalQueryCallback4.java b/subprojects/store-query/src/main/java/tools/refinery/store/query/dnf/callback/FunctionalQueryCallback4.java deleted file mode 100644 index b6d3ddb0..00000000 --- a/subprojects/store-query/src/main/java/tools/refinery/store/query/dnf/callback/FunctionalQueryCallback4.java +++ /dev/null @@ -1,16 +0,0 @@ -/* - * SPDX-FileCopyrightText: 2021-2023 The Refinery Authors - * - * SPDX-License-Identifier: EPL-2.0 - */ -package tools.refinery.store.query.dnf.callback; - -import tools.refinery.store.query.dnf.FunctionalQueryBuilder; -import tools.refinery.store.query.term.DataVariable; -import tools.refinery.store.query.term.NodeVariable; - -@FunctionalInterface -public interface FunctionalQueryCallback4 { - void accept(FunctionalQueryBuilder builder, NodeVariable p1, NodeVariable p2, NodeVariable p3, NodeVariable p4, - DataVariable output); -} diff --git a/subprojects/store-query/src/main/java/tools/refinery/store/query/dnf/callback/QueryCallback0.java b/subprojects/store-query/src/main/java/tools/refinery/store/query/dnf/callback/QueryCallback0.java deleted file mode 100644 index 3cf1de48..00000000 --- a/subprojects/store-query/src/main/java/tools/refinery/store/query/dnf/callback/QueryCallback0.java +++ /dev/null @@ -1,13 +0,0 @@ -/* - * SPDX-FileCopyrightText: 2021-2023 The Refinery Authors - * - * SPDX-License-Identifier: EPL-2.0 - */ -package tools.refinery.store.query.dnf.callback; - -import tools.refinery.store.query.dnf.QueryBuilder; - -@FunctionalInterface -public interface QueryCallback0 { - void accept(QueryBuilder builder); -} diff --git a/subprojects/store-query/src/main/java/tools/refinery/store/query/dnf/callback/QueryCallback1.java b/subprojects/store-query/src/main/java/tools/refinery/store/query/dnf/callback/QueryCallback1.java deleted file mode 100644 index 0a150955..00000000 --- a/subprojects/store-query/src/main/java/tools/refinery/store/query/dnf/callback/QueryCallback1.java +++ /dev/null @@ -1,14 +0,0 @@ -/* - * SPDX-FileCopyrightText: 2021-2023 The Refinery Authors - * - * SPDX-License-Identifier: EPL-2.0 - */ -package tools.refinery.store.query.dnf.callback; - -import tools.refinery.store.query.dnf.QueryBuilder; -import tools.refinery.store.query.term.NodeVariable; - -@FunctionalInterface -public interface QueryCallback1 { - void accept(QueryBuilder builder, NodeVariable p1); -} diff --git a/subprojects/store-query/src/main/java/tools/refinery/store/query/dnf/callback/QueryCallback2.java b/subprojects/store-query/src/main/java/tools/refinery/store/query/dnf/callback/QueryCallback2.java deleted file mode 100644 index 9493a7b4..00000000 --- a/subprojects/store-query/src/main/java/tools/refinery/store/query/dnf/callback/QueryCallback2.java +++ /dev/null @@ -1,14 +0,0 @@ -/* - * SPDX-FileCopyrightText: 2021-2023 The Refinery Authors - * - * SPDX-License-Identifier: EPL-2.0 - */ -package tools.refinery.store.query.dnf.callback; - -import tools.refinery.store.query.dnf.QueryBuilder; -import tools.refinery.store.query.term.NodeVariable; - -@FunctionalInterface -public interface QueryCallback2 { - void accept(QueryBuilder builder, NodeVariable p1, NodeVariable p2); -} diff --git a/subprojects/store-query/src/main/java/tools/refinery/store/query/dnf/callback/QueryCallback3.java b/subprojects/store-query/src/main/java/tools/refinery/store/query/dnf/callback/QueryCallback3.java deleted file mode 100644 index 358c7da7..00000000 --- a/subprojects/store-query/src/main/java/tools/refinery/store/query/dnf/callback/QueryCallback3.java +++ /dev/null @@ -1,14 +0,0 @@ -/* - * SPDX-FileCopyrightText: 2021-2023 The Refinery Authors - * - * SPDX-License-Identifier: EPL-2.0 - */ -package tools.refinery.store.query.dnf.callback; - -import tools.refinery.store.query.dnf.QueryBuilder; -import tools.refinery.store.query.term.NodeVariable; - -@FunctionalInterface -public interface QueryCallback3 { - void accept(QueryBuilder builder, NodeVariable p1, NodeVariable p2, NodeVariable p3); -} diff --git a/subprojects/store-query/src/main/java/tools/refinery/store/query/dnf/callback/QueryCallback4.java b/subprojects/store-query/src/main/java/tools/refinery/store/query/dnf/callback/QueryCallback4.java deleted file mode 100644 index 890dda16..00000000 --- a/subprojects/store-query/src/main/java/tools/refinery/store/query/dnf/callback/QueryCallback4.java +++ /dev/null @@ -1,14 +0,0 @@ -/* - * SPDX-FileCopyrightText: 2021-2023 The Refinery Authors - * - * SPDX-License-Identifier: EPL-2.0 - */ -package tools.refinery.store.query.dnf.callback; - -import tools.refinery.store.query.dnf.QueryBuilder; -import tools.refinery.store.query.term.NodeVariable; - -@FunctionalInterface -public interface QueryCallback4 { - void accept(QueryBuilder builder, NodeVariable p1, NodeVariable p2, NodeVariable p3, NodeVariable p4); -} diff --git a/subprojects/store-query/src/main/java/tools/refinery/store/query/equality/DeepDnfEqualityChecker.java b/subprojects/store-query/src/main/java/tools/refinery/store/query/equality/DeepDnfEqualityChecker.java deleted file mode 100644 index d6171314..00000000 --- a/subprojects/store-query/src/main/java/tools/refinery/store/query/equality/DeepDnfEqualityChecker.java +++ /dev/null @@ -1,77 +0,0 @@ -/* - * SPDX-FileCopyrightText: 2021-2023 The Refinery Authors - * - * SPDX-License-Identifier: EPL-2.0 - */ -package tools.refinery.store.query.equality; - -import tools.refinery.store.query.dnf.Dnf; -import tools.refinery.store.query.dnf.DnfClause; -import tools.refinery.store.query.dnf.SymbolicParameter; -import tools.refinery.store.query.literal.Literal; -import tools.refinery.store.util.CycleDetectingMapper; - -import java.util.List; - -public class DeepDnfEqualityChecker implements DnfEqualityChecker { - private final CycleDetectingMapper mapper = new CycleDetectingMapper<>(this::doCheckEqual); - - @Override - public boolean dnfEqual(Dnf left, Dnf right) { - return mapper.map(new Pair(left, right)); - } - - public boolean dnfEqualRaw(List symbolicParameters, - List> clauses, Dnf other) { - int arity = symbolicParameters.size(); - if (arity != other.arity()) { - return false; - } - for (int i = 0; i < arity; i++) { - if (!symbolicParameters.get(i).getDirection().equals(other.getSymbolicParameters().get(i).getDirection())) { - return false; - } - } - int numClauses = clauses.size(); - if (numClauses != other.getClauses().size()) { - return false; - } - for (int i = 0; i < numClauses; i++) { - var literalEqualityHelper = new SubstitutingLiteralEqualityHelper(this, symbolicParameters, - other.getSymbolicParameters()); - if (!equalsWithSubstitutionRaw(literalEqualityHelper, clauses.get(i), other.getClauses().get(i))) { - return false; - } - } - return true; - } - - private boolean equalsWithSubstitutionRaw(LiteralEqualityHelper helper, List literals, - DnfClause other) { - int size = literals.size(); - if (size != other.literals().size()) { - return false; - } - for (int i = 0; i < size; i++) { - if (!literals.get(i).equalsWithSubstitution(helper, other.literals().get(i))) { - return false; - } - } - return true; - } - - protected boolean doCheckEqual(Pair pair) { - return pair.left.equalsWithSubstitution(this, pair.right); - } - - protected List getInProgress() { - return mapper.getInProgress(); - } - - protected record Pair(Dnf left, Dnf right) { - @Override - public String toString() { - return "(%s, %s)".formatted(left.name(), right.name()); - } - } -} diff --git a/subprojects/store-query/src/main/java/tools/refinery/store/query/equality/DnfEqualityChecker.java b/subprojects/store-query/src/main/java/tools/refinery/store/query/equality/DnfEqualityChecker.java deleted file mode 100644 index e2cfd79b..00000000 --- a/subprojects/store-query/src/main/java/tools/refinery/store/query/equality/DnfEqualityChecker.java +++ /dev/null @@ -1,17 +0,0 @@ -/* - * SPDX-FileCopyrightText: 2021-2023 The Refinery Authors - * - * SPDX-License-Identifier: EPL-2.0 - */ -package tools.refinery.store.query.equality; - -import tools.refinery.store.query.dnf.Dnf; - -import java.util.Objects; - -@FunctionalInterface -public interface DnfEqualityChecker { - DnfEqualityChecker DEFAULT = Objects::equals; - - boolean dnfEqual(Dnf left, Dnf right); -} diff --git a/subprojects/store-query/src/main/java/tools/refinery/store/query/equality/LiteralEqualityHelper.java b/subprojects/store-query/src/main/java/tools/refinery/store/query/equality/LiteralEqualityHelper.java deleted file mode 100644 index 5abc76ce..00000000 --- a/subprojects/store-query/src/main/java/tools/refinery/store/query/equality/LiteralEqualityHelper.java +++ /dev/null @@ -1,27 +0,0 @@ -/* - * SPDX-FileCopyrightText: 2021-2023 The Refinery Authors - * - * SPDX-License-Identifier: EPL-2.0 - */ -package tools.refinery.store.query.equality; - -import tools.refinery.store.query.dnf.Dnf; -import tools.refinery.store.query.term.Variable; - -import java.util.Objects; - -public interface LiteralEqualityHelper extends DnfEqualityChecker { - LiteralEqualityHelper DEFAULT = new LiteralEqualityHelper() { - @Override - public boolean variableEqual(Variable left, Variable right) { - return Objects.equals(left, right); - } - - @Override - public boolean dnfEqual(Dnf left, Dnf right) { - return DnfEqualityChecker.DEFAULT.dnfEqual(left, right); - } - }; - - boolean variableEqual(Variable left, Variable right); -} diff --git a/subprojects/store-query/src/main/java/tools/refinery/store/query/equality/LiteralHashCodeHelper.java b/subprojects/store-query/src/main/java/tools/refinery/store/query/equality/LiteralHashCodeHelper.java deleted file mode 100644 index 5495160a..00000000 --- a/subprojects/store-query/src/main/java/tools/refinery/store/query/equality/LiteralHashCodeHelper.java +++ /dev/null @@ -1,17 +0,0 @@ -/* - * SPDX-FileCopyrightText: 2023 The Refinery Authors - * - * SPDX-License-Identifier: EPL-2.0 - */ -package tools.refinery.store.query.equality; - -import tools.refinery.store.query.term.Variable; - -import java.util.Objects; - -@FunctionalInterface -public interface LiteralHashCodeHelper { - LiteralHashCodeHelper DEFAULT = Objects::hashCode; - - int getVariableHashCode(Variable variable); -} diff --git a/subprojects/store-query/src/main/java/tools/refinery/store/query/equality/SubstitutingLiteralEqualityHelper.java b/subprojects/store-query/src/main/java/tools/refinery/store/query/equality/SubstitutingLiteralEqualityHelper.java deleted file mode 100644 index 50a79e07..00000000 --- a/subprojects/store-query/src/main/java/tools/refinery/store/query/equality/SubstitutingLiteralEqualityHelper.java +++ /dev/null @@ -1,59 +0,0 @@ -/* - * SPDX-FileCopyrightText: 2023 The Refinery Authors - * - * SPDX-License-Identifier: EPL-2.0 - */ -package tools.refinery.store.query.equality; - -import tools.refinery.store.query.dnf.Dnf; -import tools.refinery.store.query.dnf.SymbolicParameter; -import tools.refinery.store.query.term.Variable; - -import java.util.HashMap; -import java.util.List; -import java.util.Map; - -public class SubstitutingLiteralEqualityHelper implements LiteralEqualityHelper { - private final DnfEqualityChecker dnfEqualityChecker; - private final Map leftToRight; - private final Map rightToLeft; - - public SubstitutingLiteralEqualityHelper(DnfEqualityChecker dnfEqualityChecker, - List leftParameters, - List rightParameters) { - this.dnfEqualityChecker = dnfEqualityChecker; - var arity = leftParameters.size(); - if (arity != rightParameters.size()) { - throw new IllegalArgumentException("Parameter lists have unequal length"); - } - leftToRight = new HashMap<>(arity); - rightToLeft = new HashMap<>(arity); - for (int i = 0; i < arity; i++) { - if (!variableEqual(leftParameters.get(i).getVariable(), rightParameters.get(i).getVariable())) { - throw new IllegalArgumentException("Parameter lists cannot be unified: duplicate parameter " + i); - } - } - } - - @Override - public boolean dnfEqual(Dnf left, Dnf right) { - return dnfEqualityChecker.dnfEqual(left, right); - } - - @Override - public boolean variableEqual(Variable left, Variable right) { - if (left.tryGetType().equals(right.tryGetType()) && - checkMapping(leftToRight, left, right) && - checkMapping(rightToLeft, right, left)) { - leftToRight.put(left, right); - rightToLeft.put(right, left); - return true; - } - return false; - } - - private static boolean checkMapping(Map map, Variable key, Variable expectedValue) { - var currentValue = map.get(key); - return currentValue == null || currentValue.equals(expectedValue); - } -} diff --git a/subprojects/store-query/src/main/java/tools/refinery/store/query/equality/SubstitutingLiteralHashCodeHelper.java b/subprojects/store-query/src/main/java/tools/refinery/store/query/equality/SubstitutingLiteralHashCodeHelper.java deleted file mode 100644 index 754f6976..00000000 --- a/subprojects/store-query/src/main/java/tools/refinery/store/query/equality/SubstitutingLiteralHashCodeHelper.java +++ /dev/null @@ -1,42 +0,0 @@ -/* - * SPDX-FileCopyrightText: 2023 The Refinery Authors - * - * SPDX-License-Identifier: EPL-2.0 - */ -package tools.refinery.store.query.equality; - -import tools.refinery.store.query.dnf.SymbolicParameter; -import tools.refinery.store.query.term.Variable; - -import java.util.LinkedHashMap; -import java.util.List; -import java.util.Map; - -public class SubstitutingLiteralHashCodeHelper implements LiteralHashCodeHelper { - private final Map assignedHashCodes = new LinkedHashMap<>(); - - // 0 is for {@code null}, so we start with 1. - private int next = 1; - - public SubstitutingLiteralHashCodeHelper() { - this(List.of()); - } - - public SubstitutingLiteralHashCodeHelper(List parameters) { - for (var parameter : parameters) { - getVariableHashCode(parameter.getVariable()); - } - } - - @Override - public int getVariableHashCode(Variable variable) { - if (variable == null) { - return 0; - } - return assignedHashCodes.computeIfAbsent(variable, key -> { - int sequenceNumber = next; - next++; - return variable.hashCodeWithSubstitution(sequenceNumber); - }); - } -} diff --git a/subprojects/store-query/src/main/java/tools/refinery/store/query/literal/AbstractCallLiteral.java b/subprojects/store-query/src/main/java/tools/refinery/store/query/literal/AbstractCallLiteral.java deleted file mode 100644 index 0e99d441..00000000 --- a/subprojects/store-query/src/main/java/tools/refinery/store/query/literal/AbstractCallLiteral.java +++ /dev/null @@ -1,135 +0,0 @@ -/* - * SPDX-FileCopyrightText: 2021-2023 The Refinery Authors - * - * SPDX-License-Identifier: EPL-2.0 - */ -package tools.refinery.store.query.literal; - -import tools.refinery.store.query.Constraint; -import tools.refinery.store.query.InvalidQueryException; -import tools.refinery.store.query.equality.LiteralEqualityHelper; -import tools.refinery.store.query.equality.LiteralHashCodeHelper; -import tools.refinery.store.query.substitution.Substitution; -import tools.refinery.store.query.term.ParameterDirection; -import tools.refinery.store.query.term.Variable; - -import java.util.*; - -// {@link Object#equals(Object)} is implemented by {@link AbstractLiteral}. -@SuppressWarnings("squid:S2160") -public abstract class AbstractCallLiteral extends AbstractLiteral { - private final Constraint target; - private final List arguments; - private final Set inArguments; - private final Set outArguments; - - // Use exhaustive switch over enums. - @SuppressWarnings("squid:S1301") - protected AbstractCallLiteral(Constraint target, List arguments) { - int arity = target.arity(); - if (arguments.size() != arity) { - throw new InvalidQueryException("%s needs %d arguments, but got %s".formatted(target.name(), - target.arity(), arguments.size())); - } - this.target = target; - this.arguments = arguments; - var mutableInArguments = new LinkedHashSet(); - var mutableOutArguments = new LinkedHashSet(); - var parameters = target.getParameters(); - for (int i = 0; i < arity; i++) { - var argument = arguments.get(i); - var parameter = parameters.get(i); - if (!parameter.isAssignable(argument)) { - throw new InvalidQueryException("Argument %d of %s is not assignable to parameter %s" - .formatted(i, target, parameter)); - } - switch (parameter.getDirection()) { - case IN -> { - mutableOutArguments.remove(argument); - mutableInArguments.add(argument); - } - case OUT -> { - if (!mutableInArguments.contains(argument)) { - mutableOutArguments.add(argument); - } - } - } - } - inArguments = Collections.unmodifiableSet(mutableInArguments); - outArguments = Collections.unmodifiableSet(mutableOutArguments); - } - - public Constraint getTarget() { - return target; - } - - public List getArguments() { - return arguments; - } - - protected Set getArgumentsOfDirection(ParameterDirection direction) { - return switch (direction) { - case IN -> inArguments; - case OUT -> outArguments; - }; - } - - @Override - public Set getInputVariables(Set positiveVariablesInClause) { - var inputVariables = new LinkedHashSet<>(getArgumentsOfDirection(ParameterDirection.OUT)); - inputVariables.retainAll(positiveVariablesInClause); - inputVariables.addAll(getArgumentsOfDirection(ParameterDirection.IN)); - return Collections.unmodifiableSet(inputVariables); - } - - @Override - public Set getPrivateVariables(Set positiveVariablesInClause) { - var privateVariables = new LinkedHashSet<>(getArgumentsOfDirection(ParameterDirection.OUT)); - privateVariables.removeAll(positiveVariablesInClause); - return Collections.unmodifiableSet(privateVariables); - } - - @Override - public Literal substitute(Substitution substitution) { - var substitutedArguments = arguments.stream().map(substitution::getSubstitute).toList(); - return doSubstitute(substitution, substitutedArguments); - } - - protected abstract Literal doSubstitute(Substitution substitution, List substitutedArguments); - - public AbstractCallLiteral withTarget(Constraint newTarget) { - if (Objects.equals(target, newTarget)) { - return this; - } - return withArguments(newTarget, arguments); - } - - public abstract AbstractCallLiteral withArguments(Constraint newTarget, List newArguments); - - @Override - public boolean equalsWithSubstitution(LiteralEqualityHelper helper, Literal other) { - if (!super.equalsWithSubstitution(helper, other)) { - return false; - } - var otherCallLiteral = (AbstractCallLiteral) other; - var arity = arguments.size(); - if (arity != otherCallLiteral.arguments.size()) { - return false; - } - for (int i = 0; i < arity; i++) { - if (!helper.variableEqual(arguments.get(i), otherCallLiteral.arguments.get(i))) { - return false; - } - } - return target.equals(helper, otherCallLiteral.target); - } - - @Override - public int hashCodeWithSubstitution(LiteralHashCodeHelper helper) { - int result = super.hashCodeWithSubstitution(helper) * 31 + target.hashCode(); - for (var argument : arguments) { - result = result * 31 + helper.getVariableHashCode(argument); - } - return result; - } -} diff --git a/subprojects/store-query/src/main/java/tools/refinery/store/query/literal/AbstractCountLiteral.java b/subprojects/store-query/src/main/java/tools/refinery/store/query/literal/AbstractCountLiteral.java deleted file mode 100644 index 9bb572c0..00000000 --- a/subprojects/store-query/src/main/java/tools/refinery/store/query/literal/AbstractCountLiteral.java +++ /dev/null @@ -1,107 +0,0 @@ -/* - * SPDX-FileCopyrightText: 2023 The Refinery Authors - * - * SPDX-License-Identifier: EPL-2.0 - */ -package tools.refinery.store.query.literal; - -import tools.refinery.store.query.Constraint; -import tools.refinery.store.query.InvalidQueryException; -import tools.refinery.store.query.equality.LiteralEqualityHelper; -import tools.refinery.store.query.equality.LiteralHashCodeHelper; -import tools.refinery.store.query.term.ConstantTerm; -import tools.refinery.store.query.term.DataVariable; -import tools.refinery.store.query.term.Variable; - -import java.util.List; -import java.util.Objects; -import java.util.Set; - -// {@link Object#equals(Object)} is implemented by {@link AbstractLiteral}. -@SuppressWarnings("squid:S2160") -public abstract class AbstractCountLiteral extends AbstractCallLiteral { - private final Class resultType; - private final DataVariable resultVariable; - - protected AbstractCountLiteral(Class resultType, DataVariable resultVariable, Constraint target, - List arguments) { - super(target, arguments); - if (!resultVariable.getType().equals(resultType)) { - throw new InvalidQueryException("Count result variable %s must be of type %s, got %s instead".formatted( - resultVariable, resultType, resultVariable.getType().getName())); - } - if (arguments.contains(resultVariable)) { - throw new InvalidQueryException("Count result variable %s must not appear in the argument list" - .formatted(resultVariable)); - } - this.resultType = resultType; - this.resultVariable = resultVariable; - } - - public Class getResultType() { - return resultType; - } - - public DataVariable getResultVariable() { - return resultVariable; - } - - @Override - public Set getOutputVariables() { - return Set.of(resultVariable); - } - - protected abstract T zero(); - - protected abstract T one(); - - @Override - public Literal reduce() { - var reduction = getTarget().getReduction(); - return switch (reduction) { - case ALWAYS_FALSE -> getResultVariable().assign(new ConstantTerm<>(resultType, zero())); - // The only way a constant {@code true} predicate can be called in a negative position is to have all of - // its arguments bound as input variables. Thus, there will only be a single match. - case ALWAYS_TRUE -> getResultVariable().assign(new ConstantTerm<>(resultType, one())); - case NOT_REDUCIBLE -> this; - }; - } - - @Override - public boolean equalsWithSubstitution(LiteralEqualityHelper helper, Literal other) { - if (!super.equalsWithSubstitution(helper, other)) { - return false; - } - var otherCountLiteral = (AbstractCountLiteral) other; - return Objects.equals(resultType, otherCountLiteral.resultType) && - helper.variableEqual(resultVariable, otherCountLiteral.resultVariable); - } - - @Override - public int hashCodeWithSubstitution(LiteralHashCodeHelper helper) { - return Objects.hash(super.hashCodeWithSubstitution(helper), resultType, - helper.getVariableHashCode(resultVariable)); - } - - protected abstract String operatorName(); - - @Override - public String toString() { - var builder = new StringBuilder(); - builder.append(resultVariable); - builder.append(" is "); - builder.append(operatorName()); - builder.append(' '); - builder.append(getTarget().toReferenceString()); - builder.append('('); - var argumentIterator = getArguments().iterator(); - if (argumentIterator.hasNext()) { - builder.append(argumentIterator.next()); - while (argumentIterator.hasNext()) { - builder.append(", ").append(argumentIterator.next()); - } - } - builder.append(')'); - return builder.toString(); - } -} diff --git a/subprojects/store-query/src/main/java/tools/refinery/store/query/literal/AbstractLiteral.java b/subprojects/store-query/src/main/java/tools/refinery/store/query/literal/AbstractLiteral.java deleted file mode 100644 index 7d3cabd7..00000000 --- a/subprojects/store-query/src/main/java/tools/refinery/store/query/literal/AbstractLiteral.java +++ /dev/null @@ -1,34 +0,0 @@ -/* - * SPDX-FileCopyrightText: 2023 The Refinery Authors - * - * SPDX-License-Identifier: EPL-2.0 - */ -package tools.refinery.store.query.literal; - -import tools.refinery.store.query.equality.LiteralEqualityHelper; -import tools.refinery.store.query.equality.LiteralHashCodeHelper; - -public abstract class AbstractLiteral implements Literal { - @Override - public boolean equalsWithSubstitution(LiteralEqualityHelper helper, Literal other) { - return other != null && getClass() == other.getClass(); - } - - @Override - public int hashCodeWithSubstitution(LiteralHashCodeHelper helper) { - return getClass().hashCode(); - } - - @Override - public boolean equals(Object o) { - if (this == o) return true; - if (o == null || getClass() != o.getClass()) return false; - AbstractLiteral that = (AbstractLiteral) o; - return equalsWithSubstitution(LiteralEqualityHelper.DEFAULT, that); - } - - @Override - public int hashCode() { - return hashCodeWithSubstitution(LiteralHashCodeHelper.DEFAULT); - } -} diff --git a/subprojects/store-query/src/main/java/tools/refinery/store/query/literal/AggregationLiteral.java b/subprojects/store-query/src/main/java/tools/refinery/store/query/literal/AggregationLiteral.java deleted file mode 100644 index b6861de0..00000000 --- a/subprojects/store-query/src/main/java/tools/refinery/store/query/literal/AggregationLiteral.java +++ /dev/null @@ -1,143 +0,0 @@ -/* - * SPDX-FileCopyrightText: 2021-2024 The Refinery Authors - * - * SPDX-License-Identifier: EPL-2.0 - */ -package tools.refinery.store.query.literal; - -import tools.refinery.store.query.Constraint; -import tools.refinery.store.query.InvalidQueryException; -import tools.refinery.store.query.equality.LiteralEqualityHelper; -import tools.refinery.store.query.equality.LiteralHashCodeHelper; -import tools.refinery.store.query.substitution.Substitution; -import tools.refinery.store.query.term.*; - -import java.util.List; -import java.util.Objects; -import java.util.Set; - -// {@link Object#equals(Object)} is implemented by {@link AbstractLiteral}. -@SuppressWarnings("squid:S2160") -public class AggregationLiteral extends AbstractCallLiteral { - private final DataVariable resultVariable; - private final DataVariable inputVariable; - private final Aggregator aggregator; - - public AggregationLiteral(DataVariable resultVariable, Aggregator aggregator, - DataVariable inputVariable, Constraint target, List arguments) { - super(target, arguments); - if (!inputVariable.getType().equals(aggregator.getInputType())) { - throw new InvalidQueryException("Input variable %s must of type %s, got %s instead".formatted( - inputVariable, aggregator.getInputType().getName(), inputVariable.getType().getName())); - } - if (!getArgumentsOfDirection(ParameterDirection.OUT).contains(inputVariable)) { - throw new InvalidQueryException("Input variable %s must be bound with direction %s in the argument list" - .formatted(inputVariable, ParameterDirection.OUT)); - } - if (!resultVariable.getType().equals(aggregator.getResultType())) { - throw new InvalidQueryException("Result variable %s must of type %s, got %s instead".formatted( - resultVariable, aggregator.getResultType().getName(), resultVariable.getType().getName())); - } - if (arguments.contains(resultVariable)) { - throw new InvalidQueryException("Result variable %s must not appear in the argument list".formatted( - resultVariable)); - } - this.resultVariable = resultVariable; - this.inputVariable = inputVariable; - this.aggregator = aggregator; - } - - public DataVariable getResultVariable() { - return resultVariable; - } - - public DataVariable getInputVariable() { - return inputVariable; - } - - public Aggregator getAggregator() { - return aggregator; - } - - @Override - public Set getOutputVariables() { - return Set.of(resultVariable); - } - - @Override - public Set getInputVariables(Set positiveVariablesInClause) { - if (positiveVariablesInClause.contains(inputVariable)) { - throw new InvalidQueryException("Aggregation variable %s must not be bound".formatted(inputVariable)); - } - return super.getInputVariables(positiveVariablesInClause); - } - - @Override - public Literal reduce() { - var reduction = getTarget().getReduction(); - return switch (reduction) { - case ALWAYS_FALSE -> { - var emptyValue = aggregator.getEmptyResult(); - yield emptyValue == null ? BooleanLiteral.FALSE : - resultVariable.assign(new ConstantTerm<>(resultVariable.getType(), emptyValue)); - } - case ALWAYS_TRUE -> throw new InvalidQueryException("Trying to aggregate over an infinite set"); - case NOT_REDUCIBLE -> this; - }; - } - - @Override - protected Literal doSubstitute(Substitution substitution, List substitutedArguments) { - return new AggregationLiteral<>(substitution.getTypeSafeSubstitute(resultVariable), aggregator, - substitution.getTypeSafeSubstitute(inputVariable), getTarget(), substitutedArguments); - } - - @Override - public AbstractCallLiteral withArguments(Constraint newTarget, List newArguments) { - return new AggregationLiteral<>(resultVariable, aggregator, inputVariable, newTarget, newArguments); - } - - @Override - public boolean equalsWithSubstitution(LiteralEqualityHelper helper, Literal other) { - if (!super.equalsWithSubstitution(helper, other)) { - return false; - } - var otherAggregationLiteral = (AggregationLiteral) other; - return helper.variableEqual(resultVariable, otherAggregationLiteral.resultVariable) && - aggregator.equals(otherAggregationLiteral.aggregator) && - helper.variableEqual(inputVariable, otherAggregationLiteral.inputVariable); - } - - @Override - public int hashCodeWithSubstitution(LiteralHashCodeHelper helper) { - return Objects.hash(super.hashCodeWithSubstitution(helper), helper.getVariableHashCode(resultVariable), - helper.getVariableHashCode(inputVariable), aggregator); - } - - @Override - public String toString() { - var builder = new StringBuilder(); - builder.append(resultVariable); - builder.append(" is "); - builder.append(getTarget().toReferenceString()); - builder.append("("); - var argumentIterator = getArguments().iterator(); - if (argumentIterator.hasNext()) { - var argument = argumentIterator.next(); - if (inputVariable.equals(argument)) { - builder.append("@Aggregate(\"").append(aggregator).append("\") "); - } - builder.append(argument); - while (argumentIterator.hasNext()) { - builder.append(", "); - argument = argumentIterator.next(); - if (inputVariable.equals(argument)) { - builder.append("@Aggregate(\"").append(aggregator).append("\") "); - } - builder.append(argument); - } - } - builder.append(")"); - return builder.toString(); - } -} diff --git a/subprojects/store-query/src/main/java/tools/refinery/store/query/literal/AssignLiteral.java b/subprojects/store-query/src/main/java/tools/refinery/store/query/literal/AssignLiteral.java deleted file mode 100644 index dadf487f..00000000 --- a/subprojects/store-query/src/main/java/tools/refinery/store/query/literal/AssignLiteral.java +++ /dev/null @@ -1,88 +0,0 @@ -/* - * SPDX-FileCopyrightText: 2021-2023 The Refinery Authors - * - * SPDX-License-Identifier: EPL-2.0 - */ -package tools.refinery.store.query.literal; - -import tools.refinery.store.query.InvalidQueryException; -import tools.refinery.store.query.equality.LiteralEqualityHelper; -import tools.refinery.store.query.equality.LiteralHashCodeHelper; -import tools.refinery.store.query.substitution.Substitution; -import tools.refinery.store.query.term.DataVariable; -import tools.refinery.store.query.term.Term; -import tools.refinery.store.query.term.Variable; - -import java.util.Collections; -import java.util.Objects; -import java.util.Set; - -// {@link Object#equals(Object)} is implemented by {@link AbstractLiteral}. -@SuppressWarnings("squid:S2160") -public class AssignLiteral extends AbstractLiteral { - private final DataVariable variable; - private final Term term; - - public AssignLiteral(DataVariable variable, Term term) { - if (!term.getType().equals(variable.getType())) { - throw new InvalidQueryException("Term %s must be of type %s, got %s instead".formatted( - term, variable.getType().getName(), term.getType().getName())); - } - var inputVariables = term.getInputVariables(); - if (inputVariables.contains(variable)) { - throw new InvalidQueryException("Result variable %s must not appear in the term %s".formatted( - variable, term)); - } - this.variable = variable; - this.term = term; - } - - public DataVariable getVariable() { - return variable; - } - - public Term getTerm() { - return term; - } - - @Override - public Set getOutputVariables() { - return Set.of(variable); - } - - @Override - public Set getInputVariables(Set positiveVariablesInClause) { - return Collections.unmodifiableSet(term.getInputVariables()); - } - - @Override - public Set getPrivateVariables(Set positiveVariablesInClause) { - return Set.of(); - } - - @Override - public Literal substitute(Substitution substitution) { - return new AssignLiteral<>(substitution.getTypeSafeSubstitute(variable), term.substitute(substitution)); - } - - @Override - public boolean equalsWithSubstitution(LiteralEqualityHelper helper, Literal other) { - if (other == null || getClass() != other.getClass()) { - return false; - } - var otherAssignLiteral = (AssignLiteral) other; - return helper.variableEqual(variable, otherAssignLiteral.variable) && - term.equalsWithSubstitution(helper, otherAssignLiteral.term); - } - - @Override - public int hashCodeWithSubstitution(LiteralHashCodeHelper helper) { - return Objects.hash(super.hashCodeWithSubstitution(helper), helper.getVariableHashCode(variable), - term.hashCodeWithSubstitution(helper)); - } - - @Override - public String toString() { - return "%s is (%s)".formatted(variable, term); - } -} diff --git a/subprojects/store-query/src/main/java/tools/refinery/store/query/literal/BooleanLiteral.java b/subprojects/store-query/src/main/java/tools/refinery/store/query/literal/BooleanLiteral.java deleted file mode 100644 index 6cd320da..00000000 --- a/subprojects/store-query/src/main/java/tools/refinery/store/query/literal/BooleanLiteral.java +++ /dev/null @@ -1,69 +0,0 @@ -/* - * SPDX-FileCopyrightText: 2021-2023 The Refinery Authors - * - * SPDX-License-Identifier: EPL-2.0 - */ -package tools.refinery.store.query.literal; - -import tools.refinery.store.query.equality.LiteralEqualityHelper; -import tools.refinery.store.query.equality.LiteralHashCodeHelper; -import tools.refinery.store.query.substitution.Substitution; -import tools.refinery.store.query.term.Variable; - -import java.util.Set; - -public enum BooleanLiteral implements CanNegate { - TRUE(true), - FALSE(false); - - private final boolean value; - - BooleanLiteral(boolean value) { - this.value = value; - } - - @Override - public Set getOutputVariables() { - return Set.of(); - } - - @Override - public Set getInputVariables(Set positiveVariablesInClause) { - return Set.of(); - } - - @Override - public Set getPrivateVariables(Set positiveVariablesInClause) { - return Set.of(); - } - - @Override - public Literal substitute(Substitution substitution) { - // No variables to substitute. - return this; - } - - @Override - public BooleanLiteral negate() { - return fromBoolean(!value); - } - - @Override - public boolean equalsWithSubstitution(LiteralEqualityHelper helper, Literal other) { - return equals(other); - } - - @Override - public int hashCodeWithSubstitution(LiteralHashCodeHelper helper) { - return hashCode(); - } - - @Override - public String toString() { - return Boolean.toString(value); - } - - public static BooleanLiteral fromBoolean(boolean value) { - return value ? TRUE : FALSE; - } -} diff --git a/subprojects/store-query/src/main/java/tools/refinery/store/query/literal/CallLiteral.java b/subprojects/store-query/src/main/java/tools/refinery/store/query/literal/CallLiteral.java deleted file mode 100644 index 2d0e4e97..00000000 --- a/subprojects/store-query/src/main/java/tools/refinery/store/query/literal/CallLiteral.java +++ /dev/null @@ -1,134 +0,0 @@ -/* - * SPDX-FileCopyrightText: 2021-2023 The Refinery Authors - * - * SPDX-License-Identifier: EPL-2.0 - */ -package tools.refinery.store.query.literal; - -import tools.refinery.store.query.Constraint; -import tools.refinery.store.query.InvalidQueryException; -import tools.refinery.store.query.equality.LiteralEqualityHelper; -import tools.refinery.store.query.equality.LiteralHashCodeHelper; -import tools.refinery.store.query.substitution.Substitution; -import tools.refinery.store.query.term.ParameterDirection; -import tools.refinery.store.query.term.Variable; - -import java.util.*; - -// {@link Object#equals(Object)} is implemented by {@link AbstractLiteral}. -@SuppressWarnings("squid:S2160") -public final class CallLiteral extends AbstractCallLiteral implements CanNegate { - private final CallPolarity polarity; - - public CallLiteral(CallPolarity polarity, Constraint target, List arguments) { - super(target, arguments); - var parameters = target.getParameters(); - int arity = target.arity(); - if (polarity.isTransitive()) { - if (arity != 2) { - throw new InvalidQueryException("Transitive closures can only take binary relations"); - } - if (parameters.get(0).isDataVariable() || parameters.get(1).isDataVariable()) { - throw new InvalidQueryException("Transitive closures can only be computed over nodes"); - } - if (parameters.get(0).getDirection() != ParameterDirection.OUT || - parameters.get(1).getDirection() != ParameterDirection.OUT) { - throw new InvalidQueryException("Transitive closures cannot take input parameters"); - } - } - this.polarity = polarity; - } - - public CallPolarity getPolarity() { - return polarity; - } - - @Override - protected Literal doSubstitute(Substitution substitution, List substitutedArguments) { - return new CallLiteral(polarity, getTarget(), substitutedArguments); - } - - @Override - public Set getOutputVariables() { - if (polarity.isPositive()) { - return getArgumentsOfDirection(ParameterDirection.OUT); - } - return Set.of(); - } - - @Override - public Set getInputVariables(Set positiveVariablesInClause) { - if (polarity.isPositive()) { - return getArgumentsOfDirection(ParameterDirection.IN); - } - return super.getInputVariables(positiveVariablesInClause); - } - - @Override - public Set getPrivateVariables(Set positiveVariablesInClause) { - if (polarity.isPositive()) { - return Set.of(); - } - return super.getPrivateVariables(positiveVariablesInClause); - } - - @Override - public Literal reduce() { - var reduction = getTarget().getReduction(); - var negatedReduction = polarity.isPositive() ? reduction : reduction.negate(); - return switch (negatedReduction) { - case ALWAYS_TRUE -> BooleanLiteral.TRUE; - case ALWAYS_FALSE -> BooleanLiteral.FALSE; - default -> this; - }; - } - - @Override - public boolean equalsWithSubstitution(LiteralEqualityHelper helper, Literal other) { - if (!super.equalsWithSubstitution(helper, other)) { - return false; - } - var otherCallLiteral = (CallLiteral) other; - return polarity.equals(otherCallLiteral.polarity); - } - - @Override - public int hashCodeWithSubstitution(LiteralHashCodeHelper helper) { - return Objects.hash(super.hashCodeWithSubstitution(helper), polarity); - } - - @Override - public CallLiteral negate() { - return new CallLiteral(polarity.negate(), getTarget(), getArguments()); - } - - @Override - public AbstractCallLiteral withArguments(Constraint newTarget, List newArguments) { - return new CallLiteral(polarity, newTarget, newArguments); - } - - @Override - public String toString() { - var builder = new StringBuilder(); - if (!polarity.isPositive()) { - builder.append("!("); - } - builder.append(getTarget().toReferenceString()); - if (polarity.isTransitive()) { - builder.append("+"); - } - builder.append("("); - var argumentIterator = getArguments().iterator(); - if (argumentIterator.hasNext()) { - builder.append(argumentIterator.next()); - while (argumentIterator.hasNext()) { - builder.append(", ").append(argumentIterator.next()); - } - } - builder.append(")"); - if (!polarity.isPositive()) { - builder.append(")"); - } - return builder.toString(); - } -} diff --git a/subprojects/store-query/src/main/java/tools/refinery/store/query/literal/CallPolarity.java b/subprojects/store-query/src/main/java/tools/refinery/store/query/literal/CallPolarity.java deleted file mode 100644 index 716c7109..00000000 --- a/subprojects/store-query/src/main/java/tools/refinery/store/query/literal/CallPolarity.java +++ /dev/null @@ -1,39 +0,0 @@ -/* - * SPDX-FileCopyrightText: 2021-2023 The Refinery Authors - * - * SPDX-License-Identifier: EPL-2.0 - */ -package tools.refinery.store.query.literal; - -import tools.refinery.store.query.InvalidQueryException; - -public enum CallPolarity { - POSITIVE(true, false), - NEGATIVE(false, false), - TRANSITIVE(true, true); - - private final boolean positive; - - private final boolean transitive; - - CallPolarity(boolean positive, boolean transitive) { - this.positive = positive; - this.transitive = transitive; - } - - public boolean isPositive() { - return positive; - } - - public boolean isTransitive() { - return transitive; - } - - public CallPolarity negate() { - return switch (this) { - case POSITIVE -> NEGATIVE; - case NEGATIVE -> POSITIVE; - case TRANSITIVE -> throw new InvalidQueryException("Transitive polarity cannot be negated"); - }; - } -} diff --git a/subprojects/store-query/src/main/java/tools/refinery/store/query/literal/CanNegate.java b/subprojects/store-query/src/main/java/tools/refinery/store/query/literal/CanNegate.java deleted file mode 100644 index 35dcb3fb..00000000 --- a/subprojects/store-query/src/main/java/tools/refinery/store/query/literal/CanNegate.java +++ /dev/null @@ -1,10 +0,0 @@ -/* - * SPDX-FileCopyrightText: 2021-2023 The Refinery Authors - * - * SPDX-License-Identifier: EPL-2.0 - */ -package tools.refinery.store.query.literal; - -public interface CanNegate> extends Literal { - T negate(); -} diff --git a/subprojects/store-query/src/main/java/tools/refinery/store/query/literal/CheckLiteral.java b/subprojects/store-query/src/main/java/tools/refinery/store/query/literal/CheckLiteral.java deleted file mode 100644 index dfedd2cb..00000000 --- a/subprojects/store-query/src/main/java/tools/refinery/store/query/literal/CheckLiteral.java +++ /dev/null @@ -1,95 +0,0 @@ -/* - * SPDX-FileCopyrightText: 2021-2023 The Refinery Authors - * - * SPDX-License-Identifier: EPL-2.0 - */ -package tools.refinery.store.query.literal; - -import tools.refinery.store.query.InvalidQueryException; -import tools.refinery.store.query.equality.LiteralEqualityHelper; -import tools.refinery.store.query.equality.LiteralHashCodeHelper; -import tools.refinery.store.query.substitution.Substitution; -import tools.refinery.store.query.term.ConstantTerm; -import tools.refinery.store.query.term.Term; -import tools.refinery.store.query.term.Variable; -import tools.refinery.store.query.term.bool.BoolNotTerm; -import tools.refinery.store.query.term.bool.BoolTerms; - -import java.util.Collections; -import java.util.Objects; -import java.util.Set; - -// {@link Object#equals(Object)} is implemented by {@link AbstractLiteral}. -@SuppressWarnings("squid:S2160") -public class CheckLiteral extends AbstractLiteral implements CanNegate { - private final Term term; - - public CheckLiteral(Term term) { - if (!term.getType().equals(Boolean.class)) { - throw new InvalidQueryException("Term %s must be of type %s, got %s instead".formatted( - term, Boolean.class.getName(), term.getType().getName())); - } - this.term = term; - } - - public Term getTerm() { - return term; - } - - @Override - public Set getOutputVariables() { - return Set.of(); - } - - @Override - public Set getInputVariables(Set positiveVariablesInClause) { - return Collections.unmodifiableSet(term.getInputVariables()); - } - - @Override - public Set getPrivateVariables(Set positiveVariablesInClause) { - return Set.of(); - } - - @Override - public Literal substitute(Substitution substitution) { - return new CheckLiteral(term.substitute(substitution)); - } - - @Override - public CheckLiteral negate() { - if (term instanceof BoolNotTerm notTerm) { - return new CheckLiteral(notTerm.getBody()); - } - return new CheckLiteral(BoolTerms.not(term)); - } - - @Override - public boolean equalsWithSubstitution(LiteralEqualityHelper helper, Literal other) { - if (other == null || getClass() != other.getClass()) { - return false; - } - var otherAssumeLiteral = (CheckLiteral) other; - return term.equalsWithSubstitution(helper, otherAssumeLiteral.term); - } - - @Override - public int hashCodeWithSubstitution(LiteralHashCodeHelper helper) { - return Objects.hash(super.hashCodeWithSubstitution(helper), term.hashCodeWithSubstitution(helper)); - } - - @Override - public Literal reduce() { - if (term instanceof ConstantTerm constantTerm) { - // Return {@link BooleanLiteral#FALSE} for {@code false} or {@code null} literals. - return Boolean.TRUE.equals(constantTerm.getValue()) ? BooleanLiteral.TRUE : - BooleanLiteral.FALSE; - } - return this; - } - - @Override - public String toString() { - return "(%s)".formatted(term); - } -} diff --git a/subprojects/store-query/src/main/java/tools/refinery/store/query/literal/Connectivity.java b/subprojects/store-query/src/main/java/tools/refinery/store/query/literal/Connectivity.java deleted file mode 100644 index a058094d..00000000 --- a/subprojects/store-query/src/main/java/tools/refinery/store/query/literal/Connectivity.java +++ /dev/null @@ -1,18 +0,0 @@ -/* - * SPDX-FileCopyrightText: 2023 The Refinery Authors - * - * SPDX-License-Identifier: EPL-2.0 - */ -package tools.refinery.store.query.literal; - -import java.util.Locale; - -public enum Connectivity { - WEAK, - STRONG; - - @Override - public String toString() { - return name().toLowerCase(Locale.ROOT); - } -} diff --git a/subprojects/store-query/src/main/java/tools/refinery/store/query/literal/ConstantLiteral.java b/subprojects/store-query/src/main/java/tools/refinery/store/query/literal/ConstantLiteral.java deleted file mode 100644 index d83bd584..00000000 --- a/subprojects/store-query/src/main/java/tools/refinery/store/query/literal/ConstantLiteral.java +++ /dev/null @@ -1,73 +0,0 @@ -/* - * SPDX-FileCopyrightText: 2021-2023 The Refinery Authors - * - * SPDX-License-Identifier: EPL-2.0 - */ -package tools.refinery.store.query.literal; - -import tools.refinery.store.query.equality.LiteralEqualityHelper; -import tools.refinery.store.query.equality.LiteralHashCodeHelper; -import tools.refinery.store.query.substitution.Substitution; -import tools.refinery.store.query.term.NodeVariable; -import tools.refinery.store.query.term.Variable; - -import java.util.Objects; -import java.util.Set; - -public class ConstantLiteral extends AbstractLiteral { - private final NodeVariable variable; - private final int nodeId; - - public ConstantLiteral(NodeVariable variable, int nodeId) { - this.variable = variable; - this.nodeId = nodeId; - } - - public NodeVariable getVariable() { - return variable; - } - - public int getNodeId() { - return nodeId; - } - - - @Override - public Set getOutputVariables() { - return Set.of(variable); - } - - @Override - public Set getInputVariables(Set positiveVariablesInClause) { - return Set.of(); - } - - @Override - public Set getPrivateVariables(Set positiveVariablesInClause) { - return Set.of(); - } - - @Override - public ConstantLiteral substitute(Substitution substitution) { - return new ConstantLiteral(substitution.getTypeSafeSubstitute(variable), nodeId); - } - - @Override - public boolean equalsWithSubstitution(LiteralEqualityHelper helper, Literal other) { - if (other.getClass() != getClass()) { - return false; - } - var otherConstantLiteral = (ConstantLiteral) other; - return helper.variableEqual(variable, otherConstantLiteral.variable) && nodeId == otherConstantLiteral.nodeId; - } - - @Override - public int hashCodeWithSubstitution(LiteralHashCodeHelper helper) { - return Objects.hash(super.hashCodeWithSubstitution(helper), helper.getVariableHashCode(variable), nodeId); - } - - @Override - public String toString() { - return "%s === @Constant %d".formatted(variable, nodeId); - } -} diff --git a/subprojects/store-query/src/main/java/tools/refinery/store/query/literal/CountLiteral.java b/subprojects/store-query/src/main/java/tools/refinery/store/query/literal/CountLiteral.java deleted file mode 100644 index 3d078d89..00000000 --- a/subprojects/store-query/src/main/java/tools/refinery/store/query/literal/CountLiteral.java +++ /dev/null @@ -1,45 +0,0 @@ -/* - * SPDX-FileCopyrightText: 2021-2023 The Refinery Authors - * - * SPDX-License-Identifier: EPL-2.0 - */ -package tools.refinery.store.query.literal; - -import tools.refinery.store.query.Constraint; -import tools.refinery.store.query.substitution.Substitution; -import tools.refinery.store.query.term.DataVariable; -import tools.refinery.store.query.term.Variable; - -import java.util.List; - -public class CountLiteral extends AbstractCountLiteral { - public CountLiteral(DataVariable resultVariable, Constraint target, List arguments) { - super(Integer.class, resultVariable, target, arguments); - } - - @Override - protected Integer zero() { - return 0; - } - - @Override - protected Integer one() { - return 1; - } - - @Override - protected Literal doSubstitute(Substitution substitution, List substitutedArguments) { - return new CountLiteral(substitution.getTypeSafeSubstitute(getResultVariable()), getTarget(), - substitutedArguments); - } - - @Override - public AbstractCallLiteral withArguments(Constraint newTarget, List newArguments) { - return new CountLiteral(getResultVariable(), newTarget, newArguments); - } - - @Override - protected String operatorName() { - return "count"; - } -} diff --git a/subprojects/store-query/src/main/java/tools/refinery/store/query/literal/EquivalenceLiteral.java b/subprojects/store-query/src/main/java/tools/refinery/store/query/literal/EquivalenceLiteral.java deleted file mode 100644 index 7343f709..00000000 --- a/subprojects/store-query/src/main/java/tools/refinery/store/query/literal/EquivalenceLiteral.java +++ /dev/null @@ -1,100 +0,0 @@ -/* - * SPDX-FileCopyrightText: 2021-2023 The Refinery Authors - * - * SPDX-License-Identifier: EPL-2.0 - */ -package tools.refinery.store.query.literal; - -import tools.refinery.store.query.InvalidQueryException; -import tools.refinery.store.query.equality.LiteralEqualityHelper; -import tools.refinery.store.query.equality.LiteralHashCodeHelper; -import tools.refinery.store.query.substitution.Substitution; -import tools.refinery.store.query.term.Variable; - -import java.util.Objects; -import java.util.Set; - -// {@link Object#equals(Object)} is implemented by {@link AbstractLiteral}. -@SuppressWarnings("squid:S2160") -public final class EquivalenceLiteral extends AbstractLiteral implements CanNegate { - private final boolean positive; - private final Variable left; - private final Variable right; - - public EquivalenceLiteral(boolean positive, Variable left, Variable right) { - if (!left.tryGetType().equals(right.tryGetType())) { - throw new InvalidQueryException("Variables %s and %s of different type cannot be equivalent" - .formatted(left, right)); - } - this.positive = positive; - this.left = left; - this.right = right; - } - - public boolean isPositive() { - return positive; - } - - public Variable getLeft() { - return left; - } - - public Variable getRight() { - return right; - } - - @Override - public Set getOutputVariables() { - return Set.of(left); - } - - @Override - public Set getInputVariables(Set positiveVariablesInClause) { - return Set.of(right); - } - - @Override - public Set getPrivateVariables(Set positiveVariablesInClause) { - return Set.of(); - } - - @Override - public EquivalenceLiteral negate() { - return new EquivalenceLiteral(!positive, left, right); - } - - @Override - public EquivalenceLiteral substitute(Substitution substitution) { - return new EquivalenceLiteral(positive, substitution.getSubstitute(left), - substitution.getSubstitute(right)); - } - - @Override - public Literal reduce() { - if (left.equals(right)) { - return positive ? BooleanLiteral.TRUE : BooleanLiteral.FALSE; - } - return this; - } - - @Override - public boolean equalsWithSubstitution(LiteralEqualityHelper helper, Literal other) { - if (other.getClass() != getClass()) { - return false; - } - var otherEquivalenceLiteral = (EquivalenceLiteral) other; - return helper.variableEqual(left, otherEquivalenceLiteral.left) && - helper.variableEqual(right, otherEquivalenceLiteral.right); - } - - @Override - public int hashCodeWithSubstitution(LiteralHashCodeHelper helper) { - return Objects.hash(super.hashCodeWithSubstitution(helper), helper.getVariableHashCode(left), - helper.getVariableHashCode(right)); - } - - @Override - public String toString() { - return "%s %s %s".formatted(left, positive ? "===" : "!==", right); - } -} diff --git a/subprojects/store-query/src/main/java/tools/refinery/store/query/literal/LeftJoinLiteral.java b/subprojects/store-query/src/main/java/tools/refinery/store/query/literal/LeftJoinLiteral.java deleted file mode 100644 index bdddf120..00000000 --- a/subprojects/store-query/src/main/java/tools/refinery/store/query/literal/LeftJoinLiteral.java +++ /dev/null @@ -1,140 +0,0 @@ -/* - * SPDX-FileCopyrightText: 2024 The Refinery Authors - * - * SPDX-License-Identifier: EPL-2.0 - */ -package tools.refinery.store.query.literal; - -import tools.refinery.store.query.Constraint; -import tools.refinery.store.query.InvalidQueryException; -import tools.refinery.store.query.equality.LiteralEqualityHelper; -import tools.refinery.store.query.equality.LiteralHashCodeHelper; -import tools.refinery.store.query.substitution.Substitution; -import tools.refinery.store.query.term.ConstantTerm; -import tools.refinery.store.query.term.DataVariable; -import tools.refinery.store.query.term.ParameterDirection; -import tools.refinery.store.query.term.Variable; - -import java.util.*; - -// {@link Object#equals(Object)} is implemented by {@link AbstractLiteral}. -@SuppressWarnings("squid:S2160") -public class LeftJoinLiteral extends AbstractCallLiteral { - private final DataVariable resultVariable; - private final DataVariable placeholderVariable; - private final T defaultValue; - - public LeftJoinLiteral(DataVariable resultVariable, DataVariable placeholderVariable, - T defaultValue, Constraint target, List arguments) { - super(target, arguments); - this.resultVariable = resultVariable; - this.placeholderVariable = placeholderVariable; - this.defaultValue = defaultValue; - if (defaultValue == null) { - throw new InvalidQueryException("Default value must not be null"); - } - if (!resultVariable.getType().isInstance(defaultValue)) { - throw new InvalidQueryException("Default value %s must be assignable to result variable %s type %s" - .formatted(defaultValue, resultVariable, resultVariable.getType().getName())); - } - if (!getArgumentsOfDirection(ParameterDirection.OUT).contains(placeholderVariable)) { - throw new InvalidQueryException( - "Placeholder variable %s must be bound with direction %s in the argument list" - .formatted(resultVariable, ParameterDirection.OUT)); - } - if (arguments.contains(resultVariable)) { - throw new InvalidQueryException("Result variable must not appear in the argument list"); - } - } - - public DataVariable getResultVariable() { - return resultVariable; - } - - public DataVariable getPlaceholderVariable() { - return placeholderVariable; - } - - public T getDefaultValue() { - return defaultValue; - } - - @Override - public Set getOutputVariables() { - return Set.of(resultVariable); - } - - @Override - public Set getInputVariables(Set positiveVariablesInClause) { - var inputVariables = new LinkedHashSet<>(getArguments()); - inputVariables.remove(placeholderVariable); - return Collections.unmodifiableSet(inputVariables); - } - - @Override - public Set getPrivateVariables(Set positiveVariablesInClause) { - return Set.of(placeholderVariable); - } - - @Override - public Literal reduce() { - var reduction = getTarget().getReduction(); - return switch (reduction) { - case ALWAYS_FALSE -> resultVariable.assign(new ConstantTerm<>(resultVariable.getType(), defaultValue)); - case ALWAYS_TRUE -> throw new InvalidQueryException("Trying to left join an infinite set"); - case NOT_REDUCIBLE -> this; - }; - } - - @Override - protected Literal doSubstitute(Substitution substitution, List substitutedArguments) { - return new LeftJoinLiteral<>(substitution.getTypeSafeSubstitute(resultVariable), - substitution.getTypeSafeSubstitute(placeholderVariable), defaultValue, getTarget(), - substitutedArguments); - } - - @Override - public AbstractCallLiteral withArguments(Constraint newTarget, List newArguments) { - return new LeftJoinLiteral<>(resultVariable, placeholderVariable, defaultValue, newTarget, newArguments); - } - - @Override - public boolean equalsWithSubstitution(LiteralEqualityHelper helper, Literal other) { - if (!super.equalsWithSubstitution(helper, other)) { - return false; - } - var otherLeftJoinLiteral = (LeftJoinLiteral) other; - return helper.variableEqual(resultVariable, otherLeftJoinLiteral.resultVariable) && - helper.variableEqual(placeholderVariable, otherLeftJoinLiteral.placeholderVariable) && - Objects.equals(defaultValue, otherLeftJoinLiteral.defaultValue); - } - - @Override - public int hashCodeWithSubstitution(LiteralHashCodeHelper helper) { - return Objects.hash(super.hashCodeWithSubstitution(helper), helper.getVariableHashCode(resultVariable), - helper.getVariableHashCode(placeholderVariable), defaultValue); - } - - @Override - public String toString() { - var builder = new StringBuilder(); - var argumentIterator = getArguments().iterator(); - if (argumentIterator.hasNext()) { - appendArgument(builder, argumentIterator.next()); - while (argumentIterator.hasNext()) { - builder.append(", "); - appendArgument(builder, argumentIterator.next()); - } - } - builder.append(")"); - return builder.toString(); - } - - private void appendArgument(StringBuilder builder, Variable argument) { - if (placeholderVariable.equals(argument)) { - builder.append("@Default(").append(defaultValue).append(") "); - argument = resultVariable; - } - builder.append(argument); - } -} diff --git a/subprojects/store-query/src/main/java/tools/refinery/store/query/literal/Literal.java b/subprojects/store-query/src/main/java/tools/refinery/store/query/literal/Literal.java deleted file mode 100644 index cb16ab00..00000000 --- a/subprojects/store-query/src/main/java/tools/refinery/store/query/literal/Literal.java +++ /dev/null @@ -1,32 +0,0 @@ -/* - * SPDX-FileCopyrightText: 2021-2023 The Refinery Authors - * - * SPDX-License-Identifier: EPL-2.0 - */ -package tools.refinery.store.query.literal; - -import tools.refinery.store.query.equality.LiteralEqualityHelper; -import tools.refinery.store.query.equality.LiteralHashCodeHelper; -import tools.refinery.store.query.substitution.Substitution; -import tools.refinery.store.query.term.Variable; - -import java.util.Set; - -public interface Literal { - Set getOutputVariables(); - - Set getInputVariables(Set positiveVariablesInClause); - - Set getPrivateVariables(Set positiveVariablesInClause); - - Literal substitute(Substitution substitution); - - default Literal reduce() { - return this; - } - - @SuppressWarnings("BooleanMethodIsAlwaysInverted") - boolean equalsWithSubstitution(LiteralEqualityHelper helper, Literal other); - - int hashCodeWithSubstitution(LiteralHashCodeHelper helper); -} diff --git a/subprojects/store-query/src/main/java/tools/refinery/store/query/literal/Literals.java b/subprojects/store-query/src/main/java/tools/refinery/store/query/literal/Literals.java deleted file mode 100644 index 6056da45..00000000 --- a/subprojects/store-query/src/main/java/tools/refinery/store/query/literal/Literals.java +++ /dev/null @@ -1,22 +0,0 @@ -/* - * SPDX-FileCopyrightText: 2021-2023 The Refinery Authors - * - * SPDX-License-Identifier: EPL-2.0 - */ -package tools.refinery.store.query.literal; - -import tools.refinery.store.query.term.Term; - -public final class Literals { - private Literals() { - throw new IllegalStateException("This is a static utility class and should not be instantiated directly"); - } - - public static > T not(CanNegate literal) { - return literal.negate(); - } - - public static CheckLiteral check(Term term) { - return new CheckLiteral(term); - } -} diff --git a/subprojects/store-query/src/main/java/tools/refinery/store/query/literal/Reduction.java b/subprojects/store-query/src/main/java/tools/refinery/store/query/literal/Reduction.java deleted file mode 100644 index ee155a9a..00000000 --- a/subprojects/store-query/src/main/java/tools/refinery/store/query/literal/Reduction.java +++ /dev/null @@ -1,31 +0,0 @@ -/* - * SPDX-FileCopyrightText: 2021-2023 The Refinery Authors - * - * SPDX-License-Identifier: EPL-2.0 - */ -package tools.refinery.store.query.literal; - -public enum Reduction { - /** - * Signifies that a literal should be preserved in the clause. - */ - NOT_REDUCIBLE, - - /** - * Signifies that the literal may be omitted from the cause (if the model being queried is nonempty). - */ - ALWAYS_TRUE, - - /** - * Signifies that the clause with the literal may be omitted entirely. - */ - ALWAYS_FALSE; - - public Reduction negate() { - return switch (this) { - case NOT_REDUCIBLE -> NOT_REDUCIBLE; - case ALWAYS_TRUE -> ALWAYS_FALSE; - case ALWAYS_FALSE -> ALWAYS_TRUE; - }; - } -} diff --git a/subprojects/store-query/src/main/java/tools/refinery/store/query/literal/RepresentativeElectionLiteral.java b/subprojects/store-query/src/main/java/tools/refinery/store/query/literal/RepresentativeElectionLiteral.java deleted file mode 100644 index f7323947..00000000 --- a/subprojects/store-query/src/main/java/tools/refinery/store/query/literal/RepresentativeElectionLiteral.java +++ /dev/null @@ -1,119 +0,0 @@ -/* - * SPDX-FileCopyrightText: 2023 The Refinery Authors - * - * SPDX-License-Identifier: EPL-2.0 - */ -package tools.refinery.store.query.literal; - -import tools.refinery.store.query.Constraint; -import tools.refinery.store.query.InvalidQueryException; -import tools.refinery.store.query.equality.LiteralEqualityHelper; -import tools.refinery.store.query.equality.LiteralHashCodeHelper; -import tools.refinery.store.query.substitution.Substitution; -import tools.refinery.store.query.term.NodeVariable; -import tools.refinery.store.query.term.ParameterDirection; -import tools.refinery.store.query.term.Variable; - -import java.util.List; -import java.util.Set; - -// {@link Object#equals(Object)} is implemented by {@link AbstractLiteral}. -@SuppressWarnings("squid:S2160") -public class RepresentativeElectionLiteral extends AbstractCallLiteral { - private final Connectivity connectivity; - - public RepresentativeElectionLiteral(Connectivity connectivity, Constraint target, NodeVariable specific, - NodeVariable representative) { - this(connectivity, target, List.of(specific, representative)); - } - - private RepresentativeElectionLiteral(Connectivity connectivity, Constraint target, List arguments) { - super(target, arguments); - this.connectivity = connectivity; - var parameters = target.getParameters(); - int arity = target.arity(); - if (arity != 2) { - throw new InvalidQueryException("SCCs can only take binary relations"); - } - if (parameters.get(0).isDataVariable() || parameters.get(1).isDataVariable()) { - throw new InvalidQueryException("SCCs can only be computed over nodes"); - } - if (parameters.get(0).getDirection() != ParameterDirection.OUT || - parameters.get(1).getDirection() != ParameterDirection.OUT) { - throw new InvalidQueryException("SCCs cannot take input parameters"); - } - } - - public Connectivity getConnectivity() { - return connectivity; - } - - @Override - protected Literal doSubstitute(Substitution substitution, List substitutedArguments) { - return new RepresentativeElectionLiteral(connectivity, getTarget(), substitutedArguments); - } - - @Override - public Set getOutputVariables() { - return getArgumentsOfDirection(ParameterDirection.OUT); - } - - @Override - public Set getInputVariables(Set positiveVariablesInClause) { - return Set.of(); - } - - @Override - public Set getPrivateVariables(Set positiveVariablesInClause) { - return Set.of(); - } - - @Override - public Literal reduce() { - var reduction = getTarget().getReduction(); - return switch (reduction) { - case ALWAYS_FALSE -> BooleanLiteral.FALSE; - case ALWAYS_TRUE -> throw new InvalidQueryException( - "Trying to elect representatives over an infinite set"); - case NOT_REDUCIBLE -> this; - }; - } - - @Override - public AbstractCallLiteral withArguments(Constraint newTarget, List newArguments) { - return new RepresentativeElectionLiteral(connectivity, newTarget, newArguments); - } - - @Override - public boolean equalsWithSubstitution(LiteralEqualityHelper helper, Literal other) { - if (!super.equalsWithSubstitution(helper, other)) { - return false; - } - var otherRepresentativeElectionLiteral = (RepresentativeElectionLiteral) other; - return connectivity.equals(otherRepresentativeElectionLiteral.connectivity); - } - - @Override - public int hashCodeWithSubstitution(LiteralHashCodeHelper helper) { - return super.hashCodeWithSubstitution(helper) * 31 + connectivity.hashCode(); - } - - @Override - public String toString() { - var builder = new StringBuilder(); - builder.append("@Representative(\""); - builder.append(connectivity); - builder.append("\") "); - builder.append(getTarget().toReferenceString()); - builder.append("("); - var argumentIterator = getArguments().iterator(); - if (argumentIterator.hasNext()) { - builder.append(argumentIterator.next()); - while (argumentIterator.hasNext()) { - builder.append(", ").append(argumentIterator.next()); - } - } - builder.append(")"); - return builder.toString(); - } -} diff --git a/subprojects/store-query/src/main/java/tools/refinery/store/query/resultset/AbstractResultSet.java b/subprojects/store-query/src/main/java/tools/refinery/store/query/resultset/AbstractResultSet.java index dcfe6cc5..f8290b48 100644 --- a/subprojects/store-query/src/main/java/tools/refinery/store/query/resultset/AbstractResultSet.java +++ b/subprojects/store-query/src/main/java/tools/refinery/store/query/resultset/AbstractResultSet.java @@ -6,7 +6,7 @@ package tools.refinery.store.query.resultset; import tools.refinery.store.query.ModelQueryAdapter; -import tools.refinery.store.query.dnf.Query; +import tools.refinery.logic.dnf.Query; import tools.refinery.store.tuple.Tuple; import java.util.ArrayList; diff --git a/subprojects/store-query/src/main/java/tools/refinery/store/query/resultset/AnyResultSet.java b/subprojects/store-query/src/main/java/tools/refinery/store/query/resultset/AnyResultSet.java index 5b75b103..038ca7f9 100644 --- a/subprojects/store-query/src/main/java/tools/refinery/store/query/resultset/AnyResultSet.java +++ b/subprojects/store-query/src/main/java/tools/refinery/store/query/resultset/AnyResultSet.java @@ -6,7 +6,7 @@ package tools.refinery.store.query.resultset; import tools.refinery.store.query.ModelQueryAdapter; -import tools.refinery.store.query.dnf.AnyQuery; +import tools.refinery.logic.dnf.AnyQuery; public sealed interface AnyResultSet permits ResultSet { ModelQueryAdapter getAdapter(); diff --git a/subprojects/store-query/src/main/java/tools/refinery/store/query/resultset/EmptyResultSet.java b/subprojects/store-query/src/main/java/tools/refinery/store/query/resultset/EmptyResultSet.java index 991b1e32..daebfe7c 100644 --- a/subprojects/store-query/src/main/java/tools/refinery/store/query/resultset/EmptyResultSet.java +++ b/subprojects/store-query/src/main/java/tools/refinery/store/query/resultset/EmptyResultSet.java @@ -8,7 +8,7 @@ package tools.refinery.store.query.resultset; import tools.refinery.store.map.Cursor; import tools.refinery.store.map.Cursors; import tools.refinery.store.query.ModelQueryAdapter; -import tools.refinery.store.query.dnf.Query; +import tools.refinery.logic.dnf.Query; import tools.refinery.store.tuple.Tuple; public record EmptyResultSet(ModelQueryAdapter adapter, Query query) implements ResultSet { diff --git a/subprojects/store-query/src/main/java/tools/refinery/store/query/resultset/OrderedResultSet.java b/subprojects/store-query/src/main/java/tools/refinery/store/query/resultset/OrderedResultSet.java index df12b967..606e197c 100644 --- a/subprojects/store-query/src/main/java/tools/refinery/store/query/resultset/OrderedResultSet.java +++ b/subprojects/store-query/src/main/java/tools/refinery/store/query/resultset/OrderedResultSet.java @@ -7,7 +7,7 @@ package tools.refinery.store.query.resultset; import tools.refinery.store.map.Cursor; import tools.refinery.store.query.ModelQueryAdapter; -import tools.refinery.store.query.dnf.Query; +import tools.refinery.logic.dnf.Query; import tools.refinery.store.query.utils.OrderStatisticTree; import tools.refinery.store.tuple.Tuple; diff --git a/subprojects/store-query/src/main/java/tools/refinery/store/query/resultset/ResultSet.java b/subprojects/store-query/src/main/java/tools/refinery/store/query/resultset/ResultSet.java index a6e99784..e84634ac 100644 --- a/subprojects/store-query/src/main/java/tools/refinery/store/query/resultset/ResultSet.java +++ b/subprojects/store-query/src/main/java/tools/refinery/store/query/resultset/ResultSet.java @@ -6,7 +6,7 @@ package tools.refinery.store.query.resultset; import tools.refinery.store.map.Cursor; -import tools.refinery.store.query.dnf.Query; +import tools.refinery.logic.dnf.Query; import tools.refinery.store.tuple.Tuple; public non-sealed interface ResultSet extends AnyResultSet { diff --git a/subprojects/store-query/src/main/java/tools/refinery/store/query/rewriter/AbstractRecursiveRewriter.java b/subprojects/store-query/src/main/java/tools/refinery/store/query/rewriter/AbstractRecursiveRewriter.java deleted file mode 100644 index fb4c14a7..00000000 --- a/subprojects/store-query/src/main/java/tools/refinery/store/query/rewriter/AbstractRecursiveRewriter.java +++ /dev/null @@ -1,26 +0,0 @@ -/* - * SPDX-FileCopyrightText: 2023 The Refinery Authors - * - * SPDX-License-Identifier: EPL-2.0 - */ -package tools.refinery.store.query.rewriter; - -import tools.refinery.store.query.dnf.Dnf; -import tools.refinery.store.query.equality.DnfEqualityChecker; -import tools.refinery.store.util.CycleDetectingMapper; - -public abstract class AbstractRecursiveRewriter implements DnfRewriter { - private final CycleDetectingMapper mapper = new CycleDetectingMapper<>(Dnf::name, this::map); - - @Override - public Dnf rewrite(Dnf dnf) { - return mapper.map(dnf); - } - - protected Dnf map(Dnf dnf) { - var result = doRewrite(dnf); - return dnf.equalsWithSubstitution(DnfEqualityChecker.DEFAULT, result) ? dnf : result; - } - - protected abstract Dnf doRewrite(Dnf dnf); -} diff --git a/subprojects/store-query/src/main/java/tools/refinery/store/query/rewriter/ClauseInputParameterResolver.java b/subprojects/store-query/src/main/java/tools/refinery/store/query/rewriter/ClauseInputParameterResolver.java deleted file mode 100644 index aa06a05a..00000000 --- a/subprojects/store-query/src/main/java/tools/refinery/store/query/rewriter/ClauseInputParameterResolver.java +++ /dev/null @@ -1,160 +0,0 @@ -/* - * SPDX-FileCopyrightText: 2023 The Refinery Authors - * - * SPDX-License-Identifier: EPL-2.0 - */ -package tools.refinery.store.query.rewriter; - -import tools.refinery.store.query.dnf.Dnf; -import tools.refinery.store.query.dnf.DnfClause; -import tools.refinery.store.query.literal.*; -import tools.refinery.store.query.substitution.Substitution; -import tools.refinery.store.query.term.ParameterDirection; -import tools.refinery.store.query.term.Variable; - -import java.util.*; - -class ClauseInputParameterResolver { - private final InputParameterResolver rewriter; - private final String dnfName; - private final int clauseIndex; - private final Set positiveVariables = new LinkedHashSet<>(); - private final List inlinedLiterals = new ArrayList<>(); - private final Deque workList; - private int helperIndex = 0; - - public ClauseInputParameterResolver(InputParameterResolver rewriter, List context, DnfClause clause, - String dnfName, int clauseIndex) { - this.rewriter = rewriter; - this.dnfName = dnfName; - this.clauseIndex = clauseIndex; - workList = new ArrayDeque<>(clause.literals().size() + context.size()); - for (var literal : context) { - workList.addLast(literal); - } - for (var literal : clause.literals()) { - workList.addLast(literal); - } - } - - public List rewriteClause() { - while (!workList.isEmpty()) { - var literal = workList.removeFirst(); - processLiteral(literal); - } - return inlinedLiterals; - } - - private void processLiteral(Literal literal) { - if (!(literal instanceof AbstractCallLiteral abstractCallLiteral) || - !(abstractCallLiteral.getTarget() instanceof Dnf targetDnf)) { - markAsDone(literal); - return; - } - boolean hasInputParameter = hasInputParameter(targetDnf); - if (!hasInputParameter) { - targetDnf = rewriter.rewrite(targetDnf); - } - if (inlinePositiveClause(abstractCallLiteral, targetDnf)) { - return; - } - if (eliminateDoubleNegation(abstractCallLiteral, targetDnf)) { - return; - } - if (hasInputParameter) { - rewriteWithCurrentContext(abstractCallLiteral, targetDnf); - return; - } - markAsDone(abstractCallLiteral.withTarget(targetDnf)); - } - - private void markAsDone(Literal literal) { - positiveVariables.addAll(literal.getOutputVariables()); - inlinedLiterals.add(literal); - } - - private boolean inlinePositiveClause(AbstractCallLiteral abstractCallLiteral, Dnf targetDnf) { - var targetLiteral = getSingleLiteral(abstractCallLiteral, targetDnf, CallPolarity.POSITIVE); - if (targetLiteral == null) { - return false; - } - var substitution = asSubstitution(abstractCallLiteral, targetDnf); - var substitutedLiteral = targetLiteral.substitute(substitution); - workList.addFirst(substitutedLiteral); - return true; - } - - private boolean eliminateDoubleNegation(AbstractCallLiteral abstractCallLiteral, Dnf targetDnf) { - var targetLiteral = getSingleLiteral(abstractCallLiteral, targetDnf, CallPolarity.NEGATIVE); - if (!(targetLiteral instanceof CallLiteral targetCallLiteral) || - targetCallLiteral.getPolarity() != CallPolarity.NEGATIVE) { - return false; - } - var substitution = asSubstitution(abstractCallLiteral, targetDnf); - var substitutedLiteral = (CallLiteral) targetCallLiteral.substitute(substitution); - workList.addFirst(substitutedLiteral.negate()); - return true; - } - - private void rewriteWithCurrentContext(AbstractCallLiteral abstractCallLiteral, Dnf targetDnf) { - var contextBuilder = Dnf.builder("%s#clause%d#helper%d".formatted(dnfName, clauseIndex, helperIndex)); - helperIndex++; - contextBuilder.parameters(positiveVariables, ParameterDirection.OUT); - contextBuilder.clause(inlinedLiterals); - var contextDnf = contextBuilder.build(); - var contextCall = new CallLiteral(CallPolarity.POSITIVE, contextDnf, List.copyOf(positiveVariables)); - inlinedLiterals.clear(); - var substitution = Substitution.builder().renewing().build(); - var context = new ArrayList(); - context.add(contextCall.substitute(substitution)); - int arity = targetDnf.arity(); - for (int i = 0; i < arity; i++) { - var parameter = targetDnf.getSymbolicParameters().get(i).getVariable(); - var argument = abstractCallLiteral.getArguments().get(i); - context.add(new EquivalenceLiteral(true, parameter, substitution.getSubstitute(argument))); - } - var rewrittenDnf = rewriter.rewriteWithContext(context, targetDnf); - workList.addFirst(abstractCallLiteral.withTarget(rewrittenDnf)); - workList.addFirst(contextCall); - } - - private static boolean hasInputParameter(Dnf targetDnf) { - for (var parameter : targetDnf.getParameters()) { - if (parameter.getDirection() != ParameterDirection.OUT) { - return true; - } - } - return false; - } - - private static Literal getSingleLiteral(AbstractCallLiteral abstractCallLiteral, Dnf targetDnf, - CallPolarity polarity) { - if (!(abstractCallLiteral instanceof CallLiteral callLiteral) || - callLiteral.getPolarity() != polarity) { - return null; - } - var clauses = targetDnf.getClauses(); - if (clauses.size() != 1) { - return null; - } - var targetLiterals = clauses.get(0).literals(); - if (targetLiterals.size() != 1) { - return null; - } - return targetLiterals.get(0); - } - - private static Substitution asSubstitution(AbstractCallLiteral callLiteral, Dnf targetDnf) { - var builder = Substitution.builder().renewing(); - var arguments = callLiteral.getArguments(); - var parameters = targetDnf.getSymbolicParameters(); - int arity = arguments.size(); - if (parameters.size() != arity) { - throw new IllegalArgumentException("Call %s of %s arity mismatch".formatted(callLiteral, targetDnf)); - } - for (int i = 0; i < arity; i++) { - builder.putChecked(parameters.get(i).getVariable(), arguments.get(i)); - } - return builder.build(); - } -} diff --git a/subprojects/store-query/src/main/java/tools/refinery/store/query/rewriter/CompositeRewriter.java b/subprojects/store-query/src/main/java/tools/refinery/store/query/rewriter/CompositeRewriter.java deleted file mode 100644 index 5b4f65e5..00000000 --- a/subprojects/store-query/src/main/java/tools/refinery/store/query/rewriter/CompositeRewriter.java +++ /dev/null @@ -1,29 +0,0 @@ -/* - * SPDX-FileCopyrightText: 2023 The Refinery Authors - * - * SPDX-License-Identifier: EPL-2.0 - */ -package tools.refinery.store.query.rewriter; - -import tools.refinery.store.query.dnf.Dnf; - -import java.util.ArrayList; -import java.util.List; - -public class CompositeRewriter implements DnfRewriter { - private final List rewriterList = new ArrayList<>(); - - public void addFirst(DnfRewriter rewriter) { - rewriterList.add(rewriter); - } - - @Override - public Dnf rewrite(Dnf dnf) { - Dnf rewrittenDnf = dnf; - for (int i = rewriterList.size() - 1; i >= 0; i--) { - var rewriter = rewriterList.get(i); - rewrittenDnf = rewriter.rewrite(rewrittenDnf); - } - return rewrittenDnf; - } -} diff --git a/subprojects/store-query/src/main/java/tools/refinery/store/query/rewriter/DnfRewriter.java b/subprojects/store-query/src/main/java/tools/refinery/store/query/rewriter/DnfRewriter.java deleted file mode 100644 index 5d8359d1..00000000 --- a/subprojects/store-query/src/main/java/tools/refinery/store/query/rewriter/DnfRewriter.java +++ /dev/null @@ -1,24 +0,0 @@ -/* - * SPDX-FileCopyrightText: 2023 The Refinery Authors - * - * SPDX-License-Identifier: EPL-2.0 - */ -package tools.refinery.store.query.rewriter; - -import tools.refinery.store.query.dnf.AnyQuery; -import tools.refinery.store.query.dnf.Dnf; -import tools.refinery.store.query.dnf.Query; - -@FunctionalInterface -public interface DnfRewriter { - Dnf rewrite(Dnf dnf); - - default AnyQuery rewrite(AnyQuery query) { - return rewrite((Query) query); - } - - default Query rewrite(Query query) { - var rewrittenDnf = rewrite(query.getDnf()); - return query.withDnf(rewrittenDnf); - } -} diff --git a/subprojects/store-query/src/main/java/tools/refinery/store/query/rewriter/DuplicateDnfRemover.java b/subprojects/store-query/src/main/java/tools/refinery/store/query/rewriter/DuplicateDnfRemover.java deleted file mode 100644 index 0c786470..00000000 --- a/subprojects/store-query/src/main/java/tools/refinery/store/query/rewriter/DuplicateDnfRemover.java +++ /dev/null @@ -1,98 +0,0 @@ -/* - * SPDX-FileCopyrightText: 2023 The Refinery Authors - * - * SPDX-License-Identifier: EPL-2.0 - */ -package tools.refinery.store.query.rewriter; - -import tools.refinery.store.query.dnf.Dnf; -import tools.refinery.store.query.dnf.DnfClause; -import tools.refinery.store.query.dnf.Query; -import tools.refinery.store.query.equality.DnfEqualityChecker; -import tools.refinery.store.query.literal.AbstractCallLiteral; -import tools.refinery.store.query.literal.Literal; - -import java.util.ArrayList; -import java.util.HashMap; -import java.util.List; -import java.util.Map; - -public class DuplicateDnfRemover extends AbstractRecursiveRewriter { - private final Map dnfCache = new HashMap<>(); - private final Map> queryCache = new HashMap<>(); - - @Override - protected Dnf map(Dnf dnf) { - var result = super.map(dnf); - return dnfCache.computeIfAbsent(new CanonicalDnf(result), CanonicalDnf::getDnf); - } - - @Override - protected Dnf doRewrite(Dnf dnf) { - var builder = Dnf.builderFrom(dnf); - for (var clause : dnf.getClauses()) { - builder.clause(rewriteClause(clause)); - } - return builder.build(); - } - - private List rewriteClause(DnfClause clause) { - var originalLiterals = clause.literals(); - var literals = new ArrayList(originalLiterals.size()); - for (var literal : originalLiterals) { - var rewrittenLiteral = literal; - if (literal instanceof AbstractCallLiteral abstractCallLiteral && - abstractCallLiteral.getTarget() instanceof Dnf targetDnf) { - var rewrittenTarget = rewrite(targetDnf); - rewrittenLiteral = abstractCallLiteral.withTarget(rewrittenTarget); - } - literals.add(rewrittenLiteral); - } - return literals; - } - - @Override - public Query rewrite(Query query) { - var rewrittenDnf = rewrite(query.getDnf()); - // {@code withDnf} will always return the appropriate type. - @SuppressWarnings("unchecked") - var rewrittenQuery = (Query) queryCache.computeIfAbsent(rewrittenDnf, query::withDnf); - return rewrittenQuery; - } - - private static class CanonicalDnf { - private final Dnf dnf; - private final int hash; - - public CanonicalDnf(Dnf dnf) { - this.dnf = dnf; - hash = dnf.hashCodeWithSubstitution(); - } - - public Dnf getDnf() { - return dnf; - } - - @Override - public boolean equals(Object obj) { - if (this == obj) { - return true; - } - if (obj == null || getClass() != obj.getClass()) { - return false; - } - var otherCanonicalDnf = (CanonicalDnf) obj; - return dnf.equalsWithSubstitution(DnfEqualityChecker.DEFAULT, otherCanonicalDnf.dnf); - } - - @Override - public int hashCode() { - return hash; - } - - @Override - public String toString() { - return dnf.name(); - } - } -} diff --git a/subprojects/store-query/src/main/java/tools/refinery/store/query/rewriter/InputParameterResolver.java b/subprojects/store-query/src/main/java/tools/refinery/store/query/rewriter/InputParameterResolver.java deleted file mode 100644 index cd8a2e7d..00000000 --- a/subprojects/store-query/src/main/java/tools/refinery/store/query/rewriter/InputParameterResolver.java +++ /dev/null @@ -1,51 +0,0 @@ -/* - * SPDX-FileCopyrightText: 2023 The Refinery Authors - * - * SPDX-License-Identifier: EPL-2.0 - */ -package tools.refinery.store.query.rewriter; - -import tools.refinery.store.query.dnf.Dnf; -import tools.refinery.store.query.dnf.DnfBuilder; -import tools.refinery.store.query.literal.Literal; -import tools.refinery.store.query.term.ParameterDirection; -import tools.refinery.store.query.term.Variable; - -import java.util.HashSet; -import java.util.List; - -public class InputParameterResolver extends AbstractRecursiveRewriter { - @Override - protected Dnf doRewrite(Dnf dnf) { - return rewriteWithContext(List.of(), dnf); - } - - Dnf rewriteWithContext(List context, Dnf dnf) { - var dnfName = dnf.name(); - var builder = Dnf.builder(dnfName); - createSymbolicParameters(context, dnf, builder); - builder.functionalDependencies(dnf.getFunctionalDependencies()); - var clauses = dnf.getClauses(); - int clauseCount = clauses.size(); - for (int i = 0; i < clauseCount; i++) { - var clause = clauses.get(i); - var clauseRewriter = new ClauseInputParameterResolver(this, context, clause, dnfName, i); - builder.clause(clauseRewriter.rewriteClause()); - } - return builder.build(); - } - - private static void createSymbolicParameters(List context, Dnf dnf, DnfBuilder builder) { - var positiveInContext = new HashSet(); - for (var literal : context) { - positiveInContext.addAll(literal.getOutputVariables()); - } - for (var symbolicParameter : dnf.getSymbolicParameters()) { - var variable = symbolicParameter.getVariable(); - var isOutput = symbolicParameter.getDirection() == ParameterDirection.OUT || - positiveInContext.contains(variable); - var direction = isOutput ? ParameterDirection.OUT : ParameterDirection.IN; - builder.parameter(variable, direction); - } - } -} diff --git a/subprojects/store-query/src/main/java/tools/refinery/store/query/substitution/MapBasedSubstitution.java b/subprojects/store-query/src/main/java/tools/refinery/store/query/substitution/MapBasedSubstitution.java deleted file mode 100644 index a8201eef..00000000 --- a/subprojects/store-query/src/main/java/tools/refinery/store/query/substitution/MapBasedSubstitution.java +++ /dev/null @@ -1,18 +0,0 @@ -/* - * SPDX-FileCopyrightText: 2021-2023 The Refinery Authors - * - * SPDX-License-Identifier: EPL-2.0 - */ -package tools.refinery.store.query.substitution; - -import tools.refinery.store.query.term.Variable; - -import java.util.Map; - -public record MapBasedSubstitution(Map map, Substitution fallback) implements Substitution { - @Override - public Variable getSubstitute(Variable variable) { - var value = map.get(variable); - return value == null ? fallback.getSubstitute(variable) : value; - } -} diff --git a/subprojects/store-query/src/main/java/tools/refinery/store/query/substitution/RenewingSubstitution.java b/subprojects/store-query/src/main/java/tools/refinery/store/query/substitution/RenewingSubstitution.java deleted file mode 100644 index 9b737ceb..00000000 --- a/subprojects/store-query/src/main/java/tools/refinery/store/query/substitution/RenewingSubstitution.java +++ /dev/null @@ -1,20 +0,0 @@ -/* - * SPDX-FileCopyrightText: 2021-2023 The Refinery Authors - * - * SPDX-License-Identifier: EPL-2.0 - */ -package tools.refinery.store.query.substitution; - -import tools.refinery.store.query.term.Variable; - -import java.util.HashMap; -import java.util.Map; - -public class RenewingSubstitution implements Substitution { - private final Map alreadyRenewed = new HashMap<>(); - - @Override - public Variable getSubstitute(Variable variable) { - return alreadyRenewed.computeIfAbsent(variable, Variable::renew); - } -} diff --git a/subprojects/store-query/src/main/java/tools/refinery/store/query/substitution/StatelessSubstitution.java b/subprojects/store-query/src/main/java/tools/refinery/store/query/substitution/StatelessSubstitution.java deleted file mode 100644 index bb3803d3..00000000 --- a/subprojects/store-query/src/main/java/tools/refinery/store/query/substitution/StatelessSubstitution.java +++ /dev/null @@ -1,23 +0,0 @@ -/* - * SPDX-FileCopyrightText: 2021-2023 The Refinery Authors - * - * SPDX-License-Identifier: EPL-2.0 - */ -package tools.refinery.store.query.substitution; - -import tools.refinery.store.query.term.Variable; - -public enum StatelessSubstitution implements Substitution { - FAILING { - @Override - public Variable getSubstitute(Variable variable) { - throw new IllegalArgumentException("No substitute for " + variable); - } - }, - IDENTITY { - @Override - public Variable getSubstitute(Variable variable) { - return variable; - } - } -} diff --git a/subprojects/store-query/src/main/java/tools/refinery/store/query/substitution/Substitution.java b/subprojects/store-query/src/main/java/tools/refinery/store/query/substitution/Substitution.java deleted file mode 100644 index 834fce12..00000000 --- a/subprojects/store-query/src/main/java/tools/refinery/store/query/substitution/Substitution.java +++ /dev/null @@ -1,29 +0,0 @@ -/* - * SPDX-FileCopyrightText: 2021-2023 The Refinery Authors - * - * SPDX-License-Identifier: EPL-2.0 - */ -package tools.refinery.store.query.substitution; - -import tools.refinery.store.query.term.DataVariable; -import tools.refinery.store.query.term.NodeVariable; -import tools.refinery.store.query.term.Variable; - -@FunctionalInterface -public interface Substitution { - Variable getSubstitute(Variable variable); - - default NodeVariable getTypeSafeSubstitute(NodeVariable variable) { - var substitute = getSubstitute(variable); - return substitute.asNodeVariable(); - } - - default DataVariable getTypeSafeSubstitute(DataVariable variable) { - var substitute = getSubstitute(variable); - return substitute.asDataVariable(variable.getType()); - } - - static SubstitutionBuilder builder() { - return new SubstitutionBuilder(); - } -} diff --git a/subprojects/store-query/src/main/java/tools/refinery/store/query/substitution/SubstitutionBuilder.java b/subprojects/store-query/src/main/java/tools/refinery/store/query/substitution/SubstitutionBuilder.java deleted file mode 100644 index 37fb6908..00000000 --- a/subprojects/store-query/src/main/java/tools/refinery/store/query/substitution/SubstitutionBuilder.java +++ /dev/null @@ -1,79 +0,0 @@ -/* - * SPDX-FileCopyrightText: 2021-2023 The Refinery Authors - * - * SPDX-License-Identifier: EPL-2.0 - */ -package tools.refinery.store.query.substitution; - -import tools.refinery.store.query.term.DataVariable; -import tools.refinery.store.query.term.NodeVariable; -import tools.refinery.store.query.term.Variable; - -import java.util.Collections; -import java.util.HashMap; -import java.util.List; -import java.util.Map; - -@SuppressWarnings("UnusedReturnValue") -public class SubstitutionBuilder { - private final Map map = new HashMap<>(); - private Substitution fallback; - - SubstitutionBuilder() { - total(); - } - - public SubstitutionBuilder put(NodeVariable original, NodeVariable substitute) { - return putChecked(original, substitute); - } - - public SubstitutionBuilder put(DataVariable original, DataVariable substitute) { - return putChecked(original, substitute); - } - - public SubstitutionBuilder putChecked(Variable original, Variable substitute) { - if (!original.tryGetType().equals(substitute.tryGetType())) { - throw new IllegalArgumentException("Cannot substitute variable %s of sort %s with variable %s of sort %s" - .formatted(original, original.tryGetType().map(Class::getName).orElse("node"), substitute, - substitute.tryGetType().map(Class::getName).orElse("node"))); - } - if (map.containsKey(original)) { - throw new IllegalArgumentException("Already has substitution for variable %s".formatted(original)); - } - map.put(original, substitute); - return this; - } - - public SubstitutionBuilder putManyChecked(List originals, List substitutes) { - int size = originals.size(); - if (size != substitutes.size()) { - throw new IllegalArgumentException("Cannot substitute %d variables %s with %d variables %s" - .formatted(size, originals, substitutes.size(), substitutes)); - } - for (int i = 0; i < size; i++) { - putChecked(originals.get(i), substitutes.get(i)); - } - return this; - } - - public SubstitutionBuilder fallback(Substitution newFallback) { - fallback = newFallback; - return this; - } - - public SubstitutionBuilder total() { - return fallback(StatelessSubstitution.FAILING); - } - - public SubstitutionBuilder partial() { - return fallback(StatelessSubstitution.IDENTITY); - } - - public SubstitutionBuilder renewing() { - return fallback(new RenewingSubstitution()); - } - - public Substitution build() { - return map.isEmpty() ? fallback : new MapBasedSubstitution(Collections.unmodifiableMap(map), fallback); - } -} diff --git a/subprojects/store-query/src/main/java/tools/refinery/store/query/term/AbstractTerm.java b/subprojects/store-query/src/main/java/tools/refinery/store/query/term/AbstractTerm.java deleted file mode 100644 index 5cecc35b..00000000 --- a/subprojects/store-query/src/main/java/tools/refinery/store/query/term/AbstractTerm.java +++ /dev/null @@ -1,47 +0,0 @@ -/* - * SPDX-FileCopyrightText: 2021-2023 The Refinery Authors - * - * SPDX-License-Identifier: EPL-2.0 - */ -package tools.refinery.store.query.term; - -import tools.refinery.store.query.equality.LiteralEqualityHelper; -import tools.refinery.store.query.equality.LiteralHashCodeHelper; - -import java.util.Objects; - -public abstract class AbstractTerm implements Term { - private final Class type; - - protected AbstractTerm(Class type) { - this.type = type; - } - - @Override - public Class getType() { - return type; - } - - @Override - public boolean equalsWithSubstitution(LiteralEqualityHelper helper, AnyTerm other) { - return other != null && getClass() == other.getClass() && type.equals(other.getType()); - } - - @Override - public int hashCodeWithSubstitution(LiteralHashCodeHelper helper) { - return Objects.hash(getClass(), type); - } - - @Override - public boolean equals(Object o) { - if (this == o) return true; - if (o == null || getClass() != o.getClass()) return false; - AbstractTerm that = (AbstractTerm) o; - return equalsWithSubstitution(LiteralEqualityHelper.DEFAULT, that); - } - - @Override - public int hashCode() { - return hashCodeWithSubstitution(LiteralHashCodeHelper.DEFAULT); - } -} diff --git a/subprojects/store-query/src/main/java/tools/refinery/store/query/term/Aggregator.java b/subprojects/store-query/src/main/java/tools/refinery/store/query/term/Aggregator.java deleted file mode 100644 index 0684a9d9..00000000 --- a/subprojects/store-query/src/main/java/tools/refinery/store/query/term/Aggregator.java +++ /dev/null @@ -1,18 +0,0 @@ -/* - * SPDX-FileCopyrightText: 2021-2023 The Refinery Authors - * - * SPDX-License-Identifier: EPL-2.0 - */ -package tools.refinery.store.query.term; - -import java.util.stream.Stream; - -public interface Aggregator { - Class getResultType(); - - Class getInputType(); - - R aggregateStream(Stream stream); - - R getEmptyResult(); -} diff --git a/subprojects/store-query/src/main/java/tools/refinery/store/query/term/AnyDataVariable.java b/subprojects/store-query/src/main/java/tools/refinery/store/query/term/AnyDataVariable.java deleted file mode 100644 index 3801bc11..00000000 --- a/subprojects/store-query/src/main/java/tools/refinery/store/query/term/AnyDataVariable.java +++ /dev/null @@ -1,55 +0,0 @@ -/* - * SPDX-FileCopyrightText: 2021-2023 The Refinery Authors - * - * SPDX-License-Identifier: EPL-2.0 - */ -package tools.refinery.store.query.term; - -import org.jetbrains.annotations.Nullable; -import tools.refinery.store.query.InvalidQueryException; -import tools.refinery.store.query.equality.LiteralEqualityHelper; - -import java.util.Optional; -import java.util.Set; - -public abstract sealed class AnyDataVariable extends Variable implements AnyTerm permits DataVariable { - protected AnyDataVariable(String name) { - super(name); - } - - @Override - public Optional> tryGetType() { - return Optional.of(getType()); - } - - @Override - public boolean isNodeVariable() { - return false; - } - - @Override - public boolean isDataVariable() { - return true; - } - - @Override - public NodeVariable asNodeVariable() { - throw new InvalidQueryException("%s is a data variable".formatted(this)); - } - - @Override - public boolean equalsWithSubstitution(LiteralEqualityHelper helper, AnyTerm other) { - return other instanceof AnyDataVariable dataVariable && helper.variableEqual(this, dataVariable); - } - - @Override - public Set getInputVariables() { - return Set.of(this); - } - - @Override - public abstract AnyDataVariable renew(@Nullable String name); - - @Override - public abstract AnyDataVariable renew(); -} diff --git a/subprojects/store-query/src/main/java/tools/refinery/store/query/term/AnyTerm.java b/subprojects/store-query/src/main/java/tools/refinery/store/query/term/AnyTerm.java deleted file mode 100644 index f136b68d..00000000 --- a/subprojects/store-query/src/main/java/tools/refinery/store/query/term/AnyTerm.java +++ /dev/null @@ -1,24 +0,0 @@ -/* - * SPDX-FileCopyrightText: 2021-2023 The Refinery Authors - * - * SPDX-License-Identifier: EPL-2.0 - */ -package tools.refinery.store.query.term; - -import tools.refinery.store.query.equality.LiteralEqualityHelper; -import tools.refinery.store.query.equality.LiteralHashCodeHelper; -import tools.refinery.store.query.substitution.Substitution; - -import java.util.Set; - -public sealed interface AnyTerm permits AnyDataVariable, Term { - Class getType(); - - AnyTerm substitute(Substitution substitution); - - boolean equalsWithSubstitution(LiteralEqualityHelper helper, AnyTerm other); - - int hashCodeWithSubstitution(LiteralHashCodeHelper helper); - - Set getInputVariables(); -} diff --git a/subprojects/store-query/src/main/java/tools/refinery/store/query/term/AssignedValue.java b/subprojects/store-query/src/main/java/tools/refinery/store/query/term/AssignedValue.java deleted file mode 100644 index 0cf30aa6..00000000 --- a/subprojects/store-query/src/main/java/tools/refinery/store/query/term/AssignedValue.java +++ /dev/null @@ -1,13 +0,0 @@ -/* - * SPDX-FileCopyrightText: 2021-2023 The Refinery Authors - * - * SPDX-License-Identifier: EPL-2.0 - */ -package tools.refinery.store.query.term; - -import tools.refinery.store.query.literal.Literal; - -@FunctionalInterface -public interface AssignedValue { - Literal toLiteral(DataVariable targetVariable); -} diff --git a/subprojects/store-query/src/main/java/tools/refinery/store/query/term/BinaryTerm.java b/subprojects/store-query/src/main/java/tools/refinery/store/query/term/BinaryTerm.java deleted file mode 100644 index cdbf592a..00000000 --- a/subprojects/store-query/src/main/java/tools/refinery/store/query/term/BinaryTerm.java +++ /dev/null @@ -1,106 +0,0 @@ -/* - * SPDX-FileCopyrightText: 2021-2023 The Refinery Authors - * - * SPDX-License-Identifier: EPL-2.0 - */ -package tools.refinery.store.query.term; - -import tools.refinery.store.query.InvalidQueryException; -import tools.refinery.store.query.equality.LiteralEqualityHelper; -import tools.refinery.store.query.equality.LiteralHashCodeHelper; -import tools.refinery.store.query.substitution.Substitution; -import tools.refinery.store.query.valuation.Valuation; - -import java.util.Collections; -import java.util.HashSet; -import java.util.Objects; -import java.util.Set; - -// {@link Object#equals(Object)} is implemented by {@link AbstractTerm}. -@SuppressWarnings("squid:S2160") -public abstract class BinaryTerm extends AbstractTerm { - private final Class leftType; - private final Class rightType; - private final Term left; - private final Term right; - - protected BinaryTerm(Class type, Class leftType, Class rightType, Term left, Term right) { - super(type); - if (!left.getType().equals(leftType)) { - throw new InvalidQueryException("Expected left %s to be of type %s, got %s instead".formatted( - left, leftType.getName(), left.getType().getName())); - } - if (!right.getType().equals(rightType)) { - throw new InvalidQueryException("Expected right %s to be of type %s, got %s instead".formatted( - right, rightType.getName(), right.getType().getName())); - } - this.leftType = leftType; - this.rightType = rightType; - this.left = left; - this.right = right; - } - - public Class getLeftType() { - return leftType; - } - - public Class getRightType() { - return rightType; - } - - public Term getLeft() { - return left; - } - - public Term getRight() { - return right; - } - - @Override - public R evaluate(Valuation valuation) { - var leftValue = left.evaluate(valuation); - if (leftValue == null) { - return null; - } - var rightValue = right.evaluate(valuation); - if (rightValue == null) { - return null; - } - return doEvaluate(leftValue, rightValue); - } - - protected abstract R doEvaluate(T1 leftValue, T2 rightValue); - - @Override - public boolean equalsWithSubstitution(LiteralEqualityHelper helper, AnyTerm other) { - if (!super.equalsWithSubstitution(helper, other)) { - return false; - } - var otherBinaryTerm = (BinaryTerm) other; - return leftType.equals(otherBinaryTerm.leftType) && - rightType.equals(otherBinaryTerm.rightType) && - left.equalsWithSubstitution(helper, otherBinaryTerm.left) && - right.equalsWithSubstitution(helper, otherBinaryTerm.right); - } - - @Override - public int hashCodeWithSubstitution(LiteralHashCodeHelper helper) { - return Objects.hash(super.hashCodeWithSubstitution(helper), leftType.hashCode(), rightType.hashCode(), - left.hashCodeWithSubstitution(helper), right.hashCodeWithSubstitution(helper)); - } - - @Override - public Term substitute(Substitution substitution) { - return doSubstitute(substitution, left.substitute(substitution), right.substitute(substitution)); - } - - public abstract Term doSubstitute(Substitution substitution, Term substitutedLeft, - Term substitutedRight); - - @Override - public Set getInputVariables() { - var inputVariables = new HashSet<>(left.getInputVariables()); - inputVariables.addAll(right.getInputVariables()); - return Collections.unmodifiableSet(inputVariables); - } -} diff --git a/subprojects/store-query/src/main/java/tools/refinery/store/query/term/ConstantTerm.java b/subprojects/store-query/src/main/java/tools/refinery/store/query/term/ConstantTerm.java deleted file mode 100644 index 415ae286..00000000 --- a/subprojects/store-query/src/main/java/tools/refinery/store/query/term/ConstantTerm.java +++ /dev/null @@ -1,67 +0,0 @@ -/* - * SPDX-FileCopyrightText: 2021-2023 The Refinery Authors - * - * SPDX-License-Identifier: EPL-2.0 - */ -package tools.refinery.store.query.term; - -import tools.refinery.store.query.InvalidQueryException; -import tools.refinery.store.query.equality.LiteralEqualityHelper; -import tools.refinery.store.query.equality.LiteralHashCodeHelper; -import tools.refinery.store.query.substitution.Substitution; -import tools.refinery.store.query.valuation.Valuation; - -import java.util.Objects; -import java.util.Set; - -// {@link Object#equals(Object)} is implemented by {@link AbstractTerm}. -@SuppressWarnings("squid:S2160") -public final class ConstantTerm extends AbstractTerm { - private final T value; - - public ConstantTerm(Class type, T value) { - super(type); - if (value != null && !type.isInstance(value)) { - throw new InvalidQueryException("Value %s is not an instance of %s".formatted(value, type.getName())); - } - this.value = value; - } - - public T getValue() { - return value; - } - - @Override - public T evaluate(Valuation valuation) { - return getValue(); - } - - @Override - public Term substitute(Substitution substitution) { - return this; - } - - @Override - public boolean equalsWithSubstitution(LiteralEqualityHelper helper, AnyTerm other) { - if (!super.equalsWithSubstitution(helper, other)) { - return false; - } - var otherConstantTerm = (ConstantTerm) other; - return Objects.equals(value, otherConstantTerm.value); - } - - @Override - public int hashCodeWithSubstitution(LiteralHashCodeHelper helper) { - return Objects.hash(super.hashCodeWithSubstitution(helper), Objects.hash(value)); - } - - @Override - public Set getInputVariables() { - return Set.of(); - } - - @Override - public String toString() { - return value.toString(); - } -} diff --git a/subprojects/store-query/src/main/java/tools/refinery/store/query/term/DataVariable.java b/subprojects/store-query/src/main/java/tools/refinery/store/query/term/DataVariable.java deleted file mode 100644 index 2206b522..00000000 --- a/subprojects/store-query/src/main/java/tools/refinery/store/query/term/DataVariable.java +++ /dev/null @@ -1,103 +0,0 @@ -/* - * SPDX-FileCopyrightText: 2021-2023 The Refinery Authors - * - * SPDX-License-Identifier: EPL-2.0 - */ -package tools.refinery.store.query.term; - -import org.jetbrains.annotations.Nullable; -import tools.refinery.store.query.InvalidQueryException; -import tools.refinery.store.query.equality.LiteralEqualityHelper; -import tools.refinery.store.query.equality.LiteralHashCodeHelper; -import tools.refinery.store.query.literal.EquivalenceLiteral; -import tools.refinery.store.query.literal.Literal; -import tools.refinery.store.query.substitution.Substitution; -import tools.refinery.store.query.valuation.Valuation; - -import java.util.Objects; - -public final class DataVariable extends AnyDataVariable implements Term { - private final Class type; - - DataVariable(String name, Class type) { - super(name); - this.type = type; - } - - @Override - public Class getType() { - return type; - } - - @Override - public DataVariable renew(@Nullable String name) { - return new DataVariable<>(name, type); - } - - @Override - public DataVariable renew() { - return renew(getExplicitName()); - } - - @Override - public DataVariable asDataVariable(Class newType) { - if (!getType().equals(newType)) { - throw new InvalidQueryException("%s is not of type %s but of type %s" - .formatted(this, newType.getName(), getType().getName())); - } - @SuppressWarnings("unchecked") - var result = (DataVariable) this; - return result; - } - - @Override - public T evaluate(Valuation valuation) { - return valuation.getValue(this); - } - - @Override - public Term substitute(Substitution substitution) { - return substitution.getTypeSafeSubstitute(this); - } - - @Override - public boolean equalsWithSubstitution(LiteralEqualityHelper helper, AnyTerm other) { - return other instanceof DataVariable dataVariable && helper.variableEqual(this, dataVariable); - } - - @Override - public int hashCodeWithSubstitution(LiteralHashCodeHelper helper) { - return helper.getVariableHashCode(this); - } - - @Override - public int hashCodeWithSubstitution(int sequenceNumber) { - return Objects.hash(type, sequenceNumber); - } - - public Literal assign(AssignedValue value) { - return value.toLiteral(this); - } - - @Override - public boolean equals(Object o) { - if (this == o) return true; - if (o == null || getClass() != o.getClass()) return false; - if (!super.equals(o)) return false; - DataVariable that = (DataVariable) o; - return type.equals(that.type); - } - - @Override - public int hashCode() { - return Objects.hash(super.hashCode(), type); - } - - public EquivalenceLiteral isEquivalent(DataVariable other) { - return new EquivalenceLiteral(true, this, other); - } - - public EquivalenceLiteral notEquivalent(DataVariable other) { - return new EquivalenceLiteral(false, this, other); - } -} diff --git a/subprojects/store-query/src/main/java/tools/refinery/store/query/term/ExtremeValueAggregator.java b/subprojects/store-query/src/main/java/tools/refinery/store/query/term/ExtremeValueAggregator.java deleted file mode 100644 index 657cb631..00000000 --- a/subprojects/store-query/src/main/java/tools/refinery/store/query/term/ExtremeValueAggregator.java +++ /dev/null @@ -1,108 +0,0 @@ -/* - * SPDX-FileCopyrightText: 2021-2023 The Refinery Authors - * - * SPDX-License-Identifier: EPL-2.0 - */ -package tools.refinery.store.query.term; - -import java.util.Comparator; -import java.util.Objects; -import java.util.SortedMap; -import java.util.TreeMap; - -public class ExtremeValueAggregator implements StatefulAggregator { - private final Class type; - private final T emptyResult; - private final Comparator comparator; - - public ExtremeValueAggregator(Class type, T emptyResult) { - this(type, emptyResult, null); - } - - public ExtremeValueAggregator(Class type, T emptyResult, Comparator comparator) { - this.type = type; - this.emptyResult = emptyResult; - this.comparator = comparator; - } - - @Override - public Class getResultType() { - return getInputType(); - } - - @Override - public Class getInputType() { - return type; - } - - @Override - public StatefulAggregate createEmptyAggregate() { - return new Aggregate(); - } - - @Override - public T getEmptyResult() { - return emptyResult; - } - - @Override - public boolean equals(Object o) { - if (this == o) return true; - if (o == null || getClass() != o.getClass()) return false; - ExtremeValueAggregator that = (ExtremeValueAggregator) o; - return type.equals(that.type) && Objects.equals(emptyResult, that.emptyResult) && Objects.equals(comparator, - that.comparator); - } - - @Override - public int hashCode() { - return Objects.hash(type, emptyResult, comparator); - } - - private class Aggregate implements StatefulAggregate { - private final SortedMap values; - - private Aggregate() { - values = new TreeMap<>(comparator); - } - - private Aggregate(Aggregate other) { - values = new TreeMap<>(other.values); - } - - @Override - public void add(T value) { - values.compute(value, (ignoredValue, currentCount) -> currentCount == null ? 1 : currentCount + 1); - } - - @Override - public void remove(T value) { - values.compute(value, (theValue, currentCount) -> { - if (currentCount == null || currentCount <= 0) { - throw new IllegalStateException("Invalid count %d for value %s".formatted(currentCount, theValue)); - } - return currentCount.equals(1) ? null : currentCount - 1; - }); - } - - @Override - public T getResult() { - return isEmpty() ? emptyResult : values.firstKey(); - } - - @Override - public boolean isEmpty() { - return values.isEmpty(); - } - - @Override - public StatefulAggregate deepCopy() { - return new Aggregate(this); - } - - @Override - public boolean contains(T value) { - return StatefulAggregate.super.contains(value); - } - } -} diff --git a/subprojects/store-query/src/main/java/tools/refinery/store/query/term/NodeVariable.java b/subprojects/store-query/src/main/java/tools/refinery/store/query/term/NodeVariable.java deleted file mode 100644 index 53c32e20..00000000 --- a/subprojects/store-query/src/main/java/tools/refinery/store/query/term/NodeVariable.java +++ /dev/null @@ -1,71 +0,0 @@ -/* - * SPDX-FileCopyrightText: 2021-2023 The Refinery Authors - * - * SPDX-License-Identifier: EPL-2.0 - */ -package tools.refinery.store.query.term; - -import org.jetbrains.annotations.Nullable; -import tools.refinery.store.query.InvalidQueryException; -import tools.refinery.store.query.literal.ConstantLiteral; -import tools.refinery.store.query.literal.EquivalenceLiteral; - -import java.util.Optional; - -public final class NodeVariable extends Variable { - NodeVariable(@Nullable String name) { - super(name); - } - - @Override - public Optional> tryGetType() { - return Optional.empty(); - } - - @Override - public NodeVariable renew(@Nullable String name) { - return Variable.of(name); - } - - @Override - public NodeVariable renew() { - return renew(getExplicitName()); - } - - @Override - public boolean isNodeVariable() { - return true; - } - - @Override - public boolean isDataVariable() { - return false; - } - - @Override - public NodeVariable asNodeVariable() { - return this; - } - - @Override - public DataVariable asDataVariable(Class type) { - throw new InvalidQueryException("%s is a node variable".formatted(this)); - } - - @Override - public int hashCodeWithSubstitution(int sequenceNumber) { - return sequenceNumber; - } - - public ConstantLiteral isConstant(int value) { - return new ConstantLiteral(this, value); - } - - public EquivalenceLiteral isEquivalent(NodeVariable other) { - return new EquivalenceLiteral(true, this, other); - } - - public EquivalenceLiteral notEquivalent(NodeVariable other) { - return new EquivalenceLiteral(false, this, other); - } -} diff --git a/subprojects/store-query/src/main/java/tools/refinery/store/query/term/Parameter.java b/subprojects/store-query/src/main/java/tools/refinery/store/query/term/Parameter.java deleted file mode 100644 index 577ac6e0..00000000 --- a/subprojects/store-query/src/main/java/tools/refinery/store/query/term/Parameter.java +++ /dev/null @@ -1,68 +0,0 @@ -/* - * SPDX-FileCopyrightText: 2023 The Refinery Authors - * - * SPDX-License-Identifier: EPL-2.0 - */ -package tools.refinery.store.query.term; - -import java.util.Objects; -import java.util.Optional; - -public class Parameter { - public static final Parameter NODE_OUT = new Parameter(null); - - private final Class dataType; - private final ParameterDirection direction; - - public Parameter(Class dataType) { - this(dataType, ParameterDirection.OUT); - } - - public Parameter(Class dataType, ParameterDirection direction) { - this.dataType = dataType; - this.direction = direction; - } - - public boolean isNodeVariable() { - return dataType == null; - } - - public boolean isDataVariable() { - return !isNodeVariable(); - } - - public Optional> tryGetType() { - return Optional.ofNullable(dataType); - } - - public ParameterDirection getDirection() { - return direction; - } - - public boolean matches(Parameter other) { - return Objects.equals(dataType, other.dataType) && direction == other.direction; - } - - public boolean isAssignable(Variable variable) { - if (variable instanceof AnyDataVariable dataVariable) { - return dataVariable.getType().equals(dataType); - } else if (variable instanceof NodeVariable) { - return !isDataVariable(); - } else { - throw new IllegalArgumentException("Unknown variable " + variable); - } - } - - @Override - public boolean equals(Object o) { - if (this == o) return true; - if (o == null || getClass() != o.getClass()) return false; - Parameter parameter = (Parameter) o; - return matches(parameter); - } - - @Override - public int hashCode() { - return Objects.hash(dataType, direction); - } -} diff --git a/subprojects/store-query/src/main/java/tools/refinery/store/query/term/ParameterDirection.java b/subprojects/store-query/src/main/java/tools/refinery/store/query/term/ParameterDirection.java deleted file mode 100644 index da83f3c3..00000000 --- a/subprojects/store-query/src/main/java/tools/refinery/store/query/term/ParameterDirection.java +++ /dev/null @@ -1,22 +0,0 @@ -/* - * SPDX-FileCopyrightText: 2023 The Refinery Authors - * - * SPDX-License-Identifier: EPL-2.0 - */ -package tools.refinery.store.query.term; - -public enum ParameterDirection { - OUT("out"), - IN("in"); - - private final String name; - - ParameterDirection(String name) { - this.name = name; - } - - @Override - public String toString() { - return name; - } -} diff --git a/subprojects/store-query/src/main/java/tools/refinery/store/query/term/StatefulAggregate.java b/subprojects/store-query/src/main/java/tools/refinery/store/query/term/StatefulAggregate.java deleted file mode 100644 index ab310556..00000000 --- a/subprojects/store-query/src/main/java/tools/refinery/store/query/term/StatefulAggregate.java +++ /dev/null @@ -1,22 +0,0 @@ -/* - * SPDX-FileCopyrightText: 2021-2023 The Refinery Authors - * - * SPDX-License-Identifier: EPL-2.0 - */ -package tools.refinery.store.query.term; - -public interface StatefulAggregate { - void add(T value); - - void remove(T value); - - R getResult(); - - boolean isEmpty(); - - StatefulAggregate deepCopy(); - - default boolean contains(T value) { - throw new UnsupportedOperationException(); - } -} diff --git a/subprojects/store-query/src/main/java/tools/refinery/store/query/term/StatefulAggregator.java b/subprojects/store-query/src/main/java/tools/refinery/store/query/term/StatefulAggregator.java deleted file mode 100644 index df746a90..00000000 --- a/subprojects/store-query/src/main/java/tools/refinery/store/query/term/StatefulAggregator.java +++ /dev/null @@ -1,28 +0,0 @@ -/* - * SPDX-FileCopyrightText: 2021-2023 The Refinery Authors - * - * SPDX-License-Identifier: EPL-2.0 - */ -package tools.refinery.store.query.term; - -import java.util.stream.Stream; - -public interface StatefulAggregator extends Aggregator { - StatefulAggregate createEmptyAggregate(); - - @Override - default R aggregateStream(Stream stream) { - var accumulator = createEmptyAggregate(); - var iterator = stream.iterator(); - while (iterator.hasNext()) { - var value = iterator.next(); - accumulator.add(value); - } - return accumulator.getResult(); - } - - @Override - default R getEmptyResult() { - return createEmptyAggregate().getResult(); - } -} diff --git a/subprojects/store-query/src/main/java/tools/refinery/store/query/term/StatelessAggregator.java b/subprojects/store-query/src/main/java/tools/refinery/store/query/term/StatelessAggregator.java deleted file mode 100644 index a094919e..00000000 --- a/subprojects/store-query/src/main/java/tools/refinery/store/query/term/StatelessAggregator.java +++ /dev/null @@ -1,25 +0,0 @@ -/* - * SPDX-FileCopyrightText: 2021-2023 The Refinery Authors - * - * SPDX-License-Identifier: EPL-2.0 - */ -package tools.refinery.store.query.term; - -import java.util.stream.Stream; - -public interface StatelessAggregator extends Aggregator { - R add(R current, T value); - - R remove(R current, T value); - - @Override - default R aggregateStream(Stream stream) { - var accumulator = getEmptyResult(); - var iterator = stream.iterator(); - while (iterator.hasNext()) { - var value = iterator.next(); - accumulator = add(accumulator, value); - } - return accumulator; - } -} diff --git a/subprojects/store-query/src/main/java/tools/refinery/store/query/term/Term.java b/subprojects/store-query/src/main/java/tools/refinery/store/query/term/Term.java deleted file mode 100644 index e6818b88..00000000 --- a/subprojects/store-query/src/main/java/tools/refinery/store/query/term/Term.java +++ /dev/null @@ -1,26 +0,0 @@ -/* - * SPDX-FileCopyrightText: 2021-2023 The Refinery Authors - * - * SPDX-License-Identifier: EPL-2.0 - */ -package tools.refinery.store.query.term; - -import tools.refinery.store.query.literal.AssignLiteral; -import tools.refinery.store.query.literal.Literal; -import tools.refinery.store.query.substitution.Substitution; -import tools.refinery.store.query.valuation.Valuation; - -public non-sealed interface Term extends AnyTerm, AssignedValue { - @Override - Class getType(); - - T evaluate(Valuation valuation); - - @Override - Term substitute(Substitution substitution); - - @Override - default Literal toLiteral(DataVariable targetVariable) { - return new AssignLiteral<>(targetVariable, this); - } -} diff --git a/subprojects/store-query/src/main/java/tools/refinery/store/query/term/UnaryTerm.java b/subprojects/store-query/src/main/java/tools/refinery/store/query/term/UnaryTerm.java deleted file mode 100644 index a464ece5..00000000 --- a/subprojects/store-query/src/main/java/tools/refinery/store/query/term/UnaryTerm.java +++ /dev/null @@ -1,74 +0,0 @@ -/* - * SPDX-FileCopyrightText: 2021-2023 The Refinery Authors - * - * SPDX-License-Identifier: EPL-2.0 - */ -package tools.refinery.store.query.term; - -import tools.refinery.store.query.InvalidQueryException; -import tools.refinery.store.query.equality.LiteralEqualityHelper; -import tools.refinery.store.query.equality.LiteralHashCodeHelper; -import tools.refinery.store.query.substitution.Substitution; -import tools.refinery.store.query.valuation.Valuation; - -import java.util.Objects; -import java.util.Set; - -// {@link Object#equals(Object)} is implemented by {@link AbstractTerm}. -@SuppressWarnings("squid:S2160") -public abstract class UnaryTerm extends AbstractTerm { - private final Class bodyType; - private final Term body; - - protected UnaryTerm(Class type, Class bodyType, Term body) { - super(type); - if (!body.getType().equals(bodyType)) { - throw new InvalidQueryException("Expected body %s to be of type %s, got %s instead".formatted(body, - bodyType.getName(), body.getType().getName())); - } - this.bodyType = bodyType; - this.body = body; - } - - public Class getBodyType() { - return bodyType; - } - - public Term getBody() { - return body; - } - - @Override - public R evaluate(Valuation valuation) { - var bodyValue = body.evaluate(valuation); - return bodyValue == null ? null : doEvaluate(bodyValue); - } - - protected abstract R doEvaluate(T bodyValue); - - @Override - public boolean equalsWithSubstitution(LiteralEqualityHelper helper, AnyTerm other) { - if (!super.equalsWithSubstitution(helper, other)) { - return false; - } - var otherUnaryTerm = (UnaryTerm) other; - return bodyType.equals(otherUnaryTerm.bodyType) && body.equalsWithSubstitution(helper, otherUnaryTerm.body); - } - - @Override - public int hashCodeWithSubstitution(LiteralHashCodeHelper helper) { - return Objects.hash(super.hashCodeWithSubstitution(helper), bodyType, body.hashCodeWithSubstitution(helper)); - } - - @Override - public Term substitute(Substitution substitution) { - return doSubstitute(substitution, body.substitute(substitution)); - } - - protected abstract Term doSubstitute(Substitution substitution, Term substitutedBody); - - @Override - public Set getInputVariables() { - return body.getInputVariables(); - } -} diff --git a/subprojects/store-query/src/main/java/tools/refinery/store/query/term/Variable.java b/subprojects/store-query/src/main/java/tools/refinery/store/query/term/Variable.java deleted file mode 100644 index 1b553704..00000000 --- a/subprojects/store-query/src/main/java/tools/refinery/store/query/term/Variable.java +++ /dev/null @@ -1,88 +0,0 @@ -/* - * SPDX-FileCopyrightText: 2021-2023 The Refinery Authors - * - * SPDX-License-Identifier: EPL-2.0 - */ -package tools.refinery.store.query.term; - -import org.jetbrains.annotations.Nullable; -import tools.refinery.store.query.dnf.DnfUtils; - -import java.util.Objects; -import java.util.Optional; - -public abstract sealed class Variable permits AnyDataVariable, NodeVariable { - private final String explicitName; - private final String uniqueName; - - protected Variable(String name) { - this.explicitName = name; - uniqueName = DnfUtils.generateUniqueName(name); - } - - public abstract Optional> tryGetType(); - - public String getName() { - return explicitName == null ? uniqueName : explicitName; - } - - protected String getExplicitName() { - return explicitName; - } - - public boolean isExplicitlyNamed() { - return explicitName != null; - } - - public String getUniqueName() { - return uniqueName; - } - - public abstract Variable renew(@Nullable String name); - - public abstract Variable renew(); - - public abstract boolean isNodeVariable(); - - public abstract boolean isDataVariable(); - - public abstract NodeVariable asNodeVariable(); - - public abstract DataVariable asDataVariable(Class type); - - public abstract int hashCodeWithSubstitution(int sequenceNumber); - - @Override - public String toString() { - return getName(); - } - - @Override - public boolean equals(Object o) { - if (this == o) return true; - if (o == null || getClass() != o.getClass()) return false; - Variable variable = (Variable) o; - return Objects.equals(uniqueName, variable.uniqueName); - } - - @Override - public int hashCode() { - return Objects.hash(uniqueName); - } - - public static NodeVariable of(@Nullable String name) { - return new NodeVariable(name); - } - - public static NodeVariable of() { - return of((String) null); - } - - public static DataVariable of(@Nullable String name, Class type) { - return new DataVariable<>(name, type); - } - - public static DataVariable of(Class type) { - return of(null, type); - } -} diff --git a/subprojects/store-query/src/main/java/tools/refinery/store/query/term/bool/BoolAndTerm.java b/subprojects/store-query/src/main/java/tools/refinery/store/query/term/bool/BoolAndTerm.java deleted file mode 100644 index f9e1c06f..00000000 --- a/subprojects/store-query/src/main/java/tools/refinery/store/query/term/bool/BoolAndTerm.java +++ /dev/null @@ -1,31 +0,0 @@ -/* - * SPDX-FileCopyrightText: 2021-2023 The Refinery Authors - * - * SPDX-License-Identifier: EPL-2.0 - */ -package tools.refinery.store.query.term.bool; - -import tools.refinery.store.query.substitution.Substitution; -import tools.refinery.store.query.term.Term; - -public class BoolAndTerm extends BoolBinaryTerm { - public BoolAndTerm(Term left, Term right) { - super(left, right); - } - - @Override - public Term doSubstitute(Substitution substitution, Term substitutedLeft, - Term substitutedRight) { - return new BoolAndTerm(substitutedLeft, substitutedRight); - } - - @Override - protected Boolean doEvaluate(Boolean leftValue, Boolean rightValue) { - return leftValue && rightValue; - } - - @Override - public String toString() { - return "(%s && %s)".formatted(getLeft(), getRight()); - } -} diff --git a/subprojects/store-query/src/main/java/tools/refinery/store/query/term/bool/BoolBinaryTerm.java b/subprojects/store-query/src/main/java/tools/refinery/store/query/term/bool/BoolBinaryTerm.java deleted file mode 100644 index a85aa63a..00000000 --- a/subprojects/store-query/src/main/java/tools/refinery/store/query/term/bool/BoolBinaryTerm.java +++ /dev/null @@ -1,15 +0,0 @@ -/* - * SPDX-FileCopyrightText: 2021-2023 The Refinery Authors - * - * SPDX-License-Identifier: EPL-2.0 - */ -package tools.refinery.store.query.term.bool; - -import tools.refinery.store.query.term.BinaryTerm; -import tools.refinery.store.query.term.Term; - -public abstract class BoolBinaryTerm extends BinaryTerm { - protected BoolBinaryTerm(Term left, Term right) { - super(Boolean.class, Boolean.class, Boolean.class, left, right); - } -} diff --git a/subprojects/store-query/src/main/java/tools/refinery/store/query/term/bool/BoolNotTerm.java b/subprojects/store-query/src/main/java/tools/refinery/store/query/term/bool/BoolNotTerm.java deleted file mode 100644 index 8d3382b3..00000000 --- a/subprojects/store-query/src/main/java/tools/refinery/store/query/term/bool/BoolNotTerm.java +++ /dev/null @@ -1,31 +0,0 @@ -/* - * SPDX-FileCopyrightText: 2021-2023 The Refinery Authors - * - * SPDX-License-Identifier: EPL-2.0 - */ -package tools.refinery.store.query.term.bool; - -import tools.refinery.store.query.substitution.Substitution; -import tools.refinery.store.query.term.Term; -import tools.refinery.store.query.term.UnaryTerm; - -public class BoolNotTerm extends UnaryTerm { - protected BoolNotTerm(Term body) { - super(Boolean.class, Boolean.class, body); - } - - @Override - protected Term doSubstitute(Substitution substitution, Term substitutedBody) { - return new BoolNotTerm(substitutedBody); - } - - @Override - protected Boolean doEvaluate(Boolean bodyValue) { - return !bodyValue; - } - - @Override - public String toString() { - return "(!%s)".formatted(getBody()); - } -} diff --git a/subprojects/store-query/src/main/java/tools/refinery/store/query/term/bool/BoolOrTerm.java b/subprojects/store-query/src/main/java/tools/refinery/store/query/term/bool/BoolOrTerm.java deleted file mode 100644 index b5195d52..00000000 --- a/subprojects/store-query/src/main/java/tools/refinery/store/query/term/bool/BoolOrTerm.java +++ /dev/null @@ -1,31 +0,0 @@ -/* - * SPDX-FileCopyrightText: 2021-2023 The Refinery Authors - * - * SPDX-License-Identifier: EPL-2.0 - */ -package tools.refinery.store.query.term.bool; - -import tools.refinery.store.query.substitution.Substitution; -import tools.refinery.store.query.term.Term; - -public class BoolOrTerm extends BoolBinaryTerm { - public BoolOrTerm(Term left, Term right) { - super(left, right); - } - - @Override - public Term doSubstitute(Substitution substitution, Term substitutedLeft, - Term substitutedRight) { - return new BoolOrTerm(substitutedLeft, substitutedRight); - } - - @Override - protected Boolean doEvaluate(Boolean leftValue, Boolean rightValue) { - return leftValue || rightValue; - } - - @Override - public String toString() { - return "(%s || %s)".formatted(getLeft(), getRight()); - } -} diff --git a/subprojects/store-query/src/main/java/tools/refinery/store/query/term/bool/BoolTerms.java b/subprojects/store-query/src/main/java/tools/refinery/store/query/term/bool/BoolTerms.java deleted file mode 100644 index fa54f686..00000000 --- a/subprojects/store-query/src/main/java/tools/refinery/store/query/term/bool/BoolTerms.java +++ /dev/null @@ -1,35 +0,0 @@ -/* - * SPDX-FileCopyrightText: 2021-2023 The Refinery Authors - * - * SPDX-License-Identifier: EPL-2.0 - */ -package tools.refinery.store.query.term.bool; - -import tools.refinery.store.query.term.ConstantTerm; -import tools.refinery.store.query.term.Term; - -public final class BoolTerms { - private BoolTerms() { - throw new IllegalArgumentException("This is a static utility class and should not be instantiated directly"); - } - - public static Term constant(Boolean value) { - return new ConstantTerm<>(Boolean.class, value); - } - - public static Term not(Term body) { - return new BoolNotTerm(body); - } - - public static Term and(Term left, Term right) { - return new BoolAndTerm(left, right); - } - - public static Term or(Term left, Term right) { - return new BoolOrTerm(left, right); - } - - public static Term xor(Term left, Term right) { - return new BoolXorTerm(left, right); - } -} diff --git a/subprojects/store-query/src/main/java/tools/refinery/store/query/term/bool/BoolXorTerm.java b/subprojects/store-query/src/main/java/tools/refinery/store/query/term/bool/BoolXorTerm.java deleted file mode 100644 index 7478b8a5..00000000 --- a/subprojects/store-query/src/main/java/tools/refinery/store/query/term/bool/BoolXorTerm.java +++ /dev/null @@ -1,31 +0,0 @@ -/* - * SPDX-FileCopyrightText: 2021-2023 The Refinery Authors - * - * SPDX-License-Identifier: EPL-2.0 - */ -package tools.refinery.store.query.term.bool; - -import tools.refinery.store.query.substitution.Substitution; -import tools.refinery.store.query.term.Term; - -public class BoolXorTerm extends BoolBinaryTerm { - public BoolXorTerm(Term left, Term right) { - super(left, right); - } - - @Override - public Term doSubstitute(Substitution substitution, Term substitutedLeft, - Term substitutedRight) { - return new BoolXorTerm(substitutedLeft, substitutedRight); - } - - @Override - protected Boolean doEvaluate(Boolean leftValue, Boolean rightValue) { - return leftValue ^ rightValue; - } - - @Override - public String toString() { - return "(%s ^^ %s)".formatted(getLeft(), getRight()); - } -} diff --git a/subprojects/store-query/src/main/java/tools/refinery/store/query/term/comparable/ComparisonTerm.java b/subprojects/store-query/src/main/java/tools/refinery/store/query/term/comparable/ComparisonTerm.java deleted file mode 100644 index 5ca5a0a1..00000000 --- a/subprojects/store-query/src/main/java/tools/refinery/store/query/term/comparable/ComparisonTerm.java +++ /dev/null @@ -1,19 +0,0 @@ -/* - * SPDX-FileCopyrightText: 2021-2023 The Refinery Authors - * - * SPDX-License-Identifier: EPL-2.0 - */ -package tools.refinery.store.query.term.comparable; - -import tools.refinery.store.query.term.BinaryTerm; -import tools.refinery.store.query.term.Term; - -public abstract class ComparisonTerm extends BinaryTerm { - protected ComparisonTerm(Class argumentType, Term left, Term right) { - super(Boolean.class, argumentType, argumentType, left, right); - } - - public Class getArgumentType() { - return getLeftType(); - } -} diff --git a/subprojects/store-query/src/main/java/tools/refinery/store/query/term/comparable/EqTerm.java b/subprojects/store-query/src/main/java/tools/refinery/store/query/term/comparable/EqTerm.java deleted file mode 100644 index b8cf36f8..00000000 --- a/subprojects/store-query/src/main/java/tools/refinery/store/query/term/comparable/EqTerm.java +++ /dev/null @@ -1,30 +0,0 @@ -/* - * SPDX-FileCopyrightText: 2021-2023 The Refinery Authors - * - * SPDX-License-Identifier: EPL-2.0 - */ -package tools.refinery.store.query.term.comparable; - -import tools.refinery.store.query.substitution.Substitution; -import tools.refinery.store.query.term.Term; - -public class EqTerm extends ComparisonTerm { - public EqTerm(Class argumentType, Term left, Term right) { - super(argumentType, left, right); - } - - @Override - protected Boolean doEvaluate(T leftValue, T rightValue) { - return leftValue.equals(rightValue); - } - - @Override - public Term doSubstitute(Substitution substitution, Term substitutedLeft, Term substitutedRight) { - return new EqTerm<>(getArgumentType(), substitutedLeft, substitutedRight); - } - - @Override - public String toString() { - return "(%s == %s)".formatted(getLeft(), getRight()); - } -} diff --git a/subprojects/store-query/src/main/java/tools/refinery/store/query/term/comparable/GreaterEqTerm.java b/subprojects/store-query/src/main/java/tools/refinery/store/query/term/comparable/GreaterEqTerm.java deleted file mode 100644 index b109eb1a..00000000 --- a/subprojects/store-query/src/main/java/tools/refinery/store/query/term/comparable/GreaterEqTerm.java +++ /dev/null @@ -1,30 +0,0 @@ -/* - * SPDX-FileCopyrightText: 2021-2023 The Refinery Authors - * - * SPDX-License-Identifier: EPL-2.0 - */ -package tools.refinery.store.query.term.comparable; - -import tools.refinery.store.query.substitution.Substitution; -import tools.refinery.store.query.term.Term; - -public class GreaterEqTerm> extends ComparisonTerm { - public GreaterEqTerm(Class argumentType, Term left, Term right) { - super(argumentType, left, right); - } - - @Override - protected Boolean doEvaluate(T leftValue, T rightValue) { - return leftValue.compareTo(rightValue) >= 0; - } - - @Override - public Term doSubstitute(Substitution substitution, Term substitutedLeft, Term substitutedRight) { - return new GreaterEqTerm<>(getArgumentType(), substitutedLeft, substitutedRight); - } - - @Override - public String toString() { - return "(%s >= %s)".formatted(getLeft(), getRight()); - } -} diff --git a/subprojects/store-query/src/main/java/tools/refinery/store/query/term/comparable/GreaterTerm.java b/subprojects/store-query/src/main/java/tools/refinery/store/query/term/comparable/GreaterTerm.java deleted file mode 100644 index 1b67f8b5..00000000 --- a/subprojects/store-query/src/main/java/tools/refinery/store/query/term/comparable/GreaterTerm.java +++ /dev/null @@ -1,30 +0,0 @@ -/* - * SPDX-FileCopyrightText: 2021-2023 The Refinery Authors - * - * SPDX-License-Identifier: EPL-2.0 - */ -package tools.refinery.store.query.term.comparable; - -import tools.refinery.store.query.substitution.Substitution; -import tools.refinery.store.query.term.Term; - -public class GreaterTerm> extends ComparisonTerm { - public GreaterTerm(Class argumentType, Term left, Term right) { - super(argumentType, left, right); - } - - @Override - protected Boolean doEvaluate(T leftValue, T rightValue) { - return leftValue.compareTo(rightValue) > 0; - } - - @Override - public Term doSubstitute(Substitution substitution, Term substitutedLeft, Term substitutedRight) { - return new GreaterTerm<>(getArgumentType(), substitutedLeft, substitutedRight); - } - - @Override - public String toString() { - return "(%s > %s)".formatted(getLeft(), getRight()); - } -} diff --git a/subprojects/store-query/src/main/java/tools/refinery/store/query/term/comparable/LessEqTerm.java b/subprojects/store-query/src/main/java/tools/refinery/store/query/term/comparable/LessEqTerm.java deleted file mode 100644 index 1b34535f..00000000 --- a/subprojects/store-query/src/main/java/tools/refinery/store/query/term/comparable/LessEqTerm.java +++ /dev/null @@ -1,30 +0,0 @@ -/* - * SPDX-FileCopyrightText: 2021-2023 The Refinery Authors - * - * SPDX-License-Identifier: EPL-2.0 - */ -package tools.refinery.store.query.term.comparable; - -import tools.refinery.store.query.substitution.Substitution; -import tools.refinery.store.query.term.Term; - -public class LessEqTerm> extends ComparisonTerm { - public LessEqTerm(Class argumentType, Term left, Term right) { - super(argumentType, left, right); - } - - @Override - protected Boolean doEvaluate(T leftValue, T rightValue) { - return leftValue.compareTo(rightValue) <= 0; - } - - @Override - public Term doSubstitute(Substitution substitution, Term substitutedLeft, Term substitutedRight) { - return new LessEqTerm<>(getArgumentType(), substitutedLeft, substitutedRight); - } - - @Override - public String toString() { - return "(%s <= %s)".formatted(getLeft(), getRight()); - } -} diff --git a/subprojects/store-query/src/main/java/tools/refinery/store/query/term/comparable/LessTerm.java b/subprojects/store-query/src/main/java/tools/refinery/store/query/term/comparable/LessTerm.java deleted file mode 100644 index 44e70902..00000000 --- a/subprojects/store-query/src/main/java/tools/refinery/store/query/term/comparable/LessTerm.java +++ /dev/null @@ -1,30 +0,0 @@ -/* - * SPDX-FileCopyrightText: 2021-2023 The Refinery Authors - * - * SPDX-License-Identifier: EPL-2.0 - */ -package tools.refinery.store.query.term.comparable; - -import tools.refinery.store.query.substitution.Substitution; -import tools.refinery.store.query.term.Term; - -public class LessTerm> extends ComparisonTerm { - public LessTerm(Class argumentType, Term left, Term right) { - super(argumentType, left, right); - } - - @Override - protected Boolean doEvaluate(T leftValue, T rightValue) { - return leftValue.compareTo(rightValue) < 0; - } - - @Override - public Term doSubstitute(Substitution substitution, Term substitutedLeft, Term substitutedRight) { - return new LessTerm<>(getArgumentType(), substitutedLeft, substitutedRight); - } - - @Override - public String toString() { - return "(%s < %s)".formatted(getLeft(), getRight()); - } -} diff --git a/subprojects/store-query/src/main/java/tools/refinery/store/query/term/comparable/NotEqTerm.java b/subprojects/store-query/src/main/java/tools/refinery/store/query/term/comparable/NotEqTerm.java deleted file mode 100644 index 1f9734c4..00000000 --- a/subprojects/store-query/src/main/java/tools/refinery/store/query/term/comparable/NotEqTerm.java +++ /dev/null @@ -1,30 +0,0 @@ -/* - * SPDX-FileCopyrightText: 2021-2023 The Refinery Authors - * - * SPDX-License-Identifier: EPL-2.0 - */ -package tools.refinery.store.query.term.comparable; - -import tools.refinery.store.query.substitution.Substitution; -import tools.refinery.store.query.term.Term; - -public class NotEqTerm extends ComparisonTerm { - public NotEqTerm(Class argumentType, Term left, Term right) { - super(argumentType, left, right); - } - - @Override - protected Boolean doEvaluate(T leftValue, T rightValue) { - return !leftValue.equals(rightValue); - } - - @Override - public Term doSubstitute(Substitution substitution, Term substitutedLeft, Term substitutedRight) { - return new NotEqTerm<>(getArgumentType(), substitutedLeft, substitutedRight); - } - - @Override - public String toString() { - return "(%s != %s)".formatted(getLeft(), getRight()); - } -} diff --git a/subprojects/store-query/src/main/java/tools/refinery/store/query/term/int_/IntAddTerm.java b/subprojects/store-query/src/main/java/tools/refinery/store/query/term/int_/IntAddTerm.java deleted file mode 100644 index dbea3efc..00000000 --- a/subprojects/store-query/src/main/java/tools/refinery/store/query/term/int_/IntAddTerm.java +++ /dev/null @@ -1,31 +0,0 @@ -/* - * SPDX-FileCopyrightText: 2021-2023 The Refinery Authors - * - * SPDX-License-Identifier: EPL-2.0 - */ -package tools.refinery.store.query.term.int_; - -import tools.refinery.store.query.substitution.Substitution; -import tools.refinery.store.query.term.Term; - -public class IntAddTerm extends IntBinaryTerm { - public IntAddTerm(Term left, Term right) { - super(left, right); - } - - @Override - public Term doSubstitute(Substitution substitution, Term substitutedLeft, - Term substitutedRight) { - return new IntAddTerm(substitutedLeft, substitutedRight); - } - - @Override - protected Integer doEvaluate(Integer leftValue, Integer rightValue) { - return leftValue + rightValue; - } - - @Override - public String toString() { - return "(%s + %s)".formatted(getLeft(), getRight()); - } -} diff --git a/subprojects/store-query/src/main/java/tools/refinery/store/query/term/int_/IntBinaryTerm.java b/subprojects/store-query/src/main/java/tools/refinery/store/query/term/int_/IntBinaryTerm.java deleted file mode 100644 index 27ced4e4..00000000 --- a/subprojects/store-query/src/main/java/tools/refinery/store/query/term/int_/IntBinaryTerm.java +++ /dev/null @@ -1,15 +0,0 @@ -/* - * SPDX-FileCopyrightText: 2021-2023 The Refinery Authors - * - * SPDX-License-Identifier: EPL-2.0 - */ -package tools.refinery.store.query.term.int_; - -import tools.refinery.store.query.term.BinaryTerm; -import tools.refinery.store.query.term.Term; - -public abstract class IntBinaryTerm extends BinaryTerm { - protected IntBinaryTerm(Term left, Term right) { - super(Integer.class, Integer.class, Integer.class, left, right); - } -} diff --git a/subprojects/store-query/src/main/java/tools/refinery/store/query/term/int_/IntDivTerm.java b/subprojects/store-query/src/main/java/tools/refinery/store/query/term/int_/IntDivTerm.java deleted file mode 100644 index 2a35058c..00000000 --- a/subprojects/store-query/src/main/java/tools/refinery/store/query/term/int_/IntDivTerm.java +++ /dev/null @@ -1,31 +0,0 @@ -/* - * SPDX-FileCopyrightText: 2021-2023 The Refinery Authors - * - * SPDX-License-Identifier: EPL-2.0 - */ -package tools.refinery.store.query.term.int_; - -import tools.refinery.store.query.substitution.Substitution; -import tools.refinery.store.query.term.Term; - -public class IntDivTerm extends IntBinaryTerm { - public IntDivTerm(Term left, Term right) { - super(left, right); - } - - @Override - public Term doSubstitute(Substitution substitution, Term substitutedLeft, - Term substitutedRight) { - return new IntDivTerm(substitutedLeft, substitutedRight); - } - - @Override - protected Integer doEvaluate(Integer leftValue, Integer rightValue) { - return rightValue == 0 ? null : leftValue / rightValue; - } - - @Override - public String toString() { - return "(%s / %s)".formatted(getLeft(), getRight()); - } -} diff --git a/subprojects/store-query/src/main/java/tools/refinery/store/query/term/int_/IntMaxTerm.java b/subprojects/store-query/src/main/java/tools/refinery/store/query/term/int_/IntMaxTerm.java deleted file mode 100644 index f81fc509..00000000 --- a/subprojects/store-query/src/main/java/tools/refinery/store/query/term/int_/IntMaxTerm.java +++ /dev/null @@ -1,31 +0,0 @@ -/* - * SPDX-FileCopyrightText: 2021-2023 The Refinery Authors - * - * SPDX-License-Identifier: EPL-2.0 - */ -package tools.refinery.store.query.term.int_; - -import tools.refinery.store.query.substitution.Substitution; -import tools.refinery.store.query.term.Term; - -public class IntMaxTerm extends IntBinaryTerm { - public IntMaxTerm(Term left, Term right) { - super(left, right); - } - - @Override - public Term doSubstitute(Substitution substitution, Term substitutedLeft, - Term substitutedRight) { - return new IntMaxTerm(substitutedLeft, substitutedRight); - } - - @Override - protected Integer doEvaluate(Integer leftValue, Integer rightValue) { - return Math.max(rightValue, leftValue); - } - - @Override - public String toString() { - return "max(%s, %s)".formatted(getLeft(), getRight()); - } -} diff --git a/subprojects/store-query/src/main/java/tools/refinery/store/query/term/int_/IntMinTerm.java b/subprojects/store-query/src/main/java/tools/refinery/store/query/term/int_/IntMinTerm.java deleted file mode 100644 index 89182e26..00000000 --- a/subprojects/store-query/src/main/java/tools/refinery/store/query/term/int_/IntMinTerm.java +++ /dev/null @@ -1,31 +0,0 @@ -/* - * SPDX-FileCopyrightText: 2021-2023 The Refinery Authors - * - * SPDX-License-Identifier: EPL-2.0 - */ -package tools.refinery.store.query.term.int_; - -import tools.refinery.store.query.substitution.Substitution; -import tools.refinery.store.query.term.Term; - -public class IntMinTerm extends IntBinaryTerm { - public IntMinTerm(Term left, Term right) { - super(left, right); - } - - @Override - public Term doSubstitute(Substitution substitution, Term substitutedLeft, - Term substitutedRight) { - return new IntMinTerm(substitutedLeft, substitutedRight); - } - - @Override - protected Integer doEvaluate(Integer leftValue, Integer rightValue) { - return Math.min(rightValue, leftValue); - } - - @Override - public String toString() { - return "min(%s, %s)".formatted(getLeft(), getRight()); - } -} diff --git a/subprojects/store-query/src/main/java/tools/refinery/store/query/term/int_/IntMinusTerm.java b/subprojects/store-query/src/main/java/tools/refinery/store/query/term/int_/IntMinusTerm.java deleted file mode 100644 index 709aa5ba..00000000 --- a/subprojects/store-query/src/main/java/tools/refinery/store/query/term/int_/IntMinusTerm.java +++ /dev/null @@ -1,30 +0,0 @@ -/* - * SPDX-FileCopyrightText: 2021-2023 The Refinery Authors - * - * SPDX-License-Identifier: EPL-2.0 - */ -package tools.refinery.store.query.term.int_; - -import tools.refinery.store.query.substitution.Substitution; -import tools.refinery.store.query.term.Term; - -public class IntMinusTerm extends IntUnaryTerm { - public IntMinusTerm(Term body) { - super(body); - } - - @Override - protected Term doSubstitute(Substitution substitution, Term substitutedBody) { - return new IntMinusTerm(substitutedBody); - } - - @Override - protected Integer doEvaluate(Integer bodyValue) { - return -bodyValue; - } - - @Override - public String toString() { - return "(-%s)".formatted(getBody()); - } -} diff --git a/subprojects/store-query/src/main/java/tools/refinery/store/query/term/int_/IntMulTerm.java b/subprojects/store-query/src/main/java/tools/refinery/store/query/term/int_/IntMulTerm.java deleted file mode 100644 index 89d4c5f4..00000000 --- a/subprojects/store-query/src/main/java/tools/refinery/store/query/term/int_/IntMulTerm.java +++ /dev/null @@ -1,31 +0,0 @@ -/* - * SPDX-FileCopyrightText: 2021-2023 The Refinery Authors - * - * SPDX-License-Identifier: EPL-2.0 - */ -package tools.refinery.store.query.term.int_; - -import tools.refinery.store.query.substitution.Substitution; -import tools.refinery.store.query.term.Term; - -public class IntMulTerm extends IntBinaryTerm { - public IntMulTerm(Term left, Term right) { - super(left, right); - } - - @Override - public Term doSubstitute(Substitution substitution, Term substitutedLeft, - Term substitutedRight) { - return new IntMulTerm(substitutedLeft, substitutedRight); - } - - @Override - protected Integer doEvaluate(Integer leftValue, Integer rightValue) { - return leftValue * rightValue; - } - - @Override - public String toString() { - return "(%s * %s)".formatted(getLeft(), getRight()); - } -} diff --git a/subprojects/store-query/src/main/java/tools/refinery/store/query/term/int_/IntPlusTerm.java b/subprojects/store-query/src/main/java/tools/refinery/store/query/term/int_/IntPlusTerm.java deleted file mode 100644 index aef83bb4..00000000 --- a/subprojects/store-query/src/main/java/tools/refinery/store/query/term/int_/IntPlusTerm.java +++ /dev/null @@ -1,30 +0,0 @@ -/* - * SPDX-FileCopyrightText: 2021-2023 The Refinery Authors - * - * SPDX-License-Identifier: EPL-2.0 - */ -package tools.refinery.store.query.term.int_; - -import tools.refinery.store.query.substitution.Substitution; -import tools.refinery.store.query.term.Term; - -public class IntPlusTerm extends IntUnaryTerm { - public IntPlusTerm(Term body) { - super(body); - } - - @Override - protected Term doSubstitute(Substitution substitution, Term substitutedBody) { - return new IntPlusTerm(substitutedBody); - } - - @Override - protected Integer doEvaluate(Integer bodyValue) { - return bodyValue; - } - - @Override - public String toString() { - return "(+%s)".formatted(getBody()); - } -} diff --git a/subprojects/store-query/src/main/java/tools/refinery/store/query/term/int_/IntPowTerm.java b/subprojects/store-query/src/main/java/tools/refinery/store/query/term/int_/IntPowTerm.java deleted file mode 100644 index d5af97a1..00000000 --- a/subprojects/store-query/src/main/java/tools/refinery/store/query/term/int_/IntPowTerm.java +++ /dev/null @@ -1,43 +0,0 @@ -/* - * SPDX-FileCopyrightText: 2021-2023 The Refinery Authors - * - * SPDX-License-Identifier: EPL-2.0 - */ -package tools.refinery.store.query.term.int_; - -import tools.refinery.store.query.substitution.Substitution; -import tools.refinery.store.query.term.Term; - -public class IntPowTerm extends IntBinaryTerm { - public IntPowTerm(Term left, Term right) { - super(left, right); - } - - @Override - public Term doSubstitute(Substitution substitution, Term substitutedLeft, - Term substitutedRight) { - return new IntPowTerm(substitutedLeft, substitutedRight); - } - - @Override - protected Integer doEvaluate(Integer leftValue, Integer rightValue) { - return rightValue < 0 ? null : power(leftValue, rightValue); - } - - private static int power(int base, int exponent) { - int accum = 1; - while (exponent > 0) { - if (exponent % 2 == 1) { - accum = accum * base; - } - base = base * base; - exponent = exponent / 2; - } - return accum; - } - - @Override - public String toString() { - return "(%s ** %s)".formatted(getLeft(), getRight()); - } -} diff --git a/subprojects/store-query/src/main/java/tools/refinery/store/query/term/int_/IntSubTerm.java b/subprojects/store-query/src/main/java/tools/refinery/store/query/term/int_/IntSubTerm.java deleted file mode 100644 index 2c27afb1..00000000 --- a/subprojects/store-query/src/main/java/tools/refinery/store/query/term/int_/IntSubTerm.java +++ /dev/null @@ -1,31 +0,0 @@ -/* - * SPDX-FileCopyrightText: 2021-2023 The Refinery Authors - * - * SPDX-License-Identifier: EPL-2.0 - */ -package tools.refinery.store.query.term.int_; - -import tools.refinery.store.query.substitution.Substitution; -import tools.refinery.store.query.term.Term; - -public class IntSubTerm extends IntBinaryTerm { - public IntSubTerm(Term left, Term right) { - super(left, right); - } - - @Override - public Term doSubstitute(Substitution substitution, Term substitutedLeft, - Term substitutedRight) { - return new IntSubTerm(substitutedLeft, substitutedRight); - } - - @Override - protected Integer doEvaluate(Integer leftValue, Integer rightValue) { - return leftValue - rightValue; - } - - @Override - public String toString() { - return "(%s - %s)".formatted(getLeft(), getRight()); - } -} diff --git a/subprojects/store-query/src/main/java/tools/refinery/store/query/term/int_/IntSumAggregator.java b/subprojects/store-query/src/main/java/tools/refinery/store/query/term/int_/IntSumAggregator.java deleted file mode 100644 index cd718c53..00000000 --- a/subprojects/store-query/src/main/java/tools/refinery/store/query/term/int_/IntSumAggregator.java +++ /dev/null @@ -1,40 +0,0 @@ -/* - * SPDX-FileCopyrightText: 2021-2023 The Refinery Authors - * - * SPDX-License-Identifier: EPL-2.0 - */ -package tools.refinery.store.query.term.int_; - -import tools.refinery.store.query.term.StatelessAggregator; - -public final class IntSumAggregator implements StatelessAggregator { - public static final IntSumAggregator INSTANCE = new IntSumAggregator(); - - private IntSumAggregator() { - } - - @Override - public Class getResultType() { - return Integer.class; - } - - @Override - public Class getInputType() { - return Integer.class; - } - - @Override - public Integer getEmptyResult() { - return 0; - } - - @Override - public Integer add(Integer current, Integer value) { - return current + value; - } - - @Override - public Integer remove(Integer current, Integer value) { - return current - value; - } -} diff --git a/subprojects/store-query/src/main/java/tools/refinery/store/query/term/int_/IntTerms.java b/subprojects/store-query/src/main/java/tools/refinery/store/query/term/int_/IntTerms.java deleted file mode 100644 index acb98b94..00000000 --- a/subprojects/store-query/src/main/java/tools/refinery/store/query/term/int_/IntTerms.java +++ /dev/null @@ -1,94 +0,0 @@ -/* - * SPDX-FileCopyrightText: 2021-2023 The Refinery Authors - * - * SPDX-License-Identifier: EPL-2.0 - */ -package tools.refinery.store.query.term.int_; - -import tools.refinery.store.query.term.Aggregator; -import tools.refinery.store.query.term.ConstantTerm; -import tools.refinery.store.query.term.ExtremeValueAggregator; -import tools.refinery.store.query.term.Term; -import tools.refinery.store.query.term.comparable.*; - -import java.util.Comparator; - -public final class IntTerms { - public static final Aggregator INT_SUM = IntSumAggregator.INSTANCE; - public static final Aggregator INT_MIN = new ExtremeValueAggregator<>(Integer.class, - Integer.MAX_VALUE); - public static final Aggregator INT_MAX = new ExtremeValueAggregator<>(Integer.class, - Integer.MIN_VALUE, Comparator.reverseOrder()); - - private IntTerms() { - throw new IllegalArgumentException("This is a static utility class and should not be instantiated directly"); - } - - public static Term constant(Integer value) { - return new ConstantTerm<>(Integer.class, value); - } - - public static Term plus(Term body) { - return new IntPlusTerm(body); - } - - public static Term minus(Term body) { - return new IntMinusTerm(body); - } - - public static Term add(Term left, Term right) { - return new IntAddTerm(left, right); - } - - public static Term sub(Term left, Term right) { - return new IntSubTerm(left, right); - } - - public static Term mul(Term left, Term right) { - return new IntMulTerm(left, right); - } - - public static Term div(Term left, Term right) { - return new IntDivTerm(left, right); - } - - public static Term pow(Term left, Term right) { - return new IntPowTerm(left, right); - } - - public static Term min(Term left, Term right) { - return new IntMinTerm(left, right); - } - - public static Term max(Term left, Term right) { - return new IntMaxTerm(left, right); - } - - public static Term eq(Term left, Term right) { - return new EqTerm<>(Integer.class, left, right); - } - - public static Term notEq(Term left, Term right) { - return new NotEqTerm<>(Integer.class, left, right); - } - - public static Term less(Term left, Term right) { - return new LessTerm<>(Integer.class, left, right); - } - - public static Term lessEq(Term left, Term right) { - return new LessEqTerm<>(Integer.class, left, right); - } - - public static Term greater(Term left, Term right) { - return new GreaterTerm<>(Integer.class, left, right); - } - - public static Term greaterEq(Term left, Term right) { - return new GreaterEqTerm<>(Integer.class, left, right); - } - - public static Term asInt(Term body) { - return new RealToIntTerm(body); - } -} diff --git a/subprojects/store-query/src/main/java/tools/refinery/store/query/term/int_/IntUnaryTerm.java b/subprojects/store-query/src/main/java/tools/refinery/store/query/term/int_/IntUnaryTerm.java deleted file mode 100644 index 49b4c647..00000000 --- a/subprojects/store-query/src/main/java/tools/refinery/store/query/term/int_/IntUnaryTerm.java +++ /dev/null @@ -1,15 +0,0 @@ -/* - * SPDX-FileCopyrightText: 2021-2023 The Refinery Authors - * - * SPDX-License-Identifier: EPL-2.0 - */ -package tools.refinery.store.query.term.int_; - -import tools.refinery.store.query.term.Term; -import tools.refinery.store.query.term.UnaryTerm; - -public abstract class IntUnaryTerm extends UnaryTerm { - protected IntUnaryTerm(Term body) { - super(Integer.class, Integer.class, body); - } -} diff --git a/subprojects/store-query/src/main/java/tools/refinery/store/query/term/int_/RealToIntTerm.java b/subprojects/store-query/src/main/java/tools/refinery/store/query/term/int_/RealToIntTerm.java deleted file mode 100644 index 7d383562..00000000 --- a/subprojects/store-query/src/main/java/tools/refinery/store/query/term/int_/RealToIntTerm.java +++ /dev/null @@ -1,31 +0,0 @@ -/* - * SPDX-FileCopyrightText: 2021-2023 The Refinery Authors - * - * SPDX-License-Identifier: EPL-2.0 - */ -package tools.refinery.store.query.term.int_; - -import tools.refinery.store.query.substitution.Substitution; -import tools.refinery.store.query.term.Term; -import tools.refinery.store.query.term.UnaryTerm; - -public class RealToIntTerm extends UnaryTerm { - protected RealToIntTerm(Term body) { - super(Integer.class, Double.class, body); - } - - @Override - protected Integer doEvaluate(Double bodyValue) { - return bodyValue.isNaN() ? null : bodyValue.intValue(); - } - - @Override - protected Term doSubstitute(Substitution substitution, Term substitutedBody) { - return new RealToIntTerm(substitutedBody); - } - - @Override - public String toString() { - return "(%s as int)".formatted(getBody()); - } -} diff --git a/subprojects/store-query/src/main/java/tools/refinery/store/query/term/real/IntToRealTerm.java b/subprojects/store-query/src/main/java/tools/refinery/store/query/term/real/IntToRealTerm.java deleted file mode 100644 index 2f53117a..00000000 --- a/subprojects/store-query/src/main/java/tools/refinery/store/query/term/real/IntToRealTerm.java +++ /dev/null @@ -1,31 +0,0 @@ -/* - * SPDX-FileCopyrightText: 2021-2023 The Refinery Authors - * - * SPDX-License-Identifier: EPL-2.0 - */ -package tools.refinery.store.query.term.real; - -import tools.refinery.store.query.substitution.Substitution; -import tools.refinery.store.query.term.Term; -import tools.refinery.store.query.term.UnaryTerm; - -public class IntToRealTerm extends UnaryTerm { - protected IntToRealTerm(Term body) { - super(Double.class, Integer.class, body); - } - - @Override - protected Term doSubstitute(Substitution substitution, Term substitutedBody) { - return new IntToRealTerm(substitutedBody); - } - - @Override - protected Double doEvaluate(Integer bodyValue) { - return bodyValue.doubleValue(); - } - - @Override - public String toString() { - return "(%s as real)".formatted(getBody()); - } -} diff --git a/subprojects/store-query/src/main/java/tools/refinery/store/query/term/real/RealAddTerm.java b/subprojects/store-query/src/main/java/tools/refinery/store/query/term/real/RealAddTerm.java deleted file mode 100644 index 33fc9e41..00000000 --- a/subprojects/store-query/src/main/java/tools/refinery/store/query/term/real/RealAddTerm.java +++ /dev/null @@ -1,31 +0,0 @@ -/* - * SPDX-FileCopyrightText: 2021-2023 The Refinery Authors - * - * SPDX-License-Identifier: EPL-2.0 - */ -package tools.refinery.store.query.term.real; - -import tools.refinery.store.query.substitution.Substitution; -import tools.refinery.store.query.term.Term; - -public class RealAddTerm extends RealBinaryTerm { - public RealAddTerm(Term left, Term right) { - super(left, right); - } - - @Override - public Term doSubstitute(Substitution substitution, Term substitutedLeft, - Term substitutedRight) { - return new RealAddTerm(substitutedLeft, substitutedRight); - } - - @Override - protected Double doEvaluate(Double leftValue, Double rightValue) { - return leftValue + rightValue; - } - - @Override - public String toString() { - return "(%s + %s)".formatted(getLeft(), getRight()); - } -} diff --git a/subprojects/store-query/src/main/java/tools/refinery/store/query/term/real/RealBinaryTerm.java b/subprojects/store-query/src/main/java/tools/refinery/store/query/term/real/RealBinaryTerm.java deleted file mode 100644 index 000f3623..00000000 --- a/subprojects/store-query/src/main/java/tools/refinery/store/query/term/real/RealBinaryTerm.java +++ /dev/null @@ -1,15 +0,0 @@ -/* - * SPDX-FileCopyrightText: 2021-2023 The Refinery Authors - * - * SPDX-License-Identifier: EPL-2.0 - */ -package tools.refinery.store.query.term.real; - -import tools.refinery.store.query.term.BinaryTerm; -import tools.refinery.store.query.term.Term; - -public abstract class RealBinaryTerm extends BinaryTerm { - protected RealBinaryTerm(Term left, Term right) { - super(Double.class, Double.class, Double.class, left, right); - } -} diff --git a/subprojects/store-query/src/main/java/tools/refinery/store/query/term/real/RealDivTerm.java b/subprojects/store-query/src/main/java/tools/refinery/store/query/term/real/RealDivTerm.java deleted file mode 100644 index 1e55bf42..00000000 --- a/subprojects/store-query/src/main/java/tools/refinery/store/query/term/real/RealDivTerm.java +++ /dev/null @@ -1,31 +0,0 @@ -/* - * SPDX-FileCopyrightText: 2021-2023 The Refinery Authors - * - * SPDX-License-Identifier: EPL-2.0 - */ -package tools.refinery.store.query.term.real; - -import tools.refinery.store.query.substitution.Substitution; -import tools.refinery.store.query.term.Term; - -public class RealDivTerm extends RealBinaryTerm { - public RealDivTerm(Term left, Term right) { - super(left, right); - } - - @Override - public Term doSubstitute(Substitution substitution, Term substitutedLeft, - Term substitutedRight) { - return new RealDivTerm(substitutedLeft, substitutedRight); - } - - @Override - protected Double doEvaluate(Double leftValue, Double rightValue) { - return leftValue / rightValue; - } - - @Override - public String toString() { - return "(%s / %s)".formatted(getLeft(), getRight()); - } -} diff --git a/subprojects/store-query/src/main/java/tools/refinery/store/query/term/real/RealMaxTerm.java b/subprojects/store-query/src/main/java/tools/refinery/store/query/term/real/RealMaxTerm.java deleted file mode 100644 index 2a249496..00000000 --- a/subprojects/store-query/src/main/java/tools/refinery/store/query/term/real/RealMaxTerm.java +++ /dev/null @@ -1,31 +0,0 @@ -/* - * SPDX-FileCopyrightText: 2021-2023 The Refinery Authors - * - * SPDX-License-Identifier: EPL-2.0 - */ -package tools.refinery.store.query.term.real; - -import tools.refinery.store.query.substitution.Substitution; -import tools.refinery.store.query.term.Term; - -public class RealMaxTerm extends RealBinaryTerm { - public RealMaxTerm(Term left, Term right) { - super(left, right); - } - - @Override - public Term doSubstitute(Substitution substitution, Term substitutedLeft, - Term substitutedRight) { - return new RealMaxTerm(substitutedLeft, substitutedRight); - } - - @Override - protected Double doEvaluate(Double leftValue, Double rightValue) { - return Math.max(leftValue, rightValue); - } - - @Override - public String toString() { - return "max(%s, %s)".formatted(getLeft(), getRight()); - } -} diff --git a/subprojects/store-query/src/main/java/tools/refinery/store/query/term/real/RealMinTerm.java b/subprojects/store-query/src/main/java/tools/refinery/store/query/term/real/RealMinTerm.java deleted file mode 100644 index 2eb4cc1e..00000000 --- a/subprojects/store-query/src/main/java/tools/refinery/store/query/term/real/RealMinTerm.java +++ /dev/null @@ -1,31 +0,0 @@ -/* - * SPDX-FileCopyrightText: 2021-2023 The Refinery Authors - * - * SPDX-License-Identifier: EPL-2.0 - */ -package tools.refinery.store.query.term.real; - -import tools.refinery.store.query.substitution.Substitution; -import tools.refinery.store.query.term.Term; - -public class RealMinTerm extends RealBinaryTerm { - public RealMinTerm(Term left, Term right) { - super(left, right); - } - - @Override - public Term doSubstitute(Substitution substitution, Term substitutedLeft, - Term substitutedRight) { - return new RealMinTerm(substitutedLeft, substitutedRight); - } - - @Override - protected Double doEvaluate(Double leftValue, Double rightValue) { - return Math.min(leftValue, rightValue); - } - - @Override - public String toString() { - return "min(%s, %s)".formatted(getLeft(), getRight()); - } -} diff --git a/subprojects/store-query/src/main/java/tools/refinery/store/query/term/real/RealMinusTerm.java b/subprojects/store-query/src/main/java/tools/refinery/store/query/term/real/RealMinusTerm.java deleted file mode 100644 index 4afec7a1..00000000 --- a/subprojects/store-query/src/main/java/tools/refinery/store/query/term/real/RealMinusTerm.java +++ /dev/null @@ -1,30 +0,0 @@ -/* - * SPDX-FileCopyrightText: 2021-2023 The Refinery Authors - * - * SPDX-License-Identifier: EPL-2.0 - */ -package tools.refinery.store.query.term.real; - -import tools.refinery.store.query.substitution.Substitution; -import tools.refinery.store.query.term.Term; - -public class RealMinusTerm extends RealUnaryTerm { - public RealMinusTerm(Term body) { - super(body); - } - - @Override - protected Term doSubstitute(Substitution substitution, Term substitutedBody) { - return new RealMinusTerm(substitutedBody); - } - - @Override - protected Double doEvaluate(Double bodyValue) { - return -bodyValue; - } - - @Override - public String toString() { - return "(-%s)".formatted(getBody()); - } -} diff --git a/subprojects/store-query/src/main/java/tools/refinery/store/query/term/real/RealMulTerm.java b/subprojects/store-query/src/main/java/tools/refinery/store/query/term/real/RealMulTerm.java deleted file mode 100644 index ec95ac6f..00000000 --- a/subprojects/store-query/src/main/java/tools/refinery/store/query/term/real/RealMulTerm.java +++ /dev/null @@ -1,31 +0,0 @@ -/* - * SPDX-FileCopyrightText: 2021-2023 The Refinery Authors - * - * SPDX-License-Identifier: EPL-2.0 - */ -package tools.refinery.store.query.term.real; - -import tools.refinery.store.query.substitution.Substitution; -import tools.refinery.store.query.term.Term; - -public class RealMulTerm extends RealBinaryTerm { - public RealMulTerm(Term left, Term right) { - super(left, right); - } - - @Override - public Term doSubstitute(Substitution substitution, Term substitutedLeft, - Term substitutedRight) { - return new RealMulTerm(substitutedLeft, substitutedRight); - } - - @Override - protected Double doEvaluate(Double leftValue, Double rightValue) { - return leftValue * rightValue; - } - - @Override - public String toString() { - return "(%s * %s)".formatted(getLeft(), getRight()); - } -} diff --git a/subprojects/store-query/src/main/java/tools/refinery/store/query/term/real/RealPlusTerm.java b/subprojects/store-query/src/main/java/tools/refinery/store/query/term/real/RealPlusTerm.java deleted file mode 100644 index 64dd2e70..00000000 --- a/subprojects/store-query/src/main/java/tools/refinery/store/query/term/real/RealPlusTerm.java +++ /dev/null @@ -1,30 +0,0 @@ -/* - * SPDX-FileCopyrightText: 2021-2023 The Refinery Authors - * - * SPDX-License-Identifier: EPL-2.0 - */ -package tools.refinery.store.query.term.real; - -import tools.refinery.store.query.substitution.Substitution; -import tools.refinery.store.query.term.Term; - -public class RealPlusTerm extends RealUnaryTerm { - public RealPlusTerm(Term body) { - super(body); - } - - @Override - protected Term doSubstitute(Substitution substitution, Term substitutedBody) { - return new RealPlusTerm(substitutedBody); - } - - @Override - protected Double doEvaluate(Double bodyValue) { - return bodyValue; - } - - @Override - public String toString() { - return "(+%s)".formatted(getBody()); - } -} diff --git a/subprojects/store-query/src/main/java/tools/refinery/store/query/term/real/RealPowTerm.java b/subprojects/store-query/src/main/java/tools/refinery/store/query/term/real/RealPowTerm.java deleted file mode 100644 index 11c952ea..00000000 --- a/subprojects/store-query/src/main/java/tools/refinery/store/query/term/real/RealPowTerm.java +++ /dev/null @@ -1,31 +0,0 @@ -/* - * SPDX-FileCopyrightText: 2021-2023 The Refinery Authors - * - * SPDX-License-Identifier: EPL-2.0 - */ -package tools.refinery.store.query.term.real; - -import tools.refinery.store.query.substitution.Substitution; -import tools.refinery.store.query.term.Term; - -public class RealPowTerm extends RealBinaryTerm { - public RealPowTerm(Term left, Term right) { - super(left, right); - } - - @Override - public Term doSubstitute(Substitution substitution, Term substitutedLeft, - Term substitutedRight) { - return new RealPowTerm(substitutedLeft, substitutedRight); - } - - @Override - protected Double doEvaluate(Double leftValue, Double rightValue) { - return Math.pow(leftValue, rightValue); - } - - @Override - public String toString() { - return "(%s ** %s)".formatted(getLeft(), getRight()); - } -} diff --git a/subprojects/store-query/src/main/java/tools/refinery/store/query/term/real/RealSubTerm.java b/subprojects/store-query/src/main/java/tools/refinery/store/query/term/real/RealSubTerm.java deleted file mode 100644 index 8cc701ed..00000000 --- a/subprojects/store-query/src/main/java/tools/refinery/store/query/term/real/RealSubTerm.java +++ /dev/null @@ -1,31 +0,0 @@ -/* - * SPDX-FileCopyrightText: 2021-2023 The Refinery Authors - * - * SPDX-License-Identifier: EPL-2.0 - */ -package tools.refinery.store.query.term.real; - -import tools.refinery.store.query.substitution.Substitution; -import tools.refinery.store.query.term.Term; - -public class RealSubTerm extends RealBinaryTerm { - public RealSubTerm(Term left, Term right) { - super(left, right); - } - - @Override - public Term doSubstitute(Substitution substitution, Term substitutedLeft, - Term substitutedRight) { - return new RealSubTerm(substitutedLeft, substitutedRight); - } - - @Override - protected Double doEvaluate(Double leftValue, Double rightValue) { - return leftValue - rightValue; - } - - @Override - public String toString() { - return "(%s - %s)".formatted(getLeft(), getRight()); - } -} diff --git a/subprojects/store-query/src/main/java/tools/refinery/store/query/term/real/RealSumAggregator.java b/subprojects/store-query/src/main/java/tools/refinery/store/query/term/real/RealSumAggregator.java deleted file mode 100644 index d21048e9..00000000 --- a/subprojects/store-query/src/main/java/tools/refinery/store/query/term/real/RealSumAggregator.java +++ /dev/null @@ -1,90 +0,0 @@ -/* - * SPDX-FileCopyrightText: 2021-2023 The Refinery Authors - * - * SPDX-License-Identifier: EPL-2.0 - */ -package tools.refinery.store.query.term.real; - -import tools.refinery.store.query.term.StatefulAggregate; -import tools.refinery.store.query.term.StatefulAggregator; - -import java.util.Map; -import java.util.TreeMap; - -public final class RealSumAggregator implements StatefulAggregator { - public static final RealSumAggregator INSTANCE = new RealSumAggregator(); - - private RealSumAggregator() { - } - - @Override - public Class getResultType() { - return Double.class; - } - - @Override - public Class getInputType() { - return Double.class; - } - - @Override - public StatefulAggregate createEmptyAggregate() { - return new Aggregate(); - } - - @Override - public Double getEmptyResult() { - return 0d; - } - - private static class Aggregate implements StatefulAggregate { - private final Map values; - - public Aggregate() { - values = new TreeMap<>(); - } - - private Aggregate(Aggregate other) { - values = new TreeMap<>(other.values); - } - - @Override - public void add(Double value) { - values.compute(value, (ignoredValue, currentCount) -> currentCount == null ? 1 : currentCount + 1); - } - - @Override - public void remove(Double value) { - values.compute(value, (theValue, currentCount) -> { - if (currentCount == null || currentCount <= 0) { - throw new IllegalStateException("Invalid count %d for value %f".formatted(currentCount, theValue)); - } - return currentCount.equals(1) ? null : currentCount - 1; - }); - } - - @Override - public Double getResult() { - return values.entrySet() - .stream() - .mapToDouble(entry -> entry.getKey() * entry.getValue()) - .reduce(Double::sum) - .orElse(0d); - } - - @Override - public boolean isEmpty() { - return values.isEmpty(); - } - - @Override - public StatefulAggregate deepCopy() { - return new Aggregate(this); - } - - @Override - public boolean contains(Double value) { - return values.containsKey(value); - } - } -} diff --git a/subprojects/store-query/src/main/java/tools/refinery/store/query/term/real/RealTerms.java b/subprojects/store-query/src/main/java/tools/refinery/store/query/term/real/RealTerms.java deleted file mode 100644 index 79220358..00000000 --- a/subprojects/store-query/src/main/java/tools/refinery/store/query/term/real/RealTerms.java +++ /dev/null @@ -1,94 +0,0 @@ -/* - * SPDX-FileCopyrightText: 2021-2023 The Refinery Authors - * - * SPDX-License-Identifier: EPL-2.0 - */ -package tools.refinery.store.query.term.real; - -import tools.refinery.store.query.term.Aggregator; -import tools.refinery.store.query.term.ConstantTerm; -import tools.refinery.store.query.term.ExtremeValueAggregator; -import tools.refinery.store.query.term.Term; -import tools.refinery.store.query.term.comparable.*; - -import java.util.Comparator; - -public final class RealTerms { - public static final Aggregator REAL_SUM = RealSumAggregator.INSTANCE; - public static final Aggregator REAL_MIN = new ExtremeValueAggregator<>(Double.class, - Double.POSITIVE_INFINITY); - public static final Aggregator REAL_MAX = new ExtremeValueAggregator<>(Double.class, - Double.NEGATIVE_INFINITY, Comparator.reverseOrder()); - - private RealTerms() { - throw new IllegalArgumentException("This is a static utility class and should not be instantiated directly"); - } - - public static Term constant(Double value) { - return new ConstantTerm<>(Double.class, value); - } - - public static Term plus(Term body) { - return new RealPlusTerm(body); - } - - public static Term minus(Term body) { - return new RealMinusTerm(body); - } - - public static Term add(Term left, Term right) { - return new RealAddTerm(left, right); - } - - public static Term sub(Term left, Term right) { - return new RealSubTerm(left, right); - } - - public static Term mul(Term left, Term right) { - return new RealMulTerm(left, right); - } - - public static Term div(Term left, Term right) { - return new RealDivTerm(left, right); - } - - public static Term pow(Term left, Term right) { - return new RealPowTerm(left, right); - } - - public static Term min(Term left, Term right) { - return new RealMinTerm(left, right); - } - - public static Term max(Term left, Term right) { - return new RealMaxTerm(left, right); - } - - public static Term eq(Term left, Term right) { - return new EqTerm<>(Double.class, left, right); - } - - public static Term notEq(Term left, Term right) { - return new NotEqTerm<>(Double.class, left, right); - } - - public static Term less(Term left, Term right) { - return new LessTerm<>(Double.class, left, right); - } - - public static Term lessEq(Term left, Term right) { - return new LessEqTerm<>(Double.class, left, right); - } - - public static Term greater(Term left, Term right) { - return new GreaterTerm<>(Double.class, left, right); - } - - public static Term greaterEq(Term left, Term right) { - return new GreaterEqTerm<>(Double.class, left, right); - } - - public static Term asReal(Term body) { - return new IntToRealTerm(body); - } -} diff --git a/subprojects/store-query/src/main/java/tools/refinery/store/query/term/real/RealUnaryTerm.java b/subprojects/store-query/src/main/java/tools/refinery/store/query/term/real/RealUnaryTerm.java deleted file mode 100644 index d41c4ed9..00000000 --- a/subprojects/store-query/src/main/java/tools/refinery/store/query/term/real/RealUnaryTerm.java +++ /dev/null @@ -1,15 +0,0 @@ -/* - * SPDX-FileCopyrightText: 2021-2023 The Refinery Authors - * - * SPDX-License-Identifier: EPL-2.0 - */ -package tools.refinery.store.query.term.real; - -import tools.refinery.store.query.term.Term; -import tools.refinery.store.query.term.UnaryTerm; - -public abstract class RealUnaryTerm extends UnaryTerm { - protected RealUnaryTerm(Term body) { - super(Double.class, Double.class, body); - } -} diff --git a/subprojects/store-query/src/main/java/tools/refinery/store/query/term/uppercardinality/UpperCardinalityAddTerm.java b/subprojects/store-query/src/main/java/tools/refinery/store/query/term/uppercardinality/UpperCardinalityAddTerm.java deleted file mode 100644 index 68905f51..00000000 --- a/subprojects/store-query/src/main/java/tools/refinery/store/query/term/uppercardinality/UpperCardinalityAddTerm.java +++ /dev/null @@ -1,31 +0,0 @@ -/* - * SPDX-FileCopyrightText: 2021-2023 The Refinery Authors - * - * SPDX-License-Identifier: EPL-2.0 - */ -package tools.refinery.store.query.term.uppercardinality; - -import tools.refinery.store.query.substitution.Substitution; -import tools.refinery.store.query.term.Term; -import tools.refinery.store.representation.cardinality.UpperCardinality; - -public class UpperCardinalityAddTerm extends UpperCardinalityBinaryTerm { - protected UpperCardinalityAddTerm(Term left, Term right) { - super(left, right); - } - - @Override - protected UpperCardinality doEvaluate(UpperCardinality leftValue, UpperCardinality rightValue) { - return leftValue.add(rightValue); - } - - @Override - public Term doSubstitute(Substitution substitution, Term substitutedLeft, Term substitutedRight) { - return new UpperCardinalityAddTerm(substitutedLeft, substitutedRight); - } - - @Override - public String toString() { - return "(%s + %s)".formatted(getLeft(), getRight()); - } -} diff --git a/subprojects/store-query/src/main/java/tools/refinery/store/query/term/uppercardinality/UpperCardinalityBinaryTerm.java b/subprojects/store-query/src/main/java/tools/refinery/store/query/term/uppercardinality/UpperCardinalityBinaryTerm.java deleted file mode 100644 index 0cf8fe44..00000000 --- a/subprojects/store-query/src/main/java/tools/refinery/store/query/term/uppercardinality/UpperCardinalityBinaryTerm.java +++ /dev/null @@ -1,17 +0,0 @@ -/* - * SPDX-FileCopyrightText: 2021-2023 The Refinery Authors - * - * SPDX-License-Identifier: EPL-2.0 - */ -package tools.refinery.store.query.term.uppercardinality; - -import tools.refinery.store.query.term.BinaryTerm; -import tools.refinery.store.query.term.Term; -import tools.refinery.store.representation.cardinality.UpperCardinality; - -public abstract class UpperCardinalityBinaryTerm extends BinaryTerm { - protected UpperCardinalityBinaryTerm(Term left, Term right) { - super(UpperCardinality.class, UpperCardinality.class, UpperCardinality.class, left, right); - } -} diff --git a/subprojects/store-query/src/main/java/tools/refinery/store/query/term/uppercardinality/UpperCardinalityMaxTerm.java b/subprojects/store-query/src/main/java/tools/refinery/store/query/term/uppercardinality/UpperCardinalityMaxTerm.java deleted file mode 100644 index ff75f64e..00000000 --- a/subprojects/store-query/src/main/java/tools/refinery/store/query/term/uppercardinality/UpperCardinalityMaxTerm.java +++ /dev/null @@ -1,31 +0,0 @@ -/* - * SPDX-FileCopyrightText: 2021-2023 The Refinery Authors - * - * SPDX-License-Identifier: EPL-2.0 - */ -package tools.refinery.store.query.term.uppercardinality; - -import tools.refinery.store.query.substitution.Substitution; -import tools.refinery.store.query.term.Term; -import tools.refinery.store.representation.cardinality.UpperCardinality; - -public class UpperCardinalityMaxTerm extends UpperCardinalityBinaryTerm { - protected UpperCardinalityMaxTerm(Term left, Term right) { - super(left, right); - } - - @Override - protected UpperCardinality doEvaluate(UpperCardinality leftValue, UpperCardinality rightValue) { - return leftValue.max(rightValue); - } - - @Override - public Term doSubstitute(Substitution substitution, Term substitutedLeft, Term substitutedRight) { - return new UpperCardinalityMaxTerm(substitutedLeft, substitutedRight); - } - - @Override - public String toString() { - return "max(%s, %s)".formatted(getLeft(), getRight()); - } -} diff --git a/subprojects/store-query/src/main/java/tools/refinery/store/query/term/uppercardinality/UpperCardinalityMinTerm.java b/subprojects/store-query/src/main/java/tools/refinery/store/query/term/uppercardinality/UpperCardinalityMinTerm.java deleted file mode 100644 index 1e89e9f4..00000000 --- a/subprojects/store-query/src/main/java/tools/refinery/store/query/term/uppercardinality/UpperCardinalityMinTerm.java +++ /dev/null @@ -1,31 +0,0 @@ -/* - * SPDX-FileCopyrightText: 2021-2023 The Refinery Authors - * - * SPDX-License-Identifier: EPL-2.0 - */ -package tools.refinery.store.query.term.uppercardinality; - -import tools.refinery.store.query.substitution.Substitution; -import tools.refinery.store.query.term.Term; -import tools.refinery.store.representation.cardinality.UpperCardinality; - -public class UpperCardinalityMinTerm extends UpperCardinalityBinaryTerm { - protected UpperCardinalityMinTerm(Term left, Term right) { - super(left, right); - } - - @Override - protected UpperCardinality doEvaluate(UpperCardinality leftValue, UpperCardinality rightValue) { - return leftValue.min(rightValue); - } - - @Override - public Term doSubstitute(Substitution substitution, Term substitutedLeft, Term substitutedRight) { - return new UpperCardinalityMinTerm(substitutedLeft, substitutedRight); - } - - @Override - public String toString() { - return "min(%s, %s)".formatted(getLeft(), getRight()); - } -} diff --git a/subprojects/store-query/src/main/java/tools/refinery/store/query/term/uppercardinality/UpperCardinalityMulTerm.java b/subprojects/store-query/src/main/java/tools/refinery/store/query/term/uppercardinality/UpperCardinalityMulTerm.java deleted file mode 100644 index 3b4970f4..00000000 --- a/subprojects/store-query/src/main/java/tools/refinery/store/query/term/uppercardinality/UpperCardinalityMulTerm.java +++ /dev/null @@ -1,31 +0,0 @@ -/* - * SPDX-FileCopyrightText: 2021-2023 The Refinery Authors - * - * SPDX-License-Identifier: EPL-2.0 - */ -package tools.refinery.store.query.term.uppercardinality; - -import tools.refinery.store.query.substitution.Substitution; -import tools.refinery.store.query.term.Term; -import tools.refinery.store.representation.cardinality.UpperCardinality; - -public class UpperCardinalityMulTerm extends UpperCardinalityBinaryTerm { - protected UpperCardinalityMulTerm(Term left, Term right) { - super(left, right); - } - - @Override - protected UpperCardinality doEvaluate(UpperCardinality leftValue, UpperCardinality rightValue) { - return leftValue.multiply(rightValue); - } - - @Override - public Term doSubstitute(Substitution substitution, Term substitutedLeft, Term substitutedRight) { - return new UpperCardinalityMulTerm(substitutedLeft, substitutedRight); - } - - @Override - public String toString() { - return "(%s * %s)".formatted(getLeft(), getRight()); - } -} diff --git a/subprojects/store-query/src/main/java/tools/refinery/store/query/term/uppercardinality/UpperCardinalitySumAggregator.java b/subprojects/store-query/src/main/java/tools/refinery/store/query/term/uppercardinality/UpperCardinalitySumAggregator.java deleted file mode 100644 index d31f00a2..00000000 --- a/subprojects/store-query/src/main/java/tools/refinery/store/query/term/uppercardinality/UpperCardinalitySumAggregator.java +++ /dev/null @@ -1,86 +0,0 @@ -/* - * SPDX-FileCopyrightText: 2021-2023 The Refinery Authors - * - * SPDX-License-Identifier: EPL-2.0 - */ -package tools.refinery.store.query.term.uppercardinality; - -import tools.refinery.store.query.term.StatefulAggregate; -import tools.refinery.store.query.term.StatefulAggregator; -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; - -public class UpperCardinalitySumAggregator implements StatefulAggregator { - public static final UpperCardinalitySumAggregator INSTANCE = new UpperCardinalitySumAggregator(); - - private UpperCardinalitySumAggregator() { - } - - @Override - public Class getResultType() { - return UpperCardinality.class; - } - - @Override - public Class getInputType() { - return UpperCardinality.class; - } - - @Override - public StatefulAggregate createEmptyAggregate() { - return new Aggregate(); - } - - private static class Aggregate implements StatefulAggregate { - private int sumFiniteUpperBounds; - private int countUnbounded; - - public Aggregate() { - this(0, 0); - } - - private Aggregate(int sumFiniteUpperBounds, int countUnbounded) { - this.sumFiniteUpperBounds = sumFiniteUpperBounds; - this.countUnbounded = countUnbounded; - } - - @Override - public void add(UpperCardinality value) { - if (value instanceof FiniteUpperCardinality finiteUpperCardinality) { - sumFiniteUpperBounds += finiteUpperCardinality.finiteUpperBound(); - } else if (value instanceof UnboundedUpperCardinality) { - countUnbounded += 1; - } else { - throw new IllegalArgumentException("Unknown UpperCardinality: " + value); - } - } - - @Override - public void remove(UpperCardinality value) { - if (value instanceof FiniteUpperCardinality finiteUpperCardinality) { - sumFiniteUpperBounds -= finiteUpperCardinality.finiteUpperBound(); - } else if (value instanceof UnboundedUpperCardinality) { - countUnbounded -= 1; - } else { - throw new IllegalArgumentException("Unknown UpperCardinality: " + value); - } - } - - @Override - public UpperCardinality getResult() { - return countUnbounded > 0 ? UpperCardinalities.UNBOUNDED : UpperCardinalities.atMost(sumFiniteUpperBounds); - } - - @Override - public boolean isEmpty() { - return sumFiniteUpperBounds == 0 && countUnbounded == 0; - } - - @Override - public StatefulAggregate deepCopy() { - return new Aggregate(sumFiniteUpperBounds, countUnbounded); - } - } -} diff --git a/subprojects/store-query/src/main/java/tools/refinery/store/query/term/uppercardinality/UpperCardinalityTerms.java b/subprojects/store-query/src/main/java/tools/refinery/store/query/term/uppercardinality/UpperCardinalityTerms.java deleted file mode 100644 index 13914f2d..00000000 --- a/subprojects/store-query/src/main/java/tools/refinery/store/query/term/uppercardinality/UpperCardinalityTerms.java +++ /dev/null @@ -1,73 +0,0 @@ -/* - * SPDX-FileCopyrightText: 2021-2023 The Refinery Authors - * - * SPDX-License-Identifier: EPL-2.0 - */ -package tools.refinery.store.query.term.uppercardinality; - -import tools.refinery.store.query.term.Aggregator; -import tools.refinery.store.query.term.ConstantTerm; -import tools.refinery.store.query.term.ExtremeValueAggregator; -import tools.refinery.store.query.term.Term; -import tools.refinery.store.query.term.comparable.*; -import tools.refinery.store.representation.cardinality.UpperCardinalities; -import tools.refinery.store.representation.cardinality.UpperCardinality; - -import java.util.Comparator; - -public final class UpperCardinalityTerms { - public static final Aggregator UPPER_CARDINALITY_SUM = - UpperCardinalitySumAggregator.INSTANCE; - public static final Aggregator UPPER_CARDINALITY_MIN = - new ExtremeValueAggregator<>(UpperCardinality.class, UpperCardinalities.UNBOUNDED); - public static final Aggregator UPPER_CARDINALITY_MAX = - new ExtremeValueAggregator<>(UpperCardinality.class, UpperCardinalities.ZERO, Comparator.reverseOrder()); - - private UpperCardinalityTerms() { - throw new IllegalStateException("This is a static utility class and should not be instantiated directly"); - } - - public static Term constant(UpperCardinality value) { - return new ConstantTerm<>(UpperCardinality.class, value); - } - - public static Term add(Term left, Term right) { - return new UpperCardinalityAddTerm(left, right); - } - - public static Term mul(Term left, Term right) { - return new UpperCardinalityMulTerm(left, right); - } - - public static Term min(Term left, Term right) { - return new UpperCardinalityMinTerm(left, right); - } - - public static Term max(Term left, Term right) { - return new UpperCardinalityMaxTerm(left, right); - } - - public static Term eq(Term left, Term right) { - return new EqTerm<>(UpperCardinality.class, left, right); - } - - public static Term notEq(Term left, Term right) { - return new NotEqTerm<>(UpperCardinality.class, left, right); - } - - public static Term less(Term left, Term right) { - return new LessTerm<>(UpperCardinality.class, left, right); - } - - public static Term lessEq(Term left, Term right) { - return new LessEqTerm<>(UpperCardinality.class, left, right); - } - - public static Term greater(Term left, Term right) { - return new GreaterTerm<>(UpperCardinality.class, left, right); - } - - public static Term greaterEq(Term left, Term right) { - return new GreaterEqTerm<>(UpperCardinality.class, left, right); - } -} diff --git a/subprojects/store-query/src/main/java/tools/refinery/store/query/valuation/MapBasedValuation.java b/subprojects/store-query/src/main/java/tools/refinery/store/query/valuation/MapBasedValuation.java deleted file mode 100644 index 261ceaa5..00000000 --- a/subprojects/store-query/src/main/java/tools/refinery/store/query/valuation/MapBasedValuation.java +++ /dev/null @@ -1,22 +0,0 @@ -/* - * SPDX-FileCopyrightText: 2021-2023 The Refinery Authors - * - * SPDX-License-Identifier: EPL-2.0 - */ -package tools.refinery.store.query.valuation; - -import tools.refinery.store.query.term.AnyDataVariable; -import tools.refinery.store.query.term.DataVariable; - -import java.util.Map; - -record MapBasedValuation(Map values) implements Valuation { - @Override - public T getValue(DataVariable variable) { - if (!values.containsKey(variable)) { - throw new IllegalArgumentException("No value for variable %s".formatted(variable)); - } - var value = values.get(variable); - return variable.getType().cast(value); - } -} diff --git a/subprojects/store-query/src/main/java/tools/refinery/store/query/valuation/RestrictedValuation.java b/subprojects/store-query/src/main/java/tools/refinery/store/query/valuation/RestrictedValuation.java deleted file mode 100644 index fc8406aa..00000000 --- a/subprojects/store-query/src/main/java/tools/refinery/store/query/valuation/RestrictedValuation.java +++ /dev/null @@ -1,21 +0,0 @@ -/* - * SPDX-FileCopyrightText: 2021-2023 The Refinery Authors - * - * SPDX-License-Identifier: EPL-2.0 - */ -package tools.refinery.store.query.valuation; - -import tools.refinery.store.query.term.AnyDataVariable; -import tools.refinery.store.query.term.DataVariable; - -import java.util.Set; - -public record RestrictedValuation(Valuation valuation, Set allowedVariables) implements Valuation { - @Override - public T getValue(DataVariable variable) { - if (!allowedVariables.contains(variable)) { - throw new IllegalArgumentException("Variable %s is not in scope".formatted(variable)); - } - return valuation.getValue(variable); - } -} diff --git a/subprojects/store-query/src/main/java/tools/refinery/store/query/valuation/SubstitutedValuation.java b/subprojects/store-query/src/main/java/tools/refinery/store/query/valuation/SubstitutedValuation.java deleted file mode 100644 index 1c14112c..00000000 --- a/subprojects/store-query/src/main/java/tools/refinery/store/query/valuation/SubstitutedValuation.java +++ /dev/null @@ -1,16 +0,0 @@ -/* - * SPDX-FileCopyrightText: 2021-2023 The Refinery Authors - * - * SPDX-License-Identifier: EPL-2.0 - */ -package tools.refinery.store.query.valuation; - -import tools.refinery.store.query.substitution.Substitution; -import tools.refinery.store.query.term.DataVariable; - -public record SubstitutedValuation(Valuation originalValuation, Substitution substitution) implements Valuation { - @Override - public T getValue(DataVariable variable) { - return originalValuation.getValue(substitution.getTypeSafeSubstitute(variable)); - } -} diff --git a/subprojects/store-query/src/main/java/tools/refinery/store/query/valuation/Valuation.java b/subprojects/store-query/src/main/java/tools/refinery/store/query/valuation/Valuation.java deleted file mode 100644 index 1588e957..00000000 --- a/subprojects/store-query/src/main/java/tools/refinery/store/query/valuation/Valuation.java +++ /dev/null @@ -1,37 +0,0 @@ -/* - * SPDX-FileCopyrightText: 2021-2023 The Refinery Authors - * - * SPDX-License-Identifier: EPL-2.0 - */ -package tools.refinery.store.query.valuation; - -import org.jetbrains.annotations.Nullable; -import tools.refinery.store.query.substitution.Substitution; -import tools.refinery.store.query.term.AnyDataVariable; -import tools.refinery.store.query.term.DataVariable; - -import java.util.Map; -import java.util.Set; - -public interface Valuation { - T getValue(DataVariable variable); - - default Valuation substitute(@Nullable Substitution substitution) { - if (substitution == null) { - return this; - } - return new SubstitutedValuation(this, substitution); - } - - default Valuation restrict(Set allowedVariables) { - return new RestrictedValuation(this, Set.copyOf(allowedVariables)); - } - - static ValuationBuilder builder() { - return new ValuationBuilder(); - } - - static Valuation empty() { - return new MapBasedValuation(Map.of()); - } -} diff --git a/subprojects/store-query/src/main/java/tools/refinery/store/query/valuation/ValuationBuilder.java b/subprojects/store-query/src/main/java/tools/refinery/store/query/valuation/ValuationBuilder.java deleted file mode 100644 index 7337dbc3..00000000 --- a/subprojects/store-query/src/main/java/tools/refinery/store/query/valuation/ValuationBuilder.java +++ /dev/null @@ -1,40 +0,0 @@ -/* - * SPDX-FileCopyrightText: 2021-2023 The Refinery Authors - * - * SPDX-License-Identifier: EPL-2.0 - */ -package tools.refinery.store.query.valuation; - -import tools.refinery.store.query.term.AnyDataVariable; -import tools.refinery.store.query.term.DataVariable; - -import java.util.Collections; -import java.util.HashMap; -import java.util.Map; - -public class ValuationBuilder { - private final Map values = new HashMap<>(); - - ValuationBuilder() { - } - - public ValuationBuilder put(DataVariable variable, T value) { - return putChecked(variable, value); - } - - public ValuationBuilder putChecked(AnyDataVariable variable, Object value) { - if (value != null && !variable.getType().isInstance(value)) { - throw new IllegalArgumentException("Value %s is not an instance of %s" - .formatted(value, variable.getType().getName())); - } - if (values.containsKey(variable)) { - throw new IllegalArgumentException("Already has value for variable %s".formatted(variable)); - } - values.put(variable, value); - return this; - } - - public Valuation build() { - return new MapBasedValuation(Collections.unmodifiableMap(values)); - } -} diff --git a/subprojects/store-query/src/main/java/tools/refinery/store/query/view/AbstractFunctionView.java b/subprojects/store-query/src/main/java/tools/refinery/store/query/view/AbstractFunctionView.java index f130fa59..d9809991 100644 --- a/subprojects/store-query/src/main/java/tools/refinery/store/query/view/AbstractFunctionView.java +++ b/subprojects/store-query/src/main/java/tools/refinery/store/query/view/AbstractFunctionView.java @@ -7,8 +7,8 @@ package tools.refinery.store.query.view; import tools.refinery.store.map.CursorAsIterator; import tools.refinery.store.model.Model; -import tools.refinery.store.query.dnf.FunctionalDependency; -import tools.refinery.store.query.term.Parameter; +import tools.refinery.logic.dnf.FunctionalDependency; +import tools.refinery.logic.term.Parameter; import tools.refinery.store.representation.Symbol; import tools.refinery.store.tuple.Tuple; import tools.refinery.store.tuple.Tuple1; diff --git a/subprojects/store-query/src/main/java/tools/refinery/store/query/view/AnySymbolView.java b/subprojects/store-query/src/main/java/tools/refinery/store/query/view/AnySymbolView.java index 7e9bf6df..b01c3988 100644 --- a/subprojects/store-query/src/main/java/tools/refinery/store/query/view/AnySymbolView.java +++ b/subprojects/store-query/src/main/java/tools/refinery/store/query/view/AnySymbolView.java @@ -5,10 +5,10 @@ */ package tools.refinery.store.query.view; +import tools.refinery.logic.dnf.FunctionalDependency; import tools.refinery.store.model.Model; -import tools.refinery.store.query.dnf.FunctionalDependency; +import tools.refinery.logic.Constraint; import tools.refinery.store.representation.AnySymbol; -import tools.refinery.store.query.Constraint; import java.util.Set; diff --git a/subprojects/store-query/src/main/java/tools/refinery/store/query/view/FilteredView.java b/subprojects/store-query/src/main/java/tools/refinery/store/query/view/FilteredView.java index 924277ed..7ce07442 100644 --- a/subprojects/store-query/src/main/java/tools/refinery/store/query/view/FilteredView.java +++ b/subprojects/store-query/src/main/java/tools/refinery/store/query/view/FilteredView.java @@ -5,7 +5,7 @@ */ package tools.refinery.store.query.view; -import tools.refinery.store.query.InvalidQueryException; +import tools.refinery.logic.InvalidQueryException; import tools.refinery.store.tuple.Tuple; import tools.refinery.store.representation.Symbol; diff --git a/subprojects/store-query/src/main/java/tools/refinery/store/query/view/ForbiddenView.java b/subprojects/store-query/src/main/java/tools/refinery/store/query/view/ForbiddenView.java index c312330e..8323ace7 100644 --- a/subprojects/store-query/src/main/java/tools/refinery/store/query/view/ForbiddenView.java +++ b/subprojects/store-query/src/main/java/tools/refinery/store/query/view/ForbiddenView.java @@ -6,7 +6,7 @@ package tools.refinery.store.query.view; import tools.refinery.store.representation.Symbol; -import tools.refinery.store.representation.TruthValue; +import tools.refinery.logic.term.truthvalue.TruthValue; import tools.refinery.store.tuple.Tuple; public class ForbiddenView extends TuplePreservingView { 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 3dfb6777..5585f5f2 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,7 +5,7 @@ */ package tools.refinery.store.query.view; -import tools.refinery.store.query.term.*; +import tools.refinery.logic.term.*; import tools.refinery.store.representation.Symbol; import java.util.ArrayList; diff --git a/subprojects/store-query/src/main/java/tools/refinery/store/query/view/MayView.java b/subprojects/store-query/src/main/java/tools/refinery/store/query/view/MayView.java index c322e220..3a6cc93b 100644 --- a/subprojects/store-query/src/main/java/tools/refinery/store/query/view/MayView.java +++ b/subprojects/store-query/src/main/java/tools/refinery/store/query/view/MayView.java @@ -6,7 +6,7 @@ package tools.refinery.store.query.view; import tools.refinery.store.representation.Symbol; -import tools.refinery.store.representation.TruthValue; +import tools.refinery.logic.term.truthvalue.TruthValue; import tools.refinery.store.tuple.Tuple; public class MayView extends TuplePreservingView { diff --git a/subprojects/store-query/src/main/java/tools/refinery/store/query/view/MustView.java b/subprojects/store-query/src/main/java/tools/refinery/store/query/view/MustView.java index 65bb4e4c..af984327 100644 --- a/subprojects/store-query/src/main/java/tools/refinery/store/query/view/MustView.java +++ b/subprojects/store-query/src/main/java/tools/refinery/store/query/view/MustView.java @@ -6,7 +6,7 @@ package tools.refinery.store.query.view; import tools.refinery.store.representation.Symbol; -import tools.refinery.store.representation.TruthValue; +import tools.refinery.logic.term.truthvalue.TruthValue; import tools.refinery.store.tuple.Tuple; public class MustView extends TuplePreservingView { diff --git a/subprojects/store-query/src/main/java/tools/refinery/store/query/view/NodeFunctionView.java b/subprojects/store-query/src/main/java/tools/refinery/store/query/view/NodeFunctionView.java index fcf11506..01865cbe 100644 --- a/subprojects/store-query/src/main/java/tools/refinery/store/query/view/NodeFunctionView.java +++ b/subprojects/store-query/src/main/java/tools/refinery/store/query/view/NodeFunctionView.java @@ -5,7 +5,7 @@ */ package tools.refinery.store.query.view; -import tools.refinery.store.query.term.Parameter; +import tools.refinery.logic.term.Parameter; import tools.refinery.store.representation.Symbol; import tools.refinery.store.tuple.Tuple1; diff --git a/subprojects/store-query/src/main/java/tools/refinery/store/query/view/TuplePreservingView.java b/subprojects/store-query/src/main/java/tools/refinery/store/query/view/TuplePreservingView.java index ed12cd9d..6841488d 100644 --- a/subprojects/store-query/src/main/java/tools/refinery/store/query/view/TuplePreservingView.java +++ b/subprojects/store-query/src/main/java/tools/refinery/store/query/view/TuplePreservingView.java @@ -7,7 +7,7 @@ package tools.refinery.store.query.view; import tools.refinery.store.map.CursorAsIterator; import tools.refinery.store.model.Model; -import tools.refinery.store.query.term.Parameter; +import tools.refinery.logic.term.Parameter; import tools.refinery.store.representation.Symbol; import tools.refinery.store.tuple.Tuple; import tools.refinery.store.tuple.Tuple1; 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 deleted file mode 100644 index 6a2dc0c7..00000000 --- a/subprojects/store-query/src/test/java/tools/refinery/store/query/dnf/DnfBuilderLiteralEliminationTest.java +++ /dev/null @@ -1,259 +0,0 @@ -/* - * SPDX-FileCopyrightText: 2021-2023 The Refinery Authors - * - * SPDX-License-Identifier: EPL-2.0 - */ -package tools.refinery.store.query.dnf; - -import org.junit.jupiter.api.Test; -import org.junit.jupiter.params.ParameterizedTest; -import org.junit.jupiter.params.provider.CsvSource; -import tools.refinery.store.query.literal.BooleanLiteral; -import tools.refinery.store.query.term.NodeVariable; -import tools.refinery.store.query.term.ParameterDirection; -import tools.refinery.store.query.term.Variable; -import tools.refinery.store.query.term.bool.BoolTerms; -import tools.refinery.store.query.view.KeyOnlyView; -import tools.refinery.store.query.view.SymbolView; -import tools.refinery.store.representation.Symbol; - -import java.util.List; - -import static org.hamcrest.MatcherAssert.assertThat; -import static tools.refinery.store.query.literal.Literals.check; -import static tools.refinery.store.query.literal.Literals.not; -import static tools.refinery.store.query.tests.QueryMatchers.structurallyEqualTo; - -class DnfBuilderLiteralEliminationTest { - private final Symbol friend = Symbol.of("friend", 2); - private final SymbolView friendView = new KeyOnlyView<>(friend); - private final NodeVariable p = Variable.of("p"); - private final NodeVariable q = Variable.of("q"); - private final Dnf trueDnf = Dnf.builder().parameter(p, ParameterDirection.IN).clause().build(); - private final Dnf falseDnf = Dnf.builder().parameter(p).build(); - - @Test - void eliminateTrueTest() { - var actual = Dnf.builder() - .parameters(p, q) - .clause(BooleanLiteral.TRUE, friendView.call(p, q)) - .build(); - var expected = Dnf.builder().parameters(p, q).clause(friendView.call(p, q)).build(); - - assertThat(actual, structurallyEqualTo(expected)); - } - - @Test - void eliminateTrueAssumptionTest() { - var actual = Dnf.builder() - .parameters(p, q) - .clause(check(BoolTerms.constant(true)), friendView.call(p, q)) - .build(); - var expected = Dnf.builder().parameters(p, q).clause(friendView.call(p, q)).build(); - - assertThat(actual, structurallyEqualTo(expected)); - } - - @Test - void eliminateFalseTest() { - var actual = Dnf.builder() - .parameters(p, q) - .clause(friendView.call(p, q)) - .clause(friendView.call(q, p), BooleanLiteral.FALSE) - .build(); - var expected = Dnf.builder().parameters(p, q).clause(friendView.call(p, q)).build(); - - assertThat(actual, structurallyEqualTo(expected)); - } - - @ParameterizedTest - @CsvSource(value = { - "false", - "null" - }, nullValues = "null") - void eliminateFalseAssumptionTest(Boolean value) { - var actual = Dnf.builder() - .parameters(p, q) - .clause(friendView.call(p, q)) - .clause(friendView.call(q, p), check(BoolTerms.constant(value))) - .build(); - var expected = Dnf.builder().parameters(p, q).clause(friendView.call(p, q)).build(); - - assertThat(actual, structurallyEqualTo(expected)); - } - - @Test - void alwaysTrueTest() { - var actual = Dnf.builder() - .parameters(List.of(p, q), ParameterDirection.IN) - .clause(friendView.call(p, q)) - .clause(BooleanLiteral.TRUE) - .build(); - var expected = Dnf.builder().parameters(List.of(p, q), ParameterDirection.IN).clause().build(); - - assertThat(actual, structurallyEqualTo(expected)); - } - - @Test - void alwaysFalseTest() { - var actual = Dnf.builder() - .parameters(p, q) - .clause(friendView.call(p, q), BooleanLiteral.FALSE) - .build(); - var expected = Dnf.builder().parameters(p, q).build(); - - assertThat(actual, structurallyEqualTo(expected)); - } - - @Test - void eliminateTrueDnfTest() { - var actual = Dnf.builder() - .parameters(p, q) - .clause(trueDnf.call(q), friendView.call(p, q)) - .build(); - var expected = Dnf.builder().parameters(p, q).clause(friendView.call(p, q)).build(); - - assertThat(actual, structurallyEqualTo(expected)); - } - - @Test - void eliminateFalseDnfTest() { - var actual = Dnf.builder() - .parameters(p, q) - .clause(friendView.call(p, q)) - .clause(friendView.call(q, p), falseDnf.call(q)) - .build(); - var expected = Dnf.builder().parameters(p, q).clause(friendView.call(p, q)).build(); - - assertThat(actual, structurallyEqualTo(expected)); - } - - @Test - void alwaysTrueDnfTest() { - var actual = Dnf.builder() - .parameters(List.of(p, q), ParameterDirection.IN) - .clause(friendView.call(p, q)) - .clause(trueDnf.call(q)) - .build(); - var expected = Dnf.builder().parameters(List.of(p, q), ParameterDirection.IN).clause().build(); - - assertThat(actual, structurallyEqualTo(expected)); - } - - @Test - void alwaysFalseDnfTest() { - var actual = Dnf.builder() - .parameters(p, q) - .clause(friendView.call(p, q), falseDnf.call(q)) - .build(); - var expected = Dnf.builder().parameters(p, q).build(); - - assertThat(actual, structurallyEqualTo(expected)); - } - - @Test - void eliminateNotFalseDnfTest() { - var actual = Dnf.builder() - .parameters(p, q) - .clause(not(falseDnf.call(q)), friendView.call(p, q)) - .build(); - var expected = Dnf.builder().parameters(p, q).clause(friendView.call(p, q)).build(); - - assertThat(actual, structurallyEqualTo(expected)); - } - - @Test - void eliminateNotTrueDnfTest() { - var actual = Dnf.builder() - .parameters(p, q) - .clause(friendView.call(p, q)) - .clause(friendView.call(q, p), not(trueDnf.call(q))) - .build(); - var expected = Dnf.builder().parameters(p, q).clause(friendView.call(p, q)).build(); - - assertThat(actual, structurallyEqualTo(expected)); - } - - @Test - void alwaysNotFalseDnfTest() { - var actual = Dnf.builder() - .parameters(List.of(p, q), ParameterDirection.IN) - .clause(friendView.call(p, q)) - .clause(not(falseDnf.call(q))) - .build(); - var expected = Dnf.builder().parameters(List.of(p, q), ParameterDirection.IN).clause().build(); - - assertThat(actual, structurallyEqualTo(expected)); - } - - @Test - void alwaysNotTrueDnfTest() { - var actual = Dnf.builder() - .parameters(p, q) - .clause(friendView.call(p, q), not(trueDnf.call(q))) - .build(); - var expected = Dnf.builder().parameters(p, q).build(); - - assertThat(actual, structurallyEqualTo(expected)); - } - - @Test - void removeDuplicateTest() { - var actual = Dnf.of(builder -> builder.clause((p, q) -> List.of( - friendView.call(p, q), - friendView.call(p, q) - ))); - var expected = Dnf.of(builder -> builder.clause((p, q) -> List.of(friendView.call(p, q)))); - - assertThat(actual, structurallyEqualTo(expected)); - } - - @Test - void removeContradictoryTest() { - var actual = Dnf.of(builder -> builder.clause((p, q) -> List.of( - friendView.call(p, q), - not(friendView.call(p, q)) - ))); - var expected = Dnf.builder().build(); - - assertThat(actual, structurallyEqualTo(expected)); - } - - @Test - void removeContradictoryUniversalTest() { - var actual = Dnf.of(builder -> builder.clause((p, q) -> List.of( - friendView.call(q, q), - friendView.call(p, q), - not(friendView.call(p, Variable.of())) - ))); - var expected = Dnf.builder().build(); - - assertThat(actual, structurallyEqualTo(expected)); - } - - @Test - void removeContradictoryExistentialUniversalTest() { - var actual = Dnf.of(builder -> builder.clause((p) -> List.of( - friendView.call(p, Variable.of()), - not(friendView.call(p, Variable.of())) - ))); - var expected = Dnf.builder().build(); - - assertThat(actual, structurallyEqualTo(expected)); - } - - @Test - void removeContradictoryUniversalParameterTest() { - var actual = Dnf.of(builder -> { - var p = builder.parameter("p"); - builder.clause((q) -> List.of( - friendView.call(q, q), - friendView.call(p, q), - not(friendView.call(p, Variable.of())) - )); - }); - var expected = Dnf.builder().parameter(p).build(); - - assertThat(actual, structurallyEqualTo(expected)); - } -} 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 deleted file mode 100644 index fc40c7b3..00000000 --- a/subprojects/store-query/src/test/java/tools/refinery/store/query/dnf/DnfBuilderVariableUnificationTest.java +++ /dev/null @@ -1,325 +0,0 @@ -/* - * SPDX-FileCopyrightText: 2021-2023 The Refinery Authors - * - * SPDX-License-Identifier: EPL-2.0 - */ -package tools.refinery.store.query.dnf; - -import org.junit.jupiter.api.Test; -import tools.refinery.store.query.term.ParameterDirection; -import tools.refinery.store.query.term.Variable; -import tools.refinery.store.query.view.KeyOnlyView; -import tools.refinery.store.query.view.SymbolView; -import tools.refinery.store.representation.Symbol; - -import java.util.List; - -import static org.hamcrest.MatcherAssert.assertThat; -import static tools.refinery.store.query.tests.QueryMatchers.structurallyEqualTo; - -class DnfBuilderVariableUnificationTest { - private final Symbol friend = Symbol.of("friend", 2); - private final Symbol children = Symbol.of("children", 2); - private final SymbolView friendView = new KeyOnlyView<>(friend); - private final SymbolView childrenView = new KeyOnlyView<>(children); - - @Test - void equalToParameterTest() { - var actual = Dnf.of(builder -> { - var p = builder.parameter("p"); - builder.clause(q -> List.of( - friendView.call(p, q), - p.isEquivalent(q) - )); - }); - - var expectedP = Variable.of("p"); - assertThat(actual, structurallyEqualTo( - List.of(new SymbolicParameter(expectedP, ParameterDirection.OUT)), - List.of( - List.of(friendView.call(expectedP, expectedP)) - ) - )); - } - - @Test - void equalToParameterReverseTest() { - var actual = Dnf.of(builder -> { - var p = builder.parameter("p"); - builder.clause(q -> List.of( - friendView.call(p, q), - q.isEquivalent(p) - )); - }); - - var expectedP = Variable.of("p"); - assertThat(actual, structurallyEqualTo( - List.of(new SymbolicParameter(expectedP, ParameterDirection.OUT)), - List.of( - List.of(friendView.call(expectedP, expectedP)) - ) - )); - } - - @Test - void equalQuantifiedTest() { - var actual = Dnf.of(builder -> builder.clause((p, q) -> List.of( - friendView.call(p, q), - p.isEquivalent(q) - ))); - - var expectedP = Variable.of("p"); - assertThat(actual, structurallyEqualTo( - List.of(), - List.of( - List.of(friendView.call(expectedP, expectedP)) - ) - )); - } - - @Test - void equalQuantifiedTransitiveTest() { - var actual = Dnf.of(builder -> builder.clause((p, q, r) -> List.of( - friendView.call(p, q), - p.isEquivalent(q), - childrenView.call(p, r), - q.isEquivalent(r) - ))); - - var expectedP = Variable.of("p"); - assertThat(actual, structurallyEqualTo( - List.of(), - List.of( - List.of(friendView.call(expectedP, expectedP), childrenView.call(expectedP, expectedP)) - ) - )); - } - - @Test - void equalQuantifiedTransitiveRemoveDuplicateTest() { - var actual = Dnf.of(builder -> builder.clause((p, q, r) -> List.of( - friendView.call(p, q), - p.isEquivalent(q), - friendView.call(p, r), - q.isEquivalent(r) - ))); - - var expectedP = Variable.of("p"); - assertThat(actual, structurallyEqualTo( - List.of(), - List.of( - List.of(friendView.call(expectedP, expectedP)) - ) - )); - } - - @Test - void parametersEqualTest() { - var actual = Dnf.of(builder -> { - var p = builder.parameter("p"); - var q = builder.parameter("q"); - builder.clause( - friendView.call(p, q), - p.isEquivalent(q) - ); - }); - - var expectedP = Variable.of("p"); - var expectedQ = Variable.of("q"); - assertThat(actual, structurallyEqualTo( - List.of( - new SymbolicParameter(expectedP, ParameterDirection.OUT), - new SymbolicParameter(expectedQ, ParameterDirection.OUT) - ), - List.of( - List.of(friendView.call(expectedP, expectedP), expectedQ.isEquivalent(expectedP)) - ) - )); - } - - @Test - void parametersEqualTransitiveTest() { - var actual = Dnf.of(builder -> { - var p = builder.parameter("p"); - var q = builder.parameter("q"); - var r = builder.parameter("r"); - builder.clause( - friendView.call(p, q), - childrenView.call(p, r), - p.isEquivalent(q), - r.isEquivalent(q) - ); - }); - - var expectedP = Variable.of("p"); - var expectedQ = Variable.of("q"); - var expectedR = Variable.of("r"); - assertThat(actual, structurallyEqualTo( - List.of( - new SymbolicParameter(expectedP, ParameterDirection.OUT), - new SymbolicParameter(expectedQ, ParameterDirection.OUT), - new SymbolicParameter(expectedR, ParameterDirection.OUT) - ), - List.of( - List.of( - friendView.call(expectedP, expectedP), - expectedQ.isEquivalent(expectedP), - expectedR.isEquivalent(expectedP), - childrenView.call(expectedP, expectedP) - ) - ) - )); - } - - @Test - void parameterAndQuantifiedEqualsTest() { - var actual = Dnf.of(builder -> { - var p = builder.parameter("p"); - var q = builder.parameter("q"); - builder.clause((r) -> List.of( - friendView.call(p, r), - p.isEquivalent(r), - childrenView.call(q, r), - q.isEquivalent(r) - )); - }); - - - var expectedP = Variable.of("p"); - var expectedQ = Variable.of("q"); - assertThat(actual, structurallyEqualTo( - List.of( - new SymbolicParameter(expectedP, ParameterDirection.OUT), - new SymbolicParameter(expectedQ, ParameterDirection.OUT) - ), - List.of( - List.of( - friendView.call(expectedP, expectedP), - expectedQ.isEquivalent(expectedP), - childrenView.call(expectedP, expectedP) - ) - ) - )); - } - - @Test - void parameterAndQuantifiedEqualsReverseFirstTest() { - var actual = Dnf.of(builder -> { - var p = builder.parameter("p"); - var q = builder.parameter("q"); - builder.clause((r) -> List.of( - friendView.call(p, r), - r.isEquivalent(p), - childrenView.call(q, r), - q.isEquivalent(r) - )); - }); - - var expectedP = Variable.of("p"); - var expectedQ = Variable.of("q"); - assertThat(actual, structurallyEqualTo( - List.of( - new SymbolicParameter(expectedP, ParameterDirection.OUT), - new SymbolicParameter(expectedQ, ParameterDirection.OUT) - ), - List.of( - List.of( - friendView.call(expectedP, expectedP), - expectedQ.isEquivalent(expectedP), - childrenView.call(expectedP, expectedP) - ) - ) - )); - } - - @Test - void parameterAndQuantifiedEqualsReverseSecondTest() { - var actual = Dnf.of(builder -> { - var p = builder.parameter("p"); - var q = builder.parameter("q"); - builder.clause((r) -> List.of( - friendView.call(p, r), - p.isEquivalent(r), - childrenView.call(q, r), - r.isEquivalent(q) - )); - }); - - var expectedP = Variable.of("p"); - var expectedQ = Variable.of("q"); - assertThat(actual, structurallyEqualTo( - List.of( - new SymbolicParameter(expectedP, ParameterDirection.OUT), - new SymbolicParameter(expectedQ, ParameterDirection.OUT) - ), - List.of( - List.of( - friendView.call(expectedP, expectedP), - expectedQ.isEquivalent(expectedP), - childrenView.call(expectedP, expectedP) - ) - ) - )); - } - - @Test - void parameterAndQuantifiedEqualsReverseBoth() { - var actual = Dnf.of(builder -> { - var p = builder.parameter("p"); - var q = builder.parameter("q"); - builder.clause((r) -> List.of( - friendView.call(p, r), - p.isEquivalent(r), - childrenView.call(q, r), - r.isEquivalent(q) - )); - }); - - var expectedP = Variable.of("p"); - var expectedQ = Variable.of("q"); - assertThat(actual, structurallyEqualTo( - List.of( - new SymbolicParameter(expectedP, ParameterDirection.OUT), - new SymbolicParameter(expectedQ, ParameterDirection.OUT) - ), - List.of( - List.of( - friendView.call(expectedP, expectedP), - expectedQ.isEquivalent(expectedP), - childrenView.call(expectedP, expectedP) - ) - ) - )); - } - - @Test - void parameterAndTwoQuantifiedEqualsTest() { - var actual = Dnf.of(builder -> { - var p = builder.parameter("p"); - var q = builder.parameter("q"); - builder.clause((r, s) -> List.of( - r.isEquivalent(s), - friendView.call(p, r), - p.isEquivalent(r), - childrenView.call(q, s), - q.isEquivalent(s) - )); - }); - - var expectedP = Variable.of("p"); - var expectedQ = Variable.of("q"); - assertThat(actual, structurallyEqualTo( - List.of( - new SymbolicParameter(expectedP, ParameterDirection.OUT), - new SymbolicParameter(expectedQ, ParameterDirection.OUT) - ), - List.of( - List.of( - friendView.call(expectedP, expectedP), - expectedQ.isEquivalent(expectedP), - childrenView.call(expectedP, expectedP) - ) - ) - )); - } -} 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 deleted file mode 100644 index 12cfaa4e..00000000 --- a/subprojects/store-query/src/test/java/tools/refinery/store/query/dnf/DnfToDefinitionStringTest.java +++ /dev/null @@ -1,157 +0,0 @@ -/* - * SPDX-FileCopyrightText: 2021-2023 The Refinery Authors - * - * SPDX-License-Identifier: EPL-2.0 - */ -package tools.refinery.store.query.dnf; - -import org.junit.jupiter.api.Test; -import tools.refinery.store.query.term.NodeVariable; -import tools.refinery.store.query.term.ParameterDirection; -import tools.refinery.store.query.term.Variable; -import tools.refinery.store.query.view.AnySymbolView; -import tools.refinery.store.query.view.KeyOnlyView; -import tools.refinery.store.representation.Symbol; - -import static org.hamcrest.MatcherAssert.assertThat; -import static org.hamcrest.Matchers.is; -import static tools.refinery.store.query.literal.Literals.not; - -class DnfToDefinitionStringTest { - private static final Symbol person = Symbol.of("person", 1); - private static final Symbol friend = Symbol.of("friend", 2); - private static final AnySymbolView personView = new KeyOnlyView<>(person); - private static final AnySymbolView friendView = new KeyOnlyView<>(friend); - private static final NodeVariable p = Variable.of("p"); - private static final NodeVariable q = Variable.of("q"); - - @Test - void noClausesTest() { - var dnf = Dnf.builder("Example").parameter(p).build(); - - assertThat(dnf.toDefinitionString(), is(""" - pred Example(p) <-> - . - """)); - } - - @Test - void noParametersTest() { - var dnf = Dnf.builder("Example").build(); - - assertThat(dnf.toDefinitionString(), is(""" - pred Example() <-> - . - """)); - } - - @Test - void emptyClauseTest() { - var dnf = Dnf.builder("Example").parameter(p, ParameterDirection.IN).clause().build(); - - assertThat(dnf.toDefinitionString(), is(""" - pred Example(in p) <-> - . - """)); - } - - @Test - void relationViewPositiveTest() { - var dnf = Dnf.builder("Example").parameter(p).clause(friendView.call(p, q)).build(); - - assertThat(dnf.toDefinitionString(), is(""" - pred Example(p) <-> - @RelationView("key") friend(p, q). - """)); - } - - @Test - void relationViewNegativeTest() { - var dnf = Dnf.builder("Example") - .parameter(p, ParameterDirection.IN) - .clause(not(friendView.call(p, q))) - .build(); - - assertThat(dnf.toDefinitionString(), is(""" - pred Example(in p) <-> - !(@RelationView("key") friend(p, q)). - """)); - } - - @Test - void relationViewTransitiveTest() { - var dnf = Dnf.builder("Example").parameter(p).clause(friendView.callTransitive(p, q)).build(); - - assertThat(dnf.toDefinitionString(), is(""" - pred Example(p) <-> - @RelationView("key") friend+(p, q). - """)); - } - - @Test - void multipleParametersTest() { - var dnf = Dnf.builder("Example").parameters(p, q).clause(friendView.call(p, q)).build(); - - assertThat(dnf.toDefinitionString(), is(""" - pred Example(p, q) <-> - @RelationView("key") friend(p, q). - """)); - } - - @Test - void multipleLiteralsTest() { - var dnf = Dnf.builder("Example") - .parameter(p) - .clause( - personView.call(p), - personView.call(q), - friendView.call(p, q) - ) - .build(); - - assertThat(dnf.toDefinitionString(), is(""" - pred Example(p) <-> - @RelationView("key") person(p), - @RelationView("key") person(q), - @RelationView("key") friend(p, q). - """)); - } - - @Test - void multipleClausesTest() { - var dnf = Dnf.builder("Example") - .parameter(p) - .clause(friendView.call(p, q)) - .clause(friendView.call(q, p)) - .build(); - - assertThat(dnf.toDefinitionString(), is(""" - pred Example(p) <-> - @RelationView("key") friend(p, q) - ; - @RelationView("key") friend(q, p). - """)); - } - - @Test - void dnfTest() { - var r = Variable.of("r"); - var s = Variable.of("s"); - var called = Dnf.builder("Called").parameters(r, s).clause(friendView.call(r, s)).build(); - var dnf = Dnf.builder("Example") - .parameter(p) - .clause( - personView.call(p), - personView.call(q), - not(called.call(p, q)) - ) - .build(); - - assertThat(dnf.toDefinitionString(), is(""" - pred Example(p) <-> - @RelationView("key") person(p), - @RelationView("key") person(q), - !(@Dnf Called(p, q)). - """)); - } -} diff --git a/subprojects/store-query/src/test/java/tools/refinery/store/query/dnf/HashCodeTest.java b/subprojects/store-query/src/test/java/tools/refinery/store/query/dnf/HashCodeTest.java deleted file mode 100644 index 0c8eaeed..00000000 --- a/subprojects/store-query/src/test/java/tools/refinery/store/query/dnf/HashCodeTest.java +++ /dev/null @@ -1,67 +0,0 @@ -/* - * SPDX-FileCopyrightText: 2023 The Refinery Authors - * - * SPDX-License-Identifier: EPL-2.0 - */ -package tools.refinery.store.query.dnf; - -import org.junit.jupiter.api.Test; -import tools.refinery.store.query.term.NodeVariable; -import tools.refinery.store.query.term.Variable; -import tools.refinery.store.query.view.AnySymbolView; -import tools.refinery.store.query.view.KeyOnlyView; -import tools.refinery.store.representation.Symbol; - -import static org.hamcrest.MatcherAssert.assertThat; -import static org.hamcrest.Matchers.is; -import static org.hamcrest.Matchers.not; - -class HashCodeTest { - private static final Symbol person = Symbol.of("Person", 1); - private static final Symbol friend = Symbol.of("friend", 2); - private static final AnySymbolView personView = new KeyOnlyView<>(person); - private static final AnySymbolView friendView = new KeyOnlyView<>(friend); - private static final NodeVariable p = Variable.of("p"); - private static final NodeVariable q = Variable.of("q"); - - @Test - void flatEqualsTest() { - var expected = Dnf.builder("Expected").parameters(q).clause(personView.call(q)).build(); - var actual = Dnf.builder("Actual").parameters(p).clause(personView.call(p)).build(); - - assertThat(actual.hashCodeWithSubstitution(), is(expected.hashCodeWithSubstitution())); - } - - @Test - void flatNotEqualsTest() { - var expected = Dnf.builder("Expected").parameters(q).clause(friendView.call(q, q)).build(); - var actual = Dnf.builder("Actual").parameters(p).clause(friendView.call(p, q)).build(); - - assertThat(actual.hashCodeWithSubstitution(), not(expected.hashCodeWithSubstitution())); - } - - @Test - void deepEqualsTest() { - var expected2 = Dnf.builder("Expected2").parameters(p).clause(personView.call(p)).build(); - var expected = Dnf.builder("Expected").parameters(q).clause( - expected2.call(q) - ).build(); - var actual = Dnf.builder("Actual").parameters(q).clause( - expected2.call(q) - ).build(); - - assertThat(actual.hashCodeWithSubstitution(), is(expected.hashCodeWithSubstitution())); - } - - @Test - void deepNotEqualsTest() { - var expected = Dnf.builder("Expected").parameters(q).clause( - Dnf.builder("Expected2").parameters(p).clause(personView.call(p)).build().call(q) - ).build(); - var actual = Dnf.builder("Actual").parameters(q).clause( - Dnf.builder("Actual2").parameters(p).clause(personView.call(p)).build().call(q) - ).build(); - - assertThat(actual.hashCodeWithSubstitution(), not(expected.hashCodeWithSubstitution())); - } -} 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 deleted file mode 100644 index 854bd469..00000000 --- a/subprojects/store-query/src/test/java/tools/refinery/store/query/dnf/TopologicalSortTest.java +++ /dev/null @@ -1,113 +0,0 @@ -/* - * SPDX-FileCopyrightText: 2023 The Refinery Authors - * - * SPDX-License-Identifier: EPL-2.0 - */ -package tools.refinery.store.query.dnf; - -import org.junit.jupiter.api.Test; -import tools.refinery.store.query.InvalidQueryException; -import tools.refinery.store.query.term.NodeVariable; -import tools.refinery.store.query.term.ParameterDirection; -import tools.refinery.store.query.term.Variable; -import tools.refinery.store.query.view.AnySymbolView; -import tools.refinery.store.query.view.KeyOnlyView; -import tools.refinery.store.representation.Symbol; - -import java.util.List; - -import static org.hamcrest.MatcherAssert.assertThat; -import static org.junit.jupiter.api.Assertions.assertThrows; -import static tools.refinery.store.query.literal.Literals.not; -import static tools.refinery.store.query.tests.QueryMatchers.structurallyEqualTo; - -class TopologicalSortTest { - private static final Symbol friend = Symbol.of("friend", 2); - private static final AnySymbolView friendView = new KeyOnlyView<>(friend); - private static final Dnf example = Dnf.of("example", builder -> { - var a = builder.parameter("a", ParameterDirection.IN); - var b = builder.parameter("b", ParameterDirection.IN); - var c = builder.parameter("c", ParameterDirection.OUT); - var d = builder.parameter("d", ParameterDirection.OUT); - builder.clause( - friendView.call(a, b), - friendView.call(b, c), - friendView.call(c, d) - ); - }); - private static final NodeVariable p = Variable.of("p"); - private static final NodeVariable q = Variable.of("q"); - private static final NodeVariable r = Variable.of("r"); - private static final NodeVariable s = Variable.of("s"); - private static final NodeVariable t = Variable.of("t"); - - @Test - void topologicalSortTest() { - var actual = Dnf.builder("Actual") - .parameter(p, ParameterDirection.IN) - .parameter(q, ParameterDirection.OUT) - .clause( - not(friendView.call(p, q)), - example.call(p, q, r, s), - example.call(r, t, q, s), - friendView.call(r, t) - ) - .build(); - - assertThat(actual, structurallyEqualTo( - List.of( - new SymbolicParameter(p, ParameterDirection.IN), - new SymbolicParameter(q, ParameterDirection.OUT) - ), - List.of( - List.of( - friendView.call(r, t), - example.call(r, t, q, s), - not(friendView.call(p, q)), - example.call(p, q, r, s) - ) - ) - )); - } - - @Test - void missingInputTest() { - var builder = Dnf.builder("Actual") - .parameter(p, ParameterDirection.OUT) - .parameter(q, ParameterDirection.OUT) - .clause( - not(friendView.call(p, q)), - example.call(p, q, r, s), - example.call(r, t, q, s), - friendView.call(r, t) - ); - assertThrows(InvalidQueryException.class, builder::build); - } - - @Test - void missingVariableTest() { - var builder = Dnf.builder("Actual") - .parameter(p, ParameterDirection.IN) - .parameter(q, ParameterDirection.OUT) - .clause( - not(friendView.call(p, q)), - example.call(p, q, r, s), - example.call(r, t, q, s) - ); - assertThrows(InvalidQueryException.class, builder::build); - } - - @Test - void circularDependencyTest() { - var builder = Dnf.builder("Actual") - .parameter(p, ParameterDirection.IN) - .parameter(q, ParameterDirection.OUT) - .clause( - not(friendView.call(p, q)), - example.call(p, q, r, s), - example.call(r, t, q, s), - example.call(p, q, r, t) - ); - assertThrows(InvalidQueryException.class, builder::build); - } -} 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 deleted file mode 100644 index fc3f5d48..00000000 --- a/subprojects/store-query/src/test/java/tools/refinery/store/query/dnf/VariableDirectionTest.java +++ /dev/null @@ -1,251 +0,0 @@ -/* - * SPDX-FileCopyrightText: 2023 The Refinery Authors - * - * SPDX-License-Identifier: EPL-2.0 - */ -package tools.refinery.store.query.dnf; - -import org.junit.jupiter.params.ParameterizedTest; -import org.junit.jupiter.params.provider.Arguments; -import org.junit.jupiter.params.provider.MethodSource; -import tools.refinery.store.query.literal.BooleanLiteral; -import tools.refinery.store.query.literal.Literal; -import tools.refinery.store.query.term.DataVariable; -import tools.refinery.store.query.term.NodeVariable; -import tools.refinery.store.query.term.ParameterDirection; -import tools.refinery.store.query.term.Variable; -import tools.refinery.store.query.view.AnySymbolView; -import tools.refinery.store.query.view.FunctionView; -import tools.refinery.store.query.view.KeyOnlyView; -import tools.refinery.store.representation.Symbol; - -import java.util.ArrayList; -import java.util.List; -import java.util.stream.Stream; - -import static org.hamcrest.MatcherAssert.assertThat; -import static org.hamcrest.Matchers.hasItem; -import static org.hamcrest.Matchers.not; -import static org.junit.jupiter.api.Assertions.assertDoesNotThrow; -import static org.junit.jupiter.api.Assertions.assertThrows; -import static tools.refinery.store.query.literal.Literals.not; -import static tools.refinery.store.query.term.int_.IntTerms.INT_SUM; - -class VariableDirectionTest { - private static final Symbol person = Symbol.of("Person", 1); - private static final Symbol friend = Symbol.of("friend", 2); - private static final Symbol age = Symbol.of("age", 1, Integer.class); - private static final AnySymbolView personView = new KeyOnlyView<>(person); - private static final AnySymbolView friendView = new KeyOnlyView<>(friend); - private static final FunctionView ageView = new FunctionView<>(age); - private static final NodeVariable p = Variable.of("p"); - private static final NodeVariable q = Variable.of("q"); - private static final DataVariable x = Variable.of("x", Integer.class); - private static final DataVariable y = Variable.of("y", Integer.class); - private static final DataVariable z = Variable.of("z", Integer.class); - - @ParameterizedTest - @MethodSource("clausesWithVariableInput") - void unboundOutVariableTest(List clause) { - var builder = Dnf.builder().parameter(p, ParameterDirection.OUT).clause(clause); - assertThrows(InvalidClauseException.class, builder::build); - } - - @ParameterizedTest - @MethodSource("clausesWithVariableInput") - void unboundInVariableTest(List clause) { - var builder = Dnf.builder().parameter(p, ParameterDirection.IN).clause(clause); - var dnf = assertDoesNotThrow(builder::build); - var clauses = dnf.getClauses(); - if (clauses.size() > 0) { - assertThat(clauses.get(0).positiveVariables(), hasItem(p)); - } - } - - @ParameterizedTest - @MethodSource("clausesWithVariableInput") - void boundPrivateVariableTest(List clause) { - var clauseWithBinding = new ArrayList(clause); - clauseWithBinding.add(personView.call(p)); - var builder = Dnf.builder().clause(clauseWithBinding); - var dnf = assertDoesNotThrow(builder::build); - var clauses = dnf.getClauses(); - if (clauses.size() > 0) { - assertThat(clauses.get(0).positiveVariables(), hasItem(p)); - } - } - - static Stream clausesWithVariableInput() { - return Stream.concat( - clausesNotBindingVariable(), - literalToClauseArgumentStream(literalsWithRequiredVariableInput()) - ); - } - - @ParameterizedTest - @MethodSource("clausesNotBindingVariable") - void unboundPrivateVariableTest(List clause) { - var builder = Dnf.builder().clause(clause); - var dnf = assertDoesNotThrow(builder::build); - var clauses = dnf.getClauses(); - if (clauses.size() > 0) { - assertThat(clauses.get(0).positiveVariables(), not(hasItem(p))); - } - } - - @ParameterizedTest - @MethodSource("clausesNotBindingVariable") - void unboundByEquivalencePrivateVariableTest(List clause) { - var r = Variable.of("r"); - var clauseWithEquivalence = new ArrayList(clause); - clauseWithEquivalence.add(r.isEquivalent(p)); - var builder = Dnf.builder().clause(clauseWithEquivalence); - assertThrows(InvalidClauseException.class, builder::build); - } - - static Stream clausesNotBindingVariable() { - return Stream.concat( - Stream.of( - Arguments.of(List.of()), - Arguments.of(List.of(BooleanLiteral.TRUE)), - Arguments.of(List.of(BooleanLiteral.FALSE)) - ), - literalToClauseArgumentStream(literalsWithPrivateVariable()) - ); - } - - @ParameterizedTest - @MethodSource("literalsWithPrivateVariable") - void unboundTwicePrivateVariableTest(Literal literal) { - var builder = Dnf.builder().clause(not(personView.call(p)), literal); - assertThrows(InvalidClauseException.class, builder::build); - } - - @ParameterizedTest - @MethodSource("literalsWithPrivateVariable") - void unboundTwiceByEquivalencePrivateVariableTest(Literal literal) { - var r = Variable.of("r"); - var builder = Dnf.builder().clause(not(personView.call(r)), r.isEquivalent(p), literal); - assertThrows(InvalidClauseException.class, builder::build); - } - - static Stream literalsWithPrivateVariable() { - var dnfWithOutput = Dnf.builder("WithOutput") - .parameter(p, ParameterDirection.OUT) - .parameter(q, ParameterDirection.OUT) - .clause(friendView.call(p, q)) - .build(); - var dnfWithOutputToAggregate = Dnf.builder("WithOutputToAggregate") - .parameter(p, ParameterDirection.OUT) - .parameter(q, ParameterDirection.OUT) - .parameter(x, ParameterDirection.OUT) - .clause( - friendView.call(p, q), - ageView.call(q, x) - ) - .build(); - - return Stream.of( - Arguments.of(not(friendView.call(p, q))), - Arguments.of(y.assign(friendView.count(p, q))), - Arguments.of(y.assign(ageView.aggregate(INT_SUM, p))), - Arguments.of(not(dnfWithOutput.call(p, q))), - Arguments.of(y.assign(dnfWithOutput.count(p, q))), - Arguments.of(y.assign(dnfWithOutputToAggregate.aggregateBy(z, INT_SUM, p, q, z))) - ); - } - - @ParameterizedTest - @MethodSource("literalsWithRequiredVariableInput") - void unboundPrivateVariableTest(Literal literal) { - var builder = Dnf.builder().clause(literal); - assertThrows(InvalidClauseException.class, builder::build); - } - - @ParameterizedTest - @MethodSource("literalsWithRequiredVariableInput") - void boundPrivateVariableInputTest(Literal literal) { - var builder = Dnf.builder().clause(personView.call(p), literal); - var dnf = assertDoesNotThrow(builder::build); - assertThat(dnf.getClauses().get(0).positiveVariables(), hasItem(p)); - } - - static Stream literalsWithRequiredVariableInput() { - var dnfWithInput = Dnf.builder("WithInput") - .parameter(p, ParameterDirection.IN) - .parameter(q, ParameterDirection.OUT) - .clause(friendView.call(p, q)).build(); - var dnfWithInputToAggregate = Dnf.builder("WithInputToAggregate") - .parameter(p, ParameterDirection.IN) - .parameter(q, ParameterDirection.OUT) - .parameter(x, ParameterDirection.OUT) - .clause( - friendView.call(p, q), - ageView.call(q, x) - ).build(); - - return Stream.of( - Arguments.of(dnfWithInput.call(p, q)), - Arguments.of(dnfWithInput.call(p, p)), - Arguments.of(not(dnfWithInput.call(p, q))), - Arguments.of(not(dnfWithInput.call(p, p))), - Arguments.of(y.assign(dnfWithInput.count(p, q))), - Arguments.of(y.assign(dnfWithInput.count(p, p))), - Arguments.of(y.assign(dnfWithInputToAggregate.aggregateBy(z, INT_SUM, p, q, z))), - Arguments.of(y.assign(dnfWithInputToAggregate.aggregateBy(z, INT_SUM, p, p, z))) - ); - } - - @ParameterizedTest - @MethodSource("literalsWithVariableOutput") - void boundParameterTest(Literal literal) { - var builder = Dnf.builder().parameter(p, ParameterDirection.OUT).clause(literal); - var dnf = assertDoesNotThrow(builder::build); - assertThat(dnf.getClauses().get(0).positiveVariables(), hasItem(p)); - } - - @ParameterizedTest - @MethodSource("literalsWithVariableOutput") - void boundTwiceParameterTest(Literal literal) { - var builder = Dnf.builder().parameter(p, ParameterDirection.IN).clause(literal); - var dnf = assertDoesNotThrow(builder::build); - assertThat(dnf.getClauses().get(0).positiveVariables(), hasItem(p)); - } - - @ParameterizedTest - @MethodSource("literalsWithVariableOutput") - void boundPrivateVariableOutputTest(Literal literal) { - var dnfWithInput = Dnf.builder("WithInput") - .parameter(p, ParameterDirection.IN) - .clause(personView.call(p)) - .build(); - var builder = Dnf.builder().clause(dnfWithInput.call(p), literal); - var dnf = assertDoesNotThrow(builder::build); - assertThat(dnf.getClauses().get(0).positiveVariables(), hasItem(p)); - } - - @ParameterizedTest - @MethodSource("literalsWithVariableOutput") - void boundTwicePrivateVariableOutputTest(Literal literal) { - var builder = Dnf.builder().clause(personView.call(p), literal); - var dnf = assertDoesNotThrow(builder::build); - assertThat(dnf.getClauses().get(0).positiveVariables(), hasItem(p)); - } - - static Stream literalsWithVariableOutput() { - var dnfWithOutput = Dnf.builder("WithOutput") - .parameter(p, ParameterDirection.OUT) - .parameter(q, ParameterDirection.OUT) - .clause(friendView.call(p, q)) - .build(); - - return Stream.of( - Arguments.of(friendView.call(p, q)), - Arguments.of(dnfWithOutput.call(p, q)) - ); - } - - private static Stream literalToClauseArgumentStream(Stream literalArgumentsStream) { - return literalArgumentsStream.map(arguments -> Arguments.of(List.of(arguments.get()[0]))); - } -} 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 deleted file mode 100644 index ddd57e96..00000000 --- a/subprojects/store-query/src/test/java/tools/refinery/store/query/literal/AggregationLiteralTest.java +++ /dev/null @@ -1,89 +0,0 @@ -/* - * SPDX-FileCopyrightText: 2023 The Refinery Authors - * - * SPDX-License-Identifier: EPL-2.0 - */ -package tools.refinery.store.query.literal; - -import org.junit.jupiter.api.Test; -import tools.refinery.store.query.Constraint; -import tools.refinery.store.query.InvalidQueryException; -import tools.refinery.store.query.dnf.Dnf; -import tools.refinery.store.query.dnf.InvalidClauseException; -import tools.refinery.store.query.term.*; - -import java.util.List; -import java.util.Set; - -import static org.hamcrest.MatcherAssert.assertThat; -import static org.hamcrest.Matchers.*; -import static org.junit.jupiter.api.Assertions.assertAll; -import static org.junit.jupiter.api.Assertions.assertThrows; -import static tools.refinery.store.query.literal.Literals.not; -import static tools.refinery.store.query.term.int_.IntTerms.INT_SUM; -import static tools.refinery.store.query.term.int_.IntTerms.constant; - -class AggregationLiteralTest { - private static final NodeVariable p = Variable.of("p"); - private static final DataVariable x = Variable.of("x", Integer.class); - private static final DataVariable y = Variable.of("y", Integer.class); - private static final DataVariable z = Variable.of("z", Integer.class); - private static final Constraint fakeConstraint = new Constraint() { - @Override - public String name() { - return getClass().getName(); - } - - @Override - public List getParameters() { - return List.of( - new Parameter(null, ParameterDirection.OUT), - new Parameter(Integer.class, ParameterDirection.OUT) - ); - } - }; - - @Test - void parameterDirectionTest() { - var literal = x.assign(fakeConstraint.aggregateBy(y, INT_SUM, p, y)); - assertAll( - () -> assertThat(literal.getOutputVariables(), containsInAnyOrder(x)), - () -> assertThat(literal.getInputVariables(Set.of()), empty()), - () -> assertThat(literal.getInputVariables(Set.of(p)), containsInAnyOrder(p)), - () -> assertThat(literal.getPrivateVariables(Set.of()), containsInAnyOrder(p, y)), - () -> assertThat(literal.getPrivateVariables(Set.of(p)), containsInAnyOrder(y)) - ); - } - - @Test - void missingAggregationVariableTest() { - var aggregation = fakeConstraint.aggregateBy(y, INT_SUM, p, z); - assertThrows(InvalidQueryException.class, () -> x.assign(aggregation)); - } - - @Test - void circularAggregationVariableTest() { - var aggregation = fakeConstraint.aggregateBy(x, INT_SUM, p, x); - assertThrows(InvalidQueryException.class, () -> x.assign(aggregation)); - } - - @Test - void unboundTwiceVariableTest() { - var builder = Dnf.builder() - .clause( - not(fakeConstraint.call(p, y)), - x.assign(fakeConstraint.aggregateBy(y, INT_SUM, p, y)) - ); - assertThrows(InvalidClauseException.class, builder::build); - } - - @Test - void unboundBoundVariableTest() { - var builder = Dnf.builder() - .clause( - y.assign(constant(27)), - x.assign(fakeConstraint.aggregateBy(y, INT_SUM, p, y)) - ); - assertThrows(InvalidClauseException.class, builder::build); - } -} diff --git a/subprojects/store-query/src/test/java/tools/refinery/store/query/literal/CallLiteralTest.java b/subprojects/store-query/src/test/java/tools/refinery/store/query/literal/CallLiteralTest.java deleted file mode 100644 index a01c6586..00000000 --- a/subprojects/store-query/src/test/java/tools/refinery/store/query/literal/CallLiteralTest.java +++ /dev/null @@ -1,94 +0,0 @@ -/* - * SPDX-FileCopyrightText: 2023 The Refinery Authors - * - * SPDX-License-Identifier: EPL-2.0 - */ -package tools.refinery.store.query.literal; - -import org.junit.jupiter.api.Test; -import tools.refinery.store.query.Constraint; -import tools.refinery.store.query.term.NodeVariable; -import tools.refinery.store.query.term.Parameter; -import tools.refinery.store.query.term.ParameterDirection; -import tools.refinery.store.query.term.Variable; - -import java.util.List; -import java.util.Set; - -import static org.hamcrest.MatcherAssert.assertThat; -import static org.hamcrest.Matchers.containsInAnyOrder; -import static org.hamcrest.Matchers.empty; -import static org.junit.jupiter.api.Assertions.assertAll; -import static tools.refinery.store.query.literal.Literals.not; - -class CallLiteralTest { - private static final NodeVariable p = Variable.of("p"); - private static final NodeVariable q = Variable.of("q"); - private static final NodeVariable r = Variable.of("r"); - private static final NodeVariable s = Variable.of("s"); - - private static final Constraint fakeConstraint = new Constraint() { - @Override - public String name() { - return getClass().getName(); - } - - @Override - public List getParameters() { - return List.of( - new Parameter(null, ParameterDirection.IN), - new Parameter(null, ParameterDirection.IN), - new Parameter(null, ParameterDirection.OUT), - new Parameter(null, ParameterDirection.OUT) - ); - } - }; - - @Test - void notRepeatedPositiveDirectionTest() { - var literal = fakeConstraint.call(p, q, r, s); - assertAll( - () -> assertThat(literal.getOutputVariables(), containsInAnyOrder(r, s)), - () -> assertThat(literal.getInputVariables(Set.of()), containsInAnyOrder(p, q)), - () -> assertThat(literal.getInputVariables(Set.of(p, q, r)), containsInAnyOrder(p, q)), - () -> assertThat(literal.getPrivateVariables(Set.of()), empty()), - () -> assertThat(literal.getPrivateVariables(Set.of(p, q, r)), empty()) - ); - } - - @Test - void notRepeatedNegativeDirectionTest() { - var literal = not(fakeConstraint.call(p, q, r, s)); - assertAll( - () -> assertThat(literal.getOutputVariables(), empty()), - () -> assertThat(literal.getInputVariables(Set.of()), containsInAnyOrder(p, q)), - () -> assertThat(literal.getInputVariables(Set.of(p, q, r)), containsInAnyOrder(p, q, r)), - () -> assertThat(literal.getPrivateVariables(Set.of()), containsInAnyOrder(r, s)), - () -> assertThat(literal.getPrivateVariables(Set.of(p, q, r)), containsInAnyOrder(s)) - ); - } - - @Test - void repeatedPositiveDirectionTest() { - var literal = fakeConstraint.call(p, p, q, q); - assertAll( - () -> assertThat(literal.getOutputVariables(), containsInAnyOrder(q)), - () -> assertThat(literal.getInputVariables(Set.of()), containsInAnyOrder(p)), - () -> assertThat(literal.getInputVariables(Set.of(p, q)), containsInAnyOrder(p)), - () -> assertThat(literal.getPrivateVariables(Set.of()), empty()), - () -> assertThat(literal.getPrivateVariables(Set.of(p, q)), empty()) - ); - } - - @Test - void repeatedNegativeDirectionTest() { - var literal = not(fakeConstraint.call(p, p, q, q)); - assertAll( - () -> assertThat(literal.getOutputVariables(), empty()), - () -> assertThat(literal.getInputVariables(Set.of()), containsInAnyOrder(p)), - () -> assertThat(literal.getInputVariables(Set.of(p, q)), containsInAnyOrder(p, q)), - () -> assertThat(literal.getPrivateVariables(Set.of()), containsInAnyOrder(q)), - () -> assertThat(literal.getPrivateVariables(Set.of(p, q)), empty()) - ); - } -} diff --git a/subprojects/store-query/src/test/java/tools/refinery/store/query/rewriter/DuplicateDnfRemoverTest.java b/subprojects/store-query/src/test/java/tools/refinery/store/query/rewriter/DuplicateDnfRemoverTest.java deleted file mode 100644 index ebb24ab5..00000000 --- a/subprojects/store-query/src/test/java/tools/refinery/store/query/rewriter/DuplicateDnfRemoverTest.java +++ /dev/null @@ -1,164 +0,0 @@ -/* - * SPDX-FileCopyrightText: 2023 The Refinery Authors - * - * SPDX-License-Identifier: EPL-2.0 - */ -package tools.refinery.store.query.rewriter; - -import org.junit.jupiter.api.BeforeEach; -import org.junit.jupiter.api.Test; -import tools.refinery.store.query.dnf.Query; -import tools.refinery.store.query.literal.AbstractCallLiteral; -import tools.refinery.store.query.literal.Reduction; -import tools.refinery.store.query.term.Variable; -import tools.refinery.store.query.view.AnySymbolView; -import tools.refinery.store.query.view.KeyOnlyView; -import tools.refinery.store.representation.Symbol; - -import java.util.List; - -import static org.hamcrest.MatcherAssert.assertThat; -import static org.hamcrest.Matchers.is; -import static org.hamcrest.Matchers.not; -import static tools.refinery.store.query.literal.Literals.not; - -class DuplicateDnfRemoverTest { - private final static Symbol friend = Symbol.of("friend", 2); - private final static AnySymbolView friendView = new KeyOnlyView<>(friend); - - private DuplicateDnfRemover sut; - - @BeforeEach - void beforeEach() { - sut = new DuplicateDnfRemover(); - } - - @Test - void removeDuplicateSimpleTest() { - var one = Query.of("One", (builder, x, y) -> builder.clause( - friendView.call(x, y), - friendView.call(y, x) - )); - var two = Query.of("Two", (builder, x, y) -> builder.clause( - friendView.call(x, y), - friendView.call(y, x) - )); - - var oneResult = sut.rewrite(one); - var twoResult = sut.rewrite(two); - - assertThat(oneResult, is(twoResult)); - assertThat(one, is(oneResult)); - } - - @Test - void notDuplicateSimpleTest() { - var one = Query.of("One", (builder, x, y) -> builder.clause( - friendView.call(x, y), - friendView.call(y, x) - )); - var two = Query.of("Two", (builder, x, y) -> builder.clause((z) -> List.of( - friendView.call(x, y), - friendView.call(y, z) - ))); - - var oneResult = sut.rewrite(one); - var twoResult = sut.rewrite(two); - - assertThat(one, is(oneResult)); - assertThat(two, is(twoResult)); - } - - @Test - void removeDuplicateRecursiveTest() { - var oneSubQuery = Query.of("OneSubQuery", (builder, x, y) -> builder.clause( - friendView.call(x, y), - friendView.call(y, x) - )); - var one = Query.of("One", (builder, x) -> builder.clause( - oneSubQuery.call(x, Variable.of()) - )); - var twoSubQuery = Query.of("TwoSubQuery", (builder, x, y) -> builder.clause( - friendView.call(x, y), - friendView.call(y, x) - )); - var two = Query.of("Two", (builder, x) -> builder.clause( - twoSubQuery.call(x, Variable.of()) - )); - - var oneResult = sut.rewrite(one); - var twoResult = sut.rewrite(two); - - assertThat(oneResult, is(twoResult)); - assertThat(one, is(oneResult)); - } - - @Test - void notDuplicateRecursiveTest() { - var oneSubQuery = Query.of("OneSubQuery", (builder, x, y) -> builder.clause( - friendView.call(x, y), - friendView.call(y, x) - )); - var one = Query.of("One", (builder, x) -> builder.clause( - oneSubQuery.call(x, Variable.of()) - )); - var twoSubQuery = Query.of("TwoSubQuery", (builder, x, y) -> builder.clause( - friendView.call(x, y), - friendView.call(y, x) - )); - var two = Query.of("Two", (builder, x) -> builder.clause( - twoSubQuery.call(Variable.of(), x) - )); - - var oneResult = sut.rewrite(one); - var twoResult = sut.rewrite(two); - - assertThat(one, is(oneResult)); - assertThat(oneResult, is(not(twoResult))); - - var oneCall = (AbstractCallLiteral) oneResult.getDnf().getClauses().get(0).literals().get(0); - var twoCall = (AbstractCallLiteral) twoResult.getDnf().getClauses().get(0).literals().get(0); - - assertThat(oneCall.getTarget(), is(twoCall.getTarget())); - } - - @Test - void removeContradictionTest() { - var oneSubQuery = Query.of("OneSubQuery", (builder, x, y) -> builder.clause( - friendView.call(x, y), - friendView.call(y, x) - )); - var twoSubQuery = Query.of("TwoSubQuery", (builder, x, y) -> builder.clause( - friendView.call(x, y), - friendView.call(y, x) - )); - var query = Query.of("Contradiction", (builder, x, y) -> builder.clause( - oneSubQuery.call(x, y), - not(twoSubQuery.call(x, y)) - )); - - var result = sut.rewrite(query); - - assertThat(result.getDnf().getReduction(), is(Reduction.ALWAYS_FALSE)); - } - - @Test - void removeQuantifiedContradictionTest() { - var oneSubQuery = Query.of("OneSubQuery", (builder, x, y) -> builder.clause( - friendView.call(x, y), - friendView.call(y, x) - )); - var twoSubQuery = Query.of("TwoSubQuery", (builder, x, y) -> builder.clause( - friendView.call(x, y), - friendView.call(y, x) - )); - var query = Query.of("Contradiction", (builder, x) -> builder.clause( - oneSubQuery.call(x, Variable.of()), - not(twoSubQuery.call(x, Variable.of())) - )); - - var result = sut.rewrite(query); - - assertThat(result.getDnf().getReduction(), is(Reduction.ALWAYS_FALSE)); - } -} diff --git a/subprojects/store-query/src/test/java/tools/refinery/store/query/rewriter/InputParameterResolverTest.java b/subprojects/store-query/src/test/java/tools/refinery/store/query/rewriter/InputParameterResolverTest.java deleted file mode 100644 index ef0077e4..00000000 --- a/subprojects/store-query/src/test/java/tools/refinery/store/query/rewriter/InputParameterResolverTest.java +++ /dev/null @@ -1,228 +0,0 @@ -/* - * SPDX-FileCopyrightText: 2023 The Refinery Authors - * - * SPDX-License-Identifier: EPL-2.0 - */ -package tools.refinery.store.query.rewriter; - -import org.junit.jupiter.api.BeforeEach; -import org.junit.jupiter.api.Test; -import tools.refinery.store.query.dnf.Dnf; -import tools.refinery.store.query.dnf.Query; -import tools.refinery.store.query.term.ParameterDirection; -import tools.refinery.store.query.term.Variable; -import tools.refinery.store.query.view.AnySymbolView; -import tools.refinery.store.query.view.KeyOnlyView; -import tools.refinery.store.representation.Symbol; - -import java.util.List; - -import static org.hamcrest.MatcherAssert.assertThat; -import static org.hamcrest.Matchers.is; -import static tools.refinery.store.query.literal.Literals.not; -import static tools.refinery.store.query.tests.QueryMatchers.structurallyEqualTo; - -class InputParameterResolverTest { - private final static Symbol person = Symbol.of("Person", 1); - private final static Symbol friend = Symbol.of("friend", 2); - private final static AnySymbolView personView = new KeyOnlyView<>(person); - private final static AnySymbolView friendView = new KeyOnlyView<>(friend); - - private InputParameterResolver sut; - - @BeforeEach - void beforeEach() { - sut = new InputParameterResolver(); - } - - @Test - void inlineSingleClauseTest() { - var dnf = Dnf.of("SubQuery", builder -> { - var x = builder.parameter("x", ParameterDirection.OUT); - builder.clause(friendView.call(x, Variable.of())); - }); - var query = Query.of("Actual", (builder, x) -> builder.clause( - dnf.call(x), - personView.call(x) - )); - - var actual = sut.rewrite(query); - - var expected = Query.of("Expected", (builder, x) -> builder.clause( - friendView.call(x, Variable.of()), - personView.call(x) - )); - - assertThat(actual.getDnf(), structurallyEqualTo(expected.getDnf())); - } - - @Test - void inlineSingleClauseWIthInputTest() { - var dnf = Dnf.of("SubQuery", builder -> { - var x = builder.parameter("x", ParameterDirection.IN); - builder.clause(not(friendView.call(x, Variable.of()))); - }); - var query = Query.of("Actual", (builder, x) -> builder.clause( - dnf.call(x), - personView.call(x) - )); - - var actual = sut.rewrite(query); - - var expected = Query.of("Expected", (builder, x) -> builder.clause( - personView.call(x), - not(friendView.call(x, Variable.of())) - )); - - assertThat(actual.getDnf(), structurallyEqualTo(expected.getDnf())); - } - - @Test - void singleLiteralDemandSetTest() { - var dnf = Dnf.of("SubQuery", builder -> { - var x = builder.parameter("x", ParameterDirection.IN); - builder.clause(not(friendView.call(x, Variable.of()))); - builder.clause(not(friendView.call(Variable.of(), x))); - }); - var query = Query.of("Actual", (builder, x) -> builder.clause( - dnf.call(x), - personView.call(x) - )); - - var actual = sut.rewrite(query); - - var expectedSubQuery = Dnf.of("ExpectedSubQuery", builder -> { - var x = builder.parameter("x", ParameterDirection.OUT); - builder.clause( - personView.call(x), - not(friendView.call(x, Variable.of())) - ); - builder.clause( - personView.call(x), - not(friendView.call(Variable.of(), x)) - ); - }); - var expected = Query.of("Expected", (builder, x) -> builder.clause( - personView.call(x), - expectedSubQuery.call(x) - )); - - assertThat(actual.getDnf(), structurallyEqualTo(expected.getDnf())); - } - - @Test - void multipleLiteralDemandSetTest() { - var dnf = Dnf.of("SubQuery", builder -> { - var x = builder.parameter("x", ParameterDirection.IN); - var y = builder.parameter("y", ParameterDirection.IN); - builder.clause(not(friendView.call(x, y))); - builder.clause(not(friendView.call(y, x))); - }); - var query = Query.of("Actual", (builder, p1) -> builder.clause(p2 -> List.of( - not(dnf.call(p1, p2)), - personView.call(p1), - personView.call(p2) - ))); - - var actual = sut.rewrite(query); - - var context = Dnf.of("Context", builder -> { - var x = builder.parameter("x", ParameterDirection.OUT); - var y = builder.parameter("y", ParameterDirection.OUT); - builder.clause( - personView.call(x), - personView.call(y) - ); - }); - var expectedSubQuery = Dnf.of("ExpectedSubQuery", builder -> { - var x = builder.parameter("x", ParameterDirection.OUT); - var y = builder.parameter("x", ParameterDirection.OUT); - builder.clause( - context.call(x, y), - not(friendView.call(x, y)) - ); - builder.clause( - context.call(x, y), - not(friendView.call(y, x)) - ); - }); - var expected = Query.of("Expected", (builder, p1) -> builder.clause(p2 -> List.of( - context.call(p1, p2), - not(expectedSubQuery.call(p1, p2)) - ))); - - assertThat(actual.getDnf(), structurallyEqualTo(expected.getDnf())); - } - - @Test - void multipleParameterDemandSetTest() { - var dnf = Dnf.of("SubQuery", builder -> { - var x = builder.parameter("x", ParameterDirection.IN); - var y = builder.parameter("y", ParameterDirection.IN); - builder.clause(not(friendView.call(x, y))); - builder.clause(not(friendView.call(y, x))); - }); - var query = Query.of("Actual", (builder, p1) -> builder.clause( - not(dnf.call(p1, p1)), - personView.call(p1) - )); - - var actual = sut.rewrite(query); - - var expectedSubQuery = Dnf.of("ExpectedSubQuery", builder -> { - var x = builder.parameter("x", ParameterDirection.OUT); - var y = builder.parameter("y", ParameterDirection.OUT); - builder.clause( - y.isEquivalent(x), - personView.call(x), - not(friendView.call(x, x)) - ); - }); - var expected = Query.of("Expected", (builder, p1) -> builder.clause( - personView.call(p1), - not(expectedSubQuery.call(p1, p1)) - )); - - assertThat(actual.getDnf(), structurallyEqualTo(expected.getDnf())); - } - - @Test - void eliminateDoubleNegationTest() { - var dnf = Dnf.of("SubQuery", builder -> { - var x = builder.parameter("x", ParameterDirection.IN); - builder.clause(not(friendView.call(x, Variable.of()))); - }); - var query = Query.of("Actual", (builder, p1) -> builder.clause( - personView.call(p1), - not(dnf.call(p1)) - )); - - var actual = sut.rewrite(query); - - var expected = Query.of("Actual", (builder, p1) -> builder.clause( - personView.call(p1), - friendView.call(p1, Variable.of()) - )); - - assertThat(actual.getDnf(), structurallyEqualTo(expected.getDnf())); - } - - @Test - void identityWhenNoWorkToDoTest() { - var dnf = Dnf.of("SubQuery", builder -> { - var x = builder.parameter("x", ParameterDirection.OUT); - builder.clause( - personView.call(x), - not(friendView.call(x, Variable.of())) - ); - }); - var query = Query.of("Actual", (builder, p1) -> builder.clause( - personView.call(p1), - not(dnf.call(p1)) - )); - - var actual = sut.rewrite(query); - - assertThat(actual, is(query)); - } -} diff --git a/subprojects/store-query/src/test/java/tools/refinery/store/query/term/TermSubstitutionTest.java b/subprojects/store-query/src/test/java/tools/refinery/store/query/term/TermSubstitutionTest.java deleted file mode 100644 index 1fae2492..00000000 --- a/subprojects/store-query/src/test/java/tools/refinery/store/query/term/TermSubstitutionTest.java +++ /dev/null @@ -1,97 +0,0 @@ -/* - * SPDX-FileCopyrightText: 2021-2023 The Refinery Authors - * - * SPDX-License-Identifier: EPL-2.0 - */ -package tools.refinery.store.query.term; - -import org.junit.jupiter.api.Assertions; -import org.junit.jupiter.params.ParameterizedTest; -import org.junit.jupiter.params.provider.Arguments; -import org.junit.jupiter.params.provider.MethodSource; -import tools.refinery.store.query.equality.DnfEqualityChecker; -import tools.refinery.store.query.equality.SubstitutingLiteralEqualityHelper; -import tools.refinery.store.query.substitution.Substitution; -import tools.refinery.store.query.term.bool.BoolTerms; -import tools.refinery.store.query.term.int_.IntTerms; -import tools.refinery.store.query.term.real.RealTerms; -import tools.refinery.store.query.term.uppercardinality.UpperCardinalityTerms; -import tools.refinery.store.representation.cardinality.UpperCardinality; - -import java.util.List; -import java.util.stream.Stream; - -class TermSubstitutionTest { - private final static DataVariable intA = Variable.of("intA", Integer.class); - private final static DataVariable intB = Variable.of("intB", Integer.class); - private final static DataVariable realA = Variable.of("realA", Double.class); - private final static DataVariable realB = Variable.of("realB", Double.class); - private final static DataVariable boolA = Variable.of("boolA", Boolean.class); - private final static DataVariable boolB = Variable.of("boolB", Boolean.class); - private final static DataVariable upperCardinalityA = Variable.of("upperCardinalityA", - UpperCardinality.class); - private final static DataVariable upperCardinalityB = Variable.of("upperCardinalityB", - UpperCardinality.class); - private final static Substitution substitution = Substitution.builder() - .put(intA, intB) - .put(intB, intA) - .put(realA, realB) - .put(realB, realA) - .put(boolA, boolB) - .put(boolB, boolA) - .put(upperCardinalityA, upperCardinalityB) - .put(upperCardinalityB, upperCardinalityA) - .build(); - - @ParameterizedTest - @MethodSource - void substitutionTest(AnyTerm term) { - var substitutedTerm1 = term.substitute(substitution); - Assertions.assertNotEquals(term, substitutedTerm1, "Original term is not equal to substituted term"); - var helper = new SubstitutingLiteralEqualityHelper(DnfEqualityChecker.DEFAULT, List.of(), List.of()); - Assertions.assertTrue(term.equalsWithSubstitution(helper, substitutedTerm1), "Terms are equal by helper"); - // The {@link #substitution} is its own inverse. - var substitutedTerm2 = substitutedTerm1.substitute(substitution); - Assertions.assertEquals(term, substitutedTerm2, "Original term is not equal to back-substituted term"); - } - - static Stream substitutionTest() { - return Stream.of( - Arguments.of(IntTerms.plus(intA)), - Arguments.of(IntTerms.minus(intA)), - Arguments.of(IntTerms.add(intA, intB)), - Arguments.of(IntTerms.sub(intA, intB)), - Arguments.of(IntTerms.mul(intA, intB)), - Arguments.of(IntTerms.div(intA, intB)), - Arguments.of(IntTerms.pow(intA, intB)), - Arguments.of(IntTerms.min(intA, intB)), - Arguments.of(IntTerms.max(intA, intB)), - Arguments.of(IntTerms.eq(intA, intB)), - Arguments.of(IntTerms.notEq(intA, intB)), - Arguments.of(IntTerms.less(intA, intB)), - Arguments.of(IntTerms.lessEq(intA, intB)), - Arguments.of(IntTerms.greater(intA, intB)), - Arguments.of(IntTerms.greaterEq(intA, intB)), - Arguments.of(IntTerms.asInt(realA)), - Arguments.of(RealTerms.plus(realA)), - Arguments.of(RealTerms.minus(realA)), - Arguments.of(RealTerms.add(realA, realB)), - Arguments.of(RealTerms.sub(realA, realB)), - Arguments.of(RealTerms.mul(realA, realB)), - Arguments.of(RealTerms.div(realA, realB)), - Arguments.of(RealTerms.pow(realA, realB)), - Arguments.of(RealTerms.min(realA, realB)), - Arguments.of(RealTerms.max(realA, realB)), - Arguments.of(RealTerms.asReal(intA)), - Arguments.of(BoolTerms.not(boolA)), - Arguments.of(BoolTerms.and(boolA, boolB)), - Arguments.of(BoolTerms.or(boolA, boolB)), - Arguments.of(BoolTerms.xor(boolA, boolB)), - Arguments.of(RealTerms.eq(realA, realB)), - Arguments.of(UpperCardinalityTerms.add(upperCardinalityA, upperCardinalityB)), - Arguments.of(UpperCardinalityTerms.mul(upperCardinalityA, upperCardinalityB)), - Arguments.of(UpperCardinalityTerms.min(upperCardinalityA, upperCardinalityB)), - Arguments.of(UpperCardinalityTerms.max(upperCardinalityA, upperCardinalityB)) - ); - } -} diff --git a/subprojects/store-query/src/test/java/tools/refinery/store/query/term/bool/BoolTermsEvaluateTest.java b/subprojects/store-query/src/test/java/tools/refinery/store/query/term/bool/BoolTermsEvaluateTest.java deleted file mode 100644 index beff705e..00000000 --- a/subprojects/store-query/src/test/java/tools/refinery/store/query/term/bool/BoolTermsEvaluateTest.java +++ /dev/null @@ -1,75 +0,0 @@ -/* - * SPDX-FileCopyrightText: 2021-2023 The Refinery Authors - * - * SPDX-License-Identifier: EPL-2.0 - */ -package tools.refinery.store.query.term.bool; - -import org.junit.jupiter.params.ParameterizedTest; -import org.junit.jupiter.params.provider.CsvSource; -import tools.refinery.store.query.valuation.Valuation; - -import static org.hamcrest.MatcherAssert.assertThat; -import static org.hamcrest.Matchers.is; - -class BoolTermsEvaluateTest { - @ParameterizedTest(name = "!{0} == {1}") - @CsvSource(value = { - "false, true", - "true, false", - "null, null" - }, nullValues = "null") - void notTest(Boolean a, Boolean result) { - var term = BoolTerms.not(BoolTerms.constant(a)); - assertThat(term.getType(), is(Boolean.class)); - assertThat(term.evaluate(Valuation.empty()), is(result)); - } - - @ParameterizedTest(name = "{0} && {1} == {2}") - @CsvSource(value = { - "false, false, false", - "false, true, false", - "true, false, false", - "true, true, true", - "false, null, null", - "null, false, null", - "null, null, null" - }, nullValues = "null") - void andTest(Boolean a, Boolean b, Boolean result) { - var term = BoolTerms.and(BoolTerms.constant(a), BoolTerms.constant(b)); - assertThat(term.getType(), is(Boolean.class)); - assertThat(term.evaluate(Valuation.empty()), is(result)); - } - - @ParameterizedTest(name = "{0} || {1} == {2}") - @CsvSource(value = { - "false, false, false", - "false, true, true", - "true, false, true", - "true, true, true", - "true, null, null", - "null, true, null", - "null, null, null" - }, nullValues = "null") - void orTest(Boolean a, Boolean b, Boolean result) { - var term = BoolTerms.or(BoolTerms.constant(a), BoolTerms.constant(b)); - assertThat(term.getType(), is(Boolean.class)); - assertThat(term.evaluate(Valuation.empty()), is(result)); - } - - @ParameterizedTest(name = "{0} ^^ {1} == {2}") - @CsvSource(value = { - "false, false, false", - "false, true, true", - "true, false, true", - "true, true, false", - "false, null, null", - "null, false, null", - "null, null, null" - }, nullValues = "null") - void xorTest(Boolean a, Boolean b, Boolean result) { - var term = BoolTerms.xor(BoolTerms.constant(a), BoolTerms.constant(b)); - assertThat(term.getType(), is(Boolean.class)); - assertThat(term.evaluate(Valuation.empty()), is(result)); - } -} diff --git a/subprojects/store-query/src/test/java/tools/refinery/store/query/term/int_/IntTermsEvaluateTest.java b/subprojects/store-query/src/test/java/tools/refinery/store/query/term/int_/IntTermsEvaluateTest.java deleted file mode 100644 index abe50d75..00000000 --- a/subprojects/store-query/src/test/java/tools/refinery/store/query/term/int_/IntTermsEvaluateTest.java +++ /dev/null @@ -1,259 +0,0 @@ -/* - * SPDX-FileCopyrightText: 2021-2023 The Refinery Authors - * - * SPDX-License-Identifier: EPL-2.0 - */ -package tools.refinery.store.query.term.int_; - -import org.junit.jupiter.params.ParameterizedTest; -import org.junit.jupiter.params.provider.Arguments; -import org.junit.jupiter.params.provider.CsvSource; -import org.junit.jupiter.params.provider.MethodSource; -import tools.refinery.store.query.term.real.RealTerms; -import tools.refinery.store.query.valuation.Valuation; - -import java.util.stream.Stream; - -import static org.hamcrest.Matchers.is; -import static org.hamcrest.MatcherAssert.assertThat; - -class IntTermsEvaluateTest { - @ParameterizedTest(name = "+{0} == {1}") - @CsvSource(value = { - "2, 2", - "null, null" - }, nullValues = "null") - void plusTest(Integer a, Integer result) { - var term = IntTerms.plus(IntTerms.constant(a)); - assertThat(term.getType(), is(Integer.class)); - assertThat(term.evaluate(Valuation.empty()), is(result)); - } - - @ParameterizedTest(name = "-{0} == {1}") - @CsvSource(value = { - "2, -2", - "null, null" - }, nullValues = "null") - void minusTest(Integer a, Integer result) { - var term = IntTerms.minus(IntTerms.constant(a)); - assertThat(term.getType(), is(Integer.class)); - assertThat(term.evaluate(Valuation.empty()), is(result)); - } - - @ParameterizedTest(name = "{0} + {1} == {2}") - @CsvSource(value = { - "1, 2, 3", - "null, 2, null", - "1, null, null", - "null, null, null" - }, nullValues = "null") - void addTest(Integer a, Integer b, Integer result) { - var term = IntTerms.add(IntTerms.constant(a), IntTerms.constant(b)); - assertThat(term.getType(), is(Integer.class)); - assertThat(term.evaluate(Valuation.empty()), is(result)); - } - - @ParameterizedTest(name = "{0} - {1} == {2}") - @CsvSource(value = { - "1, 3, -2", - "null, 3, null", - "1, null, null", - "null, null, null" - }, nullValues = "null") - void subTest(Integer a, Integer b, Integer result) { - var term = IntTerms.sub(IntTerms.constant(a), IntTerms.constant(b)); - assertThat(term.getType(), is(Integer.class)); - assertThat(term.evaluate(Valuation.empty()), is(result)); - } - - @ParameterizedTest(name = "{0} * {1} == {2}") - @CsvSource(value = { - "2, 3, 6", - "null, 3, null", - "2, null, null", - "null, null, null" - }, nullValues = "null") - void mulTest(Integer a, Integer b, Integer result) { - var term = IntTerms.mul(IntTerms.constant(a), IntTerms.constant(b)); - assertThat(term.getType(), is(Integer.class)); - assertThat(term.evaluate(Valuation.empty()), is(result)); - } - - @ParameterizedTest(name = "{0} * {1} == {2}") - @CsvSource(value = { - "6, 3, 2", - "7, 3, 2", - "6, 0, null", - "null, 3, null", - "6, null, null", - "null, null, null" - }, nullValues = "null") - void divTest(Integer a, Integer b, Integer result) { - var term = IntTerms.div(IntTerms.constant(a), IntTerms.constant(b)); - assertThat(term.getType(), is(Integer.class)); - assertThat(term.evaluate(Valuation.empty()), is(result)); - } - - @ParameterizedTest(name = "{0} ** {1} == {2}") - @CsvSource(value = { - "1, 0, 1", - "1, 3, 1", - "1, -3, null", - "2, 0, 1", - "2, 2, 4", - "2, 3, 8", - "2, 4, 16", - "2, 5, 32", - "2, 6, 64", - "2, -3, null", - "null, 3, null", - "2, null, null", - "null, null, null" - }, nullValues = "null") - void powTest(Integer a, Integer b, Integer result) { - var term = IntTerms.pow(IntTerms.constant(a), IntTerms.constant(b)); - assertThat(term.getType(), is(Integer.class)); - assertThat(term.evaluate(Valuation.empty()), is(result)); - } - - @ParameterizedTest(name = "min({0}, {1}) == {2}") - @CsvSource(value = { - "1, 2, 1", - "2, 1, 1", - "null, 2, null", - "1, null, null", - "null, null, null" - }, nullValues = "null") - void minTest(Integer a, Integer b, Integer result) { - var term = IntTerms.min(IntTerms.constant(a), IntTerms.constant(b)); - assertThat(term.getType(), is(Integer.class)); - assertThat(term.evaluate(Valuation.empty()), is(result)); - } - - @ParameterizedTest(name = "max({0}, {1}) == {2}") - @CsvSource(value = { - "1, 2, 2", - "2, 1, 2", - "null, 2, null", - "1, null, null", - "null, null, null" - }, nullValues = "null") - void maxTest(Integer a, Integer b, Integer result) { - var term = IntTerms.max(IntTerms.constant(a), IntTerms.constant(b)); - assertThat(term.getType(), is(Integer.class)); - assertThat(term.evaluate(Valuation.empty()), is(result)); - } - - @ParameterizedTest(name = "({0} == {1}) == {2}") - @CsvSource(value = { - "1, 1, true", - "1, 2, false", - "null, 1, null", - "1, null, null", - "null, null, null" - }, nullValues = "null") - void eqTest(Integer a, Integer b, Boolean result) { - var term = IntTerms.eq(IntTerms.constant(a), IntTerms.constant(b)); - assertThat(term.getType(), is(Boolean.class)); - assertThat(term.evaluate(Valuation.empty()), is(result)); - } - - @ParameterizedTest(name = "({0} != {1}) == {2}") - @CsvSource(value = { - "1, 1, false", - "1, 2, true", - "null, 1, null", - "1, null, null", - "null, null, null" - }, nullValues = "null") - void notEqTest(Integer a, Integer b, Boolean result) { - var term = IntTerms.notEq(IntTerms.constant(a), IntTerms.constant(b)); - assertThat(term.getType(), is(Boolean.class)); - assertThat(term.evaluate(Valuation.empty()), is(result)); - } - - @ParameterizedTest(name = "({0} < {1}) == {2}") - @CsvSource(value = { - "1, -2, false", - "1, 1, false", - "1, 2, true", - "null, 1, null", - "1, null, null", - "null, null, null" - }, nullValues = "null") - void lessTest(Integer a, Integer b, Boolean result) { - var term = IntTerms.less(IntTerms.constant(a), IntTerms.constant(b)); - assertThat(term.getType(), is(Boolean.class)); - assertThat(term.evaluate(Valuation.empty()), is(result)); - } - - @ParameterizedTest(name = "({0} <= {1}) == {2}") - @CsvSource(value = { - "1, -2, false", - "1, 1, true", - "1, 2, true", - "null, 1, null", - "1, null, null", - "null, null, null" - }, nullValues = "null") - void lessEqTest(Integer a, Integer b, Boolean result) { - var term = IntTerms.lessEq(IntTerms.constant(a), IntTerms.constant(b)); - assertThat(term.getType(), is(Boolean.class)); - assertThat(term.evaluate(Valuation.empty()), is(result)); - } - - @ParameterizedTest(name = "({0} > {1}) == {2}") - @CsvSource(value = { - "1, -2, true", - "1, 1, false", - "1, 2, false", - "null, 1, null", - "1, null, null", - "null, null, null" - }, nullValues = "null") - void greaterTest(Integer a, Integer b, Boolean result) { - var term = IntTerms.greater(IntTerms.constant(a), IntTerms.constant(b)); - assertThat(term.getType(), is(Boolean.class)); - assertThat(term.evaluate(Valuation.empty()), is(result)); - } - - @ParameterizedTest(name = "({0} >= {1}) == {2}") - @CsvSource(value = { - "1, -2, true", - "1, 1, true", - "1, 2, false", - "null, 1, null", - "1, null, null", - "null, null, null" - }, nullValues = "null") - void greaterEqTest(Integer a, Integer b, Boolean result) { - var term = IntTerms.greaterEq(IntTerms.constant(a), IntTerms.constant(b)); - assertThat(term.getType(), is(Boolean.class)); - assertThat(term.evaluate(Valuation.empty()), is(result)); - } - - @ParameterizedTest(name = "{0} as int == {1}") - @MethodSource - void asIntTest(Double a, Integer result) { - var term = IntTerms.asInt(RealTerms.constant(a)); - assertThat(term.getType(), is(Integer.class)); - assertThat(term.evaluate(Valuation.empty()), is(result)); - } - - static Stream asIntTest() { - return Stream.of( - Arguments.of(2.0, 2), - Arguments.of(2.1, 2), - Arguments.of(2.9, 2), - Arguments.of(-2.0, -2), - Arguments.of(-2.1, -2), - Arguments.of(-2.9, -2), - Arguments.of(0.0, 0), - Arguments.of(-0.0, 0), - Arguments.of(Double.POSITIVE_INFINITY, Integer.MAX_VALUE), - Arguments.of(Double.NEGATIVE_INFINITY, Integer.MIN_VALUE), - Arguments.of(Double.NaN, null), - Arguments.of(null, null) - ); - } -} diff --git a/subprojects/store-query/src/test/java/tools/refinery/store/query/term/real/RealTermEvaluateTest.java b/subprojects/store-query/src/test/java/tools/refinery/store/query/term/real/RealTermEvaluateTest.java deleted file mode 100644 index 6a8eebf1..00000000 --- a/subprojects/store-query/src/test/java/tools/refinery/store/query/term/real/RealTermEvaluateTest.java +++ /dev/null @@ -1,238 +0,0 @@ -/* - * SPDX-FileCopyrightText: 2021-2023 The Refinery Authors - * - * SPDX-License-Identifier: EPL-2.0 - */ -package tools.refinery.store.query.term.real; - -import org.hamcrest.Matcher; -import org.junit.jupiter.params.ParameterizedTest; -import org.junit.jupiter.params.provider.CsvSource; -import tools.refinery.store.query.term.int_.IntTerms; -import tools.refinery.store.query.valuation.Valuation; - -import static org.hamcrest.MatcherAssert.assertThat; -import static org.hamcrest.Matchers.*; - -class RealTermEvaluateTest { - public static final double TOLERANCE = 1e-6; - - private static Matcher closeToOrNull(Double expected) { - return expected == null ? nullValue(Double.class) : closeTo(expected, TOLERANCE); - } - - @ParameterizedTest(name = "+{0} == {1}") - @CsvSource(value = { - "2.5, 2.5", - "null, null" - }, nullValues = "null") - void plusTest(Double a, Double result) { - var term = RealTerms.plus(RealTerms.constant(a)); - assertThat(term.getType(), is(Double.class)); - assertThat(term.evaluate(Valuation.empty()), closeToOrNull(result)); - } - - @ParameterizedTest(name = "-{0} == {1}") - @CsvSource(value = { - "2.5, -2.5", - "null, null" - }, nullValues = "null") - void minusTest(Double a, Double result) { - var term = RealTerms.minus(RealTerms.constant(a)); - assertThat(term.getType(), is(Double.class)); - assertThat(term.evaluate(Valuation.empty()), closeToOrNull(result)); - } - - @ParameterizedTest(name = "{0} + {1} == {2}") - @CsvSource(value = { - "1.2, 2.3, 3.5", - "null, 2.3, null", - "1.2, null, null", - "null, null, null" - }, nullValues = "null") - void addTest(Double a, Double b, Double result) { - var term = RealTerms.add(RealTerms.constant(a), RealTerms.constant(b)); - assertThat(term.getType(), is(Double.class)); - assertThat(term.evaluate(Valuation.empty()), closeToOrNull(result)); - } - - @ParameterizedTest(name = "{0} - {1} == {2}") - @CsvSource(value = { - "1.2, 3.4, -2.2", - "null, 3.4, null", - "1.2, null, null", - "null, null, null" - }, nullValues = "null") - void subTest(Double a, Double b, Double result) { - var term = RealTerms.sub(RealTerms.constant(a), RealTerms.constant(b)); - assertThat(term.getType(), is(Double.class)); - assertThat(term.evaluate(Valuation.empty()), closeToOrNull(result)); - } - - @ParameterizedTest(name = "{0} * {1} == {2}") - @CsvSource(value = { - "2.3, 3.4, 7.82", - "null, 3.4, null", - "2.3, null, null", - "null, null, null" - }, nullValues = "null") - void mulTest(Double a, Double b, Double result) { - var term = RealTerms.mul(RealTerms.constant(a), RealTerms.constant(b)); - assertThat(term.getType(), is(Double.class)); - assertThat(term.evaluate(Valuation.empty()), closeToOrNull(result)); - } - - @ParameterizedTest(name = "{0} * {1} == {2}") - @CsvSource(value = { - "7.82, 3.4, 2.3", - "null, 3.4, null", - "7.82, null, null", - "null, null, null" - }, nullValues = "null") - void divTest(Double a, Double b, Double result) { - var term = RealTerms.div(RealTerms.constant(a), RealTerms.constant(b)); - assertThat(term.getType(), is(Double.class)); - assertThat(term.evaluate(Valuation.empty()), closeToOrNull(result)); - } - - @ParameterizedTest(name = "{0} ** {1} == {2}") - @CsvSource(value = { - "2.0, 6.0, 64.0", - "null, 6.0, null", - "2.0, null, null", - "null, null, null" - }, nullValues = "null") - void powTest(Double a, Double b, Double result) { - var term = RealTerms.pow(RealTerms.constant(a), RealTerms.constant(b)); - assertThat(term.getType(), is(Double.class)); - assertThat(term.evaluate(Valuation.empty()), closeToOrNull(result)); - } - - @ParameterizedTest(name = "min({0}, {1}) == {2}") - @CsvSource(value = { - "1.5, 2.7, 1.5", - "2.7, 1.5, 1.5", - "null, 2.7, null", - "1.5, null, null", - "null, null, null" - }, nullValues = "null") - void minTest(Double a, Double b, Double result) { - var term = RealTerms.min(RealTerms.constant(a), RealTerms.constant(b)); - assertThat(term.getType(), is(Double.class)); - assertThat(term.evaluate(Valuation.empty()), closeToOrNull(result)); - } - - @ParameterizedTest(name = "max({0}, {1}) == {2}") - @CsvSource(value = { - "1.5, 2.7, 2.7", - "2.7, 1.7, 2.7", - "null, 2.7, null", - "1.5, null, null", - "null, null, null" - }, nullValues = "null") - void maxTest(Double a, Double b, Double result) { - var term = RealTerms.max(RealTerms.constant(a), RealTerms.constant(b)); - assertThat(term.getType(), is(Double.class)); - assertThat(term.evaluate(Valuation.empty()), closeToOrNull(result)); - } - - @ParameterizedTest(name = "({0} == {1}) == {2}") - @CsvSource(value = { - "1.5, 1.5, true", - "1.5, 2.7, false", - "null, 1.5, null", - "1.5, null, null", - "null, null, null" - }, nullValues = "null") - void eqTest(Double a, Double b, Boolean result) { - var term = RealTerms.eq(RealTerms.constant(a), RealTerms.constant(b)); - assertThat(term.getType(), is(Boolean.class)); - assertThat(term.evaluate(Valuation.empty()), is(result)); - } - - @ParameterizedTest(name = "({0} != {1}) == {2}") - @CsvSource(value = { - "1.5, 1.5, false", - "1.5, 2.7, true", - "null, 1.5, null", - "1.5, null, null", - "null, null, null" - }, nullValues = "null") - void notEqTest(Double a, Double b, Boolean result) { - var term = RealTerms.notEq(RealTerms.constant(a), RealTerms.constant(b)); - assertThat(term.getType(), is(Boolean.class)); - assertThat(term.evaluate(Valuation.empty()), is(result)); - } - - @ParameterizedTest(name = "({0} < {1}) == {2}") - @CsvSource(value = { - "1.5, -2.7, false", - "1.5, 1.5, false", - "1.5, 2.7, true", - "null, 1.5, null", - "1.5, null, null", - "null, null, null" - }, nullValues = "null") - void lessTest(Double a, Double b, Boolean result) { - var term = RealTerms.less(RealTerms.constant(a), RealTerms.constant(b)); - assertThat(term.getType(), is(Boolean.class)); - assertThat(term.evaluate(Valuation.empty()), is(result)); - } - - @ParameterizedTest(name = "({0} <= {1}) == {2}") - @CsvSource(value = { - "1.5, -2.7, false", - "1.5, 1.5, true", - "1.5, 2.7, true", - "null, 1.5, null", - "1.5, null, null", - "null, null, null" - }, nullValues = "null") - void lessEqTest(Double a, Double b, Boolean result) { - var term = RealTerms.lessEq(RealTerms.constant(a), RealTerms.constant(b)); - assertThat(term.getType(), is(Boolean.class)); - assertThat(term.evaluate(Valuation.empty()), is(result)); - } - - @ParameterizedTest(name = "({0} > {1}) == {2}") - @CsvSource(value = { - "1.5, -2.7, true", - "1.5, 1.5, false", - "1.5, 2.7, false", - "null, 1.5, null", - "1.5, null, null", - "null, null, null" - }, nullValues = "null") - void greaterTest(Double a, Double b, Boolean result) { - var term = RealTerms.greater(RealTerms.constant(a), RealTerms.constant(b)); - assertThat(term.getType(), is(Boolean.class)); - assertThat(term.evaluate(Valuation.empty()), is(result)); - } - - @ParameterizedTest(name = "({0} >= {1}) == {2}") - @CsvSource(value = { - "1.5, -2.7, true", - "1.5, 1.5, true", - "1.5, 2.7, false", - "null, 1.5, null", - "1.5, null, null", - "null, null, null" - }, nullValues = "null") - void greaterEqTest(Double a, Double b, Boolean result) { - var term = RealTerms.greaterEq(RealTerms.constant(a), RealTerms.constant(b)); - assertThat(term.getType(), is(Boolean.class)); - assertThat(term.evaluate(Valuation.empty()), is(result)); - } - - @ParameterizedTest(name = "{0} as real == {1}") - @CsvSource(value = { - "0, 0.0", - "5, 5.0", - "null, null" - }, nullValues = "null") - void asRealTest(Integer a, Double result) { - var term = RealTerms.asReal(IntTerms.constant(a)); - assertThat(term.getType(), is(Double.class)); - assertThat(term.evaluate(Valuation.empty()), closeToOrNull(result)); - } -} diff --git a/subprojects/store-query/src/test/java/tools/refinery/store/query/term/uppercardinality/UpperCardinalitySumAggregatorStreamTest.java b/subprojects/store-query/src/test/java/tools/refinery/store/query/term/uppercardinality/UpperCardinalitySumAggregatorStreamTest.java deleted file mode 100644 index 31baf36e..00000000 --- a/subprojects/store-query/src/test/java/tools/refinery/store/query/term/uppercardinality/UpperCardinalitySumAggregatorStreamTest.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.term.uppercardinality; - -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.is; - -class UpperCardinalitySumAggregatorStreamTest { - @ParameterizedTest - @MethodSource - void testStream(List list, UpperCardinality expected) { - var result = UpperCardinalitySumAggregator.INSTANCE.aggregateStream(list.stream()); - assertThat(result, is(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/src/test/java/tools/refinery/store/query/term/uppercardinality/UpperCardinalitySumAggregatorTest.java b/subprojects/store-query/src/test/java/tools/refinery/store/query/term/uppercardinality/UpperCardinalitySumAggregatorTest.java deleted file mode 100644 index 780cd0ab..00000000 --- a/subprojects/store-query/src/test/java/tools/refinery/store/query/term/uppercardinality/UpperCardinalitySumAggregatorTest.java +++ /dev/null @@ -1,80 +0,0 @@ -/* - * SPDX-FileCopyrightText: 2021-2023 The Refinery Authors - * - * SPDX-License-Identifier: EPL-2.0 - */ -package tools.refinery.store.query.term.uppercardinality; - -import org.junit.jupiter.api.BeforeEach; -import org.junit.jupiter.api.Test; -import tools.refinery.store.query.term.StatefulAggregate; -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.is; - -class UpperCardinalitySumAggregatorTest { - private StatefulAggregate accumulator; - - @BeforeEach - void beforeEach() { - accumulator = UpperCardinalitySumAggregator.INSTANCE.createEmptyAggregate(); - } - - @Test - void emptyAggregationTest() { - assertThat(accumulator.getResult(), is(UpperCardinality.of(0))); - } - - @Test - void singleBoundedTest() { - accumulator.add(UpperCardinality.of(3)); - assertThat(accumulator.getResult(), is(UpperCardinality.of(3))); - } - - @Test - void multipleBoundedTest() { - accumulator.add(UpperCardinality.of(2)); - accumulator.add(UpperCardinality.of(3)); - assertThat(accumulator.getResult(), is(UpperCardinality.of(5))); - } - - @Test - void singleUnboundedTest() { - accumulator.add(UpperCardinalities.UNBOUNDED); - assertThat(accumulator.getResult(), is(UpperCardinalities.UNBOUNDED)); - } - - @Test - void multipleUnboundedTest() { - accumulator.add(UpperCardinalities.UNBOUNDED); - accumulator.add(UpperCardinalities.UNBOUNDED); - assertThat(accumulator.getResult(), is(UpperCardinalities.UNBOUNDED)); - } - - @Test - void removeBoundedTest() { - accumulator.add(UpperCardinality.of(2)); - accumulator.add(UpperCardinality.of(3)); - accumulator.remove(UpperCardinality.of(2)); - assertThat(accumulator.getResult(), is(UpperCardinality.of(3))); - } - - @Test - void removeAllUnboundedTest() { - accumulator.add(UpperCardinalities.UNBOUNDED); - accumulator.add(UpperCardinality.of(3)); - accumulator.remove(UpperCardinalities.UNBOUNDED); - assertThat(accumulator.getResult(), is(UpperCardinality.of(3))); - } - - @Test - void removeSomeUnboundedTest() { - accumulator.add(UpperCardinalities.UNBOUNDED); - accumulator.add(UpperCardinalities.UNBOUNDED); - accumulator.add(UpperCardinality.of(3)); - accumulator.remove(UpperCardinalities.UNBOUNDED); - assertThat(accumulator.getResult(), is(UpperCardinalities.UNBOUNDED)); - } -} diff --git a/subprojects/store-query/src/test/java/tools/refinery/store/query/term/uppercardinality/UpperCardinalityTermsEvaluateTest.java b/subprojects/store-query/src/test/java/tools/refinery/store/query/term/uppercardinality/UpperCardinalityTermsEvaluateTest.java deleted file mode 100644 index 9d0f3bde..00000000 --- a/subprojects/store-query/src/test/java/tools/refinery/store/query/term/uppercardinality/UpperCardinalityTermsEvaluateTest.java +++ /dev/null @@ -1,104 +0,0 @@ -/* - * SPDX-FileCopyrightText: 2021-2023 The Refinery Authors - * - * SPDX-License-Identifier: EPL-2.0 - */ -package tools.refinery.store.query.term.uppercardinality; - -import org.junit.jupiter.params.ParameterizedTest; -import org.junit.jupiter.params.provider.Arguments; -import org.junit.jupiter.params.provider.MethodSource; -import tools.refinery.store.query.valuation.Valuation; -import tools.refinery.store.representation.cardinality.UpperCardinalities; -import tools.refinery.store.representation.cardinality.UpperCardinality; - -import java.util.stream.Stream; - -import static org.hamcrest.MatcherAssert.assertThat; -import static org.hamcrest.Matchers.is; - -class UpperCardinalityTermsEvaluateTest { - @ParameterizedTest(name = "min({0}, {1}) == {2}") - @MethodSource - void minTest(UpperCardinality a, UpperCardinality b, UpperCardinality expected) { - var term = UpperCardinalityTerms.min(UpperCardinalityTerms.constant(a), UpperCardinalityTerms.constant(b)); - assertThat(term.getType(), is(UpperCardinality.class)); - assertThat(term.evaluate(Valuation.empty()), is(expected)); - } - - static Stream minTest() { - return Stream.of( - Arguments.of(UpperCardinality.of(0), UpperCardinality.of(0), UpperCardinality.of(0)), - Arguments.of(UpperCardinality.of(0), UpperCardinality.of(1), UpperCardinality.of(0)), - Arguments.of(UpperCardinality.of(1), UpperCardinality.of(0), UpperCardinality.of(0)), - Arguments.of(UpperCardinality.of(0), UpperCardinalities.UNBOUNDED, UpperCardinality.of(0)), - Arguments.of(UpperCardinalities.UNBOUNDED, UpperCardinality.of(0), UpperCardinality.of(0)), - Arguments.of(UpperCardinalities.UNBOUNDED, UpperCardinalities.UNBOUNDED, UpperCardinalities.UNBOUNDED), - Arguments.of(UpperCardinality.of(1), null, null), - Arguments.of(null, UpperCardinality.of(1), null), - Arguments.of(null, null, null) - ); - } - - @ParameterizedTest(name = "max({0}, {1}) == {2}") - @MethodSource - void maxTest(UpperCardinality a, UpperCardinality b, UpperCardinality expected) { - var term = UpperCardinalityTerms.max(UpperCardinalityTerms.constant(a), UpperCardinalityTerms.constant(b)); - assertThat(term.getType(), is(UpperCardinality.class)); - assertThat(term.evaluate(Valuation.empty()), is(expected)); - } - - static Stream maxTest() { - return Stream.of( - Arguments.of(UpperCardinality.of(0), UpperCardinality.of(0), UpperCardinality.of(0)), - Arguments.of(UpperCardinality.of(0), UpperCardinality.of(1), UpperCardinality.of(1)), - Arguments.of(UpperCardinality.of(1), UpperCardinality.of(0), UpperCardinality.of(1)), - Arguments.of(UpperCardinality.of(0), UpperCardinalities.UNBOUNDED, UpperCardinalities.UNBOUNDED), - Arguments.of(UpperCardinalities.UNBOUNDED, UpperCardinality.of(0), UpperCardinalities.UNBOUNDED), - Arguments.of(UpperCardinalities.UNBOUNDED, UpperCardinalities.UNBOUNDED, UpperCardinalities.UNBOUNDED), - Arguments.of(UpperCardinality.of(1), null, null), - Arguments.of(null, UpperCardinality.of(1), null), - Arguments.of(null, null, null) - ); - } - - @ParameterizedTest(name = "{0} + {1} == {2}") - @MethodSource - void addTest(UpperCardinality a, UpperCardinality b, UpperCardinality expected) { - var term = UpperCardinalityTerms.add(UpperCardinalityTerms.constant(a), UpperCardinalityTerms.constant(b)); - assertThat(term.getType(), is(UpperCardinality.class)); - assertThat(term.evaluate(Valuation.empty()), is(expected)); - } - - static Stream addTest() { - return Stream.of( - Arguments.of(UpperCardinality.of(2), UpperCardinality.of(3), UpperCardinality.of(5)), - Arguments.of(UpperCardinality.of(2), UpperCardinalities.UNBOUNDED, UpperCardinalities.UNBOUNDED), - Arguments.of(UpperCardinalities.UNBOUNDED, UpperCardinality.of(2), UpperCardinalities.UNBOUNDED), - Arguments.of(UpperCardinalities.UNBOUNDED, UpperCardinalities.UNBOUNDED, UpperCardinalities.UNBOUNDED), - Arguments.of(UpperCardinality.of(1), null, null), - Arguments.of(null, UpperCardinality.of(1), null), - Arguments.of(null, null, null) - ); - } - - @ParameterizedTest(name = "{0} * {1} == {2}") - @MethodSource - void mulTest(UpperCardinality a, UpperCardinality b, UpperCardinality expected) { - var term = UpperCardinalityTerms.mul(UpperCardinalityTerms.constant(a), UpperCardinalityTerms.constant(b)); - assertThat(term.getType(), is(UpperCardinality.class)); - assertThat(term.evaluate(Valuation.empty()), is(expected)); - } - - static Stream mulTest() { - return Stream.of( - Arguments.of(UpperCardinality.of(2), UpperCardinality.of(3), UpperCardinality.of(6)), - Arguments.of(UpperCardinality.of(2), UpperCardinalities.UNBOUNDED, UpperCardinalities.UNBOUNDED), - Arguments.of(UpperCardinalities.UNBOUNDED, UpperCardinality.of(2), UpperCardinalities.UNBOUNDED), - Arguments.of(UpperCardinalities.UNBOUNDED, UpperCardinalities.UNBOUNDED, UpperCardinalities.UNBOUNDED), - Arguments.of(UpperCardinality.of(1), null, null), - Arguments.of(null, UpperCardinality.of(1), null), - Arguments.of(null, null, null) - ); - } -} 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 deleted file mode 100644 index d447e99c..00000000 --- a/subprojects/store-query/src/test/java/tools/refinery/store/query/tests/StructurallyEqualToRawTest.java +++ /dev/null @@ -1,159 +0,0 @@ -/* - * SPDX-FileCopyrightText: 2021-2023 The Refinery Authors - * - * SPDX-License-Identifier: EPL-2.0 - */ -package tools.refinery.store.query.tests; - -import org.junit.jupiter.api.Test; -import tools.refinery.store.query.dnf.Dnf; -import tools.refinery.store.query.dnf.SymbolicParameter; -import tools.refinery.store.query.term.NodeVariable; -import tools.refinery.store.query.term.ParameterDirection; -import tools.refinery.store.query.term.Variable; -import tools.refinery.store.query.view.AnySymbolView; -import tools.refinery.store.query.view.KeyOnlyView; -import tools.refinery.store.representation.Symbol; - -import java.util.List; - -import static org.hamcrest.CoreMatchers.containsString; -import static org.hamcrest.MatcherAssert.assertThat; -import static org.hamcrest.Matchers.allOf; -import static org.junit.jupiter.api.Assertions.assertThrows; -import static tools.refinery.store.query.tests.QueryMatchers.structurallyEqualTo; - -class StructurallyEqualToRawTest { - private static final Symbol person = Symbol.of("Person", 1); - private static final Symbol friend = Symbol.of("friend", 2); - private static final AnySymbolView personView = new KeyOnlyView<>(person); - private static final AnySymbolView friendView = new KeyOnlyView<>(friend); - private static final NodeVariable p = Variable.of("p"); - private static final NodeVariable q = Variable.of("q"); - - @Test - void flatEqualsTest() { - var actual = Dnf.builder("Actual").parameters(p).clause(personView.call(p)).build(); - - assertThat(actual, structurallyEqualTo( - List.of(new SymbolicParameter(q, ParameterDirection.OUT)), - List.of(List.of(personView.call(q))) - )); - } - - @Test - void flatNotEqualsTest() { - var actual = Dnf.builder("Actual").parameters(p).clause(friendView.call(p, q)).build(); - - var assertion = structurallyEqualTo( - List.of(new SymbolicParameter(q, ParameterDirection.OUT)), - List.of(List.of(friendView.call(q, q))) - ); - assertThrows(AssertionError.class, () -> assertThat(actual, assertion)); - } - - @Test - void deepEqualsTest() { - var actual = Dnf.builder("Actual").parameters(q).clause( - Dnf.builder("Actual2").parameters(p).clause(personView.call(p)).build().call(q) - ).build(); - - assertThat(actual, structurallyEqualTo( - List.of(new SymbolicParameter(q, ParameterDirection.OUT)), - List.of( - List.of( - Dnf.builder("Expected2").parameters(p).clause(personView.call(p)).build().call(q) - ) - ) - )); - } - - @Test - void deepNotEqualsTest() { - var actual = Dnf.builder("Actual").parameter(q).clause( - Dnf.builder("Actual2").parameters(p).clause(friendView.call(p, q)).build().call(q) - ).build(); - - var assertion = structurallyEqualTo( - List.of(new SymbolicParameter(q, ParameterDirection.OUT)), - List.of( - List.of( - Dnf.builder("Expected2") - .parameters(p) - .clause(friendView.call(p, p)) - .build() - .call(q) - ) - ) - ); - var error = assertThrows(AssertionError.class, () -> assertThat(actual, assertion)); - assertThat(error.getMessage(), allOf(containsString("Expected2"), containsString("Actual2"))); - } - - @Test - void parameterListLengthMismatchTest() { - var actual = Dnf.builder("Actual").parameters(p, q).clause( - friendView.call(p, q) - ).build(); - - var assertion = structurallyEqualTo( - List.of(new SymbolicParameter(p, ParameterDirection.OUT)), - List.of(List.of(friendView.call(p, p))) - ); - - assertThrows(AssertionError.class, () -> assertThat(actual, assertion)); - } - - @Test - void parameterDirectionMismatchTest() { - var actual = Dnf.builder("Actual").parameter(p, ParameterDirection.IN).clause( - personView.call(p) - ).build(); - - var assertion = structurallyEqualTo( - List.of(new SymbolicParameter(p, ParameterDirection.OUT)), - List.of(List.of(personView.call(p))) - ); - - assertThrows(AssertionError.class, () -> assertThat(actual, assertion)); - } - - @Test - void clauseCountMismatchTest() { - var actual = Dnf.builder("Actual").parameters(p, q).clause( - friendView.call(p, q) - ).build(); - - var assertion = structurallyEqualTo( - List.of( - new SymbolicParameter(p, ParameterDirection.OUT), - new SymbolicParameter(q, ParameterDirection.OUT) - ), - List.of( - List.of(friendView.call(p, q)), - List.of(friendView.call(q, p)) - ) - ); - - assertThrows(AssertionError.class, () -> assertThat(actual, assertion)); - } - - @Test - void literalCountMismatchTest() { - var actual = Dnf.builder("Actual").parameters(p, q).clause( - friendView.call(p, q) - ).build(); - - var assertion = structurallyEqualTo( - List.of( - new SymbolicParameter(p, ParameterDirection.OUT), - new SymbolicParameter(q, ParameterDirection.OUT) - ), - List.of( - List.of(friendView.call(p, q), friendView.call(q, p)) - ) - ); - - assertThrows(AssertionError.class, () -> assertThat(actual, assertion)); - } -} 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 deleted file mode 100644 index f716b805..00000000 --- a/subprojects/store-query/src/test/java/tools/refinery/store/query/tests/StructurallyEqualToTest.java +++ /dev/null @@ -1,127 +0,0 @@ -/* - * SPDX-FileCopyrightText: 2021-2023 The Refinery Authors - * - * SPDX-License-Identifier: EPL-2.0 - */ -package tools.refinery.store.query.tests; - -import org.junit.jupiter.api.Test; -import tools.refinery.store.query.dnf.Dnf; -import tools.refinery.store.query.term.NodeVariable; -import tools.refinery.store.query.term.ParameterDirection; -import tools.refinery.store.query.term.Variable; -import tools.refinery.store.query.view.AnySymbolView; -import tools.refinery.store.query.view.KeyOnlyView; -import tools.refinery.store.representation.Symbol; - -import static org.hamcrest.CoreMatchers.containsString; -import static org.hamcrest.MatcherAssert.assertThat; -import static org.junit.jupiter.api.Assertions.assertThrows; -import static tools.refinery.store.query.tests.QueryMatchers.structurallyEqualTo; - -class StructurallyEqualToTest { - private static final Symbol person = Symbol.of("Person", 1); - private static final Symbol friend = Symbol.of("friend", 2); - private static final AnySymbolView personView = new KeyOnlyView<>(person); - private static final AnySymbolView friendView = new KeyOnlyView<>(friend); - private static final NodeVariable p = Variable.of("p"); - private static final NodeVariable q = Variable.of("q"); - - @Test - void flatEqualsTest() { - var expected = Dnf.builder("Expected").parameters(q).clause(personView.call(q)).build(); - var actual = Dnf.builder("Actual").parameters(p).clause(personView.call(p)).build(); - - assertThat(actual, structurallyEqualTo(expected)); - } - - @Test - void flatNotEqualsTest() { - var expected = Dnf.builder("Expected").parameters(q).clause(friendView.call(q, q)).build(); - var actual = Dnf.builder("Actual").parameters(p).clause(friendView.call(p, q)).build(); - - var assertion = structurallyEqualTo(expected); - assertThrows(AssertionError.class, () -> assertThat(actual, assertion)); - } - - @Test - void deepEqualsTest() { - var expected = Dnf.builder("Expected").parameters(q).clause( - Dnf.builder("Expected2").parameters(p).clause(personView.call(p)).build().call(q) - ).build(); - var actual = Dnf.builder("Actual").parameters(q).clause( - Dnf.builder("Actual2").parameters(p).clause(personView.call(p)).build().call(q) - ).build(); - - assertThat(actual, structurallyEqualTo(expected)); - } - - @Test - void deepNotEqualsTest() { - var expected = Dnf.builder("Expected").parameters(q).clause( - Dnf.builder("Expected2").parameters(p).clause(friendView.call(p, p)).build().call(q) - ).build(); - var actual = Dnf.builder("Actual").parameter(q).clause( - Dnf.builder("Actual2").parameters(p).clause(friendView.call(p, q)).build().call(q) - ).build(); - - var assertion = structurallyEqualTo(expected); - var error = assertThrows(AssertionError.class, () -> assertThat(actual, assertion)); - assertThat(error.getMessage(), containsString(" called from Expected/1 ")); - } - - @Test - void parameterListLengthMismatchTest() { - var expected = Dnf.builder("Expected").parameter(p).clause( - friendView.call(p, p) - ).build(); - var actual = Dnf.builder("Actual").parameters(p, q).clause( - friendView.call(p, q) - ).build(); - - var assertion = structurallyEqualTo(expected); - assertThrows(AssertionError.class, () -> assertThat(actual, assertion)); - } - - @Test - void parameterDirectionMismatchTest() { - var expected = Dnf.builder("Expected").parameter(p, ParameterDirection.OUT).clause( - personView.call(p) - ).build(); - var actual = Dnf.builder("Actual").parameter(p, ParameterDirection.IN).clause( - personView.call(p) - ).build(); - - var assertion = structurallyEqualTo(expected); - assertThrows(AssertionError.class, () -> assertThat(actual, assertion)); - } - - @Test - void clauseCountMismatchTest() { - var expected = Dnf.builder("Expected") - .parameters(p, q) - .clause(friendView.call(p, q)) - .clause(friendView.call(q, p)) - .build(); - var actual = Dnf.builder("Actual").parameters(p, q).clause( - friendView.call(p, q) - ).build(); - - var assertion = structurallyEqualTo(expected); - assertThrows(AssertionError.class, () -> assertThat(actual, assertion)); - } - - @Test - void literalCountMismatchTest() { - var expected = Dnf.builder("Expected").parameters(p, q).clause( - friendView.call(p, q), - friendView.call(q, p) - ).build(); - var actual = Dnf.builder("Actual").parameters(p, q).clause( - friendView.call(p, q) - ).build(); - - var assertion = structurallyEqualTo(expected); - assertThrows(AssertionError.class, () -> assertThat(actual, assertion)); - } -} diff --git a/subprojects/store-query/src/testFixtures/java/tools/refinery/store/query/tests/MismatchDescribingDnfEqualityChecker.java b/subprojects/store-query/src/testFixtures/java/tools/refinery/store/query/tests/MismatchDescribingDnfEqualityChecker.java deleted file mode 100644 index 6a3301b3..00000000 --- a/subprojects/store-query/src/testFixtures/java/tools/refinery/store/query/tests/MismatchDescribingDnfEqualityChecker.java +++ /dev/null @@ -1,68 +0,0 @@ -/* - * SPDX-FileCopyrightText: 2021-2023 The Refinery Authors - * - * SPDX-License-Identifier: EPL-2.0 - */ -package tools.refinery.store.query.tests; - -import org.hamcrest.Description; -import tools.refinery.store.query.dnf.Dnf; -import tools.refinery.store.query.dnf.SymbolicParameter; -import tools.refinery.store.query.equality.DeepDnfEqualityChecker; -import tools.refinery.store.query.literal.Literal; - -import java.util.List; - -class MismatchDescribingDnfEqualityChecker extends DeepDnfEqualityChecker { - private final Description description; - private boolean raw; - private boolean needsDescription = true; - - MismatchDescribingDnfEqualityChecker(Description description) { - this.description = description; - } - - public boolean needsDescription() { - return needsDescription; - } - - @Override - public boolean dnfEqualRaw(List symbolicParameters, List> clauses, Dnf other) { - try { - raw = true; - boolean result = super.dnfEqualRaw(symbolicParameters, clauses, other); - if (!result && needsDescription) { - description.appendText("was ").appendText(other.toDefinitionString()); - } - return false; - } finally { - raw = false; - } - } - - @Override - protected boolean doCheckEqual(Pair pair) { - boolean result = super.doCheckEqual(pair); - if (!result && needsDescription) { - describeMismatch(pair); - // Only describe the first found (innermost) mismatch. - needsDescription = false; - } - return result; - } - - private void describeMismatch(Pair pair) { - var inProgress = getInProgress(); - int size = inProgress.size(); - if (size <= 1 && !raw) { - description.appendText("was ").appendText(pair.right().toDefinitionString()); - return; - } - var last = inProgress.get(size - 1); - description.appendText("expected ").appendText(last.left().toDefinitionString()); - for (int i = size - 2; i >= 0; i--) { - description.appendText(" called from ").appendText(inProgress.get(i).left().toString()); - } - description.appendText(" was not structurally equal to ").appendText(last.right().toDefinitionString()); - } -} diff --git a/subprojects/store-query/src/testFixtures/java/tools/refinery/store/query/tests/QueryMatchers.java b/subprojects/store-query/src/testFixtures/java/tools/refinery/store/query/tests/QueryMatchers.java deleted file mode 100644 index cd449a6a..00000000 --- a/subprojects/store-query/src/testFixtures/java/tools/refinery/store/query/tests/QueryMatchers.java +++ /dev/null @@ -1,46 +0,0 @@ -/* - * SPDX-FileCopyrightText: 2021-2023 The Refinery Authors - * - * SPDX-License-Identifier: EPL-2.0 - */ -package tools.refinery.store.query.tests; - -import org.hamcrest.Matcher; -import tools.refinery.store.query.dnf.Dnf; -import tools.refinery.store.query.dnf.SymbolicParameter; -import tools.refinery.store.query.literal.Literal; - -import java.util.List; - -public final class QueryMatchers { - private QueryMatchers() { - throw new IllegalStateException("This is a static utility class and should not be instantiated directly"); - } - - /** - * Compare two {@link Dnf} instances up to renaming of variables. - * - * @param expected The expected {@link Dnf} instance. - * @return A Hamcrest matcher for equality up to renaming of variables. - */ - public static Matcher structurallyEqualTo(Dnf expected) { - return new StructurallyEqualTo(expected); - } - - /** - * Compare a {@link Dnf} instance to another predicate in DNF form without constructing it. - *

- * This matcher should be used instead of {@link #structurallyEqualTo(Dnf)} when the validation and - * pre-processing associated with the {@link Dnf} constructor, i.e., validation of parameter directions, - * topological sorting of literals, and the reduction of trivial predicates is not desired. In particular, this - * matcher can be used to test for exact order of literal after pre-processing. - * - * @param expectedSymbolicParameters The expected list of symbolic parameters. - * @param expectedLiterals The expected clauses. Each clause is represented by a list of literals. - * @return A Hamcrest matcher for equality up to renaming of variables. - */ - public static Matcher structurallyEqualTo(List expectedSymbolicParameters, - List> expectedLiterals) { - return new StructurallyEqualToRaw(expectedSymbolicParameters, expectedLiterals); - } -} diff --git a/subprojects/store-query/src/testFixtures/java/tools/refinery/store/query/tests/StructurallyEqualTo.java b/subprojects/store-query/src/testFixtures/java/tools/refinery/store/query/tests/StructurallyEqualTo.java deleted file mode 100644 index 86149141..00000000 --- a/subprojects/store-query/src/testFixtures/java/tools/refinery/store/query/tests/StructurallyEqualTo.java +++ /dev/null @@ -1,41 +0,0 @@ -/* - * SPDX-FileCopyrightText: 2021-2023 The Refinery Authors - * - * SPDX-License-Identifier: EPL-2.0 - */ -package tools.refinery.store.query.tests; - -import org.hamcrest.Description; -import org.hamcrest.TypeSafeMatcher; -import tools.refinery.store.query.dnf.Dnf; -import tools.refinery.store.query.equality.DeepDnfEqualityChecker; - -public class StructurallyEqualTo extends TypeSafeMatcher { - private final Dnf expected; - - public StructurallyEqualTo(Dnf expected) { - this.expected = expected; - } - - @Override - protected boolean matchesSafely(Dnf item) { - var checker = new DeepDnfEqualityChecker(); - return checker.dnfEqual(expected, item); - } - - @Override - protected void describeMismatchSafely(Dnf item, Description mismatchDescription) { - var describingChecker = new MismatchDescribingDnfEqualityChecker(mismatchDescription); - if (describingChecker.dnfEqual(expected, item)) { - throw new IllegalStateException("Mismatched Dnf was matching on repeated comparison"); - } - if (describingChecker.needsDescription()) { - super.describeMismatchSafely(item, mismatchDescription); - } - } - - @Override - public void describeTo(Description description) { - description.appendText("structurally equal to ").appendText(expected.toDefinitionString()); - } -} diff --git a/subprojects/store-query/src/testFixtures/java/tools/refinery/store/query/tests/StructurallyEqualToRaw.java b/subprojects/store-query/src/testFixtures/java/tools/refinery/store/query/tests/StructurallyEqualToRaw.java deleted file mode 100644 index 2f8c2944..00000000 --- a/subprojects/store-query/src/testFixtures/java/tools/refinery/store/query/tests/StructurallyEqualToRaw.java +++ /dev/null @@ -1,51 +0,0 @@ -/* - * SPDX-FileCopyrightText: 2021-2023 The Refinery Authors - * - * SPDX-License-Identifier: EPL-2.0 - */ -package tools.refinery.store.query.tests; - -import org.hamcrest.Description; -import org.hamcrest.TypeSafeMatcher; -import tools.refinery.store.query.dnf.Dnf; -import tools.refinery.store.query.dnf.SymbolicParameter; -import tools.refinery.store.query.equality.DeepDnfEqualityChecker; -import tools.refinery.store.query.literal.Literal; - -import java.util.List; - -public class StructurallyEqualToRaw extends TypeSafeMatcher { - private final List expectedSymbolicParameters; - private final List> expectedClauses; - - public StructurallyEqualToRaw(List expectedSymbolicParameters, - List> expectedClauses) { - this.expectedSymbolicParameters = expectedSymbolicParameters; - this.expectedClauses = expectedClauses; - } - - @Override - protected boolean matchesSafely(Dnf item) { - var checker = new DeepDnfEqualityChecker(); - return checker.dnfEqualRaw(expectedSymbolicParameters, expectedClauses, item); - } - - @Override - protected void describeMismatchSafely(Dnf item, Description mismatchDescription) { - var describingChecker = new MismatchDescribingDnfEqualityChecker(mismatchDescription); - if (describingChecker.dnfEqualRaw(expectedSymbolicParameters, expectedClauses, item)) { - throw new IllegalStateException("Mismatched Dnf was matching on repeated comparison"); - } - if (describingChecker.needsDescription()) { - super.describeMismatchSafely(item, mismatchDescription); - } - } - - @Override - public void describeTo(Description description) { - description.appendText("structurally equal to ") - .appendValueList("(", ", ", ")", expectedSymbolicParameters) - .appendText(" <-> ") - .appendValueList("", ", ", ".", expectedClauses); - } -} -- cgit v1.2.3-54-g00ecf