Skip to content

Commit 7b2db8a

Browse files
committed
Simplify condition handling in CFG and BDD
This also revealed a bug in the BDD compilation process that was causing negated nodes to get added twice.
1 parent 93703ff commit 7b2db8a

26 files changed

Lines changed: 258 additions & 871 deletions

smithy-rules-engine/src/main/java/software/amazon/smithy/rulesengine/language/syntax/expressions/Expression.java

Lines changed: 36 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -36,6 +36,8 @@
3636
@SmithyUnstableApi
3737
public abstract class Expression extends SyntaxElement implements FromSourceLocation, ToNode, TypeCheck {
3838
private final SourceLocation sourceLocation;
39+
private Integer cachedComplexity;
40+
private Set<String> cachedReferences;
3941
private Type cachedType;
4042

4143
public Expression(SourceLocation sourceLocation) {
@@ -147,10 +149,43 @@ public static Literal getLiteral(StringNode node) {
147149
*
148150
* @return variable references by name.
149151
*/
150-
public Set<String> getReferences() {
152+
public final Set<String> getReferences() {
153+
if (cachedReferences == null) {
154+
cachedReferences = Collections.unmodifiableSet(calculateReferences());
155+
}
156+
return cachedReferences;
157+
}
158+
159+
/**
160+
* Computes the references of an expression.
161+
*
162+
* @return the computed references.
163+
*/
164+
protected Set<String> calculateReferences() {
151165
return Collections.emptySet();
152166
}
153167

168+
/**
169+
* Get the complexity heuristic of the expression, based on functions, references, etc.
170+
*
171+
* @return the complexity heuristic.
172+
*/
173+
public final int getComplexity() {
174+
if (cachedComplexity == null) {
175+
cachedComplexity = calculateComplexity();
176+
}
177+
return cachedComplexity;
178+
}
179+
180+
/**
181+
* Calculates the complexity of the expression, to be overridden by implementations.
182+
*
183+
* @return complexity estimate.
184+
*/
185+
protected int calculateComplexity() {
186+
return 1;
187+
}
188+
154189
/**
155190
* Invoke the {@link ExpressionVisitor} functions for this expression.
156191
*

smithy-rules-engine/src/main/java/software/amazon/smithy/rulesengine/language/syntax/expressions/Reference.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -50,7 +50,7 @@ public String template() {
5050
}
5151

5252
@Override
53-
public Set<String> getReferences() {
53+
protected Set<String> calculateReferences() {
5454
return Collections.singleton(getName().toString());
5555
}
5656

smithy-rules-engine/src/main/java/software/amazon/smithy/rulesengine/language/syntax/expressions/functions/LibraryFunction.java

Lines changed: 10 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -48,7 +48,7 @@ public String getName() {
4848
}
4949

5050
@Override
51-
public Set<String> getReferences() {
51+
protected Set<String> calculateReferences() {
5252
Set<String> references = new LinkedHashSet<>();
5353
for (Expression arg : getArguments()) {
5454
references.addAll(arg.getReferences());
@@ -245,4 +245,13 @@ private static boolean isReference(Expression arg) {
245245
}
246246
return false;
247247
}
248+
249+
@Override
250+
protected int calculateComplexity() {
251+
int complexity = getFunctionDefinition().getCostHeuristic();
252+
for (Expression arg : getArguments()) {
253+
complexity += arg.getComplexity();
254+
}
255+
return complexity;
256+
}
248257
}

smithy-rules-engine/src/main/java/software/amazon/smithy/rulesengine/language/syntax/expressions/literal/RecordLiteral.java

Lines changed: 10 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -76,11 +76,20 @@ public Node toNode() {
7676
}
7777

7878
@Override
79-
public Set<String> getReferences() {
79+
protected Set<String> calculateReferences() {
8080
Set<String> references = new LinkedHashSet<>();
8181
for (Literal value : members().values()) {
8282
references.addAll(value.getReferences());
8383
}
8484
return references;
8585
}
86+
87+
@Override
88+
protected int calculateComplexity() {
89+
int complexity = 1;
90+
for (Literal value : members().values()) {
91+
complexity += value.getComplexity();
92+
}
93+
return complexity;
94+
}
8695
}

smithy-rules-engine/src/main/java/software/amazon/smithy/rulesengine/language/syntax/expressions/literal/StringLiteral.java

Lines changed: 24 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -71,7 +71,7 @@ public Node toNode() {
7171
}
7272

7373
@Override
74-
public Set<String> getReferences() {
74+
protected Set<String> calculateReferences() {
7575
Template template = value();
7676
if (template.isStatic()) {
7777
return Collections.emptySet();
@@ -86,4 +86,27 @@ public Set<String> getReferences() {
8686

8787
return references;
8888
}
89+
90+
@Override
91+
protected int calculateComplexity() {
92+
Template template = value();
93+
if (template.isStatic()) {
94+
return 1;
95+
}
96+
97+
int complexity = 1;
98+
if (template.getParts().size() > 1) {
99+
// Multiple parts are expensive
100+
complexity += 8;
101+
}
102+
103+
for (Template.Part part : template.getParts()) {
104+
if (part instanceof Template.Dynamic) {
105+
Template.Dynamic dynamic = (Template.Dynamic) part;
106+
complexity += dynamic.toExpression().getComplexity();
107+
}
108+
}
109+
110+
return complexity;
111+
}
89112
}

smithy-rules-engine/src/main/java/software/amazon/smithy/rulesengine/language/syntax/expressions/literal/TupleLiteral.java

Lines changed: 10 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -82,11 +82,20 @@ public Node toNode() {
8282
}
8383

8484
@Override
85-
public Set<String> getReferences() {
85+
protected Set<String> calculateReferences() {
8686
Set<String> references = new LinkedHashSet<>();
8787
for (Literal member : members()) {
8888
references.addAll(member.getReferences());
8989
}
9090
return references;
9191
}
92+
93+
@Override
94+
protected int calculateComplexity() {
95+
int complexity = 1;
96+
for (Literal member : members()) {
97+
complexity += member.getComplexity();
98+
}
99+
return complexity;
100+
}
92101
}

smithy-rules-engine/src/main/java/software/amazon/smithy/rulesengine/logic/ConditionInfo.java

Lines changed: 0 additions & 59 deletions
This file was deleted.

smithy-rules-engine/src/main/java/software/amazon/smithy/rulesengine/logic/ConditionInfoImpl.java

Lines changed: 0 additions & 103 deletions
This file was deleted.

0 commit comments

Comments
 (0)