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

tkobayas 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 0956b19ead2 [incubator-kie-drools-6784] Log which rule and constraint 
fail the pattern auto-naming pre-pass (#6788)
0956b19ead2 is described below

commit 0956b19ead29e093835ed5445e8b955353379fa0
Author: Daniel Clark <[email protected]>
AuthorDate: Mon Jul 6 10:46:51 2026 +0200

    [incubator-kie-drools-6784] Log which rule and constraint fail the pattern 
auto-naming pre-pass (#6788)
    
    * [incubator-kie-drools-6784] Log which rule and constraint fail the 
pattern auto-naming pre-pass
    
    When findFirstInnerBinding (the auto-naming pre-pass for unnamed patterns) 
parsed a
    constraint that the executable-model DRLX grammar rejects, the bare
    ParseProblemException ("Encountered unexpected token:") aborted the build 
with no
    indication of which rule or constraint was at fault. Catch it, log a WARN 
naming the
    pattern type, the rule and the offending expression, then skip it (deriving 
an
    identifier from an unparseable constraint is impossible anyway). The real 
constraint
    compilation still reports/rejects the constraint as before - this only 
improves
    diagnosability, it does not change which rules build.
    
    Co-Authored-By: Claude Opus 4.8 (1M context) <[email protected]>
    
    * only catch ParseProblemException, rethrow with details. Move test to 
better home.
    
    ---------
    
    Co-authored-by: Claude Opus 4.8 (1M context) <[email protected]>
---
 .../generator/visitor/pattern/ClassPatternDSL.java | 30 +++++++++++++++++-----
 .../codegen/execmodel/CompilationFailuresTest.java | 23 +++++++++++++++++
 2 files changed, 47 insertions(+), 6 deletions(-)

diff --git 
a/drools-model/drools-model-codegen/src/main/java/org/drools/model/codegen/execmodel/generator/visitor/pattern/ClassPatternDSL.java
 
b/drools-model/drools-model-codegen/src/main/java/org/drools/model/codegen/execmodel/generator/visitor/pattern/ClassPatternDSL.java
index a53d69380ad..36ebaadb7f5 100644
--- 
a/drools-model/drools-model-codegen/src/main/java/org/drools/model/codegen/execmodel/generator/visitor/pattern/ClassPatternDSL.java
+++ 
b/drools-model/drools-model-codegen/src/main/java/org/drools/model/codegen/execmodel/generator/visitor/pattern/ClassPatternDSL.java
@@ -27,9 +27,11 @@ import java.util.Optional;
 import java.util.Set;
 import java.util.stream.Collectors;
 
+import com.github.javaparser.ParseProblemException;
 import com.github.javaparser.ast.expr.Expression;
 import com.github.javaparser.ast.expr.MethodCallExpr;
 import com.github.javaparser.ast.expr.StringLiteralExpr;
+import org.drools.mvel.parser.ast.expr.DrlxExpression;
 import org.drools.base.util.PropertyReactivityUtil;
 import org.drools.compiler.compiler.DescrBuildError;
 import org.drools.drl.ast.descr.BaseDescr;
@@ -168,12 +170,28 @@ public class ClassPatternDSL extends PatternDSL {
     }
 
     private Optional<String> findFirstInnerBinding(List<? extends BaseDescr> 
constraintDescrs, Class<?> patternType) {
-        return constraintDescrs.stream()
-                .map( constraint -> 
ConstraintExpression.createConstraintExpression( context, patternType, 
constraint, isPositional(constraint) ).getExpression() )
-                .map( DrlxParseUtil::parseExpression )
-                .filter( drlx -> drlx.getBind() != null )
-                .map( drlx -> drlx.getBind().asString() )
-                .findFirst();
+        for ( BaseDescr constraint : constraintDescrs ) {
+            ConstraintExpression constraintExpression =
+                    ConstraintExpression.createConstraintExpression( context, 
patternType, constraint, isPositional( constraint ) );
+            if ( constraintExpression == null ) {
+                continue;
+            }
+            String expression = constraintExpression.getExpression();
+            if ( expression == null || expression.trim().isEmpty() ) {
+                continue;
+            }
+            DrlxExpression drlx;
+            try {
+                drlx = DrlxParseUtil.parseExpression( expression );
+            } catch ( ParseProblemException e ) {
+                throw new RuntimeException( "Unable to parse constraint [" + 
expression + "] while deriving an " +
+                        "identifier for an unnamed pattern of type " + 
patternType + " in rule '" + context.getRuleName() + "'", e );
+            }
+            if ( drlx.getBind() != null ) {
+                return Optional.of( drlx.getBind().asString() );
+            }
+        }
+        return Optional.empty();
     }
 
     @Override
diff --git 
a/drools-model/drools-model-codegen/src/test/java/org/drools/model/codegen/execmodel/CompilationFailuresTest.java
 
b/drools-model/drools-model-codegen/src/test/java/org/drools/model/codegen/execmodel/CompilationFailuresTest.java
index 1b5d5fd0430..0ace2644c5b 100644
--- 
a/drools-model/drools-model-codegen/src/test/java/org/drools/model/codegen/execmodel/CompilationFailuresTest.java
+++ 
b/drools-model/drools-model-codegen/src/test/java/org/drools/model/codegen/execmodel/CompilationFailuresTest.java
@@ -20,6 +20,7 @@ package org.drools.model.codegen.execmodel;
 
 import java.math.BigDecimal;
 
+import org.drools.model.codegen.execmodel.domain.Child;
 import org.drools.model.codegen.execmodel.domain.Person;
 import org.drools.model.codegen.execmodel.domain.Result;
 import org.junit.jupiter.params.ParameterizedTest;
@@ -28,6 +29,7 @@ import org.kie.api.builder.Message;
 import org.kie.api.builder.Results;
 
 import static org.assertj.core.api.Assertions.assertThat;
+import static org.assertj.core.api.Assertions.assertThatThrownBy;
 
 public class CompilationFailuresTest extends BaseModelTest {
 
@@ -67,6 +69,27 @@ public class CompilationFailuresTest extends BaseModelTest {
         assertThat(results.getMessages().get(0).getLine()).isEqualTo(3);
     }
 
+    @ParameterizedTest
+    @MethodSource("parametersPatternOnly")
+    public void 
testUnparseableConstraintInUnnamedPatternFailsWithContext(RUN_TYPE runType) {
+        // When the pattern auto-naming pre-pass 
(ClassPatternDSL.findFirstInnerBinding) cannot parse a
+        // constraint of an unnamed pattern, the build must fail with an 
actionable error naming the rule
+        // and the offending expression - not a bare "unexpected token" and 
not a silently skipped
+        // constraint. 'class == X.class' is rejected by the executable-model 
DRLX grammar, so it triggers
+        // that path. Executable-model only: the classic compiler accepts 
'class ==' and never reaches it.
+        String drl =
+                "package org.test;\n" +
+                "import " + Person.class.getCanonicalName() + ";\n" +
+                "import " + Child.class.getCanonicalName() + ";\n" +
+                "rule R when\n" +
+                "    Person( class == Child.class )\n" +
+                "then end";
+
+        assertThatThrownBy(() -> createKieBuilder(runType, drl))
+                .hasStackTraceContaining("rule 'R'")
+                .hasStackTraceContaining("class == Child.class");
+    }
+
     private Results getCompilationResults(RUN_TYPE runType, String drl ) {
         return createKieBuilder(runType, drl).getResults();
     }


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

Reply via email to