Changeset: 13a4aa14fd87 for MonetDB URL: http://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=13a4aa14fd87 Modified Files: gdk/gdk_arrays.c monetdb5/modules/mal/calc_arrays.c monetdb5/modules/mal/calc_arrays.h monetdb5/modules/mal/calc_arrays.mal sql/backends/monet5/sql_gencode.c Branch: arrays Log Message:
calc.* and convert dimensions from one type to another diffs (truncated from 2410 to 300 lines): diff --git a/gdk/gdk_arrays.c b/gdk/gdk_arrays.c --- a/gdk/gdk_arrays.c +++ b/gdk/gdk_arrays.c @@ -1881,5 +1881,3 @@ gdk_array *cellsToArray(gdk_cells *cells return array; } #endif - - diff --git a/monetdb5/modules/mal/calc_arrays.c b/monetdb5/modules/mal/calc_arrays.c --- a/monetdb5/modules/mal/calc_arrays.c +++ b/monetdb5/modules/mal/calc_arrays.c @@ -7,76 +7,2253 @@ #include "calc_arrays.h" -str CMDdimensionCONVERT(Client cntxt, MalBlkPtr mb, MalStkPtr stk, InstrPtr pci) { - char buf[20]; - ptr *dimConverted = getArgReference_ptr(stk, pci, 0); - ptr *array_out = getArgReference_ptr(stk, pci, 1); - ptr *dimOriginal = getArgReference_ptr(stk, pci, 2); - ptr *array_in = getArgReference_ptr(stk, pci, 3); +static BAT* dimension2BAT(const gdk_analytic_dimension *dim) { + BAT *dimBAT = BATnew(TYPE_void, dim->type, 3, TRANSIENT); - gdk_analytic_dimension *dim_out = NULL; - gdk_analytic_dimension *dim_in = (gdk_analytic_dimension*)*dimOriginal; + if(!dimBAT) + return NULL; - //the array is not affected by the convertion - //I just need to pass it along - *array_out = *array_in; + BUNappend(dimBAT, dim->min, TRUE); + BUNappend(dimBAT, dim->max, TRUE); + BUNappend(dimBAT, dim->step, TRUE); - (void) cntxt; - (void) mb; + return dimBAT; +} +static gdk_analytic_dimension* BAT2dimension(BAT *dimBAT, int dimNum) { + BATiter biter = bat_iterator(dimBAT); + BUN currBun = BUNfirst(dimBAT); + switch(BATttype(dimBAT)) { + case TYPE_bte: { + bte min = *(bte*)BUNtail(biter, currBun); + bte max = *(bte*)BUNtail(biter, currBun+1); + bte step = *(bte*)BUNtail(biter, currBun+2); + return createAnalyticDimension_bte(dimNum, min, max, step); + } + case TYPE_sht: { + short min = *(short*)BUNtail(biter, currBun); + short max = *(short*)BUNtail(biter, currBun+1); + short step = *(short*)BUNtail(biter, currBun+2); + return createAnalyticDimension_sht(dimNum, min, max, step); + } + case TYPE_int: { + int min = *(int*)BUNtail(biter, currBun); + int max = *(int*)BUNtail(biter, currBun+1); + int step = *(int*)BUNtail(biter, currBun+2); + return createAnalyticDimension_int(dimNum, min, max, step); + } + case TYPE_wrd: { + wrd min = *(wrd*)BUNtail(biter, currBun); + wrd max = *(wrd*)BUNtail(biter, currBun+1); + wrd step = *(wrd*)BUNtail(biter, currBun+2); + return createAnalyticDimension_wrd(dimNum, min, max, step); + } + case TYPE_oid: { + oid min = *(oid*)BUNtail(biter, currBun); + oid max = *(oid*)BUNtail(biter, currBun+1); + oid step = *(oid*)BUNtail(biter, currBun+2); + return createAnalyticDimension_oid(dimNum, min, max, step); + } + case TYPE_lng: { + long min = *(long*)BUNtail(biter, currBun); + long max = *(long*)BUNtail(biter, currBun+1); + long step = *(long*)BUNtail(biter, currBun+2); + return createAnalyticDimension_lng(dimNum, min, max, step); + } + case TYPE_dbl: { + double min = *(double*)BUNtail(biter, currBun); + double max = *(double*)BUNtail(biter, currBun+1); + double step = *(double*)BUNtail(biter, currBun+2); + return createAnalyticDimension_dbl(dimNum, min, max, step); + } + case TYPE_flt: { + float min = *(float*)BUNtail(biter, currBun); + float max = *(float*)BUNtail(biter, currBun+1); + float step = *(float*)BUNtail(biter, currBun+2); + return createAnalyticDimension_flt(dimNum, min, max, step); + } + default: + return NULL; + } +} - (void)*buf; - (void)*dim_in; - (void)*dim_out; - /* - if (VARconvert(&stk->stk[getArg(pci, 0)], &stk->stk[getArg(pci, 1)], 1) != GDK_SUCCEED) { - snprintf(buf, sizeof(buf), "%s.%s", pci->modname, pci->fcnname); - return mythrow(MAL, buf, OPERATION_FAILED); - }*/ +static str CMDdimensionCONVERT(gdk_analytic_dimension **dimRes, const gdk_analytic_dimension *dim, int type) { + int abort_on_error = 1; + BAT *dimBAT_in, *dimBAT_out, *s = NULL; + gdk_analytic_dimension *dim_out; - *dimConverted = dim_out; + /* create a BAT and put inside the values of the dimensions */ + /* needed to re-use functions that exist already */ + if(!(dimBAT_in = dimension2BAT(dim))) + throw(MAL, "batcalc.convert", MAL_MALLOC_FAIL); + + if(!(dimBAT_out = BATconvert(dimBAT_in, s, type, abort_on_error))) { + char buf[20]; + snprintf(buf, sizeof(buf), "batcalc.%s", ATOMname(type)); + + BBPunfix(dimBAT_in->batCacheid); + return createException(MAL, buf, OPERATION_FAILED); + } + + BBPunfix(dimBAT_in->batCacheid); + + /*put the converted values from the BAT to the dim */ + if(!(dim_out = BAT2dimension(dimBAT_out, dim->dimNum))) { + char buf[20]; + snprintf(buf, sizeof(buf), "batcalc.%s", ATOMname(type)); + + BBPunfix(dimBAT_out->batCacheid); + return createException(MAL, buf, "Type not handled"); + } + + *dimRes = dim_out; + + BBPunfix(dimBAT_out->batCacheid); return MAL_SUCCEED; } +/* +str CMDdimensionCONVERT_void(ptr *dimRes, ptr *dimsRes, const ptr *dim, const ptr *dims) { + //the array is not affected by the convertion + //I just need to pass it along + gdk_array *array = arrayCopy((gdk_array*)*dims) ; + *dimsRes = array; + + return CMDdimensionCONVERT((gdk_analytic_dimension**)dimRes, (gdk_analytic_dimension*)*dim, TYPE_void); +} + +str CMDdimensionCONVERT_bit(ptr *dimRes, ptr *dimsRes, const ptr *dim, const ptr *dims) { + //the array is not affected by the convertion + //I just need to pass it along + gdk_array *array = arrayCopy((gdk_array*)*dims) ; + *dimsRes = array; + + return CMDdimensionCONVERT((gdk_analytic_dimension**)dimRes, (gdk_analytic_dimension*)*dim, TYPE_bit); +} +*/ + +str CMDdimensionCONVERT_bte(ptr *dimRes, ptr *dimsRes, const ptr *dim, const ptr *dims) { + //the array is not affected by the convertion + //I just need to pass it along + gdk_array *array = arrayCopy((gdk_array*)*dims) ; + *dimsRes = array; + + return CMDdimensionCONVERT((gdk_analytic_dimension**)dimRes, (gdk_analytic_dimension*)*dim, TYPE_bte); +} + +str CMDdimensionCONVERT_sht(ptr *dimRes, ptr *dimsRes, const ptr *dim, const ptr *dims) { + //the array is not affected by the convertion + //I just need to pass it along + gdk_array *array = arrayCopy((gdk_array*)*dims) ; + *dimsRes = array; + + return CMDdimensionCONVERT((gdk_analytic_dimension**)dimRes, (gdk_analytic_dimension*)*dim, TYPE_sht); +} + +str CMDdimensionCONVERT_int(ptr *dimRes, ptr *dimsRes, const ptr *dim, const ptr *dims) { + //the array is not affected by the convertion + //I just need to pass it along + gdk_array *array = arrayCopy((gdk_array*)*dims) ; + *dimsRes = array; + + return CMDdimensionCONVERT((gdk_analytic_dimension**)dimRes, (gdk_analytic_dimension*)*dim, TYPE_int); +} + +str CMDdimensionCONVERT_wrd(ptr *dimRes, ptr *dimsRes, const ptr *dim, const ptr *dims) { + //the array is not affected by the convertion + //I just need to pass it along + gdk_array *array = arrayCopy((gdk_array*)*dims) ; + *dimsRes = array; + + return CMDdimensionCONVERT((gdk_analytic_dimension**)dimRes, (gdk_analytic_dimension*)*dim, TYPE_wrd); +} + +str CMDdimensionCONVERT_lng(ptr *dimRes, ptr *dimsRes, const ptr *dim, const ptr *dims) { + //the array is not affected by the convertion + //I just need to pass it along + gdk_array *array = arrayCopy((gdk_array*)*dims) ; + *dimsRes = array; + + return CMDdimensionCONVERT((gdk_analytic_dimension**)dimRes, (gdk_analytic_dimension*)*dim, TYPE_lng); +} + +str CMDdimensionCONVERT_flt(ptr *dimRes, ptr *dimsRes, const ptr *dim, const ptr *dims) { + //the array is not affected by the convertion + //I just need to pass it along + gdk_array *array = arrayCopy((gdk_array*)*dims) ; + *dimsRes = array; + + return CMDdimensionCONVERT((gdk_analytic_dimension**)dimRes, (gdk_analytic_dimension*)*dim, TYPE_flt); +} + +str CMDdimensionCONVERT_dbl(ptr *dimRes, ptr *dimsRes, const ptr *dim, const ptr *dims) { + //the array is not affected by the convertion + //I just need to pass it along + gdk_array *array = arrayCopy((gdk_array*)*dims) ; + *dimsRes = array; + + return CMDdimensionCONVERT((gdk_analytic_dimension**)dimRes, (gdk_analytic_dimension*)*dim, TYPE_dbl); +} + +str CMDdimensionCONVERT_oid(ptr *dimRes, ptr *dimsRes, const ptr *dim, const ptr *dims) { + //the array is not affected by the convertion + //I just need to pass it along + gdk_array *array = arrayCopy((gdk_array*)*dims) ; + *dimsRes = array; + + return CMDdimensionCONVERT((gdk_analytic_dimension**)dimRes, (gdk_analytic_dimension*)*dim, TYPE_oid); +} + +/* +str CMDdimensionCONVERT_str(ptr *dimRes, ptr *dimsRes, const ptr *dim, const ptr *dims) { + //the array is not affected by the convertion + //I just need to pass it along + gdk_array *array = arrayCopy((gdk_array*)*dims) ; + *dimsRes = array; + + return CMDdimensionCONVERT((gdk_analytic_dimension**)dimRes, (gdk_analytic_dimension*)*dim, TYPE_str); +}*/ + str CMDdimensionMULsignal(Client cntxt, MalBlkPtr mb, MalStkPtr stk, InstrPtr pci) { ptr *dimConverted = getArgReference_ptr(stk, pci, 0); ptr *array_out = getArgReference_ptr(stk, pci, 1); - void *val = getArgReference(stk, pci, 2); + + void *valPtr = getArgReference(stk, pci, 2); + int valType = getArgType(mb, pci, 2); + ptr *dimOriginal = getArgReference_ptr(stk, pci, 3); ptr *array_in = getArgReference_ptr(stk, pci, 4); + + int *resType = getArgReference_int(stk, pci, 5); gdk_analytic_dimension *dim_out = NULL; gdk_analytic_dimension *dim_in = (gdk_analytic_dimension*)*dimOriginal; + int dimType = dim_in->type; //the array is not affected by the convertion //I just need to pass it along - *array_out = *array_in; + gdk_array *array = arrayCopy((gdk_array*)*array_in); + *array_out = array; (void) cntxt; - (void) mb; - (void)*(int*)val; - (void)*dim_in; - (void)*dim_out; + switch(valType) { + case TYPE_bte: { + bte val = *(bte*)valPtr; + + switch(dimType) { + case TYPE_bte: { + bte min = *(bte*)dim_in->min; + bte max = *(bte*)dim_in->max; + bte step = *(bte*)dim_in->step; -/* - if (VARcalcmul(&stk->stk[getArg(pci, 0)], &stk->stk[getArg(pci, 1)], &stk->stk[getArg(pci, 2)], 1) != GDK_SUCCEED) - return mythrow(MAL, "calc.*", OPERATION_FAILED); -*/ - + switch(*resType){ + case TYPE_bte: + dim_out =createAnalyticDimension_bte(dim_in->dimNum, min*val, max*val, step*val); + break; + case TYPE_sht: + dim_out =createAnalyticDimension_sht(dim_in->dimNum, min*val, max*val, step*val); + break; + case TYPE_int: _______________________________________________ checkin-list mailing list checkin-list@monetdb.org https://www.monetdb.org/mailman/listinfo/checkin-list