Changeset: 2abd89a2f10d for MonetDB
URL: https://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=2abd89a2f10d
Added Files:
        sql/test/analytics/Tests/analytics01.sql
        sql/test/analytics/Tests/analytics01.stable.err
        sql/test/analytics/Tests/analytics01.stable.out
Modified Files:
        gdk/gdk_analytic.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/common/sql_types.c
        sql/test/analytics/Tests/All
Branch: analytics
Log Message:

Implemented percent_rank analytic over a window.


diffs (truncated from 477 to 300 lines):

diff --git a/gdk/gdk_analytic.c b/gdk/gdk_analytic.c
--- a/gdk/gdk_analytic.c
+++ b/gdk/gdk_analytic.c
@@ -73,7 +73,7 @@ GDKanalyticaldiff(BAT *r, BAT *b, BAT *c
                        ptr v = BUNtail(it, 0), next;
                        atomcmp = ATOMcompare(tpe);
                        if(rp) {
-                               for (i = 0; i < cnt; i++, rp++) {
+                               for (i=0; i<cnt; i++, rp++) {
                                        *rb = *rp;
                                        next = BUNtail(it, i);
                                        if (atomcmp(v, next) != 0) {
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
@@ -280,6 +280,94 @@ SQLdense_rank(Client cntxt, MalBlkPtr mb
        return MAL_SUCCEED;
 }
 
+str
+SQLpercent_rank(Client cntxt, MalBlkPtr mb, MalStkPtr stk, InstrPtr pci)
+{
+       if (pci->argc != 4 ||
+               (getArgType(mb, pci, 2) != TYPE_bit && 
getBatType(getArgType(mb, pci, 2)) != TYPE_bit) ||
+               (getArgType(mb, pci, 3) != TYPE_bit && 
getBatType(getArgType(mb, pci, 3)) != TYPE_bit)){
+               throw(SQL, "sql.percent_rank", SQLSTATE(42000) 
"percent_rank(:any_1,:bit,:bit)");
+       }
+       (void)cntxt;
+       if (isaBatType(getArgType(mb, pci, 1))) {
+               bat *res = getArgReference_bat(stk, pci, 0);
+               BAT *b = BATdescriptor(*getArgReference_bat(stk, pci, 1)), *p, 
*o, *r;
+               int j, k, cnt;
+               dbl *rp, *end, cnt_cast;
+               bit *np, *no;
+
+               if (!b)
+                       throw(SQL, "sql.percent_rank", SQLSTATE(HY005) "Cannot 
access column descriptor");
+               cnt = (int)BATcount(b);
+               cnt_cast = (dbl) (cnt - 1);
+               voidresultBAT(r, TYPE_dbl, cnt, b, "sql.percent_rank");
+               rp = (dbl*)Tloc(r, 0);
+               end = rp + cnt;
+               if (isaBatType(getArgType(mb, pci, 2))) {
+                       if (isaBatType(getArgType(mb, pci, 3))) {
+                               p = BATdescriptor(*getArgReference_bat(stk, 
pci, 2));
+                               o = BATdescriptor(*getArgReference_bat(stk, 
pci, 3));
+                               if (!p || !o) {
+                                       BBPunfix(b->batCacheid);
+                                       if (p) BBPunfix(p->batCacheid);
+                                       if (o) BBPunfix(o->batCacheid);
+                                       throw(SQL, "sql.percent_rank", 
SQLSTATE(HY005) "Cannot access column descriptor");
+                               }
+                               np = (bit*)Tloc(p, 0);
+                               no = (bit*)Tloc(o, 0);
+                               for(j=0,k=0; rp<end; k++, np++, no++, rp++) {
+                                       if (*np)
+                                               j=k=0;
+                                       if (*no)
+                                               j=k;
+                                       *rp = j / cnt_cast;
+                               }
+                               BBPunfix(p->batCacheid);
+                               BBPunfix(o->batCacheid);
+                       } else { /* single value, ie no ordering */
+                               p = BATdescriptor(*getArgReference_bat(stk, 
pci, 2));
+                               if (!p) {
+                                       BBPunfix(b->batCacheid);
+                                       throw(SQL, "sql.percent_rank", 
SQLSTATE(HY005) "Cannot access column descriptor");
+                               }
+                               np = (bit*)Tloc(p, 0);
+                               for(j=0; rp<end; np++, rp++) {
+                                       if (*np)
+                                               j=0;
+                                       *rp = j / cnt_cast;
+                               }
+                               BBPunfix(p->batCacheid);
+                       }
+               } else { /* single value, ie no partitions */
+                       if (isaBatType(getArgType(mb, pci, 3))) {
+                               o = BATdescriptor(*getArgReference_bat(stk, 
pci, 3));
+                               if (!o) {
+                                       BBPunfix(b->batCacheid);
+                                       throw(SQL, "sql.percent_rank", 
SQLSTATE(HY005) "Cannot access column descriptor");
+                               }
+                               no = (bit*)Tloc(o, 0);
+                               for(j=0,k=0; rp<end; k++, no++, rp++) {
+                                       if (*no)
+                                               j=k;
+                                       *rp = j / cnt_cast;
+                               }
+                               BBPunfix(o->batCacheid);
+                       } else { /* single value, ie no ordering - the outcome 
will always be 0 */
+                               for(; rp<end; rp++)
+                                       *rp = 0;
+                       }
+               }
+               BATsetcount(r, cnt);
+               BBPunfix(b->batCacheid);
+               BBPkeepref(*res = r->batCacheid);
+       } else {
+               int *res = getArgReference_int(stk, pci, 0);
+
+               *res = 1;
+       }
+       return MAL_SUCCEED;
+}
+
 static str
 SQLanalytics_args(BAT **r, BAT **b, BAT **p, BAT **o, Client cntxt, MalBlkPtr 
mb, MalStkPtr stk, InstrPtr pci,
                                  int rtype, const str mod, const str err)
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
@@ -15,6 +15,7 @@ sql5_export str SQLdiff(Client cntxt, Ma
 sql5_export str SQLrow_number(Client cntxt, MalBlkPtr mb, MalStkPtr stk, 
InstrPtr pci);
 sql5_export str SQLrank(Client cntxt, MalBlkPtr mb, MalStkPtr stk, InstrPtr 
pci);
 sql5_export str SQLdense_rank(Client cntxt, MalBlkPtr mb, MalStkPtr stk, 
InstrPtr pci);
+sql5_export str SQLpercent_rank(Client cntxt, MalBlkPtr mb, MalStkPtr stk, 
InstrPtr pci);
 sql5_export str SQLmin(Client cntxt, MalBlkPtr mb, MalStkPtr stk, InstrPtr 
pci);
 sql5_export str SQLmax(Client cntxt, MalBlkPtr mb, MalStkPtr stk, InstrPtr 
pci);
 sql5_export str SQLcount(Client cntxt, MalBlkPtr mb, MalStkPtr stk, InstrPtr 
pci);
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
@@ -48,6 +48,14 @@ pattern batsql.dense_rank(b:bat[:any_1],
 address SQLdense_rank
 comment "return the densely ranked groups";
 
+pattern sql.percent_rank(b:any_1, p:bit, o:bit) :dbl
+address SQLpercent_rank
+comment "return the percentage into the total number of groups for each row";
+
+pattern batsql.percent_rank(b:bat[:any_1], p:any_2, o:any_3) :bat[:dbl]
+address SQLpercent_rank
+comment "return the percentage into the total number of groups for each row";
+
 pattern sql.min(b:any_1, p:bit, o:bit, unit:int, s:int, e:int, excl:int) :any_1
 address SQLmin
 comment "return the minimum of groups";
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
@@ -54,6 +54,14 @@ pattern batsql.dense_rank(b:bat[:any_1],
 address SQLdense_rank
 comment "return the densely ranked groups";
 
+pattern sql.percent_rank(b:any_1, p:bit, o:bit) :dbl
+address SQLpercent_rank
+comment "return the percentage into the total number of groups for each row";
+
+pattern batsql.percent_rank(b:bat[:any_1], p:any_2, o:any_3) :bat[:dbl]
+address SQLpercent_rank
+comment "return the percentage into the total number of groups for each row";
+
 pattern sql.min(b:any_1, p:bit, o:bit, unit:int, s:int, e:int, excl:int) :any_1
 address SQLmin
 comment "return the minimum of groups";
diff --git a/sql/common/sql_types.c b/sql/common/sql_types.c
--- a/sql/common/sql_types.c
+++ b/sql/common/sql_types.c
@@ -1566,13 +1566,16 @@ sqltypeinit( sql_allocator *sa)
        sql_create_analytic(sa, "rank", "sql", "rank", ANY, BIT, BIT, INT, 
SCALE_NONE);
        sql_create_analytic(sa, "dense_rank", "sql", "dense_rank", ANY, BIT, 
BIT, INT, SCALE_NONE);
        sql_create_analytic(sa, "row_number", "sql", "row_number", ANY, BIT, 
BIT, INT, SCALE_NONE);
+       sql_create_analytic(sa, "percent_rank", "sql", "percent_rank", ANY, 
BIT, BIT, DBL, SCALE_NONE);
 
-       //sql_create_analytic(sa, "percent_rank", "sql", "percent_rank", ANY, 
BIT, BIT, INT, SCALE_NONE);
        //sql_create_analytic(sa, "cume_dist", "sql", "cume_dist", ANY, BIT, 
BIT, ANY, SCALE_NONE);
+       //sql_create_analytic(sa, "ntile", "sql", "ntile", ANY, BIT, BIT, ANY, 
SCALE_NONE);
        //sql_create_analytic(sa, "lag", "sql", "lag", ANY, BIT, BIT, ANY, 
SCALE_NONE);
        //sql_create_analytic(sa, "lead", "sql", "lead", ANY, BIT, BIT, ANY, 
SCALE_NONE);
        //sql_create_analytic(sa, "first_value", "sql", "first_value", ANY, 
BIT, BIT, ANY, SCALE_NONE);
        //sql_create_analytic(sa, "last_value", "sql", "last_value", ANY, BIT, 
BIT, ANY, SCALE_NONE);
+       //sql_create_analytic(sa, "nth_value", "sql", "nth_value", ANY, BIT, 
BIT, ANY, SCALE_NONE);
+
        sql_create_analytic(sa, "count", "sql", "count", BIT, BIT, NULL, LNG, 
SCALE_NONE);
        sql_create_analytic(sa, "count", "sql", "count", ANY, BIT, BIT, LNG, 
SCALE_NONE);
        sql_create_analytic(sa, "min", "sql", "min", ANY, BIT, BIT, ANY, 
SCALE_NONE);
diff --git a/sql/test/analytics/Tests/All b/sql/test/analytics/Tests/All
--- a/sql/test/analytics/Tests/All
+++ b/sql/test/analytics/Tests/All
@@ -1,1 +1,2 @@
 analytics00
+analytics01
diff --git a/sql/test/analytics/Tests/analytics01.sql 
b/sql/test/analytics/Tests/analytics01.sql
new file mode 100644
--- /dev/null
+++ b/sql/test/analytics/Tests/analytics01.sql
@@ -0,0 +1,17 @@
+start transaction;
+create table analytics (aa int, bb int, cc bigint);
+insert into analytics values (15, 3, 15), (3, 1, 3), (2, 1, 2), (5, 3, 5), 
(NULL, 2, NULL), (3, 2, 3), (4, 1, 4), (6, 3, 6), (8, 2, 8), (NULL, 4, NULL);
+
+select percent_rank() over (partition by aa) from analytics;
+select percent_rank() over (partition by aa order by aa asc) from analytics;
+select percent_rank() over (partition by aa order by aa desc) from analytics;
+select percent_rank() over (order by aa) from analytics;
+select percent_rank() over (order by aa desc) from analytics;
+
+select percent_rank() over (partition by bb) from analytics;
+select percent_rank() over (partition by bb order by bb asc) from analytics;
+select percent_rank() over (partition by bb order by bb desc) from analytics;
+select percent_rank() over (order by bb) from analytics;
+select percent_rank() over (order by bb desc) from analytics;
+
+rollback;
diff --git a/sql/test/analytics/Tests/analytics01.stable.err 
b/sql/test/analytics/Tests/analytics01.stable.err
new file mode 100644
--- /dev/null
+++ b/sql/test/analytics/Tests/analytics01.stable.err
@@ -0,0 +1,35 @@
+stderr of test 'analytics01` in directory 'sql/test/analytics` itself:
+
+
+# 17:00:05 >  
+# 17:00:05 >  "mserver5" "--debug=10" "--set" "gdk_nr_threads=0" "--set" 
"mapi_open=true" "--set" "mapi_port=39763" "--set" 
"mapi_usock=/var/tmp/mtest-22291/.s.monetdb.39763" "--set" "monet_prompt=" 
"--forcemito" 
"--dbpath=/home/ferreira/repositories/MonetDB-analytics/BUILD/var/MonetDB/mTests_sql_test_analytics"
 "--set" "embedded_c=true"
+# 17:00:05 >  
+
+# builtin opt  gdk_dbpath = 
/home/ferreira/repositories/MonetDB-analytics/BUILD/var/monetdb5/dbfarm/demo
+# builtin opt  gdk_debug = 0
+# builtin opt  gdk_vmtrim = no
+# builtin opt  monet_prompt = >
+# builtin opt  monet_daemon = no
+# builtin opt  mapi_port = 50000
+# builtin opt  mapi_open = false
+# builtin opt  mapi_autosense = false
+# builtin opt  sql_optimizer = default_pipe
+# builtin opt  sql_debug = 0
+# cmdline opt  gdk_nr_threads = 0
+# cmdline opt  mapi_open = true
+# cmdline opt  mapi_port = 39763
+# cmdline opt  mapi_usock = /var/tmp/mtest-22291/.s.monetdb.39763
+# cmdline opt  monet_prompt = 
+# cmdline opt  gdk_dbpath = 
/home/ferreira/repositories/MonetDB-analytics/BUILD/var/MonetDB/mTests_sql_test_analytics
+# cmdline opt  embedded_c = true
+# cmdline opt  gdk_debug = 553648138
+
+# 17:00:05 >  
+# 17:00:05 >  "mclient" "-lsql" "-ftest" "-tnone" "-Eutf-8" "-i" "-e" 
"--host=/var/tmp/mtest-22291" "--port=39763"
+# 17:00:05 >  
+
+
+# 17:00:05 >  
+# 17:00:05 >  "Done."
+# 17:00:05 >  
+
diff --git a/sql/test/analytics/Tests/analytics01.stable.out 
b/sql/test/analytics/Tests/analytics01.stable.out
new file mode 100644
--- /dev/null
+++ b/sql/test/analytics/Tests/analytics01.stable.out
@@ -0,0 +1,226 @@
+stdout of test 'analytics01` in directory 'sql/test/analytics` itself:
+
+
+# 17:00:05 >  
+# 17:00:05 >  "mserver5" "--debug=10" "--set" "gdk_nr_threads=0" "--set" 
"mapi_open=true" "--set" "mapi_port=39763" "--set" 
"mapi_usock=/var/tmp/mtest-22291/.s.monetdb.39763" "--set" "monet_prompt=" 
"--forcemito" 
"--dbpath=/home/ferreira/repositories/MonetDB-analytics/BUILD/var/MonetDB/mTests_sql_test_analytics"
 "--set" "embedded_c=true"
+# 17:00:05 >  
+
+# MonetDB 5 server v11.32.0
+# This is an unreleased version
+# Serving database 'mTests_sql_test_analytics', using 8 threads
+# Compiled for x86_64-pc-linux-gnu/64bit with 128bit integers
+# Found 15.492 GiB available main-memory.
+# Copyright (c) 1993 - July 2008 CWI.
+# Copyright (c) August 2008 - 2018 MonetDB B.V., all rights reserved
+# Visit https://www.monetdb.org/ for further information
+# Listening for connection requests on mapi:monetdb://wired-142.cwi.nl:39763/
+# Listening for UNIX domain connection requests on 
mapi:monetdb:///var/tmp/mtest-22291/.s.monetdb.39763
+# MonetDB/GIS module loaded
+# SQL catalog created, loading sql scripts once
+# loading sql script: 09_like.sql
+# loading sql script: 10_math.sql
+# loading sql script: 11_times.sql
+# loading sql script: 12_url.sql
+# loading sql script: 13_date.sql
+# loading sql script: 14_inet.sql
+# loading sql script: 15_querylog.sql
+# loading sql script: 16_tracelog.sql
+# loading sql script: 17_temporal.sql
+# loading sql script: 18_index.sql
+# loading sql script: 20_vacuum.sql
+# loading sql script: 21_dependency_views.sql
+# loading sql script: 22_clients.sql
+# loading sql script: 23_skyserver.sql
+# loading sql script: 25_debug.sql
+# loading sql script: 26_sysmon.sql
+# loading sql script: 27_rejects.sql
+# loading sql script: 39_analytics.sql
+# loading sql script: 39_analytics_hge.sql
+# loading sql script: 40_geom.sql
+# loading sql script: 40_json.sql
+# loading sql script: 40_json_hge.sql
+# loading sql script: 41_md5sum.sql
+# loading sql script: 45_uuid.sql
+# loading sql script: 46_profiler.sql
+# loading sql script: 51_sys_schema_extension.sql
+# loading sql script: 60_wlcr.sql
+# loading sql script: 72_fits.sql
+# loading sql script: 74_netcdf.sql
+# loading sql script: 75_lidar.sql
_______________________________________________
checkin-list mailing list
[email protected]
https://www.monetdb.org/mailman/listinfo/checkin-list

Reply via email to