aboutsummaryrefslogtreecommitdiffstats
path: root/subprojects/store-query/src/main/java/tools/refinery/store/query/dnf/Dnf.java
diff options
context:
space:
mode:
Diffstat (limited to 'subprojects/store-query/src/main/java/tools/refinery/store/query/dnf/Dnf.java')
-rw-r--r--subprojects/store-query/src/main/java/tools/refinery/store/query/dnf/Dnf.java30
1 files changed, 26 insertions, 4 deletions
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
index 50b245f7..86a1b6b2 100644
--- 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
@@ -6,9 +6,12 @@
6package tools.refinery.store.query.dnf; 6package tools.refinery.store.query.dnf;
7 7
8import tools.refinery.store.query.Constraint; 8import tools.refinery.store.query.Constraint;
9import tools.refinery.store.query.literal.Reduction; 9import tools.refinery.store.query.InvalidQueryException;
10import tools.refinery.store.query.equality.DnfEqualityChecker; 10import tools.refinery.store.query.equality.DnfEqualityChecker;
11import tools.refinery.store.query.equality.LiteralEqualityHelper; 11import tools.refinery.store.query.equality.LiteralEqualityHelper;
12import tools.refinery.store.query.equality.SubstitutingLiteralEqualityHelper;
13import tools.refinery.store.query.equality.SubstitutingLiteralHashCodeHelper;
14import tools.refinery.store.query.literal.Reduction;
12import tools.refinery.store.query.term.Parameter; 15import tools.refinery.store.query.term.Parameter;
13import tools.refinery.store.query.term.Variable; 16import tools.refinery.store.query.term.Variable;
14 17
@@ -53,7 +56,7 @@ public final class Dnf implements Constraint {
53 FunctionalDependency<Variable> functionalDependency) { 56 FunctionalDependency<Variable> functionalDependency) {
54 for (var variable : toValidate) { 57 for (var variable : toValidate) {
55 if (!parameterSet.contains(variable)) { 58 if (!parameterSet.contains(variable)) {
56 throw new IllegalArgumentException( 59 throw new InvalidQueryException(
57 "Variable %s of functional dependency %s does not appear in the parameter list %s" 60 "Variable %s of functional dependency %s does not appear in the parameter list %s"
58 .formatted(variable, functionalDependency, symbolicParameters)); 61 .formatted(variable, functionalDependency, symbolicParameters));
59 } 62 }
@@ -66,7 +69,7 @@ public final class Dnf implements Constraint {
66 } 69 }
67 70
68 public boolean isExplicitlyNamed() { 71 public boolean isExplicitlyNamed() {
69 return name == null; 72 return name != null;
70 } 73 }
71 74
72 public String getUniqueName() { 75 public String getUniqueName() {
@@ -129,7 +132,7 @@ public final class Dnf implements Constraint {
129 return false; 132 return false;
130 } 133 }
131 for (int i = 0; i < numClauses; i++) { 134 for (int i = 0; i < numClauses; i++) {
132 var literalEqualityHelper = new LiteralEqualityHelper(callEqualityChecker, symbolicParameters, 135 var literalEqualityHelper = new SubstitutingLiteralEqualityHelper(callEqualityChecker, symbolicParameters,
133 other.symbolicParameters); 136 other.symbolicParameters);
134 if (!clauses.get(i).equalsWithSubstitution(literalEqualityHelper, other.clauses.get(i))) { 137 if (!clauses.get(i).equalsWithSubstitution(literalEqualityHelper, other.clauses.get(i))) {
135 return false; 138 return false;
@@ -146,6 +149,18 @@ public final class Dnf implements Constraint {
146 return false; 149 return false;
147 } 150 }
148 151
152 public int hashCodeWithSubstitution() {
153 var helper = new SubstitutingLiteralHashCodeHelper();
154 int result = 0;
155 for (var symbolicParameter : symbolicParameters) {
156 result = result * 31 + symbolicParameter.hashCodeWithSubstitution(helper);
157 }
158 for (var clause : clauses) {
159 result = result * 31 + clause.hashCodeWithSubstitution(helper);
160 }
161 return result;
162 }
163
149 @Override 164 @Override
150 public String toString() { 165 public String toString() {
151 return "%s/%d".formatted(name(), arity()); 166 return "%s/%d".formatted(name(), arity());
@@ -201,6 +216,13 @@ public final class Dnf implements Constraint {
201 return new DnfBuilder(name); 216 return new DnfBuilder(name);
202 } 217 }
203 218
219 public static DnfBuilder builderFrom(Dnf original) {
220 var builder = builder(original.name());
221 builder.symbolicParameters(original.getSymbolicParameters());
222 builder.functionalDependencies(original.getFunctionalDependencies());
223 return builder;
224 }
225
204 public static Dnf of(Consumer<DnfBuilder> callback) { 226 public static Dnf of(Consumer<DnfBuilder> callback) {
205 return of(null, callback); 227 return of(null, callback);
206 } 228 }