⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 opt_joinpath.c

📁 一个内存数据库的源代码这是服务器端还有客户端
💻 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 + -