Improved HTTP request filtering and response error handling.
authorFuad Muhic <fmuhic@capeannenterprises.com>
Thu, 30 Nov 2017 15:53:12 +0000 (16:53 +0100)
committerFuad Muhic <fmuhic@capeannenterprises.com>
Thu, 30 Nov 2017 15:53:12 +0000 (16:53 +0100)
Arvados-DCO-1.1-Signed-off-by: Fuad Muhic <fmuhic@capeannenterprises.com>

.gitignore
sdk/R/.RData
sdk/R/R/Arvados.R
sdk/R/R/HttpParser.R
sdk/R/R/HttpRequest.R

index 0e876bb6f4d430eea2a79bbe34b0ee3f37c8a6fc..cbebe67bc03d5e4280f9a46cf72e41060ac4d7dc 100644 (file)
@@ -28,3 +28,4 @@ services/api/config/arvados-clients.yml
 *#*
 .DS_Store
 .vscode
+.Rproj.user
index 167f8c3fa0708d64359665cf01ef66be443aae54..13255a2b4738b05a98f32117ea346ef0bf3c02e8 100644 (file)
Binary files a/sdk/R/.RData and b/sdk/R/.RData differ
index b44e105af7ce711bb7629b94f22a2e52dd51e53a..204d87e4e1b816739bcf89e2c21b5c985ac7876e 100644 (file)
@@ -44,6 +44,10 @@ Arvados$methods(
 
         httpParser <- HttpParser()
         collection <- httpParser$parseCollectionGet(server_response)
+
+        if(!is.null(collection$errors))
+            stop(collection$errors)       
+
         class(collection) <- "ArvadosCollection"
 
         return(collection)
@@ -62,11 +66,15 @@ Arvados$methods(
     {
         #Todo(Fudo): Implement limit and offset
         collection_relative_url <- "collections"
-        http_request <- HttpRequest("GET", token, host, collection_relative_url, filters) 
+        http_request <- HttpRequest("GET", token, host, collection_relative_url, filters, limit, offset
         server_response <- http_request$execute()
 
         httpParser <- HttpParser()
         collection <- httpParser$parseCollectionGet(server_response)
+
+        if(!is.null(collection$errors))
+            stop(collection$errors)       
+
         class(collection) <- "ArvadosCollectionList"
 
         return(collection)
index c685fb51a8872cf05e33519772d9a9380989ee4f..09304fc59928c4dcd469f37dbf1795d9ca3c8444 100644 (file)
@@ -14,10 +14,6 @@ HttpParser <- setRefClass(
 
         parseCollectionGet = function(server_response) 
         {
-            #Todo(Fudo): Implement proper server code checking
-            #if(server_response$response_code != 200)
-                #stop("Error");
-
             parsed_response <- httr::content(server_response, as = "parsed", type = "application/json")
 
             #Todo(Fudo): Create new Collection object and populate it
index 3076eedf9adfe899712c29527413cb53fccdbad7..96f0a83f2132fd8682f1eb03dfbb2b5db6a5ea0c 100644 (file)
@@ -87,28 +87,67 @@ HttpRequest <- setRefClass(
 
         generateQuery = function() 
         {
-            finalQuery <- ""
+            #Todo(Fudo): This function is a mess, refactor it
+            finalQuery <- "?alt=json"
 
             if(!is.null(query_filters))
             {
                 filters <- sapply(query_filters, function(filter)
                 {
-                    filter <- sapply(filter, function(component) 
-                    {
+                    if(length(filter) != 3)
+                        stop("Filter list must have exacthey 3 elements.")
+
+                    attributeAndOperator = filter[c(1, 2)]
+                    filterList = filter[[3]]
+                    filterListIsPrimitive = TRUE
+                    if(length(filterList) > 1)
+                        filterListIsPrimitive = FALSE
+
+                    attributeAndOperator <- sapply(attributeAndOperator, function(component) {
                         component <- paste0("\"", component, "\"")
                     })
-                    
+
+                    filterList <- sapply(unlist(filterList), function(filter) {
+                        filter <- paste0("\"", filter, "\"")
+                    })
+
+                    filterList <- paste(filterList, collapse = ",+")
+
+                    if(!filterListIsPrimitive)
+                        filterList <- paste0("[", filterList, "]")
+
+                    filter <- c(attributeAndOperator, filterList)
+
                     queryParameter <- paste(filter, collapse = ",+")
-                    queryParameter <- paste0("[[", queryParameter, "]]")
+                    queryParameter <- paste0("[", queryParameter, "]")
+        
                 })
 
+                filters <- paste(filters, collapse = ",+")
+                filters <- paste0("[", filters, "]")
+
                 encodedQuery <- URLencode(filters, reserved = T, repeated = T)
 
-                #Todo(Fudo): Hardcoded for now. Look for a better solution.
-                finalQuery <- paste0("?alt=json&filters=", encodedQuery)
+                finalQuery <- paste0(finalQuery, "&filters=", encodedQuery)
 
                 #Todo(Fudo): This is a hack for now. Find a proper solution.
-                finalQuery <- str_replace_all(finalQuery, "%2B", "+")
+                finalQuery <- stringr::str_replace_all(finalQuery, "%2B", "+")
+            }
+
+            if(!is.null(response_limit))
+            {
+                if(!is.numeric(response_limit))
+                    stop("Limit must be a numeric type.")
+                
+                finalQuery <- paste0(finalQuery, "&limit=", response_limit)
+            }
+
+            if(!is.null(query_offset))
+            {
+                if(!is.numeric(query_offset))
+                    stop("Offset must be a numeric type.")
+                
+                finalQuery <- paste0(finalQuery, "&offset=", query_offset)
             }
 
             finalQuery