Hi again,
after validating my example code for the condition node sharing i found
another problem. if i have 2 rules with 2 conditions and the first condition
of these rules is a shared one (equal), the rete graph will not be complete.
For the second rule there is no JoinNodeInput from the shared condition.
To understand why my code doesn't work i have modified the helloworld
examples to reproduce.
helloworld-java -> helloworld.java.drl
------------------------------------------------------------
<rule name="Hello World">
<parameter identifier="hello">
<class>String</class>
</parameter>
<parameter identifier="state">
<class>Integer</class>
</parameter>
<java:condition>hello.equals("Hello")</java:condition>
<java:condition>state.intValue() == 1</java:condition>
<java:consequence>
helloWorld( hello+" 1" );
</java:consequence>
</rule>
<rule name="Hello World2">
<parameter identifier="hello">
<class>String</class>
</parameter>
<parameter identifier="state">
<class>Integer</class>
</parameter>
<java:condition>hello.equals("Hello")</java:condition>
<java:condition>state.intValue() == 2</java:condition>
<java:consequence>
helloWorld( hello+" 2" );
</java:consequence>
</rule>
------------------------------------------------------------
The RETE-DUMP for these 2 rules:
RETE-DUMP helloworld-java
------------------------------------------------------------
[java] -----------------------------------------
[java] DUMP RETE
[java] Rete
[java] ----
[java] ObjectTypeNode
[java] --------------
[java] objectType: java.lang.String
[java] ParameterNode
[java] -------------
[java] Declaration
[java] -----------
[java] identifier: hello
[java] objectType: java.lang.String
[java] tupleSink:
[java] ConditionNode
[java] -------------
[java] condition: [ConditionNode: cond=[Condition:
hello.equals("Hello")]]
[java] tupleSink:
[java] JoinNodeInput
[java] -------------
[java] LEFT: [JoinNode: common=[]; decls=[[Declaration:
state], [Declaration: hello]]]
[java] TerminalNode
[java] -------------
[java] [TerminalNode: rule=Hello World]
[java] JoinNodeInput
[java] -------------
[java] LEFT: [JoinNode: common=[]; decls=[[Declaration:
state], [Declaration: hello]]]
[java] TerminalNode
[java] -------------
[java] [TerminalNode: rule=Hello World2]
[java] ObjectTypeNode
[java] --------------
[java] objectType: java.lang.Integer
[java] ParameterNode
[java] -------------
[java] Declaration
[java] -----------
[java] [ConditionTested: rule=Hello World; condition=[Condition:
hello.equals("Hello")]; passed=
true; tuple={[]}]
[java] [ObjectAsserted: handle=[fid:1]; object=Hello]
[java] identifier: state
[java] [ConditionTested: rule=Hello World; condition=[Condition:
state.intValue() == 1]; passed=
false; tuple={[]}]
[java] objectType: java.lang.Integer
[java] tupleSink:
[java] ConditionNode
[java] -------------
[java] [ConditionTested: rule=Hello World2; condition=[Condition:
state.intValue() == 2]; passed
=true; tuple={[]}]
[java] condition: [ConditionNode: cond=[Condition:
state.intValue() == 1]]
[java] [ActivationCreated: rule=Hello World2; tuple={[]}]
[java] tupleSink:
[java] [ObjectAsserted: handle=[fid:2]; object=2]
[java] JoinNodeInput
[java] -------------
[java] Hello 2 World
[java] RIGHT: [JoinNode: common=[]; decls=[[Declaration:
state], [Declaration: hello]]
]
[java] TerminalNode
[java] [ActivationFired: rule=Hello World2; tuple={[]}]
[java] -------------
[java] [TerminalNode: rule=Hello World]
[java] ConditionNode
[java] -------------
[java] condition: [ConditionNode: cond=[Condition:
state.intValue() == 2]]
[java] tupleSink:
[java] JoinNodeInput
[java] -------------
[java] RIGHT: [JoinNode: common=[]; decls=[[Declaration:
state], [Declaration: hello]]
]
[java] TerminalNode
[java] -------------
[java] [TerminalNode: rule=Hello World2]
[java]
[java] -----------------------------------------
------------------------------------------------------------
If i do the same within the HelloWorldNative.java it doesn't work.
RETE-DUMP helloworld-native
------------------------------------------------------------
[java] -----------------------------------------
[java] DUMP RETE
[java] Rete
[java] ----
[java] ObjectTypeNode
[java] --------------
[java] objectType: java.lang.Integer
[java] ParameterNode
[java] -------------
[java] Declaration
[java] -----------
[java] identifier: state
[java] objectType: java.lang.Integer
[java] tupleSink:
[java] ConditionNode
[java] -------------
[java] condition: [ConditionNode: cond=state.intValue() == '1';]
[java] tupleSink:
[java] JoinNodeInput
[java] -------------
[java] RIGHT: [JoinNode: common=[]; decls=[[Declaration:
state], [Declaration: hello]]
]
[java] TerminalNode
[java] -------------
[java] [TerminalNode: rule=Hello World 1]
[java] ConditionNode
[java] -------------
[java] condition: [ConditionNode: cond=state.intValue() == '2';]
[java] tupleSink:
[java] JoinNodeInput
[java] -------------
[java] RIGHT: [JoinNode: common=[]; decls=[[Declaration:
state], [Declaration: hello]]
]
[java] TerminalNode
[java] -------------
[java] [TerminalNode: rule=Hello World 2]
[java] ObjectTypeNode
[java] --------------
[java] objectType: java.lang.String
[java] ParameterNode
[java] -------------
[java] Declaration
[java] -----------
[java] identifier: hello
[java] objectType: java.lang.String
[java] tupleSink:
[java] ConditionNode
[java] -------------
[java] condition: [ConditionNode: cond=hello.equals( 'Hello')]
[java] tupleSink:
[java] JoinNodeInput
[java] -------------
[java] LEFT: [JoinNode: common=[]; decls=[[Declaration:
state], [Declaration: hello]]]
[java] TerminalNode
[java] -------------
[java] [TerminalNode: rule=Hello World 1]
[java]
[java] -----------------------------------------
------------------------------------------------------------
On the images generated by GraphViz from the ReteDotDump it is easier to
see. I can send them on demand. Also the modified HelloWorldNative.
Sorry for the large text, but i hope this helps to understand my problem.
Thanks & Regards
Kai