Changeset: 02f4f5e603dd for MonetDB URL: http://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=02f4f5e603dd Modified Files: gdk/gdk_arrays.c gdk/gdk_arrays.h monetdb5/modules/kernel/arrays.c monetdb5/modules/kernel/arrays.h Branch: arrays Log Message:
changing code to use new structures diffs (truncated from 655 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 @@ -44,13 +44,12 @@ createAnalyticDim(dbl); createAnalyticDim(flt); #define createDim(TPE) \ -gdk_dimension* createDimension_##TPE(unsigned int elsNum_initial, TPE min, TPE max, TPE step) { \ +gdk_dimension* createDimension_##TPE(TPE min, TPE max, TPE step) { \ gdk_dimension *dim = GDKmalloc(sizeof(gdk_dimension)); \ dim->elsNum = floor((max - min )/ step)+1; \ dim->min = 0; \ dim->max = dim->elsNum; \ dim->step = 1; \ - dim->elsNum_initial = elsNum_initial; \ return dim; \ } @@ -66,13 +65,28 @@ createDim(flt); gdk_array* arrayNew(unsigned short dimsNum) { gdk_array *array = (gdk_array*)GDKmalloc(sizeof(gdk_array)); + if(!array) + return NULL; array->dimsNum = dimsNum; array->dims = (gdk_dimension**)GDKmalloc(sizeof(gdk_dimension*)*dimsNum); + if(!array->dims) + return NULL; return array; } +gdk_array* arrayCopy(gdk_array *array) { + unsigned short i; + gdk_array *array_copy = arrayNew(array->dimsNum); + if(!array_copy) + return NULL; + for(i=0; i<array_copy->dimsNum; i++) + array_copy[i] = array[i]; + + return array_copy; +} + gdk_return arrayDelete(gdk_array *array) { - int i=0; + unsigned short i=0; for(i=0; i<array->dimsNum; i++) GDKfree(array->dims[i]); GDKfree(array->dims); diff --git a/gdk/gdk_arrays.h b/gdk/gdk_arrays.h --- a/gdk/gdk_arrays.h +++ b/gdk/gdk_arrays.h @@ -32,7 +32,6 @@ typedef struct dimensionStruct { unsigned int max; unsigned int step; //initialy this is set to 1 unsigned int elsNum; - unsigned int elsNum_initial; } gdk_dimension; typedef struct arrayStruct { @@ -49,14 +48,14 @@ typedef enum errors { gdk_return gdk_error_msg(errors errorCode, const char* funcName, const char *msg); -gdk_export gdk_dimension* createDimension_bte(unsigned int elsNum_initial, bte min, bte max, bte step); -gdk_export gdk_dimension* createDimension_sht(unsigned int elsNum_initial, sht min, sht max, sht step); -gdk_export gdk_dimension* createDimension_int(unsigned int elsNum_initial, int min, int max, int step); -gdk_export gdk_dimension* createDimension_wrd(unsigned int elsNum_initial, wrd min, wrd max, wrd step); -gdk_export gdk_dimension* createDimension_oid(unsigned int elsNum_initial, oid min, oid max, oid step); -gdk_export gdk_dimension* createDimension_lng(unsigned int elsNum_initial, lng min, lng max, lng step); -gdk_export gdk_dimension* createDimension_dbl(unsigned int elsNum_initial, dbl min, dbl max, dbl step); -gdk_export gdk_dimension* createDimension_flt(unsigned int elsNum_initial, flt min, flt max, flt step); +gdk_export gdk_dimension* createDimension_bte(bte min, bte max, bte step); +gdk_export gdk_dimension* createDimension_sht(sht min, sht max, sht step); +gdk_export gdk_dimension* createDimension_int(int min, int max, int step); +gdk_export gdk_dimension* createDimension_wrd(wrd min, wrd max, wrd step); +gdk_export gdk_dimension* createDimension_oid(oid min, oid max, oid step); +gdk_export gdk_dimension* createDimension_lng(lng min, lng max, lng step); +gdk_export gdk_dimension* createDimension_dbl(dbl min, dbl max, dbl step); +gdk_export gdk_dimension* createDimension_flt(flt min, flt max, flt step); gdk_export gdk_analytic_dimension* createAnalyticDimension_bte(unsigned short dimNum, bte min, bte max, bte step); gdk_export gdk_analytic_dimension* createAnalyticDimension_sht(unsigned short dimNum, sht min, sht max, sht step); @@ -70,53 +69,12 @@ gdk_export gdk_analytic_dimension* creat gdk_export gdk_array* arrayNew(unsigned short dimsNum); gdk_export gdk_return arrayDelete(gdk_array *array); gdk_export gdk_return analyticDimensionDelete(gdk_analytic_dimension *dim); +gdk_export gdk_array* arrayCopy(gdk_array* array); -#if 0 -gdk_cells* cells_new(void); -gdk_cells* cells_add_dimension(gdk_cells* cells, gdk_dimension *dim); -gdk_cells* cells_remove_dimension(gdk_cells* cells, int dimNum); -gdk_cells* cells_replace_dimension(gdk_cells* cells, gdk_dimension* dim); -gdk_export gdk_return freeDimension(gdk_dimension *dim); -gdk_export gdk_return freeCells(gdk_cells *cells); -#endif -#if 0 -#define dimensionElsNum(dim) \ -({ \ - BUN els = 0; \ - switch(dim->type.type->localtype) { \ - case TYPE_bte: \ - els = floor((dim->max->data.val.btval - dim->min->data.val.btval )/ dim->step->data.val.btval)+1; \ - break; \ - case TYPE_sht: \ - els = floor((dim->max->data.val.shval - dim->min->data.val.shval )/ dim->step->data.val.shval)+1; \ - break; \ - case TYPE_int: \ - els = floor((dim->max->data.val.ival - dim->min->data.val.ival )/ dim->step->data.val.ival)+1; \ - break; \ - case TYPE_wrd: \ - els = floor((dim->max->data.val.wval - dim->min->data.val.wval )/ dim->step->data.val.wval)+1; \ - break; \ - case TYPE_oid: \ - els = floor((dim->max->data.val.oval - dim->min->data.val.oval )/ dim->step->data.val.oval)+1; \ - break; \ - case TYPE_lng: \ - els = floor((dim->max->data.val.lval - dim->min->data.val.lval )/ dim->step->data.val.lval)+1; \ - break; \ - case TYPE_dbl: \ - els = floor((dim->max->data.val.dval - dim->min->data.val.dval )/ dim->step->data.val.dval)+1; \ - break; \ - case TYPE_flt: \ - els = floor((dim->max->data.val.fval - dim->min->data.val.fval )/ dim->step->data.val.fval)+1; \ - break; \ - } \ - els; \ -}) -#endif - -#if 0 /*find the position in the dimension indices (no repetitions) of the given value*/ #define dimensionFndValuePos(value, min, step) fmod((value-min), step)? BUN_NONE : (BUN)(value-min)/step + /*find the position in the dimension indices (no repetitions) of the given value * or the position of the index that is closest to the given value and greater than it*/ #define dimensionFndGreaterValuePos(value, min, step, eq) \ @@ -148,7 +106,6 @@ gdk_export gdk_return freeCells(gdk_cell }) - #define equalIdx(dim, value) \ ({\ BUN idx = 0; \ @@ -248,6 +205,56 @@ gdk_export gdk_return freeCells(gdk_cell + + + +#if 0 +gdk_cells* cells_new(void); +gdk_cells* cells_add_dimension(gdk_cells* cells, gdk_dimension *dim); +gdk_cells* cells_remove_dimension(gdk_cells* cells, int dimNum); +gdk_cells* cells_replace_dimension(gdk_cells* cells, gdk_dimension* dim); +gdk_export gdk_return freeDimension(gdk_dimension *dim); +gdk_export gdk_return freeCells(gdk_cells *cells); +#endif + + + + +#if 0 +#define dimensionElsNum(dim) \ +({ \ + BUN els = 0; \ + switch(dim->type.type->localtype) { \ + case TYPE_bte: \ + els = floor((dim->max->data.val.btval - dim->min->data.val.btval )/ dim->step->data.val.btval)+1; \ + break; \ + case TYPE_sht: \ + els = floor((dim->max->data.val.shval - dim->min->data.val.shval )/ dim->step->data.val.shval)+1; \ + break; \ + case TYPE_int: \ + els = floor((dim->max->data.val.ival - dim->min->data.val.ival )/ dim->step->data.val.ival)+1; \ + break; \ + case TYPE_wrd: \ + els = floor((dim->max->data.val.wval - dim->min->data.val.wval )/ dim->step->data.val.wval)+1; \ + break; \ + case TYPE_oid: \ + els = floor((dim->max->data.val.oval - dim->min->data.val.oval )/ dim->step->data.val.oval)+1; \ + break; \ + case TYPE_lng: \ + els = floor((dim->max->data.val.lval - dim->min->data.val.lval )/ dim->step->data.val.lval)+1; \ + break; \ + case TYPE_dbl: \ + els = floor((dim->max->data.val.dval - dim->min->data.val.dval )/ dim->step->data.val.dval)+1; \ + break; \ + case TYPE_flt: \ + els = floor((dim->max->data.val.fval - dim->min->data.val.fval )/ dim->step->data.val.fval)+1; \ + break; \ + } \ + els; \ +}) +#endif + +#if 0 #define dimensionCharacteristics(TPE, dimensionBAT, min, max, step, elementRepeats, groupRepeats) \ do {\ TPE *vls; \ diff --git a/monetdb5/modules/kernel/arrays.c b/monetdb5/modules/kernel/arrays.c --- a/monetdb5/modules/kernel/arrays.c +++ b/monetdb5/modules/kernel/arrays.c @@ -4,11 +4,12 @@ #include <gdk_arrays.h> -static int jumpSize(gdk_array *array, int dimNum) { - int i=0; - BUN skip = 1; +/*UPDATED*/ +static unsigned int jumpSize(gdk_array *array, unsigned int dimNum) { + unsigned short i=0; + unsigned int skip = 1; for(i=0; i<dimNum; i++) - skip *= array->dimSizes[i]; + skip *= array->dims[i]->elsNum; return skip; } @@ -16,13 +17,6 @@ static int arrayCellsNum(gdk_array *arra return jumpSize(array, array->dimsNum); } -static gdk_dimension* getDimension(gdk_cells *dims, int dimNum) { - dim_node *n; - - for(n=dims->h; n && n->data->dimNum<dimNum; n=n->next); - return n->data; -} - static BUN oidToIdx(oid oidVal, int dimNum, int currentDimNum, BUN skipCells, gdk_array *dims) { BUN oid = 0; @@ -93,7 +87,7 @@ static str readCands(gdk_array** dimCand } if(dimCands) //there are candidates exressed as dimensions - dimCands_in = (gdk_array*)*dimsCand; + dimCands_in = (gdk_array*)*dimCands; //if there are no candidates then everything is a candidate if(!dimCands && !oidCands) { @@ -112,7 +106,9 @@ static str readCands(gdk_array** dimCand return MAL_SUCCEED; } -static str emptyCandidateResults(ptr *candsRes_dims, bat* candsRes_bid) { +/*UPDATED*/ +/*Empty candidate results are distingueshed from first time results by setting the dimCands to NULL and the oidCands to empty */ +static str emptyCandidateResults(ptr *dimCandsRes, bat* oidCandsRes) { BAT *candidatesBAT = NULL; if((candidatesBAT = BATnew(TYPE_void, TYPE_oid, 0, TRANSIENT)) == NULL) @@ -121,31 +117,26 @@ static str emptyCandidateResults(ptr *ca BATseqbase(candidatesBAT, 0); BATderiveProps(candidatesBAT, FALSE); - BBPkeepref(*candsRes_bid = candidatesBAT->batCacheid); - *candsRes_dims = NULL; + BBPkeepref(*oidCandsRes = candidatesBAT->batCacheid); + *dimCandsRes = NULL; return MAL_SUCCEED; } -static bool overlapingRanges(gdk_dimension *dim1, gdk_dimension *dim2) { - if(*(oid*)dim1->max < *(oid*)dim2->min || *(oid*)dim2->max < *(oid*)dim1->min) { - //disjoint ranges. empty result - return 0; - } - return 1; -} +/*UPDATED*/ +static gdk_dimension* updateCandidateDimensionRange(gdk_dimension *dim, unsigned int min, unsigned int max) { + if(dim->max < min || dim->min > max) //non-overlaping ranges + return NULL; -static gdk_dimension* mergeCandidateDimensions(gdk_dimension *dim1, gdk_dimension *dim2) { - oid min, max, step; + /*the biggest of the mins and the smallest of the maximums */ + dim->min = dim->min > min ? dim->min : min; + dim->max = dim->max < max ? dim->max : max; + +//TODO: Take care of cases were a dimension has step <>1 as a result of multiple selections on it - /*the biggest of the mins and the smallest of the maximums */ - min = *(oid*)dim1->min > *(oid*)dim2->min ? *(oid*)dim1->min : *(oid*)dim2->min; - max = *(oid*)dim1->max < *(oid*)dim2->max ? *(oid*)dim1->max : *(oid*)dim2->max; - step = *(oid*)dim1->step ; //step is always 1 - //the dimensions that are merged should have the same order //they also have the same number of initial elements because they came from the same dimension - return createDimension_oid(dim1->dimNum, dim1->initialElementsNum, min, max, step); + return dim; } _______________________________________________ checkin-list mailing list checkin-list@monetdb.org https://www.monetdb.org/mailman/listinfo/checkin-list