From e626d2d937f387353d83e9be51dc859b59c72794 Mon Sep 17 00:00:00 2001 From: eblondel Date: Tue, 2 Aug 2016 17:48:30 +0200 Subject: [PATCH] #104 support DSD inheritance for SDMXDataFlows document --- DESCRIPTION | 2 +- R/Class-SDMXDataFlow.R | 6 +++-- R/SDMXDataFlow-methods.R | 3 ++- R/readSDMX.R | 40 ++++++++++++++++++++++++--------- R/rsdmx.R | 2 +- man/rsdmx.Rd | 2 +- tests/testthat/test_DataFlows.R | 1 + 7 files changed, 40 insertions(+), 16 deletions(-) diff --git a/DESCRIPTION b/DESCRIPTION index 3938d01..847ac88 100644 --- a/DESCRIPTION +++ b/DESCRIPTION @@ -1,6 +1,6 @@ Package: rsdmx Version: 0.5-5 -Date: 2016-07-23 +Date: 2016-08-02 Title: Tools for Reading SDMX Data and Metadata Authors@R: c( person("Emmanuel", "Blondel", role = c("aut", "cre"), email = "emmanuel.blondel1@gmail.com"), diff --git a/R/Class-SDMXDataFlow.R b/R/Class-SDMXDataFlow.R index 999473c..ed7440e 100644 --- a/R/Class-SDMXDataFlow.R +++ b/R/Class-SDMXDataFlow.R @@ -41,7 +41,8 @@ setClass("SDMXDataFlow", #elements Name = "list", #at least one Description = "list", #optional - dsdRef = "character" + dsdRef = "character", + dsd = "SDMXDataStructureDefinition_OR_NULL" ), prototype = list( #attributes @@ -64,7 +65,8 @@ setClass("SDMXDataFlow", en = "dataflow description", fr = "description du dataflow" ), - dsdRef = "someId" + dsdRef = "someId", + dsd = NULL ), validity = function(object){ diff --git a/R/SDMXDataFlow-methods.R b/R/SDMXDataFlow-methods.R index f08d08f..737bb5a 100644 --- a/R/SDMXDataFlow-methods.R +++ b/R/SDMXDataFlow-methods.R @@ -161,6 +161,7 @@ SDMXDataFlow <- function(xmlObj, namespaces){ #elements, Name = flowNames, Description = flowDescriptions, - dsdRef = dsdRef + dsdRef = dsdRef, + dsd = NULL ) } diff --git a/R/readSDMX.R b/R/readSDMX.R index 2895bd0..b40df8b 100644 --- a/R/readSDMX.R +++ b/R/readSDMX.R @@ -337,16 +337,21 @@ readSDMX <- function(file = NULL, isURL = TRUE, } #attempt to get DSD in case of helper method - if(buildRequest && resource == "data" && dsd){ + if(buildRequest && resource %in% c("data","dataflow") && dsd){ - if(providerId %in% c("ESTAT", "ISTAT", "WBG_WITS")){ + if(resource == "data" && providerId %in% c("ESTAT", "ISTAT", "WBG_WITS")){ if(verbose) message("-> Attempt to fetch DSD ref from dataflow description") flow <- readSDMX(providerId = providerId, resource = "dataflow", resourceId = flowRef, verbose = TRUE) dsdRef <- slot(slot(flow, "dataflows")[[1]],"dsdRef") rm(flow) }else{ - dsdRef <- slot(obj,"dsdRef") + dsdRef <- NULL + if(resource == "data"){ + dsdRef <- slot(obj, "dsdRef") + }else if(resource=="dataflow"){ + dsdRef <- lapply(slot(obj,"dataflows"), slot,"dsdRef") + } if(!is.null(dsdRef)){ if(verbose) message(paste0("-> DSD ref identified in dataset = '", dsdRef, "'")) if(verbose) message("-> Attempt to fetch & bind DSD to dataset") @@ -356,14 +361,29 @@ readSDMX <- function(file = NULL, isURL = TRUE, if(verbose) message("-> Attempt to fetch & bind DSD to dataset using 'flowRef'") } } - - dsdObj <- readSDMX(providerId = providerId, resource = "datastructure", + + #fetch DSD + dsdObj <- NULL + if(resource == "data"){ + dsdObj <- readSDMX(providerId = providerId, resource = "datastructure", resourceId = dsdRef, verbose = verbose) - if(is.null(dsdObj)){ - if(verbose) message("-> Impossible to fetch DSD") - }else{ - if(verbose) message("-> DSD fetched and associated to dataset!") - slot(obj, "dsd") <- dsdObj + if(is.null(dsdObj)){ + if(verbose) message(sprintf("-> Impossible to fetch DSD for dataset %s", flowRef)) + }else{ + if(verbose) message("-> DSD fetched and associated to dataset!") + slot(obj, "dsd") <- dsdObj + } + }else if(resource == "dataflow"){ + dsdObj <- lapply(1:length(dsdRef), function(x){ + flowDsd <- readSDMX(providerId = providerId, resource = "datastructure", + resourceId = dsdRef[[x]], verbose = verbose) + if(is.null(flowDsd)){ + if(verbose) message(sprintf("-> Impossible to fetch DSD for dataflow %s",resourceId)) + }else{ + if(verbose) message("-> DSD fetched and associated to dataflow!") + slot(slot(obj,"dataflows")[[x]],"dsd") <<- flowDsd + } + }) } } diff --git a/R/rsdmx.R b/R/rsdmx.R index 8e33609..fe7d720 100644 --- a/R/rsdmx.R +++ b/R/rsdmx.R @@ -17,7 +17,7 @@ #' Type: \tab Package\cr #' Version #' : \tab 0.5-5\cr -#' Date: \tab 2016-07-23\cr +#' Date: \tab 2016-08-02\cr #' License: \tab GPL(>=2.0)\cr #' LazyLoad: \tab yes\cr #' } diff --git a/man/rsdmx.Rd b/man/rsdmx.Rd index 2c0fe03..b08cc26 100644 --- a/man/rsdmx.Rd +++ b/man/rsdmx.Rd @@ -18,7 +18,7 @@ currently focuses on the SDMX XML standard format (SDMX-ML). Type: \tab Package\cr Version : \tab 0.5-5\cr - Date: \tab 2016-07-23\cr + Date: \tab 2016-08-02\cr License: \tab GPL(>=2.0)\cr LazyLoad: \tab yes\cr } diff --git a/tests/testthat/test_DataFlows.R b/tests/testthat/test_DataFlows.R index a996a5c..faee2cf 100644 --- a/tests/testthat/test_DataFlows.R +++ b/tests/testthat/test_DataFlows.R @@ -28,4 +28,5 @@ test_that("DataFlows - 2.1",{ expect_equal(flow.df[1, "version"], "1.0") expect_equal(flow.df[1, "urn"], "urn:sdmx:org.sdmx.infomodel.datastructure.Dataflow=MYORG:DS-001(1.0)") expect_equal(flow.df[1, "dsdRef"], "DSD_DS-001") + expect_equal(flow.df[1, "dsd"], NULL) })