Hi,

This code makes no sense to me.  One of us is confused.  Given how today has 
been going it might be me.  Confusion below

On 2015-02-14, 1:59 AM, "OC" wrote:

P.S.

On 14. 2. 2015, at 8:34, OC <[email protected]<mailto:[email protected]>> wrote:
I tried to cache the object's permanentGlobalID when found or added new valid 
one ... it still does not work well

Actually it seems I must be misunderstanding somehow the behaviour of global 
IDs, worth to ask for an advice what I am doing wrong.

I cache permanent GID of the found object in my relationship; the cache key is 
the owner's GID -- the code looks essentially like this:

===
    private static Map _lastValidPOCacheGID=[:]
    public DBPriceOffer lastValidPriceOffer { // this might happen in any EC, 
default or temporary
        if (_lastValidPOCacheGID[this.permanentGlobalID()]) {
            def gid=_lastValidPOCacheGID[this.permanentGlobalID()]
            def lvpo=this.editingContext().objectForGlobalID(gid) //1 finds it 
if exists in EC, or...

Don’t do it like this.  Use ec.faultForGlobalD().  This handles the three cases:

  *   the EO is already int the EC
  *   the EO snapshot exists in an EODatabase but has not been faulted into 
this EC (you are not handling this case with your code)
  *   the object has not been fetched at all

This is not your problem, but I wanted to point that out.



            if (!lvpo) {
                
lvpo=ERXEOGlobalIDUtilities.fetchObjectWithGlobalID(this.editingContext(),gid) 
//2 ... fetches if does not
                println "???? fetched valid PO of ${this.permanentGlobalID()}: 
${gid} -> ${lvpo} IN ${this.editingContext.hashCode()}"
            } else println "???? found valid PO of ${this.permanentGlobalID()}: 
${gid} -> ${lvpo} IN ${this.editingContext.hashCode()}"
            if (lvpo) return lvpo
        }
        NSArray a=orderedPriceOffers
        for (int n=a.count-1;n>=0;n--) {
            DBPriceOffer po=(DBPriceOffer)a.objectAtIndex(n)
            if (po.validOffer) {
println "???? setting found last valid PO of ${this.permanentGlobalID()}: $po 
-> ${po.permanentGlobalID()} IN ${po.editingContext.hashCode()}"
                
_lastValidPOCacheGID[this.permanentGlobalID()]=po.permanentGlobalID()
                return po
            }
        }
        return nil
    }
    public int addPriceOffer(BigDecimal offerValue) { // this happens in a temp 
EC
        DBPriceOffer npo=new DBPriceOffer()
        this.editingContext.insertObject(npo)
        this.addObjectToBothSidesOfRelationshipWithKey(npo,'priceOffers')
        npo.offerValue=offerValue
        if ((npo.validOffer=_validateOffer(npo))) {
println "???? setting new valid PO of ${this.permanentGlobalID()}: $npo -> 
${npo.permanentGlobalID()} IN.this ${this.editingContext.hashCode()} IN.po 
${npo.editingContext.hashCode()}"
            
_lastValidPOCacheGID[this.permanentGlobalID()]=npo.permanentGlobalID() // the 
newly added offer is valid
        ... ... ...
    }
===

Now, at beginning, it works exactly as presumed -- the valid PO is found and 
cached, and then found in EC; when a temp EC is created, it is fetched for the 
first time, then found:

=== (printout of GIDs cleaned up manually for better reading) ===
???? setting found last valid PO of [DBAuction.1000015]: 
<DBPriceOffer@344474980 PK:1000205 /EC:704069077> -> [DBPriceOffer.1000205] IN 
704069077
???? found valid PO of [DBAuction.1000015]: [DBPriceOffer.1000205] -> 
<DBPriceOffer@344474980 PK:1000205 /EC:704069077> IN 704069077
???? fetched valid PO of [DBAuction.1000015]: [DBPriceOffer.1000205] -> 
<DBPriceOffer@890877103 PK:1000205 /EC:73728309> IN 73728309
???? found valid PO of [DBAuction.1000015]: [DBPriceOffer.1000205] -> 
<DBPriceOffer@890877103 PK:1000205 /EC:73728309> IN 73728309
===

When a new PO is added through addPriceOffer though, weird (to my flawed 
understanding) things happen: the PO is cached, is neither found in EC nor 
fetched, but IS found in the relationship -- what the darn?!? I would suppose 
it to be "found" at the line //1?!?

===
???? setting new valid PO of [DBAuction.1000015]: <DBPriceOffer@34841915 
PK:null N /EC:73728309> -> [DBPriceOffer.1000206] IN.this 73728309 IN.po 
73728309

Why does it say PK:null?   If a permanent GID has been assigned, should be PK 
not have a value?  And it is null, then null is getting cached here 
_lastValidPOCacheGID[this.permanentGlobalID()]=npo.permanentGlobalID()   Which 
I think explains why it is neither found in the EC or fetched?

Chuck



???? fetched valid PO of [DBAuction.1000015]: [DBPriceOffer.1000206] -> null IN 
73728309
???? setting found last valid PO of [DBAuction.1000015]: <DBPriceOffer@34841915 
PK:null N /EC:73728309> -> [DBPriceOffer.1000206] IN 73728309
===

At this moment, the new object is saved into the database.

The very same behaviour repeats later in the default EC -- again, the new PO is 
neither found in EC nor fetched, but IS found in the relationship -- this time, 
I would suppose it to be "fetched" at the line //2?!?

===
???? fetched valid PO of [DBAuction.1000015]: [DBPriceOffer.1000206] -> null IN 
704069077
???? setting found last valid PO of [DBAuction.1000015]: 
<DBPriceOffer@1582817960 PK:1000207 /EC:704069077> -> [DBPriceOffer.1000207] IN 
704069077
===

Can anyone explain the behaviour, so that I can see which of my presumptions is 
wrong and why?

Thanks a lot,
OC


_______________________________________________
Do not post admin requests to the list. They will be ignored.
Webobjects-dev mailing list      
([email protected]<mailto:[email protected]>)
Help/Unsubscribe/Update your Subscription:
https://lists.apple.com/mailman/options/webobjects-dev/chill%40gevityinc.com

This email sent to [email protected]<mailto:[email protected]>
 _______________________________________________
Do not post admin requests to the list. They will be ignored.
Webobjects-dev mailing list      ([email protected])
Help/Unsubscribe/Update your Subscription:
https://lists.apple.com/mailman/options/webobjects-dev/archive%40mail-archive.com

This email sent to [email protected]

Reply via email to