Changeset: f9a15702e984 for MonetDB URL: https://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=f9a15702e984 Added Files: sql/test/analytics/Tests/All sql/test/analytics/Tests/analytics00.sql sql/test/analytics/Tests/analytics00.stable.err sql/test/analytics/Tests/analytics00.stable.out Modified Files: sql/backends/monet5/sql_rank.c sql/backends/monet5/sql_rank.h sql/backends/monet5/sql_rank.mal sql/common/sql_types.c sql/server/rel_select.c Branch: analytics Log Message:
Implemented min and max analytical functions for numeric types.
diffs (truncated from 801 to 300 lines):
diff --git a/sql/backends/monet5/sql_rank.c b/sql/backends/monet5/sql_rank.c
--- a/sql/backends/monet5/sql_rank.c
+++ b/sql/backends/monet5/sql_rank.c
@@ -101,7 +101,7 @@ SQLrow_number(Client cntxt, MalBlkPtr mb
BAT *b = BATdescriptor(*getArgReference_bat(stk, pci, 1)), *p,
*r;
int i, j, cnt, *rp;
bit *np;
-
+
if (!b)
throw(SQL, "sql.row_number", SQLSTATE(HY005) "Cannot
access column descriptor");
cnt = (int)BATcount(b);
@@ -150,7 +150,7 @@ SQLrank(Client cntxt, MalBlkPtr mb, MalS
BAT *b = BATdescriptor(*getArgReference_bat(stk, pci, 1)), *p,
*o, *r;
int i, j, k, cnt, *rp;
bit *np, *no;
-
+
if (!b)
throw(SQL, "sql.rank", SQLSTATE(HY005) "Cannot access
column descriptor");
cnt = (int)BATcount(b);
@@ -166,8 +166,8 @@ SQLrank(Client cntxt, MalBlkPtr mb, MalS
if (o) BBPunfix(o->batCacheid);
throw(SQL, "sql.rank", SQLSTATE(HY005)
"Cannot access column descriptor");
}
- np = (bit*)Tloc(p, 0);
- no = (bit*)Tloc(o, 0);
+ np = (bit*)Tloc(p, 0);
+ no = (bit*)Tloc(o, 0);
for(i=1,j=1,k=1; i<=cnt; i++, k++, np++, no++,
rp++) {
if (*np)
j=k=1;
@@ -183,7 +183,7 @@ SQLrank(Client cntxt, MalBlkPtr mb, MalS
BBPunfix(b->batCacheid);
throw(SQL, "sql.rank", SQLSTATE(HY005)
"Cannot access column descriptor");
}
- np = (bit*)Tloc(p, 0);
+ np = (bit*)Tloc(p, 0);
for(i=1,j=1,k=1; i<=cnt; i++, k++, np++, rp++) {
if (*np)
j=k=1;
@@ -198,7 +198,7 @@ SQLrank(Client cntxt, MalBlkPtr mb, MalS
BBPunfix(b->batCacheid);
throw(SQL, "sql.rank", SQLSTATE(HY005)
"Cannot access column descriptor");
}
- no = (bit*)Tloc(o, 0);
+ no = (bit*)Tloc(o, 0);
for(i=1,j=1,k=1; i<=cnt; i++, k++, no++, rp++) {
if (*no)
j=k;
@@ -235,7 +235,7 @@ SQLdense_rank(Client cntxt, MalBlkPtr mb
BAT *b = BATdescriptor(*getArgReference_bat(stk, pci, 1)), *p,
*o, *r;
int i, j, cnt, *rp;
bit *np, *no;
-
+
if (!b)
throw(SQL, "sql.dense_rank", SQLSTATE(HY005) "Cannot
access column descriptor");
cnt = (int)BATcount(b);
@@ -251,8 +251,8 @@ SQLdense_rank(Client cntxt, MalBlkPtr mb
if (o) BBPunfix(o->batCacheid);
throw(SQL, "sql.dense_rank",
SQLSTATE(HY005) "Cannot access column descriptor");
}
- np = (bit*)Tloc(p, 0);
- no = (bit*)Tloc(o, 0);
+ np = (bit*)Tloc(p, 0);
+ no = (bit*)Tloc(o, 0);
for(i=1,j=1; i<=cnt; i++, np++, no++, rp++) {
if (*np)
j=1;
@@ -268,7 +268,7 @@ SQLdense_rank(Client cntxt, MalBlkPtr mb
BBPunfix(b->batCacheid);
throw(SQL, "sql.dense_rank",
SQLSTATE(HY005) "Cannot access column descriptor");
}
- np = (bit*)Tloc(p, 0);
+ np = (bit*)Tloc(p, 0);
for(i=1,j=1; i<=cnt; i++, np++, rp++) {
if (*np)
j=1;
@@ -283,7 +283,7 @@ SQLdense_rank(Client cntxt, MalBlkPtr mb
BBPunfix(b->batCacheid);
throw(SQL, "sql.dense_rank",
SQLSTATE(HY005) "Cannot access column descriptor");
}
- no = (bit*)Tloc(o, 0);
+ no = (bit*)Tloc(o, 0);
for(i=1,j=1; i<=cnt; i++, no++, rp++) {
if (*no)
j++;
@@ -307,7 +307,8 @@ SQLdense_rank(Client cntxt, MalBlkPtr mb
}
static str
-SQLanalytics_args(BAT **r, BAT **b, BAT **p, BAT **o, Client cntxt, MalBlkPtr
mb, MalStkPtr stk, InstrPtr pci, const str mod, const str err)
+SQLanalytics_args(BAT **r, BAT **b, BAT **p, BAT **o, Client cntxt, MalBlkPtr
mb, MalStkPtr stk, InstrPtr pci,
+ const str mod, const str err)
{
*r = *b = *p = *o = NULL;
@@ -348,105 +349,130 @@ SQLanalytics_args(BAT **r, BAT **b, BAT
return MAL_SUCCEED;
}
-str
-SQLmin(Client cntxt, MalBlkPtr mb, MalStkPtr stk, InstrPtr pci)
-{
- BAT *r, *b, *p, *o;
- str msg = SQLanalytics_args( &r, &b, &p, &o, cntxt, mb, stk, pci,
"sql.min", "min(:any_1,:bit,:bit)");
- int tpe = getArgType(mb, pci, 1);
- int unit = *getArgReference_int(stk, pci, 4);
- int start = *getArgReference_int(stk, pci, 5);
- int end = *getArgReference_int(stk, pci, 6);
- int excl = *getArgReference_int(stk, pci, 7);
-
- if (unit != 0 || excl != 0)
- throw(SQL, "sql.min", "OVER currently only supports frame
extends with unit ROWS (and none of the excludes)");
- (void)start;
- (void)end;
-
- if (isaBatType(tpe))
- tpe = getBatType(tpe);
- if (msg)
- return msg;
+#define ANALYTICAL_IMP(TPE, OP) \
+ TPE *rp, *rb, *bp, curval; \
+ rb = rp = (TPE*)Tloc(r, 0); \
+ bp = (TPE*)Tloc(b, 0); \
+ curval = *bp; \
+ if (p) { \
+ if (o) { \
+ np = (bit*)Tloc(p, 0); \
+ no = (bit*)Tloc(o, 0); \
+ for(i=1; i<=cnt; i++, np++, no++, rp++, bp++) { \
+ if (*np) { \
+ for (;rb < rp; rb++)
\
+ *rb = curval;
\
+ curval = *bp;
\
+ } \
+ curval = OP(*bp, curval); \
+ } \
+ for (;rb < rp; rb++) \
+ *rb = curval; \
+ } else { /* single value, ie no ordering */ \
+ np = (bit*)Tloc(p, 0); \
+ for(i=1; i<=cnt; i++, np++, rp++, bp++) { \
+ if (*np) {
\
+ for (;rb < rp; rb++)
\
+ *rb = curval;
\
+ curval = *bp;
\
+ }
\
+ curval = OP(*bp, curval);
\
+ } \
+ for (;rb < rp; rb++) \
+ *rb = curval;
\
+ } \
+ } else if (o) { /* single value, ie no partitions */ \
+ no = (bit*)Tloc(o, 0); \
+ for(i=1,j=1; i<=cnt; i++, no++, rp++, bp++) { \
+ if (*no) \
+ j++; \
+ *rp = j; \
+ curval = OP(*bp, curval); \
+ } \
+ for (;rb < rp; rb++) \
+ *rb = curval; \
+ } else { /* single value, ie no ordering */ \
+ for(i=1; i<=cnt; i++, rp++, bp++) \
+ *rp = *bp; \
+ }
- /*
- switch(ATOMstorage(tpe)) {
- case TYPE_bte:
- case TYPE_sht:
- case TYPE_int:
- case TYPE_lng:
#ifdef HAVE_HUGE
- case TYPE_hge:
+#define ANALYTICAL_IMP_HUGE(IMP) \
+ case TYPE_hge: { \
+ ANALYTICAL_IMP(hge, IMP) \
+ } break;
+#else
+#define ANALYTICAL_IMP_HUGE(IMP)
#endif
- case TYPE_flt:
- case TYPE_dbl:
- default:
- throw(SQL, "sql.min", "min(:any_1,:bit,:bit)");
- }
- */
-
- /* FOR NOW only int input type !! */
- if (b) {
- bat *res = getArgReference_bat(stk, pci, 0);
- int i, j, cnt;
- int *rp, *rb, *bp, curval;
- bit *np, *no;
- cnt = (int)BATcount(b);
- rb = rp = (int*)Tloc(r, 0);
- bp = (int*)Tloc(b, 0);
- curval = *bp;
- if (p) {
- if (o) {
- np = (bit*)Tloc(p, 0);
- no = (bit*)Tloc(o, 0);
- for(i=1; i<=cnt; i++, np++, no++, rp++, bp++) {
- if (*np) {
- for (;rb < rp; rb++)
- *rb = curval;
- curval = *bp;
- }
- curval = MIN(*bp,curval);
- }
- for (;rb < rp; rb++)
- *rb = curval;
- } else { /* single value, ie no ordering */
- np = (bit*)Tloc(p, 0);
- for(i=1; i<=cnt; i++, np++, rp++, bp++) {
- if (*np) {
- for (;rb < rp; rb++)
- *rb = curval;
- curval = *bp;
- }
- curval = MIN(*bp,curval);
- }
- for (;rb < rp; rb++)
- *rb = curval;
- }
- } else if (o) { /* single value, ie no partitions */
- no = (bit*)Tloc(o, 0);
- for(i=1,j=1; i<=cnt; i++, no++, rp++, bp++) {
- if (*no)
- j++;
- *rp = j;
- curval = MIN(*bp,curval);
- }
- for (;rb < rp; rb++)
- *rb = curval;
- } else { /* single value, ie no ordering */
- for(i=1; i<=cnt; i++, rp++, bp++)
- *rp = *bp;
- }
- BATsetcount(r, cnt);
- BBPunfix(b->batCacheid);
- if (p) BBPunfix(p->batCacheid);
- if (o) BBPunfix(o->batCacheid);
- BBPkeepref(*res = r->batCacheid);
- } else {
- ptr *res = getArgReference(stk, pci, 0);
- ptr *in = getArgReference(stk, pci, 1);
+#define ANALYTICAL_LIMIT(OP, IMP, OPSTR, ERR)
\
+str
\
+SQL##OP(Client cntxt, MalBlkPtr mb, MalStkPtr stk, InstrPtr pci)
\
+{
\
+ BAT *r, *b, *p, *o;
\
+ str msg = SQLanalytics_args(&r, &b, &p, &o, cntxt, mb, stk, pci, OPSTR,
ERR); \
+ int tpe = getArgType(mb, pci, 1);
\
+ int unit = *getArgReference_int(stk, pci, 4);
\
+ int start = *getArgReference_int(stk, pci, 5);
\
+ int end = *getArgReference_int(stk, pci, 6);
\
+ int excl = *getArgReference_int(stk, pci, 7);
\
+
\
+ if (unit != 0 || excl != 0)
\
+ throw(SQL, OPSTR, SQLSTATE(42000) "OVER currently only supports
frame extends with unit ROWS (and none of the excludes)"); \
+ (void)start;
\
+ (void)end;
\
+
\
+ if (msg)
\
+ return msg;
\
+ if (isaBatType(tpe))
\
+ tpe = getBatType(tpe);
\
+
\
+ if (b) {
\
+ bat *res = getArgReference_bat(stk, pci, 0);
\
+ int i, j, cnt = (int) BATcount(b);
\
+ bit *np, *no;
\
+ switch(ATOMstorage(tpe)) {
\
+ case TYPE_bit: {
\
+ ANALYTICAL_IMP(bit, IMP)
\
+ } break;
\
+ case TYPE_bte: {
\
+ ANALYTICAL_IMP(bte, IMP)
\
+ } break;
\
+ case TYPE_sht: {
\
+ ANALYTICAL_IMP(sht, IMP)
\
+ } break;
\
+ case TYPE_int: {
\
+ ANALYTICAL_IMP(int, IMP)
\
+ } break;
\
+ case TYPE_lng: {
\
+ ANALYTICAL_IMP(lng, IMP)
\
+ } break;
\
+ ANALYTICAL_IMP_HUGE(IMP)
\
+ case TYPE_flt: {
\
+ ANALYTICAL_IMP(flt, IMP)
\
+ } break;
\
+ case TYPE_dbl: {
\
+ ANALYTICAL_IMP(dbl, IMP)
\
+ } break;
\
_______________________________________________
checkin-list mailing list
[email protected]
https://www.monetdb.org/mailman/listinfo/checkin-list
