Skip to content

Commit f453664

Browse files
committed
Hide node layout of BDD and move domain to trait
Rather than have the Bdd class contain Condition, Results, Parameters, etc, it now just deals with nodes. It also now hides the implementation detail of how the BDD nodes are laid out internally. BDD evaluation is internalized to the BDD as well rather than a separate BddEvaluator. This change provides faster evaluation, makes it possible to change the internal node data layout if necessary, and cleans up all the interacts we had with BddTrait (no need to always reach into Bdd).
1 parent 31b60f5 commit f453664

31 files changed

+1351
-1346
lines changed

smithy-aws-endpoints/src/main/java/software/amazon/smithy/rulesengine/aws/validators/RuleSetAwsBuiltInValidator.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,7 @@
1414
import software.amazon.smithy.model.validation.ValidationEvent;
1515
import software.amazon.smithy.rulesengine.aws.language.functions.AwsBuiltIns;
1616
import software.amazon.smithy.rulesengine.language.syntax.parameters.Parameter;
17-
import software.amazon.smithy.rulesengine.traits.BddTrait;
17+
import software.amazon.smithy.rulesengine.logic.bdd.BddTrait;
1818
import software.amazon.smithy.rulesengine.traits.EndpointRuleSetTrait;
1919
import software.amazon.smithy.utils.SetUtils;
2020

@@ -39,7 +39,7 @@ public List<ValidationEvent> validate(Model model) {
3939
}
4040

4141
for (ServiceShape s : model.getServiceShapesWithTrait(BddTrait.class)) {
42-
validateRuleSetAwsBuiltIns(events, s, s.expectTrait(BddTrait.class).getBdd().getParameters());
42+
validateRuleSetAwsBuiltIns(events, s, s.expectTrait(BddTrait.class).getParameters());
4343
}
4444

4545
return events;

smithy-rules-engine/src/main/java/software/amazon/smithy/rulesengine/language/evaluation/RuleEvaluator.java

Lines changed: 33 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -27,7 +27,7 @@
2727
import software.amazon.smithy.rulesengine.language.syntax.rule.RuleValueVisitor;
2828
import software.amazon.smithy.rulesengine.logic.RuleBasedConditionEvaluator;
2929
import software.amazon.smithy.rulesengine.logic.bdd.Bdd;
30-
import software.amazon.smithy.rulesengine.logic.bdd.BddEvaluator;
30+
import software.amazon.smithy.rulesengine.logic.bdd.BddTrait;
3131
import software.amazon.smithy.utils.SmithyUnstableApi;
3232

3333
/**
@@ -50,34 +50,57 @@ public static Value evaluate(EndpointRuleSet ruleset, Map<Identifier, Value> par
5050
return new RuleEvaluator().evaluateRuleSet(ruleset, parameterArguments);
5151
}
5252

53+
/**
54+
* Initializes a new {@link RuleEvaluator} instances, and evaluates the provided BDD and parameter arguments.
55+
*
56+
* @param trait The trait to evaluate.
57+
* @param args The rule-set parameter identifiers and values to evaluate the BDD against.
58+
* @return The resulting value from the final matched rule.
59+
*/
60+
public static Value evaluate(BddTrait trait, Map<Identifier, Value> args) {
61+
return evaluate(trait.getBdd(), trait.getParameters(), trait.getConditions(), trait.getResults(), args);
62+
}
63+
5364
/**
5465
* Initializes a new {@link RuleEvaluator} instances, and evaluates the provided BDD and parameter arguments.
5566
*
5667
* @param bdd The endpoint bdd.
5768
* @param parameterArguments The rule-set parameter identifiers and values to evaluate the BDD against.
5869
* @return The resulting value from the final matched rule.
5970
*/
60-
public static Value evaluate(Bdd bdd, Map<Identifier, Value> parameterArguments) {
61-
return new RuleEvaluator().evaluateBdd(bdd, parameterArguments);
71+
public static Value evaluate(
72+
Bdd bdd,
73+
Parameters parameters,
74+
List<Condition> conditions,
75+
List<Rule> results,
76+
Map<Identifier, Value> parameterArguments
77+
) {
78+
return new RuleEvaluator().evaluateBdd(bdd, parameters, conditions, results, parameterArguments);
6279
}
6380

64-
private Value evaluateBdd(Bdd bdd, Map<Identifier, Value> parameterArguments) {
81+
private Value evaluateBdd(
82+
Bdd bdd,
83+
Parameters parameters,
84+
List<Condition> conditions,
85+
List<Rule> results,
86+
Map<Identifier, Value> parameterArguments
87+
) {
6588
return scope.inScope(() -> {
66-
for (Parameter parameter : bdd.getParameters()) {
89+
for (Parameter parameter : parameters) {
6790
parameter.getDefault().ifPresent(value -> scope.insert(parameter.getName(), value));
6891
}
6992

7093
parameterArguments.forEach(scope::insert);
71-
BddEvaluator evaluator = BddEvaluator.from(bdd);
72-
Condition[] conds = bdd.getConditions().toArray(new Condition[0]);
94+
95+
Condition[] conds = conditions.toArray(new Condition[0]);
7396
RuleBasedConditionEvaluator conditionEvaluator = new RuleBasedConditionEvaluator(this, conds);
74-
int result = evaluator.evaluate(conditionEvaluator);
97+
int result = bdd.evaluate(conditionEvaluator);
7598

76-
if (result <= 0) {
99+
if (result < 0) {
77100
throw new RuntimeException("No BDD result matched");
78101
}
79102

80-
Rule rule = bdd.getResults().get(result);
103+
Rule rule = results.get(result);
81104
if (rule instanceof EndpointRule) {
82105
return resolveEndpoint(this, ((EndpointRule) rule).getEndpoint());
83106
} else if (rule instanceof ErrorRule) {

smithy-rules-engine/src/main/java/software/amazon/smithy/rulesengine/language/evaluation/TestEvaluator.java

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,7 @@
1313
import software.amazon.smithy.rulesengine.language.evaluation.value.EndpointValue;
1414
import software.amazon.smithy.rulesengine.language.evaluation.value.Value;
1515
import software.amazon.smithy.rulesengine.language.syntax.Identifier;
16-
import software.amazon.smithy.rulesengine.logic.bdd.Bdd;
16+
import software.amazon.smithy.rulesengine.logic.bdd.BddTrait;
1717
import software.amazon.smithy.rulesengine.traits.EndpointTestCase;
1818
import software.amazon.smithy.rulesengine.traits.EndpointTestExpectation;
1919
import software.amazon.smithy.rulesengine.traits.ExpectedEndpoint;
@@ -40,12 +40,12 @@ public static void evaluate(EndpointRuleSet ruleset, EndpointTestCase testCase)
4040
}
4141

4242
/**
43-
* Evaluate the given rule-set and test case. Throws an exception in the event the test case does not pass.
43+
* Evaluate the given BDD and test case. Throws an exception in the event the test case does not pass.
4444
*
45-
* @param bdd The BDD to be tested.
45+
* @param bdd The BDD trait to be tested.
4646
* @param testCase The test case.
4747
*/
48-
public static void evaluate(Bdd bdd, EndpointTestCase testCase) {
48+
public static void evaluate(BddTrait bdd, EndpointTestCase testCase) {
4949
Value result = RuleEvaluator.evaluate(bdd, createParams(testCase));
5050
processResult(result, testCase);
5151
}

0 commit comments

Comments
 (0)