Skip to content

Commit 82e6b0c

Browse files
authored
Merge pull request #24 from Universal-Variability-Language/issue-19
feat(and-constraint): allow more than two children
2 parents 411a69a + 295f842 commit 82e6b0c

File tree

6 files changed

+142
-150
lines changed

6 files changed

+142
-150
lines changed

src/main/java/de/vill/conversion/ConvertGroupCardinality.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -81,9 +81,9 @@ private Constraint createConjunction(Set<Feature> selectedFeatures, Set<Feature>
8181
}
8282

8383
private Constraint createDisjunction(Set<Constraint> constraints) {
84-
MultiOrConstraint orConstraint = new MultiOrConstraint();
84+
OrConstraint orConstraint = new OrConstraint();
8585
for (Constraint constraint : constraints) {
86-
orConstraint.add_sub_part(constraint);
86+
orConstraint.addChild(constraint);
8787
}
8888
return orConstraint;
8989
}

src/main/java/de/vill/conversion/ConvertSMTLevel.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -136,9 +136,9 @@ private Constraint createConjunction(Set<Feature> selectedFeatures, Set<Feature>
136136
}
137137

138138
private Constraint createDisjunction(Set<Constraint> constraints) {
139-
MultiOrConstraint orConstraint = new MultiOrConstraint();
139+
OrConstraint orConstraint = new OrConstraint();
140140
for (Constraint constraint : constraints) {
141-
orConstraint.add_sub_part(constraint);
141+
orConstraint.addChild(constraint);
142142
}
143143
return orConstraint;
144144
}

src/main/java/de/vill/model/building/AutomaticBrackets.java

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -40,7 +40,6 @@ private AutomaticBrackets() {}
4040
constraintprecedenceLookup.put(EquivalenceConstraint.class, IFF_PRECEDENCE);
4141
constraintprecedenceLookup.put(ImplicationConstraint.class, IMPLY_PRECEDENCE);
4242
constraintprecedenceLookup.put(OrConstraint.class, OR_PRECEDENCE);
43-
constraintprecedenceLookup.put(MultiOrConstraint.class, OR_PRECEDENCE);
4443
constraintprecedenceLookup.put(AndConstraint.class, AND_PRECEDENCE);
4544
constraintprecedenceLookup.put(GreaterEquationConstraint.class, GEQ_LEQ_PRECEDENCE);
4645
constraintprecedenceLookup.put(LowerEquationConstraint.class, GEQ_LEQ_PRECEDENCE);

src/main/java/de/vill/model/constraint/AndConstraint.java

Lines changed: 70 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -4,67 +4,113 @@
44
import de.vill.model.building.VariableReference;
55
import de.vill.util.ConstantSymbols;
66

7+
import de.vill.exception.ParseError;
8+
79
import java.util.ArrayList;
810
import java.util.Arrays;
911
import java.util.List;
1012
import java.util.Objects;
13+
import java.util.stream.Collectors;
1114

1215
public class AndConstraint extends Constraint {
13-
private Constraint left;
14-
private Constraint right;
16+
17+
private final List<Constraint> children = new ArrayList<>();
18+
19+
public AndConstraint(Constraint... constraints) {
20+
for (Constraint c : constraints) {
21+
if (c != null) {
22+
children.add(c);
23+
}
24+
}
25+
}
1526

1627
public AndConstraint(Constraint left, Constraint right) {
17-
this.left = left;
18-
this.right = right;
28+
this.children.add(left);
29+
this.children.add(right);
1930
}
2031

2132
public Constraint getLeft() {
22-
return left;
33+
if (children.isEmpty()) {
34+
throw new ParseError("Left child can not be returned because there are no children.");
35+
} else {
36+
return children.get(0);
37+
}
2338
}
2439

2540
public Constraint getRight() {
26-
return right;
41+
if (children.isEmpty() || children.size() < 2) {
42+
throw new ParseError("Right child can not be returned because there are less than two children.");
43+
} else {
44+
return children.get(children.size() - 1);
45+
}
46+
}
47+
48+
public List<Constraint> getChildren() {
49+
return children;
2750
}
2851

2952
public void setLeft(Constraint left) {
30-
this.left = left;
53+
if (children.isEmpty()) {
54+
children.add(left);
55+
} else {
56+
children.set(0, left);
57+
}
3158
}
3259

33-
public void setRight(Constraint right){
34-
this.right = right;
60+
public void setRight(Constraint right) {
61+
if (children.size() < 2) {
62+
if (children.size() < 1) {
63+
children.add(null);
64+
}
65+
children.add(right);
66+
} else {
67+
children.set(children.size() - 1, right);
68+
}
3569
}
3670

3771
@Override
3872
public String toString(boolean withSubmodels, String currentAlias) {
39-
return AutomaticBrackets.enforceConstraintBracketsIfNecessary(this, left, withSubmodels, currentAlias) +
40-
" " + ConstantSymbols.AND + " " +
41-
AutomaticBrackets.enforceConstraintBracketsIfNecessary(this, right, withSubmodels, currentAlias);
73+
return children.stream()
74+
.map(c -> AutomaticBrackets.enforceConstraintBracketsIfNecessary(this, c, withSubmodels, currentAlias))
75+
.collect(Collectors.joining(" " + ConstantSymbols.AND + " "));
4276
}
4377

4478
@Override
4579
public List<Constraint> getConstraintSubParts() {
46-
return Arrays.asList(left, right);
80+
return children;
4781
}
4882

4983
@Override
5084
public void replaceConstraintSubPart(Constraint oldSubConstraint, Constraint newSubConstraint) {
51-
if (left == oldSubConstraint) {
52-
left = newSubConstraint;
53-
} else if (right == oldSubConstraint) {
54-
right = newSubConstraint;
85+
for (int i = 0; i < children.size(); i++) {
86+
if (children.get(i) == oldSubConstraint) {
87+
children.set(i, newSubConstraint);
88+
}
5589
}
5690
}
5791

5892
@Override
5993
public Constraint clone() {
60-
return new AndConstraint(left.clone(), right.clone());
94+
AndConstraint clone = new AndConstraint();
95+
for (Constraint c : children) {
96+
clone.addChild(c.clone());
97+
}
98+
return clone;
99+
}
100+
101+
public void addChild(Constraint constraint) {
102+
if (constraint != null) {
103+
children.add(constraint);
104+
}
61105
}
62106

63107
@Override
64108
public int hashCode(int level) {
65109
final int prime = 31;
66-
int result = prime * level + (left == null ? 0 : left.hashCode(1 + level));
67-
result = prime * result + (right == null ? 0 : right.hashCode(1 + level));
110+
int result = prime * level;
111+
for (Constraint c : children) {
112+
result = prime * result + (c == null ? 0 : c.hashCode(1 + level));
113+
}
68114
return result;
69115
}
70116

@@ -77,14 +123,15 @@ public boolean equals(Object obj) {
77123
return false;
78124
}
79125
AndConstraint other = (AndConstraint) obj;
80-
return Objects.equals(left, other.left) && Objects.equals(right, other.right);
126+
return Objects.equals(children, other.children);
81127
}
82128

83129
@Override
84130
public List<VariableReference> getReferences() {
85131
List<VariableReference> references = new ArrayList<>();
86-
references.addAll(left.getReferences());
87-
references.addAll(right.getReferences());
132+
for (Constraint c : children) {
133+
references.addAll(c.getReferences());
134+
}
88135
return references;
89136
}
90137
}
Lines changed: 0 additions & 99 deletions
Original file line numberDiff line numberDiff line change
@@ -1,99 +0,0 @@
1-
package de.vill.model.constraint;
2-
3-
import de.vill.model.building.AutomaticBrackets;
4-
import de.vill.model.building.VariableReference;
5-
import de.vill.util.ConstantSymbols;
6-
7-
import java.util.ArrayList;
8-
import java.util.LinkedList;
9-
import java.util.List;
10-
11-
public class MultiOrConstraint extends Constraint{
12-
13-
private List<Constraint> sub_parts;
14-
15-
public MultiOrConstraint() {
16-
sub_parts = new LinkedList<>();
17-
}
18-
19-
@Override
20-
public String toString(boolean withSubmodels, String currentAlias) {
21-
StringBuilder result = new StringBuilder();
22-
for (Constraint part : sub_parts) {
23-
result.append(AutomaticBrackets.enforceConstraintBracketsIfNecessary(this, part, withSubmodels, currentAlias));
24-
result.append(" "+ ConstantSymbols.OR + " ");
25-
}
26-
result.delete(result.length() -3, result.length());
27-
return result.toString();
28-
}
29-
30-
@Override
31-
public List<Constraint> getConstraintSubParts() {
32-
return sub_parts;
33-
}
34-
35-
public void add_sub_part(Constraint constraint) {
36-
sub_parts.add(constraint);
37-
}
38-
39-
@Override
40-
public void replaceConstraintSubPart(Constraint oldSubConstraint, Constraint newSubConstraint) {
41-
for (int i=0;i<sub_parts.size();i++) {
42-
if (sub_parts.get(i) == oldSubConstraint) {
43-
sub_parts.set(i, newSubConstraint);
44-
break;
45-
}
46-
}
47-
}
48-
49-
@Override
50-
public Constraint clone() {
51-
MultiOrConstraint multiOrConstraint = new MultiOrConstraint();
52-
for (Constraint part : sub_parts) {
53-
multiOrConstraint.add_sub_part(part.clone());
54-
}
55-
return multiOrConstraint;
56-
}
57-
58-
@Override
59-
public int hashCode(int level) {
60-
final int prime = 31;
61-
int result = 1;
62-
for (Constraint part : sub_parts) {
63-
result = prime * result + part.hashCode(1 + level);
64-
}
65-
return result;
66-
}
67-
68-
@Override
69-
public boolean equals(Object obj) {
70-
if (this == obj) {
71-
return true;
72-
}
73-
if (obj == null || getClass() != obj.getClass()) {
74-
return false;
75-
}
76-
MultiOrConstraint other = (MultiOrConstraint) obj;
77-
78-
if (this.sub_parts.size() != other.sub_parts.size()) {
79-
return false;
80-
}
81-
boolean same = true;
82-
for (int i=0;i<sub_parts.size();i++) {
83-
if (sub_parts.get(i) != other.sub_parts.get(i)) {
84-
same = false;
85-
break;
86-
}
87-
}
88-
return same;
89-
}
90-
91-
@Override
92-
public List<VariableReference> getReferences() {
93-
List<VariableReference> references = new ArrayList<>();
94-
for (int i=0;i<sub_parts.size();i++) {
95-
references.addAll(sub_parts.get(i).getReferences());
96-
}
97-
return references;
98-
}
99-
}

0 commit comments

Comments
 (0)