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
[email protected]
https://www.monetdb.org/mailman/listinfo/checkin-list