[rules-users] Updating an existing fact w/o using fact handle

Edson Tirelli tirelli at post.com
Mon Jun 2 10:20:40 EDT 2008


   Yes, your implementation looks fine. It is a hashmap lookup with a few
additional checks, but I don'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.

   []s
   Edson


2008/6/2 Fenderbosch, Eric <Eric.Fenderbosch at fedex.com>:

> Thanks.
>
> What I've done is add an insertOrUpdate method on a util class we use.
> How efficient is getFactHandle?  Is it a simple HashMap lookup?  Or
> would we be better off keeping our own map of handles->facts?
>
> public static FactHandle insertOrUpdate(Object fact, boolean dynamic) {
>        FactHandle factHandle = workingMemory.getFactHandle(fact);
>        if (factHandle == null) {
>                return workingMemory.insert(fact, dynamic);
>        }
>        workingMemory.update(factHandle, fact);
>        return factHandle;
> }
>
> ________________________________
>
> From: rules-users-bounces at lists.jboss.org
> [mailto:rules-users-bounces at lists.jboss.org] On Behalf Of Edson Tirelli
> Sent: Saturday, May 31, 2008 9:12 AM
> To: Rules Users List
> Subject: Re: [rules-users] Updating an existing fact w/o using fact
> handle
>
>
>
>   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 at 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 at 17653ae
>        AssertBehaviour : equality
>        ConflictResolver :
> org.drools.conflict.DepthConflictResolver at 16fe0f4
>        ConsequenceExceptionHandler :
>        org.drools.base.DefaultConsequenceExceptionHandler at 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 at 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
>
> _______________________________________________
> rules-users mailing list
> rules-users at 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
-------------- next part --------------
An HTML attachment was scrubbed...
URL: http://lists.jboss.org/pipermail/rules-users/attachments/20080602/318b9cbd/attachment.html 


More information about the rules-users mailing list