Hi Stefan,

Thanks again for the comments and pointing out the mistakes!

>> Index: xrpc_client.mx
>> ===================================================================
>> RCS file: /cvsroot/monetdb/pathfinder/runtime/xrpc_client.mx,v
>> retrieving revision 1.41.2.8
>> retrieving revision 1.41.2.9
>> diff -u -d -r1.41.2.8 -r1.41.2.9
>> --- xrpc_client.mx   8 Mar 2008 21:17:27 -0000       1.41.2.8
>> +++ xrpc_client.mx   10 Mar 2008 02:01:13 -0000      1.41.2.9
>> @@ -94,94 +94,40 @@
>>         BAT[void, dbl] dbl_values,
>>         BAT[void, dbl] dec_values,
>>         BAT[void, str] str_values) : oid {
>> -
>>     var maxnconts := ws.fetch(0).count();
>>     # split used_<item|kind> into multiple BATs according to their  
>> container IDs
>           vvvvvvvvv
>>     var uitems := bat(oid, bat, maxnconts); # container ID in head
>>     var ukinds := bat(oid, bat, maxnconts);
>           ^^^^^^^^^
> These two BATs are IMHO overwritten below (see  
> "vvvvvvvvv"/"^^^^^^^^^");
> hence, no (more) need to make them, here!??

This is because I might insert more BUNs ("align uitems|kinds and  
ritems|kinds") after the leftfetchjoin below, so I though I can  
initialize these BATs with large enough spaces to avoid that insert()  
first has to extend the BATs.  From you comments, it seems that such  
initialization does not make sense?

>> +    var conts := get_container([int](used_kind)); # [oid,int]:  
>> container IDs in tail
>> +    var unq_conts := tunique(conts).hmark([EMAIL PROTECTED]);
>> +    var nconts := count(unq_conts);
>> +    var rs := rangesplit(conts,  
>> nconts).tmark([EMAIL PROTECTED]).reverse().join(unq_conts).reverse();
>
> This will do want you want (have rs's head contain the conts from  
> the BATs
> in its tail) ONLY if tunique(conts) & rangesplit(conts, nconts)  
> happen to
> produce the same order!
> To be sure, you'd need to sort the unq_conts before marking them  
> (result of
> rangesplit shoiuld hopefully be sorted):
>       var unq_conts := tunique(conts).sort().hmark([EMAIL PROTECTED]);
> Was there something wrong with my proposal:
>       var rs := rangesplit(conts, nconts);
>           rs := rs.reverse().mirror().[fetch](0).reverse();
> ?

No, there is nothing wrong with it.  I saw you e-mail much later, and  
since my solution seemed working (by accident), I didn't adopt your  
code.  Sorry.


Jennie


>       vvvvvvvvv
>> +    uitems := rs.[mirror]().[leftfetchjoin](const used_item);
>> +    uitems := [tmark](uitems, const [EMAIL PROTECTED]);
>> +    ukinds := rs.[mirror]().[leftfetchjoin](const used_kind);
>> +    ukinds := [tmark](ukinds, const [EMAIL PROTECTED]);
>       ^^^^^^^^^
> (see "vvvvvvvvv"/^^^^^^^^^" above)
> Plus: It might be more efficient to get rid of the head before the  
> join,
> since you "overwrite" them afterwards, anyway; i.e.:
>       uitems := rs.[tmark](oid(nil)).[leftfetchjoin](const used_item). 
> [tmark](uitems, const [EMAIL PROTECTED]);
>
>>
>>     # split returned_<item|kind> into multiple BATs according to  
>> their container IDs
>           vvvvvvvvv
>>     var ritems := bat(oid, bat, maxnconts); # container ID in head
>>     var rkinds := bat(oid, bat, maxnconts);
>           ^^^^^^^^^
> Same as with uitems/ukinds above.
>
>> -    conts := returned_kind.[int]().[>>](6).tsort(); # [oid,int]:  
>> container IDs in tail
>> -    nconts := conts.tunique().count();
>> -    if(nconts = 1){ # all items are from the same container
>> -        ritems.insert(conts.fetch(0).oid(), returned_item);
>> -        rkinds.insert(conts.fetch(0).oid(), returned_kind);
>> -    } else {
>> -        # sort used_<item|kind> on container ID
>> -        var itemcont :=  
>> returned_item.reverse().join(conts).reverse().tmark([EMAIL PROTECTED]);
>> -        var kindcont :=  
>> returned_kind.reverse().join(conts).reverse().tmark([EMAIL PROTECTED]);
>> -
>> -        var curcont := conts.fetch(0);
>> -        var tmpitem := bat(void, oid).seqbase([EMAIL PROTECTED]);
>> -        var tmpkind := bat(void, int).seqbase([EMAIL PROTECTED]);
>> -
>> -        conts := conts.tmark([EMAIL PROTECTED]); # conts[void,int]
>> -        [EMAIL PROTECTED](){
>> -            # start of next container, save items|kinds of  
>> previous container
>> -            if($t != curcont) {
>> -                curcont := $t;
>> -                ritems.insert(curcont, tmpitem);
>> -                rkinds.insert(curcont, tmpkind);
>> -                tmpitem := bat(void, oid).seqbase([EMAIL PROTECTED]);
>> -                tmpkind := bat(void, int).seqbase([EMAIL PROTECTED]);
>> -            }
>> -
>> -            tmpitem.append(itemcont.fetch($h));
>> -            tmpkind.append(kindcont.fetch($h));
>> -        }
>> -        ritems.insert(curcont, tmpitem);
>> -        rkinds.insert(curcont, tmpkind);
>> -    }
>> +    conts := get_container([int](returned_kind)); # [oid,int]:  
>> container IDs in tail
>> +    unq_conts := tunique(conts).hmark([EMAIL PROTECTED]);
>> +    nconts := count(unq_conts);
>> +    rs := rangesplit(conts,  
>> nconts).tmark([EMAIL PROTECTED]).reverse().join(unq_conts).reverse();
>
> (see above)
>
>       vvvvvvvvv
>> +    ritems := rs.[mirror]().[leftfetchjoin](const returned_item);
>> +    ritems := [tmark](ritems, const [EMAIL PROTECTED]);
>> +    rkinds := rs.[mirror]().[leftfetchjoin](const returned_kind);
>> +    rkinds := [tmark](rkinds, const [EMAIL PROTECTED]);
>       ^^^^^^^^^
> (see above)
>
>>
>>     # align uitems|kinds and ritems|kinds,
>>     # fill missing container with emtpybat
>>     var emptybat := bat(void,void,0);
>> -    [EMAIL PROTECTED](){
>> -        var err := CATCH({ritems.find($h);});
>> -        if(err.search("not found") >= 0){
>> -            ritems.insert($h, emptybat);
>> -        }
>> -    }
>> -    [EMAIL PROTECTED](){
>> -        var err := CATCH({uitems.find($h);});
>> -        if(err.search("not found") >= 0){
>> -            uitems.insert($h, emptybat);
>> -        }
>> -    }
>> -
>> +    var usedonly := kdiff(uitems,ritems).project(emptybat);
>> +    ritems.access(BAT_WRITE).insert(usedonly);
>> +    rkinds.access(BAT_WRITE).insert(usedonly);
>> +    var returnedonly := kdiff(ritems,uitems).project(emptybat);
>> +    uitems.access(BAT_WRITE).insert(returnedonly);
>> +    ukinds.access(BAT_WRITE).insert(returnedonly);
>
> a) Do you need to modify these BATs later on?
>   If not, you might want the set them read-only, again, after the  
> insert:
>       ritems.access(BAT_WRITE).insert(usedonly).access(BAT_READ);
> b) To be sure that your variables till point to the correct BATs
>   (access(BAT_WRITE) *might* return a copy!), you should asign the  
> result:
>       ritems := ritems.access(BAT_WRITE).insert(usedonly) 
> [.access(BAT_READ)];
>
> Stefan
>
> -- 
> | Dr. Stefan Manegold | mailto:[EMAIL PROTECTED] |
> | CWI,  P.O.Box 94079 | http://www.cwi.nl/~manegold/  |
> | 1090 GB Amsterdam   | Tel.: +31 (20) 592-4212       |
> | The Netherlands     | Fax : +31 (20) 592-4312       |
>
> -------------------------------------------------------------------------
> This SF.net email is sponsored by: Microsoft
> Defy all challenges. Microsoft(R) Visual Studio 2008.
> http://clk.atdmt.com/MRT/go/vse0120000070mrt/direct/01/
> _______________________________________________
> Monetdb-developers mailing list
> [email protected]
> https://lists.sourceforge.net/lists/listinfo/monetdb-developers


-------------------------------------------------------------------------
This SF.net email is sponsored by: Microsoft
Defy all challenges. Microsoft(R) Visual Studio 2008.
http://clk.atdmt.com/MRT/go/vse0120000070mrt/direct/01/
_______________________________________________
Monetdb-developers mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/monetdb-developers

Reply via email to