Changeset: 0bc550252609 for MonetDB URL: http://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=0bc550252609 Modified Files: gdk/gdk_arrays.c gdk/gdk_arrays.h monetdb5/modules/kernel/arrays.c monetdb5/modules/kernel/arrays.h monetdb5/modules/kernel/arrays.mal Branch: arrays Log Message:
added code for the group by on arrays. Actual implementation of functions is missing diffs (220 lines): diff --git a/gdk/gdk_arrays.c b/gdk/gdk_arrays.c --- a/gdk/gdk_arrays.c +++ b/gdk/gdk_arrays.c @@ -64,6 +64,25 @@ createDim(lng); createDim(dbl); createDim(flt); +#define createDimGroup(TPE) \ +gdk_dimension_group* createDimensionGroup_##TPE(TPE min, TPE max, TPE step) { \ + gdk_dimension_group *dim = (gdk_dimension_group*)GDKmalloc(sizeof(gdk_dimension_group)); \ + dim->min = 0; \ + dim->max = floor((max - min ) / step); \ + dim->step = 1; \ + dim->elsNum = dim->max +1; \ + return dim; \ +} + +createDimGroup(bte); +createDimGroup(sht); +createDimGroup(int); +createDimGroup(wrd); +createDimGroup(oid); +createDimGroup(lng); +createDimGroup(dbl); +createDimGroup(flt); + #define createGCD(TPE) \ TPE gcd_##TPE(TPE val1, TPE val2) { \ TPE res; \ @@ -96,6 +115,17 @@ gdk_array* arrayNew(unsigned short dimsN return array; } +gdk_array_groups* groupsNew(unsigned short dimsNum) { + gdk_array_groups *groups = (gdk_array_groups*)GDKmalloc(sizeof(gdk_array_groups)); + if(!groups) + return NULL; + groups->dimsNum = dimsNum; + groups->groups = (gdk_dimension_group**)GDKmalloc(sizeof(gdk_dimension_group*)*dimsNum); + if(!groups->groups) + return NULL; + return groups; +} + gdk_array* arrayCopy(gdk_array *array) { unsigned short i; gdk_array *array_copy = arrayNew(array->dimsNum); @@ -108,6 +138,19 @@ gdk_array* arrayCopy(gdk_array *array) { return array_copy; } +gdk_array_groups* array2groups(gdk_array* array) { + unsigned short i; + gdk_array_groups *groups = groupsNew(array->dimsNum); + if(!groups) + return NULL; + for(i=0; i<groups->dimsNum; i++) { + groups->groups[i] = createDimensionGroup_oid(array->dims[i]->min, array->dims[i]->max, array->dims[i]->step); + + } + + return groups; +} + gdk_return arrayDelete(gdk_array *array) { unsigned short i=0; for(i=0; i<array->dimsNum; i++) { @@ -121,6 +164,17 @@ gdk_return arrayDelete(gdk_array *array) return GDK_SUCCEED; } +gdk_return groupsDelete(gdk_array_groups *array) { + unsigned short i=0; + for(i=0; i<array->dimsNum; i++) { + GDKfree(array->groups[i]); + } + GDKfree(array->groups); + GDKfree(array); + + return GDK_SUCCEED; +} + gdk_return analyticDimensionDelete(gdk_analytic_dimension *dim) { GDKfree(dim->min); GDKfree(dim->max); diff --git a/gdk/gdk_arrays.h b/gdk/gdk_arrays.h --- a/gdk/gdk_arrays.h +++ b/gdk/gdk_arrays.h @@ -27,6 +27,19 @@ typedef struct arrayStruct { gdk_dimension **dims; //an array having the dimensions. The dimNum of each dimension is implicit, its position in the aray } gdk_array; +/* a group over a dimension is a range of cells around this dimensions, e.g. [-1:1:2] */ +typedef struct dimensionGroupStruct { + int min; + int max; + int step; + oid elsNum; +} gdk_dimension_group; + +typedef struct arrayGroupsStruct { + unsigned short dimsNum; + gdk_dimension_group **groups; +} gdk_array_groups; + typedef enum errors { general_error, new_bat, @@ -45,6 +58,15 @@ gdk_export gdk_dimension* createDimensio 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_dimension_group* createDimensionGroup_bte(bte min, bte max, bte step); +gdk_export gdk_dimension_group* createDimensionGroup_sht(sht min, sht max, sht step); +gdk_export gdk_dimension_group* createDimensionGroup_int(int min, int max, int step); +gdk_export gdk_dimension_group* createDimensionGroup_wrd(wrd min, wrd max, wrd step); +gdk_export gdk_dimension_group* createDimensionGroup_oid(oid min, oid max, oid step); +gdk_export gdk_dimension_group* createDimensionGroup_lng(lng min, lng max, lng step); +gdk_export gdk_dimension_group* createDimensionGroup_dbl(dbl min, dbl max, dbl step); +gdk_export gdk_dimension_group* createDimensionGroup_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); gdk_export gdk_analytic_dimension* createAnalyticDimension_int(unsigned short dimNum, int min, int max, int step); @@ -59,6 +81,10 @@ gdk_export gdk_return arrayDelete(gdk_ar gdk_export gdk_return analyticDimensionDelete(gdk_analytic_dimension *dim); gdk_export gdk_array* arrayCopy(gdk_array* array); +gdk_export gdk_array_groups* groupsNew(unsigned short dimsNum); +gdk_export gdk_return groupsDelete(gdk_array_groups *groups); +gdk_export gdk_array_groups* array2groups(gdk_array* array); + gdk_export bte gcd_bte(bte val1, bte val2); gdk_export sht gcd_sht(sht val1, sht val2); gdk_export int gcd_int(int val1, int val2); 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 @@ -1276,6 +1276,42 @@ str ALGsubrangejoin1(ptr *dimsResL, ptr return ALGsubrangejoin2(dimsResL, dimsResR, dimL, dimsL, dimR1, dimR2, dimsR, NULL, NULL, li, hi, estimate); } + +str ARRgroup(ptr *groupsRes, ptr *arrayRes, const ptr *dim, const ptr *dims, const int *l, const int *h) { + + gdk_analytic_dimension *dimension = (gdk_analytic_dimension*)*dim; + gdk_array *array = (gdk_array*)*dims; + + gdk_array_groups *groups = array2groups(array); + + /*update the limits for the current dimension */ + groups->groups[dimension->dimNum]->min = *l; + groups->groups[dimension->dimNum]->max = *h; + + *groupsRes = groups; + *arrayRes = arrayCopy(array); + + return MAL_SUCCEED; +} + +str ARRprojectGroups(bat *res, const ptr *groups_in, const ptr *dim, const ptr *dims) { + (void)*res; + (void)*groups_in; + (void)*dim; + (void)*dims; + + return MAL_SUCCEED; +} + +str ARRsubsum(bat *res, const bat *vals, const ptr* groups_in, const ptr *array_in) { + (void)*res; + (void)*vals; + (void)*groups_in; + (void)*array_in; + + return MAL_SUCCEED; +} + str ALGnonDimensionQRDecomposition(bat *oidsRes, ptr *dimsRes, const bat* vals, const ptr *dims) { gdk_array *array = (gdk_array*)*dims; @@ -1369,3 +1405,4 @@ str ALGnonDimensionQRDecomposition(bat * return MAL_SUCCEED; } + diff --git a/monetdb5/modules/kernel/arrays.h b/monetdb5/modules/kernel/arrays.h --- a/monetdb5/modules/kernel/arrays.h +++ b/monetdb5/modules/kernel/arrays.h @@ -70,4 +70,10 @@ algebra_export str ALGouterjoin(bat *res algebra_export str ALGarrayCount(wrd *res, const ptr *array); //algebra_export str ALGproject(bat *result, const ptr* candDims, const bat* candBAT); + +algebra_export str ARRsubsum(bat *res, const bat *vals, const ptr* groups, const ptr *array); + +algebra_export str ARRgroup(ptr *groupsRes, ptr *arrayRes, const ptr *dim, const ptr *dims, const int *l, const int *h); +algebra_export str ARRprojectGroups(bat *res, const ptr *groups, const ptr *dim, const ptr *dims); + #endif /* _ARRAYS_H */ diff --git a/monetdb5/modules/kernel/arrays.mal b/monetdb5/modules/kernel/arrays.mal --- a/monetdb5/modules/kernel/arrays.mal +++ b/monetdb5/modules/kernel/arrays.mal @@ -124,6 +124,16 @@ address ALGouterjoin; command aggr.count(array:ptr) :wrd address ALGarrayCount; +command aggr.subsum(X_7:bat[:oid,:any],X_8:ptr,Y_8:ptr) :bat[:oid,:hge] +address ARRsubsum; + +module group; +command group.subgroup(dim:ptr, array:ptr, l:int, h:int) (:ptr,:ptr) +address ARRgroup; + +command group.projectGroups(groups:ptr, dim:ptr, dims:ptr ) :bat[:oid,:any] +address ARRprojectGroups; + command algebra.qqr_decomposition(vals:bat[:oid,:any], dims:ptr) (:bat[:oid,:dbl], :ptr) address ALGnonDimensionQRDecomposition _______________________________________________ checkin-list mailing list checkin-list@monetdb.org https://www.monetdb.org/mailman/listinfo/checkin-list