diff --git a/src/main/java/de/vill/conversion/ConvertGroupCardinality.java b/src/main/java/de/vill/conversion/ConvertGroupCardinality.java index 89f051e..01bfa41 100644 --- a/src/main/java/de/vill/conversion/ConvertGroupCardinality.java +++ b/src/main/java/de/vill/conversion/ConvertGroupCardinality.java @@ -81,9 +81,9 @@ private Constraint createConjunction(Set selectedFeatures, Set } private Constraint createDisjunction(Set constraints) { - MultiOrConstraint orConstraint = new MultiOrConstraint(); + OrConstraint orConstraint = new OrConstraint(); for (Constraint constraint : constraints) { - orConstraint.add_sub_part(constraint); + orConstraint.addChild(constraint); } return orConstraint; } diff --git a/src/main/java/de/vill/conversion/ConvertSMTLevel.java b/src/main/java/de/vill/conversion/ConvertSMTLevel.java index b45b99f..bbfd5b1 100644 --- a/src/main/java/de/vill/conversion/ConvertSMTLevel.java +++ b/src/main/java/de/vill/conversion/ConvertSMTLevel.java @@ -136,9 +136,9 @@ private Constraint createConjunction(Set selectedFeatures, Set } private Constraint createDisjunction(Set constraints) { - MultiOrConstraint orConstraint = new MultiOrConstraint(); + OrConstraint orConstraint = new OrConstraint(); for (Constraint constraint : constraints) { - orConstraint.add_sub_part(constraint); + orConstraint.addChild(constraint); } return orConstraint; } diff --git a/src/main/java/de/vill/model/building/AutomaticBrackets.java b/src/main/java/de/vill/model/building/AutomaticBrackets.java index fa9a80e..ca690fb 100644 --- a/src/main/java/de/vill/model/building/AutomaticBrackets.java +++ b/src/main/java/de/vill/model/building/AutomaticBrackets.java @@ -40,7 +40,6 @@ private AutomaticBrackets() {} constraintprecedenceLookup.put(EquivalenceConstraint.class, IFF_PRECEDENCE); constraintprecedenceLookup.put(ImplicationConstraint.class, IMPLY_PRECEDENCE); constraintprecedenceLookup.put(OrConstraint.class, OR_PRECEDENCE); - constraintprecedenceLookup.put(MultiOrConstraint.class, OR_PRECEDENCE); constraintprecedenceLookup.put(AndConstraint.class, AND_PRECEDENCE); constraintprecedenceLookup.put(GreaterEquationConstraint.class, GEQ_LEQ_PRECEDENCE); constraintprecedenceLookup.put(LowerEquationConstraint.class, GEQ_LEQ_PRECEDENCE); diff --git a/src/main/java/de/vill/model/constraint/AndConstraint.java b/src/main/java/de/vill/model/constraint/AndConstraint.java index 7587150..cd49b1d 100644 --- a/src/main/java/de/vill/model/constraint/AndConstraint.java +++ b/src/main/java/de/vill/model/constraint/AndConstraint.java @@ -3,67 +3,113 @@ import de.vill.model.building.AutomaticBrackets; import de.vill.model.building.VariableReference; +import de.vill.exception.ParseError; + import java.util.ArrayList; import java.util.Arrays; import java.util.List; import java.util.Objects; +import java.util.stream.Collectors; public class AndConstraint extends Constraint { - private Constraint left; - private Constraint right; + + private final List children = new ArrayList<>(); + + public AndConstraint(Constraint... constraints) { + for (Constraint c : constraints) { + if (c != null) { + children.add(c); + } + } + } public AndConstraint(Constraint left, Constraint right) { - this.left = left; - this.right = right; + this.children.add(left); + this.children.add(right); } public Constraint getLeft() { - return left; + if (children.isEmpty()) { + throw new ParseError("Left child can not be returned because there are no children."); + } else { + return children.get(0); + } } public Constraint getRight() { - return right; + if (children.isEmpty() || children.size() < 2) { + throw new ParseError("Right child can not be returned because there are less than two children."); + } else { + return children.get(children.size() - 1); + } + } + + public List getChildren() { + return children; } public void setLeft(Constraint left) { - this.left = left; + if (children.isEmpty()) { + children.add(left); + } else { + children.set(0, left); + } } - public void setRight(Constraint right){ - this.right = right; + public void setRight(Constraint right) { + if (children.size() < 2) { + if (children.size() < 1) { + children.add(null); + } + children.add(right); + } else { + children.set(children.size() - 1, right); + } } @Override public String toString(boolean withSubmodels, String currentAlias) { - return AutomaticBrackets.enforceConstraintBracketsIfNecessary(this, left, withSubmodels, currentAlias) + - " & " + - AutomaticBrackets.enforceConstraintBracketsIfNecessary(this, right, withSubmodels, currentAlias); + return children.stream() + .map(c -> AutomaticBrackets.enforceConstraintBracketsIfNecessary(this, c, withSubmodels, currentAlias)) + .collect(Collectors.joining(" & ")); } @Override public List getConstraintSubParts() { - return Arrays.asList(left, right); + return children; } @Override public void replaceConstraintSubPart(Constraint oldSubConstraint, Constraint newSubConstraint) { - if (left == oldSubConstraint) { - left = newSubConstraint; - } else if (right == oldSubConstraint) { - right = newSubConstraint; + for (int i = 0; i < children.size(); i++) { + if (children.get(i) == oldSubConstraint) { + children.set(i, newSubConstraint); + } } } @Override public Constraint clone() { - return new AndConstraint(left.clone(), right.clone()); + AndConstraint clone = new AndConstraint(); + for (Constraint c : children) { + clone.addChild(c.clone()); + } + return clone; + } + + public void addChild(Constraint constraint) { + if (constraint != null) { + children.add(constraint); + } } @Override public int hashCode(int level) { final int prime = 31; - int result = prime * level + (left == null ? 0 : left.hashCode(1 + level)); - result = prime * result + (right == null ? 0 : right.hashCode(1 + level)); + int result = prime * level; + for (Constraint c : children) { + result = prime * result + (c == null ? 0 : c.hashCode(1 + level)); + } return result; } @@ -76,14 +122,15 @@ public boolean equals(Object obj) { return false; } AndConstraint other = (AndConstraint) obj; - return Objects.equals(left, other.left) && Objects.equals(right, other.right); + return Objects.equals(children, other.children); } @Override public List getReferences() { List references = new ArrayList<>(); - references.addAll(left.getReferences()); - references.addAll(right.getReferences()); + for (Constraint c : children) { + references.addAll(c.getReferences()); + } return references; } } diff --git a/src/main/java/de/vill/model/constraint/MultiOrConstraint.java b/src/main/java/de/vill/model/constraint/MultiOrConstraint.java deleted file mode 100644 index bb31d49..0000000 --- a/src/main/java/de/vill/model/constraint/MultiOrConstraint.java +++ /dev/null @@ -1,98 +0,0 @@ -package de.vill.model.constraint; - -import de.vill.model.building.AutomaticBrackets; -import de.vill.model.building.VariableReference; - -import java.util.ArrayList; -import java.util.LinkedList; -import java.util.List; - -public class MultiOrConstraint extends Constraint{ - - private List sub_parts; - - public MultiOrConstraint() { - sub_parts = new LinkedList<>(); - } - - @Override - public String toString(boolean withSubmodels, String currentAlias) { - StringBuilder result = new StringBuilder(); - for (Constraint part : sub_parts) { - result.append(AutomaticBrackets.enforceConstraintBracketsIfNecessary(this, part, withSubmodels, currentAlias)); - result.append(" | "); - } - result.delete(result.length() -3, result.length()); - return result.toString(); - } - - @Override - public List getConstraintSubParts() { - return sub_parts; - } - - public void add_sub_part(Constraint constraint) { - sub_parts.add(constraint); - } - - @Override - public void replaceConstraintSubPart(Constraint oldSubConstraint, Constraint newSubConstraint) { - for (int i=0;i getReferences() { - List references = new ArrayList<>(); - for (int i=0;i children = new ArrayList<>(); + + public OrConstraint(Constraint... constraints) { + for (Constraint c : constraints) { + if (c != null) { + children.add(c); + } + } + } public OrConstraint(Constraint left, Constraint right) { - this.left = left; - this.right = right; + this.children.add(left); + this.children.add(right); } public Constraint getLeft() { - return left; + if (children.isEmpty()) { + throw new ParseError("Left child can not be returned because there are no children."); + } else { + return children.get(0); + } } public Constraint getRight() { - return right; + if (children.isEmpty() || children.size() < 2) { + throw new ParseError("Right child can not be returned because there are less than two children."); + } else { + return children.get(children.size() - 1); + } + } + + public List getChildren() { + return children; } public void setLeft(Constraint left) { - this.left = left; + if (children.isEmpty()) { + children.add(left); + } else { + children.set(0, left); + } } - public void setRight(Constraint right){ - this.right = right; + public void setRight(Constraint right) { + if (children.size() < 2) { + if (children.size() < 1) { + children.add(null); + } + children.add(right); + } else { + children.set(children.size() - 1, right); + } } @Override public String toString(boolean withSubmodels, String currentAlias) { - return AutomaticBrackets.enforceConstraintBracketsIfNecessary(this, left, withSubmodels, currentAlias) + - " | " + - AutomaticBrackets.enforceConstraintBracketsIfNecessary(this, right, withSubmodels, currentAlias); + return children.stream() + .map(c -> AutomaticBrackets.enforceConstraintBracketsIfNecessary(this, c, withSubmodels, currentAlias)) + .collect(Collectors.joining(" | ")); } @Override public List getConstraintSubParts() { - return Arrays.asList(left, right); + return children; } @Override public void replaceConstraintSubPart(Constraint oldSubConstraint, Constraint newSubConstraint) { - if (left == oldSubConstraint) { - left = newSubConstraint; - } else if (right == oldSubConstraint) { - right = newSubConstraint; + for (int i = 0; i < children.size(); i++) { + if (children.get(i) == oldSubConstraint) { + children.set(i, newSubConstraint); + } } } @Override public Constraint clone() { - return new OrConstraint(left.clone(), right.clone()); + OrConstraint clone = new OrConstraint(); + for (Constraint c : children) { + clone.addChild(c.clone()); + } + return clone; + } + + public void addChild(Constraint constraint) { + if (constraint != null) { + children.add(constraint); + } } @Override public int hashCode(int level) { final int prime = 31; - int result = prime * level + (left == null ? 0 : left.hashCode(1 + level)); - result = prime * result + (right == null ? 0 : right.hashCode(1 + level)); + int result = prime * level; + for (Constraint c : children) { + result = prime * result + (c == null ? 0 : c.hashCode(1 + level)); + } return result; } @@ -77,14 +121,15 @@ public boolean equals(Object obj) { return false; } OrConstraint other = (OrConstraint) obj; - return Objects.equals(left, other.left) && Objects.equals(right, other.right); + return Objects.equals(children, other.children); } @Override public List getReferences() { List references = new ArrayList<>(); - references.addAll(left.getReferences()); - references.addAll(right.getReferences()); + for (Constraint c : children) { + references.addAll(c.getReferences()); + } return references; } }