Changeset: 2a4bb24f4e8a for MonetDB
URL: http://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=2a4bb24f4e8a
Modified Files:
        monetdb5/optimizer/opt_slicing.mx
Branch: default
Log Message:

Introduce simple partitioning heuristic
The bounds of the partitions are derived form the min/max values,
and include the other ranges,e.g. (nil,min,max,nil)
For more partitions an uniform distribution is assumed.


diffs (195 lines):

diff --git a/monetdb5/optimizer/opt_slicing.mx 
b/monetdb5/optimizer/opt_slicing.mx
--- a/monetdb5/optimizer/opt_slicing.mx
+++ b/monetdb5/optimizer/opt_slicing.mx
@@ -42,7 +42,7 @@
 
 opt_export str OPTgauges(Client cntxt, MalBlkPtr mb, MalStkPtr stk, InstrPtr 
pci);
 
-#define _DEBUG_OPT_SLICE_
+/* #define _DEBUG_OPT_SLICE_ */
 #define OPTDEBUGslicing  if ( optDebug & ((lng)1 <<DEBUG_OPT_SLICING) )
 #endif
 @c
@@ -84,19 +84,6 @@
        ValRecord bounds[MAXSITES];
 } Gauge;
 
-static void 
-OPTsliceGauges(MalBlkPtr mb, Gauge gauge, int peercnt)
-{
-       /* use sampling to determine initial gauge setting */
-       int i;
-
-       (void) mb;
-       for ( i=0; i < peercnt; i++){
-               gauge.bounds[i].vtype = gauge.type;
-               gauge.bounds[i].val.ival = 0;
-       }
-}
-
 static int
 OPTfindPeer(str uri)
 {
@@ -261,7 +248,7 @@
        }
 
        /* (k1,...kn):= remote.exec(conn,slicing,qry,version....) */
-       snprintf(nme,BUFSIZ,"%s_subq",getFunctionId( getInstrPtr(mb,0)));
+       snprintf(nme,BUFSIZ,"%s_sub",getFunctionId( getInstrPtr(mb,0)));
        q= newFcnCall(smb,remoteRef,execRef);
        q->retc=  q->argc= 0;
        for (j=0; j < sig->retc; j++){
@@ -419,6 +406,13 @@
        } else 
        if ( getFunctionId(q) == putName("exportValue",11)) 
                getArg(q,8)= getArg(pack[0],0);
+       else
+       if ( getFunctionId(q) == NULL){
+               /* simple assignment */
+               assert(nrpack == q->retc);
+               for( k = 0; k < nrpack; k++)
+                       getArg(q, q->retc + k) = getArg(pack[k],0);
+       }
        
        pushInstruction(cmb,q);
 
@@ -484,7 +478,7 @@
        str msg= MAL_SUCCEED;
        
        /* define the sub query as part of the user space */
-       snprintf(nme,BUFSIZ,"%s_subq%d",getFunctionId( getInstrPtr(mb,0)), pc);
+       snprintf(nme,BUFSIZ,"%s_qry%d",getFunctionId( getInstrPtr(mb,0)), pc);
        s = newFunction(userRef, putName(nme, strlen(nme)),FUNCTIONsymbol);
        if ( s == NULL)
                return 0;
@@ -492,7 +486,6 @@
        s->def = copyMalBlk(mb);
        nmb = s->def;
        getFunctionId( getInstrPtr(nmb,0)) = putName(nme,strlen(nme));
-       insertSymbol(cntxt->nspace,s);
 
        limit = nmb->stop;
        old = nmb->stmt;
@@ -549,7 +542,6 @@
                                /* temporary extend signature with bounds */
                                nmb->stmt[0] =  
pushArgument(nmb,getInstrPtr(nmb,0), gauge.lgauge);
                                nmb->stmt[0] =  
pushArgument(nmb,getInstrPtr(nmb,0), gauge.hgauge);
-                               OPTsliceGauges(nmb, gauge, nrpeers);
                        }
                        
                        if (strcmp(gauge.column, getVarConstant(nmb, 
getArg(p,4)).val.sval) == 0) {
@@ -603,21 +595,18 @@
                freeMalBlk(nmb);
                return 0;
        }
+       insertSymbol(cntxt->nspace,s);
 
 
        q = 0;
 
        /* supportive routines */
        smb = OPTslicingStub(cntxt, mb, pc,  nmb, gauge);
-       if ( smb)
-               printFunction(cntxt->fdout, smb, 0, LIST_MAL_STMT);
        msg = OPTdeadcode(cntxt, smb, 0, 0);
        if ( msg)
                goto wrapup;
 
        cmb = OPTslicingCntrl(cntxt,mb,pc,nmb, gauge);
-       if ( cmb)
-               printFunction(cntxt->fdout, cmb, 0, LIST_MAL_STMT);
        chkProgram(cntxt->nspace, cmb);
        if ( cmb->errors)
                goto wrapup;
@@ -640,6 +629,7 @@
        q->token = ASSIGNsymbol;
        /* beware this instruction refers to cmb variables */
 wrapup:
+#ifdef _DEBUG_OPT_SLICE_
        mnstr_printf(cntxt->fdout,"#Grabbed part\n");
        if ( nmb)
                printFunction(cntxt->fdout, nmb, 0, LIST_MAL_STMT);
@@ -649,6 +639,7 @@
        mnstr_printf(cntxt->fdout,"#cntrl\n");
        if ( cmb)
                printFunction(cntxt->fdout, cmb, 0, LIST_MAL_STMT);
+#endif
 
        if (vec) GDKfree(vec);
        return q;
@@ -674,7 +665,10 @@
        if ( nrpeers == 0 )
                OPTdiscover(cntxt);
        mal_unset_lock(mal_contextLock,"optimizer.slicing");
+    /* nrpeers = GDKnr_threads ? GDKnr_threads:1;*/
+       /* to ease debugging now */
        nrpeers = 2;
+       slicingLocal = 1;
 
        /* modify the block as we go */
        omb= copyMalBlk(mb);
@@ -809,20 +803,64 @@
 @include optimizerWrapper.mx
 @c
 #include "opt_statistics.h"
+#include "algebra.h"
 @:wrapOptimizer(slicing,OPT_CHECK_ALL)@
 
+@-
+@= histo
+       { @1 *vv;
+               vv= (@1 *) getArgReference(stk, pci, 0 );
+               *vv = @1_nil;
+               vx = (ptr) &max.val.@2;
+               BATmax(b, vx);
+               vv= (ptr) getArgReference(stk, pci, pci->retc -1 );
+               *vv = @1_nil;
+               vm = (ptr) &min.val.@2;
+               BATmin(b, vm);
+               step.val.@2 = (max.val.@2 - min.val.@2) / pci->retc-2;
+               if ( step.val.@2 == 0)
+                               step.val.@2 = max.val.@2;
+               for ( i = 1; i < pci->retc-1; i++) {
+                       vx= (ptr) getArgReference(stk, pci, i );
+                       ((ValPtr) vx ) ->val.@2 = min.val.@2 + i * step.val.@2;
+               }
+       }
+@c
 /* determine the initial gauge values */
+/* the min/max bounds are null values */
 /* It is the heart of the approach and requires experimentation */
 str
 OPTgauges(Client cntxt, MalBlkPtr mb, MalStkPtr stk, InstrPtr pci)
 {      
        BAT *b;
        int bid = *(int*) getArgReference(stk,pci, pci->argc-1);
+       ValRecord min,max, step;
+       int i;
+       ptr vx,vm;
+
        (void) cntxt;
        (void) mb;
+       if ( pci->retc < 2)
+               throw(SQL,"sql.gauges","Not enough gauges");
        b = BATdescriptor(bid);
        if (b == NULL)
                throw(SQL,"sql.gauges","Can not access BAT");
+    switch (ATOMstorage(b->ttype)) {
+    case TYPE_bte: @:histo(bte,btval)@ break;
+    case TYPE_sht: @:histo(sht,shval)@ break;
+    case TYPE_int: @:histo(int,ival)@ break;
+    case TYPE_wrd: @:histo(wrd,wval)@ break;
+    case TYPE_lng: @:histo(lng,lval)@ break;
+    case TYPE_oid: @:histo(oid,oval)@ break;
+    case TYPE_flt: @:histo(flt,fval)@ break;
+    case TYPE_dbl: @:histo(dbl,dval)@ break;
+       default:
+               throw(SQL,"sql.gauges","Can not slice column by value or oid");
+    }
+
+       for( i = 0; i < pci->retc; i++){
+       }
+
        BBPreleaseref(bid);
        return MAL_SUCCEED;
 }
_______________________________________________
Checkin-list mailing list
Checkin-list@monetdb.org
http://mail.monetdb.org/mailman/listinfo/checkin-list

Reply via email to