<br>&nbsp;&nbsp; Yes, your implementation looks fine. It is a hashmap lookup with a few additional checks, but I don&#39;t think it has noticeable perf difference, since keeping an external map would also require object creation (Map.Entry, etc) and would duplicate something that already exists internally.<br>
<br>&nbsp;&nbsp; []s<br>&nbsp;&nbsp; Edson<br><br><br><div class="gmail_quote">2008/6/2 Fenderbosch, Eric &lt;<a href="mailto:Eric.Fenderbosch@fedex.com">Eric.Fenderbosch@fedex.com</a>&gt;:<br><blockquote class="gmail_quote" style="border-left: 1px solid rgb(204, 204, 204); margin: 0pt 0pt 0pt 0.8ex; padding-left: 1ex;">
Thanks.<br>
<br>
What I&#39;ve done is add an insertOrUpdate method on a util class we use.<br>
How efficient is getFactHandle? &nbsp;Is it a simple HashMap lookup? &nbsp;Or<br>
would we be better off keeping our own map of handles-&gt;facts?<br>
<br>
public static FactHandle insertOrUpdate(Object fact, boolean dynamic) {<br>
 &nbsp; &nbsp; &nbsp; &nbsp;FactHandle factHandle = workingMemory.getFactHandle(fact);<br>
 &nbsp; &nbsp; &nbsp; &nbsp;if (factHandle == null) {<br>
 &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;return workingMemory.insert(fact, dynamic);<br>
 &nbsp; &nbsp; &nbsp; &nbsp;}<br>
 &nbsp; &nbsp; &nbsp; &nbsp;workingMemory.update(factHandle, fact);<br>
 &nbsp; &nbsp; &nbsp; &nbsp;return factHandle;<br>
}<br>
<br>
________________________________<br>
<br>
From: <a href="mailto:rules-users-bounces@lists.jboss.org">rules-users-bounces@lists.jboss.org</a><br>
[mailto:<a href="mailto:rules-users-bounces@lists.jboss.org">rules-users-bounces@lists.jboss.org</a>] On Behalf Of Edson Tirelli<br>
Sent: Saturday, May 31, 2008 9:12 AM<br>
To: Rules Users List<br>
Subject: Re: [rules-users] Updating an existing fact w/o using fact<br>
handle<br>
<div><div></div><div class="Wj3C7c"><br>
<br>
<br>
 &nbsp; Nope. You must use the update method. You can get the previous fact<br>
handle using the get method in working memory if you still have the<br>
original non-modified object, or if behavior is equals based, using an<br>
equals object.<br>
<br>
 &nbsp; []<br>
 &nbsp; Edson<br>
<br>
<br>
2008/5/30 Fenderbosch, Eric &lt;<a href="mailto:Eric.Fenderbosch@fedex.com">Eric.Fenderbosch@fedex.com</a>&gt;:<br>
<br>
<br>
 &nbsp; &nbsp; &nbsp; &nbsp;Is it required to use WorkingMemory.update to update an existing<br>
fact?<br>
 &nbsp; &nbsp; &nbsp; &nbsp;I thought if assert behavior was set to equality and you<br>
implemented the<br>
 &nbsp; &nbsp; &nbsp; &nbsp;equals method properly, then you could simply use<br>
WorkingMemory.insert<br>
 &nbsp; &nbsp; &nbsp; &nbsp;to overwrite a fact in working memory with a new version. &nbsp;If<br>
this isn&#39;t<br>
 &nbsp; &nbsp; &nbsp; &nbsp;the case, then are there other settings that will give this<br>
behavior?<br>
<br>
 &nbsp; &nbsp; &nbsp; &nbsp;I&#39;m using <a href="http://4.0.7." target="_blank">4.0.7.</a><br>
<br>
 &nbsp; &nbsp; &nbsp; &nbsp;Thanks for any help.<br>
<br>
 &nbsp; &nbsp; &nbsp; &nbsp;Eric<br>
<br>
 &nbsp; &nbsp; &nbsp; &nbsp;Here&#39;s my RuleBaseConfiguration:<br>
 &nbsp; &nbsp; &nbsp; &nbsp;AlphaNodeHashingThreshold : 3<br>
 &nbsp; &nbsp; &nbsp; &nbsp;CompositeKeyDepth : 3<br>
 &nbsp; &nbsp; &nbsp; &nbsp;ExecutorServiceorg.drools.concurrent.DefaultExecutorService<br>
 &nbsp; &nbsp; &nbsp; &nbsp;RuleBaseUpdateHandler :<br>
 &nbsp; &nbsp; &nbsp; &nbsp;org.drools.base.FireAllRulesRuleBaseUpdateListener<br>
 &nbsp; &nbsp; &nbsp; &nbsp;AgendaGroupFactory :<br>
 &nbsp; &nbsp; &nbsp; &nbsp;org.drools.common.PriorityQueueAgendaGroupFactory@17653ae<br>
 &nbsp; &nbsp; &nbsp; &nbsp;AssertBehaviour : equality<br>
 &nbsp; &nbsp; &nbsp; &nbsp;ConflictResolver :<br>
org.drools.conflict.DepthConflictResolver@16fe0f4<br>
 &nbsp; &nbsp; &nbsp; &nbsp;ConsequenceExceptionHandler :<br>
 &nbsp; &nbsp; &nbsp; &nbsp;org.drools.base.DefaultConsequenceExceptionHandler@19d0a1<br>
 &nbsp; &nbsp; &nbsp; &nbsp;LogicalOverride : discard<br>
 &nbsp; &nbsp; &nbsp; &nbsp;SequentialAgenda : sequential<br>
 &nbsp; &nbsp; &nbsp; &nbsp;AlphaMemory : false<br>
 &nbsp; &nbsp; &nbsp; &nbsp;IndexLeftBetaMemory : true<br>
 &nbsp; &nbsp; &nbsp; &nbsp;IndexRightBetaMemory : true<br>
 &nbsp; &nbsp; &nbsp; &nbsp;MaintainTms : true<br>
 &nbsp; &nbsp; &nbsp; &nbsp;RemoveIdenities : true<br>
 &nbsp; &nbsp; &nbsp; &nbsp;Sequential : false<br>
 &nbsp; &nbsp; &nbsp; &nbsp;ShadowProxy : true<br>
 &nbsp; &nbsp; &nbsp; &nbsp;ShareAlphaNodes : true<br>
 &nbsp; &nbsp; &nbsp; &nbsp;ShareBetaNodes : true<br>
 &nbsp; &nbsp; &nbsp; &nbsp;UseStaticObjensis : false<br>
<br>
<br>
 &nbsp; &nbsp; &nbsp; &nbsp;My TestFact class:<br>
<br>
 &nbsp; &nbsp; &nbsp; &nbsp;public class TestFact {<br>
<br>
 &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; private String id;<br>
 &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; private String value;<br>
<br>
 &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; public String getId() {<br>
 &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; return id;<br>
 &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; }<br>
<br>
 &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; public void setId(String id) {<br>
 &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <a href="http://this.id" target="_blank">this.id</a> = id;<br>
 &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; }<br>
<br>
 &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; public String getValue() {<br>
 &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; return value;<br>
 &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; }<br>
<br>
 &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; public void setValue(String value) {<br>
 &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; this.value = value;<br>
 &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; }<br>
<br>
 &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; @Override<br>
 &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; public int hashCode() {<br>
 &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; return id.hashCode();<br>
 &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; }<br>
<br>
 &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; @Override<br>
 &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; public boolean equals(Object obj) {<br>
 &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; if (this == obj) return true;<br>
 &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; if (!(obj instanceof TestFact)) return false;<br>
 &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; TestFact other = (TestFact) obj;<br>
 &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; // not null safe, i know<br>
 &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; return this.id.equals(<a href="http://other.id" target="_blank">other.id</a>);<br>
 &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; }<br>
 &nbsp; &nbsp; &nbsp; &nbsp;}<br>
<br>
 &nbsp; &nbsp; &nbsp; &nbsp;And the JUnit Test Case that fails:<br>
 &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; public void testFactUpdate() throws Exception {<br>
 &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; TestFact testFact = new TestFact();<br>
 &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; testFact.setId(&quot;1234&quot;);<br>
 &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; testFact.setValue(&quot;old&quot;);<br>
<br>
 &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; FactHandle testFactHandle =<br>
 &nbsp; &nbsp; &nbsp; &nbsp;workingMemory.insert(testFact);<br>
<br>
 &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; TestFact updatedFact = new TestFact();<br>
 &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; updatedFact.setId(&quot;1234&quot;);<br>
 &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; updatedFact.setValue(&quot;new&quot;);<br>
<br>
 &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; FactHandle updatedFactHandle =<br>
 &nbsp; &nbsp; &nbsp; &nbsp;workingMemory.insert(updatedFact);<br>
 &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; // using workingMemory.update here works<br>
<br>
 &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; // passes<br>
 &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; assertTrue(testFactHandle == updatedFactHandle);<br>
<br>
 &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; TestFact retrievedTestFact = (TestFact)<br>
 &nbsp; &nbsp; &nbsp; &nbsp;workingMemory.getObject(testFactHandle);<br>
 &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; // fails<br>
 &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; assertEquals(&quot;new&quot;,<br>
retrievedTestFact.getValue());<br>
 &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; }<br>
<br>
 &nbsp; &nbsp; &nbsp; &nbsp;_______________________________________________<br>
 &nbsp; &nbsp; &nbsp; &nbsp;rules-users mailing list<br>
 &nbsp; &nbsp; &nbsp; &nbsp;<a href="mailto:rules-users@lists.jboss.org">rules-users@lists.jboss.org</a><br>
 &nbsp; &nbsp; &nbsp; &nbsp;<a href="https://lists.jboss.org/mailman/listinfo/rules-users" target="_blank">https://lists.jboss.org/mailman/listinfo/rules-users</a><br>
<br>
<br>
<br>
<br>
<br>
--<br>
Edson Tirelli<br>
JBoss Drools Core Development<br>
Office: +55 11 3529-6000<br>
Mobile: +55 11 9287-5646<br>
JBoss, a division of Red Hat @ <a href="http://www.jboss.com" target="_blank">www.jboss.com</a><br>
<br>
_______________________________________________<br>
rules-users mailing list<br>
<a href="mailto:rules-users@lists.jboss.org">rules-users@lists.jboss.org</a><br>
<a href="https://lists.jboss.org/mailman/listinfo/rules-users" target="_blank">https://lists.jboss.org/mailman/listinfo/rules-users</a><br>
</div></div></blockquote></div><br><br clear="all"><br>-- <br> Edson Tirelli<br> JBoss Drools Core Development<br> Office: +55 11 3529-6000<br> Mobile: +55 11 9287-5646<br> JBoss, a division of Red Hat @ <a href="http://www.jboss.com">www.jboss.com</a>