Update of /cvsroot/monetdb/MonetDB5/src/optimizer
In directory sc8-pr-cvs16.sourceforge.net:/tmp/cvs-serv7858

Modified Files:
        opt_replicator.mx 
Log Message:
Code reorganization to make policy control easier.


Index: opt_replicator.mx
===================================================================
RCS file: /cvsroot/monetdb/MonetDB5/src/optimizer/opt_replicator.mx,v
retrieving revision 1.13
retrieving revision 1.14
diff -u -d -r1.13 -r1.14
--- opt_replicator.mx   12 Feb 2008 13:11:05 -0000      1.13
+++ opt_replicator.mx   12 Feb 2008 16:11:34 -0000      1.14
@@ -396,14 +396,19 @@
                str sname, str tname, str cname, bit tl)
 {
        int tpe, rr;
-       BAT *bn;
+       BAT *bn, *br;
        lng cnt=0,clk;
        Replica r;
        sht ov;
 
        tpe= ATOMstorage(b->T->type);
 
-       if( retain == 0){ /* normal execution + keep stat */
+       /* replica match */
+        rr = findReplica(sname,tname,cname,tpe,tl, low, hgh, li, hi, &ov);
+
+       /* execute selection if needed */
+       if((retain == 0) ||     /* normal execution + keep stat */
+          ((retain == 1) && (ov < 0))){        /* no overlap in exist. repl. */
                clk= GDKusec();
                bn = BAT_select_(b, low, hgh, li, hi, tl, FALSE);
                clk= GDKusec()-clk;
@@ -412,31 +417,61 @@
                        if (!(bn->batDirty&2)) bn = BATsetaccess(bn, BAT_READ);
                        *ret = bn->batCacheid;
                        cnt= BATcount(bn);
-                       BBPkeepref(bn->batCacheid);
+                       BBPkeepref(*ret);
                }
                else throw(MAL, "REPselectImpl", "GDKerror");
-               
-               rr = findReplica(sname,tname,cname,tpe,tl,low,hgh,li,hi,&ov);
-               if (ov < 0){    /* no repl overlaps, new entry in repl. table*/
-                       r = newReplica(sname,tname,cname,tpe,tl);
-                       setReplicaRange(r,tpe,low,hgh,li,hi);
-                       r->cnt = cnt;
-                       r->cost = clk;
-                       r->ucnteq = r->ucntsub = 0;
-               } else 
-               if (ov == 0 ){  /* equality, reuse replica rr*/
-                       r = repltable + rr;
-                       r->ucnteq++;
-               } 
-               else {          /* use replica rr to shrink selection */
-                       r = repltable + rr;
-                       r->ucntsub++;
-                               /* make new entry in replica table*/
-                       r = newReplica(sname,tname,cname,tpe,tl);
-                       setReplicaRange(r,tpe,low,hgh,li,hi);
-                       r->cnt = cnt;
-                       r->cost = clk;
-                       r->ucnteq = r->ucntsub = 0;
+
+       } else 
+       if ((retain == 1) && (ov > 0)){ /* exec. over subset repl. */ 
+                r = repltable + rr;
+                       r->ucntsub++;
+
+                       if ((br = BATdescriptor(r->resbid)) == NULL) {
+                               throw(MAL, "REPselectImpl", "Cannot access 
replica descriptor");
+                }
+                       clk= GDKusec();
+                       bn = BAT_select_(br, low, hgh, li, hi, tl, FALSE);
+                clk= GDKusec()-clk;
+
+                       BBPreleaseref(br->batCacheid);
+               if (bn) {
+                               if (!(bn->batDirty&2)) bn = BATsetaccess(bn, 
BAT_READ);
+                        *ret = bn->batCacheid;
+                       cnt = BATcount(bn);
+                               BBPkeepref(*ret);
+                       }
+                else throw(MAL, "REPselectImpl", "GDKerror");
+       }
+
+               /* update replica table */
+       if( ov < 0 ){                   /* new intermed. -> new entry */
+               r = newReplica(sname,tname,cname,tpe,tl);
+               setReplicaRange(r,tpe,low,hgh,li,hi);
+               r->cnt = cnt;
+               r->cost = clk;
+               r->ucnteq = r->ucntsub = 0;
+               if( retain == 1){
+                       r->resbid = *ret;
+                       BBPincref(*ret,TRUE);
+               }
+       } else
+       if(ov == 0 ){           /* equality, reuse replica rr*/
+               r = repltable + rr;
+               r->ucnteq++;
+               if( retain == 1 ){  
+                       *ret = r->resbid;
+                       BBPincref(*ret,TRUE);
+               }
+       } else {        /* reuse replica rr to shrink selection,
+                        make new entry for the result*/
+               r = newReplica(sname,tname,cname,tpe,tl);
+               setReplicaRange(r,tpe,low,hgh,li,hi);
+               r->cnt = cnt;
+               r->cost = clk;
+               r->ucnteq = r->ucntsub = 0;
+               if( retain == 1){
+                       r->resbid = *ret;
+                       BBPincref(*ret,TRUE);
                }
        }
        return MAL_SUCCEED;


-------------------------------------------------------------------------
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-checkins mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/monetdb-checkins

Reply via email to