From effc20d49936081a41b6821be4470e8e8b8b117b Mon Sep 17 00:00:00 2001 From: Yusen Wang Date: Sun, 8 Sep 2024 23:09:50 -0500 Subject: [PATCH] Fix flaky test in AccumulateTest#testInlineAccumulateWithAnd by using TreeSet to ensure order consistency - Changed extractUsedDeclarations method to use TreeSet instead of Set to guarantee a consistent order of declarations. - This resolves the flaky behavior encountered when running with NonDex, which caused Drools to fail compiling the Java file. - The issue stemmed from the fact that the original Set did not maintain order, which is crucial when the order of arguments is important in rule compilation. Signed-off-by: Yusen Wang --- .../codegen/execmodel/generator/Consequence.java | 15 ++++++++++----- 1 file changed, 10 insertions(+), 5 deletions(-) diff --git a/drools-model/drools-model-codegen/src/main/java/org/drools/model/codegen/execmodel/generator/Consequence.java b/drools-model/drools-model-codegen/src/main/java/org/drools/model/codegen/execmodel/generator/Consequence.java index 9ce2ebd9409..12fd499b96b 100644 --- a/drools-model/drools-model-codegen/src/main/java/org/drools/model/codegen/execmodel/generator/Consequence.java +++ b/drools-model/drools-model-codegen/src/main/java/org/drools/model/codegen/execmodel/generator/Consequence.java @@ -26,7 +26,9 @@ import java.util.Map; import java.util.Optional; import java.util.Set; +import java.util.TreeSet; import java.util.regex.Pattern; +import java.util.stream.Collectors; import com.github.javaparser.ParseProblemException; import com.github.javaparser.ast.Modifier; @@ -65,7 +67,6 @@ import org.drools.util.StringUtils; import static com.github.javaparser.StaticJavaParser.parseExpression; -import static java.util.stream.Collectors.toSet; import static org.drools.model.codegen.execmodel.PackageModel.DOMAIN_CLASSESS_METADATA_FILE_NAME; import static org.drools.model.codegen.execmodel.PackageModel.DOMAIN_CLASS_METADATA_INSTANCE; import static org.drools.model.codegen.execmodel.generator.DrlxParseUtil.addCurlyBracesToBlock; @@ -251,7 +252,7 @@ private void rewriteChannels(BlockStmt consequence) { } private Set extractUsedDeclarations(BlockStmt ruleConsequence, String consequenceString) { - Set existingDecls = new HashSet<>(); + Set existingDecls = new TreeSet<>(); existingDecls.addAll(context.getAvailableBindings()); existingDecls.addAll(context.getGlobals().keySet()); if (context.getRuleUnitDescr() != null) { @@ -259,10 +260,14 @@ private Set extractUsedDeclarations(BlockStmt ruleConsequence, String co } if (context.getRuleDialect() == RuleContext.RuleDialect.MVEL) { - return existingDecls.stream().filter(d -> containsWord(d, consequenceString)).collect(toSet()); + return existingDecls.stream() + .filter(d -> containsWord(d, consequenceString)) + .collect(Collectors.toCollection(TreeSet::new)); } else if (ruleConsequence != null) { - Set declUsedInRHS = ruleConsequence.findAll(NameExpr.class).stream().map(NameExpr::getNameAsString).collect(toSet()); - return existingDecls.stream().filter(declUsedInRHS::contains).collect(toSet()); + Set declUsedInRHS = ruleConsequence.findAll(NameExpr.class).stream().map(NameExpr::getNameAsString).collect(Collectors.toCollection(TreeSet::new)); + return existingDecls.stream() + .filter(declUsedInRHS::contains) + .collect(Collectors.toCollection(TreeSet::new)); } throw new IllegalArgumentException("Unknown rule dialect " + context.getRuleDialect() + "!");