Changeset: befe0e6b8206 for MonetDB URL: http://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=befe0e6b8206 Modified Files: monetdb5/modules/mal/calc_arrays.c Branch: arrays Log Message:
calc.== diffs (94 lines): 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 @@ -2215,24 +2215,28 @@ str CMDdimensionMULsignal(Client cntxt, return MAL_SUCCEED; } -#define checkEqual(TPE1, dimLeft, TPE2, dimRight) \ +#define checkEqual(TPE1, dimLeft, TPE2, dimRight, vals) \ do { \ BUN i=0; \ TPE1 valLeft; \ TPE1 maxLeft = *(TPE1*)dimLeft->max; \ - TPE1 stepLeft = *(TPE1)dimLeft->step; \ + TPE1 stepLeft = *(TPE1*)dimLeft->step; \ TPE2 valRight; \ TPE2 maxRight = *(TPE2*)dimRight->max; \ - TPE2 stepRight = *(TPE2)dimRight->step; \ + TPE2 stepRight = *(TPE2*)dimRight->step; \ \ - for(valLeft = *(TPE1*)dimLeft->min ; valLeft<=maxLeft; valLeft += stepLeft) -} while(0); + for(valLeft = *(TPE1*)dimLeft->min ; valLeft<=maxLeft; valLeft += stepLeft) {\ + for(valRight = *(TPE2*)dimRight->min ; valRight<=maxRight; valRight += stepRight) {\ + vals[i] = (valLeft == valRight); \ + i++; \ + }\ + }\ +} while(0) str CMDdimensionEQ(ptr* dimsRes, bat* batRes, const ptr* dim1, const ptr* dims1, const ptr* dim2, const ptr* dims2) { gdk_analytic_dimension *dimLeft = (gdk_analytic_dimension*)*dim1; gdk_analytic_dimension *dimRight = (gdk_analytic_dimension*)*dim2; - - BUN i = 0; + /* create a BAT of size equal to dimLeft->elsNum * dimRight->elsNum * There is no need to add more detailed info no matter how many the @@ -2245,15 +2249,45 @@ str CMDdimensionEQ(ptr* dimsRes, bat* ba return createException(MAL, "calc.==", MAL_MALLOC_FAIL); vals = (bit*)Tloc(resBAT, BUNfirst(resBAT)); - for(i=0; i<elsNum; i++) { - - } - - (void)*dimsRes; - (void)*batRes; - (void)*dimLeft; - (void)*dims1; - (void)*dimRight; + if(dimLeft->type != dimRight->type) + return createException(MAL, "cal.==", "Dimensions of different type"); + + switch(dimRight->type) { + case TYPE_bte: + checkEqual(bte, dimLeft, bte, dimRight, vals); + break; + case TYPE_int: + checkEqual(int, dimLeft, int, dimRight, vals); + break; + case TYPE_wrd: + checkEqual(wrd, dimLeft, wrd, dimRight, vals); + break; + case TYPE_oid: + checkEqual(oid, dimLeft, oid, dimRight, vals); + break; + case TYPE_dbl: + checkEqual(double, dimLeft, double, dimRight, vals); + break; + case TYPE_lng: + checkEqual(long, dimLeft, long, dimRight, vals); + break; + case TYPE_flt: + checkEqual(float, dimLeft, float, dimRight, vals); + break; + default: + return createException(MAL, "calc.==", "Dimension type not recognised"); + } + + BATseqbase(resBAT, 0); + resBAT->tsorted = 0; + resBAT->trevsorted = 0; + resBAT->tkey = 0; + resBAT->tdense = 0; + BATsetcount(resBAT, elsNum); + + /*the array does not change */ + *dimsRes = arrayCopy((gdk_array*)*dims1); + BBPkeepref((*batRes = resBAT->batCacheid)); (void)*dims2; /* if (VARcalceq(&stk->stk[getArg(pci, 0)], &stk->stk[getArg(pci, 1)], &stk->stk[getArg(pci, 2)]) != GDK_SUCCEED) _______________________________________________ checkin-list mailing list checkin-list@monetdb.org https://www.monetdb.org/mailman/listinfo/checkin-list