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

Reply via email to