Changeset: 0d4c9879e55c for MonetDB
URL: http://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=0d4c9879e55c
Modified Files:
        clients/R/MonetDB.R/DESCRIPTION
        clients/R/MonetDB.R/NEWS
        clients/R/MonetDB.R/R/dbi.R
        clients/R/Tests/dbi.R
Branch: default
Log Message:

R Connector: Handling MONTH_INTERVAL type correctly


diffs (115 lines):

diff --git a/clients/R/MonetDB.R/DESCRIPTION b/clients/R/MonetDB.R/DESCRIPTION
--- a/clients/R/MonetDB.R/DESCRIPTION
+++ b/clients/R/MonetDB.R/DESCRIPTION
@@ -1,5 +1,5 @@
 Package: MonetDB.R
-Version: 0.9.7
+Version: 0.9.8
 Title: Connect MonetDB to R
 Authors@R: c(person("Hannes Muehleisen", role = c("aut", "cre"),email = 
"han...@cwi.nl"),
        person("Thomas Lumley", role = "ctb"),
diff --git a/clients/R/MonetDB.R/NEWS b/clients/R/MonetDB.R/NEWS
--- a/clients/R/MonetDB.R/NEWS
+++ b/clients/R/MonetDB.R/NEWS
@@ -1,3 +1,7 @@
+0.9.8
+- Added support for esoteric data types such as MONTH_INTERVAL (Thanks, Roman)
+- Cleaned up SQL to R type mapping (we had this twice)
+
 0.9.7
 - Fixed crash on Windows (Sorry, everyone)
 
diff --git a/clients/R/MonetDB.R/R/dbi.R b/clients/R/MonetDB.R/R/dbi.R
--- a/clients/R/MonetDB.R/R/dbi.R
+++ b/clients/R/MonetDB.R/R/dbi.R
@@ -438,25 +438,21 @@ setClass("MonetDBResult", representation
 .CT_BOOL <- 4L
 .CT_RAW <- 5L
 
+# type mapping matrix
+monetTypes <- rep(c("numeric", "character", "character", "logical", "raw"), 
c(9, 4, 8, 1, 1))
+names(monetTypes) <- c(c("TINYINT", "SMALLINT", "INT", "BIGINT", "HUGEINT", 
"REAL", "DOUBLE", "DECIMAL", "WRD"), 
+                       c("CHAR", "VARCHAR", "CLOB", "STR"), 
+                       c("INTERVAL", "DATE", "TIME", "TIMETZ", "TIMESTAMP", 
"TIMESTAMPTZ", "MONTH_INTERVAL", "SEC_INTERVAL"), 
+                       "BOOLEAN", 
+                       "BLOB")
+
 monetdbRtype <- function(dbType) {
   dbType <- toupper(dbType)
-  
-  if (dbType %in% c("TINYINT", "SMALLINT", "INT", "BIGINT", "HUGEINT", "REAL", 
"DOUBLE", "DECIMAL", "WRD")) {                  
-    return("numeric")
+  rtype <- monetTypes[dbType]
+  if (is.na(rtype)) {
+    stop("Unknown DB type ", dbType)
   }
-  if (dbType %in% c("CHAR", "VARCHAR", "CLOB", "STR")) {
-    return("character")                
-  }
-  if (dbType %in% c("INTERVAL", "DATE", "TIME", "TIMESTAMP")) {
-    return("date")     
-  }
-  if (dbType == "BOOLEAN") {
-    return("logical")                  
-  }
-  if (dbType == "BLOB") {
-    return("raw")
-  }
-  stop("Unknown DB type ", dbType)
+  rtype
 }
 
 setMethod("fetch", signature(res="MonetDBResult", n="numeric"), 
def=function(res, n, ...) {
@@ -499,10 +495,6 @@ setMethod("dbFetch", signature(res="Mone
       df[[i]] <- character()
       ct[i] <- .CT_CHR                 
     }
-    if (rtype=="date") {
-      df[[i]] <- character()
-      ct[i] <- .CT_CHRR                        
-    }
     if (rtype=="logical") {
       df[[i]] <- logical()
       ct[i] <- .CT_BOOL                        
@@ -597,17 +589,10 @@ setMethod("dbIsValid", signature(dbObj="
   return(invisible(TRUE))
 })
 
-monetTypes <- rep(c("numeric", "character", "character", "logical", "raw"), 
c(9, 3, 4, 1, 1))
-names(monetTypes) <- c(c("TINYINT", "SMALLINT", "INT", "BIGINT", "HUGEINT", 
"REAL", "DOUBLE", "DECIMAL", "WRD"), 
-                       c("CHAR", "VARCHAR", "CLOB"), 
-                       c("INTERVAL", "DATE", "TIME", "TIMESTAMP"), 
-                       "BOOLEAN", 
-                       "BLOB")
-
-
 setMethod("dbColumnInfo", "MonetDBResult", def = function(res, ...) {
   return(data.frame(field.name=res@env$info$names, 
field.type=res@env$info$types, 
-                    data.type=monetTypes[res@env$info$types])) 
+                    data.type=monetTypes[res@env$info$types], 
r.data.type=monetTypes[res@env$info$types], 
+                    monetdb.data.type=res@env$info$types))     
 }, 
 valueClass = "data.frame")
 
diff --git a/clients/R/Tests/dbi.R b/clients/R/Tests/dbi.R
--- a/clients/R/Tests/dbi.R
+++ b/clients/R/Tests/dbi.R
@@ -170,6 +170,9 @@ dbSendUpdate(conn, "INSERT INTO monetdbt
 stopifnot(identical("Роман Mühleisen", dbGetQuery(conn,"SELECT a FROM 
monetdbtest")$a[[1]]))
 dbRollback(conn)
 
+# this returns a column with esoteric type MONTH_INTERVAL
+stopifnot(identical(1L, as.integer(dbGetQuery(con, "select cast('2015-03-02' 
as date) - cast('2015-03-01' as date)")[[1]][[1]])))
+
 stopifnot(dbIsValid(conn))
 #thrice to catch null pointer errors
 stopifnot(identical(dbDisconnect(con),TRUE))
@@ -177,6 +180,8 @@ stopifnot(!dbIsValid(conn))
 stopifnot(identical(dbDisconnect(con),TRUE))
 stopifnot(identical(dbDisconnect(con),TRUE))
 
+
+
 #test merovingian control code
 #cannot really do this in Mtest, sorry
 #stopifnot(dbname %in% monetdbd.liststatus("monetdb")$dbname)
_______________________________________________
checkin-list mailing list
checkin-list@monetdb.org
https://www.monetdb.org/mailman/listinfo/checkin-list

Reply via email to