Nope. You must use the update method. You can get the previous fact handle using the get method in working memory if you still have the original non-modified object, or if behavior is equals based, using an equals object.

   []
   Edson

2008/5/30 Fenderbosch, Eric <Eric.Fenderbosch@fedex.com>:
Is it required to use WorkingMemory.update to update an existing fact?
I thought if assert behavior was set to equality and you implemented the
equals method properly, then you could simply use WorkingMemory.insert
to overwrite a fact in working memory with a new version.  If this isn't
the case, then are there other settings that will give this behavior?

I'm using 4.0.7.

Thanks for any help.

Eric

Here's my RuleBaseConfiguration:
AlphaNodeHashingThreshold : 3
CompositeKeyDepth : 3
ExecutorServiceorg.drools.concurrent.DefaultExecutorService
RuleBaseUpdateHandler :
org.drools.base.FireAllRulesRuleBaseUpdateListener
AgendaGroupFactory :
org.drools.common.PriorityQueueAgendaGroupFactory@17653ae
AssertBehaviour : equality
ConflictResolver : org.drools.conflict.DepthConflictResolver@16fe0f4
ConsequenceExceptionHandler :
org.drools.base.DefaultConsequenceExceptionHandler@19d0a1
LogicalOverride : discard
SequentialAgenda : sequential
AlphaMemory : false
IndexLeftBetaMemory : true
IndexRightBetaMemory : true
MaintainTms : true
RemoveIdenities : true
Sequential : false
ShadowProxy : true
ShareAlphaNodes : true
ShareBetaNodes : true
UseStaticObjensis : false


My TestFact class:

public class TestFact {

       private String id;
       private String value;

       public String getId() {
               return id;
       }

       public void setId(String id) {
               this.id = id;
       }

       public String getValue() {
               return value;
       }

       public void setValue(String value) {
               this.value = value;
       }

       @Override
       public int hashCode() {
               return id.hashCode();
       }

       @Override
       public boolean equals(Object obj) {
               if (this == obj) return true;
               if (!(obj instanceof TestFact)) return false;
               TestFact other = (TestFact) obj;
               // not null safe, i know
               return this.id.equals(other.id);
       }
}

And the JUnit Test Case that fails:
       public void testFactUpdate() throws Exception {
               TestFact testFact = new TestFact();
               testFact.setId("1234");
               testFact.setValue("old");

               FactHandle testFactHandle =
workingMemory.insert(testFact);

               TestFact updatedFact = new TestFact();
               updatedFact.setId("1234");
               updatedFact.setValue("new");

               FactHandle updatedFactHandle =
workingMemory.insert(updatedFact);
               // using workingMemory.update here works

               // passes
               assertTrue(testFactHandle == updatedFactHandle);

               TestFact retrievedTestFact = (TestFact)
workingMemory.getObject(testFactHandle);
               // fails
               assertEquals("new", retrievedTestFact.getValue());
       }

_______________________________________________
rules-users mailing list
rules-users@lists.jboss.org
https://lists.jboss.org/mailman/listinfo/rules-users



--
Edson Tirelli
JBoss Drools Core Development
Office: +55 11 3529-6000
Mobile: +55 11 9287-5646
JBoss, a division of Red Hat @ www.jboss.com