Changeset: 75230b291877 for MonetDB
URL: http://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=75230b291877
Modified Files:
gdk/Makefile.ag
gdk/gdk.h
gdk/gdk_aggr.c
gdk/gdk_bat.c
gdk/gdk_batop.c
gdk/gdk_group.c
gdk/gdk_join.c
gdk/gdk_select.c
monetdb5/modules/kernel/algebra.c
monetdb5/modules/kernel/algebra.h
monetdb5/modules/mal/batcalc.c
sql/server/sql_mvc.h
sql/storage/bat/res_table.c
Branch: arrays
Log Message:
moved arrays code in own files minimising as much as possible including it in
code that
is not arrays specific
+ fixed a bug in dimensionBATsubselect when having anti
diffs (truncated from 1798 to 300 lines):
diff --git a/gdk/Makefile.ag b/gdk/Makefile.ag
--- a/gdk/Makefile.ag
+++ b/gdk/Makefile.ag
@@ -30,6 +30,7 @@ lib_gdk = {
gdk_join.c gdk_join_legacy.c \
gdk_unique.c \
gdk_firstn.c \
+ gdk_arrays.c gdk_arrays_aggr.c gdk_arrays.h \
bat.feps bat1.feps bat2.feps \
libbat.rc
LIBS = ../common/options/libmoptions \
diff --git a/gdk/gdk.h b/gdk/gdk.h
--- a/gdk/gdk.h
+++ b/gdk/gdk.h
@@ -968,125 +968,6 @@ typedef int (*GDKfcn) ();
#define BATsetArray(X, n) X->batArray=n
#define isBATarray(X) X->batArray>0
-/*Dimensional Columns*/
-#define dimensionCharacteristics(TPE, dimensionBAT, min, max, step,
elementRepeats, groupRepeats) \
-do {\
- TPE *vls; \
- BUN i; \
- vls = (TPE*)Tloc(dimensionBAT, BUNfirst(dimensionBAT)); \
- *min = vls[0]; \
- *step = vls[BATcount(dimensionBAT)-1]; \
- *max = vls[BATcount(dimensionBAT)-2]; \
-\
- *elementRepeats = *groupRepeats = 0; \
- vls = (TPE*)Tloc(dimensionBAT, BUNfirst(dimensionBAT)); \
-\
- for(i=0; i<BATcount(dimensionBAT)-2; i++) { /*last element is the step and
at least one element is max*/\
- if(vls[i] != *min) \
- break; \
- (*elementRepeats)++; \
- } \
- *groupRepeats = BATcount(dimensionBAT)-i-1; \
-} while(0)
-
-#define dimensionElement(min, max, step, elementRepeats, oid) \
- ({ \
- long elementsNum = floor((max-min)/step) + 1; \
- long elementsPerGroup = elementsNum*elementRepeats; \
- long elementInGroup = floor((oid%elementsPerGroup)/elementRepeats); \
-/*fprintf(stderr, "dimension element at %d is %d\n", (int)oid,
(int)(min+elementInGroup*step)); */\
- min+elementInGroup*step; \
- })
-
-#define createDimension(TPE, min, max, step, elementRepeats, groupRepeats) \
- ({ \
- long i; \
- TPE* vls; \
- BAT *resBAT = BATnew(TYPE_void, TYPE_##TPE,
elementRepeats+groupRepeats+1, TRANSIENT); \
- if(resBAT) { \
-fprintf(stderr, "createDimension: %ld total elements\n",
(elementRepeats+groupRepeats+1)); \
- vls = (TPE*)Tloc(resBAT, BUNfirst(resBAT)); \
- for(i=0; i<elementRepeats; i++) { \
- *vls = min; \
- vls++; \
- } \
- for(i=0; i<groupRepeats; i++) { \
- *vls = max; \
- vls++; \
- } \
- *vls = step; \
-\
- BATsetcount(resBAT,elementRepeats+groupRepeats+1); \
- BATseqbase(resBAT,0); \
- BATderiveProps(resBAT,FALSE); \
- resBAT->batArray=1; \
- } \
- resBAT; \
- })
-
-#define dimensionElementsNum(min, max, step)\
- ({\
- long num = 1; \
- if(!step) { \
- if(min!=max) { \
- GDKerror("dimensionElementsNum: step is 0 but min and max are
not equal\n"); \
- return 0; \
- } \
- } else \
- num = floor((max-min)/step) + 1; \
- num; \
- })
-
-#define dimensionBATsizeTPE(TPE, dimensionBAT) \
- ({\
- TPE min, max, step; \
- long elementRepeats, groupRepeats; \
- BUN elementsNum; \
- dimensionCharacteristics(TPE, dimensionBAT, &min, &max, &step,
&elementRepeats, &groupRepeats); \
- elementsNum = dimensionElementsNum(min, max, step); \
- elementsNum*elementRepeats*groupRepeats; \
- })
-
-#define materialiseDimensionTPE(TPE, dimensionBAT) \
- ({ \
- /*find the min, max, step in the dimension*/ \
- long elementRepeats, groupRepeats, elementsNum; \
- TPE min, max, step; \
- oid i, j; \
- TPE *el_out, el; \
- BAT *resBAT; \
-\
- dimensionCharacteristics(TPE, dimensionBAT, &min, &max, &step,
&elementRepeats, &groupRepeats); \
-/*fprintf(stderr, "materialise: elementRepeats = %ld - groupRepeats = %ld\n",
elementRepeats, groupRepeats); */\
- elementsNum = dimensionElementsNum(min, max, step); \
-/*fprintf(stderr, "materialise elementsNum = %ld\n", elementsNum); */\
- if(!step) \
- step = 1 ; /*if 0 then it loops for ever when adding the elements
in the resBAT*/\
-\
- if((resBAT = BATnew(TYPE_void, TYPE_##TPE,
elementRepeats*elementsNum*groupRepeats, TRANSIENT)) == NULL) \
- GDKerror("materialiseDimensionTPE: Unable to create output BAT"); \
-\
- el_out = (TPE*)Tloc(resBAT, BUNfirst(resBAT)); \
- for(j=0; j<(unsigned long)groupRepeats; j++) { \
-/*fprintf(stderr, "materialise: group repetition %ld\n", j); */\
- for(el=min; el<=max; el+=step) { \
- for(i=0; i<(unsigned long)elementRepeats; i++) { \
-/*fprintf(stderr, "materialise: element repetition %ld\n", i); */\
- *el_out = el; \
- el_out++; \
- } \
- } \
- } \
-\
- BATseqbase(resBAT,0); \
- BATsetcount(resBAT, elementRepeats*elementsNum*groupRepeats);
\
- BATderiveProps(resBAT,FALSE); \
- resBAT; \
- })
-
-gdk_export BAT* materialiseDimensionBAT(BAT* dimensionBAT);
-gdk_export BUN dimensionBATsize(BAT* dimensionBAT);
-gdk_export BUN dimensionBATelementsNum(BAT* dimensionBAT);
/*
* @- Heap Management
* Heaps are the low-level entities of mass storage in
@@ -3314,13 +3195,8 @@ gdk_export void BATsetprop(BAT *b, int i
#define JOIN_BAND 3
#define JOIN_NE (-3)
-gdk_export BAT *BATmbrsubselect(BAT *dimensionBAT, BAT *oidsBAT, BAT
*candsBAT);
-gdk_export BAT *BATmbrproject(BAT *b, BAT *s, BAT *subselectBAT);
-
gdk_export BAT *BATsubselect(BAT *b, BAT *s, const void *tl, const void *th,
int li, int hi, int anti);
-gdk_export BAT *BATdimensionSubselect(BAT *b, BAT *s, const void *tl, const
void *th, int li, int hi, int anti);
gdk_export BAT *BATthetasubselect(BAT *b, BAT *s, const void *val, const char
*op);
-gdk_export BAT *BATdimensionThetasubselect(BAT *b, BAT *s, const void *val,
const char *op);
gdk_export BAT *BATselect_(BAT *b, const void *tl, const void *th, bit li, bit
hi);
gdk_export BAT *BATuselect_(BAT *b, const void *tl, const void *th, bit li,
bit hi);
gdk_export BAT *BATselect(BAT *b, const void *tl, const void *th);
@@ -3348,8 +3224,6 @@ gdk_export gdk_return BATsubleftfetchjoi
gdk_export gdk_return BATsubbandjoin(BAT **r1p, BAT **r2p, BAT *l, BAT *r, BAT
*sl, BAT *sr, const void *c1, const void *c2, int li, int hi, BUN estimate);
gdk_export gdk_return BATsubrangejoin(BAT **r1p, BAT **r2p, BAT *l, BAT *rl,
BAT *rh, BAT *sl, BAT *sr, int li, int hi, BUN estimate);
gdk_export BAT *BATproject(BAT *l, BAT *r);
-gdk_export BAT *BATdimensionProject(BAT *l, BAT *r);
-//gdk_export BAT *BATnonDimensionProject(BAT *l, BAT *r);
gdk_export BAT *BATslice(BAT *b, BUN low, BUN high);
gdk_export BAT *BATleftfetchjoin(BAT *b, BAT *s, BUN estimate);
diff --git a/gdk/gdk_aggr.c b/gdk/gdk_aggr.c
--- a/gdk/gdk_aggr.c
+++ b/gdk/gdk_aggr.c
@@ -10,8 +10,9 @@
#include "gdk.h"
#include "gdk_private.h"
#include "gdk_calc_private.h"
+#include "gdk_arrays.h"
+
#include <math.h>
-
/* grouped aggregates
*
* The following functions take two to four input BATs and produce a
@@ -1513,88 +1514,43 @@ BATgroupavg(BAT **bnp, BAT **cntsp, BAT
goto alloc_fail;
dbls = (dbl *) Tloc(bn, BUNfirst(bn));
-#define dimensionAggrAvg(TPE) \
- do {\
- oid minD, maxD, stepD; \
- long elR, grpR, el, grp; \
- BUN elsNum, aggrGrp; \
- const TPE *restrict vals = (const TPE *) Tloc(b, BUNfirst(b)); \
- double elsPerAggrGrp =0 ; \
-\
- dimensionCharacteristics(oid, g, &minD, &maxD, &stepD, &elR,
&grpR); \
- elsNum = dimensionElementsNum(minD, maxD, stepD); \
- elsPerAggrGrp = elR*grpR; \
-\
- for(aggrGrp=0; aggrGrp<elsNum; aggrGrp++) { \
- oid start = aggrGrp*elR;\
-fprintf(stderr, "%u: %u\n", (unsigned int)aggrGrp, (unsigned int)start); \
- dbls[aggrGrp] = 0; /*initialise to 0*/\
- for(grp=0; grp<grpR; grp++) { \
- for(el=0; el<elR; el++) { \
- dbls[aggrGrp]+=vals[start+el]; \
-fprintf(stderr, "avg: group %u - (%u,%f) => %f\n", (unsigned int)aggrGrp,
(unsigned int)(start+el), (double)vals[start+el], dbls[aggrGrp]); \
- }\
- start+=elsNum*elR; \
- } \
- dbls[aggrGrp]/=elsPerAggrGrp; \
- } \
- } while(0)
+ if(isBATarray(g))
+ return dimensionBATgroupavg(bnp, cntsp, b, g, e, s, tp,
skip_nils, abort_on_error);
if (BATtdense(g))
gids = NULL;
- else if(!isBATarray(g))
+ else
gids = (const oid *) Tloc(g, BUNfirst(g) + start);
switch (b->ttype) {
case TYPE_bte:
- if(isBATarray(g))
- dimensionAggrAvg(bte);
- else
- AGGR_AVG(bte);
+ AGGR_AVG(bte);
break;
case TYPE_sht:
- if(isBATarray(g))
- dimensionAggrAvg(sht);
- else
- AGGR_AVG(sht);
+ AGGR_AVG(sht);
break;
case TYPE_int:
#if SIZEOF_WRD == SIZEOF_INT
case TYPE_wrd:
#endif
- if(isBATarray(g))
- dimensionAggrAvg(int);
- else
- AGGR_AVG(int);
+ AGGR_AVG(int);
break;
case TYPE_lng:
#if SIZEOF_WRD == SIZEOF_LNG
case TYPE_wrd:
#endif
- if(isBATarray(g))
- dimensionAggrAvg(lng);
- else
- AGGR_AVG(lng);
+ AGGR_AVG(lng);
break;
#ifdef HAVE_HGE
case TYPE_hge:
- if(isBATarray(g))
- dimensionAggrAvg(hge);
- else
- AGGR_AVG(hge);
+ AGGR_AVG(hge);
break;
#endif
case TYPE_flt:
- if(isBATarray(g))
- dimensionAggrAvg(flt);
- else
- AGGR_AVG_FLOAT(flt);
+ AGGR_AVG_FLOAT(flt);
break;
case TYPE_dbl:
- if(isBATarray(g))
- dimensionAggrAvg(dbl);
- else
- AGGR_AVG_FLOAT(dbl);
+ AGGR_AVG_FLOAT(dbl);
break;
default:
GDKfree(rems);
diff --git a/gdk/gdk_bat.c b/gdk/gdk_bat.c
--- a/gdk/gdk_bat.c
+++ b/gdk/gdk_bat.c
@@ -42,7 +42,7 @@
#include "monetdb_config.h"
#include "gdk.h"
#include "gdk_private.h"
-#include <math.h>
+#include "gdk_arrays.h"
#ifdef ALIGN
#undef ALIGN
@@ -1694,69 +1694,6 @@ void_inplace(BAT *b, oid id, const void
return res;
}
-
-static BUN
-dimension_void_replace_bat(BAT *b, BAT *p, BAT *dimensionBAT, bit force)
-{
- BUN nr = 0;
- BUN r, s;
- BATiter uii = bat_iterator(p);
-
_______________________________________________
checkin-list mailing list
[email protected]
https://www.monetdb.org/mailman/listinfo/checkin-list