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 241d4bb500 [incubator-kie-drools-6532] Fix ReteDumper for
RightInputAdaptorNode (#6533)
241d4bb500 is described below
commit 241d4bb500fb2954a7a4dc5d5f8bf3d56926d1cf
Author: Toshiya Kobayashi <[email protected]>
AuthorDate: Thu Nov 27 11:03:42 2025 +0900
[incubator-kie-drools-6532] Fix ReteDumper for RightInputAdaptorNode (#6533)
* [incubator-kie-drools-6532] Fix ReteDumper for RightInputAdaptorNode
* minor fix
---
.../java/org/drools/core/reteoo/ReteDumper.java | 3 +
.../drools/core/reteoo/RightInputAdapterNode.java | 3 +-
.../org/drools/core/reteoo/TupleToObjectNode.java | 4 +-
.../drools/model/codegen/execmodel/ReteDumper.java | 7 +-
.../model/codegen/execmodel/ReteDumperTest.java | 120 +++++++++++++++++++++
5 files changed, 131 insertions(+), 6 deletions(-)
diff --git a/drools-core/src/main/java/org/drools/core/reteoo/ReteDumper.java
b/drools-core/src/main/java/org/drools/core/reteoo/ReteDumper.java
index 7f56917e2a..dce3420a34 100644
--- a/drools-core/src/main/java/org/drools/core/reteoo/ReteDumper.java
+++ b/drools-core/src/main/java/org/drools/core/reteoo/ReteDumper.java
@@ -203,6 +203,9 @@ public class ReteDumper {
}
NetworkNode[] sinks = node.getSinks();
+ if (node instanceof RightInputAdapterNode<?> ria) {
+ sinks = new Sink[] { ria.getBetaNode() };
+ }
if (sinks != null) {
for (NetworkNode sink : sinks) {
BaseNode sinkNode = ( BaseNode ) sink;
diff --git
a/drools-core/src/main/java/org/drools/core/reteoo/RightInputAdapterNode.java
b/drools-core/src/main/java/org/drools/core/reteoo/RightInputAdapterNode.java
index 79c0ac3704..11337ad668 100644
---
a/drools-core/src/main/java/org/drools/core/reteoo/RightInputAdapterNode.java
+++
b/drools-core/src/main/java/org/drools/core/reteoo/RightInputAdapterNode.java
@@ -406,8 +406,7 @@ public abstract class RightInputAdapterNode<T extends
BetaNode> extends BaseNod
@Override
public String toString() {
- return "RightInputAdapterNode(" + id + ")[ source="
- + source + ", associations=" + associations + ", partitionId="
+ partitionId + "]";
+ return "[RightInputAdapterNode(" + id + ")]";
}
public void networkUpdated(UpdateContext updateContext) {
diff --git
a/drools-core/src/main/java/org/drools/core/reteoo/TupleToObjectNode.java
b/drools-core/src/main/java/org/drools/core/reteoo/TupleToObjectNode.java
index 75e57c8cbf..4684e2a81b 100644
--- a/drools-core/src/main/java/org/drools/core/reteoo/TupleToObjectNode.java
+++ b/drools-core/src/main/java/org/drools/core/reteoo/TupleToObjectNode.java
@@ -264,9 +264,7 @@ public class TupleToObjectNode extends ObjectSource
@Override
public String toString() {
- return "RightInputAdapterNode(" + id + ")[ tupleMemoryEnabled=" +
tupleMemoryEnabled + ", tupleSource=" +
- tupleSource + ", source=" + source + ", associations=" +
associations + ", partitionId=" + partitionId +
- "]";
+ return "[TupleToObjectNode(" + id + ")]";
}
public LeftTupleSource getLeftTupleSource() {
diff --git
a/drools-model/drools-model-codegen/src/test/java/org/drools/model/codegen/execmodel/ReteDumper.java
b/drools-model/drools-model-codegen/src/test/java/org/drools/model/codegen/execmodel/ReteDumper.java
index 5df5308ec1..8eb9fc9dac 100644
---
a/drools-model/drools-model-codegen/src/test/java/org/drools/model/codegen/execmodel/ReteDumper.java
+++
b/drools-model/drools-model-codegen/src/test/java/org/drools/model/codegen/execmodel/ReteDumper.java
@@ -25,13 +25,15 @@ import java.util.function.BiConsumer;
import java.util.function.Predicate;
import org.drools.core.common.BaseNode;
-import org.drools.kiesession.rulebase.InternalKnowledgeBase;
+import org.drools.core.reteoo.BetaNode;
import org.drools.core.reteoo.EntryPointNode;
import org.drools.core.reteoo.LeftTupleSource;
import org.drools.core.reteoo.ObjectSource;
import org.drools.core.reteoo.ObjectTypeNode;
import org.drools.core.reteoo.Rete;
+import org.drools.core.reteoo.RightInputAdapterNode;
import org.drools.core.reteoo.Sink;
+import org.drools.kiesession.rulebase.InternalKnowledgeBase;
import org.kie.api.KieBase;
import org.kie.api.runtime.KieSession;
@@ -101,6 +103,9 @@ public class ReteDumper {
} else if (node instanceof LeftTupleSource ) {
LeftTupleSource source = (LeftTupleSource) node;
sinks = source.getSinkPropagator().getSinks();
+ } else if (node instanceof RightInputAdapterNode<?> ria) {
+ BetaNode betaNode = ria.getBetaNode();
+ sinks = new Sink[] { betaNode };
}
return sinks;
}
diff --git
a/drools-model/drools-model-codegen/src/test/java/org/drools/model/codegen/execmodel/ReteDumperTest.java
b/drools-model/drools-model-codegen/src/test/java/org/drools/model/codegen/execmodel/ReteDumperTest.java
new file mode 100644
index 0000000000..da9cad76a2
--- /dev/null
+++
b/drools-model/drools-model-codegen/src/test/java/org/drools/model/codegen/execmodel/ReteDumperTest.java
@@ -0,0 +1,120 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.drools.model.codegen.execmodel;
+
+import java.io.PrintWriter;
+import java.io.StringWriter;
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.List;
+import java.util.function.BiConsumer;
+
+import org.drools.core.common.BaseNode;
+import org.drools.kiesession.rulebase.InternalKnowledgeBase;
+import org.drools.model.codegen.execmodel.domain.Address;
+import org.drools.model.codegen.execmodel.domain.Person;
+import org.junit.jupiter.params.ParameterizedTest;
+import org.junit.jupiter.params.provider.MethodSource;
+import org.kie.api.KieBase;
+import org.kie.api.runtime.KieSession;
+
+import static org.assertj.core.api.Assertions.assertThat;
+
+class ReteDumperTest extends BaseModelTest {
+
+ public static final String DRL_RIGHT_EXISTS = "import " +
Person.class.getCanonicalName() + ";\n" +
+ "import " + Address.class.getCanonicalName() + ";\n" +
+ """
+ rule R1
+ when
+ $person: Person()
+ exists Address(number > 18) from $person.addresses
+ then
+ end
+ """;
+
+ @ParameterizedTest
+ @MethodSource("parameters")
+ void rightInputAdapterNodeSink_coreReteDumper(RUN_TYPE runType) {
+ KieSession ksession = getKieSession(runType, DRL_RIGHT_EXISTS);
+ KieBase kbase = ksession.getKieBase();
+
+ List<String> lines = getLinesByCoreReteDumper(kbase);
+
+ // The first RightInputAdapterNode should be followed by ExistsNode
+ assertSinkOrder(lines, "[RightInputAdapterNode", "[ExistsNode");
+ }
+
+ @ParameterizedTest
+ @MethodSource("parameters")
+ void rightInputAdapterNodeSink_execmodelReteDumper(RUN_TYPE runType) {
+ KieSession ksession = getKieSession(runType, DRL_RIGHT_EXISTS);
+ KieBase kbase = ksession.getKieBase();
+
+ List<String> lines = getLinesByExecmodelReteDumper(kbase);
+
+ // The first RightInputAdapterNode should be followed by ExistsNode
+ assertSinkOrder(lines, "[RightInputAdapterNode", "[ExistsNode");
+ }
+
+ private static void assertSinkOrder(List<String> lines, String
targetNodePrefix, String expectedNextNodePrefix) {
+ // get index of the first line which starts with targetNodePrefix
+ int targetNodeIndex = -1;
+ String targetNodeLine = null;
+ String targetNode = null;
+ for (int i = 0; i < lines.size(); i++) {
+ targetNodeLine = lines.get(i);
+ targetNode = targetNodeLine.trim();
+ if (targetNode.startsWith(targetNodePrefix)) {
+ targetNodeIndex = i;
+ break;
+ }
+ }
+ assertThat(targetNodeIndex).as(targetNodePrefix + " is not
found").isNotEqualTo(-1);
+
+ String nextLine = lines.get(targetNodeIndex + 1);
+ String nextNode = nextLine.trim();
+ assertThat(nextNode).as(targetNodePrefix + " should be followed by " +
expectedNextNodePrefix).startsWith(expectedNextNodePrefix);
+
+ // The next node has to be a leaf of the target node. It means the
number of leading spaces in nextLine should be greater than that in
targetNodeLine
+ int targetNodeLeadingSpaces = targetNodeLine.indexOf(targetNode);
+ int nextNodeLeadingSpaces = nextLine.indexOf(nextNode);
+ assertThat(nextNodeLeadingSpaces).as(expectedNextNodePrefix + " should
be a sink of " + targetNodePrefix)
+ .isGreaterThan(targetNodeLeadingSpaces);
+ }
+
+ private static List<String> getLinesByCoreReteDumper(KieBase kbase) {
+ StringWriter sw = new StringWriter();
+ PrintWriter pw = new PrintWriter(sw);
+ org.drools.core.reteoo.ReteDumper dumper = new
org.drools.core.reteoo.ReteDumper();
+ dumper.setWriter(pw);
+ dumper.dump(kbase);
+ pw.flush();
+
+ String result = sw.toString();
+ return Arrays.stream(result.split("\n")).toList();
+ }
+
+ private static List<String> getLinesByExecmodelReteDumper(KieBase kbase) {
+ List<String> lines = new ArrayList<>();
+ BiConsumer<String, BaseNode> lineCollector = (ident, node) ->
lines.add(ident + node.toString());
+
org.drools.model.codegen.execmodel.ReteDumper.visitRete(((InternalKnowledgeBase)
kbase).getRete(), lineCollector);
+ return lines;
+ }
+}
---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]