Changeset: 50f3689592a5 for MonetDB
URL: https://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=50f3689592a5
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/scripts/39_analytics.sql
        sql/server/rel_select.c
        sql/test/analytics/Tests/analytics14.sql
        sql/test/analytics/Tests/analytics14.stable.out
Branch: statistics-analytics
Log Message:

Implemented stddev_pop as a window function


diffs (truncated from 526 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
@@ -38,6 +38,6 @@ gdk_export gdk_return GDKanalyticalsum(B
 gdk_export gdk_return GDKanalyticalprod(BAT *r, BAT *b, BAT *s, BAT *e, int 
tp1, int tp2);
 gdk_export gdk_return GDKanalyticalavg(BAT *r, BAT *b, BAT *s, BAT *e, int 
tpe);
 
-gdk_export gdk_return GDKanalyticalstddev_samp(BAT *r, BAT *b, BAT *s, BAT *e, 
int tpe);
+gdk_export gdk_return GDKanalytical_variance(BAT *r, BAT *b, BAT *s, BAT *e, 
int tpe, bool issample);
 
 #endif //_GDK_ANALYTIC_H_
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
@@ -1736,8 +1736,8 @@ GDKanalyticalavg(BAT *r, BAT *b, BAT *s,
                                mean += delta / n;              \
                                m2 += delta * ((dbl) v - mean); \
                        }                                               \
-                       if (n > 1) { \
-                               *rb = sqrt(m2 / (n - 1)); \
+                       if (n > sample) { \
+                               *rb = sqrt(m2 / (n - sample)); \
                        } else { \
                                *rb = dbl_nil; \
                                has_nils = true; \
@@ -1749,10 +1749,10 @@ GDKanalyticalavg(BAT *r, BAT *b, BAT *s,
        } while (0)
 
 gdk_return
-GDKanalyticalstddev_samp(BAT *r, BAT *b, BAT *s, BAT *e, int tpe)
+GDKanalytical_variance(BAT *r, BAT *b, BAT *s, BAT *e, int tpe, bool issample)
 {
        bool has_nils = false;
-       BUN i = 0, cnt = BATcount(b), n = 0;
+       BUN i = 0, cnt = BATcount(b), n = 0, sample = (BUN) issample;
        lng *restrict start, *restrict end;
        dbl *restrict rb = (dbl *) Tloc(r, 0), mean = 0, m2 = 0, delta;
 
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
@@ -1537,12 +1537,11 @@ SQLavg(Client cntxt, MalBlkPtr mb, MalSt
        return msg;
 }
 
-str
-SQLstddev_samp(Client cntxt, MalBlkPtr mb, MalStkPtr stk, InstrPtr pci)
+static str
+do_stddev(Client cntxt, MalBlkPtr mb, MalStkPtr stk, InstrPtr pci, const char* 
op, const char* err, bool issample)
 {
        BAT *r, *b, *s, *e;
-       str msg = SQLanalytics_args(&r, &b, &s, &e, cntxt, mb, stk, pci, 
TYPE_dbl, "sql.stddev",
-                                                               SQLSTATE(42000) 
"stddev(:any_1,:lng,:lng)");
+       str msg = SQLanalytics_args(&r, &b, &s, &e, cntxt, mb, stk, pci, 
TYPE_dbl, op, err);
        int tpe = getArgType(mb, pci, 1);
        gdk_return gdk_res;
 
@@ -1554,14 +1553,14 @@ SQLstddev_samp(Client cntxt, MalBlkPtr m
        if (b) {
                bat *res = getArgReference_bat(stk, pci, 0);
 
-               gdk_res = GDKanalyticalstddev_samp(r, b, s, e, tpe);
+               gdk_res = GDKanalytical_variance(r, b, s, e, tpe, issample);
                BBPunfix(b->batCacheid);
                if (s) BBPunfix(s->batCacheid);
                if (e) BBPunfix(e->batCacheid);
                if (gdk_res == GDK_SUCCEED)
                        BBPkeepref(*res = r->batCacheid);
                else
-                       throw(SQL, "sql.stddev", GDK_EXCEPTION);
+                       throw(SQL, op, GDK_EXCEPTION);
        } else {
                dbl *res = getArgReference(stk, pci, 0);
 
@@ -1578,8 +1577,20 @@ SQLstddev_samp(Client cntxt, MalBlkPtr m
                                *res = dbl_nil;
                                break;
                        default:
-                               throw(SQL, "sql.stddev", SQLSTATE(42000) 
"sql.stddev not available for %s", ATOMname(tpe));
+                               throw(SQL, op, SQLSTATE(42000) "%s not 
available for %s", op, ATOMname(tpe));
                }
        }
        return msg;
 }
+
+str
+SQLstddev_samp(Client cntxt, MalBlkPtr mb, MalStkPtr stk, InstrPtr pci)
+{
+       return do_stddev(cntxt, mb, stk, pci, "sql.stdev", SQLSTATE(42000) 
"stddev(:any_1,:lng,:lng)", true);
+}
+
+str
+SQLstddev_pop(Client cntxt, MalBlkPtr mb, MalStkPtr stk, InstrPtr pci)
+{
+       return do_stddev(cntxt, mb, stk, pci, "sql.stdevp", SQLSTATE(42000) 
"stdevp(:any_1,:lng,:lng)", false);
+}
diff --git a/sql/backends/monet5/sql_rank.h b/sql/backends/monet5/sql_rank.h
--- a/sql/backends/monet5/sql_rank.h
+++ b/sql/backends/monet5/sql_rank.h
@@ -37,5 +37,6 @@ sql5_export str SQLavg(Client cntxt, Mal
 
 /* statistical functions */
 sql5_export str SQLstddev_samp(Client cntxt, MalBlkPtr mb, MalStkPtr stk, 
InstrPtr pci);
+sql5_export str SQLstddev_pop(Client cntxt, MalBlkPtr mb, MalStkPtr stk, 
InstrPtr pci);
 
 #endif /* _SQL_RANK_H */
diff --git a/sql/backends/monet5/sql_rank.mal b/sql/backends/monet5/sql_rank.mal
--- a/sql/backends/monet5/sql_rank.mal
+++ b/sql/backends/monet5/sql_rank.mal
@@ -541,6 +541,24 @@ pattern batsql.avg(b:bat[:bte], s:bat[:l
 address SQLavg
 comment "return the average of groups";
 
+
+pattern sql.stdev(b:bte, s:lng, e:lng) :dbl
+address SQLstddev_samp
+comment "standard deviation of groups";
+
+pattern batsql.stdev(b:bat[:bte], s:bat[:lng], e:bat[:lng]) :bat[:dbl]
+address SQLstddev_samp
+comment "standard deviation of groups";
+
+
+pattern sql.stdevp(b:bte, s:lng, e:lng) :dbl
+address SQLstddev_pop
+comment "standard deviation of groups";
+
+pattern batsql.stdevp(b:bat[:bte], s:bat[:lng], e:bat[:lng]) :bat[:dbl]
+address SQLstddev_pop
+comment "standard deviation of groups";
+
 pattern sql.avg(b:sht, s:lng, e:lng) :dbl
 address SQLavg
 comment "return the average of groups";
@@ -549,6 +567,24 @@ pattern batsql.avg(b:bat[:sht], s:bat[:l
 address SQLavg
 comment "return the average of groups";
 
+
+pattern sql.stdev(b:sht, s:lng, e:lng) :dbl
+address SQLstddev_samp
+comment "standard deviation of groups";
+
+pattern batsql.stdev(b:bat[:sht], s:bat[:lng], e:bat[:lng]) :bat[:dbl]
+address SQLstddev_samp
+comment "standard deviation of groups";
+
+
+pattern sql.stdevp(b:sht, s:lng, e:lng) :dbl
+address SQLstddev_pop
+comment "standard deviation of groups";
+
+pattern batsql.stdevp(b:bat[:sht], s:bat[:lng], e:bat[:lng]) :bat[:dbl]
+address SQLstddev_pop
+comment "standard deviation of groups";
+
 pattern sql.avg(b:int, s:lng, e:lng) :dbl
 address SQLavg
 comment "return the average of groups";
@@ -557,6 +593,24 @@ pattern batsql.avg(b:bat[:int], s:bat[:l
 address SQLavg
 comment "return the average of groups";
 
+
+pattern sql.stdev(b:int, s:lng, e:lng) :dbl
+address SQLstddev_samp
+comment "standard deviation of groups";
+
+pattern batsql.stdev(b:bat[:int], s:bat[:lng], e:bat[:lng]) :bat[:dbl]
+address SQLstddev_samp
+comment "standard deviation of groups";
+
+
+pattern sql.stdevp(b:int, s:lng, e:lng) :dbl
+address SQLstddev_pop
+comment "standard deviation of groups";
+
+pattern batsql.stdevp(b:bat[:int], s:bat[:lng], e:bat[:lng]) :bat[:dbl]
+address SQLstddev_pop
+comment "standard deviation of groups";
+
 pattern sql.avg(b:lng, s:lng, e:lng) :dbl
 address SQLavg
 comment "return the average of groups";
@@ -565,6 +619,24 @@ pattern batsql.avg(b:bat[:lng], s:bat[:l
 address SQLavg
 comment "return the average of groups";
 
+
+pattern sql.stdev(b:lng, s:lng, e:lng) :dbl
+address SQLstddev_samp
+comment "standard deviation of groups";
+
+pattern batsql.stdev(b:bat[:lng], s:bat[:lng], e:bat[:lng]) :bat[:dbl]
+address SQLstddev_samp
+comment "standard deviation of groups";
+
+
+pattern sql.stdevp(b:lng, s:lng, e:lng) :dbl
+address SQLstddev_pop
+comment "standard deviation of groups";
+
+pattern batsql.stdevp(b:bat[:lng], s:bat[:lng], e:bat[:lng]) :bat[:dbl]
+address SQLstddev_pop
+comment "standard deviation of groups";
+
 pattern sql.avg(b:flt, s:lng, e:lng) :dbl
 address SQLavg
 comment "return the average of groups";
@@ -573,6 +645,24 @@ pattern batsql.avg(b:bat[:flt], s:bat[:l
 address SQLavg
 comment "return the average of groups";
 
+
+pattern sql.stdev(b:flt, s:lng, e:lng) :dbl
+address SQLstddev_samp
+comment "standard deviation of groups";
+
+pattern batsql.stdev(b:bat[:flt], s:bat[:lng], e:bat[:lng]) :bat[:dbl]
+address SQLstddev_samp
+comment "standard deviation of groups";
+
+
+pattern sql.stdevp(b:flt, s:lng, e:lng) :dbl
+address SQLstddev_pop
+comment "standard deviation of groups";
+
+pattern batsql.stdevp(b:bat[:flt], s:bat[:lng], e:bat[:lng]) :bat[:dbl]
+address SQLstddev_pop
+comment "standard deviation of groups";
+
 pattern sql.avg(b:dbl, s:lng, e:lng) :dbl
 address SQLavg
 comment "return the average of groups";
@@ -581,45 +671,6 @@ pattern batsql.avg(b:bat[:dbl], s:bat[:l
 address SQLavg
 comment "return the average of groups";
 
-pattern sql.stdev(b:bte, s:lng, e:lng) :dbl
-address SQLstddev_samp
-comment "standard deviation of groups";
-
-pattern batsql.stdev(b:bat[:bte], s:bat[:lng], e:bat[:lng]) :bat[:dbl]
-address SQLstddev_samp
-comment "standard deviation of groups";
-
-pattern sql.stdev(b:sht, s:lng, e:lng) :dbl
-address SQLstddev_samp
-comment "standard deviation of groups";
-
-pattern batsql.stdev(b:bat[:sht], s:bat[:lng], e:bat[:lng]) :bat[:dbl]
-address SQLstddev_samp
-comment "standard deviation of groups";
-
-pattern sql.stdev(b:int, s:lng, e:lng) :dbl
-address SQLstddev_samp
-comment "standard deviation of groups";
-
-pattern batsql.stdev(b:bat[:int], s:bat[:lng], e:bat[:lng]) :bat[:dbl]
-address SQLstddev_samp
-comment "standard deviation of groups";
-
-pattern sql.stdev(b:lng, s:lng, e:lng) :dbl
-address SQLstddev_samp
-comment "standard deviation of groups";
-
-pattern batsql.stdev(b:bat[:lng], s:bat[:lng], e:bat[:lng]) :bat[:dbl]
-address SQLstddev_samp
-comment "standard deviation of groups";
-
-pattern sql.stdev(b:flt, s:lng, e:lng) :dbl
-address SQLstddev_samp
-comment "standard deviation of groups";
-
-pattern batsql.stdev(b:bat[:flt], s:bat[:lng], e:bat[:lng]) :bat[:dbl]
-address SQLstddev_samp
-comment "standard deviation of groups";
 
 pattern sql.stdev(b:dbl, s:lng, e:lng) :dbl
 address SQLstddev_samp
@@ -629,6 +680,15 @@ pattern batsql.stdev(b:bat[:dbl], s:bat[
 address SQLstddev_samp
 comment "standard deviation of groups";
 
+
+pattern sql.stdevp(b:dbl, s:lng, e:lng) :dbl
+address SQLstddev_pop
+comment "standard deviation of groups";
+
+pattern batsql.stdevp(b:bat[:dbl], s:bat[:lng], e:bat[:lng]) :bat[:dbl]
+address SQLstddev_pop
+comment "standard deviation of groups";
+
 command aggr.exist(b:bat[:any_2], h:any_1):bit
 address ALGexist;
 
diff --git a/sql/backends/monet5/sql_rank.mal.sh 
b/sql/backends/monet5/sql_rank.mal.sh
--- a/sql/backends/monet5/sql_rank.mal.sh
+++ b/sql/backends/monet5/sql_rank.mal.sh
@@ -377,11 +377,7 @@ pattern batsql.avg(b:bat[:${tp1#*:}], s:
_______________________________________________
checkin-list mailing list
[email protected]
https://www.monetdb.org/mailman/listinfo/checkin-list

Reply via email to