Changeset: 44f60b6aeeb5 for MonetDB
URL: http://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=44f60b6aeeb5
Added Files:
        sql/backends/monet5/Tests/rapi06.stable.err
        sql/backends/monet5/Tests/rapi06.stable.out
Modified Files:
        monetdb5/extras/rapi/rapi.c
        monetdb5/extras/rapi/rapi.h
        monetdb5/extras/rapi/rapi.mal
        sql/backends/monet5/Tests/All
        sql/backends/monet5/Tests/rapi06.sql
        sql/backends/monet5/sql_gencode.c
Branch: RIntegration
Log Message:

R Integration: Grouped and non-grouped aggregates work (Thanks, Niels!)


diffs (truncated from 311 to 300 lines):

diff --git a/monetdb5/extras/rapi/rapi.c b/monetdb5/extras/rapi/rapi.c
--- a/monetdb5/extras/rapi/rapi.c
+++ b/monetdb5/extras/rapi/rapi.c
@@ -169,6 +169,7 @@ static int RAPIinitialize(void) {
                Rp->R_Interactive = FALSE;
                Rp->R_Verbose = FALSE;
                Rp->LoadSiteFile = FALSE;
+               Rp->LoadInitFile = FALSE;
                Rp->RestoreAction = SA_NORESTORE;
                Rp->SaveAction = SA_NOSAVE;
                Rp->NoRenviron = TRUE;
@@ -238,22 +239,6 @@ static int RAPIinitialize(void) {
        return 0;
 }
 
-str RAPIparser(int *ret, str *rcall) {
-       ParseStatus status;
-       str msg = NULL;
-
-       if (!RAPIEnabled()) {
-               throw(MAL, "rapi.eval", "Embedded R has not been enabled. Start 
server with --set %s=true",rapi_enableflag);
-       }
-
-       (void) ret;
-       (void) R_ParseVector(mkString(*rcall), INT_MAX, &status, R_NilValue);
-       if (status != PARSE_OK)
-               msg = createException(MAL, "rapi.eval", "%s", *rcall);
-       free(*rcall); // why free here? This is someone else's job, no?
-       return msg;
-}
-
 str RAPIeval(Client cntxt, MalBlkPtr mb, MalStkPtr stk, InstrPtr pci) {
        str exprStr = *(str*) getArgReference(stk, pci, pci->retc);
        SEXP x, env, retval;
@@ -435,13 +420,6 @@ str RAPIeval(Client cntxt, MalBlkPtr mb,
                int *ret = (int *) getArgReference(stk, pci, i);
                cnt = (BUN) ret_rows;
 
-               // check if MAL return type is indeed a BAT
-               if (!isaBatType(getArgType(mb,pci,i))) {
-                       msg = createException(MAL, "rapi.eval",
-                                       "I only like BAT return types");
-                       goto wrapup;
-               }
-
                // hand over the vector into a BAT
                switch (bat_type) {
                case TYPE_int: {
@@ -536,10 +514,16 @@ str RAPIeval(Client cntxt, MalBlkPtr mb,
                                        bat_type);
                        goto wrapup;
                }
+               BATsetcount(b, cnt);
 
-               BATsetcount(b, cnt);
-               *ret = b->batCacheid;
-               BBPkeepref(b->batCacheid);
+               // bat return
+               if (isaBatType(getArgType(mb,pci,i))) {
+                       *ret = b->batCacheid;
+                       BBPkeepref(b->batCacheid);
+               }
+               else { // single value return, only for non-grouped aggregations
+                       VALinit(getArgReference(stk, pci,i), bat_type,Tloc(b, 
BUNfirst(b)));
+               }
                msg = MAL_SUCCEED;
        }
        /* unprotect environment, so it will be eaten by the GC. */
diff --git a/monetdb5/extras/rapi/rapi.h b/monetdb5/extras/rapi/rapi.h
--- a/monetdb5/extras/rapi/rapi.h
+++ b/monetdb5/extras/rapi/rapi.h
@@ -38,7 +38,6 @@
 #define rapi_export extern
 #endif
 
-rapi_export str RAPIparser(int *ret, str *rcall);
 rapi_export str RAPIeval(Client cntxt, MalBlkPtr mb, MalStkPtr stk,
                InstrPtr pci);
 
diff --git a/monetdb5/extras/rapi/rapi.mal b/monetdb5/extras/rapi/rapi.mal
--- a/monetdb5/extras/rapi/rapi.mal
+++ b/monetdb5/extras/rapi/rapi.mal
@@ -17,9 +17,6 @@
 
 module rapi;
 
-command parser(expr:str):bit
-address RAPIparser;
-
 pattern eval(expr:str):any
 address RAPIeval
 comment "Execute a simple R script returning a single value";
@@ -30,12 +27,28 @@ address RAPIeval
 comment "Execute a simple R script value";
 
 #grouped things
-pattern subeval(expr:str,arg:any...):any...
+pattern subeval_aggr(expr:str,arg:any...):any...
 address RAPIeval
 comment "grouped aggregates through R";
 
-# sql compiler needs this function for bat-wise operations
+pattern eval_aggr(expr:str,arg:any...):any...
+address RAPIeval
+comment "grouped aggregates through R";
+
+# sql compiler needs these functions for bat-wise operations
 module batrapi;
+
 pattern eval(expr:str,arg:any...):any...
 address RAPIeval
 comment "Execute a simple R script value";
+
+pattern subeval_aggr(expr:str,arg:any...):any...
+address RAPIeval
+comment "Execute a simple R script value";
+
+pattern eval_aggr(expr:str,arg:any...):any...
+address RAPIeval
+comment "grouped aggregates through R";
+
+#  rapi.subeval_aggr(_15:bat[:oid,:int], _9:bat[:oid,:oid], 
r1_9:bat[:oid,:oid], _17:bit)
+
diff --git a/sql/backends/monet5/Tests/All b/sql/backends/monet5/Tests/All
--- a/sql/backends/monet5/Tests/All
+++ b/sql/backends/monet5/Tests/All
@@ -6,7 +6,7 @@ HAVE_LIBR?rapi02
 HAVE_LIBR?rapi03
 HAVE_LIBR?rapi04
 HAVE_LIBR?rapi05
-
+HAVE_LIBR?rapi06
 
 #inlineR disabled, we have better R tests
 inlineUDF
diff --git a/sql/backends/monet5/Tests/rapi06.sql 
b/sql/backends/monet5/Tests/rapi06.sql
--- a/sql/backends/monet5/Tests/rapi06.sql
+++ b/sql/backends/monet5/Tests/rapi06.sql
@@ -3,8 +3,13 @@ START TRANSACTION;
 CREATE TABLE rval(groupcol integer,datacol integer);
 INSERT INTO rval VALUES (1,42), (1,84), (2,42), (2,21);
 
-CREATE AGGREGATE aggrmedian(arg0 integer) RETURNS double LANGUAGE R {
-       return(aggregate(arg0, by=list(groups), FUN=median))
+CREATE AGGREGATE aggrmedian(arg1 integer) RETURNS double LANGUAGE R {
+       if (exists("arg2")) {
+               return(aggregate(arg1, by=list(arg2), FUN=median)$x)
+       } else {
+               return(median(arg1))
+       }
+
 };
 
 SELECT groupcol,aggrmedian(datacol) FROM rval GROUP BY groupcol;
@@ -13,4 +18,4 @@ SELECT aggrmedian(datacol) FROM rval;
 DROP AGGREGATE aggrmedian;
 DROP TABLE rval;
 
-ROLLBACK;
\ No newline at end of file
+ROLLBACK;
diff --git a/sql/backends/monet5/Tests/rapi06.stable.err 
b/sql/backends/monet5/Tests/rapi06.stable.err
new file mode 100644
--- /dev/null
+++ b/sql/backends/monet5/Tests/rapi06.stable.err
@@ -0,0 +1,36 @@
+stderr of test 'rapi06` in directory 'sql/backends/monet5` itself:
+
+
+# 16:43:00 >  
+# 16:43:00 >  "mserver5" "--debug=10" "--set" "gdk_nr_threads=0" "--set" 
"mapi_open=true" "--set" "mapi_port=31453" "--set" 
"mapi_usock=/var/tmp/mtest-25899/.s.monetdb.31453" "--set" "monet_prompt=" 
"--forcemito" "--set" "mal_listing=2" 
"--dbpath=/export/scratch2/hannes/monetdb-rint-install/var/MonetDB/mTests_sql_backends_monet5"
 "--set" "mal_listing=0" "--set" "embedded_r=yes"
+# 16:43:00 >  
+
+# builtin opt  gdk_dbpath = 
/export/scratch2/hannes/monetdb-rint-install/var/monetdb5/dbfarm/demo
+# builtin opt  gdk_debug = 0
+# builtin opt  gdk_vmtrim = yes
+# 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 = 31453
+# cmdline opt  mapi_usock = /var/tmp/mtest-25899/.s.monetdb.31453
+# cmdline opt  monet_prompt = 
+# cmdline opt  mal_listing = 2
+# cmdline opt  gdk_dbpath = 
/export/scratch2/hannes/monetdb-rint-install/var/MonetDB/mTests_sql_backends_monet5
+# cmdline opt  mal_listing = 0
+# cmdline opt  embedded_r = yes
+
+# 16:43:00 >  
+# 16:43:00 >  "mclient" "-lsql" "-ftest" "-Eutf-8" "-i" "-e" 
"--host=/var/tmp/mtest-25899" "--port=31453"
+# 16:43:00 >  
+
+
+# 16:43:01 >  
+# 16:43:01 >  "Done."
+# 16:43:01 >  
+
diff --git a/sql/backends/monet5/Tests/rapi06.stable.out 
b/sql/backends/monet5/Tests/rapi06.stable.out
new file mode 100644
--- /dev/null
+++ b/sql/backends/monet5/Tests/rapi06.stable.out
@@ -0,0 +1,86 @@
+stdout of test 'rapi06` in directory 'sql/backends/monet5` itself:
+
+
+# 16:43:00 >  
+# 16:43:00 >  "mserver5" "--debug=10" "--set" "gdk_nr_threads=0" "--set" 
"mapi_open=true" "--set" "mapi_port=31453" "--set" 
"mapi_usock=/var/tmp/mtest-25899/.s.monetdb.31453" "--set" "monet_prompt=" 
"--forcemito" "--set" "mal_listing=2" 
"--dbpath=/export/scratch2/hannes/monetdb-rint-install/var/MonetDB/mTests_sql_backends_monet5"
 "--set" "mal_listing=0" "--set" "embedded_r=yes"
+# 16:43:00 >  
+
+# MonetDB 5 server v11.17.2
+# This is an unreleased version
+# Serving database 'mTests_sql_backends_monet5', using 8 threads
+# Compiled for x86_64-unknown-linux-gnu/64bit with 64bit OIDs dynamically 
linked
+# Found 15.591 GiB available main-memory.
+# Copyright (c) 1993-July 2008 CWI.
+# Copyright (c) August 2008-2014 MonetDB B.V., all rights reserved
+# Visit http://www.monetdb.org/ for further information
+# Listening for connection requests on mapi:monetdb://bristol.ins.cwi.nl:31453/
+# Listening for UNIX domain connection requests on 
mapi:monetdb:///var/tmp/mtest-25899/.s.monetdb.31453
+# MonetDB/GIS module loaded
+# MonetDB/JAQL module loaded
+# MonetDB/SQL module loaded
+
+Ready.
+# 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_compress.sql
+# loading sql script: 18_dictionary.sql
+# loading sql script: 19_cluster.sql
+# loading sql script: 20_vacuum.sql
+# loading sql script: 21_dependency_functions.sql
+# loading sql script: 22_clients.sql
+# loading sql script: 23_skyserver.sql
+# loading sql script: 24_zorder.sql
+# loading sql script: 25_debug.sql
+# loading sql script: 26_sysmon.sql
+# loading sql script: 39_analytics.sql
+# loading sql script: 40_geom.sql
+# loading sql script: 46_gsl.sql
+# loading sql script: 75_storagemodel.sql
+# loading sql script: 80_statistics.sql
+# loading sql script: 80_udf.sql
+# loading sql script: 99_system.sql
+
+# 16:43:00 >  
+# 16:43:00 >  "mclient" "-lsql" "-ftest" "-Eutf-8" "-i" "-e" 
"--host=/var/tmp/mtest-25899" "--port=31453"
+# 16:43:00 >  
+
+#START TRANSACTION;
+#CREATE TABLE rval(groupcol integer,datacol integer);
+#INSERT INTO rval VALUES (1,42), (1,84), (2,42), (2,21);
+[ 4    ]
+#CREATE AGGREGATE aggrmedian(arg1 integer) RETURNS double LANGUAGE R {
+#      if (exists("arg2")) {
+#              return(aggregate(arg1, by=list(arg2), FUN=median)$x)
+#      } else {
+#              return(median(arg1))
+#      }
+#
+#};
+#SELECT groupcol,aggrmedian(datacol) FROM rval GROUP BY groupcol;
+% sys.rval,    sys.L1 # table_name
+% groupcol,    L1 # name
+% int, double # type
+% 1,   24 # length
+[ 1,   63      ]
+[ 2,   31.5    ]
+#SELECT aggrmedian(datacol) FROM rval;
+% sys.L1 # table_name
+% L1 # name
+% double # type
+% 24 # length
+[ 42   ]
+#DROP AGGREGATE aggrmedian;
+#DROP TABLE rval;
+#ROLLBACK;
+
+# 16:43:01 >  
+# 16:43:01 >  "Done."
+# 16:43:01 >  
+
diff --git a/sql/backends/monet5/sql_gencode.c 
b/sql/backends/monet5/sql_gencode.c
--- a/sql/backends/monet5/sql_gencode.c
+++ b/sql/backends/monet5/sql_gencode.c
@@ -1781,8 +1781,13 @@ static int
                                        setVarUDFtype(mb, getArg(q, 0));
                                }
                        }
_______________________________________________
checkin-list mailing list
checkin-list@monetdb.org
https://www.monetdb.org/mailman/listinfo/checkin-list

Reply via email to