Browse code

cleaned and updated constructor function

qian authored on 25/09/2019 16:47:02
Showing 2 changed files

... ...
@@ -46,17 +46,20 @@ setOldClass(c("tbl_MySQLConnection", "tbl_SQLiteConnection",
46 46
 #' @import dbplyr
47 47
 #' @examples
48 48
 #' 
49
-#' ## constructor
49
+#' ## SQLDataFrame construction
50 50
 #' dbname <- system.file("extdata/test.db", package = "SQLDataFrame")
51 51
 #' conn <- DBI::dbConnect(DBI::dbDriver("SQLite"), dbname = dbname)
52 52
 #' obj <- SQLDataFrame(conn = conn, dbtable = "state",
53 53
 #'                     dbkey = "state")
54
-#' obj <- SQDataFrame(dbname = dbname, type = "SQLite",
55
-#'                    dbtable = "state", dbkey = "state") ## equivalent to above.
56 54
 #' obj1 <- SQLDataFrame(conn = conn, dbtable = "state",
57 55
 #'                      dbkey = c("region", "population"))
58 56
 #' obj1
59 57
 #'
58
+#' ### construction from database credentials
59
+#' obj2 <- SQLDataFrame(dbname = dbname, type = "SQLite",
60
+#'                      dbtable = "state", dbkey = "state")
61
+#' all.equal(obj, obj2)  ## [1] TRUE
62
+#' 
60 63
 #' ## slot accessors
61 64
 #' connSQLDataFrame(obj)
62 65
 #' dbtable(obj)
... ...
@@ -92,13 +95,11 @@ SQLDataFrame <- function(conn,
92 95
                          dbkey = character(0),
93 96
                          col.names = NULL
94 97
                          ){
95
-    ## check dbname, and backend connection
96
-    ## browser()
97
-    ## src <- src_dbi(con, auto_disconnect = TRUE)
98
-    ## on.exit(DBI::dbDisconnect(con))
99 98
 
100 99
     type <- match.arg(type)
101 100
     if (missing(conn)) {
101
+        ## FIXME: Error in .local(drv, ...) : Cannot allocate a new
102
+        ## connection: 16 connections already opened
102 103
         conn <- switch(type,
103 104
                        MySQL = DBI::dbConnect(dbDriver("MySQL"),
104 105
                                               host = host,
... ...
@@ -110,7 +111,8 @@ SQLDataFrame <- function(conn,
110 111
                        )
111 112
     } else {
112 113
         ifcred <- c(host = !missing(host), user = !missing(user),
113
-                    dbname = !missing(dbname), password = !missing(password))
114
+                    dbname = !missing(dbname), password = !missing(password),
115
+                    type = !missing(type))
114 116
         if (any(ifcred))
115 117
             message("These arguments are ignored: ",
116 118
                     paste(names(ifcred[ifcred]), collapse = ", "))
... ...
@@ -137,14 +139,6 @@ SQLDataFrame <- function(conn,
137 139
     }
138 140
     
139 141
     if (is(conn, "MySQLConnection")) {
140
-        ## local connection doesn't require passwd for creating
141
-        ## federated table, only need to build the connection.
142
-        
143
-        ## FIXME: remote connection sometimes don't require
144
-        ## password. Add a default password = NULL? Also need to check
145
-        ## if password = NULL, could the connection be constructed or
146
-        ## not?
147
-        ## if (missing(password)) stop("Please provided the \"password\" for database connection")
148 142
         .set_mysql_var(conn, password)
149 143
     }        
150 144
     
... ...
@@ -187,7 +181,6 @@ SQLDataFrame <- function(conn,
187 181
     
188 182
     ## concatKey
189 183
     concatKey <- tbl %>%
190
-        ## mutate(concatKey = paste(!!!syms(dbkey), sep="\b")) %>%
191 184
         mutate(concatKey = paste(!!!syms(dbkey), sep=":")) %>%
192 185
         pull(concatKey)
193 186
     
... ...
@@ -200,8 +193,6 @@ SQLDataFrame <- function(conn,
200 193
     )
201 194
 }
202 195
 
203
-## FIXME: use of "dbConnect" has limits??
204
-
205 196
 .validity_SQLDataFrame <- function(object)
206 197
 {
207 198
     idx <- object@indexes
... ...
@@ -231,18 +222,6 @@ setMethod("tblData", "SQLDataFrame", function(x)
231 222
     x@tblData
232 223
 })
233 224
 
234
-## setGeneric("dbname", signature = "x", function(x)
235
-##     standardGeneric("dbname"))
236
-
237
-## #' @rdname SQLDataFrame-class
238
-## #' @aliases dbname dbname,SQLDataFrame-method
239
-## #' @export
240
-
241
-## setMethod("dbname", "SQLDataFrame", function(x)
242
-## {
243
-##     tblData(x)$src$con@dbname
244
-## })
245
-
246 225
 setGeneric("dbtable", signature = "x", function(x)
247 226
     standardGeneric("dbtable"))
248 227
 
... ...
@@ -353,11 +332,9 @@ setMethod("ROWNAMES", "SQLDataFrame", function(x)
353 332
     if (length(key) == 1) {
354 333
         out <- x %>% filter(!!sym(key) %in% !!(concatKey[i]))
355 334
     } else {
356
-        ## x <- x %>% mutate(concatKeys = paste(!!!syms(key), sep="\b"))
357 335
         x <- x %>% mutate(concatKeys = paste(!!!syms(key), sep=":"))
358 336
         ## FIXME: possible to remove the ".0" trailing after numeric values?
359 337
         ## see: https://github.com/tidyverse/dplyr/issues/3230 (deliberate...)
360
-        ### keys <- x %>% pull(concatKeys)
361 338
         out <- x %>% filter(concatKeys %in% !!(concatKey[i])) %>% select(-concatKeys)
362 339
         ## returns "tbl_dbi" object, no realization. 
363 340
     }
... ...
@@ -108,17 +108,20 @@ A \code{SQLDataFrame} object.
108 108
 }
109 109
 \examples{
110 110
 
111
-## constructor
111
+## SQLDataFrame construction
112 112
 dbname <- system.file("extdata/test.db", package = "SQLDataFrame")
113 113
 conn <- DBI::dbConnect(DBI::dbDriver("SQLite"), dbname = dbname)
114 114
 obj <- SQLDataFrame(conn = conn, dbtable = "state",
115 115
                     dbkey = "state")
116
-obj <- SQDataFrame(dbname = dbname, type = "SQLite",
117
-                   dbtable = "state", dbkey = "state") ## equivalent to above.
118 116
 obj1 <- SQLDataFrame(conn = conn, dbtable = "state",
119 117
                      dbkey = c("region", "population"))
120 118
 obj1
121 119
 
120
+### construction from database credentials
121
+obj2 <- SQLDataFrame(dbname = dbname, type = "SQLite",
122
+                     dbtable = "state", dbkey = "state")
123
+all.equal(obj, obj2)  ## [1] TRUE
124
+
122 125
 ## slot accessors
123 126
 connSQLDataFrame(obj)
124 127
 dbtable(obj)