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

Reply via email to