This is an automated email from the ASF dual-hosted git repository.

tzimanyi pushed a commit to branch main
in repository https://gitbox.apache.org/repos/asf/incubator-kie-drools.git


The following commit(s) were added to refs/heads/main by this push:
     new bd28a79070 [incubator-kie-drools-6016] Emit a warning when an eval is 
improperly and unnecessarily used (#6024)
bd28a79070 is described below

commit bd28a79070d61ca697bd54bd8fbd8f8157d60ab4
Author: Toshiya Kobayashi <[email protected]>
AuthorDate: Mon Jul 29 20:00:29 2024 +0900

    [incubator-kie-drools-6016] Emit a warning when an eval is improperly and 
unnecessarily used (#6024)
---
 .../java/org/drools/base/rule/EvalCondition.java   | 39 ++++++++++++++++++++++
 .../drools/modelcompiler/KiePackagesBuilder.java   |  5 ++-
 .../drools/mvel/asm/AbstractASMEvalBuilder.java    |  2 ++
 .../org/drools/mvel/builder/MVELEvalBuilder.java   |  2 ++
 4 files changed, 47 insertions(+), 1 deletion(-)

diff --git a/drools-base/src/main/java/org/drools/base/rule/EvalCondition.java 
b/drools-base/src/main/java/org/drools/base/rule/EvalCondition.java
index aca624bb86..3a979344b6 100644
--- a/drools-base/src/main/java/org/drools/base/rule/EvalCondition.java
+++ b/drools-base/src/main/java/org/drools/base/rule/EvalCondition.java
@@ -32,11 +32,18 @@ import org.drools.base.reteoo.BaseTuple;
 import org.drools.base.rule.accessor.CompiledInvoker;
 import org.drools.base.rule.accessor.EvalExpression;
 import org.drools.base.rule.accessor.Wireable;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
 
 public class EvalCondition extends ConditionalElement
     implements
     Externalizable,
         Wireable {
+
+    private static final Logger LOG = 
LoggerFactory.getLogger(EvalCondition.class);
+
+    private static long warnLogCounter = 0;
+
     private static final long          serialVersionUID   = 510l;
 
     protected EvalExpression             expression;
@@ -223,4 +230,36 @@ public class EvalCondition extends ConditionalElement
     public String toString() {
         return this.expression.toString();
     }
+
+    public static void logWarnIfImproperEval(EvalCondition evalCondition, 
String evalExpression) {
+        if (warnLogCounter == 10) {
+            warnLogCounter++;
+            LOG.warn("More eval warnings will be suppressed...");
+            return;
+        } else if (warnLogCounter > 10) {
+            return; // avoid flooding the logs
+        }
+
+        if (evalExpression == null || evalExpression.isEmpty()) {
+            return; // cannot provide a meaningful warning
+        }
+
+        StringBuilder sb = new StringBuilder();
+        for (Declaration declaration : 
evalCondition.getRequiredDeclarations()) {
+            if (declaration.getPattern() != null) {
+                sb.append("'");
+                sb.append(declaration.getIdentifier());
+                sb.append("' comes from previous pattern '");
+                String className = 
declaration.getPattern().getObjectType().getClassName();
+                sb.append(className.substring(className.lastIndexOf('.') + 1));
+                sb.append("'. ");
+            }
+        }
+        if (!sb.isEmpty()) {
+            warnLogCounter++;
+            LOG.warn("In an eval expression [{}] : {}" +
+                             "Consider placing the constraint in the pattern 
and removing the eval if possible," +
+                             " as eval is not performance-efficient.", 
evalExpression, sb);
+        }
+    }
 }
diff --git 
a/drools-model/drools-model-compiler/src/main/java/org/drools/modelcompiler/KiePackagesBuilder.java
 
b/drools-model/drools-model-compiler/src/main/java/org/drools/modelcompiler/KiePackagesBuilder.java
index 3189e751f7..7c4a0af6e8 100644
--- 
a/drools-model/drools-model-compiler/src/main/java/org/drools/modelcompiler/KiePackagesBuilder.java
+++ 
b/drools-model/drools-model-compiler/src/main/java/org/drools/modelcompiler/KiePackagesBuilder.java
@@ -151,6 +151,7 @@ import 
org.kie.internal.builder.KnowledgeBuilderConfiguration;
 import org.kie.internal.builder.conf.PropertySpecificOption;
 
 import static java.util.stream.Collectors.toList;
+import static org.drools.base.rule.EvalCondition.logWarnIfImproperEval;
 import static org.drools.base.rule.GroupElement.AND;
 import static org.drools.base.rule.GroupElement.OR;
 import static org.drools.compiler.rule.builder.RuleBuilder.buildTimer;
@@ -669,7 +670,9 @@ public class KiePackagesBuilder {
     private EvalCondition buildEval(RuleContext ctx, EvalImpl eval) {
         Declaration[] declarations = Stream.of( eval.getExpr().getVariables() 
).map( ctx::getDeclaration ).toArray( Declaration[]::new );
         EvalExpression evalExpr = new LambdaEvalExpression(declarations, 
eval.getExpr());
-        return new EvalCondition(evalExpr, declarations);
+        EvalCondition evalCondition = new EvalCondition(evalExpr, 
declarations);
+        logWarnIfImproperEval(evalCondition, 
eval.getExpr().predicateInformation().getStringConstraint());
+        return evalCondition;
     }
 
     private ConditionalBranch buildConditionalConsequence(RuleContext ctx, 
ConditionalNamedConsequenceImpl consequence) {
diff --git 
a/drools-mvel/src/main/java/org/drools/mvel/asm/AbstractASMEvalBuilder.java 
b/drools-mvel/src/main/java/org/drools/mvel/asm/AbstractASMEvalBuilder.java
index 8e251f3cdb..8ade06cbce 100644
--- a/drools-mvel/src/main/java/org/drools/mvel/asm/AbstractASMEvalBuilder.java
+++ b/drools-mvel/src/main/java/org/drools/mvel/asm/AbstractASMEvalBuilder.java
@@ -38,6 +38,7 @@ import org.drools.base.rule.Pattern;
 import org.drools.base.rule.RuleConditionElement;
 import org.drools.base.rule.accessor.DeclarationScopeResolver;
 
+import static org.drools.base.rule.EvalCondition.logWarnIfImproperEval;
 import static org.drools.compiler.rule.builder.PatternBuilder.buildAnalysis;
 import static 
org.drools.compiler.rule.builder.PatternBuilder.createImplicitBindings;
 import static org.drools.mvel.java.JavaRuleBuilderHelper.createVariableContext;
@@ -90,6 +91,7 @@ public abstract class AbstractASMEvalBuilder implements 
RuleConditionBuilder {
         Arrays.sort(declarations, SortDeclarations.instance);
 
         EvalCondition eval = 
EvalConditionFactory.Factory.get().createEvalCondition(declarations);
+        logWarnIfImproperEval(eval, (String) evalDescr.getContent());
 
         Map<String, Object> vars = createVariableContext( className,
                                                           
(String)evalDescr.getContent(),
diff --git 
a/drools-mvel/src/main/java/org/drools/mvel/builder/MVELEvalBuilder.java 
b/drools-mvel/src/main/java/org/drools/mvel/builder/MVELEvalBuilder.java
index db6ccbead3..0859f5a901 100644
--- a/drools-mvel/src/main/java/org/drools/mvel/builder/MVELEvalBuilder.java
+++ b/drools-mvel/src/main/java/org/drools/mvel/builder/MVELEvalBuilder.java
@@ -40,6 +40,7 @@ import org.drools.mvel.MVELDialectRuntimeData;
 import org.drools.mvel.expr.MVELCompilationUnit;
 import org.drools.mvel.expr.MVELEvalExpression;
 
+import static org.drools.base.rule.EvalCondition.logWarnIfImproperEval;
 import static org.drools.mvel.asm.AsmUtil.copyErrorLocation;
 
 public class MVELEvalBuilder
@@ -99,6 +100,7 @@ public class MVELEvalBuilder
                                                                        false,
                                                                        
MVELCompilationUnit.Scope.EXPRESSION );
             final EvalCondition eval = 
EvalConditionFactory.Factory.get().createEvalCondition( previousDeclarations );
+            logWarnIfImproperEval(eval, (String) evalDescr.getContent());
 
             MVELEvalExpression expr = new MVELEvalExpression( unit,
                                                               dialect.getId() 
);


---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]

Reply via email to