Changeset: 21a70202fad4 for MonetDB
URL: https://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=21a70202fad4
Modified Files:
gdk/gdk_analytic.h
gdk/gdk_analytic_func.c
sql/backends/monet5/sql_rank.c
sql/backends/monet5/sql_rank.h
sql/backends/monet5/sql_rank.mal
sql/backends/monet5/sql_rank.mal.sh
sql/backends/monet5/sql_rank_hge.mal
sql/backends/monet5/sql_rank_hge.mal.sh
sql/backends/monet5/sql_upgrades.c
sql/scripts/39_analytics.sql
sql/scripts/39_analytics_hge.sql
Branch: statistics-analytics
Log Message:
Intermediate commit. Implementing covar_pop and covar_samp as window functions,
as well fixed the mal module for some window functions
diffs (truncated from 1561 to 300 lines):
diff --git a/gdk/gdk_analytic.h b/gdk/gdk_analytic.h
--- a/gdk/gdk_analytic.h
+++ b/gdk/gdk_analytic.h
@@ -42,6 +42,9 @@ gdk_export gdk_return GDKanalytical_stdd
gdk_export gdk_return GDKanalytical_stddev_pop(BAT *r, BAT *b, BAT *s, BAT *e,
int tpe);
gdk_export gdk_return GDKanalytical_variance_samp(BAT *r, BAT *b, BAT *s, BAT
*e, int tpe);
gdk_export gdk_return GDKanalytical_variance_pop(BAT *r, BAT *b, BAT *s, BAT
*e, int tpe);
+gdk_export gdk_return GDKanalytical_covariance_pop(BAT *r, BAT *b1, BAT *b2,
BAT *s, BAT *e, int tpe);
+gdk_export gdk_return GDKanalytical_covariance_sample(BAT *r, BAT *b1, BAT
*b2, BAT *s, BAT *e, int tpe);
+
gdk_export gdk_return GDKanalytical_quantile(BAT *r, BAT *b, BAT *s, BAT *e,
BAT *q, const void *restrict quantile, int tp1, int tp2);
gdk_export gdk_return GDKanalytical_quantile_avg(BAT *r, BAT *b, BAT *s, BAT
*e, BAT *q, const void *restrict quantile, int tp1, int tp2);
diff --git a/gdk/gdk_analytic_func.c b/gdk/gdk_analytic_func.c
--- a/gdk/gdk_analytic_func.c
+++ b/gdk/gdk_analytic_func.c
@@ -2104,3 +2104,27 @@ quantile_nosupport:
GDKerror("%s: type %s not supported for the quantile.\n", __func__,
ATOMname(tp2));
return GDK_FAIL;
}
+
+gdk_return
+GDKanalytical_covariance_pop(BAT *r, BAT *b1, BAT *b2, BAT *s, BAT *e, int tpe)
+{
+ (void) r;
+ (void) b1;
+ (void) b2;
+ (void) s;
+ (void) e;
+ (void) tpe;
+ return GDK_SUCCEED;
+}
+
+gdk_return
+GDKanalytical_covariance_sample(BAT *r, BAT *b1, BAT *b2, BAT *s, BAT *e, int
tpe)
+{
+ (void) r;
+ (void) b1;
+ (void) b2;
+ (void) s;
+ (void) e;
+ (void) tpe;
+ return GDK_SUCCEED;
+}
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
@@ -707,7 +707,7 @@ SQLcume_dist(Client cntxt, MalBlkPtr mb,
throw(SQL, "sql.ntile", SQLSTATE(42000) "ntile
must be greater than zero"); \
} \
} \
- voidresultBAT(r, TYPE_##TPE, cnt, b, "sql.ntile"); \
+ voidresultBAT(r, TYPE_##TPE, BATcount(b), b, "sql.ntile"); \
if (isaBatType(getArgType(mb, pci, 3))) { \
p = BATdescriptor(*getArgReference_bat(stk, pci, 3)); \
if (!p) { \
@@ -744,14 +744,13 @@ SQLntile(Client cntxt, MalBlkPtr mb, Mal
tp2 = getBatType(tp2);
if (isaBatType(tp1)) {
- BUN cnt;
bat *res = getArgReference_bat(stk, pci, 0);
BAT *b = BATdescriptor(*getArgReference_bat(stk, pci, 1)), *p =
NULL, *r, *n = NULL;
+ gdk_return gdk_code;
if (!b)
throw(SQL, "sql.ntile", SQLSTATE(HY005) "Cannot access
column descriptor");
- cnt = BATcount(b);
- gdk_return gdk_code;
+
if (isaBatType(getArgType(mb, pci, 2))) {
if (!(n = BATdescriptor(*getArgReference_bat(stk, pci,
2)))) {
BBPunfix(b->batCacheid);
@@ -784,7 +783,6 @@ SQLntile(Client cntxt, MalBlkPtr mb, Mal
}
}
- BATsetcount(r, cnt);
BBPunfix(b->batCacheid);
if (p) BBPunfix(p->batCacheid);
if (n) BBPunfix(n->batCacheid);
@@ -839,8 +837,7 @@ SQLanalytics_args(BAT **r, BAT **b, BAT
throw(SQL, mod, SQLSTATE(HY005) "Cannot access column
descriptor");
}
if (*b) {
- BUN cnt = BATcount(*b);
- voidresultBAT((*r), rtype ? rtype : (*b)->ttype, cnt, (*b),
mod);
+ voidresultBAT((*r), rtype ? rtype : (*b)->ttype, BATcount(*b),
(*b), mod);
if (!*r && *b)
BBPunfix((*b)->batCacheid);
}
@@ -887,8 +884,7 @@ do_limit_value(Client cntxt, MalBlkPtr m
throw(SQL, op, SQLSTATE(HY005) "Cannot access column
descriptor");
}
if (b) {
- BUN cnt = BATcount(b);
- voidresultBAT(r, tpe, cnt, b, op);
+ voidresultBAT(r, tpe, BATcount(b), b, op);
}
if (isaBatType(getArgType(mb, pci, 2))) {
s = BATdescriptor(*getArgReference_bat(stk, pci, 2));
@@ -992,16 +988,14 @@ SQLnth_value(Client cntxt, MalBlkPtr mb,
tp2 = getArgType(mb, pci, 2);
is_a_bat = isaBatType(tp2);
if (isaBatType(tp1)) {
- BUN cnt;
bat *res = getArgReference_bat(stk, pci, 0);
b = BATdescriptor(*getArgReference_bat(stk, pci, 1));
if (!b)
throw(SQL, "sql.nth_value", SQLSTATE(HY005) "Cannot
access column descriptor");
- cnt = BATcount(b);
tp1 = getBatType(tp1);
- voidresultBAT(r, tp1, cnt, b, "sql.nth_value");
+ voidresultBAT(r, tp1, BATcount(b), b, "sql.nth_value");
if (isaBatType(getArgType(mb, pci, 3))) {
s = BATdescriptor(*getArgReference_bat(stk, pci, 3));
if (!s) {
@@ -1060,7 +1054,6 @@ SQLnth_value(Client cntxt, MalBlkPtr mb,
}
}
- BATsetcount(r, cnt);
BBPunfix(b->batCacheid);
if (s) BBPunfix(s->batCacheid);
if (e) BBPunfix(e->batCacheid);
@@ -1124,7 +1117,7 @@ do_lead_lag(Client cntxt, MalBlkPtr mb,
gdk_return (*dual)(BAT *, BAT *, BAT *, BUN, const
void* restrict, int))
{
int tp1, tp2, tp3, base = 2;
- BUN l_value = 1, cnt;
+ BUN l_value = 1;
const void *restrict default_value;
gdk_return (*gdk_call)(BAT *, BAT *, BAT *, BUN, const void* restrict,
int) = func;
BAT *b = NULL, *l = NULL, *d = NULL, *p = NULL, *r = NULL;
@@ -1202,9 +1195,8 @@ do_lead_lag(Client cntxt, MalBlkPtr mb,
}
gdk_return gdk_code;
- cnt = BATcount(b);
tp1 = getBatType(tp1);
- voidresultBAT(r, tp1, cnt, b, op);
+ voidresultBAT(r, tp1, BATcount(b), b, op);
if (isaBatType(getArgType(mb, pci, base))) {
p = BATdescriptor(*getArgReference_bat(stk, pci, base));
if (!p) {
@@ -1215,7 +1207,6 @@ do_lead_lag(Client cntxt, MalBlkPtr mb,
gdk_code = gdk_call(r, b, p, l_value, default_value, tp1);
- BATsetcount(r, cnt);
if (gdk_code == GDK_SUCCEED)
BBPkeepref(*res = r->batCacheid);
else {
@@ -1329,8 +1320,7 @@ SQLcount(Client cntxt, MalBlkPtr mb, Mal
throw(SQL, "sql.count", SQLSTATE(HY005) "Cannot access
column descriptor");
}
if (b) {
- BUN cnt = BATcount(b);
- voidresultBAT(r, TYPE_lng, cnt, b, "sql.count");
+ voidresultBAT(r, TYPE_lng, BATcount(b), b, "sql.count");
}
if (isaBatType(getArgType(mb, pci, 3))) {
s = BATdescriptor(*getArgReference_bat(stk, pci, 3));
@@ -1362,7 +1352,7 @@ SQLcount(Client cntxt, MalBlkPtr mb, Mal
else
throw(SQL, "sql.count", GDK_EXCEPTION);
} else {
- lng *res = getArgReference(stk, pci, 0);
+ lng *res = (lng*) getArgReference(stk, pci, 0);
ptr *in = getArgReference(stk, pci, 1);
int (*atomcmp)(const void *, const void *) = ATOMcompare(tpe);
const void *nil = ATOMnilptr(tpe);
@@ -1605,7 +1595,8 @@ do_stddev_and_variance(Client cntxt, Mal
else
throw(SQL, op, GDK_EXCEPTION);
} else {
- dbl *res = getArgReference(stk, pci, 0);
+ dbl *res = (dbl*) getArgReference(stk, pci, 0);
+ ValRecord *input1 = &(stk)->stk[(pci)->argv[1]];
switch (tpe) {
case TYPE_bte:
@@ -1617,7 +1608,7 @@ do_stddev_and_variance(Client cntxt, Mal
#endif
case TYPE_flt:
case TYPE_dbl:
- *res = dbl_nil;
+ *res = VALisnil(input1) ? dbl_nil : 0;
break;
default:
throw(SQL, op, SQLSTATE(42000) "%s not
available for %s", op, ATOMname(tpe));
@@ -1654,6 +1645,125 @@ SQLvar_pop(Client cntxt, MalBlkPtr mb, M
GDKanalytical_variance_pop);
}
+static str
+do_covariance_and_correlation(Client cntxt, MalBlkPtr mb, MalStkPtr stk,
InstrPtr pci, const char* op, const char* err,
+ gdk_return
(*func)(BAT *, BAT *, BAT *, BAT *, BAT *, int))
+{
+ BAT *r = NULL, *b = NULL, *c = NULL, *s = NULL, *e = NULL;
+ int tp1, tp2;
+ gdk_return gdk_res = GDK_SUCCEED;
+ bool is_a_bat1, is_a_bat2;
+ str msg = MAL_SUCCEED;
+
+ (void)cntxt;
+ if (pci->argc != 5 || ((isaBatType(getArgType(mb, pci, 2)) &&
getBatType(getArgType(mb, pci, 3)) != TYPE_lng) ||
+ (isaBatType(getArgType(mb, pci, 4)) &&
getBatType(getArgType(mb, pci, 4)) != TYPE_lng))) {
+ throw(SQL, op, "%s", err);
+ }
+
+ tp1 = getArgType(mb, pci, 1);
+ tp2 = getArgType(mb, pci, 2);
+ is_a_bat1 = isaBatType(tp1);
+ is_a_bat2 = isaBatType(tp2);
+
+ if (is_a_bat1)
+ tp1 = getBatType(tp1);
+ if (is_a_bat2)
+ tp2 = getBatType(tp2);
+ if (tp1 != tp2)
+ throw(SQL, op, SQLSTATE(42000) "The input arguments for %s must
be from the same type", op);
+
+ if (is_a_bat1) {
+ bat *res = getArgReference_bat(stk, pci, 0);
+
+ b = BATdescriptor(*getArgReference_bat(stk, pci, 1));
+ if (!b)
+ throw(SQL, op, SQLSTATE(HY005) "Cannot access column
descriptor");
+
+ voidresultBAT(r, TYPE_dbl, BATcount(b), b, op);
+ if (isaBatType(getArgType(mb, pci, 3))) {
+ s = BATdescriptor(*getArgReference_bat(stk, pci, 3));
+ if (!s) {
+ BBPunfix(b->batCacheid);
+ BBPunfix(r->batCacheid);
+ throw(SQL, op, SQLSTATE(HY005) "Cannot access
column descriptor");
+ }
+ }
+ if (isaBatType(getArgType(mb, pci, 4))) {
+ e = BATdescriptor(*getArgReference_bat(stk, pci, 4));
+ if (!e) {
+ BBPunfix(b->batCacheid);
+ BBPunfix(r->batCacheid);
+ if (s) BBPunfix(s->batCacheid);
+ throw(SQL, op, SQLSTATE(HY005) "Cannot access
column descriptor");
+ }
+ }
+ if (is_a_bat2) {
+ c = BATdescriptor(*getArgReference_bat(stk, pci, 2));
+ if (!e) {
+ BBPunfix(b->batCacheid);
+ BBPunfix(r->batCacheid);
+ if (s) BBPunfix(s->batCacheid);
+ if (e) BBPunfix(e->batCacheid);
+ throw(SQL, op, SQLSTATE(HY005) "Cannot access
column descriptor");
+ }
+ gdk_res = func(r, b, c, s, e, tp1);
+ } else {
+ BUN cnt = BATcount(b);
+ ValRecord *input2 = &(stk)->stk[(pci)->argv[2]];
+ dbl *restrict rb = (dbl*) Tloc(r, 0), res =
VALisnil(input2) ? dbl_nil : 0;
+
+ for (BUN i = 0 ; i < cnt; i++)
+ rb[i] = res;
+ BATsetcount(r, cnt);
+ }
+
+ BBPunfix(b->batCacheid);
+ if (s) BBPunfix(s->batCacheid);
+ if (e) BBPunfix(e->batCacheid);
+ if (c) BBPunfix(c->batCacheid);
+ if (gdk_res == GDK_SUCCEED)
+ BBPkeepref(*res = r->batCacheid);
+ else
+ throw(SQL, op, GDK_EXCEPTION);
+ } else {
+ dbl *res = (dbl*) getArgReference(stk, pci, 0);
+ ValRecord *input1 = &(stk)->stk[(pci)->argv[1]];
+ ValRecord *input2 = &(stk)->stk[(pci)->argv[2]];
+
+ switch (tp1) {
+ case TYPE_bte:
+ case TYPE_sht:
+ case TYPE_int:
+ case TYPE_lng:
+#ifdef HAVE_HGE
+ case TYPE_hge:
+#endif
+ case TYPE_flt:
+ case TYPE_dbl:
+ *res = (VALisnil(input1) || VALisnil(input2)) ?
dbl_nil : 0;
+ break;
+ default:
+ throw(SQL, op, SQLSTATE(42000) "%s not
available for %s", op, ATOMname(tp1));
+ }
+ }
+ return msg;
_______________________________________________
checkin-list mailing list
[email protected]
https://www.monetdb.org/mailman/listinfo/checkin-list