From 240371638ed658a6b1bb0fd3c48305683b1a116b Mon Sep 17 00:00:00 2001
From: Jordan S Read <jread@usgs.gov>
Date: Tue, 17 Nov 2015 11:01:34 -0600
Subject: [PATCH] using a shared query builder function

---
 R/constructNWISURL.r                     | 12 ++++----
 R/setAccess.R                            | 35 ++++++++++++++++++------
 R/whatNWISData.r                         |  2 +-
 R/whatNWISsites.R                        |  7 ++---
 tests/testthat/tests_userFriendly_fxns.R |  2 +-
 5 files changed, 37 insertions(+), 21 deletions(-)

diff --git a/R/constructNWISURL.r b/R/constructNWISURL.r
index 30df1d4b..c20ce648 100644
--- a/R/constructNWISURL.r
+++ b/R/constructNWISURL.r
@@ -171,29 +171,29 @@ constructNWISURL <- function(siteNumber,parameterCd="00060",startDate="",endDate
             }
           )
 
-          url <- drURL(service, paste0("&site=",siteNumber, "&format=", formatURL))
+          url <- drURL(service, Access=pkg.env$access, site=siteNumber, format=formatURL)
           
           if("gwlevels"!= service){
-            url <- paste0(url, "&ParameterCd=",parameterCd)
+            url <- appendDrURL(url, ParameterCd=parameterCd)
           }
           
           if("dv"==service) {
             if(length(statCd) > 1){
               statCd <- paste(statCd, collapse=",")
             }            
-            url <- paste0(url, "&StatCd=", statCd)
+            url <- appendDrURL(url, StatCd=statCd)
           }
           
           if (nzchar(startDate)) {
-            url <- paste0(url,"&startDT=",startDate)
+            url <- appendDrURL(url, startDT=startDate)
           } else {
             startorgin <- "1851-01-01"
             if ("iv" == service) startorgin <- "1900-01-01"            
-            url <- paste0(url,"&startDT=",startorgin)
+            url <- appendDrURL(url, startDT=startorgin)
           }
           
           if (nzchar(endDate)) {
-            url <- paste0(url,"&endDT=",endDate)
+            url <- appendDrURL(url, endDT=endDate)
           }
         }
          
diff --git a/R/setAccess.R b/R/setAccess.R
index b9b5041e..2e4bb7e2 100644
--- a/R/setAccess.R
+++ b/R/setAccess.R
@@ -22,19 +22,38 @@ setAccess = function(access="public"){
   access = match.arg(access, c('public','internal'))
   
   if(access=="internal"){
-    access.param = '?Access=3'
+    pkg.env$access = '3'
     message('setting access to internal')
   }else {
-    access.param = '?Access=0'
+    pkg.env$access = '0'
+    message('setting access to public')
   }
   
-  pkg.env$waterservices = paste0("http://waterservices.usgs.gov/nwis/site/", access.param)
-  pkg.env$iv =  paste0("http://nwis.waterservices.usgs.gov/nwis/iv/", access.param)
-  pkg.env$dv =  paste0("http://waterservices.usgs.gov/nwis/dv/", access.param)
-  pkg.env$gwlevels = paste0("http://waterservices.usgs.gov/nwis/gwlevels/", access.param)
+  pkg.env$waterservices = "http://waterservices.usgs.gov/nwis/site/"
+  pkg.env$iv = "http://nwis.waterservices.usgs.gov/nwis/iv/"
+  pkg.env$dv =  "http://waterservices.usgs.gov/nwis/dv/"
+  pkg.env$gwlevels = "http://waterservices.usgs.gov/nwis/gwlevels/"
   
 }
 
-drURL = function(base.name, params){
-  return(paste0(pkg.env[[base.name]], params))
+drURL <- function(base.name, ..., arg.list=NULL){
+  
+  
+  queryString <- drQueryArgs(..., arg.list=arg.list)
+  #to do: add something to check for redundant params
+  
+  return(paste0(pkg.env[[base.name]], '?', queryString))
+}
+
+drQueryArgs <- function(..., arg.list){
+  args <- append(expand.grid(..., stringsAsFactors = FALSE), arg.list)
+  # get the args into name=value strings
+  keyValues <- paste0(names(args),unname(lapply(args, function(x) paste0('=',x[[1]]))))
+  return(paste(keyValues, collapse='&'))
+}
+
+appendDrURL <- function(url, ..., arg.list=NULL){
+  
+  queryString <- drQueryArgs(..., arg.list=arg.list)
+  return(paste0(url, "&", queryString))
 }
\ No newline at end of file
diff --git a/R/whatNWISData.r b/R/whatNWISData.r
index 38bce2ca..50067b22 100644
--- a/R/whatNWISData.r
+++ b/R/whatNWISData.r
@@ -87,7 +87,7 @@ whatNWISdata <- function(siteNumbers,service="all",parameterCd="all",statCd="all
     }
   }
   
-  urlSitefile <- paste(drURL('waterservices', '&format=rdb&seriesCatalogOutput=true&sites='),siteNumber,sep = "")
+  urlSitefile <- drURL('waterservices', Access=pkg.env$access, format='rdb', seriesCatalogOutput='true',sites=paste(siteNumber))
  
   SiteFile <- importRDB1(urlSitefile, asDateTime = FALSE)
   
diff --git a/R/whatNWISsites.R b/R/whatNWISsites.R
index 4ad9d93d..c7b864ae 100644
--- a/R/whatNWISsites.R
+++ b/R/whatNWISsites.R
@@ -35,14 +35,11 @@ whatNWISsites <- function(...){
   matchReturn <- list(...)
   values <- sapply(matchReturn, function(x) URLencode(as.character(paste(eval(x),collapse=",",sep=""))))
   
-  urlCall <- paste(paste(names(values),values,sep="="),collapse="&")
-  
   names(values)[names(values) == "siteNumber"] <- "sites"
   names(values)[names(values) == "siteNumbers"] <- "sites"
   
-  baseURL <- drURL('waterservices',"&format=mapper&")
-  urlCall <- paste(baseURL,
-                   urlCall,sep = "")
+  urlCall <- drURL('waterservices',Access=pkg.env$access, format="mapper", arg.list = values)
+
 
   rawData <- getWebServiceData(urlCall)
 
diff --git a/tests/testthat/tests_userFriendly_fxns.R b/tests/testthat/tests_userFriendly_fxns.R
index b03dba89..87803e3d 100644
--- a/tests/testthat/tests_userFriendly_fxns.R
+++ b/tests/testthat/tests_userFriendly_fxns.R
@@ -19,7 +19,7 @@ test_that("Unit value data returns correct types", {
   expect_is(rawData$dateTime, 'POSIXct')
   expect_is(rawData$Flow_Inst, 'numeric')
   expect_that(attr(rawData, "url"), equals(
-      "http://nwis.waterservices.usgs.gov/nwis/iv/?Access=1&site=05114000&format=waterml,1.1&ParameterCd=00060&startDT=2014-10-10&endDT=2014-10-10")
+      "http://nwis.waterservices.usgs.gov/nwis/iv/?Access=0&site=05114000&format=waterml,1.1&ParameterCd=00060&startDT=2014-10-10&endDT=2014-10-10")
   )
 #   #First switchover to standard time:
 #   expect_that(as.numeric(timeZoneChange[which(timeZoneChange$tz_cd == "America/Chicago")[1],"dateTime"]),
-- 
GitLab