Update of /cvsroot/monetdb/MonetDB5/src/optimizer
In directory sc8-pr-cvs16.sourceforge.net:/tmp/cvs-serv2226
Modified Files:
opt_replicator.mx
Log Message:
Implementation of re-use of reverse, join and semijoin.
Index: opt_replicator.mx
===================================================================
RCS file: /cvsroot/monetdb/MonetDB5/src/optimizer/opt_replicator.mx,v
retrieving revision 1.27
retrieving revision 1.28
diff -u -d -r1.27 -r1.28
--- opt_replicator.mx 29 Feb 2008 14:54:42 -0000 1.27
+++ opt_replicator.mx 29 Feb 2008 15:43:20 -0000 1.28
@@ -92,7 +92,7 @@
pattern
replicator.select(b:bat[:any_1,:any_2],low:any_2,hgh:any_2,li:bit,hi:bit):bat[:any_1,:any_2]
address REPselect
-cs well as well omment "The overloaded select operator for replicated
operations";
+comment "The overloaded select operator for replicated operations";
pattern replicator.uselect(b:bat[:any_1,:any_2],value:any_2):bat[:any_1,:oid ]
address REPuselect
@@ -582,8 +582,6 @@
rv = getArg(p,0);
vmap = getMap(s);
- if( vmap == NULL)
- throw(MAL, "REPbind", "Variable map not initialized");
if( vmap[rv] < 0 ){ /*res var not mapped*/
ri = findReplica(s,p); /* replica instr */
@@ -703,8 +701,6 @@
rv = getArg(pci,0);
vmap = getMap(stk);
- if( vmap == NULL)
- throw(MAL, "REPbind", "Variable map not initialized");
if( vmap[rv] < 0 ){ /*res var not mapped*/
ri = findReplica(stk,pci); /* replica instr */
if( ri < 0 ){
@@ -739,29 +735,64 @@
REPreverse(MalBlkPtr mb, MalStkPtr stk, InstrPtr pci)
{
- int *ret, *bid;
- lng clk = 0;
+ int *ret, *bid, ri, rv, rr, *vmap;
BAT *b, *bn = NULL;
(void) mb;
ret= (int*) getArgReference(stk, pci,0);
bid= (int*) getArgReference(stk, pci,1);
- if ((b = BATdescriptor(*bid)) == NULL) {
- throw(MAL, "bat.reverse", "Cannot access descriptor");
- }
+ rv = getArg(pci,0);
+ vmap = getMap(stk);
- clk = GDKusec();
- bn = BATmirror(b);
- clk = GDKusec()-clk;
+ if( vmap[rv] < 0 ){ /*res var not mapped*/
+ ri = findReplica(stk,pci); /* replica instr */
+ if(ri >= 0 && isResStored(repl,ri)){ /*reuse */
+ rr = getArg(repl->stmt[ri],0);
+ *ret = *(int *)getVarVal(repl,rr);
+ BBPincref(*ret,TRUE);
+ replstat[rr].reuse++;
+ } else { /* compute */
+ if ((b = BATdescriptor(*bid)) == NULL) {
+ throw(MAL, "bat.reverse", "Cannot access descriptor");
+ }
+ bn = BATmirror(b);
+ if (bn) {
+ *ret = bn->batCacheid;
+ BBPkeepref(bn->batCacheid);
+ } else
+ throw(MAL, "REPreverse", "GDKerror");
- if (bn) {
- *ret = bn->batCacheid;
- BBPkeepref(bn->batCacheid);
- } else
- throw(MAL, "bat.reverse", "GDKerror");
+ if( ri < 0 ){ /* add replica item */
+ ri = newReplica(stk,pci,FALSE);
+ rr = getArg(repl->stmt[ri],0);
+ }
+ else rr = getArg(repl->stmt[ri],0);
+ }
+ /* set mapping after first exec */
+ vmap[rv] = rr;
+ }
+ else { /* check and reuse mapped var*/
+ rr = vmap[rv];
+ if( isVarStored(repl,rr) ){ /*reuse */
+ *ret = *(int *)getVarVal(repl,rr);
+ BBPincref(*ret,TRUE);
+ replstat[rr].reuse++;
+ }
+ else { /* recompute */
+ if ((b = BATdescriptor(*bid)) == NULL) {
+ throw(MAL, "bat.reverse", "Cannot access
descriptor");
+ }
+ bn = BATmirror(b);
+ if (bn) {
+ *ret = bn->batCacheid;
+ BBPkeepref(bn->batCacheid);
+ } else
+ throw(MAL, "REPreverse", "GDKerror");
+ }
+ }
- newReplica(stk,pci,FALSE);
+/* TODO reuse branch of code can be dropped if we are sure that we never store
and reuse reverse results ??*/
return MAL_SUCCEED;
}
@@ -771,19 +802,50 @@
{
int *ret, *lid, *rid;
- lng clk = 0;
- str msg;
+ int ri, rv, rr, *vmap, cnt = 0;
+ str msg = MAL_SUCCEED;
(void) mb;
ret = (int*) getArgReference(stk, pci,0);
lid = (int*) getArgReference(stk, pci,1);
rid = (int*) getArgReference(stk, pci,2);
+
+ rv = getArg(pci,0);
+ vmap = getMap(stk);
- clk = GDKusec();
- msg = ALGjoin(ret, lid, rid);
- clk = GDKusec()-clk;
+ if( vmap[rv] < 0 ){ /*res var not mapped*/
+ ri = findReplica(stk,pci); /* replica instr */
+ if(ri >= 0 && isResStored(repl,ri)){ /*reuse */
+ rr = getArg(repl->stmt[ri],0);
+ *ret = *(int *)getVarVal(repl,rr);
+ BBPincref(*ret,TRUE);
+ replstat[rr].reuse++;
+ } else { /* compute */
+ msg = ALGjoin(ret, lid, rid);
+ if( msg == MAL_SUCCEED )
+ ALGcount_bat(&cnt, ret);
+ if( ri < 0 ){ /* add replica item */
+ ri = newReplica(stk,pci,TRUE);
+ rr = getArg(repl->stmt[ri],0);
+ replstat[rr].cnt = cnt;
+ }
+ else rr = getArg(repl->stmt[ri],0);
+ }
+ /* set mapping after first exec */
+ vmap[rv] = rr;
+ }
+ else { /* check and reuse mapped var*/
+ rr = vmap[rv];
+ if( isVarStored(repl,rr) ){ /*reuse */
+ *ret = *(int *)getVarVal(repl,rr);
+ BBPincref(*ret,TRUE);
+ replstat[rr].reuse++;
+ }
+ else { /* recompute */
+ msg = ALGjoin(ret, lid, rid);
+ }
+ }
- newReplica(stk,pci,TRUE);
return msg;
}
@@ -792,19 +854,49 @@
{
int *ret, *lid, *rid;
- lng clk = 0;
- str msg;
+ int ri, rv, rr, *vmap, cnt = 0;
+ str msg = MAL_SUCCEED;
(void) mb;
ret = (int*) getArgReference(stk, pci,0);
lid = (int*) getArgReference(stk, pci,1);
rid = (int*) getArgReference(stk, pci,2);
- clk = GDKusec();
- msg = ALGsemijoin(ret, lid, rid);
- clk = GDKusec()-clk;
-
- newReplica(stk,pci,TRUE);
+ rv = getArg(pci,0);
+ vmap = getMap(stk);
+
+ if( vmap[rv] < 0 ){ /*res var not mapped*/
+ ri = findReplica(stk,pci); /* replica instr */
+ if(ri >= 0 && isResStored(repl,ri)){ /*reuse */
+ rr = getArg(repl->stmt[ri],0);
+ *ret = *(int *)getVarVal(repl,rr);
+ BBPincref(*ret,TRUE);
+ replstat[rr].reuse++;
+ } else { /* compute */
+ msg = ALGsemijoin(ret, lid, rid);
+ if( msg == MAL_SUCCEED )
+ ALGcount_bat(&cnt, ret);
+ if( ri < 0 ){ /* add replica item */
+ ri = newReplica(stk,pci,TRUE);
+ rr = getArg(repl->stmt[ri],0);
+ replstat[rr].cnt = cnt;
+ }
+ else rr = getArg(repl->stmt[ri],0);
+ }
+ /* set mapping after first exec */
+ vmap[rv] = rr;
+ }
+ else { /* check and reuse mapped var*/
+ rr = vmap[rv];
+ if( isVarStored(repl,rr) ){ /*reuse */
+ *ret = *(int *)getVarVal(repl,rr);
+ BBPincref(*ret,TRUE);
+ replstat[rr].reuse++;
+ }
+ else { /* recompute */
+ msg = ALGsemijoin(ret, lid, rid);
+ }
+ }
return msg;
}
-------------------------------------------------------------------------
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