Changeset: 64236bddd072 for MonetDB
URL: http://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=64236bddd072
Added Files:
        monetdb5/extras/pyapi/Tests/pyapi00.stable.err
        monetdb5/extras/pyapi/Tests/pyapi00.stable.out
        monetdb5/extras/pyapi/Tests/pyapi02.malC
Modified Files:
        monetdb5/extras/pyapi/Tests/All
        monetdb5/extras/pyapi/pyapi.c
Branch: pyapi
Log Message:

Python API: More types


diffs (truncated from 424 to 300 lines):

diff --git a/monetdb5/extras/pyapi/Tests/All b/monetdb5/extras/pyapi/Tests/All
--- a/monetdb5/extras/pyapi/Tests/All
+++ b/monetdb5/extras/pyapi/Tests/All
@@ -1,1 +1,2 @@
 HAVE_LIBPY?pyapi00
+HAVE_LIBPY?pyapi02
diff --git a/monetdb5/extras/pyapi/Tests/pyapi00.stable.err 
b/monetdb5/extras/pyapi/Tests/pyapi00.stable.err
new file mode 100644
--- /dev/null
+++ b/monetdb5/extras/pyapi/Tests/pyapi00.stable.err
@@ -0,0 +1,38 @@
+stderr of test 'pyapi00` in directory 'monetdb5/extras/pyapi` itself:
+
+
+# 09:54:28 >  
+# 09:54:28 >  "mserver5" "--debug=10" "--set" "gdk_nr_threads=0" "--set" 
"mapi_open=true" "--set" "mapi_port=33990" "--set" 
"mapi_usock=/var/tmp/mtest-8422/.s.monetdb.33990" "--set" "monet_prompt=" 
"--forcemito" "--set" "mal_listing=2" 
"--dbpath=/Users/hannes/monetdb-install/var/MonetDB/mTests_monetdb5_extras_pyapi"
 "--set" "mal_listing=2" "--set" "embedded_r=true" "--set" "embedded_py=true"
+# 09:54:28 >  
+
+# builtin opt  gdk_dbpath = 
/Users/hannes/monetdb-install/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 = 33990
+# cmdline opt  mapi_usock = /var/tmp/mtest-8422/.s.monetdb.33990
+# cmdline opt  monet_prompt = 
+# cmdline opt  mal_listing = 2
+# cmdline opt  gdk_dbpath = 
/Users/hannes/monetdb-install/var/MonetDB/mTests_monetdb5_extras_pyapi
+# cmdline opt  mal_listing = 2
+# cmdline opt  embedded_r = true
+# cmdline opt  embedded_py = true
+# cmdline opt  gdk_debug = 536870922
+
+# 09:54:29 >  
+# 09:54:29 >  "mclient" "-lmal" "-ftest" "-Eutf-8" "-i" "-e" 
"--host=/var/tmp/mtest-8422" "--port=33990"
+# 09:54:29 >  
+
+
+# 09:54:29 >  
+# 09:54:29 >  "Done."
+# 09:54:29 >  
+
diff --git a/monetdb5/extras/pyapi/Tests/pyapi00.stable.out 
b/monetdb5/extras/pyapi/Tests/pyapi00.stable.out
new file mode 100644
--- /dev/null
+++ b/monetdb5/extras/pyapi/Tests/pyapi00.stable.out
@@ -0,0 +1,63 @@
+stdout of test 'pyapi00` in directory 'monetdb5/extras/pyapi` itself:
+
+
+# 09:54:28 >  
+# 09:54:28 >  "mserver5" "--debug=10" "--set" "gdk_nr_threads=0" "--set" 
"mapi_open=true" "--set" "mapi_port=33990" "--set" 
"mapi_usock=/var/tmp/mtest-8422/.s.monetdb.33990" "--set" "monet_prompt=" 
"--forcemito" "--set" "mal_listing=2" 
"--dbpath=/Users/hannes/monetdb-install/var/MonetDB/mTests_monetdb5_extras_pyapi"
 "--set" "mal_listing=2" "--set" "embedded_r=true" "--set" "embedded_py=true"
+# 09:54:28 >  
+
+# MonetDB 5 server v11.20.0
+# This is an unreleased version
+# Serving database 'mTests_monetdb5_extras_pyapi', using 4 threads
+# Compiled for x86_64-apple-darwin14.1.0/64bit with 64bit OIDs and 128bit 
integers dynamically linked
+# Found 16.000 GiB available main-memory.
+# Copyright (c) 1993-July 2008 CWI.
+# Copyright (c) August 2008-2015 MonetDB B.V., all rights reserved
+# Visit http://www.monetdb.org/ for further information
+# Listening for connection requests on mapi:monetdb://dakar.da.cwi.nl:33990/
+# Listening for UNIX domain connection requests on 
mapi:monetdb:///var/tmp/mtest-8422/.s.monetdb.33990
+# MonetDB/GIS module loaded
+# MonetDB/SQL module loaded
+# MonetDB/Python module loaded
+# MonetDB/R   module loaded
+
+Ready.
+
+# 10:48:46 >  
+# 10:48:46 >  "mclient" "-lmal" "-ftest" "-Eutf-8" "-i" "-e" 
"--host=/var/tmp/mtest-11109" "--port=36417"
+# 10:48:46 >  
+
+#io.print(b);
+#--------------------------#
+# h    t  # name
+# void int  # type
+#--------------------------#
+[ 0@0, 42      ]
+[ 1@0, 43      ]
+[ 2@0, 44      ]
+[ 3@0, 45      ]
+[ 4@0, 46      ]
+[ 5@0, 47      ]
+[ 6@0, 48      ]
+[ 7@0, 49      ]
+[ 8@0, 50      ]
+[ 9@0, 51      ]
+#io.print(r);
+#--------------------------#
+# h    t  # name
+# void int  # type
+#--------------------------#
+[ 0@0, 43      ]
+[ 1@0, 44      ]
+[ 2@0, 45      ]
+[ 3@0, 46      ]
+[ 4@0, 47      ]
+[ 5@0, 48      ]
+[ 6@0, 49      ]
+[ 7@0, 50      ]
+[ 8@0, 51      ]
+[ 9@0, 52      ]
+
+# 09:54:29 >  
+# 09:54:29 >  "Done."
+# 09:54:29 >  
+
diff --git a/monetdb5/extras/pyapi/Tests/pyapi02.malC 
b/monetdb5/extras/pyapi/Tests/pyapi02.malC
new file mode 100644
--- /dev/null
+++ b/monetdb5/extras/pyapi/Tests/pyapi02.malC
@@ -0,0 +1,128 @@
+# input types testing
+
+# inty types
+
+bbit:= bat.new(:oid,:bit);
+bat.append(bbit,1:bit);
+bat.append(bbit,0:bit);
+bat.append(bbit,1:bit);
+bat.append(bbit,0:bit);
+bat.append(bbit,nil:bit);
+rbit:bat[:oid,:dbl] := pyapi.eval(nil:ptr,"return([numpy.add(arg1,1)])",bbit);
+io.print(rbit);
+
+bbte:= bat.new(:oid,:bte);
+bat.append(bbte,42:bte);
+bat.append(bbte,84:bte);
+bat.append(bbte,254:bte);
+bat.append(bbte,0:bte);
+bat.append(bbte,nil:bte);
+rbte:bat[:oid,:dbl] := pyapi.eval(nil:ptr,"return([numpy.add(arg1,1)])",bbte);
+io.print(rbte);
+
+bsht:= bat.new(:oid,:sht);
+bat.append(bsht,42:sht);
+bat.append(bsht,82:sht);
+bat.append(bsht,0:sht);
+bat.append(bsht,3276:sht);
+bat.append(bsht,nil:sht);
+rsht:bat[:oid,:dbl] := pyapi.eval(nil:ptr,"return([numpy.add(arg1,1)])",bsht);
+io.print(rsht);
+
+bint:= bat.new(:oid,:int);
+bat.append(bint,1804289383:int);
+bat.append(bint,846930886:int);
+bat.append(bint,1681692777:int);
+bat.append(bint,1714636915:int);
+bat.append(bint,nil:int);
+rint:bat[:oid,:dbl] := pyapi.eval(nil:ptr,"return([numpy.add(arg1,1)])",bint);
+io.print(rint);
+
+bwrd:= bat.new(:oid,:wrd);
+bat.append(bwrd,1804289383:wrd);
+bat.append(bwrd,846930886:wrd);
+bat.append(bwrd,1681692777:wrd);
+bat.append(bwrd,1714636915:wrd);
+rwrd:bat[:oid,:dbl] := pyapi.eval(nil:ptr,"return([numpy.add(arg1,1)])",bwrd);
+io.print(rwrd);
+
+blng:= bat.new(:oid,:lng);
+bat.append(blng,1804289383L);
+bat.append(blng,846930886L);
+bat.append(blng,1681692777L);
+bat.append(blng,1714636915L);
+rlng:bat[:oid,:dbl] := pyapi.eval(nil:ptr,"return([numpy.add(arg1,1)])",blng);
+io.print(rlng);
+
+# not sure what to with hge, numpy only supports 128 bits when sizeof(long)=16
+# bhge:= bat.new(:oid,:hge);
+# bat.append(bhge,1804289383:hge);
+# bat.append(bhge,846930886:hge);
+# bat.append(bhge,1681692777:hge);
+# bat.append(bhge,1714636915:hge);
+# rhge:bat[:oid,:dbl] := 
pyapi.eval(nil:ptr,"return([numpy.add(arg1,1)])",bhge);
+# io.print(rhge);
+
+# floating point
+
+bflt:= bat.new(:oid,:flt);
+bat.append(bflt,18042.89383:flt);
+bat.append(bflt,846.930886:flt);
+bat.append(bflt,16.81692777:flt);
+bat.append(bflt,1714636.915:flt);
+rflt:bat[:oid,:dbl] := pyapi.eval(nil:ptr,"return([numpy.add(arg1,1)])",bflt);
+io.print(rflt);
+
+bdbl:= bat.new(:oid,:dbl);
+bat.append(bdbl,180428.9383:dbl);
+bat.append(bdbl,84.6930886:dbl);
+bat.append(bdbl,168169.2777:dbl);
+bat.append(bdbl,17146369.15:dbl);
+bat.append(bdbl,nil:dbl);
+rdbl:bat[:oid,:dbl] := pyapi.eval(nil:ptr,"return([numpy.add(arg1,1)])",bdbl);
+io.print(rdbl);
+
+# strings
+
+bstr:= bat.new(:oid,:str);
+bat.append(bstr,"asdf":str);
+bat.append(bstr,"sd asd asd asd asd a":str);
+bat.append(bstr,"":str);
+bat.append(bstr,nil:str);
+rstr:bat[:oid,:int] := rapi.eval(nil:ptr,"unlist(lapply(arg1,nchar))",bstr);
+io.print(rstr);
+
+
+
+# output types testing
+
+binto:= bat.new(:oid,:int);
+bat.append(binto,1804289383:int);
+bat.append(binto,846930886:int);
+bat.append(binto,1681692777:int);
+bat.append(binto,1714636915:int);
+bat.append(binto,nil:int);
+
+rintbi:bat[:oid,:int] := rapi.eval(nil:ptr,"arg1",binto);
+io.print(rintbi);
+
+rintbi2:bat[:oid,:int] := rapi.eval(nil:ptr,"as.integer(arg1)",binto);
+io.print(rintbi2);
+
+rintbl:bat[:oid,:lng] := rapi.eval(nil:ptr,"as.integer(arg1)",binto);
+io.print(rintbl);
+
+rintbh:bat[:oid,:hge] := rapi.eval(nil:ptr,"as.integer(arg1)",binto);
+io.print(rintbh);
+
+rintbd:bat[:oid,:dbl] := rapi.eval(nil:ptr,"as.numeric(arg1)",binto);
+io.print(rintbd);
+
+rintbs:bat[:oid,:str] := rapi.eval(nil:ptr,"as.character(arg1)",binto);
+io.print(rintbs);
+
+# factors should be strings
+rintbf:bat[:oid,:str] := rapi.eval(nil:ptr,"as.factor(arg1)",binto);
+io.print(rintbf);
+
+
diff --git a/monetdb5/extras/pyapi/pyapi.c b/monetdb5/extras/pyapi/pyapi.c
--- a/monetdb5/extras/pyapi/pyapi.c
+++ b/monetdb5/extras/pyapi/pyapi.c
@@ -34,11 +34,31 @@ int PyAPIEnabled(void) {
 }
 
 // TODO: exclude pyapi from mergetable, too
+// TODO: add to SQL layer
 // TODO: can we call the Python interpreter in a multi-thread environment?
 static MT_Lock pyapiLock;
 static int pyapiInitialized = FALSE;
 
 
+#define BAT_TO_NP(bat, mtpe, nptpe)                                   \
+               PyArray_New(&PyArray_Type, 1, (npy_intp[1]) {BATcount(bat)},  \
+        nptpe, NULL, (mtpe*) Tloc(bat, BUNfirst(bat)), 0,             \
+               NPY_ARRAY_CARRAY || !NPY_ARRAY_WRITEABLE, NULL);
+
+#define NP_TO_BAT(bat, mtpe, nptpe) {                                 \
+               PyArrayObject* pCol = (PyArrayObject*) PyArray_FromAny(pColO, \
+                       PyArray_DescrFromType(nptpe), 1, 1, NPY_ARRAY_CARRAY |  
  \
+                       NPY_ARRAY_FORCECAST, NULL);                             
  \
+               size_t cnt = PyArray_DIMS(pCol)[0], j;                        \
+               bat = BATnew(TYPE_void, TYPE_##mtpe, cnt, TRANSIENT);         \
+               BATseqbase(bat, 0); bat->T->nil = 0; bat->T->nonil = 1;       \
+               bat->tkey = 0; bat->tsorted = 0; bat->trevsorted = 0;         \
+               for (j =0; j < cnt; j++) {                                    \
+                       ((mtpe*) Tloc(bat, BUNfirst(bat)))[j] =                 
  \
+                                       *(mtpe*) PyArray_GETPTR1(pCol, j); }    
          \
+               BATsetcount(bat, cnt); }
+
+
 #define _PYAPI_DEBUG_
 
 str PyAPIeval(MalBlkPtr mb, MalStkPtr stk, InstrPtr pci, bit grouped);
@@ -76,6 +96,8 @@ str PyAPIeval(MalBlkPtr mb, MalStkPtr st
        node * argnode;
        int seengrp = FALSE;
        PyObject *pArgs, *pResult; // this is going to be the parameter tuple
+       PyThreadState* tstate;
+
 
        if (!PyAPIEnabled()) {
                throw(MAL, "pyapi.eval",
@@ -95,8 +117,9 @@ str PyAPIeval(MalBlkPtr mb, MalStkPtr st
                // TODO: free args and rcall
        }
 
-       // TODO: do we need this lock for Python as well?
-       MT_lock_set(&pyapiLock, "pyapi.evaluate");
_______________________________________________
checkin-list mailing list
checkin-list@monetdb.org
https://www.monetdb.org/mailman/listinfo/checkin-list

Reply via email to