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]