📄 opt_joinpath.c
字号:
#line 63 "/export/scratch0/monet/monet.GNU.64.64.d.14791/MonetDB5/src/optimizer/opt_joinpath.mx"#include "mal_config.h"#include "opt_joinpath.h"static intOPTjoinPathImplementation(MalBlkPtr mb, MalStkPtr stk, InstrPtr p){ int i,j,k, actions=0; int *pc, *used; str joinPathRef = putName("joinPath",8); InstrPtr q,r; (void) stk; pc= (int*) alloca(sizeof(int)* mb->vtop); /* to find last assignment */ memset((char*) pc, 0, sizeof(int)* mb->vtop); used= (int*) alloca(sizeof(int)* mb->vtop); /* to find last assignment */ memset((char*) used, 0, sizeof(int)* mb->vtop); for (i = 1; i < mb->stop; i++){ p= getInstrPtr(mb,i); for(j=0; j< p->retc; j++) pc[getArg(p,j)]= i; if( getModuleId(p)== algebraRef && getFunctionId(p)== joinRef ){#line 88 "/export/scratch0/monet/monet.GNU.64.64.d.14791/MonetDB5/src/optimizer/opt_joinpath.mx" q= copyInstruction(p); q->argc=1; for(j=p->retc; j<p->argc; j++) if( pc[getArg(p,j)] && used[getArg(p,j)]==0 ){ r= getInstrPtr(mb,pc[getArg(p,j)]);#ifdef DEBUG_OPT_JOINPATH stream_printf(GDKout,"expand with \n"); printInstruction(GDKout,mb, r, LIST_MAL_ALL);#endif if( getModuleId(r)== algebraRef && ( getFunctionId(r)== joinRef || getFunctionId(r)== joinPathRef) ){ for(k= r->retc; k<r->argc; k++) q= pushArgument(mb,q,getArg(r,k)); } else q= pushArgument(mb,q,getArg(p,j)); }#ifdef DEBUG_OPT_JOINPATH stream_printf(GDKout,"new joinPath instruction\n"); printInstruction(GDKout,mb, q, LIST_MAL_ALL);#endif if(q->argc<= p->argc){ /* no change */ nochange: freeInstruction(q); } else {#line 116 "/export/scratch0/monet/monet.GNU.64.64.d.14791/MonetDB5/src/optimizer/opt_joinpath.mx" for(j=1; j<q->argc-1; j++) if( getTailType(getArgType(mb,q,j)) != getHeadType(getArgType(mb,q,j+1)) && !( getTailType(getArgType(mb,q,j))== TYPE_oid && getHeadType(getArgType(mb,q,j))== TYPE_void) && !( getTailType(getArgType(mb,q,j))== TYPE_void && getHeadType(getArgType(mb,q,j))== TYPE_oid) ) goto nochange; setFunctionId(q,joinPathRef); getInstrPtr(mb,i)=q; freeInstruction(p); p=q; actions++; } } /* remember its latest use for(j=p->retc; j<p->argc; j++) used[getArg(p,j)]= i; */ } return actions;}#line 144 "/export/scratch0/monet/monet.GNU.64.64.d.14791/MonetDB5/src/optimizer/opt_joinpath.mx"#line 141 "/export/scratch0/monet/monet.GNU.64.64.d.14791/MonetDB5/src/optimizer/opt_joinpath.mx"/* #define _DEBUG_OPTIMIZER_*/str OPTjoinPath(MalBlkPtr mb, MalStkPtr stk, InstrPtr p){ str modnme; str fcnnme; Module scope=NULL; Symbol s= NULL; lng clk= GDKusec(); int actions = 0; optimizerInit(); if( p ) removeInstruction(mb, p);#ifdef _DEBUG_OPTIMIZER_ stream_printf(GDKout,"apply joinPath\n"); printFunction(GDKout,mb,LIST_MAL_ALL);#endif if( p && p->argc > 1 && getFunctionId(p) != multiplexRef){#ifdef _DEBUG_OPTIMIZER_ stream_printf(GDKout,"locate function joinPath\n");#endif if( getArgType(mb,p,1) != TYPE_str || getArgType(mb,p,2) != TYPE_str || !isConstant(mb,getArg(p,1)) || !isConstant(mb,getArg(p,2)) ) { char buf[1024]; snprintf(buf,1024, "Optimizer requires constant string arguments\n"); throw(MAL, "optimizer.joinPath",buf); } if( stk != 0){ modnme= (str)getArgValue(stk,p,1); fcnnme= (str)getArgValue(stk,p,2); } else { modnme= getArgDefault(mb,p,1); fcnnme= getArgDefault(mb,p,2); } scope = findModule(MCgetClient()->nspace,putName(modnme,strlen(modnme)) ); if( scope) s= findSymbolInModule(scope,putName(fcnnme,strlen(fcnnme))); if( s == NULL) { char buf[1024]; snprintf(buf,1024, "Could not find %s.%s\n",modnme,fcnnme); throw(MAL, "optimizer.joinPath",buf); }#ifdef _DEBUG_OPTIMIZER_ stream_printf(GDKout,"joinPath %s %d\n",modnme,fcnnme);#endif mb = s->def; stk= 0; } if( mb->errors ) return MAL_SUCCEED; addtoMalBlkHistory(mb); actions= OPTjoinPathImplementation(mb,stk,p);#ifdef _DEBUG_OPTIMIZER_ stream_printf(GDKout,"finished joinPath %d\n",actions); printFunction(GDKout,mb,LIST_MAL_ALL);#endif optimizerCheck(mb, "optimizer.joinPath", actions, GDKusec() - clk,OPT_CHECK_ALL); return MAL_SUCCEED;}#line 144 "/export/scratch0/monet/monet.GNU.64.64.d.14791/MonetDB5/src/optimizer/opt_joinpath.mx"#line 153 "/export/scratch0/monet/monet.GNU.64.64.d.14791/MonetDB5/src/optimizer/opt_joinpath.mx"size_tALGjoinCost(BAT *l, BAT *r){ size_t lc, rc; lc = BATcount(l); rc = BATcount(r); if( l->ttype== TYPE_oid || r->htype== TYPE_oid ) return MIN(lc,rc); return lc * rc;}#line 169 "/export/scratch0/monet/monet.GNU.64.64.d.14791/MonetDB5/src/optimizer/opt_joinpath.mx"strALGjoinPath(MalBlkPtr mb, MalStkPtr stk, InstrPtr pci){ BAT *joins[MAXARG], *tmp[MAXARG], *b = 0; size_t estimate, e; int fnd, top, ttop, i, j, ret = 0, *bid; (void) mb; (void) ret; ttop= top = 0;#ifdef DEBUG_OPT_JOINPATH printInstruction(GDKout,mb,pci,LIST_MAL_ALL);#endif for (i = pci->retc; i < pci->argc; i++) { bid = (int *) getArgReference(stk, pci, i);#ifdef DEBUG_OPT_JOINPATH printf("bid %d\n", *bid);#endif if ((b = BATdescriptor(*bid)) == NULL) { for( --top; top>=0; top--) BBPreleaseref(joins[top]->batCacheid); throw(MAL, "algebra.joinPath", "Cannot access descriptor"); } joins[top++] = b; } /* solve the join by pairing the smallest first */ while (top > 2) { j = 0; estimate = ALGjoinCost(joins[0],joins[1]);#ifdef DEBUG_OPT_JOINPATH printf("estimate join(%d,%d) %d\n", joins[0]->batCacheid, joins[1]->batCacheid,(int)estimate);#endif for (i = 1; i < top - 1; i++) { e = ALGjoinCost(joins[i], joins[i + 1]);#ifdef DEBUG_OPT_JOINPATH printf("estimate join(%d,%d) %d\n", joins[i]->batCacheid, joins[i+1]->batCacheid,(int)e);#endif if (e < estimate) { estimate = e; j = i; } }#line 218 "/export/scratch0/monet/monet.GNU.64.64.d.14791/MonetDB5/src/optimizer/opt_joinpath.mx" b = BATjoin(joins[j], joins[j + 1], oid_nil);#ifdef DEBUG_OPT_JOINPATH printf("%d:= join(%d,%d)\n", b->batCacheid, joins[j]->batCacheid, joins[j + 1]->batCacheid);#endif assert(b);#line 239 "/export/scratch0/monet/monet.GNU.64.64.d.14791/MonetDB5/src/optimizer/opt_joinpath.mx" #line 228 "/export/scratch0/monet/monet.GNU.64.64.d.14791/MonetDB5/src/optimizer/opt_joinpath.mx" fnd=0; for(i=0; i< ttop; i++) if(tmp[i] && tmp[i] == joins[j]){ /* stream_printf(GDKout,"release %s\n",BBP_logical(tmp[i]->batCacheid));*/ BBPdecref(tmp[i]->batCacheid, FALSE); tmp[i]=0; fnd++; } if( fnd == 0) BBPreleaseref(joins[j]->batCacheid);#line 239 "/export/scratch0/monet/monet.GNU.64.64.d.14791/MonetDB5/src/optimizer/opt_joinpath.mx" #line 228 "/export/scratch0/monet/monet.GNU.64.64.d.14791/MonetDB5/src/optimizer/opt_joinpath.mx" fnd=0; for(i=0; i< ttop; i++) if(tmp[i] && tmp[i] == joins[j+1]){ /* stream_printf(GDKout,"release %s\n",BBP_logical(tmp[i]->batCacheid));*/ BBPdecref(tmp[i]->batCacheid, FALSE); tmp[i]=0; fnd++; } if( fnd == 0) BBPreleaseref(joins[j+1]->batCacheid);#line 240 "/export/scratch0/monet/monet.GNU.64.64.d.14791/MonetDB5/src/optimizer/opt_joinpath.mx" joins[j] = b; tmp[ttop++]= b; top--; for (i = j + 1; i < top; i++) joins[i] = joins[i + 1]; }#ifdef DEBUG_OPT_JOINPATH printf("final join %d and %d\n", joins[0]->batCacheid, joins[1]->batCacheid);#endif b = BATjoin(joins[0], joins[1], oid_nil); #line 228 "/export/scratch0/monet/monet.GNU.64.64.d.14791/MonetDB5/src/optimizer/opt_joinpath.mx" fnd=0; for(i=0; i< ttop; i++) if(tmp[i] && tmp[i] == joins[0]){ /* stream_printf(GDKout,"release %s\n",BBP_logical(tmp[i]->batCacheid));*/ BBPdecref(tmp[i]->batCacheid, FALSE); tmp[i]=0; fnd++; } if( fnd == 0) BBPreleaseref(joins[0]->batCacheid);#line 251 "/export/scratch0/monet/monet.GNU.64.64.d.14791/MonetDB5/src/optimizer/opt_joinpath.mx" #line 228 "/export/scratch0/monet/monet.GNU.64.64.d.14791/MonetDB5/src/optimizer/opt_joinpath.mx" fnd=0; for(i=0; i< ttop; i++) if(tmp[i] && tmp[i] == joins[1]){ /* stream_printf(GDKout,"release %s\n",BBP_logical(tmp[i]->batCacheid));*/ BBPdecref(tmp[i]->batCacheid, FALSE); tmp[i]=0; fnd++; } if( fnd == 0) BBPreleaseref(joins[1]->batCacheid);#line 252 "/export/scratch0/monet/monet.GNU.64.64.d.14791/MonetDB5/src/optimizer/opt_joinpath.mx" assert(b); BBPkeepref(b->batCacheid); *(int *) getArgReference(stk, pci, 0) = b->batCacheid; return MAL_SUCCEED;}#line 260 "/export/scratch0/monet/monet.GNU.64.64.d.14791/MonetDB5/src/optimizer/opt_joinpath.mx"
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -