Changeset: 123fa0b0a7b0 for MonetDB
URL: http://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=123fa0b0a7b0
Modified Files:
monetdb5/modules/mal/manifold.c
Branch: default
Log Message:
manifold should also work on external/varsized types
diffs (152 lines):
diff --git a/monetdb5/modules/mal/manifold.c b/monetdb5/modules/mal/manifold.c
--- a/monetdb5/modules/mal/manifold.c
+++ b/monetdb5/modules/mal/manifold.c
@@ -30,12 +30,15 @@
/* The default iterator over known scalar commands.
* It can be less efficient then the vector based implementations,
* but saves quite some hacking in non-essential cases or
- * expensive user defined functions..
+ * expensive user defined functions.
*
* To keep things simple and reasonably performant we limit the
* implementation to those cases where a single BAT is returned.
* Arguments may be of any type. The MAL signature should be a COMMAND.
*
+ * The functionality has been extended to also perform the manifold
+ * over aligned BATs, provided the underlying scalar function carries
+ * the 'manifold' property.
*/
typedef struct{
@@ -69,10 +72,10 @@ typedef struct{
if (msg) \
break; \
for( i = mut->fvar; i<= mut->lvar; i++) { \
- if( ATOMstorage(mut->args[i].type) != TYPE_str){ \
- args[i] += mut->args[i].size; \
- } else { \
- mut->args[i].o++; \
+ if(!ATOMvarsized(mut->args[i].type)){ \
+ args[i] += mut->args[i].size; \
+ } else { \
+ mut->args[i].o++; \
mut->args[i].s = (str *)
BUNtail(mut->args[i].bi, mut->args[i].o); \
args[i] = (void*) &mut->args[i].s; \
} \
@@ -92,13 +95,14 @@ case TYPE_oid: ManifoldLoop(oid,__VA_ARG
case TYPE_flt: ManifoldLoop(flt,__VA_ARGS__); break;\
case TYPE_dbl: ManifoldLoop(dbl,__VA_ARGS__); break;\
case TYPE_str: \
+default:\
for( ; p< q ; p += mut->args[mut->fvar].size){ \
msg = (*mut->pci->fcn)(&y, __VA_ARGS__); \
if (msg) \
break; \
bunfastapp(mut->args[0].b, (void*) y); \
for( i = mut->fvar; i<= mut->lvar; i++) { \
- if( ATOMstorage(mut->args[i].type) != TYPE_str){\
+ if(!ATOMvarsized(mut->args[i].type)){ \
args[i] += mut->args[i].size; \
} else { \
mut->args[i].o++; \
@@ -107,9 +111,6 @@ case TYPE_str: \
} \
} \
} \
- break; \
-default: \
- msg= createException(MAL,"mal.manifold","manifold call limitation
(unknown type?) ");\
}
// single argument is preparatory step for GDK_mapreduce
@@ -127,16 +128,18 @@ MANIFOLDjob(MULTItask *mut)
throw(MAL,"mal.manifold",MAL_MALLOC_FAIL);
// the mod.fcn arguments are ignored from the call
- for( i = mut->pci->retc+2; i< mut->pci->argc; i++)
- if ( mut->args[i].b ){
- if ( ATOMstorage(mut->args[i].type) != TYPE_str)
- args[i] = (char*) mut->args[i].first;
- else {
- mut->args[i].s = (str*) BUNtail(mut->args[i].bi,
mut->args[i].o);
- args[i] = (void*) & mut->args[i].s;
+ for( i = mut->pci->retc+2; i< mut->pci->argc; i++) {
+ if ( mut->args[i].b ){
+ if (!ATOMvarsized(mut->args[i].type)) {
+ args[i] = (char*) mut->args[i].first;
+ } else {
+ mut->args[i].s = (str*)
BUNtail(mut->args[i].bi, mut->args[i].o);
+ args[i] = (void*) & mut->args[i].s;
+ }
+ } else {
+ args[i] = (char*) getArgReference(mut->stk,mut->pci,i);
}
- } else
- args[i] = (char*) getArgReference(mut->stk,mut->pci,i);
+ }
#ifdef _DEBUG_MANIFOLD_
mnstr_printf(mut->cntxt->fdout,"#MANIFOLDjob fvar %d lvar %d type
%d\n",mut->fvar,mut->lvar, ATOMstorage(mut->args[mut->fvar].b->ttype));
@@ -168,29 +171,27 @@ MANIFOLDtypecheck(Client cntxt, MalBlkPt
MalBlkPtr nmb;
MALfcn fcn;
- if ( pci->argc > 8 || getModuleId(pci) == NULL) // limitation on
MANIFOLDjob
+ if (pci->retc >1 || pci->argc > 8 || getModuleId(pci) == NULL) //
limitation on MANIFOLDjob
return NULL;
// We need a private MAL context to resolve the function call
nmb = newMalBlk(MAXVARS, STMT_INCREMENT);
if( nmb == NULL)
return NULL;
+ // the scalar function
q = newStmt(nmb,
getVarConstant(mb,getArg(pci,pci->retc)).val.sval,
getVarConstant(mb,getArg(pci,pci->retc+1)).val.sval);
// Prepare the single result variable
tpe =getColumnType(getArgType(mb,pci,0));
- k= getArg(q,0) = newTmpVariable(nmb, tpe);
+ k= getArg(q,0);
+ setVarType(nmb,k,tpe);
setVarFixed(nmb,k);
setVarUDFtype(nmb,k);
- // extract their argument type
+ // extract their scalar argument type
for ( i = pci->retc+2; i < pci->argc; i++){
tpe = getColumnType(getArgType(mb,pci,i));
- if (ATOMstorage(tpe) > TYPE_str){
- freeMalBlk(nmb);
- return NULL;
- }
q= pushArgument(nmb,q, k= newTmpVariable(nmb, tpe));
setVarFixed(nmb,k);
setVarUDFtype(nmb,k);
@@ -201,7 +202,7 @@ MANIFOLDtypecheck(Client cntxt, MalBlkPt
printInstruction(cntxt->fdout,mb,0,pci,LIST_MAL_ALL);
printInstruction(cntxt->fdout,nmb,0,q,LIST_MAL_ALL);
#endif
- // Localize the underlying opertor
+ // Localize the underlying scalar operator
typeChecker(cntxt->fdout, cntxt->nspace, nmb, q, TRUE);
if (nmb->errors || q->fcn == NULL || q->token != CMDcall ||
varGetProp( q->blk, getArg(getInstrPtr(q->blk,0), 0),
PropertyIndex("unsafe") ) != NULL)
@@ -216,6 +217,9 @@ MANIFOLDtypecheck(Client cntxt, MalBlkPt
return fcn;
}
+/*
+ * The manifold should support aligned BATs as well
+ */
str
MANIFOLDevaluate(Client cntxt, MalBlkPtr mb, MalStkPtr stk, InstrPtr pci){
MULTItask mut;
@@ -303,7 +307,7 @@ MANIFOLDevaluate(Client cntxt, MalBlkPtr
freeInstruction(mut.pci);
// consolidate the properties
- if (ATOMstorage(mat[0].b->ttype) != TYPE_str)
+ if (!ATOMvarsized(mat[0].b->ttype))
BATsetcount(mat[0].b,cnt);
BATsettrivprop(mat[0].b);
BATderiveProps(mat[0].b, TRUE);
_______________________________________________
checkin-list mailing list
[email protected]
https://www.monetdb.org/mailman/listinfo/checkin-list