From affb8b66a3cddd4dd43320e389f10d20d1f8cccd Mon Sep 17 00:00:00 2001 From: KovaZo Date: Sat, 16 Sep 2023 20:02:03 +0200 Subject: [PATCH 01/52] Zensus api start Implementing gen_zensus_auth stuff --- R/gen_alternative_terms.R | 39 ++++++++++++++++++------ R/gen_auth.R | 2 +- R/gen_find.R | 34 +++++++++++++++++---- R/gen_list_jobs.R | 33 ++++++++++++++++----- R/gen_zensus_api.R | 19 ++++++++++++ R/gen_zensus_auth.R | 62 +++++++++++++++++++++++++++++++++++++++ R/utils.R | 13 ++++++-- R/zzz.R | 6 ++++ 8 files changed, 183 insertions(+), 25 deletions(-) create mode 100644 R/gen_zensus_api.R create mode 100644 R/gen_zensus_auth.R diff --git a/R/gen_alternative_terms.R b/R/gen_alternative_terms.R index d2c27ca..4922c0b 100644 --- a/R/gen_alternative_terms.R +++ b/R/gen_alternative_terms.R @@ -4,6 +4,7 @@ #' #' @param term Character string. Maximum length of 15 characters. Term or word for which you are searching for alternative or related terms. Use of '*' as a placeholder is possible to generate broader search areas. #' @param similarity Logical. Indicator if the output of the function should be sorted based on a Levenshtein edit distance based on the \code{adist()} function. +#' @param database Character string. Indicator if the Destatis or Zensus database is called. #' @param ... Additional parameters for the Genesis API call. These parameters are only affecting the Genesis call itself, no further processing. For more details see `vignette("additional_parameter")`. #' #' @return A list with all recalled elements from Genesis. Attributes are added to the data.frame, describing the search configuration for the returned output. @@ -11,16 +12,20 @@ #' #' @examples #' \dontrun{ -#' # Find terms that are similar (in spelling) to search term "bus" +#' # Find terms at Destatis that are similar (in spelling) to search term "bus" #' # and sort them by Levenshtein edit distance -#' object <- gen_alternative_terms(term = "bus", similarity = TRUE) +#' object <- gen_alternative_terms(term = "bus", similarity = TRUE, database = "destatis") #' -#' # Find terms that are related (in spelling) to search term "bus" -#' object <- gen_alternative_terms(term = "bus*", similarity = TRUE) +#' # Find terms at Destatis that are related (in spelling) to search term "bus" +#' object <- gen_alternative_terms(term = "bus*", similarity = TRUE, database = "destatis") +#' +#' # Find terms at Zensus that are related (in spelling) to search term "bus" +#' object <- gen_alternative_terms(term = "bus*", similarity = TRUE, database = "zensus") #' } #' gen_alternative_terms <- function(term = NULL, similarity = TRUE, + database = c("zensus", "destatis"), ...) { caller <- as.character(match.call()[1]) @@ -31,12 +36,28 @@ gen_alternative_terms <- function(term = NULL, #------------------------------------------------------------------------------- - results_raw <- gen_api("catalogue/terms", + if( length(database) == 1 & database == "zensus" ){ + + results_raw <- gen_zensus_api("catalogue/terms", + username = gen_zensus_auth_get()$username, + password = gen_zensus_auth_get()$password, + selection = term, + ...) + + } else if ( length(database) == 1 & database == "destatis" ){ + + results_raw <- gen_api("catalogue/terms", + username = gen_auth_get()$username, + password = gen_auth_get()$password, + selection = term, + ...) - username = gen_auth_get()$username, - password = gen_auth_get()$password, - selection = term, - ...) + } else { + + stop("Parameter 'database' has to be 'zensus' or 'destatis'.", + call. = FALSE) + + } results_json <- test_if_json(results_raw) diff --git a/R/gen_auth.R b/R/gen_auth.R index c888b0f..a8e0f6e 100644 --- a/R/gen_auth.R +++ b/R/gen_auth.R @@ -1,4 +1,4 @@ -#' Save authentication +#' Save authentication GENESIS #' #' See Details. #' diff --git a/R/gen_find.R b/R/gen_find.R index 42639f3..4868f3f 100644 --- a/R/gen_find.R +++ b/R/gen_find.R @@ -9,6 +9,7 @@ #' @param detailed A logical. Indicator if the function should return the detailed output of the iteration including all object related information or only a shortened output including only code and object title. Default Option is FALSE. #' @param ordering A logical. Indicator if the function should return the output of the iteration ordered first based on the fact if the searched term is appearing in the title of the object and secondly on an estimator of the number of variables in this object. Default option is TRUE. #' @param error.ignore A logical. Indicator if the function should stop if an error occurs or no object for the request is found or if it should produce an artificial response (e.g., for complex processes not to fail). +#' @param database Character string. Indicator if the Destatis or Zensus database is called. #' @param ... Additional parameters for the Genesis API call. These parameters are only affecting the Genesis call itself, no further processing. For more details see `vignette("additional_parameter")`. #' #' @return A list with all elements retrieved from Genesis. Attributes are added to the data.frame describing the search configuration for the returned output. @@ -34,6 +35,7 @@ gen_find <- function(term = NULL, detailed = FALSE, ordering = TRUE, error.ignore = FALSE, + database = c("zensus", "destatis"), ...) { caller <- as.character(match.call()[1]) @@ -43,18 +45,38 @@ gen_find <- function(term = NULL, detailed = detailed, ordering = ordering, error.ignore = error.ignore, + database = databse, caller = caller) category <- match.arg(category) #----------------------------------------------------------------------------- - results_raw <- gen_api("find/find", - username = gen_auth_get()$username, - password = gen_auth_get()$password, - term = term, - category = category, - ...) + if( database == "zensus"){ + + results_raw <- gen_zensus_api("find/find", + username = gen_zensus_auth_get()$username, + password = gen_zensus_auth_get()$password, + term = term, + category = category, + ...) + + } else if (database == "destatis"){ + + results_raw <- gen_api("find/find", + username = gen_auth_get()$username, + password = gen_auth_get()$password, + term = term, + category = category, + ...) + + } else { + + stop("Parameter 'database' has to be 'zensus' or 'destatis'.", + call. = FALSE) + + } + results_json <- test_if_json(results_raw) diff --git a/R/gen_list_jobs.R b/R/gen_list_jobs.R index 6d386cd..c3457db 100644 --- a/R/gen_list_jobs.R +++ b/R/gen_list_jobs.R @@ -4,6 +4,7 @@ #' #' @param selection Filter the list of jobs for matching codes. #' @param sortcriterion Allows to sort the resulting list of jobs by their Code ("content"), the time of completion ("time") or status ("status") +#' @param database Character string. Indicator if the Destatis or Zensus database is called. #' @param ... Additional parameters for the Genesis API call. These parameters are only affecting the Genesis call itself, no further processing. For more details see `vignette("additional_parameter")`. #' #' @return A list of all current jobs connected to the given user. @@ -11,16 +12,34 @@ #' gen_list_jobs <- function(selection = NULL, sortcriterion = c("content", "time", "status"), + database = c("zensus", "destatis"), ... ) { - results_raw <- gen_api("catalogue/jobs", - username = gen_auth_get()$username, - password = gen_auth_get()$password, - selection = selection, - sortcriterion = sortcriterion, - ... - ) + if( length(database) == 1 & database == "zensus" ){ + + results_raw <- gen_zensus_api("catalogue/jobs", + username = gen_zensus_auth_get()$username, + password = gen_zensus_auth_get()$password, + selection = selection, + sortcriterion = sortcriterion, + ...) + + } else if ( length(database) == 1 & database == "destatis" ){ + + results_raw <- gen_api("catalogue/jobs", + username = gen_auth_get()$username, + password = gen_auth_get()$password, + selection = selection, + sortcriterion = sortcriterion, + ...) + + } else { + + stop("Parameter 'database' has to be 'zensus' or 'destatis'.", + call. = FALSE) + + } results_json <- test_if_json(results_raw) diff --git a/R/gen_zensus_api.R b/R/gen_zensus_api.R new file mode 100644 index 0000000..37f13df --- /dev/null +++ b/R/gen_zensus_api.R @@ -0,0 +1,19 @@ +#' Low-level function to interact with the Zensus 2022 GENESIS API +#' +#' @param endpoint Self-explanatory +#' +#' @importFrom httr2 `%>%` +#' +#' @noRd +#' +#' @examples +#' gen_api("helloworld/logincheck") %>% +#' httr2::resp_body_json() +gen_zensus_api <- function(endpoint, ...) { + httr2::request("https://ergebnisse2011.zensus2022.de/api/rest/2020") %>% + httr2::req_user_agent("https://github.com/CorrelAid/restatis") %>% + httr2::req_url_path_append(endpoint) %>% + httr2::req_url_query(!!!gen_zensus_auth_get(), ...) %>% + httr2::req_retry(max_tries = 3) %>% + httr2::req_perform() +} diff --git a/R/gen_zensus_auth.R b/R/gen_zensus_auth.R new file mode 100644 index 0000000..5e75956 --- /dev/null +++ b/R/gen_zensus_auth.R @@ -0,0 +1,62 @@ +#' Save authentication ZENSUS +#' +#' See Details. +#' +#' Zensus username and password are encrypted and saved as RDS in the +#' package config directory. +#' +#' A random string is generated and stored in the session environment +#' variable `ZENSUS_KEY`. This string is used as the key to encrypt and +#' decrypt the entered Genesis credentials. +#' +#' To avoid having to save authentication in future sessions, `ZENSUS_KEY` can +#' be added to .Renviron. The usethis package includes a helper function for +#' editing .Renviron files from an R session with [usethis::edit_r_environ()]. +#' +#' @export +gen_zensus_auth_save <- function() { + + username <- gen_auth_ask("username") + password <- gen_auth_ask("password") + + auth_path <- gen_auth_path("auth_ZENSUS.rds") + + key <- httr2::secret_make_key() + + Sys.setenv(ZENSUS_KEY = key) + + message( + "Saving credentials to ", + auth_path, + "\n\n", + "Please add the following line to your .Renviron, ", + "e.g. via `usethis::edit_r_environ()`, ", + "to use the specified username and password across sessions:\n\n", + "ZENSUS_KEY=", + key, + "\n\n" + ) + + dir.create(gen_auth_path(), showWarnings = FALSE, recursive = TRUE) + + httr2::secret_write_rds( + list(username = username, password = password), + path = auth_path, + key = "ZENSUS_KEY" + ) +} + +gen_zensus_auth_get <- function() { + + auth_path <- gen_auth_path("auth_ZENSUS.rds") + + if (!(file.exists(auth_path) && nzchar(Sys.getenv("ZENSUS_KEY")))) { + stop( + "Zensus credentials not found.\n", + "Please run `gen_auth_save()` to store Zensus username and password.\n", + call. = FALSE + ) + } + + httr2::secret_read_rds(auth_path, "ZENSUS_KEY") +} diff --git a/R/utils.R b/R/utils.R index 68b0843..0b2bf87 100644 --- a/R/utils.R +++ b/R/utils.R @@ -94,6 +94,7 @@ check_function_input <- function(code = NULL, similarity = NULL, error.ignore = NULL, ordering = NULL, + database = NULL, caller = NULL) { # Code & Term ---- @@ -222,10 +223,18 @@ check_function_input <- function(code = NULL, #---------------------------------------- if (caller %in% c("restatis::gen_find", "gen_find")) { - if (!all(category %in% c("all", "tables", "statistics", "variables", "cubes"))) { + if (database == "zensus"){ + if (!all(category %in% c("all", "tables", "statistics", "variables"))) { + stop("Available categories are all, tables, statistics, and variables.", + call. = FALSE + ) + } + } else if (database == "destatis"){ + if (!all(category %in% c("all", "tables", "statistics", "variables", "cubes"))) { stop("Available categories are all, tables, statistics, variables, and cubes.", call. = FALSE - ) + ) + } } } diff --git a/R/zzz.R b/R/zzz.R index 5564489..dffbb85 100644 --- a/R/zzz.R +++ b/R/zzz.R @@ -3,3 +3,9 @@ if (!nzchar(Sys.getenv("GENESIS_LANG"))) Sys.setenv(GENESIS_LANG = "en") } + +.onLoad_zensus <- function(libname, pkgname) { + gen_zensus_api <<- memoise::memoise(gen_zensus_api) + + if (!nzchar(Sys.getenv("GENESIS_LANG"))) Sys.setenv(GENESIS_LANG = "en") +} From 5e2ff5b44d4f7303e7a465c04af35be1b923110c Mon Sep 17 00:00:00 2001 From: bubux Date: Thu, 28 Sep 2023 14:04:45 +0200 Subject: [PATCH 02/52] modify gen_table --- R/gen_find.R | 10 +++---- R/gen_table.R | 74 ++++++++++++++++++++++++++++++++++++--------------- 2 files changed, 57 insertions(+), 27 deletions(-) diff --git a/R/gen_find.R b/R/gen_find.R index 4868f3f..a28187c 100644 --- a/R/gen_find.R +++ b/R/gen_find.R @@ -35,7 +35,7 @@ gen_find <- function(term = NULL, detailed = FALSE, ordering = TRUE, error.ignore = FALSE, - database = c("zensus", "destatis"), + database = c("zensus", "genesis"), ...) { caller <- as.character(match.call()[1]) @@ -45,14 +45,14 @@ gen_find <- function(term = NULL, detailed = detailed, ordering = ordering, error.ignore = error.ignore, - database = databse, + database = database, caller = caller) category <- match.arg(category) #----------------------------------------------------------------------------- - if( database == "zensus"){ + if(database == "zensus"){ results_raw <- gen_zensus_api("find/find", username = gen_zensus_auth_get()$username, @@ -61,7 +61,7 @@ gen_find <- function(term = NULL, category = category, ...) - } else if (database == "destatis"){ + } else if (database == "genesis"){ results_raw <- gen_api("find/find", username = gen_auth_get()$username, @@ -72,7 +72,7 @@ gen_find <- function(term = NULL, } else { - stop("Parameter 'database' has to be 'zensus' or 'destatis'.", + stop("Parameter 'database' has to be 'zensus' or 'genesis'.", call. = FALSE) } diff --git a/R/gen_table.R b/R/gen_table.R index 8d1690a..556450b 100644 --- a/R/gen_table.R +++ b/R/gen_table.R @@ -50,6 +50,7 @@ gen_table <- function(name, ...) { #------------------------------------------------------------------------------- gen_table_ <- function(name, + database = c("genesis", "zensus"), area = c("public", "user"), compress = FALSE, transpose = FALSE, @@ -80,26 +81,56 @@ gen_table_ <- function(name, classifyingkey2 <- param_collapse_vec(classifyingkey2) classifyingkey3 <- param_collapse_vec(classifyingkey3) - resp <- gen_api("data/tablefile", - name = name, - area = area, - compress = compress, - transpose = transpose, - startyear = startyear, - endyear = endyear, - regionalvariable = regionalvariable, - regionalkey = regionalkey, - classifyingvariable1 = classifyingvariable1, - classifyingkey1 = classifyingkey1, - classifyingvariable2 = classifyingvariable2, - classifyingkey2 = classifyingkey2, - classifyingvariable3 = classifyingvariable3, - classifyingkey3 = classifyingkey3, - stand = stand, - language = language, - format = "ffcsv", - job = FALSE - ) + if(database == "zensus"){ + + resp <- gen_zensus_api("data/tablefile", + name = name, + area = area, + compress = compress, + transpose = transpose, + startyear = startyear, + endyear = endyear, + regionalvariable = regionalvariable, + regionalkey = regionalkey, + classifyingvariable1 = classifyingvariable1, + classifyingkey1 = classifyingkey1, + classifyingvariable2 = classifyingvariable2, + classifyingkey2 = classifyingkey2, + classifyingvariable3 = classifyingvariable3, + classifyingkey3 = classifyingkey3, + stand = stand, + language = language, + format = "ffcsv", + job = FALSE) + + } else if (database == "genesis"){ + + resp <- gen_api("data/tablefile", + name = name, + area = area, + compress = compress, + transpose = transpose, + startyear = startyear, + endyear = endyear, + regionalvariable = regionalvariable, + regionalkey = regionalkey, + classifyingvariable1 = classifyingvariable1, + classifyingkey1 = classifyingkey1, + classifyingvariable2 = classifyingvariable2, + classifyingkey2 = classifyingkey2, + classifyingvariable3 = classifyingvariable3, + classifyingkey3 = classifyingkey3, + stand = stand, + language = language, + format = "ffcsv", + job = FALSE) + + } else { + + stop("Parameter 'database' has to be 'zensus' or 'genesis'.", + call. = FALSE) + + } resp_check_data_csv(resp) @@ -107,6 +138,5 @@ gen_table_ <- function(name, httr2::resp_body_string() %>% readr::read_delim( delim = ";", - show_col_types = FALSE - ) + show_col_types = FALSE) } From 38a0a1dbe20fa4758205d7052010e8c6ebfaf7c9 Mon Sep 17 00:00:00 2001 From: KovaZo Date: Wed, 4 Oct 2023 21:03:26 +0200 Subject: [PATCH 03/52] Update restatis function, Addding zensus interaction --- R/gen_alternative_terms.R | 56 ++++---- R/gen_catalogue.R | 126 +++++++++++++----- R/gen_find.R | 103 ++++++++++----- R/gen_list_jobs.R | 55 ++++---- R/gen_meta_data.R | 268 ++++++++++++++++++++++++++++++-------- R/gen_modified_data.R | 150 +++++++++++++++------ R/gen_objects2stat.R | 116 +++++++++++++---- R/gen_objects2var.R | 116 +++++++++++++---- R/gen_table.R | 4 +- R/gen_var2-val2.R | 209 ++++++++++++++++++++++------- R/utils.R | 140 +++++++++++++++++--- 11 files changed, 1019 insertions(+), 324 deletions(-) diff --git a/R/gen_alternative_terms.R b/R/gen_alternative_terms.R index 4922c0b..b1b2487 100644 --- a/R/gen_alternative_terms.R +++ b/R/gen_alternative_terms.R @@ -1,23 +1,23 @@ #' gen_alternative_terms: Call For Similiar or Spelling Related Terms for Further Search #' -#' @description Function to find search terms that are similar or related to one another and also represented in Genesis. +#' @description Function to find search terms that are similar or related to one another and also represented in Genesis/Zensus. #' #' @param term Character string. Maximum length of 15 characters. Term or word for which you are searching for alternative or related terms. Use of '*' as a placeholder is possible to generate broader search areas. -#' @param similarity Logical. Indicator if the output of the function should be sorted based on a Levenshtein edit distance based on the \code{adist()} function. -#' @param database Character string. Indicator if the Destatis or Zensus database is called. -#' @param ... Additional parameters for the Genesis API call. These parameters are only affecting the Genesis call itself, no further processing. For more details see `vignette("additional_parameter")`. +#' @param similarity Logical. Indicator if the output of the function should be sorted based on a Levenshtein edit distance based on the \code{adist()} function. Default option is 'TRUE'. +#' @param database Character string. Indicator if the Genesis or Zensus database is called. Only one database can be addressed per function call. Default option is 'genesis'. +#' @param ... Additional parameters for the Genesis or Zensus API call. These parameters are only affecting the call itself, no further processing. For more details see `vignette("additional_parameter")`. #' -#' @return A list with all recalled elements from Genesis. Attributes are added to the data.frame, describing the search configuration for the returned output. +#' @return A list with all recalled elements from Genesis/Zensus. Attributes are added to the data.frame, describing the search configuration for the returned output. #' @export #' #' @examples #' \dontrun{ #' # Find terms at Destatis that are similar (in spelling) to search term "bus" #' # and sort them by Levenshtein edit distance -#' object <- gen_alternative_terms(term = "bus", similarity = TRUE, database = "destatis") +#' object <- gen_alternative_terms(term = "bus", similarity = TRUE, database = "genesis") #' #' # Find terms at Destatis that are related (in spelling) to search term "bus" -#' object <- gen_alternative_terms(term = "bus*", similarity = TRUE, database = "destatis") +#' object <- gen_alternative_terms(term = "bus*", similarity = TRUE, database = "genesis") #' #' # Find terms at Zensus that are related (in spelling) to search term "bus" #' object <- gen_alternative_terms(term = "bus*", similarity = TRUE, database = "zensus") @@ -25,40 +25,43 @@ #' gen_alternative_terms <- function(term = NULL, similarity = TRUE, - database = c("zensus", "destatis"), + database = c("genesis", "zensus"), ...) { caller <- as.character(match.call()[1]) + gen_fun <- test_database_function(database) + check_function_input(term = term, similarity = similarity, caller = caller) -#------------------------------------------------------------------------------- - - if( length(database) == 1 & database == "zensus" ){ + #----------------------------------------------------------------------------- - results_raw <- gen_zensus_api("catalogue/terms", - username = gen_zensus_auth_get()$username, - password = gen_zensus_auth_get()$password, - selection = term, - ...) + if(gen_fun == "gen_api"){ - } else if ( length(database) == 1 & database == "destatis" ){ + par_list <- list( + endpoint = "catalogue/terms", + username = gen_auth_get()$username, + password = gen_auth_get()$password, + selection = term, + ... + ) - results_raw <- gen_api("catalogue/terms", - username = gen_auth_get()$username, - password = gen_auth_get()$password, - selection = term, - ...) + } else if ( gen_fun == "gen_zensus_api"){ - } else { - - stop("Parameter 'database' has to be 'zensus' or 'destatis'.", - call. = FALSE) + par_list <- list( + endpoint = "catalogue/terms", + username = gen_zensus_auth_get()$username, + password = gen_zensus_auth_get()$password, + selection = term, + ... + ) } + results_raw <- do.call(gen_fun, par_list) + results_json <- test_if_json(results_raw) if (length(results_json$List) == 0) { @@ -100,6 +103,7 @@ gen_alternative_terms <- function(term = NULL, list_resp <- list("Output" = termslist) attr(list_resp, "Term") <- term + attr(list_resp, "Database") <- database[1] attr(list_resp, "Language") <- results_json$Parameter$language attr(list_resp, "Pagelength") <- results_json$Parameter$pagelength attr(list_resp, "Copyright") <- results_json$Copyright diff --git a/R/gen_catalogue.R b/R/gen_catalogue.R index 4e08a0a..15a8f46 100644 --- a/R/gen_catalogue.R +++ b/R/gen_catalogue.R @@ -1,14 +1,17 @@ -#' catalogue: Explore Different Objects and Their Structural Embedding in Genesis +#' catalogue: Explore Different Objects and Their Structural Embedding in Genesis/Zensus #' -#' Function to enable searching for tables, statistics, and cubes from Genesis. Additionally, it structures the output based on the internal tree structure of Genesis itself based on the EVAS-numbers. Time-series are represented as cubes with a specified time span. +#' Function to enable searching for tables, statistics, and cubes from Genesis or Zensus. Additionally, it structures the Genesis-output based on the internal tree structure of Genesis itself based on the EVAS-numbers. Time-series are represented as cubes with a specified time span in Genesis. #' -#' @param code a string with a maximum length of 10 characters. Code from a Genesis-Object. Only one code per iteration. "*"-Notations are possible. -#' @param category a string. Specific Genesis-Object-types: 'tables', 'statistics', and 'cubes'. All three together are possible. -#' @param detailed a logical. Indicator if the function should return the detailed output of the iteration including all object-related information or only a shortened output including only code and object title. -#' @param error.ignore a logical. Indicator if the function should stop if an error occurs or no object for the request is found or if it should produce a token as response. -#' @param ... Additional parameters for the Genesis API call. These parameters are only affecting the Genesis call itself, no further processing. For more details see `vignette("additional_parameter")`. +#' @param code A string with a maximum length of 10 characters for a Genesis-Object and 15 characters for a Zensus-Object. Only one code per iteration. "*"-Notations are possible. +#' @param database Character string. Indicator if the Genesis or Zensus database is called. Only one database can be addressed per function call. Default option is 'genesis'. +#' @param category A string. Includes specific Genesis-Object-types: 'tables', 'statistics', and 'cubes' - and specific Zensus-Object-types: "tables" and "statistics". All types that are specific for one database can be used together. Default option is to use all types that are possible for the specific database. +#' @param area A string. Indicator from which area of the database the results are called. In general, "all" is the appropriate solution. Default option is 'all'. Not used for "statistics". +#' @param detailed A logical. Indicator if the function should return the detailed output of the iteration including all object-related information or only a shortened output including only code and object title. Default option is 'FALSE'. +#' @param error.ignore A logical. Indicator if the function should stop if an error occurs or no object for the request is found or if it should produce a token as response. Default option is 'FALSE'. +#' @param sortcriterion A string. Indicator if the output should be sorted by 'code' or 'content'. This is a parameter of the Genesis/Zensus API call itself. The default is "code". +#' @param ... Additional parameters for the Genesis/Zensus API call. These parameters are only affecting the Genesis/Zensus call itself, no further processing. For more details see `vignette("additional_parameter")`. #' -#' @return A list with all recalled elements from Genesis API. Based on the detailed-parameter it contains more or less information, but always includes the code of the object, the title, and the type of the object. This is done to facilitate further processing with the data. Attributes are added to the dataframe describing the search configuration for the returned output. +#' @return A list with all recalled elements from Genesis/Zensus API. Based on the detailed-parameter it contains more or less information, but always includes the code of the object, the title, and the type of the object. This is done to facilitate further processing with the data. Attributes are added to the dataframe describing the search configuration for the returned output. #' @export #' #' @examples @@ -24,30 +27,50 @@ #' } #' gen_catalogue <- function(code = NULL, + database = c("genesis", "zensus"), category = c("tables", "statistics", "cubes"), + area = c("all", "public", "user"), detailed = FALSE, error.ignore = FALSE, + sortcriterion = c("code", "content"), ...) { caller <- as.character(match.call()[1]) + gen_fun <- test_database_function(database) + check_function_input(code = code, category = category, detailed = detailed, error.ignore = error.ignore, + database = gen_fun, + sortcriterion = sortcriterion, caller = caller) + area <- match.arg(area) + + area <- switch(area, all = "all", public = "\u00F6ffentlich", user = "benutzer") + + sortcriterion <- match.arg(sortcriterion) #----------------------------------------------------------------------------- # Processing #### - if ("cubes" %in% category) { + if ("cubes" %in% category && gen_fun == "gen_zensus_api") { + + list_of_cubes <- "No 'cubes' object available for 'zensus'-database." - results_raw <- gen_api("catalogue/cubes", - username = gen_auth_get()$username, - password = gen_auth_get()$password, - selection = code, - ...) + } else if ("cubes" %in% category && gen_fun == "gen_api") { + + results_raw <- do.call(gen_fun, list( + endpoint = "catalogue/cubes", + username = gen_auth_get()$username, + password = gen_auth_get()$password, + selection = code, + sortcriterion = sortcriterion, + area = area, + ... + )) results_json <- test_if_json(results_raw) @@ -95,11 +118,31 @@ gen_catalogue <- function(code = NULL, if ("statistics" %in% category) { - results_raw <- gen_api("catalogue/statistics", - username = gen_auth_get()$username, - password = gen_auth_get()$password, - selection = code, - ...) + if(gen_fun == "gen_api"){ + + par_list <- list( + endpoint = "catalogue/statistics", + username = gen_auth_get()$username, + password = gen_auth_get()$password, + selection = code, + sortcriterion = sortcriterion, + ... + ) + + } else if ( gen_fun == "gen_zensus_api"){ + + par_list <- list( + endpoint = "catalogue/statistics", + username = gen_zensus_auth_get()$username, + password = gen_zensus_auth_get()$password, + selection = code, + sortcriterion = sortcriterion, + ... + ) + + } + + results_raw <- do.call(gen_fun, par_list) results_json <- test_if_json(results_raw) @@ -147,11 +190,33 @@ gen_catalogue <- function(code = NULL, if ("tables" %in% category) { - results_raw <- gen_api("catalogue/tables", - username = gen_auth_get()$username, - password = gen_auth_get()$password, - selection = code, - ...) + if(gen_fun == "gen_api"){ + + par_list <- list( + endpoint = "catalogue/tables", + username = gen_auth_get()$username, + password = gen_auth_get()$password, + selection = code, + area = area, + sortcriterion = sortcriterion, + ... + ) + + } else if ( gen_fun == "gen_zensus_api"){ + + par_list <- list( + endpoint = "catalogue/tables", + username = gen_zensus_auth_get()$username, + password = gen_zensus_auth_get()$password, + selection = code, + area = area, + sortcriterion = sortcriterion, + ... + ) + + } + + results_raw <- do.call(gen_fun, par_list) results_json <- test_if_json(results_raw) @@ -199,14 +264,14 @@ gen_catalogue <- function(code = NULL, if (all(c("tables", "statistics", "cubes") %in% category)) { list_resp <- list( - "Cubes" = if(length(list_of_cubes) == 1){list_of_cubes} else {list("A" = forming_evas(list_of_cubes))}, - "Statistics" = if(length(list_of.stats) == 1){list_of.stats} else {list("B" = forming_evas(list_of.stats))}, - "Tables" = if(length(list_of.tabs) == 1){list_of.tabs} else {list("C" = forming_evas(list_of.tabs))} + "Cubes" = if(length(list_of_cubes) == 1 | gen_fun == "gen_zensus_api"){list_of_cubes} else {list("A" = forming_evas(list_of_cubes))}, + "Statistics" = if(length(list_of.stats) == 1 | gen_fun == "gen_zensus_api"){list_of.stats} else {list("B" = forming_evas(list_of.stats))}, + "Tables" = if(length(list_of.tabs) == 1 | gen_fun == "gen_zensus_api"){list_of.tabs} else {list("C" = forming_evas(list_of.tabs))} ) } else if (category == "cubes") { - if(length(list_of_cubes) == 1){ + if(length(list_of_cubes) == 1 | gen_fun == "gen_zensus_api"){ list_resp <- list("Output" = list_of_cubes) @@ -218,7 +283,7 @@ gen_catalogue <- function(code = NULL, } else if (category == "statistics") { - if(length(list_of.stats) == 1){ + if(length(list_of.stats) == 1 | gen_fun == "gen_zensus_api"){ list_resp <- list("Output" = list_of.stats) @@ -230,7 +295,7 @@ gen_catalogue <- function(code = NULL, } else if (category == "tables") { - if(length(list_of.tabs) == 1){ + if(length(list_of.tabs) == 1 | gen_fun == "gen_zensus_api"){ list_resp <- list("Output" = list_of.tabs) @@ -243,6 +308,7 @@ gen_catalogue <- function(code = NULL, } attr(list_resp, "Code") <- results_json$Parameter$selection + attr(list_resp, "Database") <- database[1] attr(list_resp, "Category") <- category attr(list_resp, "Language") <- results_json$Parameter$language attr(list_resp, "Pagelength") <- results_json$Parameter$pagelength diff --git a/R/gen_find.R b/R/gen_find.R index a28187c..20b4cb9 100644 --- a/R/gen_find.R +++ b/R/gen_find.R @@ -1,18 +1,18 @@ -#' gen_find +#' find: Search for Different Objects in Genesis/Zensus #' -#' @description Function to search through Genesis. It is similar in usage as the search function on the Destatis main page (https://www.destatis.de/DE/Home/_inhalt.html). +#' @description Function to search through Genesis/Zensus. It is similar in usage as the search function on the Destatis main page (https://www.destatis.de/DE/Home/_inhalt.html). #' In the search query, "UND" (german word for: and; can also be written "und" or "&") as well as "ODER" (german word for: or; can also be written "oder" or "|") can be included and logically combined. Furthermore, wildcards are possible by including "*". If more then one word is included in the term-string, automatically "and" is used to combine the different words. -#' Important note: Time-series are treated as cubes, they are not longer distinguished. If you want to find a specific object with a clear code with this find function, you need to specify the object type or search for all object types. +#' Important note: Time-series are treated as cubes in Genesis, they are not longer distinguished. If you want to find a specific object with a clear code with this find function, you need to specify the object type or search for all object types. #' #' @param term A string with no maximum character length, but a word limit of five words. -#' @param category A string. Specific object types: 'tables', 'statistics', 'variables', and 'cubes'. Using all together is possible. Default option are 'all' objects. -#' @param detailed A logical. Indicator if the function should return the detailed output of the iteration including all object related information or only a shortened output including only code and object title. Default Option is FALSE. -#' @param ordering A logical. Indicator if the function should return the output of the iteration ordered first based on the fact if the searched term is appearing in the title of the object and secondly on an estimator of the number of variables in this object. Default option is TRUE. -#' @param error.ignore A logical. Indicator if the function should stop if an error occurs or no object for the request is found or if it should produce an artificial response (e.g., for complex processes not to fail). -#' @param database Character string. Indicator if the Destatis or Zensus database is called. -#' @param ... Additional parameters for the Genesis API call. These parameters are only affecting the Genesis call itself, no further processing. For more details see `vignette("additional_parameter")`. +#' @param database Character string. Indicator if the Genesis or Zensus database is called. Default option is 'genesis'. +#' @param category A string. Includes specific Genesis-Object-types: ''tables', 'statistics', 'variables', and 'cubes' - and specific Zensus-Object-types: "tables", "statistics", and "variables". All types that are specific for one database can be used together. Default option is to use all types that are possible for the specific database indicated by 'all'. +#' @param detailed A logical. Indicator if the function should return the detailed output of the iteration including all object related information or only a shortened output including only code and object title. Default Option is 'FALSE'. +#' @param ordering A logical. Indicator if the function should return the output of the iteration ordered first based on the fact if the searched term is appearing in the title of the object and secondly on an estimator of the number of variables in this object. Default option is 'TRUE'. +#' @param error.ignore A logical. Indicator if the function should stop if an error occurs or no object for the request is found or if it should produce an artificial response (e.g., for complex processes not to fail). Default option is 'FALSE'. +#' @param ... Additional parameters for the Genesis/Zensus API call. These parameters are only affecting the Genesis/Zensus call itself, no further processing. For more details see `vignette("additional_parameter")`. #' -#' @return A list with all elements retrieved from Genesis. Attributes are added to the data.frame describing the search configuration for the returned output. +#' @return A list with all elements retrieved from Genesis/Zensus. Attributes are added to the data.frame describing the search configuration for the returned output. #' @export #' #' @examples @@ -31,77 +31,100 @@ #' } #' gen_find <- function(term = NULL, + database = c("genesis", "zensus"), category = c("all", "tables", "statistics", "variables", "cubes"), detailed = FALSE, ordering = TRUE, error.ignore = FALSE, - database = c("zensus", "genesis"), ...) { caller <- as.character(match.call()[1]) + gen_fun <- test_database_function(database) + check_function_input(term = term, category = category, detailed = detailed, ordering = ordering, error.ignore = error.ignore, - database = database, + database = gen_fun, caller = caller) category <- match.arg(category) #----------------------------------------------------------------------------- - if(database == "zensus"){ + if(gen_fun == "gen_zensus_api" & category == "cubes"){ - results_raw <- gen_zensus_api("find/find", - username = gen_zensus_auth_get()$username, - password = gen_zensus_auth_get()$password, - term = term, - category = category, - ...) + empty_object <- TRUE - } else if (database == "genesis"){ + } else { - results_raw <- gen_api("find/find", - username = gen_auth_get()$username, - password = gen_auth_get()$password, - term = term, - category = category, - ...) + if(gen_fun == "gen_api"){ - } else { + par_list <- list( + endpoint = "find/find", + username = gen_auth_get()$username, + password = gen_auth_get()$password, + term = term, + category = category, + ... + ) - stop("Parameter 'database' has to be 'zensus' or 'genesis'.", - call. = FALSE) + } else if ( gen_fun == "gen_zensus_api"){ - } + par_list <- list( + endpoint = "find/find", + username = gen_zensus_auth_get()$username, + password = gen_zensus_auth_get()$password, + term = term, + category = category, + ... + ) + + } + + results_raw <- do.call(gen_fun, par_list) + results_json <- test_if_json(results_raw) - results_json <- test_if_json(results_raw) + empty_object <- test_if_error_find(results_json, para = error.ignore) - empty_object <- test_if_error_find(results_json, para = error.ignore) + empty_object <- test_if_process_further(results_json, para = error.ignore) - empty_object <- test_if_process_further(results_json, para = error.ignore) + } #----------------------------------------------------------------------------- - if(isTRUE(empty_object)){ + if(isTRUE(empty_object) & gen_fun == "gen_api"){ list_resp <- list("Output" = "No object found for your request.") attr(list_resp, "Term") <- results_json$Parameter$term + attr(list_resp, "Database") <- database[1] attr(list_resp, "Language") <- results_json$Parameter$language attr(list_resp, "Pagelength") <- results_json$Parameter$pagelength attr(list_resp, "Copyright") <- results_json$Copyright return(list_resp) - } else if (isFALSE(empty_object)){ + } else if( isTRUE(empty_object) & gen_fun == "gen_zensus_api" ){ + + list_resp <- list("Output" = "No cubes at all avalaible in 'zensus'-database.") + + attr(list_resp, "Term") <- term + attr(list_resp, "Database") <- database[1] + attr(list_resp, "Category") <- category + + return(list_resp) + + } + else if (isFALSE(empty_object)){ list_resp <- list("Output" = results_json$Status$Content) attr(list_resp, "Term") <- results_json$Parameter$term + attr(list_resp, "Database") <- database[1] attr(list_resp, "Language") <- results_json$Parameter$language attr(list_resp, "Pagelength") <- results_json$Parameter$pagelength attr(list_resp, "Copyright") <- results_json$Copyright @@ -280,6 +303,7 @@ gen_find <- function(term = NULL, "Cubes" = tibble::as_tibble(df_cubes)) attr(list_resp, "Term") <- results_json$Parameter$term + attr(list_resp, "Database") <- database[1] attr(list_resp, "Language") <- results_json$Parameter$language attr(list_resp, "Pagelength") <- results_json$Parameter$pagelength attr(list_resp, "Copyright") <- results_json$Copyright @@ -333,6 +357,7 @@ gen_find <- function(term = NULL, list_resp <- list("Tables" = tibble::as_tibble(df_table)) attr(list_resp, "Term") <- results_json$Parameter$term + attr(list_resp, "Database") <- database[1] attr(list_resp, "Language") <- results_json$Parameter$language attr(list_resp, "Pagelength") <- results_json$Parameter$pagelength attr(list_resp, "Copyright") <- results_json$Copyright @@ -390,6 +415,7 @@ gen_find <- function(term = NULL, list_resp <- list("Statistics" = tibble::as_tibble(df_stats)) attr(list_resp, "Term") <- results_json$Parameter$term + attr(list_resp, "Database") <- database[1] attr(list_resp, "Language") <- results_json$Parameter$language attr(list_resp, "Pagelength") <- results_json$Parameter$pagelength attr(list_resp, "Copyright") <- results_json$Copyright @@ -450,6 +476,7 @@ gen_find <- function(term = NULL, list_resp <- list("Variables" = tibble::as_tibble(df_variables)) attr(list_resp, "Term") <- results_json$Parameter$term + attr(list_resp, "Database") <- database[1] attr(list_resp, "Language") <- results_json$Parameter$language attr(list_resp, "Pagelength") <- results_json$Parameter$pagelength attr(list_resp, "Copyright") <- results_json$Copyright @@ -514,6 +541,7 @@ gen_find <- function(term = NULL, list_resp <- list("Cubes" = tibble::as_tibble(df_cubes)) attr(list_resp, "Term") <- results_json$Parameter$term + attr(list_resp, "Database") <- database[1] attr(list_resp, "Language") <- results_json$Parameter$language attr(list_resp, "Pagelength") <- results_json$Parameter$pagelength attr(list_resp, "Copyright") <- results_json$Copyright @@ -641,6 +669,7 @@ gen_find <- function(term = NULL, "Cubes" = tibble::as_tibble(df_cubes)) attr(list_resp, "Term") <- results_json$Parameter$term + attr(list_resp, "Database") <- database[1] attr(list_resp, "Language") <- results_json$Parameter$language attr(list_resp, "Pagelength") <- results_json$Parameter$pagelength attr(list_resp, "Copyright") <- results_json$Copyright @@ -688,6 +717,7 @@ gen_find <- function(term = NULL, list_resp <- list("Tables" = tibble::as_tibble(df_table)) attr(list_resp, "Term") <- results_json$Parameter$term + attr(list_resp, "Database") <- database[1] attr(list_resp, "Language") <- results_json$Parameter$language attr(list_resp, "Pagelength") <- results_json$Parameter$pagelength attr(list_resp, "Copyright") <- results_json$Copyright @@ -732,6 +762,7 @@ gen_find <- function(term = NULL, list_resp <- list("Statistics" = tibble::as_tibble(df_stats)) attr(list_resp, "Term") <- results_json$Parameter$term + attr(list_resp, "Database") <- database[1] attr(list_resp, "Language") <- results_json$Parameter$language attr(list_resp, "Pagelength") <- results_json$Parameter$pagelength attr(list_resp, "Copyright") <- results_json$Copyright @@ -780,6 +811,7 @@ gen_find <- function(term = NULL, list_resp <- list("Variables" = tibble::as_tibble(df_variables)) attr(list_resp, "Term") <- results_json$Parameter$term + attr(list_resp, "Database") <- database[1] attr(list_resp, "Language") <- results_json$Parameter$language attr(list_resp, "Pagelength") <- results_json$Parameter$pagelength attr(list_resp, "Copyright") <- results_json$Copyright @@ -828,6 +860,7 @@ gen_find <- function(term = NULL, list_resp <- list("Cubes" = tibble::as_tibble(df_cubes)) attr(list_resp, "Term") <- results_json$Parameter$term + attr(list_resp, "Database") <- database[1] attr(list_resp, "Language") <- results_json$Parameter$language attr(list_resp, "Pagelength") <- results_json$Parameter$pagelength attr(list_resp, "Copyright") <- results_json$Copyright diff --git a/R/gen_list_jobs.R b/R/gen_list_jobs.R index c3457db..c82a7c4 100644 --- a/R/gen_list_jobs.R +++ b/R/gen_list_jobs.R @@ -2,45 +2,52 @@ #' #' @description Function to list all current jobs connected to the given user. #' -#' @param selection Filter the list of jobs for matching codes. -#' @param sortcriterion Allows to sort the resulting list of jobs by their Code ("content"), the time of completion ("time") or status ("status") -#' @param database Character string. Indicator if the Destatis or Zensus database is called. -#' @param ... Additional parameters for the Genesis API call. These parameters are only affecting the Genesis call itself, no further processing. For more details see `vignette("additional_parameter")`. +#' @param code Filter the list of jobs for matching codes. +#' @param sortcriterion Allows to sort the resulting list of jobs for Genesis by their Code ("content"), the time of completion ("time") or status ("status") and for Zensus by the time of completion ("time") or status ("status"). Default option is 'status'. +#' @param database Character string. Indicator if the Genesis or Zensus database is called. Default option is 'genesis'. +#' @param ... Additional parameters for the Genesis/Zensus API call. These parameters are only affecting the Genesis/Zensus call itself, no further processing. For more details see `vignette("additional_parameter")`. #' #' @return A list of all current jobs connected to the given user. #' @export #' -gen_list_jobs <- function(selection = NULL, - sortcriterion = c("content", "time", "status"), - database = c("zensus", "destatis"), +gen_list_jobs <- function(code = NULL, + sortcriterion = c("status", "time", "content"), + database = c("genesis", "zensus"), ... ) { - if( length(database) == 1 & database == "zensus" ){ + gen_fun <- test_database_function(database) - results_raw <- gen_zensus_api("catalogue/jobs", - username = gen_zensus_auth_get()$username, - password = gen_zensus_auth_get()$password, - selection = selection, - sortcriterion = sortcriterion, - ...) + sortcriterion <- match.arg(sortcriterion) - } else if ( length(database) == 1 & database == "destatis" ){ + if( sortcriterion == "content" & gen_fun == "gen_zensus_api"){ - results_raw <- gen_api("catalogue/jobs", - username = gen_auth_get()$username, - password = gen_auth_get()$password, - selection = selection, - sortcriterion = sortcriterion, - ...) + stop("Parameter 'sortcriterion' has to be 'status' or 'time' for 'zensus'-database.", call. = FALSE) - } else { + } + + if(gen_fun == "gen_api"){ + + par_list <- list( + endpoint = "catalogue/jobs", + selection = selection, + sortcriterion = sortcriterion, + ... + ) - stop("Parameter 'database' has to be 'zensus' or 'destatis'.", - call. = FALSE) + } else if ( gen_fun == "gen_zensus_api"){ + + par_list <- list( + endpoint = "catalogue/jobs", + selection = selection, + sortcriterion = sortcriterion, + ... + ) } + results_raw <- do.call(gen_fun, par_list) + results_json <- test_if_json(results_raw) return(results_json) diff --git a/R/gen_meta_data.R b/R/gen_meta_data.R index 5bc4f77..cf7c6a2 100644 --- a/R/gen_meta_data.R +++ b/R/gen_meta_data.R @@ -2,11 +2,13 @@ #' #' @description Function to search for meta-information for a specific statistic. #' -#' @param code a string with a maximum length of 15 characters. Code from a Genesis-Object. Only one code per iteration. -#' @param error.ignore a logical. Indicator if the function should stop if an error occurs or no object for the request is found or if it should produce a token as response. -#' @param ... Additional parameters for the Genesis API call. These parameters are only affecting the Genesis call itself, no further processing. For more details see `vignette("additional_parameter")`. +#' @param code A string with a maximum length of 15 characters. Code from a Genesis/Zensus-Object. Only one code per iteration. +#' @param database Character string. Indicator if the Genesis or Zensus database is called. Only one database can be addressed per function call. Default option is 'genesis'. +#' @param area A string. Indicator from which area of the database the results are called. In general, "all" is the appropriate solution. Default option is 'all'. Only used for Genesis. +#' @param error.ignore A logical. Indicator if the function should stop if an error occurs or no object for the request is found or if it should produce a token as response. Default option is 'FALSE'. +#' @param ... Additional parameters for the Genesis/Zensus API call. These parameters are only affecting the Genesis/Zensus call itself, no further processing. For more details see `vignette("additional_parameter")`. #' -#' @return A list with all recalled elements from Genesis. Attributes are added to the dataframe describing the search configuration for the returned output. +#' @return A list with all recalled elements from Genesis/Zensus. Attributes are added to the dataframe describing the search configuration for the returned output. #' @export #' #' @examples @@ -16,19 +18,49 @@ #' } #' gen_metadata_stats <- function(code = NULL, + database = c("genesis", "zensus"), + area = c("all", "public", "user"), error.ignore = FALSE, ...) { + caller <- as.character(match.call()[1]) + + gen_fun <- test_database_function(database) + check_function_input(code = code, - error.ignore = error.ignore) + error.ignore = error.ignore, + caller = caller) + + area <- match.arg(area) + + area <- switch(area, all = "all", public = "\u00F6ffentlich", user = "benutzer") #----------------------------------------------------------------------------- - results_raw <- gen_api("metadata/statistic", - username = gen_auth_get()$username, - password = gen_auth_get()$password, - name = code, - ...) + if(gen_fun == "gen_api"){ + + par_list <- list( + endpoint = "metadata/statistic", + username = gen_auth_get()$username, + password = gen_auth_get()$password, + name = code, + area = area, + ... + ) + + } else if ( gen_fun == "gen_zensus_api"){ + + par_list <- list( + endpoint = "metadata/statistic", + username = gen_zensus_auth_get()$username, + password = gen_zensus_auth_get()$password, + name = code, + ... + ) + + } + + results_raw <- do.call(gen_fun, par_list) results_json <- test_if_json(results_raw) @@ -57,6 +89,7 @@ gen_metadata_stats <- function(code = NULL, } attr(df_stats, "Code") <- results_json$Parameter$name + attr(df_stats, "Database") <- database[1] attr(df_stats, "Method") <- results_json$Ident$Method attr(df_stats, "Updated") <- results_json$Object$Updated attr(df_stats, "Language") <- results_json$Parameter$language @@ -71,11 +104,13 @@ gen_metadata_stats <- function(code = NULL, #' #' @description Function to search for meta-information for a specific variable. #' -#' @param code a string with a maximum length of 15 characters. Code from a Genesis-Object. Only one code per iteration. "*"-Notation is possible. -#' @param error.ignore a logical. Indicator if the function should stop if an error occurs or no object for the request is found or if it should produce a token as response. -#' @param ... Additional parameters for the Genesis API call. These parameters are only affecting the Genesis call itself, no further processing. For more details see `vignette("additional_parameter")`. +#' @param code A string with a maximum length of 15 characters. Code from a Genesis/Zensus-Object. Only one code per iteration. "*"-Notation is possible. +#' @param database Character string. Indicator if the Genesis or Zensus database is called. Only one database can be addressed per function call. Default option is 'genesis'. +#' @param area A string. Indicator from which area of the database the results are called. In general, "all" is the appropriate solution. Default option is 'all'. Only used for Genesis. +#' @param error.ignore A logical. Indicator if the function should stop if an error occurs or no object for the request is found or if it should produce a token as response. Default option is 'FALSE'. +#' @param ... Additional parameters for the Genesis/Zensus API call. These parameters are only affecting the Genesis/Zensus call itself, no further processing. For more details see `vignette("additional_parameter")`. #' -#' @return A list with all recalled elements from Genesis. Attributes are added to the dataframe describing the search configuration for the returned output. +#' @return A list with all recalled elements from Genesis/Zensus. Attributes are added to the dataframe describing the search configuration for the returned output. #' @export #' #' @examples @@ -85,19 +120,49 @@ gen_metadata_stats <- function(code = NULL, #' } #' gen_metadata_var <- function(code = NULL, + database = c("genesis", "zensus"), + area = c("all", "public", "user"), error.ignore = FALSE, ...) { + caller <- as.character(match.call()[1]) + + gen_fun <- test_database_function(database) + check_function_input(code = code, - error.ignore = error.ignore) + error.ignore = error.ignore, + caller = caller) + + area <- match.arg(area) + + area <- switch(area, all = "all", public = "\u00F6ffentlich", user = "benutzer") #----------------------------------------------------------------------------- - results_raw <- gen_api("metadata/variable", - username = gen_auth_get()$username, - password = gen_auth_get()$password, - name = code, - ...) + if(gen_fun == "gen_api"){ + + par_list <- list( + endpoint = "metadata/variable", + username = gen_auth_get()$username, + password = gen_auth_get()$password, + name = code, + area = area, + ... + ) + + } else if ( gen_fun == "gen_zensus_api"){ + + par_list <- list( + endpoint = "metadata/variable", + username = gen_zensus_auth_get()$username, + password = gen_zensus_auth_get()$password, + name = code, + ... + ) + + } + + results_raw <- do.call(gen_fun, par_list) results_json <- test_if_json(results_raw) @@ -127,6 +192,7 @@ gen_metadata_var <- function(code = NULL, "Information" = results_json$Object$Information) attr(list_resp, "Code") <- results_json$Parameter$name + attr(list_resp, "Database") <- database[1] attr(list_resp, "Method") <- results_json$Ident$Method attr(list_resp, "Updated") <- results_json$Object$Updated attr(list_resp, "Language") <- results_json$Parameter$language @@ -141,11 +207,13 @@ gen_metadata_var <- function(code = NULL, #' #' @description Function to search for meta-information for a specific value. #' -#' @param code a string with a maximum length of 15 characters. Code from a Genesis-Object. Only one code per iteration. -#' @param error.ignore a logical. Indicator if the function should stop if an error occurs or no object for the request is found or if it should produce a token as response. -#' @param ... Additional parameters for the Genesis API call. These parameters are only affecting the Genesis call itself, no further processing. For more details see `vignette("additional_parameter")`. +#' @param code A string with a maximum length of 15 characters. Code from a Genesis/Zensus-Object. Only one code per iteration. +#' @param database Character string. Indicator if the Genesis or Zensus database is called. Only one database can be addressed per function call. Default option is 'genesis'. +#' @param area A string. Indicator from which area of the database the results are called. In general, "all" is the appropriate solution. Default option is 'all'. Only used for Genesis. +#' @param error.ignore A logical. Indicator if the function should stop if an error occurs or no object for the request is found or if it should produce a token as response. Default option is 'FALSE'. +#' @param ... Additional parameters for the Genesis/Zensus API call. These parameters are only affecting the Genesis/Zensus call itself, no further processing. For more details see `vignette("additional_parameter")`. #' -#' @return A list with all recalled elements from Genesis. Attributes are added to the dataframe describing the search configuration for the returned output. +#' @return A list with all recalled elements from Genesis/Zensus. Attributes are added to the dataframe describing the search configuration for the returned output. #' @export #' #' @examples @@ -155,19 +223,49 @@ gen_metadata_var <- function(code = NULL, #' } #' gen_metadata_val <- function(code = NULL, + database = c("genesis", "zensus"), + area = c("all", "public", "user"), error.ignore = FALSE, ...) { + caller <- as.character(match.call()[1]) + + gen_fun <- test_database_function(database) + check_function_input(code = code, - error.ignore = error.ignore) + error.ignore = error.ignore, + caller = caller) + + area <- match.arg(area) + + area <- switch(area, all = "all", public = "\u00F6ffentlich", user = "benutzer") #----------------------------------------------------------------------------- - results_raw <- gen_api("metadata/value", - username = gen_auth_get()$username, - password = gen_auth_get()$password, - name = code, - ...) + if(gen_fun == "gen_api"){ + + par_list <- list( + endpoint = "metadata/value", + username = gen_auth_get()$username, + password = gen_auth_get()$password, + name = code, + area = area, + ... + ) + + } else if ( gen_fun == "gen_zensus_api"){ + + par_list <- list( + endpoint = "metadata/value", + username = gen_zensus_auth_get()$username, + password = gen_zensus_auth_get()$password, + name = code, + ... + ) + + } + + results_raw <- do.call(gen_fun, par_list) results_json <- test_if_json(results_raw) @@ -194,6 +292,7 @@ gen_metadata_val <- function(code = NULL, "Information" = results_json$Object$Information) attr(list_resp, "Code") <- results_json$Parameter$name + attr(list_resp, "Database") <- database[1] attr(list_resp, "Method") <- results_json$Ident$Method attr(list_resp, "Updated") <- results_json$Object$Updated attr(list_resp, "Language") <- results_json$Parameter$language @@ -208,11 +307,13 @@ gen_metadata_val <- function(code = NULL, #' #' @description Function to search for meta-information for a specific table. #' -#' @param code a string with a maximum length of 15 characters. Code from a Genesis-Object. Only one code per iteration. -#' @param error.ignore a logical. Indicator if the function should stop if an error occurs or no object for the request is found or if it should produce a token as response. -#' @param ... Additional parameters for the Genesis API call. These parameters are only affecting the Genesis call itself, no further processing. For more details see `vignette("additional_parameter")`. +#' @param code A string with a maximum length of 15 characters. Code from a Genesis/Zensus-Object. Only one code per iteration. +#' @param database Character string. Indicator if the Genesis or Zensus database is called. Only one database can be addressed per function call. Default option is 'genesis'. +#' @param area A string. Indicator from which area of the database the results are called. In general, "all" is the appropriate solution. Default option is 'all'. Used for both databases. +#' @param error.ignore A logical. Indicator if the function should stop if an error occurs or no object for the request is found or if it should produce a token as response. Default option is 'FALSE'. +#' @param ... Additional parameters for the Genesis/Zensus API call. These parameters are only affecting the Genesis/Zensus call itself, no further processing. For more details see `vignette("additional_parameter")`. #' -#' @return A list with all recalled elements from Genesis. Attributes are added to the dataframe describing the search configuration for the returned output. +#' @return A list with all recalled elements from Genesis/Zensus. Attributes are added to the dataframe describing the search configuration for the returned output. #' @export #' #' @examples @@ -222,19 +323,50 @@ gen_metadata_val <- function(code = NULL, #' } #' gen_metadata_tab <- function(code = NULL, + database = c("genesis", "zensus"), + area = c("all", "public", "user"), error.ignore = FALSE, ...) { + caller <- as.character(match.call()[1]) + + gen_fun <- test_database_function(database) + check_function_input(code = code, - error.ignore = error.ignore) + error.ignore = error.ignore, + caller = caller) + + area <- match.arg(area) + + area <- switch(area, all = "all", public = "\u00F6ffentlich", user = "benutzer") #----------------------------------------------------------------------------- - results_raw <- gen_api("metadata/table", - username = gen_auth_get()$username, - password = gen_auth_get()$password, - name = code, - ...) + if(gen_fun == "gen_api"){ + + par_list <- list( + endpoint = "metadata/table", + username = gen_auth_get()$username, + password = gen_auth_get()$password, + name = code, + area = area, + ... + ) + + } else if ( gen_fun == "gen_zensus_api"){ + + par_list <- list( + endpoint = "metadata/table", + username = gen_zensus_auth_get()$username, + password = gen_zensus_auth_get()$password, + name = code, + area = area, + ... + ) + + } + + results_raw <- do.call(gen_fun, par_list) results_json <- test_if_json(results_raw) @@ -338,6 +470,7 @@ gen_metadata_tab <- function(code = NULL, "Embedded_in" = embedded) attr(list_resp, "Code") <- results_json$Parameter$name + attr(list_resp, "Database") <- database[1] attr(list_resp, "Method") <- results_json$Ident$Method attr(list_resp, "Updated") <- results_json$Object$Updated attr(list_resp, "Language") <- results_json$Parameter$language @@ -350,10 +483,11 @@ gen_metadata_tab <- function(code = NULL, #' gen_metadata_cube #' -#' @description Function to search for meta-information for a specific cube. +#' @description Function to search for meta-information for a specific cube. Usable only for Genesis. #' -#' @param code a string with a maximum length of 15 characters. Code from a Genesis-Object. Only one code per iteration. -#' @param error.ignore a logical. Indicator if the function should stop if an error occurs or no object for the request is found or if it should produce a token as response. +#' @param code A string with a maximum length of 15 characters. Code from a Genesis-Object. Only one code per iteration. +#' @param area A string. Indicator from which area of the database the results are called. In general, "all" is the appropriate solution. Default option is 'all'. Only used for Genesis. +#' @param error.ignore A logical. Indicator if the function should stop if an error occurs or no object for the request is found or if it should produce a token as response. Default option is 'FALSE'. #' @param ... Additional parameters for the Genesis API call. These parameters are only affecting the Genesis call itself, no further processing. For more details see `vignette("additional_parameter")`. #' #' @return A list with all recalled elements from Genesis. Attributes are added to the dataframe describing the search configuration for the returned output. @@ -367,17 +501,23 @@ gen_metadata_tab <- function(code = NULL, #' gen_metadata_cube <- function(code = NULL, error.ignore = FALSE, + area = c("all", "public", "user"), ...) { check_function_input(code = code, error.ignore = error.ignore) + area <- match.arg(area) + + area <- switch(area, all = "all", public = "\u00F6ffentlich", user = "benutzer") + #----------------------------------------------------------------------------- results_raw <- gen_api("metadata/cube", username = gen_auth_get()$username, password = gen_auth_get()$password, name = code, + area = area, ...) results_json <- test_if_json(results_raw) @@ -460,6 +600,7 @@ gen_metadata_cube <- function(code = NULL, "Structure" = structure) attr(list_resp, "Code") <- results_json$Parameter$name + attr(list_resp, "Database") <- "genesis" attr(list_resp, "Method") <- results_json$Ident$Method attr(list_resp, "Updated") <- results_json$Object$Updated attr(list_resp, "Language") <- results_json$Parameter$language @@ -474,12 +615,14 @@ gen_metadata_cube <- function(code = NULL, #' #' @description Search For Meta-Information For All Types Of Objects #' -#' @param code string with a maximum length of 15 characters. Code from a Genesis-Object. Only one code per iteration. -#' @param category a string. Specific object-types: 'Cube', 'Statistic', "Table", "Variable" and 'Value'. The function needs a specified object type. -#' @param error.ignore a logical. Indicator if the function should stop if an error occurs or no object for the request is found or if it should produce a token as response. -#' @param ... Additional parameters for the Genesis API call. These parameters are only affecting the Genesis call itself, no further processing. For more details see `vignette("additional_parameter")`. +#' @param code A string with a maximum length of 15 characters. Code from a Genesis/Zensus-Object. Only one code per iteration. +#' @param database Character string. Indicator if the Genesis or Zensus database is called. Only one database can be addressed per function call. Default option is 'genesis'. +#' @param category A string. Specific object-types: 'Cube', 'Statistic', "Table", "Variable" and 'Value'. The function needs a specified object type. +#' @param area A string. Indicator from which area of the database the results are called. In general, "all" is the appropriate solution. Default option is 'all'. Only used for Genesis. +#' @param error.ignore A logical. Indicator if the function should stop if an error occurs or no object for the request is found or if it should produce a token as response. Default option is 'FALSE'. +#' @param ... Additional parameters for the Genesis/Zensus API call. These parameters are only affecting the Genesis/Zensus call itself, no further processing. For more details see `vignette("additional_parameter")`. #' -#' @return A list with all recalled elements from Genesis. Attributes are added to the dataframe describing the search configuration for the returned output. +#' @return A list with all recalled elements from Genesis/Zensus. Attributes are added to the dataframe describing the search configuration for the returned output. #' @export #' #' @examples @@ -489,15 +632,20 @@ gen_metadata_cube <- function(code = NULL, #' } #' gen_metadata <- function(code = NULL, + database = c("genesis", "zensus"), category = c("Cube", "Statistic", "Table", "Variable", "Value"), + area = c("all", "public", "user"), error.ignore = FALSE, ...) { caller <- as.character(match.call()[1]) + gen_fun <- test_database_function(database) + check_function_input(code = code, - category = category, error.ignore = error.ignore, + category = category, + database = gen_fun, caller = caller) #----------------------------------------------------------------------------- @@ -508,24 +656,36 @@ gen_metadata <- function(code = NULL, } else if (category == "Value") { - gen_metadata_val(code = code, error.ignore = error.ignore, ...) + gen_metadata_val(code = code, + database = database, + area = area, + error.ignore = error.ignore, ...) } else if (category == "Variable") { - gen_metadata_var(code = code, error.ignore = error.ignore, ...) + gen_metadata_var(code = code, + database = database, + area = area, + error.ignore = error.ignore, ...) } else if (category == "Table") { - gen_metadata_tab(code = code, error.ignore = error.ignore, ...) + gen_metadata_tab(code = code, + database = database, + area = area, + error.ignore = error.ignore, ...) } else if (category == "Statistic") { - gen_metadata_stats(code = code, error.ignore = error.ignore, ...) + gen_metadata_stats(code = code, + database = database, + area = area, + error.ignore = error.ignore, ...) } else { stop("Category is not found, please select a correct category. - Available categories are Cube, Statistic, Table, Variable, or Value. + Available categories are Cube, Statistic, Table, Variable, or Value for Genesis and Statistic, Table, Variable, or Value for Zensus. Please choose one of them.", call. = TRUE) } } diff --git a/R/gen_modified_data.R b/R/gen_modified_data.R index 495e38d..c0dd800 100644 --- a/R/gen_modified_data.R +++ b/R/gen_modified_data.R @@ -1,13 +1,14 @@ -#' gen_modified_data: Explore New Added Objects or Changed Objects in Genesis +#' gen_modified_data: Explore New Added Objects or Changed Objects in Genesis/Zensus #' -#' @description Function to check for updates, changes, or new objects in Genesis based on a specific date. +#' @description Function to check for updates, changes, or new objects in Genesis/Zensus based on a specific date. #' -#' @param code a string with a maximum length of 15 characters. Code from a Genesis object. Only one code per iteration. "*" notations are possible. Empty code (default value) includes all changes, updates, and new added objects. -#' @param type a string. Specific Genesis object type: 'tables', 'statistics', and 'statisticsUpdates'. All three can be accessed through "all", which is the default. -#' @param date a string. Specific date that is used as the last update or upload time in Genesis to include a Genesis object in return. Default option is 'now', which uses the current date of your system. Alternative options are 'week_before', using the current date of your system minus 7 days, 'month_before', using the current date of your system minus 4 weeks, and 'year_before', using the current date of your system minus 52 weeks. Additionally, it is possible to fill in a specific date of format 'DD.MM.YYYY'. -#' @param ... Additional parameters for the Genesis API call. These parameters are only affecting the Genesis call itself, no further processing. For more details see `vignette("additional_parameter")`. +#' @param code A string with a maximum length of 15 characters. Code from a Genesis/Zensus object. Only one code per iteration. "*" notations are possible. Empty code (default value) includes all changes, updates, and new added objects. +#' @param database Character string. Indicator if the Genesis or Zensus database is called. Default option is 'genesis'. +#' @param type A string. Specific Genesis object type: 'tables', 'statistics', and 'statisticsUpdates'. Specific Zensus object type: 'tables' and 'statistics'. All types that are specific for one database can be used together through "all", which is the default. +#' @param date A string. Specific date that is used as the last update or upload time in Genesis/Zensus to include a Genesis/Zensus object in return. Default option is 'now', which uses the current date of your system. Alternative options are 'week_before', using the current date of your system minus 7 days, 'month_before', using the current date of your system minus 4 weeks, and 'year_before', using the current date of your system minus 52 weeks. Additionally, it is possible to fill in a specific date of format 'DD.MM.YYYY'. +#' @param ... Additional parameters for the Genesis/Zensus API call. These parameters are only affecting the Genesis/Zensus call itself, no further processing. For more details see `vignette("additional_parameter")`. #' -#' @return A list with all recalled elements from Genesis. Always includes the code of the object, the title, and the type of the object. This is done to facilitate further processing with the data. Attributes are added to the data.frame describing the search configuration for the returned output. +#' @return A list with all recalled elements from Genesis/Zensus. Always includes the code of the object, the title, and the type of the object. This is done to facilitate further processing with the data. Attributes are added to the data.frame describing the search configuration for the returned output. #' @export #' #' @examples @@ -23,13 +24,19 @@ #' } #' gen_modified_data <- function(code = "", + database = c("genesis", "zensus"), type = c("all", "tables", "statistics", "statisticsUpdates"), date = c("now", "week_before", "month_before", "year_before"), ...) { + gen_fun <- test_database_function(database) + + type <- match.arg(type) + date <- check_function_input(code = code, type = type, - date = date) + date = date, + database = gen_fun) #----------------------------------------------------------------------------- @@ -52,20 +59,38 @@ gen_modified_data <- function(code = "", } - type <- match.arg(type) - #----------------------------------------------------------------------------- # Processing #### if (type == "tables") { - results_raw <- gen_api("catalogue/modifieddata", - username = gen_auth_get()$username, - password = gen_auth_get()$password, - selection = code, - type = "Neue Tabellen", - date = date, - ...) + if(gen_fun == "gen_api"){ + + par_list <- list( + endpoint = "catalogue/modifieddata", + username = gen_auth_get()$username, + password = gen_auth_get()$password, + selection = code, + type = "Neue Tabellen", + date = date, + ... + ) + + } else if ( gen_fun == "gen_zensus_api"){ + + par_list <- list( + endpoint = "catalogue/modifieddata", + username = gen_zensus_auth_get()$username, + password = gen_zensus_auth_get()$password, + selection = code, + type = "Neue Tabellen", + date = date, + ... + ) + + } + + results_raw <- do.call(gen_fun, par_list) results_json <- test_if_json(results_raw) @@ -76,13 +101,33 @@ gen_modified_data <- function(code = "", if (type == "statistics") { - results_raw <- gen_api("catalogue/modifieddata", - username = gen_auth_get()$username, - password = gen_auth_get()$password, - selection = code, - type = "Neue Statistiken", - date = date, - ...) + if(gen_fun == "gen_api"){ + + par_list <- list( + endpoint = "catalogue/modifieddata", + username = gen_auth_get()$username, + password = gen_auth_get()$password, + selection = code, + type = "Neue Statistiken", + date = date, + ... + ) + + } else if ( gen_fun == "gen_zensus_api"){ + + par_list <- list( + endpoint = "catalogue/modifieddata", + username = gen_zensus_auth_get()$username, + password = gen_zensus_auth_get()$password, + selection = code, + type = "Neue Statistiken", + date = date, + ... + ) + + } + + results_raw <- do.call(gen_fun, par_list) results_json <- test_if_json(results_raw) @@ -93,13 +138,21 @@ gen_modified_data <- function(code = "", if (type == "statisticsUpdates") { - results_raw <- gen_api("catalogue/modifieddata", - username = gen_auth_get()$username, - password = gen_auth_get()$password, - selection = code, - type = "Aktualisierte Statistiken", - date = date, - ...) + if(gen_fun == "gen_api"){ + + par_list <- list( + endpoint = "catalogue/modifieddata", + username = gen_auth_get()$username, + password = gen_auth_get()$password, + selection = code, + type = "Aktualisierte Statistiken", + date = date, + ... + ) + + } + + results_raw <- do.call(gen_fun, par_list) results_json <- test_if_json(results_raw) @@ -110,13 +163,33 @@ gen_modified_data <- function(code = "", if (type == "all") { - results_raw <- gen_api("catalogue/modifieddata", - username = gen_auth_get()$username, - password = gen_auth_get()$password, - selection = code, - type = "all", - date = date, - ...) + if(gen_fun == "gen_api"){ + + par_list <- list( + endpoint = "catalogue/modifieddata", + username = gen_auth_get()$username, + password = gen_auth_get()$password, + selection = code, + type = "all", + date = date, + ... + ) + + } else if ( gen_fun == "gen_zensus_api"){ + + par_list <- list( + endpoint = "catalogue/modifieddata", + username = gen_zensus_auth_get()$username, + password = gen_zensus_auth_get()$password, + selection = code, + type = "all", + date = date, + ... + ) + + } + + results_raw <- do.call(gen_fun, par_list) results_json <- test_if_json(results_raw) @@ -147,6 +220,7 @@ gen_modified_data <- function(code = "", list_resp <- list("Modified" = table) attr(list_resp, "Code") <- results_json$Parameter$selection + attr(list_resp, "Database") <- database[1] attr(list_resp, "Type") <- results_json$Parameter$type attr(list_resp, "Date") <- results_json$Parameter$date attr(list_resp, "Language") <- results_json$Parameter$language diff --git a/R/gen_objects2stat.R b/R/gen_objects2stat.R index 750bd6e..7799e57 100644 --- a/R/gen_objects2stat.R +++ b/R/gen_objects2stat.R @@ -1,14 +1,17 @@ #' gen_objects2stat: Get Objects Related To Statistics #' -#' Function to find objects related to a statistic in Genesis. +#' Function to find objects related to a statistic in Genesis/Zensus. #' -#' @param code a string with a maximum length of 6 characters (15 characters if cubes are not used as a category). Code from a Genesis-Object. Only one code per iteration. -#' @param category a string. Specific object-types: 'tables', 'variables', and 'cubes'. All three together are possible and the default option. -#' @param detailed a logical. Indicator if function should return the detailed output of the iteration including all object-related information or only a shortened output including only code and object title. The default is detailed = FALSE. -#' @param error.ignore a logical. Indicator if the function should stop if an error occurs or no object for the request is found or if it should produce a token as response. -#' @param ... Additional parameters for the Genesis API call. These parameters are only affecting the Genesis call itself, no further processing. For more details see `vignette("additional_parameter")`. +#' @param code A string with a maximum length of 6 characters (15 characters if cubes are not used as a category). Code from a Genesis/Zensus-Object. Only one code per iteration. +#' @param database Character string. Indicator if the Genesis or Zensus database is called. Only one database can be addressed per function call. Default option is 'genesis'. +#' @param category A string. Includes specific Genesis-Object-types: 'tables', 'variables', and 'cubes' - and specific Zensus-Object-types: "tables" and "variables". All types that are specific for one database can be used together. Default option is to use all types that are possible for the specific database. +#' @param area A string. Indicator from which area of the database the results are called. In general, "all" is the appropriate solution. Default option is 'all'. +#' @param detailed A logical. Indicator if function should return the detailed output of the iteration including all object-related information or only a shortened output including only code and object title. The default is detailed = FALSE. +#' @param error.ignore A logical. Indicator if the function should stop if an error occurs or no object for the request is found or if it should produce a token as response. Default option is 'FALSE'. +#' @param sortcriterion A string. Indicator if the output should be sorted by 'code' or 'content'. This is a parameter of the Genesis/Zensus API call itself. The default is "code". +#' @param ... Additional parameters for the Genesis/Zensus API call. These parameters are only affecting the Genesis/Zensus call itself, no further processing. For more details see `vignette("additional_parameter")`. #' -#' @return A list with all recalled elements from Genesis Based on the detailed-parameter it contains more or less information, but always includes the code of the object, the title, and the type of the object. This is done to facilitate further processing of the data. Attributes are added to the dataframe describing the search configuration for the returned output. +#' @return A list with all recalled elements from Genesis/Zensus based on the detailed-parameter it contains more or less information, but always includes the code of the object, the title, and the type of the object. This is done to facilitate further processing of the data. Attributes are added to the dataframe describing the search configuration for the returned output. #' @export #' #' @examples @@ -23,28 +26,63 @@ #' } #' gen_objects2stat <- function(code = NULL, + database = c("genesis", "zensus"), category = c("tables", "variables", "cubes"), + area = c("all", "public", "user"), detailed = FALSE, error.ignore = FALSE, + sortcriterion = c("code", "content"), ...) { caller <- as.character(match.call()[1]) + gen_fun <- test_database_function(database) + check_function_input(code = code, category = category, detailed = detailed, error.ignore = error.ignore, + database = gen_fun, + sortcriterion = sortcriterion, caller = caller) + area <- match.arg(area) + + area <- switch(area, all = "all", public = "\u00F6ffentlich", user = "benutzer") + + sortcriterion <- match.arg(sortcriterion) + #------------------------------------------------------------------------------- if ("tables" %in% category) { - results_raw <- gen_api("catalogue/tables2statistic", - username = gen_auth_get()$username, - password = gen_auth_get()$password, - name = code, - ...) + if(gen_fun == "gen_api"){ + + par_list <- list( + endpoint = "catalogue/tables2statistic", + username = gen_auth_get()$username, + password = gen_auth_get()$password, + name = code, + area = area, + sortcriterion = sortcriterion, + ... + ) + + } else if ( gen_fun == "gen_zensus_api"){ + + par_list <- list( + endpoint = "catalogue/tables2statistic", + username = gen_zensus_auth_get()$username, + password = gen_zensus_auth_get()$password, + name = code, + area = area, + sortcriterion = sortcriterion, + ... + ) + + } + + results_raw <- do.call(gen_fun, par_list) results_json <- test_if_json(results_raw) @@ -84,11 +122,32 @@ gen_objects2stat <- function(code = NULL, if ("variables" %in% category) { - results_raw <- gen_api("catalogue/variables2statistic", - username = gen_auth_get()$username, - password = gen_auth_get()$password, - name = code, - ...) + if(gen_fun == "gen_api"){ + + par_list <- list( + endpoint = "catalogue/variables2statistic", + username = gen_auth_get()$username, + password = gen_auth_get()$password, + name = code, + area = area, + sortcriterion = sortcriterion, + ... + ) + + } else if ( gen_fun == "gen_zensus_api"){ + + par_list <- list( + endpoint = "catalogue/variables2statistic", + username = gen_zensus_auth_get()$username, + password = gen_zensus_auth_get()$password, + name = code, + sortcriterion = sortcriterion, + ... + ) + + } + + results_raw <- do.call(gen_fun, par_list) results_json <- test_if_json(results_raw) @@ -129,13 +188,23 @@ gen_objects2stat <- function(code = NULL, #----------------------------------------------------------------------------- - if ("cubes" %in% category) { + if ("cubes" %in% category && gen_fun == "gen_zensus_api") { + + df_cubes <- "No 'cubes' object available for 'zensus'-database." + + return(df_cubes) + + } else if ("cubes" %in% category && gen_fun == "gen_api") { - results_raw <- gen_api("catalogue/cubes2statistic", - username = gen_auth_get()$username, - password = gen_auth_get()$password, - name = code, - ...) + results_raw <- do.call(gen_fun, list( + endpoint = "catalogue/cubes2statistic", + username = gen_auth_get()$username, + password = gen_auth_get()$password, + name = code, + area = area, + sortcriterion = sortcriterion, + ... + )) results_json <- test_if_json(results_raw) @@ -199,6 +268,7 @@ gen_objects2stat <- function(code = NULL, } attr(list_resp, "Code") <- results_json$Parameter$term + attr(list_resp, "Database") <- database[1] attr(list_resp, "Category") <- category attr(list_resp, "Language") <- results_json$Parameter$language attr(list_resp, "Pagelength") <- results_json$Parameter$pagelength diff --git a/R/gen_objects2var.R b/R/gen_objects2var.R index e8ada7d..0817918 100644 --- a/R/gen_objects2var.R +++ b/R/gen_objects2var.R @@ -1,14 +1,17 @@ #' gen_objects2var: Get Objects Related To Variable #' -#' @description Function to find objects related to a variable in Genesis. +#' @description Function to find objects related to a variable in Genesis/Zensus. #' -#' @param code a string with a maximum length of 15 characters. Code from a Genesis-Object. Only one code per iteration. -#' @param category a string. Specific object-types: 'tables', 'statistics', and 'cubes'. All three together are possible and the default option. -#' @param detailed a logical. Indicator if function should return the detailed output of the iteration including all object-related information or only a shortened output including only code and object title. The default is detailed = FALSE. -#' @param error.ignore a logical. Indicator if the function should stop if an error occurs or no object for the request is found or if it should produce a token as response. -#' @param ... Additional parameters for the Genesis API call. These parameters are only affecting the Genesis call itself, no further processing. For more details see `vignette("additional_parameter")`. +#' @param code A string with a maximum length of 15 characters. Code from a Genesis/Zensus-Object. Only one code per iteration. +#' @param database Character string. Indicator if the Genesis or Zensus database is called. Only one database can be addressed per function call. Default option is 'genesis'. +#' @param category A string. Includes specific Genesis-Object-types: 'tables', 'statistics', and 'cubes' - and specific Zensus-Object-types: "tables" and "statistics". All types that are specific for one database can be used together. Default option is to use all types that are possible for the specific database. +#' @param area A string. Indicator from which area of the database the results are called. In general, "all" is the appropriate solution. Default option is 'all'. +#' @param detailed A logical. Indicator if function should return the detailed output of the iteration including all object-related information or only a shortened output including only code and object title. The default is detailed = FALSE. +#' @param error.ignore A logical. Indicator if the function should stop if an error occurs or no object for the request is found or if it should produce a token as response. Default option is 'FALSE'. +#' @param sortcriterion A string. Indicator if the output should be sorted by 'code' or 'content'. This is a parameter of the Genesis/Zensus API call itself. The default is "code". +#' @param ... Additional parameters for the Genesis/Zensus API call. These parameters are only affecting the Genesis/Zensus call itself, no further processing. For more details see `vignette("additional_parameter")`. #' -#' @return A list with all recalled elements from Genesis. Based on the detailed-parameter it contains more or less information, but always includes the code of the object, the title, and the type of the object. This is done to facilitate further processing of the data. Attributes are added to the dataframe describing the search configuration for the returned output. +#' @return A list with all recalled elements from Genesis/Zensus. Based on the detailed-parameter it contains more or less information, but always includes the code of the object, the title, and the type of the object. This is done to facilitate further processing of the data. Attributes are added to the dataframe describing the search configuration for the returned output. #' @export #' #' @examples @@ -23,28 +26,63 @@ #' } #' gen_objects2var <- function(code = NULL, + database = c("genesis", "zensus"), category = c("tables", "statistics", "cubes"), + area = c("all", "public", "user"), detailed = FALSE, error.ignore = FALSE, + sortcriterion = c("code", "content"), ...) { caller <- as.character(match.call()[1]) + gen_fun <- test_database_function(database) + check_function_input(code = code, category = category, detailed = detailed, error.ignore = error.ignore, + database = gen_fun, + sortcriterion = sortcriterion, caller = caller) + area <- match.arg(area) + + area <- switch(area, all = "all", public = "\u00F6ffentlich", user = "benutzer") + + sortcriterion <- match.arg(sortcriterion) + #----------------------------------------------------------------------------- if ("tables" %in% category) { - results_raw <- gen_api("catalogue/tables2variable", - username = gen_auth_get()$username, - password = gen_auth_get()$password, - name = code, - ...) + if(gen_fun == "gen_api"){ + + par_list <- list( + endpoint = "catalogue/tables2variable", + username = gen_auth_get()$username, + password = gen_auth_get()$password, + name = code, + area = area, + sortcriterion = sortcriterion, + ... + ) + + } else if ( gen_fun == "gen_zensus_api"){ + + par_list <- list( + endpoint = "catalogue/tables2variable", + username = gen_zensus_auth_get()$username, + password = gen_zensus_auth_get()$password, + name = code, + area = area, + sortcriterion = sortcriterion, + ... + ) + + } + + results_raw <- do.call(gen_fun, par_list) results_json <- test_if_json(results_raw) @@ -86,11 +124,32 @@ gen_objects2var <- function(code = NULL, if ("statistics" %in% category) { - results_raw <- gen_api("catalogue/statistics2variable", - username = gen_auth_get()$username, - password = gen_auth_get()$password, - name = code, - ...) + if(gen_fun == "gen_api"){ + + par_list <- list( + endpoint = "catalogue/statistics2variable", + username = gen_auth_get()$username, + password = gen_auth_get()$password, + name = code, + area = area, + sortcriterion = sortcriterion, + ... + ) + + } else if ( gen_fun == "gen_zensus_api"){ + + par_list <- list( + endpoint = "catalogue/statistics2variable", + username = gen_zensus_auth_get()$username, + password = gen_zensus_auth_get()$password, + name = code, + sortcriterion = sortcriterion, + ... + ) + + } + + results_raw <- do.call(gen_fun, par_list) results_json <- test_if_json(results_raw) @@ -129,13 +188,23 @@ gen_objects2var <- function(code = NULL, #----------------------------------------------------------------------------- - if ("cubes" %in% category) { + if ("cubes" %in% category && gen_fun == "gen_zensus_api") { + + df_cubes <- "No 'cubes' object available for 'zensus'-database." + + return(df_cubes) + + } else if ("cubes" %in% category && gen_fun == "gen_api") { - results_raw <- gen_api("catalogue/timeseries2variable", - username = gen_auth_get()$username, - password = gen_auth_get()$password, - name = code, - ...) + results_raw <- do.call(gen_fun, list( + endpoint = "catalogue/timeseries2variable", + username = gen_auth_get()$username, + password = gen_auth_get()$password, + name = code, + area = area, + sortcriterion = sortcriterion, + ... + )) results_json <- test_if_json(results_raw) @@ -200,6 +269,7 @@ gen_objects2var <- function(code = NULL, } attr(list_resp, "Code") <- results_json$Parameter$term + attr(list_resp, "Database") <- database[1] attr(list_resp, "Category") <- category attr(list_resp, "Language") <- results_json$Parameter$language attr(list_resp, "Pagelength") <- results_json$Parameter$pagelength diff --git a/R/gen_table.R b/R/gen_table.R index 556450b..f3edf36 100644 --- a/R/gen_table.R +++ b/R/gen_table.R @@ -51,7 +51,7 @@ gen_table <- function(name, ...) { gen_table_ <- function(name, database = c("genesis", "zensus"), - area = c("public", "user"), + area = c("all", "public", "user"), compress = FALSE, transpose = FALSE, startyear = 1900, @@ -70,7 +70,7 @@ gen_table_ <- function(name, area <- match.arg(area) if (!isTRUE(language == "en")) { - area <- switch(area, public = "\u00F6ffentlich", user = "benutzer") + area <- switch(area, all = "all", public = "\u00F6ffentlich", user = "benutzer") } param_check_year(startyear) diff --git a/R/gen_var2-val2.R b/R/gen_var2-val2.R index 8cbe072..d0ba304 100644 --- a/R/gen_var2-val2.R +++ b/R/gen_var2-val2.R @@ -1,14 +1,16 @@ #' gen_var2stat: Get Variables From a Statistic #' -#' @description Function to generate variables from statistics in Genesis. +#' @description Function to generate variables from statistics in Genesis/Zensus. #' -#' @param code a string with a maximum length of 15 characters. Code from a Genesis-Object. Only one code per iteration. "*"-Notations are possibly to be used as a placeholder. -#' @param detailed a logical. Indicator if function should return the detailed output of the iteration including all object-related information or only a shortened output including only code and object title. The default is detailed = FALSE. -#' @param sortcriterion a string. Indicator if the output should be sorted by 'code' or 'content'. This is a parameter of the Genesis API call itself. The default is "code". -#' @param error.ignore a logical. Indicator if the function should stop if an error occurs or no object for the request is found or if it should produce a token as response. -#' @param ... Additional parameters for the Genesis API call. These parameters are only affecting the Genesis call itself, no further processing. For more details see `vignette("additional_parameter")`. +#' @param code A string with a maximum length of 15 characters. Code from a Genesis/Zensus-Object. Only one code per iteration. "*"-Notations are possibly to be used as a placeholder. +#' @param database Character string. Indicator if the Genesis or Zensus database is called. Only one database can be addressed per function call. Default option is 'genesis'. +#' @param area A string. Indicator from which area of the database the results are called. In general, "all" is the appropriate solution. Default option is 'all'. Only used for Genesis. +#' @param detailed A logical. Indicator if function should return the detailed output of the iteration including all object-related information or only a shortened output including only code and object title. The default is detailed = FALSE. +#' @param sortcriterion A string. Indicator if the output should be sorted by 'code' or 'content'. This is a parameter of the Genesis/Zensus API call itself. The default is "code". +#' @param error.ignore A logical. Indicator if the function should stop if an error occurs or no object for the request is found or if it should produce a token as response. Default option is 'FALSE'. +#' @param ... Additional parameters for the Genesis/Zensus API call. These parameters are only affecting the Genesis/Zensus call itself, no further processing. For more details see `vignette("additional_parameter")`. #' -#' @return A list with all recalled elements from Genesis. Based on the detailed-parameter it contains more or less information, but always includes the code of the object, the title, and the type of the object. This is done to facilitate further processing of the data. Attributes are added to the dataframe describing the search configuration for the returned output. +#' @return A list with all recalled elements from Genesis/Zensus. Based on the detailed-parameter it contains more or less information, but always includes the code of the object, the title, and the type of the object. This is done to facilitate further processing of the data. Attributes are added to the dataframe describing the search configuration for the returned output. #' @export #' #' @examples @@ -19,27 +21,59 @@ #' } #' gen_var2stat <- function(code = NULL, + database = c("genesis", "zensus"), + area = c("all", "public", "user"), detailed = FALSE, sortcriterion = c("code", "content"), error.ignore = FALSE, ...) { + caller <- as.character(match.call()[1]) + + gen_fun <- test_database_function(database) + check_function_input(code = code, detailed = detailed, error.ignore = error.ignore, - sortcriterion = sortcriterion) + sortcriterion = sortcriterion, + database = gen_fun, + caller = caller) sortcriterion <- match.arg(sortcriterion) + area <- match.arg(area) + + area <- switch(area, all = "all", public = "\u00F6ffentlich", user = "benutzer") + #----------------------------------------------------------------------------- # Processing #### - results_raw <- gen_api("catalogue/variables2statistic", - username = gen_auth_get()$username, - password = gen_auth_get()$password, - name = code, - sortcriterion = sortcriterion, - ...) + if(gen_fun == "gen_api"){ + + par_list <- list( + endpoint = "catalogue/variables2statistic", + username = gen_auth_get()$username, + password = gen_auth_get()$password, + name = code, + area = area, + sortcriterion = sortcriterion, + ... + ) + + } else if ( gen_fun == "gen_zensus_api"){ + + par_list <- list( + endpoint = "catalogue/variables2statistic", + username = gen_zensus_auth_get()$username, + password = gen_zensus_auth_get()$password, + name = code, + sortcriterion = sortcriterion, + ... + ) + + } + + results_raw <- do.call(gen_fun, par_list) results_json <- test_if_json(results_raw) @@ -77,6 +111,7 @@ gen_var2stat <- function(code = NULL, list_resp <- list("Variables" = list_of_variables) attr(list_resp, "Code") <- results_json$Parameter$name + attr(list_resp, "Database") <- database[1] attr(list_resp, "Language") <- results_json$Parameter$language attr(list_resp, "Pagelength") <- results_json$Parameter$pagelength attr(list_resp, "Copyright") <- results_json$Copyright @@ -89,14 +124,16 @@ gen_var2stat <- function(code = NULL, #' gen_val2var: Get Values From a Variable #' -#' @description Function to extract the possible values from a variable from Genesis. Values for continuous variables are not extractable, so the function returns a warning message. +#' @description Function to extract the possible values from a variable from Genesis/Zensus. Values for continuous variables are not extractable, so the function returns a warning message. #' -#' @param code a string with a maximum length of 15 characters. Code from a Genesis-Object. Only one code per iteration. -#' @param sortcriterion a string. Indicator if the output should be sorted by 'code' or 'content'. This is a parameter of the Genesis API call itself. The default is "code". -#' @param error.ignore a logical. Indicator if the function should stop if an error occurs or no object for the request is found or if it should produce a token as response. -#' @param ... Additional parameters for the Genesis API call. These parameters are only affecting the Genesis call itself, no further processing. For more details see `vignette("additional_parameter")`. +#' @param code A string with a maximum length of 15 characters. Code from a Genesis/Zensus-Object. Only one code per iteration. +#' @param database Character string. Indicator if the Genesis or Zensus database is called. Only one database can be addressed per function call. Default option is 'genesis'. +#' @param area A string. Indicator from which area of the database the results are called. In general, "all" is the appropriate solution. Default option is 'all'. Only used for Genesis. +#' @param sortcriterion A string. Indicator if the output should be sorted by 'code' or 'content'. This is a parameter of the Genesis/Zensus API call itself. The default is "code". +#' @param error.ignore A logical. Indicator if the function should stop if an error occurs or no object for the request is found or if it should produce a token as response. Default option is 'FALSE'. +#' @param ... Additional parameters for the Genesis/Zensus API call. These parameters are only affecting the Genesis/Zensus call itself, no further processing. For more details see `vignette("additional_parameter")`. #' -#' @return A list with all recalled elements from Genesis. Always includes the code of the object, the title, and the type of the object. This is done to facilitate further processing of the data. Attributes are added to the dataframe describing the search configuration for the returned output. +#' @return A list with all recalled elements from Genesis/Zensus. Always includes the code of the object, the title, and the type of the object. This is done to facilitate further processing of the data. Attributes are added to the dataframe describing the search configuration for the returned output. #' @export #' #' @examples @@ -106,24 +143,55 @@ gen_var2stat <- function(code = NULL, #' } #' gen_val2var <- function(code = NULL, - sortcriterion = c("code", "content"), - error.ignore = FALSE, - ...) { + database = c("genesis", "zensus"), + area = c("all", "public", "user"), + sortcriterion = c("code", "content"), + error.ignore = FALSE, + ...) { + + caller <- as.character(match.call()[1]) + + gen_fun <- test_database_function(database) check_function_input(code = code, error.ignore = error.ignore, - sortcriterion = sortcriterion) + sortcriterion = sortcriterion, + database = gen_fun, + caller = caller) sortcriterion <- match.arg(sortcriterion) + area <- match.arg(area) + + area <- switch(area, all = "all", public = "\u00F6ffentlich", user = "benutzer") + #----------------------------------------------------------------------------- + if(gen_fun == "gen_api"){ + + par_list <- list( + endpoint = "catalogue/values2variable", + username = gen_auth_get()$username, + password = gen_auth_get()$password, + name = code, + area = area, + sortcriterion = sortcriterion, + ... + ) + + } else if ( gen_fun == "gen_zensus_api"){ + + par_list <- list( + endpoint = "catalogue/values2variable", + username = gen_zensus_auth_get()$username, + password = gen_zensus_auth_get()$password, + name = code, + sortcriterion = sortcriterion, + ... + ) - results_raw <- gen_api("catalogue/values2variable", - username = gen_auth_get()$username, - password = gen_auth_get()$password, - name = code, - sortcriterion = sortcriterion, - ...) + } + + results_raw <- do.call(gen_fun, par_list) results_json <- test_if_json(results_raw) @@ -149,6 +217,7 @@ gen_val2var <- function(code = NULL, list_resp <- list("Values" = list_of_variables) attr(list_resp, "Name") <- results_json$Parameter$name + attr(list_resp, "Database") <- database[1] attr(list_resp, "Language") <- results_json$Parameter$language attr(list_resp, "Pagelength") <- results_json$Parameter$pagelength attr(list_resp, "Copyright") <- results_json$Copyright @@ -165,13 +234,15 @@ gen_val2var <- function(code = NULL, #' #' @description Get values from variables from a statistic. Values for continuous variables cannot be extracted, so the function returns a warning message. #' -#' @param code a string with a maximum length of 15 characters. Code from a Genesis-Object. Only one code per iteration. "*"-Notations are possibly to be used as a placeholder. -#' @param detailed a logical. Indicator if function should return the detailed output of the iteration including all object-related information or only a shortened output including only code and object title. This parameter only affects the details of the variables-related output. The default is FALSE. -#' @param error.ignore a logical. Indicator if the function should stop if an error occurs or no object for the request is found or if it should produce a token as response. -#' @param sortcriterion a string. Indicator if the output should be sorted by 'code' or 'content'. This is an parameter of the Genesis API call itself. The default is "code". -#' @param ... Additional parameters for the Genesis API call. These parameters are only affecting the Genesis call itself, no further processing. For more details see `vignette("additional_parameter")`. +#' @param code A string with a maximum length of 15 characters. Code from a Genesis/Zensus-Object. Only one code per iteration. "*"-Notations are possibly to be used as a placeholder. +#' @param database Character string. Indicator if the Genesis or Zensus database is called. Only one database can be addressed per function call. Default option is 'genesis'. +#' @param area A string. Indicator from which area of the database the results are called. In general, "all" is the appropriate solution. Default option is 'all'. Only used for Genesis. +#' @param detailed A logical. Indicator if function should return the detailed output of the iteration including all object-related information or only a shortened output including only code and object title. This parameter only affects the details of the variables-related output. The default is FALSE. +#' @param error.ignore A logical. Indicator if the function should stop if an error occurs or no object for the request is found or if it should produce a token as response. Default option is 'FALSE'. +#' @param sortcriterion A string. Indicator if the output should be sorted by 'code' or 'content'. This is an parameter of the Genesis/Zensus API call itself. The default is "code". +#' @param ... Additional parameters for the Genesis/Zensus API call. These parameters are only affecting the Genesis/Zensus call itself, no further processing. For more details see `vignette("additional_parameter")`. #' -#' @return A list with all recalled elements from Genesis. Based on the detailed-parameter it contains more or less information, but always includes the code of the object, the title, and the type of the object. This is done to facilitate further processing of the data. Attributes are added to the dataframe describing the search configuration for the returned output. +#' @return A list with all recalled elements from Genesis/Zensus Based on the detailed-parameter it contains more or less information, but always includes the code of the object, the title, and the type of the object. This is done to facilitate further processing of the data. Attributes are added to the dataframe describing the search configuration for the returned output. #' @export #' #' @examples @@ -182,21 +253,26 @@ gen_val2var <- function(code = NULL, #' } #' gen_val2var2stat <- function(code = NULL, + database = c("genesis", "zensus"), + area = c("all", "public", "user"), detailed = FALSE, sortcriterion = c("code", "content"), error.ignore = FALSE, ...) { check_function_input(code = code, - detailed = detailed, error.ignore = error.ignore, - sortcriterion = sortcriterion) + sortcriterion = sortcriterion, + database = gen_fun, + caller = caller) sortcriterion <- match.arg(sortcriterion) #----------------------------------------------------------------------------- variables <- suppressMessages(suppressWarnings(gen_var2stat(code = code, + database = database, + area = area, detailed = detailed, sortcriterion = sortcriterion, error.ignore = error.ignore, @@ -207,6 +283,8 @@ gen_val2var2stat <- function(code = NULL, lapply(variables$Variables$Code, function(x) { zwisch <- suppressMessages(suppressWarnings(gen_val2var(code = x, + database = database, + area = area, sortcriterion = sortcriterion, error.ignore = error.ignore))) list_values <<- append(list_values, zwisch) @@ -223,14 +301,15 @@ gen_val2var2stat <- function(code = NULL, #' gen_search_vars: Search for Specific Variables #' -#' @description Function to search for specific variables in Genesis. +#' @description Function to search for specific variables in Genesis/Zensus #' -#' @param code a string with a maximum length of 6. Code from a Genesis-Object. Only one code per iteration. "*"-Notations are possibly to be used as a placeholder. -#' @param sortcriterion a string. Indicator if the output should be sorted by 'code' or 'content'. This is a parameter of the Genesis API call itself. The default is "code". -#' @param error.ignore a logical. Indicator if the function should stop if an error occurs or no object for the request is found or if it should produce a token as response. -#' @param ... Additional parameters for the Genesis API call. These parameters are only affecting the Genesis call itself, no further processing. For more details see `vignette("additional_parameter")`. +#' @param code A string with a maximum length of 6. Code from a Genesis/Zensus-Object. Only one code per iteration. "*"-Notations are possibly to be used as a placeholder. +#' @param database Character string. Indicator if the Genesis or Zensus database is called. Only one database can be addressed per function call. Default option is 'genesis'. +#' @param sortcriterion A string. Indicator if the output should be sorted by 'code' or 'content'. This is a parameter of the Genesis/Zensus API call itself. The default is "code". +#' @param error.ignore A logical. Indicator if the function should stop if an error occurs or no object for the request is found or if it should produce a token as response. Default option is 'FALSE'. +#' @param ... Additional parameters for the Genesis/Zensus API call. These parameters are only affecting the Genesis/Zensus call itself, no further processing. For more details see `vignette("additional_parameter")`. #' -#' @return A list with all recalled elements from Genesis. Always includes the code of the object, the title, and the type of the object. This is done to facilitate further processing of the data. Attributes are added to the dataframe describing the search configuration for the returned output. +#' @return A list with all recalled elements from Genesis/Zensus Always includes the code of the object, the title, and the type of the object. This is done to facilitate further processing of the data. Attributes are added to the dataframe describing the search configuration for the returned output. #' @export #' #' @examples @@ -240,27 +319,56 @@ gen_val2var2stat <- function(code = NULL, #' } #' gen_search_vars <- function(code = NULL, + database = c("genesis", "zensus"), + area = c("all", "public", "user"), sortcriterion = c("code", "content"), error.ignore = FALSE, ...) { caller <- as.character(match.call()[1]) + gen_fun <- test_database_function(database) + check_function_input(code = code, error.ignore = error.ignore, sortcriterion = sortcriterion, + database = gen_fun, caller = caller) sortcriterion <- match.arg(sortcriterion) + area <- match.arg(area) + + area <- switch(area, all = "all", public = "\u00F6ffentlich", user = "benutzer") + #----------------------------------------------------------------------------- - results_raw <- gen_api("catalogue/variables", - username = gen_auth_get()$username, - password = gen_auth_get()$password, - selection = code, - sortcriterion = sortcriterion, - ...) + if(gen_fun == "gen_api"){ + + par_list <- list( + endpoint = "catalogue/variables", + username = gen_auth_get()$username, + password = gen_auth_get()$password, + selection = code, + sortcriterion = sortcriterion, + area = area, + ... + ) + + } else if ( gen_fun == "gen_zensus_api"){ + + par_list <- list( + endpoint = "catalogue/variables", + username = gen_zensus_auth_get()$username, + password = gen_zensus_auth_get()$password, + selection = code, + sortcriterion = sortcriterion, + ... + ) + + } + + results_raw <- do.call(gen_fun, par_list) results_json <- test_if_json(results_raw) @@ -285,6 +393,7 @@ gen_search_vars <- function(code = NULL, list_resp <- list("Variables" = list_of_variables) attr(list_resp, "Code") <- results_json$Parameter$selection + attr(list_resp, "Database") <- database[1] attr(list_resp, "Language") <- results_json$Parameter$language attr(list_resp, "Pagelength") <- results_json$Parameter$pagelength attr(list_resp, "Copyright") <- results_json$Copyright diff --git a/R/utils.R b/R/utils.R index 0b2bf87..eeeac53 100644 --- a/R/utils.R +++ b/R/utils.R @@ -176,7 +176,7 @@ check_function_input <- function(code = NULL, "gen_objects2var", "gen_objects2stat" )) { - stop("Parameter 'category' has to have a length of 1 to 3.") + stop("Parameter 'category' has to have a length of 1 to 3.", call. = FALSE) } #---------------------------------------- @@ -185,7 +185,7 @@ check_function_input <- function(code = NULL, "restatis::gen_find", "gen_find" )) { - stop("Parameter 'category' must have a length of 1.") + stop("Parameter 'category' must have a length of 1.", call. = FALSE) } #---------------------------------------- @@ -194,7 +194,7 @@ check_function_input <- function(code = NULL, "restatis::gen_metadata", "gen_metadata" )) { - stop("Parameter 'category' must have a length of 1. Please specify the category.") + stop("Parameter 'category' must have a length of 1. Please specify the category.", call. = FALSE) } #--------------------------------------------------------------------------- @@ -203,10 +203,31 @@ check_function_input <- function(code = NULL, "restatis::gen_catalogue", "restatis::gen_objects2var", "gen_catalogue", "gen_objects2var" )) { - if (!all(category %in% c("tables", "cubes", "statistics"))) { - stop("Available categories are tables, statistics, and cubes.", - call. = FALSE - ) + if (!all(category %in% c("tables", "cubes", "statistics"))) { + stop("Available categories are tables, statistics, and cubes.", + call. = FALSE + ) + } + } + + #---------------------------------------- + + if (caller %in% c( + "restatis::gen_catalogue", "restatis::gen_objects2var", + "gen_catalogue", "gen_objects2var" + )) { + if(database == "gen_zensus_api"){ + if ("cubes" %in% category & error.ignore) { + warning("Available categories for 'zensus'-database are: 'tables' and 'statistics'. + Function is continued with specified 'category'-parameter excluding 'cubes'.", call. = FALSE + ) + } + + else if ("cubes" %in% category ) { + stop("Available categories for 'zensus'-database are: 'tables' and 'statistics'.", + call. = FALSE + ) + } } } @@ -222,30 +243,66 @@ check_function_input <- function(code = NULL, #---------------------------------------- - if (caller %in% c("restatis::gen_find", "gen_find")) { - if (database == "zensus"){ - if (!all(category %in% c("all", "tables", "statistics", "variables"))) { - stop("Available categories are all, tables, statistics, and variables.", + if (caller %in% c("restatis::gen_objects2stat", "gen_objects2stat")) { + if(database == "gen_zensus_api"){ + if ("cubes" %in% category & error.ignore) { + warning("Available categories for 'zensus'-database are: 'tables' and 'variables'. + Function is continued with specified 'category'-parameter excluding 'cubes'.", call. = FALSE + ) + } + + else if ("cubes" %in% category ) { + stop("Available categories for 'zensus'-database are: 'tables' and 'variables'.", call. = FALSE ) } - } else if (database == "destatis"){ + } + } + + #---------------------------------------- + + if (caller %in% c("restatis::gen_find", "gen_find")) { if (!all(category %in% c("all", "tables", "statistics", "variables", "cubes"))) { - stop("Available categories are all, tables, statistics, variables, and cubes.", + stop("Available categories are all, tables, statistics, variables, and cubes.", call. = FALSE ) } } + + #---------------------------------------- + + if (caller %in% c("restatis::gen_find", "gen_find")) { + if(database == "gen_zensus_api"){ + if ("cubes" %in% category & error.ignore) { + warning("Available categories for 'zensus'-database are: 'all', 'tables', 'statistics', and 'variables'. + Function is continued with specified 'category'-parameter excluding 'cubes'.", call. = FALSE + ) + } + + else if ("cubes" %in% category ) { + stop("Available categories are all, tables, statistics, and variables.", + call. = FALSE + ) + } + } } #---------------------------------------- if (caller %in% c("restatis::gen_metadata", "gen_metadata")) { + if(database == "gen_api"){ if (!all(category %in% c("Cube", "Statistic", "Table", "Variable", "Value"))) { stop("Available categories are Cube, Table, Statistic, Variable, and Value.", call. = FALSE ) } + } else if( database == "gen_zenus_api"){ + if (!all(category %in% c("Statistic", "Table", "Variable", "Value"))) { + stop("Available categories are Table, Statistic, Variable, and Value.", + call. = FALSE + ) + } + } } } @@ -267,13 +324,25 @@ check_function_input <- function(code = NULL, # type ---- if (!is.null(type)) { - if (!all(type %in% c("all", "tables", "statistics", "statisticsUpdates"))) { - stop("Available categories for parameter 'type' are 'tables', 'statistics', 'statistic updates', and 'all'.", - call. = FALSE - ) + if (database == "gen_api"){ + if (!all(type %in% c("all", "tables", "statistics", "statisticsUpdates"))) { + stop("Available categories for parameter 'type' for 'genesis'-database are 'tables', 'statistics', 'statistic updates', and 'all'.", + call. = FALSE + ) + } } + + if (database == "gen_zensus_api"){ + if (!all(type %in% c("all", "tables", "statistics"))) { + stop("Available categories for parameter 'type' for 'zensus'-database are 'tables', 'statistics', and 'all'.", + call. = FALSE + ) + } + } + } + # date ---- if (!is.null(date)) { @@ -412,7 +481,7 @@ test_if_error <- function(input, para) { } else if (input$Status$Code != 0 && isFALSE(para)) { stop(input$Status$Content, call. = FALSE) } else if (input$Status$Code == 104 && isTRUE(para)) { - message("No object found for your request. Check your parameters if you expected an object for this request. Artificial token is used.") + message("No object found for your request. Check your parameters if you expected an object for this request. Artificial token is used.", call. = FALSE) empty_object <- TRUE } else if (input$Status$Code != 0 && isTRUE(para)) { @@ -436,7 +505,7 @@ test_if_process_further <- function(input, para) { if (sum(unlist(lapply(input[4:8], function(x) { is.null(x) }))) == 5 && isFALSE(para)) { - stop("No object found for your request. Check your parameters if you expected an object for this request.") + stop("No object found for your request. Check your parameters if you expected an object for this request.", call. = FALSE) } else if (sum(unlist(lapply(input[4:8], function(x) { is.null(x) }))) == 5 && isTRUE(para)) { @@ -532,3 +601,36 @@ test_if_error_light <- function(input) { warning(input$Status$Content, call. = FALSE) } } + +#------------------------------------------------------------------------------- +# Decide the database related function + +test_database_function <- function(input){ + + if( length(input) > 1 ){ + + input <- input[1] + + } + + if( is.na(input) ){ + + stop("database-parameter must be either 'genesis' or 'zensus'.", call. = FALSE) + + } + + if( input == "genesis" ){ + + return("gen_api") + + } else if( input == "zensus"){ + + return("gen_zensus_api") + + } else { + + stop("database-parameter must be either 'genesis' or 'zensus'. No other values allowed.", call. = FALSE) + + } +} + From 0d38e680d410ef494477c7507027b74ffa7ebfef Mon Sep 17 00:00:00 2001 From: yannik b Date: Sun, 22 Oct 2023 18:17:19 +0200 Subject: [PATCH 04/52] code review and minor adaptions --- R/gen_alternative_terms.R | 4 ++-- R/gen_api.R | 5 +++-- R/gen_auth.R | 3 ++- R/gen_catalogue.R | 4 ++-- R/gen_find.R | 4 ++-- R/gen_list_jobs.R | 4 ++-- R/gen_zensus_api.R | 5 +++-- R/gen_zensus_auth.R | 19 ++++++++++--------- 8 files changed, 26 insertions(+), 22 deletions(-) diff --git a/R/gen_alternative_terms.R b/R/gen_alternative_terms.R index b1b2487..a943d14 100644 --- a/R/gen_alternative_terms.R +++ b/R/gen_alternative_terms.R @@ -19,8 +19,8 @@ #' # Find terms at Destatis that are related (in spelling) to search term "bus" #' object <- gen_alternative_terms(term = "bus*", similarity = TRUE, database = "genesis") #' -#' # Find terms at Zensus that are related (in spelling) to search term "bus" -#' object <- gen_alternative_terms(term = "bus*", similarity = TRUE, database = "zensus") +#' # Find terms at Zensus that are related (in spelling) to search term "wohn" +#' object <- gen_alternative_terms(term = "wohn*", similarity = TRUE, database = "zensus") #' } #' gen_alternative_terms <- function(term = NULL, diff --git a/R/gen_api.R b/R/gen_api.R index e11faf0..bdd899b 100644 --- a/R/gen_api.R +++ b/R/gen_api.R @@ -1,6 +1,6 @@ -#' Low-level function to interact with the Destatis GENESIS API +#' Low-level function to interact with Destatis' GENESIS API #' -#' @param endpoint Self-explanatory +#' @param endpoint The endpoint of the API that is to be queried #' #' @importFrom httr2 `%>%` #' @@ -9,6 +9,7 @@ #' @examples #' gen_api("helloworld/logincheck") %>% #' httr2::resp_body_json() +#' gen_api <- function(endpoint, ...) { httr2::request("https://www-genesis.destatis.de/genesisWS/rest/2020") %>% httr2::req_user_agent("https://github.com/CorrelAid/restatis") %>% diff --git a/R/gen_auth.R b/R/gen_auth.R index a8e0f6e..607ac48 100644 --- a/R/gen_auth.R +++ b/R/gen_auth.R @@ -1,4 +1,4 @@ -#' Save authentication GENESIS +#' Save credentials for Destatis' GENESIS database #' #' See Details. #' @@ -14,6 +14,7 @@ #' editing .Renviron files from an R session with [usethis::edit_r_environ()]. #' #' @export +#' gen_auth_save <- function() { username <- gen_auth_ask("username") diff --git a/R/gen_catalogue.R b/R/gen_catalogue.R index 15a8f46..8e66cb1 100644 --- a/R/gen_catalogue.R +++ b/R/gen_catalogue.R @@ -58,7 +58,7 @@ gen_catalogue <- function(code = NULL, # Processing #### if ("cubes" %in% category && gen_fun == "gen_zensus_api") { - list_of_cubes <- "No 'cubes' object available for 'zensus'-database." + list_of_cubes <- "No 'cubes' object available for 'zensus' database." } else if ("cubes" %in% category && gen_fun == "gen_api") { @@ -202,7 +202,7 @@ gen_catalogue <- function(code = NULL, ... ) - } else if ( gen_fun == "gen_zensus_api"){ + } else if (gen_fun == "gen_zensus_api"){ par_list <- list( endpoint = "catalogue/tables", diff --git a/R/gen_find.R b/R/gen_find.R index 20b4cb9..94a2168 100644 --- a/R/gen_find.R +++ b/R/gen_find.R @@ -71,7 +71,7 @@ gen_find <- function(term = NULL, ... ) - } else if ( gen_fun == "gen_zensus_api"){ + } else if (gen_fun == "gen_zensus_api"){ par_list <- list( endpoint = "find/find", @@ -108,7 +108,7 @@ gen_find <- function(term = NULL, return(list_resp) - } else if( isTRUE(empty_object) & gen_fun == "gen_zensus_api" ){ + } else if(isTRUE(empty_object) & gen_fun == "gen_zensus_api" ){ list_resp <- list("Output" = "No cubes at all avalaible in 'zensus'-database.") diff --git a/R/gen_list_jobs.R b/R/gen_list_jobs.R index c82a7c4..1fcf8aa 100644 --- a/R/gen_list_jobs.R +++ b/R/gen_list_jobs.R @@ -20,9 +20,9 @@ gen_list_jobs <- function(code = NULL, sortcriterion <- match.arg(sortcriterion) - if( sortcriterion == "content" & gen_fun == "gen_zensus_api"){ + if(sortcriterion == "content" & gen_fun == "gen_zensus_api"){ - stop("Parameter 'sortcriterion' has to be 'status' or 'time' for 'zensus'-database.", call. = FALSE) + stop("Parameter 'sortcriterion' has to be 'status' or 'time' for the 'zensus' database.", call. = FALSE) } diff --git a/R/gen_zensus_api.R b/R/gen_zensus_api.R index 37f13df..dc611eb 100644 --- a/R/gen_zensus_api.R +++ b/R/gen_zensus_api.R @@ -1,6 +1,6 @@ -#' Low-level function to interact with the Zensus 2022 GENESIS API +#' Low-level function to interact with the German Zensus 2022 database #' -#' @param endpoint Self-explanatory +#' @param endpoint The endpoint of the API that is to be queried #' #' @importFrom httr2 `%>%` #' @@ -9,6 +9,7 @@ #' @examples #' gen_api("helloworld/logincheck") %>% #' httr2::resp_body_json() +#' gen_zensus_api <- function(endpoint, ...) { httr2::request("https://ergebnisse2011.zensus2022.de/api/rest/2020") %>% httr2::req_user_agent("https://github.com/CorrelAid/restatis") %>% diff --git a/R/gen_zensus_auth.R b/R/gen_zensus_auth.R index 5e75956..88c5416 100644 --- a/R/gen_zensus_auth.R +++ b/R/gen_zensus_auth.R @@ -1,32 +1,33 @@ -#' Save authentication ZENSUS +#' Save credentials for the German Zensus 2022 database #' #' See Details. #' -#' Zensus username and password are encrypted and saved as RDS in the +#' Zensus database username and password are encrypted and saved as RDS in the #' package config directory. #' #' A random string is generated and stored in the session environment #' variable `ZENSUS_KEY`. This string is used as the key to encrypt and -#' decrypt the entered Genesis credentials. +#' decrypt the entered credentials. #' #' To avoid having to save authentication in future sessions, `ZENSUS_KEY` can -#' be added to .Renviron. The usethis package includes a helper function for -#' editing .Renviron files from an R session with [usethis::edit_r_environ()]. +#' be added to .Renviron. The {usethis} package includes a helper function for +#' editing .Renviron files from a R session with [usethis::edit_r_environ()]. #' #' @export +#' gen_zensus_auth_save <- function() { username <- gen_auth_ask("username") password <- gen_auth_ask("password") - auth_path <- gen_auth_path("auth_ZENSUS.rds") + auth_path <- gen_auth_path("auth_zensus.rds") key <- httr2::secret_make_key() Sys.setenv(ZENSUS_KEY = key) message( - "Saving credentials to ", + "Saving Zensus database credentials to ", auth_path, "\n\n", "Please add the following line to your .Renviron, ", @@ -48,12 +49,12 @@ gen_zensus_auth_save <- function() { gen_zensus_auth_get <- function() { - auth_path <- gen_auth_path("auth_ZENSUS.rds") + auth_path <- gen_auth_path("auth_zensus.rds") if (!(file.exists(auth_path) && nzchar(Sys.getenv("ZENSUS_KEY")))) { stop( "Zensus credentials not found.\n", - "Please run `gen_auth_save()` to store Zensus username and password.\n", + "Please run `gen_zensus_auth_save()` to store Zensus database username and password.\n", call. = FALSE ) } From 558d543620716c771b56fb5d4fcc52bfa2b5c285 Mon Sep 17 00:00:00 2001 From: KovaZo Date: Fri, 17 Nov 2023 14:40:48 +0100 Subject: [PATCH 05/52] Githubissue rlang --- R/gen_catalogue.R | 18 ++++----- R/utils.R | 99 ++++++++++++++++++++++++++++++++--------------- 2 files changed, 77 insertions(+), 40 deletions(-) diff --git a/R/gen_catalogue.R b/R/gen_catalogue.R index 8e66cb1..98c24f3 100644 --- a/R/gen_catalogue.R +++ b/R/gen_catalogue.R @@ -264,20 +264,20 @@ gen_catalogue <- function(code = NULL, if (all(c("tables", "statistics", "cubes") %in% category)) { list_resp <- list( - "Cubes" = if(length(list_of_cubes) == 1 | gen_fun == "gen_zensus_api"){list_of_cubes} else {list("A" = forming_evas(list_of_cubes))}, - "Statistics" = if(length(list_of.stats) == 1 | gen_fun == "gen_zensus_api"){list_of.stats} else {list("B" = forming_evas(list_of.stats))}, - "Tables" = if(length(list_of.tabs) == 1 | gen_fun == "gen_zensus_api"){list_of.tabs} else {list("C" = forming_evas(list_of.tabs))} + "Cubes" = if(length(list_of_cubes) == 1 | gen_fun == "gen_zensus_api"){list_of_cubes} else {forming_evas(list_of_cubes)}, + "Statistics" = if(length(list_of.stats) == 1 | gen_fun == "gen_zensus_api"){list_of.stats} else {forming_evas(list_of.stats)}, + "Tables" = if(length(list_of.tabs) == 1 | gen_fun == "gen_zensus_api"){list_of.tabs} else {forming_evas(list_of.tabs)} ) } else if (category == "cubes") { if(length(list_of_cubes) == 1 | gen_fun == "gen_zensus_api"){ - list_resp <- list("Output" = list_of_cubes) + list_resp <- list("Cubes" = list_of_cubes) } else { - list_resp <- list("Output" = forming_evas(list_of_cubes)) + list_resp <- list("Cubes" = forming_evas(list_of_cubes)) } @@ -285,11 +285,11 @@ gen_catalogue <- function(code = NULL, if(length(list_of.stats) == 1 | gen_fun == "gen_zensus_api"){ - list_resp <- list("Output" = list_of.stats) + list_resp <- list("Statistics" = list_of.stats) } else { - list_resp <- list("Output" = forming_evas(list_of.stats)) + list_resp <- list("Statistics" = forming_evas(list_of.stats)) } @@ -297,11 +297,11 @@ gen_catalogue <- function(code = NULL, if(length(list_of.tabs) == 1 | gen_fun == "gen_zensus_api"){ - list_resp <- list("Output" = list_of.tabs) + list_resp <- list("Tables" = list_of.tabs) } else { - list_resp <- list("Output" = forming_evas(list_of.tabs)) + list_resp <- list("Tables" = forming_evas(list_of.tabs)) } diff --git a/R/utils.R b/R/utils.R index eeeac53..a9f04e6 100644 --- a/R/utils.R +++ b/R/utils.R @@ -28,56 +28,93 @@ forming_evas <- function(list_of) { # Progress them list_of$Main <- apply(list_of, 1, function(x) { - evas_list_long_20220724$Titel[evas_list_long_20220724$EVAS == substr(x["Code"], 1, 1)] + obj <- evas_list_long_20220724$Titel[evas_list_long_20220724$EVAS == substr(x["Code"], 1, 1)] + if(length(obj) == 0){ + obj <- "No assignment" + } + return(obj) }) list_of$Main2 <- apply(list_of, 1, function(x) { - evas_list_long_20220724$Titel[evas_list_long_20220724$EVAS == substr(x["Code"], 1, 2)] + obj <- evas_list_long_20220724$Titel[evas_list_long_20220724$EVAS == substr(x["Code"], 1, 2)] + if(length(obj) == 0){ + obj <- "No assignment" + } + return(obj) }) list_of$Main3 <- apply(list_of, 1, function(x) { - evas_list_long_20220724$Titel[evas_list_long_20220724$EVAS == substr(x["Code"], 1, 3)] + obj <- evas_list_long_20220724$Titel[evas_list_long_20220724$EVAS == substr(x["Code"], 1, 3)] + if(length(obj) == 0){ + obj <- "No assignment" + } + return(obj) }) list_of$Main5 <- apply(list_of, 1, function(x) { - evas_list_long_20220724$Titel[evas_list_long_20220724$EVAS == substr(x["Code"], 1, 5)] + obj <- evas_list_long_20220724$Titel[evas_list_long_20220724$EVAS == substr(x["Code"], 1, 5)] + if(length(obj) == 0){ + obj <- "No assignment" + } + return(obj) }) - nestedlist <- split(list_of, list_of$Main, drop = TRUE) + keep <- colnames(list_of[,1:(ncol(list_of) - 4)]) - nestedlist <- lapply(nestedlist, function(x) { - split(x, x["Main2"], drop = TRUE) - }) - nestedlist <- lapply(nestedlist, function(x) { - lapply(x, function(y) { - split(y, y["Main3"]) - }) - }) + if(sum(list_of$Main == "No assignment") != nrow(list_of)){ + nestedlist <- split(list_of, list_of$Main, drop = TRUE) - nestedlist <- lapply(nestedlist, function(x) { - lapply(x, function(y) { - lapply(y, function(z) { - split(z, z["Main5"]) + if(sum(list_of$Main2 == "No assignment") != nrow(list_of)){ + nestedlist <- lapply(nestedlist, function(x) { + obj <- split(x, x["Main2"], drop = TRUE) }) - }) - }) - aba <- lapply( - nestedlist, function(d) { - lapply(d, function(z) { - lapply(z, function(y) { - lapply(y, function(x) { - x[!( - names(x) - %in% c("Main", "Main2", "Main3", "Main5"))] + if(sum(list_of$Main3 == "No assignment") != nrow(list_of)){ + nestedlist <- lapply(nestedlist, function(x) { + lapply(x, function(y) { + obj <- split(y, y["Main3"]) }) }) - }) + + if(sum(list_of$Main5 == "No assignment") != nrow(list_of)){ + nestedlist <- lapply(nestedlist, function(x) { + lapply(x, function(y) { + lapply(y, function(z) { + obj <- split(z, z["Main5"]) + return(obj) + }) + }) + }) + + nestedlist <- lapply(nestedlist, function(d){ + lapply(d, function(y){ + lapply(y, function(x){ + lapply(x, "[", keep)}) + }) + }) + + } else { + nestedlist <- lapply(nestedlist, function(d){ + lapply(d, function(y){ + lapply(y, "[", keep)}) + }) + } + + } else { + nestedlist <- lapply(nestedlist, function(d){ + lapply(d, "[", keep)}) + } + + } else { + nestedlist <- lapply(nestedlist, "[", keep) } - ) - return(aba) + } else { + nestedlist <- list_of[keep] + } + + return(nestedlist) } #------------------------------------------------------------------------------- @@ -279,7 +316,7 @@ check_function_input <- function(code = NULL, ) } - else if ("cubes" %in% category ) { + else if ("cubes" %in% category && !"all" %in% category) { stop("Available categories are all, tables, statistics, and variables.", call. = FALSE ) From 3613be5573f7afa45d0c21f48de79d919a42188e Mon Sep 17 00:00:00 2001 From: KovaZo Date: Fri, 17 Nov 2023 20:13:34 +0100 Subject: [PATCH 06/52] Worked on additional parameter vignette + implementing the results/signs/jobs endpunkt from catalouge --- R/gen_catalogue.R | 12 ++--- R/gen_list_jobs.R | 43 +++++++++++----- R/gen_list_results.R | 56 +++++++++++++++++++++ R/gen_qualitysigns.R | 48 ++++++++++++++++++ R/utils.R | 31 ++++++++---- vignettes/additional_parameter.Rmd | 81 +++++++++++++++++++++--------- 6 files changed, 219 insertions(+), 52 deletions(-) create mode 100644 R/gen_list_results.R create mode 100644 R/gen_qualitysigns.R diff --git a/R/gen_catalogue.R b/R/gen_catalogue.R index 98c24f3..6998b4c 100644 --- a/R/gen_catalogue.R +++ b/R/gen_catalogue.R @@ -264,16 +264,16 @@ gen_catalogue <- function(code = NULL, if (all(c("tables", "statistics", "cubes") %in% category)) { list_resp <- list( - "Cubes" = if(length(list_of_cubes) == 1 | gen_fun == "gen_zensus_api"){list_of_cubes} else {forming_evas(list_of_cubes)}, - "Statistics" = if(length(list_of.stats) == 1 | gen_fun == "gen_zensus_api"){list_of.stats} else {forming_evas(list_of.stats)}, - "Tables" = if(length(list_of.tabs) == 1 | gen_fun == "gen_zensus_api"){list_of.tabs} else {forming_evas(list_of.tabs)} + "Cubes" = if(length(list_of_cubes) == 1 | gen_fun == "gen_zensus_api"){tibble::as_tibble(list_of_cubes)} else {forming_evas(list_of_cubes)}, + "Statistics" = if(length(list_of.stats) == 1 | gen_fun == "gen_zensus_api"){tibble::as_tibble(list_of.stats)} else {forming_evas(list_of.stats)}, + "Tables" = if(length(list_of.tabs) == 1 | gen_fun == "gen_zensus_api"){tibble::as_tibble(list_of.tabs)} else {forming_evas(list_of.tabs)} ) } else if (category == "cubes") { if(length(list_of_cubes) == 1 | gen_fun == "gen_zensus_api"){ - list_resp <- list("Cubes" = list_of_cubes) + list_resp <- list("Cubes" = tibble::as_tibble(list_of_cubes)) } else { @@ -285,7 +285,7 @@ gen_catalogue <- function(code = NULL, if(length(list_of.stats) == 1 | gen_fun == "gen_zensus_api"){ - list_resp <- list("Statistics" = list_of.stats) + list_resp <- list("Statistics" = tibble::as_tibble(list_of.stats)) } else { @@ -297,7 +297,7 @@ gen_catalogue <- function(code = NULL, if(length(list_of.tabs) == 1 | gen_fun == "gen_zensus_api"){ - list_resp <- list("Tables" = list_of.tabs) + list_resp <- list("Tables" = tibble::as_tibble(list_of.tabs)) } else { diff --git a/R/gen_list_jobs.R b/R/gen_list_jobs.R index 1fcf8aa..9764c65 100644 --- a/R/gen_list_jobs.R +++ b/R/gen_list_jobs.R @@ -1,36 +1,41 @@ -#' gen_list_jobs: Explore current jobs of your user account +#' gen_list_jobs: Explore Current Jobs of Your User Account #' -#' @description Function to list all current jobs connected to the given user. +#' @description Function to list all current jobs connected to the given user in Genesis or Zensus. Important note: For this function it is also possible to use `searchcriterion`-parameter and `selection`-parameter, making it possible to filter the job list based on 'type','time','status' or 'code'. For more details see `vignette("additional_parameter")`. #' -#' @param code Filter the list of jobs for matching codes. -#' @param sortcriterion Allows to sort the resulting list of jobs for Genesis by their Code ("content"), the time of completion ("time") or status ("status") and for Zensus by the time of completion ("time") or status ("status"). Default option is 'status'. #' @param database Character string. Indicator if the Genesis or Zensus database is called. Default option is 'genesis'. +#' @param sortcriterion A string. Indicator if the output should be sorted by 'type','time','status' or 'code'. This is a parameter of the Genesis/Zensus API call itself. The default is 'type'. #' @param ... Additional parameters for the Genesis/Zensus API call. These parameters are only affecting the Genesis/Zensus call itself, no further processing. For more details see `vignette("additional_parameter")`. #' #' @return A list of all current jobs connected to the given user. #' @export #' -gen_list_jobs <- function(code = NULL, - sortcriterion = c("status", "time", "content"), +gen_list_jobs <- function(sortcriterion = c("type", "time", "status", "code"), database = c("genesis", "zensus"), ... ) { gen_fun <- test_database_function(database) - sortcriterion <- match.arg(sortcriterion) - - if(sortcriterion == "content" & gen_fun == "gen_zensus_api"){ + if (!is.character(sortcriterion)) { + stop("Parameter 'sortcriterion' has to be of type 'character'.", + call. = FALSE + ) + } - stop("Parameter 'sortcriterion' has to be 'status' or 'time' for the 'zensus' database.", call. = FALSE) + sortcriterion <- match.arg(sortcriterion) + if(! sortcriterion %in% c("type", "time", "status", "code")){ + stop("Parameter 'sortcriterion' has to be 'type', 'time', 'status', or 'code'.", + call. = FALSE + ) } + ############################################################## + if(gen_fun == "gen_api"){ par_list <- list( endpoint = "catalogue/jobs", - selection = selection, sortcriterion = sortcriterion, ... ) @@ -39,7 +44,6 @@ gen_list_jobs <- function(code = NULL, par_list <- list( endpoint = "catalogue/jobs", - selection = selection, sortcriterion = sortcriterion, ... ) @@ -50,6 +54,19 @@ gen_list_jobs <- function(code = NULL, results_json <- test_if_json(results_raw) - return(results_json) + res <- list("Output" = tibble::as_tibble(binding_lapply(results_json$List, + characteristics = c("State", + "Code", + "Date", + "Time", + "Content")))) + + + attr(res, "Database") <- database[1] + attr(res, "Sortcriterion") <- results_json$Parameter$sortcriterion + attr(res, "Language") <- results_json$Parameter$language + attr(res, "Copyright") <- results_json$Copyright + + return(res) } diff --git a/R/gen_list_results.R b/R/gen_list_results.R new file mode 100644 index 0000000..e0c8180 --- /dev/null +++ b/R/gen_list_results.R @@ -0,0 +1,56 @@ +#' gen_list_results: Get List of Results of Your User Account +#' +#' @description Function to list all current results connected to the given user in Genesis or Zensus. Important note: For this function it is also possible to use `selection`-parameter, making it possible to filter the results based on the 'code' of the object. For more details see `vignette("additional_parameter")`. +#' +#' @param database Character string. Indicator if the Genesis or Zensus database is called. Default option is 'genesis'. +#' @param area A string. Indicator from which area of the database the results are called. In general, "all" is the appropriate solution. Default option is 'all'. +#' @param ... Additional parameters for the Genesis/Zensus API call. These parameters are only affecting the Genesis/Zensus call itself, no further processing. For more details see `vignette("additional_parameter")`. +#' +#' @return A list of all current jobs connected to the given user. +#' @export +#' +gen_list_results <- function(database = c("genesis", "zensus"), + area = c("all", "public", "user"), + ... +) { + + gen_fun <- test_database_function(database) + + ############################################################## + + if(gen_fun == "gen_api"){ + + par_list <- list( + endpoint = "catalogue/results", + area = area, + ... + ) + + } else if ( gen_fun == "gen_zensus_api"){ + + par_list <- list( + endpoint = "catalogue/results", + area = area, + ... + ) + + } + + results_raw <- do.call(gen_fun, par_list) + + results_json <- test_if_json(results_raw) + + res <- list("Output" = tibble::as_tibble(binding_lapply(results_json$List, + characteristics = c("Code", + "Content", + "Values")))) + + + attr(res, "Database") <- database[1] + attr(res, "Database") <- results_json$Parameter$area + attr(res, "Language") <- results_json$Parameter$language + attr(res, "Copyright") <- results_json$Copyright + + return(res) + +} diff --git a/R/gen_qualitysigns.R b/R/gen_qualitysigns.R new file mode 100644 index 0000000..9efc716 --- /dev/null +++ b/R/gen_qualitysigns.R @@ -0,0 +1,48 @@ +#' gen_signs: Explore Meaning of Special Signs in the Objects +#' +#' @description Function to list all current used special signs (e.g., 0, *, X, (), p, ...) and their meaning in Genesis or Zensus. +#' +#' @param database Character string. Indicator if the Genesis or Zensus database is called. Default option is 'genesis'. +#' @param ... Additional parameters for the Genesis/Zensus API call. These parameters are only affecting the Genesis/Zensus call itself, no further processing. For more details see `vignette("additional_parameter")`. +#' +#' @return A list of all current used special signs. +#' @export +#' +gen_signs <- function(database = c("genesis", "zensus"), + ... +) { + + gen_fun <- test_database_function(database) + + if(gen_fun == "gen_api"){ + + par_list <- list( + endpoint = "catalogue/qualitysigns", + ... + ) + + } else if ( gen_fun == "gen_zensus_api"){ + + par_list <- list( + endpoint = "catalogue/qualitysigns", + ... + ) + + } + + results_raw <- do.call(gen_fun, par_list) + + results_json <- test_if_json(results_raw) + + res <- list("Output" = tibble::as_tibble(binding_lapply(results_json$List, + characteristics = c("Code", + "Content")))) + + + attr(res, "Database") <- database[1] + attr(res, "Language") <- results_json$Parameter$language + attr(res, "Copyright") <- results_json$Copyright + + return(res) + +} diff --git a/R/utils.R b/R/utils.R index a9f04e6..eca13b6 100644 --- a/R/utils.R +++ b/R/utils.R @@ -90,29 +90,40 @@ forming_evas <- function(list_of) { nestedlist <- lapply(nestedlist, function(d){ lapply(d, function(y){ lapply(y, function(x){ - lapply(x, "[", keep)}) + lapply(x, function(r, remain){ + obj <- r[keep] + obj <- tibble::as_tibble(obj) + }, remain = keep)}) }) }) } else { nestedlist <- lapply(nestedlist, function(d){ lapply(d, function(y){ - lapply(y, "[", keep)}) - }) - } + lapply(y, function(r, remain){ + obj <- r[keep] + obj <- tibble::as_tibble(obj) + }, remain = keep + )})})} } else { nestedlist <- lapply(nestedlist, function(d){ - lapply(d, "[", keep)}) - } + lapply(d, function(r, remain){ + obj <- r[keep] + obj <- tibble::as_tibble(obj) + }, remain = keep + )})} } else { - nestedlist <- lapply(nestedlist, "[", keep) - } + nestedlist <- lapply(nestedlist, function(r, remain){ + obj <- r[keep] + obj <- tibble::as_tibble(obj) + }, remain = keep + )} } else { - nestedlist <- list_of[keep] - } + nestedlist <- tibble::as_tibble(list_of[keep]) + } return(nestedlist) } diff --git a/vignettes/additional_parameter.Rmd b/vignettes/additional_parameter.Rmd index 7e443e3..a750039 100644 --- a/vignettes/additional_parameter.Rmd +++ b/vignettes/additional_parameter.Rmd @@ -22,7 +22,8 @@ Not all parameters are available for all functions. Especially `gen_table()` and `gen_cube()` have a lot of different additional parameters to specify the API call. -For a detailed overview, see the following official document: https://www-genesis.destatis.de/genesis/misc/GENESIS-Webservices_Einfuehrung.pdf +For a detailed overview, see the following official document for Genesis: https://www-genesis.destatis.de/genesis/misc/GENESIS-Webservices_Einfuehrung.pdf +For a detailed overview, see the following official document for Zensus: https://ergebnisse2011.zensus2022.de/datenbank/misc/ZENSUS-Webservices_Einfuehrung.pdf ## Short Overview of the Most Used Additional Parameters @@ -30,7 +31,7 @@ For a detailed overview, see the following official document: https://www-genesi The `selection`-parameter is a string that specifies the filter to use for filtering the API call. The criterion to which this parameter is applied is defined by the `searchcriterion`-parameter. The maximum length of the string depends on the function being used, but often varies between 10 and 15 characters. It is possible to use '*' as a placeholder. The default for this parameter is NO filtering. -The `searchcriterion`-parameter is a string that specifies the criteria to be used by the `selection`-parameter. Possible values depend on the function being used, but are often "code" for filtering based on code, or "content" for filtering based on content description. The default for this parameter is NO filter criterion. +The `searchcriterion`-parameter is a string that specifies the criteria to be used by the `selection`-parameter. Possible values depend on the function being used, but are often "code" for filtering based on code, or "content" for filtering based on content description. The default for this parameter is NO filter criterion. Often `searchcriterion`-parameter and `sortcriterion`-parameter have the same possible values. Examples: ```{r eval=FALSE} @@ -87,14 +88,14 @@ gen_val2var("WAM8", language = "en")
gen_catalogue -For cubes: +For cubes: (only Genesis) | Parameter | Description | | ----------- | ----------- | | selection | 1-10 characters; filtering based on "code" of the objects; "*"-Notations are possible | | pagelength | 1-2500 | | language | "de" / "en" | -| area | - | +| area | "all" / "public" / "user" | For statistics: @@ -111,17 +112,18 @@ For tables: | Parameter | Description | | ----------- | ----------- | | selection | 1-15 characters; filtering based on searchcriterion; "*"-Notations are possible | -| searchcriterion | "code" | +| searchcriterion | "code" / "content" (only Zensus) | | sortcriterion | "code" / "top" | | pagelength | 1-2500 | | language | "de" / "en" | -| area | - | +| area | "all" / "public" / "user" |
gen_cube see the following official documentation: https://www-genesis.destatis.de/genesis/misc/GENESIS-Webservices_Einfuehrung.pdf +Only available for Genesis
@@ -139,13 +141,14 @@ see the following official documentation: https://www-genesis.destatis.de/genesi | Parameter | Description | | ----------- | ----------- | | selection | 1-50 characters; filtering based on "code" of the objects or searchcriterion; "*"-Notations are possible | -| searchcriterion | "content" / "time" / "status" | -| sortcriterion | "content" / "time" / "status" | +| searchcriterion | "type" / "code" / "time" / "status" | +| sortcriterion | "type" / "code" / "time" / "status" | | pagelength | 1-2500 | | language | "de" / "en" | | type | - | -see more in the following official documentation: https://www-genesis.destatis.de/genesis/misc/GENESIS-Webservices_Einfuehrung.pdf +see more in the following official documentation for Genesis: https://www-genesis.destatis.de/genesis/misc/GENESIS-Webservices_Einfuehrung.pdf +see more in the following official documentation for Zensus: https://ergebnisse2011.zensus2022.de/datenbank/misc/ZENSUS-Webservices_Einfuehrung.pdf @@ -154,7 +157,9 @@ see more in the following official documentation: https://www-genesis.destatis.d | Parameter | Description | | ----------- | ----------- | | language | "de" / "en" | -| area | - | +| area | "all" / "public" / "user" *1 | + +*1 for Zensus only tables offer the additional parameter "area".
@@ -168,11 +173,12 @@ see more in the following official documentation: https://www-genesis.destatis.d
gen_objects2stat -For cubes: +For cubes: (only Genesis) | Parameter | Description | | ----------- | ----------- | | selection | 1-10 characters; filtering based on "code" of the objects; "*"-Notations are possible | +| area | "all" / "public" / "user" | | pagelength | 1-2500 | | language | "de" / "en" | @@ -185,10 +191,11 @@ For variables: | sortcriterion | "code" / "content" | | pagelength | 1-2500 | | language | "de" / "en" | -| area | - | +| area | "all" / "public" / "user" | | type | - | -see more in the following official documentation: https://www-genesis.destatis.de/genesis/misc/GENESIS-Webservices_Einfuehrung.pdf +see more in the following official documentation for Genesis: https://www-genesis.destatis.de/genesis/misc/GENESIS-Webservices_Einfuehrung.pdf +see more in the following official documentation for Zensus: https://ergebnisse2011.zensus2022.de/datenbank/misc/ZENSUS-Webservices_Einfuehrung.pdf For tables: @@ -197,20 +204,19 @@ For tables: | selection | 1-15 characters; filtering based on "code" of the objects; "*"-Notations are possible | | pagelength | 1-2500 | | language | "de" / "en" | -| area | - | - +| area | "all" / "public" / "user" |
gen_objects2var -For cubes: +For cubes: (only Genesis) | Parameter | Description | | ----------- | ----------- | | selection | 1-15 characters; filtering based on "code" of the objects; "*"-Notations are possible | | pagelength | 1-2500 | | language | "de" / "en" | -| area | - | +| area | "all" / "public" / "user" | For statistics: @@ -221,7 +227,7 @@ For statistics: | sortcriterion | "code" / "content" | | pagelength | 1-2500 | | language | "de" / "en" | -| area | - | +| area | "all" / "public" / "user" | For tables: @@ -230,12 +236,13 @@ For tables: | selection | 1-15 characters; filtering based on "code" of the objects; "*"-Notations are possible | | pagelength | 1-2500 | | language | "de" / "en" | -| area | - | +| area | "all" / "public" / "user" |
gen_table -see the following official documentation: https://www-genesis.destatis.de/genesis/misc/GENESIS-Webservices_Einfuehrung.pdf +see the following official documentation for Genesis: https://www-genesis.destatis.de/genesis/misc/GENESIS-Webservices_Einfuehrung.pdf +see the following official documentation for Zensus: https://ergebnisse2011.zensus2022.de/datenbank/misc/ZENSUS-Webservices_Einfuehrung.pdf
@@ -245,12 +252,14 @@ see the following official documentation: https://www-genesis.destatis.de/genesi | ----------- | ----------- | | selection | 1-6 characters; filtering based on searchcriterion; "*"-Notations are possible | | searchcriterion | "code" / "content" | +| sortcriterion | "code" / "content" | | pagelength | 1-2500 | | language | "de" / "en" | -| area | - | +| area | "all" / "public" / "user" | | type | - | see more in the following official documentation: https://www-genesis.destatis.de/genesis/misc/GENESIS-Webservices_Einfuehrung.pdf +see more in the following official documentation for Zensus: https://ergebnisse2011.zensus2022.de/datenbank/misc/ZENSUS-Webservices_Einfuehrung.pdf
@@ -260,6 +269,7 @@ see more in the following official documentation: https://www-genesis.destatis.d | ----------- | ----------- | | selection | 1-15 characters; filtering based on searchcriterion; "*"-Notations are possible | | searchcriterion | "code" / "content" | +| sortcriterion | "code" / "content" | | pagelength | 1-2500 | | language | "de" / "en" | @@ -271,12 +281,14 @@ see more in the following official documentation: https://www-genesis.destatis.d | ----------- | ----------- | | selection | 1-6 characters; filtering based on searchcriterion; "*"-Notations are possible | | searchcriterion | "code" / "content" | +| sortcriterion | "code" / "content" | | pagelength | 1-2500 | | language | "de" / "en" | -| area | - | +| area | "all" / "public" / "user" | | type | - | see more in the following official documentation: https://www-genesis.destatis.de/genesis/misc/GENESIS-Webservices_Einfuehrung.pdf +see more in the following official documentation for Zensus: https://ergebnisse2011.zensus2022.de/datenbank/misc/ZENSUS-Webservices_Einfuehrung.pdf @@ -286,11 +298,34 @@ see more in the following official documentation: https://www-genesis.destatis.d | ----------- | ----------- | | selection | 1-6 characters; filtering based on searchcriterion; "*"-Notations are possible | | searchcriterion | "code" / "content" | +| sortcriterion | "code" / "content" | | pagelength | 1-2500 | | language | "de" / "en" | -| area | - | +| area | "all" / "public" / "user" | | type | - | see more in the following official documentation: https://www-genesis.destatis.de/genesis/misc/GENESIS-Webservices_Einfuehrung.pdf +see more in the following official documentation for Zensus: https://ergebnisse2011.zensus2022.de/datenbank/misc/ZENSUS-Webservices_Einfuehrung.pdf + + + +
+gen_signs + +| Parameter | Description | +| ----------- | ----------- | +| language | "de" / "en" | + +
+ +
+gen_list_results + +| Parameter | Description | +| ----------- | ----------- | +| selection | 1-15 characters; filtering based on "code"; "*"-Notations are possible | +| area | "all" / "public" / "user" | +| pagelength | 1-2500 | +| language | "de" / "en" |
From 395491448c76abe75add9b000f3852c2a3af68a6 Mon Sep 17 00:00:00 2001 From: yannik b Date: Sun, 3 Dec 2023 16:52:36 +0100 Subject: [PATCH 07/52] minor adjustments --- R/gen_meta_data.R | 25 +++++++++++++------------ R/gen_zensus_auth.R | 4 ++++ R/utils.R | 12 ++++++------ 3 files changed, 23 insertions(+), 18 deletions(-) diff --git a/R/gen_meta_data.R b/R/gen_meta_data.R index cf7c6a2..bd274f2 100644 --- a/R/gen_meta_data.R +++ b/R/gen_meta_data.R @@ -70,7 +70,7 @@ gen_metadata_stats <- function(code = NULL, if(isTRUE(empty_object)){ - df_stats <- "No `meta_information`- object found for your request." + df_stats <- "No 'meta_information' object found for your request." } else if(isFALSE(empty_object)){ @@ -172,7 +172,7 @@ gen_metadata_var <- function(code = NULL, if(isTRUE(empty_object)){ - df_var <- "No `meta_information`- object found for your request." + df_var <- "No 'meta_information' object found for your request." } else if(isFALSE(empty_object)){ @@ -275,7 +275,7 @@ gen_metadata_val <- function(code = NULL, if(isTRUE(empty_object)){ - df_value <- "No `meta_information`- object found for your request." + df_value <- "No 'meta_information' object found for your request." } else if(isFALSE(empty_object)){ @@ -376,7 +376,7 @@ gen_metadata_tab <- function(code = NULL, if(isTRUE(empty_object)){ - char <- "No `meta_information`- object found for your request." + char <- "No 'meta_information' object found for your request." structure <- NULL embedded <- NULL @@ -528,7 +528,7 @@ gen_metadata_cube <- function(code = NULL, if(isTRUE(empty_object)){ - char <- "No `meta_information`- object found for your request." + char <- "No 'meta_information' object found for your request." time <- NULL stat <- NULL structure <- NULL @@ -633,7 +633,7 @@ gen_metadata_cube <- function(code = NULL, #' gen_metadata <- function(code = NULL, database = c("genesis", "zensus"), - category = c("Cube", "Statistic", "Table", "Variable", "Value"), + category = c("cube", "statistic", "table", "variable", "value"), area = c("all", "public", "user"), error.ignore = FALSE, ...) { @@ -650,32 +650,32 @@ gen_metadata <- function(code = NULL, #----------------------------------------------------------------------------- - if (category == "Cube") { + if (category == "cube") { gen_metadata_cube(code = code, error.ignore = error.ignore, ...) - } else if (category == "Value") { + } else if (category == "value") { gen_metadata_val(code = code, database = database, area = area, error.ignore = error.ignore, ...) - } else if (category == "Variable") { + } else if (category == "variable") { gen_metadata_var(code = code, database = database, area = area, error.ignore = error.ignore, ...) - } else if (category == "Table") { + } else if (category == "table") { gen_metadata_tab(code = code, database = database, area = area, error.ignore = error.ignore, ...) - } else if (category == "Statistic") { + } else if (category == "statistic") { gen_metadata_stats(code = code, database = database, @@ -685,7 +685,8 @@ gen_metadata <- function(code = NULL, } else { stop("Category is not found, please select a correct category. - Available categories are Cube, Statistic, Table, Variable, or Value for Genesis and Statistic, Table, Variable, or Value for Zensus. + Available categories for data base GENESIS: 'cube', 'statistic', 'table', 'variable', 'value. + \n Available categories for Zensus data base: 'statistic', 'table', 'variable', 'value.' \n Please choose one of them.", call. = TRUE) } } diff --git a/R/gen_zensus_auth.R b/R/gen_zensus_auth.R index 88c5416..282f954 100644 --- a/R/gen_zensus_auth.R +++ b/R/gen_zensus_auth.R @@ -47,6 +47,10 @@ gen_zensus_auth_save <- function() { ) } +#' Check if credentials for Zensus data base are available +#' +#' @return Zensus data base key for credentials +#' gen_zensus_auth_get <- function() { auth_path <- gen_auth_path("auth_zensus.rds") diff --git a/R/utils.R b/R/utils.R index eeeac53..2c53873 100644 --- a/R/utils.R +++ b/R/utils.R @@ -607,29 +607,29 @@ test_if_error_light <- function(input) { test_database_function <- function(input){ - if( length(input) > 1 ){ + if(length(input) > 1){ input <- input[1] } - if( is.na(input) ){ + if(is.na(input)){ - stop("database-parameter must be either 'genesis' or 'zensus'.", call. = FALSE) + stop("Database parameter must be either 'genesis' or 'zensus'.", call. = FALSE) } - if( input == "genesis" ){ + if(input == "genesis"){ return("gen_api") - } else if( input == "zensus"){ + } else if(input == "zensus"){ return("gen_zensus_api") } else { - stop("database-parameter must be either 'genesis' or 'zensus'. No other values allowed.", call. = FALSE) + stop("Database parameter must be either 'genesis' or 'zensus'. No other values allowed.", call. = FALSE) } } From a3e7a03f9b1d45255eb9fc00628db807e533b068 Mon Sep 17 00:00:00 2001 From: KovaZo Date: Fri, 8 Dec 2023 16:22:57 +0100 Subject: [PATCH 08/52] Changes based on Feedback --- R/gen_alternative_terms.R | 4 +-- R/gen_catalogue.R | 20 +++++++---- R/gen_find.R | 32 +++++++++++++++-- R/utils.R | 76 ++++++++++++++++++++++++++++----------- 4 files changed, 100 insertions(+), 32 deletions(-) diff --git a/R/gen_alternative_terms.R b/R/gen_alternative_terms.R index a943d14..683979b 100644 --- a/R/gen_alternative_terms.R +++ b/R/gen_alternative_terms.R @@ -1,6 +1,6 @@ #' gen_alternative_terms: Call For Similiar or Spelling Related Terms for Further Search #' -#' @description Function to find search terms that are similar or related to one another and also represented in Genesis/Zensus. +#' @description Function to find search terms that are similar or related to one another in spelling and also represented in Genesis/Zensus. Important note: The API call is searching for terms with the same characters. To be useful in searching for related terms it is highly recommended to work with "*"-placeholders (see examples). The placeholder can be placed before and/or after the search term. #' #' @param term Character string. Maximum length of 15 characters. Term or word for which you are searching for alternative or related terms. Use of '*' as a placeholder is possible to generate broader search areas. #' @param similarity Logical. Indicator if the output of the function should be sorted based on a Levenshtein edit distance based on the \code{adist()} function. Default option is 'TRUE'. @@ -12,7 +12,7 @@ #' #' @examples #' \dontrun{ -#' # Find terms at Destatis that are similar (in spelling) to search term "bus" +#' # Find terms at Destatis that are the same (in spelling) to search term "bus" #' # and sort them by Levenshtein edit distance #' object <- gen_alternative_terms(term = "bus", similarity = TRUE, database = "genesis") #' diff --git a/R/gen_catalogue.R b/R/gen_catalogue.R index 6998b4c..0e63b77 100644 --- a/R/gen_catalogue.R +++ b/R/gen_catalogue.R @@ -1,6 +1,6 @@ #' catalogue: Explore Different Objects and Their Structural Embedding in Genesis/Zensus #' -#' Function to enable searching for tables, statistics, and cubes from Genesis or Zensus. Additionally, it structures the Genesis-output based on the internal tree structure of Genesis itself based on the EVAS-numbers. Time-series are represented as cubes with a specified time span in Genesis. +#' Function to enable searching for tables, statistics, and cubes from Genesis or Zensus. Additionally, it structures the Genesis-output based on the internal tree structure of Genesis itself based on the EVAS-numbers. Time-series are represented as cubes with a specified time span in Genesis. Important note: To be useful in searching for objects it is highly recommended to work with "*"-placeholders (see examples). The placeholder can be placed before and/or after the search term. #' #' @param code A string with a maximum length of 10 characters for a Genesis-Object and 15 characters for a Zensus-Object. Only one code per iteration. "*"-Notations are possible. #' @param database Character string. Indicator if the Genesis or Zensus database is called. Only one database can be addressed per function call. Default option is 'genesis'. @@ -269,9 +269,13 @@ gen_catalogue <- function(code = NULL, "Tables" = if(length(list_of.tabs) == 1 | gen_fun == "gen_zensus_api"){tibble::as_tibble(list_of.tabs)} else {forming_evas(list_of.tabs)} ) - } else if (category == "cubes") { + } else if ("cubes" %in% category) { - if(length(list_of_cubes) == 1 | gen_fun == "gen_zensus_api"){ + if(length(list_of_cubes) == 1 && gen_fun == "gen_zensus_api"){ + + list_resp <- list_of_cubes + + } else if (length(list_of_cubes) == 1 | gen_fun == "gen_zensus_api"){ list_resp <- list("Cubes" = tibble::as_tibble(list_of_cubes)) @@ -281,7 +285,7 @@ gen_catalogue <- function(code = NULL, } - } else if (category == "statistics") { + } else if ("statistics" %in% category) { if(length(list_of.stats) == 1 | gen_fun == "gen_zensus_api"){ @@ -293,7 +297,7 @@ gen_catalogue <- function(code = NULL, } - } else if (category == "tables") { + } else if ("tables" %in% category) { if(length(list_of.tabs) == 1 | gen_fun == "gen_zensus_api"){ @@ -307,12 +311,16 @@ gen_catalogue <- function(code = NULL, } - attr(list_resp, "Code") <- results_json$Parameter$selection + attr(list_resp, "Code") <- code attr(list_resp, "Database") <- database[1] attr(list_resp, "Category") <- category + if(length(category) == 1 && "cubes" %in% category && gen_fun == "gen_zensus_api"){ + attr(list_resp, "Info") <- "NO API call done" + } else { attr(list_resp, "Language") <- results_json$Parameter$language attr(list_resp, "Pagelength") <- results_json$Parameter$pagelength attr(list_resp, "Copyright") <- results_json$Copyright + } return(list_resp) diff --git a/R/gen_find.R b/R/gen_find.R index 94a2168..476b62f 100644 --- a/R/gen_find.R +++ b/R/gen_find.R @@ -181,6 +181,7 @@ gen_find <- function(term = NULL, #------------------------------------------------------------------------- + if(gen_fun == "gen_api"){ df_cubes <- binding_lapply(results_json$Cubes, characteristics = c("Code", "Content", @@ -194,6 +195,7 @@ gen_find <- function(term = NULL, df_cubes$Variablen <- spezifisch_create(df_cubes) df_cubes$Object_Type <- "Cube" + } #------------------------------------------------------------------------- @@ -209,9 +211,11 @@ gen_find <- function(term = NULL, df_variables$Titel <- titel_search(df_variables, term) } + if(gen_fun == "gen_api"){ if (nrow(df_cubes) != 0) { df_cubes$Titel <- titel_search(df_cubes, term) } + } #------------------------------------------------------------------------- @@ -243,6 +247,7 @@ gen_find <- function(term = NULL, "Spezifisch", "Object_Type")] + if(gen_fun == "gen_api"){ df_cubes <- df_cubes[with(df_cubes, order(-Titel, -Variablen)), c( "Code", "Content", "Titel", @@ -253,6 +258,7 @@ gen_find <- function(term = NULL, "Variablen", "Spezifisch", "Object_Type")] + } } else { @@ -282,6 +288,7 @@ gen_find <- function(term = NULL, "Spezifisch", "Object_Type")] + if(gen_fun == "gen_api"){ df_cubes <- df_cubes[, c("Code", "Content", "Titel", @@ -292,6 +299,7 @@ gen_find <- function(term = NULL, "Variablen", "Spezifisch", "Object_Type")] + } } @@ -300,7 +308,7 @@ gen_find <- function(term = NULL, list_resp <- list("Tables" = tibble::as_tibble(df_table), "Statistics" = tibble::as_tibble(df_stats), "Variables" = tibble::as_tibble(df_variables), - "Cubes" = tibble::as_tibble(df_cubes)) + "Cubes" = if(gen_fun == "gen_api"){tibble::as_tibble(df_cubes)} else {"No cubes at all avalaible in 'zensus'-database."}) attr(list_resp, "Term") <- results_json$Parameter$term attr(list_resp, "Database") <- database[1] @@ -488,6 +496,8 @@ gen_find <- function(term = NULL, if (category == "cubes") { + if(gen_fun == "gen_api"){ + df_cubes <- binding_lapply(results_json$Cubes, characteristics = c("Code", "Content", @@ -547,6 +557,11 @@ gen_find <- function(term = NULL, attr(list_resp, "Copyright") <- results_json$Copyright return(list_resp) + } else { + + list_resp <- "No cubes at all avalaible in 'zensus'-database." + + } } } @@ -594,6 +609,7 @@ gen_find <- function(term = NULL, #------------------------------------------------------------------------- + if(gen_fun == "gen_api"){ df_cubes <- binding_lapply(results_json$Cubes, characteristics = c("Code", "Content")) @@ -604,6 +620,8 @@ gen_find <- function(term = NULL, df_cubes$Object_Type <- "Cube" + } + #------------------------------------------------------------------------- if (nrow(df_table) != 0) { @@ -618,9 +636,11 @@ gen_find <- function(term = NULL, df_variables$Titel <- titel_search(df_variables, term) } + if(gen_fun == "gen_api"){ if (nrow(df_cubes) != 0) { df_cubes$Titel <- titel_search(df_cubes, term) } + } #------------------------------------------------------------------------- @@ -638,9 +658,11 @@ gen_find <- function(term = NULL, "Content", "Object_Type")] + if(gen_fun == "gen_api"){ df_cubes <- df_cubes[with(df_cubes, order(-Titel, -Variablen)), c( "Code", "Content", "Object_Type")] + } } else { df_table <- df_table[, c("Code", @@ -655,9 +677,11 @@ gen_find <- function(term = NULL, "Content", "Object_Type")] + if(gen_fun == "gen_api"){ df_cubes <- df_cubes[, c("Code", "Content", "Object_Type")] + } } @@ -666,7 +690,7 @@ gen_find <- function(term = NULL, list_resp <- list("Tables" = tibble::as_tibble(df_table), "Statistics" = tibble::as_tibble(df_stats), "Variables" = tibble::as_tibble(df_variables), - "Cubes" = tibble::as_tibble(df_cubes)) + "Cubes" = if(gen_fun == "gen_api"){tibble::as_tibble(df_cubes)} else {"No cubes at all avalaible in 'zensus'-database."}) attr(list_resp, "Term") <- results_json$Parameter$term attr(list_resp, "Database") <- database[1] @@ -823,7 +847,7 @@ gen_find <- function(term = NULL, #--------------------------------------------------------------------------- - if (category == "cubes") { + if (category == "cubes" && gen_fun == "gen_api") { df_cubes <- binding_lapply(results_json$Cubes, characteristics = c("Code", @@ -867,6 +891,8 @@ gen_find <- function(term = NULL, return(list_resp) + } else { + list_resp <- "No cubes at all avalaible in 'zensus'-database." } } diff --git a/R/utils.R b/R/utils.R index 737138a..091e89f 100644 --- a/R/utils.R +++ b/R/utils.R @@ -252,7 +252,7 @@ check_function_input <- function(code = NULL, "gen_catalogue", "gen_objects2var" )) { if (!all(category %in% c("tables", "cubes", "statistics"))) { - stop("Available categories are tables, statistics, and cubes.", + stop("Available categories are 'tables', 'statistics', and 'cubes'.", call. = FALSE ) } @@ -265,17 +265,31 @@ check_function_input <- function(code = NULL, "gen_catalogue", "gen_objects2var" )) { if(database == "gen_zensus_api"){ - if ("cubes" %in% category & error.ignore) { - warning("Available categories for 'zensus'-database are: 'tables' and 'statistics'. - Function is continued with specified 'category'-parameter excluding 'cubes'.", call. = FALSE + + if (length(category) == 1 && "cubes" %in% category && isFALSE(error.ignore)) { + stop("Available categories for 'zensus'-database are: 'tables' and 'statistics'.", + call. = FALSE ) } - else if ("cubes" %in% category ) { - stop("Available categories for 'zensus'-database are: 'tables' and 'statistics'.", + else if (length(category) == 1 && "cubes" %in% category && isTRUE(error.ignore)) { + warning("Available categories for 'zensus'-database are: 'tables' and 'statistics'. + Function is continued with a placeholder for the 'cubes' output.", call. = FALSE ) } + + else if ("cubes" %in% category && isFALSE(error.ignore)) { + warning("Available categories for 'zensus'-database are: 'tables' and 'statistics'." + , call. = FALSE + ) + } + + else if ("cubes" %in% category && isTRUE(error.ignore)) { + warning("Available categories for 'zensus'-database are: 'tables' and 'statistics'. + Function is continued with specified 'category'-parameter excluding 'cubes'.", call. = FALSE + ) + } } } @@ -283,7 +297,7 @@ check_function_input <- function(code = NULL, if (caller %in% c("restatis::gen_objects2stat", "gen_objects2stat")) { if (!all(category %in% c("tables", "cubes", "variables"))) { - stop("Available categories are tables, variables, and cubes.", + stop("Available categories are 'tables', 'variables', and 'cubes'.", call. = FALSE ) } @@ -293,13 +307,13 @@ check_function_input <- function(code = NULL, if (caller %in% c("restatis::gen_objects2stat", "gen_objects2stat")) { if(database == "gen_zensus_api"){ - if ("cubes" %in% category & error.ignore) { + if ("cubes" %in% category && isTRUE(error.ignore)) { warning("Available categories for 'zensus'-database are: 'tables' and 'variables'. Function is continued with specified 'category'-parameter excluding 'cubes'.", call. = FALSE ) } - else if ("cubes" %in% category ) { + else if ("cubes" %in% category && isFALSE(error.ignore)) { stop("Available categories for 'zensus'-database are: 'tables' and 'variables'.", call. = FALSE ) @@ -311,27 +325,43 @@ check_function_input <- function(code = NULL, if (caller %in% c("restatis::gen_find", "gen_find")) { if (!all(category %in% c("all", "tables", "statistics", "variables", "cubes"))) { - stop("Available categories are all, tables, statistics, variables, and cubes.", + if(database == "gen_api"){ + stop("Available categories for parameter 'category' for 'genesis'-database are 'all', 'tables', 'statistics', 'variables', and 'cubes'.", call. = FALSE ) + } + + if(gen_fun == "gen_zensus_api"){ + stop("Available categories for parameter 'category' for 'zensus'-database are 'all', 'tables', 'statistics', and 'variables'.", + call. = FALSE + ) + } } - } + } #---------------------------------------- if (caller %in% c("restatis::gen_find", "gen_find")) { if(database == "gen_zensus_api"){ - if ("cubes" %in% category & error.ignore) { + if ("cubes" %in% category && isTRUE(error.ignore)) { warning("Available categories for 'zensus'-database are: 'all', 'tables', 'statistics', and 'variables'. - Function is continued with specified 'category'-parameter excluding 'cubes'.", call. = FALSE + Function is continued with a placeholder for the 'cubes' output.", call. = FALSE + ) + } + + else if ( "all" %in% category) { + warning("Available categories for 'zensus'-database are: 'all', 'tables', 'statistics', and 'variables'. + Function is continued with a placeholder for the 'cubes' output.", call. = FALSE ) } - else if ("cubes" %in% category && !"all" %in% category) { - stop("Available categories are all, tables, statistics, and variables.", + else if ("cubes" %in% category && isFALSE(error.ignore)) { + stop("Available categories are 'all', 'tables', 'statistics', and 'variables'.", call. = FALSE ) } + + } } @@ -339,14 +369,18 @@ check_function_input <- function(code = NULL, if (caller %in% c("restatis::gen_metadata", "gen_metadata")) { if(database == "gen_api"){ - if (!all(category %in% c("Cube", "Statistic", "Table", "Variable", "Value"))) { - stop("Available categories are Cube, Table, Statistic, Variable, and Value.", - call. = FALSE - ) + + if (!all(category %in% c("Cube", "Statistic", "Table", "Variable", "Value"))) { + stop("Available categories for parameter 'category' for 'genesis'-database are 'Cube', 'Table', 'Statistic', 'Variable', and 'Value'.", + call. = FALSE + ) + } } - } else if( database == "gen_zenus_api"){ + + else if( database == "gen_zensus_api") { + if (!all(category %in% c("Statistic", "Table", "Variable", "Value"))) { - stop("Available categories are Table, Statistic, Variable, and Value.", + stop("Available categories for parameter 'category' for 'zensus'-database are 'Table', 'Statistic', 'Variable', and 'Value'.", call. = FALSE ) } From 8468fac07437f4f881fa110f51df855d7c580628 Mon Sep 17 00:00:00 2001 From: buhly Date: Wed, 10 Jan 2024 19:14:11 +0100 Subject: [PATCH 09/52] fix decimal mark problem in gen_table() --- R/gen_table.R | 30 +++++++++++++++++++++++++----- 1 file changed, 25 insertions(+), 5 deletions(-) diff --git a/R/gen_table.R b/R/gen_table.R index f3edf36..7077492 100644 --- a/R/gen_table.R +++ b/R/gen_table.R @@ -134,9 +134,29 @@ gen_table_ <- function(name, resp_check_data_csv(resp) - resp %>% - httr2::resp_body_string() %>% - readr::read_delim( - delim = ";", - show_col_types = FALSE) + # Returning the table desired by the user + # There has to be a check on language to display correct decimal marks + # For German results, there needs to be a decimal mark set + if (language == "de") { + + resp %>% + httr2::resp_body_string() %>% + readr::read_delim( + delim = ";", + show_col_types = FALSE, + locale = readr::locale(decimal_mark = ",", grouping_mark = ".")) + + } else if (language == "en") { + + resp %>% + httr2::resp_body_string() %>% + readr::read_delim( + delim = ";", + show_col_types = FALSE) + + } else { + + stop("Error handling language setting locale (values different from 'de' and 'en'.") + + } } From 6e8a9ca16f0fef8cf96adec46e288b17294638a3 Mon Sep 17 00:00:00 2001 From: KovaZo Date: Mon, 22 Jan 2024 17:56:52 +0100 Subject: [PATCH 10/52] Changes mainly for val2var2stat and utils --- R/gen_var2-val2.R | 13 ++++++-- R/utils.R | 85 ++++++++++++++++++++++++++++++++++------------- 2 files changed, 72 insertions(+), 26 deletions(-) diff --git a/R/gen_var2-val2.R b/R/gen_var2-val2.R index d0ba304..a8de794 100644 --- a/R/gen_var2-val2.R +++ b/R/gen_var2-val2.R @@ -165,6 +165,8 @@ gen_val2var <- function(code = NULL, area <- switch(area, all = "all", public = "\u00F6ffentlich", user = "benutzer") + embedding <- list(...)$frame + #----------------------------------------------------------------------------- if(gen_fun == "gen_api"){ @@ -195,7 +197,11 @@ gen_val2var <- function(code = NULL, results_json <- test_if_json(results_raw) - empty_object <- test_if_error(results_json, para = error.ignore) + if(isTRUE(grepl("gen_val2var2stat", embedding))){ + empty_object <- test_if_error_variables(results_json, para = error.ignore) + } else { + empty_object <- test_if_error(results_json, para = error.ignore) + } if(isTRUE(empty_object)){ list_of_variables <- "No `values`- object found for your request." @@ -268,6 +274,8 @@ gen_val2var2stat <- function(code = NULL, sortcriterion <- match.arg(sortcriterion) + embedding <- deparse(sys.calls()) + #----------------------------------------------------------------------------- variables <- suppressMessages(suppressWarnings(gen_var2stat(code = code, @@ -286,7 +294,8 @@ gen_val2var2stat <- function(code = NULL, database = database, area = area, sortcriterion = sortcriterion, - error.ignore = error.ignore))) + error.ignore = error.ignore, + frame = embedding))) list_values <<- append(list_values, zwisch) }) diff --git a/R/utils.R b/R/utils.R index 091e89f..df9ea6d 100644 --- a/R/utils.R +++ b/R/utils.R @@ -247,25 +247,18 @@ check_function_input <- function(code = NULL, #--------------------------------------------------------------------------- - if (caller %in% c( - "restatis::gen_catalogue", "restatis::gen_objects2var", - "gen_catalogue", "gen_objects2var" - )) { - if (!all(category %in% c("tables", "cubes", "statistics"))) { - stop("Available categories are 'tables', 'statistics', and 'cubes'.", - call. = FALSE - ) - } - } - - #---------------------------------------- - if (caller %in% c( "restatis::gen_catalogue", "restatis::gen_objects2var", "gen_catalogue", "gen_objects2var" )) { if(database == "gen_zensus_api"){ + if (!all(category %in% c("tables", "cubes", "statistics"))) { + stop("Available categories are 'tables' and 'statistics'.", + call. = FALSE + ) + } + if (length(category) == 1 && "cubes" %in% category && isFALSE(error.ignore)) { stop("Available categories for 'zensus'-database are: 'tables' and 'statistics'.", call. = FALSE @@ -291,15 +284,13 @@ check_function_input <- function(code = NULL, ) } } - } - - #---------------------------------------- - if (caller %in% c("restatis::gen_objects2stat", "gen_objects2stat")) { - if (!all(category %in% c("tables", "cubes", "variables"))) { - stop("Available categories are 'tables', 'variables', and 'cubes'.", - call. = FALSE - ) + if(database == "gen_api"){ + if (!all(category %in% c("tables", "cubes", "statistics"))) { + stop("Available categories are 'tables', 'statistics', and 'cubes'.", + call. = FALSE + ) + } } } @@ -307,14 +298,42 @@ check_function_input <- function(code = NULL, if (caller %in% c("restatis::gen_objects2stat", "gen_objects2stat")) { if(database == "gen_zensus_api"){ - if ("cubes" %in% category && isTRUE(error.ignore)) { + + if (!all(category %in% c("tables", "cubes", "variables"))) { + stop("Available categories are 'tables' and 'variables'.", + call. = FALSE + ) + } + + if (length(category) == 1 && "cubes" %in% category && isFALSE(error.ignore)) { + stop("Available categories for 'zensus'-database are: 'tables' and 'variables'.", + call. = FALSE + ) + } + + else if (length(category) == 1 && "cubes" %in% category && isTRUE(error.ignore)) { warning("Available categories for 'zensus'-database are: 'tables' and 'variables'. - Function is continued with specified 'category'-parameter excluding 'cubes'.", call. = FALSE + Function is continued with a placeholder for the 'cubes' output.", + call. = FALSE ) } else if ("cubes" %in% category && isFALSE(error.ignore)) { - stop("Available categories for 'zensus'-database are: 'tables' and 'variables'.", + warning("Available categories for 'zensus'-database are: 'tables' and 'variables'." + , call. = FALSE + ) + } + + else if ("cubes" %in% category && isTRUE(error.ignore)) { + warning("Available categories for 'zensus'-database are: 'tables' and 'variables'. + Function is continued with specified 'category'-parameter excluding 'cubes'.", call. = FALSE + ) + } + } + + if(database == "gen_api"){ + if (!all(category %in% c("tables", "cubes", "variables"))) { + stop("Available categories are 'tables', 'variables', and 'cubes'.", call. = FALSE ) } @@ -579,6 +598,24 @@ test_if_error <- function(input, para) { return(empty_object) } +# test_if_error_variables ---- + +test_if_error_variables <- function(input, para) { + if (input$Status$Code == 104) { + + empty_object <- TRUE + + } else if (input$Status$Code != 0) { + + empty_object <- FALSE + + } else { + empty_object <- "DONE" + } + + return(empty_object) +} + #------------------------------------------------------------------------------- # test_if_process_further ---- From af1c3d7d78c0ff3590f3cc24df91a815d70015f8 Mon Sep 17 00:00:00 2001 From: buhly Date: Mon, 22 Jan 2024 19:01:56 +0100 Subject: [PATCH 11/52] new check param cube/Table --- R/gen_cube.R | 1 + R/gen_table.R | 10 +++++++--- R/utils.R | 15 +++++++++++++++ 3 files changed, 23 insertions(+), 3 deletions(-) diff --git a/R/gen_cube.R b/R/gen_cube.R index e578057..40ded15 100644 --- a/R/gen_cube.R +++ b/R/gen_cube.R @@ -79,6 +79,7 @@ gen_cube_ <- function(name, param_check_year(startyear) param_check_year(endyear) + param_check_regionalkey(regionalkey) contents <- param_collapse_vec(contents) regionalkey <- param_collapse_vec(regionalkey) diff --git a/R/gen_table.R b/R/gen_table.R index 7077492..0ebe039 100644 --- a/R/gen_table.R +++ b/R/gen_table.R @@ -65,7 +65,8 @@ gen_table_ <- function(name, classifyingvariable3 = NULL, classifyingkey3 = NULL, stand = NULL, - language = Sys.getenv("GENESIS_LANG")) { + language = Sys.getenv("GENESIS_LANG"), + job = FALSE) { area <- match.arg(area) @@ -75,6 +76,7 @@ gen_table_ <- function(name, param_check_year(startyear) param_check_year(endyear) + param_check_regionalkey(regionalkey) regionalkey <- param_collapse_vec(regionalkey) classifyingkey1 <- param_collapse_vec(classifyingkey1) @@ -144,7 +146,8 @@ gen_table_ <- function(name, readr::read_delim( delim = ";", show_col_types = FALSE, - locale = readr::locale(decimal_mark = ",", grouping_mark = ".")) + locale = readr::locale(decimal_mark = ",", grouping_mark = "."), + name_repair = "minimal") } else if (language == "en") { @@ -152,7 +155,8 @@ gen_table_ <- function(name, httr2::resp_body_string() %>% readr::read_delim( delim = ";", - show_col_types = FALSE) + show_col_types = FALSE, + name_repair = "minimal") } else { diff --git a/R/utils.R b/R/utils.R index df9ea6d..17bbfca 100644 --- a/R/utils.R +++ b/R/utils.R @@ -15,6 +15,21 @@ param_check_year <- function(year) { } +#------------------------------------------------------------------------------- + +param_check_regionalkey <- function(regionalkey) { + + if (!is.character(regionalkey)) { + + stop("The parameter 'regionalkey' needs to be of type 'character'.", + call. = FALSE) + + } + +} + +#------------------------------------------------------------------------------- + param_collapse_vec <- function(vec) { paste0(vec, collapse = ",") } From 6fb5be6b367ea038dd26f8ec149d1a8fd3c03cbd Mon Sep 17 00:00:00 2001 From: buhly Date: Mon, 20 May 2024 18:00:11 +0200 Subject: [PATCH 12/52] reformatting, adding logincheck, adding support for application/zip --- DESCRIPTION | 3 +- R/gen_auth.R | 39 +- R/gen_table.R | 130 +++-- R/gen_zensus_auth.R | 25 +- R/{utils.R => utils_dataprocessing.R} | 787 +++++++++++++++++--------- R/utils_httr2.R | 342 +++++++++++ R/zzz.R | 11 +- 7 files changed, 979 insertions(+), 358 deletions(-) rename R/{utils.R => utils_dataprocessing.R} (55%) create mode 100644 R/utils_httr2.R diff --git a/DESCRIPTION b/DESCRIPTION index b61e471..d5b608e 100644 --- a/DESCRIPTION +++ b/DESCRIPTION @@ -25,7 +25,8 @@ Imports: memoise, readr, tibble, - vctrs + vctrs, + usethis Suggests: httptest2, knitr, diff --git a/R/gen_auth.R b/R/gen_auth.R index 607ac48..50fd923 100644 --- a/R/gen_auth.R +++ b/R/gen_auth.R @@ -40,39 +40,54 @@ gen_auth_save <- function() { dir.create(gen_auth_path(), showWarnings = FALSE, recursive = TRUE) - httr2::secret_write_rds( - list(username = username, password = password), - path = auth_path, - key = "RESTATIS_KEY" - ) -} + httr2::secret_write_rds(list(username = username, password = password), + path = auth_path, + key = "RESTATIS_KEY") + + # Logincheck + perform_logincheck(database = "genesis") + + } + +#------------------------------------------------------------------------------- gen_auth_get <- function() { auth_path <- gen_auth_path("auth.rds") if (!(file.exists(auth_path) && nzchar(Sys.getenv("RESTATIS_KEY")))) { - stop( - "Genesis credentials not found.\n", - "Please run `gen_auth_save()` to store Genesis username and password.\n", - call. = FALSE - ) + + stop(paste0("Genesis database credentials not found. ", + "Please run 'gen_auth_save()' to store Genesis database username and password."), + call. = FALSE) + } httr2::secret_read_rds(auth_path, "RESTATIS_KEY") + } +#------------------------------------------------------------------------------- + gen_auth_ask <- function(credential_type) { + val <- askpass::askpass(paste0("Please enter your ", credential_type, ": ")) if (is.null(val)) { - stop("Cancelled by user", call. = FALSE) + + stop("Cancelled by user.", call. = FALSE) + } val + } +#------------------------------------------------------------------------------- + gen_auth_path <- function(...) { + file.path(tools::R_user_dir("restatis", "config"), ...) + } diff --git a/R/gen_table.R b/R/gen_table.R index 0ebe039..531996c 100644 --- a/R/gen_table.R +++ b/R/gen_table.R @@ -68,10 +68,20 @@ gen_table_ <- function(name, language = Sys.getenv("GENESIS_LANG"), job = FALSE) { + #----------------------------------------------------------------------------- + # Parameter processing + + database <- match.arg(database) + area <- match.arg(area) if (!isTRUE(language == "en")) { - area <- switch(area, all = "all", public = "\u00F6ffentlich", user = "benutzer") + + area <- switch(area, + all = "all", + public = "\u00F6ffentlich", + user = "benutzer") + } param_check_year(startyear) @@ -83,50 +93,55 @@ gen_table_ <- function(name, classifyingkey2 <- param_collapse_vec(classifyingkey2) classifyingkey3 <- param_collapse_vec(classifyingkey3) - if(database == "zensus"){ + #----------------------------------------------------------------------------- + # Data download - resp <- gen_zensus_api("data/tablefile", - name = name, - area = area, - compress = compress, - transpose = transpose, - startyear = startyear, - endyear = endyear, - regionalvariable = regionalvariable, - regionalkey = regionalkey, - classifyingvariable1 = classifyingvariable1, - classifyingkey1 = classifyingkey1, - classifyingvariable2 = classifyingvariable2, - classifyingkey2 = classifyingkey2, - classifyingvariable3 = classifyingvariable3, - classifyingkey3 = classifyingkey3, - stand = stand, - language = language, - format = "ffcsv", - job = FALSE) + if(database == "zensus"){ + response <- gen_zensus_api("data/tablefile", + name = name, + area = area, + compress = compress, + transpose = transpose, + startyear = startyear, + endyear = endyear, + regionalvariable = regionalvariable, + regionalkey = regionalkey, + classifyingvariable1 = classifyingvariable1, + classifyingkey1 = classifyingkey1, + classifyingvariable2 = classifyingvariable2, + classifyingkey2 = classifyingkey2, + classifyingvariable3 = classifyingvariable3, + classifyingkey3 = classifyingkey3, + stand = stand, + language = language, + format = "ffcsv", + job = FALSE) + + #----------------------------------------------------------------------------- } else if (database == "genesis"){ - resp <- gen_api("data/tablefile", - name = name, - area = area, - compress = compress, - transpose = transpose, - startyear = startyear, - endyear = endyear, - regionalvariable = regionalvariable, - regionalkey = regionalkey, - classifyingvariable1 = classifyingvariable1, - classifyingkey1 = classifyingkey1, - classifyingvariable2 = classifyingvariable2, - classifyingkey2 = classifyingkey2, - classifyingvariable3 = classifyingvariable3, - classifyingkey3 = classifyingkey3, - stand = stand, - language = language, - format = "ffcsv", - job = FALSE) - + response <- gen_api("data/tablefile", + name = name, + area = area, + compress = compress, + transpose = transpose, + startyear = startyear, + endyear = endyear, + regionalvariable = regionalvariable, + regionalkey = regionalkey, + classifyingvariable1 = classifyingvariable1, + classifyingkey1 = classifyingkey1, + classifyingvariable2 = classifyingvariable2, + classifyingkey2 = classifyingkey2, + classifyingvariable3 = classifyingvariable3, + classifyingkey3 = classifyingkey3, + stand = stand, + language = language, + format = "ffcsv", + job = FALSE) + + #----------------------------------------------------------------------------- } else { stop("Parameter 'database' has to be 'zensus' or 'genesis'.", @@ -134,33 +149,14 @@ gen_table_ <- function(name, } - resp_check_data_csv(resp) - - # Returning the table desired by the user - # There has to be a check on language to display correct decimal marks - # For German results, there needs to be a decimal mark set - if (language == "de") { - - resp %>% - httr2::resp_body_string() %>% - readr::read_delim( - delim = ";", - show_col_types = FALSE, - locale = readr::locale(decimal_mark = ",", grouping_mark = "."), - name_repair = "minimal") - - } else if (language == "en") { - - resp %>% - httr2::resp_body_string() %>% - readr::read_delim( - delim = ";", - show_col_types = FALSE, - name_repair = "minimal") + #----------------------------------------------------------------------------- + # Data processing - } else { + response_type <- resp_check_data_csv(response) - stop("Error handling language setting locale (values different from 'de' and 'en'.") + # Returning the table desired by the user + return(return_table_object(response = response, + response_type = response_type, + language = language)) - } } diff --git a/R/gen_zensus_auth.R b/R/gen_zensus_auth.R index 282f954..373adae 100644 --- a/R/gen_zensus_auth.R +++ b/R/gen_zensus_auth.R @@ -40,13 +40,17 @@ gen_zensus_auth_save <- function() { dir.create(gen_auth_path(), showWarnings = FALSE, recursive = TRUE) - httr2::secret_write_rds( - list(username = username, password = password), - path = auth_path, - key = "ZENSUS_KEY" - ) + httr2::secret_write_rds(list(username = username, password = password), + path = auth_path, + key = "ZENSUS_KEY") + + # Logincheck + perform_logincheck(database = "zensus") + } +#------------------------------------------------------------------------------- + #' Check if credentials for Zensus data base are available #' #' @return Zensus data base key for credentials @@ -56,12 +60,13 @@ gen_zensus_auth_get <- function() { auth_path <- gen_auth_path("auth_zensus.rds") if (!(file.exists(auth_path) && nzchar(Sys.getenv("ZENSUS_KEY")))) { - stop( - "Zensus credentials not found.\n", - "Please run `gen_zensus_auth_save()` to store Zensus database username and password.\n", - call. = FALSE - ) + + stop(paste0("Zensus database credentials not found. ", + "Please run 'gen_zensus_auth_save()' to store Zensus database username and password."), + call. = FALSE) + } httr2::secret_read_rds(auth_path, "ZENSUS_KEY") + } diff --git a/R/utils.R b/R/utils_dataprocessing.R similarity index 55% rename from R/utils.R rename to R/utils_dataprocessing.R index 17bbfca..c3c6009 100644 --- a/R/utils.R +++ b/R/utils_dataprocessing.R @@ -1,9 +1,11 @@ -resp_check_data_csv <- function(resp) { - if (httr2::resp_content_type(resp) != "text/csv") { - stop("No data found that meets the specified parameters", call. = FALSE) - } -} +#------------------------------------------------------------------------------- +# Util functions related to data processing +#------------------------------------------------------------------------------- +#' param_check_year +#' +#' @param year Year as parameter value +#' param_check_year <- function(year) { if (as.integer(year) < 1900 || as.integer(year) > 2100) { @@ -17,9 +19,13 @@ param_check_year <- function(year) { #------------------------------------------------------------------------------- +#' param_check_regionalkey +#' +#' @param regionalkey Regional key +#' param_check_regionalkey <- function(regionalkey) { - if (!is.character(regionalkey)) { + if (!is.null(regionalkey) & !is.character(regionalkey)) { stop("The parameter 'regionalkey' needs to be of type 'character'.", call. = FALSE) @@ -30,123 +36,235 @@ param_check_regionalkey <- function(regionalkey) { #------------------------------------------------------------------------------- +#' param_collapse_vec +#' +#' @param vec Vector to be collapsed +#' param_collapse_vec <- function(vec) { + paste0(vec, collapse = ",") + } #------------------------------------------------------------------------------- -# Forming_evas ---- - +#' forming_evas +#' +#' @param list_of List of EVAS to iterate over +#' forming_evas <- function(list_of) { + evas_list_long_20220724 <- restatis::evas_list_long_20220724 - # Progress them + #----------------------------------------------------------------------------- + # Process them + list_of$Main <- apply(list_of, 1, function(x) { + obj <- evas_list_long_20220724$Titel[evas_list_long_20220724$EVAS == substr(x["Code"], 1, 1)] + if(length(obj) == 0){ + obj <- "No assignment" + } + return(obj) + }) + #----------------------------------------------------------------------------- + list_of$Main2 <- apply(list_of, 1, function(x) { + obj <- evas_list_long_20220724$Titel[evas_list_long_20220724$EVAS == substr(x["Code"], 1, 2)] + if(length(obj) == 0){ + obj <- "No assignment" + } + return(obj) + }) + #----------------------------------------------------------------------------- + list_of$Main3 <- apply(list_of, 1, function(x) { + obj <- evas_list_long_20220724$Titel[evas_list_long_20220724$EVAS == substr(x["Code"], 1, 3)] + if(length(obj) == 0){ + obj <- "No assignment" + } + return(obj) + }) + #----------------------------------------------------------------------------- + list_of$Main5 <- apply(list_of, 1, function(x) { + obj <- evas_list_long_20220724$Titel[evas_list_long_20220724$EVAS == substr(x["Code"], 1, 5)] + if(length(obj) == 0){ + obj <- "No assignment" + } + return(obj) + }) - keep <- colnames(list_of[,1:(ncol(list_of) - 4)]) + #----------------------------------------------------------------------------- + keep <- colnames(list_of[,1:(ncol(list_of) - 4)]) + #----------------------------------------------------------------------------- if(sum(list_of$Main == "No assignment") != nrow(list_of)){ + nestedlist <- split(list_of, list_of$Main, drop = TRUE) + #--------------------------------------------------------------------------- if(sum(list_of$Main2 == "No assignment") != nrow(list_of)){ + nestedlist <- lapply(nestedlist, function(x) { + obj <- split(x, x["Main2"], drop = TRUE) - }) + }) + #------------------------------------------------------------------------- if(sum(list_of$Main3 == "No assignment") != nrow(list_of)){ + nestedlist <- lapply(nestedlist, function(x) { + lapply(x, function(y) { + obj <- split(y, y["Main3"]) + }) + }) + #----------------------------------------------------------------------- if(sum(list_of$Main5 == "No assignment") != nrow(list_of)){ + nestedlist <- lapply(nestedlist, function(x) { + lapply(x, function(y) { + lapply(y, function(z) { + obj <- split(z, z["Main5"]) + return(obj) + }) + }) + }) + #--------------------------------------------------------------------- + nestedlist <- lapply(nestedlist, function(d){ + lapply(d, function(y){ + lapply(y, function(x){ + lapply(x, function(r, remain){ + obj <- r[keep] obj <- tibble::as_tibble(obj) - }, remain = keep)}) + + }, + remain = keep)}) + }) + }) + #----------------------------------------------------------------------- } else { + nestedlist <- lapply(nestedlist, function(d){ + lapply(d, function(y){ + lapply(y, function(r, remain){ + obj <- r[keep] obj <- tibble::as_tibble(obj) - }, remain = keep - )})})} + }, + remain = keep + + )} + )} + )} + + #------------------------------------------------------------------------- } else { + nestedlist <- lapply(nestedlist, function(d){ + lapply(d, function(r, remain){ + obj <- r[keep] obj <- tibble::as_tibble(obj) - }, remain = keep - )})} + }, + remain = keep + + )} + + )} + #--------------------------------------------------------------------------- } else { + nestedlist <- lapply(nestedlist, function(r, remain){ + obj <- r[keep] obj <- tibble::as_tibble(obj) - }, remain = keep - )} + + }, + remain = keep) + + } } else { + nestedlist <- tibble::as_tibble(list_of[keep]) - } + + } return(nestedlist) + } #------------------------------------------------------------------------------- -# check_function_input ---- - +#' check_function_input +#' +#' @param code Parameter to be checked +#' @param term Parameter to be checked +#' @param sortcriterion Parameter to be checked +#' @param category Parameter to be checked +#' @param detailed Parameter to be checked +#' @param type Parameter to be checked +#' @param date Parameter to be checked +#' @param similarity Parameter to be checked +#' @param error.ignore Parameter to be checked +#' @param ordering Parameter to be checked +#' @param database Parameter to be checked +#' @param caller Parameter to be checked +#' check_function_input <- function(code = NULL, term = NULL, sortcriterion = NULL, @@ -159,310 +277,471 @@ check_function_input <- function(code = NULL, ordering = NULL, database = NULL, caller = NULL) { + + #----------------------------------------------------------------------------- # Code & Term ---- if (is.null(code) && is.null(term)) { - if (!(caller %in% c( - "gen_search_vars", - "restatis::gen_search_vars" - ))) { + + if (!(caller %in% c("gen_search_vars", "restatis::gen_search_vars"))) { + stop("Parameter 'code' or 'term' must NOT be NULL.", - call. = FALSE - ) + call. = FALSE) + } + } + #----------------------------------------------------------------------------- # Code ---- if (!is.null(code)) { + if (length(code) != 1L) { + stop("Parameter 'code' must be a single string.", - call. = FALSE - ) + call. = FALSE) + } + #--------------------------------------------------------------------------- + if (!is.character(code)) { + stop("Parameter 'code' has to be of type 'character'.", - call. = FALSE - ) + call. = FALSE) + } + } + #----------------------------------------------------------------------------- # Term ---- if (!is.null(term)) { + if (length(term) != 1L) { + stop("Parameter 'term' must be a single string.", - call. = FALSE - ) + call. = FALSE) + } + #--------------------------------------------------------------------------- + if (!is.character(term)) { + stop("Parameter 'term' has to be of type 'character'.", - call. = FALSE - ) + call. = FALSE) + } + #--------------------------------------------------------------------------- + if (nchar(term) > 15 && !(caller %in% c("gen_find", "restatis::gen_find"))) { + stop("Parameter 'term' cannot consist of more than 15 characters.", - call. = FALSE - ) + call. = FALSE) + } + } + #----------------------------------------------------------------------------- # sortcriterion ---- if (!is.null(sortcriterion)) { + if (!is.character(sortcriterion)) { + stop("Parameter 'sortcriterion' has to be of type 'character'.", - call. = FALSE - ) + call. = FALSE) + } + #--------------------------------------------------------------------------- + if (length(sortcriterion) == 1) { + if (!(sortcriterion %in% c("code", "content"))) { + stop("Parameter 'sortcriterion' has to be 'code' or 'content'.", - call. = FALSE - ) + call. = FALSE) + } + } + } + #----------------------------------------------------------------------------- # category ---- if (!is.null(category)) { - if (!(length(category) %in% c(1:3)) && caller %in% c( - "restatis::gen_catalogue", - "restatis::gen_objects2var", - "restatis::gen_objects2stat", - "gen_catalogue", - "gen_objects2var", - "gen_objects2stat" - )) { - stop("Parameter 'category' has to have a length of 1 to 3.", call. = FALSE) - } - #---------------------------------------- + if (!(length(category) %in% c(1:3)) && + caller %in% c("restatis::gen_catalogue", + "restatis::gen_objects2var", + "restatis::gen_objects2stat", + "gen_catalogue", + "gen_objects2var", + "gen_objects2stat")) { + + stop("Parameter 'category' has to have a length of 1 to 3.", + call. = FALSE) + + } + + #--------------------------------------------------------------------------- + + if (!(length(category) %in% c(1, 5)) && + caller %in% c("restatis::gen_find", "gen_find")) { + + stop("Parameter 'category' must have a length of 1.", + call. = FALSE) - if (!(length(category) %in% c(1, 5)) && caller %in% c( - "restatis::gen_find", - "gen_find" - )) { - stop("Parameter 'category' must have a length of 1.", call. = FALSE) } #---------------------------------------- - if (length(category) != 1 && caller %in% c( - "restatis::gen_metadata", - "gen_metadata" - )) { - stop("Parameter 'category' must have a length of 1. Please specify the category.", call. = FALSE) + if (length(category) != 1 && + caller %in% c("restatis::gen_metadata", "gen_metadata")) { + + stop("Parameter 'category' must have a length of 1. Please specify the category.", + call. = FALSE) + } #--------------------------------------------------------------------------- - if (caller %in% c( - "restatis::gen_catalogue", "restatis::gen_objects2var", - "gen_catalogue", "gen_objects2var" - )) { + if (caller %in% c("restatis::gen_catalogue", + "restatis::gen_objects2var", + "gen_catalogue", + "gen_objects2var")) { + + #------------------------------------------------------------------------- + if(database == "gen_zensus_api"){ + #----------------------------------------------------------------------- + if (!all(category %in% c("tables", "cubes", "statistics"))) { + stop("Available categories are 'tables' and 'statistics'.", - call. = FALSE - ) + call. = FALSE) + } - if (length(category) == 1 && "cubes" %in% category && isFALSE(error.ignore)) { + #----------------------------------------------------------------------- + + if (length(category) == 1 && + "cubes" %in% category && + isFALSE(error.ignore)) { + stop("Available categories for 'zensus'-database are: 'tables' and 'statistics'.", - call. = FALSE - ) + call. = FALSE) + } - else if (length(category) == 1 && "cubes" %in% category && isTRUE(error.ignore)) { + #----------------------------------------------------------------------- + + else if (length(category) == 1 && + "cubes" %in% category && + isTRUE(error.ignore)) { + warning("Available categories for 'zensus'-database are: 'tables' and 'statistics'. Function is continued with a placeholder for the 'cubes' output.", - call. = FALSE - ) + call. = FALSE) + } - else if ("cubes" %in% category && isFALSE(error.ignore)) { - warning("Available categories for 'zensus'-database are: 'tables' and 'statistics'." - , call. = FALSE - ) + else if ("cubes" %in% category && + isFALSE(error.ignore)) { + + warning("Available categories for 'zensus'-database are: 'tables' and 'statistics'.", + call. = FALSE) + } - else if ("cubes" %in% category && isTRUE(error.ignore)) { + else if ("cubes" %in% category && + isTRUE(error.ignore)) { + warning("Available categories for 'zensus'-database are: 'tables' and 'statistics'. - Function is continued with specified 'category'-parameter excluding 'cubes'.", call. = FALSE - ) + Function is continued with specified 'category'-parameter excluding 'cubes'.", + call. = FALSE) + } + } + #------------------------------------------------------------------------------- + if(database == "gen_api"){ + if (!all(category %in% c("tables", "cubes", "statistics"))) { + stop("Available categories are 'tables', 'statistics', and 'cubes'.", - call. = FALSE - ) + call. = FALSE) + } + } + } #---------------------------------------- - if (caller %in% c("restatis::gen_objects2stat", "gen_objects2stat")) { + if (caller %in% c("restatis::gen_objects2stat", + "gen_objects2stat")) { + + #------------------------------------------------------------------------- + if(database == "gen_zensus_api"){ + #----------------------------------------------------------------------- + if (!all(category %in% c("tables", "cubes", "variables"))) { + stop("Available categories are 'tables' and 'variables'.", - call. = FALSE - ) + call. = FALSE) + } - if (length(category) == 1 && "cubes" %in% category && isFALSE(error.ignore)) { + #----------------------------------------------------------------------- + + if (length(category) == 1 && + "cubes" %in% category && + isFALSE(error.ignore)) { + stop("Available categories for 'zensus'-database are: 'tables' and 'variables'.", - call. = FALSE - ) + call. = FALSE) + } - else if (length(category) == 1 && "cubes" %in% category && isTRUE(error.ignore)) { + #----------------------------------------------------------------------- + + else if (length(category) == 1 && + "cubes" %in% category && isTRUE(error.ignore)) { + warning("Available categories for 'zensus'-database are: 'tables' and 'variables'. Function is continued with a placeholder for the 'cubes' output.", - call. = FALSE - ) + call. = FALSE) + } - else if ("cubes" %in% category && isFALSE(error.ignore)) { - warning("Available categories for 'zensus'-database are: 'tables' and 'variables'." - , call. = FALSE - ) + #----------------------------------------------------------------------- + + else if ("cubes" %in% category && + isFALSE(error.ignore)) { + + warning("Available categories for 'zensus'-database are: 'tables' and 'variables'.", + call. = FALSE) + } - else if ("cubes" %in% category && isTRUE(error.ignore)) { + #----------------------------------------------------------------------- + + else if ("cubes" %in% category && + isTRUE(error.ignore)) { + warning("Available categories for 'zensus'-database are: 'tables' and 'variables'. - Function is continued with specified 'category'-parameter excluding 'cubes'.", call. = FALSE - ) + Function is continued with specified 'category'-parameter excluding 'cubes'.", + call. = FALSE) + } + } + #------------------------------------------------------------------------- + if(database == "gen_api"){ + if (!all(category %in% c("tables", "cubes", "variables"))) { + stop("Available categories are 'tables', 'variables', and 'cubes'.", - call. = FALSE - ) + call. = FALSE) + } + } + } #---------------------------------------- if (caller %in% c("restatis::gen_find", "gen_find")) { + + #------------------------------------------------------------------------- + if (!all(category %in% c("all", "tables", "statistics", "variables", "cubes"))) { + + #--------------------------------------------------------------------- + if(database == "gen_api"){ - stop("Available categories for parameter 'category' for 'genesis'-database are 'all', 'tables', 'statistics', 'variables', and 'cubes'.", - call. = FALSE - ) + + stop("Available categories for parameter 'category' for 'genesis'-database are 'all', 'tables', 'statistics', 'variables', and 'cubes'.", + call. = FALSE) + } + #--------------------------------------------------------------------- + if(gen_fun == "gen_zensus_api"){ + stop("Available categories for parameter 'category' for 'zensus'-database are 'all', 'tables', 'statistics', and 'variables'.", - call. = FALSE - ) - } + call. = FALSE) + } + + } + } - #---------------------------------------- + #--------------------------------------------------------------------------- if (caller %in% c("restatis::gen_find", "gen_find")) { + + #------------------------------------------------------------------------- + if(database == "gen_zensus_api"){ - if ("cubes" %in% category && isTRUE(error.ignore)) { + + #----------------------------------------------------------------------- + + if ("cubes" %in% category && + isTRUE(error.ignore)) { + warning("Available categories for 'zensus'-database are: 'all', 'tables', 'statistics', and 'variables'. - Function is continued with a placeholder for the 'cubes' output.", call. = FALSE - ) + Function is continued with a placeholder for the 'cubes' output.", + call. = FALSE) + } - else if ( "all" %in% category) { + #----------------------------------------------------------------------- + + else if ("all" %in% category) { + warning("Available categories for 'zensus'-database are: 'all', 'tables', 'statistics', and 'variables'. - Function is continued with a placeholder for the 'cubes' output.", call. = FALSE - ) + Function is continued with a placeholder for the 'cubes' output.", + call. = FALSE) + } - else if ("cubes" %in% category && isFALSE(error.ignore)) { + #----------------------------------------------------------------------- + + else if ("cubes" %in% category && + isFALSE(error.ignore)) { + stop("Available categories are 'all', 'tables', 'statistics', and 'variables'.", - call. = FALSE - ) - } + call. = FALSE) + } } + } - #---------------------------------------- + #--------------------------------------------------------------------------- if (caller %in% c("restatis::gen_metadata", "gen_metadata")) { + + #------------------------------------------------------------------------- + if(database == "gen_api"){ + #----------------------------------------------------------------------- + if (!all(category %in% c("Cube", "Statistic", "Table", "Variable", "Value"))) { + stop("Available categories for parameter 'category' for 'genesis'-database are 'Cube', 'Table', 'Statistic', 'Variable', and 'Value'.", - call. = FALSE - ) + call. = FALSE) + } - } + + } + + #------------------------------------------------------------------------- else if( database == "gen_zensus_api") { if (!all(category %in% c("Statistic", "Table", "Variable", "Value"))) { + stop("Available categories for parameter 'category' for 'zensus'-database are 'Table', 'Statistic', 'Variable', and 'Value'.", - call. = FALSE - ) + call. = FALSE) + } + } + } + } + #----------------------------------------------------------------------------- # detailed ---- if (!is.null(detailed)) { - if (!is.logical(detailed) || length(detailed) != 1) { + + if (!is.logical(detailed) || + length(detailed) != 1) { + stop("Parameter 'detailed' has to be of type 'logical' and of length 1.", - call. = FALSE - ) + call. = FALSE) + } + #--------------------------------------------------------------------------- + if (isFALSE(detailed)) { + message("Use 'detailed = TRUE' to obtain the complete output.") + } + } + #------------------------------------------------------------------------------- # type ---- if (!is.null(type)) { + + #--------------------------------------------------------------------------- + if (database == "gen_api"){ + + #------------------------------------------------------------------------- + if (!all(type %in% c("all", "tables", "statistics", "statisticsUpdates"))) { + stop("Available categories for parameter 'type' for 'genesis'-database are 'tables', 'statistics', 'statistic updates', and 'all'.", - call. = FALSE - ) + call. = FALSE) + } + } + #--------------------------------------------------------------------------- + if (database == "gen_zensus_api"){ + if (!all(type %in% c("all", "tables", "statistics"))) { + stop("Available categories for parameter 'type' for 'zensus'-database are 'tables', 'statistics', and 'all'.", - call. = FALSE - ) + call. = FALSE) + } + } } - + #----------------------------------------------------------------------------- # date ---- if (!is.null(date)) { + #--------------------------------------------------------------------------- + if (identical(date, c("now", "week_before", "month_before", "year_before"))) { message("Please note that this date is calculated automatically and may differ @@ -473,15 +752,21 @@ check_function_input <- function(code = NULL, } + #--------------------------------------------------------------------------- + if (!(length(date) %in% c(1, 4))) { stop("Parameter 'date' has to be of length 4 (c('now', 'week_before', 'month_before', 'year_before') for the default option of 'now' or of length 1.))", - call. = FALSE) + call. = FALSE) } + #--------------------------------------------------------------------------- + if (length(date) == 1) { + #------------------------------------------------------------------------- + if (date %in% c("now", "week_before", "month_before", "year_before")) { message("Please note that this date is calculated automatically and may differ @@ -489,256 +774,229 @@ check_function_input <- function(code = NULL, the format DD.MM.YYYY.") return(date) + } + #------------------------------------------------------------------------- + if (!(date %in% c("now", "week_before", "month_before", "year_before"))) { + #----------------------------------------------------------------------- + if (!is.character(date)) { stop("If using a specific date for parameter 'date', it has to be of type 'character' (format: DD.MM.YYYY).", - call. = FALSE) + call. = FALSE) } - if (length(date) != 1 || nchar(date) != 10) { + #----------------------------------------------------------------------- + + if (length(date) != 1 || + nchar(date) != 10) { + stop("If specifying a specific date for parameter 'date', it has to be of length 1 and format DD.MM.YYYY.", - call. = FALSE) + call. = FALSE) + } return(date) + } + } + } + #----------------------------------------------------------------------------- # similarity ---- if (!is.null(similarity)) { - if (!is.logical(similarity)) { - stop("Parameter 'similarity' has to be of type 'logical'.", - call. = FALSE - ) - } - } - - # error.ignore ---- - - if (!is.null(error.ignore)) { - if (length(error.ignore == 1)) { - if (!is.logical(error.ignore) || length(error.ignore) != 1) { - stop("Parameter 'error.ignore' has to be of type 'logical' and of length 1.", - call. = FALSE - ) - } - } - if (isTRUE(error.ignore)) { - message("Use 'error.ignore = FALSE' to stop the function at the point where no object could be found.") - } - } + if (!is.logical(similarity)) { - # ordering ---- + stop("Parameter 'similarity' has to be of type 'logical'.", + call. = FALSE) - if (!is.null(ordering)) { - if (!is.logical(ordering) || length(ordering) != 1) { - stop("Parameter 'ordering' has to be of type 'logical' and of length 1.", - call. = FALSE - ) } - if (isFALSE(ordering)) { - message("Use 'ordering = TRUE' to obtain the output ordered based on the search term presence.") - } } -} - -#------------------------------------------------------------------------------- - -# test_if_json ---- -test_if_json <- function(input) { - if ((httr2::resp_content_type(input) == "application/json") && !is.na(httr2::resp_content_type(input))) { - results_json <- httr2::resp_body_json(input) - } else { - stop("No json-csv file detected.", call. = FALSE) - } + #----------------------------------------------------------------------------- + # error.ignore ---- - return(results_json) -} + if (!is.null(error.ignore)) { -#------------------------------------------------------------------------------- + #--------------------------------------------------------------------------- -# test_if_error_find ---- + if (length(error.ignore == 1)) { -test_if_error_find <- function(input, para) { - if (input$Status$Code != 0 && isTRUE(para)) { - stop(input$Status$Content) - } else if (input$Status$Code != 0 && isFALSE(para)) { - message(input$Status$Content) + #------------------------------------------------------------------------- - message("Artificial token is used.") + if (!is.logical(error.ignore) || + length(error.ignore) != 1) { - empty_object <- FALSE - } else { - empty_object <- "DONE" - } + stop("Parameter 'error.ignore' has to be of type 'logical' and of length 1.", + call. = FALSE) - return(empty_object) -} + } -#------------------------------------------------------------------------------- + } -# test_if_error ---- + #--------------------------------------------------------------------------- -test_if_error <- function(input, para) { - if (input$Status$Code == 104 && isFALSE(para)) { - stop("No object found for your request. Check your parameters if you expected an object for this request.", - call. = FALSE - ) - } else if (input$Status$Code != 0 && isFALSE(para)) { - stop(input$Status$Content, call. = FALSE) - } else if (input$Status$Code == 104 && isTRUE(para)) { - message("No object found for your request. Check your parameters if you expected an object for this request. Artificial token is used.", call. = FALSE) + if (isTRUE(error.ignore)) { - empty_object <- TRUE - } else if (input$Status$Code != 0 && isTRUE(para)) { - message(input$Status$Content) + message("Use 'error.ignore = FALSE' to stop the function at the point where no object could be found.") - message("Artificial token is used.") + } - empty_object <- FALSE - } else { - empty_object <- "DONE" } - return(empty_object) -} - -# test_if_error_variables ---- - -test_if_error_variables <- function(input, para) { - if (input$Status$Code == 104) { + #------------------------------------------------------------------------------- + # ordering ---- - empty_object <- TRUE + if (!is.null(ordering)) { - } else if (input$Status$Code != 0) { + if (!is.logical(ordering) || + length(ordering) != 1) { - empty_object <- FALSE + stop("Parameter 'ordering' has to be of type 'logical' and of length 1.", + call. = FALSE) - } else { - empty_object <- "DONE" - } + } - return(empty_object) -} + #--------------------------------------------------------------------------- -#------------------------------------------------------------------------------- + if (isFALSE(ordering)) { -# test_if_process_further ---- + message("Use 'ordering = TRUE' to obtain the output ordered based on the search term presence.") -test_if_process_further <- function(input, para) { - if (sum(unlist(lapply(input[4:8], function(x) { - is.null(x) - }))) == 5 && isFALSE(para)) { - stop("No object found for your request. Check your parameters if you expected an object for this request.", call. = FALSE) - } else if (sum(unlist(lapply(input[4:8], function(x) { - is.null(x) - }))) == 5 && isTRUE(para)) { - message("No object found for your request. Check your parameters if you expected an object for this request. Artificial token is used.") + } - empty_object <- TRUE - } else { - empty_object <- "DONE" } - return(empty_object) } #------------------------------------------------------------------------------- -# binding_lapply ---- - +#' binding_lapply +#' +#' @param x Element to bind +#' @param characteristics Characteristics to filter for +#' binding_lapply <- function(x, characteristics) { - list_of <- stats::setNames(data.frame(matrix(ncol = length(characteristics), nrow = 0)), characteristics) + + list_of <- stats::setNames(data.frame(matrix(ncol = length(characteristics), + nrow = 0)), + characteristics) lapply(x, function(x) { + zwisch <- unlist(x[characteristics]) list_of <<- rbind(list_of, zwisch[characteristics]) + }) colnames(list_of) <- characteristics return(list_of) + } #------------------------------------------------------------------------------- -# gsub ---- - +#' ggsub +#' +#' @param x Element to subset with $Content +#' ggsub <- function(x) { + a <- gsub(".*:", "", x$Content) return(a) + } #------------------------------------------------------------------------------- -# spezifisch_create ---- - +#' spezifisch_create +#' +#' @param x Element to extract $Spezifisch from +#' spezifisch_create <- function(x) { + a <- unlist(lapply(strsplit(x$Spezifisch, ","), length)) return(a) + } #------------------------------------------------------------------------------- -# titel_search ---- - +#' titel_search +#' +#' @param x Element to extract $Content from +#' @param term Search term +#' titel_search <- function(x, term) { + split <- unlist(strsplit(gsub(" ", "und", term), c("und|UND|Und|\\&|ODER|oder|Oder|\\|"))) split <- split[sapply(split, function(y) { + nchar(y) > 0 + })] + #----------------------------------------------------------------------------- + if (length(split) == 1) { + a <- grepl(split, x$Content, ignore.case = TRUE) + } else if (grep("ODER|oder|Oder|\\|", term, ignore.case = TRUE) && grep("UND|und|Und|\\|", term, ignore.case = TRUE)) { + a <- rep(FALSE, length(x$Content)) + message("Combination of words too complex for ordering. Data is processed without ordering.") + } else if (grep("ODER|oder|Oder|\\|", term, ignore.case = TRUE)) { + a <- grepl(paste(split, collapse = "|"), x$Content, ignore.case = TRUE) + } else if (grep("UND|und|Und|\\|", term, ignore.case = TRUE)) { + a <- sapply(x$Content, function(con) { + all(sapply(split, function(z) { + grepl(z, con, ignore.case = TRUE) + })) + }) + } else { + a <- rep(FALSE, length(x$Content)) message("Combination of words not valid for ordering. Data is processed without ordering.") + } return(a) -} - - -#------------------------------------------------------------------------------- -# test_if_error_light ---- - -test_if_error_light <- function(input) { - if (input$Status$Code != 0) { - warning(input$Status$Content, call. = FALSE) - } } #------------------------------------------------------------------------------- -# Decide the database related function +#' test_database_function +#' +#' @param input Input to test for database name +#' test_database_function <- function(input){ if(length(input) > 1){ @@ -749,7 +1007,8 @@ test_database_function <- function(input){ if(is.na(input)){ - stop("Database parameter must be either 'genesis' or 'zensus'.", call. = FALSE) + stop("Database parameter must be either 'genesis' or 'zensus'.", + call. = FALSE) } @@ -763,8 +1022,10 @@ test_database_function <- function(input){ } else { - stop("Database parameter must be either 'genesis' or 'zensus'. No other values allowed.", call. = FALSE) + stop("Database parameter must be either 'genesis' or 'zensus'. No other values allowed.", + call. = FALSE) } + } diff --git a/R/utils_httr2.R b/R/utils_httr2.R new file mode 100644 index 0000000..34c988c --- /dev/null +++ b/R/utils_httr2.R @@ -0,0 +1,342 @@ +#------------------------------------------------------------------------------- +# Util functions related to API calls +#------------------------------------------------------------------------------- + +#' resp_check_data_csv +#' +#' @param resp Response object +#' +resp_check_data_csv <- function(resp) { + + if (!(httr2::resp_content_type(resp) %in% c("text/csv", "application/zip"))) { + + stop("No data found that meets the specified parameters", call. = FALSE) + + } + + return <- httr2::resp_content_type(resp) + +} + +#------------------------------------------------------------------------------- + +#' test_if_json +#' +#' @param input Response object +#' +test_if_json <- function(input) { + + if ((httr2::resp_content_type(input) == "application/json") && !is.na(httr2::resp_content_type(input))) { + + results_json <- httr2::resp_body_json(input) + + } else { + + stop("No json-csv file detected.", call. = FALSE) + + } + + return(results_json) + +} + +#------------------------------------------------------------------------------- + +#------------------------------------------------------------------------------- + +#' test_if_error_find +#' +#' @param input Response object +#' @param para Parameter TRUE/FALSE +#' +test_if_error_find <- function(input, para) { + + if (input$Status$Code != 0 && isTRUE(para)) { + + stop(input$Status$Content) + + } else if (input$Status$Code != 0 && isFALSE(para)) { + + message(input$Status$Content) + + message("Artificial token is used.") + + empty_object <- FALSE + + } else { + + empty_object <- "DONE" + + } + + return(empty_object) + +} + +#------------------------------------------------------------------------------- + +#' test_if_error +#' +#' @param input Response object +#' @param para Parameter TRUE/FALSE +#' +test_if_error <- function(input, para) { + + if (input$Status$Code == 104 && isFALSE(para)) { + + stop("No object found for your request. Check your parameters if you expected an object for this request.", + call. = FALSE) + + } else if (input$Status$Code != 0 && isFALSE(para)) { + + stop(input$Status$Content, + call. = FALSE) + + } else if (input$Status$Code == 104 && isTRUE(para)) { + + message("No object found for your request. Check your parameters if you expected an object for this request. Artificial token is used.", + call. = FALSE) + + empty_object <- TRUE + + } else if (input$Status$Code != 0 && isTRUE(para)) { + + message(input$Status$Content) + + message("Artificial token is used.") + + empty_object <- FALSE + + } else { + + empty_object <- "DONE" + + } + + return(empty_object) + +} + +#------------------------------------------------------------------------------- + +#' test_if_error_variables +#' +#' @param input Response object +#' @param para Parameter TRUE/FALSE +#' +test_if_error_variables <- function(input, para) { + + if (input$Status$Code == 104) { + + empty_object <- TRUE + + } else if (input$Status$Code != 0) { + + empty_object <- FALSE + + } else { + + empty_object <- "DONE" + + } + + return(empty_object) + +} + +#------------------------------------------------------------------------------- + +#' test_if_process_further +#' +#' @param input Response object +#' @param para Parameter TRUE/FALSE +#' +test_if_process_further <- function(input, para) { + + if (sum(unlist(lapply(input[4:8], function(x) { + + is.null(x) + + }))) == 5 && isFALSE(para)) { + + stop("No object found for your request. Check your parameters if you expected an object for this request.", + call. = FALSE) + + } else if (sum(unlist(lapply(input[4:8], function(x) { + + is.null(x) + + }))) == 5 && isTRUE(para)) { + + message("No object found for your request. Check your parameters if you expected an object for this request. Artificial token is used.") + + empty_object <- TRUE + + } else { + + empty_object <- "DONE" + + } + + return(empty_object) + +} + +#------------------------------------------------------------------------------- + +#' test_if_error_light +#' +#' @param input Response object +#' +test_if_error_light <- function(input) { + + if (input$Status$Code != 0) { + + warning(input$Status$Content, + call. = FALSE) + + } + +} + +#------------------------------------------------------------------------------- + +#' return_table_object +#' +#' @param response +#' @param response_type +#' @param language +#' +return_table_object <- function(response, + response_type, + language) { + + # There has to be a check on language to display correct decimal marks + # For German results, there needs to be a decimal mark set + + #----------------------------------------------------------------------------- + if (response_type == "text/csv"){ + + if (language == "de") { + + result <- response %>% + httr2::resp_body_string() %>% + readr::read_delim(delim = ";", + show_col_types = FALSE, + locale = readr::locale(decimal_mark = ",", + grouping_mark = "."), + name_repair = "minimal") + + } else if (language == "en") { + + result <- response %>% + httr2::resp_body_string() %>% + readr::read_delim( + delim = ";", + show_col_types = FALSE, + name_repair = "minimal") + + } else { + + stop("Error handling language setting locale (values different from 'de' and 'en'.") + + } + + } + + #------------------------------------------------------------------------------- + + # If the API response is a ZIP file, we need to temporarily save it + + if (response_type == "application/zip") { + + content <- httr2::resp_body_raw(response) + + temp_zip_path <- tempfile(fileext = ".zip") + + writeBin(content, + temp_zip_path) + + extract_dir <- tempdir() + + utils::unzip(temp_zip_path, + exdir = extract_dir) + + extracted_file <- list.files(extract_dir, + full.names = TRUE, + pattern = "_flat.csv") + + # We have to make sure there is only one flat csv to read in the tempdir + if (length(extracted_file) != 1) { + + stop("There are ambiguous file names (ending on '_flat.csv') in your temporary directory.", + call. = FALSE) + + } + + #--------------------------------------------------------------------------- + # Parsing of the result + + if (language == "de") { + + result <- readr::read_delim(file = extracted_file, + delim = ";", + show_col_types = FALSE, + locale = readr::locale(decimal_mark = ",", + grouping_mark = "."), + name_repair = "minimal") + + } else if (language == "en") { + + result <- readr::read_delim(file = extracted_file, + delim = ";", + show_col_types = FALSE, + name_repair = "minimal") + + } else { + + stop("Error handling language setting locale (values different from 'de' and 'en').") + + } + + # Remove temporarily created .csv file from temporary directory + file.remove(extracted_file) + + } + + return(result) + +} + +#------------------------------------------------------------------------------- + +perform_logincheck <- function(database) { + + if (database == "genesis") { + + response <- gen_api("helloworld/logincheck") + + } else if (database == "zensus") { + + response <- gen_zensus_api("helloworld/logincheck") + + } else { + + stop("Misspecified parameter 'database' for function 'perform_logincheck'.", + call. = FALSE) + + } + + #----------------------------------------------------------------------------- + + if (response$status_code != 200) { + + stop(paste0("There seems to be an issue with the authentication process (logincheck upon credential specification failed with code ", + response$status_code, + "). ", + "Please retry specifying your credentials or check whether the API is currently down."), + call. = FALSE) + + } + +} diff --git a/R/zzz.R b/R/zzz.R index dffbb85..0d668d5 100644 --- a/R/zzz.R +++ b/R/zzz.R @@ -1,11 +1,12 @@ .onLoad <- function(libname, pkgname) { gen_api <<- memoise::memoise(gen_api) - - if (!nzchar(Sys.getenv("GENESIS_LANG"))) Sys.setenv(GENESIS_LANG = "en") -} - -.onLoad_zensus <- function(libname, pkgname) { gen_zensus_api <<- memoise::memoise(gen_zensus_api) if (!nzchar(Sys.getenv("GENESIS_LANG"))) Sys.setenv(GENESIS_LANG = "en") } + +# .onLoad_zensus <- function(libname, pkgname) { +# gen_zensus_api <<- memoise::memoise(gen_zensus_api) +# +# if (!nzchar(Sys.getenv("GENESIS_LANG"))) Sys.setenv(GENESIS_LANG = "en") +# } From a114611d7791feb1ad307577d1f0fff67c000c66 Mon Sep 17 00:00:00 2001 From: KovaZo Date: Fri, 21 Jun 2024 19:19:00 +0200 Subject: [PATCH 13/52] Updates from Zoran regarding regionalstatistik and new functions --- DESCRIPTION | 4 +- R/access_check.R | 86 +++ R/data.R | 6 +- R/gen_alternative_terms.R | 78 +- R/gen_api.R | 46 +- R/gen_auth.R | 341 ++++++++- R/gen_catalogue.R | 318 ++++---- R/gen_find.R | 1217 +++++++++++++++--------------- R/gen_meta_data.R | 688 +++++++++-------- R/gen_modified_data.R | 191 ++--- R/gen_objects2stat.R | 268 +++---- R/gen_objects2var.R | 248 +++--- R/gen_qualitysigns.R | 34 +- R/gen_update_EVAS.R | 36 + R/gen_var2-val2.R | 306 ++++---- R/gen_zensus_api.R | 20 - R/gen_zensus_auth.R | 72 -- R/utils_dataprocessing.R | 125 ++- R/utils_httr2.R | 13 + data/EVAS_numbers.RData | Bin 0 -> 38798 bytes data/evas_list_long_20220724.rda | Bin 25322 -> 0 bytes 21 files changed, 2222 insertions(+), 1875 deletions(-) create mode 100644 R/access_check.R create mode 100644 R/gen_update_EVAS.R delete mode 100644 R/gen_zensus_api.R delete mode 100644 R/gen_zensus_auth.R create mode 100644 data/EVAS_numbers.RData delete mode 100644 data/evas_list_long_20220724.rda diff --git a/DESCRIPTION b/DESCRIPTION index d5b608e..9107b89 100644 --- a/DESCRIPTION +++ b/DESCRIPTION @@ -26,7 +26,9 @@ Imports: readr, tibble, vctrs, - usethis + usethis, + rvest, + purrr Suggests: httptest2, knitr, diff --git a/R/access_check.R b/R/access_check.R new file mode 100644 index 0000000..605a042 --- /dev/null +++ b/R/access_check.R @@ -0,0 +1,86 @@ +#' access_check: Check if you can access the database(s) +#' +#' @description Function to check if the user can access the wished database(s). Testing for Genesis and Zensus. +#' +#' @param database Character string. Indicator if the Genesis database, Zensus database, or all available databases are checked. Default option is 'all'. +#' +#' @return Character string. Information if the user can access the wished database(s). "Yes" indicates a positive result, "No" indicates a negative result. +#' @export +#' +#' @examples +#' \dontrun{ +#' # Check if you can access all databases +#' object <- access_check(database = "all") +#' object <- access_check() +#' +access_check <- function(database = c("all", "genesis", "zensus", "regio")){ + + gen_fun <- test_database_function(database) + + #----------------------------------------------------------------------------- + + if ("gen_api" %in% gen_fun){ + + par_list <- list( + endpoint = "helloworld/whoami", + username = gen_auth_get(database = "genesis")$username, + password = gen_auth_get(database = "genesis")$password + ) + + results_raw_1 <- do.call("gen_api", par_list) + + results_json_1 <- test_if_json(results_raw_1) + + results_json_1 <- test_if_okay(results_json_1) + + } + + if ("gen_zensus_api" %in% gen_fun){ + + par_list <- list( + endpoint = "helloworld/whoami", + username = gen_auth_get(database = "zensus")$username, + password = gen_auth_get(database = "zensus")$password + ) + + results_raw_2 <- do.call("gen_zensus_api", par_list) + + results_json_2 <- test_if_json(results_raw_2) + + results_json_2 <- test_if_okay(results_json_2) + + } + + if ("gen_regio_api" %in% gen_fun){ + + par_list <- list( + endpoint = "helloworld/whoami", + username = gen_auth_get(database = "regio")$username, + password = gen_auth_get(database = "regio")$password + ) + + results_raw_3 <- do.call("gen_regio_api", par_list) + + results_json_3 <- test_if_json(results_raw_3) + + results_json_3 <- test_if_okay(results_json_3) + + } + + #----------------------------------------------------------------------------- + + # Return the result + return( + paste( + if("gen_api" %in% gen_fun){ "Genesis:"}, + if("gen_api" %in% gen_fun){ results_json_1}, + + if("gen_zensus_api" %in% gen_fun){ "Zensus:"}, + if("gen_zensus_api" %in% gen_fun){ results_json_2}, + + if("gen_regio_api" %in% gen_fun){ "Regio:"}, + if("gen_regio_api" %in% gen_fun){ results_json_3} + ) + ) + +} diff --git a/R/data.R b/R/data.R index 67095ce..250d54c 100644 --- a/R/data.R +++ b/R/data.R @@ -1,7 +1,7 @@ #' List of EVAS codes #' -#' @format ## `evas_list_long_20220724` -#' A data frame with 1,097 rows and 3 columns: +#' @format ## `EVAS_numbers` +#' A data frame with 1128 rows and 3 columns: #' \describe{ #' \item{EVAS}{EVAS code} #' \item{Beschreibung}{Details on the EVAS code} @@ -9,4 +9,4 @@ #' ... #' } #' @source -"evas_list_long_20220724" +"EVAS_numbers" diff --git a/R/gen_alternative_terms.R b/R/gen_alternative_terms.R index 683979b..0666d8f 100644 --- a/R/gen_alternative_terms.R +++ b/R/gen_alternative_terms.R @@ -1,13 +1,13 @@ #' gen_alternative_terms: Call For Similiar or Spelling Related Terms for Further Search #' -#' @description Function to find search terms that are similar or related to one another in spelling and also represented in Genesis/Zensus. Important note: The API call is searching for terms with the same characters. To be useful in searching for related terms it is highly recommended to work with "*"-placeholders (see examples). The placeholder can be placed before and/or after the search term. +#' @description Function to find search terms that are similar or related to one another in spelling and also represented in Genesis/Zensus/Regionalstatistik. Important note: The API call is searching for terms with the same characters. To be useful in searching for related terms it is highly recommended to work with "*"-placeholders (see examples). The placeholder can be placed before and/or after the search term. #' #' @param term Character string. Maximum length of 15 characters. Term or word for which you are searching for alternative or related terms. Use of '*' as a placeholder is possible to generate broader search areas. #' @param similarity Logical. Indicator if the output of the function should be sorted based on a Levenshtein edit distance based on the \code{adist()} function. Default option is 'TRUE'. #' @param database Character string. Indicator if the Genesis or Zensus database is called. Only one database can be addressed per function call. Default option is 'genesis'. #' @param ... Additional parameters for the Genesis or Zensus API call. These parameters are only affecting the call itself, no further processing. For more details see `vignette("additional_parameter")`. #' -#' @return A list with all recalled elements from Genesis/Zensus. Attributes are added to the data.frame, describing the search configuration for the returned output. +#' @return A list with all recalled elements from Genesis/Zensus/Regionalstatistik. Attributes are added to the data.frame, describing the search configuration for the returned output. #' @export #' #' @examples @@ -25,7 +25,7 @@ #' gen_alternative_terms <- function(term = NULL, similarity = TRUE, - database = c("genesis", "zensus"), + database = c("all", "genesis", "zensus", "regio"), ...) { caller <- as.character(match.call()[1]) @@ -38,78 +38,72 @@ gen_alternative_terms <- function(term = NULL, #----------------------------------------------------------------------------- - if(gen_fun == "gen_api"){ + res <- lapply(gen_fun, function(db){ par_list <- list( endpoint = "catalogue/terms", - username = gen_auth_get()$username, - password = gen_auth_get()$password, + username = gen_auth_get(database = rev_database_function(db))$username, + password = gen_auth_get(database = rev_database_function(db))$password, selection = term, ... ) - } else if ( gen_fun == "gen_zensus_api"){ + results_raw <- do.call(db, par_list) - par_list <- list( - endpoint = "catalogue/terms", - username = gen_zensus_auth_get()$username, - password = gen_zensus_auth_get()$password, - selection = term, - ... - ) + results_json <- test_if_json(results_raw) - } + if (length(results_json$List) == 0) { - results_raw <- do.call(gen_fun, par_list) + stop("No related terms found for your code.", call. = FALSE) - results_json <- test_if_json(results_raw) + } else { - if (length(results_json$List) == 0) { + # similarity von Woertern berechnen und nach diesen Ordnen? + termslist <- c() - stop("No related terms found for your code.", call. = FALSE) + termslist <- lapply(results_json$List, function(x) { - } else { + append(termslist, x$Content) - # similarity von Woertern berechnen und nach diesen Ordnen? - termslist <- c() + }) - termslist <- lapply(results_json$List, function(x) { + termslist <- lapply(termslist, function(x) { - append(termslist, x$Content) + gsub("\\s+", " ", x) - }) + }) - termslist <- lapply(termslist, function(x) { + termslist <- unlist(termslist) - gsub("\\s+", " ", x) + if (isTRUE(similarity)) { - }) + # generalized levenstein edit distance + termslist <- termslist[order(utils::adist(term, + termslist, + ignore.case = TRUE))] + } else { - termslist <- unlist(termslist) + # nchar order + termslist <- termslist[order(unlist(lapply(termslist, nchar)))] - if (isTRUE(similarity)) { + } - # generalized levenstein edit distance - termslist <- termslist[order(utils::adist(term, - termslist, - ignore.case = TRUE))] - } else { + list_resp <- list("Output" = termslist) - # nchar order - termslist <- termslist[order(unlist(lapply(termslist, nchar)))] + return(list_resp) } - list_resp <- list("Output" = termslist) - attr(list_resp, "Term") <- term - attr(list_resp, "Database") <- database[1] + attr(list_resp, "Database") <- rev_database_function(db) attr(list_resp, "Language") <- results_json$Parameter$language attr(list_resp, "Pagelength") <- results_json$Parameter$pagelength attr(list_resp, "Copyright") <- results_json$Copyright - return(list_resp) + }) + + res <- check_results(res) - } + return(res) } diff --git a/R/gen_api.R b/R/gen_api.R index bdd899b..f6857cc 100644 --- a/R/gen_api.R +++ b/R/gen_api.R @@ -14,7 +14,51 @@ gen_api <- function(endpoint, ...) { httr2::request("https://www-genesis.destatis.de/genesisWS/rest/2020") %>% httr2::req_user_agent("https://github.com/CorrelAid/restatis") %>% httr2::req_url_path_append(endpoint) %>% - httr2::req_url_query(!!!gen_auth_get(), ...) %>% + httr2::req_url_query(!!!gen_auth_get(database = "genesis"), ...) %>% + httr2::req_retry(max_tries = 3) %>% + httr2::req_perform() +} + + +#' Low-level function to interact with Regionalstatistik' GENESIS API +#' +#' @param endpoint The endpoint of the API that is to be queried +#' +#' @importFrom httr2 `%>%` +#' +#' @noRd +#' +#' @examples +#' gen_regio_api("helloworld/logincheck") %>% +#' httr2::resp_body_json() +#' +gen_regio_api <- function(endpoint, ...) { + httr2::request("https://www-genesis.destatis.de/genesisWS/rest/2020/") %>% + httr2::req_user_agent("https://github.com/CorrelAid/restatis") %>% + httr2::req_url_path_append(endpoint) %>% + httr2::req_url_query(!!!gen_auth_get(database = "regio"), ...) %>% + httr2::req_retry(max_tries = 3) %>% + httr2::req_perform() +} + + +#' Low-level function to interact with the German Zensus 2022 database +#' +#' @param endpoint The endpoint of the API that is to be queried +#' +#' @importFrom httr2 `%>%` +#' +#' @noRd +#' +#' @examples +#' gen_zensus_api("helloworld/logincheck") %>% +#' httr2::resp_body_json() +#' +gen_zensus_api <- function(endpoint, ...) { + httr2::request("https://ergebnisse2011.zensus2022.de/api/rest/2020") %>% + httr2::req_user_agent("https://github.com/CorrelAid/restatis") %>% + httr2::req_url_path_append(endpoint) %>% + httr2::req_url_query(!!!gen_auth_get(database = "zensus"), ...) %>% httr2::req_retry(max_tries = 3) %>% httr2::req_perform() } diff --git a/R/gen_auth.R b/R/gen_auth.R index 50fd923..35605d8 100644 --- a/R/gen_auth.R +++ b/R/gen_auth.R @@ -1,13 +1,13 @@ -#' Save credentials for Destatis' GENESIS database +#' Save credentials databases #' #' See Details. #' -#' Genesis username and password are encrypted and saved as RDS in the +#' Username and password are encrypted and saved as RDS in the #' package config directory. #' #' A random string is generated and stored in the session environment #' variable `RESTATIS_KEY`. This string is used as the key to encrypt and -#' decrypt the entered Genesis credentials. +#' decrypt the entered credentials. #' #' To avoid having to save authentication in future sessions, `RESTATIS_KEY` can #' be added to .Renviron. The usethis package includes a helper function for @@ -15,62 +15,333 @@ #' #' @export #' -gen_auth_save <- function() { +gen_auth_save <- function(database = c("all", "genesis", "zensus", "regio")) { - username <- gen_auth_ask("username") - password <- gen_auth_ask("password") + if(database == "genesis"){ + username <- gen_auth_ask("username") + password <- gen_auth_ask("password") - auth_path <- gen_auth_path("auth.rds") + auth_path <- gen_auth_path("auth.rds") - key <- httr2::secret_make_key() + key <- httr2::secret_make_key() - Sys.setenv(RESTATIS_KEY = key) + Sys.setenv(RESTATIS_KEY = key) - message( - "Saving credentials to ", - auth_path, - "\n\n", - "Please add the following line to your .Renviron, ", - "e.g. via `usethis::edit_r_environ()`, ", - "to use the specified username and password across sessions:\n\n", - "RESTATIS_KEY=", - key, - "\n\n" - ) + message( + "Saving credentials to ", + auth_path, + "\n\n", + "Please add the following line to your .Renviron, ", + "e.g. via `usethis::edit_r_environ()`, ", + "to use the specified username and password across sessions:\n\n", + "RESTATIS_KEY=", + key, + "\n\n" + ) - dir.create(gen_auth_path(), showWarnings = FALSE, recursive = TRUE) + dir.create(gen_auth_path(), showWarnings = FALSE, recursive = TRUE) - httr2::secret_write_rds(list(username = username, password = password), - path = auth_path, - key = "RESTATIS_KEY") + httr2::secret_write_rds(list(username = username, password = password), + path = auth_path, + key = "RESTATIS_KEY") - # Logincheck - perform_logincheck(database = "genesis") + # Logincheck + perform_logincheck(database = "genesis") - } + } else if (database == "zensus"){ + + username <- gen_auth_ask("username") + password <- gen_auth_ask("password") + + auth_path <- gen_auth_path("auth_zensus.rds") + + key <- httr2::secret_make_key() + + Sys.setenv(ZENSUS_KEY = key) + + message( + "Saving Zensus database credentials to ", + auth_path, + "\n\n", + "Please add the following line to your .Renviron, ", + "e.g. via `usethis::edit_r_environ()`, ", + "to use the specified username and password across sessions:\n\n", + "ZENSUS_KEY=", + key, + "\n\n" + ) + + dir.create(gen_auth_path(), showWarnings = FALSE, recursive = TRUE) + + httr2::secret_write_rds(list(username = username, password = password), + path = auth_path, + key = "ZENSUS_KEY") + + # Logincheck + perform_logincheck(database = "zensus") + + } else if (database == "regio"){ + + username <- gen_auth_ask("username") + password <- gen_auth_ask("password") + + auth_path <- gen_auth_path("auth_regio.rds") + + key <- httr2::secret_make_key() + + Sys.setenv(REGIO_KEY = key) + + message( + "Saving Regionalstatistik database credentials to ", + auth_path, + "\n\n", + "Please add the following line to your .Renviron, ", + "e.g. via `usethis::edit_r_environ()`, ", + "to use the specified username and password across sessions:\n\n", + "REGIO_KEY=", + key, + "\n\n" + ) + + dir.create(gen_auth_path(), showWarnings = FALSE, recursive = TRUE) + + httr2::secret_write_rds(list(username = username, password = password), + path = auth_path, + key = "REGIO_KEY") + + # Logincheck + perform_logincheck(database = "regio") + + } else if (database == "all"){ + + message("Saving credentials for Genesis database") + + username <- gen_auth_ask("username") + password <- gen_auth_ask("password") + + auth_path <- gen_auth_path("auth.rds") + + key <- httr2::secret_make_key() + + Sys.setenv(RESTATIS_KEY = key) + + message( + "Saving credentials to ", + auth_path, + "\n\n", + "Please add the following line to your .Renviron, ", + "e.g. via `usethis::edit_r_environ()`, ", + "to use the specified username and password across sessions:\n\n", + "RESTATIS_KEY=", + key, + "\n\n" + ) + + dir.create(gen_auth_path(), showWarnings = FALSE, recursive = TRUE) + + httr2::secret_write_rds(list(username = username, password = password), + path = auth_path, + key = "RESTATIS_KEY") + + # Logincheck + perform_logincheck(database = "genesis") + + + message("Saving credentials for Zensus database") + + username <- gen_auth_ask("username") + password <- gen_auth_ask("password") + + auth_path <- gen_auth_path("auth_zensus.rds") + + key <- httr2::secret_make_key() + + Sys.setenv(ZENSUS_KEY = key) + + message( + "Saving Zensus database credentials to ", + auth_path, + "\n\n", + "Please add the following line to your .Renviron, ", + "e.g. via `usethis::edit_r_environ()`, ", + "to use the specified username and password across sessions:\n\n", + "ZENSUS_KEY=", + key, + "\n\n" + ) + + dir.create(gen_auth_path(), showWarnings = FALSE, recursive = TRUE) + + httr2::secret_write_rds(list(username = username, password = password), + path = auth_path, + key = "ZENSUS_KEY") + + # Logincheck + perform_logincheck(database = "zensus") + + + message("Saving credentials for Regionalstatistik database") + + username <- gen_auth_ask("username") + password <- gen_auth_ask("password") + + auth_path <- gen_auth_path("auth_regio.rds") + + key <- httr2::secret_make_key() + + Sys.setenv(REGIO_KEY = key) + + message( + "Saving Regionalstatistik database credentials to ", + auth_path, + "\n\n", + "Please add the following line to your .Renviron, ", + "e.g. via `usethis::edit_r_environ()`, ", + "to use the specified username and password across sessions:\n\n", + "REGIO_KEY=", + key, + "\n\n" + ) + + dir.create(gen_auth_path(), showWarnings = FALSE, recursive = TRUE) + + httr2::secret_write_rds(list(username = username, password = password), + path = auth_path, + key = "REGIO_KEY") + + # Logincheck + perform_logincheck(database = "regio") + + } else { + + stop("Invalid database argument. Please choose 'genesis', 'zensus', 'regio' or 'all'.") + + } +} #------------------------------------------------------------------------------- -gen_auth_get <- function() { +gen_auth_get <- function(database = c("all", "genesis", "zensus", "regio")) { - auth_path <- gen_auth_path("auth.rds") + if("genesis" %in% database && !"all" %in% database){ - if (!(file.exists(auth_path) && nzchar(Sys.getenv("RESTATIS_KEY")))) { + if(is.null(sys.call(-1))){ + message("Credentials for Genesis database") + } - stop(paste0("Genesis database credentials not found. ", - "Please run 'gen_auth_save()' to store Genesis database username and password."), - call. = FALSE) + auth_path <- gen_auth_path("auth.rds") - } + if (!(file.exists(auth_path) && nzchar(Sys.getenv("RESTATIS_KEY")))) { + + stop(paste0("Genesis database credentials not found. ", + "Please run 'gen_auth_save()' to store Genesis database username and password."), + call. = FALSE) + + } + + httr2::secret_read_rds(auth_path, "RESTATIS_KEY") + + } else if ("zensus" %in% database && !"all" %in% database){ + + if(is.null(sys.call(-1))){ + message("Credentials for Zensus database") + } + + auth_path <- gen_auth_path("auth_zensus.rds") + + if (!(file.exists(auth_path) && nzchar(Sys.getenv("ZENSUS_KEY")))) { + + stop(paste0("Zensus database credentials not found. ", + "Please run 'gen_auth_save()' to store Zensus database username and password."), + call. = FALSE) + + } + + httr2::secret_read_rds(auth_path, "ZENSUS_KEY") + + } else if ("regio" %in% database && !"all" %in% database){ + + if(is.null(sys.call(-1))){ + message("Credentials for Regionalstatistik database") + } + + auth_path <- gen_auth_path("auth_regio.rds") + + if (!(file.exists(auth_path) && nzchar(Sys.getenv("REGIO_KEY")))) { + + stop(paste0("Regionalstatistik database credentials not found. ", + "Please run 'gen_auth_save()' to store Regionalstatistik database username and password."), + call. = FALSE) + + } + + print(httr2::secret_read_rds(auth_path, "REGIO_KEY")) + + } else if ("all" %in% database){ + + if(is.null(sys.call(-1))){ + message("Credentials for Genesis database") + } - httr2::secret_read_rds(auth_path, "RESTATIS_KEY") + auth_path <- gen_auth_path("auth.rds") + if (!(file.exists(auth_path) && nzchar(Sys.getenv("RESTATIS_KEY")))) { + + stop(paste0("Genesis database credentials not found. ", + "Please run 'gen_auth_save()' to store Genesis database username and password."), + call. = FALSE) + + } + + print(httr2::secret_read_rds(auth_path, "RESTATIS_KEY")) + + + if(is.null(sys.call(-1))){ + message("Credentials for Zensus database") + } + + auth_path <- gen_auth_path("auth_zensus.rds") + + if (!(file.exists(auth_path) && nzchar(Sys.getenv("ZENSUS_KEY")))) { + + stop(paste0("Zensus database credentials not found. ", + "Please run 'gen_auth_save()' to store Zensus database username and password."), + call. = FALSE) + + } + + print(httr2::secret_read_rds(auth_path, "ZENSUS_KEY")) + + + if(is.null(sys.call(-1))){ + message("Credentials for Regionalstatistik database") + } + + auth_path <- gen_auth_path("auth_regio.rds") + + if (!(file.exists(auth_path) && nzchar(Sys.getenv("REGIO_KEY")))) { + + stop(paste0("Regionalstatistik database credentials not found. ", + "Please run 'gen_auth_save()' to store Regionalstatistik database username and password."), + call. = FALSE) + + } + + print(httr2::secret_read_rds(auth_path, "REGIO_KEY")) + + } else { + + stop("Invalid database argument. Please choose 'genesis', 'zensus', 'regio' or 'all'.") + + } } #------------------------------------------------------------------------------- gen_auth_ask <- function(credential_type) { + + val <- askpass::askpass(paste0("Please enter your ", credential_type, ": ")) if (is.null(val)) { diff --git a/R/gen_catalogue.R b/R/gen_catalogue.R index 0e63b77..03ca053 100644 --- a/R/gen_catalogue.R +++ b/R/gen_catalogue.R @@ -27,7 +27,7 @@ #' } #' gen_catalogue <- function(code = NULL, - database = c("genesis", "zensus"), + database = c("all", "genesis", "zensus", "regio"), category = c("tables", "statistics", "cubes"), area = c("all", "public", "user"), detailed = FALSE, @@ -56,272 +56,244 @@ gen_catalogue <- function(code = NULL, #----------------------------------------------------------------------------- # Processing #### - if ("cubes" %in% category && gen_fun == "gen_zensus_api") { + res <- lapply(gen_fun, function(db){ - list_of_cubes <- "No 'cubes' object available for 'zensus' database." + #--------------------------------------------------------------------------- + if ("cubes" %in% category && db == "gen_zensus_api") { - } else if ("cubes" %in% category && gen_fun == "gen_api") { + list_of_cubes <- "No 'cubes' object available for 'zensus' database." - results_raw <- do.call(gen_fun, list( - endpoint = "catalogue/cubes", - username = gen_auth_get()$username, - password = gen_auth_get()$password, - selection = code, - sortcriterion = sortcriterion, - area = area, - ... - )) + } else if ("cubes" %in% category && (db == "gen_api" | db == "gen_zensus_api")) { - results_json <- test_if_json(results_raw) - - empty_object <- test_if_error(results_json, para = error.ignore) + results_raw <- do.call(db, list( + endpoint = "catalogue/cubes", + username = gen_auth_get(database = rev_database_function(db))$username, + password = gen_auth_get(database = rev_database_function(db))$password, + selection = code, + sortcriterion = sortcriterion, + area = area, + ... + )) - if(isTRUE(empty_object)){ + results_json <- test_if_json(results_raw) - list_of_cubes <- "No 'cubes' object found for your request." + empty_object <- test_if_error(results_json, para = error.ignore) - } else if(isFALSE(empty_object)){ + if(isTRUE(empty_object)){ - list_of_cubes <- results_json$Status$Content + list_of_cubes <- "No 'cubes' object found for your request." - } else if(empty_object == "DONE"){ + } else if(isFALSE(empty_object)){ - if (isTRUE(detailed)) { + list_of_cubes <- results_json$Status$Content - list_of_cubes <- binding_lapply(results_json$List, - characteristics = c("Code", - "Content", - "Time", - "LatestUpdate", - "State", - "Information")) + } else if(empty_object == "DONE"){ - } else { + if (isTRUE(detailed)) { - list_of_cubes <- binding_lapply(results_json$List, - characteristics = c("Code", - "Content")) + list_of_cubes <- binding_lapply(results_json$List, + characteristics = c("Code", + "Content", + "Time", + "LatestUpdate", + "State", + "Information")) + } else { + list_of_cubes <- binding_lapply(results_json$List, + characteristics = c("Code", + "Content")) - } - list_of_cubes$Object_Type <- "Cube" - list_of_cubes <- tibble::as_tibble(list_of_cubes) + } - } - } + list_of_cubes$Object_Type <- "Cube" + list_of_cubes <- tibble::as_tibble(list_of_cubes) - #----------------------------------------------------------------------------- - - if ("statistics" %in% category) { - - if(gen_fun == "gen_api"){ - - par_list <- list( - endpoint = "catalogue/statistics", - username = gen_auth_get()$username, - password = gen_auth_get()$password, - selection = code, - sortcriterion = sortcriterion, - ... - ) - - } else if ( gen_fun == "gen_zensus_api"){ - - par_list <- list( - endpoint = "catalogue/statistics", - username = gen_zensus_auth_get()$username, - password = gen_zensus_auth_get()$password, - selection = code, - sortcriterion = sortcriterion, - ... - ) - + } } - results_raw <- do.call(gen_fun, par_list) + #--------------------------------------------------------------------------- + if ("statistics" %in% category) { - results_json <- test_if_json(results_raw) + par_list <- list( + endpoint = "catalogue/statistics", + username = gen_zensus_auth_get(database = rev_database_function(db))$username, + password = gen_zensus_auth_get(database = rev_database_function(db))$password, + selection = db, + sortcriterion = sortcriterion, + ... + ) - empty_object <- test_if_error(results_json, para = error.ignore) + results_raw <- do.call(db, par_list) - if(isTRUE(empty_object)){ + results_json <- test_if_json(results_raw) - list_of.stats <- "No 'statistics' object found for your request." + empty_object <- test_if_error(results_json, para = error.ignore) - } else if(isFALSE(empty_object)){ + if(isTRUE(empty_object)){ - list_of.stats <- results_json$Status$Content + list_of.stats <- "No 'statistics' object found for your request." - } else if(empty_object == "DONE"){ + } else if(isFALSE(empty_object)){ - if (isTRUE(detailed)) { + list_of.stats <- results_json$Status$Content - list_of.stats <- binding_lapply(results_json$List, - characteristics = c("Code", - "Content", - "Cubes", - "Information")) + } else if(empty_object == "DONE"){ + if (isTRUE(detailed)) { - } else { + list_of.stats <- binding_lapply(results_json$List, + characteristics = c("Code", + "Content", + "Cubes", + "Information")) - list_of.stats <- binding_lapply(results_json$List, - characteristics = c("Code", - "Content")) + } else { + list_of.stats <- binding_lapply(results_json$List, + characteristics = c("Code", + "Content")) - } - - list_of.stats$Object_Type <- "Statistic" - - list_of.stats <- tibble::as_tibble(list_of.stats) - } - } + } + list_of.stats$Object_Type <- "Statistic" - #----------------------------------------------------------------------------- + list_of.stats <- tibble::as_tibble(list_of.stats) - if ("tables" %in% category) { + } + } - if(gen_fun == "gen_api"){ + #--------------------------------------------------------------------------- + if ("tables" %in% category) { par_list <- list( - endpoint = "catalogue/tables", - username = gen_auth_get()$username, - password = gen_auth_get()$password, - selection = code, - area = area, - sortcriterion = sortcriterion, - ... - ) + endpoint = "catalogue/tables", + username = gen_auth_get(database = rev_database_function(db))$username, + password = gen_auth_get(database = rev_database_function(db))$password, + selection = code, + area = area, + sortcriterion = sortcriterion, + ... + ) - } else if (gen_fun == "gen_zensus_api"){ + results_raw <- do.call(db, par_list) - par_list <- list( - endpoint = "catalogue/tables", - username = gen_zensus_auth_get()$username, - password = gen_zensus_auth_get()$password, - selection = code, - area = area, - sortcriterion = sortcriterion, - ... - ) + results_json <- test_if_json(results_raw) - } + empty_object <- test_if_error(results_json, para = error.ignore) - results_raw <- do.call(gen_fun, par_list) + if(isTRUE(empty_object)){ - results_json <- test_if_json(results_raw) + list_of.tabs <- "No 'tables' object found for your request." - empty_object <- test_if_error(results_json, para = error.ignore) + } else if(isFALSE(empty_object)){ - if(isTRUE(empty_object)){ + list_of.tabs <- results_json$Status$Content - list_of.tabs <- "No 'tables' object found for your request." + } else if(empty_object == "DONE"){ - } else if(isFALSE(empty_object)){ + if (isTRUE(detailed)) { - list_of.tabs <- results_json$Status$Content + list_of.tabs <- binding_lapply(results_json$List, + characteristics = c("Code", + "Content", + "Time")) - } else if(empty_object == "DONE"){ - if (isTRUE(detailed)) { - list_of.tabs <- binding_lapply(results_json$List, - characteristics = c("Code", - "Content", - "Time")) + } else { + list_of.tabs <- binding_lapply(results_json$List, + characteristics = c("Code", + "Content")) - } else { + } - list_of.tabs <- binding_lapply(results_json$List, - characteristics = c("Code", - "Content")) + list_of.tabs$Object_Type <- "Table" + list_of.tabs <- tibble::as_tibble(list_of.tabs) + } } - list_of.tabs$Object_Type <- "Table" + #--------------------------------------------------------------------------- + # Summary #### + if (all(c("tables", "statistics", "cubes") %in% category)) { - list_of.tabs <- tibble::as_tibble(list_of.tabs) + list_resp <- list( + "Cubes" = if(length(list_of_cubes) == 1 | db == "gen_zensus_api"){tibble::as_tibble(list_of_cubes)} else {forming_evas(list_of_cubes)}, + "Statistics" = if(length(list_of.stats) == 1 | db == "gen_zensus_api"){tibble::as_tibble(list_of.stats)} else {forming_evas(list_of.stats)}, + "Tables" = if(length(list_of.tabs) == 1 | db == "gen_zensus_api"){tibble::as_tibble(list_of.tabs)} else {forming_evas(list_of.tabs)} + ) - } - } + } else if ("cubes" %in% category) { + if(length(list_of_cubes) == 1 && db == "gen_zensus_api"){ - #----------------------------------------------------------------------------- + list_resp <- list_of_cubes - # Summary #### - if (all(c("tables", "statistics", "cubes") %in% category)) { + } else if (length(list_of_cubes) == 1 | db == "gen_zensus_api"){ - list_resp <- list( - "Cubes" = if(length(list_of_cubes) == 1 | gen_fun == "gen_zensus_api"){tibble::as_tibble(list_of_cubes)} else {forming_evas(list_of_cubes)}, - "Statistics" = if(length(list_of.stats) == 1 | gen_fun == "gen_zensus_api"){tibble::as_tibble(list_of.stats)} else {forming_evas(list_of.stats)}, - "Tables" = if(length(list_of.tabs) == 1 | gen_fun == "gen_zensus_api"){tibble::as_tibble(list_of.tabs)} else {forming_evas(list_of.tabs)} - ) + list_resp <- list("Cubes" = tibble::as_tibble(list_of_cubes)) - } else if ("cubes" %in% category) { + } else { - if(length(list_of_cubes) == 1 && gen_fun == "gen_zensus_api"){ + list_resp <- list("Cubes" = forming_evas(list_of_cubes)) - list_resp <- list_of_cubes + } - } else if (length(list_of_cubes) == 1 | gen_fun == "gen_zensus_api"){ + } else if ("statistics" %in% category) { - list_resp <- list("Cubes" = tibble::as_tibble(list_of_cubes)) + if(length(list_of.stats) == 1 | db == "gen_zensus_api"){ - } else { - - list_resp <- list("Cubes" = forming_evas(list_of_cubes)) + list_resp <- list("Statistics" = tibble::as_tibble(list_of.stats)) - } + } else { - } else if ("statistics" %in% category) { + list_resp <- list("Statistics" = forming_evas(list_of.stats)) - if(length(list_of.stats) == 1 | gen_fun == "gen_zensus_api"){ + } - list_resp <- list("Statistics" = tibble::as_tibble(list_of.stats)) + } else if ("tables" %in% category) { - } else { + if(length(list_of.tabs) == 1 | db == "gen_zensus_api"){ - list_resp <- list("Statistics" = forming_evas(list_of.stats)) + list_resp <- list("Tables" = tibble::as_tibble(list_of.tabs)) - } + } else { - } else if ("tables" %in% category) { + list_resp <- list("Tables" = forming_evas(list_of.tabs)) - if(length(list_of.tabs) == 1 | gen_fun == "gen_zensus_api"){ + } - list_resp <- list("Tables" = tibble::as_tibble(list_of.tabs)) + } + attr(list_resp, "Code") <- code + attr(list_resp, "Database") <- rev_database_function(db) + attr(list_resp, "Category") <- category + if(length(category) == 1 && "cubes" %in% category && db == "gen_zensus_api"){ + attr(list_resp, "Info") <- "NO API call done" } else { - - list_resp <- list("Tables" = forming_evas(list_of.tabs)) - + attr(list_resp, "Language") <- results_json$Parameter$language + attr(list_resp, "Pagelength") <- results_json$Parameter$pagelength + attr(list_resp, "Copyright") <- results_json$Copyright } - } + return(list_resp) + }) + + #----------------------------------------------------------------------------- - attr(list_resp, "Code") <- code - attr(list_resp, "Database") <- database[1] - attr(list_resp, "Category") <- category - if(length(category) == 1 && "cubes" %in% category && gen_fun == "gen_zensus_api"){ - attr(list_resp, "Info") <- "NO API call done" - } else { - attr(list_resp, "Language") <- results_json$Parameter$language - attr(list_resp, "Pagelength") <- results_json$Parameter$pagelength - attr(list_resp, "Copyright") <- results_json$Copyright - } + res <- check_results(res) - return(list_resp) + return(res) } diff --git a/R/gen_find.R b/R/gen_find.R index 476b62f..0ce35fc 100644 --- a/R/gen_find.R +++ b/R/gen_find.R @@ -31,7 +31,7 @@ #' } #' gen_find <- function(term = NULL, - database = c("genesis", "zensus"), + database = c("all", "genesis", "zensus", "regio"), category = c("all", "tables", "statistics", "variables", "cubes"), detailed = FALSE, ordering = TRUE, @@ -54,849 +54,844 @@ gen_find <- function(term = NULL, #----------------------------------------------------------------------------- - if(gen_fun == "gen_zensus_api" & category == "cubes"){ + res <- lapply(gen_fun, function(db){ - empty_object <- TRUE - - } else { + #--------------------------------------------------------------------------- + if(db == "gen_zensus_api" & category == "cubes"){ - if(gen_fun == "gen_api"){ + empty_object <- TRUE - par_list <- list( - endpoint = "find/find", - username = gen_auth_get()$username, - password = gen_auth_get()$password, - term = term, - category = category, - ... - ) - - } else if (gen_fun == "gen_zensus_api"){ + } else { par_list <- list( - endpoint = "find/find", - username = gen_zensus_auth_get()$username, - password = gen_zensus_auth_get()$password, - term = term, - category = category, - ... + endpoint = "find/find", + username = gen_auth_get(database = rev_database_function(db))$username, + password = gen_auth_get(database = rev_database_function(db))$password, + term = term, + category = category, + ... ) - } + results_raw <- do.call(db, par_list) - results_raw <- do.call(gen_fun, par_list) + results_json <- test_if_json(results_raw) - results_json <- test_if_json(results_raw) + empty_object <- test_if_error_find(results_json, para = error.ignore) - empty_object <- test_if_error_find(results_json, para = error.ignore) + empty_object <- test_if_process_further(results_json, para = error.ignore) - empty_object <- test_if_process_further(results_json, para = error.ignore) - - } - - #----------------------------------------------------------------------------- - - if(isTRUE(empty_object) & gen_fun == "gen_api"){ + } - list_resp <- list("Output" = "No object found for your request.") + #--------------------------------------------------------------------------- + if(isTRUE(empty_object) && (db == "gen_api" || db == "gen_regio_api")){ - attr(list_resp, "Term") <- results_json$Parameter$term - attr(list_resp, "Database") <- database[1] - attr(list_resp, "Language") <- results_json$Parameter$language - attr(list_resp, "Pagelength") <- results_json$Parameter$pagelength - attr(list_resp, "Copyright") <- results_json$Copyright + list_resp <- list("Output" = "No object found for your request.") - return(list_resp) + attr(list_resp, "Term") <- results_json$Parameter$term + attr(list_resp, "Database") <- database[1] + attr(list_resp, "Language") <- results_json$Parameter$language + attr(list_resp, "Pagelength") <- results_json$Parameter$pagelength + attr(list_resp, "Copyright") <- results_json$Copyright - } else if(isTRUE(empty_object) & gen_fun == "gen_zensus_api" ){ + return(list_resp) - list_resp <- list("Output" = "No cubes at all avalaible in 'zensus'-database.") + } else if(isTRUE(empty_object) & db == "gen_zensus_api" ){ - attr(list_resp, "Term") <- term - attr(list_resp, "Database") <- database[1] - attr(list_resp, "Category") <- category + list_resp <- list("Output" = "No cubes at all avalaible in 'zensus'-database.") - return(list_resp) + attr(list_resp, "Term") <- term + attr(list_resp, "Database") <- database[1] + attr(list_resp, "Category") <- category - } - else if (isFALSE(empty_object)){ + return(list_resp) - list_resp <- list("Output" = results_json$Status$Content) + } + else if (isFALSE(empty_object)){ - attr(list_resp, "Term") <- results_json$Parameter$term - attr(list_resp, "Database") <- database[1] - attr(list_resp, "Language") <- results_json$Parameter$language - attr(list_resp, "Pagelength") <- results_json$Parameter$pagelength - attr(list_resp, "Copyright") <- results_json$Copyright + list_resp <- list("Output" = results_json$Status$Content) - return(list_resp) + attr(list_resp, "Term") <- results_json$Parameter$term + attr(list_resp, "Database") <- database[1] + attr(list_resp, "Language") <- results_json$Parameter$language + attr(list_resp, "Pagelength") <- results_json$Parameter$pagelength + attr(list_resp, "Copyright") <- results_json$Copyright - } else if (empty_object == "DONE") { + return(list_resp) - if (detailed == TRUE) { + } else if (empty_object == "DONE") { - #----------------------------------------------------------------------------- + if (detailed == TRUE) { - if (category == "all") { + #----------------------------------------------------------------------------- - df_table <- binding_lapply(results_json$Tables, - characteristics = c("Code", - "Content", - "Time")) + if (category == "all") { - df_table$Spezifisch <- ggsub(df_table) + df_table <- binding_lapply(results_json$Tables, + characteristics = c("Code", + "Content", + "Time")) - df_table$Variablen <- spezifisch_create(df_table) + df_table$Spezifisch <- ggsub(df_table) - df_table$Object_Type <- "Table" + df_table$Variablen <- spezifisch_create(df_table) - #------------------------------------------------------------------------- + df_table$Object_Type <- "Table" - df_stats <- binding_lapply(results_json$Statistics, - characteristics = c("Code", - "Content", - "Information", - "Cubes")) + #------------------------------------------------------------------------- - df_stats$Spezifisch <- ggsub(df_stats) + df_stats <- binding_lapply(results_json$Statistics, + characteristics = c("Code", + "Content", + "Information", + "Cubes")) + + df_stats$Spezifisch <- ggsub(df_stats) + + df_stats$Variablen <- spezifisch_create(df_stats) - df_stats$Variablen <- spezifisch_create(df_stats) + df_stats$Object_Type <- "Statistic" + + #------------------------------------------------------------------------- + + df_variables <- binding_lapply(results_json$Variables, + characteristics = c("Code", + "Content", + "Type", + "Values", + "Information")) + + df_variables$Spezifisch <- ggsub(df_variables) + + df_variables$Variablen <- spezifisch_create(df_variables) + + df_variables$Object_Type <- "Variable" + + #------------------------------------------------------------------------- + + if(db == "gen_api" | db == "gen_regio_api"){ + df_cubes <- binding_lapply(results_json$Cubes, + characteristics = c("Code", + "Content", + "Time", + "LatestUpdate", + "State", + "Information")) + + df_cubes$Spezifisch <- ggsub(df_cubes) + + df_cubes$Variablen <- spezifisch_create(df_cubes) + + df_cubes$Object_Type <- "Cube" + } + + #------------------------------------------------------------------------- + + if (nrow(df_table) != 0) { + df_table$Titel <- titel_search(df_table, term) + } + + if (nrow(df_stats) != 0) { + df_stats$Titel <- titel_search(df_stats, term) + } + + if (nrow(df_variables) != 0) { + df_variables$Titel <- titel_search(df_variables, term) + } + + if(db == "gen_api" | db == "gen_regio_api"){ + if (nrow(df_cubes) != 0) { + df_cubes$Titel <- titel_search(df_cubes, term) + } + } + + #------------------------------------------------------------------------- + + if(isTRUE(ordering)) { + + df_table <- df_table[with(df_table, order(-Titel, -Variablen)), c("Code", + "Content", + "Titel", + "Time", + "Variablen", + "Spezifisch", + "Object_Type")] + + df_stats <- df_stats[with(df_stats, order(-Titel, -Variablen)), c( "Code", + "Content", + "Titel", + "Information", + "Cubes", + "Variablen", + "Spezifisch", + "Object_Type")] + + df_variables <- df_variables[with(df_variables, order(-Titel, -Variablen)), c( "Code", + "Content", + "Titel", + "Values", + "Information", + "Variablen", + "Spezifisch", + "Object_Type")] + + if(db == "gen_api" | db == "gen_regio_api"){ + df_cubes <- df_cubes[with(df_cubes, order(-Titel, -Variablen)), c( "Code", + "Content", + "Titel", + "Time", + "LatestUpdate", + "State", + "Information", + "Variablen", + "Spezifisch", + "Object_Type")] + } + + } else { + + df_table <- df_table[, c("Code", + "Content", + "Titel", + "Time", + "Variablen", + "Spezifisch", + "Object_Type")] + + df_stats <- df_stats[, c("Code", + "Content", + "Titel", + "Information", + "Cubes", + "Variablen", + "Spezifisch", + "Object_Type")] + + df_variables <- df_variables[, c("Code", + "Content", + "Titel", + "Values", + "Information", + "Variablen", + "Spezifisch", + "Object_Type")] + + if(db == "gen_api" | db == "gen_regio_api"){ + df_cubes <- df_cubes[, c("Code", + "Content", + "Titel", + "Time", + "LatestUpdate", + "State", + "Information", + "Variablen", + "Spezifisch", + "Object_Type")] + } + + } + + #------------------------------------------------------------------------- + + list_resp <- list("Tables" = tibble::as_tibble(df_table), + "Statistics" = tibble::as_tibble(df_stats), + "Variables" = tibble::as_tibble(df_variables), + "Cubes" = if(db == "gen_api" | db == "gen_regio_api"){tibble::as_tibble(df_cubes)} else {"No cubes at all avalaible in 'zensus'-database."}) + + attr(list_resp, "Term") <- results_json$Parameter$term + attr(list_resp, "Database") <- database[1] + attr(list_resp, "Language") <- results_json$Parameter$language + attr(list_resp, "Pagelength") <- results_json$Parameter$pagelength + attr(list_resp, "Copyright") <- results_json$Copyright + + return(list_resp) - df_stats$Object_Type <- "Statistic" + } - #------------------------------------------------------------------------- + if (category == "tables") { - df_variables <- binding_lapply(results_json$Variables, + df_table <- binding_lapply(results_json$Tables, characteristics = c("Code", "Content", - "Type", - "Values", - "Information")) + "Time")) - df_variables$Spezifisch <- ggsub(df_variables) + df_table$Spezifisch <- ggsub(df_table) - df_variables$Variablen <- spezifisch_create(df_variables) + df_table$Variablen <- spezifisch_create(df_table) - df_variables$Object_Type <- "Variable" + df_table$Object_Type <- "Table" - #------------------------------------------------------------------------- + #------------------------------------------------------------------------- - if(gen_fun == "gen_api"){ - df_cubes <- binding_lapply(results_json$Cubes, - characteristics = c("Code", - "Content", - "Time", - "LatestUpdate", - "State", - "Information")) + if (nrow(df_table) != 0) { + df_table$Titel <- titel_search(df_table, term) + } - df_cubes$Spezifisch <- ggsub(df_cubes) + if (isTRUE(ordering)) { - df_cubes$Variablen <- spezifisch_create(df_cubes) + df_table <- df_table[with(df_table, order(-Titel, -Variablen)), c("Code", + "Content", + "Titel", + "Time", + "Variablen", + "Spezifisch", + "Object_Type")] - df_cubes$Object_Type <- "Cube" - } + } else { - #------------------------------------------------------------------------- + df_table <- df_table[, c("Code", + "Content", + "Titel", + "Time", + "Variablen", + "Spezifisch", + "Object_Type")] + } - if (nrow(df_table) != 0) { - df_table$Titel <- titel_search(df_table, term) - } + #------------------------------------------------------------------------- - if (nrow(df_stats) != 0) { - df_stats$Titel <- titel_search(df_stats, term) - } + list_resp <- list("Tables" = tibble::as_tibble(df_table)) - if (nrow(df_variables) != 0) { - df_variables$Titel <- titel_search(df_variables, term) - } + attr(list_resp, "Term") <- results_json$Parameter$term + attr(list_resp, "Database") <- database[1] + attr(list_resp, "Language") <- results_json$Parameter$language + attr(list_resp, "Pagelength") <- results_json$Parameter$pagelength + attr(list_resp, "Copyright") <- results_json$Copyright - if(gen_fun == "gen_api"){ - if (nrow(df_cubes) != 0) { - df_cubes$Titel <- titel_search(df_cubes, term) - } - } + return(list_resp) - #------------------------------------------------------------------------- - - if(isTRUE(ordering)) { - - df_table <- df_table[with(df_table, order(-Titel, -Variablen)), c("Code", - "Content", - "Titel", - "Time", - "Variablen", - "Spezifisch", - "Object_Type")] - - df_stats <- df_stats[with(df_stats, order(-Titel, -Variablen)), c( "Code", - "Content", - "Titel", - "Information", - "Cubes", - "Variablen", - "Spezifisch", - "Object_Type")] - - df_variables <- df_variables[with(df_variables, order(-Titel, -Variablen)), c( "Code", - "Content", - "Titel", - "Values", - "Information", - "Variablen", - "Spezifisch", - "Object_Type")] - - if(gen_fun == "gen_api"){ - df_cubes <- df_cubes[with(df_cubes, order(-Titel, -Variablen)), c( "Code", - "Content", - "Titel", - "Time", - "LatestUpdate", - "State", - "Information", - "Variablen", - "Spezifisch", - "Object_Type")] } - } else { + #--------------------------------------------------------------------------- - df_table <- df_table[, c("Code", - "Content", - "Titel", - "Time", - "Variablen", - "Spezifisch", - "Object_Type")] - - df_stats <- df_stats[, c("Code", - "Content", - "Titel", - "Information", - "Cubes", - "Variablen", - "Spezifisch", - "Object_Type")] - - df_variables <- df_variables[, c("Code", - "Content", - "Titel", - "Values", - "Information", - "Variablen", - "Spezifisch", - "Object_Type")] - - if(gen_fun == "gen_api"){ - df_cubes <- df_cubes[, c("Code", - "Content", - "Titel", - "Time", - "LatestUpdate", - "State", - "Information", - "Variablen", - "Spezifisch", - "Object_Type")] - } + if (category == "statistics") { - } + df_stats <- binding_lapply(results_json$Statistics, + characteristics = c("Code", + "Content", + "Information", + "Cubes")) - #------------------------------------------------------------------------- + df_stats$Spezifisch <- ggsub(df_stats) - list_resp <- list("Tables" = tibble::as_tibble(df_table), - "Statistics" = tibble::as_tibble(df_stats), - "Variables" = tibble::as_tibble(df_variables), - "Cubes" = if(gen_fun == "gen_api"){tibble::as_tibble(df_cubes)} else {"No cubes at all avalaible in 'zensus'-database."}) + df_stats$Variablen <- spezifisch_create(df_stats) - attr(list_resp, "Term") <- results_json$Parameter$term - attr(list_resp, "Database") <- database[1] - attr(list_resp, "Language") <- results_json$Parameter$language - attr(list_resp, "Pagelength") <- results_json$Parameter$pagelength - attr(list_resp, "Copyright") <- results_json$Copyright + df_stats$Object_Type <- "Statistic" - return(list_resp) + #------------------------------------------------------------------------- - } + if (nrow(df_stats) != 0) { + df_stats$Titel <- titel_search(df_stats, term) + } - if (category == "tables") { + if(isTRUE(ordering)) { - df_table <- binding_lapply(results_json$Tables, - characteristics = c("Code", - "Content", - "Time")) + df_stats <- df_stats[with(df_stats, order(-Titel, -Variablen)), c( "Code", + "Content", + "Titel", + "Information", + "Cubes", + "Variablen", + "Spezifisch", + "Object_Type")] - df_table$Spezifisch <- ggsub(df_table) + } else { - df_table$Variablen <- spezifisch_create(df_table) + df_stats <- df_stats[, c("Code", + "Content", + "Titel", + "Information", + "Cubes", + "Variablen", + "Spezifisch", + "Object_Type")] - df_table$Object_Type <- "Table" + } - #------------------------------------------------------------------------- + list_resp <- list("Statistics" = tibble::as_tibble(df_stats)) - if (nrow(df_table) != 0) { - df_table$Titel <- titel_search(df_table, term) - } + attr(list_resp, "Term") <- results_json$Parameter$term + attr(list_resp, "Database") <- database[1] + attr(list_resp, "Language") <- results_json$Parameter$language + attr(list_resp, "Pagelength") <- results_json$Parameter$pagelength + attr(list_resp, "Copyright") <- results_json$Copyright - if (isTRUE(ordering)) { + return(list_resp) - df_table <- df_table[with(df_table, order(-Titel, -Variablen)), c("Code", - "Content", - "Titel", - "Time", - "Variablen", - "Spezifisch", - "Object_Type")] + } - } else { + #--------------------------------------------------------------------------- - df_table <- df_table[, c("Code", - "Content", - "Titel", - "Time", - "Variablen", - "Spezifisch", - "Object_Type")] - } + if (category == "variables") { - #------------------------------------------------------------------------- + df_variables <- binding_lapply(results_json$Variables, + characteristics = c("Code", + "Content", + "Type", + "Values", + "Information")) - list_resp <- list("Tables" = tibble::as_tibble(df_table)) + df_variables$Spezifisch <- ggsub(df_variables) - attr(list_resp, "Term") <- results_json$Parameter$term - attr(list_resp, "Database") <- database[1] - attr(list_resp, "Language") <- results_json$Parameter$language - attr(list_resp, "Pagelength") <- results_json$Parameter$pagelength - attr(list_resp, "Copyright") <- results_json$Copyright + df_variables$Variablen <- spezifisch_create(df_variables) - return(list_resp) + df_variables$Object_Type <- "Variable" - } + #------------------------------------------------------------------------- - #--------------------------------------------------------------------------- + if (nrow(df_variables) != 0) { + df_variables$Titel <- titel_search(df_variables, term) + } - if (category == "statistics") { + if(isTRUE(ordering)) { - df_stats <- binding_lapply(results_json$Statistics, - characteristics = c("Code", - "Content", - "Information", - "Cubes")) + df_variables <- df_variables[with(df_variables, order(-Titel, -Variablen)), c( "Code", + "Content", + "Titel", + "Values", + "Information", + "Variablen", + "Spezifisch", + "Object_Type")] - df_stats$Spezifisch <- ggsub(df_stats) + } else { - df_stats$Variablen <- spezifisch_create(df_stats) + df_variables <- df_variables[, c("Code", + "Content", + "Titel", + "Values", + "Information", + "Variablen", + "Spezifisch", + "Object_Type")] - df_stats$Object_Type <- "Statistic" + } - #------------------------------------------------------------------------- + #------------------------------------------------------------------------- - if (nrow(df_stats) != 0) { - df_stats$Titel <- titel_search(df_stats, term) - } + list_resp <- list("Variables" = tibble::as_tibble(df_variables)) - if(isTRUE(ordering)) { + attr(list_resp, "Term") <- results_json$Parameter$term + attr(list_resp, "Database") <- database[1] + attr(list_resp, "Language") <- results_json$Parameter$language + attr(list_resp, "Pagelength") <- results_json$Parameter$pagelength + attr(list_resp, "Copyright") <- results_json$Copyright - df_stats <- df_stats[with(df_stats, order(-Titel, -Variablen)), c( "Code", - "Content", - "Titel", - "Information", - "Cubes", - "Variablen", - "Spezifisch", - "Object_Type")] + return(list_resp) + } - } else { + #--------------------------------------------------------------------------- - df_stats <- df_stats[, c("Code", - "Content", - "Titel", - "Information", - "Cubes", - "Variablen", - "Spezifisch", - "Object_Type")] + if (category == "cubes") { - } + if(db == "gen_api" | db == "gen_regio_api"){ - list_resp <- list("Statistics" = tibble::as_tibble(df_stats)) + df_cubes <- binding_lapply(results_json$Cubes, + characteristics = c("Code", + "Content", + "Time", + "LatestUpdate", + "State", + "Information")) - attr(list_resp, "Term") <- results_json$Parameter$term - attr(list_resp, "Database") <- database[1] - attr(list_resp, "Language") <- results_json$Parameter$language - attr(list_resp, "Pagelength") <- results_json$Parameter$pagelength - attr(list_resp, "Copyright") <- results_json$Copyright + df_cubes$Spezifisch <- ggsub(df_cubes) - return(list_resp) + df_cubes$Variablen <- spezifisch_create(df_cubes) - } + df_cubes$Object_Type <- "Cube" - #--------------------------------------------------------------------------- + #------------------------------------------------------------------------- - if (category == "variables") { + if (nrow(df_cubes) != 0) { + df_cubes$Titel <- titel_search(df_cubes, term) + } - df_variables <- binding_lapply(results_json$Variables, - characteristics = c("Code", - "Content", - "Type", - "Values", - "Information")) + if(isTRUE(ordering)) { - df_variables$Spezifisch <- ggsub(df_variables) + df_cubes <- df_cubes[with(df_cubes, order(-Titel, -Variablen)), c( "Code", + "Content", + "Titel", + "Time", + "LatestUpdate", + "State", + "Information", + "Variablen", + "Spezifisch", + "Object_Type")] - df_variables$Variablen <- spezifisch_create(df_variables) + } else { - df_variables$Object_Type <- "Variable" + df_cubes <- df_cubes[, c("Code", + "Content", + "Titel", + "Time", + "LatestUpdate", + "State", + "Information", + "Variablen", + "Spezifisch", + "Object_Type")] - #------------------------------------------------------------------------- + } - if (nrow(df_variables) != 0) { - df_variables$Titel <- titel_search(df_variables, term) - } + #------------------------------------------------------------------------- - if(isTRUE(ordering)) { + list_resp <- list("Cubes" = tibble::as_tibble(df_cubes)) - df_variables <- df_variables[with(df_variables, order(-Titel, -Variablen)), c( "Code", - "Content", - "Titel", - "Values", - "Information", - "Variablen", - "Spezifisch", - "Object_Type")] + attr(list_resp, "Term") <- results_json$Parameter$term + attr(list_resp, "Database") <- database[1] + attr(list_resp, "Language") <- results_json$Parameter$language + attr(list_resp, "Pagelength") <- results_json$Parameter$pagelength + attr(list_resp, "Copyright") <- results_json$Copyright - } else { + return(list_resp) + } else { - df_variables <- df_variables[, c("Code", - "Content", - "Titel", - "Values", - "Information", - "Variablen", - "Spezifisch", - "Object_Type")] + list_resp <- "No cubes at all avalaible in 'zensus'-database." + } + } } - #------------------------------------------------------------------------- + #----------------------------------------------------------------------------- - list_resp <- list("Variables" = tibble::as_tibble(df_variables)) + if (detailed == FALSE) { - attr(list_resp, "Term") <- results_json$Parameter$term - attr(list_resp, "Database") <- database[1] - attr(list_resp, "Language") <- results_json$Parameter$language - attr(list_resp, "Pagelength") <- results_json$Parameter$pagelength - attr(list_resp, "Copyright") <- results_json$Copyright + if (category == "all") { - return(list_resp) - } + #------------------------------------------------------------------------- - #--------------------------------------------------------------------------- + df_table <- binding_lapply(results_json$Tables, + characteristics = c("Code", + "Content")) - if (category == "cubes") { + df_table$Spezifisch <- ggsub(df_table) - if(gen_fun == "gen_api"){ + df_table$Variablen <- spezifisch_create(df_table) - df_cubes <- binding_lapply(results_json$Cubes, - characteristics = c("Code", - "Content", - "Time", - "LatestUpdate", - "State", - "Information")) + df_table$Object_Type <- "Table" - df_cubes$Spezifisch <- ggsub(df_cubes) + #------------------------------------------------------------------------- - df_cubes$Variablen <- spezifisch_create(df_cubes) + df_stats <- binding_lapply(results_json$Statistics, + characteristics = c("Code", + "Content")) - df_cubes$Object_Type <- "Cube" + df_stats$Spezifisch <- ggsub(df_stats) - #------------------------------------------------------------------------- + df_stats$Variablen <- spezifisch_create(df_stats) - if (nrow(df_cubes) != 0) { - df_cubes$Titel <- titel_search(df_cubes, term) - } + df_stats$Object_Type <- "Statistic" - if(isTRUE(ordering)) { + #------------------------------------------------------------------------- - df_cubes <- df_cubes[with(df_cubes, order(-Titel, -Variablen)), c( "Code", - "Content", - "Titel", - "Time", - "LatestUpdate", - "State", - "Information", - "Variablen", - "Spezifisch", - "Object_Type")] + df_variables <- binding_lapply(results_json$Variables, + characteristics = c("Code", + "Content")) - } else { + df_variables$Spezifisch <- ggsub(df_variables) - df_cubes <- df_cubes[, c("Code", - "Content", - "Titel", - "Time", - "LatestUpdate", - "State", - "Information", - "Variablen", - "Spezifisch", - "Object_Type")] + df_variables$Variablen <- spezifisch_create(df_variables) - } + df_variables$Object_Type <- "Variable" - #------------------------------------------------------------------------- + #------------------------------------------------------------------------- - list_resp <- list("Cubes" = tibble::as_tibble(df_cubes)) + if(db == "gen_api" | db == "gen_regio_api"){ + df_cubes <- binding_lapply(results_json$Cubes, + characteristics = c("Code", + "Content")) - attr(list_resp, "Term") <- results_json$Parameter$term - attr(list_resp, "Database") <- database[1] - attr(list_resp, "Language") <- results_json$Parameter$language - attr(list_resp, "Pagelength") <- results_json$Parameter$pagelength - attr(list_resp, "Copyright") <- results_json$Copyright + df_cubes$Spezifisch <- ggsub(df_cubes) - return(list_resp) - } else { + df_cubes$Variablen <- spezifisch_create(df_cubes) - list_resp <- "No cubes at all avalaible in 'zensus'-database." + df_cubes$Object_Type <- "Cube" - } - } - } + } - #----------------------------------------------------------------------------- + #------------------------------------------------------------------------- - if (detailed == FALSE) { + if (nrow(df_table) != 0) { + df_table$Titel <- titel_search(df_table, term) + } - if (category == "all") { + if (nrow(df_stats) != 0) { + df_stats$Titel <- titel_search(df_stats, term) + } - #------------------------------------------------------------------------- + if (nrow(df_variables) != 0) { + df_variables$Titel <- titel_search(df_variables, term) + } - df_table <- binding_lapply(results_json$Tables, - characteristics = c("Code", - "Content")) + if(db == "gen_api" | db == "gen_regio_api"){ + if (nrow(df_cubes) != 0) { + df_cubes$Titel <- titel_search(df_cubes, term) + } + } - df_table$Spezifisch <- ggsub(df_table) + #------------------------------------------------------------------------- - df_table$Variablen <- spezifisch_create(df_table) + if(isTRUE(ordering)) { - df_table$Object_Type <- "Table" + df_table <- df_table[with(df_table, order(-Titel, -Variablen)), c("Code", + "Content", + "Object_Type")] - #------------------------------------------------------------------------- + df_stats <- df_stats[with(df_stats, order(-Titel, -Variablen)), c( "Code", + "Content", + "Object_Type")] - df_stats <- binding_lapply(results_json$Statistics, - characteristics = c("Code", - "Content")) + df_variables <- df_variables[with(df_variables, order(-Titel, -Variablen)), c( "Code", + "Content", + "Object_Type")] - df_stats$Spezifisch <- ggsub(df_stats) + if(db == "gen_api" | db == "gen_regio_api"){ + df_cubes <- df_cubes[with(df_cubes, order(-Titel, -Variablen)), c( "Code", + "Content", + "Object_Type")] + } + } else { - df_stats$Variablen <- spezifisch_create(df_stats) + df_table <- df_table[, c("Code", + "Content", + "Object_Type")] - df_stats$Object_Type <- "Statistic" + df_stats <- df_stats[, c("Code", + "Content", + "Object_Type")] - #------------------------------------------------------------------------- + df_variables <- df_variables[, c("Code", + "Content", + "Object_Type")] - df_variables <- binding_lapply(results_json$Variables, - characteristics = c("Code", - "Content")) + if(db == "gen_api" | db == "gen_regio_api"){ + df_cubes <- df_cubes[, c("Code", + "Content", + "Object_Type")] + } - df_variables$Spezifisch <- ggsub(df_variables) + } - df_variables$Variablen <- spezifisch_create(df_variables) + #------------------------------------------------------------------------- - df_variables$Object_Type <- "Variable" + list_resp <- list("Tables" = tibble::as_tibble(df_table), + "Statistics" = tibble::as_tibble(df_stats), + "Variables" = tibble::as_tibble(df_variables), + "Cubes" = if(db == "gen_api" | db == "gen_regio_api"){tibble::as_tibble(df_cubes)} else {"No cubes at all avalaible in 'zensus'-database."}) - #------------------------------------------------------------------------- + attr(list_resp, "Term") <- results_json$Parameter$term + attr(list_resp, "Database") <- database[1] + attr(list_resp, "Language") <- results_json$Parameter$language + attr(list_resp, "Pagelength") <- results_json$Parameter$pagelength + attr(list_resp, "Copyright") <- results_json$Copyright - if(gen_fun == "gen_api"){ - df_cubes <- binding_lapply(results_json$Cubes, - characteristics = c("Code", - "Content")) + return(list_resp) - df_cubes$Spezifisch <- ggsub(df_cubes) + } - df_cubes$Variablen <- spezifisch_create(df_cubes) + #--------------------------------------------------------------------------- - df_cubes$Object_Type <- "Cube" + if (category == "tables") { - } + df_table <- binding_lapply(results_json$Tables, + characteristics = c("Code", + "Content")) - #------------------------------------------------------------------------- + df_table$Spezifisch <- ggsub(df_table) - if (nrow(df_table) != 0) { - df_table$Titel <- titel_search(df_table, term) - } + df_table$Variablen <- spezifisch_create(df_table) - if (nrow(df_stats) != 0) { - df_stats$Titel <- titel_search(df_stats, term) - } + df_table$Object_Type <- "Table" - if (nrow(df_variables) != 0) { - df_variables$Titel <- titel_search(df_variables, term) - } + #------------------------------------------------------------------------- - if(gen_fun == "gen_api"){ - if (nrow(df_cubes) != 0) { - df_cubes$Titel <- titel_search(df_cubes, term) - } - } + if (nrow(df_table) != 0) { + df_table$Titel <- titel_search(df_table, term) + } - #------------------------------------------------------------------------- + if(isTRUE(ordering)) { - if(isTRUE(ordering)) { + df_table <- df_table[with(df_table, order(-Titel, -Variablen)), c("Code", + "Content", + "Object_Type")] - df_table <- df_table[with(df_table, order(-Titel, -Variablen)), c("Code", - "Content", - "Object_Type")] + } else { - df_stats <- df_stats[with(df_stats, order(-Titel, -Variablen)), c( "Code", - "Content", - "Object_Type")] + df_table <- df_table[, c("Code", + "Content", + "Object_Type")] - df_variables <- df_variables[with(df_variables, order(-Titel, -Variablen)), c( "Code", - "Content", - "Object_Type")] + } - if(gen_fun == "gen_api"){ - df_cubes <- df_cubes[with(df_cubes, order(-Titel, -Variablen)), c( "Code", - "Content", - "Object_Type")] - } - } else { + #------------------------------------------------------------------------- - df_table <- df_table[, c("Code", - "Content", - "Object_Type")] + list_resp <- list("Tables" = tibble::as_tibble(df_table)) - df_stats <- df_stats[, c("Code", - "Content", - "Object_Type")] + attr(list_resp, "Term") <- results_json$Parameter$term + attr(list_resp, "Database") <- database[1] + attr(list_resp, "Language") <- results_json$Parameter$language + attr(list_resp, "Pagelength") <- results_json$Parameter$pagelength + attr(list_resp, "Copyright") <- results_json$Copyright - df_variables <- df_variables[, c("Code", - "Content", - "Object_Type")] + return(list_resp) - if(gen_fun == "gen_api"){ - df_cubes <- df_cubes[, c("Code", - "Content", - "Object_Type")] } - } - - #------------------------------------------------------------------------- - - list_resp <- list("Tables" = tibble::as_tibble(df_table), - "Statistics" = tibble::as_tibble(df_stats), - "Variables" = tibble::as_tibble(df_variables), - "Cubes" = if(gen_fun == "gen_api"){tibble::as_tibble(df_cubes)} else {"No cubes at all avalaible in 'zensus'-database."}) + if (category == "statistics") { - attr(list_resp, "Term") <- results_json$Parameter$term - attr(list_resp, "Database") <- database[1] - attr(list_resp, "Language") <- results_json$Parameter$language - attr(list_resp, "Pagelength") <- results_json$Parameter$pagelength - attr(list_resp, "Copyright") <- results_json$Copyright - - return(list_resp) - - } - - #--------------------------------------------------------------------------- - - if (category == "tables") { - - df_table <- binding_lapply(results_json$Tables, - characteristics = c("Code", - "Content")) - - df_table$Spezifisch <- ggsub(df_table) - - df_table$Variablen <- spezifisch_create(df_table) - - df_table$Object_Type <- "Table" + df_stats <- binding_lapply(results_json$Statistics, + characteristics = c("Code", + "Content")) - #------------------------------------------------------------------------- + df_stats$Spezifisch <- ggsub(df_stats) - if (nrow(df_table) != 0) { - df_table$Titel <- titel_search(df_table, term) - } + df_stats$Variablen <- spezifisch_create(df_stats) - if(isTRUE(ordering)) { + df_stats$Object_Type <- "Statistic" - df_table <- df_table[with(df_table, order(-Titel, -Variablen)), c("Code", - "Content", - "Object_Type")] + #------------------------------------------------------------------------- - } else { + if (nrow(df_stats) != 0) { + df_stats$Titel <- titel_search(df_stats, term) + } - df_table <- df_table[, c("Code", - "Content", - "Object_Type")] + if(isTRUE(ordering)) { + df_stats <- df_stats[with(df_stats, order(-Titel, -Variablen)), c( "Code", + "Content", + "Object_Type")] - } + } else { - #------------------------------------------------------------------------- + df_stats <- df_stats[, c("Code", + "Content", + "Object_Type")] - list_resp <- list("Tables" = tibble::as_tibble(df_table)) + } - attr(list_resp, "Term") <- results_json$Parameter$term - attr(list_resp, "Database") <- database[1] - attr(list_resp, "Language") <- results_json$Parameter$language - attr(list_resp, "Pagelength") <- results_json$Parameter$pagelength - attr(list_resp, "Copyright") <- results_json$Copyright + #------------------------------------------------------------------------- - return(list_resp) + list_resp <- list("Statistics" = tibble::as_tibble(df_stats)) - } + attr(list_resp, "Term") <- results_json$Parameter$term + attr(list_resp, "Database") <- database[1] + attr(list_resp, "Language") <- results_json$Parameter$language + attr(list_resp, "Pagelength") <- results_json$Parameter$pagelength + attr(list_resp, "Copyright") <- results_json$Copyright - if (category == "statistics") { + return(list_resp) + } - df_stats <- binding_lapply(results_json$Statistics, - characteristics = c("Code", - "Content")) + #--------------------------------------------------------------------------- - df_stats$Spezifisch <- ggsub(df_stats) + if (category == "variables") { - df_stats$Variablen <- spezifisch_create(df_stats) + df_variables <- binding_lapply(results_json$Variables, + characteristics = c("Code", + "Content")) - df_stats$Object_Type <- "Statistic" + df_variables$Spezifisch <- ggsub(df_variables) - #------------------------------------------------------------------------- + df_variables$Variablen <- spezifisch_create(df_variables) - if (nrow(df_stats) != 0) { - df_stats$Titel <- titel_search(df_stats, term) - } + df_variables$Object_Type <- "Variable" - if(isTRUE(ordering)) { - df_stats <- df_stats[with(df_stats, order(-Titel, -Variablen)), c( "Code", - "Content", - "Object_Type")] + #------------------------------------------------------------------------- - } else { + if (nrow(df_variables) != 0) { + df_variables$Titel <- titel_search(df_variables, term) + } - df_stats <- df_stats[, c("Code", - "Content", - "Object_Type")] + #------------------------------------------------------------------------- - } + if(isTRUE(ordering)) { - #------------------------------------------------------------------------- + df_variables <- df_variables[with(df_variables, order(-Titel, -Variablen)), c( "Code", + "Content", + "Object_Type")] - list_resp <- list("Statistics" = tibble::as_tibble(df_stats)) + } else { - attr(list_resp, "Term") <- results_json$Parameter$term - attr(list_resp, "Database") <- database[1] - attr(list_resp, "Language") <- results_json$Parameter$language - attr(list_resp, "Pagelength") <- results_json$Parameter$pagelength - attr(list_resp, "Copyright") <- results_json$Copyright + df_variables <- df_variables[, c("Code", + "Content", + "Object_Type")] - return(list_resp) - } + } - #--------------------------------------------------------------------------- + #------------------------------------------------------------------------- - if (category == "variables") { + list_resp <- list("Variables" = tibble::as_tibble(df_variables)) - df_variables <- binding_lapply(results_json$Variables, - characteristics = c("Code", - "Content")) - - df_variables$Spezifisch <- ggsub(df_variables) - - df_variables$Variablen <- spezifisch_create(df_variables) + attr(list_resp, "Term") <- results_json$Parameter$term + attr(list_resp, "Database") <- database[1] + attr(list_resp, "Language") <- results_json$Parameter$language + attr(list_resp, "Pagelength") <- results_json$Parameter$pagelength + attr(list_resp, "Copyright") <- results_json$Copyright - df_variables$Object_Type <- "Variable" - - #------------------------------------------------------------------------- + return(list_resp) + } - if (nrow(df_variables) != 0) { - df_variables$Titel <- titel_search(df_variables, term) } - #------------------------------------------------------------------------- - - if(isTRUE(ordering)) { + #--------------------------------------------------------------------------- - df_variables <- df_variables[with(df_variables, order(-Titel, -Variablen)), c( "Code", - "Content", - "Object_Type")] + if (category == "cubes" && (db == "gen_api" || db == "gen_regio_api")) { - } else { - - df_variables <- df_variables[, c("Code", - "Content", - "Object_Type")] - - } - - #------------------------------------------------------------------------- + df_cubes <- binding_lapply(results_json$Cubes, + characteristics = c("Code", + "Content")) - list_resp <- list("Variables" = tibble::as_tibble(df_variables)) + df_cubes$Spezifisch <- ggsub(df_cubes) - attr(list_resp, "Term") <- results_json$Parameter$term - attr(list_resp, "Database") <- database[1] - attr(list_resp, "Language") <- results_json$Parameter$language - attr(list_resp, "Pagelength") <- results_json$Parameter$pagelength - attr(list_resp, "Copyright") <- results_json$Copyright + df_cubes$Variablen <- spezifisch_create(df_cubes) - return(list_resp) - } + df_cubes$Object_Type <- "Cube" - } + #------------------------------------------------------------------------- - #--------------------------------------------------------------------------- + if (nrow(df_cubes) != 0) { + df_cubes$Titel <- titel_search(df_cubes, term) + } - if (category == "cubes" && gen_fun == "gen_api") { + if(isTRUE(ordering)) { - df_cubes <- binding_lapply(results_json$Cubes, - characteristics = c("Code", - "Content")) + df_cubes <- df_cubes[with(df_cubes, order(-Titel, -Variablen)), c( "Code", + "Content", + "Object_Type")] - df_cubes$Spezifisch <- ggsub(df_cubes) + } else { - df_cubes$Variablen <- spezifisch_create(df_cubes) + df_cubes <- df_cubes[, c("Code", + "Content", + "Object_Type")] - df_cubes$Object_Type <- "Cube" + } - #------------------------------------------------------------------------- + #------------------------------------------------------------------------- - if (nrow(df_cubes) != 0) { - df_cubes$Titel <- titel_search(df_cubes, term) - } + list_resp <- list("Cubes" = tibble::as_tibble(df_cubes)) - if(isTRUE(ordering)) { + attr(list_resp, "Term") <- results_json$Parameter$term + attr(list_resp, "Database") <- rev_database_function(db) + attr(list_resp, "Language") <- results_json$Parameter$language + attr(list_resp, "Pagelength") <- results_json$Parameter$pagelength + attr(list_resp, "Copyright") <- results_json$Copyright - df_cubes <- df_cubes[with(df_cubes, order(-Titel, -Variablen)), c( "Code", - "Content", - "Object_Type")] + return(list_resp) } else { - - df_cubes <- df_cubes[, c("Code", - "Content", - "Object_Type")] - + list_resp <- "No cubes at all avalaible in 'zensus'-database." } - #------------------------------------------------------------------------- - - list_resp <- list("Cubes" = tibble::as_tibble(df_cubes)) + } - attr(list_resp, "Term") <- results_json$Parameter$term - attr(list_resp, "Database") <- database[1] - attr(list_resp, "Language") <- results_json$Parameter$language - attr(list_resp, "Pagelength") <- results_json$Parameter$pagelength - attr(list_resp, "Copyright") <- results_json$Copyright + return(list_resp) - return(list_resp) + }) - } else { - list_resp <- "No cubes at all avalaible in 'zensus'-database." - } + #----------------------------------------------------------------------------- - } + res <- check_results(res) - return(list_resp) + return(res) } diff --git a/R/gen_meta_data.R b/R/gen_meta_data.R index bd274f2..be7353e 100644 --- a/R/gen_meta_data.R +++ b/R/gen_meta_data.R @@ -18,7 +18,7 @@ #' } #' gen_metadata_stats <- function(code = NULL, - database = c("genesis", "zensus"), + database = c("all", "genesis", "zensus", "regio"), area = c("all", "public", "user"), error.ignore = FALSE, ...) { @@ -29,6 +29,7 @@ gen_metadata_stats <- function(code = NULL, check_function_input(code = code, error.ignore = error.ignore, + database = gen_fun, caller = caller) area <- match.arg(area) @@ -37,68 +38,65 @@ gen_metadata_stats <- function(code = NULL, #----------------------------------------------------------------------------- - if(gen_fun == "gen_api"){ - - par_list <- list( - endpoint = "metadata/statistic", - username = gen_auth_get()$username, - password = gen_auth_get()$password, - name = code, - area = area, - ... - ) - - } else if ( gen_fun == "gen_zensus_api"){ + res <- lapply(gen_fun, function(db){ par_list <- list( endpoint = "metadata/statistic", - username = gen_zensus_auth_get()$username, - password = gen_zensus_auth_get()$password, + username = gen_auth_get(database = rev_database_function(db))$username, + password = gen_auth_get(database = rev_database_function(db))$password, name = code, ... ) - } - - results_raw <- do.call(gen_fun, par_list) + if(db == "gen_api" | db == "gen_regio_api"){ + par_list <- append(par_list, list(area = area)) + } - results_json <- test_if_json(results_raw) + results_raw <- do.call(db, par_list) - empty_object <- test_if_error(results_json, para = error.ignore) + results_json <- test_if_json(results_raw) - #----------------------------------------------------------------------------- + empty_object <- test_if_error(results_json, para = error.ignore) - if(isTRUE(empty_object)){ + #--------------------------------------------------------------------------- + if(isTRUE(empty_object)){ - df_stats <- "No 'meta_information' object found for your request." + df_stats <- "No 'meta_information' object found for your request." - } else if(isFALSE(empty_object)){ + } else if(isFALSE(empty_object)){ - df_stats <- results_json$Status$Content + df_stats <- results_json$Status$Content - } else if(empty_object == "DONE"){ + } else if(empty_object == "DONE"){ - df_stats <- c("Code" = results_json$Object$Code, - "Content" = results_json$Object$Content, - "Cubes" = results_json$Object$Cubes, - "Variables" = results_json$Object$Variables, - "Information" = results_json$Object$Information, - "Time_from" = results_json$Object$Frequency[[1]]$From, - "Time_to" = results_json$Object$Frequency[[1]]$To, - "Time_type" = results_json$Object$Frequency[[1]]$Type) - } + df_stats <- c("Code" = results_json$Object$Code, + "Content" = results_json$Object$Content, + "Cubes" = results_json$Object$Cubes, + "Variables" = results_json$Object$Variables, + "Information" = results_json$Object$Information, + "Time_from" = results_json$Object$Frequency[[1]]$From, + "Time_to" = results_json$Object$Frequency[[1]]$To, + "Time_type" = results_json$Object$Frequency[[1]]$Type) + } attr(df_stats, "Code") <- results_json$Parameter$name - attr(df_stats, "Database") <- database[1] + attr(df_stats, "Database") <- rev_database_function(db) attr(df_stats, "Method") <- results_json$Ident$Method attr(df_stats, "Updated") <- results_json$Object$Updated attr(df_stats, "Language") <- results_json$Parameter$language attr(df_stats, "Copyright") <- results_json$Copyright return(df_stats) -} -#------------------------------------------------------------------------------- + }) + + #----------------------------------------------------------------------------- + + res <- check_results(res) + + return(res) + +} #' gen_metadata_var #' @@ -120,7 +118,7 @@ gen_metadata_stats <- function(code = NULL, #' } #' gen_metadata_var <- function(code = NULL, - database = c("genesis", "zensus"), + database = c("all", "genesis", "zensus", "regio"), area = c("all", "public", "user"), error.ignore = FALSE, ...) { @@ -131,6 +129,7 @@ gen_metadata_var <- function(code = NULL, check_function_input(code = code, error.ignore = error.ignore, + database = gen_fun, caller = caller) area <- match.arg(area) @@ -139,66 +138,65 @@ gen_metadata_var <- function(code = NULL, #----------------------------------------------------------------------------- - if(gen_fun == "gen_api"){ + res <- lapply(gen_fun, function(db){ par_list <- list( endpoint = "metadata/variable", - username = gen_auth_get()$username, - password = gen_auth_get()$password, + username = gen_auth_get(database = rev_database_function(db))$username, + password = gen_auth_get(database = rev_database_function(db))$password, name = code, - area = area, ... ) - } else if ( gen_fun == "gen_zensus_api"){ + if(db == "gen_api" | db == "gen_regio_api"){ + par_list <- append(par_list, list(area = area)) + } - par_list <- list( - endpoint = "metadata/variable", - username = gen_zensus_auth_get()$username, - password = gen_zensus_auth_get()$password, - name = code, - ... - ) + results_raw <- do.call(db, par_list) - } + results_json <- test_if_json(results_raw) - results_raw <- do.call(gen_fun, par_list) + empty_object <- test_if_error(results_json, para = error.ignore) - results_json <- test_if_json(results_raw) + #--------------------------------------------------------------------------- + if(isTRUE(empty_object)){ - empty_object <- test_if_error(results_json, para = error.ignore) + df_var <- "No 'meta_information' object found for your request." - #----------------------------------------------------------------------------- + } else if(isFALSE(empty_object)){ - if(isTRUE(empty_object)){ + df_var <- results_json$Status$Content - df_var <- "No 'meta_information' object found for your request." + } else if(empty_object == "DONE"){ - } else if(isFALSE(empty_object)){ + df_var <- c("Code" = results_json$Object$Code, + "Content" = results_json$Object$Content, + "Values" = results_json$Object$Values, + "Type" = results_json$Object$Type, + "Validity_from" = results_json$Object$Validity$From, + "Validity_to" = results_json$Object$Validity$To) + } - df_var <- results_json$Status$Content + list_resp <- list("General" = df_var, + "Information" = results_json$Object$Information) - } else if(empty_object == "DONE"){ + attr(list_resp, "Code") <- results_json$Parameter$name + attr(list_resp, "Database") <- rev_database_function(db) + attr(list_resp, "Method") <- results_json$Ident$Method + attr(list_resp, "Updated") <- results_json$Object$Updated + attr(list_resp, "Language") <- results_json$Parameter$language + attr(list_resp, "Copyright") <- results_json$Copyright + + return(list_resp) + + }) + + #----------------------------------------------------------------------------- + + res <- check_results(res) + + return(res) - df_var <- c("Code" = results_json$Object$Code, - "Content" = results_json$Object$Content, - "Values" = results_json$Object$Values, - "Type" = results_json$Object$Type, - "Validity_from" = results_json$Object$Validity$From, - "Validity_to" = results_json$Object$Validity$To) - } - - list_resp <- list("General" = df_var, - "Information" = results_json$Object$Information) - - attr(list_resp, "Code") <- results_json$Parameter$name - attr(list_resp, "Database") <- database[1] - attr(list_resp, "Method") <- results_json$Ident$Method - attr(list_resp, "Updated") <- results_json$Object$Updated - attr(list_resp, "Language") <- results_json$Parameter$language - attr(list_resp, "Copyright") <- results_json$Copyright - - return(list_resp) } #------------------------------------------------------------------------------- @@ -223,7 +221,7 @@ gen_metadata_var <- function(code = NULL, #' } #' gen_metadata_val <- function(code = NULL, - database = c("genesis", "zensus"), + database = c("all", "genesis", "zensus", "regio"), area = c("all", "public", "user"), error.ignore = FALSE, ...) { @@ -234,6 +232,7 @@ gen_metadata_val <- function(code = NULL, check_function_input(code = code, error.ignore = error.ignore, + database = gen_fun, caller = caller) area <- match.arg(area) @@ -242,63 +241,62 @@ gen_metadata_val <- function(code = NULL, #----------------------------------------------------------------------------- - if(gen_fun == "gen_api"){ + res <- lapply(gen_fun, function(db){ par_list <- list( endpoint = "metadata/value", - username = gen_auth_get()$username, - password = gen_auth_get()$password, + username = gen_auth_get(database = rev_database_function(db))$username, + password = gen_auth_get(database = rev_database_function(db))$password, name = code, - area = area, ... ) - } else if ( gen_fun == "gen_zensus_api"){ + if(db == "gen_api" | db == "gen_regio_api"){ + par_list <- append(par_list, list(area = area)) + } - par_list <- list( - endpoint = "metadata/value", - username = gen_zensus_auth_get()$username, - password = gen_zensus_auth_get()$password, - name = code, - ... - ) + results_raw <- do.call(db, par_list) - } + results_json <- test_if_json(results_raw) - results_raw <- do.call(gen_fun, par_list) + empty_object <- test_if_error(results_json, para = error.ignore) - results_json <- test_if_json(results_raw) + #--------------------------------------------------------------------------- + if(isTRUE(empty_object)){ - empty_object <- test_if_error(results_json, para = error.ignore) + df_value <- "No 'meta_information' object found for your request." - #----------------------------------------------------------------------------- + } else if(isFALSE(empty_object)){ - if(isTRUE(empty_object)){ + df_value <- results_json$Status$Content - df_value <- "No 'meta_information' object found for your request." + } else if(empty_object == "DONE"){ - } else if(isFALSE(empty_object)){ + df_value <- c("Code" = results_json$Object$Code, + "Content" = results_json$Object$Content, + "Variables" = results_json$Object$Variables) + } - df_value <- results_json$Status$Content + list_resp <- list("General" = df_value, + "Information" = results_json$Object$Information) - } else if(empty_object == "DONE"){ + attr(list_resp, "Code") <- results_json$Parameter$name + attr(list_resp, "Database") <- database[1] + attr(list_resp, "Method") <- results_json$Ident$Method + attr(list_resp, "Updated") <- results_json$Object$Updated + attr(list_resp, "Language") <- results_json$Parameter$language + attr(list_resp, "Copyright") <- results_json$Copyright - df_value <- c("Code" = results_json$Object$Code, - "Content" = results_json$Object$Content, - "Variables" = results_json$Object$Variables) - } + return(list_resp) - list_resp <- list("General" = df_value, - "Information" = results_json$Object$Information) + }) - attr(list_resp, "Code") <- results_json$Parameter$name - attr(list_resp, "Database") <- database[1] - attr(list_resp, "Method") <- results_json$Ident$Method - attr(list_resp, "Updated") <- results_json$Object$Updated - attr(list_resp, "Language") <- results_json$Parameter$language - attr(list_resp, "Copyright") <- results_json$Copyright + #----------------------------------------------------------------------------- + + res <- check_results(res) + + return(res) - return(list_resp) } #------------------------------------------------------------------------------- @@ -323,7 +321,7 @@ gen_metadata_val <- function(code = NULL, #' } #' gen_metadata_tab <- function(code = NULL, - database = c("genesis", "zensus"), + database = c("all", "genesis", "zensus", "regio"), area = c("all", "public", "user"), error.ignore = FALSE, ...) { @@ -334,6 +332,7 @@ gen_metadata_tab <- function(code = NULL, check_function_input(code = code, error.ignore = error.ignore, + database = gen_fun, caller = caller) area <- match.arg(area) @@ -342,141 +341,136 @@ gen_metadata_tab <- function(code = NULL, #----------------------------------------------------------------------------- - if(gen_fun == "gen_api"){ - - par_list <- list( - endpoint = "metadata/table", - username = gen_auth_get()$username, - password = gen_auth_get()$password, - name = code, - area = area, - ... - ) - - } else if ( gen_fun == "gen_zensus_api"){ + res <- lapply(gen_fun, function(db){ par_list <- list( endpoint = "metadata/table", - username = gen_zensus_auth_get()$username, - password = gen_zensus_auth_get()$password, + username = gen_auth_get(database = rev_database_function(db))$username, + password = gen_auth_get(database = rev_database_function(db))$password, name = code, area = area, ... ) - } - - results_raw <- do.call(gen_fun, par_list) - - results_json <- test_if_json(results_raw) - - empty_object <- test_if_error(results_json, para = error.ignore) - - #----------------------------------------------------------------------------- - - if(isTRUE(empty_object)){ - - char <- "No 'meta_information' object found for your request." - structure <- NULL - embedded <- NULL + results_raw <- do.call(db, par_list) - } else if(isFALSE(empty_object)){ + results_json <- test_if_json(results_raw) - char <- results_json$Status$Content - structure <- NULL - embedded <- NULL + empty_object <- test_if_error(results_json, para = error.ignore) - } else if(empty_object == "DONE"){ + #--------------------------------------------------------------------------- + if(isTRUE(empty_object)){ - char <- c("Code" = results_json$Object$Code, - "Content" = results_json$Object$Content, - "Time_From" = results_json$Object$Time$From, - "Time_To" = results_json$Object$Time$To, - "Valid" = results_json$Object$Valid) + char <- "No 'meta_information' object found for your request." + structure <- NULL + embedded <- NULL - embedded <- cbind("Code" = results_json$Object$Structure$Head$Code, - "Content" = results_json$Object$Structure$Head$Content, - "Type" = results_json$Object$Structure$Head$Type, - "Values" = results_json$Object$Structure$Head$Values, - "Selection" = results_json$Object$Structure$Head$Selected, - "Updated" = results_json$Object$Structure$Head$Updated) + } else if(isFALSE(empty_object)){ - structure <- list() + char <- results_json$Status$Content + structure <- NULL + embedded <- NULL - structure$Head <- if (length(results_json$Object$Structure$Head$Structure) == 1) { - - cbind("Code" = results_json$Object$Structure$Head$Structure[[1]]$Code, - "Content" = results_json$Object$Structure$Head$Structure[[1]]$Content, - "Type" = results_json$Object$Structure$Head$Structure[[1]]$Type, - "Values" = results_json$Object$Structure$Head$Structure[[1]]$Values, - "Selected" = results_json$Object$Structure$Head$Structure[[1]]$Selected, - "Structure" = results_json$Object$Structure$Head$Structure[[1]]$Structure, - "Updated" = results_json$Object$Structure$Head$Structure[[1]]$Updated) - - } else { - - cbind("Code" = unlist(lapply(results_json$Object$Structure$Columns, `[[`, 1)), - "Content" = unlist(lapply(results_json$Object$Structure$Columns, `[[`, 2)), - "Type" = unlist(lapply(results_json$Object$Structure$Columns, `[[`, 3)), - "Values" = unlist(lapply(results_json$Object$Structure$Columns, `[[`, 4)), - "Selected" = unlist(lapply(results_json$Object$Structure$Columns, `[[`, 5)), - "Structure" = unlist(lapply(results_json$Object$Structure$Columns, `[[`, 6)), - "Updated" = unlist(lapply(results_json$Object$Structure$Columns, `[[`, 7))) - } - - structure$Columns <- if (length(results_json$Object$Structure$Columns) == 1) { - - cbind("Code" = results_json$Object$Structure$Columns[[1]]$Code, - "Content" = results_json$Object$Structure$Columns[[1]]$Content, - "Type" = results_json$Object$Structure$Columns[[1]]$Type, - "Unit" = results_json$Object$Structure$Columns[[1]]$Unit, - "Values" = results_json$Object$Structure$Columns[[1]]$Values, - "Updated" = results_json$Object$Structure$Columns[[1]]$Updated) - - } else { - - cbind("Code" = unlist(lapply(results_json$Object$Structure$Columns, `[[`, 1)), - "Content" = unlist(lapply(results_json$Object$Structure$Columns, `[[`, 2)), - "Type" = unlist(lapply(results_json$Object$Structure$Columns, `[[`, 3)), - "Unit" = unlist(lapply(results_json$Object$Structure$Columns, `[[`, 4)), - "Values" = unlist(lapply(results_json$Object$Structure$Columns, `[[`, 5)), - "Updated" = unlist(lapply(results_json$Object$Structure$Columns, `[[`, 6))) + } else if(empty_object == "DONE"){ + char <- c("Code" = results_json$Object$Code, + "Content" = results_json$Object$Content, + "Time_From" = results_json$Object$Time$From, + "Time_To" = results_json$Object$Time$To, + "Valid" = results_json$Object$Valid) + + embedded <- cbind("Code" = results_json$Object$Structure$Head$Code, + "Content" = results_json$Object$Structure$Head$Content, + "Type" = results_json$Object$Structure$Head$Type, + "Values" = results_json$Object$Structure$Head$Values, + "Selection" = results_json$Object$Structure$Head$Selected, + "Updated" = results_json$Object$Structure$Head$Updated) + + structure <- list() + + structure$Head <- if (length(results_json$Object$Structure$Head$Structure) == 1) { + + cbind("Code" = results_json$Object$Structure$Head$Structure[[1]]$Code, + "Content" = results_json$Object$Structure$Head$Structure[[1]]$Content, + "Type" = results_json$Object$Structure$Head$Structure[[1]]$Type, + "Values" = results_json$Object$Structure$Head$Structure[[1]]$Values, + "Selected" = results_json$Object$Structure$Head$Structure[[1]]$Selected, + "Structure" = results_json$Object$Structure$Head$Structure[[1]]$Structure, + "Updated" = results_json$Object$Structure$Head$Structure[[1]]$Updated) + + } else { + + cbind("Code" = unlist(lapply(results_json$Object$Structure$Columns, `[[`, 1)), + "Content" = unlist(lapply(results_json$Object$Structure$Columns, `[[`, 2)), + "Type" = unlist(lapply(results_json$Object$Structure$Columns, `[[`, 3)), + "Values" = unlist(lapply(results_json$Object$Structure$Columns, `[[`, 4)), + "Selected" = unlist(lapply(results_json$Object$Structure$Columns, `[[`, 5)), + "Structure" = unlist(lapply(results_json$Object$Structure$Columns, `[[`, 6)), + "Updated" = unlist(lapply(results_json$Object$Structure$Columns, `[[`, 7))) + } + + structure$Columns <- if (length(results_json$Object$Structure$Columns) == 1) { + + cbind("Code" = results_json$Object$Structure$Columns[[1]]$Code, + "Content" = results_json$Object$Structure$Columns[[1]]$Content, + "Type" = results_json$Object$Structure$Columns[[1]]$Type, + "Unit" = results_json$Object$Structure$Columns[[1]]$Unit, + "Values" = results_json$Object$Structure$Columns[[1]]$Values, + "Updated" = results_json$Object$Structure$Columns[[1]]$Updated) + + } else { + + cbind("Code" = unlist(lapply(results_json$Object$Structure$Columns, `[[`, 1)), + "Content" = unlist(lapply(results_json$Object$Structure$Columns, `[[`, 2)), + "Type" = unlist(lapply(results_json$Object$Structure$Columns, `[[`, 3)), + "Unit" = unlist(lapply(results_json$Object$Structure$Columns, `[[`, 4)), + "Values" = unlist(lapply(results_json$Object$Structure$Columns, `[[`, 5)), + "Updated" = unlist(lapply(results_json$Object$Structure$Columns, `[[`, 6))) + + } + + structure$Rows <- if (length(results_json$Object$Structure$Rows) == 1) { + + cbind("Code" = results_json$Object$Structure$Rows[[1]]$Code, + "Content" = results_json$Object$Structure$Rows[[1]]$Content, + "Type" = results_json$Object$Structure$Rows[[1]]$Type, + "Unit" = results_json$Object$Structure$Rows[[1]]$Unit, + "Values" = results_json$Object$Structure$Rows[[1]]$Values, + "Updated" = results_json$Object$Structure$Rows[[1]]$Updated) + + } else { + + cbind("Code" = unlist(lapply(results_json$Object$Structure$Rows, `[[`, 1)), + "Content" = unlist(lapply(results_json$Object$Structure$Rows, `[[`, 2)), + "Type" = unlist(lapply(results_json$Object$Structure$Rows, `[[`, 3)), + "Unit" = unlist(lapply(results_json$Object$Structure$Rows, `[[`, 4)), + "Values" = unlist(lapply(results_json$Object$Structure$Rows, `[[`, 5)), + "Updated" = unlist(lapply(results_json$Object$Structure$Rows, `[[`, 6))) + + } } - structure$Rows <- if (length(results_json$Object$Structure$Rows) == 1) { + list_resp <- list("General" = char, + "Structure" = structure, + "Embedded_in" = embedded) - cbind("Code" = results_json$Object$Structure$Rows[[1]]$Code, - "Content" = results_json$Object$Structure$Rows[[1]]$Content, - "Type" = results_json$Object$Structure$Rows[[1]]$Type, - "Unit" = results_json$Object$Structure$Rows[[1]]$Unit, - "Values" = results_json$Object$Structure$Rows[[1]]$Values, - "Updated" = results_json$Object$Structure$Rows[[1]]$Updated) + attr(list_resp, "Code") <- results_json$Parameter$name + attr(list_resp, "Database") <- rev_database_function(db) + attr(list_resp, "Method") <- results_json$Ident$Method + attr(list_resp, "Updated") <- results_json$Object$Updated + attr(list_resp, "Language") <- results_json$Parameter$language + attr(list_resp, "Copyright") <- results_json$Copyright - } else { + return(list_resp) - cbind("Code" = unlist(lapply(results_json$Object$Structure$Rows, `[[`, 1)), - "Content" = unlist(lapply(results_json$Object$Structure$Rows, `[[`, 2)), - "Type" = unlist(lapply(results_json$Object$Structure$Rows, `[[`, 3)), - "Unit" = unlist(lapply(results_json$Object$Structure$Rows, `[[`, 4)), - "Values" = unlist(lapply(results_json$Object$Structure$Rows, `[[`, 5)), - "Updated" = unlist(lapply(results_json$Object$Structure$Rows, `[[`, 6))) + }) - } - } + #----------------------------------------------------------------------------- - list_resp <- list("General" = char, - "Structure" = structure, - "Embedded_in" = embedded) + res <- check_results(res) - attr(list_resp, "Code") <- results_json$Parameter$name - attr(list_resp, "Database") <- database[1] - attr(list_resp, "Method") <- results_json$Ident$Method - attr(list_resp, "Updated") <- results_json$Object$Updated - attr(list_resp, "Language") <- results_json$Parameter$language - attr(list_resp, "Copyright") <- results_json$Copyright + return(res) - return(list_resp) } #------------------------------------------------------------------------------- @@ -500,12 +494,19 @@ gen_metadata_tab <- function(code = NULL, #' } #' gen_metadata_cube <- function(code = NULL, + database = c("all", "genesis", "regio"), error.ignore = FALSE, area = c("all", "public", "user"), ...) { + caller <- as.character(match.call()[1]) + + gen_fun <- test_database_function(database) + check_function_input(code = code, - error.ignore = error.ignore) + error.ignore = error.ignore, + database = gen_fun, + caller = caller) area <- match.arg(area) @@ -513,100 +514,114 @@ gen_metadata_cube <- function(code = NULL, #----------------------------------------------------------------------------- - results_raw <- gen_api("metadata/cube", - username = gen_auth_get()$username, - password = gen_auth_get()$password, - name = code, - area = area, - ...) - - results_json <- test_if_json(results_raw) - - empty_object <- test_if_error(results_json, para = error.ignore) - - #----------------------------------------------------------------------------- - - if(isTRUE(empty_object)){ + res <- lapply(gen_fun, function(db){ - char <- "No 'meta_information' object found for your request." - time <- NULL - stat <- NULL - structure <- NULL - - } else if(isFALSE(empty_object)){ - - char <- results_json$Status$Content - time <- NULL - stat <- NULL - structure <- NULL + par_list <- list( + endpoint = "metadata/cube", + username = gen_auth_get(database = rev_database_function(db))$username, + password = gen_auth_get(database = rev_database_function(db))$password, + name = code, + area = area, + ... + ) - } else if(empty_object == "DONE"){ + results_raw <- do.call(db, par_list) - char <- c("Code" = results_json$Object$Code, - "Content" = results_json$Object$Content, - "State" = results_json$Object$State, - "Values" = results_json$Object$Values) + results_json <- test_if_json(results_raw) - time <- unlist(results_json$Object$Timeslices) + empty_object <- test_if_error(results_json, para = error.ignore) - stat <- c("Code" = results_json$Object$Statistic$Code, - "Content" = results_json$Object$Statistic$Content, - "Updated" = results_json$Object$Statistic$Updated) + #--------------------------------------------------------------------------- + if(isTRUE(empty_object)){ - structure <- list() + char <- "No 'meta_information' object found for your request." + time <- NULL + stat <- NULL + structure <- NULL - structure$Axis <- if (length(results_json$Object$Structure$Axis) == 1) { + } else if(isFALSE(empty_object)){ - cbind( - "Code" = results_json$Object$Structure$Axis[[1]]$Code, - "Content" = results_json$Object$Structure$Axis[[1]]$Content, - "Type" = results_json$Object$Structure$Axis[[1]]$Type, - "Updated" = results_json$Object$Structure$Axis[[1]]$Updated) + char <- results_json$Status$Content + time <- NULL + stat <- NULL + structure <- NULL - } else { + } else if(empty_object == "DONE"){ - cbind( - "Code" = unlist(lapply(results_json$Object$Structure$Axis, `[[`, 1)), - "Content" = unlist(lapply(results_json$Object$Structure$Axis, `[[`, 2)), - "Type" = unlist(lapply(results_json$Object$Structure$Axis, `[[`, 3)), - "Updated" = unlist(lapply(results_json$Object$Structure$Axis, `[[`, 4))) + char <- c("Code" = results_json$Object$Code, + "Content" = results_json$Object$Content, + "State" = results_json$Object$State, + "Values" = results_json$Object$Values) + + time <- unlist(results_json$Object$Timeslices) + + stat <- c("Code" = results_json$Object$Statistic$Code, + "Content" = results_json$Object$Statistic$Content, + "Updated" = results_json$Object$Statistic$Updated) + + structure <- list() + + structure$Axis <- if (length(results_json$Object$Structure$Axis) == 1) { + + cbind( + "Code" = results_json$Object$Structure$Axis[[1]]$Code, + "Content" = results_json$Object$Structure$Axis[[1]]$Content, + "Type" = results_json$Object$Structure$Axis[[1]]$Type, + "Updated" = results_json$Object$Structure$Axis[[1]]$Updated) + + } else { + + cbind( + "Code" = unlist(lapply(results_json$Object$Structure$Axis, `[[`, 1)), + "Content" = unlist(lapply(results_json$Object$Structure$Axis, `[[`, 2)), + "Type" = unlist(lapply(results_json$Object$Structure$Axis, `[[`, 3)), + "Updated" = unlist(lapply(results_json$Object$Structure$Axis, `[[`, 4))) + } + + structure$Content <- if (length(results_json$Object$Structure$Contents) == 1) { + + cbind("Code" = results_json$Object$Structure$Contents[[1]]$Code, + "Content" = results_json$Object$Structure$Contents[[1]]$Content, + "Type" = results_json$Object$Structure$Contents[[1]]$Type, + "Unit" = results_json$Object$Structure$Contents[[1]]$Unit, + "Values" = results_json$Object$Structure$Contents[[1]]$Values, + "Updated" = results_json$Object$Structure$Contents[[1]]$Updated, + "Timeslices" = results_json$Object$Structure$Contents[[1]]$Timeslices) + + } else { + + cbind("Code" = unlist(lapply(results_json$Object$Structure$Contents, `[[`, 1)), + "Content" = unlist(lapply(results_json$Object$Structure$Contents, `[[`, 2)), + "Type" = unlist(lapply(results_json$Object$Structure$Contents, `[[`, 3)), + "Unit" = unlist(lapply(results_json$Object$Structure$Contents, `[[`, 4)), + "Values" = unlist(lapply(results_json$Object$Structure$Contents, `[[`, 5)), + "Updated" = unlist(lapply(results_json$Object$Structure$Contents, `[[`, 7)), + "Updated" = unlist(lapply(results_json$Object$Structure$Contents, `[[`, 6))) + } } - structure$Content <- if (length(results_json$Object$Structure$Contents) == 1) { + list_resp <- list("General" = char, + "Timespan" = time, + "Statistic_used" = stat, + "Structure" = structure) - cbind("Code" = results_json$Object$Structure$Contents[[1]]$Code, - "Content" = results_json$Object$Structure$Contents[[1]]$Content, - "Type" = results_json$Object$Structure$Contents[[1]]$Type, - "Unit" = results_json$Object$Structure$Contents[[1]]$Unit, - "Values" = results_json$Object$Structure$Contents[[1]]$Values, - "Updated" = results_json$Object$Structure$Contents[[1]]$Updated, - "Timeslices" = results_json$Object$Structure$Contents[[1]]$Timeslices) + attr(list_resp, "Code") <- results_json$Parameter$name + attr(list_resp, "Database") <- rev_database_function(db) + attr(list_resp, "Method") <- results_json$Ident$Method + attr(list_resp, "Updated") <- results_json$Object$Updated + attr(list_resp, "Language") <- results_json$Parameter$language + attr(list_resp, "Copyright") <- results_json$Copyright - } else { + return(list_resp) - cbind("Code" = unlist(lapply(results_json$Object$Structure$Contents, `[[`, 1)), - "Content" = unlist(lapply(results_json$Object$Structure$Contents, `[[`, 2)), - "Type" = unlist(lapply(results_json$Object$Structure$Contents, `[[`, 3)), - "Unit" = unlist(lapply(results_json$Object$Structure$Contents, `[[`, 4)), - "Values" = unlist(lapply(results_json$Object$Structure$Contents, `[[`, 5)), - "Updated" = unlist(lapply(results_json$Object$Structure$Contents, `[[`, 7)), - "Updated" = unlist(lapply(results_json$Object$Structure$Contents, `[[`, 6))) - } - } + }) - list_resp <- list("General" = char, - "Timespan" = time, - "Statistic_used" = stat, - "Structure" = structure) + #----------------------------------------------------------------------------- - attr(list_resp, "Code") <- results_json$Parameter$name - attr(list_resp, "Database") <- "genesis" - attr(list_resp, "Method") <- results_json$Ident$Method - attr(list_resp, "Updated") <- results_json$Object$Updated - attr(list_resp, "Language") <- results_json$Parameter$language - attr(list_resp, "Copyright") <- results_json$Copyright + res <- check_results(res) + + return(res) - return(list_resp) } #------------------------------------------------------------------------------- @@ -632,7 +647,7 @@ gen_metadata_cube <- function(code = NULL, #' } #' gen_metadata <- function(code = NULL, - database = c("genesis", "zensus"), + database = c("all", "genesis", "zensus", "regio"), category = c("cube", "statistic", "table", "variable", "value"), area = c("all", "public", "user"), error.ignore = FALSE, @@ -650,43 +665,54 @@ gen_metadata <- function(code = NULL, #----------------------------------------------------------------------------- - if (category == "cube") { - - gen_metadata_cube(code = code, error.ignore = error.ignore, ...) + res <- lapply(gen_fun, function(odb){ - } else if (category == "value") { + if (category == "cube") { - gen_metadata_val(code = code, - database = database, - area = area, - error.ignore = error.ignore, ...) + gen_metadata_cube(code = code, + database = odb, + error.ignore = error.ignore, ...) - } else if (category == "variable") { + } else if (category == "value") { - gen_metadata_var(code = code, - database = database, - area = area, - error.ignore = error.ignore, ...) + gen_metadata_val(code = code, + database = odb, + area = area, + error.ignore = error.ignore, ...) - } else if (category == "table") { + } else if (category == "variable") { - gen_metadata_tab(code = code, - database = database, - area = area, - error.ignore = error.ignore, ...) + gen_metadata_var(code = code, + database = odb, + area = area, + error.ignore = error.ignore, ...) - } else if (category == "statistic") { + } else if (category == "table") { - gen_metadata_stats(code = code, - database = database, + gen_metadata_tab(code = code, + database = odb, area = area, error.ignore = error.ignore, ...) - } else { + } else if (category == "statistic") { + + gen_metadata_stats(code = code, + database = odb, + area = area, + error.ignore = error.ignore, ...) - stop("Category is not found, please select a correct category. - Available categories for data base GENESIS: 'cube', 'statistic', 'table', 'variable', 'value. - \n Available categories for Zensus data base: 'statistic', 'table', 'variable', 'value.' \n + } else { + + stop("Category is not found, please select a correct category. + Available categories for data base GENESIS & Regionalstatistik: 'cube', 'statistic', 'table', 'variable', 'value'. + \n Available categories for Zensus data base: 'statistic', 'table', 'variable', 'value'. \n Please choose one of them.", call. = TRUE) - } + } + + }) + + res <- check_results(res) + + return(res) + } diff --git a/R/gen_modified_data.R b/R/gen_modified_data.R index c0dd800..9e1ac97 100644 --- a/R/gen_modified_data.R +++ b/R/gen_modified_data.R @@ -24,7 +24,7 @@ #' } #' gen_modified_data <- function(code = "", - database = c("genesis", "zensus"), + database = c("all", "genesis", "zensus", "regio"), type = c("all", "tables", "statistics", "statisticsUpdates"), date = c("now", "week_before", "month_before", "year_before"), ...) { @@ -62,172 +62,139 @@ gen_modified_data <- function(code = "", #----------------------------------------------------------------------------- # Processing #### - if (type == "tables") { + res <- lapply(gen_fun, function(db){ - if(gen_fun == "gen_api"){ + #--------------------------------------------------------------------------- + if (type == "tables") { par_list <- list( endpoint = "catalogue/modifieddata", - username = gen_auth_get()$username, - password = gen_auth_get()$password, + username = gen_auth_get(database = rev_database_function(db))$username, + password = gen_auth_get(database = rev_database_function(db))$password, selection = code, type = "Neue Tabellen", date = date, ... ) - } else if ( gen_fun == "gen_zensus_api"){ + results_raw <- do.call(db, par_list) - par_list <- list( - endpoint = "catalogue/modifieddata", - username = gen_zensus_auth_get()$username, - password = gen_zensus_auth_get()$password, - selection = code, - type = "Neue Tabellen", - date = date, - ... - ) + results_json <- test_if_json(results_raw) - } + test_if_error_light(results_json) - results_raw <- do.call(gen_fun, par_list) - - results_json <- test_if_json(results_raw) - - test_if_error_light(results_json) - } - - #----------------------------------------------------------------------------- - - if (type == "statistics") { + } - if(gen_fun == "gen_api"){ + #--------------------------------------------------------------------------- + if (type == "statistics") { par_list <- list( - endpoint = "catalogue/modifieddata", - username = gen_auth_get()$username, - password = gen_auth_get()$password, - selection = code, - type = "Neue Statistiken", - date = date, - ... - ) + endpoint = "catalogue/modifieddata", + username = gen_auth_get(database = rev_database_function(db))$username, + password = gen_auth_get(database = rev_database_function(db))$password, + selection = code, + type = "Neue Statistiken", + date = date, + ... + ) - } else if ( gen_fun == "gen_zensus_api"){ + results_raw <- do.call(db, par_list) - par_list <- list( - endpoint = "catalogue/modifieddata", - username = gen_zensus_auth_get()$username, - password = gen_zensus_auth_get()$password, - selection = code, - type = "Neue Statistiken", - date = date, - ... - ) + results_json <- test_if_json(results_raw) + test_if_error_light(results_json) } - results_raw <- do.call(gen_fun, par_list) + #--------------------------------------------------------------------------- + if (type == "statisticsUpdates") { - results_json <- test_if_json(results_raw) + if(db == "gen_api" | db == "gen_api_regio"){ - test_if_error_light(results_json) - } - - #----------------------------------------------------------------------------- + par_list <- list( + endpoint = "catalogue/modifieddata", + username = gen_auth_get(database = rev_database_function(db))$username, + password = gen_auth_get(database = rev_database_function(db))$password, + selection = code, + type = "Aktualisierte Statistiken", + date = date, + ... + ) - if (type == "statisticsUpdates") { + } - if(gen_fun == "gen_api"){ + results_raw <- do.call(db, par_list) - par_list <- list( - endpoint = "catalogue/modifieddata", - username = gen_auth_get()$username, - password = gen_auth_get()$password, - selection = code, - type = "Aktualisierte Statistiken", - date = date, - ... - ) + results_json <- test_if_json(results_raw) + test_if_error_light(results_json) } - results_raw <- do.call(gen_fun, par_list) - - results_json <- test_if_json(results_raw) - - test_if_error_light(results_json) - } - - #----------------------------------------------------------------------------- - - if (type == "all") { - - if(gen_fun == "gen_api"){ + #--------------------------------------------------------------------------- + if (type == "all") { par_list <- list( endpoint = "catalogue/modifieddata", - username = gen_auth_get()$username, - password = gen_auth_get()$password, + username = gen_auth_get(database = rev_database_function(db))$username, + password = gen_auth_get(database = rev_database_function(db))$password, selection = code, type = "all", date = date, ... ) - } else if ( gen_fun == "gen_zensus_api"){ + results_raw <- do.call(db, par_list) - par_list <- list( - endpoint = "catalogue/modifieddata", - username = gen_zensus_auth_get()$username, - password = gen_zensus_auth_get()$password, - selection = code, - type = "all", - date = date, - ... - ) + results_json <- test_if_json(results_raw) + + test_if_error_light(results_json) } - results_raw <- do.call(gen_fun, par_list) - results_json <- test_if_json(results_raw) + if (is.null(unlist(results_json$List))) { - test_if_error_light(results_json) - } + message(paste0("No modified objects found for your code and date in ", rev_database_function(db))) - #----------------------------------------------------------------------------- + return(NULL) + + } else { - if (is.null(unlist(results_json$List))) { + table <- binding_lapply(results_json$List, + characteristics = c("Code", + "Content", + "Date", + "Added", + "Type")) - message("No modified objects found for your code and date.") - } else { + table$Date <- as.Date.character(table$Date, format = "%d.%m.%Y") - table <- binding_lapply(results_json$List, - characteristics = c("Code", - "Content", - "Date", - "Added", - "Type")) + table <- tibble::as_tibble(table) + table <- table[order(table$Date, decreasing = TRUE), ] + list_resp <- list("Modified" = table) - table$Date <- as.Date.character(table$Date, format = "%d.%m.%Y") + attr(list_resp, "Code") <- results_json$Parameter$selection + attr(list_resp, "Database") <- rev_database_function(db) + attr(list_resp, "Type") <- results_json$Parameter$type + attr(list_resp, "Date") <- results_json$Parameter$date + attr(list_resp, "Language") <- results_json$Parameter$language + attr(list_resp, "Pagelength") <- results_json$Parameter$pagelength + attr(list_resp, "Copyright") <- results_json$Copyright - table <- tibble::as_tibble(table) - table <- table[order(table$Date, decreasing = TRUE), ] + return(list_resp) - list_resp <- list("Modified" = table) + } + }) - attr(list_resp, "Code") <- results_json$Parameter$selection - attr(list_resp, "Database") <- database[1] - attr(list_resp, "Type") <- results_json$Parameter$type - attr(list_resp, "Date") <- results_json$Parameter$date - attr(list_resp, "Language") <- results_json$Parameter$language - attr(list_resp, "Pagelength") <- results_json$Parameter$pagelength - attr(list_resp, "Copyright") <- results_json$Copyright + #----------------------------------------------------------------------------- - return(list_resp) + if(!is.null(unlist(res))){ + + res <- check_results(res) + + return(res) } + } diff --git a/R/gen_objects2stat.R b/R/gen_objects2stat.R index 7799e57..b8e5f65 100644 --- a/R/gen_objects2stat.R +++ b/R/gen_objects2stat.R @@ -26,7 +26,7 @@ #' } #' gen_objects2stat <- function(code = NULL, - database = c("genesis", "zensus"), + database = c("all", "genesis", "zensus", "regio"), category = c("tables", "variables", "cubes"), area = c("all", "public", "user"), detailed = FALSE, @@ -52,42 +52,30 @@ gen_objects2stat <- function(code = NULL, sortcriterion <- match.arg(sortcriterion) - #------------------------------------------------------------------------------- + #----------------------------------------------------------------------------- - if ("tables" %in% category) { + res <- lapply(gen_fun, function(db){ - if(gen_fun == "gen_api"){ + #--------------------------------------------------------------------------- + if ("tables" %in% category) { par_list <- list( - endpoint = "catalogue/tables2statistic", - username = gen_auth_get()$username, - password = gen_auth_get()$password, - name = code, - area = area, - sortcriterion = sortcriterion, - ... - ) + endpoint = "catalogue/tables2statistic", + username = gen_auth_get(database = rev_database_function(db))$username, + password = gen_auth_get(database = rev_database_function(db))$password, + name = code, + area = area, + sortcriterion = sortcriterion, + ... + ) - } else if ( gen_fun == "gen_zensus_api"){ - - par_list <- list( - endpoint = "catalogue/tables2statistic", - username = gen_zensus_auth_get()$username, - password = gen_zensus_auth_get()$password, - name = code, - area = area, - sortcriterion = sortcriterion, - ... - ) - - } - - results_raw <- do.call(gen_fun, par_list) + results_raw <- do.call(db, par_list) results_json <- test_if_json(results_raw) empty_object <- test_if_error(results_json, para = error.ignore) + if(isTRUE(empty_object)){ df_tables <- "No 'tables' object found for your request." @@ -100,180 +88,172 @@ gen_objects2stat <- function(code = NULL, if (isTRUE(detailed)) { - df_tables <- binding_lapply(results_json$List, - characteristics = c("Code", - "Content", - "Time")) + df_tables <- binding_lapply(results_json$List, + characteristics = c("Code", + "Content", + "Time")) - } else { + } else { - df_tables <- binding_lapply(results_json$List, - characteristics = c("Code", - "Content")) - } + df_tables <- binding_lapply(results_json$List, + characteristics = c("Code", + "Content")) + } - df_tables$Object_Type <- "Table" + df_tables$Object_Type <- "Table" - df_tables <- tibble::as_tibble(df_tables) + df_tables <- tibble::as_tibble(df_tables) } - } - #----------------------------------------------------------------------------- - - if ("variables" %in% category) { + } - if(gen_fun == "gen_api"){ + #--------------------------------------------------------------------------- + if ("variables" %in% category) { - par_list <- list( - endpoint = "catalogue/variables2statistic", - username = gen_auth_get()$username, - password = gen_auth_get()$password, - name = code, - area = area, - sortcriterion = sortcriterion, - ... - ) + par_list <- list( + endpoint = "catalogue/variables2statistic", + username = gen_auth_get(database = rev_database_function(db))$username, + password = gen_auth_get(database = rev_database_function(db))$password, + name = code, + area = area, + sortcriterion = sortcriterion, + ... + ) - } else if ( gen_fun == "gen_zensus_api"){ + results_raw <- do.call(db, par_list) - par_list <- list( - endpoint = "catalogue/variables2statistic", - username = gen_zensus_auth_get()$username, - password = gen_zensus_auth_get()$password, - name = code, - sortcriterion = sortcriterion, - ... - ) + results_json <- test_if_json(results_raw) - } + empty_object <- test_if_error(results_json, para = error.ignore) - results_raw <- do.call(gen_fun, par_list) - results_json <- test_if_json(results_raw) + if(isTRUE(empty_object)){ - empty_object <- test_if_error(results_json, para = error.ignore) + df_variables <- "No 'variables' object found for your request." - if(isTRUE(empty_object)){ + } else if(isFALSE(empty_object)){ - df_variables <- "No 'variables' object found for your request." + df_variables <- results_json$Status$Content - } else if(isFALSE(empty_object)){ + } else if(empty_object == "DONE"){ - df_variables <- results_json$Status$Content + if (detailed == TRUE) { - } else if(empty_object == "DONE"){ + df_variables <- binding_lapply(results_json$List, + characteristics = c("Code", + "Content", + "Type", + "Values", + "Information")) - if (detailed == TRUE) { + } else { - df_variables <- binding_lapply(results_json$List, - characteristics = c("Code", - "Content", - "Type", - "Values", - "Information")) + df_variables <- binding_lapply(results_json$List, + characteristics = c("Code", + "Content")) - } else { + } - df_variables <- binding_lapply(results_json$List, - characteristics = c("Code", - "Content")) + df_variables$Object_Type <- "Variable" + df_variables <- tibble::as_tibble(df_variables) + } } - df_variables$Object_Type <- "Variable" + #--------------------------------------------------------------------------- + if ("cubes" %in% category && "gen_zensus_api" == db) { - df_variables <- tibble::as_tibble(df_variables) - } - } + df_cubes <- "No 'cubes' object available for 'zensus'-database." - #----------------------------------------------------------------------------- + return(df_cubes) - if ("cubes" %in% category && gen_fun == "gen_zensus_api") { + } else if ("cubes" %in% category && "gen_api" == db) { - df_cubes <- "No 'cubes' object available for 'zensus'-database." + results_raw <- do.call(db, list( + endpoint = "catalogue/cubes2statistic", + username = gen_auth_get(database = rev_database_function(db))$username, + password = gen_auth_get(database = rev_database_function(db))$password, + name = code, + area = area, + sortcriterion = sortcriterion, + ... + )) - return(df_cubes) + results_json <- test_if_json(results_raw) - } else if ("cubes" %in% category && gen_fun == "gen_api") { + empty_object <- test_if_error(results_json, para = error.ignore) - results_raw <- do.call(gen_fun, list( - endpoint = "catalogue/cubes2statistic", - username = gen_auth_get()$username, - password = gen_auth_get()$password, - name = code, - area = area, - sortcriterion = sortcriterion, - ... - )) + if(isTRUE(empty_object)){ - results_json <- test_if_json(results_raw) + df_cubes <- "No 'cubes' object found for your request." - empty_object <- test_if_error(results_json, para = error.ignore) + } else if(isFALSE(empty_object)){ - if(isTRUE(empty_object)){ + df_cubes <- results_json$Status$Content - df_cubes <- "No 'cubes' object found for your request." + } else if(empty_object == "DONE"){ - } else if(isFALSE(empty_object)){ + if (isTRUE(detailed)) { - df_cubes <- results_json$Status$Content + df_cubes <- binding_lapply(results_json$List, + characteristics = c("Code", + "Content", + "Time", + "State", + "LatestUpdate", + "Information")) - } else if(empty_object == "DONE"){ + } else { - if (isTRUE(detailed)) { + df_cubes <- binding_lapply(results_json$List, + characteristics = c("Code", + "Content")) - df_cubes <- binding_lapply(results_json$List, - characteristics = c("Code", - "Content", - "Time", - "State", - "LatestUpdate", - "Information")) + } - } else { + df_cubes$Object_Type <- "Cube" - df_cubes <- binding_lapply(results_json$List, - characteristics = c("Code", - "Content")) + df_cubes <- tibble::as_tibble(df_cubes) + } + } - } + #--------------------------------------------------------------------------- + # Summary + if (all(c("tables", "variables", "cubes") %in% category)) { - df_cubes$Object_Type <- "Cube" + list_resp <- list( + "Tables" = df_tables, + "Variables" = df_variables, + "Cubes" = df_cubes) - df_cubes <- tibble::as_tibble(df_cubes) - } - } + } else if (category == "tables") { - #----------------------------------------------------------------------------- + list_resp <- df_tables - # Summary #### - if (all(c("tables", "variables", "cubes") %in% category)) { + } else if (category == "variables") { - list_resp <- list( - "Tables" = df_tables, - "Variables" = df_variables, - "Cubes" = df_cubes) + list_resp <- df_variables - } else if (category == "tables") { + } else if (category == "cubes") { - list_resp <- df_tables + list_resp <- df_cubes + } - } else if (category == "variables") { + attr(list_resp, "Code") <- results_json$Parameter$term + attr(list_resp, "Database") <- rev_database_function(db) + attr(list_resp, "Category") <- category + attr(list_resp, "Language") <- results_json$Parameter$language + attr(list_resp, "Pagelength") <- results_json$Parameter$pagelength + attr(list_resp, "Copyright") <- results_json$Copyright - list_resp <- df_variables + return(list_resp) - } else if (category == "cubes") { + }) - list_resp <- df_cubes - } + #----------------------------------------------------------------------------- - attr(list_resp, "Code") <- results_json$Parameter$term - attr(list_resp, "Database") <- database[1] - attr(list_resp, "Category") <- category - attr(list_resp, "Language") <- results_json$Parameter$language - attr(list_resp, "Pagelength") <- results_json$Parameter$pagelength - attr(list_resp, "Copyright") <- results_json$Copyright + res <- check_results(res) - return(list_resp) + return(res) } diff --git a/R/gen_objects2var.R b/R/gen_objects2var.R index 0817918..3f255a4 100644 --- a/R/gen_objects2var.R +++ b/R/gen_objects2var.R @@ -26,7 +26,7 @@ #' } #' gen_objects2var <- function(code = NULL, - database = c("genesis", "zensus"), + database = c("all", "genesis", "zensus", "regio"), category = c("tables", "statistics", "cubes"), area = c("all", "public", "user"), detailed = FALSE, @@ -54,227 +54,207 @@ gen_objects2var <- function(code = NULL, #----------------------------------------------------------------------------- - if ("tables" %in% category) { + res <- lapply(gen_fun, function(db){ - if(gen_fun == "gen_api"){ + #--------------------------------------------------------------------------- + if ("tables" %in% category) { par_list <- list( endpoint = "catalogue/tables2variable", - username = gen_auth_get()$username, - password = gen_auth_get()$password, + username = gen_auth_get(database = rev_database_function(db))$username, + password = gen_auth_get(database = rev_database_function(db))$password, name = code, area = area, sortcriterion = sortcriterion, ... ) - } else if ( gen_fun == "gen_zensus_api"){ + results_raw <- do.call(db, par_list) - par_list <- list( - endpoint = "catalogue/tables2variable", - username = gen_zensus_auth_get()$username, - password = gen_zensus_auth_get()$password, - name = code, - area = area, - sortcriterion = sortcriterion, - ... - ) - - } + results_json <- test_if_json(results_raw) - results_raw <- do.call(gen_fun, par_list) + empty_object <- test_if_error(results_json, para = error.ignore) - results_json <- test_if_json(results_raw) - empty_object <- test_if_error(results_json, para = error.ignore) + if(isTRUE(empty_object)){ - if(isTRUE(empty_object)){ + df_tables <- "No 'tables' object found for your request." - df_tables <- "No 'tables' object found for your request." + } else if(isFALSE(empty_object)){ - } else if(isFALSE(empty_object)){ + df_tables <- results_json$Status$Content - df_tables <- results_json$Status$Content + } else if(empty_object == "DONE"){ - } else if(empty_object == "DONE"){ + if (isTRUE(detailed)) { - if (isTRUE(detailed)) { - - df_tables <- binding_lapply(results_json$List, + df_tables <- binding_lapply(results_json$List, characteristics = c("Code", "Content", "Time")) - } else { + } else { - df_tables <- binding_lapply(results_json$List, - characteristics = c("Code", - "Content")) + df_tables <- binding_lapply(results_json$List, + characteristics = c("Code", + "Content")) - } + } - df_tables$Object_Type <- "Table" + df_tables$Object_Type <- "Table" - df_tables <- tibble::as_tibble(df_tables) + df_tables <- tibble::as_tibble(df_tables) + } } - } - - #----------------------------------------------------------------------------- - if ("statistics" %in% category) { - - if(gen_fun == "gen_api"){ + #--------------------------------------------------------------------------- + if ("statistics" %in% category) { par_list <- list( endpoint = "catalogue/statistics2variable", - username = gen_auth_get()$username, - password = gen_auth_get()$password, + username = gen_auth_get(database = rev_database_function(db))$username, + password = gen_auth_get(database = rev_database_function(db))$password, name = code, area = area, sortcriterion = sortcriterion, ... ) - } else if ( gen_fun == "gen_zensus_api"){ + results_raw <- do.call(db, par_list) - par_list <- list( - endpoint = "catalogue/statistics2variable", - username = gen_zensus_auth_get()$username, - password = gen_zensus_auth_get()$password, - name = code, - sortcriterion = sortcriterion, - ... - ) + results_json <- test_if_json(results_raw) - } + empty_object <- test_if_error(results_json, para = error.ignore) - results_raw <- do.call(gen_fun, par_list) - results_json <- test_if_json(results_raw) + if(isTRUE(empty_object)){ - empty_object <- test_if_error(results_json, para = error.ignore) + df_statistics <- "No 'statistics' object found for your request." - if(isTRUE(empty_object)){ + } else if(isFALSE(empty_object)){ - df_statistics <- "No 'statistics' object found for your request." + df_statistics <- results_json$Status$Content - } else if(isFALSE(empty_object)){ + } else if(empty_object == "DONE"){ - df_statistics <- results_json$Status$Content + if (isTRUE(detailed)) { - } else if(empty_object == "DONE"){ + df_statistics <- binding_lapply(results_json$List, + characteristics = c("Code", + "Content", + "Cubes", + "Information")) - if (isTRUE(detailed)) { + } else { - df_statistics <- binding_lapply(results_json$List, - characteristics = c("Code", - "Content", - "Cubes", - "Information")) + df_statistics <- binding_lapply(results_json$List, + characteristics = c("Code", + "Content")) + } - } else { + df_statistics$Object_Type <- "Statistic" - df_statistics <- binding_lapply(results_json$List, - characteristics = c("Code", - "Content")) + df_statistics <- tibble::as_tibble(df_statistics) + } } - df_statistics$Object_Type <- "Statistic" + #--------------------------------------------------------------------------- + if ("cubes" %in% category && db == "gen_zensus_api") { - df_statistics <- tibble::as_tibble(df_statistics) - } - } + df_cubes <- "No 'cubes' object available for 'zensus'-database." - #----------------------------------------------------------------------------- + return(df_cubes) - if ("cubes" %in% category && gen_fun == "gen_zensus_api") { + } else if ("cubes" %in% category && (db == "gen_api" || db == "gen_api_regio")) { - df_cubes <- "No 'cubes' object available for 'zensus'-database." + results_raw <- do.call(db, list( + endpoint = "catalogue/timeseries2variable", + username = gen_auth_get(database = rev_database_function(db))$username, + password = gen_auth_get(database = rev_database_function(db))$password, + name = code, + area = area, + sortcriterion = sortcriterion, + ... + )) - return(df_cubes) + results_json <- test_if_json(results_raw) - } else if ("cubes" %in% category && gen_fun == "gen_api") { + empty_object <- test_if_error(results_json, para = error.ignore) - results_raw <- do.call(gen_fun, list( - endpoint = "catalogue/timeseries2variable", - username = gen_auth_get()$username, - password = gen_auth_get()$password, - name = code, - area = area, - sortcriterion = sortcriterion, - ... - )) - results_json <- test_if_json(results_raw) + if(isTRUE(empty_object)){ - empty_object <- test_if_error(results_json, para = error.ignore) + df_cubes <- "No 'cubes' object found for your request." - if(isTRUE(empty_object)){ + } else if(isFALSE(empty_object)){ - df_cubes <- "No 'cubes' object found for your request." + df_cubes <- results_json$Status$Content - } else if(isFALSE(empty_object)){ + } else if(empty_object == "DONE"){ - df_cubes <- results_json$Status$Content + if (isTRUE(detailed)) { - } else if(empty_object == "DONE"){ + df_cubes <- binding_lapply(results_json$List, + characteristics = c("Code", + "Content", + "Time", + "State", + "LatestUpdate", + "Information")) - if (isTRUE(detailed)) { + } else { - df_cubes <- binding_lapply(results_json$List, - characteristics = c("Code", - "Content", - "Time", - "State", - "LatestUpdate", - "Information")) + df_cubes <- binding_lapply(results_json$List, + characteristics = c("Code", + "Content")) + } - } else { + df_cubes$Object_Type <- "Cube" - df_cubes <- binding_lapply(results_json$List, - characteristics = c("Code", - "Content")) + df_cubes <- tibble::as_tibble(df_cubes) + } } - df_cubes$Object_Type <- "Cube" + #--------------------------------------------------------------------------- + # Summary + if (all(c("tables", "statistics", "cubes") %in% category)) { - df_cubes <- tibble::as_tibble(df_cubes) - } - } + list_resp <- list( + "Tables" = df_tables, + "Statistics" = df_statistics, + "Cubes" = df_cubes + ) - #----------------------------------------------------------------------------- + } else if (category == "tables") { + + list_resp <- df_tables - # Summary #### - if (all(c("tables", "statistics", "cubes") %in% category)) { + } else if (category == "statistics") { - list_resp <- list( - "Tables" = df_tables, - "Statistics" = df_statistics, - "Cubes" = df_cubes - ) + list_resp <- df_statistics - } else if (category == "tables") { + } else if (category == "cubes") { - list_resp <- df_tables + list_resp <- df_cubes - } else if (category == "statistics") { + } - list_resp <- df_statistics + attr(list_resp, "Code") <- results_json$Parameter$term + attr(list_resp, "Database") <- rev_database_function(db) + attr(list_resp, "Category") <- category + attr(list_resp, "Language") <- results_json$Parameter$language + attr(list_resp, "Pagelength") <- results_json$Parameter$pagelength + attr(list_resp, "Copyright") <- results_json$Copyright - } else if (category == "cubes") { + return(list_resp) - list_resp <- df_cubes + }) - } + #----------------------------------------------------------------------------- - attr(list_resp, "Code") <- results_json$Parameter$term - attr(list_resp, "Database") <- database[1] - attr(list_resp, "Category") <- category - attr(list_resp, "Language") <- results_json$Parameter$language - attr(list_resp, "Pagelength") <- results_json$Parameter$pagelength - attr(list_resp, "Copyright") <- results_json$Copyright + res <- check_results(res) - return(list_resp) + return(res) } diff --git a/R/gen_qualitysigns.R b/R/gen_qualitysigns.R index 9efc716..edf7c79 100644 --- a/R/gen_qualitysigns.R +++ b/R/gen_qualitysigns.R @@ -1,6 +1,6 @@ #' gen_signs: Explore Meaning of Special Signs in the Objects #' -#' @description Function to list all current used special signs (e.g., 0, *, X, (), p, ...) and their meaning in Genesis or Zensus. +#' @description Function to list all current used special signs (e.g., 0, *, X, (), p, ...) and their meaning in Genesis, Zensus, and/or regio. #' #' @param database Character string. Indicator if the Genesis or Zensus database is called. Default option is 'genesis'. #' @param ... Additional parameters for the Genesis/Zensus API call. These parameters are only affecting the Genesis/Zensus call itself, no further processing. For more details see `vignette("additional_parameter")`. @@ -8,40 +8,36 @@ #' @return A list of all current used special signs. #' @export #' -gen_signs <- function(database = c("genesis", "zensus"), +gen_signs <- function(database = c("all", "genesis", "zensus", "regio"), ... -) { + ) { gen_fun <- test_database_function(database) - if(gen_fun == "gen_api"){ + res <- lapply(gen_fun, function(db){ par_list <- list( endpoint = "catalogue/qualitysigns", ... ) - } else if ( gen_fun == "gen_zensus_api"){ + results_raw <- do.call(db, par_list) - par_list <- list( - endpoint = "catalogue/qualitysigns", - ... - ) - - } + results_json <- test_if_json(results_raw) - results_raw <- do.call(gen_fun, par_list) + mid_res <- list("Output" = tibble::as_tibble(binding_lapply(results_json$List, + characteristics = c("Code", + "Content")))) - results_json <- test_if_json(results_raw) + attr(mid_res, "Database") <- rev_database_function(db) + attr(mid_res, "Language") <- results_json$Parameter$language + attr(mid_res, "Copyright") <- results_json$Copyright - res <- list("Output" = tibble::as_tibble(binding_lapply(results_json$List, - characteristics = c("Code", - "Content")))) + return(mid_res) + }) - attr(res, "Database") <- database[1] - attr(res, "Language") <- results_json$Parameter$language - attr(res, "Copyright") <- results_json$Copyright + res <- check_results(res) return(res) diff --git a/R/gen_update_EVAS.R b/R/gen_update_EVAS.R new file mode 100644 index 0000000..db68b58 --- /dev/null +++ b/R/gen_update_EVAS.R @@ -0,0 +1,36 @@ +#' gen_update_EVAS: Update the EVAS numbers used in the gen_catalogue function +#' +#' @description Function to web scrape the EVAS numbers from the EVAS website and save them as a RData file. +#' +#' @return An update RData file containing the EVAS numbers. +#' @export +#' +gen_update_EVAS <- function(){ + + # Path selection + data_path <- system.file("data", "EVAS_numbers.RData", package = "restatis") + + # Load the data object + data("EVAS_numbers", package = "restatis") + + # Define the src URL of the EVAS numbers + url <- "https://erhebungsdatenbank.estatistik.de/eid/TabelleEvas.jsp" + + # Read the HTML content of the URL + html <- read_html(url) + html <- html_nodes(html, "table") + html <- map_dfr(html, html_table, convert = FALSE) + html <- html[, c("EVAS", "Beschreibung")] + html$Titel <- paste(html$EVAS, html$Beschreibung, sep = " - ") + attr(html, "Update_Date") <- format(Sys.Date(), "%Y%m%d") + + # Modify the data object + html <- html + + # Return the modified data object + save(html ,file = data_path) +} + + + + diff --git a/R/gen_var2-val2.R b/R/gen_var2-val2.R index a8de794..d847af9 100644 --- a/R/gen_var2-val2.R +++ b/R/gen_var2-val2.R @@ -21,7 +21,7 @@ #' } #' gen_var2stat <- function(code = NULL, - database = c("genesis", "zensus"), + database = c("all", "genesis", "zensus", "regio"), area = c("all", "public", "user"), detailed = FALSE, sortcriterion = c("code", "content"), @@ -48,75 +48,74 @@ gen_var2stat <- function(code = NULL, #----------------------------------------------------------------------------- # Processing #### - if(gen_fun == "gen_api"){ + res <- lapply(gen_fun, function(db){ + #--------------------------------------------------------------------------- par_list <- list( endpoint = "catalogue/variables2statistic", - username = gen_auth_get()$username, - password = gen_auth_get()$password, + username = gen_auth_get(database = rev_database_function(db))$username, + password = gen_auth_get(database = rev_database_function(db))$password, name = code, - area = area, - sortcriterion = sortcriterion, ... ) - } else if ( gen_fun == "gen_zensus_api"){ + if(db == "gen_api" | db == "gen_regio_api"){ + par_list <- append(par_list, list(area = area)) + } - par_list <- list( - endpoint = "catalogue/variables2statistic", - username = gen_zensus_auth_get()$username, - password = gen_zensus_auth_get()$password, - name = code, - sortcriterion = sortcriterion, - ... - ) + results_raw <- do.call(gen_fun, par_list) + + results_json <- test_if_json(results_raw) - } + empty_object <- test_if_error(results_json, para = error.ignore) - results_raw <- do.call(gen_fun, par_list) - results_json <- test_if_json(results_raw) + if(isTRUE(empty_object)){ + list_of_variables <- "No `variables`- object found for your request." + } else if(isFALSE(empty_object)){ + list_of_variables <- results_json$Status$Content + } else if(empty_object == "DONE"){ + if (isTRUE(detailed)) { - empty_object <- test_if_error(results_json, para = error.ignore) + list_of_variables <- binding_lapply(results_json$List, + characteristics = c("Code", + "Content", + "Type", + "Values", + "Information")) - if(isTRUE(empty_object)){ - list_of_variables <- "No `variables`- object found for your request." - } else if(isFALSE(empty_object)){ - list_of_variables <- results_json$Status$Content - } else if(empty_object == "DONE"){ - if (isTRUE(detailed)) { + } else { - list_of_variables <- binding_lapply(results_json$List, - characteristics = c("Code", - "Content", - "Type", - "Values", - "Information")) + list_of_variables <- binding_lapply(results_json$List, + characteristics = c("Code", + "Content" + )) - } else { + } - list_of_variables <- binding_lapply(results_json$List, - characteristics = c("Code", - "Content" - )) + list_of_variables$Object_Type <- "Variable" - } + list_of_variables <- tibble::as_tibble(list_of_variables) + } - list_of_variables$Object_Type <- "Variable" + #--------------------------------------------------------------------------- + # Summary #### + list_resp <- list("Variables" = list_of_variables) - list_of_variables <- tibble::as_tibble(list_of_variables) - } + attr(list_resp, "Code") <- results_json$Parameter$name + attr(list_resp, "Database") <- rev_database_function(db) + attr(list_resp, "Language") <- results_json$Parameter$language + attr(list_resp, "Pagelength") <- results_json$Parameter$pagelength + attr(list_resp, "Copyright") <- results_json$Copyright - # Summary #### - list_resp <- list("Variables" = list_of_variables) + return(list_resp) + + }) - attr(list_resp, "Code") <- results_json$Parameter$name - attr(list_resp, "Database") <- database[1] - attr(list_resp, "Language") <- results_json$Parameter$language - attr(list_resp, "Pagelength") <- results_json$Parameter$pagelength - attr(list_resp, "Copyright") <- results_json$Copyright + #----------------------------------------------------------------------------- + res <- check_results(res) - return(list_resp) + return(res) } @@ -143,7 +142,7 @@ gen_var2stat <- function(code = NULL, #' } #' gen_val2var <- function(code = NULL, - database = c("genesis", "zensus"), + database = c("all", "genesis", "zensus", "regio"), area = c("all", "public", "user"), sortcriterion = c("code", "content"), error.ignore = FALSE, @@ -168,69 +167,67 @@ gen_val2var <- function(code = NULL, embedding <- list(...)$frame #----------------------------------------------------------------------------- - if(gen_fun == "gen_api"){ + + res <- lapply(gen_fun, function(db){ par_list <- list( endpoint = "catalogue/values2variable", - username = gen_auth_get()$username, - password = gen_auth_get()$password, + username = gen_auth_get(database = rev_database_function(db))$username, + password = gen_auth_get(database = rev_database_function(db))$password, name = code, - area = area, - sortcriterion = sortcriterion, ... ) - } else if ( gen_fun == "gen_zensus_api"){ + if(db == "gen_api" | db == "gen_regio_api"){ + par_list <- append(par_list, list(area = area)) + } - par_list <- list( - endpoint = "catalogue/values2variable", - username = gen_zensus_auth_get()$username, - password = gen_zensus_auth_get()$password, - name = code, - sortcriterion = sortcriterion, - ... - ) + results_raw <- do.call(gen_fun, par_list) - } + results_json <- test_if_json(results_raw) - results_raw <- do.call(gen_fun, par_list) + if(isTRUE(grepl("gen_val2var2stat", embedding))){ + empty_object <- test_if_error_variables(results_json, para = error.ignore) + } else { + empty_object <- test_if_error(results_json, para = error.ignore) + } - results_json <- test_if_json(results_raw) + if(isTRUE(empty_object)){ + list_of_variables <- "No `values`- object found for your request." + } else if(isFALSE(empty_object)){ + list_of_variables <- results_json$Status$Content + } else if(empty_object == "DONE"){ + list_of_variables <- binding_lapply(results_json$List, + characteristics = c("Code", + "Content", + "Variables", + "Information")) - if(isTRUE(grepl("gen_val2var2stat", embedding))){ - empty_object <- test_if_error_variables(results_json, para = error.ignore) - } else { - empty_object <- test_if_error(results_json, para = error.ignore) - } + list_of_variables$Object_Type <- "Value" + + list_of_variables <- tibble::as_tibble(list_of_variables) - if(isTRUE(empty_object)){ - list_of_variables <- "No `values`- object found for your request." - } else if(isFALSE(empty_object)){ - list_of_variables <- results_json$Status$Content - } else if(empty_object == "DONE"){ - list_of_variables <- binding_lapply(results_json$List, - characteristics = c("Code", - "Content", - "Variables", - "Information")) + } - list_of_variables$Object_Type <- "Value" + list_resp <- list("Values" = list_of_variables) - list_of_variables <- tibble::as_tibble(list_of_variables) + attr(list_resp, "Name") <- results_json$Parameter$name + attr(list_resp, "Database") <- rev_database_function(db) + attr(list_resp, "Language") <- results_json$Parameter$language + attr(list_resp, "Pagelength") <- results_json$Parameter$pagelength + attr(list_resp, "Copyright") <- results_json$Copyright - } + names(list_resp) <- paste("Values of", results_json$Parameter$name) - list_resp <- list("Values" = list_of_variables) + return(list_resp) - attr(list_resp, "Name") <- results_json$Parameter$name - attr(list_resp, "Database") <- database[1] - attr(list_resp, "Language") <- results_json$Parameter$language - attr(list_resp, "Pagelength") <- results_json$Parameter$pagelength - attr(list_resp, "Copyright") <- results_json$Copyright + }) + + #----------------------------------------------------------------------------- - names(list_resp) <- paste("Values of", results_json$Parameter$name) + res <- check_results(res) - return(list_resp) + return(res) } @@ -259,13 +256,15 @@ gen_val2var <- function(code = NULL, #' } #' gen_val2var2stat <- function(code = NULL, - database = c("genesis", "zensus"), + database = c("all", "genesis", "zensus", "regio"), area = c("all", "public", "user"), detailed = FALSE, sortcriterion = c("code", "content"), error.ignore = FALSE, ...) { + caller <- as.character(match.call()[1]) + check_function_input(code = code, error.ignore = error.ignore, sortcriterion = sortcriterion, @@ -278,31 +277,41 @@ gen_val2var2stat <- function(code = NULL, #----------------------------------------------------------------------------- - variables <- suppressMessages(suppressWarnings(gen_var2stat(code = code, - database = database, - area = area, - detailed = detailed, - sortcriterion = sortcriterion, - error.ignore = error.ignore, - ...))) + res <- lapply(database, function(db){ + + variables <- suppressMessages(suppressWarnings(gen_var2stat(code = code, + database = db, + area = area, + detailed = detailed, + sortcriterion = sortcriterion, + error.ignore = error.ignore, + ...))) - list_values <- list() + list_values <- list() - lapply(variables$Variables$Code, function(x) { + lapply(variables$Variables$Code, function(x) { - zwisch <- suppressMessages(suppressWarnings(gen_val2var(code = x, - database = database, - area = area, - sortcriterion = sortcriterion, - error.ignore = error.ignore, - frame = embedding))) - list_values <<- append(list_values, zwisch) + zwisch <- suppressMessages(suppressWarnings(gen_val2var(code = x, + database = db, + area = area, + sortcriterion = sortcriterion, + error.ignore = error.ignore, + frame = embedding))) + list_values <<- append(list_values, zwisch) + + }) + + list_resp <- list(variables, list_values) + + return(list_resp) }) - list_resp <- list(variables, list_values) + #----------------------------------------------------------------------------- + + res <- check_results(res) - return(list_resp) + return(res) } @@ -328,7 +337,7 @@ gen_val2var2stat <- function(code = NULL, #' } #' gen_search_vars <- function(code = NULL, - database = c("genesis", "zensus"), + database = c("all", "genesis", "zensus", "regio"), area = c("all", "public", "user"), sortcriterion = c("code", "content"), error.ignore = FALSE, @@ -352,61 +361,60 @@ gen_search_vars <- function(code = NULL, #----------------------------------------------------------------------------- - if(gen_fun == "gen_api"){ + res <- lapply(gen_fun, function(db){ + #--------------------------------------------------------------------------- par_list <- list( endpoint = "catalogue/variables", - username = gen_auth_get()$username, - password = gen_auth_get()$password, + username = gen_zensus_auth_get(database = rev_database_function(db))$username, + password = gen_zensus_auth_get(database = rev_database_function(db))$password, selection = code, sortcriterion = sortcriterion, - area = area, ... ) - } else if ( gen_fun == "gen_zensus_api"){ + if(db == "gen_api" | db == "gen_regio_api"){ + par_list <- append(par_list, list(area = area)) + } - par_list <- list( - endpoint = "catalogue/variables", - username = gen_zensus_auth_get()$username, - password = gen_zensus_auth_get()$password, - selection = code, - sortcriterion = sortcriterion, - ... - ) + results_raw <- do.call(gen_fun, par_list) - } + results_json <- test_if_json(results_raw) - results_raw <- do.call(gen_fun, par_list) + empty_object <- test_if_error(results_json, para = error.ignore) + + if(isTRUE(empty_object)){ + list_of_variables <- "No `variables`- object found for your request." + } else if(isFALSE(empty_object)){ + list_of_variables <- results_json$Status$Content + } else if(empty_object == "DONE"){ + list_of_variables <- binding_lapply(results_json$List, + characteristics = c("Code", + "Content", + "Type", + "Information")) - results_json <- test_if_json(results_raw) + list_of_variables$Object_Type <- "Variable" - empty_object <- test_if_error(results_json, para = error.ignore) + list_of_variables <- tibble::as_tibble(list_of_variables) + } - if(isTRUE(empty_object)){ - list_of_variables <- "No `variables`- object found for your request." - } else if(isFALSE(empty_object)){ - list_of_variables <- results_json$Status$Content - } else if(empty_object == "DONE"){ - list_of_variables <- binding_lapply(results_json$List, - characteristics = c("Code", - "Content", - "Type", - "Information")) + list_resp <- list("Variables" = list_of_variables) - list_of_variables$Object_Type <- "Variable" + attr(list_resp, "Code") <- results_json$Parameter$selection + attr(list_resp, "Database") <- database[1] + attr(list_resp, "Language") <- results_json$Parameter$language + attr(list_resp, "Pagelength") <- results_json$Parameter$pagelength + attr(list_resp, "Copyright") <- results_json$Copyright - list_of_variables <- tibble::as_tibble(list_of_variables) - } + return(list_resp) - list_resp <- list("Variables" = list_of_variables) + }) + + #----------------------------------------------------------------------------- - attr(list_resp, "Code") <- results_json$Parameter$selection - attr(list_resp, "Database") <- database[1] - attr(list_resp, "Language") <- results_json$Parameter$language - attr(list_resp, "Pagelength") <- results_json$Parameter$pagelength - attr(list_resp, "Copyright") <- results_json$Copyright + res <- check_results(res) - return(list_resp) + return(res) } diff --git a/R/gen_zensus_api.R b/R/gen_zensus_api.R deleted file mode 100644 index dc611eb..0000000 --- a/R/gen_zensus_api.R +++ /dev/null @@ -1,20 +0,0 @@ -#' Low-level function to interact with the German Zensus 2022 database -#' -#' @param endpoint The endpoint of the API that is to be queried -#' -#' @importFrom httr2 `%>%` -#' -#' @noRd -#' -#' @examples -#' gen_api("helloworld/logincheck") %>% -#' httr2::resp_body_json() -#' -gen_zensus_api <- function(endpoint, ...) { - httr2::request("https://ergebnisse2011.zensus2022.de/api/rest/2020") %>% - httr2::req_user_agent("https://github.com/CorrelAid/restatis") %>% - httr2::req_url_path_append(endpoint) %>% - httr2::req_url_query(!!!gen_zensus_auth_get(), ...) %>% - httr2::req_retry(max_tries = 3) %>% - httr2::req_perform() -} diff --git a/R/gen_zensus_auth.R b/R/gen_zensus_auth.R deleted file mode 100644 index 373adae..0000000 --- a/R/gen_zensus_auth.R +++ /dev/null @@ -1,72 +0,0 @@ -#' Save credentials for the German Zensus 2022 database -#' -#' See Details. -#' -#' Zensus database username and password are encrypted and saved as RDS in the -#' package config directory. -#' -#' A random string is generated and stored in the session environment -#' variable `ZENSUS_KEY`. This string is used as the key to encrypt and -#' decrypt the entered credentials. -#' -#' To avoid having to save authentication in future sessions, `ZENSUS_KEY` can -#' be added to .Renviron. The {usethis} package includes a helper function for -#' editing .Renviron files from a R session with [usethis::edit_r_environ()]. -#' -#' @export -#' -gen_zensus_auth_save <- function() { - - username <- gen_auth_ask("username") - password <- gen_auth_ask("password") - - auth_path <- gen_auth_path("auth_zensus.rds") - - key <- httr2::secret_make_key() - - Sys.setenv(ZENSUS_KEY = key) - - message( - "Saving Zensus database credentials to ", - auth_path, - "\n\n", - "Please add the following line to your .Renviron, ", - "e.g. via `usethis::edit_r_environ()`, ", - "to use the specified username and password across sessions:\n\n", - "ZENSUS_KEY=", - key, - "\n\n" - ) - - dir.create(gen_auth_path(), showWarnings = FALSE, recursive = TRUE) - - httr2::secret_write_rds(list(username = username, password = password), - path = auth_path, - key = "ZENSUS_KEY") - - # Logincheck - perform_logincheck(database = "zensus") - -} - -#------------------------------------------------------------------------------- - -#' Check if credentials for Zensus data base are available -#' -#' @return Zensus data base key for credentials -#' -gen_zensus_auth_get <- function() { - - auth_path <- gen_auth_path("auth_zensus.rds") - - if (!(file.exists(auth_path) && nzchar(Sys.getenv("ZENSUS_KEY")))) { - - stop(paste0("Zensus database credentials not found. ", - "Please run 'gen_zensus_auth_save()' to store Zensus database username and password."), - call. = FALSE) - - } - - httr2::secret_read_rds(auth_path, "ZENSUS_KEY") - -} diff --git a/R/utils_dataprocessing.R b/R/utils_dataprocessing.R index c3c6009..29668e3 100644 --- a/R/utils_dataprocessing.R +++ b/R/utils_dataprocessing.R @@ -54,14 +54,18 @@ param_collapse_vec <- function(vec) { #' forming_evas <- function(list_of) { - evas_list_long_20220724 <- restatis::evas_list_long_20220724 + # Path selection + data_path <- system.file("data", "EVAS_numbers.RData", package = "restatis") + + # Load data + evas_list <- load(data_path) #----------------------------------------------------------------------------- # Process them list_of$Main <- apply(list_of, 1, function(x) { - obj <- evas_list_long_20220724$Titel[evas_list_long_20220724$EVAS == substr(x["Code"], 1, 1)] + obj <- evas_list$Titel[evas_list$EVAS == substr(x["Code"], 1, 1)] if(length(obj) == 0){ @@ -77,7 +81,7 @@ forming_evas <- function(list_of) { list_of$Main2 <- apply(list_of, 1, function(x) { - obj <- evas_list_long_20220724$Titel[evas_list_long_20220724$EVAS == substr(x["Code"], 1, 2)] + obj <- evas_list$Titel[evas_list$EVAS == substr(x["Code"], 1, 2)] if(length(obj) == 0){ @@ -93,7 +97,7 @@ forming_evas <- function(list_of) { list_of$Main3 <- apply(list_of, 1, function(x) { - obj <- evas_list_long_20220724$Titel[evas_list_long_20220724$EVAS == substr(x["Code"], 1, 3)] + obj <- evas_list$Titel[evas_list$EVAS == substr(x["Code"], 1, 3)] if(length(obj) == 0){ @@ -109,7 +113,7 @@ forming_evas <- function(list_of) { list_of$Main5 <- apply(list_of, 1, function(x) { - obj <- evas_list_long_20220724$Titel[evas_list_long_20220724$EVAS == substr(x["Code"], 1, 5)] + obj <- evas_list$Titel[evas_list$EVAS == substr(x["Code"], 1, 5)] if(length(obj) == 0){ @@ -276,6 +280,7 @@ check_function_input <- function(code = NULL, error.ignore = NULL, ordering = NULL, database = NULL, + area = NULL, caller = NULL) { #----------------------------------------------------------------------------- @@ -421,7 +426,7 @@ check_function_input <- function(code = NULL, #------------------------------------------------------------------------- - if(database == "gen_zensus_api"){ + if("gen_zensus_api" %in% database){ #----------------------------------------------------------------------- @@ -476,7 +481,7 @@ check_function_input <- function(code = NULL, #------------------------------------------------------------------------------- - if(database == "gen_api"){ + if("gen_api" %in% database){ if (!all(category %in% c("tables", "cubes", "statistics"))) { @@ -496,7 +501,7 @@ check_function_input <- function(code = NULL, #------------------------------------------------------------------------- - if(database == "gen_zensus_api"){ + if("gen_zensus_api" %in% database){ #----------------------------------------------------------------------- @@ -554,7 +559,7 @@ check_function_input <- function(code = NULL, #------------------------------------------------------------------------- - if(database == "gen_api"){ + if("gen_api" %in% database){ if (!all(category %in% c("tables", "cubes", "variables"))) { @@ -577,7 +582,7 @@ check_function_input <- function(code = NULL, #--------------------------------------------------------------------- - if(database == "gen_api"){ + if("gen_api" %in% database){ stop("Available categories for parameter 'category' for 'genesis'-database are 'all', 'tables', 'statistics', 'variables', and 'cubes'.", call. = FALSE) @@ -586,7 +591,7 @@ check_function_input <- function(code = NULL, #--------------------------------------------------------------------- - if(gen_fun == "gen_zensus_api"){ + if("gen_zensus_api" %in% database){ stop("Available categories for parameter 'category' for 'zensus'-database are 'all', 'tables', 'statistics', and 'variables'.", call. = FALSE) @@ -603,7 +608,7 @@ check_function_input <- function(code = NULL, #------------------------------------------------------------------------- - if(database == "gen_zensus_api"){ + if("gen_zensus_api" %in% database){ #----------------------------------------------------------------------- @@ -646,7 +651,7 @@ check_function_input <- function(code = NULL, #------------------------------------------------------------------------- - if(database == "gen_api"){ + if("gen_api" %in% database){ #----------------------------------------------------------------------- @@ -661,7 +666,7 @@ check_function_input <- function(code = NULL, #------------------------------------------------------------------------- - else if( database == "gen_zensus_api") { + else if("gen_zensus_api" %in% database) { if (!all(category %in% c("Statistic", "Table", "Variable", "Value"))) { @@ -707,7 +712,7 @@ check_function_input <- function(code = NULL, #--------------------------------------------------------------------------- - if (database == "gen_api"){ + if ("gen_api" %in% database){ #------------------------------------------------------------------------- @@ -722,7 +727,7 @@ check_function_input <- function(code = NULL, #--------------------------------------------------------------------------- - if (database == "gen_zensus_api"){ + if ("gen_zensus_api" %in% database){ if (!all(type %in% c("all", "tables", "statistics"))) { @@ -876,6 +881,28 @@ check_function_input <- function(code = NULL, } + #----------------------------------------------------------------------------- + # area ---- + if (!is.null(area)) { + + if (!is.character(area) || + length(area) != 1) { + + stop("Parameter 'area' has to be of type 'character' and of length 1.", + call. = FALSE) + + } + + #--------------------------------------------------------------------------- + + if (!area %in% c("all", "public", "user")) { + + stop("Available categories for parameter 'area' are 'all', 'public', and 'user'.") + + } + + } + } #------------------------------------------------------------------------------- @@ -992,39 +1019,81 @@ titel_search <- function(x, term) { } #------------------------------------------------------------------------------- - #' test_database_function #' #' @param input Input to test for database name #' test_database_function <- function(input){ - if(length(input) > 1){ + if(sum(is.na(input)) == length(input)){ - input <- input[1] + stop("Database parameter must be either 'genesis', 'zensus', 'regio', or 'all'.", + call. = FALSE) } - if(is.na(input)){ + res <- c() - stop("Database parameter must be either 'genesis' or 'zensus'.", - call. = FALSE) + if("genesis" %in% input){ + + res <- c(res, "genesis" = "gen_api") } - if(input == "genesis"){ + if("zensus" %in% input){ - return("gen_api") + res <- c(res, "zensus" = "gen_zensus_api") - } else if(input == "zensus"){ + } - return("gen_zensus_api") + if("regio" %in% input){ - } else { + res <- c(res, "regio" = "gen_regio_api") + + } + + if("all" %in% input){ + + res <- c("genesis" = "gen_api", "zensus" = "gen_zensus_api", "regio" = "gen_regio_api") + + } + + if (identical(res, c())){ - stop("Database parameter must be either 'genesis' or 'zensus'. No other values allowed.", + stop("Database parameter must be either 'genesis', 'zensus', 'regio', or 'all'. No other values allowed.", call. = FALSE) + } else { + + return(res) + + } + +} +#------------------------------------------------------------------------------- +#' rev_database_function +#' +#' @param input Input to test for database name +#' +rev_database_function <- function(input){ + input[which(input == "gen_api")] <- "genesis" + input[which(input == "gen_zensus_api")] <- "zensus" + input[which(input == "gen_regio_api")] <- "regio" + + return(input) +} +#------------------------------------------------------------------------------- +#' check_results +#' +#' @param input Input to test result structure +#' +check_results <- function(input){ + + if(length(input) > 1){ + return(input) + } else { + input <- input[[1]] + return(input) } } diff --git a/R/utils_httr2.R b/R/utils_httr2.R index 34c988c..32465f7 100644 --- a/R/utils_httr2.R +++ b/R/utils_httr2.R @@ -41,7 +41,20 @@ test_if_json <- function(input) { } #------------------------------------------------------------------------------- +#' test_if_okay +#' +#' @param input Response object +#' +test_if_okay <- function(input) { + + results_json <- ifelse(input$`User-Agent` == "https://github.com/CorrelAid/restatis", + "Yes", + "No" + ) + return(results_json) + +} #------------------------------------------------------------------------------- #' test_if_error_find diff --git a/data/EVAS_numbers.RData b/data/EVAS_numbers.RData new file mode 100644 index 0000000000000000000000000000000000000000..1548e9f08c0ebf5265f72886b5f3dd825da76721 GIT binary patch literal 38798 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 From 76b0ec1b481467c8625455d681f4b9437597961d Mon Sep 17 00:00:00 2001 From: KovaZo Date: Fri, 21 Jun 2024 19:54:43 +0200 Subject: [PATCH 14/52] varval error = true --- R/gen_var2-val2.R | 16 +++++++++------- 1 file changed, 9 insertions(+), 7 deletions(-) diff --git a/R/gen_var2-val2.R b/R/gen_var2-val2.R index d847af9..b232eef 100644 --- a/R/gen_var2-val2.R +++ b/R/gen_var2-val2.R @@ -129,7 +129,7 @@ gen_var2stat <- function(code = NULL, #' @param database Character string. Indicator if the Genesis or Zensus database is called. Only one database can be addressed per function call. Default option is 'genesis'. #' @param area A string. Indicator from which area of the database the results are called. In general, "all" is the appropriate solution. Default option is 'all'. Only used for Genesis. #' @param sortcriterion A string. Indicator if the output should be sorted by 'code' or 'content'. This is a parameter of the Genesis/Zensus API call itself. The default is "code". -#' @param error.ignore A logical. Indicator if the function should stop if an error occurs or no object for the request is found or if it should produce a token as response. Default option is 'FALSE'. +#' @param error.ignore A logical. Indicator if the function should stop if an error occurs or no object for the request is found or if it should produce a token as response. Default option is 'TRUE' - . #' @param ... Additional parameters for the Genesis/Zensus API call. These parameters are only affecting the Genesis/Zensus call itself, no further processing. For more details see `vignette("additional_parameter")`. #' #' @return A list with all recalled elements from Genesis/Zensus. Always includes the code of the object, the title, and the type of the object. This is done to facilitate further processing of the data. Attributes are added to the dataframe describing the search configuration for the returned output. @@ -145,7 +145,7 @@ gen_val2var <- function(code = NULL, database = c("all", "genesis", "zensus", "regio"), area = c("all", "public", "user"), sortcriterion = c("code", "content"), - error.ignore = FALSE, + error.ignore = TRUE, ...) { caller <- as.character(match.call()[1]) @@ -241,7 +241,8 @@ gen_val2var <- function(code = NULL, #' @param database Character string. Indicator if the Genesis or Zensus database is called. Only one database can be addressed per function call. Default option is 'genesis'. #' @param area A string. Indicator from which area of the database the results are called. In general, "all" is the appropriate solution. Default option is 'all'. Only used for Genesis. #' @param detailed A logical. Indicator if function should return the detailed output of the iteration including all object-related information or only a shortened output including only code and object title. This parameter only affects the details of the variables-related output. The default is FALSE. -#' @param error.ignore A logical. Indicator if the function should stop if an error occurs or no object for the request is found or if it should produce a token as response. Default option is 'FALSE'. +#' @param error.ignore.var A logical. Indicator for the variables if the function should stop if an error occurs or no object for the request is found or if it should produce a token as response. Default option is 'FALSE'. +#' @param error.ignore.val A logical. Indicator for the values if the function should stop if an error occurs or no object for the request is found or if it should produce a token as response. Default option is 'TRUE' - this prevents the function to stop even if a varaible has no further explanation (as often the case for numerical variables). #' @param sortcriterion A string. Indicator if the output should be sorted by 'code' or 'content'. This is an parameter of the Genesis/Zensus API call itself. The default is "code". #' @param ... Additional parameters for the Genesis/Zensus API call. These parameters are only affecting the Genesis/Zensus call itself, no further processing. For more details see `vignette("additional_parameter")`. #' @@ -260,13 +261,14 @@ gen_val2var2stat <- function(code = NULL, area = c("all", "public", "user"), detailed = FALSE, sortcriterion = c("code", "content"), - error.ignore = FALSE, + error.ignore.var = FALSE, + error.ignore.val = TRUE, ...) { caller <- as.character(match.call()[1]) check_function_input(code = code, - error.ignore = error.ignore, + error.ignore = error.ignore.var, sortcriterion = sortcriterion, database = gen_fun, caller = caller) @@ -284,7 +286,7 @@ gen_val2var2stat <- function(code = NULL, area = area, detailed = detailed, sortcriterion = sortcriterion, - error.ignore = error.ignore, + error.ignore = error.ignore.var, ...))) list_values <- list() @@ -295,7 +297,7 @@ gen_val2var2stat <- function(code = NULL, database = db, area = area, sortcriterion = sortcriterion, - error.ignore = error.ignore, + error.ignore = error.ignore.val, frame = embedding))) list_values <<- append(list_values, zwisch) From 6552fe661c43cc09d5c1d7958f61eeaf1748d6b3 Mon Sep 17 00:00:00 2001 From: KovaZo Date: Tue, 25 Jun 2024 11:09:30 +0200 Subject: [PATCH 15/52] update regio link and package purrr/rvest --- DESCRIPTION | 8 ++++---- R/gen_update_EVAS.R | 24 ++++++++++++++++++------ 2 files changed, 22 insertions(+), 10 deletions(-) diff --git a/DESCRIPTION b/DESCRIPTION index 9107b89..b67ec5f 100644 --- a/DESCRIPTION +++ b/DESCRIPTION @@ -26,14 +26,14 @@ Imports: readr, tibble, vctrs, - usethis, - rvest, - purrr + usethis Suggests: httptest2, knitr, rmarkdown, - testthat (>= 3.0.0) + testthat (>= 3.0.0), + rvest, + purrr VignetteBuilder: knitr Config/testthat/edition: 3 diff --git a/R/gen_update_EVAS.R b/R/gen_update_EVAS.R index db68b58..1f8dd42 100644 --- a/R/gen_update_EVAS.R +++ b/R/gen_update_EVAS.R @@ -7,19 +7,31 @@ #' gen_update_EVAS <- function(){ + # Check rvest and purrr packages + if (!requireNamespace("rvest", quietly = TRUE)) { + + stop("If you want to use this specific function, the package {rvest} needs to be installed.", + call. = FALSE) + + } + + if (!requireNamespace("purrr", quietly = TRUE)) { + + stop("If you want to use this specific function, the package {purrr} needs to be installed.", + call. = FALSE) + + } + # Path selection data_path <- system.file("data", "EVAS_numbers.RData", package = "restatis") - # Load the data object - data("EVAS_numbers", package = "restatis") - # Define the src URL of the EVAS numbers url <- "https://erhebungsdatenbank.estatistik.de/eid/TabelleEvas.jsp" # Read the HTML content of the URL - html <- read_html(url) - html <- html_nodes(html, "table") - html <- map_dfr(html, html_table, convert = FALSE) + html <- rvest::read_html(url) + html <- rvest::html_nodes(html, "table") + html <- purrr::map_dfr(html, html_table, convert = FALSE) html <- html[, c("EVAS", "Beschreibung")] html$Titel <- paste(html$EVAS, html$Beschreibung, sep = " - ") attr(html, "Update_Date") <- format(Sys.Date(), "%Y%m%d") From 0a57db4e20e1ad7e64857fc5d3c4ae8118f8dd09 Mon Sep 17 00:00:00 2001 From: KovaZo Date: Tue, 25 Jun 2024 11:09:47 +0200 Subject: [PATCH 16/52] update link regio --- R/gen_api.R | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/R/gen_api.R b/R/gen_api.R index f6857cc..ee65732 100644 --- a/R/gen_api.R +++ b/R/gen_api.R @@ -55,7 +55,7 @@ gen_regio_api <- function(endpoint, ...) { #' httr2::resp_body_json() #' gen_zensus_api <- function(endpoint, ...) { - httr2::request("https://ergebnisse2011.zensus2022.de/api/rest/2020") %>% + httr2::request("https://www.regionalstatistik.de/genesisws/rest/2020/") %>% httr2::req_user_agent("https://github.com/CorrelAid/restatis") %>% httr2::req_url_path_append(endpoint) %>% httr2::req_url_query(!!!gen_auth_get(database = "zensus"), ...) %>% From 5b078f5299544548dd5afad56712dc88857bc783 Mon Sep 17 00:00:00 2001 From: buhly Date: Sun, 30 Jun 2024 21:14:11 +0200 Subject: [PATCH 17/52] update DESCRIPTION --- DESCRIPTION | 14 ++++++++------ 1 file changed, 8 insertions(+), 6 deletions(-) diff --git a/DESCRIPTION b/DESCRIPTION index d5b608e..6f8fc3d 100644 --- a/DESCRIPTION +++ b/DESCRIPTION @@ -1,19 +1,21 @@ Package: restatis -Title: R Wrapper for the GENESIS Web Service RESTful API of the German +Title: R Wrapper to access a wide range of Germany's Federal Statistical System +databases based on the GENESIS Web Service RESTful API of the German Federal Statistical Office (Statistisches Bundesamt/Destatis) -Version: 0.1.0 +Version: 0.2.0 Authors@R: c( - person("Yannik", "Buhl", role = "aut"), + person("Yannik", "Buhl", , "yannik.buhl@posteo.de", role = c("aut", "cre")), person("Zoran", "Kovacevic", role = "aut", comment = c(ORCID = "0009-0002-0156-0862")), person("Dorian", "Le Jeune", role = "aut"), - person("Long", "Nguyen", , "long.nguyen@uni-bielefeld.de", role = c("aut", "cre"), + person("Long", "Nguyen", , "long.nguyen@uni-bielefeld.de", role = "aut"), comment = c(ORCID = "0000-0001-8878-7386")), person("Johannes", "Ritter", role = "aut") ) Description: A RESTful API wrapper for accessing the GENESIS database of - the German Federal Statistical Office (Destatis). Also supports data - search functions, credential management, result caching, and handling + the German Federal Statistical Office (Destatis) as well as its Census + Database and the database of Germany's regional statistics. Supports data + search functions, credential management, result caching, and handling remote background jobs for large datasets. License: MIT + file LICENSE URL: https://correlaid.github.io/restatis/ From 817b1035781b376d794202f0c97c67e3950686df Mon Sep 17 00:00:00 2001 From: bubux Date: Sun, 30 Jun 2024 21:29:35 +0200 Subject: [PATCH 18/52] new function logincheck --- R/gen_logincheck.R | 51 ++++++++++++++++++++++++++++++++++++++++++++++ R/utils_httr2.R | 33 ------------------------------ 2 files changed, 51 insertions(+), 33 deletions(-) create mode 100644 R/gen_logincheck.R diff --git a/R/gen_logincheck.R b/R/gen_logincheck.R new file mode 100644 index 0000000..689dddc --- /dev/null +++ b/R/gen_logincheck.R @@ -0,0 +1,51 @@ +#' gen_logincheck +#' +#' @description Function to check if a login is possible for a certain database. +#' @param database Takes the values 'genesis', 'regio' and 'zensus'. +#' +#' @return Leads to an informative error message if the login check failed. Invisibly returns TRUE otherwise. +#' @export +#' +#' @examples +#' \dontrun{ +#' gen_logincheck("zensus") +#' } +#' +gen_logincheck <- function(database) { + + if (database == "genesis") { + + response <- gen_api("helloworld/logincheck") + + } else if (database == "zensus") { + + response <- gen_zensus_api("helloworld/logincheck") + + } else if (database == "regio") { + + response <- gen_regio_api("helloworld/logincheck") + + } else { + + stop("Misspecified parameter 'database' for function 'perform_logincheck'.", + call. = FALSE) + + } + + #----------------------------------------------------------------------------- + + if (response$status_code != 200) { + + stop(paste0("There seems to be an issue with the authentication process (logincheck upon credential specification failed with code ", + response$status_code, + "). ", + "Please retry specifying your credentials or check whether the API is currently down."), + call. = FALSE) + + } else { + + invisible(TRUE) + + } + +} diff --git a/R/utils_httr2.R b/R/utils_httr2.R index 34c988c..c4840c5 100644 --- a/R/utils_httr2.R +++ b/R/utils_httr2.R @@ -42,8 +42,6 @@ test_if_json <- function(input) { #------------------------------------------------------------------------------- -#------------------------------------------------------------------------------- - #' test_if_error_find #' #' @param input Response object @@ -309,34 +307,3 @@ return_table_object <- function(response, } #------------------------------------------------------------------------------- - -perform_logincheck <- function(database) { - - if (database == "genesis") { - - response <- gen_api("helloworld/logincheck") - - } else if (database == "zensus") { - - response <- gen_zensus_api("helloworld/logincheck") - - } else { - - stop("Misspecified parameter 'database' for function 'perform_logincheck'.", - call. = FALSE) - - } - - #----------------------------------------------------------------------------- - - if (response$status_code != 200) { - - stop(paste0("There seems to be an issue with the authentication process (logincheck upon credential specification failed with code ", - response$status_code, - "). ", - "Please retry specifying your credentials or check whether the API is currently down."), - call. = FALSE) - - } - -} From a02e9c38c529a77f974c140ca11ccb14a1df8acb Mon Sep 17 00:00:00 2001 From: bubux Date: Mon, 1 Jul 2024 10:29:32 +0200 Subject: [PATCH 19/52] update gen_api from zensus branch --- R/gen_api.R | 46 +++++++++++++++++++++++++++++++++++++++++++++- 1 file changed, 45 insertions(+), 1 deletion(-) diff --git a/R/gen_api.R b/R/gen_api.R index bdd899b..ee65732 100644 --- a/R/gen_api.R +++ b/R/gen_api.R @@ -14,7 +14,51 @@ gen_api <- function(endpoint, ...) { httr2::request("https://www-genesis.destatis.de/genesisWS/rest/2020") %>% httr2::req_user_agent("https://github.com/CorrelAid/restatis") %>% httr2::req_url_path_append(endpoint) %>% - httr2::req_url_query(!!!gen_auth_get(), ...) %>% + httr2::req_url_query(!!!gen_auth_get(database = "genesis"), ...) %>% + httr2::req_retry(max_tries = 3) %>% + httr2::req_perform() +} + + +#' Low-level function to interact with Regionalstatistik' GENESIS API +#' +#' @param endpoint The endpoint of the API that is to be queried +#' +#' @importFrom httr2 `%>%` +#' +#' @noRd +#' +#' @examples +#' gen_regio_api("helloworld/logincheck") %>% +#' httr2::resp_body_json() +#' +gen_regio_api <- function(endpoint, ...) { + httr2::request("https://www-genesis.destatis.de/genesisWS/rest/2020/") %>% + httr2::req_user_agent("https://github.com/CorrelAid/restatis") %>% + httr2::req_url_path_append(endpoint) %>% + httr2::req_url_query(!!!gen_auth_get(database = "regio"), ...) %>% + httr2::req_retry(max_tries = 3) %>% + httr2::req_perform() +} + + +#' Low-level function to interact with the German Zensus 2022 database +#' +#' @param endpoint The endpoint of the API that is to be queried +#' +#' @importFrom httr2 `%>%` +#' +#' @noRd +#' +#' @examples +#' gen_zensus_api("helloworld/logincheck") %>% +#' httr2::resp_body_json() +#' +gen_zensus_api <- function(endpoint, ...) { + httr2::request("https://www.regionalstatistik.de/genesisws/rest/2020/") %>% + httr2::req_user_agent("https://github.com/CorrelAid/restatis") %>% + httr2::req_url_path_append(endpoint) %>% + httr2::req_url_query(!!!gen_auth_get(database = "zensus"), ...) %>% httr2::req_retry(max_tries = 3) %>% httr2::req_perform() } From 2deff84b2e9f9b3399bd9c70e7a51a0f1e487a18 Mon Sep 17 00:00:00 2001 From: bubux Date: Mon, 1 Jul 2024 10:53:02 +0200 Subject: [PATCH 20/52] update gen_auth from zensus branch --- R/gen_auth.R | 341 +++++++++++++++++++++++++++++++++++++++++++++------ 1 file changed, 306 insertions(+), 35 deletions(-) diff --git a/R/gen_auth.R b/R/gen_auth.R index 50fd923..35605d8 100644 --- a/R/gen_auth.R +++ b/R/gen_auth.R @@ -1,13 +1,13 @@ -#' Save credentials for Destatis' GENESIS database +#' Save credentials databases #' #' See Details. #' -#' Genesis username and password are encrypted and saved as RDS in the +#' Username and password are encrypted and saved as RDS in the #' package config directory. #' #' A random string is generated and stored in the session environment #' variable `RESTATIS_KEY`. This string is used as the key to encrypt and -#' decrypt the entered Genesis credentials. +#' decrypt the entered credentials. #' #' To avoid having to save authentication in future sessions, `RESTATIS_KEY` can #' be added to .Renviron. The usethis package includes a helper function for @@ -15,62 +15,333 @@ #' #' @export #' -gen_auth_save <- function() { +gen_auth_save <- function(database = c("all", "genesis", "zensus", "regio")) { - username <- gen_auth_ask("username") - password <- gen_auth_ask("password") + if(database == "genesis"){ + username <- gen_auth_ask("username") + password <- gen_auth_ask("password") - auth_path <- gen_auth_path("auth.rds") + auth_path <- gen_auth_path("auth.rds") - key <- httr2::secret_make_key() + key <- httr2::secret_make_key() - Sys.setenv(RESTATIS_KEY = key) + Sys.setenv(RESTATIS_KEY = key) - message( - "Saving credentials to ", - auth_path, - "\n\n", - "Please add the following line to your .Renviron, ", - "e.g. via `usethis::edit_r_environ()`, ", - "to use the specified username and password across sessions:\n\n", - "RESTATIS_KEY=", - key, - "\n\n" - ) + message( + "Saving credentials to ", + auth_path, + "\n\n", + "Please add the following line to your .Renviron, ", + "e.g. via `usethis::edit_r_environ()`, ", + "to use the specified username and password across sessions:\n\n", + "RESTATIS_KEY=", + key, + "\n\n" + ) - dir.create(gen_auth_path(), showWarnings = FALSE, recursive = TRUE) + dir.create(gen_auth_path(), showWarnings = FALSE, recursive = TRUE) - httr2::secret_write_rds(list(username = username, password = password), - path = auth_path, - key = "RESTATIS_KEY") + httr2::secret_write_rds(list(username = username, password = password), + path = auth_path, + key = "RESTATIS_KEY") - # Logincheck - perform_logincheck(database = "genesis") + # Logincheck + perform_logincheck(database = "genesis") - } + } else if (database == "zensus"){ + + username <- gen_auth_ask("username") + password <- gen_auth_ask("password") + + auth_path <- gen_auth_path("auth_zensus.rds") + + key <- httr2::secret_make_key() + + Sys.setenv(ZENSUS_KEY = key) + + message( + "Saving Zensus database credentials to ", + auth_path, + "\n\n", + "Please add the following line to your .Renviron, ", + "e.g. via `usethis::edit_r_environ()`, ", + "to use the specified username and password across sessions:\n\n", + "ZENSUS_KEY=", + key, + "\n\n" + ) + + dir.create(gen_auth_path(), showWarnings = FALSE, recursive = TRUE) + + httr2::secret_write_rds(list(username = username, password = password), + path = auth_path, + key = "ZENSUS_KEY") + + # Logincheck + perform_logincheck(database = "zensus") + + } else if (database == "regio"){ + + username <- gen_auth_ask("username") + password <- gen_auth_ask("password") + + auth_path <- gen_auth_path("auth_regio.rds") + + key <- httr2::secret_make_key() + + Sys.setenv(REGIO_KEY = key) + + message( + "Saving Regionalstatistik database credentials to ", + auth_path, + "\n\n", + "Please add the following line to your .Renviron, ", + "e.g. via `usethis::edit_r_environ()`, ", + "to use the specified username and password across sessions:\n\n", + "REGIO_KEY=", + key, + "\n\n" + ) + + dir.create(gen_auth_path(), showWarnings = FALSE, recursive = TRUE) + + httr2::secret_write_rds(list(username = username, password = password), + path = auth_path, + key = "REGIO_KEY") + + # Logincheck + perform_logincheck(database = "regio") + + } else if (database == "all"){ + + message("Saving credentials for Genesis database") + + username <- gen_auth_ask("username") + password <- gen_auth_ask("password") + + auth_path <- gen_auth_path("auth.rds") + + key <- httr2::secret_make_key() + + Sys.setenv(RESTATIS_KEY = key) + + message( + "Saving credentials to ", + auth_path, + "\n\n", + "Please add the following line to your .Renviron, ", + "e.g. via `usethis::edit_r_environ()`, ", + "to use the specified username and password across sessions:\n\n", + "RESTATIS_KEY=", + key, + "\n\n" + ) + + dir.create(gen_auth_path(), showWarnings = FALSE, recursive = TRUE) + + httr2::secret_write_rds(list(username = username, password = password), + path = auth_path, + key = "RESTATIS_KEY") + + # Logincheck + perform_logincheck(database = "genesis") + + + message("Saving credentials for Zensus database") + + username <- gen_auth_ask("username") + password <- gen_auth_ask("password") + + auth_path <- gen_auth_path("auth_zensus.rds") + + key <- httr2::secret_make_key() + + Sys.setenv(ZENSUS_KEY = key) + + message( + "Saving Zensus database credentials to ", + auth_path, + "\n\n", + "Please add the following line to your .Renviron, ", + "e.g. via `usethis::edit_r_environ()`, ", + "to use the specified username and password across sessions:\n\n", + "ZENSUS_KEY=", + key, + "\n\n" + ) + + dir.create(gen_auth_path(), showWarnings = FALSE, recursive = TRUE) + + httr2::secret_write_rds(list(username = username, password = password), + path = auth_path, + key = "ZENSUS_KEY") + + # Logincheck + perform_logincheck(database = "zensus") + + + message("Saving credentials for Regionalstatistik database") + + username <- gen_auth_ask("username") + password <- gen_auth_ask("password") + + auth_path <- gen_auth_path("auth_regio.rds") + + key <- httr2::secret_make_key() + + Sys.setenv(REGIO_KEY = key) + + message( + "Saving Regionalstatistik database credentials to ", + auth_path, + "\n\n", + "Please add the following line to your .Renviron, ", + "e.g. via `usethis::edit_r_environ()`, ", + "to use the specified username and password across sessions:\n\n", + "REGIO_KEY=", + key, + "\n\n" + ) + + dir.create(gen_auth_path(), showWarnings = FALSE, recursive = TRUE) + + httr2::secret_write_rds(list(username = username, password = password), + path = auth_path, + key = "REGIO_KEY") + + # Logincheck + perform_logincheck(database = "regio") + + } else { + + stop("Invalid database argument. Please choose 'genesis', 'zensus', 'regio' or 'all'.") + + } +} #------------------------------------------------------------------------------- -gen_auth_get <- function() { +gen_auth_get <- function(database = c("all", "genesis", "zensus", "regio")) { - auth_path <- gen_auth_path("auth.rds") + if("genesis" %in% database && !"all" %in% database){ - if (!(file.exists(auth_path) && nzchar(Sys.getenv("RESTATIS_KEY")))) { + if(is.null(sys.call(-1))){ + message("Credentials for Genesis database") + } - stop(paste0("Genesis database credentials not found. ", - "Please run 'gen_auth_save()' to store Genesis database username and password."), - call. = FALSE) + auth_path <- gen_auth_path("auth.rds") - } + if (!(file.exists(auth_path) && nzchar(Sys.getenv("RESTATIS_KEY")))) { + + stop(paste0("Genesis database credentials not found. ", + "Please run 'gen_auth_save()' to store Genesis database username and password."), + call. = FALSE) + + } + + httr2::secret_read_rds(auth_path, "RESTATIS_KEY") + + } else if ("zensus" %in% database && !"all" %in% database){ + + if(is.null(sys.call(-1))){ + message("Credentials for Zensus database") + } + + auth_path <- gen_auth_path("auth_zensus.rds") + + if (!(file.exists(auth_path) && nzchar(Sys.getenv("ZENSUS_KEY")))) { + + stop(paste0("Zensus database credentials not found. ", + "Please run 'gen_auth_save()' to store Zensus database username and password."), + call. = FALSE) + + } + + httr2::secret_read_rds(auth_path, "ZENSUS_KEY") + + } else if ("regio" %in% database && !"all" %in% database){ + + if(is.null(sys.call(-1))){ + message("Credentials for Regionalstatistik database") + } + + auth_path <- gen_auth_path("auth_regio.rds") + + if (!(file.exists(auth_path) && nzchar(Sys.getenv("REGIO_KEY")))) { + + stop(paste0("Regionalstatistik database credentials not found. ", + "Please run 'gen_auth_save()' to store Regionalstatistik database username and password."), + call. = FALSE) + + } + + print(httr2::secret_read_rds(auth_path, "REGIO_KEY")) + + } else if ("all" %in% database){ + + if(is.null(sys.call(-1))){ + message("Credentials for Genesis database") + } - httr2::secret_read_rds(auth_path, "RESTATIS_KEY") + auth_path <- gen_auth_path("auth.rds") + if (!(file.exists(auth_path) && nzchar(Sys.getenv("RESTATIS_KEY")))) { + + stop(paste0("Genesis database credentials not found. ", + "Please run 'gen_auth_save()' to store Genesis database username and password."), + call. = FALSE) + + } + + print(httr2::secret_read_rds(auth_path, "RESTATIS_KEY")) + + + if(is.null(sys.call(-1))){ + message("Credentials for Zensus database") + } + + auth_path <- gen_auth_path("auth_zensus.rds") + + if (!(file.exists(auth_path) && nzchar(Sys.getenv("ZENSUS_KEY")))) { + + stop(paste0("Zensus database credentials not found. ", + "Please run 'gen_auth_save()' to store Zensus database username and password."), + call. = FALSE) + + } + + print(httr2::secret_read_rds(auth_path, "ZENSUS_KEY")) + + + if(is.null(sys.call(-1))){ + message("Credentials for Regionalstatistik database") + } + + auth_path <- gen_auth_path("auth_regio.rds") + + if (!(file.exists(auth_path) && nzchar(Sys.getenv("REGIO_KEY")))) { + + stop(paste0("Regionalstatistik database credentials not found. ", + "Please run 'gen_auth_save()' to store Regionalstatistik database username and password."), + call. = FALSE) + + } + + print(httr2::secret_read_rds(auth_path, "REGIO_KEY")) + + } else { + + stop("Invalid database argument. Please choose 'genesis', 'zensus', 'regio' or 'all'.") + + } } #------------------------------------------------------------------------------- gen_auth_ask <- function(credential_type) { + + val <- askpass::askpass(paste0("Please enter your ", credential_type, ": ")) if (is.null(val)) { From 96ef2da394bec57cbc9a0608c32677fc3b28cb74 Mon Sep 17 00:00:00 2001 From: bubux Date: Mon, 1 Jul 2024 11:37:37 +0200 Subject: [PATCH 21/52] update DESCRIPTIONh from zensus branch --- DESCRIPTION | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) diff --git a/DESCRIPTION b/DESCRIPTION index 6f8fc3d..b67ec5f 100644 --- a/DESCRIPTION +++ b/DESCRIPTION @@ -1,21 +1,19 @@ Package: restatis -Title: R Wrapper to access a wide range of Germany's Federal Statistical System -databases based on the GENESIS Web Service RESTful API of the German +Title: R Wrapper for the GENESIS Web Service RESTful API of the German Federal Statistical Office (Statistisches Bundesamt/Destatis) -Version: 0.2.0 +Version: 0.1.0 Authors@R: c( - person("Yannik", "Buhl", , "yannik.buhl@posteo.de", role = c("aut", "cre")), + person("Yannik", "Buhl", role = "aut"), person("Zoran", "Kovacevic", role = "aut", comment = c(ORCID = "0009-0002-0156-0862")), person("Dorian", "Le Jeune", role = "aut"), - person("Long", "Nguyen", , "long.nguyen@uni-bielefeld.de", role = "aut"), + person("Long", "Nguyen", , "long.nguyen@uni-bielefeld.de", role = c("aut", "cre"), comment = c(ORCID = "0000-0001-8878-7386")), person("Johannes", "Ritter", role = "aut") ) Description: A RESTful API wrapper for accessing the GENESIS database of - the German Federal Statistical Office (Destatis) as well as its Census - Database and the database of Germany's regional statistics. Supports data - search functions, credential management, result caching, and handling + the German Federal Statistical Office (Destatis). Also supports data + search functions, credential management, result caching, and handling remote background jobs for large datasets. License: MIT + file LICENSE URL: https://correlaid.github.io/restatis/ @@ -33,7 +31,9 @@ Suggests: httptest2, knitr, rmarkdown, - testthat (>= 3.0.0) + testthat (>= 3.0.0), + rvest, + purrr VignetteBuilder: knitr Config/testthat/edition: 3 From 7f5c69f569a825033beb7482ed9a0f16da9ac365 Mon Sep 17 00:00:00 2001 From: bubux Date: Mon, 1 Jul 2024 13:51:06 +0200 Subject: [PATCH 22/52] gen_logincheck --- DESCRIPTION | 20 +-- R/gen_api.R | 2 + R/gen_auth.R | 342 ++++++++++++++++++++++++-------------------- R/gen_logincheck.R | 33 ++--- R/gen_zensus_auth.R | 2 +- R/utils_httr2.R | 30 ++++ 6 files changed, 251 insertions(+), 178 deletions(-) diff --git a/DESCRIPTION b/DESCRIPTION index b67ec5f..2ba4bc3 100644 --- a/DESCRIPTION +++ b/DESCRIPTION @@ -1,19 +1,21 @@ Package: restatis -Title: R Wrapper for the GENESIS Web Service RESTful API of the German +Title: R Wrapper to access a wide range of Germany's Federal Statistical System + databases based on the GENESIS Web Service RESTful API of the German Federal Statistical Office (Statistisches Bundesamt/Destatis) -Version: 0.1.0 +Version: 0.2.0 Authors@R: c( - person("Yannik", "Buhl", role = "aut"), + person("Yannik", "Buhl", , "ybuhl@posteo.de", role = c("aut", "cre")), person("Zoran", "Kovacevic", role = "aut", comment = c(ORCID = "0009-0002-0156-0862")), person("Dorian", "Le Jeune", role = "aut"), - person("Long", "Nguyen", , "long.nguyen@uni-bielefeld.de", role = c("aut", "cre"), + person("Long", "Nguyen", , "long.nguyen@uni-bielefeld.de", role = "aut", comment = c(ORCID = "0000-0001-8878-7386")), person("Johannes", "Ritter", role = "aut") ) Description: A RESTful API wrapper for accessing the GENESIS database of - the German Federal Statistical Office (Destatis). Also supports data - search functions, credential management, result caching, and handling + the German Federal Statistical Office (Destatis) as well as its Census + Database and the database of Germany's regional statistics. Supports data + search functions, credential management, result caching, and handling remote background jobs for large datasets. License: MIT + file LICENSE URL: https://correlaid.github.io/restatis/ @@ -26,14 +28,14 @@ Imports: readr, tibble, vctrs, - usethis + usethis, + purrr Suggests: httptest2, knitr, rmarkdown, testthat (>= 3.0.0), - rvest, - purrr + rvest VignetteBuilder: knitr Config/testthat/edition: 3 diff --git a/R/gen_api.R b/R/gen_api.R index ee65732..acf407f 100644 --- a/R/gen_api.R +++ b/R/gen_api.R @@ -19,6 +19,7 @@ gen_api <- function(endpoint, ...) { httr2::req_perform() } +#------------------------------------------------------------------------------- #' Low-level function to interact with Regionalstatistik' GENESIS API #' @@ -41,6 +42,7 @@ gen_regio_api <- function(endpoint, ...) { httr2::req_perform() } +#------------------------------------------------------------------------------- #' Low-level function to interact with the German Zensus 2022 database #' diff --git a/R/gen_auth.R b/R/gen_auth.R index 35605d8..294b5af 100644 --- a/R/gen_auth.R +++ b/R/gen_auth.R @@ -1,23 +1,24 @@ -#' Save credentials databases +#' gen_auth_save #' -#' See Details. +#' @param database The database to store credentials for ('all', 'zensus', 'genesis', 'regio'). #' -#' Username and password are encrypted and saved as RDS in the -#' package config directory. -#' -#' A random string is generated and stored in the session environment -#' variable `RESTATIS_KEY`. This string is used as the key to encrypt and -#' decrypt the entered credentials. -#' -#' To avoid having to save authentication in future sessions, `RESTATIS_KEY` can -#' be added to .Renviron. The usethis package includes a helper function for -#' editing .Renviron files from an R session with [usethis::edit_r_environ()]. +#' @description Save credentials of the different databases +#' @details Username and password are encrypted and saved as RDS in the +#' package config directory. A random string is generated and stored in the +#' session environment variable `RESTATIS_KEY`. This string is used as the key +#' to encrypt and decrypt the entered credentials. To avoid having to save +#' authentication in future sessions, `RESTATIS_KEY` can be added to .Renviron. +#' The usethis package includes a helper function for editing .Renviron files +#' from an R session with [usethis::edit_r_environ()]. #' #' @export #' gen_auth_save <- function(database = c("all", "genesis", "zensus", "regio")) { + #----------------------------------------------------------------------------- + if(database == "genesis"){ + username <- gen_auth_ask("username") password <- gen_auth_ask("password") @@ -27,17 +28,15 @@ gen_auth_save <- function(database = c("all", "genesis", "zensus", "regio")) { Sys.setenv(RESTATIS_KEY = key) - message( - "Saving credentials to ", - auth_path, - "\n\n", - "Please add the following line to your .Renviron, ", - "e.g. via `usethis::edit_r_environ()`, ", - "to use the specified username and password across sessions:\n\n", - "RESTATIS_KEY=", - key, - "\n\n" - ) + message("Saving 'GENESIS' database credentials to ", + auth_path, + "\n\n", + "Please add the following line to your .Renviron, ", + "e.g. via `usethis::edit_r_environ()`, ", + "to use the specified username and password across sessions:\n\n", + "RESTATIS_KEY=", + key, + "\n\n") dir.create(gen_auth_path(), showWarnings = FALSE, recursive = TRUE) @@ -46,7 +45,9 @@ gen_auth_save <- function(database = c("all", "genesis", "zensus", "regio")) { key = "RESTATIS_KEY") # Logincheck - perform_logincheck(database = "genesis") + gen_logincheck(database = "genesis") + + #----------------------------------------------------------------------------- } else if (database == "zensus"){ @@ -59,17 +60,15 @@ gen_auth_save <- function(database = c("all", "genesis", "zensus", "regio")) { Sys.setenv(ZENSUS_KEY = key) - message( - "Saving Zensus database credentials to ", - auth_path, - "\n\n", - "Please add the following line to your .Renviron, ", - "e.g. via `usethis::edit_r_environ()`, ", - "to use the specified username and password across sessions:\n\n", - "ZENSUS_KEY=", - key, - "\n\n" - ) + message("Saving 'Zensus' database credentials to ", + auth_path, + "\n\n", + "Please add the following line to your .Renviron, ", + "e.g. via `usethis::edit_r_environ()`, ", + "to use the specified username and password across sessions:\n\n", + "ZENSUS_KEY=", + key, + "\n\n") dir.create(gen_auth_path(), showWarnings = FALSE, recursive = TRUE) @@ -78,7 +77,9 @@ gen_auth_save <- function(database = c("all", "genesis", "zensus", "regio")) { key = "ZENSUS_KEY") # Logincheck - perform_logincheck(database = "zensus") + gen_logincheck(database = "zensus") + + #----------------------------------------------------------------------------- } else if (database == "regio"){ @@ -91,17 +92,15 @@ gen_auth_save <- function(database = c("all", "genesis", "zensus", "regio")) { Sys.setenv(REGIO_KEY = key) - message( - "Saving Regionalstatistik database credentials to ", - auth_path, - "\n\n", - "Please add the following line to your .Renviron, ", - "e.g. via `usethis::edit_r_environ()`, ", - "to use the specified username and password across sessions:\n\n", - "REGIO_KEY=", - key, - "\n\n" - ) + message("Saving 'Regionalstatistik' database credentials to ", + auth_path, + "\n\n", + "Please add the following line to your .Renviron, ", + "e.g. via `usethis::edit_r_environ()`, ", + "to use the specified username and password across sessions:\n\n", + "REGIO_KEY=", + key, + "\n\n") dir.create(gen_auth_path(), showWarnings = FALSE, recursive = TRUE) @@ -110,238 +109,271 @@ gen_auth_save <- function(database = c("all", "genesis", "zensus", "regio")) { key = "REGIO_KEY") # Logincheck - perform_logincheck(database = "regio") + gen_logincheck(database = "regio") - } else if (database == "all"){ + #----------------------------------------------------------------------------- - message("Saving credentials for Genesis database") + } else if (database == "all"){ - username <- gen_auth_ask("username") - password <- gen_auth_ask("password") + message("~~ Saving credentials for 'GENESIS' database.") - auth_path <- gen_auth_path("auth.rds") + username <- gen_auth_ask("username") + password <- gen_auth_ask("password") - key <- httr2::secret_make_key() + auth_path <- gen_auth_path("auth.rds") - Sys.setenv(RESTATIS_KEY = key) + key <- httr2::secret_make_key() - message( - "Saving credentials to ", - auth_path, - "\n\n", - "Please add the following line to your .Renviron, ", - "e.g. via `usethis::edit_r_environ()`, ", - "to use the specified username and password across sessions:\n\n", - "RESTATIS_KEY=", - key, - "\n\n" - ) + Sys.setenv(RESTATIS_KEY = key) - dir.create(gen_auth_path(), showWarnings = FALSE, recursive = TRUE) + message("Saving 'GENESIS' database credentials to ", + auth_path, + "\n\n", + "Please add the following line to your .Renviron, ", + "e.g. via `usethis::edit_r_environ()`, ", + "to use the specified username and password across sessions:\n\n", + "RESTATIS_KEY=", + key, + "\n\n") - httr2::secret_write_rds(list(username = username, password = password), - path = auth_path, - key = "RESTATIS_KEY") + dir.create(gen_auth_path(), showWarnings = FALSE, recursive = TRUE) - # Logincheck - perform_logincheck(database = "genesis") + httr2::secret_write_rds(list(username = username, password = password), + path = auth_path, + key = "RESTATIS_KEY") + # Logincheck + gen_logincheck(database = "genesis") - message("Saving credentials for Zensus database") + #------------------------------------------------------------------------- - username <- gen_auth_ask("username") - password <- gen_auth_ask("password") + message("~~ Saving credentials for 'Zensus' database.") - auth_path <- gen_auth_path("auth_zensus.rds") + username <- gen_auth_ask("username") + password <- gen_auth_ask("password") - key <- httr2::secret_make_key() + auth_path <- gen_auth_path("auth_zensus.rds") - Sys.setenv(ZENSUS_KEY = key) + key <- httr2::secret_make_key() - message( - "Saving Zensus database credentials to ", - auth_path, - "\n\n", - "Please add the following line to your .Renviron, ", - "e.g. via `usethis::edit_r_environ()`, ", - "to use the specified username and password across sessions:\n\n", - "ZENSUS_KEY=", - key, - "\n\n" - ) + Sys.setenv(ZENSUS_KEY = key) - dir.create(gen_auth_path(), showWarnings = FALSE, recursive = TRUE) + message("Saving 'Zensus' database credentials to ", + auth_path, + "\n\n", + "Please add the following line to your .Renviron, ", + "e.g. via `usethis::edit_r_environ()`, ", + "to use the specified username and password across sessions:\n\n", + "ZENSUS_KEY=", + key, + "\n\n") - httr2::secret_write_rds(list(username = username, password = password), - path = auth_path, - key = "ZENSUS_KEY") + dir.create(gen_auth_path(), showWarnings = FALSE, recursive = TRUE) - # Logincheck - perform_logincheck(database = "zensus") + httr2::secret_write_rds(list(username = username, password = password), + path = auth_path, + key = "ZENSUS_KEY") + # Logincheck + gen_logincheck(database = "zensus") - message("Saving credentials for Regionalstatistik database") + #------------------------------------------------------------------------- - username <- gen_auth_ask("username") - password <- gen_auth_ask("password") + message("~~ Saving credentials for 'Regionalstatistik' database.") - auth_path <- gen_auth_path("auth_regio.rds") + username <- gen_auth_ask("username") + password <- gen_auth_ask("password") + + auth_path <- gen_auth_path("auth_regio.rds") + + key <- httr2::secret_make_key() + + Sys.setenv(REGIO_KEY = key) - key <- httr2::secret_make_key() + message("Saving 'Regionalstatistik' database credentials to ", + auth_path, + "\n\n", + "Please add the following line to your .Renviron, ", + "e.g. via `usethis::edit_r_environ()`, ", + "to use the specified username and password across sessions:\n\n", + "REGIO_KEY=", + key, + "\n\n") - Sys.setenv(REGIO_KEY = key) + dir.create(gen_auth_path(), showWarnings = FALSE, recursive = TRUE) - message( - "Saving Regionalstatistik database credentials to ", - auth_path, - "\n\n", - "Please add the following line to your .Renviron, ", - "e.g. via `usethis::edit_r_environ()`, ", - "to use the specified username and password across sessions:\n\n", - "REGIO_KEY=", - key, - "\n\n" - ) + httr2::secret_write_rds(list(username = username, password = password), + path = auth_path, + key = "REGIO_KEY") - dir.create(gen_auth_path(), showWarnings = FALSE, recursive = TRUE) + # Logincheck + gen_logincheck(database = "regio") - httr2::secret_write_rds(list(username = username, password = password), - path = auth_path, - key = "REGIO_KEY") + #----------------------------------------------------------------------------- - # Logincheck - perform_logincheck(database = "regio") + } else { - } else { + stop("Invalid 'database' argument. Please choose 'genesis', 'zensus', 'regio' or 'all'.") - stop("Invalid database argument. Please choose 'genesis', 'zensus', 'regio' or 'all'.") + } - } } #------------------------------------------------------------------------------- +#' gen_auth_get +#' +#' @param database Takes values of 'all', 'genesis', 'zensus' and 'regio' +#' +#' @return Credentials for the database(s) chosen by the user +#' @export +#' gen_auth_get <- function(database = c("all", "genesis", "zensus", "regio")) { - if("genesis" %in% database && !"all" %in% database){ + if("genesis" %in% database && !("all" %in% database)){ if(is.null(sys.call(-1))){ - message("Credentials for Genesis database") + + message("Retrieving credentials for 'GENESIS' database.") + } auth_path <- gen_auth_path("auth.rds") if (!(file.exists(auth_path) && nzchar(Sys.getenv("RESTATIS_KEY")))) { - stop(paste0("Genesis database credentials not found. ", - "Please run 'gen_auth_save()' to store Genesis database username and password."), + stop(paste0("'GENESIS' database credentials not found. ", + "Please run 'gen_auth_save()' to store 'GENESIS' database username and password."), call. = FALSE) } - httr2::secret_read_rds(auth_path, "RESTATIS_KEY") + return(httr2::secret_read_rds(auth_path, "RESTATIS_KEY")) + + #--------------------------------------------------------------------------- - } else if ("zensus" %in% database && !"all" %in% database){ + } else if ("zensus" %in% database && !("all" %in% database)){ if(is.null(sys.call(-1))){ - message("Credentials for Zensus database") + + message("Retrieving credentials for 'Zensus' database.") + } auth_path <- gen_auth_path("auth_zensus.rds") if (!(file.exists(auth_path) && nzchar(Sys.getenv("ZENSUS_KEY")))) { - stop(paste0("Zensus database credentials not found. ", - "Please run 'gen_auth_save()' to store Zensus database username and password."), + stop(paste0("'Zensus' database credentials not found. ", + "Please run 'gen_auth_save()' to store 'Zensus' database username and password."), call. = FALSE) } - httr2::secret_read_rds(auth_path, "ZENSUS_KEY") + return(httr2::secret_read_rds(auth_path, "ZENSUS_KEY")) - } else if ("regio" %in% database && !"all" %in% database){ + #--------------------------------------------------------------------------- + + } else if ("regio" %in% database && !("all" %in% database)){ if(is.null(sys.call(-1))){ - message("Credentials for Regionalstatistik database") + + message("Retrieving credentials for 'Regionalstatistik' database.") + } auth_path <- gen_auth_path("auth_regio.rds") if (!(file.exists(auth_path) && nzchar(Sys.getenv("REGIO_KEY")))) { - stop(paste0("Regionalstatistik database credentials not found. ", - "Please run 'gen_auth_save()' to store Regionalstatistik database username and password."), + stop(paste0("'Regionalstatistik' database credentials not found. ", + "Please run 'gen_auth_save()' to store 'Regionalstatistik' database username and password."), call. = FALSE) } - print(httr2::secret_read_rds(auth_path, "REGIO_KEY")) + return(httr2::secret_read_rds(auth_path, "REGIO_KEY")) + + #--------------------------------------------------------------------------- } else if ("all" %in% database){ if(is.null(sys.call(-1))){ - message("Credentials for Genesis database") + + message("Retrieving credentials for 'GENESIS' database.") + } auth_path <- gen_auth_path("auth.rds") if (!(file.exists(auth_path) && nzchar(Sys.getenv("RESTATIS_KEY")))) { - stop(paste0("Genesis database credentials not found. ", - "Please run 'gen_auth_save()' to store Genesis database username and password."), + stop(paste0("'GENESIS' database credentials not found. ", + "Please run 'gen_auth_save()' to store 'GENESIS' database username and password."), call. = FALSE) } - print(httr2::secret_read_rds(auth_path, "RESTATIS_KEY")) + return(httr2::secret_read_rds(auth_path, "RESTATIS_KEY")) + #--------------------------------------------------------------------------- if(is.null(sys.call(-1))){ - message("Credentials for Zensus database") + + message("Retrieving credentials for 'Zensus' database.") + } auth_path <- gen_auth_path("auth_zensus.rds") if (!(file.exists(auth_path) && nzchar(Sys.getenv("ZENSUS_KEY")))) { - stop(paste0("Zensus database credentials not found. ", - "Please run 'gen_auth_save()' to store Zensus database username and password."), + stop(paste0("'Zensus' database credentials not found. ", + "Please run 'gen_auth_save()' to store 'Zensus' database username and password."), call. = FALSE) } - print(httr2::secret_read_rds(auth_path, "ZENSUS_KEY")) + return(httr2::secret_read_rds(auth_path, "ZENSUS_KEY")) + #--------------------------------------------------------------------------- if(is.null(sys.call(-1))){ - message("Credentials for Regionalstatistik database") + + message("Retrieving credentials for 'Regionalstatistik' database.") + } auth_path <- gen_auth_path("auth_regio.rds") if (!(file.exists(auth_path) && nzchar(Sys.getenv("REGIO_KEY")))) { - stop(paste0("Regionalstatistik database credentials not found. ", - "Please run 'gen_auth_save()' to store Regionalstatistik database username and password."), + stop(paste0("'Regionalstatistik' database credentials not found. ", + "Please run 'gen_auth_save()' to store 'Regionalstatistik' database username and password."), call. = FALSE) } - print(httr2::secret_read_rds(auth_path, "REGIO_KEY")) + return(httr2::secret_read_rds(auth_path, "REGIO_KEY")) } else { stop("Invalid database argument. Please choose 'genesis', 'zensus', 'regio' or 'all'.") } + } #------------------------------------------------------------------------------- +#' gen_auth_ask +#' +#' @param credential_type Type of credential to ask for +#' +#' @return The user response +#' gen_auth_ask <- function(credential_type) { - - val <- askpass::askpass(paste0("Please enter your ", credential_type, ": ")) if (is.null(val)) { @@ -350,15 +382,21 @@ gen_auth_ask <- function(credential_type) { } - val + return(val) } #------------------------------------------------------------------------------- +#' gen_auth_path +#' +#' @param ... Optional arguments for file.path() +#' +#' @return A file path for the storage of config files +#' gen_auth_path <- function(...) { - file.path(tools::R_user_dir("restatis", "config"), ...) + return(file.path(tools::R_user_dir("restatis", "config"), ...)) } diff --git a/R/gen_logincheck.R b/R/gen_logincheck.R index 689dddc..175a4fb 100644 --- a/R/gen_logincheck.R +++ b/R/gen_logincheck.R @@ -1,7 +1,7 @@ #' gen_logincheck #' #' @description Function to check if a login is possible for a certain database. -#' @param database Takes the values 'genesis', 'regio' and 'zensus'. +#' @param database Takes the values 'genesis', 'regio', 'zensus' and 'all'. #' #' @return Leads to an informative error message if the login check failed. Invisibly returns TRUE otherwise. #' @export @@ -11,40 +11,41 @@ #' gen_logincheck("zensus") #' } #' -gen_logincheck <- function(database) { +gen_logincheck <- function(database, verbose = FALSE) { if (database == "genesis") { response <- gen_api("helloworld/logincheck") + warn_if_http_error(response, database, verbose) } else if (database == "zensus") { response <- gen_zensus_api("helloworld/logincheck") + warn_if_http_error(response, database, verbose) } else if (database == "regio") { response <- gen_regio_api("helloworld/logincheck") + warn_if_http_error(response, database, verbose) - } else { - - stop("Misspecified parameter 'database' for function 'perform_logincheck'.", - call. = FALSE) + } else if (database == "all") { - } + databases <- list("genesis", "zensus", "regio") - #----------------------------------------------------------------------------- + response_list <- list(response_genesis = gen_api("helloworld/logincheck"), + response_zensus = gen_zensus_api("helloworld/logincheck"), + response_regio = gen_regio_api("helloworld/logincheck")) - if (response$status_code != 200) { - - stop(paste0("There seems to be an issue with the authentication process (logincheck upon credential specification failed with code ", - response$status_code, - "). ", - "Please retry specifying your credentials or check whether the API is currently down."), - call. = FALSE) + purrr::walk2(.x = response_list, + .y = databases, + .f = ~ warn_if_http_error(response = .x, + database = .y, + verbose = verbose)) } else { - invisible(TRUE) + stop("Misspecified parameter 'database' for function 'gen_logincheck'.", + call. = FALSE) } diff --git a/R/gen_zensus_auth.R b/R/gen_zensus_auth.R index 373adae..fb652c8 100644 --- a/R/gen_zensus_auth.R +++ b/R/gen_zensus_auth.R @@ -45,7 +45,7 @@ gen_zensus_auth_save <- function() { key = "ZENSUS_KEY") # Logincheck - perform_logincheck(database = "zensus") + gen_logincheck(database = "zensus") } diff --git a/R/utils_httr2.R b/R/utils_httr2.R index c4840c5..8f75c2e 100644 --- a/R/utils_httr2.R +++ b/R/utils_httr2.R @@ -307,3 +307,33 @@ return_table_object <- function(response, } #------------------------------------------------------------------------------- + +warn_if_http_error <- function(response, + database, + verbose) { + + if (response$status_code != 200) { + + warning("Database: '", + database, + "' There seems to be an issue with the authentication process (logincheck upon credential specification failed with code ", + response$status_code, + "). ", + "Please retry specifying your credentials or check whether the API is currently down.", + call. = FALSE) + + invisible(FALSE) + + } else { + + if(isTRUE(verbose)) { + + message(paste0("Login check for database '", database, "' succeeded.")) + + } + + invisible(TRUE) + + } + +} From 8c570050b770c99a769b6d86b63972552edab19c Mon Sep 17 00:00:00 2001 From: buhly Date: Mon, 1 Jul 2024 22:25:45 +0200 Subject: [PATCH 23/52] add parameter to read in data as all character --- R/gen_table.R | 41 +++++++++++++++++++++++++++++++++++---- R/utils_httr2.R | 51 ++++++++++++++++++++++++++++++++++++------------- 2 files changed, 75 insertions(+), 17 deletions(-) diff --git a/R/gen_table.R b/R/gen_table.R index 531996c..dfd9e09 100644 --- a/R/gen_table.R +++ b/R/gen_table.R @@ -32,6 +32,11 @@ #' updated after this #' date.} #' \item{\code{language}}{Search terms, returned messages and data #' descriptions in German (`"de"`) or English (`"en"`)?} +#' \item{\code{job}}{Boolean. Indicate as to whether a job should be created +#' (not available with the 'Zensus' database).)} +#' \item{\code{all_character}}{Boolean. Should all variables be imported as +#' 'character' variables? This can be useful if there are a lot of +#' leading zeros. Defaults to FALSE.} #' } #' #' @export @@ -50,7 +55,7 @@ gen_table <- function(name, ...) { #------------------------------------------------------------------------------- gen_table_ <- function(name, - database = c("genesis", "zensus"), + database = c("genesis", "zensus", "regio"), area = c("all", "public", "user"), compress = FALSE, transpose = FALSE, @@ -66,7 +71,8 @@ gen_table_ <- function(name, classifyingkey3 = NULL, stand = NULL, language = Sys.getenv("GENESIS_LANG"), - job = FALSE) { + job = FALSE, + all_character = FALSE) { #----------------------------------------------------------------------------- # Parameter processing @@ -119,6 +125,7 @@ gen_table_ <- function(name, job = FALSE) #----------------------------------------------------------------------------- + } else if (database == "genesis"){ response <- gen_api("data/tablefile", @@ -142,9 +149,34 @@ gen_table_ <- function(name, job = FALSE) #----------------------------------------------------------------------------- + + } else if (database == "regio") { + + response <- gen_regio_api("data/tablefile", + name = name, + area = area, + compress = compress, + transpose = transpose, + startyear = startyear, + endyear = endyear, + regionalvariable = regionalvariable, + regionalkey = regionalkey, + classifyingvariable1 = classifyingvariable1, + classifyingkey1 = classifyingkey1, + classifyingvariable2 = classifyingvariable2, + classifyingkey2 = classifyingkey2, + classifyingvariable3 = classifyingvariable3, + classifyingkey3 = classifyingkey3, + stand = stand, + language = language, + format = "ffcsv", + job = FALSE) + + #----------------------------------------------------------------------------- + } else { - stop("Parameter 'database' has to be 'zensus' or 'genesis'.", + stop("Parameter 'database' has to be 'zensus', 'regio' or 'genesis'.", call. = FALSE) } @@ -157,6 +189,7 @@ gen_table_ <- function(name, # Returning the table desired by the user return(return_table_object(response = response, response_type = response_type, - language = language)) + language = language, + all_character = all_character)) } diff --git a/R/utils_httr2.R b/R/utils_httr2.R index 8f75c2e..88ace8f 100644 --- a/R/utils_httr2.R +++ b/R/utils_httr2.R @@ -207,14 +207,34 @@ test_if_error_light <- function(input) { #' return_table_object <- function(response, response_type, - language) { - - # There has to be a check on language to display correct decimal marks - # For German results, there needs to be a decimal mark set + language, + all_character) { #----------------------------------------------------------------------------- + # Short parameter processing of 'all character' for later use in read_delim + + if (isTRUE(all_character)) { + + all_character <- expression(readr::cols(.default = readr::col_character())) + + } else if (isFALSE(all_character)) { + + all_character <- expression(readr::cols()) + + } else { + + stop("Misspecification of parameter 'all_character'. Has to be TRUE or FALSE.", + call. = FALSE) + + } + + #------------------------------------------------------------------------------- + if (response_type == "text/csv"){ + # There has to be a check on language to display correct decimal marks + # For German results, there needs to be a decimal mark set + if (language == "de") { result <- response %>% @@ -223,20 +243,22 @@ return_table_object <- function(response, show_col_types = FALSE, locale = readr::locale(decimal_mark = ",", grouping_mark = "."), - name_repair = "minimal") + name_repair = "minimal", + col_types = eval(all_character)) } else if (language == "en") { result <- response %>% httr2::resp_body_string() %>% - readr::read_delim( - delim = ";", - show_col_types = FALSE, - name_repair = "minimal") + readr::read_delim(delim = ";", + show_col_types = FALSE, + name_repair = "minimal", + col_types = eval(all_character)) } else { - stop("Error handling language setting locale (values different from 'de' and 'en'.") + stop("Error handling language setting locale (values different from 'de' and 'en'.", + call. = FALSE) } @@ -282,18 +304,21 @@ return_table_object <- function(response, show_col_types = FALSE, locale = readr::locale(decimal_mark = ",", grouping_mark = "."), - name_repair = "minimal") + name_repair = "minimal", + col_types = eval(all_character)) } else if (language == "en") { result <- readr::read_delim(file = extracted_file, delim = ";", show_col_types = FALSE, - name_repair = "minimal") + name_repair = "minimal", + col_types = eval(all_character)) } else { - stop("Error handling language setting locale (values different from 'de' and 'en').") + stop("Error handling language setting locale (values different from 'de' and 'en').", + call. = FALSE) } From 1eb6e09c1f213dc2ab44bcea74e56d298b680a13 Mon Sep 17 00:00:00 2001 From: KovaZo Date: Tue, 2 Jul 2024 14:53:37 +0200 Subject: [PATCH 24/52] changes --- R/{access_check.R => access_check_delete.R} | 0 R/gen_auth.R | 48 +++++++++++++++------ R/gen_catalogue.R | 4 +- 3 files changed, 38 insertions(+), 14 deletions(-) rename R/{access_check.R => access_check_delete.R} (100%) diff --git a/R/access_check.R b/R/access_check_delete.R similarity index 100% rename from R/access_check.R rename to R/access_check_delete.R diff --git a/R/gen_auth.R b/R/gen_auth.R index 35605d8..5672ae1 100644 --- a/R/gen_auth.R +++ b/R/gen_auth.R @@ -17,7 +17,7 @@ #' gen_auth_save <- function(database = c("all", "genesis", "zensus", "regio")) { - if(database == "genesis"){ + if("genesis" %in% database && !"all" %in% database){ username <- gen_auth_ask("username") password <- gen_auth_ask("password") @@ -48,7 +48,7 @@ gen_auth_save <- function(database = c("all", "genesis", "zensus", "regio")) { # Logincheck perform_logincheck(database = "genesis") - } else if (database == "zensus"){ + } else if ("zensus" %in% database && !"all" %in% database){ username <- gen_auth_ask("username") password <- gen_auth_ask("password") @@ -80,7 +80,7 @@ gen_auth_save <- function(database = c("all", "genesis", "zensus", "regio")) { # Logincheck perform_logincheck(database = "zensus") - } else if (database == "regio"){ + } else if ("regio" %in% database && !"all" %in% database){ username <- gen_auth_ask("username") password <- gen_auth_ask("password") @@ -112,7 +112,7 @@ gen_auth_save <- function(database = c("all", "genesis", "zensus", "regio")) { # Logincheck perform_logincheck(database = "regio") - } else if (database == "all"){ + } else if ("all" %in% database){ message("Saving credentials for Genesis database") @@ -239,7 +239,11 @@ gen_auth_get <- function(database = c("all", "genesis", "zensus", "regio")) { } - httr2::secret_read_rds(auth_path, "RESTATIS_KEY") + if(is.null(sys.call(-1))){ + print(httr2::secret_read_rds(auth_path, "RESTATIS_KEY")) + } else { + httr2::secret_read_rds(auth_path, "RESTATIS_KEY") + } } else if ("zensus" %in% database && !"all" %in% database){ @@ -257,7 +261,12 @@ gen_auth_get <- function(database = c("all", "genesis", "zensus", "regio")) { } - httr2::secret_read_rds(auth_path, "ZENSUS_KEY") + if(is.null(sys.call(-1))){ + print(httr2::secret_read_rds(auth_path, "ZENSUS_KEY")) + } else { + httr2::secret_read_rds(auth_path, "ZENSUS_KEY") + } + } else if ("regio" %in% database && !"all" %in% database){ @@ -275,7 +284,11 @@ gen_auth_get <- function(database = c("all", "genesis", "zensus", "regio")) { } - print(httr2::secret_read_rds(auth_path, "REGIO_KEY")) + if(is.null(sys.call(-1))){ + print(httr2::secret_read_rds(auth_path, "REGIO_KEY")) + } else { + httr2::secret_read_rds(auth_path, "REGIO_KEY") + } } else if ("all" %in% database){ @@ -293,8 +306,11 @@ gen_auth_get <- function(database = c("all", "genesis", "zensus", "regio")) { } - print(httr2::secret_read_rds(auth_path, "RESTATIS_KEY")) - + if(is.null(sys.call(-1))){ + print(httr2::secret_read_rds(auth_path, "RESTATIS_KEY")) + } else { + httr2::secret_read_rds(auth_path, "RESTATIS_KEY") + } if(is.null(sys.call(-1))){ message("Credentials for Zensus database") @@ -310,8 +326,11 @@ gen_auth_get <- function(database = c("all", "genesis", "zensus", "regio")) { } - print(httr2::secret_read_rds(auth_path, "ZENSUS_KEY")) - + if(is.null(sys.call(-1))){ + print(httr2::secret_read_rds(auth_path, "ZENSUS_KEY")) + } else { + httr2::secret_read_rds(auth_path, "ZENSUS_KEY") + } if(is.null(sys.call(-1))){ message("Credentials for Regionalstatistik database") @@ -327,7 +346,12 @@ gen_auth_get <- function(database = c("all", "genesis", "zensus", "regio")) { } - print(httr2::secret_read_rds(auth_path, "REGIO_KEY")) + + if(is.null(sys.call(-1))){ + print(httr2::secret_read_rds(auth_path, "REGIO_KEY")) + } else { + httr2::secret_read_rds(auth_path, "REGIO_KEY") + } } else { diff --git a/R/gen_catalogue.R b/R/gen_catalogue.R index 03ca053..b0f780d 100644 --- a/R/gen_catalogue.R +++ b/R/gen_catalogue.R @@ -121,8 +121,8 @@ gen_catalogue <- function(code = NULL, par_list <- list( endpoint = "catalogue/statistics", - username = gen_zensus_auth_get(database = rev_database_function(db))$username, - password = gen_zensus_auth_get(database = rev_database_function(db))$password, + username = gen_auth_get(database = rev_database_function(db))$username, + password = gen_auth_get(database = rev_database_function(db))$password, selection = db, sortcriterion = sortcriterion, ... From 32a95cb2495b757747a59ffd9541b7dd3c89de4e Mon Sep 17 00:00:00 2001 From: KovaZo Date: Tue, 2 Jul 2024 20:10:18 +0200 Subject: [PATCH 25/52] =?UTF-8?q?Updates=20f=C3=BCr=20tests?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- R/access_check_delete.R | 86 -------------------------------------- R/gen_alternative_terms.R | 10 ++++- R/gen_api.R | 4 +- R/gen_catalogue.R | 10 ++--- R/gen_find.R | 34 ++++++++------- R/gen_meta_data.R | 12 +++--- R/gen_update_EVAS.R | 6 +-- R/utils_dataprocessing.R | 10 ++--- R/utils_httr2.R | 3 +- data/EVAS_numbers.RData | Bin 38798 -> 39014 bytes 10 files changed, 49 insertions(+), 126 deletions(-) delete mode 100644 R/access_check_delete.R diff --git a/R/access_check_delete.R b/R/access_check_delete.R deleted file mode 100644 index 605a042..0000000 --- a/R/access_check_delete.R +++ /dev/null @@ -1,86 +0,0 @@ -#' access_check: Check if you can access the database(s) -#' -#' @description Function to check if the user can access the wished database(s). Testing for Genesis and Zensus. -#' -#' @param database Character string. Indicator if the Genesis database, Zensus database, or all available databases are checked. Default option is 'all'. -#' -#' @return Character string. Information if the user can access the wished database(s). "Yes" indicates a positive result, "No" indicates a negative result. -#' @export -#' -#' @examples -#' \dontrun{ -#' # Check if you can access all databases -#' object <- access_check(database = "all") -#' object <- access_check() -#' -access_check <- function(database = c("all", "genesis", "zensus", "regio")){ - - gen_fun <- test_database_function(database) - - #----------------------------------------------------------------------------- - - if ("gen_api" %in% gen_fun){ - - par_list <- list( - endpoint = "helloworld/whoami", - username = gen_auth_get(database = "genesis")$username, - password = gen_auth_get(database = "genesis")$password - ) - - results_raw_1 <- do.call("gen_api", par_list) - - results_json_1 <- test_if_json(results_raw_1) - - results_json_1 <- test_if_okay(results_json_1) - - } - - if ("gen_zensus_api" %in% gen_fun){ - - par_list <- list( - endpoint = "helloworld/whoami", - username = gen_auth_get(database = "zensus")$username, - password = gen_auth_get(database = "zensus")$password - ) - - results_raw_2 <- do.call("gen_zensus_api", par_list) - - results_json_2 <- test_if_json(results_raw_2) - - results_json_2 <- test_if_okay(results_json_2) - - } - - if ("gen_regio_api" %in% gen_fun){ - - par_list <- list( - endpoint = "helloworld/whoami", - username = gen_auth_get(database = "regio")$username, - password = gen_auth_get(database = "regio")$password - ) - - results_raw_3 <- do.call("gen_regio_api", par_list) - - results_json_3 <- test_if_json(results_raw_3) - - results_json_3 <- test_if_okay(results_json_3) - - } - - #----------------------------------------------------------------------------- - - # Return the result - return( - paste( - if("gen_api" %in% gen_fun){ "Genesis:"}, - if("gen_api" %in% gen_fun){ results_json_1}, - - if("gen_zensus_api" %in% gen_fun){ "Zensus:"}, - if("gen_zensus_api" %in% gen_fun){ results_json_2}, - - if("gen_regio_api" %in% gen_fun){ "Regio:"}, - if("gen_regio_api" %in% gen_fun){ results_json_3} - ) - ) - -} diff --git a/R/gen_alternative_terms.R b/R/gen_alternative_terms.R index 0666d8f..d272d40 100644 --- a/R/gen_alternative_terms.R +++ b/R/gen_alternative_terms.R @@ -52,10 +52,18 @@ gen_alternative_terms <- function(term = NULL, results_json <- test_if_json(results_raw) - if (length(results_json$List) == 0) { + if (length(results_json$List) == 0 & length(gen_fun) == 1) { stop("No related terms found for your code.", call. = FALSE) + } else if (length(results_json$List) == 0 & length(gen_fun) > 1) { + + termslist <- "No related terms found for your code." + + list_resp <- list("Output" = termslist) + + return(list_resp) + } else { # similarity von Woertern berechnen und nach diesen Ordnen? diff --git a/R/gen_api.R b/R/gen_api.R index ee65732..e635146 100644 --- a/R/gen_api.R +++ b/R/gen_api.R @@ -33,7 +33,7 @@ gen_api <- function(endpoint, ...) { #' httr2::resp_body_json() #' gen_regio_api <- function(endpoint, ...) { - httr2::request("https://www-genesis.destatis.de/genesisWS/rest/2020/") %>% + httr2::request("https://www.regionalstatistik.de/genesisws/rest/2020/") %>% httr2::req_user_agent("https://github.com/CorrelAid/restatis") %>% httr2::req_url_path_append(endpoint) %>% httr2::req_url_query(!!!gen_auth_get(database = "regio"), ...) %>% @@ -55,7 +55,7 @@ gen_regio_api <- function(endpoint, ...) { #' httr2::resp_body_json() #' gen_zensus_api <- function(endpoint, ...) { - httr2::request("https://www.regionalstatistik.de/genesisws/rest/2020/") %>% + httr2::request("https://ergebnisse2011.zensus2022.de/api/rest/2020") %>% httr2::req_user_agent("https://github.com/CorrelAid/restatis") %>% httr2::req_url_path_append(endpoint) %>% httr2::req_url_query(!!!gen_auth_get(database = "zensus"), ...) %>% diff --git a/R/gen_catalogue.R b/R/gen_catalogue.R index b0f780d..6cbab9e 100644 --- a/R/gen_catalogue.R +++ b/R/gen_catalogue.R @@ -63,7 +63,7 @@ gen_catalogue <- function(code = NULL, list_of_cubes <- "No 'cubes' object available for 'zensus' database." - } else if ("cubes" %in% category && (db == "gen_api" | db == "gen_zensus_api")) { + } else if ("cubes" %in% category && (db == "gen_api" | db == "gen_regio_api")) { results_raw <- do.call(db, list( endpoint = "catalogue/cubes", @@ -109,7 +109,7 @@ gen_catalogue <- function(code = NULL, } - list_of_cubes$Object_Type <- "Cube" + list_of_cubes$Object_Type <- "cube" list_of_cubes <- tibble::as_tibble(list_of_cubes) @@ -163,7 +163,7 @@ gen_catalogue <- function(code = NULL, } - list_of.stats$Object_Type <- "Statistic" + list_of.stats$Object_Type <- "statistic" list_of.stats <- tibble::as_tibble(list_of.stats) @@ -217,7 +217,7 @@ gen_catalogue <- function(code = NULL, } - list_of.tabs$Object_Type <- "Table" + list_of.tabs$Object_Type <- "table" list_of.tabs <- tibble::as_tibble(list_of.tabs) @@ -229,7 +229,7 @@ gen_catalogue <- function(code = NULL, if (all(c("tables", "statistics", "cubes") %in% category)) { list_resp <- list( - "Cubes" = if(length(list_of_cubes) == 1 | db == "gen_zensus_api"){tibble::as_tibble(list_of_cubes)} else {forming_evas(list_of_cubes)}, + "Cubes" = if(length(list_of_cubes) == 1 | db == "gen_zensus_api"){list_of_cubes} else {forming_evas(list_of_cubes)}, "Statistics" = if(length(list_of.stats) == 1 | db == "gen_zensus_api"){tibble::as_tibble(list_of.stats)} else {forming_evas(list_of.stats)}, "Tables" = if(length(list_of.tabs) == 1 | db == "gen_zensus_api"){tibble::as_tibble(list_of.tabs)} else {forming_evas(list_of.tabs)} ) diff --git a/R/gen_find.R b/R/gen_find.R index 0ce35fc..c1f1dad 100644 --- a/R/gen_find.R +++ b/R/gen_find.R @@ -56,6 +56,8 @@ gen_find <- function(term = NULL, res <- lapply(gen_fun, function(db){ + browser() + #--------------------------------------------------------------------------- if(db == "gen_zensus_api" & category == "cubes"){ @@ -135,7 +137,7 @@ gen_find <- function(term = NULL, df_table$Variablen <- spezifisch_create(df_table) - df_table$Object_Type <- "Table" + df_table$Object_Type <- "table" #------------------------------------------------------------------------- @@ -149,7 +151,7 @@ gen_find <- function(term = NULL, df_stats$Variablen <- spezifisch_create(df_stats) - df_stats$Object_Type <- "Statistic" + df_stats$Object_Type <- "statistic" #------------------------------------------------------------------------- @@ -164,7 +166,7 @@ gen_find <- function(term = NULL, df_variables$Variablen <- spezifisch_create(df_variables) - df_variables$Object_Type <- "Variable" + df_variables$Object_Type <- "variable" #------------------------------------------------------------------------- @@ -181,7 +183,7 @@ gen_find <- function(term = NULL, df_cubes$Variablen <- spezifisch_create(df_cubes) - df_cubes$Object_Type <- "Cube" + df_cubes$Object_Type <- "cube" } #------------------------------------------------------------------------- @@ -318,7 +320,7 @@ gen_find <- function(term = NULL, df_table$Variablen <- spezifisch_create(df_table) - df_table$Object_Type <- "Table" + df_table$Object_Type <- "table" #------------------------------------------------------------------------- @@ -375,7 +377,7 @@ gen_find <- function(term = NULL, df_stats$Variablen <- spezifisch_create(df_stats) - df_stats$Object_Type <- "Statistic" + df_stats$Object_Type <- "statistic" #------------------------------------------------------------------------- @@ -434,7 +436,7 @@ gen_find <- function(term = NULL, df_variables$Variablen <- spezifisch_create(df_variables) - df_variables$Object_Type <- "Variable" + df_variables$Object_Type <- "variable" #------------------------------------------------------------------------- @@ -497,7 +499,7 @@ gen_find <- function(term = NULL, df_cubes$Variablen <- spezifisch_create(df_cubes) - df_cubes$Object_Type <- "Cube" + df_cubes$Object_Type <- "cube" #------------------------------------------------------------------------- @@ -568,7 +570,7 @@ gen_find <- function(term = NULL, df_table$Variablen <- spezifisch_create(df_table) - df_table$Object_Type <- "Table" + df_table$Object_Type <- "table" #------------------------------------------------------------------------- @@ -580,7 +582,7 @@ gen_find <- function(term = NULL, df_stats$Variablen <- spezifisch_create(df_stats) - df_stats$Object_Type <- "Statistic" + df_stats$Object_Type <- "statistic" #------------------------------------------------------------------------- @@ -592,7 +594,7 @@ gen_find <- function(term = NULL, df_variables$Variablen <- spezifisch_create(df_variables) - df_variables$Object_Type <- "Variable" + df_variables$Object_Type <- "variable" #------------------------------------------------------------------------- @@ -605,7 +607,7 @@ gen_find <- function(term = NULL, df_cubes$Variablen <- spezifisch_create(df_cubes) - df_cubes$Object_Type <- "Cube" + df_cubes$Object_Type <- "cube" } @@ -701,7 +703,7 @@ gen_find <- function(term = NULL, df_table$Variablen <- spezifisch_create(df_table) - df_table$Object_Type <- "Table" + df_table$Object_Type <- "table" #------------------------------------------------------------------------- @@ -747,7 +749,7 @@ gen_find <- function(term = NULL, df_stats$Variablen <- spezifisch_create(df_stats) - df_stats$Object_Type <- "Statistic" + df_stats$Object_Type <- "statistic" #------------------------------------------------------------------------- @@ -793,7 +795,7 @@ gen_find <- function(term = NULL, df_variables$Variablen <- spezifisch_create(df_variables) - df_variables$Object_Type <- "Variable" + df_variables$Object_Type <- "variable" #------------------------------------------------------------------------- @@ -844,7 +846,7 @@ gen_find <- function(term = NULL, df_cubes$Variablen <- spezifisch_create(df_cubes) - df_cubes$Object_Type <- "Cube" + df_cubes$Object_Type <- "cube" #------------------------------------------------------------------------- diff --git a/R/gen_meta_data.R b/R/gen_meta_data.R index be7353e..567ecb0 100644 --- a/R/gen_meta_data.R +++ b/R/gen_meta_data.R @@ -643,7 +643,7 @@ gen_metadata_cube <- function(code = NULL, #' @examples #' \dontrun{ #' # Find meta-information of the table with the code "11111" -#' object <- gen_metadata(code = "11111", category = "Table") +#' object <- gen_metadata(code = "11111", category = "table") #' } #' gen_metadata <- function(code = NULL, @@ -670,34 +670,34 @@ gen_metadata <- function(code = NULL, if (category == "cube") { gen_metadata_cube(code = code, - database = odb, + database = rev_database_function(odb), error.ignore = error.ignore, ...) } else if (category == "value") { gen_metadata_val(code = code, - database = odb, + database = rev_database_function(odb), area = area, error.ignore = error.ignore, ...) } else if (category == "variable") { gen_metadata_var(code = code, - database = odb, + database = rev_database_function(odb), area = area, error.ignore = error.ignore, ...) } else if (category == "table") { gen_metadata_tab(code = code, - database = odb, + database = rev_database_function(odb), area = area, error.ignore = error.ignore, ...) } else if (category == "statistic") { gen_metadata_stats(code = code, - database = odb, + database = rev_database_function(odb), area = area, error.ignore = error.ignore, ...) diff --git a/R/gen_update_EVAS.R b/R/gen_update_EVAS.R index 1f8dd42..b9d3624 100644 --- a/R/gen_update_EVAS.R +++ b/R/gen_update_EVAS.R @@ -31,16 +31,16 @@ gen_update_EVAS <- function(){ # Read the HTML content of the URL html <- rvest::read_html(url) html <- rvest::html_nodes(html, "table") - html <- purrr::map_dfr(html, html_table, convert = FALSE) + html <- purrr::map_dfr(html, function(table){rvest::html_table(table, convert = FALSE)}) html <- html[, c("EVAS", "Beschreibung")] html$Titel <- paste(html$EVAS, html$Beschreibung, sep = " - ") attr(html, "Update_Date") <- format(Sys.Date(), "%Y%m%d") # Modify the data object - html <- html + evas_list <- html # Return the modified data object - save(html ,file = data_path) + save(evas_list ,file = data_path) } diff --git a/R/utils_dataprocessing.R b/R/utils_dataprocessing.R index 29668e3..283660d 100644 --- a/R/utils_dataprocessing.R +++ b/R/utils_dataprocessing.R @@ -58,7 +58,7 @@ forming_evas <- function(list_of) { data_path <- system.file("data", "EVAS_numbers.RData", package = "restatis") # Load data - evas_list <- load(data_path) + load(data_path) #----------------------------------------------------------------------------- # Process them @@ -655,9 +655,9 @@ check_function_input <- function(code = NULL, #----------------------------------------------------------------------- - if (!all(category %in% c("Cube", "Statistic", "Table", "Variable", "Value"))) { + if (!all(category %in% c("cube", "statistic", "table", "variable", "value"))) { - stop("Available categories for parameter 'category' for 'genesis'-database are 'Cube', 'Table', 'Statistic', 'Variable', and 'Value'.", + stop("Available categories for parameter 'category' for 'genesis'-database are 'cube', 'table', 'statistic', 'variable', and 'value'.", call. = FALSE) } @@ -668,9 +668,9 @@ check_function_input <- function(code = NULL, else if("gen_zensus_api" %in% database) { - if (!all(category %in% c("Statistic", "Table", "Variable", "Value"))) { + if (!all(category %in% c("statistic", "table", "variable", "value"))) { - stop("Available categories for parameter 'category' for 'zensus'-database are 'Table', 'Statistic', 'Variable', and 'Value'.", + stop("Available categories for parameter 'category' for 'zensus'-database are 'table', 'statistic', 'variable', and 'value'.", call. = FALSE) } diff --git a/R/utils_httr2.R b/R/utils_httr2.R index 32465f7..fa48cd5 100644 --- a/R/utils_httr2.R +++ b/R/utils_httr2.R @@ -107,8 +107,7 @@ test_if_error <- function(input, para) { } else if (input$Status$Code == 104 && isTRUE(para)) { - message("No object found for your request. Check your parameters if you expected an object for this request. Artificial token is used.", - call. = FALSE) + message("No object found for your request. Check your parameters if you expected an object for this request. Artificial token is used.") empty_object <- TRUE diff --git a/data/EVAS_numbers.RData b/data/EVAS_numbers.RData index 1548e9f08c0ebf5265f72886b5f3dd825da76721..9e4613e98e601145e94b52c4ae39790a7c5a6d18 100644 GIT binary patch delta 38183 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 AvH$=8 delta 38093 zcmZs>byVNX6F!O-hvM$;4jdv<)LNK7GsIgX`-rXQ-54&si-9x zctU>SFkPI)Z;f1OO%0C;`6r5SI5Z@Zo=GTe#>sJqsm>>N2VyQ)d)GGGMJsoh zPYK+$O$j`WyLQ0%9#*{0>v9_O$NT zuJj9pGCN8?ye>;W?w%?QIf*knR_7U03nk*4j!&@+=5lRy-=iUJ?9?D_PlbT06}#K3 zw!=4vIpF^OJHpoeJrB-vH{Q#kcNX_;+9EUfTQ~R{_~+MK6vi`1{J0+Y=U8wU0w~K$ zKkH5u&zNbeDBZ(1EXVm>cAJ}&`e%PeL1XjI7*Kg=U-~ z%eQXIFDY;KVWJSGl?NZRokqm5q6%$^2Cleu@9${8T?Y*}E)Ushb=`ABTy9DFPkl(_ z2LyYEzY_EDEzw5zIOn|YN^7uBC25we^)>-_4Dq4ahs+?lzcq?|(%4IbAFG{0<4T0lyLw%5CckX8$1bI7q}#-zA2|bpPz1u=;6d+6i4OtX5zox1eJPx~6z6(%HEGV~K7yT7 zk5NjI=uK0}%zoPw|LkC--N=*<@i(^5l)w8ZV#yQ=oS63KpH?22|Es%RI}>rinAC|2{FO`YYKIHz-@?Zg1NcQp8kn{kL-+2qpo-6C1RZ(CBtKV>n+%Pw7Js7(UfuQ)i zSQ=oQgvl4EPjlO%ykA#05=8dAIc-0D!nN;)?{bQW^j)y5&`@N--&(&z}S^iITA(7Ia$hQRIrCg8tYdSJMe#PV1KZTo3|%Qan-Rtr|EG#4)+E%RK| zg7ZB2qu5DL%C?dcQ<_H_j*WKZwF=rcBlq!c?>cu6?DcD}g=ruhE2ge>1($8+mowo^# z5&y9`@TPvK&M9j9A40~1!TbBCdK}&309(M+HN0m`>=UdfO0ZAFll9F?(~l>tD~I8Q zqy17IOfztBY*h%RBq)6*xaJgcmZ!RpvzG34VQ{T3$UaQSNz9wT2f1#cpm(vcZqq0T z!C*_e(!ILigKAC`9yK@~wH_4kx39NGy6aju=ceSMmgwraJ&WNrX;GS2Z+}XKgyORQM zAm6*+u7AP*llX9fOU3I@TtkKoQg_GJNQc_^=Ct67`mrC|dq!v6#BL#ycKw$Pdbfn- z`9$FvLgtA_Zn=yi25~fc0M^IG#I2TOb^$znNIZ9l{~vr6rPJes|G^HQhZ^Z0d^>vt zw~Vu7XmTt)r%uJL3D8AE2M@Nr0|}eXc45wv`~lb%7)da2+kWaE#!k}zgdYe}aY`tH z*OrVQa^}9<6RYn@$e-PhyvD9O34~6gTx8@9$nI+J|l;%`W1r^9xZv zBAz&KdH1;i^z#2;S%H8pNH_gmH+@$(efU3s@2N*B)juyR?zXoNC}~7E0xo0gtQDbo zXwK?n(d{OgjFbH28$VIK`fVt7InbQ(!jeNHi6I_I_a}7U134AbfPd|6+_Xjw`$i!W z^jji*m`u?emAW>xZaB0~+MQd%$D6#f19fXN)X}kD$K1S;d$&mNAK3oK-)CMl8(unre^E&l^&dErViCpMhBM z;Q`Y=vj=>b)r1$jxvqYMwKHSxfC4(>hszL06V?)@uKuN?v#t2pa3Uj>UO39D#f-l9 zxvqn=NZr7|2o^eZme~{vBh{V2kRh3_JWJq}*q!gN6zmIZq?evxp5c3UHDI4|^)maq z$gfMF8PUhajQvcyOT3C`Ru}ZHlRc0Ht-JobWjgq2^>FY?Fce5X&Une(-JgZUJ=zrc zoafknq$_FQ;2daQHb#oK(K3)#sb>(FqT;)d^JDQ^&K*T6-I`pn9+i4Ew5$`gsfaZz zI#kW6pBA*6YTN&3A(Xxh70}WoulyycpVyDlu9WsUYm&^W4L-!M?GM?>l=C9EFCZ$I z6gx$^?+W+QT0j28h#XNpUp1Ghd z9gtOyNysO8N7qb*o>`zSjgeJ`O9&cSWmVOg;G$aLq5@J;pwG}|fRuslh#*)ww4F3qc9{fGn|viCb0eP-^vn}VL+Le80h5UTG92ZhUDXnU zOVqoaf~ZdqVaZh}ey}egi8}Zbj%0m~WDc1T;|7Gdm1rs6th-OSt)MJU{=|-lMxKZs z6v4OcJ0qVn;J<$R5)ukn*P(!iU^!X;k1RWGAYlld{<&Gg|9tKLOF7W3eS-DRAV$IH z7LQdQIN#3ZNQyOuV6AR^=yq@8e=!aw*twgVZW|x-I?9ym+q*Hi^&JY~M~A|C<2+lWsy^ z{}&Pd#R#GLmyqa(0HvPeetXw{j}Tb9thI5jy>Q_g&RofXNrRydWcr6Yw_X%G$~K?Y z4S()E*Q?tWkC*i}pGyP5Cx@liZV?ZjFJ7}#9^;d4pt=hj*5W)UHNW^FK(c*OPnYzp}#^y zK2N;qaNj{&CpevRJ3d8yQBQ;p?N=;&0&d)ABN;WkitPvU20@K4I^uIe1Ub8o>LEVE`pv&$9LcoO^BWx-@5Lq$>QukN#z+%;})x3ml`e$T`fn;NV5l(#0IX!?l%B1wVY#P#FLyaC9^13YkqB9pN>IvIg+6RHCP`uh?qF1N7N25H!%={z?b(h)zE;Pp{nXwZ z1sre_?09zL1rhb?Yj$|wj7Tf(KUr|U-dnuTP8B(Ofjeu~w?YH9@0;XXb#_}hPL<_7NM@^dnlMi{AbKF z+lHVJf3vs@3W1q9{QR2YTRdX1Cs-P#$ff+?o(?b0=v5)y`KUPuPq0Y)pNkB!UrtS+ z-a!&VQ7!9WW%qa@;|00sFDEtY0e_~A&c4|L;_O62D^8_1%uGa_A3GH?cuG>$ zG+|90Zz_SIKR8BS)-BemPC0p_fH`yVXNPrZ%Q=EK;^YQ_tf-DC9WI`KHu3K&$lO@c zdwJ`+TitwYY>J-SP>pxIl2^@MIRX2SYsarHF5xeba&`b`=vE8)cF_|^F@^7q*hTF8 zGl|+}!8Toi4a`3htg%P=DJ?A?ks8vfv}n?}1;|C7qhEBCNPZ>hfYMtA0(A%?++|u% zD<*D#@AJ*?uW81&OS?OQLVt3`%+ba^Ijb(bI>bGgC99`WufR$lC7V69ixf8RZE^cg zT5a|OqLWQ=*{T<|m=xaP|@?qG^8vSzvelso2lns?`HG zO9N-6!P%+<1d_@4u8e#DUc8dB?XlZ7n{_40(k09}1P`eiNaNfT514EeNw{mT0F}tO zJcmB~5gbn?quF&V`Lko`uava{zjWdhiIIsAq3<9`+=wKFX~Yl3_mKS#=qHyoskdLf zT+$7EGKpv<$xz;H(iPN}vtg*6iHDd2;VaRKqfMczswQ6Jl(ZlL)$u2yxbK5aJDz_v z!tji~ZwfCCh-xitgtglhh4%Zo@OQTb;=~3$^hKTHgkBNIl)BCD7klw_s!G0BMdI9R0e@&Q;Wz5bWsybt0{goeba6`_*IxrjtHlZxFR#vxPv!u%@UPj+Argu_|-l5CVO8-erKx~7uT1(fN?R1+2!EwMu>(t%L6=+GkCwn``!08p{$`R+hLqMr)ul= zT13+UTe6~=x5wakQuU0*CY14!LWEOec!S`USf_2?QKfi>J?$f^kZn?y({=M~gSLGgoFe5o}l=)iF7_-+tX3L!xQAI@~?crdDZhyNL{V^?X3p z7&;#`@@*{exr!$$awBkaP9?$he(2`{Uxdqp^zH;`Zlr_4W3xH1T>ABs_v0FTKb@k&5IdDrDm@AmY3{Iv9St6xtiyLQ*vK$EY)`$rQA1jI?w zf?OOh%guIUkD>@CEV^7KCr7eFVoqpv91?+)0&vaALaEd6yGx|-Z$0*yJaL{(tz?dS)FI0OcA5ri@2=Ytg zKW#HSn$`8wgE=k2Y+63)#F*URJsF$*8yEnH>(|YjiQ4P?d_U`j(Y}NQebtE(3b@GL zG7<d9@#YJm;2N7x|fB!c|Af#)B|RDX&t5;#OtFeq~Q8SU-BeL+3QHu$Nr)0=R>+R>|R%BuPNUZUelU@>YB? z1~E`S{h`s;5uj)H>@JcQClvQ0Gl8#25FRjpVAeL~00H5cNWCY5XEjoKOxGnQbG?Ij zGG*^p58BQ->bEcdNT5$&Yk;EKq^OC2MyNOrC(N{92+{mlu%CbYoY72&2lY1 z<5%dsmSw77-S9zoPW(wrQ|-siVPfx(zu5rIqvd8M33AP@3}o}4-XfH<_&DjLKsK;+ zGS0d8*$Fs?ga*znCc3sd@`RIloxjn4?}(10e3>{g{kFpIPDTc-su@R*2Y@L70YPaa zo?EAejjg7g^+*%Zz!GhesMDv2X8FN*_GCJ4OpKl4n{C64(z<)dwy5>^AF%u`cJjbj zl}7nk--wJCujq^-++o$3$o{Tvoc4oXPCeguMh$KO^x2)^du2(n1@fb(ImNibqjv}2 z-*aGg-KgB1ufO2r8c$Ebf||Z$)z{cfUBayjzGn!>$Z&msFkI8$YR%Q-gw^&WMb1S0 zr*NMB=Lfm(`PbV*@LUZ^W7Hoa$d=IHeMYyR4;fuc2h(LUzEW$wyx)3}mi?871mvC?x3z;8zhet#t zVrMzuz^zp~w(kWYb9`$Dlig;7whOxxs8`LO{YFD9jgcuEYzQzbXl6!9puY~x5)ylC zEo~f*6_|s<-aZ}dgFB$V+4hI2i((Ua|~tOr+?dH;Ycm`i;~b2M(=D>sj76mv%&J}53^6n71{9Z(QpcvJd7&4zBP z@c!&4HTUAPDMq1zHIki^eULkPNdR&}qaaa!VmWVWSMr!>MMEa>I3*kmU|LIIxAv$M zYIL!9s0BQj_}Makng>m#)1CEx_cKi@8R1d&!qT}_yvy<^jm2xiGEH0#4Z89pu zOgi6KdKwPelx*7V$@LDU6AZk5H>po#1 z{HTKENE!@@P^xP&7BR%LCAq*Wl6LPapplW-+QgMk<1>BTLG%OdqD{0YILWvR`tPtG zyaPWOwdhkKd`xBIP`N@ZK&WC0=x7HrII$Cc0n#}`f9fTZwI)1d@5tr0?)ftxZVGg- zjaj4KclOPL*o1_QbzOQ4>)kncDDh(mc9jsgh+1w}Xfk)`4@=*3Yv7kH%!E4vxV8iC z4ahwpIVyJ%5LT5>t|;)MjmdeiX|yS(r~ush2MM64y&n;C96_NIqF2OWRD*QWv0T?H!OEEj;8doFBzNrv-IOJ+`Bn z(_9j**8iSBJlebdl>ZA+=r&>l_oFu)3X zJ;f+Rp1-bO5}1ddvSUWBSD=L1K%N`d=$Zplg5zw3fk5cN+lNg*KOBS;+9-5tcqPgm zJ2o!b>$#J?kDLqFViH4og*&_Y^y_!LN1kHRk=yFXuG{fBr(-dn4Y9hIR8b7PEy>o{ zuXtETM$66E^NPu}=O&~jJ?MlPeSnka;_MGIzh5^~#GCeanGU^PP>#~P`_4yGsO08L z@Yo{jCnm!rqF7KOIXQh9%l;b4rHW6oTE7YJl5QHI43mW|S|#gK!8F;JAy+_EA$tk_ z{!a_tpId8{W6BS4A0-l1QGZmEKuv7~a-=1ra5LW`E<=w-8ZH=SjtN#x^&L;U=~6Wx7lw-0%KXpA3(!@*tip7v5tvyW;J+U`uxsu4{4;1Q0&zm$anz#7I#}&J z{l~csKmCjBhd)o$XdiRhPvLmmNB4?pSSXqv)#1LpYCoou{RKi0lMLOaUchQuh}Xp+ ziJ;Bv>mz1P{;ZlWKy z`E-bLX+aeK()msp1Uh>1u*m zZxAjzj2v<|s}U4B^N#+Y4201_fvwMA`QBe|4i5&NsK=*zs(_;%7TzZ)DbZC)JFed8 z$*>-SGiK74KPVUH67OO(C#6iKYGy9zFgRF8Q3;iXV!PDVG6Q_;dYj8+BVw5fy@??2 zk_UP&xOFKba+x}`(6NR9#tQh9XQwY+In%1{l5}!=#mn&DJ@AI;ep=Zhy2T0h)64Tr z^bIsvE{FGZ7iXyK38qk3Vs{OsJ<3BXlSFpV6K~)r?6hkHxdKjHI5Jqf73*8{Pc(1> zyr-eO_P2sAi-7zD@mDiRr2$l(f_}WCQC7!;%f1S>P))cX^+wqaZrksPY?>u^0eP-P z^C|Zss*cZ_GoNp!wodF+d1e(B|3(;jcPYFaTa5K15l1nl{_QJ>#oDhG*DWF>#20)$^10A3w^gw}UnJ`=WVp;T@Pw6uFM4QcQ#uSJNyi zL*i?-Y=IC@!jb~?_CCA*xE6o&_CI6S5O?}kyky}UBY}>X~Rp}xQJho3NvB1g( zF*&ANJ2zrYbZ?^yWwV85KTaB6v<~D7Lg(hCxN_5%4Ho|FIlt(OTN?^z?om|&gDJ-a4DBRMm+JPnq_!PXrh#E@(- z&!jLgGAKtMhZI1|&#lBLMI=?t5Q{bg*FMU1Edxuc@h2lnWSL4_mr#R$W-*J!oBeH5kAfmp+ z(~>d(B|mH!8<@Wy=Xm1Nb?mBNCS1ist!U<}!U`&1>cpTlKg<7%97$01E-~eyC+6QG zRwPc#&58SPTH(QUI}{f&U;1oN#GXb~S$A0K zo1BL;cl}5;k9OzIeM+}lt__pnda@iS_4t`^-S-I{j7AB)hkx~f`KQS^yeeVk_z-2~ zE1}t2z`(%Hk*>%r{AQk}dA$UCN@H=uhPviSSY1LEPj^vt>|NY2-Mf#@H@5i75?L$= z&Mk$N$x4qp^JsOL6;22<{0uH`+^iKuRl4yceo1gw){{u;!I?1{aF_= z^=B4(UHsd_YJr&$YLWQGWSrEV=iOKJdc`aOOE4qG0zLV@h8ZJ?#Sr_eNMb7T2lwZ9 z&DpkRH_4=AJ5eED3xUj{g`s)YA<27{LGiUkSR`m$ z0r1V-@#!sE&M@zxU60ly4JSqo9ierxG6CU zv&%c!xu{>(ttiVanDf*R1 zkShf~`s(uiDssmV6h(}PEqiEN*XhQfRw!EEHRj}Y!pWCv=wms*GkYdVh{IQh(Wgk= z48%YkrJ^G%_tFf~D?Cuuy<+(wi1sr`jnaD`>wZ<-A)wO19n5_0gr#%|>g=J)k-)`L zJfsa=K@7mvqn9PixMa+b2tvVkn%@(z4Jh%MqH*Z2G*i|Vi`N~l3GR;92$E!mxX}* zGf#|QG*{HVY!nvx=o=>7{2Kn5R$Bf%d66Kc-@J(9_it936IP@$>RBgy-^;+ZWs?@PhMTW895R`nwFLKEQ%v5)*>Q zEuO=Ss3lw9W^SL`pRKY^^LtjI<7JdB+ta6T|1v!}%l*W`=AzhU(~oJqONEb(mOlHNu<$y;IGG z4sldXox1J(9|%8usP{5n1R!(;ZeIS&9_!^zEQ)@zewNI$FrxpHG_;i|4GP+$(EF=U z4iD`Kbzc0wmNUSSW*(RaJU?tf2&TmyY zSH5;O%INd|f%7~$b1bb=cr|^cWcVPn7qeYaAIGg8zVR?UY+@|dI(!mPRQ%oxUcMc=j~d z+WpyDSmcS)96j*cRmak~(LD1azY_!Gffe;)dr?^BWEBLD1HkH!@e{=rjhdzMBixt% z1U2N7MfDDvJcZB`-9E;IP`XbRr*TGwmuh+qx{qkg}muh3pW^a?Mzt z#L8*MlqGQ1p}vd9nHMPsfY3`9&uNArr%T14hjk1x|ZKS+G{UeDla#LFda;aMBL zM!Y78&G^>E3VahRb1?i$AgL)9Hj~+|bHJJqrVO67(VQ zdu&x=d$6s(b?l+jE3e%cF?C0wD3ZWst1f>4uIk2&ngeJFpYsl3W0S`Ez*dO( zVv0C?lUR}q<3eypX>W1{;W{u6Y1Ot8NOd$?~@l3{eN9-n1hK$AQpb6_ZI7U7D?uUafSxt~LF4^<7v`2>rURTtz zP#qy~02Nh>;#>J%v%r@dvp-*Ol3QylN)MR%-G=+9AmVRmu`W=^q`pGPvHb?)yG*&C z8P>GV^ww&9=*EpI`dP6(mBh~{JO`gx6HPNNe}TjKiuyK6z?aT_e#w$KIQ(Uy=!LLoji&};Yk;{Qcsr^ zJ+PE8s}iS_ofwTT_o#7;8=L({YcSN*S;i^9gA_)M#n2sMSwjUMErwDKtb~=fzIG)Eqa#ZZ5R{nLtLIG&|@CjiltuDg&&+Psh*q^|iyYp+*aE3V1 zu=I)SB}Ny6LkkKLbRWsN8%LkNlU1`HbQrNI|7}0bx%)u8Cv+3tlrL11_Xfj2`dm*n zo?SEV?yu+d{;tkBjwSej5{$RKHYyY53WGITD+p9S| z>u!h=4tUE4_Y>;27`QBr+c(bosek);v4wQaioV$$tg=`>L?_Fd{1~6p9yr+${a9vp zI&Ug(FQ_!pdVCaWb^e>Dcj{)ar5N+&NXCJ&iLA4=Ou@07U_PUUg>AnuJAPqB{#H8G z{a*Zc%Y2&MSY%R7ODZbkV2)(|Brw6JrjNJcIwJOFV|>Zx^sL@r&f_7Ma9t0qgI{CN zq=1C(+(S_Cn|5_nW+Nlu@8(RsQMeiW3jZQqmxwI~c`5zrixR?E@M1vrII?kVfEoAs zOqlvKO33WZo?$Glm3A;@C4k}GR21_5}*?N zOGtTCRqx)+OJe)SzB+IoW?Bc3yur4}%I$udQozf=$1Au!S!n87yJtpD&pUmR3O);F zn5^MvODo5cq{C{~7A%T({Mg%dH4ac+X8H!2@FqbeM9`?O^peaOwdOshT*WNUNB28$ zihGDK`sk-^7iuYZCB~Ln!mrlJR!Uv+UzmOCF7o+4>HBi*%Fhx`iQ+jtA1cYf@p z7=)j9NQi<=@|Sgb%ziO^Yov*&Iu4&zJIMYw)7X^>u=?#p+$~MEK@|<@5T+<$MAzPEghJz^BSy9(@f?BeCe)A%lBfPtK z78IUPF5~hoV~Pph&TIgSW_*{f&x&6_0*ThX-|w>}f%c{0D^DjT3a47t8x3^_)7u}^ z$Y$s;!j=u**jbi)`PSzf`!c{&qlTskx4rxv)5r(?P4a$2rGWqNWU zR6EOG+vo`O)H165c^af;RS5KF!)AOZJu8wodNrzujj8sUL&5=E5nKZwsz3zj4m~-o z-WOkL`D6o5@um6CcF=cL5mbRi9k_7AN>6!E_A%XTHk$T?aa|9~rK6oFgzL zDH~l#h3*w-1!sKP6=IA!wa=>CTIei>U)3(_TsXq%_%f?W_q@%WxusGzVfqUi3J8!`$`du+SQZsRX@N+9P^W z)B(JxNG9<`ieH@bLDw5myQL=jUR;X~FU0!qNkmkTk3`?2NA=YwBwH+F&TluJ)4{zuiw^7q&IrchPaS( z_?R6t8zrn~p-qmAaUT*ane}NZF%q+$B}3o!Fop_msTAGH`ph678vKG3H8`>lK%NERz(#N z#|W;>Y>o+3Fy1TNfA9|!)XNR5Wtixjw9{qNXdU;c8jq@aI4DtN)!{lSGv43=lqKTj zeWTuv3=I!1zKci0D}|o~eBBxf{c<|x;csp>Ohm}Jo^`E(5e|mVNpf^tZ3=!%>9x== zb7RfgBY*cf2A6$XC0~z{G$nL;%?5-~sO#)vW4;3kCuL~gDxralw7jpldU-khcf-!+ z=keE2RHpQli!&HDvr3UMyc?)NAGof=IR_ry%U`+J;l!a^T7yktM>P4OHT``83)|-- z|Lm(cA17v5DG~lGYNlUQbv8FZcr`gut=3h+FdR511dE{*w!I*>SH*m=eT7B9EqutO0yYR1+Z=Br%+O=8_HdJ@srs^)%^GR|4)onL4=H%3N`ga{>Tk99PVCM730FPp?lNuDx^Lr}%IpbG4ejkqXqli{dNYtuwtyJNQjPsz2s36s?}6$6eK zgC#Rby=Ib=I{-m0JumGZt?`QrRS}PPCx5-x{L+v^uDVyCf*7=R^BI5O0Frl)$8>Sd zs7`DLTKr^$Pw=RW&B9tfmf1~29GnACb}~wn_dEQ~dKkI2an{8lE5KWjO##D2UYqwI zvi$2b({S>Dq(A}{ju!jzle5<-``?SxibP*eY~WE34yw^3495CzX5 zTeJuj15<&@`=EevFI&0s-(AtXJlhSgzN< zP!};`+UyP2Mr$Kz+Ku3718#*+d8A#2$Tw+^PL?&_pLT5yYFwd=A-A`xW2o9{|5;tCWg@cf37okKSAotkTaJqrz`XWti)^xHWpmi{5Q0u1o=ybtd_Co=!b><#w z71Kj(*uZ;9qqP4ol1goj!H9SKTj)y%-?{Ms2Z zej~j^ik|X4)X|<w_~jOk}F%t5Ecg<8M&!TJ|nZ>O|Ki+d3g7kciJ1FlC^y5coY> zB#l28Y|F{jEZyUI4Ns7T+4_{o&?jg;~LUstMd=r%vyAGGsRjJc+N{Iam!%wc(lCR`Q4giW{5AJ@R=9!?zv>|%_Qw7}^~n@BJV3g98` z(H0B~sp<%8GloGI?J}`*GEF0L(;>ppx7nT%8|bpt4f5%`jCMq9oo{runV0S&H3cwH z{r2GT`3M}l_b#4;iH|ZPJ|i1Y!$lyMgk)8v@bv|OM%~o(KjQ8Wb7FM_fKcF6m=@bmmW)={3f@McBXG1`PBEyCM|`#BEfS-seUQk8k%wT^`<&T ze@SK6W}SmOUx>N#>0x}|3y%XsInSE6qU9i5Hb5e7iV2qcy z#2OKPD#|9kKN9xIMp}gB_Az`B$$bh7xeQ*h3FhGgOb}|H!6jF^jZs{z>z)6`+h1f);A*(N5ETZHX!Wv6_#Y(44}B79t;_~jXQVL=NS~L+u5Z{pM2q-9 z*gR{JQrc{^xXDR9nlj1ImcP(5sB)7q6iZ%#Qjr$(5TC5NDZ8YAYIp+RXepE0b;DlX=sVBK#Ak6SkG@2qVVT~G zo370Ju?uk6pR| zgKdQBA>2qTb#vZ0I@tp*yk@R3kIVFk_0JS0_!3@u4mPD!kT!f_DKS5{LI5GhV0d|8 z=Xd_p`+nbmM!EJqA-(|)z84mg^68H+7B|CEOo`9j0XW~` z?_BPT!)k9w8r~VfV>q*NLNh3in_9R)n=$p6m^HWdYR8o=sKaHKtl&>lmSUNA$uvMX2WsNOkE~uF5xEm!(XiBaHCrnzLz!4@LXJ% z3DjI_H{z8TsevRwf`@d}0ga1_ovwVa{Us?@Jy*v>IRj~4!=^U>)sAVAIB6MJjwyw< zZmH71S8b>pWhWJrLhHdiQIUr#9wtGsf5qZ0LzA$;e!WNf%N`!O3*+U(^x+S`TeXij z>q?*-lVEUdnQjs(srYb_k@2U$i;-joA+WR1#r9e25#G$yE3kz~33kd)*nQGgiQOL~=U7w5ov9q#Ztb&@5TXPm#y1 zp=Sk|Lc+(@xd!fJ1VEQcu(8BHo(=uEP9NK^u#0$i$FL}{rPuR42yT5tsn#SejouvH z+-yAkEZwH?w}E%nh#=ebNzl)m^a(S)R^8))5*KlFkffvh;%U%>lNV9ZDZ~^-!97u>8t7vAECq( zzg2O|ce^foLjLyZQolmLTIkGb6pCu=5Oj+{Ofm`C&{4~Hm^&K~M)_wdY!vKZU+YR| zWKg{~*wu?_5m5;lC=?!L?{b#X;S>MT<(!U$`Qm3w{cjb*`X*@wb2r8K2xCO^dEw8C z`o4IO_mk^asrfoBRJif-Uw_7}X%pb~Y6|x&NLail66b z2`IxtYvu^FCI>%VHF{YmOO5z~CVF)Fg3x^bM*Esz<7o&#UOZ*SIYoDNohDLgVl$-)o(ZE_kx{8IU6{POQg!gD zs_!Z!Q}8^?XkescP}LfFr3^SgHr|VO<|hSuh3jHm=FHw*AwPhgB5o`H!zJKJF>77)ZUXL&9fsRZ4Nng!>3 zA?LppR!TqSr01Wu;Ynq2-Qx#gcL;MP4;3zMAAj&6dtRKwXC)0HIFPHmAH=LVKwQAi z_uB)VGKI3ja{;C^-|nPeE4-y`v3HGv#pexu&0H$AcW1B> z?%XsQALm#)F{zgxVR@?O@$x~=>+Zm6DGD(@jG=KOcQ74_+F^&FEI0J5z3kfIN`4yJ znr=fW=qhIBxq{(0-m^{mH@O85rVlx#efN~8bNPM*AgQ@+!hOcr)RbHve8=8)Uk4l`Gg8tSok)=jM-b8Fwqp8{XCj&bL{*#>M?!1)OZtg?L8Q^_l2Yt0+^`za;D zl(0_*Y!*-p=bcK=j45Cq>x$EwL~gKTVqvNl8!luwj6`Q1uZ%1*xuhmw?K|K4sPVFxn5u1a*Ey0?YhQs>_P zVbAin-1j>Ah^kZ&wZV9PgOXKm%nJNtX+^3_#)a>D@Js55EGR*`Qe2$X0~8I0D#n<= zsg}BT^WB3D@6h!kl`d&lqrwHy7&SPBEurp;J99{n55g)l|268?m6d%OAatSy_j-bY z98_H_QJckUdIgmH!qUvY)Br6aq{O+5SF-vC(4lSYSc~2#9??{EaxqB9P`z2(>{uam zqocIBaPSCV9<)#Ypo~)cRgl6RhL0dwLP}v1`MDQ@DO~EI02e=qI=R`W5V?dN9tu*U zVya128^0_x4NL&j{-ynQVzUh5CK>HAWWgySsrx-v#uY$P7txp8+$e4`MPT{@@n}@$ z&l6p(->MOP{mlfY$_Jd5&1F3uqj-0)W8JVsR)at zwr$(CZQC8&`s0pmn}2LO9lK-OPIuJF^L?|O;G`V24X zQyt~ecYrmDKmEUPWSX@q6it6GU1^;Vd!mFgP`M>jBJ96;krZXG8l;e7nkp@VEs;op z?=thd&&es$`3Ill6+E;4RL}!4tN&p8IPRsCrYo$GY)kGCQl|E2D}C}}nvb#mMV4nt z`%9leXaatOS=_2HqtiGMwA)0ZLR6N%RM6-Dv%kSFdwm@7|jA$U?@2Jy~AV{1MT zd#D|+@GuFfYU5XubSMT5x?+zuUoE`|debelJ@7Je-WmgSK`Fs1vqavE4P4K#+dRKYq2vRqr=t#1&ev6Vvu~7?Qd1tq zNC7N;92>hb*lq@q(VI3>zEo|9-Hjh3e5xVCzIXgra;J`hfNk70cweiGvUyP=5T1v|1=|BWX>KP_#- z*=N6%aYooV%N`EE`FpT`Ah{}~dyV949snSrXgBjs7-fik*B+A16jsLkWp|MSZ4kNkZXdx)e(lx?o zRT#Q-6NY*I8PmwD->Q$#hOZib^Y%E(zLVv6BxcKXzL+2*a|%eZf$U!fVt3>=NdS(? z7(|pBov25PPNd2^~3h(4sQaUQ zJUOCmzYr&d{*g0DE8z+fMMT-cty}v7&wpN^HKVU5-{R}&b^;}? z|GIQfy(*^Pi5l!Fw8e7kvh3zK<+qyP@(!Jtty;*ujGnT^#3~$cLfyT~0^nu8Kw|hP zbh2>bD0e1THj3K2U08a7ae$))uze)(J5k)ATq7X6UvURKgO#P5!=)N-X_O~bs42@++$r?s6M4^X^W61y^ZP?_}gSL1t|};-#ajyTqKZ zjS5R1kuqKjt(lFDiU*)+u`n)`Ud4FJI}J>Xu>o)zeVuij+1?NR1MsCouhS;HTc8ZGPylj50UC+>r*&Gq zbHQAd5iT!N(vl&w4!~Ktk^I*~$XNWNSd5bQhPo;W1Ury(QTzu#VZ2r5P3pkMrDf*1 zdL#PUNi^}yFX;*2qpYq0#onEOhZ4nk>6GQ8hB?OKqT`A&Zc#@?3yu&fxk8eOz{a2k zgl2U6HC!aUdHYRhB-OJuNF_N`XqVhZlcNc?onz&pqMXJ2PQZ<786qx`{>S-ooR~i~ z0c(CvkiB@Czby_%DIZS8k$P>>7MyZ;j8V%R^MEQ>8^t83 zDR&Q@-=Hz)vVgyWhJQ@^F2#A(S1-d4ZSBa>64hQ~RwLhxg!0mhk@|hT?D`SP8iS8v zEXWk#4pjCv*V5S%R5}-aT^#NH9)q38`ZcCU+GSHAt2myp{iw-Xn)U)p&5We zZW=X-C8nl?_3y5W|7xwA!c{+cH-$}x3{aZR?CQ%f>vEGYmlN7NqHO##+z|+W*kc(| z{q~8^Un!R3eB&cLA3eMNY-TbyWk=Rn?<3Y#tfqOgGyy)Es>S-d#vR~UF3_lhB^vk~ z$j~%*%r^X7J^Sve#R3ob?N}Mn(w|3ta6ZuFl=?GK*nsw*3cS&g!T9K7a&LbqC;(Wq z6M({{g3~4KV>ZJ-?VF3lNc|UX1z`Ro#76{LdJ$3LqWb|N#th_PnwhSYEU9a52~Az& z{?-19wC+dBf>Mc1$usO-0Cj44hthJ8rxn9<80?o}?@} zTTu^bO7wcsj-}p&Xo_m@%=wyD68;3P)+V}UkZnFpjqriuy{m`sSI->~jDy;h85Jgd z20|N5#H7LPaLj@ux_OMzUe_)&;&F|MCvI+geWT)&zI}dCKxIe26#ePA8vtrurBN_> z#4M`HuBurBcl8MglukBnq?DEh3%EKc*fk|&L|Eoc*(!eOC{6tJfQcURJoE_>wkX>V zxThsJVQ;ar(H_9IfCZ;U+C9C$&vB+CUmD!)Skq9VrDZkf=so8?S+0P=2KBTV~LCH0oGpm(*R; zC5g6@Z7xrl=21AMa}iY4HGdBll6rGmb%wcp7Qmv)eF-*8>|wbX0Y3$6W{{7l3&)Dg zU`XAt-A6Pvbv?ZD+L8vw~&pjg(GkP%~F z>VZU&lG{fq)72RY#0FY+4?|Fz$}1I<6f8hDuDsaASxQE9cU|4Izs?o~)zn=w=@pC%3!O3lnkyjC&B zHK86-5j^oI(zhrQGfTx>R=nU~o6cj4D+s2=Z}(j?FAN4vei%7c;0sgvTx)%aClP5_J0?fk((Nn%k>IbRg`df zgBL$o#;jjS6=q8yOABI& zdo{Y6vX^MfjD5`yZ#F~^|JVyi&DIldtVpTf9|_0+RE=^i6PDk`0t(-B9Ty{YWzjum zC9v~F@2>~zY36^md}%6c!aPuAFbnkpKPuroLi3H$Cyt?BC~Dxh6Mqb&VT%VhC;b>M zM)-n%B@&!q9)E1viw!hK_A;L|FgX7yEFgy`{XKe^=ekXEAb*EN2RB-f(Hp|;^-tXG zaR@vG2-o<6g^Qe;+*2lFr9a$v2|Yf4Q(%T^NPGC&G5BSv2{oGi0)XH5=su!`y%#SF z`Xcml0eu?`&-R6>9E9wu1s{p^TvNlT`0~KE!utmu&G>(Bzw6AceY_}A+ccD`F2$PX zwahwU9f)D&sapzZDVldkvdo_QzW;ZX62IRA^xDFQ=u99=kT~vqsx3Wfj?7!^9vdk7 zmaM1tJD5RI_*#j-gC20M@qGQjw`?A1Xj^*8ZQ0H zC%c!b;)4HNWB3Pb0|7`>3SiO_`ql)Da;~-Jzk`Z~dDyW`Q=Nv))PO?>!w^ggZx0jz z8dm?|MxW9NSGses)*9Y6lyT%ZkpV%nt2umdUEzScC2T&??N*p;9bhw~L+3du)sf$i z)LEmo*R`mhs3nu#nfVVlgY}&S+uwMx7+q3&T$+p)gd-M}aK|3LU-H{vm6mA9iTNu1gAEAjBkPP-ret1)FtO^z-_h{Z5YqUH zLC)f=xHXC{2qkr#|FAfq%uqgUy6AYL(b8RC;W#kPbQGr~V;Zw=skm1dsq8=ix0pP> z+nV9)uCdrWcm!@+#vw*#)llnXjQ>!wF=p3a6~e|8=iD$8Y7CgO10fhiYd{4ktMu&F zzPmVwQc%vS^RjIw>d3Jqnskt~9eMf1kiIW(F0Zq71lAk_Rg2i9ZA zWT^tQM%Q5Hw}c$doRu}?k8@xsRJJ`sD8%xy#dq+eK_YdsT+2iiHl01}Iws4A5aaB} zy4Gp+-;N345481RoHwd~6$l)mP|=|fw2-|vbW#DniasejIKt5Kb&_`>iOF?tDKhSm zp`)l#?K{2gq&kwi6fL>a4>5L{q=>px=>90lbxl*j4ST(9BJ7T%;eAH{?j|(T%Tu7T zTN$-~S-VO7JVUeZo-{iUCllY)NzA-oH@lFPb~7dh>o=x(@5VfUmUh|o-|h?vhWf|< zZPm#Tm4?zW zh{sE|uQo{!D>4c?xb7&LJ)m&AP`hM6yDz+H|7`PJ${CZhEb!P2&D0v=qj zA>WgJNg#e8dI?;D5Nc;6p^y}($D57B*{I{zW3h%W33{$rd zopEv)U_p%5)X+zZi|yVHS&5|_g7VAheHl!iV5XtP$T*_cq$e7}t#$nw8|eyV*u>C3 zW>pr66a9YW!6;c5X^co}gkrLZ{=is-8&oVfQ8HOWSC$YjQ=+XqkPFCcEzbVYG2HP z(eq3cS-h;AqK3AMZqqQtQ_U;tJ8I{%@unJ)*y{@02U;gLTeZ_iHcnbhwJUZGnj-05 zQV3M5-ZGoIv)1+wS{FO$t1bF}1<=~SG3KSyyvmD4-(f@O?44z$WOgT~kob%nN-z|y>iBMAYfhF?_7b24~s zD~eo>KUfIJ95U#pu}UBCV{{Ok>BUzAK9bmSqT-GHcbu}DrBQL^gzj=&4Qq*Od63d( zgP-rP|De#Zt{2Gu=THF9CtRgmxQdGoq}`_2(gJ!%L&j5-1&9F&mn%A+eIu;!+X=t5^u>lQs7% z)pKp>$*`t!#jYB2_1b8`<}nbE*b!3;_=Pv^JI~R%ltwt8p+{Q6O;{|WSobjXf&;Kmp1Zrq$_`huhebN_rZg4}oh*|7U^B zydTZ&3kBn2Bi{u{1DDNLtNmje1Q-SCX>kq!#bl(!yGugd^Dl&giLBOM1 z{ZT)8YB*kWbA580`}#T{>Ex`l@RII?ps$a5L#kmy{x0nfaVC4l2XWg?BVFw5X7%hQ z_vc{CAtzQB`#(kwyL6>$R}%f_s}~W~JA>~R#;LN_QW1iCSv;CJ(S#QRILIJ5sJDS$ z=ec%&F*7ypRMtlUNd2@1Js8jZ2z?O-N1hNu43h4M!;!E0hKWBw2(7zSCDHP#GFv>A zNY4m8BM$T2Xqmdjn)Fuiz9#-ghzOPwac*$JWLX>Hv+lNA;*+;80j(}fw9fV=_SRc_ zX+0dGz9&jBtcTv%HLOvSDhyRp*3)Xev+@|&y+6c4(wJU*+#pWS<_|8MWO_SyH1yy0 z{lWp_Cxg6qE8r)_?_g_@`%3EU$%g3a(x8^&x} z_~TPcmyyMy%>&r^#3Z$lDYg!F-2a!pHw2^#VxytpD}>q`{_zdny3`W=q!jyuUH4n9 z(5`m(>*`%i(Qzcm1b$Z0zRW?9v=Ll;SU8aBGlv!+jj`xASCG=gYBbx*1Gaqo}ji! zw&-#vOeHYf=J*x%vQIkX7WJI=(I9kn`yOIgdt4CfySU0}KCM6Zt9~xwc-g%Jpv+~vfU8c8O!vJ_HlzXC?DVo^bG;J?69eyg?;-)3LKC%6#{6+4-@@z z0mfXS0oXY&Kw0tnHv2mwE|{ys7!?k{`0Ht+SXIEogj#QhZAYCa-J>HS%LIy?^>;3> zDRQ3?HZ(3xtA5~{I>uN__a+${A^?5g!HsVUrEFWE^Y9$~k<6AEtd~9Q{G&3W)=Uf^ zX6slYP2O&Cv|`=hj)Wkdv*B+*zja5YKw}d>lZGtZM=*2UZC==fGH8lJ*B}X?noJdiLvEmKg{*>iliyu)BOc^I2G>&k2NvB?)U95h}Vi)fAtwtF@M$VtqR(^a_EKz4I}e(;h4GZIlX5R)&3hmLE1y724;L~V!s$wm`j~wn@nXoy7 z&JuE<$bz4jQX%;@E0f9wMiuJRQTYUSkE1xGr~X$z-p?ieOk*_n%w`w+Gp|m~ zWBJ>Jo+?t`$+1vKT0hgSC9`jGJF){zPtNjZjf)vl*b~JpRU~k%Ee%X_dA+5H%*hWjS z)E5R=qQBVkrRZfMxV48_c7XGxWprOKf zwFcx*KW#+J*R(dQ;%bQnS>o!(_8w~cExXG9SPv>wG&HOLQoV+w0G=^-YU$}6V2Y$B zf0vZdpByR}JU^Zl`%FY)ZHJ7Lgy5(o9Gj((8xUjjPo9K=LaG_mDeUVCC25=3L+5NL zE3KvI8nEJu%dN%$R}3~M>*cQu7VK-7DPLL0n4uU*Q%Ve|01p!me$u7=C`QP1t!Zv& z?JAeUNZe5OF411`zp<=5;YudF{MOC!{a(t5T3r}Hx4?oz2DnPwd5)(=0|)0jzGL|B z7Jf$He=U3qgcoQoiGa3@=S@H<%?~QHzgB1Gs^C-BS{ z88B?X;I2Ty@=u5$y`XO`zOqu#_-vkdwh$67%(6nJRyz7@X1bqfx@f~-fp z>YP#A9BgFLX=UCsQ*qdl7GG(-=mmA-w2)`5kdx!R2g=*M8)>@a8DvYCT7d7?bmuXu zGwej#;%9FpJi)kJ#2!z-lZe~-8$T}MYzkOc>&Vd*X!eD7Z&vFGI%lT`%#rYQ))y9@+uZ;Vq5OPESjwmTXk zJmE*$CJ{qv3`4=k^{=#)=mI>1Vy>TDI_q;^o>+R7~N0Zytt^xlTi zAmIX&QDcI2l$e)aP=+tX=4d`){l@kiswcZtrgt@6O3x4YfUy5%^_ZATWVawGoF_T! zrc`eZjlmS`7sn|JxS9(ZS0VzXI0<&XZ{aC#D8qGVQ_w)yfZuMK+I+JbNbcrTQvjdK z`|4m)d=xl0%7)$;<%EO7iAG;Vvy{xAlxS&*S9GAe*~g*#6JpMjN!{{Q=yHxghAl}X z!Qr;He}unku+4+!XtiXftHG-@@l>+WYUi^yd3e->u`nRp7N%60rrabjQUW!h%%}4{ zErTWv_^5GDigV>2`{>bRJCi-i#sJ9jc^VJ;VjoysQgR(kJ&)SG4utGAAM;46L&azz z9llhke}Y?{o-C-S(TV>Mfl1Oe2<(PYFgMjHC?|XGbL>cylajL_gMti-VTW5}fGnl3Mrht1;K zq11hw|0qxve_#luq4|+35p`Cot(hvFvjirC=?{&DS zYg{j6d}bSylQhL+{)^aUtOg{HxiaJ*rI~tis3e){!x9;`+^lJi?npMbPql@TQ%@of z`Zk+EmZ$bMUb)D+&OB|0}IyfJg^D zc514U~=aVAoNA{6dkSH^*XIG$^f=2vtB}J)Re{>dlR?FJ2sbU&ePyiC|IzLeOk!jSr=&s-_J3E7V z$Qe*eV{A=5Mw476Ys|NM2&NUy^vFyVD-8LGkP2#Vvb4Qos{1J%iEHwIwSzT<73QkZ zmA;k?IPnc#OPH(6hvJpcZYKRo&|g?|HC_~wECyp$LBi%C2qM3~p!$%NnsClmq#2M4 z9C*qvp#`wG7uB+o1j6cj4s$}_=O@VGb%f>xK@R7`m6~Z4N&+Lsh0daAs1<^E{{su) zK1ID*O!lfgTz{(qmHjX@J5?y9-RW|#s*6c?vp5PGyDcA5QISKWgi2!-XMz$%^ZX>Z z`P3zLJ7crb(cSgX7;qX0b4yDj3lc7P%QblAfYL*o4-@Ni;b5eHE-l(??JGH3+Ggl zt7avHnCojXTB$nEi;fHs#!lJaIP8yk7*^U}{NTaz18``qMl4=hTGndycg`qo;(}04`xjrM9pwcGUq=3vGTUDk- zkSt09)6b(0#Q$XB^+cJ%Yirk0h~C4ONA`yY4Nm|+Bg6s~7XieJ=>M^A zkYLpOb3L(f?X#b2o+-u_=SDb#_yKPvyo^}cQ9DLhAE~5q;QNNAB5IE*f)M8c*f@4; zhCRSBl)d2bemx?ks*8X0caE@#Oupk_%@~{9S;ZJ0me`57 z*lT7G0TocmJRBfXvHX=*CtV~@3yprb73I*2ms9E5TC@b20e{NWv1*kSd}5fkMmPKy zB{oOVuNYEye0IP$h{pfOq)> zcy6i^eMcXkSSX;5Q$A=N;yRQg#sW(|FBcyG)55acK_(YqdZZD;d;+L-$l%g9Tc&ZW z9Ph93M+V0glxfAX9M>R&FE2DPyZI{gx4kVL!DR9OX9_EEfr|1k1oNftLkTbT$y!XD z$?pgA@QnRd8<^axBmBSO$y^07zaO#LKPc1TWL=LCM-C5Wty$t5?MWgj!bjJTXe=5A zl&hNF8GdV}$Qf26b}a)m^K=nBnOhR*sv|=0an3EqQE3$j!@k7GND`qOi^jLh)5dUM9l`ca%Bh~*4 zilUH%jIU+^UM#N2H>r!GlubeQ5bB?`ZOHuXE!5Gvk-cacD7$Vw01jp9-mA;YQQy1; z+*Q2*`H+VfGqAY4TMZd}Q!FheJGy5B>bE8aW~qnxYa15qA&#udT(|IITJ76o3Eyf9$7;&L|Gk3>Dmx}< zo*$4}i7Qv6db;Jp01AFW8j;Ihizr@SRc3%)OT_j@9QG}BQ5tIRB~O~kb|f0eUYP4K8C`W1FR zj%kTMRYayF+P`uo_kdu?G*)b=r*-|4lqvsr;RrclW5Jn7tcW9oCTYJp!mEO&$!efYM(u~!JVH1YWDPy>5=)f*GmCX%lGt+9y z{0EPbW<(~oQx6g<{HsESG$R0}R{1@oxzu)Bcto|7T7lHhZ}2WW1P+OQ=}bl-RgXei zeRdIswc)-`ScZ+$)fC!z_{7ww07+@#$ej=8+`o7iFqY0JYsS+BCBZ8tmUhCGA6Lem zzr6=d+M8<}9tGZBU>>9B`Hw$B_l(nI*c8iJ4xRh6z8o-%Iro+5~15~%t`a%Xs52{RDUmhvvl$;C6*oMnBP9+n|MoCP@Y=2g{fa6bz zR{_|55w1d3n&Bv$TWmzb_r~VQX;t`{)m0&pU=1Cv&}C&<&|8*pLN{x&5k(E6yHm=0 zkb+W(4t_Z*rBvFJ0!F$(pD<%m`uJs(&XUy2uW?i^aPWqwFO6hii?LmLM2m}}*L~^V zk3=b2^mQ8LWzgHHe~7KIdX@W=Tj3o0K2ktDheaxeR+rnNAaUm|@vKz)qAbQ-Yk@64 zzPgxM4A~LwMn5Z@#Yas%d9WXBI+b0{EL!%kQkEb0+GXndQ}E zyD&*LIs9^ys}IN`a%{YqpJ!YiR5}_k4(*V{C#M7KSj2Q=DuaDvm`9g1-eA_lZX;5& z{Lls2iE?xOLs~J=xpYGb86`r2u}_W6{Id*y$)9f!=g$p_E|FZi2;J>uzgY!>n0V^j zu++*;(YZGUn7xhq|JVw&DRT}402CzB6KUJ6Mbn&}$?F$qkOJm))k3s!dD1Abs_0*I z>yin>z#jjk&@!#i-&MDG@=9AXM>rdI!45sg-)8QquJJa{BHxjb$aR^s)%mt^_x}*chTSUcU1-j zpeK_@(r8yp;49N>+p$^VP?4f2$-eQZO2PTW<|BRYC6jlf;&O0s3&hV+rh0%Q5d|z{ zuG)XZT+P;{2aq9UihOGTzZa0?{QW&|Qi+!sDEhIq=+kZ7B0L1+e*b$+{E)c8 zvPJU`<|*Vfz911O=(T%E>;0GDXz+EmLdn>g#1EpSFRbip$B)stvW@s)4?_z}5AE}V zK|!{YHpUK=HAOi2M5q^JyyAj!$dAX-Brd0slZ9O0UM5aKP#HJVPF<=hG00!GrE3uiG}J-taNWWN>tL(=742Q#;Ukx)6N^E0L4 zB}}<$YvKn?!9$p3!(WY8ng(1O{TCGstk##ayowqApQM7J&D0eY)0&@>I?p|baZdX= zO-h%6%n`#9R|n_Q006JWu>(20vfHyk=1gvtj9zGh$GWivm-)Aq{s?M1P>FgKx_YRoZ-aniGUV21F+R!7-qt4e{A%0K&K2!RpX%xK*~$D1x|aTV}0+zsqG7n z6i|g(GE<&meY%kR_F;B5m6$#(yTbhW(%kSy`8vUP)sGyCM>hg>#caKMB5T|FB-2`L ze7uaGcYPW=j(bZWAuIGJH%g@Xewt~--|$VGVUYudd6W_U#%fXvufrY2T}>65N^?id zWA9%#i;llM0I(1Lr$Agz^`vLqxhc1xsWZ@p=99DdY)*XP>etYWw_2s@GFLH{MiG^O zXxMPuJ&b#uwWmA5>D@O;H}$fA(2N?m04u0zg-bdm82b!j_>u(#M6Wt0})3?3dcd3w0|3s3mG9)>l11Bhq3PSRh6XSN;M` z(tX_d9;NfpWL8^%S@?;a#&Pl~(r_@xe54*_5t}D1@ zQ4ir`$C&+Bvsf?myVEc8XI3e_hpJ39o7^rh^OHBsAq0|*gz%-}mBm7?oPU>BAq1NE!?-H7HOoG9;D_JL;MA4#cwp;F6q z&ZxrZ#&~CR9x6)IPF%EH28Uhp5S-nE4<`bgQiH7`YmpomSCV2;q+QnwvmgWd{W$w- z8{Z_h-pu4T*0A;;tO5M5`PuoLaGY-%4Vq(S%APAGAS!RKU(`UNOq+qP3#XtWJpK~% zB4D64yB0fsg3+HhA$TD^8k94yVS~Ck9t9xjt<0e2C$ZJqVy;$>h?~_X!$|wQ2`ip~ z6k>Rg8P5ke*t9K9U55i{zta5Ci7glO#BN73bBx&ww8=`s zvhytK-G-wrvkNX>_oq{cfgCyJLmHm4|iIYel|T1*_4 zdiN|Y?t?Fn8gI~#JnUQqyEu?#4(ObWA0uA_V8^^~NYD(D^$?VLLGnkq@po0;N}GC+ zEu*9J-l_IhKTTp42>faqdj9owjq&S?p4ekB!DyGX3X=KU^=;^Kv4YFDg%zGS{PTEPcqj5gvyCR^bd!&@*+CL=AtHYfj*m7qd#fo4EJhb^X=) zv#@@_P{dbtQSJ>dG9!pdX>{)wZVBqyaQ8Hh3^pbDppIZ ziU+i{@T@HUq;?Js260I1`1y~1{TAOYeq_eC{!afRVnES5*NdL zh3&94r+K555bJ7ZjfcP0`I;Ydj=aA=zuSdN@fS<5Nz2cCl3bPrfJ?k~NvX-Jat6OO zRKtrbyma`+15>;_POlEwbvLB|e-#vcR=Eq?eeI>VSKJf9CXPoh)#Y)MruU2V=rMj& zrL85Y@Q0ibwli5*+_L%Tp{cvG#wlZXpR0zpx{sX~a!ePP!B_Rcov z5~o{dNQf?XPkNIHKGNOB1nfq{yTvE4?C^C>IYZd7IK;(%NJ?A#R5ok_=(IFH{jaE8 zYU?HIda5ATWatG}mzbXD7M$WCZQs;23F8&^bm(L)?6l%TYe=ZZ|07DEh2DToM>7A6 zy(Oq>=!m$gjHzWh1^q-4anhbsr%IMcN0J8?6Je0OEn@bqTxR+zbs|#W)bM=E5{v4? z*ddT%WTtm@sdu1VZ!v%uv(9EXt(ft@LbBCu?{qCLWfP1c42~~+Pj)UwKTye;!e`e| z=H4J~NwW@*(a_U(VaSvC)TyLU!fJpFsytu5bbo_~306A7y`^~zGKOK&jCyLzy1nVR z`U^9+!nEQsqN&h35kyA?EL(GV_tsKt5Fe*c{-U`{t@_Ac4uk;+Yg5CwT*F)$qDp0& z|HDrx$I}tWYe^`iD-h6B38kwVHepH9W<0eIx4C;y&=jrV^j>?Is6z*)?{L$l`tknE zED#60t{`X|hK_VTS+gA5Xf$$6<7$;Fxw)jXM=14nRT|<%@IIQFy&dDsc7uqN6NS5h zdA%rftTI6#iUWf7QPAT#dI`uT$^}`)YHfOvP)gWF;sS+5V_r~JG#r*=ipCxLQYafb zz)S1S6>iPo15@{R4o;8DTcPs^d5x#B&Q%X~brSj+aAwLl9tMz|B*&dW5PMM{R z?LbCGNhRZk?P=ifSHaw|L3p{G%tdsqM`W{~HRF3I$^fmv_9R#lFZ)t|Nt?dZfbYX%0z8oKiQ#r1e{uXS-JKrdd2O z?h2|J8N#Vuv>&6pKb*T`=k$G=pdrUnlFjWumD-ye5bXw}lKz-;jV+gft>a6=1W_Gr zA9{D8=1%n}5GmR^acEP9i+_g=hIumOV}`XBbpS3+5&Uo3;$3s!nuQl1Cb?aDCs>Fx zuh-G!ri=X<0Z1Wv@1R_2u*!#vMMPV1Iv%d#i2#VfP_X7j!#r|LX%FR*UU&6R)nWSL zSS%3zX{CvMY?EvrE1b|eyi^@B{PsKF<5NCB<&smU|F$y!yy{5_eAhbf15B8gb4*Lzu} zphaT*v>(o{ROF4!jP-Z=^7y;@QoUbY4PeC1v^|ks1;>PS$mP!-gj@PK+V3?r3)w^y z+NETH0M|n)G(!i)D%E6DSZYMr=YsI<6|qVS*YsIMkLj5fPQj#ViVP^cM81=L+gMP{ z3?~r4?|~WN!5g{-3XnftXI5oRtc<$zHy}_RD`90OOzb+2WZi1hd-vxHCOFDfMu4Rx zxtdY9iovXCET(Hit8Jq~;4YXqn||)5TuW1T+vh?VrMjA-bm6GRMW@$&PVc5y22hgp zjy~f;H9aPCIpp~6T^~d*%lBC&Ba8%mRY;35u7Yh%B^Iu@Ri^pN**W#Ryko6;p1E%q z5luDN?fH`r zajZRtnv-3WAtI-G1~W#uwoI$W=V5OBR8oZB=;zwf{rD-6;u*ezww!4TX3@xC z_bo+g5vnn#`l)?20vp^kMJM&q!v3w2uytI4;cXOuYDG-_ru!gYj_?2j1C__sv*{+a zaGl`oH1uF!ig3pUT{y#F36_lu-;Bn6)i}g0p`;G++5wgf1=quU$?j;xv!gJ>rf*4hBQ7^I!c|-CD#TmgPI=97w}K8 z8S}GxO*8ZYUjYkBIU~qIsITSiX~eBGi-Af%$F41?`1Xl4&q+7Zm-%c}5qg2m z*_m=Zsm+E*)_7!wMaBM90?_ZFsO4zE{ClpXo5_9(`?5dPl3|uUDRoOr33Up!~KGJ`Q?~n1~$&z=|RUR>%uYB#^Og!bWRwH28UCnpgWmC?0Js3%s+I8lOspp-&-%DW0P#msWQD? zVWgZM4~MzPCmvX0`ovBpR?9LiGa@*lB2z3rP*@6^k1y&n;SWhF6EZGbg$W&Xu_dll z0xFlhj$u`M-P@Gou(+)Ga#TX;8Rb9&j49zD$!L&)CGe^FRc2U~ruDhMRCLYtFfR2x zy(({NQ$w{p_6CyaJ?8ZmwN#C7dN!&}yPaW70%Kf-Vzebb$IPcWxer;ZlZQH&M(Vfh zs}7D3E;w(Yw6M`l*`M5*76D+xDwq(f9L*L$H~{#ojrXd)2bvV~9?VhSX0gIz`<_|a zSjsd8-0H;IHNj+ZXgbE)wiaT|M6$bcMG7i_7Vx{ByewlpoyIYyV4{kGEjs2m2qS2J z@{~ftj{$r; z?7CI$P04ROdvLEK zrIbzpF{oL}I)Dia*QD2_h1i?k&ubO-OCW*c6UnE&#FL#tvLD9ax<5p~4X;i@=}Xl^YB{wqJ!~+_M*@ z%?p^+kj71bmvj9LJeb%@GKu(bl*xJl+-gRECfx~{yTBtm*wT54-W;Cg-JoUTS{DbY z)QlyP(j^WvfhM*eyyT8@^Nvy$*(H(qDRjWFGWZ=$*f|LJ9-0CwBva+a7628gjIdF{ z#{oONns|}RC{N#WB3#X0_i!lt7;SW77D^z~4(9ZVjOk!0SO5k~eXK{~(*dNKSv`83VZscfTMDCP#!X^vRN$IbbH!Yl zudxVD6Zv8&_BTf=JcO$f1*|t~O7Qna5FtWG+w>P=%PF`8^EFLf|h^KZO`NkZYD8w z7h^Fxtx1Inta`X;W)w(U0L*KCPjGtu65{4pb7v8)yp>7~2cEDLE1~*>Fa`*$v{PyN z*1(#x54PLs&?~@(+4=Zgs?d*;4P8N{*Rci&I5;Gqu9H>jEo~*xEUX=hIjUjQ2LgBF zBz8!QaOs%!{@JT9Fj1|A?#El`>h-t;KN8yC8m&SGlTYGG>~=#S31pgCY_s1=(%mLp zjYRnzXhk>p7A5L+*>c^2qolo{7PytF=Qs;-Xc5!nw-X(4D7E4~9m|wqp`9OFk*COo zk#c?-8qV19!*yu{TS)ZTZEg?*1%Ds%+38Za3hzHBxJT~vlHqiD(JfMu+@6s{iCcox{> zI{5vF9t76ooI6$_+1X_8BADu%`l>ECx)s$h^zUALc0#_cTM5W3C^Hmg4rKwVQ_gT{ zxu8rrl?9ytBwE^>zx+&B1>(nPI^Z86$zgf$<3E z<9b3NaNiTwMJGHJL)NBOL1M^o#iC%UE#Pf>Uy$9f{OgRYr?jB+ODxj`flz!06n)rg zf%$1$KU);Am9B!;I>-XOC#vN<`Bj?@{ul@FD+b8C9a#Mny`5|gjPeVNZ7mgf#xGHX zw4S1Rv1n6SNcVpj2cnRhxeykvw3tCl8xRnBSP9*rR}0#8gcemoo4KjPdivqArJ1Rc}`jsE{}tgFRI-#O;R zZP+IWyImi)ChRNfFPKhGR?n+5-XFE;B~|a{6QFH%H0ga3hw$eNQHz)*tQo=zDq%e> z>ZKrZ96X#ecx`eey%OQI=D>SI`b1tRvd>h(U4|g>QWSCHRlpvX0(WtM&YS^+ZEQK1 zzi!imzZ8E6xF8R=Y?_|OCnKdit`CGnwF+7ro-eZF3I#@#-D9_}s0t|R+&Ys0>5D|~ z@P9-+ko0wlKFWy1U(Otb?s$^Fh3JWVCm5(CoZA;6CKu>uh?poDtmI*_7I3@)G6u*g z^R|5UK@W+^XqeA6bgPusSG9rTg?3Z=kD_3y4x)d0{%$ubg2&>Vdc-PIG=Y1mP0k7X z2`XpUM8A+JU-q`l0Vd>R6BX5_r)Nhd9BQcrFsZv1SjR#}sKWf)rWEO-fedt!KNv?9 zI*B}+skzd0#nO2YA5E^)5>LNvYMss-hWO`|qsi&1sN;(!Noi^{n%Zh;hUkJ1_2dINJ z$faH76Id+_=anxScc*-gT-_e;fi=ksNKoCgi=U3C!r8A=BnL z{XGHZ`T;`sozRz}?n8tVRABj-CubL7w<=-R6z6Q1YX~!{fVs?hxr2b(6@Zo(<80vf z5qPHpctM1tcY91`n+&HQxzrkArQNKj+fn;Lo1B1Zs#1?lp#K#Itf|Cn_U^Rpta^W% z<;(IF4$_fj8Bel=AzuG}CY1jSQC>pbl)iK#NWo@I#LVFPWl;c)mx}`8`C0@tkiaqP zV|KZ;0LtEvWjNRd=1poYKVkuS@JC^T{Z=(E3JuH43|HILj*0HK1Gz1K(k4GeQjqf@zNn1j zG)AX_bZUj0s}~FYE>p);@NSzzhwV2;eD4F=AL+Q*eZ*iiNP(Ksq<^K;x&nXnBVkNL zel>e4b#w-_NQv0gN3*8hY%?E3a&F)}jT1y2c)w_qt7VyQyx?Ist98gJO0rO`a4Q9yOS*D$dRL3o2p}0^#YL*Q}kG!!nS;u)XstA3{mHS>sp&U z;|}9qJY2kO+8nPv!gqh$Ev`mQn&f~QJ}xj7VotxG|oERFSp4P&-%4^R9|X~r@ayA(oUaO*I zp$Yld^&}xu&TnL(Lu5lv$UlZ|%1vLwTRg+^8_0VAMfsuP!%BaSfkyL%R1QRm8$ska z))bV4NXhUekqQmJ)HepOWo1juMPQShdf(1#M-j|sqAGt!Tf9XdsJ9kk9Qr*bXg6)P zah_x_3uBV}7@CkM!^1~0KPRj0=CV(p_R2L zkhh5&Am=65j8A{0FzabdRSKgyT*Ek-?BIaaGq49-H;(f5kn$x{#kI7neNye4^XqNp za@trI`S`RfOm3vo=4rd2={Lswd?vDksK?g8k<3E)p-bZe+&k#&E1yKfOD9MJv(a?G zf(LnyqvLFLdJ1hs{-(eGJFgjZVsA|r_Vr~fqo@X%QqF%f!sACGh3`VoHHr^uvw|N& zYt*57-8PkFw0_Ll$t&7rZcv(c0+1kpU><;?5I0|P8Zf^^l$=C#weoX6Zd1j_IoR&T zGL(u+H6eUv#n2_3>PV(9wL^-cqsWdt8K3rLVF(q9(x%df&PGKp`(c|Z8*0n@oIWlT zBMNfU%<_Moc6G_Tn$+=HyEVt`u(G~$%dq#>V^}CuAYGfPK_%AhrS26(c@ zBiVp+kp?c7OHF+mR-dcb$8xe9Y7ZFMdrrT0N#@{;LuGQ^KD>N;{~q7S&b)pq`7?`+ zupqP$Lf329*Q^5oI{Hduk?FkKrj#|0B}&_r^*+FSBvD#{QKEFW`6NYY8_9bBy(I;h zl8=A7xV|f8qFUhp8-RBefEUq_vm6Uh^?>6XYkk;uyFE^hDcP%dO-Mz;3Sj{-u`(=$ zf(rl%yu@h;VO{j&j@Sa5TfT@dWPQwQIz5 zd;xYL+er0xyGCe;5`JZu8|^v?rt95%4S*#rby+-1Qd3GPx5$h(h&t_ICtq495*dF& zrO6s-PF@JpL_9vIi@_P*Uob?xk8q2LiIw;fyLqk}lkSgwj$d+Au0ClOL2=kWbD z#lX1a0Ihg-y9FL!Z1M&+@j1I9hekNMJh2X?&cN2>IOx77v`wN*QE@Vvxw{q4A)wlH zlW{d98G%0p^afVdlG(*6vP}i9Vh_sVbt?18sIILJ1%EwC=T1kZb0MRYyjaG@ zN+mjL$7_8$l$hFSYAyBAAiUX;Weo;cw^Ao7RQ}ZF$wj?FbX5MU1s${<;aeS+462k2 zEb5T6UGaAp0kw-6XI|DwTPSU`<Dw=$&BfN%T(;DmI70a@Fey8ITk-2~W zc1O4g@1Rx1q#Q9hsNiQ+0N4V$OObB!hqZvB;^L%i=1lI%nHi;VI;Wjx4KZHP=|sGpYUSJSkkq6@R-E z$n^WgVdc;54m}5!8q|XRZl~I=y?Evl#t%9&BgW`x)w>Vk9g3&-s33q|o;N#EKabO) z6*E+EE$(*6QoJ+44DEv>={Y9tB9ifl;#iVlEh>E|@$7X%`{{pKARv=noX^H$24|De zOx+(SP{>h6gI~@71xyOJU?jy6!lK_35^}L7D%SU+9-Ey|ZzIUad1d=rGriRbi^U_U zZWpDBAz4Y@{*zo}=U#;3D*#lPYK|~HeIlwC73JzX(5&#FhNBhL^h}coFeEg(*P7T% z9TB1^sZ178GK6TR=U%K{Xv`_5wL~Eq)!Wby0H~w(z>VY#OOK0+ptbP-F~AARaBw~p zQe6kiF+g#>SpxlvRE-3RWg5ek0#KNfqj6(08pT=T7PhQ4T+peu`Y$;3f6&4E>CVXt_py=h$x?wCR%&$v@|li#>|*;KHYxzJFjN*}Xh+YQ2&MGo zt0svB<0b?fkreEFe*&7tq~E{z6gbNnnqIZzGqw@CE9-+faeS>KV;@O^Ad|3_>funT|jV@Y* zZz&O;WhE(!48k_Y`)jGO75WBo^~!1)UAB@Qax+uY1NsE6KC|8#?5-?-fE{&SbD1>0 z4@$WfI9e@2Sya@2K_6n4@JKqCX=3g`>!zfW(UDChwRqb1pg*q*PC6PQuadSw3(8?D zvl893T$`=7KZ3TQnLeC`q2jZ7sZ86;omO?#3e7BD>_n1zcn)>qQYV_jNoKiV51bX< z?nJt#HYU4g)i%5pWGuMKN8(UodcGc--SJ;ppdCwF%g57yRWF%7xO_<;)~Km`P|lMP z?6<sy=5?y>s?@C#rvdqQ^Qw(GmwpsS*(>Gvj0+G!;9Y zZ70&IOre2NC8~?O->Fa~gnB$VA51Pj12#PwQ?@GgSS;BOwSKcB%RAR>zSW@`?h8A( ztqLM%mq}lL{a%NRNEAh$bBF~g+FRM$+P~zO@SP4-c4cs4+F#2HM#a7fKM_R%@<{}C zZ)Iz3|7e$fJX9DSbf{+QQoxm=GmkTojFy4kT~naL4wZCepijx@twG1Lz5ef`8n0Y=TN@m zESW)nLuylt*6VJU3~x^uIvG^D)n=nbm>qS=fb{V!2DuE$<1CR$;7+rP&-Ih==4_*} zGfDdW!TCUl3#uAbWj1pyW9j^w{VrwYg|SA<4`s3|E*OoxaRqO17aufkEhQhRA9i)R zTha6|8H@xG$`q-VY5ZZAELrngqpKwxS|VJ3lbBRxU#&UAQqIS>1;g67yLQmHJsXel zGSctsYon>~SQ(@!Z_jk;4N7&nOrPB@S)cC1`I+S=6{?ksTBo9Rp&k?;1lwJ5d~?+^ zXO^N>Pn9F}CYLWhy{yu&$j8b;snVCaq#3V?{JH~l<h*o^3p2sR0(CXTdP2S z)j?S^pCR1!^;ZVSKz;Ae+~cl-~apn^S8wzAB;eQ zDh&Di)86RkM}7MA9DJfb{}7I2d>Oa|D*YCmFWouCqxy5S*Ag`K(;uMO;wq?4@b~|V O|NVc?E70+vb^-u8#U@q& From 048574907dec21884555acf7d5b959a8a456dcf6 Mon Sep 17 00:00:00 2001 From: buhly Date: Tue, 2 Jul 2024 22:16:15 +0200 Subject: [PATCH 26/52] fixes and stuff --- LICENSE | 2 +- R/gen_auth.R | 197 ++++++++++++++++++++++++++------------- R/gen_cube.R | 133 +++++++++++++++++--------- R/gen_list_jobs.R | 17 +++- R/gen_table.R | 6 +- R/utils_dataprocessing.R | 18 +++- 6 files changed, 253 insertions(+), 120 deletions(-) diff --git a/LICENSE b/LICENSE index 3806a85..f96b517 100644 --- a/LICENSE +++ b/LICENSE @@ -1,2 +1,2 @@ -YEAR: 2022 +YEAR: 2024 COPYRIGHT HOLDER: restatis authors diff --git a/R/gen_auth.R b/R/gen_auth.R index 294b5af..ebeaaa6 100644 --- a/R/gen_auth.R +++ b/R/gen_auth.R @@ -230,137 +230,206 @@ gen_auth_save <- function(database = c("all", "genesis", "zensus", "regio")) { #' gen_auth_get <- function(database = c("all", "genesis", "zensus", "regio")) { - if("genesis" %in% database && !("all" %in% database)){ + #----------------------------------------------------------------------------- + + if (length(database) == 1) { - if(is.null(sys.call(-1))){ + if (!(database %in% c("all", "genesis", "zensus", "regio"))) { - message("Retrieving credentials for 'GENESIS' database.") + stop("Misspecification of parameter 'database': Must only be 'all', 'zensus', 'regio' or 'genesis'.", + call. = FALSE) } - auth_path <- gen_auth_path("auth.rds") + } - if (!(file.exists(auth_path) && nzchar(Sys.getenv("RESTATIS_KEY")))) { + #----------------------------------------------------------------------------- + + if (length(database) > 1) { - stop(paste0("'GENESIS' database credentials not found. ", - "Please run 'gen_auth_save()' to store 'GENESIS' database username and password."), + if ("all" %in% database) { + + stop("If you want to specify 'all', do not specify further databases (i.e., just set database to 'all').", call. = FALSE) } - return(httr2::secret_read_rds(auth_path, "RESTATIS_KEY")) + #--------------------------------------------------------------------------- + + if (!all(database %in% c("genesis", "zensus", "regio"))) { + + stop("Misspecification of parameter 'database': Must only be 'zensus', 'regio' or 'genesis'.", + call. = FALSE) + + } + + } + + #----------------------------------------------------------------------------- + + if (length(database) == 1) { #--------------------------------------------------------------------------- - } else if ("zensus" %in% database && !("all" %in% database)){ + if (database == "genesis") { - if(is.null(sys.call(-1))){ + auth_path <- gen_auth_path("auth.rds") - message("Retrieving credentials for 'Zensus' database.") + if (!(file.exists(auth_path) && nzchar(Sys.getenv("RESTATIS_KEY")))) { - } + stop(paste0("'GENESIS' database credentials not found. ", + "Please run 'gen_auth_save()' to store 'GENESIS' database username and password."), + call. = FALSE) - auth_path <- gen_auth_path("auth_zensus.rds") + } - if (!(file.exists(auth_path) && nzchar(Sys.getenv("ZENSUS_KEY")))) { + return(httr2::secret_read_rds(auth_path, "RESTATIS_KEY")) - stop(paste0("'Zensus' database credentials not found. ", - "Please run 'gen_auth_save()' to store 'Zensus' database username and password."), - call. = FALSE) + #--------------------------------------------------------------------------- + + } else if (database == "zensus") { + + auth_path <- gen_auth_path("auth_zensus.rds") + + if (!(file.exists(auth_path) && nzchar(Sys.getenv("ZENSUS_KEY")))) { + + stop(paste0("'Zensus' database credentials not found. ", + "Please run 'gen_auth_save()' to store 'Zensus' database username and password."), + call. = FALSE) } return(httr2::secret_read_rds(auth_path, "ZENSUS_KEY")) - #--------------------------------------------------------------------------- + #------------------------------------------------------------------------------- - } else if ("regio" %in% database && !("all" %in% database)){ + } else if (database == "regio") { - if(is.null(sys.call(-1))){ + auth_path <- gen_auth_path("auth_regio.rds") - message("Retrieving credentials for 'Regionalstatistik' database.") + if (!(file.exists(auth_path) && nzchar(Sys.getenv("REGIO_KEY")))) { - } + stop(paste0("'Regionalstatistik' database credentials not found. ", + "Please run 'gen_auth_save()' to store 'Regionalstatistik' database username and password."), + call. = FALSE) - auth_path <- gen_auth_path("auth_regio.rds") + } - if (!(file.exists(auth_path) && nzchar(Sys.getenv("REGIO_KEY")))) { + return(httr2::secret_read_rds(auth_path, "REGIO_KEY")) - stop(paste0("'Regionalstatistik' database credentials not found. ", - "Please run 'gen_auth_save()' to store 'Regionalstatistik' database username and password."), - call. = FALSE) + #----------------------------------------------------------------------------- - } + } else if (database == "all") { - return(httr2::secret_read_rds(auth_path, "REGIO_KEY")) + auth_path <- gen_auth_path("auth.rds") - #--------------------------------------------------------------------------- + if (!(file.exists(auth_path) && nzchar(Sys.getenv("RESTATIS_KEY")))) { - } else if ("all" %in% database){ + stop(paste0("'GENESIS' database credentials not found. ", + "Please run 'gen_auth_save()' to store 'GENESIS' database username and password."), + call. = FALSE) - if(is.null(sys.call(-1))){ + } - message("Retrieving credentials for 'GENESIS' database.") + message("Password for database 'GENESIS':\n") + print(httr2::secret_read_rds(auth_path, "RESTATIS_KEY")) - } + #--------------------------------------------------------------------------- - auth_path <- gen_auth_path("auth.rds") + auth_path <- gen_auth_path("auth_zensus.rds") - if (!(file.exists(auth_path) && nzchar(Sys.getenv("RESTATIS_KEY")))) { + if (!(file.exists(auth_path) && nzchar(Sys.getenv("ZENSUS_KEY")))) { - stop(paste0("'GENESIS' database credentials not found. ", - "Please run 'gen_auth_save()' to store 'GENESIS' database username and password."), - call. = FALSE) + stop(paste0("'Zensus' database credentials not found. ", + "Please run 'gen_auth_save()' to store 'Zensus' database username and password."), + call. = FALSE) - } + } - return(httr2::secret_read_rds(auth_path, "RESTATIS_KEY")) + message("Password for database 'Zensus':\n") + print(httr2::secret_read_rds(auth_path, "ZENSUS_KEY")) - #--------------------------------------------------------------------------- + #--------------------------------------------------------------------------- - if(is.null(sys.call(-1))){ + auth_path <- gen_auth_path("auth_regio.rds") - message("Retrieving credentials for 'Zensus' database.") + if (!(file.exists(auth_path) && nzchar(Sys.getenv("REGIO_KEY")))) { - } + stop(paste0("'Regionalstatistik' database credentials not found. ", + "Please run 'gen_auth_save()' to store 'Regionalstatistik' database username and password."), + call. = FALSE) - auth_path <- gen_auth_path("auth_zensus.rds") + } - if (!(file.exists(auth_path) && nzchar(Sys.getenv("ZENSUS_KEY")))) { + message("Password for database 'regionalstatistik.de:\n") + print(httr2::secret_read_rds(auth_path, "REGIO_KEY")) - stop(paste0("'Zensus' database credentials not found. ", - "Please run 'gen_auth_save()' to store 'Zensus' database username and password."), - call. = FALSE) + } # End of 'else if (database == "all")' - } + } # End of 'if (length(database) == 1) ' - return(httr2::secret_read_rds(auth_path, "ZENSUS_KEY")) + #----------------------------------------------------------------------------- - #--------------------------------------------------------------------------- + if (length(database) > 1) { + + if ("genesis" %in% database) { - if(is.null(sys.call(-1))){ + auth_path <- gen_auth_path("auth.rds") - message("Retrieving credentials for 'Regionalstatistik' database.") + if (!(file.exists(auth_path) && nzchar(Sys.getenv("RESTATIS_KEY")))) { + + stop(paste0("'GENESIS' database credentials not found. ", + "Please run 'gen_auth_save()' to store 'GENESIS' database username and password."), + call. = FALSE) + + } + + message("Password for database 'GENESIS':\n") + print(httr2::secret_read_rds(auth_path, "RESTATIS_KEY")) } - auth_path <- gen_auth_path("auth_regio.rds") + #--------------------------------------------------------------------------- - if (!(file.exists(auth_path) && nzchar(Sys.getenv("REGIO_KEY")))) { + if ("zensus" %in% database) { - stop(paste0("'Regionalstatistik' database credentials not found. ", - "Please run 'gen_auth_save()' to store 'Regionalstatistik' database username and password."), - call. = FALSE) + auth_path <- gen_auth_path("auth_zensus.rds") + + if (!(file.exists(auth_path) && nzchar(Sys.getenv("ZENSUS_KEY")))) { + + stop(paste0("'Zensus' database credentials not found. ", + "Please run 'gen_auth_save()' to store 'Zensus' database username and password."), + call. = FALSE) + + } + + message("Password for database 'Zensus':\n") + print(httr2::secret_read_rds(auth_path, "ZENSUS_KEY")) } - return(httr2::secret_read_rds(auth_path, "REGIO_KEY")) + #--------------------------------------------------------------------------- - } else { + if ("regio" %in% database) { - stop("Invalid database argument. Please choose 'genesis', 'zensus', 'regio' or 'all'.") + auth_path <- gen_auth_path("auth_regio.rds") - } + if (!(file.exists(auth_path) && nzchar(Sys.getenv("REGIO_KEY")))) { + + stop(paste0("'Regionalstatistik' database credentials not found. ", + "Please run 'gen_auth_save()' to store 'Regionalstatistik' database username and password."), + call. = FALSE) + + } + + message("Password for database 'regionalstatistik.de:\n") + print(httr2::secret_read_rds(auth_path, "REGIO_KEY")) + + } + + #--------------------------------------------------------------------------- + + } # End of '(length(database) > 1)' } diff --git a/R/gen_cube.R b/R/gen_cube.R index 40ded15..4b6141e 100644 --- a/R/gen_cube.R +++ b/R/gen_cube.R @@ -52,6 +52,7 @@ gen_cube <- function(name, ...) { #------------------------------------------------------------------------------- gen_cube_ <- function(name, + database = c("genesis","regio"), area = c("public", "user"), values = TRUE, metadata = TRUE, @@ -87,40 +88,76 @@ gen_cube_ <- function(name, classifyingkey2 <- param_collapse_vec(classifyingkey2) classifyingkey3 <- param_collapse_vec(classifyingkey3) - cube <- gen_api("data/cubefile", name = name, - name = name, - area = area, - values = values, - metadata = metadata, - additionals = additionals, - startyear = startyear, - endyear = endyear, - timeslices = timeslices, - contents = contents, - regionalvariable = regionalvariable, - regionalkey = regionalkey, - classifyingvariable1 = classifyingvariable1, - classifyingkey1 = classifyingkey1, - classifyingvariable2 = classifyingvariable2, - classifyingkey2 = classifyingkey2, - classifyingvariable3 = classifyingvariable3, - classifyingkey3 = classifyingkey3, - stand = stand, - language = language, - job = FALSE) %>% - - read_cube() %>% - rename_cube_data_columns() - - structure( - cube$QEI, - metadata = cube[names(cube) != "QEI"] - ) + #----------------------------------------------------------------------------- + + if (database == "genesis") { + + cube_raw <- gen_api("data/cubefile", + name = name, + area = area, + values = values, + metadata = metadata, + additionals = additionals, + startyear = startyear, + endyear = endyear, + timeslices = timeslices, + contents = contents, + regionalvariable = regionalvariable, + regionalkey = regionalkey, + classifyingvariable1 = classifyingvariable1, + classifyingkey1 = classifyingkey1, + classifyingvariable2 = classifyingvariable2, + classifyingkey2 = classifyingkey2, + classifyingvariable3 = classifyingvariable3, + classifyingkey3 = classifyingkey3, + stand = stand, + language = language, + job = FALSE) + + } else if (database == "regio") { + + cube_raw <- gen_regio_api("data/cubefile", + name = name, + area = area, + values = values, + metadata = metadata, + additionals = additionals, + startyear = startyear, + endyear = endyear, + timeslices = timeslices, + contents = contents, + regionalvariable = regionalvariable, + regionalkey = regionalkey, + classifyingvariable1 = classifyingvariable1, + classifyingkey1 = classifyingkey1, + classifyingvariable2 = classifyingvariable2, + classifyingkey2 = classifyingkey2, + classifyingvariable3 = classifyingvariable3, + classifyingkey3 = classifyingkey3, + stand = stand, + language = language, + job = FALSE) + + } else { + + stop("Wrong specification of parameter 'database' (must be 'regio' or 'genesis'.", + call. = FALSE) + + } + + #------------------------------------------------------------------------------- + + cube <- cube_raw %>% read_cube() %>% rename_cube_data_columns() + + structure(cube$QEI, + metadata = cube[names(cube) != "QEI"]) + } #------------------------------------------------------------------------------- read_cube <- function(resp) { + cube_str <- resp %>% httr2::resp_body_string() %>% readr::read_lines() @@ -134,37 +171,44 @@ read_cube <- function(resp) { parsed <- lapply(parsed, `attr<-`, "block_name", NULL) stats::setNames(parsed, block_names) + } #------------------------------------------------------------------------------- split_cube <- function(lines) { + block_idx <- ifelse(is_cube_metadata_header(lines), seq_along(lines), NA) + block_idx <- vctrs::vec_fill_missing(block_idx, "down") unname(split(lines, block_idx)) + } #------------------------------------------------------------------------------- is_cube_metadata_header <- function(lines) { + startsWith(lines, "K") + } #------------------------------------------------------------------------------- read_cube_block <- function(lines) { + header <- read_cube_metadata_header(lines[1]) - structure( - read_cube_data_lines(lines[-1], header$cols), - block_name = header$block_name - ) + structure(read_cube_data_lines(lines[-1], header$cols), + block_name = header$block_name) + } #------------------------------------------------------------------------------- read_cube_metadata_header <- function(line, rename_dups = TRUE) { + stopifnot(length(line) == 1L) line_splitted <- strsplit(line, ";", fixed = TRUE)[[1]] @@ -172,32 +216,35 @@ read_cube_metadata_header <- function(line, rename_dups = TRUE) { block_name <- line_splitted[2] col_names <- line_splitted[3:length(line_splitted)] + col_names <- col_names[!col_names %in% c("\"nur Werte\"", "\"mit Werten\"")] if (rename_dups) col_names <- make.unique(col_names) list(block_name = block_name, cols = col_names) + } #------------------------------------------------------------------------------- read_cube_data_lines <- function(lines, col_names) { + lines <- sub("D;", "", lines, fixed = TRUE) class(lines) <- "AsIs" # so that vroom treats lines as literal data - readr::read_delim( - lines, - delim = ";", - col_names = col_names, - name_repair = "minimal", - show_col_types = FALSE - ) + readr::read_delim(lines, + delim = ";", + col_names = col_names, + name_repair = "minimal", + show_col_types = FALSE) + } #------------------------------------------------------------------------------- rename_cube_data_columns <- function(cube) { + data_cols <- names(cube$QEI) # Datenquader-Achsen @@ -218,12 +265,12 @@ rename_cube_data_columns <- function(cube) { suffix = dqi_default_names, feature_name = cube$DQI$NAME )[, c("feature_name", "suffix")], - MoreArgs = list(sep = "_") - )) + MoreArgs = list(sep = "_"))) data_cols[data_cols %in% dqi_cols] <- dqi_cols_new names(cube$QEI) <- data_cols - cube + return(cube) + } diff --git a/R/gen_list_jobs.R b/R/gen_list_jobs.R index 9764c65..23e6c8c 100644 --- a/R/gen_list_jobs.R +++ b/R/gen_list_jobs.R @@ -10,9 +10,8 @@ #' @export #' gen_list_jobs <- function(sortcriterion = c("type", "time", "status", "code"), - database = c("genesis", "zensus"), - ... - ) { + database = c("genesis", "zensus", "regio"), + ...) { gen_fun <- test_database_function(database) @@ -30,7 +29,7 @@ gen_list_jobs <- function(sortcriterion = c("type", "time", "status", "code"), ) } - ############################################################## + #----------------------------------------------------------------------------- if(gen_fun == "gen_api"){ @@ -40,7 +39,15 @@ gen_list_jobs <- function(sortcriterion = c("type", "time", "status", "code"), ... ) - } else if ( gen_fun == "gen_zensus_api"){ + } else if (gen_fun == "gen_zensus_api"){ + + par_list <- list( + endpoint = "catalogue/jobs", + sortcriterion = sortcriterion, + ... + ) + + } else if (gen_fun == "gen_regio_api") { par_list <- list( endpoint = "catalogue/jobs", diff --git a/R/gen_table.R b/R/gen_table.R index dfd9e09..3d78824 100644 --- a/R/gen_table.R +++ b/R/gen_table.R @@ -35,8 +35,8 @@ #' \item{\code{job}}{Boolean. Indicate as to whether a job should be created #' (not available with the 'Zensus' database).)} #' \item{\code{all_character}}{Boolean. Should all variables be imported as -#' 'character' variables? This can be useful if there are a lot of -#' leading zeros. Defaults to FALSE.} +#' 'character' variables? Avoids fuzzy data type conversions if there are +#' leading zeros or other special characters. Defaults to TRUE.} #' } #' #' @export @@ -72,7 +72,7 @@ gen_table_ <- function(name, stand = NULL, language = Sys.getenv("GENESIS_LANG"), job = FALSE, - all_character = FALSE) { + all_character = TRUE) { #----------------------------------------------------------------------------- # Parameter processing diff --git a/R/utils_dataprocessing.R b/R/utils_dataprocessing.R index c3c6009..858e458 100644 --- a/R/utils_dataprocessing.R +++ b/R/utils_dataprocessing.R @@ -999,30 +999,40 @@ titel_search <- function(x, term) { #' test_database_function <- function(input){ + #----------------------------------------------------------------------------- + if(length(input) > 1){ input <- input[1] } + #----------------------------------------------------------------------------- + if(is.na(input)){ - stop("Database parameter must be either 'genesis' or 'zensus'.", + stop("Database parameter must be either 'genesis', 'regio' or 'zensus'.", call. = FALSE) } - if(input == "genesis"){ + #----------------------------------------------------------------------------- + + if (input == "genesis"){ return("gen_api") - } else if(input == "zensus"){ + } else if (input == "zensus"){ return("gen_zensus_api") + } else if (input == "regio") { + + return("gen_regio_api") + } else { - stop("Database parameter must be either 'genesis' or 'zensus'. No other values allowed.", + stop("Database parameter must be either 'genesis', 'regio' or 'zensus'. No other values allowed.", call. = FALSE) } From 0887f2597d90458ce082cc46a34ca9ea87a7b519 Mon Sep 17 00:00:00 2001 From: buhly Date: Wed, 3 Jul 2024 11:34:47 +0200 Subject: [PATCH 27/52] fix gen_logincheck --- R/gen_api.R | 4 +- R/gen_auth.R | 3 + R/gen_logincheck.R | 37 +- R/utils_httr2.R | 167 +- R/zzz.R | 7 +- .../api/catalogue/tables-c47d1c.json | 119 - .../api/catalogue/statistics-f5c1c1.json | 30 - .../api/catalogue/cubes-b8e23a.json | 21 - .../api/catalogue/cubes-6cb32c.json | 310 -- .../api/catalogue/statistics-c47d1c.json | 42 - .../api/catalogue/tables-c47d1c.json | 119 - .../api/catalogue/tables-d53922.json | 54 - .../api/catalogue/tables-d53922.json | 54 - .../cube1/api/data/cubefile-f31506.csv | 2494 ----------------- .../testthat/find1/api/find/find-c24582.json | 705 ----- .../find2_fake/api/find/find-ef22fd.json | 705 ----- .../testthat/find3/api/find/find-9961d3.json | 294 -- .../meta1/api/metadata/table-7837de.json | 74 - .../meta2_fake/api/metadata/cube-8d0bb5.json | 74 - .../meta3/api/metadata/table-7837de.json | 74 - .../api/catalogue/modifieddata-00f7a4.json | 31 - .../api/catalogue/modifieddata-ceb5a8.json | 25 - .../api/catalogue/modifieddata-00f7a4.json | 31 - .../api/catalogue/modifieddata-66ae58.json | 23 - .../api/catalogue/variables-a1a6d0.json | 725 ----- .../api/catalogue/variables-d0341c.json | 725 ----- .../table1/api/data/tablefile-6dd2df.csv | 5 - .../terms1/api/catalogue/terms-6ad002.json | 148 - tests/testthat/test_gen_api.R | 9 +- tests/testthat/test_gen_logincheck.R | 17 + tests/testthat/test_gen_table.R | 9 +- .../api/catalogue/values2variable-886f37.json | 24 - .../api/catalogue/values2variable-cb5890.json | 121 - .../catalogue/variables2statistic-476d62.json | 117 - .../catalogue/variables2statistic-3d1ffb.json | 110 - .../catalogue/variables2statistic-8da08f.json | 117 - .../api/catalogue/cubes2statistic-bacd2f.json | 199 -- .../catalogue/tables2statistic-476d62.json | 78 - .../catalogue/variables2statistic-476d62.json | 117 - .../catalogue/tables2statistic-476d62.json | 78 - .../catalogue/tables2statistic-476d62.json | 78 - .../catalogue/statistics2variable-0e956d.json | 625 ----- .../api/catalogue/tables2variable-0e956d.json | 523 ---- .../catalogue/timeseries2variable-b809d6.json | 823 ------ .../api/catalogue/tables2variable-0e956d.json | 523 ---- .../api/catalogue/tables2variable-0e956d.json | 523 ---- 46 files changed, 189 insertions(+), 11002 deletions(-) delete mode 100644 tests/testthat/catalogue1/api/catalogue/tables-c47d1c.json delete mode 100644 tests/testthat/catalogue2/api/catalogue/statistics-f5c1c1.json delete mode 100644 tests/testthat/catalogue3/api/catalogue/cubes-b8e23a.json delete mode 100644 tests/testthat/catalogue4/api/catalogue/cubes-6cb32c.json delete mode 100644 tests/testthat/catalogue4/api/catalogue/statistics-c47d1c.json delete mode 100644 tests/testthat/catalogue4/api/catalogue/tables-c47d1c.json delete mode 100644 tests/testthat/catalogue5/api/catalogue/tables-d53922.json delete mode 100644 tests/testthat/catalogue6/api/catalogue/tables-d53922.json delete mode 100644 tests/testthat/cube1/api/data/cubefile-f31506.csv delete mode 100644 tests/testthat/find1/api/find/find-c24582.json delete mode 100644 tests/testthat/find2_fake/api/find/find-ef22fd.json delete mode 100644 tests/testthat/find3/api/find/find-9961d3.json delete mode 100644 tests/testthat/meta1/api/metadata/table-7837de.json delete mode 100644 tests/testthat/meta2_fake/api/metadata/cube-8d0bb5.json delete mode 100644 tests/testthat/meta3/api/metadata/table-7837de.json delete mode 100644 tests/testthat/modified1/api/catalogue/modifieddata-00f7a4.json delete mode 100644 tests/testthat/modified2/api/catalogue/modifieddata-ceb5a8.json delete mode 100644 tests/testthat/modified3/api/catalogue/modifieddata-00f7a4.json delete mode 100644 tests/testthat/modified4_fake/api/catalogue/modifieddata-66ae58.json delete mode 100644 tests/testthat/searchvars1/api/catalogue/variables-a1a6d0.json delete mode 100644 tests/testthat/searchvars2_fake/api/catalogue/variables-d0341c.json delete mode 100644 tests/testthat/table1/api/data/tablefile-6dd2df.csv delete mode 100644 tests/testthat/terms1/api/catalogue/terms-6ad002.json create mode 100644 tests/testthat/test_gen_logincheck.R delete mode 100644 tests/testthat/values1/api/catalogue/values2variable-886f37.json delete mode 100644 tests/testthat/values2/api/catalogue/values2variable-cb5890.json delete mode 100644 tests/testthat/variables1/api/catalogue/variables2statistic-476d62.json delete mode 100644 tests/testthat/variables2_fake/api/catalogue/variables2statistic-3d1ffb.json delete mode 100644 tests/testthat/variables3/api/catalogue/variables2statistic-8da08f.json delete mode 100644 tests/testthat/xy_statistic1/api/catalogue/cubes2statistic-bacd2f.json delete mode 100644 tests/testthat/xy_statistic1/api/catalogue/tables2statistic-476d62.json delete mode 100644 tests/testthat/xy_statistic1/api/catalogue/variables2statistic-476d62.json delete mode 100644 tests/testthat/xy_statistic2/api/catalogue/tables2statistic-476d62.json delete mode 100644 tests/testthat/xy_statistic3/api/catalogue/tables2statistic-476d62.json delete mode 100644 tests/testthat/xy_variable1/api/catalogue/statistics2variable-0e956d.json delete mode 100644 tests/testthat/xy_variable1/api/catalogue/tables2variable-0e956d.json delete mode 100644 tests/testthat/xy_variable1/api/catalogue/timeseries2variable-b809d6.json delete mode 100644 tests/testthat/xy_variable2/api/catalogue/tables2variable-0e956d.json delete mode 100644 tests/testthat/xy_variable3/api/catalogue/tables2variable-0e956d.json diff --git a/R/gen_api.R b/R/gen_api.R index acf407f..b0a75dc 100644 --- a/R/gen_api.R +++ b/R/gen_api.R @@ -34,7 +34,7 @@ gen_api <- function(endpoint, ...) { #' httr2::resp_body_json() #' gen_regio_api <- function(endpoint, ...) { - httr2::request("https://www-genesis.destatis.de/genesisWS/rest/2020/") %>% + httr2::request("https://www.regionalstatistik.de/genesisws/rest/2020/") %>% httr2::req_user_agent("https://github.com/CorrelAid/restatis") %>% httr2::req_url_path_append(endpoint) %>% httr2::req_url_query(!!!gen_auth_get(database = "regio"), ...) %>% @@ -57,7 +57,7 @@ gen_regio_api <- function(endpoint, ...) { #' httr2::resp_body_json() #' gen_zensus_api <- function(endpoint, ...) { - httr2::request("https://www.regionalstatistik.de/genesisws/rest/2020/") %>% + httr2::request("https://ergebnisse2011.zensus2022.de/api/rest/2020/") %>% httr2::req_user_agent("https://github.com/CorrelAid/restatis") %>% httr2::req_url_path_append(endpoint) %>% httr2::req_url_query(!!!gen_auth_get(database = "zensus"), ...) %>% diff --git a/R/gen_auth.R b/R/gen_auth.R index ebeaaa6..b8264a5 100644 --- a/R/gen_auth.R +++ b/R/gen_auth.R @@ -17,6 +17,9 @@ gen_auth_save <- function(database = c("all", "genesis", "zensus", "regio")) { #----------------------------------------------------------------------------- + if (missing(database)) stop("You have to specify a value for parameter 'database'.", + call. = FALSE) + if(database == "genesis"){ username <- gen_auth_ask("username") diff --git a/R/gen_logincheck.R b/R/gen_logincheck.R index 175a4fb..1c3c85f 100644 --- a/R/gen_logincheck.R +++ b/R/gen_logincheck.R @@ -2,6 +2,7 @@ #' #' @description Function to check if a login is possible for a certain database. #' @param database Takes the values 'genesis', 'regio', 'zensus' and 'all'. +#' @param verbose Boolean. In case of success, should a message be printed? Defaults to FALSE. #' #' @return Leads to an informative error message if the login check failed. Invisibly returns TRUE otherwise. #' @export @@ -13,40 +14,6 @@ #' gen_logincheck <- function(database, verbose = FALSE) { - if (database == "genesis") { - - response <- gen_api("helloworld/logincheck") - warn_if_http_error(response, database, verbose) - - } else if (database == "zensus") { - - response <- gen_zensus_api("helloworld/logincheck") - warn_if_http_error(response, database, verbose) - - } else if (database == "regio") { - - response <- gen_regio_api("helloworld/logincheck") - warn_if_http_error(response, database, verbose) - - } else if (database == "all") { - - databases <- list("genesis", "zensus", "regio") - - response_list <- list(response_genesis = gen_api("helloworld/logincheck"), - response_zensus = gen_zensus_api("helloworld/logincheck"), - response_regio = gen_regio_api("helloworld/logincheck")) - - purrr::walk2(.x = response_list, - .y = databases, - .f = ~ warn_if_http_error(response = .x, - database = .y, - verbose = verbose)) - - } else { - - stop("Misspecified parameter 'database' for function 'gen_logincheck'.", - call. = FALSE) - - } + logincheck_http_error(database, verbose) } diff --git a/R/utils_httr2.R b/R/utils_httr2.R index 88ace8f..5b06175 100644 --- a/R/utils_httr2.R +++ b/R/utils_httr2.R @@ -333,25 +333,157 @@ return_table_object <- function(response, #------------------------------------------------------------------------------- -warn_if_http_error <- function(response, - database, - verbose) { - - if (response$status_code != 200) { - - warning("Database: '", - database, - "' There seems to be an issue with the authentication process (logincheck upon credential specification failed with code ", - response$status_code, - "). ", - "Please retry specifying your credentials or check whether the API is currently down.", +#' logincheck_http_error +#' +#' @param database The user input to 'gen_logincheck' +#' @param verbose Boolean. Should the function message in case of success? +#' +#' @return +#' +logincheck_http_error <- function(database, + verbose) { + + #----------------------------------------------------------------------------- + + if (length(database) == 1 && database != "all") { + + if (!(database %in% c("genesis", "zensus", "regio"))) { + + stop("Misspecified parameter 'database' (can only be 'all', 'genesis', 'zensus' or 'regio').", + call. = FALSE) + + } + + #--------------------------------------------------------------------------- + + if (database == "genesis") response <- gen_api("helloworld/logincheck") + if (database == "zensus") response <- gen_zensus_api("helloworld/logincheck") + if (database == "regio") response <- gen_regio_api("helloworld/logincheck") + + logincheck_stop_or_warn(response = response, + error = TRUE, + verbose = verbose, + database = database) + + #----------------------------------------------------------------------------- + + } else if (length(database) == 1 && database == "all") { + + databases <- list("genesis", "zensus", "regio") + + response_list <- list(response_genesis = gen_api("helloworld/logincheck"), + response_zensus = gen_zensus_api("helloworld/logincheck"), + response_regio = gen_regio_api("helloworld/logincheck")) + + purrr::walk2(.x = response_list, + .y = databases, + .f = ~ logincheck_stop_or_warn(response = .x, + database = .y, + error = FALSE, + verbose = verbose)) + + #----------------------------------------------------------------------------- + + } else if (length(database) > 1 & !("all" %in% database)) { + + if (!(all(database %in% c("genesis", "zensus", "regio")))) { + + stop("You can only specify 'all', 'genesis', 'zensus' or 'regio' inside of the parameter 'database'.", + call. = FALSE) + + } + + #--------------------------------------------------------------------------- + + if ("genesis" %in% database) { + + logincheck_stop_or_warn(response = gen_api("helloworld/logincheck"), + error = FALSE, + verbose = verbose, + database = "genesis") + + } + + #--------------------------------------------------------------------------- + + if ("zensus" %in% database) { + + logincheck_stop_or_warn(response = gen_zensus_api("helloworld/logincheck"), + error = FALSE, + verbose = verbose, + database = "zensus") + + } + + #--------------------------------------------------------------------------- + + if ("regio" %in% database) { + + logincheck_stop_or_warn(response = gen_regio_api("helloworld/logincheck"), + error = FALSE, + verbose = verbose, + database = "regio") + + } + + #----------------------------------------------------------------------------- + + } else { + + stop("If you want to specify 'all', do not specify further databases (i.e., just set database to 'all').", + call. = FALSE) + + } + +} + +#------------------------------------------------------------------------------- + +#' logincheck_stop_or_warn +#' +#' @param response A HTTP response object +#' @param error Boolean. Should the function warn or throw an error? +#' @param verbose Boolean. Should the function message in case of success? +#' @param database The database that the check should be run for +#' +#' @return In case of failure warns or errors. Invisibly returns TRUE (success) or FALSE (failure) +#' +logincheck_stop_or_warn <- function(response, + error, + verbose, + database) { + + #----------------------------------------------------------------------------- + + request_failed <- grepl("Ein Fehler ist aufgetreten", httr2::resp_body_json(response)$Status) + + if (isTRUE(request_failed) & isTRUE(error)) { + + stop(paste0("Database: '", + database, + "': There seems to be an issue with the authentication process (logincheck upon credential specification failed). \n", + "Please retry specifying your credentials."), + call. = FALSE) + + invisible(FALSE) + + #----------------------------------------------------------------------------- + + } else if (isTRUE(request_failed) & isFALSE(error)) { + + warning(paste0("Database: '", + database, + "': There seems to be an issue with the authentication process (logincheck upon credential specification failed). \n", + "Please retry specifying your credentials."), call. = FALSE) invisible(FALSE) - } else { + #----------------------------------------------------------------------------- - if(isTRUE(verbose)) { + } else if (isFALSE(request_failed)) { + + if (isTRUE(verbose)) { message(paste0("Login check for database '", database, "' succeeded.")) @@ -359,6 +491,13 @@ warn_if_http_error <- function(response, invisible(TRUE) + #----------------------------------------------------------------------------- + + } else { + + stop("Checking the HTTP response failed.", + call. = FALSE) + } } diff --git a/R/zzz.R b/R/zzz.R index 0d668d5..bb50cb4 100644 --- a/R/zzz.R +++ b/R/zzz.R @@ -1,12 +1,7 @@ .onLoad <- function(libname, pkgname) { gen_api <<- memoise::memoise(gen_api) gen_zensus_api <<- memoise::memoise(gen_zensus_api) + gen_regio_api <<- memoise::memoise(gen_regio_api) if (!nzchar(Sys.getenv("GENESIS_LANG"))) Sys.setenv(GENESIS_LANG = "en") } - -# .onLoad_zensus <- function(libname, pkgname) { -# gen_zensus_api <<- memoise::memoise(gen_zensus_api) -# -# if (!nzchar(Sys.getenv("GENESIS_LANG"))) Sys.setenv(GENESIS_LANG = "en") -# } diff --git a/tests/testthat/catalogue1/api/catalogue/tables-c47d1c.json b/tests/testthat/catalogue1/api/catalogue/tables-c47d1c.json deleted file mode 100644 index 2ec2f31..0000000 --- a/tests/testthat/catalogue1/api/catalogue/tables-c47d1c.json +++ /dev/null @@ -1,119 +0,0 @@ -{ - "Ident": { - "Service": "catalogue", - "Method": "tables" - }, - "Status": { - "Code": 0, - "Content": "erfolgreich", - "Type": "Information" - }, - "Parameter": { - "username": "********************", - "password": "********************", - "selection": "611*", - "area": "oeffentlich", - "searchcriterion": "Code", - "sortcriterion": "Code", - "pagelength": "100", - "language": "de" - }, - "List": [ - { - "Code": "61111-0001", - "Content": "Verbraucherpreisindex: Deutschland, Jahre", - "Time": "1991 - 2022" - }, - { - "Code": "61111-0002", - "Content": "Verbraucherpreisindex: Deutschland, Monate", - "Time": "Januar 1991 - Februar 2023" - }, - { - "Code": "61111-0003", - "Content": "Verbraucherpreisindex: Deutschland, Jahre,\nKlassifikation der Verwendungszwecke des Individualkonsums\n(COICOP 2-5-Steller Hierarchie)", - "Time": "2020 - 2022" - }, - { - "Code": "61111-0004", - "Content": "Verbraucherpreisindex: Deutschland, Monate,\nKlassifikation der Verwendungszwecke des Individualkonsums\n(COICOP 2-5-Steller Hierarchie)", - "Time": "Januar 2020 - Februar 2023" - }, - { - "Code": "61111-0005", - "Content": "Verbraucherpreisindex: Deutschland, Jahre,\nKlassifikation der Verwendungszwecke des Individualkonsums\n(COICOP 2-/3-/4-/5-/10-Steller/Sonderpositionen)", - "Time": "1991 - 2022" - }, - { - "Code": "61111-0006", - "Content": "Verbraucherpreisindex: Deutschland, Monate,\nKlassifikation der Verwendungszwecke des Individualkonsums\n(COICOP 2-/3-/4-/5-/10-Steller/Sonderpositionen)", - "Time": "Januar 1991 - Februar 2023" - }, - { - "Code": "61111-0007", - "Content": "W?gungsschema des Verbraucherpreisindex: Deutschland, Jahre,\nKlassifikation der Verwendungszwecke des Individualkonsums\n(COICOP 2-5-Steller Hierarchie)", - "Time": "1995 - 2020" - }, - { - "Code": "61111-0010", - "Content": "Verbraucherpreisindex: Bundesl?nder, Jahre", - "Time": "2020 - 2022" - }, - { - "Code": "61111-0011", - "Content": "Verbraucherpreisindex: Bundesl?nder, Monate", - "Time": "Januar 2020 - Februar 2023" - }, - { - "Code": "61111-0020", - "Content": "Index der Nettokaltmieten: Bundesl?nder, Jahre", - "Time": "2020 - 2022" - }, - { - "Code": "61111-0021", - "Content": "Index der Nettokaltmieten: Bundesl?nder, Monate", - "Time": "Januar 2020 - Februar 2023" - }, - { - "Code": "61121-0001", - "Content": "Harmonisierter Verbraucherpreisindex: Deutschland, Jahre", - "Time": "1996 - 2022" - }, - { - "Code": "61121-0002", - "Content": "Harmonisierter Verbraucherpreisindex: Deutschland, Monate", - "Time": "Januar 1996 - Februar 2023" - }, - { - "Code": "61121-0003", - "Content": "Harmonisierter Verbraucherpreisindex: Deutschland, Jahre, Europ?ische Klassifikation der Verwendungszwecke des Individualkonsums (ECOICOP 2-5-Steller Hierarchie)", - "Time": "1996 - 2022" - }, - { - "Code": "61121-0004", - "Content": "Harmonisierter Verbraucherpreisindex: Deutschland, Monate, Europ?ische Klassifikation der Verwendungszwecke des Individualkonsums (ECOICOP 2-5-Steller Hierarchie)", - "Time": "Januar 1996 - Februar 2023" - }, - { - "Code": "61121-0005", - "Content": "Harmonisierter Verbraucherpreisindex: Deutschland, Jahre, Europ?ische Klassifikation der Verwendungszwecke des Individualkonsums (ECOICOP 2-/3-/4-/5-Steller/Sonderpositionen)", - "Time": "1996 - 2022" - }, - { - "Code": "61121-0006", - "Content": "Harmonisierter Verbraucherpreisindex: Deutschland, Monate, Europ?ische Klassifikation der Verwendungszwecke des Individualkonsums (ECOICOP 2-/3-/4-/5-Steller/Sonderpositionen)", - "Time": "Januar 1996 - Februar 2023" - }, - { - "Code": "61131-0001", - "Content": "Index der Einzelhandelspreise: Deutschland, Jahre,\nMehrwertsteuer, Wirtschaftszweige", - "Time": "1991 - 2022" - }, - { - "Code": "61131-0002", - "Content": "Index der Einzelhandelspreise: Deutschland, Monate,\nMehrwertsteuer, Wirtschaftszweige", - "Time": "Januar 1991 - Februar 2023" - } - ], - "Copyright": "? Statistisches Bundesamt (Destatis), 2023" -} diff --git a/tests/testthat/catalogue2/api/catalogue/statistics-f5c1c1.json b/tests/testthat/catalogue2/api/catalogue/statistics-f5c1c1.json deleted file mode 100644 index b12efe9..0000000 --- a/tests/testthat/catalogue2/api/catalogue/statistics-f5c1c1.json +++ /dev/null @@ -1,30 +0,0 @@ -{ - "Ident": { - "Service": "catalogue", - "Method": "statistics" - }, - "Status": { - "Code": 0, - "Content": "erfolgreich", - "Type": "Information" - }, - "Parameter": { - "username": "********************", - "password": "********************", - "selection": "41141", - "searchcriterion": "Code", - "sortcriterion": "Code", - "pagelength": "100", - "language": "de", - "area": "Alle" - }, - "List": [ - { - "Code": "41141", - "Content": "Landwirtschaftszaehlung: Haupterhebung", - "Cubes": "176", - "Information": "true" - } - ], - "Copyright": "? Statistisches Bundesamt (Destatis), 2023" -} diff --git a/tests/testthat/catalogue3/api/catalogue/cubes-b8e23a.json b/tests/testthat/catalogue3/api/catalogue/cubes-b8e23a.json deleted file mode 100644 index c892017..0000000 --- a/tests/testthat/catalogue3/api/catalogue/cubes-b8e23a.json +++ /dev/null @@ -1,21 +0,0 @@ -{ - "Ident": { - "Service": "catalogue", - "Method": "cubes" - }, - "Status": { - "Code": 104, - "Content": "Es gibt keine Objekte zum angegebenen Selektionskriterium", - "Type": "Information" - }, - "Parameter": { - "username": "********************", - "password": "********************", - "selection": "41141", - "area": "oeffentlich", - "pagelength": "100", - "language": "de" - }, - "List": null, - "Copyright": "? Statistisches Bundesamt (Destatis), 2023" -} diff --git a/tests/testthat/catalogue4/api/catalogue/cubes-6cb32c.json b/tests/testthat/catalogue4/api/catalogue/cubes-6cb32c.json deleted file mode 100644 index 7ec310b..0000000 --- a/tests/testthat/catalogue4/api/catalogue/cubes-6cb32c.json +++ /dev/null @@ -1,310 +0,0 @@ -{ - "Ident": { - "Service": "catalogue", - "Method": "cubes" - }, - "Status": { - "Code": 0, - "Content": "erfolgreich", - "Type": "Information" - }, - "Parameter": { - "username": "********************", - "password": "********************", - "selection": "611*", - "area": "oeffentlich", - "pagelength": "100", - "language": "de" - }, - "List": [ - { - "Code": "61111B5001", - "Content": "Verbraucherpreisindex f?r Deutschland, Gewichtung, Deutschland insgesamt, Verwendungszwecke des Individualkonsums, 2-Steller, Jahr", - "State": "vollst?ndig mit Werten", - "Time": "1995-2020", - "LatestUpdate": "17.02.2023 17:46:32h", - "Information": "false" - }, - { - "Code": "61111B5002", - "Content": "Verbraucherpreisindex f?r Deutschland, Gewichtung, Deutschland insgesamt, Verwendungszwecke des Individualkonsums, 3-Steller, Jahr", - "State": "vollst?ndig mit Werten", - "Time": "1995-2020", - "LatestUpdate": "17.02.2023 17:46:32h", - "Information": "false" - }, - { - "Code": "61111B5003", - "Content": "Verbraucherpreisindex f?r Deutschland, Gewichtung, Deutschland insgesamt, Verwendungszwecke des Individualkonsums, 4-Steller, Jahr", - "State": "vollst?ndig mit Werten", - "Time": "1995-2020", - "LatestUpdate": "17.02.2023 17:46:32h", - "Information": "false" - }, - { - "Code": "61111B5004", - "Content": "Verbraucherpreisindex f?r Deutschland, Gewichtung, Deutschland insgesamt, Verwendungszwecke des Individualkonsums, 5-Steller, Jahr", - "State": "vollst?ndig mit Werten", - "Time": "1995-2020", - "LatestUpdate": "17.02.2023 17:46:32h", - "Information": "false" - }, - { - "Code": "61111BJ001", - "Content": "Verbraucherpreisindex f?r Deutschland, Verbraucherpreisindex, Deutschland insgesamt, Jahr", - "State": "vollst?ndig mit Werten", - "Time": "1991-2022", - "LatestUpdate": "09.03.2023 12:07:11h", - "Information": "false" - }, - { - "Code": "61111BJ002", - "Content": "Verbraucherpreisindex f?r Deutschland, Verbraucherpreisindex, Deutschland insgesamt, Verwendungszwecke des Individualkonsums, 2-Steller, Jahr", - "State": "vollst?ndig mit Werten", - "Time": "1991-2022", - "LatestUpdate": "09.03.2023 12:09:18h", - "Information": "false" - }, - { - "Code": "61111BJ003", - "Content": "Verbraucherpreisindex f?r Deutschland, Verbraucherpreisindex, Deutschland insgesamt, Verwendungszwecke des Individualkonsums, 3-Steller, Jahr", - "State": "vollst?ndig mit Werten", - "Time": "1991-2022", - "LatestUpdate": "09.03.2023 12:11:38h", - "Information": "false" - }, - { - "Code": "61111BJ004", - "Content": "Verbraucherpreisindex f?r Deutschland, Verbraucherpreisindex, Deutschland insgesamt, Verwendungszwecke des Individualkonsums, 4-Steller, Jahr", - "State": "vollst?ndig mit Werten", - "Time": "2020-2022", - "LatestUpdate": "17.02.2023 17:46:49h", - "Information": "false" - }, - { - "Code": "61111BJ005", - "Content": "Verbraucherpreisindex f?r Deutschland, Verbraucherpreisindex, Deutschland insgesamt, Verwendungszwecke des Individualkonsums, 5-Steller, Jahr", - "State": "vollst?ndig mit Werten", - "Time": "2020-2022", - "LatestUpdate": "17.02.2023 17:46:49h", - "Information": "false" - }, - { - "Code": "61111BJ006", - "Content": "Verbraucherpreisindex f?r Deutschland, Verbraucherpreisindex, Deutschland insgesamt, Verwendungszw.d.Individualkonsums,Sonderpositionen, Jahr", - "State": "vollst?ndig mit Werten", - "Time": "2020-2022", - "LatestUpdate": "17.02.2023 17:46:49h", - "Information": "false" - }, - { - "Code": "61111BJ007", - "Content": "Verbraucherpreisindex f?r Deutschland, Verbraucherpreisindex, Deutschland insgesamt, Verwendungszwecke des Individualkonsums,10-Steller, Jahr", - "State": "vollst?ndig mit Werten", - "Time": "2020-2022", - "LatestUpdate": "03.03.2023 10:05:14h", - "Information": "false" - }, - { - "Code": "61111BM001", - "Content": "Verbraucherpreisindex f?r Deutschland, Verbraucherpreisindex, Deutschland insgesamt, Monate, Jahr", - "State": "vollst?ndig mit Werten", - "Time": "Januar 1991-Februar 2023", - "LatestUpdate": "10.03.2023 08:00:47h", - "Information": "false" - }, - { - "Code": "61111BM002", - "Content": "Verbraucherpreisindex f?r Deutschland, Verbraucherpreisindex, Deutschland insgesamt, Verwendungszwecke des Individualkonsums, 2-Steller, Monate, Jahr", - "State": "vollst?ndig mit Werten", - "Time": "Januar 1991-Februar 2023", - "LatestUpdate": "10.03.2023 08:00:35h", - "Information": "false" - }, - { - "Code": "61111BM003", - "Content": "Verbraucherpreisindex f?r Deutschland, Verbraucherpreisindex, Deutschland insgesamt, Verwendungszwecke des Individualkonsums, 3-Steller, Monate, Jahr", - "State": "vollst?ndig mit Werten", - "Time": "Januar 1991-Februar 2023", - "LatestUpdate": "10.03.2023 08:00:54h", - "Information": "false" - }, - { - "Code": "61111BM004", - "Content": "Verbraucherpreisindex f?r Deutschland, Verbraucherpreisindex, Deutschland insgesamt, Verwendungszwecke des Individualkonsums, 4-Steller, Monate, Jahr", - "State": "vollst?ndig mit Werten", - "Time": "Januar 2020-Februar 2023", - "LatestUpdate": "10.03.2023 08:00:51h", - "Information": "false" - }, - { - "Code": "61111BM005", - "Content": "Verbraucherpreisindex f?r Deutschland, Verbraucherpreisindex, Deutschland insgesamt, Verwendungszwecke des Individualkonsums, 5-Steller, Monate, Jahr", - "State": "vollst?ndig mit Werten", - "Time": "Januar 2020-Februar 2023", - "LatestUpdate": "10.03.2023 08:00:38h", - "Information": "false" - }, - { - "Code": "61111BM006", - "Content": "Verbraucherpreisindex f?r Deutschland, Verbraucherpreisindex, Deutschland insgesamt, Verwendungszw.d.Individualkonsums,Sonderpositionen, Monate, Jahr", - "State": "vollst?ndig mit Werten", - "Time": "Januar 2020-Februar 2023", - "LatestUpdate": "10.03.2023 08:00:28h", - "Information": "false" - }, - { - "Code": "61111BM007", - "Content": "Verbraucherpreisindex f?r Deutschland, Verbraucherpreisindex, Deutschland insgesamt, Verwendungszwecke des Individualkonsums,10-Steller, Monate, Jahr", - "State": "vollst?ndig mit Werten", - "Time": "Januar 2020-Februar 2023", - "LatestUpdate": "10.03.2023 08:00:31h", - "Information": "false" - }, - { - "Code": "61111LJ001", - "Content": "Verbraucherpreisindex f?r Deutschland, Verbraucherpreisindex, Bundesl?nder, Jahr", - "State": "vollst?ndig mit Werten", - "Time": "2020-2022", - "LatestUpdate": "17.02.2023 17:47:09h", - "Information": "false" - }, - { - "Code": "61111LJ100", - "Content": "Verbraucherpreisindex f?r Deutschland, Index der Nettokaltmieten, Bundesl?nder, Jahr", - "State": "vollst?ndig mit Werten", - "Time": "2020-2022", - "LatestUpdate": "17.02.2023 17:47:09h", - "Information": "false" - }, - { - "Code": "61111LM001", - "Content": "Verbraucherpreisindex f?r Deutschland, Verbraucherpreisindex, Bundesl?nder, Monate, Jahr", - "State": "vollst?ndig mit Werten", - "Time": "Januar 2020-Februar 2023", - "LatestUpdate": "10.03.2023 08:00:41h", - "Information": "false" - }, - { - "Code": "61111LM100", - "Content": "Verbraucherpreisindex f?r Deutschland, Index der Nettokaltmieten, Bundesl?nder, Monate, Jahr", - "State": "vollst?ndig mit Werten", - "Time": "Januar 2020-Februar 2023", - "LatestUpdate": "10.03.2023 08:00:44h", - "Information": "false" - }, - { - "Code": "61121BJ001", - "Content": "Harmonisierter Verbraucherpreisindex, Harmonisierter Verbraucherpreisindex, Ver?nderungsrate zum Vorjahr, Deutschland insgesamt, Jahr", - "State": "vollst?ndig mit Werten", - "Time": "1996-2022", - "LatestUpdate": "24.01.2023 17:58:25h", - "Information": "false" - }, - { - "Code": "61121BJ002", - "Content": "Harmonisierter Verbraucherpreisindex, Harmonisierter Verbraucherpreisindex, Deutschland insgesamt, ECOICOP: Harmon. Verbraucherpreisindex, 2-Steller, Jahr", - "State": "vollst?ndig mit Werten", - "Time": "1996-2022", - "LatestUpdate": "24.01.2023 17:58:26h", - "Information": "false" - }, - { - "Code": "61121BJ003", - "Content": "Harmonisierter Verbraucherpreisindex, Harmonisierter Verbraucherpreisindex, Deutschland insgesamt, ECOICOP: Harmon. Verbraucherpreisindex, 3-Steller, Jahr", - "State": "vollst?ndig mit Werten", - "Time": "1996-2022", - "LatestUpdate": "24.01.2023 17:58:26h", - "Information": "false" - }, - { - "Code": "61121BJ004", - "Content": "Harmonisierter Verbraucherpreisindex, Harmonisierter Verbraucherpreisindex, Deutschland insgesamt, ECOICOP: Harmon. Verbraucherpreisindex, 4-Steller, Jahr", - "State": "vollst?ndig mit Werten", - "Time": "1996-2022", - "LatestUpdate": "24.01.2023 17:58:26h", - "Information": "false" - }, - { - "Code": "61121BJ005", - "Content": "Harmonisierter Verbraucherpreisindex, Harmonisierter Verbraucherpreisindex, Deutschland insgesamt, ECOICOP: Harmon. Verbraucherpreisindex, 5-Steller, Jahr", - "State": "vollst?ndig mit Werten", - "Time": "1996-2022", - "LatestUpdate": "24.01.2023 17:58:26h", - "Information": "false" - }, - { - "Code": "61121BJ006", - "Content": "Harmonisierter Verbraucherpreisindex, Harmonisierter Verbraucherpreisindex, Deutschland insgesamt, ECOICOP: Harmon. Verbraucherpreisindex, Sonderpos., Jahr", - "State": "vollst?ndig mit Werten", - "Time": "1996-2022", - "LatestUpdate": "24.01.2023 17:58:26h", - "Information": "false" - }, - { - "Code": "61121BM001", - "Content": "Harmonisierter Verbraucherpreisindex, Harmonisierter Verbraucherpreisindex, Ver?nderungsrate zum Vorjahresmonat, Ver?nderungsrate zum Vormonat, Deutschland insgesamt, Monate, Jahr", - "State": "vollst?ndig mit Werten", - "Time": "Januar 1996-Februar 2023", - "LatestUpdate": "10.03.2023 08:01:38h", - "Information": "false" - }, - { - "Code": "61121BM002", - "Content": "Harmonisierter Verbraucherpreisindex, Harmonisierter Verbraucherpreisindex, Deutschland insgesamt, ECOICOP: Harmon. Verbraucherpreisindex, 2-Steller, Monate, Jahr", - "State": "vollst?ndig mit Werten", - "Time": "Januar 1996-Februar 2023", - "LatestUpdate": "10.03.2023 08:00:57h", - "Information": "false" - }, - { - "Code": "61121BM003", - "Content": "Harmonisierter Verbraucherpreisindex, Harmonisierter Verbraucherpreisindex, Deutschland insgesamt, ECOICOP: Harmon. Verbraucherpreisindex, 3-Steller, Monate, Jahr", - "State": "vollst?ndig mit Werten", - "Time": "Januar 1996-Februar 2023", - "LatestUpdate": "10.03.2023 08:01:34h", - "Information": "false" - }, - { - "Code": "61121BM004", - "Content": "Harmonisierter Verbraucherpreisindex, Harmonisierter Verbraucherpreisindex, Deutschland insgesamt, ECOICOP: Harmon. Verbraucherpreisindex, 4-Steller, Monate, Jahr", - "State": "vollst?ndig mit Werten", - "Time": "Januar 1996-Februar 2023", - "LatestUpdate": "10.03.2023 08:01:31h", - "Information": "false" - }, - { - "Code": "61121BM005", - "Content": "Harmonisierter Verbraucherpreisindex, Harmonisierter Verbraucherpreisindex, Deutschland insgesamt, ECOICOP: Harmon. Verbraucherpreisindex, 5-Steller, Monate, Jahr", - "State": "vollst?ndig mit Werten", - "Time": "Januar 1996-Februar 2023", - "LatestUpdate": "10.03.2023 08:01:28h", - "Information": "false" - }, - { - "Code": "61121BM006", - "Content": "Harmonisierter Verbraucherpreisindex, Harmonisierter Verbraucherpreisindex, Deutschland insgesamt, ECOICOP: Harmon. Verbraucherpreisindex, Sonderpos., Monate, Jahr", - "State": "vollst?ndig mit Werten", - "Time": "Januar 1996-Februar 2023", - "LatestUpdate": "10.03.2023 08:01:41h", - "Information": "false" - }, - { - "Code": "61131BJ001", - "Content": "Index der Einzelhandelspreise, Index der Einzelhandelspreise, WZ2008 (ausgew?hlte Pos.): Einzelhandelspreise, Mehrwertsteuer, Deutschland insgesamt, Jahr", - "State": "vollst?ndig mit Werten", - "Time": "1991-2022", - "LatestUpdate": "13.03.2023 12:04:08h", - "Information": "false" - }, - { - "Code": "61131BM001", - "Content": "Index der Einzelhandelspreise, Index der Einzelhandelspreise, WZ2008 (ausgew?hlte Pos.): Einzelhandelspreise, Mehrwertsteuer, Deutschland insgesamt, Monate, Jahr", - "State": "vollst?ndig mit Werten", - "Time": "Januar 1991-Februar 2023", - "LatestUpdate": "13.03.2023 12:03:56h", - "Information": "false" - } - ], - "Copyright": "? Statistisches Bundesamt (Destatis), 2023" -} diff --git a/tests/testthat/catalogue4/api/catalogue/statistics-c47d1c.json b/tests/testthat/catalogue4/api/catalogue/statistics-c47d1c.json deleted file mode 100644 index e460dc0..0000000 --- a/tests/testthat/catalogue4/api/catalogue/statistics-c47d1c.json +++ /dev/null @@ -1,42 +0,0 @@ -{ - "Ident": { - "Service": "catalogue", - "Method": "statistics" - }, - "Status": { - "Code": 0, - "Content": "erfolgreich", - "Type": "Information" - }, - "Parameter": { - "username": "********************", - "password": "********************", - "selection": "611*", - "searchcriterion": "Code", - "sortcriterion": "Code", - "pagelength": "100", - "language": "de", - "area": "Alle" - }, - "List": [ - { - "Code": "61111", - "Content": "Verbraucherpreisindex fuer Deutschland", - "Cubes": "22", - "Information": "true" - }, - { - "Code": "61121", - "Content": "Harmonisierter Verbraucherpreisindex", - "Cubes": "12", - "Information": "true" - }, - { - "Code": "61131", - "Content": "Index der Einzelhandelspreise", - "Cubes": "2", - "Information": "false" - } - ], - "Copyright": "? Statistisches Bundesamt (Destatis), 2023" -} diff --git a/tests/testthat/catalogue4/api/catalogue/tables-c47d1c.json b/tests/testthat/catalogue4/api/catalogue/tables-c47d1c.json deleted file mode 100644 index 2ec2f31..0000000 --- a/tests/testthat/catalogue4/api/catalogue/tables-c47d1c.json +++ /dev/null @@ -1,119 +0,0 @@ -{ - "Ident": { - "Service": "catalogue", - "Method": "tables" - }, - "Status": { - "Code": 0, - "Content": "erfolgreich", - "Type": "Information" - }, - "Parameter": { - "username": "********************", - "password": "********************", - "selection": "611*", - "area": "oeffentlich", - "searchcriterion": "Code", - "sortcriterion": "Code", - "pagelength": "100", - "language": "de" - }, - "List": [ - { - "Code": "61111-0001", - "Content": "Verbraucherpreisindex: Deutschland, Jahre", - "Time": "1991 - 2022" - }, - { - "Code": "61111-0002", - "Content": "Verbraucherpreisindex: Deutschland, Monate", - "Time": "Januar 1991 - Februar 2023" - }, - { - "Code": "61111-0003", - "Content": "Verbraucherpreisindex: Deutschland, Jahre,\nKlassifikation der Verwendungszwecke des Individualkonsums\n(COICOP 2-5-Steller Hierarchie)", - "Time": "2020 - 2022" - }, - { - "Code": "61111-0004", - "Content": "Verbraucherpreisindex: Deutschland, Monate,\nKlassifikation der Verwendungszwecke des Individualkonsums\n(COICOP 2-5-Steller Hierarchie)", - "Time": "Januar 2020 - Februar 2023" - }, - { - "Code": "61111-0005", - "Content": "Verbraucherpreisindex: Deutschland, Jahre,\nKlassifikation der Verwendungszwecke des Individualkonsums\n(COICOP 2-/3-/4-/5-/10-Steller/Sonderpositionen)", - "Time": "1991 - 2022" - }, - { - "Code": "61111-0006", - "Content": "Verbraucherpreisindex: Deutschland, Monate,\nKlassifikation der Verwendungszwecke des Individualkonsums\n(COICOP 2-/3-/4-/5-/10-Steller/Sonderpositionen)", - "Time": "Januar 1991 - Februar 2023" - }, - { - "Code": "61111-0007", - "Content": "W?gungsschema des Verbraucherpreisindex: Deutschland, Jahre,\nKlassifikation der Verwendungszwecke des Individualkonsums\n(COICOP 2-5-Steller Hierarchie)", - "Time": "1995 - 2020" - }, - { - "Code": "61111-0010", - "Content": "Verbraucherpreisindex: Bundesl?nder, Jahre", - "Time": "2020 - 2022" - }, - { - "Code": "61111-0011", - "Content": "Verbraucherpreisindex: Bundesl?nder, Monate", - "Time": "Januar 2020 - Februar 2023" - }, - { - "Code": "61111-0020", - "Content": "Index der Nettokaltmieten: Bundesl?nder, Jahre", - "Time": "2020 - 2022" - }, - { - "Code": "61111-0021", - "Content": "Index der Nettokaltmieten: Bundesl?nder, Monate", - "Time": "Januar 2020 - Februar 2023" - }, - { - "Code": "61121-0001", - "Content": "Harmonisierter Verbraucherpreisindex: Deutschland, Jahre", - "Time": "1996 - 2022" - }, - { - "Code": "61121-0002", - "Content": "Harmonisierter Verbraucherpreisindex: Deutschland, Monate", - "Time": "Januar 1996 - Februar 2023" - }, - { - "Code": "61121-0003", - "Content": "Harmonisierter Verbraucherpreisindex: Deutschland, Jahre, Europ?ische Klassifikation der Verwendungszwecke des Individualkonsums (ECOICOP 2-5-Steller Hierarchie)", - "Time": "1996 - 2022" - }, - { - "Code": "61121-0004", - "Content": "Harmonisierter Verbraucherpreisindex: Deutschland, Monate, Europ?ische Klassifikation der Verwendungszwecke des Individualkonsums (ECOICOP 2-5-Steller Hierarchie)", - "Time": "Januar 1996 - Februar 2023" - }, - { - "Code": "61121-0005", - "Content": "Harmonisierter Verbraucherpreisindex: Deutschland, Jahre, Europ?ische Klassifikation der Verwendungszwecke des Individualkonsums (ECOICOP 2-/3-/4-/5-Steller/Sonderpositionen)", - "Time": "1996 - 2022" - }, - { - "Code": "61121-0006", - "Content": "Harmonisierter Verbraucherpreisindex: Deutschland, Monate, Europ?ische Klassifikation der Verwendungszwecke des Individualkonsums (ECOICOP 2-/3-/4-/5-Steller/Sonderpositionen)", - "Time": "Januar 1996 - Februar 2023" - }, - { - "Code": "61131-0001", - "Content": "Index der Einzelhandelspreise: Deutschland, Jahre,\nMehrwertsteuer, Wirtschaftszweige", - "Time": "1991 - 2022" - }, - { - "Code": "61131-0002", - "Content": "Index der Einzelhandelspreise: Deutschland, Monate,\nMehrwertsteuer, Wirtschaftszweige", - "Time": "Januar 1991 - Februar 2023" - } - ], - "Copyright": "? Statistisches Bundesamt (Destatis), 2023" -} diff --git a/tests/testthat/catalogue5/api/catalogue/tables-d53922.json b/tests/testthat/catalogue5/api/catalogue/tables-d53922.json deleted file mode 100644 index 919e6c6..0000000 --- a/tests/testthat/catalogue5/api/catalogue/tables-d53922.json +++ /dev/null @@ -1,54 +0,0 @@ -{ - "Ident": { - "Service": "catalogue", - "Method": "tables" - }, - "Status": { - "Code": 0, - "Content": "erfolgreich", - "Type": "Information" - }, - "Parameter": { - "username": "********************", - "password": "********************", - "selection": "711*", - "area": "oeffentlich", - "searchcriterion": "Code", - "sortcriterion": "Code", - "pagelength": "100", - "language": "de" - }, - "List": [ - { - "Code": "71141-0001", - "Content": "Rechnungsergebnisse des ?ffentlichen Gesamthaushalts\n(Ausgaben): Deutschland, Jahre, K?rperschaftsgruppen,\nAusgabearten", - "Time": "1992 - 2011" - }, - { - "Code": "71141-0002", - "Content": "Rechnungsergebnisse des ?ffentlichen Gesamthaushalts\n(Einnahmen): Deutschland, Jahre, K?rperschaftsgruppen,\nEinnahmearten", - "Time": "1992 - 2011" - }, - { - "Code": "71141-0003", - "Content": "Rechnungsergebnisse des ?ffentlichen Gesamthaushalts\n(Finanzierungssaldo, Besondere Finanzierungsvorg?nge):\nDeutschland, Jahre, K?rperschaftsgruppen", - "Time": "1992 - 2011" - }, - { - "Code": "71141-0004", - "Content": "Rechnungsergebnisse des ?ffentlichen Gesamthaushalts\n(Nettoausgaben, Personalausgaben, Bauma?nahmen):\nDeutschland, Jahre, K?rperschaftsgruppen, Aufgabenbereiche", - "Time": "1992 - 2011" - }, - { - "Code": "71141-0005", - "Content": "Investitionsausgaben der ?ffentlichen Haushalte:\nDeutschland, Jahre, K?rperschaftsgruppen, Art der\nInvestitionsausgaben", - "Time": "1984 - 2011" - }, - { - "Code": "71141-0006", - "Content": "Investitionsausgaben der ?ffentlichen Haushalte:\nBundesl?nder, Jahre, K?rperschaftsgruppen, Art der\nInvestitionsausgaben", - "Time": "1984 - 2011" - } - ], - "Copyright": "? Statistisches Bundesamt (Destatis), 2023" -} diff --git a/tests/testthat/catalogue6/api/catalogue/tables-d53922.json b/tests/testthat/catalogue6/api/catalogue/tables-d53922.json deleted file mode 100644 index 919e6c6..0000000 --- a/tests/testthat/catalogue6/api/catalogue/tables-d53922.json +++ /dev/null @@ -1,54 +0,0 @@ -{ - "Ident": { - "Service": "catalogue", - "Method": "tables" - }, - "Status": { - "Code": 0, - "Content": "erfolgreich", - "Type": "Information" - }, - "Parameter": { - "username": "********************", - "password": "********************", - "selection": "711*", - "area": "oeffentlich", - "searchcriterion": "Code", - "sortcriterion": "Code", - "pagelength": "100", - "language": "de" - }, - "List": [ - { - "Code": "71141-0001", - "Content": "Rechnungsergebnisse des ?ffentlichen Gesamthaushalts\n(Ausgaben): Deutschland, Jahre, K?rperschaftsgruppen,\nAusgabearten", - "Time": "1992 - 2011" - }, - { - "Code": "71141-0002", - "Content": "Rechnungsergebnisse des ?ffentlichen Gesamthaushalts\n(Einnahmen): Deutschland, Jahre, K?rperschaftsgruppen,\nEinnahmearten", - "Time": "1992 - 2011" - }, - { - "Code": "71141-0003", - "Content": "Rechnungsergebnisse des ?ffentlichen Gesamthaushalts\n(Finanzierungssaldo, Besondere Finanzierungsvorg?nge):\nDeutschland, Jahre, K?rperschaftsgruppen", - "Time": "1992 - 2011" - }, - { - "Code": "71141-0004", - "Content": "Rechnungsergebnisse des ?ffentlichen Gesamthaushalts\n(Nettoausgaben, Personalausgaben, Bauma?nahmen):\nDeutschland, Jahre, K?rperschaftsgruppen, Aufgabenbereiche", - "Time": "1992 - 2011" - }, - { - "Code": "71141-0005", - "Content": "Investitionsausgaben der ?ffentlichen Haushalte:\nDeutschland, Jahre, K?rperschaftsgruppen, Art der\nInvestitionsausgaben", - "Time": "1984 - 2011" - }, - { - "Code": "71141-0006", - "Content": "Investitionsausgaben der ?ffentlichen Haushalte:\nBundesl?nder, Jahre, K?rperschaftsgruppen, Art der\nInvestitionsausgaben", - "Time": "1984 - 2011" - } - ], - "Copyright": "? Statistisches Bundesamt (Destatis), 2023" -} diff --git a/tests/testthat/cube1/api/data/cubefile-f31506.csv b/tests/testthat/cube1/api/data/cubefile-f31506.csv deleted file mode 100644 index 142e691..0000000 --- a/tests/testthat/cube1/api/data/cubefile-f31506.csv +++ /dev/null @@ -1,2494 +0,0 @@ -* Der Benutzer DE5256891X der Benutzergruppe DE0089 hat am 08.05.2023 um 18:00:36 diesen Export angestossen. -K;DQ;FACH-SCHL;GHH-ART;GHM-WERTE-JN;GENESIS-VBD;REGIOSTAT;EU-VBD;"mit Werten" -D;47414BJ002;;N;N;N;N -K;DQ-ERH;FACH-SCHL -D;47414 -K;DQA;NAME;RHF-BSR;RHF-ACHSE -D;DINSG;1;1 -D;WZ08N7;2;2 -D;WERTE4;3;3 -K;DQZ;NAME;ZI-RHF-BSR;ZI-RHF-ACHSE -D;JAHR;4;4 -K;DQI;NAME;ME-NAME;DST;TYP;NKM-STELLEN;GHH-ART;GHM-WERTE-JN -D;UMS103;2015=100;FEST;PROZENT;1;;N -K;QEI;FACH-SCHL;FACH-SCHL;FACH-SCHL;ZI-WERT;WERT;QUALITAET;GESPERRT;WERT-VERFAELSCHT -D;DG;WZ08-49-01;NOMINAL;2015;100.0;e;;0.0 -D;DG;WZ08-49-01;NOMINAL;2016;99.3;e;;0.0 -D;DG;WZ08-49-01;NOMINAL;2017;105.7;e;;0.0 -D;DG;WZ08-49-01;NOMINAL;2018;111.6;e;;0.0 -D;DG;WZ08-49-01;NOMINAL;2019;115.6;e;;0.0 -D;DG;WZ08-49-01;NOMINAL;2020;96.0;e;;0.0 -D;DG;WZ08-49-01;NOMINAL;2021;119.5;p;;0.0 -D;DG;WZ08-49-01;NOMINAL;2022;148.5;p;;0.0 -D;DG;WZ08-49-01;REAL;2015;100.0;e;;0.0 -D;DG;WZ08-49-01;REAL;2016;102.0;e;;0.0 -D;DG;WZ08-49-01;REAL;2017;103.7;e;;0.0 -D;DG;WZ08-49-01;REAL;2018;109.0;e;;0.0 -D;DG;WZ08-49-01;REAL;2019;114.5;e;;0.0 -D;DG;WZ08-49-01;REAL;2020;96.4;e;;0.0 -D;DG;WZ08-49-01;REAL;2021;99.0;p;;0.0 -D;DG;WZ08-49-01;REAL;2022;113.3;p;;0.0 -D;DG;WZ08-49-02;NOMINAL;2015;100.0;e;;0.0 -D;DG;WZ08-49-02;NOMINAL;2016;98.1;e;;0.0 -D;DG;WZ08-49-02;NOMINAL;2017;103.1;e;;0.0 -D;DG;WZ08-49-02;NOMINAL;2018;105.5;e;;0.0 -D;DG;WZ08-49-02;NOMINAL;2019;108.2;e;;0.0 -D;DG;WZ08-49-02;NOMINAL;2020;68.8;e;;0.0 -D;DG;WZ08-49-02;NOMINAL;2021;78.2;p;;0.0 -D;DG;WZ08-49-02;NOMINAL;2022;109.2;p;;0.0 -D;DG;WZ08-49-02;REAL;2015;100.0;e;;0.0 -D;DG;WZ08-49-02;REAL;2016;99.8;e;;0.0 -D;DG;WZ08-49-02;REAL;2017;102.1;e;;0.0 -D;DG;WZ08-49-02;REAL;2018;104.1;e;;0.0 -D;DG;WZ08-49-02;REAL;2019;107.2;e;;0.0 -D;DG;WZ08-49-02;REAL;2020;76.1;e;;0.0 -D;DG;WZ08-49-02;REAL;2021;83.2;p;;0.0 -D;DG;WZ08-49-02;REAL;2022;110.8;p;;0.0 -D;DG;WZ08-49-03;NOMINAL;2015;100.0;e;;0.0 -D;DG;WZ08-49-03;NOMINAL;2016;100.4;e;;0.0 -D;DG;WZ08-49-03;NOMINAL;2017;108.5;e;;0.0 -D;DG;WZ08-49-03;NOMINAL;2018;116.5;e;;0.0 -D;DG;WZ08-49-03;NOMINAL;2019;120.6;e;;0.0 -D;DG;WZ08-49-03;NOMINAL;2020;115.0;e;;0.0 -D;DG;WZ08-49-03;NOMINAL;2021;150.7;p;;0.0 -D;DG;WZ08-49-03;NOMINAL;2022;178.5;p;;0.0 -D;DG;WZ08-49-03;REAL;2015;100.0;e;;0.0 -D;DG;WZ08-49-03;REAL;2016;104.0;e;;0.0 -D;DG;WZ08-49-03;REAL;2017;105.6;e;;0.0 -D;DG;WZ08-49-03;REAL;2018;113.3;e;;0.0 -D;DG;WZ08-49-03;REAL;2019;120.0;e;;0.0 -D;DG;WZ08-49-03;REAL;2020;111.0;e;;0.0 -D;DG;WZ08-49-03;REAL;2021;111.0;p;;0.0 -D;DG;WZ08-49-03;REAL;2022;116.3;p;;0.0 -D;DG;WZ08-49-04;NOMINAL;2015;100.0;e;;0.0 -D;DG;WZ08-49-04;NOMINAL;2016;103.5;e;;0.0 -D;DG;WZ08-49-04;NOMINAL;2017;107.9;e;;0.0 -D;DG;WZ08-49-04;NOMINAL;2018;114.3;e;;0.0 -D;DG;WZ08-49-04;NOMINAL;2019;117.8;e;;0.0 -D;DG;WZ08-49-04;NOMINAL;2020;94.0;e;;0.0 -D;DG;WZ08-49-04;NOMINAL;2021;102.3;p;;0.0 -D;DG;WZ08-49-04;NOMINAL;2022;129.4;p;;0.0 -D;DG;WZ08-49-04;REAL;2015;100.0;e;;0.0 -D;DG;WZ08-49-04;REAL;2016;103.5;e;;0.0 -D;DG;WZ08-49-04;REAL;2017;106.6;e;;0.0 -D;DG;WZ08-49-04;REAL;2018;111.2;e;;0.0 -D;DG;WZ08-49-04;REAL;2019;113.4;e;;0.0 -D;DG;WZ08-49-04;REAL;2020;94.9;e;;0.0 -D;DG;WZ08-49-04;REAL;2021;103.6;p;;0.0 -D;DG;WZ08-49-04;REAL;2022;133.3;p;;0.0 -D;DG;WZ08-49-05;NOMINAL;2015;100.0;e;;0.0 -D;DG;WZ08-49-05;NOMINAL;2016;93.8;e;;0.0 -D;DG;WZ08-49-05;NOMINAL;2017;106.0;e;;0.0 -D;DG;WZ08-49-05;NOMINAL;2018;116.6;e;;0.0 -D;DG;WZ08-49-05;NOMINAL;2019;122.2;e;;0.0 -D;DG;WZ08-49-05;NOMINAL;2020;109.7;e;;0.0 -D;DG;WZ08-49-05;NOMINAL;2021;173.6;p;;0.0 -D;DG;WZ08-49-05;NOMINAL;2022;211.8;p;;0.0 -D;DG;WZ08-49-05;REAL;2015;100.0;e;;0.0 -D;DG;WZ08-49-05;REAL;2016;101.6;e;;0.0 -D;DG;WZ08-49-05;REAL;2017;98.6;e;;0.0 -D;DG;WZ08-49-05;REAL;2018;111.7;e;;0.0 -D;DG;WZ08-49-05;REAL;2019;128.4;e;;0.0 -D;DG;WZ08-49-05;REAL;2020;109.8;e;;0.0 -D;DG;WZ08-49-05;REAL;2021;93.7;p;;0.0 -D;DG;WZ08-49-05;REAL;2022;104.3;p;;0.0 -D;DG;WZ08-49-06;NOMINAL;2015;100.0;e;;0.0 -D;DG;WZ08-49-06;NOMINAL;2016;104.8;e;;0.0 -D;DG;WZ08-49-06;NOMINAL;2017;110.2;e;;0.0 -D;DG;WZ08-49-06;NOMINAL;2018;116.5;e;;0.0 -D;DG;WZ08-49-06;NOMINAL;2019;119.5;e;;0.0 -D;DG;WZ08-49-06;NOMINAL;2020;118.6;e;;0.0 -D;DG;WZ08-49-06;NOMINAL;2021;135.0;p;;0.0 -D;DG;WZ08-49-06;NOMINAL;2022;155.9;p;;0.0 -D;DG;WZ08-49-06;REAL;2015;100.0;e;;0.0 -D;DG;WZ08-49-06;REAL;2016;105.7;e;;0.0 -D;DG;WZ08-49-06;REAL;2017;110.4;e;;0.0 -D;DG;WZ08-49-06;REAL;2018;114.5;e;;0.0 -D;DG;WZ08-49-06;REAL;2019;114.1;e;;0.0 -D;DG;WZ08-49-06;REAL;2020;111.9;e;;0.0 -D;DG;WZ08-49-06;REAL;2021;123.1;p;;0.0 -D;DG;WZ08-49-06;REAL;2022;124.7;p;;0.0 -D;DG;WZ08-49-07;NOMINAL;2015;100.0;e;;0.0 -D;DG;WZ08-49-07;NOMINAL;2016;100.2;e;;0.0 -D;DG;WZ08-49-07;NOMINAL;2017;108.8;e;;0.0 -D;DG;WZ08-49-07;NOMINAL;2018;117.0;e;;0.0 -D;DG;WZ08-49-07;NOMINAL;2019;121.6;e;;0.0 -D;DG;WZ08-49-07;NOMINAL;2020;116.0;e;;0.0 -D;DG;WZ08-49-07;NOMINAL;2021;154.1;p;;0.0 -D;DG;WZ08-49-07;NOMINAL;2022;184.0;p;;0.0 -D;DG;WZ08-49-07;REAL;2015;100.0;e;;0.0 -D;DG;WZ08-49-07;REAL;2016;104.3;e;;0.0 -D;DG;WZ08-49-07;REAL;2017;105.6;e;;0.0 -D;DG;WZ08-49-07;REAL;2018;113.8;e;;0.0 -D;DG;WZ08-49-07;REAL;2019;121.4;e;;0.0 -D;DG;WZ08-49-07;REAL;2020;112.2;e;;0.0 -D;DG;WZ08-49-07;REAL;2021;111.2;p;;0.0 -D;DG;WZ08-49-07;REAL;2022;116.6;p;;0.0 -D;DG;WZ08-49-08;NOMINAL;2015;100.0;e;;0.0 -D;DG;WZ08-49-08;NOMINAL;2016;102.5;e;;0.0 -D;DG;WZ08-49-08;NOMINAL;2017;105.1;e;;0.0 -D;DG;WZ08-49-08;NOMINAL;2018;109.6;e;;0.0 -D;DG;WZ08-49-08;NOMINAL;2019;114.3;e;;0.0 -D;DG;WZ08-49-08;NOMINAL;2020;105.5;e;;0.0 -D;DG;WZ08-49-08;NOMINAL;2021;112.4;p;;0.0 -D;DG;WZ08-49-08;NOMINAL;2022;128.0;p;;0.0 -D;DG;WZ08-49-08;REAL;2015;100.0;e;;0.0 -D;DG;WZ08-49-08;REAL;2016;103.3;e;;0.0 -D;DG;WZ08-49-08;REAL;2017;104.5;e;;0.0 -D;DG;WZ08-49-08;REAL;2018;106.7;e;;0.0 -D;DG;WZ08-49-08;REAL;2019;109.0;e;;0.0 -D;DG;WZ08-49-08;REAL;2020;106.3;e;;0.0 -D;DG;WZ08-49-08;REAL;2021;112.1;p;;0.0 -D;DG;WZ08-49-08;REAL;2022;118.9;p;;0.0 -D;DG;WZ08-491;NOMINAL;2015;100.0;e;;0.0 -D;DG;WZ08-491;NOMINAL;2016;106.0;e;;0.0 -D;DG;WZ08-491;NOMINAL;2017;110.7;e;;0.0 -D;DG;WZ08-491;NOMINAL;2018;118.6;e;;0.0 -D;DG;WZ08-491;NOMINAL;2019;128.7;e;;0.0 -D;DG;WZ08-491;NOMINAL;2020;78.2;e;;0.0 -D;DG;WZ08-491;NOMINAL;2021;83.0;p;;0.0 -D;DG;WZ08-491;NOMINAL;2022;137.8;p;;0.0 -D;DG;WZ08-491;REAL;2015;100.0;e;;0.0 -D;DG;WZ08-491;REAL;2016;107.0;e;;0.0 -D;DG;WZ08-491;REAL;2017;108.9;e;;0.0 -D;DG;WZ08-491;REAL;2018;114.7;e;;0.0 -D;DG;WZ08-491;REAL;2019;124.4;e;;0.0 -D;DG;WZ08-491;REAL;2020;88.7;e;;0.0 -D;DG;WZ08-491;REAL;2021;95.6;p;;0.0 -D;DG;WZ08-491;REAL;2022;162.5;p;;0.0 -D;DG;WZ08-492;NOMINAL;2015;100.0;e;;0.0 -D;DG;WZ08-492;NOMINAL;2016;101.8;e;;0.0 -D;DG;WZ08-492;NOMINAL;2017;106.0;e;;0.0 -D;DG;WZ08-492;NOMINAL;2018;111.3;e;;0.0 -D;DG;WZ08-492;NOMINAL;2019;110.1;e;;0.0 -D;DG;WZ08-492;NOMINAL;2020;105.0;e;;0.0 -D;DG;WZ08-492;NOMINAL;2021;115.8;p;;0.0 -D;DG;WZ08-492;NOMINAL;2022;123.5;p;;0.0 -D;DG;WZ08-492;REAL;2015;100.0;e;;0.0 -D;DG;WZ08-492;REAL;2016;101.1;e;;0.0 -D;DG;WZ08-492;REAL;2017;105.0;e;;0.0 -D;DG;WZ08-492;REAL;2018;108.7;e;;0.0 -D;DG;WZ08-492;REAL;2019;105.8;e;;0.0 -D;DG;WZ08-492;REAL;2020;99.2;e;;0.0 -D;DG;WZ08-492;REAL;2021;109.1;p;;0.0 -D;DG;WZ08-492;REAL;2022;112.9;p;;0.0 -D;DG;WZ08-4931;NOMINAL;2015;100.0;e;;0.0 -D;DG;WZ08-4931;NOMINAL;2016;102.5;e;;0.0 -D;DG;WZ08-4931;NOMINAL;2017;102.6;e;;0.0 -D;DG;WZ08-4931;NOMINAL;2018;105.1;e;;0.0 -D;DG;WZ08-4931;NOMINAL;2019;107.8;e;;0.0 -D;DG;WZ08-4931;NOMINAL;2020;97.3;e;;0.0 -D;DG;WZ08-4931;NOMINAL;2021;104.0;p;;0.0 -D;DG;WZ08-4931;NOMINAL;2022;114.3;p;;0.0 -D;DG;WZ08-4932;NOMINAL;2015;100.0;e;;0.0 -D;DG;WZ08-4932;NOMINAL;2016;103.8;e;;0.0 -D;DG;WZ08-4932;NOMINAL;2017;109.9;e;;0.0 -D;DG;WZ08-4932;NOMINAL;2018;113.7;e;;0.0 -D;DG;WZ08-4932;NOMINAL;2019;115.5;e;;0.0 -D;DG;WZ08-4932;NOMINAL;2020;84.0;e;;0.0 -D;DG;WZ08-4932;NOMINAL;2021;86.6;p;;0.0 -D;DG;WZ08-4932;NOMINAL;2022;109.4;p;;0.0 -D;DG;WZ08-4939;NOMINAL;2015;100.0;e;;0.0 -D;DG;WZ08-4939;NOMINAL;2016;94.9;e;;0.0 -D;DG;WZ08-4939;NOMINAL;2017;89.1;e;;0.0 -D;DG;WZ08-4939;NOMINAL;2018;88.0;e;;0.0 -D;DG;WZ08-4939;NOMINAL;2019;92.2;e;;0.0 -D;DG;WZ08-4939;NOMINAL;2020;65.6;e;;0.0 -D;DG;WZ08-4939;NOMINAL;2021;68.9;p;;0.0 -D;DG;WZ08-4939;NOMINAL;2022;87.8;p;;0.0 -D;DG;WZ08-493;NOMINAL;2015;100.0;e;;0.0 -D;DG;WZ08-493;NOMINAL;2016;101.5;e;;0.0 -D;DG;WZ08-493;NOMINAL;2017;101.3;e;;0.0 -D;DG;WZ08-493;NOMINAL;2018;103.4;e;;0.0 -D;DG;WZ08-493;NOMINAL;2019;106.3;e;;0.0 -D;DG;WZ08-493;NOMINAL;2020;90.4;e;;0.0 -D;DG;WZ08-493;NOMINAL;2021;96.0;p;;0.0 -D;DG;WZ08-493;NOMINAL;2022;109.3;p;;0.0 -D;DG;WZ08-493;REAL;2015;100.0;e;;0.0 -D;DG;WZ08-493;REAL;2016;102.4;e;;0.0 -D;DG;WZ08-493;REAL;2017;99.8;e;;0.0 -D;DG;WZ08-493;REAL;2018;100.0;e;;0.0 -D;DG;WZ08-493;REAL;2019;102.7;e;;0.0 -D;DG;WZ08-493;REAL;2020;102.8;e;;0.0 -D;DG;WZ08-493;REAL;2021;110.9;p;;0.0 -D;DG;WZ08-493;REAL;2022;129.0;p;;0.0 -D;DG;WZ08-4941;NOMINAL;2015;100.0;e;;0.0 -D;DG;WZ08-4941;NOMINAL;2016;103.4;e;;0.0 -D;DG;WZ08-4941;NOMINAL;2017;108.5;e;;0.0 -D;DG;WZ08-4941;NOMINAL;2018;114.1;e;;0.0 -D;DG;WZ08-4941;NOMINAL;2019;117.6;e;;0.0 -D;DG;WZ08-4941;NOMINAL;2020;115.2;e;;0.0 -D;DG;WZ08-4941;NOMINAL;2021;124.6;p;;0.0 -D;DG;WZ08-4941;NOMINAL;2022;141.1;p;;0.0 -D;DG;WZ08-4942;NOMINAL;2015;100.0;e;;0.0 -D;DG;WZ08-4942;NOMINAL;2016;102.3;e;;0.0 -D;DG;WZ08-4942;NOMINAL;2017;105.7;e;;0.0 -D;DG;WZ08-4942;NOMINAL;2018;106.8;e;;0.0 -D;DG;WZ08-4942;NOMINAL;2019;111.7;e;;0.0 -D;DG;WZ08-4942;NOMINAL;2020;112.8;e;;0.0 -D;DG;WZ08-4942;NOMINAL;2021;124.8;p;;0.0 -D;DG;WZ08-4942;NOMINAL;2022;140.7;p;;0.0 -D;DG;WZ08-494;NOMINAL;2015;100.0;e;;0.0 -D;DG;WZ08-494;NOMINAL;2016;103.4;e;;0.0 -D;DG;WZ08-494;NOMINAL;2017;108.4;e;;0.0 -D;DG;WZ08-494;NOMINAL;2018;113.9;e;;0.0 -D;DG;WZ08-494;NOMINAL;2019;117.5;e;;0.0 -D;DG;WZ08-494;NOMINAL;2020;115.1;e;;0.0 -D;DG;WZ08-494;NOMINAL;2021;124.6;p;;0.0 -D;DG;WZ08-494;NOMINAL;2022;141.1;p;;0.0 -D;DG;WZ08-494;REAL;2015;100.0;e;;0.0 -D;DG;WZ08-494;REAL;2016;104.1;e;;0.0 -D;DG;WZ08-494;REAL;2017;108.5;e;;0.0 -D;DG;WZ08-494;REAL;2018;111.3;e;;0.0 -D;DG;WZ08-494;REAL;2019;111.1;e;;0.0 -D;DG;WZ08-494;REAL;2020;108.5;e;;0.0 -D;DG;WZ08-494;REAL;2021;114.3;p;;0.0 -D;DG;WZ08-494;REAL;2022;113.2;p;;0.0 -D;DG;WZ08-495;NOMINAL;2015;100.0;e;;0.0 -D;DG;WZ08-495;NOMINAL;2016;101.2;e;;0.0 -D;DG;WZ08-495;NOMINAL;2017;97.8;e;;0.0 -D;DG;WZ08-495;NOMINAL;2018;109.7;e;;0.0 -D;DG;WZ08-495;NOMINAL;2019;141.8;e;;0.0 -D;DG;WZ08-495;NOMINAL;2020;116.0;e;;0.0 -D;DG;WZ08-495;NOMINAL;2021;107.0;p;;0.0 -D;DG;WZ08-495;NOMINAL;2022;129.7;p;;0.0 -D;DG;WZ08-495;REAL;2015;100.0;e;;0.0 -D;DG;WZ08-495;REAL;2016;101.9;e;;0.0 -D;DG;WZ08-495;REAL;2017;97.9;e;;0.0 -D;DG;WZ08-495;REAL;2018;107.2;e;;0.0 -D;DG;WZ08-495;REAL;2019;134.2;e;;0.0 -D;DG;WZ08-495;REAL;2020;109.3;e;;0.0 -D;DG;WZ08-495;REAL;2021;98.2;p;;0.0 -D;DG;WZ08-495;REAL;2022;104.0;p;;0.0 -D;DG;WZ08-49;NOMINAL;2015;100.0;e;;0.0 -D;DG;WZ08-49;NOMINAL;2016;102.7;e;;0.0 -D;DG;WZ08-49;NOMINAL;2017;105.5;e;;0.0 -D;DG;WZ08-49;NOMINAL;2018;110.2;e;;0.0 -D;DG;WZ08-49;NOMINAL;2019;114.8;e;;0.0 -D;DG;WZ08-49;NOMINAL;2020;103.9;e;;0.0 -D;DG;WZ08-49;NOMINAL;2021;111.1;p;;0.0 -D;DG;WZ08-49;NOMINAL;2022;128.2;p;;0.0 -D;DG;WZ08-49;REAL;2015;100.0;e;;0.0 -D;DG;WZ08-49;REAL;2016;103.4;e;;0.0 -D;DG;WZ08-49;REAL;2017;104.8;e;;0.0 -D;DG;WZ08-49;REAL;2018;107.3;e;;0.0 -D;DG;WZ08-49;REAL;2019;109.6;e;;0.0 -D;DG;WZ08-49;REAL;2020;104.8;e;;0.0 -D;DG;WZ08-49;REAL;2021;111.0;p;;0.0 -D;DG;WZ08-49;REAL;2022;120.8;p;;0.0 -D;DG;WZ08-50-01;NOMINAL;2015;100.0;e;;0.0 -D;DG;WZ08-50-01;NOMINAL;2016;89.5;e;;0.0 -D;DG;WZ08-50-01;NOMINAL;2017;102.8;e;;0.0 -D;DG;WZ08-50-01;NOMINAL;2018;113.4;e;;0.0 -D;DG;WZ08-50-01;NOMINAL;2019;120.0;e;;0.0 -D;DG;WZ08-50-01;NOMINAL;2020;102.1;e;;0.0 -D;DG;WZ08-50-01;NOMINAL;2021;171.5;p;;0.0 -D;DG;WZ08-50-01;NOMINAL;2022;223.1;p;;0.0 -D;DG;WZ08-50-01;REAL;2015;100.0;e;;0.0 -D;DG;WZ08-50-01;REAL;2016;98.3;e;;0.0 -D;DG;WZ08-50-01;REAL;2017;94.2;e;;0.0 -D;DG;WZ08-50-01;REAL;2018;107.9;e;;0.0 -D;DG;WZ08-50-01;REAL;2019;127.5;e;;0.0 -D;DG;WZ08-50-01;REAL;2020;102.9;e;;0.0 -D;DG;WZ08-50-01;REAL;2021;82.8;p;;0.0 -D;DG;WZ08-50-01;REAL;2022;99.7;p;;0.0 -D;DG;WZ08-50-02;NOMINAL;2015;100.0;e;;0.0 -D;DG;WZ08-50-02;NOMINAL;2016;76.3;e;;0.0 -D;DG;WZ08-50-02;NOMINAL;2017;86.2;e;;0.0 -D;DG;WZ08-50-02;NOMINAL;2018;90.6;e;;0.0 -D;DG;WZ08-50-02;NOMINAL;2019;106.0;e;;0.0 -D;DG;WZ08-50-02;NOMINAL;2020;51.6;e;;0.0 -D;DG;WZ08-50-02;NOMINAL;2021;80.8;p;;0.0 -D;DG;WZ08-50-02;NOMINAL;2022;183.3;p;;0.0 -D;DG;WZ08-50-02;REAL;2015;100.0;e;;0.0 -D;DG;WZ08-50-02;REAL;2016;81.6;e;;0.0 -D;DG;WZ08-50-02;REAL;2017;79.5;e;;0.0 -D;DG;WZ08-50-02;REAL;2018;85.9;e;;0.0 -D;DG;WZ08-50-02;REAL;2019;109.0;e;;0.0 -D;DG;WZ08-50-02;REAL;2020;50.4;e;;0.0 -D;DG;WZ08-50-02;REAL;2021;39.2;p;;0.0 -D;DG;WZ08-50-02;REAL;2022;90.0;p;;0.0 -D;DG;WZ08-501;NOMINAL;2015;100.0;e;;0.0 -D;DG;WZ08-501;NOMINAL;2016;71.5;e;;0.0 -D;DG;WZ08-501;NOMINAL;2017;80.0;e;;0.0 -D;DG;WZ08-501;NOMINAL;2018;86.7;e;;0.0 -D;DG;WZ08-501;NOMINAL;2019;106.2;e;;0.0 -D;DG;WZ08-501;NOMINAL;2020;50.6;e;;0.0 -D;DG;WZ08-501;NOMINAL;2021;82.1;p;;0.0 -D;DG;WZ08-501;NOMINAL;2022;191.6;p;;0.0 -D;DG;WZ08-501;REAL;2015;100.0;e;;0.0 -D;DG;WZ08-501;REAL;2016;78.5;e;;0.0 -D;DG;WZ08-501;REAL;2017;73.5;e;;0.0 -D;DG;WZ08-501;REAL;2018;82.7;e;;0.0 -D;DG;WZ08-501;REAL;2019;111.4;e;;0.0 -D;DG;WZ08-501;REAL;2020;50.5;e;;0.0 -D;DG;WZ08-501;REAL;2021;35.4;p;;0.0 -D;DG;WZ08-501;REAL;2022;87.9;p;;0.0 -D;DG;WZ08-502;NOMINAL;2015;100.0;e;;0.0 -D;DG;WZ08-502;NOMINAL;2016;91.6;e;;0.0 -D;DG;WZ08-502;NOMINAL;2017;105.9;e;;0.0 -D;DG;WZ08-502;NOMINAL;2018;118.1;e;;0.0 -D;DG;WZ08-502;NOMINAL;2019;125.7;e;;0.0 -D;DG;WZ08-502;NOMINAL;2020;111.1;e;;0.0 -D;DG;WZ08-502;NOMINAL;2021;190.2;p;;0.0 -D;DG;WZ08-502;NOMINAL;2022;237.0;p;;0.0 -D;DG;WZ08-502;REAL;2015;100.0;e;;0.0 -D;DG;WZ08-502;REAL;2016;101.7;e;;0.0 -D;DG;WZ08-502;REAL;2017;96.8;e;;0.0 -D;DG;WZ08-502;REAL;2018;112.5;e;;0.0 -D;DG;WZ08-502;REAL;2019;134.6;e;;0.0 -D;DG;WZ08-502;REAL;2020;112.7;e;;0.0 -D;DG;WZ08-502;REAL;2021;89.5;p;;0.0 -D;DG;WZ08-502;REAL;2022;101.9;p;;0.0 -D;DG;WZ08-503;NOMINAL;2015;100.0;e;;0.0 -D;DG;WZ08-503;NOMINAL;2016;104.6;e;;0.0 -D;DG;WZ08-503;NOMINAL;2017;123.3;e;;0.0 -D;DG;WZ08-503;NOMINAL;2018;114.2;e;;0.0 -D;DG;WZ08-503;NOMINAL;2019;104.9;e;;0.0 -D;DG;WZ08-503;NOMINAL;2020;57.4;e;;0.0 -D;DG;WZ08-503;NOMINAL;2021;73.0;p;;0.0 -D;DG;WZ08-503;NOMINAL;2022;133.9;p;;0.0 -D;DG;WZ08-503;REAL;2015;100.0;e;;0.0 -D;DG;WZ08-503;REAL;2016;100.5;e;;0.0 -D;DG;WZ08-503;REAL;2017;115.6;e;;0.0 -D;DG;WZ08-503;REAL;2018;105.1;e;;0.0 -D;DG;WZ08-503;REAL;2019;94.3;e;;0.0 -D;DG;WZ08-503;REAL;2020;49.8;e;;0.0 -D;DG;WZ08-503;REAL;2021;61.9;p;;0.0 -D;DG;WZ08-503;REAL;2022;102.7;p;;0.0 -D;DG;WZ08-504;NOMINAL;2015;100.0;e;;0.0 -D;DG;WZ08-504;NOMINAL;2016;83.7;e;;0.0 -D;DG;WZ08-504;NOMINAL;2017;87.9;e;;0.0 -D;DG;WZ08-504;NOMINAL;2018;89.9;e;;0.0 -D;DG;WZ08-504;NOMINAL;2019;69.9;e;;0.0 -D;DG;WZ08-504;NOMINAL;2020;66.9;e;;0.0 -D;DG;WZ08-504;NOMINAL;2021;76.5;p;;0.0 -D;DG;WZ08-504;NOMINAL;2022;109.4;p;;0.0 -D;DG;WZ08-504;REAL;2015;100.0;e;;0.0 -D;DG;WZ08-504;REAL;2016;81.6;e;;0.0 -D;DG;WZ08-504;REAL;2017;83.6;e;;0.0 -D;DG;WZ08-504;REAL;2018;83.7;e;;0.0 -D;DG;WZ08-504;REAL;2019;63.7;e;;0.0 -D;DG;WZ08-504;REAL;2020;58.8;e;;0.0 -D;DG;WZ08-504;REAL;2021;65.8;p;;0.0 -D;DG;WZ08-504;REAL;2022;86.0;p;;0.0 -D;DG;WZ08-50;NOMINAL;2015;100.0;e;;0.0 -D;DG;WZ08-50;NOMINAL;2016;89.5;e;;0.0 -D;DG;WZ08-50;NOMINAL;2017;102.8;e;;0.0 -D;DG;WZ08-50;NOMINAL;2018;113.4;e;;0.0 -D;DG;WZ08-50;NOMINAL;2019;120.0;e;;0.0 -D;DG;WZ08-50;NOMINAL;2020;102.1;e;;0.0 -D;DG;WZ08-50;NOMINAL;2021;171.5;p;;0.0 -D;DG;WZ08-50;NOMINAL;2022;223.1;p;;0.0 -D;DG;WZ08-50;REAL;2015;100.0;e;;0.0 -D;DG;WZ08-50;REAL;2016;98.3;e;;0.0 -D;DG;WZ08-50;REAL;2017;94.2;e;;0.0 -D;DG;WZ08-50;REAL;2018;107.9;e;;0.0 -D;DG;WZ08-50;REAL;2019;127.5;e;;0.0 -D;DG;WZ08-50;REAL;2020;102.9;e;;0.0 -D;DG;WZ08-50;REAL;2021;82.8;p;;0.0 -D;DG;WZ08-50;REAL;2022;99.7;p;;0.0 -D;DG;WZ08-51-01;NOMINAL;2015;100.0;e;;0.0 -D;DG;WZ08-51-01;NOMINAL;2016;98.7;e;;0.0 -D;DG;WZ08-51-01;NOMINAL;2017;110.9;e;;0.0 -D;DG;WZ08-51-01;NOMINAL;2018;114.6;e;;0.0 -D;DG;WZ08-51-01;NOMINAL;2019;112.5;e;;0.0 -D;DG;WZ08-51-01;NOMINAL;2020;54.8;e;;0.0 -D;DG;WZ08-51-01;NOMINAL;2021;82.6;p;;0.0 -D;DG;WZ08-51-01;NOMINAL;2022;129.8;p;;0.0 -D;DG;WZ08-51-01;REAL;2015;100.0;e;;0.0 -D;DG;WZ08-51-01;REAL;2016;101.3;e;;0.0 -D;DG;WZ08-51-01;REAL;2017;112.5;e;;0.0 -D;DG;WZ08-51-01;REAL;2018;118.1;e;;0.0 -D;DG;WZ08-51-01;REAL;2019;116.6;e;;0.0 -D;DG;WZ08-51-01;REAL;2020;52.7;e;;0.0 -D;DG;WZ08-51-01;REAL;2021;72.4;p;;0.0 -D;DG;WZ08-51-01;REAL;2022;101.8;p;;0.0 -D;DG;WZ08-511;NOMINAL;2015;100.0;e;;0.0 -D;DG;WZ08-511;NOMINAL;2016;94.0;e;;0.0 -D;DG;WZ08-511;NOMINAL;2017;106.7;e;;0.0 -D;DG;WZ08-511;NOMINAL;2018;107.9;e;;0.0 -D;DG;WZ08-511;NOMINAL;2019;106.2;e;;0.0 -D;DG;WZ08-511;NOMINAL;2020;32.3;e;;0.0 -D;DG;WZ08-511;NOMINAL;2021;45.9;p;;0.0 -D;DG;WZ08-511;NOMINAL;2022;88.3;p;;0.0 -D;DG;WZ08-511;REAL;2015;100.0;e;;0.0 -D;DG;WZ08-511;REAL;2016;96.5;e;;0.0 -D;DG;WZ08-511;REAL;2017;108.2;e;;0.0 -D;DG;WZ08-511;REAL;2018;111.2;e;;0.0 -D;DG;WZ08-511;REAL;2019;109.9;e;;0.0 -D;DG;WZ08-511;REAL;2020;31.5;e;;0.0 -D;DG;WZ08-511;REAL;2021;40.2;p;;0.0 -D;DG;WZ08-511;REAL;2022;69.2;p;;0.0 -D;DG;WZ08-5121;NOMINAL;2015;100.0;e;;0.0 -D;DG;WZ08-5121;NOMINAL;2016;119.8;e;;0.0 -D;DG;WZ08-5121;NOMINAL;2017;130.1;e;;0.0 -D;DG;WZ08-5121;NOMINAL;2018;145.0;e;;0.0 -D;DG;WZ08-5121;NOMINAL;2019;141.5;e;;0.0 -D;DG;WZ08-5121;NOMINAL;2020;156.8;e;;0.0 -D;DG;WZ08-5121;NOMINAL;2021;249.8;p;;0.0 -D;DG;WZ08-5121;NOMINAL;2022;318.6;p;;0.0 -D;DG;WZ08-512;NOMINAL;2015;100.0;e;;0.0 -D;DG;WZ08-512;NOMINAL;2016;119.9;e;;0.0 -D;DG;WZ08-512;NOMINAL;2017;130.1;e;;0.0 -D;DG;WZ08-512;NOMINAL;2018;145.0;e;;0.0 -D;DG;WZ08-512;NOMINAL;2019;141.5;e;;0.0 -D;DG;WZ08-512;NOMINAL;2020;156.8;e;;0.0 -D;DG;WZ08-512;NOMINAL;2021;249.8;p;;0.0 -D;DG;WZ08-512;NOMINAL;2022;318.6;p;;0.0 -D;DG;WZ08-512;REAL;2015;100.0;e;;0.0 -D;DG;WZ08-512;REAL;2016;123.2;e;;0.0 -D;DG;WZ08-512;REAL;2017;132.1;e;;0.0 -D;DG;WZ08-512;REAL;2018;149.6;e;;0.0 -D;DG;WZ08-512;REAL;2019;146.8;e;;0.0 -D;DG;WZ08-512;REAL;2020;148.9;e;;0.0 -D;DG;WZ08-512;REAL;2021;219.3;p;;0.0 -D;DG;WZ08-512;REAL;2022;250.4;p;;0.0 -D;DG;WZ08-51;NOMINAL;2015;100.0;e;;0.0 -D;DG;WZ08-51;NOMINAL;2016;98.7;e;;0.0 -D;DG;WZ08-51;NOMINAL;2017;110.9;e;;0.0 -D;DG;WZ08-51;NOMINAL;2018;114.6;e;;0.0 -D;DG;WZ08-51;NOMINAL;2019;112.5;e;;0.0 -D;DG;WZ08-51;NOMINAL;2020;54.8;e;;0.0 -D;DG;WZ08-51;NOMINAL;2021;82.6;p;;0.0 -D;DG;WZ08-51;NOMINAL;2022;129.8;p;;0.0 -D;DG;WZ08-51;REAL;2015;100.0;e;;0.0 -D;DG;WZ08-51;REAL;2016;101.3;e;;0.0 -D;DG;WZ08-51;REAL;2017;112.5;e;;0.0 -D;DG;WZ08-51;REAL;2018;118.1;e;;0.0 -D;DG;WZ08-51;REAL;2019;116.6;e;;0.0 -D;DG;WZ08-51;REAL;2020;52.7;e;;0.0 -D;DG;WZ08-51;REAL;2021;72.4;p;;0.0 -D;DG;WZ08-51;REAL;2022;101.8;p;;0.0 -D;DG;WZ08-521;NOMINAL;2015;100.0;e;;0.0 -D;DG;WZ08-521;NOMINAL;2016;105.9;e;;0.0 -D;DG;WZ08-521;NOMINAL;2017;136.6;e;;0.0 -D;DG;WZ08-521;NOMINAL;2018;133.4;e;;0.0 -D;DG;WZ08-521;NOMINAL;2019;143.1;e;;0.0 -D;DG;WZ08-521;NOMINAL;2020;143.5;e;;0.0 -D;DG;WZ08-521;NOMINAL;2021;168.4;p;;0.0 -D;DG;WZ08-521;NOMINAL;2022;174.5;p;;0.0 -D;DG;WZ08-521;REAL;2015;100.0;e;;0.0 -D;DG;WZ08-521;REAL;2016;105.3;e;;0.0 -D;DG;WZ08-521;REAL;2017;135.4;e;;0.0 -D;DG;WZ08-521;REAL;2018;130.4;e;;0.0 -D;DG;WZ08-521;REAL;2019;136.3;e;;0.0 -D;DG;WZ08-521;REAL;2020;134.7;e;;0.0 -D;DG;WZ08-521;REAL;2021;154.8;p;;0.0 -D;DG;WZ08-521;REAL;2022;148.7;p;;0.0 -D;DG;WZ08-5221;NOMINAL;2015;100.0;e;;0.0 -D;DG;WZ08-5221;NOMINAL;2016;103.3;e;;0.0 -D;DG;WZ08-5221;NOMINAL;2017;106.5;e;;0.0 -D;DG;WZ08-5221;NOMINAL;2018;114.0;e;;0.0 -D;DG;WZ08-5221;NOMINAL;2019;117.9;e;;0.0 -D;DG;WZ08-5221;NOMINAL;2020;113.1;e;;0.0 -D;DG;WZ08-5221;NOMINAL;2021;115.7;p;;0.0 -D;DG;WZ08-5221;NOMINAL;2022;134.3;p;;0.0 -D;DG;WZ08-5222;NOMINAL;2015;100.0;e;;0.0 -D;DG;WZ08-5222;NOMINAL;2016;104.2;e;;0.0 -D;DG;WZ08-5222;NOMINAL;2017;87.9;e;;0.0 -D;DG;WZ08-5222;NOMINAL;2018;87.7;e;;0.0 -D;DG;WZ08-5222;NOMINAL;2019;100.0;e;;0.0 -D;DG;WZ08-5222;NOMINAL;2020;91.2;e;;0.0 -D;DG;WZ08-5222;NOMINAL;2021;81.9;p;;0.0 -D;DG;WZ08-5222;NOMINAL;2022;111.7;p;;0.0 -D;DG;WZ08-5223;NOMINAL;2015;100.0;e;;0.0 -D;DG;WZ08-5223;NOMINAL;2016;101.3;e;;0.0 -D;DG;WZ08-5223;NOMINAL;2017;106.6;e;;0.0 -D;DG;WZ08-5223;NOMINAL;2018;113.6;e;;0.0 -D;DG;WZ08-5223;NOMINAL;2019;113.8;e;;0.0 -D;DG;WZ08-5223;NOMINAL;2020;67.2;e;;0.0 -D;DG;WZ08-5223;NOMINAL;2021;74.8;p;;0.0 -D;DG;WZ08-5223;NOMINAL;2022;98.8;p;;0.0 -D;DG;WZ08-5224;NOMINAL;2015;100.0;e;;0.0 -D;DG;WZ08-5224;NOMINAL;2016;104.1;e;;0.0 -D;DG;WZ08-5224;NOMINAL;2017;102.2;e;;0.0 -D;DG;WZ08-5224;NOMINAL;2018;106.4;e;;0.0 -D;DG;WZ08-5224;NOMINAL;2019;103.9;e;;0.0 -D;DG;WZ08-5224;NOMINAL;2020;100.3;e;;0.0 -D;DG;WZ08-5224;NOMINAL;2021;113.1;p;;0.0 -D;DG;WZ08-5224;NOMINAL;2022;119.3;p;;0.0 -D;DG;WZ08-5229;NOMINAL;2015;100.0;e;;0.0 -D;DG;WZ08-5229;NOMINAL;2016;100.5;e;;0.0 -D;DG;WZ08-5229;NOMINAL;2017;102.2;e;;0.0 -D;DG;WZ08-5229;NOMINAL;2018;104.3;e;;0.0 -D;DG;WZ08-5229;NOMINAL;2019;101.8;e;;0.0 -D;DG;WZ08-5229;NOMINAL;2020;98.0;e;;0.0 -D;DG;WZ08-5229;NOMINAL;2021;122.9;p;;0.0 -D;DG;WZ08-5229;NOMINAL;2022;142.6;p;;0.0 -D;DG;WZ08-522;NOMINAL;2015;100.0;e;;0.0 -D;DG;WZ08-522;NOMINAL;2016;101.1;e;;0.0 -D;DG;WZ08-522;NOMINAL;2017;102.6;e;;0.0 -D;DG;WZ08-522;NOMINAL;2018;105.6;e;;0.0 -D;DG;WZ08-522;NOMINAL;2019;104.4;e;;0.0 -D;DG;WZ08-522;NOMINAL;2020;96.5;e;;0.0 -D;DG;WZ08-522;NOMINAL;2021;116.4;p;;0.0 -D;DG;WZ08-522;NOMINAL;2022;136.1;p;;0.0 -D;DG;WZ08-522;REAL;2015;100.0;e;;0.0 -D;DG;WZ08-522;REAL;2016;103.5;e;;0.0 -D;DG;WZ08-522;REAL;2017;102.1;e;;0.0 -D;DG;WZ08-522;REAL;2018;102.2;e;;0.0 -D;DG;WZ08-522;REAL;2019;98.2;e;;0.0 -D;DG;WZ08-522;REAL;2020;87.6;e;;0.0 -D;DG;WZ08-522;REAL;2021;94.0;p;;0.0 -D;DG;WZ08-522;REAL;2022;98.1;p;;0.0 -D;DG;WZ08-52;NOMINAL;2015;100.0;e;;0.0 -D;DG;WZ08-52;NOMINAL;2016;101.5;e;;0.0 -D;DG;WZ08-52;NOMINAL;2017;105.7;e;;0.0 -D;DG;WZ08-52;NOMINAL;2018;108.2;e;;0.0 -D;DG;WZ08-52;NOMINAL;2019;108.0;e;;0.0 -D;DG;WZ08-52;NOMINAL;2020;100.8;e;;0.0 -D;DG;WZ08-52;NOMINAL;2021;121.1;p;;0.0 -D;DG;WZ08-52;NOMINAL;2022;139.6;p;;0.0 -D;DG;WZ08-52;REAL;2015;100.0;e;;0.0 -D;DG;WZ08-52;REAL;2016;103.7;e;;0.0 -D;DG;WZ08-52;REAL;2017;105.1;e;;0.0 -D;DG;WZ08-52;REAL;2018;104.7;e;;0.0 -D;DG;WZ08-52;REAL;2019;101.7;e;;0.0 -D;DG;WZ08-52;REAL;2020;91.9;e;;0.0 -D;DG;WZ08-52;REAL;2021;99.5;p;;0.0 -D;DG;WZ08-52;REAL;2022;102.7;p;;0.0 -D;DG;WZ08-532;NOMINAL;2015;100.0;e;;0.0 -D;DG;WZ08-532;NOMINAL;2016;108.5;e;;0.0 -D;DG;WZ08-532;NOMINAL;2017;127.9;e;;0.0 -D;DG;WZ08-532;NOMINAL;2018;116.7;e;;0.0 -D;DG;WZ08-532;NOMINAL;2019;123.9;e;;0.0 -D;DG;WZ08-532;NOMINAL;2020;137.0;e;;0.0 -D;DG;WZ08-532;NOMINAL;2021;150.6;p;;0.0 -D;DG;WZ08-532;NOMINAL;2022;152.6;p;;0.0 -D;DG;WZ08-532;REAL;2015;100.0;e;;0.0 -D;DG;WZ08-532;REAL;2016;107.1;e;;0.0 -D;DG;WZ08-532;REAL;2017;124.3;e;;0.0 -D;DG;WZ08-532;REAL;2018;111.8;e;;0.0 -D;DG;WZ08-532;REAL;2019;114.7;e;;0.0 -D;DG;WZ08-532;REAL;2020;123.2;e;;0.0 -D;DG;WZ08-532;REAL;2021;132.1;p;;0.0 -D;DG;WZ08-532;REAL;2022;126.8;p;;0.0 -D;DG;WZ08-53;NOMINAL;2015;100.0;e;;0.0 -D;DG;WZ08-53;NOMINAL;2016;108.5;e;;0.0 -D;DG;WZ08-53;NOMINAL;2017;127.9;e;;0.0 -D;DG;WZ08-53;NOMINAL;2018;116.7;e;;0.0 -D;DG;WZ08-53;NOMINAL;2019;123.9;e;;0.0 -D;DG;WZ08-53;NOMINAL;2020;137.0;e;;0.0 -D;DG;WZ08-53;NOMINAL;2021;150.6;p;;0.0 -D;DG;WZ08-53;NOMINAL;2022;152.6;p;;0.0 -D;DG;WZ08-53;REAL;2015;100.0;e;;0.0 -D;DG;WZ08-53;REAL;2016;107.1;e;;0.0 -D;DG;WZ08-53;REAL;2017;124.3;e;;0.0 -D;DG;WZ08-53;REAL;2018;111.8;e;;0.0 -D;DG;WZ08-53;REAL;2019;114.7;e;;0.0 -D;DG;WZ08-53;REAL;2020;123.2;e;;0.0 -D;DG;WZ08-53;REAL;2021;132.1;p;;0.0 -D;DG;WZ08-53;REAL;2022;126.8;p;;0.0 -D;DG;WZ08-551;NOMINAL;2015;100.0;e;;0.0 -D;DG;WZ08-551;NOMINAL;2016;105.7;e;;0.0 -D;DG;WZ08-551;NOMINAL;2017;109.5;e;;0.0 -D;DG;WZ08-551;NOMINAL;2018;115.9;e;;0.0 -D;DG;WZ08-551;NOMINAL;2019;120.4;e;;0.0 -D;DG;WZ08-551;NOMINAL;2020;65.0;e;;0.0 -D;DG;WZ08-551;NOMINAL;2021;72.8;p;;0.0 -D;DG;WZ08-551;NOMINAL;2022;133.5;p;;0.0 -D;DG;WZ08-551;REAL;2015;100.0;e;;0.0 -D;DG;WZ08-551;REAL;2016;103.7;e;;0.0 -D;DG;WZ08-551;REAL;2017;105.4;e;;0.0 -D;DG;WZ08-551;REAL;2018;109.2;e;;0.0 -D;DG;WZ08-551;REAL;2019;111.2;e;;0.0 -D;DG;WZ08-551;REAL;2020;59.1;e;;0.0 -D;DG;WZ08-551;REAL;2021;65.3;p;;0.0 -D;DG;WZ08-551;REAL;2022;110.5;p;;0.0 -D;DG;WZ08-552;NOMINAL;2015;100.0;e;;0.0 -D;DG;WZ08-552;NOMINAL;2016;105.7;e;;0.0 -D;DG;WZ08-552;NOMINAL;2017;107.0;e;;0.0 -D;DG;WZ08-552;NOMINAL;2018;109.8;e;;0.0 -D;DG;WZ08-552;NOMINAL;2019;114.0;e;;0.0 -D;DG;WZ08-552;NOMINAL;2020;74.9;e;;0.0 -D;DG;WZ08-552;NOMINAL;2021;89.7;p;;0.0 -D;DG;WZ08-552;NOMINAL;2022;147.2;p;;0.0 -D;DG;WZ08-552;REAL;2015;100.0;e;;0.0 -D;DG;WZ08-552;REAL;2016;103.7;e;;0.0 -D;DG;WZ08-552;REAL;2017;102.2;e;;0.0 -D;DG;WZ08-552;REAL;2018;102.4;e;;0.0 -D;DG;WZ08-552;REAL;2019;104.2;e;;0.0 -D;DG;WZ08-552;REAL;2020;65.3;e;;0.0 -D;DG;WZ08-552;REAL;2021;76.3;p;;0.0 -D;DG;WZ08-552;REAL;2022;119.1;p;;0.0 -D;DG;WZ08-553;NOMINAL;2015;100.0;e;;0.0 -D;DG;WZ08-553;NOMINAL;2016;100.9;e;;0.0 -D;DG;WZ08-553;NOMINAL;2017;110.8;e;;0.0 -D;DG;WZ08-553;NOMINAL;2018;120.4;e;;0.0 -D;DG;WZ08-553;NOMINAL;2019;123.1;e;;0.0 -D;DG;WZ08-553;NOMINAL;2020;118.9;e;;0.0 -D;DG;WZ08-553;NOMINAL;2021;125.9;p;;0.0 -D;DG;WZ08-553;NOMINAL;2022;151.6;p;;0.0 -D;DG;WZ08-553;REAL;2015;100.0;e;;0.0 -D;DG;WZ08-553;REAL;2016;98.7;e;;0.0 -D;DG;WZ08-553;REAL;2017;106.8;e;;0.0 -D;DG;WZ08-553;REAL;2018;114.0;e;;0.0 -D;DG;WZ08-553;REAL;2019;114.4;e;;0.0 -D;DG;WZ08-553;REAL;2020;106.2;e;;0.0 -D;DG;WZ08-553;REAL;2021;107.9;p;;0.0 -D;DG;WZ08-553;REAL;2022;123.1;p;;0.0 -D;DG;WZ08-55;NOMINAL;2015;100.0;e;;0.0 -D;DG;WZ08-55;NOMINAL;2016;105.7;e;;0.0 -D;DG;WZ08-55;NOMINAL;2017;109.4;e;;0.0 -D;DG;WZ08-55;NOMINAL;2018;115.7;e;;0.0 -D;DG;WZ08-55;NOMINAL;2019;120.1;e;;0.0 -D;DG;WZ08-55;NOMINAL;2020;66.7;e;;0.0 -D;DG;WZ08-55;NOMINAL;2021;74.9;p;;0.0 -D;DG;WZ08-55;NOMINAL;2022;134.5;p;;0.0 -D;DG;WZ08-55;REAL;2015;100.0;e;;0.0 -D;DG;WZ08-55;REAL;2016;103.8;e;;0.0 -D;DG;WZ08-55;REAL;2017;105.4;e;;0.0 -D;DG;WZ08-55;REAL;2018;109.0;e;;0.0 -D;DG;WZ08-55;REAL;2019;110.8;e;;0.0 -D;DG;WZ08-55;REAL;2020;60.8;e;;0.0 -D;DG;WZ08-55;REAL;2021;66.8;p;;0.0 -D;DG;WZ08-55;REAL;2022;111.2;p;;0.0 -D;DG;WZ08-561-01;NOMINAL;2015;100.0;e;;0.0 -D;DG;WZ08-561-01;NOMINAL;2016;103.1;e;;0.0 -D;DG;WZ08-561-01;NOMINAL;2017;108.7;e;;0.0 -D;DG;WZ08-561-01;NOMINAL;2018;113.8;e;;0.0 -D;DG;WZ08-561-01;NOMINAL;2019;119.4;e;;0.0 -D;DG;WZ08-561-01;NOMINAL;2020;81.3;e;;0.0 -D;DG;WZ08-561-01;NOMINAL;2021;83.6;p;;0.0 -D;DG;WZ08-561-01;NOMINAL;2022;119.5;p;;0.0 -D;DG;WZ08-561-01;REAL;2015;100.0;e;;0.0 -D;DG;WZ08-561-01;REAL;2016;100.6;e;;0.0 -D;DG;WZ08-561-01;REAL;2017;103.9;e;;0.0 -D;DG;WZ08-561-01;REAL;2018;106.4;e;;0.0 -D;DG;WZ08-561-01;REAL;2019;108.5;e;;0.0 -D;DG;WZ08-561-01;REAL;2020;69.9;e;;0.0 -D;DG;WZ08-561-01;REAL;2021;69.7;p;;0.0 -D;DG;WZ08-561-01;REAL;2022;93.4;p;;0.0 -D;DG;WZ08-561;NOMINAL;2015;100.0;e;;0.0 -D;DG;WZ08-561;NOMINAL;2016;103.3;e;;0.0 -D;DG;WZ08-561;NOMINAL;2017;109.0;e;;0.0 -D;DG;WZ08-561;NOMINAL;2018;114.1;e;;0.0 -D;DG;WZ08-561;NOMINAL;2019;120.2;e;;0.0 -D;DG;WZ08-561;NOMINAL;2020;84.4;e;;0.0 -D;DG;WZ08-561;NOMINAL;2021;86.9;p;;0.0 -D;DG;WZ08-561;NOMINAL;2022;122.8;p;;0.0 -D;DG;WZ08-561;REAL;2015;100.0;e;;0.0 -D;DG;WZ08-561;REAL;2016;100.8;e;;0.0 -D;DG;WZ08-561;REAL;2017;104.2;e;;0.0 -D;DG;WZ08-561;REAL;2018;106.7;e;;0.0 -D;DG;WZ08-561;REAL;2019;109.3;e;;0.0 -D;DG;WZ08-561;REAL;2020;72.8;e;;0.0 -D;DG;WZ08-561;REAL;2021;72.7;p;;0.0 -D;DG;WZ08-561;REAL;2022;96.4;p;;0.0 -D;DG;WZ08-562;NOMINAL;2015;100.0;e;;0.0 -D;DG;WZ08-562;NOMINAL;2016;103.5;e;;0.0 -D;DG;WZ08-562;NOMINAL;2017;106.7;e;;0.0 -D;DG;WZ08-562;NOMINAL;2018;111.3;e;;0.0 -D;DG;WZ08-562;NOMINAL;2019;116.3;e;;0.0 -D;DG;WZ08-562;NOMINAL;2020;83.8;e;;0.0 -D;DG;WZ08-562;NOMINAL;2021;84.3;p;;0.0 -D;DG;WZ08-562;NOMINAL;2022;116.4;p;;0.0 -D;DG;WZ08-562;REAL;2015;100.0;e;;0.0 -D;DG;WZ08-562;REAL;2016;101.6;e;;0.0 -D;DG;WZ08-562;REAL;2017;102.5;e;;0.0 -D;DG;WZ08-562;REAL;2018;105.4;e;;0.0 -D;DG;WZ08-562;REAL;2019;107.9;e;;0.0 -D;DG;WZ08-562;REAL;2020;75.6;e;;0.0 -D;DG;WZ08-562;REAL;2021;74.2;p;;0.0 -D;DG;WZ08-562;REAL;2022;95.5;p;;0.0 -D;DG;WZ08-563;NOMINAL;2015;100.0;e;;0.0 -D;DG;WZ08-563;NOMINAL;2016;101.4;e;;0.0 -D;DG;WZ08-563;NOMINAL;2017;106.6;e;;0.0 -D;DG;WZ08-563;NOMINAL;2018;111.6;e;;0.0 -D;DG;WZ08-563;NOMINAL;2019;112.8;e;;0.0 -D;DG;WZ08-563;NOMINAL;2020;57.3;e;;0.0 -D;DG;WZ08-563;NOMINAL;2021;57.3;p;;0.0 -D;DG;WZ08-563;NOMINAL;2022;93.6;p;;0.0 -D;DG;WZ08-563;REAL;2015;100.0;e;;0.0 -D;DG;WZ08-563;REAL;2016;99.3;e;;0.0 -D;DG;WZ08-563;REAL;2017;102.3;e;;0.0 -D;DG;WZ08-563;REAL;2018;104.9;e;;0.0 -D;DG;WZ08-563;REAL;2019;103.4;e;;0.0 -D;DG;WZ08-563;REAL;2020;49.5;e;;0.0 -D;DG;WZ08-563;REAL;2021;46.6;p;;0.0 -D;DG;WZ08-563;REAL;2022;70.0;p;;0.0 -D;DG;WZ08-56;NOMINAL;2015;100.0;e;;0.0 -D;DG;WZ08-56;NOMINAL;2016;103.1;e;;0.0 -D;DG;WZ08-56;NOMINAL;2017;108.3;e;;0.0 -D;DG;WZ08-56;NOMINAL;2018;113.2;e;;0.0 -D;DG;WZ08-56;NOMINAL;2019;118.7;e;;0.0 -D;DG;WZ08-56;NOMINAL;2020;81.9;e;;0.0 -D;DG;WZ08-56;NOMINAL;2021;83.8;p;;0.0 -D;DG;WZ08-56;NOMINAL;2022;118.8;p;;0.0 -D;DG;WZ08-56;REAL;2015;100.0;e;;0.0 -D;DG;WZ08-56;REAL;2016;100.8;e;;0.0 -D;DG;WZ08-56;REAL;2017;103.6;e;;0.0 -D;DG;WZ08-56;REAL;2018;106.2;e;;0.0 -D;DG;WZ08-56;REAL;2019;108.4;e;;0.0 -D;DG;WZ08-56;REAL;2020;71.1;e;;0.0 -D;DG;WZ08-56;REAL;2021;70.7;p;;0.0 -D;DG;WZ08-56;REAL;2022;93.9;p;;0.0 -D;DG;WZ08-58-02;NOMINAL;2015;100.0;e;;0.0 -D;DG;WZ08-58-02;NOMINAL;2016;102.6;e;;0.0 -D;DG;WZ08-58-02;NOMINAL;2017;104.8;e;;0.0 -D;DG;WZ08-58-02;NOMINAL;2018;102.7;e;;0.0 -D;DG;WZ08-58-02;NOMINAL;2019;101.8;e;;0.0 -D;DG;WZ08-58-02;NOMINAL;2020;96.2;e;;0.0 -D;DG;WZ08-58-02;NOMINAL;2021;102.2;p;;0.0 -D;DG;WZ08-58-02;NOMINAL;2022;109.2;p;;0.0 -D;DG;WZ08-58-02;REAL;2015;100.0;e;;0.0 -D;DG;WZ08-58-02;REAL;2016;100.9;e;;0.0 -D;DG;WZ08-58-02;REAL;2017;101.7;e;;0.0 -D;DG;WZ08-58-02;REAL;2018;99.0;e;;0.0 -D;DG;WZ08-58-02;REAL;2019;96.3;e;;0.0 -D;DG;WZ08-58-02;REAL;2020;90.4;e;;0.0 -D;DG;WZ08-58-02;REAL;2021;94.7;p;;0.0 -D;DG;WZ08-58-02;REAL;2022;98.2;p;;0.0 -D;DG;WZ08-58-03;NOMINAL;2015;100.0;e;;0.0 -D;DG;WZ08-58-03;NOMINAL;2016;112.4;e;;0.0 -D;DG;WZ08-58-03;NOMINAL;2017;110.0;e;;0.0 -D;DG;WZ08-58-03;NOMINAL;2018;102.1;e;;0.0 -D;DG;WZ08-58-03;NOMINAL;2019;100.0;e;;0.0 -D;DG;WZ08-58-03;NOMINAL;2020;92.7;e;;0.0 -D;DG;WZ08-58-03;NOMINAL;2021;97.9;p;;0.0 -D;DG;WZ08-58-03;NOMINAL;2022;104.5;p;;0.0 -D;DG;WZ08-58-03;REAL;2015;100.0;e;;0.0 -D;DG;WZ08-58-03;REAL;2016;110.5;e;;0.0 -D;DG;WZ08-58-03;REAL;2017;106.8;e;;0.0 -D;DG;WZ08-58-03;REAL;2018;98.3;e;;0.0 -D;DG;WZ08-58-03;REAL;2019;94.3;e;;0.0 -D;DG;WZ08-58-03;REAL;2020;86.7;e;;0.0 -D;DG;WZ08-58-03;REAL;2021;90.1;p;;0.0 -D;DG;WZ08-58-03;REAL;2022;93.1;p;;0.0 -D;DG;WZ08-58-04;NOMINAL;2015;100.0;e;;0.0 -D;DG;WZ08-58-04;NOMINAL;2016;109.7;e;;0.0 -D;DG;WZ08-58-04;NOMINAL;2017;104.8;e;;0.0 -D;DG;WZ08-58-04;NOMINAL;2018;114.0;e;;0.0 -D;DG;WZ08-58-04;NOMINAL;2019;115.6;e;;0.0 -D;DG;WZ08-58-04;NOMINAL;2020;117.2;e;;0.0 -D;DG;WZ08-58-04;NOMINAL;2021;125.2;p;;0.0 -D;DG;WZ08-58-04;NOMINAL;2022;137.4;p;;0.0 -D;DG;WZ08-58-04;REAL;2015;100.0;e;;0.0 -D;DG;WZ08-58-04;REAL;2016;110.5;e;;0.0 -D;DG;WZ08-58-04;REAL;2017;105.8;e;;0.0 -D;DG;WZ08-58-04;REAL;2018;114.1;e;;0.0 -D;DG;WZ08-58-04;REAL;2019;115.0;e;;0.0 -D;DG;WZ08-58-04;REAL;2020;115.9;e;;0.0 -D;DG;WZ08-58-04;REAL;2021;122.5;p;;0.0 -D;DG;WZ08-58-04;REAL;2022;132.6;p;;0.0 -D;DG;WZ08-58-05;NOMINAL;2015;100.0;e;;0.0 -D;DG;WZ08-58-05;NOMINAL;2016;106.5;e;;0.0 -D;DG;WZ08-58-05;NOMINAL;2017;112.9;e;;0.0 -D;DG;WZ08-58-05;NOMINAL;2018;122.8;e;;0.0 -D;DG;WZ08-58-05;NOMINAL;2019;127.4;e;;0.0 -D;DG;WZ08-58-05;NOMINAL;2020;127.8;e;;0.0 -D;DG;WZ08-58-05;NOMINAL;2021;139.9;p;;0.0 -D;DG;WZ08-58-05;NOMINAL;2022;156.1;p;;0.0 -D;DG;WZ08-58-05;REAL;2015;100.0;e;;0.0 -D;DG;WZ08-58-05;REAL;2016;107.0;e;;0.0 -D;DG;WZ08-58-05;REAL;2017;113.2;e;;0.0 -D;DG;WZ08-58-05;REAL;2018;122.4;e;;0.0 -D;DG;WZ08-58-05;REAL;2019;126.4;e;;0.0 -D;DG;WZ08-58-05;REAL;2020;126.4;e;;0.0 -D;DG;WZ08-58-05;REAL;2021;137.6;p;;0.0 -D;DG;WZ08-58-05;REAL;2022;151.8;p;;0.0 -D;DG;WZ08-5811;NOMINAL;2015;100.0;e;;0.0 -D;DG;WZ08-5811;NOMINAL;2016;100.4;e;;0.0 -D;DG;WZ08-5811;NOMINAL;2017;103.4;e;;0.0 -D;DG;WZ08-5811;NOMINAL;2018;100.2;e;;0.0 -D;DG;WZ08-5811;NOMINAL;2019;98.6;e;;0.0 -D;DG;WZ08-5811;NOMINAL;2020;99.5;e;;0.0 -D;DG;WZ08-5811;NOMINAL;2021;106.6;p;;0.0 -D;DG;WZ08-5811;NOMINAL;2022;108.1;p;;0.0 -D;DG;WZ08-5812;NOMINAL;2015;100.0;e;;0.0 -D;DG;WZ08-5812;NOMINAL;2016;84.0;e;;0.0 -D;DG;WZ08-5812;NOMINAL;2017;79.4;e;;0.0 -D;DG;WZ08-5812;NOMINAL;2018;71.6;e;;0.0 -D;DG;WZ08-5812;NOMINAL;2019;68.0;e;;0.0 -D;DG;WZ08-5812;NOMINAL;2020;68.9;e;;0.0 -D;DG;WZ08-5812;NOMINAL;2021;60.1;p;;0.0 -D;DG;WZ08-5812;NOMINAL;2022;55.5;p;;0.0 -D;DG;WZ08-5813;NOMINAL;2015;100.0;e;;0.0 -D;DG;WZ08-5813;NOMINAL;2016;98.5;e;;0.0 -D;DG;WZ08-5813;NOMINAL;2017;100.2;e;;0.0 -D;DG;WZ08-5813;NOMINAL;2018;95.2;e;;0.0 -D;DG;WZ08-5813;NOMINAL;2019;93.2;e;;0.0 -D;DG;WZ08-5813;NOMINAL;2020;88.1;e;;0.0 -D;DG;WZ08-5813;NOMINAL;2021;92.3;p;;0.0 -D;DG;WZ08-5813;NOMINAL;2022;94.7;p;;0.0 -D;DG;WZ08-5814;NOMINAL;2015;100.0;e;;0.0 -D;DG;WZ08-5814;NOMINAL;2016;99.1;e;;0.0 -D;DG;WZ08-5814;NOMINAL;2017;96.7;e;;0.0 -D;DG;WZ08-5814;NOMINAL;2018;94.3;e;;0.0 -D;DG;WZ08-5814;NOMINAL;2019;92.7;e;;0.0 -D;DG;WZ08-5814;NOMINAL;2020;89.9;e;;0.0 -D;DG;WZ08-5814;NOMINAL;2021;85.8;p;;0.0 -D;DG;WZ08-5814;NOMINAL;2022;91.2;p;;0.0 -D;DG;WZ08-5819;NOMINAL;2015;100.0;e;;0.0 -D;DG;WZ08-5819;NOMINAL;2016;104.4;e;;0.0 -D;DG;WZ08-5819;NOMINAL;2017;96.8;e;;0.0 -D;DG;WZ08-5819;NOMINAL;2018;99.3;e;;0.0 -D;DG;WZ08-5819;NOMINAL;2019;96.0;e;;0.0 -D;DG;WZ08-5819;NOMINAL;2020;88.6;e;;0.0 -D;DG;WZ08-5819;NOMINAL;2021;92.6;p;;0.0 -D;DG;WZ08-5819;NOMINAL;2022;98.7;p;;0.0 -D;DG;WZ08-581;NOMINAL;2015;100.0;e;;0.0 -D;DG;WZ08-581;NOMINAL;2016;98.7;e;;0.0 -D;DG;WZ08-581;NOMINAL;2017;98.4;e;;0.0 -D;DG;WZ08-581;NOMINAL;2018;95.0;e;;0.0 -D;DG;WZ08-581;NOMINAL;2019;92.9;e;;0.0 -D;DG;WZ08-581;NOMINAL;2020;89.7;e;;0.0 -D;DG;WZ08-581;NOMINAL;2021;91.5;p;;0.0 -D;DG;WZ08-581;NOMINAL;2022;94.4;p;;0.0 -D;DG;WZ08-581;REAL;2015;100.0;e;;0.0 -D;DG;WZ08-581;REAL;2016;96.5;e;;0.0 -D;DG;WZ08-581;REAL;2017;94.6;e;;0.0 -D;DG;WZ08-581;REAL;2018;90.1;e;;0.0 -D;DG;WZ08-581;REAL;2019;85.2;e;;0.0 -D;DG;WZ08-581;REAL;2020;81.7;e;;0.0 -D;DG;WZ08-581;REAL;2021;81.6;p;;0.0 -D;DG;WZ08-581;REAL;2022;82.0;p;;0.0 -D;DG;WZ08-5821;NOMINAL;2015;100.0;e;;0.0 -D;DG;WZ08-5821;NOMINAL;2016;113.1;e;;0.0 -D;DG;WZ08-5821;NOMINAL;2017;136.7;e;;0.0 -D;DG;WZ08-5821;NOMINAL;2018;114.7;e;;0.0 -D;DG;WZ08-5821;NOMINAL;2019;101.8;e;;0.0 -D;DG;WZ08-5821;NOMINAL;2020;150.8;e;;0.0 -D;DG;WZ08-5821;NOMINAL;2021;149.8;p;;0.0 -D;DG;WZ08-5821;NOMINAL;2022;171.4;p;;0.0 -D;DG;WZ08-5829;NOMINAL;2015;100.0;e;;0.0 -D;DG;WZ08-5829;NOMINAL;2016;111.0;e;;0.0 -D;DG;WZ08-5829;NOMINAL;2017;116.9;e;;0.0 -D;DG;WZ08-5829;NOMINAL;2018;114.8;e;;0.0 -D;DG;WZ08-5829;NOMINAL;2019;123.8;e;;0.0 -D;DG;WZ08-5829;NOMINAL;2020;122.0;e;;0.0 -D;DG;WZ08-5829;NOMINAL;2021;145.0;p;;0.0 -D;DG;WZ08-5829;NOMINAL;2022;153.5;p;;0.0 -D;DG;WZ08-582;NOMINAL;2015;100.0;e;;0.0 -D;DG;WZ08-582;NOMINAL;2016;111.2;e;;0.0 -D;DG;WZ08-582;NOMINAL;2017;118.6;e;;0.0 -D;DG;WZ08-582;NOMINAL;2018;114.8;e;;0.0 -D;DG;WZ08-582;NOMINAL;2019;122.0;e;;0.0 -D;DG;WZ08-582;NOMINAL;2020;124.4;e;;0.0 -D;DG;WZ08-582;NOMINAL;2021;145.4;p;;0.0 -D;DG;WZ08-582;NOMINAL;2022;155.0;p;;0.0 -D;DG;WZ08-582;REAL;2015;100.0;e;;0.0 -D;DG;WZ08-582;REAL;2016;111.2;e;;0.0 -D;DG;WZ08-582;REAL;2017;117.8;e;;0.0 -D;DG;WZ08-582;REAL;2018;113.9;e;;0.0 -D;DG;WZ08-582;REAL;2019;121.0;e;;0.0 -D;DG;WZ08-582;REAL;2020;122.8;e;;0.0 -D;DG;WZ08-582;REAL;2021;143.3;p;;0.0 -D;DG;WZ08-582;REAL;2022;149.7;p;;0.0 -D;DG;WZ08-58;NOMINAL;2015;100.0;e;;0.0 -D;DG;WZ08-58;NOMINAL;2016;101.0;e;;0.0 -D;DG;WZ08-58;NOMINAL;2017;102.1;e;;0.0 -D;DG;WZ08-58;NOMINAL;2018;98.6;e;;0.0 -D;DG;WZ08-58;NOMINAL;2019;98.2;e;;0.0 -D;DG;WZ08-58;NOMINAL;2020;96.0;e;;0.0 -D;DG;WZ08-58;NOMINAL;2021;101.3;p;;0.0 -D;DG;WZ08-58;NOMINAL;2022;105.5;p;;0.0 -D;DG;WZ08-58;REAL;2015;100.0;e;;0.0 -D;DG;WZ08-58;REAL;2016;99.1;e;;0.0 -D;DG;WZ08-58;REAL;2017;98.9;e;;0.0 -D;DG;WZ08-58;REAL;2018;94.4;e;;0.0 -D;DG;WZ08-58;REAL;2019;91.7;e;;0.0 -D;DG;WZ08-58;REAL;2020;89.1;e;;0.0 -D;DG;WZ08-58;REAL;2021;92.9;p;;0.0 -D;DG;WZ08-58;REAL;2022;94.4;p;;0.0 -D;DG;WZ08-5911;NOMINAL;2015;100.0;e;;0.0 -D;DG;WZ08-5911;NOMINAL;2016;115.4;e;;0.0 -D;DG;WZ08-5911;NOMINAL;2017;105.0;e;;0.0 -D;DG;WZ08-5911;NOMINAL;2018;116.3;e;;0.0 -D;DG;WZ08-5911;NOMINAL;2019;120.7;e;;0.0 -D;DG;WZ08-5911;NOMINAL;2020;100.6;e;;0.0 -D;DG;WZ08-5911;NOMINAL;2021;112.8;p;;0.0 -D;DG;WZ08-5911;NOMINAL;2022;144.5;p;;0.0 -D;DG;WZ08-5912;NOMINAL;2015;100.0;e;;0.0 -D;DG;WZ08-5912;NOMINAL;2016;101.7;e;;0.0 -D;DG;WZ08-5912;NOMINAL;2017;124.6;e;;0.0 -D;DG;WZ08-5912;NOMINAL;2018;126.0;e;;0.0 -D;DG;WZ08-5912;NOMINAL;2019;132.2;e;;0.0 -D;DG;WZ08-5912;NOMINAL;2020;120.6;e;;0.0 -D;DG;WZ08-5912;NOMINAL;2021;133.9;p;;0.0 -D;DG;WZ08-5912;NOMINAL;2022;162.4;p;;0.0 -D;DG;WZ08-5913;NOMINAL;2015;100.0;e;;0.0 -D;DG;WZ08-5913;NOMINAL;2016;107.3;e;;0.0 -D;DG;WZ08-5913;NOMINAL;2017;92.1;e;;0.0 -D;DG;WZ08-5913;NOMINAL;2018;101.6;e;;0.0 -D;DG;WZ08-5913;NOMINAL;2019;90.1;e;;0.0 -D;DG;WZ08-5913;NOMINAL;2020;88.3;e;;0.0 -D;DG;WZ08-5913;NOMINAL;2021;81.1;p;;0.0 -D;DG;WZ08-5913;NOMINAL;2022;89.7;p;;0.0 -D;DG;WZ08-5914;NOMINAL;2015;100.0;e;;0.0 -D;DG;WZ08-5914;NOMINAL;2016;90.6;e;;0.0 -D;DG;WZ08-5914;NOMINAL;2017;92.5;e;;0.0 -D;DG;WZ08-5914;NOMINAL;2018;83.9;e;;0.0 -D;DG;WZ08-5914;NOMINAL;2019;95.9;e;;0.0 -D;DG;WZ08-5914;NOMINAL;2020;30.4;e;;0.0 -D;DG;WZ08-5914;NOMINAL;2021;45.6;p;;0.0 -D;DG;WZ08-5914;NOMINAL;2022;85.5;p;;0.0 -D;DG;WZ08-591;NOMINAL;2015;100.0;e;;0.0 -D;DG;WZ08-591;NOMINAL;2016;108.6;e;;0.0 -D;DG;WZ08-591;NOMINAL;2017;101.1;e;;0.0 -D;DG;WZ08-591;NOMINAL;2018;107.8;e;;0.0 -D;DG;WZ08-591;NOMINAL;2019;110.9;e;;0.0 -D;DG;WZ08-591;NOMINAL;2020;85.8;e;;0.0 -D;DG;WZ08-591;NOMINAL;2021;95.1;p;;0.0 -D;DG;WZ08-591;NOMINAL;2022;124.0;p;;0.0 -D;DG;WZ08-591;REAL;2015;100.0;e;;0.0 -D;DG;WZ08-591;REAL;2016;107.0;e;;0.0 -D;DG;WZ08-591;REAL;2017;97.6;e;;0.0 -D;DG;WZ08-591;REAL;2018;102.4;e;;0.0 -D;DG;WZ08-591;REAL;2019;104.3;e;;0.0 -D;DG;WZ08-591;REAL;2020;80.4;e;;0.0 -D;DG;WZ08-591;REAL;2021;87.0;p;;0.0 -D;DG;WZ08-591;REAL;2022;107.7;p;;0.0 -D;DG;WZ08-592;NOMINAL;2015;100.0;e;;0.0 -D;DG;WZ08-592;NOMINAL;2016;96.9;e;;0.0 -D;DG;WZ08-592;NOMINAL;2017;112.4;e;;0.0 -D;DG;WZ08-592;NOMINAL;2018;120.6;e;;0.0 -D;DG;WZ08-592;NOMINAL;2019;122.9;e;;0.0 -D;DG;WZ08-592;NOMINAL;2020;119.1;e;;0.0 -D;DG;WZ08-592;NOMINAL;2021;116.8;p;;0.0 -D;DG;WZ08-592;NOMINAL;2022;133.6;p;;0.0 -D;DG;WZ08-592;REAL;2015;100.0;e;;0.0 -D;DG;WZ08-592;REAL;2016;96.3;e;;0.0 -D;DG;WZ08-592;REAL;2017;108.2;e;;0.0 -D;DG;WZ08-592;REAL;2018;117.8;e;;0.0 -D;DG;WZ08-592;REAL;2019;112.4;e;;0.0 -D;DG;WZ08-592;REAL;2020;104.7;e;;0.0 -D;DG;WZ08-592;REAL;2021;106.0;p;;0.0 -D;DG;WZ08-592;REAL;2022;116.1;p;;0.0 -D;DG;WZ08-59;NOMINAL;2015;100.0;e;;0.0 -D;DG;WZ08-59;NOMINAL;2016;105.8;e;;0.0 -D;DG;WZ08-59;NOMINAL;2017;103.8;e;;0.0 -D;DG;WZ08-59;NOMINAL;2018;110.8;e;;0.0 -D;DG;WZ08-59;NOMINAL;2019;113.7;e;;0.0 -D;DG;WZ08-59;NOMINAL;2020;93.5;e;;0.0 -D;DG;WZ08-59;NOMINAL;2021;100.2;p;;0.0 -D;DG;WZ08-59;NOMINAL;2022;126.3;p;;0.0 -D;DG;WZ08-59;REAL;2015;100.0;e;;0.0 -D;DG;WZ08-59;REAL;2016;104.5;e;;0.0 -D;DG;WZ08-59;REAL;2017;100.1;e;;0.0 -D;DG;WZ08-59;REAL;2018;106.0;e;;0.0 -D;DG;WZ08-59;REAL;2019;106.2;e;;0.0 -D;DG;WZ08-59;REAL;2020;86.1;e;;0.0 -D;DG;WZ08-59;REAL;2021;91.5;p;;0.0 -D;DG;WZ08-59;REAL;2022;109.6;p;;0.0 -D;DG;WZ08-601;NOMINAL;2015;100.0;e;;0.0 -D;DG;WZ08-601;NOMINAL;2016;99.4;e;;0.0 -D;DG;WZ08-601;NOMINAL;2017;96.5;e;;0.0 -D;DG;WZ08-601;NOMINAL;2018;95.9;e;;0.0 -D;DG;WZ08-601;NOMINAL;2019;68.2;e;;0.0 -D;DG;WZ08-601;NOMINAL;2020;66.1;e;;0.0 -D;DG;WZ08-601;NOMINAL;2021;68.7;p;;0.0 -D;DG;WZ08-601;NOMINAL;2022;72.2;p;;0.0 -D;DG;WZ08-601;REAL;2015;100.0;e;;0.0 -D;DG;WZ08-601;REAL;2016;100.3;e;;0.0 -D;DG;WZ08-601;REAL;2017;97.3;e;;0.0 -D;DG;WZ08-601;REAL;2018;96.7;e;;0.0 -D;DG;WZ08-601;REAL;2019;68.8;e;;0.0 -D;DG;WZ08-601;REAL;2020;66.7;e;;0.0 -D;DG;WZ08-601;REAL;2021;67.6;p;;0.0 -D;DG;WZ08-601;REAL;2022;69.4;p;;0.0 -D;DG;WZ08-602;NOMINAL;2015;100.0;e;;0.0 -D;DG;WZ08-602;NOMINAL;2016;104.4;e;;0.0 -D;DG;WZ08-602;NOMINAL;2017;111.2;e;;0.0 -D;DG;WZ08-602;NOMINAL;2018;110.1;e;;0.0 -D;DG;WZ08-602;NOMINAL;2019;109.1;e;;0.0 -D;DG;WZ08-602;NOMINAL;2020;108.4;e;;0.0 -D;DG;WZ08-602;NOMINAL;2021;117.2;p;;0.0 -D;DG;WZ08-602;NOMINAL;2022;114.0;p;;0.0 -D;DG;WZ08-602;REAL;2015;100.0;e;;0.0 -D;DG;WZ08-602;REAL;2016;102.2;e;;0.0 -D;DG;WZ08-602;REAL;2017;108.7;e;;0.0 -D;DG;WZ08-602;REAL;2018;108.3;e;;0.0 -D;DG;WZ08-602;REAL;2019;107.7;e;;0.0 -D;DG;WZ08-602;REAL;2020;106.5;e;;0.0 -D;DG;WZ08-602;REAL;2021;112.4;p;;0.0 -D;DG;WZ08-602;REAL;2022;107.4;p;;0.0 -D;DG;WZ08-60;NOMINAL;2015;100.0;e;;0.0 -D;DG;WZ08-60;NOMINAL;2016;103.5;e;;0.0 -D;DG;WZ08-60;NOMINAL;2017;108.7;e;;0.0 -D;DG;WZ08-60;NOMINAL;2018;107.6;e;;0.0 -D;DG;WZ08-60;NOMINAL;2019;102.1;e;;0.0 -D;DG;WZ08-60;NOMINAL;2020;101.1;e;;0.0 -D;DG;WZ08-60;NOMINAL;2021;108.8;p;;0.0 -D;DG;WZ08-60;NOMINAL;2022;106.8;p;;0.0 -D;DG;WZ08-60;REAL;2015;100.0;e;;0.0 -D;DG;WZ08-60;REAL;2016;101.9;e;;0.0 -D;DG;WZ08-60;REAL;2017;106.8;e;;0.0 -D;DG;WZ08-60;REAL;2018;106.4;e;;0.0 -D;DG;WZ08-60;REAL;2019;101.0;e;;0.0 -D;DG;WZ08-60;REAL;2020;99.7;e;;0.0 -D;DG;WZ08-60;REAL;2021;104.7;p;;0.0 -D;DG;WZ08-60;REAL;2022;100.9;p;;0.0 -D;DG;WZ08-61-01;NOMINAL;2015;100.0;e;;0.0 -D;DG;WZ08-61-01;NOMINAL;2016;108.0;e;;0.0 -D;DG;WZ08-61-01;NOMINAL;2017;107.2;e;;0.0 -D;DG;WZ08-61-01;NOMINAL;2018;111.5;e;;0.0 -D;DG;WZ08-61-01;NOMINAL;2019;113.5;e;;0.0 -D;DG;WZ08-61-01;NOMINAL;2020;112.5;e;;0.0 -D;DG;WZ08-61-01;NOMINAL;2021;120.8;p;;0.0 -D;DG;WZ08-61-01;NOMINAL;2022;132.8;p;;0.0 -D;DG;WZ08-61-01;REAL;2015;100.0;e;;0.0 -D;DG;WZ08-61-01;REAL;2016;107.5;e;;0.0 -D;DG;WZ08-61-01;REAL;2017;105.9;e;;0.0 -D;DG;WZ08-61-01;REAL;2018;108.8;e;;0.0 -D;DG;WZ08-61-01;REAL;2019;109.5;e;;0.0 -D;DG;WZ08-61-01;REAL;2020;107.4;e;;0.0 -D;DG;WZ08-61-01;REAL;2021;112.9;p;;0.0 -D;DG;WZ08-61-01;REAL;2022;121.1;p;;0.0 -D;DG;WZ08-61-02;NOMINAL;2015;100.0;e;;0.0 -D;DG;WZ08-61-02;NOMINAL;2016;108.1;e;;0.0 -D;DG;WZ08-61-02;NOMINAL;2017;106.5;e;;0.0 -D;DG;WZ08-61-02;NOMINAL;2018;111.5;e;;0.0 -D;DG;WZ08-61-02;NOMINAL;2019;114.4;e;;0.0 -D;DG;WZ08-61-02;NOMINAL;2020;114.7;e;;0.0 -D;DG;WZ08-61-02;NOMINAL;2021;122.5;p;;0.0 -D;DG;WZ08-61-02;NOMINAL;2022;134.7;p;;0.0 -D;DG;WZ08-61-02;REAL;2015;100.0;e;;0.0 -D;DG;WZ08-61-02;REAL;2016;107.9;e;;0.0 -D;DG;WZ08-61-02;REAL;2017;105.8;e;;0.0 -D;DG;WZ08-61-02;REAL;2018;109.4;e;;0.0 -D;DG;WZ08-61-02;REAL;2019;111.0;e;;0.0 -D;DG;WZ08-61-02;REAL;2020;110.3;e;;0.0 -D;DG;WZ08-61-02;REAL;2021;115.4;p;;0.0 -D;DG;WZ08-61-02;REAL;2022;123.9;p;;0.0 -D;DG;WZ08-61-03;NOMINAL;2015;100.0;e;;0.0 -D;DG;WZ08-61-03;NOMINAL;2016;105.6;e;;0.0 -D;DG;WZ08-61-03;NOMINAL;2017;111.6;e;;0.0 -D;DG;WZ08-61-03;NOMINAL;2018;118.1;e;;0.0 -D;DG;WZ08-61-03;NOMINAL;2019;122.6;e;;0.0 -D;DG;WZ08-61-03;NOMINAL;2020;121.5;e;;0.0 -D;DG;WZ08-61-03;NOMINAL;2021;130.5;p;;0.0 -D;DG;WZ08-61-03;NOMINAL;2022;142.7;p;;0.0 -D;DG;WZ08-61-03;REAL;2015;100.0;e;;0.0 -D;DG;WZ08-61-03;REAL;2016;105.0;e;;0.0 -D;DG;WZ08-61-03;REAL;2017;110.1;e;;0.0 -D;DG;WZ08-61-03;REAL;2018;115.4;e;;0.0 -D;DG;WZ08-61-03;REAL;2019;118.5;e;;0.0 -D;DG;WZ08-61-03;REAL;2020;115.9;e;;0.0 -D;DG;WZ08-61-03;REAL;2021;122.3;p;;0.0 -D;DG;WZ08-61-03;REAL;2022;131.1;p;;0.0 -D;DG;WZ08-611;NOMINAL;2015;100.0;e;;0.0 -D;DG;WZ08-611;NOMINAL;2016;90.1;e;;0.0 -D;DG;WZ08-611;NOMINAL;2017;89.3;e;;0.0 -D;DG;WZ08-611;NOMINAL;2018;95.5;e;;0.0 -D;DG;WZ08-611;NOMINAL;2019;89.9;e;;0.0 -D;DG;WZ08-611;NOMINAL;2020;91.8;e;;0.0 -D;DG;WZ08-611;NOMINAL;2021;88.4;p;;0.0 -D;DG;WZ08-611;NOMINAL;2022;90.1;p;;0.0 -D;DG;WZ08-611;REAL;2015;100.0;e;;0.0 -D;DG;WZ08-611;REAL;2016;91.1;e;;0.0 -D;DG;WZ08-611;REAL;2017;91.5;e;;0.0 -D;DG;WZ08-611;REAL;2018;96.1;e;;0.0 -D;DG;WZ08-611;REAL;2019;89.4;e;;0.0 -D;DG;WZ08-611;REAL;2020;89.9;e;;0.0 -D;DG;WZ08-611;REAL;2021;83.7;p;;0.0 -D;DG;WZ08-611;REAL;2022;82.7;p;;0.0 -D;DG;WZ08-612;NOMINAL;2015;100.0;e;;0.0 -D;DG;WZ08-612;NOMINAL;2016;174.5;e;;0.0 -D;DG;WZ08-612;NOMINAL;2017;80.1;e;;0.0 -D;DG;WZ08-612;NOMINAL;2018;83.5;e;;0.0 -D;DG;WZ08-612;NOMINAL;2019;81.8;e;;0.0 -D;DG;WZ08-612;NOMINAL;2020;84.3;e;;0.0 -D;DG;WZ08-612;NOMINAL;2021;86.4;p;;0.0 -D;DG;WZ08-612;NOMINAL;2022;92.0;p;;0.0 -D;DG;WZ08-612;REAL;2015;100.0;e;;0.0 -D;DG;WZ08-612;REAL;2016;176.4;e;;0.0 -D;DG;WZ08-612;REAL;2017;82.1;e;;0.0 -D;DG;WZ08-612;REAL;2018;84.0;e;;0.0 -D;DG;WZ08-612;REAL;2019;81.4;e;;0.0 -D;DG;WZ08-612;REAL;2020;82.6;e;;0.0 -D;DG;WZ08-612;REAL;2021;81.9;p;;0.0 -D;DG;WZ08-612;REAL;2022;84.4;p;;0.0 -D;DG;WZ08-613;NOMINAL;2015;100.0;e;;0.0 -D;DG;WZ08-613;NOMINAL;2016;87.1;e;;0.0 -D;DG;WZ08-613;NOMINAL;2017;117.2;e;;0.0 -D;DG;WZ08-613;NOMINAL;2018;149.1;e;;0.0 -D;DG;WZ08-613;NOMINAL;2019;136.1;e;;0.0 -D;DG;WZ08-613;NOMINAL;2020;98.6;e;;0.0 -D;DG;WZ08-613;NOMINAL;2021;97.8;p;;0.0 -D;DG;WZ08-613;NOMINAL;2022;97.7;p;;0.0 -D;DG;WZ08-613;REAL;2015;100.0;e;;0.0 -D;DG;WZ08-613;REAL;2016;88.0;e;;0.0 -D;DG;WZ08-613;REAL;2017;120.1;e;;0.0 -D;DG;WZ08-613;REAL;2018;150.0;e;;0.0 -D;DG;WZ08-613;REAL;2019;135.3;e;;0.0 -D;DG;WZ08-613;REAL;2020;96.6;e;;0.0 -D;DG;WZ08-613;REAL;2021;92.7;p;;0.0 -D;DG;WZ08-613;REAL;2022;89.6;p;;0.0 -D;DG;WZ08-619;NOMINAL;2015;100.0;e;;0.0 -D;DG;WZ08-619;NOMINAL;2016;95.4;e;;0.0 -D;DG;WZ08-619;NOMINAL;2017;94.0;e;;0.0 -D;DG;WZ08-619;NOMINAL;2018;95.1;e;;0.0 -D;DG;WZ08-619;NOMINAL;2019;93.4;e;;0.0 -D;DG;WZ08-619;NOMINAL;2020;96.0;e;;0.0 -D;DG;WZ08-619;NOMINAL;2021;93.6;p;;0.0 -D;DG;WZ08-619;NOMINAL;2022;95.2;p;;0.0 -D;DG;WZ08-619;REAL;2015;100.0;e;;0.0 -D;DG;WZ08-619;REAL;2016;96.5;e;;0.0 -D;DG;WZ08-619;REAL;2017;96.2;e;;0.0 -D;DG;WZ08-619;REAL;2018;95.7;e;;0.0 -D;DG;WZ08-619;REAL;2019;92.9;e;;0.0 -D;DG;WZ08-619;REAL;2020;94.0;e;;0.0 -D;DG;WZ08-619;REAL;2021;88.6;p;;0.0 -D;DG;WZ08-619;REAL;2022;87.3;p;;0.0 -D;DG;WZ08-61;NOMINAL;2015;100.0;e;;0.0 -D;DG;WZ08-61;NOMINAL;2016;115.3;e;;0.0 -D;DG;WZ08-61;NOMINAL;2017;87.6;e;;0.0 -D;DG;WZ08-61;NOMINAL;2018;92.3;e;;0.0 -D;DG;WZ08-61;NOMINAL;2019;88.5;e;;0.0 -D;DG;WZ08-61;NOMINAL;2020;90.4;e;;0.0 -D;DG;WZ08-61;NOMINAL;2021;88.8;p;;0.0 -D;DG;WZ08-61;NOMINAL;2022;91.6;p;;0.0 -D;DG;WZ08-61;REAL;2015;100.0;e;;0.0 -D;DG;WZ08-61;REAL;2016;116.5;e;;0.0 -D;DG;WZ08-61;REAL;2017;89.8;e;;0.0 -D;DG;WZ08-61;REAL;2018;92.9;e;;0.0 -D;DG;WZ08-61;REAL;2019;88.0;e;;0.0 -D;DG;WZ08-61;REAL;2020;88.5;e;;0.0 -D;DG;WZ08-61;REAL;2021;84.1;p;;0.0 -D;DG;WZ08-61;REAL;2022;84.0;p;;0.0 -D;DG;WZ08-6201;NOMINAL;2015;100.0;e;;0.0 -D;DG;WZ08-6201;NOMINAL;2016;109.9;e;;0.0 -D;DG;WZ08-6201;NOMINAL;2017;116.8;e;;0.0 -D;DG;WZ08-6201;NOMINAL;2018;127.1;e;;0.0 -D;DG;WZ08-6201;NOMINAL;2019;136.9;e;;0.0 -D;DG;WZ08-6201;NOMINAL;2020;135.0;e;;0.0 -D;DG;WZ08-6201;NOMINAL;2021;150.1;p;;0.0 -D;DG;WZ08-6201;NOMINAL;2022;172.8;p;;0.0 -D;DG;WZ08-6202;NOMINAL;2015;100.0;e;;0.0 -D;DG;WZ08-6202;NOMINAL;2016;108.6;e;;0.0 -D;DG;WZ08-6202;NOMINAL;2017;123.4;e;;0.0 -D;DG;WZ08-6202;NOMINAL;2018;133.0;e;;0.0 -D;DG;WZ08-6202;NOMINAL;2019;139.0;e;;0.0 -D;DG;WZ08-6202;NOMINAL;2020;141.3;e;;0.0 -D;DG;WZ08-6202;NOMINAL;2021;153.1;p;;0.0 -D;DG;WZ08-6202;NOMINAL;2022;170.5;p;;0.0 -D;DG;WZ08-6203;NOMINAL;2015;100.0;e;;0.0 -D;DG;WZ08-6203;NOMINAL;2016;104.5;e;;0.0 -D;DG;WZ08-6203;NOMINAL;2017;107.9;e;;0.0 -D;DG;WZ08-6203;NOMINAL;2018;101.6;e;;0.0 -D;DG;WZ08-6203;NOMINAL;2019;106.9;e;;0.0 -D;DG;WZ08-6203;NOMINAL;2020;111.9;e;;0.0 -D;DG;WZ08-6203;NOMINAL;2021;114.3;p;;0.0 -D;DG;WZ08-6203;NOMINAL;2022;117.0;p;;0.0 -D;DG;WZ08-6209;NOMINAL;2015;100.0;e;;0.0 -D;DG;WZ08-6209;NOMINAL;2016;100.8;e;;0.0 -D;DG;WZ08-6209;NOMINAL;2017;101.9;e;;0.0 -D;DG;WZ08-6209;NOMINAL;2018;118.9;e;;0.0 -D;DG;WZ08-6209;NOMINAL;2019;115.5;e;;0.0 -D;DG;WZ08-6209;NOMINAL;2020;115.7;e;;0.0 -D;DG;WZ08-6209;NOMINAL;2021;126.0;p;;0.0 -D;DG;WZ08-6209;NOMINAL;2022;138.4;p;;0.0 -D;DG;WZ08-620;NOMINAL;2015;100.0;e;;0.0 -D;DG;WZ08-620;NOMINAL;2016;106.3;e;;0.0 -D;DG;WZ08-620;NOMINAL;2017;112.6;e;;0.0 -D;DG;WZ08-620;NOMINAL;2018;123.2;e;;0.0 -D;DG;WZ08-620;NOMINAL;2019;127.7;e;;0.0 -D;DG;WZ08-620;NOMINAL;2020;128.0;e;;0.0 -D;DG;WZ08-620;NOMINAL;2021;139.7;p;;0.0 -D;DG;WZ08-620;NOMINAL;2022;156.1;p;;0.0 -D;DG;WZ08-620;REAL;2015;100.0;e;;0.0 -D;DG;WZ08-620;REAL;2016;106.8;e;;0.0 -D;DG;WZ08-620;REAL;2017;113.0;e;;0.0 -D;DG;WZ08-620;REAL;2018;122.9;e;;0.0 -D;DG;WZ08-620;REAL;2019;126.7;e;;0.0 -D;DG;WZ08-620;REAL;2020;126.6;e;;0.0 -D;DG;WZ08-620;REAL;2021;137.4;p;;0.0 -D;DG;WZ08-620;REAL;2022;151.9;p;;0.0 -D;DG;WZ08-62;NOMINAL;2015;100.0;e;;0.0 -D;DG;WZ08-62;NOMINAL;2016;106.3;e;;0.0 -D;DG;WZ08-62;NOMINAL;2017;112.6;e;;0.0 -D;DG;WZ08-62;NOMINAL;2018;123.2;e;;0.0 -D;DG;WZ08-62;NOMINAL;2019;127.7;e;;0.0 -D;DG;WZ08-62;NOMINAL;2020;128.0;e;;0.0 -D;DG;WZ08-62;NOMINAL;2021;139.7;p;;0.0 -D;DG;WZ08-62;NOMINAL;2022;156.1;p;;0.0 -D;DG;WZ08-62;REAL;2015;100.0;e;;0.0 -D;DG;WZ08-62;REAL;2016;106.8;e;;0.0 -D;DG;WZ08-62;REAL;2017;113.0;e;;0.0 -D;DG;WZ08-62;REAL;2018;122.9;e;;0.0 -D;DG;WZ08-62;REAL;2019;126.7;e;;0.0 -D;DG;WZ08-62;REAL;2020;126.6;e;;0.0 -D;DG;WZ08-62;REAL;2021;137.4;p;;0.0 -D;DG;WZ08-62;REAL;2022;151.9;p;;0.0 -D;DG;WZ08-63-01;NOMINAL;2015;100.0;e;;0.0 -D;DG;WZ08-63-01;NOMINAL;2016;107.9;e;;0.0 -D;DG;WZ08-63-01;NOMINAL;2017;107.5;e;;0.0 -D;DG;WZ08-63-01;NOMINAL;2018;117.8;e;;0.0 -D;DG;WZ08-63-01;NOMINAL;2019;119.6;e;;0.0 -D;DG;WZ08-63-01;NOMINAL;2020;114.2;e;;0.0 -D;DG;WZ08-63-01;NOMINAL;2021;130.7;p;;0.0 -D;DG;WZ08-63-01;NOMINAL;2022;144.6;p;;0.0 -D;DG;WZ08-63-01;REAL;2015;100.0;e;;0.0 -D;DG;WZ08-63-01;REAL;2016;106.4;e;;0.0 -D;DG;WZ08-63-01;REAL;2017;104.9;e;;0.0 -D;DG;WZ08-63-01;REAL;2018;113.5;e;;0.0 -D;DG;WZ08-63-01;REAL;2019;114.7;e;;0.0 -D;DG;WZ08-63-01;REAL;2020;109.8;e;;0.0 -D;DG;WZ08-63-01;REAL;2021;123.1;p;;0.0 -D;DG;WZ08-63-01;REAL;2022;134.1;p;;0.0 -D;DG;WZ08-63-02;NOMINAL;2015;100.0;e;;0.0 -D;DG;WZ08-63-02;NOMINAL;2016;111.0;e;;0.0 -D;DG;WZ08-63-02;NOMINAL;2017;116.8;e;;0.0 -D;DG;WZ08-63-02;NOMINAL;2018;142.3;e;;0.0 -D;DG;WZ08-63-02;NOMINAL;2019;141.3;e;;0.0 -D;DG;WZ08-63-02;NOMINAL;2020;151.6;e;;0.0 -D;DG;WZ08-63-02;NOMINAL;2021;172.3;p;;0.0 -D;DG;WZ08-63-02;NOMINAL;2022;195.6;p;;0.0 -D;DG;WZ08-63-02;REAL;2015;100.0;e;;0.0 -D;DG;WZ08-63-02;REAL;2016;112.2;e;;0.0 -D;DG;WZ08-63-02;REAL;2017;118.5;e;;0.0 -D;DG;WZ08-63-02;REAL;2018;145.0;e;;0.0 -D;DG;WZ08-63-02;REAL;2019;145.1;e;;0.0 -D;DG;WZ08-63-02;REAL;2020;155.9;e;;0.0 -D;DG;WZ08-63-02;REAL;2021;177.1;p;;0.0 -D;DG;WZ08-63-02;REAL;2022;200.5;p;;0.0 -D;DG;WZ08-63-03;NOMINAL;2015;100.0;e;;0.0 -D;DG;WZ08-63-03;NOMINAL;2016;106.4;e;;0.0 -D;DG;WZ08-63-03;NOMINAL;2017;109.2;e;;0.0 -D;DG;WZ08-63-03;NOMINAL;2018;119.9;e;;0.0 -D;DG;WZ08-63-03;NOMINAL;2019;123.3;e;;0.0 -D;DG;WZ08-63-03;NOMINAL;2020;121.6;e;;0.0 -D;DG;WZ08-63-03;NOMINAL;2021;134.7;p;;0.0 -D;DG;WZ08-63-03;NOMINAL;2022;150.2;p;;0.0 -D;DG;WZ08-63-03;REAL;2015;100.0;e;;0.0 -D;DG;WZ08-63-03;REAL;2016;106.3;e;;0.0 -D;DG;WZ08-63-03;REAL;2017;108.7;e;;0.0 -D;DG;WZ08-63-03;REAL;2018;118.4;e;;0.0 -D;DG;WZ08-63-03;REAL;2019;121.2;e;;0.0 -D;DG;WZ08-63-03;REAL;2020;119.4;e;;0.0 -D;DG;WZ08-63-03;REAL;2021;130.9;p;;0.0 -D;DG;WZ08-63-03;REAL;2022;144.3;p;;0.0 -D;DG;WZ08-63-04;NOMINAL;2015;100.0;e;;0.0 -D;DG;WZ08-63-04;NOMINAL;2016;106.3;e;;0.0 -D;DG;WZ08-63-04;NOMINAL;2017;110.7;e;;0.0 -D;DG;WZ08-63-04;NOMINAL;2018;123.1;e;;0.0 -D;DG;WZ08-63-04;NOMINAL;2019;126.6;e;;0.0 -D;DG;WZ08-63-04;NOMINAL;2020;127.5;e;;0.0 -D;DG;WZ08-63-04;NOMINAL;2021;140.1;p;;0.0 -D;DG;WZ08-63-04;NOMINAL;2022;157.1;p;;0.0 -D;DG;WZ08-63-04;REAL;2015;100.0;e;;0.0 -D;DG;WZ08-63-04;REAL;2016;106.9;e;;0.0 -D;DG;WZ08-63-04;REAL;2017;111.1;e;;0.0 -D;DG;WZ08-63-04;REAL;2018;123.0;e;;0.0 -D;DG;WZ08-63-04;REAL;2019;126.1;e;;0.0 -D;DG;WZ08-63-04;REAL;2020;126.7;e;;0.0 -D;DG;WZ08-63-04;REAL;2021;138.6;p;;0.0 -D;DG;WZ08-63-04;REAL;2022;154.0;p;;0.0 -D;DG;WZ08-6311;NOMINAL;2015;100.0;e;;0.0 -D;DG;WZ08-6311;NOMINAL;2016;110.7;e;;0.0 -D;DG;WZ08-6311;NOMINAL;2017;105.2;e;;0.0 -D;DG;WZ08-6311;NOMINAL;2018;118.5;e;;0.0 -D;DG;WZ08-6311;NOMINAL;2019;132.7;e;;0.0 -D;DG;WZ08-6311;NOMINAL;2020;155.4;e;;0.0 -D;DG;WZ08-6311;NOMINAL;2021;170.9;p;;0.0 -D;DG;WZ08-6311;NOMINAL;2022;199.6;p;;0.0 -D;DG;WZ08-6312;NOMINAL;2015;100.0;e;;0.0 -D;DG;WZ08-6312;NOMINAL;2016;117.2;e;;0.0 -D;DG;WZ08-6312;NOMINAL;2017;141.7;e;;0.0 -D;DG;WZ08-6312;NOMINAL;2018;206.2;e;;0.0 -D;DG;WZ08-6312;NOMINAL;2019;181.6;e;;0.0 -D;DG;WZ08-6312;NOMINAL;2020;186.4;e;;0.0 -D;DG;WZ08-6312;NOMINAL;2021;220.8;p;;0.0 -D;DG;WZ08-6312;NOMINAL;2022;245.0;p;;0.0 -D;DG;WZ08-631;NOMINAL;2015;100.0;e;;0.0 -D;DG;WZ08-631;NOMINAL;2016;113.2;e;;0.0 -D;DG;WZ08-631;NOMINAL;2017;119.0;e;;0.0 -D;DG;WZ08-631;NOMINAL;2018;151.7;e;;0.0 -D;DG;WZ08-631;NOMINAL;2019;151.2;e;;0.0 -D;DG;WZ08-631;NOMINAL;2020;167.1;e;;0.0 -D;DG;WZ08-631;NOMINAL;2021;189.8;p;;0.0 -D;DG;WZ08-631;NOMINAL;2022;216.8;p;;0.0 -D;DG;WZ08-631;REAL;2015;100.0;e;;0.0 -D;DG;WZ08-631;REAL;2016;115.0;e;;0.0 -D;DG;WZ08-631;REAL;2017;121.4;e;;0.0 -D;DG;WZ08-631;REAL;2018;155.4;e;;0.0 -D;DG;WZ08-631;REAL;2019;156.5;e;;0.0 -D;DG;WZ08-631;REAL;2020;173.1;e;;0.0 -D;DG;WZ08-631;REAL;2021;196.7;p;;0.0 -D;DG;WZ08-631;REAL;2022;224.7;p;;0.0 -D;DG;WZ08-6391;NOMINAL;2015;100.0;e;;0.0 -D;DG;WZ08-6391;NOMINAL;2016;81.1;e;;0.0 -D;DG;WZ08-6391;NOMINAL;2017;77.3;e;;0.0 -D;DG;WZ08-6391;NOMINAL;2018;77.1;e;;0.0 -D;DG;WZ08-6391;NOMINAL;2019;90.4;e;;0.0 -D;DG;WZ08-6391;NOMINAL;2020;76.6;e;;0.0 -D;DG;WZ08-6391;NOMINAL;2021;76.7;p;;0.0 -D;DG;WZ08-6391;NOMINAL;2022;77.1;p;;0.0 -D;DG;WZ08-6399;NOMINAL;2015;100.0;e;;0.0 -D;DG;WZ08-6399;NOMINAL;2016;262.5;e;;0.0 -D;DG;WZ08-6399;NOMINAL;2017;219.6;e;;0.0 -D;DG;WZ08-6399;NOMINAL;2018;112.3;e;;0.0 -D;DG;WZ08-6399;NOMINAL;2019;105.0;e;;0.0 -D;DG;WZ08-6399;NOMINAL;2020;86.4;e;;0.0 -D;DG;WZ08-6399;NOMINAL;2021;104.4;p;;0.0 -D;DG;WZ08-6399;NOMINAL;2022;108.0;p;;0.0 -D;DG;WZ08-639;NOMINAL;2015;100.0;e;;0.0 -D;DG;WZ08-639;NOMINAL;2016;236.8;e;;0.0 -D;DG;WZ08-639;NOMINAL;2017;199.4;e;;0.0 -D;DG;WZ08-639;NOMINAL;2018;107.3;e;;0.0 -D;DG;WZ08-639;NOMINAL;2019;103.0;e;;0.0 -D;DG;WZ08-639;NOMINAL;2020;85.0;e;;0.0 -D;DG;WZ08-639;NOMINAL;2021;100.5;p;;0.0 -D;DG;WZ08-639;NOMINAL;2022;103.6;p;;0.0 -D;DG;WZ08-639;REAL;2015;100.0;e;;0.0 -D;DG;WZ08-639;REAL;2016;235.2;e;;0.0 -D;DG;WZ08-639;REAL;2017;197.0;e;;0.0 -D;DG;WZ08-639;REAL;2018;105.3;e;;0.0 -D;DG;WZ08-639;REAL;2019;99.9;e;;0.0 -D;DG;WZ08-639;REAL;2020;81.5;e;;0.0 -D;DG;WZ08-639;REAL;2021;96.1;p;;0.0 -D;DG;WZ08-639;REAL;2022;96.4;p;;0.0 -D;DG;WZ08-63;NOMINAL;2015;100.0;e;;0.0 -D;DG;WZ08-63;NOMINAL;2016;154.8;e;;0.0 -D;DG;WZ08-63;NOMINAL;2017;146.1;e;;0.0 -D;DG;WZ08-63;NOMINAL;2018;136.7;e;;0.0 -D;DG;WZ08-63;NOMINAL;2019;135.0;e;;0.0 -D;DG;WZ08-63;NOMINAL;2020;139.5;e;;0.0 -D;DG;WZ08-63;NOMINAL;2021;159.7;p;;0.0 -D;DG;WZ08-63;NOMINAL;2022;178.7;p;;0.0 -D;DG;WZ08-63;REAL;2015;100.0;e;;0.0 -D;DG;WZ08-63;REAL;2016;155.4;e;;0.0 -D;DG;WZ08-63;REAL;2017;146.9;e;;0.0 -D;DG;WZ08-63;REAL;2018;138.5;e;;0.0 -D;DG;WZ08-63;REAL;2019;137.5;e;;0.0 -D;DG;WZ08-63;REAL;2020;142.3;e;;0.0 -D;DG;WZ08-63;REAL;2021;162.9;p;;0.0 -D;DG;WZ08-63;REAL;2022;181.6;p;;0.0 -D;DG;WZ08-681;NOMINAL;2015;100.0;e;;0.0 -D;DG;WZ08-681;NOMINAL;2016;96.6;e;;0.0 -D;DG;WZ08-681;NOMINAL;2017;80.0;e;;0.0 -D;DG;WZ08-681;NOMINAL;2018;91.8;e;;0.0 -D;DG;WZ08-681;NOMINAL;2019;95.0;e;;0.0 -D;DG;WZ08-681;NOMINAL;2020;69.4;e;;0.0 -D;DG;WZ08-681;NOMINAL;2021;72.1;p;;0.0 -D;DG;WZ08-681;NOMINAL;2022;73.5;p;;0.0 -D;DG;WZ08-681;REAL;2015;100.0;e;;0.0 -D;DG;WZ08-681;REAL;2016;95.5;e;;0.0 -D;DG;WZ08-681;REAL;2017;78.0;e;;0.0 -D;DG;WZ08-681;REAL;2018;88.2;e;;0.0 -D;DG;WZ08-681;REAL;2019;90.0;e;;0.0 -D;DG;WZ08-681;REAL;2020;64.9;e;;0.0 -D;DG;WZ08-681;REAL;2021;66.4;p;;0.0 -D;DG;WZ08-681;REAL;2022;66.6;p;;0.0 -D;DG;WZ08-682;NOMINAL;2015;100.0;e;;0.0 -D;DG;WZ08-682;NOMINAL;2016;109.9;e;;0.0 -D;DG;WZ08-682;NOMINAL;2017;109.6;e;;0.0 -D;DG;WZ08-682;NOMINAL;2018;108.4;e;;0.0 -D;DG;WZ08-682;NOMINAL;2019;112.9;e;;0.0 -D;DG;WZ08-682;NOMINAL;2020;76.9;e;;0.0 -D;DG;WZ08-682;NOMINAL;2021;89.0;p;;0.0 -D;DG;WZ08-682;NOMINAL;2022;94.9;p;;0.0 -D;DG;WZ08-682;REAL;2015;100.0;e;;0.0 -D;DG;WZ08-682;REAL;2016;108.6;e;;0.0 -D;DG;WZ08-682;REAL;2017;106.9;e;;0.0 -D;DG;WZ08-682;REAL;2018;104.1;e;;0.0 -D;DG;WZ08-682;REAL;2019;107.0;e;;0.0 -D;DG;WZ08-682;REAL;2020;71.8;e;;0.0 -D;DG;WZ08-682;REAL;2021;82.0;p;;0.0 -D;DG;WZ08-682;REAL;2022;86.0;p;;0.0 -D;DG;WZ08-6831;NOMINAL;2015;100.0;e;;0.0 -D;DG;WZ08-6831;NOMINAL;2016;98.5;e;;0.0 -D;DG;WZ08-6831;NOMINAL;2017;100.1;e;;0.0 -D;DG;WZ08-6831;NOMINAL;2018;106.4;e;;0.0 -D;DG;WZ08-6831;NOMINAL;2019;116.4;e;;0.0 -D;DG;WZ08-6831;NOMINAL;2020;113.2;e;;0.0 -D;DG;WZ08-6831;NOMINAL;2021;119.8;p;;0.0 -D;DG;WZ08-6831;NOMINAL;2022;119.7;p;;0.0 -D;DG;WZ08-6832;NOMINAL;2015;100.0;e;;0.0 -D;DG;WZ08-6832;NOMINAL;2016;101.7;e;;0.0 -D;DG;WZ08-6832;NOMINAL;2017;103.4;e;;0.0 -D;DG;WZ08-6832;NOMINAL;2018;125.4;e;;0.0 -D;DG;WZ08-6832;NOMINAL;2019;114.4;e;;0.0 -D;DG;WZ08-6832;NOMINAL;2020;118.0;e;;0.0 -D;DG;WZ08-6832;NOMINAL;2021;118.3;p;;0.0 -D;DG;WZ08-6832;NOMINAL;2022;127.1;p;;0.0 -D;DG;WZ08-683;NOMINAL;2015;100.0;e;;0.0 -D;DG;WZ08-683;NOMINAL;2016;100.4;e;;0.0 -D;DG;WZ08-683;NOMINAL;2017;102.1;e;;0.0 -D;DG;WZ08-683;NOMINAL;2018;117.8;e;;0.0 -D;DG;WZ08-683;NOMINAL;2019;115.2;e;;0.0 -D;DG;WZ08-683;NOMINAL;2020;116.0;e;;0.0 -D;DG;WZ08-683;NOMINAL;2021;118.9;p;;0.0 -D;DG;WZ08-683;NOMINAL;2022;124.1;p;;0.0 -D;DG;WZ08-683;REAL;2015;100.0;e;;0.0 -D;DG;WZ08-683;REAL;2016;99.3;e;;0.0 -D;DG;WZ08-683;REAL;2017;99.5;e;;0.0 -D;DG;WZ08-683;REAL;2018;113.2;e;;0.0 -D;DG;WZ08-683;REAL;2019;109.2;e;;0.0 -D;DG;WZ08-683;REAL;2020;108.4;e;;0.0 -D;DG;WZ08-683;REAL;2021;109.6;p;;0.0 -D;DG;WZ08-683;REAL;2022;112.5;p;;0.0 -D;DG;WZ08-68;NOMINAL;2015;100.0;e;;0.0 -D;DG;WZ08-68;NOMINAL;2016;107.2;e;;0.0 -D;DG;WZ08-68;NOMINAL;2017;105.8;e;;0.0 -D;DG;WZ08-68;NOMINAL;2018;108.4;e;;0.0 -D;DG;WZ08-68;NOMINAL;2019;111.7;e;;0.0 -D;DG;WZ08-68;NOMINAL;2020;82.5;e;;0.0 -D;DG;WZ08-68;NOMINAL;2021;92.3;p;;0.0 -D;DG;WZ08-68;NOMINAL;2022;97.7;p;;0.0 -D;DG;WZ08-68;REAL;2015;100.0;e;;0.0 -D;DG;WZ08-68;REAL;2016;106.0;e;;0.0 -D;DG;WZ08-68;REAL;2017;103.2;e;;0.0 -D;DG;WZ08-68;REAL;2018;104.2;e;;0.0 -D;DG;WZ08-68;REAL;2019;105.8;e;;0.0 -D;DG;WZ08-68;REAL;2020;77.1;e;;0.0 -D;DG;WZ08-68;REAL;2021;85.1;p;;0.0 -D;DG;WZ08-68;REAL;2022;88.5;p;;0.0 -D;DG;WZ08-69-01;NOMINAL;2015;100.0;e;;0.0 -D;DG;WZ08-69-01;NOMINAL;2016;105.5;e;;0.0 -D;DG;WZ08-69-01;NOMINAL;2017;109.5;e;;0.0 -D;DG;WZ08-69-01;NOMINAL;2018;115.5;e;;0.0 -D;DG;WZ08-69-01;NOMINAL;2019;119.1;e;;0.0 -D;DG;WZ08-69-01;NOMINAL;2020;121.0;e;;0.0 -D;DG;WZ08-69-01;NOMINAL;2021;129.6;p;;0.0 -D;DG;WZ08-69-01;NOMINAL;2022;140.7;p;;0.0 -D;DG;WZ08-69-01;REAL;2015;100.0;e;;0.0 -D;DG;WZ08-69-01;REAL;2016;104.5;e;;0.0 -D;DG;WZ08-69-01;REAL;2017;107.5;e;;0.0 -D;DG;WZ08-69-01;REAL;2018;112.2;e;;0.0 -D;DG;WZ08-69-01;REAL;2019;114.3;e;;0.0 -D;DG;WZ08-69-01;REAL;2020;114.1;e;;0.0 -D;DG;WZ08-69-01;REAL;2021;119.5;p;;0.0 -D;DG;WZ08-69-01;REAL;2022;127.1;p;;0.0 -D;DG;WZ08-691;NOMINAL;2015;100.0;e;;0.0 -D;DG;WZ08-691;NOMINAL;2016;102.5;e;;0.0 -D;DG;WZ08-691;NOMINAL;2017;105.6;e;;0.0 -D;DG;WZ08-691;NOMINAL;2018;110.5;e;;0.0 -D;DG;WZ08-691;NOMINAL;2019;115.5;e;;0.0 -D;DG;WZ08-691;NOMINAL;2020;117.6;e;;0.0 -D;DG;WZ08-691;NOMINAL;2021;121.0;p;;0.0 -D;DG;WZ08-691;NOMINAL;2022;122.0;p;;0.0 -D;DG;WZ08-691;REAL;2015;100.0;e;;0.0 -D;DG;WZ08-691;REAL;2016;101.7;e;;0.0 -D;DG;WZ08-691;REAL;2017;103.7;e;;0.0 -D;DG;WZ08-691;REAL;2018;107.2;e;;0.0 -D;DG;WZ08-691;REAL;2019;110.8;e;;0.0 -D;DG;WZ08-691;REAL;2020;111.5;e;;0.0 -D;DG;WZ08-691;REAL;2021;109.2;p;;0.0 -D;DG;WZ08-691;REAL;2022;107.8;p;;0.0 -D;DG;WZ08-692;NOMINAL;2015;100.0;e;;0.0 -D;DG;WZ08-692;NOMINAL;2016;103.2;e;;0.0 -D;DG;WZ08-692;NOMINAL;2017;106.5;e;;0.0 -D;DG;WZ08-692;NOMINAL;2018;111.3;e;;0.0 -D;DG;WZ08-692;NOMINAL;2019;117.1;e;;0.0 -D;DG;WZ08-692;NOMINAL;2020;123.6;e;;0.0 -D;DG;WZ08-692;NOMINAL;2021;130.0;p;;0.0 -D;DG;WZ08-692;NOMINAL;2022;141.6;p;;0.0 -D;DG;WZ08-692;REAL;2015;100.0;e;;0.0 -D;DG;WZ08-692;REAL;2016;101.9;e;;0.0 -D;DG;WZ08-692;REAL;2017;104.3;e;;0.0 -D;DG;WZ08-692;REAL;2018;107.2;e;;0.0 -D;DG;WZ08-692;REAL;2019;111.3;e;;0.0 -D;DG;WZ08-692;REAL;2020;113.1;e;;0.0 -D;DG;WZ08-692;REAL;2021;116.5;p;;0.0 -D;DG;WZ08-692;REAL;2022;123.4;p;;0.0 -D;DG;WZ08-69;NOMINAL;2015;100.0;e;;0.0 -D;DG;WZ08-69;NOMINAL;2016;102.9;e;;0.0 -D;DG;WZ08-69;NOMINAL;2017;106.1;e;;0.0 -D;DG;WZ08-69;NOMINAL;2018;110.9;e;;0.0 -D;DG;WZ08-69;NOMINAL;2019;116.4;e;;0.0 -D;DG;WZ08-69;NOMINAL;2020;121.0;e;;0.0 -D;DG;WZ08-69;NOMINAL;2021;126.0;p;;0.0 -D;DG;WZ08-69;NOMINAL;2022;132.9;p;;0.0 -D;DG;WZ08-69;REAL;2015;100.0;e;;0.0 -D;DG;WZ08-69;REAL;2016;101.8;e;;0.0 -D;DG;WZ08-69;REAL;2017;104.0;e;;0.0 -D;DG;WZ08-69;REAL;2018;107.2;e;;0.0 -D;DG;WZ08-69;REAL;2019;111.1;e;;0.0 -D;DG;WZ08-69;REAL;2020;112.4;e;;0.0 -D;DG;WZ08-69;REAL;2021;113.2;p;;0.0 -D;DG;WZ08-69;REAL;2022;116.4;p;;0.0 -D;DG;WZ08-7021;NOMINAL;2015;100.0;e;;0.0 -D;DG;WZ08-7021;NOMINAL;2016;112.6;e;;0.0 -D;DG;WZ08-7021;NOMINAL;2017;105.6;e;;0.0 -D;DG;WZ08-7021;NOMINAL;2018;110.4;e;;0.0 -D;DG;WZ08-7021;NOMINAL;2019;114.1;e;;0.0 -D;DG;WZ08-7021;NOMINAL;2020;110.8;e;;0.0 -D;DG;WZ08-7021;NOMINAL;2021;116.9;p;;0.0 -D;DG;WZ08-7021;NOMINAL;2022;130.4;p;;0.0 -D;DG;WZ08-7022;NOMINAL;2015;100.0;e;;0.0 -D;DG;WZ08-7022;NOMINAL;2016;109.7;e;;0.0 -D;DG;WZ08-7022;NOMINAL;2017;115.7;e;;0.0 -D;DG;WZ08-7022;NOMINAL;2018;123.9;e;;0.0 -D;DG;WZ08-7022;NOMINAL;2019;124.0;e;;0.0 -D;DG;WZ08-7022;NOMINAL;2020;121.7;e;;0.0 -D;DG;WZ08-7022;NOMINAL;2021;136.5;p;;0.0 -D;DG;WZ08-7022;NOMINAL;2022;155.2;p;;0.0 -D;DG;WZ08-702;NOMINAL;2015;100.0;e;;0.0 -D;DG;WZ08-702;NOMINAL;2016;109.8;e;;0.0 -D;DG;WZ08-702;NOMINAL;2017;115.2;e;;0.0 -D;DG;WZ08-702;NOMINAL;2018;123.2;e;;0.0 -D;DG;WZ08-702;NOMINAL;2019;123.6;e;;0.0 -D;DG;WZ08-702;NOMINAL;2020;121.2;e;;0.0 -D;DG;WZ08-702;NOMINAL;2021;135.5;p;;0.0 -D;DG;WZ08-702;NOMINAL;2022;154.0;p;;0.0 -D;DG;WZ08-702;REAL;2015;100.0;e;;0.0 -D;DG;WZ08-702;REAL;2016;109.2;e;;0.0 -D;DG;WZ08-702;REAL;2017;113.5;e;;0.0 -D;DG;WZ08-702;REAL;2018;120.7;e;;0.0 -D;DG;WZ08-702;REAL;2019;119.7;e;;0.0 -D;DG;WZ08-702;REAL;2020;116.9;e;;0.0 -D;DG;WZ08-702;REAL;2021;130.0;p;;0.0 -D;DG;WZ08-702;REAL;2022;144.9;p;;0.0 -D;DG;WZ08-70;NOMINAL;2015;100.0;e;;0.0 -D;DG;WZ08-70;NOMINAL;2016;109.8;e;;0.0 -D;DG;WZ08-70;NOMINAL;2017;115.2;e;;0.0 -D;DG;WZ08-70;NOMINAL;2018;123.2;e;;0.0 -D;DG;WZ08-70;NOMINAL;2019;123.6;e;;0.0 -D;DG;WZ08-70;NOMINAL;2020;121.2;e;;0.0 -D;DG;WZ08-70;NOMINAL;2021;135.5;p;;0.0 -D;DG;WZ08-70;NOMINAL;2022;154.0;p;;0.0 -D;DG;WZ08-70;REAL;2015;100.0;e;;0.0 -D;DG;WZ08-70;REAL;2016;109.2;e;;0.0 -D;DG;WZ08-70;REAL;2017;113.5;e;;0.0 -D;DG;WZ08-70;REAL;2018;120.7;e;;0.0 -D;DG;WZ08-70;REAL;2019;119.7;e;;0.0 -D;DG;WZ08-70;REAL;2020;116.9;e;;0.0 -D;DG;WZ08-70;REAL;2021;130.0;p;;0.0 -D;DG;WZ08-70;REAL;2022;144.9;p;;0.0 -D;DG;WZ08-71-01;NOMINAL;2015;100.0;e;;0.0 -D;DG;WZ08-71-01;NOMINAL;2016;106.0;e;;0.0 -D;DG;WZ08-71-01;NOMINAL;2017;113.9;e;;0.0 -D;DG;WZ08-71-01;NOMINAL;2018;118.1;e;;0.0 -D;DG;WZ08-71-01;NOMINAL;2019;122.1;e;;0.0 -D;DG;WZ08-71-01;NOMINAL;2020;101.9;e;;0.0 -D;DG;WZ08-71-01;NOMINAL;2021;109.4;p;;0.0 -D;DG;WZ08-71-01;NOMINAL;2022;130.1;p;;0.0 -D;DG;WZ08-71-01;REAL;2015;100.0;e;;0.0 -D;DG;WZ08-71-01;REAL;2016;104.6;e;;0.0 -D;DG;WZ08-71-01;REAL;2017;110.7;e;;0.0 -D;DG;WZ08-71-01;REAL;2018;112.5;e;;0.0 -D;DG;WZ08-71-01;REAL;2019;114.3;e;;0.0 -D;DG;WZ08-71-01;REAL;2020;94.6;e;;0.0 -D;DG;WZ08-71-01;REAL;2021;98.4;p;;0.0 -D;DG;WZ08-71-01;REAL;2022;111.8;p;;0.0 -D;DG;WZ08-7111;NOMINAL;2015;100.0;e;;0.0 -D;DG;WZ08-7111;NOMINAL;2016;106.7;e;;0.0 -D;DG;WZ08-7111;NOMINAL;2017;118.6;e;;0.0 -D;DG;WZ08-7111;NOMINAL;2018;124.9;e;;0.0 -D;DG;WZ08-7111;NOMINAL;2019;132.9;e;;0.0 -D;DG;WZ08-7111;NOMINAL;2020;133.2;e;;0.0 -D;DG;WZ08-7111;NOMINAL;2021;135.6;p;;0.0 -D;DG;WZ08-7111;NOMINAL;2022;146.3;p;;0.0 -D;DG;WZ08-7112;NOMINAL;2015;100.0;e;;0.0 -D;DG;WZ08-7112;NOMINAL;2016;99.9;e;;0.0 -D;DG;WZ08-7112;NOMINAL;2017;102.7;e;;0.0 -D;DG;WZ08-7112;NOMINAL;2018;101.3;e;;0.0 -D;DG;WZ08-7112;NOMINAL;2019;107.9;e;;0.0 -D;DG;WZ08-7112;NOMINAL;2020;108.8;e;;0.0 -D;DG;WZ08-7112;NOMINAL;2021;110.8;p;;0.0 -D;DG;WZ08-7112;NOMINAL;2022;126.3;p;;0.0 -D;DG;WZ08-711;NOMINAL;2015;100.0;e;;0.0 -D;DG;WZ08-711;NOMINAL;2016;101.0;e;;0.0 -D;DG;WZ08-711;NOMINAL;2017;105.2;e;;0.0 -D;DG;WZ08-711;NOMINAL;2018;104.9;e;;0.0 -D;DG;WZ08-711;NOMINAL;2019;111.7;e;;0.0 -D;DG;WZ08-711;NOMINAL;2020;112.5;e;;0.0 -D;DG;WZ08-711;NOMINAL;2021;114.7;p;;0.0 -D;DG;WZ08-711;NOMINAL;2022;129.4;p;;0.0 -D;DG;WZ08-711;REAL;2015;100.0;e;;0.0 -D;DG;WZ08-711;REAL;2016;99.8;e;;0.0 -D;DG;WZ08-711;REAL;2017;102.4;e;;0.0 -D;DG;WZ08-711;REAL;2018;100.4;e;;0.0 -D;DG;WZ08-711;REAL;2019;104.8;e;;0.0 -D;DG;WZ08-711;REAL;2020;104.3;e;;0.0 -D;DG;WZ08-711;REAL;2021;103.5;p;;0.0 -D;DG;WZ08-711;REAL;2022;110.1;p;;0.0 -D;DG;WZ08-712;NOMINAL;2015;100.0;e;;0.0 -D;DG;WZ08-712;NOMINAL;2016;106.1;e;;0.0 -D;DG;WZ08-712;NOMINAL;2017;107.2;e;;0.0 -D;DG;WZ08-712;NOMINAL;2018;105.8;e;;0.0 -D;DG;WZ08-712;NOMINAL;2019;109.7;e;;0.0 -D;DG;WZ08-712;NOMINAL;2020;112.1;e;;0.0 -D;DG;WZ08-712;NOMINAL;2021;116.7;p;;0.0 -D;DG;WZ08-712;NOMINAL;2022;122.5;p;;0.0 -D;DG;WZ08-712;REAL;2015;100.0;e;;0.0 -D;DG;WZ08-712;REAL;2016;105.2;e;;0.0 -D;DG;WZ08-712;REAL;2017;106.7;e;;0.0 -D;DG;WZ08-712;REAL;2018;102.8;e;;0.0 -D;DG;WZ08-712;REAL;2019;104.5;e;;0.0 -D;DG;WZ08-712;REAL;2020;103.8;e;;0.0 -D;DG;WZ08-712;REAL;2021;106.0;p;;0.0 -D;DG;WZ08-712;REAL;2022;106.5;p;;0.0 -D;DG;WZ08-71;NOMINAL;2015;100.0;e;;0.0 -D;DG;WZ08-71;NOMINAL;2016;101.7;e;;0.0 -D;DG;WZ08-71;NOMINAL;2017;105.4;e;;0.0 -D;DG;WZ08-71;NOMINAL;2018;105.0;e;;0.0 -D;DG;WZ08-71;NOMINAL;2019;111.5;e;;0.0 -D;DG;WZ08-71;NOMINAL;2020;112.5;e;;0.0 -D;DG;WZ08-71;NOMINAL;2021;114.9;p;;0.0 -D;DG;WZ08-71;NOMINAL;2022;128.4;p;;0.0 -D;DG;WZ08-71;REAL;2015;100.0;e;;0.0 -D;DG;WZ08-71;REAL;2016;100.6;e;;0.0 -D;DG;WZ08-71;REAL;2017;102.9;e;;0.0 -D;DG;WZ08-71;REAL;2018;100.7;e;;0.0 -D;DG;WZ08-71;REAL;2019;104.8;e;;0.0 -D;DG;WZ08-71;REAL;2020;104.3;e;;0.0 -D;DG;WZ08-71;REAL;2021;103.9;p;;0.0 -D;DG;WZ08-71;REAL;2022;109.6;p;;0.0 -D;DG;WZ08-7311;NOMINAL;2015;100.0;e;;0.0 -D;DG;WZ08-7311;NOMINAL;2016;102.6;e;;0.0 -D;DG;WZ08-7311;NOMINAL;2017;98.8;e;;0.0 -D;DG;WZ08-7311;NOMINAL;2018;102.0;e;;0.0 -D;DG;WZ08-7311;NOMINAL;2019;104.2;e;;0.0 -D;DG;WZ08-7311;NOMINAL;2020;90.8;e;;0.0 -D;DG;WZ08-7311;NOMINAL;2021;99.9;p;;0.0 -D;DG;WZ08-7311;NOMINAL;2022;111.5;p;;0.0 -D;DG;WZ08-7312;NOMINAL;2015;100.0;e;;0.0 -D;DG;WZ08-7312;NOMINAL;2016;114.0;e;;0.0 -D;DG;WZ08-7312;NOMINAL;2017;112.7;e;;0.0 -D;DG;WZ08-7312;NOMINAL;2018;118.6;e;;0.0 -D;DG;WZ08-7312;NOMINAL;2019;122.8;e;;0.0 -D;DG;WZ08-7312;NOMINAL;2020;114.1;e;;0.0 -D;DG;WZ08-7312;NOMINAL;2021;139.3;p;;0.0 -D;DG;WZ08-7312;NOMINAL;2022;146.8;p;;0.0 -D;DG;WZ08-731;NOMINAL;2015;100.0;e;;0.0 -D;DG;WZ08-731;NOMINAL;2016;106.6;e;;0.0 -D;DG;WZ08-731;NOMINAL;2017;103.8;e;;0.0 -D;DG;WZ08-731;NOMINAL;2018;107.9;e;;0.0 -D;DG;WZ08-731;NOMINAL;2019;110.8;e;;0.0 -D;DG;WZ08-731;NOMINAL;2020;99.0;e;;0.0 -D;DG;WZ08-731;NOMINAL;2021;113.9;p;;0.0 -D;DG;WZ08-731;NOMINAL;2022;124.0;p;;0.0 -D;DG;WZ08-731;REAL;2015;100.0;e;;0.0 -D;DG;WZ08-731;REAL;2016;104.1;e;;0.0 -D;DG;WZ08-731;REAL;2017;99.4;e;;0.0 -D;DG;WZ08-731;REAL;2018;100.7;e;;0.0 -D;DG;WZ08-731;REAL;2019;102.3;e;;0.0 -D;DG;WZ08-731;REAL;2020;91.0;e;;0.0 -D;DG;WZ08-731;REAL;2021;101.2;p;;0.0 -D;DG;WZ08-731;REAL;2022;107.1;p;;0.0 -D;DG;WZ08-732;NOMINAL;2015;100.0;e;;0.0 -D;DG;WZ08-732;NOMINAL;2016;103.1;e;;0.0 -D;DG;WZ08-732;NOMINAL;2017;109.0;e;;0.0 -D;DG;WZ08-732;NOMINAL;2018;109.2;e;;0.0 -D;DG;WZ08-732;NOMINAL;2019;106.1;e;;0.0 -D;DG;WZ08-732;NOMINAL;2020;96.4;e;;0.0 -D;DG;WZ08-732;NOMINAL;2021;110.4;p;;0.0 -D;DG;WZ08-732;NOMINAL;2022;120.3;p;;0.0 -D;DG;WZ08-732;REAL;2015;100.0;e;;0.0 -D;DG;WZ08-732;REAL;2016;102.5;e;;0.0 -D;DG;WZ08-732;REAL;2017;108.1;e;;0.0 -D;DG;WZ08-732;REAL;2018;108.2;e;;0.0 -D;DG;WZ08-732;REAL;2019;104.6;e;;0.0 -D;DG;WZ08-732;REAL;2020;94.7;e;;0.0 -D;DG;WZ08-732;REAL;2021;107.7;p;;0.0 -D;DG;WZ08-732;REAL;2022;114.7;p;;0.0 -D;DG;WZ08-73;NOMINAL;2015;100.0;e;;0.0 -D;DG;WZ08-73;NOMINAL;2016;106.3;e;;0.0 -D;DG;WZ08-73;NOMINAL;2017;104.2;e;;0.0 -D;DG;WZ08-73;NOMINAL;2018;108.0;e;;0.0 -D;DG;WZ08-73;NOMINAL;2019;110.4;e;;0.0 -D;DG;WZ08-73;NOMINAL;2020;98.8;e;;0.0 -D;DG;WZ08-73;NOMINAL;2021;113.6;p;;0.0 -D;DG;WZ08-73;NOMINAL;2022;123.7;p;;0.0 -D;DG;WZ08-73;REAL;2015;100.0;e;;0.0 -D;DG;WZ08-73;REAL;2016;103.9;e;;0.0 -D;DG;WZ08-73;REAL;2017;100.1;e;;0.0 -D;DG;WZ08-73;REAL;2018;101.3;e;;0.0 -D;DG;WZ08-73;REAL;2019;102.5;e;;0.0 -D;DG;WZ08-73;REAL;2020;91.3;e;;0.0 -D;DG;WZ08-73;REAL;2021;101.7;p;;0.0 -D;DG;WZ08-73;REAL;2022;107.7;p;;0.0 -D;DG;WZ08-741;NOMINAL;2015;100.0;e;;0.0 -D;DG;WZ08-741;NOMINAL;2016;104.5;e;;0.0 -D;DG;WZ08-741;NOMINAL;2017;111.2;e;;0.0 -D;DG;WZ08-741;NOMINAL;2018;118.3;e;;0.0 -D;DG;WZ08-741;NOMINAL;2019;126.1;e;;0.0 -D;DG;WZ08-741;NOMINAL;2020;113.5;e;;0.0 -D;DG;WZ08-741;NOMINAL;2021;127.8;p;;0.0 -D;DG;WZ08-741;NOMINAL;2022;141.9;p;;0.0 -D;DG;WZ08-741;REAL;2015;100.0;e;;0.0 -D;DG;WZ08-741;REAL;2016;104.5;e;;0.0 -D;DG;WZ08-741;REAL;2017;111.0;e;;0.0 -D;DG;WZ08-741;REAL;2018;114.6;e;;0.0 -D;DG;WZ08-741;REAL;2019;121.4;e;;0.0 -D;DG;WZ08-741;REAL;2020;108.3;e;;0.0 -D;DG;WZ08-741;REAL;2021;117.2;p;;0.0 -D;DG;WZ08-741;REAL;2022;128.6;p;;0.0 -D;DG;WZ08-742;NOMINAL;2015;100.0;e;;0.0 -D;DG;WZ08-742;NOMINAL;2016;101.2;e;;0.0 -D;DG;WZ08-742;NOMINAL;2017;105.6;e;;0.0 -D;DG;WZ08-742;NOMINAL;2018;105.4;e;;0.0 -D;DG;WZ08-742;NOMINAL;2019;109.4;e;;0.0 -D;DG;WZ08-742;NOMINAL;2020;97.7;e;;0.0 -D;DG;WZ08-742;NOMINAL;2021;102.4;p;;0.0 -D;DG;WZ08-742;NOMINAL;2022;104.8;p;;0.0 -D;DG;WZ08-742;REAL;2015;100.0;e;;0.0 -D;DG;WZ08-742;REAL;2016;101.3;e;;0.0 -D;DG;WZ08-742;REAL;2017;105.2;e;;0.0 -D;DG;WZ08-742;REAL;2018;102.1;e;;0.0 -D;DG;WZ08-742;REAL;2019;105.3;e;;0.0 -D;DG;WZ08-742;REAL;2020;93.0;e;;0.0 -D;DG;WZ08-742;REAL;2021;93.8;p;;0.0 -D;DG;WZ08-742;REAL;2022;94.9;p;;0.0 -D;DG;WZ08-743;NOMINAL;2015;100.0;e;;0.0 -D;DG;WZ08-743;NOMINAL;2016;110.5;e;;0.0 -D;DG;WZ08-743;NOMINAL;2017;117.3;e;;0.0 -D;DG;WZ08-743;NOMINAL;2018;117.7;e;;0.0 -D;DG;WZ08-743;NOMINAL;2019;109.4;e;;0.0 -D;DG;WZ08-743;NOMINAL;2020;99.9;e;;0.0 -D;DG;WZ08-743;NOMINAL;2021;106.4;p;;0.0 -D;DG;WZ08-743;NOMINAL;2022;110.0;p;;0.0 -D;DG;WZ08-743;REAL;2015;100.0;e;;0.0 -D;DG;WZ08-743;REAL;2016;109.1;e;;0.0 -D;DG;WZ08-743;REAL;2017;114.1;e;;0.0 -D;DG;WZ08-743;REAL;2018;112.7;e;;0.0 -D;DG;WZ08-743;REAL;2019;103.3;e;;0.0 -D;DG;WZ08-743;REAL;2020;93.8;e;;0.0 -D;DG;WZ08-743;REAL;2021;94.2;p;;0.0 -D;DG;WZ08-743;REAL;2022;94.9;p;;0.0 -D;DG;WZ08-749;NOMINAL;2015;100.0;e;;0.0 -D;DG;WZ08-749;NOMINAL;2016;105.4;e;;0.0 -D;DG;WZ08-749;NOMINAL;2017;99.4;e;;0.0 -D;DG;WZ08-749;NOMINAL;2018;98.8;e;;0.0 -D;DG;WZ08-749;NOMINAL;2019;99.9;e;;0.0 -D;DG;WZ08-749;NOMINAL;2020;105.6;e;;0.0 -D;DG;WZ08-749;NOMINAL;2021;122.8;p;;0.0 -D;DG;WZ08-749;NOMINAL;2022;142.4;p;;0.0 -D;DG;WZ08-749;REAL;2015;100.0;e;;0.0 -D;DG;WZ08-749;REAL;2016;104.6;e;;0.0 -D;DG;WZ08-749;REAL;2017;98.0;e;;0.0 -D;DG;WZ08-749;REAL;2018;96.3;e;;0.0 -D;DG;WZ08-749;REAL;2019;96.4;e;;0.0 -D;DG;WZ08-749;REAL;2020;102.6;e;;0.0 -D;DG;WZ08-749;REAL;2021;107.9;p;;0.0 -D;DG;WZ08-749;REAL;2022;123.3;p;;0.0 -D;DG;WZ08-74;NOMINAL;2015;100.0;e;;0.0 -D;DG;WZ08-74;NOMINAL;2016;105.1;e;;0.0 -D;DG;WZ08-74;NOMINAL;2017;102.8;e;;0.0 -D;DG;WZ08-74;NOMINAL;2018;103.4;e;;0.0 -D;DG;WZ08-74;NOMINAL;2019;105.4;e;;0.0 -D;DG;WZ08-74;NOMINAL;2020;105.9;e;;0.0 -D;DG;WZ08-74;NOMINAL;2021;121.0;p;;0.0 -D;DG;WZ08-74;NOMINAL;2022;137.4;p;;0.0 -D;DG;WZ08-74;REAL;2015;100.0;e;;0.0 -D;DG;WZ08-74;REAL;2016;104.5;e;;0.0 -D;DG;WZ08-74;REAL;2017;101.5;e;;0.0 -D;DG;WZ08-74;REAL;2018;100.6;e;;0.0 -D;DG;WZ08-74;REAL;2019;101.6;e;;0.0 -D;DG;WZ08-74;REAL;2020;102.2;e;;0.0 -D;DG;WZ08-74;REAL;2021;107.5;p;;0.0 -D;DG;WZ08-74;REAL;2022;120.2;p;;0.0 -D;DG;WZ08-7711;NOMINAL;2015;100.0;e;;0.0 -D;DG;WZ08-7711;NOMINAL;2016;114.8;e;;0.0 -D;DG;WZ08-7711;NOMINAL;2017;111.2;e;;0.0 -D;DG;WZ08-7711;NOMINAL;2018;120.3;e;;0.0 -D;DG;WZ08-7711;NOMINAL;2019;139.9;e;;0.0 -D;DG;WZ08-7711;NOMINAL;2020;133.4;e;;0.0 -D;DG;WZ08-7711;NOMINAL;2021;204.6;p;;0.0 -D;DG;WZ08-7711;NOMINAL;2022;223.6;p;;0.0 -D;DG;WZ08-7712;NOMINAL;2015;100.0;e;;0.0 -D;DG;WZ08-7712;NOMINAL;2016;99.1;e;;0.0 -D;DG;WZ08-7712;NOMINAL;2017;103.1;e;;0.0 -D;DG;WZ08-7712;NOMINAL;2018;108.3;e;;0.0 -D;DG;WZ08-7712;NOMINAL;2019;125.8;e;;0.0 -D;DG;WZ08-7712;NOMINAL;2020;121.2;e;;0.0 -D;DG;WZ08-7712;NOMINAL;2021;141.8;p;;0.0 -D;DG;WZ08-7712;NOMINAL;2022;155.9;p;;0.0 -D;DG;WZ08-771;NOMINAL;2015;100.0;e;;0.0 -D;DG;WZ08-771;NOMINAL;2016;112.6;e;;0.0 -D;DG;WZ08-771;NOMINAL;2017;110.0;e;;0.0 -D;DG;WZ08-771;NOMINAL;2018;118.6;e;;0.0 -D;DG;WZ08-771;NOMINAL;2019;137.9;e;;0.0 -D;DG;WZ08-771;NOMINAL;2020;131.7;e;;0.0 -D;DG;WZ08-771;NOMINAL;2021;195.8;p;;0.0 -D;DG;WZ08-771;NOMINAL;2022;214.1;p;;0.0 -D;DG;WZ08-771;REAL;2015;100.0;e;;0.0 -D;DG;WZ08-771;REAL;2016;111.0;e;;0.0 -D;DG;WZ08-771;REAL;2017;106.9;e;;0.0 -D;DG;WZ08-771;REAL;2018;113.2;e;;0.0 -D;DG;WZ08-771;REAL;2019;128.9;e;;0.0 -D;DG;WZ08-771;REAL;2020;122.1;e;;0.0 -D;DG;WZ08-771;REAL;2021;174.1;p;;0.0 -D;DG;WZ08-771;REAL;2022;174.8;p;;0.0 -D;DG;WZ08-7721;NOMINAL;2015;100.0;e;;0.0 -D;DG;WZ08-7721;NOMINAL;2016;84.2;e;;0.0 -D;DG;WZ08-7721;NOMINAL;2017;129.1;e;;0.0 -D;DG;WZ08-7721;NOMINAL;2018;175.7;e;;0.0 -D;DG;WZ08-7721;NOMINAL;2019;276.9;e;;0.0 -D;DG;WZ08-7721;NOMINAL;2020;267.2;e;;0.0 -D;DG;WZ08-7721;NOMINAL;2021;415.2;p;;0.0 -D;DG;WZ08-7721;NOMINAL;2022;529.7;p;;0.0 -D;DG;WZ08-7722;NOMINAL;2015;100.0;e;;0.0 -D;DG;WZ08-7722;NOMINAL;2016;116.8;e;;0.0 -D;DG;WZ08-7722;NOMINAL;2017;228.0;e;;0.0 -D;DG;WZ08-7722;NOMINAL;2018;58.0;e;;0.0 -D;DG;WZ08-7722;NOMINAL;2019;51.9;e;;0.0 -D;DG;WZ08-7722;NOMINAL;2020;27.1;e;;0.0 -D;DG;WZ08-7722;NOMINAL;2021;18.4;p;;0.0 -D;DG;WZ08-7722;NOMINAL;2022;18.1;p;;0.0 -D;DG;WZ08-7729;NOMINAL;2015;100.0;e;;0.0 -D;DG;WZ08-7729;NOMINAL;2016;112.1;e;;0.0 -D;DG;WZ08-7729;NOMINAL;2017;115.9;e;;0.0 -D;DG;WZ08-7729;NOMINAL;2018;123.3;e;;0.0 -D;DG;WZ08-7729;NOMINAL;2019;134.3;e;;0.0 -D;DG;WZ08-7729;NOMINAL;2020;149.0;e;;0.0 -D;DG;WZ08-7729;NOMINAL;2021;188.2;p;;0.0 -D;DG;WZ08-7729;NOMINAL;2022;226.6;p;;0.0 -D;DG;WZ08-772;NOMINAL;2015;100.0;e;;0.0 -D;DG;WZ08-772;NOMINAL;2016;111.3;e;;0.0 -D;DG;WZ08-772;NOMINAL;2017;127.4;e;;0.0 -D;DG;WZ08-772;NOMINAL;2018;119.4;e;;0.0 -D;DG;WZ08-772;NOMINAL;2019;132.9;e;;0.0 -D;DG;WZ08-772;NOMINAL;2020;142.6;e;;0.0 -D;DG;WZ08-772;NOMINAL;2021;182.2;p;;0.0 -D;DG;WZ08-772;NOMINAL;2022;220.4;p;;0.0 -D;DG;WZ08-772;REAL;2015;100.0;e;;0.0 -D;DG;WZ08-772;REAL;2016;109.8;e;;0.0 -D;DG;WZ08-772;REAL;2017;124.7;e;;0.0 -D;DG;WZ08-772;REAL;2018;115.0;e;;0.0 -D;DG;WZ08-772;REAL;2019;127.0;e;;0.0 -D;DG;WZ08-772;REAL;2020;134.8;e;;0.0 -D;DG;WZ08-772;REAL;2021;167.1;p;;0.0 -D;DG;WZ08-772;REAL;2022;193.0;p;;0.0 -D;DG;WZ08-7731;NOMINAL;2015;100.0;e;;0.0 -D;DG;WZ08-7731;NOMINAL;2016;59.7;e;;0.0 -D;DG;WZ08-7731;NOMINAL;2017;61.6;e;;0.0 -D;DG;WZ08-7731;NOMINAL;2018;59.1;e;;0.0 -D;DG;WZ08-7731;NOMINAL;2019;57.5;e;;0.0 -D;DG;WZ08-7731;NOMINAL;2020;72.6;e;;0.0 -D;DG;WZ08-7731;NOMINAL;2021;103.7;p;;0.0 -D;DG;WZ08-7731;NOMINAL;2022;106.7;p;;0.0 -D;DG;WZ08-7732;NOMINAL;2015;100.0;e;;0.0 -D;DG;WZ08-7732;NOMINAL;2016;102.4;e;;0.0 -D;DG;WZ08-7732;NOMINAL;2017;112.3;e;;0.0 -D;DG;WZ08-7732;NOMINAL;2018;120.2;e;;0.0 -D;DG;WZ08-7732;NOMINAL;2019;152.4;e;;0.0 -D;DG;WZ08-7732;NOMINAL;2020;160.9;e;;0.0 -D;DG;WZ08-7732;NOMINAL;2021;180.1;p;;0.0 -D;DG;WZ08-7732;NOMINAL;2022;193.7;p;;0.0 -D;DG;WZ08-7733;NOMINAL;2015;100.0;e;;0.0 -D;DG;WZ08-7733;NOMINAL;2016;97.2;e;;0.0 -D;DG;WZ08-7733;NOMINAL;2017;102.0;e;;0.0 -D;DG;WZ08-7733;NOMINAL;2018;112.8;e;;0.0 -D;DG;WZ08-7733;NOMINAL;2019;142.9;e;;0.0 -D;DG;WZ08-7733;NOMINAL;2020;128.2;e;;0.0 -D;DG;WZ08-7733;NOMINAL;2021;121.7;p;;0.0 -D;DG;WZ08-7733;NOMINAL;2022;134.2;p;;0.0 -D;DG;WZ08-7734;NOMINAL;2015;100.0;e;;0.0 -D;DG;WZ08-7734;NOMINAL;2016;47.3;e;;0.0 -D;DG;WZ08-7734;NOMINAL;2017;55.1;e;;0.0 -D;DG;WZ08-7734;NOMINAL;2018;50.3;e;;0.0 -D;DG;WZ08-7734;NOMINAL;2019;48.6;e;;0.0 -D;DG;WZ08-7734;NOMINAL;2020;87.2;e;;0.0 -D;DG;WZ08-7734;NOMINAL;2021;63.3;p;;0.0 -D;DG;WZ08-7734;NOMINAL;2022;64.5;p;;0.0 -D;DG;WZ08-7735;NOMINAL;2015;100.0;e;;0.0 -D;DG;WZ08-7735;NOMINAL;2016;66.5;e;;0.0 -D;DG;WZ08-7735;NOMINAL;2017;84.9;e;;0.0 -D;DG;WZ08-7735;NOMINAL;2018;200.4;e;;0.0 -D;DG;WZ08-7735;NOMINAL;2019;129.9;e;;0.0 -D;DG;WZ08-7735;NOMINAL;2020;45.5;e;;0.0 -D;DG;WZ08-7735;NOMINAL;2021;80.6;p;;0.0 -D;DG;WZ08-7735;NOMINAL;2022;53.5;p;;0.0 -D;DG;WZ08-7739;NOMINAL;2015;100.0;e;;0.0 -D;DG;WZ08-7739;NOMINAL;2016;108.8;e;;0.0 -D;DG;WZ08-7739;NOMINAL;2017;115.0;e;;0.0 -D;DG;WZ08-7739;NOMINAL;2018;114.4;e;;0.0 -D;DG;WZ08-7739;NOMINAL;2019;128.6;e;;0.0 -D;DG;WZ08-7739;NOMINAL;2020;132.2;e;;0.0 -D;DG;WZ08-7739;NOMINAL;2021;203.3;p;;0.0 -D;DG;WZ08-7739;NOMINAL;2022;225.4;p;;0.0 -D;DG;WZ08-773;NOMINAL;2015;100.0;e;;0.0 -D;DG;WZ08-773;NOMINAL;2016;99.6;e;;0.0 -D;DG;WZ08-773;NOMINAL;2017;106.9;e;;0.0 -D;DG;WZ08-773;NOMINAL;2018;114.8;e;;0.0 -D;DG;WZ08-773;NOMINAL;2019;130.7;e;;0.0 -D;DG;WZ08-773;NOMINAL;2020;130.5;e;;0.0 -D;DG;WZ08-773;NOMINAL;2021;171.6;p;;0.0 -D;DG;WZ08-773;NOMINAL;2022;186.6;p;;0.0 -D;DG;WZ08-773;REAL;2015;100.0;e;;0.0 -D;DG;WZ08-773;REAL;2016;99.8;e;;0.0 -D;DG;WZ08-773;REAL;2017;106.6;e;;0.0 -D;DG;WZ08-773;REAL;2018;113.9;e;;0.0 -D;DG;WZ08-773;REAL;2019;129.8;e;;0.0 -D;DG;WZ08-773;REAL;2020;130.7;e;;0.0 -D;DG;WZ08-773;REAL;2021;168.8;p;;0.0 -D;DG;WZ08-773;REAL;2022;175.9;p;;0.0 -D;DG;WZ08-774;NOMINAL;2015;100.0;e;;0.0 -D;DG;WZ08-774;NOMINAL;2016;107.1;e;;0.0 -D;DG;WZ08-774;NOMINAL;2017;122.0;e;;0.0 -D;DG;WZ08-774;NOMINAL;2018;127.9;e;;0.0 -D;DG;WZ08-774;NOMINAL;2019;98.4;e;;0.0 -D;DG;WZ08-774;NOMINAL;2020;48.9;e;;0.0 -D;DG;WZ08-774;NOMINAL;2021;51.2;p;;0.0 -D;DG;WZ08-774;NOMINAL;2022;56.7;p;;0.0 -D;DG;WZ08-774;REAL;2015;100.0;e;;0.0 -D;DG;WZ08-774;REAL;2016;104.8;e;;0.0 -D;DG;WZ08-774;REAL;2017;118.4;e;;0.0 -D;DG;WZ08-774;REAL;2018;123.3;e;;0.0 -D;DG;WZ08-774;REAL;2019;94.3;e;;0.0 -D;DG;WZ08-774;REAL;2020;46.5;e;;0.0 -D;DG;WZ08-774;REAL;2021;48.0;p;;0.0 -D;DG;WZ08-774;REAL;2022;51.7;p;;0.0 -D;DG;WZ08-77;NOMINAL;2015;100.0;e;;0.0 -D;DG;WZ08-77;NOMINAL;2016;105.8;e;;0.0 -D;DG;WZ08-77;NOMINAL;2017;112.4;e;;0.0 -D;DG;WZ08-77;NOMINAL;2018;118.4;e;;0.0 -D;DG;WZ08-77;NOMINAL;2019;128.3;e;;0.0 -D;DG;WZ08-77;NOMINAL;2020;120.2;e;;0.0 -D;DG;WZ08-77;NOMINAL;2021;162.1;p;;0.0 -D;DG;WZ08-77;NOMINAL;2022;179.3;p;;0.0 -D;DG;WZ08-77;REAL;2015;100.0;e;;0.0 -D;DG;WZ08-77;REAL;2016;104.9;e;;0.0 -D;DG;WZ08-77;REAL;2017;110.5;e;;0.0 -D;DG;WZ08-77;REAL;2018;115.2;e;;0.0 -D;DG;WZ08-77;REAL;2019;123.9;e;;0.0 -D;DG;WZ08-77;REAL;2020;116.2;e;;0.0 -D;DG;WZ08-77;REAL;2021;152.3;p;;0.0 -D;DG;WZ08-77;REAL;2022;159.2;p;;0.0 -D;DG;WZ08-781;NOMINAL;2015;100.0;e;;0.0 -D;DG;WZ08-781;NOMINAL;2016;114.3;e;;0.0 -D;DG;WZ08-781;NOMINAL;2017;124.6;e;;0.0 -D;DG;WZ08-781;NOMINAL;2018;141.2;e;;0.0 -D;DG;WZ08-781;NOMINAL;2019;141.8;e;;0.0 -D;DG;WZ08-781;NOMINAL;2020;120.7;e;;0.0 -D;DG;WZ08-781;NOMINAL;2021;150.8;p;;0.0 -D;DG;WZ08-781;NOMINAL;2022;175.0;p;;0.0 -D;DG;WZ08-781;REAL;2015;100.0;e;;0.0 -D;DG;WZ08-781;REAL;2016;111.4;e;;0.0 -D;DG;WZ08-781;REAL;2017;118.5;e;;0.0 -D;DG;WZ08-781;REAL;2018;130.0;e;;0.0 -D;DG;WZ08-781;REAL;2019;126.0;e;;0.0 -D;DG;WZ08-781;REAL;2020;108.8;e;;0.0 -D;DG;WZ08-781;REAL;2021;131.3;p;;0.0 -D;DG;WZ08-781;REAL;2022;145.4;p;;0.0 -D;DG;WZ08-782;NOMINAL;2015;100.0;e;;0.0 -D;DG;WZ08-782;NOMINAL;2016;104.0;e;;0.0 -D;DG;WZ08-782;NOMINAL;2017;111.1;e;;0.0 -D;DG;WZ08-782;NOMINAL;2018;112.5;e;;0.0 -D;DG;WZ08-782;NOMINAL;2019;102.8;e;;0.0 -D;DG;WZ08-782;NOMINAL;2020;83.0;e;;0.0 -D;DG;WZ08-782;NOMINAL;2021;95.2;p;;0.0 -D;DG;WZ08-782;NOMINAL;2022;103.1;p;;0.0 -D;DG;WZ08-782;REAL;2015;100.0;e;;0.0 -D;DG;WZ08-782;REAL;2016;101.7;e;;0.0 -D;DG;WZ08-782;REAL;2017;106.1;e;;0.0 -D;DG;WZ08-782;REAL;2018;104.3;e;;0.0 -D;DG;WZ08-782;REAL;2019;92.7;e;;0.0 -D;DG;WZ08-782;REAL;2020;72.9;e;;0.0 -D;DG;WZ08-782;REAL;2021;81.3;p;;0.0 -D;DG;WZ08-782;REAL;2022;84.4;p;;0.0 -D;DG;WZ08-783;NOMINAL;2015;100.0;e;;0.0 -D;DG;WZ08-783;NOMINAL;2016;95.9;e;;0.0 -D;DG;WZ08-783;NOMINAL;2017;115.0;e;;0.0 -D;DG;WZ08-783;NOMINAL;2018;93.5;e;;0.0 -D;DG;WZ08-783;NOMINAL;2019;84.4;e;;0.0 -D;DG;WZ08-783;NOMINAL;2020;75.9;e;;0.0 -D;DG;WZ08-783;NOMINAL;2021;83.9;p;;0.0 -D;DG;WZ08-783;NOMINAL;2022;90.9;p;;0.0 -D;DG;WZ08-783;REAL;2015;100.0;e;;0.0 -D;DG;WZ08-783;REAL;2016;93.8;e;;0.0 -D;DG;WZ08-783;REAL;2017;109.8;e;;0.0 -D;DG;WZ08-783;REAL;2018;86.7;e;;0.0 -D;DG;WZ08-783;REAL;2019;76.1;e;;0.0 -D;DG;WZ08-783;REAL;2020;66.8;e;;0.0 -D;DG;WZ08-783;REAL;2021;71.8;p;;0.0 -D;DG;WZ08-783;REAL;2022;74.5;p;;0.0 -D;DG;WZ08-78;NOMINAL;2015;100.0;e;;0.0 -D;DG;WZ08-78;NOMINAL;2016;103.4;e;;0.0 -D;DG;WZ08-78;NOMINAL;2017;112.7;e;;0.0 -D;DG;WZ08-78;NOMINAL;2018;111.4;e;;0.0 -D;DG;WZ08-78;NOMINAL;2019;102.5;e;;0.0 -D;DG;WZ08-78;NOMINAL;2020;84.4;e;;0.0 -D;DG;WZ08-78;NOMINAL;2021;97.2;p;;0.0 -D;DG;WZ08-78;NOMINAL;2022;106.0;p;;0.0 -D;DG;WZ08-78;REAL;2015;100.0;e;;0.0 -D;DG;WZ08-78;REAL;2016;101.1;e;;0.0 -D;DG;WZ08-78;REAL;2017;107.6;e;;0.0 -D;DG;WZ08-78;REAL;2018;103.3;e;;0.0 -D;DG;WZ08-78;REAL;2019;92.4;e;;0.0 -D;DG;WZ08-78;REAL;2020;74.3;e;;0.0 -D;DG;WZ08-78;REAL;2021;83.2;p;;0.0 -D;DG;WZ08-78;REAL;2022;87.0;p;;0.0 -D;DG;WZ08-7911;NOMINAL;2015;100.0;e;;0.0 -D;DG;WZ08-7911;NOMINAL;2016;106.7;e;;0.0 -D;DG;WZ08-7911;NOMINAL;2017;112.0;e;;0.0 -D;DG;WZ08-7911;NOMINAL;2018;114.3;e;;0.0 -D;DG;WZ08-7911;NOMINAL;2019;114.4;e;;0.0 -D;DG;WZ08-7911;NOMINAL;2020;41.6;e;;0.0 -D;DG;WZ08-7911;NOMINAL;2021;50.7;p;;0.0 -D;DG;WZ08-7911;NOMINAL;2022;79.5;p;;0.0 -D;DG;WZ08-7912;NOMINAL;2015;100.0;e;;0.0 -D;DG;WZ08-7912;NOMINAL;2016;97.3;e;;0.0 -D;DG;WZ08-7912;NOMINAL;2017;104.7;e;;0.0 -D;DG;WZ08-7912;NOMINAL;2018;109.5;e;;0.0 -D;DG;WZ08-7912;NOMINAL;2019;111.3;e;;0.0 -D;DG;WZ08-7912;NOMINAL;2020;30.5;e;;0.0 -D;DG;WZ08-7912;NOMINAL;2021;57.0;p;;0.0 -D;DG;WZ08-7912;NOMINAL;2022;122.8;p;;0.0 -D;DG;WZ08-791;NOMINAL;2015;100.0;e;;0.0 -D;DG;WZ08-791;NOMINAL;2016;99.0;e;;0.0 -D;DG;WZ08-791;NOMINAL;2017;106.0;e;;0.0 -D;DG;WZ08-791;NOMINAL;2018;110.3;e;;0.0 -D;DG;WZ08-791;NOMINAL;2019;111.9;e;;0.0 -D;DG;WZ08-791;NOMINAL;2020;32.4;e;;0.0 -D;DG;WZ08-791;NOMINAL;2021;55.9;p;;0.0 -D;DG;WZ08-791;NOMINAL;2022;115.3;p;;0.0 -D;DG;WZ08-791;REAL;2015;100.0;e;;0.0 -D;DG;WZ08-791;REAL;2016;100.7;e;;0.0 -D;DG;WZ08-791;REAL;2017;105.2;e;;0.0 -D;DG;WZ08-791;REAL;2018;106.4;e;;0.0 -D;DG;WZ08-791;REAL;2019;107.6;e;;0.0 -D;DG;WZ08-791;REAL;2020;35.3;e;;0.0 -D;DG;WZ08-791;REAL;2021;51.9;p;;0.0 -D;DG;WZ08-791;REAL;2022;99.6;p;;0.0 -D;DG;WZ08-799;NOMINAL;2015;100.0;e;;0.0 -D;DG;WZ08-799;NOMINAL;2016;109.2;e;;0.0 -D;DG;WZ08-799;NOMINAL;2017;116.3;e;;0.0 -D;DG;WZ08-799;NOMINAL;2018;122.5;e;;0.0 -D;DG;WZ08-799;NOMINAL;2019;113.9;e;;0.0 -D;DG;WZ08-799;NOMINAL;2020;43.4;e;;0.0 -D;DG;WZ08-799;NOMINAL;2021;54.7;p;;0.0 -D;DG;WZ08-799;NOMINAL;2022;94.4;p;;0.0 -D;DG;WZ08-799;REAL;2015;100.0;e;;0.0 -D;DG;WZ08-799;REAL;2016;111.0;e;;0.0 -D;DG;WZ08-799;REAL;2017;116.3;e;;0.0 -D;DG;WZ08-799;REAL;2018;119.3;e;;0.0 -D;DG;WZ08-799;REAL;2019;110.9;e;;0.0 -D;DG;WZ08-799;REAL;2020;46.1;e;;0.0 -D;DG;WZ08-799;REAL;2021;51.4;p;;0.0 -D;DG;WZ08-799;REAL;2022;82.7;p;;0.0 -D;DG;WZ08-79;NOMINAL;2015;100.0;e;;0.0 -D;DG;WZ08-79;NOMINAL;2016;99.5;e;;0.0 -D;DG;WZ08-79;NOMINAL;2017;106.5;e;;0.0 -D;DG;WZ08-79;NOMINAL;2018;110.9;e;;0.0 -D;DG;WZ08-79;NOMINAL;2019;112.0;e;;0.0 -D;DG;WZ08-79;NOMINAL;2020;32.9;e;;0.0 -D;DG;WZ08-79;NOMINAL;2021;55.8;p;;0.0 -D;DG;WZ08-79;NOMINAL;2022;114.3;p;;0.0 -D;DG;WZ08-79;REAL;2015;100.0;e;;0.0 -D;DG;WZ08-79;REAL;2016;101.2;e;;0.0 -D;DG;WZ08-79;REAL;2017;105.8;e;;0.0 -D;DG;WZ08-79;REAL;2018;107.1;e;;0.0 -D;DG;WZ08-79;REAL;2019;107.8;e;;0.0 -D;DG;WZ08-79;REAL;2020;35.8;e;;0.0 -D;DG;WZ08-79;REAL;2021;51.8;p;;0.0 -D;DG;WZ08-79;REAL;2022;98.7;p;;0.0 -D;DG;WZ08-801;NOMINAL;2015;100.0;e;;0.0 -D;DG;WZ08-801;NOMINAL;2016;120.7;e;;0.0 -D;DG;WZ08-801;NOMINAL;2017;115.6;e;;0.0 -D;DG;WZ08-801;NOMINAL;2018;113.4;e;;0.0 -D;DG;WZ08-801;NOMINAL;2019;120.3;e;;0.0 -D;DG;WZ08-801;NOMINAL;2020;128.1;e;;0.0 -D;DG;WZ08-801;NOMINAL;2021;143.0;p;;0.0 -D;DG;WZ08-801;NOMINAL;2022;158.6;p;;0.0 -D;DG;WZ08-801;REAL;2015;100.0;e;;0.0 -D;DG;WZ08-801;REAL;2016;117.6;e;;0.0 -D;DG;WZ08-801;REAL;2017;109.1;e;;0.0 -D;DG;WZ08-801;REAL;2018;104.4;e;;0.0 -D;DG;WZ08-801;REAL;2019;107.2;e;;0.0 -D;DG;WZ08-801;REAL;2020;111.1;e;;0.0 -D;DG;WZ08-801;REAL;2021;121.9;p;;0.0 -D;DG;WZ08-801;REAL;2022;131.4;p;;0.0 -D;DG;WZ08-802;NOMINAL;2015;100.0;e;;0.0 -D;DG;WZ08-802;NOMINAL;2016;111.1;e;;0.0 -D;DG;WZ08-802;NOMINAL;2017;104.0;e;;0.0 -D;DG;WZ08-802;NOMINAL;2018;110.7;e;;0.0 -D;DG;WZ08-802;NOMINAL;2019;114.4;e;;0.0 -D;DG;WZ08-802;NOMINAL;2020;124.0;e;;0.0 -D;DG;WZ08-802;NOMINAL;2021;123.4;p;;0.0 -D;DG;WZ08-802;NOMINAL;2022;135.3;p;;0.0 -D;DG;WZ08-802;REAL;2015;100.0;e;;0.0 -D;DG;WZ08-802;REAL;2016;108.2;e;;0.0 -D;DG;WZ08-802;REAL;2017;98.1;e;;0.0 -D;DG;WZ08-802;REAL;2018;102.0;e;;0.0 -D;DG;WZ08-802;REAL;2019;102.0;e;;0.0 -D;DG;WZ08-802;REAL;2020;107.5;e;;0.0 -D;DG;WZ08-802;REAL;2021;105.2;p;;0.0 -D;DG;WZ08-802;REAL;2022;112.0;p;;0.0 -D;DG;WZ08-803;NOMINAL;2015;100.0;e;;0.0 -D;DG;WZ08-803;NOMINAL;2016;114.7;e;;0.0 -D;DG;WZ08-803;NOMINAL;2017;92.0;e;;0.0 -D;DG;WZ08-803;NOMINAL;2018;89.3;e;;0.0 -D;DG;WZ08-803;NOMINAL;2019;82.7;e;;0.0 -D;DG;WZ08-803;NOMINAL;2020;83.6;e;;0.0 -D;DG;WZ08-803;NOMINAL;2021;87.7;p;;0.0 -D;DG;WZ08-803;NOMINAL;2022;94.9;p;;0.0 -D;DG;WZ08-803;REAL;2015;100.0;e;;0.0 -D;DG;WZ08-803;REAL;2016;111.7;e;;0.0 -D;DG;WZ08-803;REAL;2017;86.8;e;;0.0 -D;DG;WZ08-803;REAL;2018;82.3;e;;0.0 -D;DG;WZ08-803;REAL;2019;73.7;e;;0.0 -D;DG;WZ08-803;REAL;2020;72.5;e;;0.0 -D;DG;WZ08-803;REAL;2021;74.7;p;;0.0 -D;DG;WZ08-803;REAL;2022;78.6;p;;0.0 -D;DG;WZ08-80;NOMINAL;2015;100.0;e;;0.0 -D;DG;WZ08-80;NOMINAL;2016;119.5;e;;0.0 -D;DG;WZ08-80;NOMINAL;2017;113.7;e;;0.0 -D;DG;WZ08-80;NOMINAL;2018;112.4;e;;0.0 -D;DG;WZ08-80;NOMINAL;2019;118.5;e;;0.0 -D;DG;WZ08-80;NOMINAL;2020;126.4;e;;0.0 -D;DG;WZ08-80;NOMINAL;2021;139.3;p;;0.0 -D;DG;WZ08-80;NOMINAL;2022;154.3;p;;0.0 -D;DG;WZ08-80;REAL;2015;100.0;e;;0.0 -D;DG;WZ08-80;REAL;2016;116.4;e;;0.0 -D;DG;WZ08-80;REAL;2017;107.3;e;;0.0 -D;DG;WZ08-80;REAL;2018;103.5;e;;0.0 -D;DG;WZ08-80;REAL;2019;105.7;e;;0.0 -D;DG;WZ08-80;REAL;2020;109.6;e;;0.0 -D;DG;WZ08-80;REAL;2021;118.8;p;;0.0 -D;DG;WZ08-80;REAL;2022;127.8;p;;0.0 -D;DG;WZ08-811;NOMINAL;2015;100.0;e;;0.0 -D;DG;WZ08-811;NOMINAL;2016;103.8;e;;0.0 -D;DG;WZ08-811;NOMINAL;2017;107.0;e;;0.0 -D;DG;WZ08-811;NOMINAL;2018;112.2;e;;0.0 -D;DG;WZ08-811;NOMINAL;2019;123.4;e;;0.0 -D;DG;WZ08-811;NOMINAL;2020;115.1;e;;0.0 -D;DG;WZ08-811;NOMINAL;2021;123.1;p;;0.0 -D;DG;WZ08-811;NOMINAL;2022;134.0;p;;0.0 -D;DG;WZ08-811;REAL;2015;100.0;e;;0.0 -D;DG;WZ08-811;REAL;2016;101.9;e;;0.0 -D;DG;WZ08-811;REAL;2017;103.2;e;;0.0 -D;DG;WZ08-811;REAL;2018;105.8;e;;0.0 -D;DG;WZ08-811;REAL;2019;113.7;e;;0.0 -D;DG;WZ08-811;REAL;2020;104.2;e;;0.0 -D;DG;WZ08-811;REAL;2021;108.4;p;;0.0 -D;DG;WZ08-811;REAL;2022;112.4;p;;0.0 -D;DG;WZ08-8121;NOMINAL;2015;100.0;e;;0.0 -D;DG;WZ08-8121;NOMINAL;2016;107.4;e;;0.0 -D;DG;WZ08-8121;NOMINAL;2017;109.7;e;;0.0 -D;DG;WZ08-8121;NOMINAL;2018;115.8;e;;0.0 -D;DG;WZ08-8121;NOMINAL;2019;120.9;e;;0.0 -D;DG;WZ08-8121;NOMINAL;2020;119.7;e;;0.0 -D;DG;WZ08-8121;NOMINAL;2021;135.4;p;;0.0 -D;DG;WZ08-8121;NOMINAL;2022;150.6;p;;0.0 -D;DG;WZ08-8122;NOMINAL;2015;100.0;e;;0.0 -D;DG;WZ08-8122;NOMINAL;2016;107.2;e;;0.0 -D;DG;WZ08-8122;NOMINAL;2017;106.6;e;;0.0 -D;DG;WZ08-8122;NOMINAL;2018;117.8;e;;0.0 -D;DG;WZ08-8122;NOMINAL;2019;123.3;e;;0.0 -D;DG;WZ08-8122;NOMINAL;2020;126.2;e;;0.0 -D;DG;WZ08-8122;NOMINAL;2021;132.1;p;;0.0 -D;DG;WZ08-8122;NOMINAL;2022;142.8;p;;0.0 -D;DG;WZ08-8129;NOMINAL;2015;100.0;e;;0.0 -D;DG;WZ08-8129;NOMINAL;2016;106.4;e;;0.0 -D;DG;WZ08-8129;NOMINAL;2017;117.8;e;;0.0 -D;DG;WZ08-8129;NOMINAL;2018;122.5;e;;0.0 -D;DG;WZ08-8129;NOMINAL;2019;128.7;e;;0.0 -D;DG;WZ08-8129;NOMINAL;2020;131.5;e;;0.0 -D;DG;WZ08-8129;NOMINAL;2021;139.5;p;;0.0 -D;DG;WZ08-8129;NOMINAL;2022;150.3;p;;0.0 -D;DG;WZ08-812;NOMINAL;2015;100.0;e;;0.0 -D;DG;WZ08-812;NOMINAL;2016;107.3;e;;0.0 -D;DG;WZ08-812;NOMINAL;2017;109.8;e;;0.0 -D;DG;WZ08-812;NOMINAL;2018;116.7;e;;0.0 -D;DG;WZ08-812;NOMINAL;2019;121.9;e;;0.0 -D;DG;WZ08-812;NOMINAL;2020;121.8;e;;0.0 -D;DG;WZ08-812;NOMINAL;2021;135.2;p;;0.0 -D;DG;WZ08-812;NOMINAL;2022;149.2;p;;0.0 -D;DG;WZ08-812;REAL;2015;100.0;e;;0.0 -D;DG;WZ08-812;REAL;2016;105.2;e;;0.0 -D;DG;WZ08-812;REAL;2017;105.9;e;;0.0 -D;DG;WZ08-812;REAL;2018;110.1;e;;0.0 -D;DG;WZ08-812;REAL;2019;112.4;e;;0.0 -D;DG;WZ08-812;REAL;2020;110.3;e;;0.0 -D;DG;WZ08-812;REAL;2021;119.0;p;;0.0 -D;DG;WZ08-812;REAL;2022;125.3;p;;0.0 -D;DG;WZ08-813;NOMINAL;2015;100.0;e;;0.0 -D;DG;WZ08-813;NOMINAL;2016;155.5;e;;0.0 -D;DG;WZ08-813;NOMINAL;2017;165.1;e;;0.0 -D;DG;WZ08-813;NOMINAL;2018;182.0;e;;0.0 -D;DG;WZ08-813;NOMINAL;2019;198.7;e;;0.0 -D;DG;WZ08-813;NOMINAL;2020;214.5;e;;0.0 -D;DG;WZ08-813;NOMINAL;2021;229.3;p;;0.0 -D;DG;WZ08-813;NOMINAL;2022;251.3;p;;0.0 -D;DG;WZ08-813;REAL;2015;100.0;e;;0.0 -D;DG;WZ08-813;REAL;2016;150.8;e;;0.0 -D;DG;WZ08-813;REAL;2017;155.7;e;;0.0 -D;DG;WZ08-813;REAL;2018;167.0;e;;0.0 -D;DG;WZ08-813;REAL;2019;177.4;e;;0.0 -D;DG;WZ08-813;REAL;2020;188.8;e;;0.0 -D;DG;WZ08-813;REAL;2021;196.9;p;;0.0 -D;DG;WZ08-813;REAL;2022;207.3;p;;0.0 -D;DG;WZ08-81;NOMINAL;2015;100.0;e;;0.0 -D;DG;WZ08-81;NOMINAL;2016;120.2;e;;0.0 -D;DG;WZ08-81;NOMINAL;2017;124.8;e;;0.0 -D;DG;WZ08-81;NOMINAL;2018;134.2;e;;0.0 -D;DG;WZ08-81;NOMINAL;2019;143.8;e;;0.0 -D;DG;WZ08-81;NOMINAL;2020;146.6;e;;0.0 -D;DG;WZ08-81;NOMINAL;2021;159.4;p;;0.0 -D;DG;WZ08-81;NOMINAL;2022;175.1;p;;0.0 -D;DG;WZ08-81;REAL;2015;100.0;e;;0.0 -D;DG;WZ08-81;REAL;2016;117.4;e;;0.0 -D;DG;WZ08-81;REAL;2017;119.4;e;;0.0 -D;DG;WZ08-81;REAL;2018;125.2;e;;0.0 -D;DG;WZ08-81;REAL;2019;130.9;e;;0.0 -D;DG;WZ08-81;REAL;2020;131.2;e;;0.0 -D;DG;WZ08-81;REAL;2021;138.9;p;;0.0 -D;DG;WZ08-81;REAL;2022;146.0;p;;0.0 -D;DG;WZ08-8211;NOMINAL;2015;100.0;e;;0.0 -D;DG;WZ08-8211;NOMINAL;2016;79.7;e;;0.0 -D;DG;WZ08-8211;NOMINAL;2017;88.0;e;;0.0 -D;DG;WZ08-8211;NOMINAL;2018;112.0;e;;0.0 -D;DG;WZ08-8211;NOMINAL;2019;111.7;e;;0.0 -D;DG;WZ08-8211;NOMINAL;2020;102.9;e;;0.0 -D;DG;WZ08-8211;NOMINAL;2021;117.8;p;;0.0 -D;DG;WZ08-8211;NOMINAL;2022;143.5;p;;0.0 -D;DG;WZ08-8219;NOMINAL;2015;100.0;e;;0.0 -D;DG;WZ08-8219;NOMINAL;2016;87.0;e;;0.0 -D;DG;WZ08-8219;NOMINAL;2017;81.3;e;;0.0 -D;DG;WZ08-8219;NOMINAL;2018;81.3;e;;0.0 -D;DG;WZ08-8219;NOMINAL;2019;73.4;e;;0.0 -D;DG;WZ08-8219;NOMINAL;2020;71.1;e;;0.0 -D;DG;WZ08-8219;NOMINAL;2021;66.6;p;;0.0 -D;DG;WZ08-8219;NOMINAL;2022;69.3;p;;0.0 -D;DG;WZ08-821;NOMINAL;2015;100.0;e;;0.0 -D;DG;WZ08-821;NOMINAL;2016;82.7;e;;0.0 -D;DG;WZ08-821;NOMINAL;2017;85.2;e;;0.0 -D;DG;WZ08-821;NOMINAL;2018;99.4;e;;0.0 -D;DG;WZ08-821;NOMINAL;2019;95.9;e;;0.0 -D;DG;WZ08-821;NOMINAL;2020;89.8;e;;0.0 -D;DG;WZ08-821;NOMINAL;2021;96.7;p;;0.0 -D;DG;WZ08-821;NOMINAL;2022;112.9;p;;0.0 -D;DG;WZ08-821;REAL;2015;100.0;e;;0.0 -D;DG;WZ08-821;REAL;2016;81.7;e;;0.0 -D;DG;WZ08-821;REAL;2017;82.8;e;;0.0 -D;DG;WZ08-821;REAL;2018;95.2;e;;0.0 -D;DG;WZ08-821;REAL;2019;90.6;e;;0.0 -D;DG;WZ08-821;REAL;2020;84.3;e;;0.0 -D;DG;WZ08-821;REAL;2021;85.6;p;;0.0 -D;DG;WZ08-821;REAL;2022;97.5;p;;0.0 -D;DG;WZ08-822;NOMINAL;2015;100.0;e;;0.0 -D;DG;WZ08-822;NOMINAL;2016;103.5;e;;0.0 -D;DG;WZ08-822;NOMINAL;2017;121.7;e;;0.0 -D;DG;WZ08-822;NOMINAL;2018;132.7;e;;0.0 -D;DG;WZ08-822;NOMINAL;2019;124.7;e;;0.0 -D;DG;WZ08-822;NOMINAL;2020;131.8;e;;0.0 -D;DG;WZ08-822;NOMINAL;2021;126.4;p;;0.0 -D;DG;WZ08-822;NOMINAL;2022;125.8;p;;0.0 -D;DG;WZ08-822;REAL;2015;100.0;e;;0.0 -D;DG;WZ08-822;REAL;2016;102.1;e;;0.0 -D;DG;WZ08-822;REAL;2017;118.2;e;;0.0 -D;DG;WZ08-822;REAL;2018;127.2;e;;0.0 -D;DG;WZ08-822;REAL;2019;115.5;e;;0.0 -D;DG;WZ08-822;REAL;2020;118.5;e;;0.0 -D;DG;WZ08-822;REAL;2021;110.9;p;;0.0 -D;DG;WZ08-822;REAL;2022;104.6;p;;0.0 -D;DG;WZ08-823;NOMINAL;2015;100.0;e;;0.0 -D;DG;WZ08-823;NOMINAL;2016;107.1;e;;0.0 -D;DG;WZ08-823;NOMINAL;2017;110.3;e;;0.0 -D;DG;WZ08-823;NOMINAL;2018;111.5;e;;0.0 -D;DG;WZ08-823;NOMINAL;2019;107.3;e;;0.0 -D;DG;WZ08-823;NOMINAL;2020;50.6;e;;0.0 -D;DG;WZ08-823;NOMINAL;2021;62.9;p;;0.0 -D;DG;WZ08-823;NOMINAL;2022;107.1;p;;0.0 -D;DG;WZ08-823;REAL;2015;100.0;e;;0.0 -D;DG;WZ08-823;REAL;2016;104.3;e;;0.0 -D;DG;WZ08-823;REAL;2017;104.7;e;;0.0 -D;DG;WZ08-823;REAL;2018;103.6;e;;0.0 -D;DG;WZ08-823;REAL;2019;97.6;e;;0.0 -D;DG;WZ08-823;REAL;2020;44.9;e;;0.0 -D;DG;WZ08-823;REAL;2021;54.3;p;;0.0 -D;DG;WZ08-823;REAL;2022;89.2;p;;0.0 -D;DG;WZ08-8291;NOMINAL;2015;100.0;e;;0.0 -D;DG;WZ08-8291;NOMINAL;2016;104.7;e;;0.0 -D;DG;WZ08-8291;NOMINAL;2017;114.3;e;;0.0 -D;DG;WZ08-8291;NOMINAL;2018;118.2;e;;0.0 -D;DG;WZ08-8291;NOMINAL;2019;109.5;e;;0.0 -D;DG;WZ08-8291;NOMINAL;2020;106.0;e;;0.0 -D;DG;WZ08-8291;NOMINAL;2021;103.0;p;;0.0 -D;DG;WZ08-8291;NOMINAL;2022;95.8;p;;0.0 -D;DG;WZ08-8292;NOMINAL;2015;100.0;e;;0.0 -D;DG;WZ08-8292;NOMINAL;2016;111.4;e;;0.0 -D;DG;WZ08-8292;NOMINAL;2017;113.9;e;;0.0 -D;DG;WZ08-8292;NOMINAL;2018;115.5;e;;0.0 -D;DG;WZ08-8292;NOMINAL;2019;121.4;e;;0.0 -D;DG;WZ08-8292;NOMINAL;2020;143.8;e;;0.0 -D;DG;WZ08-8292;NOMINAL;2021;131.6;p;;0.0 -D;DG;WZ08-8292;NOMINAL;2022;147.3;p;;0.0 -D;DG;WZ08-8299;NOMINAL;2015;100.0;e;;0.0 -D;DG;WZ08-8299;NOMINAL;2016;96.2;e;;0.0 -D;DG;WZ08-8299;NOMINAL;2017;96.7;e;;0.0 -D;DG;WZ08-8299;NOMINAL;2018;101.4;e;;0.0 -D;DG;WZ08-8299;NOMINAL;2019;103.0;e;;0.0 -D;DG;WZ08-8299;NOMINAL;2020;98.2;e;;0.0 -D;DG;WZ08-8299;NOMINAL;2021;112.0;p;;0.0 -D;DG;WZ08-8299;NOMINAL;2022;126.9;p;;0.0 -D;DG;WZ08-829;NOMINAL;2015;100.0;e;;0.0 -D;DG;WZ08-829;NOMINAL;2016;98.5;e;;0.0 -D;DG;WZ08-829;NOMINAL;2017;100.1;e;;0.0 -D;DG;WZ08-829;NOMINAL;2018;104.4;e;;0.0 -D;DG;WZ08-829;NOMINAL;2019;105.3;e;;0.0 -D;DG;WZ08-829;NOMINAL;2020;103.1;e;;0.0 -D;DG;WZ08-829;NOMINAL;2021;112.8;p;;0.0 -D;DG;WZ08-829;NOMINAL;2022;125.3;p;;0.0 -D;DG;WZ08-829;REAL;2015;100.0;e;;0.0 -D;DG;WZ08-829;REAL;2016;97.3;e;;0.0 -D;DG;WZ08-829;REAL;2017;97.4;e;;0.0 -D;DG;WZ08-829;REAL;2018;100.1;e;;0.0 -D;DG;WZ08-829;REAL;2019;99.5;e;;0.0 -D;DG;WZ08-829;REAL;2020;96.9;e;;0.0 -D;DG;WZ08-829;REAL;2021;99.9;p;;0.0 -D;DG;WZ08-829;REAL;2022;108.2;p;;0.0 -D;DG;WZ08-82;NOMINAL;2015;100.0;e;;0.0 -D;DG;WZ08-82;NOMINAL;2016;99.8;e;;0.0 -D;DG;WZ08-82;NOMINAL;2017;103.7;e;;0.0 -D;DG;WZ08-82;NOMINAL;2018;108.7;e;;0.0 -D;DG;WZ08-82;NOMINAL;2019;107.6;e;;0.0 -D;DG;WZ08-82;NOMINAL;2020;98.3;e;;0.0 -D;DG;WZ08-82;NOMINAL;2021;106.5;p;;0.0 -D;DG;WZ08-82;NOMINAL;2022;122.2;p;;0.0 -D;DG;WZ08-82;REAL;2015;100.0;e;;0.0 -D;DG;WZ08-82;REAL;2016;98.3;e;;0.0 -D;DG;WZ08-82;REAL;2017;100.5;e;;0.0 -D;DG;WZ08-82;REAL;2018;103.7;e;;0.0 -D;DG;WZ08-82;REAL;2019;100.9;e;;0.0 -D;DG;WZ08-82;REAL;2020;91.3;e;;0.0 -D;DG;WZ08-82;REAL;2021;94.0;p;;0.0 -D;DG;WZ08-82;REAL;2022;104.6;p;;0.0 -D;DG;WZ08-H-02;NOMINAL;2015;100.0;e;;0.0 -D;DG;WZ08-H-02;NOMINAL;2016;105.4;e;;0.0 -D;DG;WZ08-H-02;NOMINAL;2017;108.0;e;;0.0 -D;DG;WZ08-H-02;NOMINAL;2018;111.8;e;;0.0 -D;DG;WZ08-H-02;NOMINAL;2019;114.3;e;;0.0 -D;DG;WZ08-H-02;NOMINAL;2020;107.2;e;;0.0 -D;DG;WZ08-H-02;NOMINAL;2021;121.1;p;;0.0 -D;DG;WZ08-H-02;NOMINAL;2022;137.6;p;;0.0 -D;DG;WZ08-H-02;REAL;2015;100.0;e;;0.0 -D;DG;WZ08-H-02;REAL;2016;105.5;e;;0.0 -D;DG;WZ08-H-02;REAL;2017;106.2;e;;0.0 -D;DG;WZ08-H-02;REAL;2018;108.5;e;;0.0 -D;DG;WZ08-H-02;REAL;2019;109.6;e;;0.0 -D;DG;WZ08-H-02;REAL;2020;102.0;e;;0.0 -D;DG;WZ08-H-02;REAL;2021;108.7;p;;0.0 -D;DG;WZ08-H-02;REAL;2022;117.6;p;;0.0 -D;DG;WZ08-H-04;NOMINAL;2015;100.0;e;;0.0 -D;DG;WZ08-H-04;NOMINAL;2016;105.5;e;;0.0 -D;DG;WZ08-H-04;NOMINAL;2017;107.7;e;;0.0 -D;DG;WZ08-H-04;NOMINAL;2018;111.5;e;;0.0 -D;DG;WZ08-H-04;NOMINAL;2019;114.2;e;;0.0 -D;DG;WZ08-H-04;NOMINAL;2020;102.3;e;;0.0 -D;DG;WZ08-H-04;NOMINAL;2021;115.2;p;;0.0 -D;DG;WZ08-H-04;NOMINAL;2022;131.9;p;;0.0 -D;DG;WZ08-H-04;REAL;2015;100.0;e;;0.0 -D;DG;WZ08-H-04;REAL;2016;105.3;e;;0.0 -D;DG;WZ08-H-04;REAL;2017;105.7;e;;0.0 -D;DG;WZ08-H-04;REAL;2018;107.9;e;;0.0 -D;DG;WZ08-H-04;REAL;2019;109.1;e;;0.0 -D;DG;WZ08-H-04;REAL;2020;96.9;e;;0.0 -D;DG;WZ08-H-04;REAL;2021;103.5;p;;0.0 -D;DG;WZ08-H-04;REAL;2022;113.0;p;;0.0 -D;DG;WZ08-H-05;NOMINAL;2015;100.0;e;;0.0 -D;DG;WZ08-H-05;NOMINAL;2016;105.6;e;;0.0 -D;DG;WZ08-H-05;NOMINAL;2017;107.7;e;;0.0 -D;DG;WZ08-H-05;NOMINAL;2018;111.3;e;;0.0 -D;DG;WZ08-H-05;NOMINAL;2019;113.9;e;;0.0 -D;DG;WZ08-H-05;NOMINAL;2020;104.0;e;;0.0 -D;DG;WZ08-H-05;NOMINAL;2021;117.3;p;;0.0 -D;DG;WZ08-H-05;NOMINAL;2022;132.4;p;;0.0 -D;DG;WZ08-H-05;REAL;2015;100.0;e;;0.0 -D;DG;WZ08-H-05;REAL;2016;105.5;e;;0.0 -D;DG;WZ08-H-05;REAL;2017;105.8;e;;0.0 -D;DG;WZ08-H-05;REAL;2018;107.9;e;;0.0 -D;DG;WZ08-H-05;REAL;2019;109.1;e;;0.0 -D;DG;WZ08-H-05;REAL;2020;98.7;e;;0.0 -D;DG;WZ08-H-05;REAL;2021;105.6;p;;0.0 -D;DG;WZ08-H-05;REAL;2022;113.8;p;;0.0 -D;DG;WZ08-H-06;NOMINAL;2021;91.6;p;;0.0 -D;DG;WZ08-H-06;NOMINAL;2022;120.6;p;;0.0 -D;DG;WZ08-H-06;REAL;2021;84.8;p;;0.0 -D;DG;WZ08-H-06;REAL;2022;105.9;p;;0.0 -D;DG;WZ08-H-07;NOMINAL;2021;121.2;p;;0.0 -D;DG;WZ08-H-07;NOMINAL;2022;134.8;p;;0.0 -D;DG;WZ08-H-07;REAL;2021;108.2;p;;0.0 -D;DG;WZ08-H-07;REAL;2022;114.8;p;;0.0 -D;DG;WZ08-H;NOMINAL;2015;100.0;e;;0.0 -D;DG;WZ08-H;NOMINAL;2016;101.2;e;;0.0 -D;DG;WZ08-H;NOMINAL;2017;108.1;e;;0.0 -D;DG;WZ08-H;NOMINAL;2018;110.7;e;;0.0 -D;DG;WZ08-H;NOMINAL;2019;113.4;e;;0.0 -D;DG;WZ08-H;NOMINAL;2020;102.2;e;;0.0 -D;DG;WZ08-H;NOMINAL;2021;123.4;p;;0.0 -D;DG;WZ08-H;NOMINAL;2022;145.3;p;;0.0 -D;DG;WZ08-H;REAL;2015;100.0;e;;0.0 -D;DG;WZ08-H;REAL;2016;103.2;e;;0.0 -D;DG;WZ08-H;REAL;2017;106.4;e;;0.0 -D;DG;WZ08-H;REAL;2018;107.6;e;;0.0 -D;DG;WZ08-H;REAL;2019;109.4;e;;0.0 -D;DG;WZ08-H;REAL;2020;97.4;e;;0.0 -D;DG;WZ08-H;REAL;2021;102.7;p;;0.0 -D;DG;WZ08-H;REAL;2022;110.4;p;;0.0 -D;DG;WZ08-I;NOMINAL;2015;100.0;e;;0.0 -D;DG;WZ08-I;NOMINAL;2016;104.1;e;;0.0 -D;DG;WZ08-I;NOMINAL;2017;108.7;e;;0.0 -D;DG;WZ08-I;NOMINAL;2018;114.2;e;;0.0 -D;DG;WZ08-I;NOMINAL;2019;119.2;e;;0.0 -D;DG;WZ08-I;NOMINAL;2020;76.1;e;;0.0 -D;DG;WZ08-I;NOMINAL;2021;80.4;p;;0.0 -D;DG;WZ08-I;NOMINAL;2022;124.8;p;;0.0 -D;DG;WZ08-I;REAL;2015;100.0;e;;0.0 -D;DG;WZ08-I;REAL;2016;101.9;e;;0.0 -D;DG;WZ08-I;REAL;2017;104.2;e;;0.0 -D;DG;WZ08-I;REAL;2018;107.2;e;;0.0 -D;DG;WZ08-I;REAL;2019;109.3;e;;0.0 -D;DG;WZ08-I;REAL;2020;67.4;e;;0.0 -D;DG;WZ08-I;REAL;2021;69.2;p;;0.0 -D;DG;WZ08-I;REAL;2022;100.4;p;;0.0 -D;DG;WZ08-J;NOMINAL;2015;100.0;e;;0.0 -D;DG;WZ08-J;NOMINAL;2016;110.3;e;;0.0 -D;DG;WZ08-J;NOMINAL;2017;106.0;e;;0.0 -D;DG;WZ08-J;NOMINAL;2018;111.4;e;;0.0 -D;DG;WZ08-J;NOMINAL;2019;112.2;e;;0.0 -D;DG;WZ08-J;NOMINAL;2020;111.9;e;;0.0 -D;DG;WZ08-J;NOMINAL;2021;119.3;p;;0.0 -D;DG;WZ08-J;NOMINAL;2022;130.3;p;;0.0 -D;DG;WZ08-J;REAL;2015;100.0;e;;0.0 -D;DG;WZ08-J;REAL;2016;110.5;e;;0.0 -D;DG;WZ08-J;REAL;2017;106.0;e;;0.0 -D;DG;WZ08-J;REAL;2018;110.7;e;;0.0 -D;DG;WZ08-J;REAL;2019;110.5;e;;0.0 -D;DG;WZ08-J;REAL;2020;109.6;e;;0.0 -D;DG;WZ08-J;REAL;2021;115.5;p;;0.0 -D;DG;WZ08-J;REAL;2022;124.0;p;;0.0 -D;DG;WZ08-L;NOMINAL;2015;100.0;e;;0.0 -D;DG;WZ08-L;NOMINAL;2016;107.2;e;;0.0 -D;DG;WZ08-L;NOMINAL;2017;105.8;e;;0.0 -D;DG;WZ08-L;NOMINAL;2018;108.4;e;;0.0 -D;DG;WZ08-L;NOMINAL;2019;111.7;e;;0.0 -D;DG;WZ08-L;NOMINAL;2020;82.5;e;;0.0 -D;DG;WZ08-L;NOMINAL;2021;92.3;p;;0.0 -D;DG;WZ08-L;NOMINAL;2022;97.7;p;;0.0 -D;DG;WZ08-L;REAL;2015;100.0;e;;0.0 -D;DG;WZ08-L;REAL;2016;106.0;e;;0.0 -D;DG;WZ08-L;REAL;2017;103.2;e;;0.0 -D;DG;WZ08-L;REAL;2018;104.2;e;;0.0 -D;DG;WZ08-L;REAL;2019;105.8;e;;0.0 -D;DG;WZ08-L;REAL;2020;77.1;e;;0.0 -D;DG;WZ08-L;REAL;2021;85.1;p;;0.0 -D;DG;WZ08-L;REAL;2022;88.5;p;;0.0 -D;DG;WZ08-M;NOMINAL;2015;100.0;e;;0.0 -D;DG;WZ08-M;NOMINAL;2016;104.1;e;;0.0 -D;DG;WZ08-M;NOMINAL;2017;106.6;e;;0.0 -D;DG;WZ08-M;NOMINAL;2018;109.3;e;;0.0 -D;DG;WZ08-M;NOMINAL;2019;113.7;e;;0.0 -D;DG;WZ08-M;NOMINAL;2020;113.2;e;;0.0 -D;DG;WZ08-M;NOMINAL;2021;121.0;p;;0.0 -D;DG;WZ08-M;NOMINAL;2022;133.5;p;;0.0 -D;DG;WZ08-M;REAL;2015;100.0;e;;0.0 -D;DG;WZ08-M;REAL;2016;103.0;e;;0.0 -D;DG;WZ08-M;REAL;2017;104.2;e;;0.0 -D;DG;WZ08-M;REAL;2018;105.2;e;;0.0 -D;DG;WZ08-M;REAL;2019;107.8;e;;0.0 -D;DG;WZ08-M;REAL;2020;106.1;e;;0.0 -D;DG;WZ08-M;REAL;2021;110.0;p;;0.0 -D;DG;WZ08-M;REAL;2022;117.2;p;;0.0 -D;DG;WZ08-N;NOMINAL;2015;100.0;e;;0.0 -D;DG;WZ08-N;NOMINAL;2016;106.4;e;;0.0 -D;DG;WZ08-N;NOMINAL;2017;112.0;e;;0.0 -D;DG;WZ08-N;NOMINAL;2018;116.6;e;;0.0 -D;DG;WZ08-N;NOMINAL;2019;118.8;e;;0.0 -D;DG;WZ08-N;NOMINAL;2020;101.7;e;;0.0 -D;DG;WZ08-N;NOMINAL;2021;120.1;p;;0.0 -D;DG;WZ08-N;NOMINAL;2022;140.7;p;;0.0 -D;DG;WZ08-N;REAL;2015;100.0;e;;0.0 -D;DG;WZ08-N;REAL;2016;105.0;e;;0.0 -D;DG;WZ08-N;REAL;2017;108.4;e;;0.0 -D;DG;WZ08-N;REAL;2018;110.6;e;;0.0 -D;DG;WZ08-N;REAL;2019;110.8;e;;0.0 -D;DG;WZ08-N;REAL;2020;94.1;e;;0.0 -D;DG;WZ08-N;REAL;2021;107.2;p;;0.0 -D;DG;WZ08-N;REAL;2022;120.0;p;;0.0 diff --git a/tests/testthat/find1/api/find/find-c24582.json b/tests/testthat/find1/api/find/find-c24582.json deleted file mode 100644 index 89c8fe7..0000000 --- a/tests/testthat/find1/api/find/find-c24582.json +++ /dev/null @@ -1,705 +0,0 @@ -{ - "Ident": { - "Service": "find", - "Method": "find" - }, - "Status": { - "Code": 0, - "Content": "erfolgreich", - "Type": "Information" - }, - "Parameter": { - "username": "********************", - "password": "********************", - "term": "forst", - "category": "Alle", - "pagelength": "100", - "language": "de" - }, - "Cubes": [ - { - "Code": "12211BJ424", - "Content": "Mikrozensus, Erwerbstaeatige aus Hauptwohnsitzhaushalten, Deutschland insgesamt, Berufsbereiche (KB2010), 1-Steller, Jahr", - "State": "vollst?ndig mit Werten", - "Time": "2020-2021", - "LatestUpdate": "30.01.2023 16:01:50h", - "Information": "false" - }, - { - "Code": "12211BJ425", - "Content": "Mikrozensus, Erwerbst?tige aus Hauptwohnsitzhaushalten, Deutschland insgesamt, Geschlecht, Berufsbereiche (KB2010), 1-Steller, Jahr", - "State": "vollst?ndig mit Werten", - "Time": "2020-2021", - "LatestUpdate": "30.01.2023 16:01:47h", - "Information": "false" - }, - { - "Code": "12211BJ426", - "Content": "Mikrozensus, Erwerbst?tige aus Hauptwohnsitzhaushalten, Deutschland insgesamt, Stellung im Beruf, Berufsbereiche (KB2010), 1-Steller, Jahr", - "State": "vollst?ndig mit Werten", - "Time": "2020-2021", - "LatestUpdate": "30.01.2023 16:01:37h", - "Information": "false" - }, - { - "Code": "12211BJ427", - "Content": "Mikrozensus, Erwerbst?tige aus Hauptwohnsitzhaushalten, Deutschland insgesamt, Geschlecht, Stellung im Beruf, Berufsbereiche (KB2010), 1-Steller, Jahr", - "State": "vollst?ndig mit Werten", - "Time": "2020-2021", - "LatestUpdate": "30.01.2023 16:01:53h", - "Information": "false" - }, - { - "Code": "21331BS002", - "Content": "Statistik der Gasth?rer, Gasth?rer, Deutschland insgesamt, F?chergruppen, Semester", - "State": "vollst?ndig mit Werten", - "Time": "WS 1994/95-WS 2021/22", - "LatestUpdate": "24.05.2022 08:01:01h", - "Information": "false" - }, - { - "Code": "21341BJ002", - "Content": "Statistik des Hochschulpersonals, Hauptberufl. wissenschaftl. u. k?nstler. Personal, Deutschland insgesamt, Geschlecht, Lehr- und Forschungsbereiche, Jahr", - "State": "vollst?ndig mit Werten", - "Time": "1997-2021", - "LatestUpdate": "22.09.2022 08:00:06h", - "Information": "false" - }, - { - "Code": "21341BJ003", - "Content": "Statistik des Hochschulpersonals, Professoren, Deutschland insgesamt, Geschlecht, F?chergruppen, Jahr", - "State": "vollst?ndig mit Werten", - "Time": "1997-2021", - "LatestUpdate": "22.09.2022 08:00:08h", - "Information": "false" - }, - { - "Code": "21351BJ001", - "Content": "Statistik der Habilitationen, Habilitationen, Deutschland insgesamt, F?chergruppen, Geschlecht, Nationalit?t, Jahr", - "State": "vollst?ndig mit Werten", - "Time": "1992-2021", - "LatestUpdate": "05.07.2022 08:00:41h", - "Information": "false" - }, - { - "Code": "21351BJ003", - "Content": "Statistik der Habilitationen, Durchschnittsalter der habilitierten Personen, Deutschland insgesamt, F?chergruppen, Jahr", - "State": "vollst?ndig mit Werten", - "Time": "1992-2021", - "LatestUpdate": "05.07.2022 08:00:38h", - "Information": "false" - }, - { - "Code": "21351BJ005", - "Content": "Statistik der Habilitationen, Durchschnittsalter der habilitierten Personen, Deutschland insgesamt, F?chergruppen, Geschlecht, Jahr", - "State": "vollst?ndig mit Werten", - "Time": "1992-2021", - "LatestUpdate": "05.07.2022 08:00:43h", - "Information": "false" - }, - { - "Code": "21352BJ011", - "Content": "Statistik der Promovierenden, Promovierende, Deutschland insgesamt, F?chergruppen, Altersgruppen (u24-40m, unbekannt), Stichtag", - "State": "vollst?ndig mit Werten", - "Time": "01.12.2019-01.12.2021", - "LatestUpdate": "15.08.2022 13:17:20h", - "Information": "false" - }, - { - "Code": "21352BJ012", - "Content": "Statistik der Promovierenden, Promovierende, Deutschland insgesamt, Geschlecht, F?chergruppen, Altersgruppen (u24-40m, unbekannt), Stichtag", - "State": "vollst?ndig mit Werten", - "Time": "01.12.2019-01.12.2021", - "LatestUpdate": "15.08.2022 13:17:17h", - "Information": "false" - }, - { - "Code": "21352BJ013", - "Content": "Statistik der Promovierenden, Promovierende, Durchschnittsalter der Promovierenden, Deutschland insgesamt, F?chergruppen, Stichtag", - "State": "vollst?ndig mit Werten", - "Time": "01.12.2019-01.12.2021", - "LatestUpdate": "15.08.2022 13:17:18h", - "Information": "false" - }, - { - "Code": "21352BJ014", - "Content": "Statistik der Promovierenden, Promovierende, Durchschnittsalter der Promovierenden, Deutschland insgesamt, Geschlecht, F?chergruppen, Stichtag", - "State": "vollst?ndig mit Werten", - "Time": "01.12.2019-01.12.2021", - "LatestUpdate": "15.08.2022 13:17:16h", - "Information": "false" - }, - { - "Code": "21352BJ015", - "Content": "Statistik der Promovierenden, Promovierende, Deutschland insgesamt, Nationalit?t, F?chergruppen, Stichtag", - "State": "vollst?ndig mit Werten", - "Time": "01.12.2019-01.12.2021", - "LatestUpdate": "15.08.2022 13:18:28h", - "Information": "false" - }, - { - "Code": "21352BJ016", - "Content": "Statistik der Promovierenden, Promovierende, Deutschland insgesamt, Geschlecht, Nationalit?t, F?chergruppen, Stichtag", - "State": "vollst?ndig mit Werten", - "Time": "01.12.2019-01.12.2021", - "LatestUpdate": "15.08.2022 13:18:25h", - "Information": "false" - }, - { - "Code": "21371BJ003", - "Content": "Hochschulfinanzstatistik, Ausgaben der Hochschulen, Deutschland insgesamt, F?chergruppen, Jahr", - "State": "vollst?ndig mit Werten", - "Time": "2006-2020", - "LatestUpdate": "22.03.2022 08:00:13h", - "Information": "false" - }, - { - "Code": "21371BJ004", - "Content": "Hochschulfinanzstatistik, Ausgaben der Hochschulen, Deutschland insgesamt, Hochschulart, F?chergruppen, Jahr", - "State": "vollst?ndig mit Werten", - "Time": "2006-2020", - "LatestUpdate": "22.03.2022 08:00:12h", - "Information": "false" - }, - { - "Code": "21371LJ003", - "Content": "Hochschulfinanzstatistik, Ausgaben der Hochschulen, Bundesl?nder, F?chergruppen, Jahr", - "State": "vollst?ndig mit Werten", - "Time": "2006-2020", - "LatestUpdate": "22.03.2022 08:00:14h", - "Information": "false" - }, - { - "Code": "21371LJ004", - "Content": "Hochschulfinanzstatistik, Ausgaben der Hochschulen, Bundesl?nder, Hochschulart, F?chergruppen, Jahr", - "State": "vollst?ndig mit Werten", - "Time": "2006-2020", - "LatestUpdate": "22.03.2022 08:00:16h", - "Information": "false" - }, - { - "Code": "21381BJ102", - "Content": "Hochschulstatistische Kennzahlen, Laufende Ausgaben der Hochschulen je Studierenden, Laufende Ausgaben d. Hochschulen je Wiss. Personal, Laufende Ausgaben der Hochschulen je Professor, Drittmittel der Hochschulen je Wiss. Personal, Drittmittel der Hochschulen je Professor, Deutschland insgesamt, F?chergruppen, Jahr", - "State": "vollst?ndig mit Werten", - "Time": "2011-2020", - "LatestUpdate": "20.09.2022 08:00:51h", - "Information": "false" - }, - { - "Code": "21431BJ009", - "Content": "F?rderung nach dem Stipendienprogramm-Gesetz, Stipendiaten, Deutschland insgesamt, F?chergruppen, Jahr", - "State": "vollst?ndig mit Werten", - "Time": "2020-2021", - "LatestUpdate": "31.05.2022 08:01:24h", - "Information": "false" - }, - { - "Code": "21431BJ010", - "Content": "F?rderung nach dem Stipendienprogramm-Gesetz, Stipendiaten, Deutschland insgesamt, Geschlecht, F?chergruppen, Jahr", - "State": "vollst?ndig mit Werten", - "Time": "2020-2021", - "LatestUpdate": "31.05.2022 08:01:28h", - "Information": "false" - }, - { - "Code": "21431BJ011", - "Content": "F?rderung nach dem Stipendienprogramm-Gesetz, Stipendiaten, Deutschland insgesamt, Nationalit?t, F?chergruppen, Jahr", - "State": "vollst?ndig mit Werten", - "Time": "2020-2021", - "LatestUpdate": "31.05.2022 08:01:26h", - "Information": "false" - }, - { - "Code": "21431BJ012", - "Content": "F?rderung nach dem Stipendienprogramm-Gesetz, Stipendiaten, Deutschland insgesamt, Geschlecht, Nationalit?t, F?chergruppen, Jahr", - "State": "vollst?ndig mit Werten", - "Time": "2020-2021", - "LatestUpdate": "31.05.2022 08:00:22h", - "Information": "false" - }, - { - "Code": "21811BJ007", - "Content": "Ausgaben, Einnahmen, Personal ?ff. Forschungseinr., Interne Ausgaben f?r Forschung und Entwicklung, Personal f?r FuE (Vollzeit?quivalente), Deutschland insgesamt, Wissenschaftszweige, Jahr", - "State": "vollst?ndig mit Werten", - "Time": "2019-2021", - "LatestUpdate": "08.03.2023 08:01:05h", - "Information": "false" - }, - { - "Code": "21811BJ008", - "Content": "Ausgaben, Einnahmen, Personal ?ff. Forschungseinr., Interne Ausgaben f?r Forschung und Entwicklung, Personal f?r FuE (Vollzeit?quivalente), Deutschland insgesamt, Einrichtungsgruppe, Wissenschaftszweige, Jahr", - "State": "vollst?ndig mit Werten", - "Time": "2019-2021", - "LatestUpdate": "08.03.2023 08:01:02h", - "Information": "false" - }, - { - "Code": "21811BJ009", - "Content": "Ausgaben, Einnahmen, Personal ?ff. Forschungseinr., Interne Ausgaben f?r Forschung und Entwicklung, Personal f?r FuE (Vollzeit?quivalente), Deutschland insgesamt, Einrichtungsart, Wissenschaftszweige, Jahr", - "State": "vollst?ndig mit Werten", - "Time": "2019-2021", - "LatestUpdate": "08.03.2023 08:01:17h", - "Information": "false" - }, - { - "Code": "21811BJ034", - "Content": "Ausgaben, Einnahmen, Personal ?ff. Forschungseinr., Personal f?r FuE (Vollzeit?quivalente), Deutschland insgesamt, Wissenschaftszweige, Personalgruppen, Jahr", - "State": "vollst?ndig mit Werten", - "Time": "2019-2021", - "LatestUpdate": "08.03.2023 08:05:13h", - "Information": "false" - }, - { - "Code": "21811LJ003", - "Content": "Ausgaben, Einnahmen, Personal ?ff. Forschungseinr., Interne Ausgaben f?r Forschung und Entwicklung, Bundesl?nder und Ausland, Wissenschaftszweige, Jahr", - "State": "vollst?ndig mit Werten", - "Time": "2019-2021", - "LatestUpdate": "08.03.2023 08:06:15h", - "Information": "false" - }, - { - "Code": "51000BJ160", - "Content": "Au?enhandel, Ausfuhr: Gewicht, Ausfuhr: Wert, Ausfuhr: Wert (US-Dollar), Einfuhr: Gewicht, Einfuhr: Wert, Einfuhr: Wert (US-Dollar), Warenverzeichnis Au?enhandelsstatistik (6-Steller), Deutschland insgesamt, Jahr", - "State": "vollst?ndig mit Werten", - "Time": "2008-2022", - "LatestUpdate": "20.03.2023 18:00:31h", - "Information": "false" - }, - { - "Code": "51000BJ161", - "Content": "Au?enhandel, Ausfuhr: Gewicht, Ausfuhr: Wert, Ausfuhr: Wert (US-Dollar), Einfuhr: Gewicht, Einfuhr: Wert, Einfuhr: Wert (US-Dollar), Warenverzeichnis Au?enhandelsstatistik (6-Steller), Deutschland insgesamt, L?nderverzeichnis f?r die Au?enhandelsstatistik, Jahr", - "State": "vollst?ndig mit Werten", - "Time": "2008-2022", - "LatestUpdate": "20.03.2023 18:15:53h", - "Information": "false" - }, - { - "Code": "51000BJ180", - "Content": "Au?enhandel, Ausfuhr: Besondere Ma?einheit, Ausfuhr: Gewicht, Ausfuhr: Wert, Ausfuhr: Wert (US-Dollar), Einfuhr: Besondere Ma?einheit, Einfuhr: Gewicht, Einfuhr: Wert, Einfuhr: Wert (US-Dollar), Warenverzeichnis Au?enhandelsstatistik (8-Steller), Deutschland insgesamt, Jahr", - "State": "vollst?ndig mit Werten", - "Time": "2006-2022", - "LatestUpdate": "20.03.2023 18:01:33h", - "Information": "false" - }, - { - "Code": "51000BJ181", - "Content": "Au?enhandel, Ausfuhr: Besondere Ma?einheit, Ausfuhr: Gewicht, Ausfuhr: Wert, Ausfuhr: Wert (US-Dollar), Einfuhr: Besondere Ma?einheit, Einfuhr: Gewicht, Einfuhr: Wert, Einfuhr: Wert (US-Dollar), Warenverzeichnis Au?enhandelsstatistik (8-Steller), Deutschland insgesamt, L?nderverzeichnis f?r die Au?enhandelsstatistik, Jahr", - "State": "vollst?ndig mit Werten", - "Time": "2006-2022", - "LatestUpdate": "20.03.2023 18:17:44h", - "Information": "false" - }, - { - "Code": "51000BM160", - "Content": "Au?enhandel, Ausfuhr: Gewicht, Ausfuhr: Wert, Ausfuhr: Wert (US-Dollar), Einfuhr: Gewicht, Einfuhr: Wert, Einfuhr: Wert (US-Dollar), Warenverzeichnis Au?enhandelsstatistik (6-Steller), Deutschland insgesamt, Monate, Jahr", - "State": "vollst?ndig mit Werten", - "Time": "Januar 2008-Januar 2023", - "LatestUpdate": "20.03.2023 18:12:08h", - "Information": "false" - }, - { - "Code": "51000BM161", - "Content": "Au?enhandel, Ausfuhr: Gewicht, Ausfuhr: Wert, Ausfuhr: Wert (US-Dollar), Einfuhr: Gewicht, Einfuhr: Wert, Einfuhr: Wert (US-Dollar), Warenverzeichnis Au?enhandelsstatistik (6-Steller), Deutschland insgesamt, L?nderverzeichnis f?r die Au?enhandelsstatistik, Monate, Jahr", - "State": "vollst?ndig mit Werten", - "Time": "Januar 2008-Januar 2023", - "LatestUpdate": "20.03.2023 18:50:12h", - "Information": "false" - }, - { - "Code": "51000BM180", - "Content": "Au?enhandel, Ausfuhr: Besondere Ma?einheit, Ausfuhr: Gewicht, Ausfuhr: Wert, Ausfuhr: Wert (US-Dollar), Einfuhr: Besondere Ma?einheit, Einfuhr: Gewicht, Einfuhr: Wert, Einfuhr: Wert (US-Dollar), Warenverzeichnis Au?enhandelsstatistik (8-Steller), Deutschland insgesamt, Monate, Jahr", - "State": "vollst?ndig mit Werten", - "Time": "Januar 2006-Januar 2023", - "LatestUpdate": "20.03.2023 18:13:34h", - "Information": "false" - }, - { - "Code": "51000BM181", - "Content": "Au?enhandel, Ausfuhr: Besondere Ma?einheit, Ausfuhr: Gewicht, Ausfuhr: Wert, Ausfuhr: Wert (US-Dollar), Einfuhr: Besondere Ma?einheit, Einfuhr: Gewicht, Einfuhr: Wert, Einfuhr: Wert (US-Dollar), Warenverzeichnis Au?enhandelsstatistik (8-Steller), Deutschland insgesamt, L?nderverzeichnis f?r die Au?enhandelsstatistik, Monate, Jahr", - "State": "vollst?ndig mit Werten", - "Time": "Januar 2006-Januar 2023", - "LatestUpdate": "20.03.2023 19:37:45h", - "Information": "false" - }, - { - "Code": "62361BJ009", - "Content": "Verdiensterhebung, Durchschn. Bruttostundenverdienste ohne Sonderz., Durchschn. Bruttomonatsverdienste ohne Sonderz., Mittlere Bruttostundenverdienste ohne Sonderz., Mittlere Bruttomonatsverdienste ohne Sonderz., Deutschland insgesamt, Berufsgruppen (KB2010), 3-Steller, Stichmonat", - "State": "vollst?ndig mit Werten", - "Time": "04/2022", - "LatestUpdate": "23.11.2022 18:07:06h", - "Information": "false" - }, - { - "Code": "62361BJ010", - "Content": "Verdiensterhebung, Durchschn. Bruttostundenverdienste ohne Sonderz., Durchschn. Bruttomonatsverdienste ohne Sonderz., Mittlere Bruttostundenverdienste ohne Sonderz., Mittlere Bruttomonatsverdienste ohne Sonderz., Deutschland insgesamt, Berufsgattungen (KB2010), 5-Steller, Stichmonat", - "State": "vollst?ndig mit Werten", - "Time": "04/2022", - "LatestUpdate": "23.11.2022 18:07:06h", - "Information": "false" - }, - { - "Code": "62361BJ012", - "Content": "Verdiensterhebung, Durchschn. Bruttostundenverdienste ohne Sonderz., Durchschn. Bruttomonatsverdienste ohne Sonderz., Mittlere Bruttostundenverdienste ohne Sonderz., Mittlere Bruttomonatsverdienste ohne Sonderz., Deutschland insgesamt, Geschlecht, Berufsgruppen (KB2010), 3-Steller, Stichmonat", - "State": "vollst?ndig mit Werten", - "Time": "04/2022", - "LatestUpdate": "23.11.2022 18:07:07h", - "Information": "false" - }, - { - "Code": "62361BJ013", - "Content": "Verdiensterhebung, Durchschn. Bruttostundenverdienste ohne Sonderz., Durchschn. Bruttomonatsverdienste ohne Sonderz., Mittlere Bruttostundenverdienste ohne Sonderz., Mittlere Bruttomonatsverdienste ohne Sonderz., Deutschland insgesamt, Geschlecht, Berufsgattungen (KB2010), 5-Steller, Stichmonat", - "State": "vollst?ndig mit Werten", - "Time": "04/2022", - "LatestUpdate": "23.11.2022 18:07:07h", - "Information": "false" - }, - { - "Code": "71141BJ006", - "Content": "Rechnungsergebnisse d.?ffentlichen Gesamthaushalts, Nettoausgaben, Personalausgaben, Bauma?nahmen, Deutschland insgesamt, K?rperschaftsgruppen, Aufgabenbereiche der ?ffentlichen Haushalte, Jahr", - "State": "vollst?ndig mit Werten", - "Time": "1992-2011", - "LatestUpdate": "26.02.2014 15:37:23h", - "Information": "false" - } - ], - "Statistics": [ - { - "Code": "12211", - "Content": "Mikrozensus", - "Cubes": "483", - "Information": "true" - }, - { - "Code": "21331", - "Content": "Statistik der Gasth?rer", - "Cubes": "2", - "Information": "true" - }, - { - "Code": "21341", - "Content": "Statistik des Hochschulpersonals", - "Cubes": "3", - "Information": "true" - }, - { - "Code": "21351", - "Content": "Statistik der Habilitationen", - "Cubes": "6", - "Information": "true" - }, - { - "Code": "21352", - "Content": "Statistik der Promovierenden", - "Cubes": "28", - "Information": "true" - }, - { - "Code": "21371", - "Content": "Hochschulfinanzstatistik", - "Cubes": "8", - "Information": "true" - }, - { - "Code": "21381", - "Content": "Hochschulstatistische Kennzahlen", - "Cubes": "11", - "Information": "false" - }, - { - "Code": "21431", - "Content": "F?rderung nach dem Stipendienprogramm-Gesetz", - "Cubes": "37", - "Information": "true" - }, - { - "Code": "21811", - "Content": "Ausgaben, Einnahmen, Personal ?ff. Forschungseinr.", - "Cubes": "47", - "Information": "true" - }, - { - "Code": "51000", - "Content": "Au?enhandel", - "Cubes": "79", - "Information": "true" - }, - { - "Code": "62361", - "Content": "Verdiensterhebung", - "Cubes": "103", - "Information": "true" - }, - { - "Code": "71141", - "Content": "Rechnungsergebnisse d.?ffentlichen Gesamthaushalts", - "Cubes": "10", - "Information": "true" - } - ], - "Tables": [ - { - "Code": "12211-0009", - "Content": "Erwerbst?tige aus Hauptwohnsitzhaushalten: Deutschland,\nJahre, Geschlecht, Stellung im Beruf, Berufe", - "Time": "" - }, - { - "Code": "21331-0002", - "Content": "Gasth?rer: Deutschland, Semester, F?chergruppen", - "Time": "" - }, - { - "Code": "21341-0002", - "Content": "Hauptberufliches wissenschaftliches und k?nstlerisches\nPersonal an Hochschulen: Deutschland, Jahre, Lehr- und\nForschungsbereiche nach F?chergruppen, Geschlecht", - "Time": "" - }, - { - "Code": "21341-0003", - "Content": "Professoren: Deutschland, Jahre, F?chergruppen, Geschlecht", - "Time": "" - }, - { - "Code": "21351-0001", - "Content": "Habilitationen: Deutschland, Jahre, F?chergruppen,\nNationalit?t, Geschlecht", - "Time": "" - }, - { - "Code": "21351-0002", - "Content": "Durchschnittsalter der habilitierten Personen: Deutschland,\nJahre, F?chergruppen, Geschlecht", - "Time": "" - }, - { - "Code": "21352-0002", - "Content": "Promovierende: Deutschland, Stichtag, Geschlecht,\nAltersgruppen, F?chergruppen", - "Time": "" - }, - { - "Code": "21352-0003", - "Content": "Promovierende: Deutschland, Stichtag, Nationalit?t,\nGeschlecht, F?chergruppen und Studienbereiche", - "Time": "" - }, - { - "Code": "21352-0004", - "Content": "Durchschnittsalter der Promovierenden: Deutschland,\nStichtag, Geschlecht, F?chergruppen", - "Time": "" - }, - { - "Code": "21371-0001", - "Content": "Ausgaben der Hochschulen: Deutschland, Jahre, Hochschulart,\nF?chergruppen", - "Time": "" - }, - { - "Code": "21371-0002", - "Content": "Ausgaben der Hochschulen: Bundesl?nder, Jahre, Hochschulart,\nF?chergruppen", - "Time": "" - }, - { - "Code": "21381-0005", - "Content": "Laufende Ausgaben der Hochschulen, Drittmittel der\nHochschulen: Deutschland, Jahre, F?chergruppen", - "Time": "" - }, - { - "Code": "21431-0004", - "Content": "Stipendiaten: Deutschland, Jahre, Nationalit?t, Geschlecht,\nF?chergruppen", - "Time": "" - }, - { - "Code": "21811-0003", - "Content": "Interne Ausgaben f?r Forschung und Entwicklung: Deutschland,\nJahre, Einrichtungsart, Wissenschaftszweige", - "Time": "" - }, - { - "Code": "21811-0005", - "Content": "Personal f?r Forschung und Entwicklung (Vollzeit?quivalente): Deutschland, Jahre, Einrichtungsart, Wissenschaftszweige", - "Time": "" - }, - { - "Code": "21811-0007", - "Content": "Personal f?r Forschung und Entwicklung (Vollzeit?quivalente): Deutschland, Jahre, Personalgruppen, Wissenschaftszweige", - "Time": "" - }, - { - "Code": "21811-0022", - "Content": "Interne Ausgaben f?r Forschung und Entwicklung: Bundesl?nder\nund Ausland, Jahre, Wissenschaftszweige", - "Time": "" - }, - { - "Code": "51000-0005", - "Content": "Aus- und Einfuhr (Au?enhandel): Deutschland, Jahre,\nWarensystematik", - "Time": "" - }, - { - "Code": "51000-0006", - "Content": "Aus- und Einfuhr (Au?enhandel): Deutschland, Monate,\nWarensystematik", - "Time": "" - }, - { - "Code": "51000-0009", - "Content": "Aus- und Einfuhr (Au?enhandel): Deutschland, Jahre, Land,\nWarenverzeichnis (4-/6-Steller)", - "Time": "" - }, - { - "Code": "51000-0010", - "Content": "Aus- und Einfuhr (Au?enhandel): Deutschland, Jahre,\nWare (4-/6-Steller), L?nder", - "Time": "" - }, - { - "Code": "51000-0011", - "Content": "Aus- und Einfuhr (Au?enhandel): Deutschland, Monate, Land,\nWarenverzeichnis (4-/6-Steller)", - "Time": "" - }, - { - "Code": "51000-0012", - "Content": "Aus- und Einfuhr (Au?enhandel): Deutschland, Monate,\nWare (4-/6-Steller), L?nder", - "Time": "" - }, - { - "Code": "51000-0013", - "Content": "Aus- und Einfuhr (Au?enhandel): Deutschland, Jahre,\nWarenverzeichnis (8-Steller)", - "Time": "" - }, - { - "Code": "51000-0014", - "Content": "Aus- und Einfuhr (Au?enhandel): Deutschland, Monate,\nWarenverzeichnis (8-Steller)", - "Time": "" - }, - { - "Code": "51000-0015", - "Content": "Aus- und Einfuhr (Au?enhandel): Deutschland, Jahre, Land,\nWarenverzeichnis (8-Steller)", - "Time": "" - }, - { - "Code": "51000-0016", - "Content": "Aus- und Einfuhr (Au?enhandel): Deutschland, Jahre,\nWare (8-Steller), L?nder", - "Time": "" - }, - { - "Code": "51000-0017", - "Content": "Aus- und Einfuhr (Au?enhandel): Deutschland, Monate, Land,\nWarenverzeichnis (8-Steller)", - "Time": "" - }, - { - "Code": "51000-0018", - "Content": "Aus- und Einfuhr (Au?enhandel): Deutschland, Monate,\nWare (8-Steller), L?nder", - "Time": "" - }, - { - "Code": "62361-0030", - "Content": "Bruttostundenverdienste, Bruttomonatsverdienste: Deutschland, Stichmonat, Geschlecht, Berufe", - "Time": "" - }, - { - "Code": "71141-0004", - "Content": "Rechnungsergebnisse des ?ffentlichen Gesamthaushalts\n(Nettoausgaben, Personalausgaben, Bauma?nahmen):\nDeutschland, Jahre, K?rperschaftsgruppen, Aufgabenbereiche", - "Time": "" - } - ], - "Timeseries": null, - "Variables": [ - { - "Code": "AFGBE3", - "Content": "Aufgabenbereiche der ?ffentlichen Haushalte", - "Type": "sachlich", - "Values": "22", - "Information": "false" - }, - { - "Code": "BERLF1", - "Content": "Lehr- und Forschungsbereiche", - "Type": "sachlich", - "Values": "84", - "Information": "false" - }, - { - "Code": "BILFG1", - "Content": "F?chergruppen", - "Type": "sachlich", - "Values": "10", - "Information": "false" - }, - { - "Code": "BILFG2", - "Content": "F?chergruppen", - "Type": "sachlich", - "Values": "10", - "Information": "false" - }, - { - "Code": "BILFG3", - "Content": "F?chergruppen", - "Type": "sachlich", - "Values": "11", - "Information": "false" - }, - { - "Code": "BILFG4", - "Content": "F?chergruppen", - "Type": "sachlich", - "Values": "9", - "Information": "false" - }, - { - "Code": "BILFG5", - "Content": "F?chergruppen", - "Type": "sachlich", - "Values": "8", - "Information": "false" - }, - { - "Code": "BILFG6", - "Content": "F?chergruppen", - "Type": "sachlich", - "Values": "12", - "Information": "false" - }, - { - "Code": "BILFG7", - "Content": "F?chergruppen", - "Type": "sachlich", - "Values": "9", - "Information": "false" - }, - { - "Code": "KB10A1", - "Content": "Berufsbereiche (KB2010), 1-Steller", - "Type": "sachlich", - "Values": "10", - "Information": "false" - }, - { - "Code": "KB10A3", - "Content": "Berufsgruppen (KB2010), 3-Steller", - "Type": "sachlich", - "Values": "144", - "Information": "true" - }, - { - "Code": "KB10A5", - "Content": "Berufsgattungen (KB2010), 5-Steller", - "Type": "sachlich", - "Values": "1300", - "Information": "true" - }, - { - "Code": "WAM6", - "Content": "Warenverzeichnis Au?enhandelsstatistik (6-Steller)", - "Type": "sachlich", - "Values": "6435", - "Information": "true" - }, - { - "Code": "WAM8", - "Content": "Warenverzeichnis Au?enhandelsstatistik (8-Steller)", - "Type": "sachlich", - "Values": "14244", - "Information": "true" - }, - { - "Code": "WISZW1", - "Content": "Wissenschaftszweige", - "Type": "sachlich", - "Values": "6", - "Information": "false" - } - ], - "Copyright": "? Statistisches Bundesamt (Destatis), 2023" -} diff --git a/tests/testthat/find2_fake/api/find/find-ef22fd.json b/tests/testthat/find2_fake/api/find/find-ef22fd.json deleted file mode 100644 index b0a6c4e..0000000 --- a/tests/testthat/find2_fake/api/find/find-ef22fd.json +++ /dev/null @@ -1,705 +0,0 @@ -{ - "Ident": { - "Service": "find", - "Method": "find" - }, - "Status": { - "Code": 100, - "Content": "test error message", - "Type": "Information" - }, - "Parameter": { - "username": "********************", - "password": "********************", - "term": "forst", - "category": "Alle", - "pagelength": "100", - "language": "de" - }, - "Cubes": [ - { - "Code": "12211BJ424", - "Content": "Mikrozensus, Erwerbstaetige aus Hauptwohnsitzhaushalten, Deutschland insgesamt, Berufsbereiche (KB2010), 1-Steller, Jahr", - "State": "vollst?ndig mit Werten", - "Time": "2020-2021", - "LatestUpdate": "30.01.2023 16:01:50h", - "Information": "false" - }, - { - "Code": "12211BJ425", - "Content": "Mikrozensus, Erwerbst?tige aus Hauptwohnsitzhaushalten, Deutschland insgesamt, Geschlecht, Berufsbereiche (KB2010), 1-Steller, Jahr", - "State": "vollst?ndig mit Werten", - "Time": "2020-2021", - "LatestUpdate": "30.01.2023 16:01:47h", - "Information": "false" - }, - { - "Code": "12211BJ426", - "Content": "Mikrozensus, Erwerbst?tige aus Hauptwohnsitzhaushalten, Deutschland insgesamt, Stellung im Beruf, Berufsbereiche (KB2010), 1-Steller, Jahr", - "State": "vollst?ndig mit Werten", - "Time": "2020-2021", - "LatestUpdate": "30.01.2023 16:01:37h", - "Information": "false" - }, - { - "Code": "12211BJ427", - "Content": "Mikrozensus, Erwerbst?tige aus Hauptwohnsitzhaushalten, Deutschland insgesamt, Geschlecht, Stellung im Beruf, Berufsbereiche (KB2010), 1-Steller, Jahr", - "State": "vollst?ndig mit Werten", - "Time": "2020-2021", - "LatestUpdate": "30.01.2023 16:01:53h", - "Information": "false" - }, - { - "Code": "21331BS002", - "Content": "Statistik der Gasth?rer, Gasth?rer, Deutschland insgesamt, F?chergruppen, Semester", - "State": "vollst?ndig mit Werten", - "Time": "WS 1994/95-WS 2021/22", - "LatestUpdate": "24.05.2022 08:01:01h", - "Information": "false" - }, - { - "Code": "21341BJ002", - "Content": "Statistik des Hochschulpersonals, Hauptberufl. wissenschaftl. u. k?nstler. Personal, Deutschland insgesamt, Geschlecht, Lehr- und Forschungsbereiche, Jahr", - "State": "vollst?ndig mit Werten", - "Time": "1997-2021", - "LatestUpdate": "22.09.2022 08:00:06h", - "Information": "false" - }, - { - "Code": "21341BJ003", - "Content": "Statistik des Hochschulpersonals, Professoren, Deutschland insgesamt, Geschlecht, F?chergruppen, Jahr", - "State": "vollst?ndig mit Werten", - "Time": "1997-2021", - "LatestUpdate": "22.09.2022 08:00:08h", - "Information": "false" - }, - { - "Code": "21351BJ001", - "Content": "Statistik der Habilitationen, Habilitationen, Deutschland insgesamt, F?chergruppen, Geschlecht, Nationalit?t, Jahr", - "State": "vollst?ndig mit Werten", - "Time": "1992-2021", - "LatestUpdate": "05.07.2022 08:00:41h", - "Information": "false" - }, - { - "Code": "21351BJ003", - "Content": "Statistik der Habilitationen, Durchschnittsalter der habilitierten Personen, Deutschland insgesamt, F?chergruppen, Jahr", - "State": "vollst?ndig mit Werten", - "Time": "1992-2021", - "LatestUpdate": "05.07.2022 08:00:38h", - "Information": "false" - }, - { - "Code": "21351BJ005", - "Content": "Statistik der Habilitationen, Durchschnittsalter der habilitierten Personen, Deutschland insgesamt, F?chergruppen, Geschlecht, Jahr", - "State": "vollst?ndig mit Werten", - "Time": "1992-2021", - "LatestUpdate": "05.07.2022 08:00:43h", - "Information": "false" - }, - { - "Code": "21352BJ011", - "Content": "Statistik der Promovierenden, Promovierende, Deutschland insgesamt, F?chergruppen, Altersgruppen (u24-40m, unbekannt), Stichtag", - "State": "vollst?ndig mit Werten", - "Time": "01.12.2019-01.12.2021", - "LatestUpdate": "15.08.2022 13:17:20h", - "Information": "false" - }, - { - "Code": "21352BJ012", - "Content": "Statistik der Promovierenden, Promovierende, Deutschland insgesamt, Geschlecht, F?chergruppen, Altersgruppen (u24-40m, unbekannt), Stichtag", - "State": "vollst?ndig mit Werten", - "Time": "01.12.2019-01.12.2021", - "LatestUpdate": "15.08.2022 13:17:17h", - "Information": "false" - }, - { - "Code": "21352BJ013", - "Content": "Statistik der Promovierenden, Promovierende, Durchschnittsalter der Promovierenden, Deutschland insgesamt, F?chergruppen, Stichtag", - "State": "vollst?ndig mit Werten", - "Time": "01.12.2019-01.12.2021", - "LatestUpdate": "15.08.2022 13:17:18h", - "Information": "false" - }, - { - "Code": "21352BJ014", - "Content": "Statistik der Promovierenden, Promovierende, Durchschnittsalter der Promovierenden, Deutschland insgesamt, Geschlecht, F?chergruppen, Stichtag", - "State": "vollst?ndig mit Werten", - "Time": "01.12.2019-01.12.2021", - "LatestUpdate": "15.08.2022 13:17:16h", - "Information": "false" - }, - { - "Code": "21352BJ015", - "Content": "Statistik der Promovierenden, Promovierende, Deutschland insgesamt, Nationalit?t, F?chergruppen, Stichtag", - "State": "vollst?ndig mit Werten", - "Time": "01.12.2019-01.12.2021", - "LatestUpdate": "15.08.2022 13:18:28h", - "Information": "false" - }, - { - "Code": "21352BJ016", - "Content": "Statistik der Promovierenden, Promovierende, Deutschland insgesamt, Geschlecht, Nationalit?t, F?chergruppen, Stichtag", - "State": "vollst?ndig mit Werten", - "Time": "01.12.2019-01.12.2021", - "LatestUpdate": "15.08.2022 13:18:25h", - "Information": "false" - }, - { - "Code": "21371BJ003", - "Content": "Hochschulfinanzstatistik, Ausgaben der Hochschulen, Deutschland insgesamt, F?chergruppen, Jahr", - "State": "vollst?ndig mit Werten", - "Time": "2006-2020", - "LatestUpdate": "22.03.2022 08:00:13h", - "Information": "false" - }, - { - "Code": "21371BJ004", - "Content": "Hochschulfinanzstatistik, Ausgaben der Hochschulen, Deutschland insgesamt, Hochschulart, F?chergruppen, Jahr", - "State": "vollst?ndig mit Werten", - "Time": "2006-2020", - "LatestUpdate": "22.03.2022 08:00:12h", - "Information": "false" - }, - { - "Code": "21371LJ003", - "Content": "Hochschulfinanzstatistik, Ausgaben der Hochschulen, Bundesl?nder, F?chergruppen, Jahr", - "State": "vollst?ndig mit Werten", - "Time": "2006-2020", - "LatestUpdate": "22.03.2022 08:00:14h", - "Information": "false" - }, - { - "Code": "21371LJ004", - "Content": "Hochschulfinanzstatistik, Ausgaben der Hochschulen, Bundesl?nder, Hochschulart, F?chergruppen, Jahr", - "State": "vollst?ndig mit Werten", - "Time": "2006-2020", - "LatestUpdate": "22.03.2022 08:00:16h", - "Information": "false" - }, - { - "Code": "21381BJ102", - "Content": "Hochschulstatistische Kennzahlen, Laufende Ausgaben der Hochschulen je Studierenden, Laufende Ausgaben d. Hochschulen je Wiss. Personal, Laufende Ausgaben der Hochschulen je Professor, Drittmittel der Hochschulen je Wiss. Personal, Drittmittel der Hochschulen je Professor, Deutschland insgesamt, F?chergruppen, Jahr", - "State": "vollst?ndig mit Werten", - "Time": "2011-2020", - "LatestUpdate": "20.09.2022 08:00:51h", - "Information": "false" - }, - { - "Code": "21431BJ009", - "Content": "F?rderung nach dem Stipendienprogramm-Gesetz, Stipendiaten, Deutschland insgesamt, F?chergruppen, Jahr", - "State": "vollst?ndig mit Werten", - "Time": "2020-2021", - "LatestUpdate": "31.05.2022 08:01:24h", - "Information": "false" - }, - { - "Code": "21431BJ010", - "Content": "F?rderung nach dem Stipendienprogramm-Gesetz, Stipendiaten, Deutschland insgesamt, Geschlecht, F?chergruppen, Jahr", - "State": "vollst?ndig mit Werten", - "Time": "2020-2021", - "LatestUpdate": "31.05.2022 08:01:28h", - "Information": "false" - }, - { - "Code": "21431BJ011", - "Content": "F?rderung nach dem Stipendienprogramm-Gesetz, Stipendiaten, Deutschland insgesamt, Nationalit?t, F?chergruppen, Jahr", - "State": "vollst?ndig mit Werten", - "Time": "2020-2021", - "LatestUpdate": "31.05.2022 08:01:26h", - "Information": "false" - }, - { - "Code": "21431BJ012", - "Content": "F?rderung nach dem Stipendienprogramm-Gesetz, Stipendiaten, Deutschland insgesamt, Geschlecht, Nationalit?t, F?chergruppen, Jahr", - "State": "vollst?ndig mit Werten", - "Time": "2020-2021", - "LatestUpdate": "31.05.2022 08:00:22h", - "Information": "false" - }, - { - "Code": "21811BJ007", - "Content": "Ausgaben, Einnahmen, Personal ?ff. Forschungseinr., Interne Ausgaben f?r Forschung und Entwicklung, Personal f?r FuE (Vollzeit?quivalente), Deutschland insgesamt, Wissenschaftszweige, Jahr", - "State": "vollst?ndig mit Werten", - "Time": "2019-2021", - "LatestUpdate": "08.03.2023 08:01:05h", - "Information": "false" - }, - { - "Code": "21811BJ008", - "Content": "Ausgaben, Einnahmen, Personal ?ff. Forschungseinr., Interne Ausgaben f?r Forschung und Entwicklung, Personal f?r FuE (Vollzeit?quivalente), Deutschland insgesamt, Einrichtungsgruppe, Wissenschaftszweige, Jahr", - "State": "vollst?ndig mit Werten", - "Time": "2019-2021", - "LatestUpdate": "08.03.2023 08:01:02h", - "Information": "false" - }, - { - "Code": "21811BJ009", - "Content": "Ausgaben, Einnahmen, Personal ?ff. Forschungseinr., Interne Ausgaben f?r Forschung und Entwicklung, Personal f?r FuE (Vollzeit?quivalente), Deutschland insgesamt, Einrichtungsart, Wissenschaftszweige, Jahr", - "State": "vollst?ndig mit Werten", - "Time": "2019-2021", - "LatestUpdate": "08.03.2023 08:01:17h", - "Information": "false" - }, - { - "Code": "21811BJ034", - "Content": "Ausgaben, Einnahmen, Personal ?ff. Forschungseinr., Personal f?r FuE (Vollzeit?quivalente), Deutschland insgesamt, Wissenschaftszweige, Personalgruppen, Jahr", - "State": "vollst?ndig mit Werten", - "Time": "2019-2021", - "LatestUpdate": "08.03.2023 08:05:13h", - "Information": "false" - }, - { - "Code": "21811LJ003", - "Content": "Ausgaben, Einnahmen, Personal ?ff. Forschungseinr., Interne Ausgaben f?r Forschung und Entwicklung, Bundesl?nder und Ausland, Wissenschaftszweige, Jahr", - "State": "vollst?ndig mit Werten", - "Time": "2019-2021", - "LatestUpdate": "08.03.2023 08:06:15h", - "Information": "false" - }, - { - "Code": "51000BJ160", - "Content": "Au?enhandel, Ausfuhr: Gewicht, Ausfuhr: Wert, Ausfuhr: Wert (US-Dollar), Einfuhr: Gewicht, Einfuhr: Wert, Einfuhr: Wert (US-Dollar), Warenverzeichnis Au?enhandelsstatistik (6-Steller), Deutschland insgesamt, Jahr", - "State": "vollst?ndig mit Werten", - "Time": "2008-2022", - "LatestUpdate": "20.03.2023 18:00:31h", - "Information": "false" - }, - { - "Code": "51000BJ161", - "Content": "Au?enhandel, Ausfuhr: Gewicht, Ausfuhr: Wert, Ausfuhr: Wert (US-Dollar), Einfuhr: Gewicht, Einfuhr: Wert, Einfuhr: Wert (US-Dollar), Warenverzeichnis Au?enhandelsstatistik (6-Steller), Deutschland insgesamt, L?nderverzeichnis f?r die Au?enhandelsstatistik, Jahr", - "State": "vollst?ndig mit Werten", - "Time": "2008-2022", - "LatestUpdate": "20.03.2023 18:15:53h", - "Information": "false" - }, - { - "Code": "51000BJ180", - "Content": "Au?enhandel, Ausfuhr: Besondere Ma?einheit, Ausfuhr: Gewicht, Ausfuhr: Wert, Ausfuhr: Wert (US-Dollar), Einfuhr: Besondere Ma?einheit, Einfuhr: Gewicht, Einfuhr: Wert, Einfuhr: Wert (US-Dollar), Warenverzeichnis Au?enhandelsstatistik (8-Steller), Deutschland insgesamt, Jahr", - "State": "vollst?ndig mit Werten", - "Time": "2006-2022", - "LatestUpdate": "20.03.2023 18:01:33h", - "Information": "false" - }, - { - "Code": "51000BJ181", - "Content": "Au?enhandel, Ausfuhr: Besondere Ma?einheit, Ausfuhr: Gewicht, Ausfuhr: Wert, Ausfuhr: Wert (US-Dollar), Einfuhr: Besondere Ma?einheit, Einfuhr: Gewicht, Einfuhr: Wert, Einfuhr: Wert (US-Dollar), Warenverzeichnis Au?enhandelsstatistik (8-Steller), Deutschland insgesamt, L?nderverzeichnis f?r die Au?enhandelsstatistik, Jahr", - "State": "vollst?ndig mit Werten", - "Time": "2006-2022", - "LatestUpdate": "20.03.2023 18:17:44h", - "Information": "false" - }, - { - "Code": "51000BM160", - "Content": "Au?enhandel, Ausfuhr: Gewicht, Ausfuhr: Wert, Ausfuhr: Wert (US-Dollar), Einfuhr: Gewicht, Einfuhr: Wert, Einfuhr: Wert (US-Dollar), Warenverzeichnis Au?enhandelsstatistik (6-Steller), Deutschland insgesamt, Monate, Jahr", - "State": "vollst?ndig mit Werten", - "Time": "Januar 2008-Januar 2023", - "LatestUpdate": "20.03.2023 18:12:08h", - "Information": "false" - }, - { - "Code": "51000BM161", - "Content": "Au?enhandel, Ausfuhr: Gewicht, Ausfuhr: Wert, Ausfuhr: Wert (US-Dollar), Einfuhr: Gewicht, Einfuhr: Wert, Einfuhr: Wert (US-Dollar), Warenverzeichnis Au?enhandelsstatistik (6-Steller), Deutschland insgesamt, L?nderverzeichnis f?r die Au?enhandelsstatistik, Monate, Jahr", - "State": "vollst?ndig mit Werten", - "Time": "Januar 2008-Januar 2023", - "LatestUpdate": "20.03.2023 18:50:12h", - "Information": "false" - }, - { - "Code": "51000BM180", - "Content": "Au?enhandel, Ausfuhr: Besondere Ma?einheit, Ausfuhr: Gewicht, Ausfuhr: Wert, Ausfuhr: Wert (US-Dollar), Einfuhr: Besondere Ma?einheit, Einfuhr: Gewicht, Einfuhr: Wert, Einfuhr: Wert (US-Dollar), Warenverzeichnis Au?enhandelsstatistik (8-Steller), Deutschland insgesamt, Monate, Jahr", - "State": "vollst?ndig mit Werten", - "Time": "Januar 2006-Januar 2023", - "LatestUpdate": "20.03.2023 18:13:34h", - "Information": "false" - }, - { - "Code": "51000BM181", - "Content": "Au?enhandel, Ausfuhr: Besondere Ma?einheit, Ausfuhr: Gewicht, Ausfuhr: Wert, Ausfuhr: Wert (US-Dollar), Einfuhr: Besondere Ma?einheit, Einfuhr: Gewicht, Einfuhr: Wert, Einfuhr: Wert (US-Dollar), Warenverzeichnis Au?enhandelsstatistik (8-Steller), Deutschland insgesamt, L?nderverzeichnis f?r die Au?enhandelsstatistik, Monate, Jahr", - "State": "vollst?ndig mit Werten", - "Time": "Januar 2006-Januar 2023", - "LatestUpdate": "20.03.2023 19:37:45h", - "Information": "false" - }, - { - "Code": "62361BJ009", - "Content": "Verdiensterhebung, Durchschn. Bruttostundenverdienste ohne Sonderz., Durchschn. Bruttomonatsverdienste ohne Sonderz., Mittlere Bruttostundenverdienste ohne Sonderz., Mittlere Bruttomonatsverdienste ohne Sonderz., Deutschland insgesamt, Berufsgruppen (KB2010), 3-Steller, Stichmonat", - "State": "vollst?ndig mit Werten", - "Time": "04/2022", - "LatestUpdate": "23.11.2022 18:07:06h", - "Information": "false" - }, - { - "Code": "62361BJ010", - "Content": "Verdiensterhebung, Durchschn. Bruttostundenverdienste ohne Sonderz., Durchschn. Bruttomonatsverdienste ohne Sonderz., Mittlere Bruttostundenverdienste ohne Sonderz., Mittlere Bruttomonatsverdienste ohne Sonderz., Deutschland insgesamt, Berufsgattungen (KB2010), 5-Steller, Stichmonat", - "State": "vollst?ndig mit Werten", - "Time": "04/2022", - "LatestUpdate": "23.11.2022 18:07:06h", - "Information": "false" - }, - { - "Code": "62361BJ012", - "Content": "Verdiensterhebung, Durchschn. Bruttostundenverdienste ohne Sonderz., Durchschn. Bruttomonatsverdienste ohne Sonderz., Mittlere Bruttostundenverdienste ohne Sonderz., Mittlere Bruttomonatsverdienste ohne Sonderz., Deutschland insgesamt, Geschlecht, Berufsgruppen (KB2010), 3-Steller, Stichmonat", - "State": "vollst?ndig mit Werten", - "Time": "04/2022", - "LatestUpdate": "23.11.2022 18:07:07h", - "Information": "false" - }, - { - "Code": "62361BJ013", - "Content": "Verdiensterhebung, Durchschn. Bruttostundenverdienste ohne Sonderz., Durchschn. Bruttomonatsverdienste ohne Sonderz., Mittlere Bruttostundenverdienste ohne Sonderz., Mittlere Bruttomonatsverdienste ohne Sonderz., Deutschland insgesamt, Geschlecht, Berufsgattungen (KB2010), 5-Steller, Stichmonat", - "State": "vollst?ndig mit Werten", - "Time": "04/2022", - "LatestUpdate": "23.11.2022 18:07:07h", - "Information": "false" - }, - { - "Code": "71141BJ006", - "Content": "Rechnungsergebnisse d.?ffentlichen Gesamthaushalts, Nettoausgaben, Personalausgaben, Bauma?nahmen, Deutschland insgesamt, K?rperschaftsgruppen, Aufgabenbereiche der ?ffentlichen Haushalte, Jahr", - "State": "vollst?ndig mit Werten", - "Time": "1992-2011", - "LatestUpdate": "26.02.2014 15:37:23h", - "Information": "false" - } - ], - "Statistics": [ - { - "Code": "12211", - "Content": "Mikrozensus", - "Cubes": "483", - "Information": "true" - }, - { - "Code": "21331", - "Content": "Statistik der Gasth?rer", - "Cubes": "2", - "Information": "true" - }, - { - "Code": "21341", - "Content": "Statistik des Hochschulpersonals", - "Cubes": "3", - "Information": "true" - }, - { - "Code": "21351", - "Content": "Statistik der Habilitationen", - "Cubes": "6", - "Information": "true" - }, - { - "Code": "21352", - "Content": "Statistik der Promovierenden", - "Cubes": "28", - "Information": "true" - }, - { - "Code": "21371", - "Content": "Hochschulfinanzstatistik", - "Cubes": "8", - "Information": "true" - }, - { - "Code": "21381", - "Content": "Hochschulstatistische Kennzahlen", - "Cubes": "11", - "Information": "false" - }, - { - "Code": "21431", - "Content": "F?rderung nach dem Stipendienprogramm-Gesetz", - "Cubes": "37", - "Information": "true" - }, - { - "Code": "21811", - "Content": "Ausgaben, Einnahmen, Personal ?ff. Forschungseinr.", - "Cubes": "47", - "Information": "true" - }, - { - "Code": "51000", - "Content": "Au?enhandel", - "Cubes": "79", - "Information": "true" - }, - { - "Code": "62361", - "Content": "Verdiensterhebung", - "Cubes": "103", - "Information": "true" - }, - { - "Code": "71141", - "Content": "Rechnungsergebnisse d.?ffentlichen Gesamthaushalts", - "Cubes": "10", - "Information": "true" - } - ], - "Tables": [ - { - "Code": "12211-0009", - "Content": "Erwerbst?tige aus Hauptwohnsitzhaushalten: Deutschland,\nJahre, Geschlecht, Stellung im Beruf, Berufe", - "Time": "" - }, - { - "Code": "21331-0002", - "Content": "Gasth?rer: Deutschland, Semester, F?chergruppen", - "Time": "" - }, - { - "Code": "21341-0002", - "Content": "Hauptberufliches wissenschaftliches und k?nstlerisches\nPersonal an Hochschulen: Deutschland, Jahre, Lehr- und\nForschungsbereiche nach F?chergruppen, Geschlecht", - "Time": "" - }, - { - "Code": "21341-0003", - "Content": "Professoren: Deutschland, Jahre, F?chergruppen, Geschlecht", - "Time": "" - }, - { - "Code": "21351-0001", - "Content": "Habilitationen: Deutschland, Jahre, F?chergruppen,\nNationalit?t, Geschlecht", - "Time": "" - }, - { - "Code": "21351-0002", - "Content": "Durchschnittsalter der habilitierten Personen: Deutschland,\nJahre, F?chergruppen, Geschlecht", - "Time": "" - }, - { - "Code": "21352-0002", - "Content": "Promovierende: Deutschland, Stichtag, Geschlecht,\nAltersgruppen, F?chergruppen", - "Time": "" - }, - { - "Code": "21352-0003", - "Content": "Promovierende: Deutschland, Stichtag, Nationalit?t,\nGeschlecht, F?chergruppen und Studienbereiche", - "Time": "" - }, - { - "Code": "21352-0004", - "Content": "Durchschnittsalter der Promovierenden: Deutschland,\nStichtag, Geschlecht, F?chergruppen", - "Time": "" - }, - { - "Code": "21371-0001", - "Content": "Ausgaben der Hochschulen: Deutschland, Jahre, Hochschulart,\nF?chergruppen", - "Time": "" - }, - { - "Code": "21371-0002", - "Content": "Ausgaben der Hochschulen: Bundesl?nder, Jahre, Hochschulart,\nF?chergruppen", - "Time": "" - }, - { - "Code": "21381-0005", - "Content": "Laufende Ausgaben der Hochschulen, Drittmittel der\nHochschulen: Deutschland, Jahre, F?chergruppen", - "Time": "" - }, - { - "Code": "21431-0004", - "Content": "Stipendiaten: Deutschland, Jahre, Nationalit?t, Geschlecht,\nF?chergruppen", - "Time": "" - }, - { - "Code": "21811-0003", - "Content": "Interne Ausgaben f?r Forschung und Entwicklung: Deutschland,\nJahre, Einrichtungsart, Wissenschaftszweige", - "Time": "" - }, - { - "Code": "21811-0005", - "Content": "Personal f?r Forschung und Entwicklung (Vollzeit?quivalente): Deutschland, Jahre, Einrichtungsart, Wissenschaftszweige", - "Time": "" - }, - { - "Code": "21811-0007", - "Content": "Personal f?r Forschung und Entwicklung (Vollzeit?quivalente): Deutschland, Jahre, Personalgruppen, Wissenschaftszweige", - "Time": "" - }, - { - "Code": "21811-0022", - "Content": "Interne Ausgaben f?r Forschung und Entwicklung: Bundesl?nder\nund Ausland, Jahre, Wissenschaftszweige", - "Time": "" - }, - { - "Code": "51000-0005", - "Content": "Aus- und Einfuhr (Au?enhandel): Deutschland, Jahre,\nWarensystematik", - "Time": "" - }, - { - "Code": "51000-0006", - "Content": "Aus- und Einfuhr (Au?enhandel): Deutschland, Monate,\nWarensystematik", - "Time": "" - }, - { - "Code": "51000-0009", - "Content": "Aus- und Einfuhr (Au?enhandel): Deutschland, Jahre, Land,\nWarenverzeichnis (4-/6-Steller)", - "Time": "" - }, - { - "Code": "51000-0010", - "Content": "Aus- und Einfuhr (Au?enhandel): Deutschland, Jahre,\nWare (4-/6-Steller), L?nder", - "Time": "" - }, - { - "Code": "51000-0011", - "Content": "Aus- und Einfuhr (Au?enhandel): Deutschland, Monate, Land,\nWarenverzeichnis (4-/6-Steller)", - "Time": "" - }, - { - "Code": "51000-0012", - "Content": "Aus- und Einfuhr (Au?enhandel): Deutschland, Monate,\nWare (4-/6-Steller), L?nder", - "Time": "" - }, - { - "Code": "51000-0013", - "Content": "Aus- und Einfuhr (Au?enhandel): Deutschland, Jahre,\nWarenverzeichnis (8-Steller)", - "Time": "" - }, - { - "Code": "51000-0014", - "Content": "Aus- und Einfuhr (Au?enhandel): Deutschland, Monate,\nWarenverzeichnis (8-Steller)", - "Time": "" - }, - { - "Code": "51000-0015", - "Content": "Aus- und Einfuhr (Au?enhandel): Deutschland, Jahre, Land,\nWarenverzeichnis (8-Steller)", - "Time": "" - }, - { - "Code": "51000-0016", - "Content": "Aus- und Einfuhr (Au?enhandel): Deutschland, Jahre,\nWare (8-Steller), L?nder", - "Time": "" - }, - { - "Code": "51000-0017", - "Content": "Aus- und Einfuhr (Au?enhandel): Deutschland, Monate, Land,\nWarenverzeichnis (8-Steller)", - "Time": "" - }, - { - "Code": "51000-0018", - "Content": "Aus- und Einfuhr (Au?enhandel): Deutschland, Monate,\nWare (8-Steller), L?nder", - "Time": "" - }, - { - "Code": "62361-0030", - "Content": "Bruttostundenverdienste, Bruttomonatsverdienste: Deutschland, Stichmonat, Geschlecht, Berufe", - "Time": "" - }, - { - "Code": "71141-0004", - "Content": "Rechnungsergebnisse des ?ffentlichen Gesamthaushalts\n(Nettoausgaben, Personalausgaben, Bauma?nahmen):\nDeutschland, Jahre, K?rperschaftsgruppen, Aufgabenbereiche", - "Time": "" - } - ], - "Timeseries": null, - "Variables": [ - { - "Code": "AFGBE3", - "Content": "Aufgabenbereiche der ?ffentlichen Haushalte", - "Type": "sachlich", - "Values": "22", - "Information": "false" - }, - { - "Code": "BERLF1", - "Content": "Lehr- und Forschungsbereiche", - "Type": "sachlich", - "Values": "84", - "Information": "false" - }, - { - "Code": "BILFG1", - "Content": "F?chergruppen", - "Type": "sachlich", - "Values": "10", - "Information": "false" - }, - { - "Code": "BILFG2", - "Content": "F?chergruppen", - "Type": "sachlich", - "Values": "10", - "Information": "false" - }, - { - "Code": "BILFG3", - "Content": "F?chergruppen", - "Type": "sachlich", - "Values": "11", - "Information": "false" - }, - { - "Code": "BILFG4", - "Content": "F?chergruppen", - "Type": "sachlich", - "Values": "9", - "Information": "false" - }, - { - "Code": "BILFG5", - "Content": "F?chergruppen", - "Type": "sachlich", - "Values": "8", - "Information": "false" - }, - { - "Code": "BILFG6", - "Content": "F?chergruppen", - "Type": "sachlich", - "Values": "12", - "Information": "false" - }, - { - "Code": "BILFG7", - "Content": "F?chergruppen", - "Type": "sachlich", - "Values": "9", - "Information": "false" - }, - { - "Code": "KB10A1", - "Content": "Berufsbereiche (KB2010), 1-Steller", - "Type": "sachlich", - "Values": "10", - "Information": "false" - }, - { - "Code": "KB10A3", - "Content": "Berufsgruppen (KB2010), 3-Steller", - "Type": "sachlich", - "Values": "144", - "Information": "true" - }, - { - "Code": "KB10A5", - "Content": "Berufsgattungen (KB2010), 5-Steller", - "Type": "sachlich", - "Values": "1300", - "Information": "true" - }, - { - "Code": "WAM6", - "Content": "Warenverzeichnis Au?enhandelsstatistik (6-Steller)", - "Type": "sachlich", - "Values": "6435", - "Information": "true" - }, - { - "Code": "WAM8", - "Content": "Warenverzeichnis Au?enhandelsstatistik (8-Steller)", - "Type": "sachlich", - "Values": "14244", - "Information": "true" - }, - { - "Code": "WISZW1", - "Content": "Wissenschaftszweige", - "Type": "sachlich", - "Values": "6", - "Information": "false" - } - ], - "Copyright": "? Statistisches Bundesamt (Destatis), 2023" -} diff --git a/tests/testthat/find3/api/find/find-9961d3.json b/tests/testthat/find3/api/find/find-9961d3.json deleted file mode 100644 index e8345bd..0000000 --- a/tests/testthat/find3/api/find/find-9961d3.json +++ /dev/null @@ -1,294 +0,0 @@ -{ - "Ident": { - "Service": "find", - "Method": "find" - }, - "Status": { - "Code": 0, - "Content": "erfolgreich", - "Type": "Information" - }, - "Parameter": { - "username": "********************", - "password": "********************", - "term": "zensus", - "category": "Alle", - "pagelength": "100", - "language": "de" - }, - "Cubes": [ - { - "Code": "12111B1001", - "Content": "Zensus, Bevoelkerung (Zensus), Deutschland insgesamt, Stichtag", - "State": "vollst?ndig mit Werten", - "Time": "09.05.2011", - "LatestUpdate": "12.10.2017 14:40:27h", - "Information": "false" - }, - { - "Code": "12111B1002", - "Content": "Zensus, Bev?lkerung (Zensus), Deutschland insgesamt, Nationalit?t, Stichtag", - "State": "vollst?ndig mit Werten", - "Time": "09.05.2011", - "LatestUpdate": "10.04.2014 08:01:20h", - "Information": "false" - }, - { - "Code": "12111B1003", - "Content": "Zensus, Bev?lkerung (Zensus), Deutschland insgesamt, Geschlecht, Stichtag", - "State": "vollst?ndig mit Werten", - "Time": "09.05.2011", - "LatestUpdate": "02.03.2018 14:22:34h", - "Information": "false" - }, - { - "Code": "12111B1004", - "Content": "Zensus, Bev?lkerung (Zensus), Deutschland insgesamt, Altersgruppen (u3-75m), Stichtag", - "State": "vollst?ndig mit Werten", - "Time": "09.05.2011", - "LatestUpdate": "02.03.2018 14:18:48h", - "Information": "false" - }, - { - "Code": "12111B1005", - "Content": "Zensus, Bev?lkerung (Zensus), Deutschland insgesamt, Altersgruppen (u18-65m), Stichtag", - "State": "vollst?ndig mit Werten", - "Time": "09.05.2011", - "LatestUpdate": "10.04.2014 08:01:24h", - "Information": "false" - }, - { - "Code": "12111B1006", - "Content": "Zensus, Bev?lkerung (Zensus), Deutschland insgesamt, Familienstand, Stichtag", - "State": "vollst?ndig mit Werten", - "Time": "09.05.2011", - "LatestUpdate": "10.04.2014 08:01:26h", - "Information": "false" - }, - { - "Code": "12111B1007", - "Content": "Zensus, Bev?lkerung (Zensus), Deutschland insgesamt, Nationalit?t, Geschlecht, Stichtag", - "State": "vollst?ndig mit Werten", - "Time": "09.05.2011", - "LatestUpdate": "10.04.2014 08:01:28h", - "Information": "false" - }, - { - "Code": "12111B1008", - "Content": "Zensus, Bev?lkerung (Zensus), Deutschland insgesamt, Nationalit?t, Altersgruppen (u3-75m), Stichtag", - "State": "vollst?ndig mit Werten", - "Time": "09.05.2011", - "LatestUpdate": "10.04.2014 08:01:29h", - "Information": "false" - }, - { - "Code": "12111B1009", - "Content": "Zensus, Bev?lkerung (Zensus), Deutschland insgesamt, Nationalit?t, Familienstand, Stichtag", - "State": "vollst?ndig mit Werten", - "Time": "09.05.2011", - "LatestUpdate": "10.04.2014 08:01:30h", - "Information": "false" - }, - { - "Code": "12111B1010", - "Content": "Zensus, Bev?lkerung (Zensus), Deutschland insgesamt, Geschlecht, Altersgruppen (u3-75m), Stichtag", - "State": "vollst?ndig mit Werten", - "Time": "09.05.2011", - "LatestUpdate": "10.04.2014 08:01:17h", - "Information": "false" - }, - { - "Code": "12111B1011", - "Content": "Zensus, Bev?lkerung (Zensus), Deutschland insgesamt, Geschlecht, Familienstand, Stichtag", - "State": "vollst?ndig mit Werten", - "Time": "09.05.2011", - "LatestUpdate": "10.04.2014 08:00:54h", - "Information": "false" - }, - { - "Code": "12111B1012", - "Content": "Zensus, Bev?lkerung (Zensus), Deutschland insgesamt, Altersgruppen (u18-65m), Familienstand, Stichtag", - "State": "vollst?ndig mit Werten", - "Time": "09.05.2011", - "LatestUpdate": "10.04.2014 08:00:55h", - "Information": "false" - }, - { - "Code": "12111L1001", - "Content": "Zensus, Bev?lkerung (Zensus), Bundesl?nder, Stichtag", - "State": "vollst?ndig mit Werten", - "Time": "09.05.2011", - "LatestUpdate": "10.04.2014 08:00:57h", - "Information": "false" - }, - { - "Code": "12111L1002", - "Content": "Zensus, Bev?lkerung (Zensus), Bundesl?nder, Nationalit?t, Stichtag", - "State": "vollst?ndig mit Werten", - "Time": "09.05.2011", - "LatestUpdate": "10.04.2014 08:00:59h", - "Information": "false" - }, - { - "Code": "12111L1003", - "Content": "Zensus, Bev?lkerung (Zensus), Bundesl?nder, Geschlecht, Stichtag", - "State": "vollst?ndig mit Werten", - "Time": "09.05.2011", - "LatestUpdate": "10.04.2014 08:01:00h", - "Information": "false" - }, - { - "Code": "12111L1004", - "Content": "Zensus, Bev?lkerung (Zensus), Bundesl?nder, Altersgruppen (u3-75m), Stichtag", - "State": "vollst?ndig mit Werten", - "Time": "09.05.2011", - "LatestUpdate": "10.04.2014 08:01:02h", - "Information": "false" - }, - { - "Code": "12111L1005", - "Content": "Zensus, Bev?lkerung (Zensus), Bundesl?nder, Altersgruppen (u18-65m), Stichtag", - "State": "vollst?ndig mit Werten", - "Time": "09.05.2011", - "LatestUpdate": "10.04.2014 08:01:04h", - "Information": "false" - }, - { - "Code": "12111L1006", - "Content": "Zensus, Bev?lkerung (Zensus), Bundesl?nder, Familienstand, Stichtag", - "State": "vollst?ndig mit Werten", - "Time": "09.05.2011", - "LatestUpdate": "10.04.2014 08:01:05h", - "Information": "false" - }, - { - "Code": "12111L1007", - "Content": "Zensus, Bev?lkerung (Zensus), Bundesl?nder, Nationalit?t, Geschlecht, Stichtag", - "State": "vollst?ndig mit Werten", - "Time": "09.05.2011", - "LatestUpdate": "10.04.2014 08:01:07h", - "Information": "false" - }, - { - "Code": "12111L1008", - "Content": "Zensus, Bev?lkerung (Zensus), Bundesl?nder, Nationalit?t, Altersgruppen (u3-75m), Stichtag", - "State": "vollst?ndig mit Werten", - "Time": "09.05.2011", - "LatestUpdate": "10.04.2014 08:01:09h", - "Information": "false" - }, - { - "Code": "12111L1009", - "Content": "Zensus, Bev?lkerung (Zensus), Bundesl?nder, Nationalit?t, Familienstand, Stichtag", - "State": "vollst?ndig mit Werten", - "Time": "09.05.2011", - "LatestUpdate": "10.04.2014 08:01:10h", - "Information": "false" - }, - { - "Code": "12111L1010", - "Content": "Zensus, Bev?lkerung (Zensus), Bundesl?nder, Geschlecht, Altersgruppen (u3-75m), Stichtag", - "State": "vollst?ndig mit Werten", - "Time": "09.05.2011", - "LatestUpdate": "10.04.2014 08:01:12h", - "Information": "false" - }, - { - "Code": "12111L1011", - "Content": "Zensus, Bev?lkerung (Zensus), Bundesl?nder, Geschlecht, Familienstand, Stichtag", - "State": "vollst?ndig mit Werten", - "Time": "09.05.2011", - "LatestUpdate": "10.04.2014 08:01:16h", - "Information": "false" - }, - { - "Code": "12111L1012", - "Content": "Zensus, Bev?lkerung (Zensus), Bundesl?nder, Altersgruppen (u18-65m), Familienstand, Stichtag", - "State": "vollst?ndig mit Werten", - "Time": "09.05.2011", - "LatestUpdate": "10.04.2014 08:01:14h", - "Information": "false" - } - ], - "Statistics": [ - { - "Code": "12111", - "Content": "Zensus", - "Cubes": "24", - "Information": "true" - } - ], - "Tables": [ - { - "Code": "12111-0001", - "Content": "Bev?lkerung (Zensus): Deutschland, Stichtag, Nationalit?t,\nGeschlecht", - "Time": "" - }, - { - "Code": "12111-0002", - "Content": "Bev?lkerung (Zensus): Deutschland, Stichtag, Nationalit?t,\nAltersgruppen", - "Time": "" - }, - { - "Code": "12111-0003", - "Content": "Bev?lkerung (Zensus): Deutschland, Stichtag, Nationalit?t,\nFamilienstand", - "Time": "" - }, - { - "Code": "12111-0004", - "Content": "Bev?lkerung (Zensus): Deutschland, Stichtag, Geschlecht,\nAltersgruppen", - "Time": "" - }, - { - "Code": "12111-0005", - "Content": "Bev?lkerung (Zensus): Deutschland, Stichtag, Geschlecht,\nFamilienstand", - "Time": "" - }, - { - "Code": "12111-0006", - "Content": "Bev?lkerung (Zensus): Deutschland, Stichtag, Familienstand,\nAltersgruppen", - "Time": "" - }, - { - "Code": "12111-0101", - "Content": "Bev?lkerung (Zensus): Bundesl?nder, Stichtag, Nationalit?t,\nGeschlecht", - "Time": "" - }, - { - "Code": "12111-0102", - "Content": "Bev?lkerung (Zensus): Bundesl?nder, Stichtag, Nationalit?t,\nAltersgruppen", - "Time": "" - }, - { - "Code": "12111-0103", - "Content": "Bev?lkerung (Zensus): Bundesl?nder, Stichtag, Nationalit?t,\nFamilienstand", - "Time": "" - }, - { - "Code": "12111-0104", - "Content": "Bev?lkerung (Zensus): Bundesl?nder, Stichtag, Geschlecht,\nAltersgruppen", - "Time": "" - }, - { - "Code": "12111-0105", - "Content": "Bev?lkerung (Zensus): Bundesl?nder, Stichtag, Geschlecht,\nFamilienstand", - "Time": "" - }, - { - "Code": "12111-0106", - "Content": "Bev?lkerung (Zensus): Bundesl?nder, Stichtag, Familienstand,\nAltersgruppen", - "Time": "" - } - ], - "Timeseries": null, - "Variables": [ - { - "Code": "BEVZ01", - "Content": "Bev?lkerung (Zensus)", - "Type": "Wert", - "Values": "-1", - "Information": "false" - } - ], - "Copyright": "? Statistisches Bundesamt (Destatis), 2023" -} diff --git a/tests/testthat/meta1/api/metadata/table-7837de.json b/tests/testthat/meta1/api/metadata/table-7837de.json deleted file mode 100644 index b64589b..0000000 --- a/tests/testthat/meta1/api/metadata/table-7837de.json +++ /dev/null @@ -1,74 +0,0 @@ -{ - "Ident": { - "Service": "metadata", - "Method": "table" - }, - "Status": { - "Code": 0, - "Content": "erfolgreich", - "Type": "Information" - }, - "Parameter": { - "username": "********************", - "password": "********************", - "name": "11111-0001", - "area": "oeffentlich", - "language": "de" - }, - "Object": { - "Code": "11111-0001", - "Content": "Gebietsfl?che: Bundesl?nder, Stichtag", - "Time": { - "From": "31.12.1995", - "To": "31.12.2020" - }, - "Valid": "false", - "Structure": { - "Head": { - "Code": "11111", - "Content": "Feststellung des Gebietsstands", - "Type": "Statistik", - "Values": null, - "Selected": null, - "Structure": [ - { - "Code": "FLC006", - "Content": "Gebietsfl?che", - "Type": "Merkmal", - "Values": null, - "Selected": null, - "Structure": null, - "Updated": "see parent" - } - ], - "Updated": "see parent" - }, - "Columns": [ - { - "Code": "STAG", - "Content": "Stichtag", - "Type": "Merkmal", - "Values": "1", - "Selected": "1", - "Structure": null, - "Updated": "see parent" - } - ], - "Rows": [ - { - "Code": "DLAND", - "Content": "Bundesl?nder", - "Type": "Merkmal", - "Values": null, - "Selected": null, - "Structure": null, - "Updated": "see parent" - } - ], - "Subtitel": null, - "Subheading": null - }, - "Updated": "28.12.2022 09:24:14h" - }, - "Copyright": "? Statistisches Bundesamt (Destatis), 2023" -} diff --git a/tests/testthat/meta2_fake/api/metadata/cube-8d0bb5.json b/tests/testthat/meta2_fake/api/metadata/cube-8d0bb5.json deleted file mode 100644 index dcd9d6c..0000000 --- a/tests/testthat/meta2_fake/api/metadata/cube-8d0bb5.json +++ /dev/null @@ -1,74 +0,0 @@ -{ - "Ident": { - "Service": "metadata", - "Method": "table" - }, - "Status": { - "Code": 100, - "Content": "test error message", - "Type": "Information" - }, - "Parameter": { - "username": "********************", - "password": "********************", - "name": "11111-0001", - "area": "oeffentlich", - "language": "de" - }, - "Object": { - "Code": "11111-0001", - "Content": "Gebietsfl?che: Bundesl?nder, Stichtag", - "Time": { - "From": "31.12.1995", - "To": "31.12.2020" - }, - "Valid": "false", - "Structure": { - "Head": { - "Code": "11111", - "Content": "Feststellung des Gebietsstands", - "Type": "Statistik", - "Values": null, - "Selected": null, - "Structure": [ - { - "Code": "FLC006", - "Content": "Gebietsfl?che", - "Type": "Merkmal", - "Values": null, - "Selected": null, - "Structure": null, - "Updated": "see parent" - } - ], - "Updated": "see parent" - }, - "Columns": [ - { - "Code": "STAG", - "Content": "Stichtag", - "Type": "Merkmal", - "Values": "1", - "Selected": "1", - "Structure": null, - "Updated": "see parent" - } - ], - "Rows": [ - { - "Code": "DLAND", - "Content": "Bundesl?nder", - "Type": "Merkmal", - "Values": null, - "Selected": null, - "Structure": null, - "Updated": "see parent" - } - ], - "Subtitel": null, - "Subheading": null - }, - "Updated": "28.12.2022 09:24:14h" - }, - "Copyright": "? Statistisches Bundesamt (Destatis), 2023" -} diff --git a/tests/testthat/meta3/api/metadata/table-7837de.json b/tests/testthat/meta3/api/metadata/table-7837de.json deleted file mode 100644 index b64589b..0000000 --- a/tests/testthat/meta3/api/metadata/table-7837de.json +++ /dev/null @@ -1,74 +0,0 @@ -{ - "Ident": { - "Service": "metadata", - "Method": "table" - }, - "Status": { - "Code": 0, - "Content": "erfolgreich", - "Type": "Information" - }, - "Parameter": { - "username": "********************", - "password": "********************", - "name": "11111-0001", - "area": "oeffentlich", - "language": "de" - }, - "Object": { - "Code": "11111-0001", - "Content": "Gebietsfl?che: Bundesl?nder, Stichtag", - "Time": { - "From": "31.12.1995", - "To": "31.12.2020" - }, - "Valid": "false", - "Structure": { - "Head": { - "Code": "11111", - "Content": "Feststellung des Gebietsstands", - "Type": "Statistik", - "Values": null, - "Selected": null, - "Structure": [ - { - "Code": "FLC006", - "Content": "Gebietsfl?che", - "Type": "Merkmal", - "Values": null, - "Selected": null, - "Structure": null, - "Updated": "see parent" - } - ], - "Updated": "see parent" - }, - "Columns": [ - { - "Code": "STAG", - "Content": "Stichtag", - "Type": "Merkmal", - "Values": "1", - "Selected": "1", - "Structure": null, - "Updated": "see parent" - } - ], - "Rows": [ - { - "Code": "DLAND", - "Content": "Bundesl?nder", - "Type": "Merkmal", - "Values": null, - "Selected": null, - "Structure": null, - "Updated": "see parent" - } - ], - "Subtitel": null, - "Subheading": null - }, - "Updated": "28.12.2022 09:24:14h" - }, - "Copyright": "? Statistisches Bundesamt (Destatis), 2023" -} diff --git a/tests/testthat/modified1/api/catalogue/modifieddata-00f7a4.json b/tests/testthat/modified1/api/catalogue/modifieddata-00f7a4.json deleted file mode 100644 index 78a79db..0000000 --- a/tests/testthat/modified1/api/catalogue/modifieddata-00f7a4.json +++ /dev/null @@ -1,31 +0,0 @@ -{ - "Ident": { - "Service": "catalogue", - "Method": "modifieddata" - }, - "Status": { - "Code": 0, - "Content": "erfolgreich", - "Type": "Information" - }, - "Parameter": { - "username": "********************", - "password": "********************", - "selection": "61111", - "type": "Alle", - "date": "01.01.2022", - "pagelength": "100", - "language": "de", - "area": "Alle" - }, - "List": [ - { - "Code": "61111", - "Content": "Verbraucherpreisindex fuer Deutschland", - "Type": "Aktualisierte Statistiken", - "Date": "10.03.2023", - "Added": "Feb 2023" - } - ], - "Copyright": "? Statistisches Bundesamt (Destatis), 2023" -} diff --git a/tests/testthat/modified2/api/catalogue/modifieddata-ceb5a8.json b/tests/testthat/modified2/api/catalogue/modifieddata-ceb5a8.json deleted file mode 100644 index 806354c..0000000 --- a/tests/testthat/modified2/api/catalogue/modifieddata-ceb5a8.json +++ /dev/null @@ -1,25 +0,0 @@ -{ - "Ident": { - "Service": "catalogue", - "Method": "modifieddata" - }, - "Status": { - "Code": 0, - "Content": "erfolgreich", - "Type": "Information" - }, - "Parameter": { - "username": "********************", - "password": "********************", - "selection": "61111", - "type": "Alle", - "date": "08.05.2023", - "pagelength": "100", - "language": "de", - "area": "Alle" - }, - "List": [ - null - ], - "Copyright": "© Statistisches Bundesamt (Destatis), 2023" -} diff --git a/tests/testthat/modified3/api/catalogue/modifieddata-00f7a4.json b/tests/testthat/modified3/api/catalogue/modifieddata-00f7a4.json deleted file mode 100644 index 78a79db..0000000 --- a/tests/testthat/modified3/api/catalogue/modifieddata-00f7a4.json +++ /dev/null @@ -1,31 +0,0 @@ -{ - "Ident": { - "Service": "catalogue", - "Method": "modifieddata" - }, - "Status": { - "Code": 0, - "Content": "erfolgreich", - "Type": "Information" - }, - "Parameter": { - "username": "********************", - "password": "********************", - "selection": "61111", - "type": "Alle", - "date": "01.01.2022", - "pagelength": "100", - "language": "de", - "area": "Alle" - }, - "List": [ - { - "Code": "61111", - "Content": "Verbraucherpreisindex fuer Deutschland", - "Type": "Aktualisierte Statistiken", - "Date": "10.03.2023", - "Added": "Feb 2023" - } - ], - "Copyright": "? Statistisches Bundesamt (Destatis), 2023" -} diff --git a/tests/testthat/modified4_fake/api/catalogue/modifieddata-66ae58.json b/tests/testthat/modified4_fake/api/catalogue/modifieddata-66ae58.json deleted file mode 100644 index 0c291fa..0000000 --- a/tests/testthat/modified4_fake/api/catalogue/modifieddata-66ae58.json +++ /dev/null @@ -1,23 +0,0 @@ -{ - "Ident": { - "Service": "catalogue", - "Method": "modifieddata" - }, - "Status": { - "Code": 104, - "Content": "test warning message", - "Type": "Information" - }, - "Parameter": { - "username": "********************", - "password": "********************", - "selection": "61234", - "type": "Alle", - "date": "01.01.2022", - "pagelength": "100", - "language": "de", - "area": "Alle" - }, - "List": null, - "Copyright": "Statistisches Bundesamt (Destatis), 2023" -} diff --git a/tests/testthat/searchvars1/api/catalogue/variables-a1a6d0.json b/tests/testthat/searchvars1/api/catalogue/variables-a1a6d0.json deleted file mode 100644 index 5add393..0000000 --- a/tests/testthat/searchvars1/api/catalogue/variables-a1a6d0.json +++ /dev/null @@ -1,725 +0,0 @@ -{ - "Ident": { - "Service": "catalogue", - "Method": "variables" - }, - "Status": { - "Code": 0, - "Content": "erfolgreich", - "Type": "Information" - }, - "Parameter": { - "username": "********************", - "password": "********************", - "selection": "", - "area": "oeffentlich", - "searchcriterion": "Code", - "sortcriterion": "Code", - "type": "Alle", - "pagelength": "100", - "language": "de" - }, - "List": [ - { - "Code": "ABF001", - "Content": "Input von Abfallentsorgungsanlagen", - "Type": "Wert", - "Values": "-1", - "Information": "false" - }, - { - "Code": "ABF002", - "Content": "Im eigenen Betrieb erzeugte Abf?lle", - "Type": "Wert", - "Values": "-1", - "Information": "false" - }, - { - "Code": "ABF003", - "Content": "Aus dem Inland angelieferter Abfall", - "Type": "Wert", - "Values": "-1", - "Information": "false" - }, - { - "Code": "ABF004", - "Content": "Aus dem Ausland angelieferter Abfall", - "Type": "Wert", - "Values": "-1", - "Information": "false" - }, - { - "Code": "ABF005", - "Content": "Output von Abfallentsorgungsanlagen", - "Type": "Wert", - "Values": "-1", - "Information": "false" - }, - { - "Code": "ABF006", - "Content": "Abf?lle zur Beseitigung", - "Type": "Wert", - "Values": "-1", - "Information": "false" - }, - { - "Code": "ABF007", - "Content": "Abf?lle zur Verwertung", - "Type": "Wert", - "Values": "-1", - "Information": "false" - }, - { - "Code": "ABF008", - "Content": "Beim Erstempf?nger beseitigte Haushaltsabf?lle", - "Type": "Wert", - "Values": "-1", - "Information": "false" - }, - { - "Code": "ABF009", - "Content": "Beim Erstempf?nger verwertete Haushaltsabf?lle", - "Type": "Wert", - "Values": "-1", - "Information": "false" - }, - { - "Code": "ABF010", - "Content": "Abfallerzeuger", - "Type": "Wert", - "Values": "-1", - "Information": "false" - }, - { - "Code": "ABF011", - "Content": "Abfallmengen", - "Type": "Wert", - "Values": "-1", - "Information": "false" - }, - { - "Code": "ABF012", - "Content": "Abfallmengen, von Prim?rerzeugern erzeugt", - "Type": "Wert", - "Values": "-1", - "Information": "false" - }, - { - "Code": "ABF013", - "Content": "Einsammler", - "Type": "Wert", - "Values": "-1", - "Information": "false" - }, - { - "Code": "ABF014", - "Content": "Erzeugte Abfallmenge", - "Type": "Wert", - "Values": "-1", - "Information": "true" - }, - { - "Code": "ABF015", - "Content": "Abf?lle zu vorbereitenden Verfahren", - "Type": "Wert", - "Values": "-1", - "Information": "false" - }, - { - "Code": "ABFAT1", - "Content": "Abfallarten", - "Type": "sachlich", - "Values": "5", - "Information": "false" - }, - { - "Code": "ABFAT2", - "Content": "Abfallarten", - "Type": "sachlich", - "Values": "14", - "Information": "false" - }, - { - "Code": "ABG002", - "Content": "Produktions- und Importabgaben abzgl. Subventionen", - "Type": "Wert", - "Values": "-1", - "Information": "true" - }, - { - "Code": "ABG003", - "Content": "Abgaben auf soz.Leistungen, verbrauchsnahe Steuern", - "Type": "Wert", - "Values": "-1", - "Information": "true" - }, - { - "Code": "ABG004", - "Content": "Abgabe an Sonstige", - "Type": "Wert", - "Values": "-1", - "Information": "false" - }, - { - "Code": "ABG005", - "Content": "Stromabgabe", - "Type": "Wert", - "Values": "-1", - "Information": "false" - }, - { - "Code": "ABG006", - "Content": "W?rmeabgabe", - "Type": "Wert", - "Values": "-1", - "Information": "false" - }, - { - "Code": "ABNAT1", - "Content": "Abnehmer", - "Type": "sachlich", - "Values": "4", - "Information": "false" - }, - { - "Code": "ABNGR1", - "Content": "Abnehmergruppen", - "Type": "sachlich", - "Values": "3", - "Information": "false" - }, - { - "Code": "ABNGR2", - "Content": "Abnehmergruppen", - "Type": "sachlich", - "Values": "3", - "Information": "false" - }, - { - "Code": "ABS002", - "Content": "Abschreibungen", - "Type": "Wert", - "Values": "-1", - "Information": "true" - }, - { - "Code": "ABS008", - "Content": "Abschreibungen (Anteil am BPW)", - "Type": "Wert", - "Values": "-1", - "Information": "true" - }, - { - "Code": "ABS009", - "Content": "Stromabsatz", - "Type": "Wert", - "Values": "-1", - "Information": "false" - }, - { - "Code": "ABS010", - "Content": "Gasabsatz", - "Type": "Wert", - "Values": "-1", - "Information": "false" - }, - { - "Code": "ABS011", - "Content": "Absatz von Bier", - "Type": "Wert", - "Values": "-1", - "Information": "true" - }, - { - "Code": "ABS012", - "Content": "Absatz von Biermischungen", - "Type": "Wert", - "Values": "-1", - "Information": "true" - }, - { - "Code": "ABS013", - "Content": "Versteuerter Bierabsatz", - "Type": "Wert", - "Values": "-1", - "Information": "true" - }, - { - "Code": "ABS014", - "Content": "Steuerfreier Bierabsatz", - "Type": "Wert", - "Values": "-1", - "Information": "true" - }, - { - "Code": "ABS015", - "Content": "Steuerfreier Bierabsatz in EU-L?nder", - "Type": "Wert", - "Values": "-1", - "Information": "false" - }, - { - "Code": "ABS016", - "Content": "Steuerfreier Bierabsatz in Drittl?nder", - "Type": "Wert", - "Values": "-1", - "Information": "false" - }, - { - "Code": "ABS017", - "Content": "Steuerfreier Bierabsatz als Haustrunk", - "Type": "Wert", - "Values": "-1", - "Information": "false" - }, - { - "Code": "ABS019", - "Content": "Absatz von Schaumwein", - "Type": "Wert", - "Values": "-1", - "Information": "false" - }, - { - "Code": "ABS020", - "Content": "Versteuerter Schaumweinabsatz", - "Type": "Wert", - "Values": "-1", - "Information": "false" - }, - { - "Code": "ABS021", - "Content": "Steuerfreier Schaumweinabsatz", - "Type": "Wert", - "Values": "-1", - "Information": "false" - }, - { - "Code": "ABSAT1", - "Content": "Absatzrichtung", - "Type": "sachlich", - "Values": "3", - "Information": "false" - }, - { - "Code": "ABSATZ", - "Content": "Absatzrichtung", - "Type": "sachlich", - "Values": "5", - "Information": "true" - }, - { - "Code": "ABSBQ1", - "Content": "Bereits erworbener Ausbildungsabschluss", - "Type": "sachlich", - "Values": "9", - "Information": "true" - }, - { - "Code": "ABZ002", - "Content": "Abz?ge der Arbeitnehmer", - "Type": "Wert", - "Values": "-1", - "Information": "true" - }, - { - "Code": "ADAFW1", - "Content": "Art der Aufwendungen", - "Type": "sachlich", - "Values": "2", - "Information": "false" - }, - { - "Code": "ADAFW2", - "Content": "Art der Aufwendungen", - "Type": "sachlich", - "Values": "5", - "Information": "false" - }, - { - "Code": "ADANS1", - "Content": "Art der Anstellung", - "Type": "sachlich", - "Values": "2", - "Information": "false" - }, - { - "Code": "ADANS2", - "Content": "Art der Anstellung", - "Type": "sachlich", - "Values": "3", - "Information": "false" - }, - { - "Code": "ADANS3", - "Content": "Art der T?tigkeit", - "Type": "sachlich", - "Values": "11", - "Information": "false" - }, - { - "Code": "ADBES1", - "Content": "Art der Best?nde", - "Type": "sachlich", - "Values": "4", - "Information": "false" - }, - { - "Code": "ADFAW1", - "Content": "Art des finanziellen Aufwandes", - "Type": "sachlich", - "Values": "2", - "Information": "false" - }, - { - "Code": "ADINV1", - "Content": "Art der Investitionen", - "Type": "sachlich", - "Values": "8", - "Information": "false" - }, - { - "Code": "ADOEL1", - "Content": "Verwandtschaftsverh?ltnis zu den Adoptiveltern", - "Type": "sachlich", - "Values": "3", - "Information": "false" - }, - { - "Code": "ADP001", - "Content": "Aufgehobene Adoptionen", - "Type": "Wert", - "Values": "-1", - "Information": "false" - }, - { - "Code": "ADP002", - "Content": "Abgebrochene Adoptionspflegen", - "Type": "Wert", - "Values": "-1", - "Information": "false" - }, - { - "Code": "ADP003", - "Content": "Zur Adoption vorgemerkte Kinder und Jugendliche", - "Type": "Wert", - "Values": "-1", - "Information": "false" - }, - { - "Code": "ADP004", - "Content": "Vorgemerkte Adoptionsbewerbungen", - "Type": "Wert", - "Values": "-1", - "Information": "false" - }, - { - "Code": "ADP005", - "Content": "In Adoptionspflege untergebrachte Kinder/Jugendl.", - "Type": "Wert", - "Values": "-1", - "Information": "true" - }, - { - "Code": "ADPAT1", - "Content": "Art der Adoption", - "Type": "sachlich", - "Values": "2", - "Information": "false" - }, - { - "Code": "ADPAW1", - "Content": "Art der Personalaufwendungen", - "Type": "sachlich", - "Values": "3", - "Information": "false" - }, - { - "Code": "ADPAW2", - "Content": "Art der Personalaufwendungen", - "Type": "sachlich", - "Values": "4", - "Information": "false" - }, - { - "Code": "ADSAW1", - "Content": "Art der Sachaufwendungen", - "Type": "sachlich", - "Values": "5", - "Information": "false" - }, - { - "Code": "ADSAW2", - "Content": "Art der Sachaufwendungen", - "Type": "sachlich", - "Values": "10", - "Information": "false" - }, - { - "Code": "ADSAW6", - "Content": "Art der Sachaufwendungen", - "Type": "sachlich", - "Values": "16", - "Information": "false" - }, - { - "Code": "ADSST2", - "Content": "Soziale Stellung des Haupteinkommensbeziehers", - "Type": "sachlich", - "Values": "8", - "Information": "false" - }, - { - "Code": "ADSST3", - "Content": "Soziale Stellung des Haupteinkommensbeziehers", - "Type": "sachlich", - "Values": "4", - "Information": "false" - }, - { - "Code": "ADV09A", - "Content": "Nutzungsarten (AdV-Nutzungsartenkatalog 2009)", - "Type": "sachlich", - "Values": "32", - "Information": "false" - }, - { - "Code": "ADVTN3", - "Content": "Nutzungsarten (AdV-Nutzungsartenverzeichnis 1991)", - "Type": "sachlich", - "Values": "8", - "Information": "true" - }, - { - "Code": "ADVTN4", - "Content": "Nutzungsarten (AdV-Nutzungsartenverzeichnis 1991)", - "Type": "sachlich", - "Values": "9", - "Information": "true" - }, - { - "Code": "ADVTN5", - "Content": "Nutzungsarten (AdV-Nutzungsartenverzeichnis 1991)", - "Type": "sachlich", - "Values": "5", - "Information": "true" - }, - { - "Code": "ADVTN6", - "Content": "Nutzungsarten", - "Type": "sachlich", - "Values": "4", - "Information": "false" - }, - { - "Code": "AEW006", - "Content": "Erzeuger von prim?r nachgewiesenen Abfallmengen", - "Type": "Wert", - "Values": "-1", - "Information": "true" - }, - { - "Code": "AEW007", - "Content": "Abgegebene Abfallmenge an Entsorger", - "Type": "Wert", - "Values": "-1", - "Information": "false" - }, - { - "Code": "AFGBE1", - "Content": "Aufgabenbereiche", - "Type": "sachlich", - "Values": "14", - "Information": "false" - }, - { - "Code": "AFGBE2", - "Content": "Aufgabenbereiche", - "Type": "sachlich", - "Values": "11", - "Information": "false" - }, - { - "Code": "AFGBE3", - "Content": "Aufgabenbereiche der ?ffentlichen Haushalte", - "Type": "sachlich", - "Values": "22", - "Information": "false" - }, - { - "Code": "AFGBE4", - "Content": "Aufgabenbereiche der ?ffentlichen Haushalte", - "Type": "sachlich", - "Values": "6", - "Information": "false" - }, - { - "Code": "AFHMN1", - "Content": "Aufenthalt vor der Ma?nahme", - "Type": "sachlich", - "Values": "12", - "Information": "false" - }, - { - "Code": "AFTAT1", - "Content": "Auftragsart", - "Type": "sachlich", - "Values": "5", - "Information": "false" - }, - { - "Code": "AFTAT2", - "Content": "Auftragsart", - "Type": "sachlich", - "Values": "3", - "Information": "false" - }, - { - "Code": "AFTAT3", - "Content": "Auftragsart", - "Type": "sachlich", - "Values": "3", - "Information": "false" - }, - { - "Code": "AGEBN1", - "Content": "Auftraggeberebene", - "Type": "sachlich", - "Values": "4", - "Information": "false" - }, - { - "Code": "AGEBN2", - "Content": "Auftraggeberebene", - "Type": "sachlich", - "Values": "2", - "Information": "false" - }, - { - "Code": "AGQ001", - "Content": "Armutsgef?hrdungsquote", - "Type": "Wert", - "Values": "-1", - "Information": "true" - }, - { - "Code": "AGQ002", - "Content": "Armutsgef?hrdungsquote von Personen ab 16 Jahren", - "Type": "Wert", - "Values": "-1", - "Information": "true" - }, - { - "Code": "AGQ003", - "Content": "Armutsgef?hrdungsquote v.erwerbst?t. Pers.ab 16 J.", - "Type": "Wert", - "Values": "-1", - "Information": "true" - }, - { - "Code": "AGQ004", - "Content": "Armutsgef?hrdungsquote v.erwerbst?t. Pers.ab 18 J.", - "Type": "Wert", - "Values": "-1", - "Information": "true" - }, - { - "Code": "AKEA01", - "Content": "Arbeitskostenarten", - "Type": "sachlich", - "Values": "52", - "Information": "true" - }, - { - "Code": "AKG001", - "Content": "W?gung Index der Arbeitskosten je geleistete Std.", - "Type": "Wert", - "Values": "-1", - "Information": "true" - }, - { - "Code": "AKG002", - "Content": "W?gung Index d.Bruttoverdienste je geleistete Std.", - "Type": "Wert", - "Values": "-1", - "Information": "true" - }, - { - "Code": "AKG003", - "Content": "W?gung Index d. Lohnnebenkosten je geleistete Std.", - "Type": "Wert", - "Values": "-1", - "Information": "true" - }, - { - "Code": "AKI001", - "Content": "Index der Arbeitskosten je geleistete Stunde", - "Type": "Wert", - "Values": "-1", - "Information": "true" - }, - { - "Code": "AKI002", - "Content": "Index der Bruttoverdienste je geleistete Stunde", - "Type": "Wert", - "Values": "-1", - "Information": "true" - }, - { - "Code": "AKI003", - "Content": "Index der Lohnnebenkosten je geleistete Stunde", - "Type": "Wert", - "Values": "-1", - "Information": "true" - }, - { - "Code": "AKJ001", - "Content": "Adoptierte Kinder und Jugendliche", - "Type": "Wert", - "Values": "-1", - "Information": "true" - }, - { - "Code": "AKNSI1", - "Content": "Sitz des Auftrag-/Konzessionsnehmers", - "Type": "sachlich", - "Values": "4", - "Information": "true" - }, - { - "Code": "AKO001", - "Content": "Arbeitskosten je Vollzeiteinheit", - "Type": "Wert", - "Values": "-1", - "Information": "true" - }, - { - "Code": "AKO002", - "Content": "Arbeitskosten je geleistete Stunde", - "Type": "Wert", - "Values": "-1", - "Information": "true" - }, - { - "Code": "AKO003", - "Content": "Bruttoverdienste je geleistete Stunde", - "Type": "Wert", - "Values": "-1", - "Information": "false" - }, - { - "Code": "AKO004", - "Content": "Lohnnebenkosten je geleistete Stunde", - "Type": "Wert", - "Values": "-1", - "Information": "false" - }, - { - "Code": "AKO007", - "Content": "Bruttoarbeitskosten je Vollzeiteinheit", - "Type": "Wert", - "Values": "-1", - "Information": "true" - } - ], - "Copyright": "? Statistisches Bundesamt (Destatis), 2023" -} diff --git a/tests/testthat/searchvars2_fake/api/catalogue/variables-d0341c.json b/tests/testthat/searchvars2_fake/api/catalogue/variables-d0341c.json deleted file mode 100644 index 89140ab..0000000 --- a/tests/testthat/searchvars2_fake/api/catalogue/variables-d0341c.json +++ /dev/null @@ -1,725 +0,0 @@ -{ - "Ident": { - "Service": "catalogue", - "Method": "variables" - }, - "Status": { - "Code": 100, - "Content": "test error message", - "Type": "Information" - }, - "Parameter": { - "username": "********************", - "password": "********************", - "selection": "", - "area": "oeffentlich", - "searchcriterion": "Code", - "sortcriterion": "Code", - "type": "Alle", - "pagelength": "100", - "language": "de" - }, - "List": [ - { - "Code": "ABF001", - "Content": "Input von Abfallentsorgungsanlagen", - "Type": "Wert", - "Values": "-1", - "Information": "false" - }, - { - "Code": "ABF002", - "Content": "Im eigenen Betrieb erzeugte Abf?lle", - "Type": "Wert", - "Values": "-1", - "Information": "false" - }, - { - "Code": "ABF003", - "Content": "Aus dem Inland angelieferter Abfall", - "Type": "Wert", - "Values": "-1", - "Information": "false" - }, - { - "Code": "ABF004", - "Content": "Aus dem Ausland angelieferter Abfall", - "Type": "Wert", - "Values": "-1", - "Information": "false" - }, - { - "Code": "ABF005", - "Content": "Output von Abfallentsorgungsanlagen", - "Type": "Wert", - "Values": "-1", - "Information": "false" - }, - { - "Code": "ABF006", - "Content": "Abf?lle zur Beseitigung", - "Type": "Wert", - "Values": "-1", - "Information": "false" - }, - { - "Code": "ABF007", - "Content": "Abf?lle zur Verwertung", - "Type": "Wert", - "Values": "-1", - "Information": "false" - }, - { - "Code": "ABF008", - "Content": "Beim Erstempf?nger beseitigte Haushaltsabf?lle", - "Type": "Wert", - "Values": "-1", - "Information": "false" - }, - { - "Code": "ABF009", - "Content": "Beim Erstempf?nger verwertete Haushaltsabf?lle", - "Type": "Wert", - "Values": "-1", - "Information": "false" - }, - { - "Code": "ABF010", - "Content": "Abfallerzeuger", - "Type": "Wert", - "Values": "-1", - "Information": "false" - }, - { - "Code": "ABF011", - "Content": "Abfallmengen", - "Type": "Wert", - "Values": "-1", - "Information": "false" - }, - { - "Code": "ABF012", - "Content": "Abfallmengen, von Prim?rerzeugern erzeugt", - "Type": "Wert", - "Values": "-1", - "Information": "false" - }, - { - "Code": "ABF013", - "Content": "Einsammler", - "Type": "Wert", - "Values": "-1", - "Information": "false" - }, - { - "Code": "ABF014", - "Content": "Erzeugte Abfallmenge", - "Type": "Wert", - "Values": "-1", - "Information": "true" - }, - { - "Code": "ABF015", - "Content": "Abf?lle zu vorbereitenden Verfahren", - "Type": "Wert", - "Values": "-1", - "Information": "false" - }, - { - "Code": "ABFAT1", - "Content": "Abfallarten", - "Type": "sachlich", - "Values": "5", - "Information": "false" - }, - { - "Code": "ABFAT2", - "Content": "Abfallarten", - "Type": "sachlich", - "Values": "14", - "Information": "false" - }, - { - "Code": "ABG002", - "Content": "Produktions- und Importabgaben abzgl. Subventionen", - "Type": "Wert", - "Values": "-1", - "Information": "true" - }, - { - "Code": "ABG003", - "Content": "Abgaben auf soz.Leistungen, verbrauchsnahe Steuern", - "Type": "Wert", - "Values": "-1", - "Information": "true" - }, - { - "Code": "ABG004", - "Content": "Abgabe an Sonstige", - "Type": "Wert", - "Values": "-1", - "Information": "false" - }, - { - "Code": "ABG005", - "Content": "Stromabgabe", - "Type": "Wert", - "Values": "-1", - "Information": "false" - }, - { - "Code": "ABG006", - "Content": "W?rmeabgabe", - "Type": "Wert", - "Values": "-1", - "Information": "false" - }, - { - "Code": "ABNAT1", - "Content": "Abnehmer", - "Type": "sachlich", - "Values": "4", - "Information": "false" - }, - { - "Code": "ABNGR1", - "Content": "Abnehmergruppen", - "Type": "sachlich", - "Values": "3", - "Information": "false" - }, - { - "Code": "ABNGR2", - "Content": "Abnehmergruppen", - "Type": "sachlich", - "Values": "3", - "Information": "false" - }, - { - "Code": "ABS002", - "Content": "Abschreibungen", - "Type": "Wert", - "Values": "-1", - "Information": "true" - }, - { - "Code": "ABS008", - "Content": "Abschreibungen (Anteil am BPW)", - "Type": "Wert", - "Values": "-1", - "Information": "true" - }, - { - "Code": "ABS009", - "Content": "Stromabsatz", - "Type": "Wert", - "Values": "-1", - "Information": "false" - }, - { - "Code": "ABS010", - "Content": "Gasabsatz", - "Type": "Wert", - "Values": "-1", - "Information": "false" - }, - { - "Code": "ABS011", - "Content": "Absatz von Bier", - "Type": "Wert", - "Values": "-1", - "Information": "true" - }, - { - "Code": "ABS012", - "Content": "Absatz von Biermischungen", - "Type": "Wert", - "Values": "-1", - "Information": "true" - }, - { - "Code": "ABS013", - "Content": "Versteuerter Bierabsatz", - "Type": "Wert", - "Values": "-1", - "Information": "true" - }, - { - "Code": "ABS014", - "Content": "Steuerfreier Bierabsatz", - "Type": "Wert", - "Values": "-1", - "Information": "true" - }, - { - "Code": "ABS015", - "Content": "Steuerfreier Bierabsatz in EU-L?nder", - "Type": "Wert", - "Values": "-1", - "Information": "false" - }, - { - "Code": "ABS016", - "Content": "Steuerfreier Bierabsatz in Drittl?nder", - "Type": "Wert", - "Values": "-1", - "Information": "false" - }, - { - "Code": "ABS017", - "Content": "Steuerfreier Bierabsatz als Haustrunk", - "Type": "Wert", - "Values": "-1", - "Information": "false" - }, - { - "Code": "ABS019", - "Content": "Absatz von Schaumwein", - "Type": "Wert", - "Values": "-1", - "Information": "false" - }, - { - "Code": "ABS020", - "Content": "Versteuerter Schaumweinabsatz", - "Type": "Wert", - "Values": "-1", - "Information": "false" - }, - { - "Code": "ABS021", - "Content": "Steuerfreier Schaumweinabsatz", - "Type": "Wert", - "Values": "-1", - "Information": "false" - }, - { - "Code": "ABSAT1", - "Content": "Absatzrichtung", - "Type": "sachlich", - "Values": "3", - "Information": "false" - }, - { - "Code": "ABSATZ", - "Content": "Absatzrichtung", - "Type": "sachlich", - "Values": "5", - "Information": "true" - }, - { - "Code": "ABSBQ1", - "Content": "Bereits erworbener Ausbildungsabschluss", - "Type": "sachlich", - "Values": "9", - "Information": "true" - }, - { - "Code": "ABZ002", - "Content": "Abz?ge der Arbeitnehmer", - "Type": "Wert", - "Values": "-1", - "Information": "true" - }, - { - "Code": "ADAFW1", - "Content": "Art der Aufwendungen", - "Type": "sachlich", - "Values": "2", - "Information": "false" - }, - { - "Code": "ADAFW2", - "Content": "Art der Aufwendungen", - "Type": "sachlich", - "Values": "5", - "Information": "false" - }, - { - "Code": "ADANS1", - "Content": "Art der Anstellung", - "Type": "sachlich", - "Values": "2", - "Information": "false" - }, - { - "Code": "ADANS2", - "Content": "Art der Anstellung", - "Type": "sachlich", - "Values": "3", - "Information": "false" - }, - { - "Code": "ADANS3", - "Content": "Art der T?tigkeit", - "Type": "sachlich", - "Values": "11", - "Information": "false" - }, - { - "Code": "ADBES1", - "Content": "Art der Best?nde", - "Type": "sachlich", - "Values": "4", - "Information": "false" - }, - { - "Code": "ADFAW1", - "Content": "Art des finanziellen Aufwandes", - "Type": "sachlich", - "Values": "2", - "Information": "false" - }, - { - "Code": "ADINV1", - "Content": "Art der Investitionen", - "Type": "sachlich", - "Values": "8", - "Information": "false" - }, - { - "Code": "ADOEL1", - "Content": "Verwandtschaftsverh?ltnis zu den Adoptiveltern", - "Type": "sachlich", - "Values": "3", - "Information": "false" - }, - { - "Code": "ADP001", - "Content": "Aufgehobene Adoptionen", - "Type": "Wert", - "Values": "-1", - "Information": "false" - }, - { - "Code": "ADP002", - "Content": "Abgebrochene Adoptionspflegen", - "Type": "Wert", - "Values": "-1", - "Information": "false" - }, - { - "Code": "ADP003", - "Content": "Zur Adoption vorgemerkte Kinder und Jugendliche", - "Type": "Wert", - "Values": "-1", - "Information": "false" - }, - { - "Code": "ADP004", - "Content": "Vorgemerkte Adoptionsbewerbungen", - "Type": "Wert", - "Values": "-1", - "Information": "false" - }, - { - "Code": "ADP005", - "Content": "In Adoptionspflege untergebrachte Kinder/Jugendl.", - "Type": "Wert", - "Values": "-1", - "Information": "true" - }, - { - "Code": "ADPAT1", - "Content": "Art der Adoption", - "Type": "sachlich", - "Values": "2", - "Information": "false" - }, - { - "Code": "ADPAW1", - "Content": "Art der Personalaufwendungen", - "Type": "sachlich", - "Values": "3", - "Information": "false" - }, - { - "Code": "ADPAW2", - "Content": "Art der Personalaufwendungen", - "Type": "sachlich", - "Values": "4", - "Information": "false" - }, - { - "Code": "ADSAW1", - "Content": "Art der Sachaufwendungen", - "Type": "sachlich", - "Values": "5", - "Information": "false" - }, - { - "Code": "ADSAW2", - "Content": "Art der Sachaufwendungen", - "Type": "sachlich", - "Values": "10", - "Information": "false" - }, - { - "Code": "ADSAW6", - "Content": "Art der Sachaufwendungen", - "Type": "sachlich", - "Values": "16", - "Information": "false" - }, - { - "Code": "ADSST2", - "Content": "Soziale Stellung des Haupteinkommensbeziehers", - "Type": "sachlich", - "Values": "8", - "Information": "false" - }, - { - "Code": "ADSST3", - "Content": "Soziale Stellung des Haupteinkommensbeziehers", - "Type": "sachlich", - "Values": "4", - "Information": "false" - }, - { - "Code": "ADV09A", - "Content": "Nutzungsarten (AdV-Nutzungsartenkatalog 2009)", - "Type": "sachlich", - "Values": "32", - "Information": "false" - }, - { - "Code": "ADVTN3", - "Content": "Nutzungsarten (AdV-Nutzungsartenverzeichnis 1991)", - "Type": "sachlich", - "Values": "8", - "Information": "true" - }, - { - "Code": "ADVTN4", - "Content": "Nutzungsarten (AdV-Nutzungsartenverzeichnis 1991)", - "Type": "sachlich", - "Values": "9", - "Information": "true" - }, - { - "Code": "ADVTN5", - "Content": "Nutzungsarten (AdV-Nutzungsartenverzeichnis 1991)", - "Type": "sachlich", - "Values": "5", - "Information": "true" - }, - { - "Code": "ADVTN6", - "Content": "Nutzungsarten", - "Type": "sachlich", - "Values": "4", - "Information": "false" - }, - { - "Code": "AEW006", - "Content": "Erzeuger von prim?r nachgewiesenen Abfallmengen", - "Type": "Wert", - "Values": "-1", - "Information": "true" - }, - { - "Code": "AEW007", - "Content": "Abgegebene Abfallmenge an Entsorger", - "Type": "Wert", - "Values": "-1", - "Information": "false" - }, - { - "Code": "AFGBE1", - "Content": "Aufgabenbereiche", - "Type": "sachlich", - "Values": "14", - "Information": "false" - }, - { - "Code": "AFGBE2", - "Content": "Aufgabenbereiche", - "Type": "sachlich", - "Values": "11", - "Information": "false" - }, - { - "Code": "AFGBE3", - "Content": "Aufgabenbereiche der ?ffentlichen Haushalte", - "Type": "sachlich", - "Values": "22", - "Information": "false" - }, - { - "Code": "AFGBE4", - "Content": "Aufgabenbereiche der ?ffentlichen Haushalte", - "Type": "sachlich", - "Values": "6", - "Information": "false" - }, - { - "Code": "AFHMN1", - "Content": "Aufenthalt vor der Ma?nahme", - "Type": "sachlich", - "Values": "12", - "Information": "false" - }, - { - "Code": "AFTAT1", - "Content": "Auftragsart", - "Type": "sachlich", - "Values": "5", - "Information": "false" - }, - { - "Code": "AFTAT2", - "Content": "Auftragsart", - "Type": "sachlich", - "Values": "3", - "Information": "false" - }, - { - "Code": "AFTAT3", - "Content": "Auftragsart", - "Type": "sachlich", - "Values": "3", - "Information": "false" - }, - { - "Code": "AGEBN1", - "Content": "Auftraggeberebene", - "Type": "sachlich", - "Values": "4", - "Information": "false" - }, - { - "Code": "AGEBN2", - "Content": "Auftraggeberebene", - "Type": "sachlich", - "Values": "2", - "Information": "false" - }, - { - "Code": "AGQ001", - "Content": "Armutsgef?hrdungsquote", - "Type": "Wert", - "Values": "-1", - "Information": "true" - }, - { - "Code": "AGQ002", - "Content": "Armutsgef?hrdungsquote von Personen ab 16 Jahren", - "Type": "Wert", - "Values": "-1", - "Information": "true" - }, - { - "Code": "AGQ003", - "Content": "Armutsgef?hrdungsquote v.erwerbst?t. Pers.ab 16 J.", - "Type": "Wert", - "Values": "-1", - "Information": "true" - }, - { - "Code": "AGQ004", - "Content": "Armutsgef?hrdungsquote v.erwerbst?t. Pers.ab 18 J.", - "Type": "Wert", - "Values": "-1", - "Information": "true" - }, - { - "Code": "AKEA01", - "Content": "Arbeitskostenarten", - "Type": "sachlich", - "Values": "52", - "Information": "true" - }, - { - "Code": "AKG001", - "Content": "W?gung Index der Arbeitskosten je geleistete Std.", - "Type": "Wert", - "Values": "-1", - "Information": "true" - }, - { - "Code": "AKG002", - "Content": "W?gung Index d.Bruttoverdienste je geleistete Std.", - "Type": "Wert", - "Values": "-1", - "Information": "true" - }, - { - "Code": "AKG003", - "Content": "W?gung Index d. Lohnnebenkosten je geleistete Std.", - "Type": "Wert", - "Values": "-1", - "Information": "true" - }, - { - "Code": "AKI001", - "Content": "Index der Arbeitskosten je geleistete Stunde", - "Type": "Wert", - "Values": "-1", - "Information": "true" - }, - { - "Code": "AKI002", - "Content": "Index der Bruttoverdienste je geleistete Stunde", - "Type": "Wert", - "Values": "-1", - "Information": "true" - }, - { - "Code": "AKI003", - "Content": "Index der Lohnnebenkosten je geleistete Stunde", - "Type": "Wert", - "Values": "-1", - "Information": "true" - }, - { - "Code": "AKJ001", - "Content": "Adoptierte Kinder und Jugendliche", - "Type": "Wert", - "Values": "-1", - "Information": "true" - }, - { - "Code": "AKNSI1", - "Content": "Sitz des Auftrag-/Konzessionsnehmers", - "Type": "sachlich", - "Values": "4", - "Information": "true" - }, - { - "Code": "AKO001", - "Content": "Arbeitskosten je Vollzeiteinheit", - "Type": "Wert", - "Values": "-1", - "Information": "true" - }, - { - "Code": "AKO002", - "Content": "Arbeitskosten je geleistete Stunde", - "Type": "Wert", - "Values": "-1", - "Information": "true" - }, - { - "Code": "AKO003", - "Content": "Bruttoverdienste je geleistete Stunde", - "Type": "Wert", - "Values": "-1", - "Information": "false" - }, - { - "Code": "AKO004", - "Content": "Lohnnebenkosten je geleistete Stunde", - "Type": "Wert", - "Values": "-1", - "Information": "false" - }, - { - "Code": "AKO007", - "Content": "Bruttoarbeitskosten je Vollzeiteinheit", - "Type": "Wert", - "Values": "-1", - "Information": "true" - } - ], - "Copyright": "? Statistisches Bundesamt (Destatis), 2023" -} diff --git a/tests/testthat/table1/api/data/tablefile-6dd2df.csv b/tests/testthat/table1/api/data/tablefile-6dd2df.csv deleted file mode 100644 index 7e40978..0000000 --- a/tests/testthat/table1/api/data/tablefile-6dd2df.csv +++ /dev/null @@ -1,5 +0,0 @@ -statistics_code;statistics_label;time_code;time_label;time;1_variable_code;1_variable_label;1_variable_code;1_variable_code;PREIS1__Consumer_price_index__2020=100;CH0004__Annual_change__in_(%) -61111;Consumer price index for Germany;JAHR;Year;2019;DINSG;Germany;DG;Germany;99.5;+1.4 -61111;Consumer price index for Germany;JAHR;Year;2020;DINSG;Germany;DG;Germany;100.0;+0.5 -61111;Consumer price index for Germany;JAHR;Year;2021;DINSG;Germany;DG;Germany;103.1;+3.1 -61111;Consumer price index for Germany;JAHR;Year;2022;DINSG;Germany;DG;Germany;110.2;+6.9 diff --git a/tests/testthat/terms1/api/catalogue/terms-6ad002.json b/tests/testthat/terms1/api/catalogue/terms-6ad002.json deleted file mode 100644 index 7515b13..0000000 --- a/tests/testthat/terms1/api/catalogue/terms-6ad002.json +++ /dev/null @@ -1,148 +0,0 @@ -{ - "Ident": { - "Service": "catalogue", - "Method": "terms" - }, - "Status": { - "Code": 0, - "Content": "erfolgreich", - "Type": "Information" - }, - "Parameter": { - "username": "********************", - "password": "********************", - "selection": "forst*", - "pagelength": "100", - "language": "de", - "area": "Alle" - }, - "List": [ - { - "Content": "forst" - }, - { - "Content": "forst- und jagdwirtschaft, landschaftspflege" - }, - { - "Content": "forstbaumschulen" - }, - { - "Content": "forstbetriebe" - }, - { - "Content": "forsteinheiten" - }, - { - "Content": "forsten" - }, - { - "Content": "forstgehoelze" - }, - { - "Content": "forstgeh?lze st" - }, - { - "Content": "forstgeh?lzpflanzen" - }, - { - "Content": "forstl" - }, - { - "Content": "forstmaschinen" - }, - { - "Content": "forstpflanzen" - }, - { - "Content": "forstsamen" - }, - { - "Content": "forstschlepper" - }, - { - "Content": "forstw" - }, - { - "Content": "forstw.fahrzeuge" - }, - { - "Content": "forstwirt" - }, - { - "Content": "forstwirte" - }, - { - "Content": "forstwirtsch" - }, - { - "Content": "forstwirtschaft" - }, - { - "Content": "forstwirtschaft - experte" - }, - { - "Content": "forstwirtschaft - fachkraft" - }, - { - "Content": "forstwirtschaft - helfer" - }, - { - "Content": "forstwirtschaft - spezialist" - }, - { - "Content": "forstwirtschaft und holzeinschlag" - }, - { - "Content": "forstwirtschaftl" - }, - { - "Content": "forstwirtschaftl. erzeugnisse und dienstleistungen" - }, - { - "Content": "forstwirtschaftl.maschinen" - }, - { - "Content": "forstwirtschaftliche" - }, - { - "Content": "forstwirtschaftliche erzeugnisse" - }, - { - "Content": "forstwirtschaftlichen" - }, - { - "Content": "forstwirtschaftlicher" - }, - { - "Content": "forstwirtschaftsabf?lle" - }, - { - "Content": "forstwirtschaftsberufe" - }, - { - "Content": "forstwirtschaftserzeugnisse" - }, - { - "Content": "forstwirtschaftsfahrzeuge" - }, - { - "Content": "forstwirtschaftsmaschinen" - }, - { - "Content": "forstwirtschaftsmaschinenteile" - }, - { - "Content": "forstwissenschaft" - }, - { - "Content": "forstwissenschaft, -wirtschaft" - }, - { - "Content": "forstwissenschaft, holzwirtschaft" - }, - { - "Content": "forstwissenschaften" - } - ], - "Copyright": "? Statistisches Bundesamt (Destatis), 2023" -} diff --git a/tests/testthat/test_gen_api.R b/tests/testthat/test_gen_api.R index 975bf10..129f595 100644 --- a/tests/testthat/test_gen_api.R +++ b/tests/testthat/test_gen_api.R @@ -1,14 +1,15 @@ # Test for expected output & API calls------------------------------------------ without_internet({ + test_that("We do make GET requests", { skip_on_cran() skip_on_ci() - expect_GET( - restatis:::gen_api(endpoint = "helloworld/whoami"), - "https://www-genesis.destatis.de/genesisWS/rest/2020/helloworld/whoami" - ) + expect_GET(restatis:::gen_api(endpoint = "helloworld/whoami"), + "https://www-genesis.destatis.de/genesisWS/rest/2020/helloworld/whoami") + }) + }) diff --git a/tests/testthat/test_gen_logincheck.R b/tests/testthat/test_gen_logincheck.R new file mode 100644 index 0000000..c5332f0 --- /dev/null +++ b/tests/testthat/test_gen_logincheck.R @@ -0,0 +1,17 @@ +#------------------------------------------------------------------------------- +# Test for expected output & API calls ---- +#------------------------------------------------------------------------------- + +with_mock_dir("logincheck1", { + + test_that("gen_logincheck errors when the login failed", { + + skip_on_cran() + skip_on_ci() + + expect_error(gen_logincheck("genesis"), + regexp = "There seems to be an issue with the authentication process") + + }) + +}, simplify = FALSE) diff --git a/tests/testthat/test_gen_table.R b/tests/testthat/test_gen_table.R index cc5127a..7b9fe48 100644 --- a/tests/testthat/test_gen_table.R +++ b/tests/testthat/test_gen_table.R @@ -9,7 +9,9 @@ with_mock_dir("table1", { skip_on_cran() skip_on_ci() - result <- gen_table("61111-0001", startyear = 2019) + result <- gen_table("61111-0001", + startyear = 2019, + database = "genesis") expect_s3_class(result, class = "data.frame") @@ -20,6 +22,7 @@ with_mock_dir("table1", { expect_true("spec" %in% names(attrs)) }) + }) #------------------------------------------------------------------------------- @@ -28,10 +31,10 @@ with_mock_dir("table1", { test_that("gen_table errors on wrong year parameters", { - expect_error(gen_table("61111-0004", startyear = 1893), + expect_error(gen_table("61111-0004", startyear = 1893, database = "genesis"), regexp = "The parameter 'year' has been misspecified") - expect_error(gen_table("61111-0004", startyear = "1893"), + expect_error(gen_table("61111-0004", startyear = "1893", database = "genesis"), regexp = "The parameter 'year' has been misspecified") }) diff --git a/tests/testthat/values1/api/catalogue/values2variable-886f37.json b/tests/testthat/values1/api/catalogue/values2variable-886f37.json deleted file mode 100644 index 40ad525..0000000 --- a/tests/testthat/values1/api/catalogue/values2variable-886f37.json +++ /dev/null @@ -1,24 +0,0 @@ -{ - "Ident": { - "Service": "catalogue", - "Method": "values2variable" - }, - "Status": { - "Code": 104, - "Content": "Es gibt keine Objekte zum angegebenen Selektionskriterium", - "Type": "Information" - }, - "Parameter": { - "username": "********************", - "password": "********************", - "name": "61111", - "selection": "", - "area": "oeffentlich", - "searchcriterion": "Code", - "sortcriterion": "Code", - "pagelength": "100", - "language": "de" - }, - "List": null, - "Copyright": "? Statistisches Bundesamt (Destatis), 2023" -} diff --git a/tests/testthat/values2/api/catalogue/values2variable-cb5890.json b/tests/testthat/values2/api/catalogue/values2variable-cb5890.json deleted file mode 100644 index d7bbd92..0000000 --- a/tests/testthat/values2/api/catalogue/values2variable-cb5890.json +++ /dev/null @@ -1,121 +0,0 @@ -{ - "Ident": { - "Service": "catalogue", - "Method": "values2variable" - }, - "Status": { - "Code": 0, - "Content": "erfolgreich", - "Type": "Information" - }, - "Parameter": { - "username": "********************", - "password": "********************", - "name": "DLAND", - "selection": "", - "area": "oeffentlich", - "searchcriterion": "Code", - "sortcriterion": "Code", - "pagelength": "100", - "language": "de" - }, - "List": [ - { - "Code": "08", - "Content": "Baden-W?rttemberg", - "Variables": "9", - "Information": "false" - }, - { - "Code": "09", - "Content": "Bayern", - "Variables": "9", - "Information": "false" - }, - { - "Code": "11", - "Content": "Berlin", - "Variables": "11", - "Information": "false" - }, - { - "Code": "12", - "Content": "Brandenburg", - "Variables": "9", - "Information": "false" - }, - { - "Code": "04", - "Content": "Bremen", - "Variables": "12", - "Information": "false" - }, - { - "Code": "02", - "Content": "Hamburg", - "Variables": "12", - "Information": "false" - }, - { - "Code": "06", - "Content": "Hessen", - "Variables": "9", - "Information": "false" - }, - { - "Code": "13", - "Content": "Mecklenburg-Vorpommern", - "Variables": "12", - "Information": "false" - }, - { - "Code": "03", - "Content": "Niedersachsen", - "Variables": "10", - "Information": "false" - }, - { - "Code": "05", - "Content": "Nordrhein-Westfalen", - "Variables": "10", - "Information": "false" - }, - { - "Code": "07", - "Content": "Rheinland-Pfalz", - "Variables": "9", - "Information": "false" - }, - { - "Code": "10", - "Content": "Saarland", - "Variables": "11", - "Information": "false" - }, - { - "Code": "14", - "Content": "Sachsen", - "Variables": "9", - "Information": "false" - }, - { - "Code": "15", - "Content": "Sachsen-Anhalt", - "Variables": "11", - "Information": "false" - }, - { - "Code": "01", - "Content": "Schleswig-Holstein", - "Variables": "12", - "Information": "false" - }, - { - "Code": "16", - "Content": "Th?ringen", - "Variables": "11", - "Information": "false" - } - ], - "Copyright": "? Statistisches Bundesamt (Destatis), 2023" -} diff --git a/tests/testthat/variables1/api/catalogue/variables2statistic-476d62.json b/tests/testthat/variables1/api/catalogue/variables2statistic-476d62.json deleted file mode 100644 index 2dd65d8..0000000 --- a/tests/testthat/variables1/api/catalogue/variables2statistic-476d62.json +++ /dev/null @@ -1,117 +0,0 @@ -{ - "Ident": { - "Service": "catalogue", - "Method": "variables2statistic" - }, - "Status": { - "Code": 0, - "Content": "erfolgreich", - "Type": "Information" - }, - "Parameter": { - "username": "********************", - "password": "********************", - "name": "61111", - "selection": "", - "area": "oeffentlich", - "searchcriterion": "Code", - "sortcriterion": "Code", - "type": "Alle", - "pagelength": "100", - "language": "de" - }, - "List": [ - { - "Code": "CC13A2", - "Content": "Verwendungszwecke des Individualkonsums, 2-Steller", - "Type": "sachlich", - "Values": "-1", - "Information": "true" - }, - { - "Code": "CC13A3", - "Content": "Verwendungszwecke des Individualkonsums, 3-Steller", - "Type": "sachlich", - "Values": "-1", - "Information": "true" - }, - { - "Code": "CC13A4", - "Content": "Verwendungszwecke des Individualkonsums, 4-Steller", - "Type": "sachlich", - "Values": "-1", - "Information": "true" - }, - { - "Code": "CC13A5", - "Content": "Verwendungszwecke des Individualkonsums, 5-Steller", - "Type": "sachlich", - "Values": "-1", - "Information": "true" - }, - { - "Code": "CC13B1", - "Content": "Verwendungszw.d.Individualkonsums,Sonderpositionen", - "Type": "sachlich", - "Values": "-1", - "Information": "true" - }, - { - "Code": "CC13Z1", - "Content": "Verwendungszwecke des Individualkonsums,10-Steller", - "Type": "sachlich", - "Values": "-1", - "Information": "true" - }, - { - "Code": "DINSG", - "Content": "Deutschland insgesamt", - "Type": "r?umlich insgesamt", - "Values": "-1", - "Information": "false" - }, - { - "Code": "DLAND", - "Content": "Bundesl?nder", - "Type": "r?umlich", - "Values": "-1", - "Information": "true" - }, - { - "Code": "JAHR", - "Content": "Jahr", - "Type": "zeitidentifizierend", - "Values": "-1", - "Information": "false" - }, - { - "Code": "MONAT", - "Content": "Monate", - "Type": "zeitlich", - "Values": "-1", - "Information": "false" - }, - { - "Code": "PRE034", - "Content": "Index der Nettokaltmieten", - "Type": "Wert", - "Values": "-1", - "Information": "false" - }, - { - "Code": "PRE999", - "Content": "Gewichtung", - "Type": "Wert", - "Values": "-1", - "Information": "false" - }, - { - "Code": "PREIS1", - "Content": "Verbraucherpreisindex", - "Type": "Wert", - "Values": "-1", - "Information": "true" - } - ], - "Copyright": "? Statistisches Bundesamt (Destatis), 2023" -} diff --git a/tests/testthat/variables2_fake/api/catalogue/variables2statistic-3d1ffb.json b/tests/testthat/variables2_fake/api/catalogue/variables2statistic-3d1ffb.json deleted file mode 100644 index 8cc6fb9..0000000 --- a/tests/testthat/variables2_fake/api/catalogue/variables2statistic-3d1ffb.json +++ /dev/null @@ -1,110 +0,0 @@ -{ - "Ident": { - "Service": "catalogue", - "Method": "variables2statistic" - }, - "Status": { - "Code": 100, - "Content": "test error message", - "Type": "Information" - }, - "Parameter": { - "username": "********************", - "password": "********************", - "name": "74111", - "selection": "", - "area": "oeffentlich", - "searchcriterion": "Code", - "sortcriterion": "Code", - "type": "Alle", - "pagelength": "100", - "language": "de" - }, - "List": [ - { - "Code": "BES003", - "Content": "Besch?ftigte im ?ffentlichen Dienst", - "Type": "Wert", - "Values": "-1", - "Information": "true" - }, - { - "Code": "BES019", - "Content": "Besch?ftigte im Aufgabenbereich Polizei", - "Type": "Wert", - "Values": "-1", - "Information": "false" - }, - { - "Code": "BES020", - "Content": "Besch. im Aufg.ber. Polizei (Vollzeit?quivalente)", - "Type": "Wert", - "Values": "-1", - "Information": "true" - }, - { - "Code": "BESBR2", - "Content": "Besch?ftigungsbereich", - "Type": "sachlich", - "Values": "-1", - "Information": "false" - }, - { - "Code": "BESBR3", - "Content": "Besch?ftigungsbereich", - "Type": "sachlich", - "Values": "-1", - "Information": "false" - }, - { - "Code": "BESUM4", - "Content": "Besch?ftigungsumfang", - "Type": "sachlich", - "Values": "-1", - "Information": "true" - }, - { - "Code": "DINSG", - "Content": "Deutschland insgesamt", - "Type": "r?umlich insgesamt", - "Values": "-1", - "Information": "false" - }, - { - "Code": "DLAND", - "Content": "Bundesl?nder", - "Type": "r?umlich", - "Values": "-1", - "Information": "true" - }, - { - "Code": "DSTVS1", - "Content": "Dienstverh?ltnis (?ffentlicher Dienst)", - "Type": "sachlich", - "Values": "-1", - "Information": "false" - }, - { - "Code": "DSTVS2", - "Content": "Dienstverh?ltnis", - "Type": "sachlich", - "Values": "-1", - "Information": "false" - }, - { - "Code": "GES", - "Content": "Geschlecht", - "Type": "sachlich", - "Values": "-1", - "Information": "false" - }, - { - "Code": "STAG", - "Content": "Stichtag", - "Type": "zeitidentifizierend", - "Values": "-1", - "Information": "false" - } - ], - "Copyright": "? Statistisches Bundesamt (Destatis), 2023" -} diff --git a/tests/testthat/variables3/api/catalogue/variables2statistic-8da08f.json b/tests/testthat/variables3/api/catalogue/variables2statistic-8da08f.json deleted file mode 100644 index 2dd65d8..0000000 --- a/tests/testthat/variables3/api/catalogue/variables2statistic-8da08f.json +++ /dev/null @@ -1,117 +0,0 @@ -{ - "Ident": { - "Service": "catalogue", - "Method": "variables2statistic" - }, - "Status": { - "Code": 0, - "Content": "erfolgreich", - "Type": "Information" - }, - "Parameter": { - "username": "********************", - "password": "********************", - "name": "61111", - "selection": "", - "area": "oeffentlich", - "searchcriterion": "Code", - "sortcriterion": "Code", - "type": "Alle", - "pagelength": "100", - "language": "de" - }, - "List": [ - { - "Code": "CC13A2", - "Content": "Verwendungszwecke des Individualkonsums, 2-Steller", - "Type": "sachlich", - "Values": "-1", - "Information": "true" - }, - { - "Code": "CC13A3", - "Content": "Verwendungszwecke des Individualkonsums, 3-Steller", - "Type": "sachlich", - "Values": "-1", - "Information": "true" - }, - { - "Code": "CC13A4", - "Content": "Verwendungszwecke des Individualkonsums, 4-Steller", - "Type": "sachlich", - "Values": "-1", - "Information": "true" - }, - { - "Code": "CC13A5", - "Content": "Verwendungszwecke des Individualkonsums, 5-Steller", - "Type": "sachlich", - "Values": "-1", - "Information": "true" - }, - { - "Code": "CC13B1", - "Content": "Verwendungszw.d.Individualkonsums,Sonderpositionen", - "Type": "sachlich", - "Values": "-1", - "Information": "true" - }, - { - "Code": "CC13Z1", - "Content": "Verwendungszwecke des Individualkonsums,10-Steller", - "Type": "sachlich", - "Values": "-1", - "Information": "true" - }, - { - "Code": "DINSG", - "Content": "Deutschland insgesamt", - "Type": "r?umlich insgesamt", - "Values": "-1", - "Information": "false" - }, - { - "Code": "DLAND", - "Content": "Bundesl?nder", - "Type": "r?umlich", - "Values": "-1", - "Information": "true" - }, - { - "Code": "JAHR", - "Content": "Jahr", - "Type": "zeitidentifizierend", - "Values": "-1", - "Information": "false" - }, - { - "Code": "MONAT", - "Content": "Monate", - "Type": "zeitlich", - "Values": "-1", - "Information": "false" - }, - { - "Code": "PRE034", - "Content": "Index der Nettokaltmieten", - "Type": "Wert", - "Values": "-1", - "Information": "false" - }, - { - "Code": "PRE999", - "Content": "Gewichtung", - "Type": "Wert", - "Values": "-1", - "Information": "false" - }, - { - "Code": "PREIS1", - "Content": "Verbraucherpreisindex", - "Type": "Wert", - "Values": "-1", - "Information": "true" - } - ], - "Copyright": "? Statistisches Bundesamt (Destatis), 2023" -} diff --git a/tests/testthat/xy_statistic1/api/catalogue/cubes2statistic-bacd2f.json b/tests/testthat/xy_statistic1/api/catalogue/cubes2statistic-bacd2f.json deleted file mode 100644 index 0184e89..0000000 --- a/tests/testthat/xy_statistic1/api/catalogue/cubes2statistic-bacd2f.json +++ /dev/null @@ -1,199 +0,0 @@ -{ - "Ident": { - "Service": "catalogue", - "Method": "cubes2statistic" - }, - "Status": { - "Code": 0, - "Content": "erfolgreich", - "Type": "Information" - }, - "Parameter": { - "username": "********************", - "password": "********************", - "name": "61111", - "selection": "", - "area": "oeffentlich", - "pagelength": "100", - "language": "de" - }, - "List": [ - { - "Code": "61111B5001", - "Content": "Verbraucherpreisindex f?r Deutschland, Gewichtung, Deutschland insgesamt, Verwendungszwecke des Individualkonsums, 2-Steller, Jahr", - "State": "vollst?ndig mit Werten", - "Time": "1995-2020", - "LatestUpdate": "17.02.2023 17:46:32h", - "Information": "false" - }, - { - "Code": "61111B5002", - "Content": "Verbraucherpreisindex f?r Deutschland, Gewichtung, Deutschland insgesamt, Verwendungszwecke des Individualkonsums, 3-Steller, Jahr", - "State": "vollst?ndig mit Werten", - "Time": "1995-2020", - "LatestUpdate": "17.02.2023 17:46:32h", - "Information": "false" - }, - { - "Code": "61111B5003", - "Content": "Verbraucherpreisindex f?r Deutschland, Gewichtung, Deutschland insgesamt, Verwendungszwecke des Individualkonsums, 4-Steller, Jahr", - "State": "vollst?ndig mit Werten", - "Time": "1995-2020", - "LatestUpdate": "17.02.2023 17:46:32h", - "Information": "false" - }, - { - "Code": "61111B5004", - "Content": "Verbraucherpreisindex f?r Deutschland, Gewichtung, Deutschland insgesamt, Verwendungszwecke des Individualkonsums, 5-Steller, Jahr", - "State": "vollst?ndig mit Werten", - "Time": "1995-2020", - "LatestUpdate": "17.02.2023 17:46:32h", - "Information": "false" - }, - { - "Code": "61111BJ001", - "Content": "Verbraucherpreisindex f?r Deutschland, Verbraucherpreisindex, Deutschland insgesamt, Jahr", - "State": "vollst?ndig mit Werten", - "Time": "1991-2022", - "LatestUpdate": "09.03.2023 12:07:11h", - "Information": "false" - }, - { - "Code": "61111BJ002", - "Content": "Verbraucherpreisindex f?r Deutschland, Verbraucherpreisindex, Deutschland insgesamt, Verwendungszwecke des Individualkonsums, 2-Steller, Jahr", - "State": "vollst?ndig mit Werten", - "Time": "1991-2022", - "LatestUpdate": "09.03.2023 12:09:18h", - "Information": "false" - }, - { - "Code": "61111BJ003", - "Content": "Verbraucherpreisindex f?r Deutschland, Verbraucherpreisindex, Deutschland insgesamt, Verwendungszwecke des Individualkonsums, 3-Steller, Jahr", - "State": "vollst?ndig mit Werten", - "Time": "1991-2022", - "LatestUpdate": "09.03.2023 12:11:38h", - "Information": "false" - }, - { - "Code": "61111BJ004", - "Content": "Verbraucherpreisindex f?r Deutschland, Verbraucherpreisindex, Deutschland insgesamt, Verwendungszwecke des Individualkonsums, 4-Steller, Jahr", - "State": "vollst?ndig mit Werten", - "Time": "2020-2022", - "LatestUpdate": "17.02.2023 17:46:49h", - "Information": "false" - }, - { - "Code": "61111BJ005", - "Content": "Verbraucherpreisindex f?r Deutschland, Verbraucherpreisindex, Deutschland insgesamt, Verwendungszwecke des Individualkonsums, 5-Steller, Jahr", - "State": "vollst?ndig mit Werten", - "Time": "2020-2022", - "LatestUpdate": "17.02.2023 17:46:49h", - "Information": "false" - }, - { - "Code": "61111BJ006", - "Content": "Verbraucherpreisindex f?r Deutschland, Verbraucherpreisindex, Deutschland insgesamt, Verwendungszw.d.Individualkonsums,Sonderpositionen, Jahr", - "State": "vollst?ndig mit Werten", - "Time": "2020-2022", - "LatestUpdate": "17.02.2023 17:46:49h", - "Information": "false" - }, - { - "Code": "61111BJ007", - "Content": "Verbraucherpreisindex f?r Deutschland, Verbraucherpreisindex, Deutschland insgesamt, Verwendungszwecke des Individualkonsums,10-Steller, Jahr", - "State": "vollst?ndig mit Werten", - "Time": "2020-2022", - "LatestUpdate": "03.03.2023 10:05:14h", - "Information": "false" - }, - { - "Code": "61111BM001", - "Content": "Verbraucherpreisindex f?r Deutschland, Verbraucherpreisindex, Deutschland insgesamt, Monate, Jahr", - "State": "vollst?ndig mit Werten", - "Time": "Januar 1991-Februar 2023", - "LatestUpdate": "10.03.2023 08:00:47h", - "Information": "false" - }, - { - "Code": "61111BM002", - "Content": "Verbraucherpreisindex f?r Deutschland, Verbraucherpreisindex, Deutschland insgesamt, Verwendungszwecke des Individualkonsums, 2-Steller, Monate, Jahr", - "State": "vollst?ndig mit Werten", - "Time": "Januar 1991-Februar 2023", - "LatestUpdate": "10.03.2023 08:00:35h", - "Information": "false" - }, - { - "Code": "61111BM003", - "Content": "Verbraucherpreisindex f?r Deutschland, Verbraucherpreisindex, Deutschland insgesamt, Verwendungszwecke des Individualkonsums, 3-Steller, Monate, Jahr", - "State": "vollst?ndig mit Werten", - "Time": "Januar 1991-Februar 2023", - "LatestUpdate": "10.03.2023 08:00:54h", - "Information": "false" - }, - { - "Code": "61111BM004", - "Content": "Verbraucherpreisindex f?r Deutschland, Verbraucherpreisindex, Deutschland insgesamt, Verwendungszwecke des Individualkonsums, 4-Steller, Monate, Jahr", - "State": "vollst?ndig mit Werten", - "Time": "Januar 2020-Februar 2023", - "LatestUpdate": "10.03.2023 08:00:51h", - "Information": "false" - }, - { - "Code": "61111BM005", - "Content": "Verbraucherpreisindex f?r Deutschland, Verbraucherpreisindex, Deutschland insgesamt, Verwendungszwecke des Individualkonsums, 5-Steller, Monate, Jahr", - "State": "vollst?ndig mit Werten", - "Time": "Januar 2020-Februar 2023", - "LatestUpdate": "10.03.2023 08:00:38h", - "Information": "false" - }, - { - "Code": "61111BM006", - "Content": "Verbraucherpreisindex f?r Deutschland, Verbraucherpreisindex, Deutschland insgesamt, Verwendungszw.d.Individualkonsums,Sonderpositionen, Monate, Jahr", - "State": "vollst?ndig mit Werten", - "Time": "Januar 2020-Februar 2023", - "LatestUpdate": "10.03.2023 08:00:28h", - "Information": "false" - }, - { - "Code": "61111BM007", - "Content": "Verbraucherpreisindex f?r Deutschland, Verbraucherpreisindex, Deutschland insgesamt, Verwendungszwecke des Individualkonsums,10-Steller, Monate, Jahr", - "State": "vollst?ndig mit Werten", - "Time": "Januar 2020-Februar 2023", - "LatestUpdate": "10.03.2023 08:00:31h", - "Information": "false" - }, - { - "Code": "61111LJ001", - "Content": "Verbraucherpreisindex f?r Deutschland, Verbraucherpreisindex, Bundesl?nder, Jahr", - "State": "vollst?ndig mit Werten", - "Time": "2020-2022", - "LatestUpdate": "17.02.2023 17:47:09h", - "Information": "false" - }, - { - "Code": "61111LJ100", - "Content": "Verbraucherpreisindex f?r Deutschland, Index der Nettokaltmieten, Bundesl?nder, Jahr", - "State": "vollst?ndig mit Werten", - "Time": "2020-2022", - "LatestUpdate": "17.02.2023 17:47:09h", - "Information": "false" - }, - { - "Code": "61111LM001", - "Content": "Verbraucherpreisindex f?r Deutschland, Verbraucherpreisindex, Bundesl?nder, Monate, Jahr", - "State": "vollst?ndig mit Werten", - "Time": "Januar 2020-Februar 2023", - "LatestUpdate": "10.03.2023 08:00:41h", - "Information": "false" - }, - { - "Code": "61111LM100", - "Content": "Verbraucherpreisindex f?r Deutschland, Index der Nettokaltmieten, Bundesl?nder, Monate, Jahr", - "State": "vollst?ndig mit Werten", - "Time": "Januar 2020-Februar 2023", - "LatestUpdate": "10.03.2023 08:00:44h", - "Information": "false" - } - ], - "Copyright": "? Statistisches Bundesamt (Destatis), 2023" -} diff --git a/tests/testthat/xy_statistic1/api/catalogue/tables2statistic-476d62.json b/tests/testthat/xy_statistic1/api/catalogue/tables2statistic-476d62.json deleted file mode 100644 index 123ed4e..0000000 --- a/tests/testthat/xy_statistic1/api/catalogue/tables2statistic-476d62.json +++ /dev/null @@ -1,78 +0,0 @@ -{ - "Ident": { - "Service": "catalogue", - "Method": "tables2statistic" - }, - "Status": { - "Code": 0, - "Content": "erfolgreich", - "Type": "Information" - }, - "Parameter": { - "username": "********************", - "password": "********************", - "name": "61111", - "selection": "", - "area": "oeffentlich", - "pagelength": "100", - "language": "de" - }, - "List": [ - { - "Code": "61111-0001", - "Content": "Verbraucherpreisindex: Deutschland, Jahre", - "Time": "1991 - 2022" - }, - { - "Code": "61111-0002", - "Content": "Verbraucherpreisindex: Deutschland, Monate", - "Time": "Januar 1991 - Februar 2023" - }, - { - "Code": "61111-0003", - "Content": "Verbraucherpreisindex: Deutschland, Jahre,\nKlassifikation der Verwendungszwecke des Individualkonsums\n(COICOP 2-5-Steller Hierarchie)", - "Time": "2020 - 2022" - }, - { - "Code": "61111-0004", - "Content": "Verbraucherpreisindex: Deutschland, Monate,\nKlassifikation der Verwendungszwecke des Individualkonsums\n(COICOP 2-5-Steller Hierarchie)", - "Time": "Januar 2020 - Februar 2023" - }, - { - "Code": "61111-0005", - "Content": "Verbraucherpreisindex: Deutschland, Jahre,\nKlassifikation der Verwendungszwecke des Individualkonsums\n(COICOP 2-/3-/4-/5-/10-Steller/Sonderpositionen)", - "Time": "1991 - 2022" - }, - { - "Code": "61111-0006", - "Content": "Verbraucherpreisindex: Deutschland, Monate,\nKlassifikation der Verwendungszwecke des Individualkonsums\n(COICOP 2-/3-/4-/5-/10-Steller/Sonderpositionen)", - "Time": "Januar 1991 - Februar 2023" - }, - { - "Code": "61111-0007", - "Content": "W?gungsschema des Verbraucherpreisindex: Deutschland, Jahre,\nKlassifikation der Verwendungszwecke des Individualkonsums\n(COICOP 2-5-Steller Hierarchie)", - "Time": "1995 - 2020" - }, - { - "Code": "61111-0010", - "Content": "Verbraucherpreisindex: Bundesl?nder, Jahre", - "Time": "2020 - 2022" - }, - { - "Code": "61111-0011", - "Content": "Verbraucherpreisindex: Bundesl?nder, Monate", - "Time": "Januar 2020 - Februar 2023" - }, - { - "Code": "61111-0020", - "Content": "Index der Nettokaltmieten: Bundesl?nder, Jahre", - "Time": "2020 - 2022" - }, - { - "Code": "61111-0021", - "Content": "Index der Nettokaltmieten: Bundesl?nder, Monate", - "Time": "Januar 2020 - Februar 2023" - } - ], - "Copyright": "? Statistisches Bundesamt (Destatis), 2023" -} diff --git a/tests/testthat/xy_statistic1/api/catalogue/variables2statistic-476d62.json b/tests/testthat/xy_statistic1/api/catalogue/variables2statistic-476d62.json deleted file mode 100644 index 2dd65d8..0000000 --- a/tests/testthat/xy_statistic1/api/catalogue/variables2statistic-476d62.json +++ /dev/null @@ -1,117 +0,0 @@ -{ - "Ident": { - "Service": "catalogue", - "Method": "variables2statistic" - }, - "Status": { - "Code": 0, - "Content": "erfolgreich", - "Type": "Information" - }, - "Parameter": { - "username": "********************", - "password": "********************", - "name": "61111", - "selection": "", - "area": "oeffentlich", - "searchcriterion": "Code", - "sortcriterion": "Code", - "type": "Alle", - "pagelength": "100", - "language": "de" - }, - "List": [ - { - "Code": "CC13A2", - "Content": "Verwendungszwecke des Individualkonsums, 2-Steller", - "Type": "sachlich", - "Values": "-1", - "Information": "true" - }, - { - "Code": "CC13A3", - "Content": "Verwendungszwecke des Individualkonsums, 3-Steller", - "Type": "sachlich", - "Values": "-1", - "Information": "true" - }, - { - "Code": "CC13A4", - "Content": "Verwendungszwecke des Individualkonsums, 4-Steller", - "Type": "sachlich", - "Values": "-1", - "Information": "true" - }, - { - "Code": "CC13A5", - "Content": "Verwendungszwecke des Individualkonsums, 5-Steller", - "Type": "sachlich", - "Values": "-1", - "Information": "true" - }, - { - "Code": "CC13B1", - "Content": "Verwendungszw.d.Individualkonsums,Sonderpositionen", - "Type": "sachlich", - "Values": "-1", - "Information": "true" - }, - { - "Code": "CC13Z1", - "Content": "Verwendungszwecke des Individualkonsums,10-Steller", - "Type": "sachlich", - "Values": "-1", - "Information": "true" - }, - { - "Code": "DINSG", - "Content": "Deutschland insgesamt", - "Type": "r?umlich insgesamt", - "Values": "-1", - "Information": "false" - }, - { - "Code": "DLAND", - "Content": "Bundesl?nder", - "Type": "r?umlich", - "Values": "-1", - "Information": "true" - }, - { - "Code": "JAHR", - "Content": "Jahr", - "Type": "zeitidentifizierend", - "Values": "-1", - "Information": "false" - }, - { - "Code": "MONAT", - "Content": "Monate", - "Type": "zeitlich", - "Values": "-1", - "Information": "false" - }, - { - "Code": "PRE034", - "Content": "Index der Nettokaltmieten", - "Type": "Wert", - "Values": "-1", - "Information": "false" - }, - { - "Code": "PRE999", - "Content": "Gewichtung", - "Type": "Wert", - "Values": "-1", - "Information": "false" - }, - { - "Code": "PREIS1", - "Content": "Verbraucherpreisindex", - "Type": "Wert", - "Values": "-1", - "Information": "true" - } - ], - "Copyright": "? Statistisches Bundesamt (Destatis), 2023" -} diff --git a/tests/testthat/xy_statistic2/api/catalogue/tables2statistic-476d62.json b/tests/testthat/xy_statistic2/api/catalogue/tables2statistic-476d62.json deleted file mode 100644 index 123ed4e..0000000 --- a/tests/testthat/xy_statistic2/api/catalogue/tables2statistic-476d62.json +++ /dev/null @@ -1,78 +0,0 @@ -{ - "Ident": { - "Service": "catalogue", - "Method": "tables2statistic" - }, - "Status": { - "Code": 0, - "Content": "erfolgreich", - "Type": "Information" - }, - "Parameter": { - "username": "********************", - "password": "********************", - "name": "61111", - "selection": "", - "area": "oeffentlich", - "pagelength": "100", - "language": "de" - }, - "List": [ - { - "Code": "61111-0001", - "Content": "Verbraucherpreisindex: Deutschland, Jahre", - "Time": "1991 - 2022" - }, - { - "Code": "61111-0002", - "Content": "Verbraucherpreisindex: Deutschland, Monate", - "Time": "Januar 1991 - Februar 2023" - }, - { - "Code": "61111-0003", - "Content": "Verbraucherpreisindex: Deutschland, Jahre,\nKlassifikation der Verwendungszwecke des Individualkonsums\n(COICOP 2-5-Steller Hierarchie)", - "Time": "2020 - 2022" - }, - { - "Code": "61111-0004", - "Content": "Verbraucherpreisindex: Deutschland, Monate,\nKlassifikation der Verwendungszwecke des Individualkonsums\n(COICOP 2-5-Steller Hierarchie)", - "Time": "Januar 2020 - Februar 2023" - }, - { - "Code": "61111-0005", - "Content": "Verbraucherpreisindex: Deutschland, Jahre,\nKlassifikation der Verwendungszwecke des Individualkonsums\n(COICOP 2-/3-/4-/5-/10-Steller/Sonderpositionen)", - "Time": "1991 - 2022" - }, - { - "Code": "61111-0006", - "Content": "Verbraucherpreisindex: Deutschland, Monate,\nKlassifikation der Verwendungszwecke des Individualkonsums\n(COICOP 2-/3-/4-/5-/10-Steller/Sonderpositionen)", - "Time": "Januar 1991 - Februar 2023" - }, - { - "Code": "61111-0007", - "Content": "W?gungsschema des Verbraucherpreisindex: Deutschland, Jahre,\nKlassifikation der Verwendungszwecke des Individualkonsums\n(COICOP 2-5-Steller Hierarchie)", - "Time": "1995 - 2020" - }, - { - "Code": "61111-0010", - "Content": "Verbraucherpreisindex: Bundesl?nder, Jahre", - "Time": "2020 - 2022" - }, - { - "Code": "61111-0011", - "Content": "Verbraucherpreisindex: Bundesl?nder, Monate", - "Time": "Januar 2020 - Februar 2023" - }, - { - "Code": "61111-0020", - "Content": "Index der Nettokaltmieten: Bundesl?nder, Jahre", - "Time": "2020 - 2022" - }, - { - "Code": "61111-0021", - "Content": "Index der Nettokaltmieten: Bundesl?nder, Monate", - "Time": "Januar 2020 - Februar 2023" - } - ], - "Copyright": "? Statistisches Bundesamt (Destatis), 2023" -} diff --git a/tests/testthat/xy_statistic3/api/catalogue/tables2statistic-476d62.json b/tests/testthat/xy_statistic3/api/catalogue/tables2statistic-476d62.json deleted file mode 100644 index 123ed4e..0000000 --- a/tests/testthat/xy_statistic3/api/catalogue/tables2statistic-476d62.json +++ /dev/null @@ -1,78 +0,0 @@ -{ - "Ident": { - "Service": "catalogue", - "Method": "tables2statistic" - }, - "Status": { - "Code": 0, - "Content": "erfolgreich", - "Type": "Information" - }, - "Parameter": { - "username": "********************", - "password": "********************", - "name": "61111", - "selection": "", - "area": "oeffentlich", - "pagelength": "100", - "language": "de" - }, - "List": [ - { - "Code": "61111-0001", - "Content": "Verbraucherpreisindex: Deutschland, Jahre", - "Time": "1991 - 2022" - }, - { - "Code": "61111-0002", - "Content": "Verbraucherpreisindex: Deutschland, Monate", - "Time": "Januar 1991 - Februar 2023" - }, - { - "Code": "61111-0003", - "Content": "Verbraucherpreisindex: Deutschland, Jahre,\nKlassifikation der Verwendungszwecke des Individualkonsums\n(COICOP 2-5-Steller Hierarchie)", - "Time": "2020 - 2022" - }, - { - "Code": "61111-0004", - "Content": "Verbraucherpreisindex: Deutschland, Monate,\nKlassifikation der Verwendungszwecke des Individualkonsums\n(COICOP 2-5-Steller Hierarchie)", - "Time": "Januar 2020 - Februar 2023" - }, - { - "Code": "61111-0005", - "Content": "Verbraucherpreisindex: Deutschland, Jahre,\nKlassifikation der Verwendungszwecke des Individualkonsums\n(COICOP 2-/3-/4-/5-/10-Steller/Sonderpositionen)", - "Time": "1991 - 2022" - }, - { - "Code": "61111-0006", - "Content": "Verbraucherpreisindex: Deutschland, Monate,\nKlassifikation der Verwendungszwecke des Individualkonsums\n(COICOP 2-/3-/4-/5-/10-Steller/Sonderpositionen)", - "Time": "Januar 1991 - Februar 2023" - }, - { - "Code": "61111-0007", - "Content": "W?gungsschema des Verbraucherpreisindex: Deutschland, Jahre,\nKlassifikation der Verwendungszwecke des Individualkonsums\n(COICOP 2-5-Steller Hierarchie)", - "Time": "1995 - 2020" - }, - { - "Code": "61111-0010", - "Content": "Verbraucherpreisindex: Bundesl?nder, Jahre", - "Time": "2020 - 2022" - }, - { - "Code": "61111-0011", - "Content": "Verbraucherpreisindex: Bundesl?nder, Monate", - "Time": "Januar 2020 - Februar 2023" - }, - { - "Code": "61111-0020", - "Content": "Index der Nettokaltmieten: Bundesl?nder, Jahre", - "Time": "2020 - 2022" - }, - { - "Code": "61111-0021", - "Content": "Index der Nettokaltmieten: Bundesl?nder, Monate", - "Time": "Januar 2020 - Februar 2023" - } - ], - "Copyright": "? Statistisches Bundesamt (Destatis), 2023" -} diff --git a/tests/testthat/xy_variable1/api/catalogue/statistics2variable-0e956d.json b/tests/testthat/xy_variable1/api/catalogue/statistics2variable-0e956d.json deleted file mode 100644 index 1fa227d..0000000 --- a/tests/testthat/xy_variable1/api/catalogue/statistics2variable-0e956d.json +++ /dev/null @@ -1,625 +0,0 @@ -{ - "Ident": { - "Service": "catalogue", - "Method": "statistics2variable" - }, - "Status": { - "Code": 0, - "Content": "erfolgreich", - "Type": "Information" - }, - "Parameter": { - "username": "********************", - "password": "********************", - "name": "DLAND", - "selection": "", - "area": "oeffentlich", - "searchcriterion": "Code", - "sortcriterion": "Code", - "pagelength": "100", - "language": "de" - }, - "List": [ - { - "Code": "11111", - "Content": "Feststellung des Gebietsstands", - "Cubes": "3", - "Information": "true" - }, - { - "Code": "12111", - "Content": "Zensus", - "Cubes": "24", - "Information": "true" - }, - { - "Code": "12211", - "Content": "Mikrozensus", - "Cubes": "483", - "Information": "true" - }, - { - "Code": "12231", - "Content": "IKT-Nutzung in privaten Haushalten", - "Cubes": "42", - "Information": "true" - }, - { - "Code": "12251", - "Content": "Arbeitsmarktstatistik des Mikrozensus", - "Cubes": "68", - "Information": "false" - }, - { - "Code": "12411", - "Content": "Fortschreibung des Bev?lkerungsstandes", - "Cubes": "28", - "Information": "true" - }, - { - "Code": "12421", - "Content": "Bev?lkerungsvorausberechnungen", - "Cubes": "16", - "Information": "true" - }, - { - "Code": "12521", - "Content": "Ausl?nderstatistik", - "Cubes": "98", - "Information": "true" - }, - { - "Code": "12531", - "Content": "Statistik ?ber Schutzsuchende", - "Cubes": "78", - "Information": "true" - }, - { - "Code": "12611", - "Content": "Statistik der Eheschlie?ungen", - "Cubes": "7", - "Information": "true" - }, - { - "Code": "12612", - "Content": "Statistik der Geburten", - "Cubes": "33", - "Information": "true" - }, - { - "Code": "12613", - "Content": "Statistik der Sterbef?lle", - "Cubes": "17", - "Information": "true" - }, - { - "Code": "12621", - "Content": "Sterbetafeln", - "Cubes": "3", - "Information": "true" - }, - { - "Code": "12631", - "Content": "Statistik rechtskr?ftiger Urteile in Ehesachen", - "Cubes": "6", - "Information": "true" - }, - { - "Code": "12651", - "Content": "Begr?ndung von Lebenspartnerschaften", - "Cubes": "3", - "Information": "true" - }, - { - "Code": "12661", - "Content": "Aufhebung von Lebenspartnerschaften", - "Cubes": "4", - "Information": "true" - }, - { - "Code": "12711", - "Content": "Wanderungsstatistik", - "Cubes": "46", - "Information": "true" - }, - { - "Code": "13111", - "Content": "Statistik d. sozialversicherungspfl. Besch?ftigten", - "Cubes": "13", - "Information": "true" - }, - { - "Code": "13211", - "Content": "Arbeitsmarktstatistik der Bundesagentur f?r Arbeit", - "Cubes": "16", - "Information": "true" - }, - { - "Code": "13311", - "Content": "L?nderberechnung Erwerbst?tige", - "Cubes": "4", - "Information": "true" - }, - { - "Code": "14111", - "Content": "Allgemeine Bundestagswahlstatistik", - "Cubes": "4", - "Information": "true" - }, - { - "Code": "14121", - "Content": "Repr?sentative Bundestagswahlstatistik", - "Cubes": "10", - "Information": "true" - }, - { - "Code": "14211", - "Content": "Allgemeine Europawahlstatistik", - "Cubes": "2", - "Information": "true" - }, - { - "Code": "14221", - "Content": "Repr?sentative Europawahlstatistik", - "Cubes": "4", - "Information": "true" - }, - { - "Code": "21111", - "Content": "Statistik der allgemeinbildenden Schulen", - "Cubes": "96", - "Information": "true" - }, - { - "Code": "21121", - "Content": "Statistik der beruflichen Schulen", - "Cubes": "36", - "Information": "true" - }, - { - "Code": "21211", - "Content": "Berufsbildungsstatistik", - "Cubes": "48", - "Information": "true" - }, - { - "Code": "21241", - "Content": "Pflegeausbildungsstatistik", - "Cubes": "18", - "Information": "true" - }, - { - "Code": "21311", - "Content": "Statistik der Studenten", - "Cubes": "10", - "Information": "true" - }, - { - "Code": "21321", - "Content": "Statistik der Pr?fungen", - "Cubes": "5", - "Information": "true" - }, - { - "Code": "21351", - "Content": "Statistik der Habilitationen", - "Cubes": "6", - "Information": "true" - }, - { - "Code": "21352", - "Content": "Statistik der Promovierenden", - "Cubes": "28", - "Information": "true" - }, - { - "Code": "21353", - "Content": "Statistik der Hochschulr?te", - "Cubes": "2", - "Information": "true" - }, - { - "Code": "21354", - "Content": "Statistik der Berufsakademien", - "Cubes": "10", - "Information": "true" - }, - { - "Code": "21371", - "Content": "Hochschulfinanzstatistik", - "Cubes": "8", - "Information": "true" - }, - { - "Code": "21381", - "Content": "Hochschulstatistische Kennzahlen", - "Cubes": "11", - "Information": "false" - }, - { - "Code": "21411", - "Content": "Statistik der Bundesausbildungsf?rderung (BAf?G)", - "Cubes": "4", - "Information": "true" - }, - { - "Code": "21421", - "Content": "Statistik der Aufstiegsfortbildungsf?rderung", - "Cubes": "30", - "Information": "true" - }, - { - "Code": "21431", - "Content": "F?rderung nach dem Stipendienprogramm-Gesetz", - "Cubes": "37", - "Information": "true" - }, - { - "Code": "21611", - "Content": "Kulturstatistik", - "Cubes": "24", - "Information": "true" - }, - { - "Code": "21621", - "Content": "Berichterstattung ?ber ?ffentliche Kulturausgaben", - "Cubes": "6", - "Information": "true" - }, - { - "Code": "21711", - "Content": "Bildungsberichterstattung f?r nationale Zwecke", - "Cubes": "13", - "Information": "false" - }, - { - "Code": "21821", - "Content": "Berichterstattung ?ber Forschung und Entwicklung", - "Cubes": "5", - "Information": "false" - }, - { - "Code": "22111", - "Content": "Statistik d. Ausgaben u. Einnahmen der Sozialhilfe", - "Cubes": "36", - "Information": "true" - }, - { - "Code": "22121", - "Content": "Statistik d. Empf?nger v. Hilfe z. Lebensunterhalt", - "Cubes": "26", - "Information": "true" - }, - { - "Code": "22131", - "Content": "Statistik d. Empf?nger v. Leist.(5.-9.Kap.SGB XII)", - "Cubes": "20", - "Information": "true" - }, - { - "Code": "22151", - "Content": "Grundsicherung im Alter und bei Erwerbsminderung", - "Cubes": "91", - "Information": "true" - }, - { - "Code": "22161", - "Content": "Statistik der Empf. v.Eingliederungshilfe (SGB IX)", - "Cubes": "24", - "Information": "true" - }, - { - "Code": "22162", - "Content": "Stat.d.Ausg.u.Einn.d.Eingliederungshilfe (SGB IX)", - "Cubes": "3", - "Information": "true" - }, - { - "Code": "22211", - "Content": "Ausgaben und Einnahmen f?r Asylbewerberleistungen", - "Cubes": "12", - "Information": "true" - }, - { - "Code": "22221", - "Content": "Statistik der Empf?nger von Asylbewerberleistungen", - "Cubes": "11", - "Information": "true" - }, - { - "Code": "22231", - "Content": "Stat.d. Empf?nger von besonderen Asylbewerberlstg.", - "Cubes": "6", - "Information": "true" - }, - { - "Code": "22311", - "Content": "Wohngeld zum 31.12.", - "Cubes": "23", - "Information": "true" - }, - { - "Code": "22411", - "Content": "Statistik ?ber ambulante Pflegeeinrichtungen", - "Cubes": "21", - "Information": "true" - }, - { - "Code": "22412", - "Content": "Statistik ?ber station?re Pflegeeinrichtungen", - "Cubes": "23", - "Information": "true" - }, - { - "Code": "22421", - "Content": "Statistik ?ber d. Empf?nger v.Pflegegeldleistungen", - "Cubes": "19", - "Information": "true" - }, - { - "Code": "22517", - "Content": "Statistik der erzieherischen Hilfen", - "Cubes": "12", - "Information": "true" - }, - { - "Code": "22518", - "Content": "Stat. ?. d. Schutzauftrag bei Kindeswohlgef?hrdung", - "Cubes": "26", - "Information": "true" - }, - { - "Code": "22521", - "Content": "Statistik der Adoptionen", - "Cubes": "22", - "Information": "true" - }, - { - "Code": "22522", - "Content": "Statistik der Pflegeerlaubnis, Vormundschaften etc", - "Cubes": "13", - "Information": "true" - }, - { - "Code": "22523", - "Content": "Statistik der vorl?ufigen Schutzma?nahmen", - "Cubes": "31", - "Information": "true" - }, - { - "Code": "22541", - "Content": "Kinder und t?tige Personen in Tageseinrichtungen", - "Cubes": "1", - "Information": "true" - }, - { - "Code": "22542", - "Content": "Statistik der Einricht. der Kinder- u. Jugendhilfe", - "Cubes": "4", - "Information": "true" - }, - { - "Code": "22543", - "Content": "Kinder und t?tige Personen in Kindertagespflege", - "Cubes": "29", - "Information": "true" - }, - { - "Code": "22551", - "Content": "Ausgaben und Einnahmen der Kinder- und Jugendhilfe", - "Cubes": "20", - "Information": "true" - }, - { - "Code": "22922", - "Content": "Statistik zum Elterngeld", - "Cubes": "98", - "Information": "true" - }, - { - "Code": "22923", - "Content": "Statistik zum Betreuungsgeld", - "Cubes": "3", - "Information": "true" - }, - { - "Code": "22971", - "Content": "Statistik untergebrachter wohnungsloser Personen", - "Cubes": "104", - "Information": "true" - }, - { - "Code": "23131", - "Content": "Diagnosen der Krankenhauspatienten", - "Cubes": "70", - "Information": "true" - }, - { - "Code": "23141", - "Content": "Fallpauschalenbezogene Krankenhausstatistik (DRG)", - "Cubes": "88", - "Information": "true" - }, - { - "Code": "23311", - "Content": "Statistik der Schwangerschaftsabbr?che", - "Cubes": "2", - "Information": "true" - }, - { - "Code": "24111", - "Content": "Statistik der Zahl der Gerichte", - "Cubes": "1", - "Information": "true" - }, - { - "Code": "24211", - "Content": "Statistik bei den Staats- und Amtsanwaltschaften", - "Cubes": "6", - "Information": "true" - }, - { - "Code": "24221", - "Content": "Statistik ?ber Straf- und Bu?geldverfahren", - "Cubes": "4", - "Information": "true" - }, - { - "Code": "24231", - "Content": "Statistik ?ber Zivilsachen", - "Cubes": "2", - "Information": "true" - }, - { - "Code": "24241", - "Content": "Statistik ?ber Familiensachen", - "Cubes": "4", - "Information": "true" - }, - { - "Code": "24251", - "Content": "Statistik in der Verwaltungsgerichtsbarkeit", - "Cubes": "2", - "Information": "true" - }, - { - "Code": "24261", - "Content": "Statistik in der Finanzgerichtsbarkeit", - "Cubes": "2", - "Information": "true" - }, - { - "Code": "24271", - "Content": "Statistik in der Sozialgerichtsbarkeit", - "Cubes": "2", - "Information": "true" - }, - { - "Code": "24281", - "Content": "Statistik in der Arbeitsgerichtsbarkeit", - "Cubes": "2", - "Information": "true" - }, - { - "Code": "24321", - "Content": "Strafvollzugsstatistik", - "Cubes": "3", - "Information": "true" - }, - { - "Code": "31111", - "Content": "Statistik der Baugenehmigungen", - "Cubes": "8", - "Information": "true" - }, - { - "Code": "31121", - "Content": "Statistik der Baufertigstellungen", - "Cubes": "4", - "Information": "true" - }, - { - "Code": "31131", - "Content": "Statistik des Bau?berhangs", - "Cubes": "8", - "Information": "true" - }, - { - "Code": "31141", - "Content": "Statistik des Bauabgangs", - "Cubes": "8", - "Information": "true" - }, - { - "Code": "31231", - "Content": "Fortschreibung Wohngeb?ude- und Wohnungsbestand", - "Cubes": "6", - "Information": "true" - }, - { - "Code": "32111", - "Content": "Erhebung der Abfallentsorgung", - "Cubes": "8", - "Information": "true" - }, - { - "Code": "32121", - "Content": "Erhebung der ?ffentlich-rechtl. Abfallentsorgung", - "Cubes": "5", - "Information": "true" - }, - { - "Code": "32131", - "Content": "Erh. d. Einsammlung v. Transport- u.Umverpackungen", - "Cubes": "6", - "Information": "true" - }, - { - "Code": "32136", - "Content": "Erhebung ?ber zur?ckgenommene Verkaufsverpackungen", - "Cubes": "10", - "Information": "true" - }, - { - "Code": "32141", - "Content": "Aufbereitung,Verwertung v. Bau- u. Abbruchabf?llen", - "Cubes": "7", - "Information": "true" - }, - { - "Code": "32151", - "Content": "Erhebung der gef?hrlichen Abf?lle", - "Cubes": "12", - "Information": "true" - }, - { - "Code": "32161", - "Content": "Erhebung ?ber die Abfallerzeugung", - "Cubes": "6", - "Information": "true" - }, - { - "Code": "32211", - "Content": "Erhebung der ?ffentlichen Wasserversorgung", - "Cubes": "4", - "Information": "true" - }, - { - "Code": "32212", - "Content": "Erhebung der ?ffentlichen Abwasserentsorgung", - "Cubes": "2", - "Information": "true" - }, - { - "Code": "32213", - "Content": "Erhebung der ?ffentlichen Abwasserbehandlung", - "Cubes": "4", - "Information": "true" - }, - { - "Code": "32214", - "Content": "Erhebung der ?ff. Abwasserentsorgung - Kl?rschlamm", - "Cubes": "1", - "Information": "true" - }, - { - "Code": "32221", - "Content": "Erh. nicht?ff. Wasserversorgung,Abwasserentsorgung", - "Cubes": "12", - "Information": "true" - }, - { - "Code": "32251", - "Content": "Wassereigenversorgung u.-entsorgung priv.Haushalte", - "Cubes": "1", - "Information": "true" - }, - { - "Code": "32331", - "Content": "Erh. der Anlagen zum Umgang mit wassergef. Stoffen", - "Cubes": "40", - "Information": "true" - } - ], - "Copyright": "? Statistisches Bundesamt (Destatis), 2023" -} diff --git a/tests/testthat/xy_variable1/api/catalogue/tables2variable-0e956d.json b/tests/testthat/xy_variable1/api/catalogue/tables2variable-0e956d.json deleted file mode 100644 index 7edf6f6..0000000 --- a/tests/testthat/xy_variable1/api/catalogue/tables2variable-0e956d.json +++ /dev/null @@ -1,523 +0,0 @@ -{ - "Ident": { - "Service": "catalogue", - "Method": "tables2variable" - }, - "Status": { - "Code": 0, - "Content": "erfolgreich", - "Type": "Information" - }, - "Parameter": { - "username": "********************", - "password": "********************", - "name": "DLAND", - "selection": "", - "area": "oeffentlich", - "pagelength": "100", - "language": "de" - }, - "List": [ - { - "Code": "11111-0001", - "Content": "Gebietsfl?che: Bundesl?nder, Stichtag", - "Time": "31.12.1995 - 31.12.2020" - }, - { - "Code": "12111-0101", - "Content": "Bev?lkerung (Zensus): Bundesl?nder, Stichtag, Nationalit?t,\nGeschlecht", - "Time": "" - }, - { - "Code": "12111-0102", - "Content": "Bev?lkerung (Zensus): Bundesl?nder, Stichtag, Nationalit?t,\nAltersgruppen", - "Time": "" - }, - { - "Code": "12111-0103", - "Content": "Bev?lkerung (Zensus): Bundesl?nder, Stichtag, Nationalit?t,\nFamilienstand", - "Time": "" - }, - { - "Code": "12111-0104", - "Content": "Bev?lkerung (Zensus): Bundesl?nder, Stichtag, Geschlecht,\nAltersgruppen", - "Time": "" - }, - { - "Code": "12111-0105", - "Content": "Bev?lkerung (Zensus): Bundesl?nder, Stichtag, Geschlecht,\nFamilienstand", - "Time": "" - }, - { - "Code": "12111-0106", - "Content": "Bev?lkerung (Zensus): Bundesl?nder, Stichtag, Familienstand,\nAltersgruppen", - "Time": "" - }, - { - "Code": "12211-0902", - "Content": "Bev?lkerung in Gemeinschaftsunterk?nften: Bundesl?nder,\nJahre, Hauptstatus, Geschlecht, Altersgruppen", - "Time": "2017 - 2021" - }, - { - "Code": "12211-0903", - "Content": "Bev?lkerung in Gemeinschaftsunterk?nften: Bundesl?nder,\nJahre, Art der Gemeinschaftsunterkunft, Geschlecht", - "Time": "2017 - 2021" - }, - { - "Code": "12211-1001", - "Content": "Bev?lkerung, Erwerbst?tige, Erwerbslose, Erwerbspersonen, Nichterwerbspersonen aus Hauptwohnsitzhaushalten: Bundesl?nder, Jahre, Geschlecht, Altersgruppen", - "Time": "2021 - 2021" - }, - { - "Code": "12211-1002", - "Content": "Bev?lkerung, Erwerbst?tige, Erwerbslose, Erwerbspersonen, Nichterwerbspersonen aus Hauptwohnsitzhaushalten: Bundesl?nder, Jahre, ?berwiegender Lebensunterhalt, Altersgruppen", - "Time": "2021 - 2021" - }, - { - "Code": "12211-1003", - "Content": "Bev?lkerung, Erwerbst?tige, Erwerbslose, Erwerbspersonen,\nNichterwerbspersonen aus Hauptwohnsitzhaush.: Bundesl?nder,\nJahre, Geschlecht, Gr??enkl. pers?nl. monatl. Nettoeinkommen", - "Time": "2021 - 2021" - }, - { - "Code": "12211-1004", - "Content": "Erwerbst?tige aus Hauptwohnsitzhaushalten: Bundesl?nder,\nJahre, Geschlecht, Altersgruppen, Stellung im Beruf", - "Time": "2021 - 2021" - }, - { - "Code": "12211-9004", - "Content": "Bev?lkerung, Erwerbst?tige, Erwerbslose, Erwerbspersonen,\nNichterwerbspersonen: Bundesl?nder, Jahre (bis 2019)", - "Time": "04/1991 - 2019" - }, - { - "Code": "12211-9014", - "Content": "Bev?lkerung (ab 15 Jahren): Bundesl?nder, Jahre (bis 2019),\nGeschlecht, Allgemeine Schulausbildung", - "Time": "2005 - 2019" - }, - { - "Code": "12211-9015", - "Content": "Bev?lkerung (ab 15 Jahren): Bundesl?nder, Jahre (bis 2019),\nGeschlecht, Beruflicher Bildungsabschluss", - "Time": "2005 - 2019" - }, - { - "Code": "12211-9033", - "Content": "Privathaushalte: Bundesl?nder, Jahre (bis 2019)", - "Time": "05/1970 - 2019" - }, - { - "Code": "12211-9034", - "Content": "Privathaushalte: Bundesl?nder, Jahre (bis 2019), Haushaltsgr??e", - "Time": "04/1991 - 2019" - }, - { - "Code": "12211-9041", - "Content": "Bev?lkerung in Familien/Lebensformen: Bundesl?nder, Jahre (bis 2019), Lebensformen", - "Time": "04/1996 - 2019" - }, - { - "Code": "12211-9044", - "Content": "Familien, Paare, Alleinerziehende: Bundesl?nder, Jahre (bis 2019), Vorhandensein von Kindern", - "Time": "04/1996 - 2019" - }, - { - "Code": "12211-9047", - "Content": "Ehepaare, Lebensgemeinschaften, Gemischtgeschlechtliche\nLebensgemeinschaften: Bundesl?nder, Jahre (bis 2019),\nVorhandensein von Kindern", - "Time": "04/1996 - 2019" - }, - { - "Code": "12211-9051", - "Content": "Alleinerziehende: Bundesl?nder, Jahre (bis 2019),\nGeschlecht, Vorhandensein von Kindern", - "Time": "04/1996 - 2019" - }, - { - "Code": "12211-9053", - "Content": "Alleinstehende: Bundesl?nder, Jahre (bis 2019), Geschlecht,\nHaushaltsgr??e", - "Time": "04/1996 - 2019" - }, - { - "Code": "12211-9056", - "Content": "Ledige Kinder in Familien: Bundesl?nder, Jahre (bis 2019),\nFamilienformen", - "Time": "04/1996 - 2019" - }, - { - "Code": "12231-0101", - "Content": "Bev?lkerung von 16 bis unter 75 Jahren in\nHauptwohnsitzhaushalten: Bundesl?nder, Jahre, Altersgruppen,\nPrivate Internetaktivit?ten in den letzten drei Monaten", - "Time": "2022 - 2022" - }, - { - "Code": "12231-0102", - "Content": "Bev?lkerung von 16 bis unter 75 Jahren in\nHauptwohnsitzhaushalten: Bundesl?nder, Jahre, Altersgruppen,\nPrivate Internetk?ufe in den letzten drei Monaten", - "Time": "2022 - 2022" - }, - { - "Code": "12251-0101", - "Content": "Erwerbst?tige aus Hauptwohnsitzhaushalten: Bundesl?nder, Jahre, Geschlecht, Stellung im Beruf, Gr??enklassen der in der Arbeitsst?tte t?tigen Personen", - "Time": "2021 - 2021" - }, - { - "Code": "12251-0102", - "Content": "Erwerbst?tige aus Hauptwohnsitzhaushalten: Bundesl?nder,\nJahre, Geschlecht, Stellung im Beruf, Wochenend- und\nFeiertagsarbeit", - "Time": "2021 - 2021" - }, - { - "Code": "12251-0103", - "Content": "Erwerbst?tige aus Hauptwohnsitzhaushalten: Bundesl?nder,\nJahre, Geschlecht, Stellung im Beruf, Abend-, Nacht- und\nSchichtarbeit", - "Time": "2021 - 2021" - }, - { - "Code": "12251-0104", - "Content": "Erwerbst?tige aus Hauptwohnsitzhaushalten: Bundesl?nder,\nJahre, Geschlecht, Stellung im Beruf, Erwerbsarbeit zu\nHause", - "Time": "2021 - 2021" - }, - { - "Code": "12251-0108", - "Content": "Abh?ngig Erwerbst?tige aus Hauptwohnsitzhaushalten:\nBundesl?nder, Jahre, Geschlecht, Altersgruppen, Art des\nArbeitsvertrages", - "Time": "2021 - 2021" - }, - { - "Code": "12411-0010", - "Content": "Bev?lkerung: Bundesl?nder, Stichtag", - "Time": "31.12.1958 - 31.12.2021" - }, - { - "Code": "12411-0011", - "Content": "Bev?lkerung: Bundesl?nder, Stichtag, Geschlecht", - "Time": "31.12.1967 - 31.12.2021" - }, - { - "Code": "12411-0012", - "Content": "Bev?lkerung: Bundesl?nder, Stichtag, Altersjahre", - "Time": "31.12.1967 - 31.12.2021" - }, - { - "Code": "12411-0013", - "Content": "Bev?lkerung: Bundesl?nder, Stichtag, Geschlecht, Altersjahre", - "Time": "31.12.1967 - 31.12.2021" - }, - { - "Code": "12411-0014", - "Content": "Bev?lkerung: Bundesl?nder, Stichtag, Nationalit?t,\nGeschlecht, Altersjahre", - "Time": "31.12.2000 - 31.12.2021" - }, - { - "Code": "12411-0021", - "Content": "Bev?lkerung: Bundesl?nder, Stichtag zum Quartalsende,\nGeschlecht", - "Time": "31.03.1991 - 30.09.2022" - }, - { - "Code": "12411-0042", - "Content": "Durchschnittliche Bev?lkerung: Bundesl?nder, Jahre,\nNationalit?t, Geschlecht", - "Time": "2000 - 2021" - }, - { - "Code": "12411-0050", - "Content": "Bev?lkerungsdichte: Bundesl?nder, Stichtag", - "Time": "31.12.1995 - 31.12.2020" - }, - { - "Code": "12421-0003", - "Content": "Vorausberechneter Bev?lkerungsstand: Bundesl?nder, Stichtag,\nVarianten der Bev?lkerungsvorausberechnung", - "Time": "31.12.2022 - 31.12.2070" - }, - { - "Code": "12421-0004", - "Content": "Vorausberechneter Bev?lkerungsstand: Bundesl?nder, Stichtag,\nVarianten der Bev?lkerungsvorausberechnung, Geschlecht,\nAltersjahre", - "Time": "31.12.2022 - 31.12.2070" - }, - { - "Code": "12421-0101", - "Content": "Vorausberechnete Privathaushalte: Bundesl?nder, Jahre,\nVarianten der Haushaltsvorausberechnung, Haushaltsgr??e", - "Time": "2019 - 2040" - }, - { - "Code": "12521-0020", - "Content": "Ausl?nder: Bundesl?nder, Stichtag, Geschlecht/Altersjahre/\nFamilienstand", - "Time": "30.09.1980 - 31.12.2021" - }, - { - "Code": "12521-0021", - "Content": "Ausl?nder: Bundesl?nder, Stichtag, Geschlecht/Altersjahre/\nFamilienstand, L?ndergruppierungen/Staatsangeh?rigkeit", - "Time": "30.09.1980 - 31.12.2021" - }, - { - "Code": "12521-0022", - "Content": "Ausl?nder: Bundesl?nder, Stichtag, Geschlecht, Altersjahre,\nL?ndergruppierungen/Staatsangeh?rigkeit", - "Time": "31.12.1998 - 31.12.2021" - }, - { - "Code": "12521-0023", - "Content": "Ausl?nder: Bundesl?nder, Stichtag, Geschlecht, Altersjahre,\nMigrantengeneration, L?ndergruppierungen/Staatsangeh?rigkeit", - "Time": "31.12.1998 - 31.12.2021" - }, - { - "Code": "12521-0024", - "Content": "Ausl?nder: Bundesl?nder, Stichtag, Geschlecht,\nFamilienstand, L?ndergruppierungen/Staatsangeh?rigkeit", - "Time": "31.12.1998 - 31.12.2021" - }, - { - "Code": "12521-0025", - "Content": "Ausl?nder: Bundesl?nder, Stichtag, Geschlecht,\nAufenthaltsdauer/Aufenthaltsdauer (Abgrenzung\nEinb?rgerungen), L?ndergruppierungen/Staatsangeh?rigkeit", - "Time": "31.12.1998 - 31.12.2021" - }, - { - "Code": "12521-0026", - "Content": "Ausl?nder: Bundesl?nder, Stichtag, Geschlecht,\nAufenthaltstitel/Ausgew?hlte Aufenthaltstitel,\nL?ndergruppierungen/Staatsangeh?rigkeit", - "Time": "31.12.1998 - 31.12.2021" - }, - { - "Code": "12521-0027", - "Content": "Ausl?nder: Bundesl?nder, Jahre, Geschlecht,\nRegisterbewegungen (regional), L?ndergruppierungen/\nStaatsangeh?rigkeit", - "Time": "2015 - 2021" - }, - { - "Code": "12521-0028", - "Content": "Ausl?nder: Bundesl?nder, Jahre, Geschlecht, Altersjahre,\nRegisterzu- und abg?nge (regional), L?ndergruppierungen/\nStaatsangeh?rigkeit", - "Time": "2015 - 2021" - }, - { - "Code": "12521-0029", - "Content": "Ausl?nder: Bundesl?nder, Jahre, Geschlecht,\nAufenthaltsdauer, Registerabg?nge (regional),\nL?ndergruppierungen/Staatsangeh?rigkeit", - "Time": "2015 - 2021" - }, - { - "Code": "12521-0030", - "Content": "Durchschnittsalter der Ausl?nder: Bundesl?nder, Stichtag,\nGeschlecht, L?ndergruppierungen/Staatsangeh?rigkeit", - "Time": "31.12.1998 - 31.12.2021" - }, - { - "Code": "12521-0031", - "Content": "Durchschnittliche Aufenthaltsdauer der Ausl?nder:\nBundesl?nder, Stichtag, Geschlecht, L?ndergruppierungen/\nStaatsangeh?rigkeit", - "Time": "31.12.1998 - 31.12.2021" - }, - { - "Code": "12531-0020", - "Content": "Schutzsuchende: Bundesl?nder, Stichtag, Geschlecht/\nAltersjahre/Familienstand", - "Time": "31.12.2007 - 31.12.2021" - }, - { - "Code": "12531-0021", - "Content": "Schutzsuchende: Bundesl?nder, Stichtag, Geschlecht/\nAltersjahre/Familienstand, L?ndergruppierungen/\nStaatsangeh?rigkeit", - "Time": "31.12.2007 - 31.12.2021" - }, - { - "Code": "12531-0022", - "Content": "Schutzsuchende: Bundesl?nder, Stichtag, Geschlecht,\nAltersjahre, L?ndergruppierungen/Staatsangeh?rigkeit", - "Time": "31.12.2007 - 31.12.2021" - }, - { - "Code": "12531-0023", - "Content": "Schutzsuchende: Bundesl?nder, Stichtag, Geschlecht,\nAltersjahre, Migrantengeneration, L?ndergruppierungen\n/Staatsangeh?rigkeit", - "Time": "31.12.2007 - 31.12.2021" - }, - { - "Code": "12531-0024", - "Content": "Schutzsuchende: Bundesl?nder, Stichtag, Geschlecht,\nFamilienstand, L?ndergruppierungen/Staatsangeh?rigkeit", - "Time": "31.12.2007 - 31.12.2021" - }, - { - "Code": "12531-0025", - "Content": "Schutzsuchende: Bundesl?nder, Stichtag, Geschlecht,\nAufenthaltsdauer/Aufenthaltsdauer (Abgrenzung\nEinb?rgerungen), L?ndergruppierungen/Staatsangeh?rigkeit", - "Time": "31.12.2007 - 31.12.2021" - }, - { - "Code": "12531-0026", - "Content": "Schutzsuchende: Bundesl?nder, Stichtag, Geschlecht,\nSchutzstatus/Schutzstatuskategorie, L?ndergruppierungen/\nStaatsangeh?rigkeit", - "Time": "31.12.2007 - 31.12.2021" - }, - { - "Code": "12531-0027", - "Content": "Durchschnittsalter der Schutzsuchenden: Bundesl?nder,\nStichtag, Geschlecht, L?ndergruppierungen/\nStaatsangeh?rigkeit", - "Time": "31.12.2007 - 31.12.2021" - }, - { - "Code": "12531-0028", - "Content": "Durchschnittliche Aufenthaltsdauer der Schutzsuchenden:\nBundesl?nder, Stichtag, Geschlecht, L?ndergruppierungen/\nStaatsangeh?rigkeit", - "Time": "31.12.2007 - 31.12.2021" - }, - { - "Code": "12611-0010", - "Content": "Eheschlie?ungen: Bundesl?nder, Jahre", - "Time": "1990 - 2021" - }, - { - "Code": "12611-0011", - "Content": "Eheschlie?ungen: Bundesl?nder, Monate", - "Time": "Januar 1990 - November 2022" - }, - { - "Code": "12612-0100", - "Content": "Lebendgeborene: Bundesl?nder, Jahre, Geschlecht", - "Time": "1990 - 2021" - }, - { - "Code": "12612-0101", - "Content": "Lebendgeborene: Bundesl?nder, Monate, Geschlecht", - "Time": "Januar 1990 - November 2022" - }, - { - "Code": "12612-0102", - "Content": "Lebendgeborene: Bundesl?nder, Jahre, Familienstand der\nEltern", - "Time": "1991 - 2021" - }, - { - "Code": "12612-0103", - "Content": "Lebendgeborene: Bundesl?nder, Jahre, Staatsangeh?rigkeit des\nKindes und der Eltern", - "Time": "1990 - 2021" - }, - { - "Code": "12612-0104", - "Content": "Zusammengefasste Geburtenziffern (je Frau): Bundesl?nder,\nJahre, Altersgruppen", - "Time": "1991 - 2021" - }, - { - "Code": "12612-0105", - "Content": "Nettoreproduktionsrate: Bundesl?nder, Jahre (bis 2010),\nAltersgruppen", - "Time": "2004 - 2010" - }, - { - "Code": "12612-0106", - "Content": "Totgeborene: Bundesl?nder, Jahre", - "Time": "1990 - 2021" - }, - { - "Code": "12613-0010", - "Content": "Gestorbene: Bundesl?nder, Jahre", - "Time": "1990 - 2021" - }, - { - "Code": "12613-0011", - "Content": "Gestorbene: Bundesl?nder, Jahre, Geschlecht", - "Time": "1990 - 2021" - }, - { - "Code": "12613-0012", - "Content": "Gestorbene: Bundesl?nder, Monate", - "Time": "Januar 1990 - November 2022" - }, - { - "Code": "12613-0013", - "Content": "Gestorbene: Bundesl?nder, Monate, Geschlecht", - "Time": "Januar 1990 - November 2022" - }, - { - "Code": "12621-0004", - "Content": "Durchschnittliche Lebenserwartung bei Geburt\n(Periodensterbetafel): Bundesl?nder, Jahre, Geschlecht", - "Time": "2002/04 - 2019/21" - }, - { - "Code": "12631-0010", - "Content": "Ehescheidungen: Bundesl?nder, Jahre", - "Time": "1990 - 2021" - }, - { - "Code": "12631-0011", - "Content": "Ehescheidungen: Bundesl?nder, Jahre, Ehedauer", - "Time": "1997 - 2021" - }, - { - "Code": "12631-0012", - "Content": "Ehescheidungen: Bundesl?nder, Jahre, Gemeinsame\nminderj?hrige Kinder", - "Time": "1997 - 2021" - }, - { - "Code": "12651-0003", - "Content": "Begr?ndungen von Lebenspartnerschaften: Bundesl?nder, Jahre (bis 2017), Geschlecht", - "Time": "2014 - 2017" - }, - { - "Code": "12661-0002", - "Content": "Aufhebungen von Lebenspartnerschaften: Bundesl?nder, Jahre,\nGeschlecht", - "Time": "2014 - 2021" - }, - { - "Code": "12711-0020", - "Content": "Gesamtwanderungen ?ber die Grenzen der Bundesl?nder: Bundesl?nder, Jahre, Nationalit?t, Geschlecht", - "Time": "2000 - 2021" - }, - { - "Code": "12711-0021", - "Content": "Wanderungen zwischen den Bundesl?ndern: Bundesl?nder, Jahre, Nationalit?t, Geschlecht", - "Time": "2000 - 2021" - }, - { - "Code": "12711-0023", - "Content": "Wanderungen zwischen Deutschland und dem Ausland:\nBundesl?nder, Jahre, Nationalit?t, Geschlecht", - "Time": "2000 - 2021" - }, - { - "Code": "13111-0005", - "Content": "Sozialversicherungspflichtig Besch?ftigte am Arbeitsort:\nBundesl?nder, Stichtag, Geschlecht", - "Time": "31.03.2008 - 30.06.2022" - }, - { - "Code": "13111-0006", - "Content": "Sozialversicherungspflichtig Besch?ftigte am Arbeitsort:\nBundesl?nder, Stichtag, Wirtschaftsabschnitte", - "Time": "31.03.2008 - 30.06.2022" - }, - { - "Code": "13211-0007", - "Content": "Arbeitslose, Arbeitslosenquoten, Gemeldete Arbeitsstellen:\nBundesl?nder, Jahre", - "Time": "1991 - 2022" - }, - { - "Code": "13211-0008", - "Content": "Arbeitslose, Arbeitslosenquoten, Gemeldete Arbeitsstellen:\nBundesl?nder, Monate", - "Time": "Januar 2005 - Februar 2023" - }, - { - "Code": "13211-0009", - "Content": "Arbeitslose: Bundesl?nder, Jahre, Geschlecht", - "Time": "1991 - 2022" - }, - { - "Code": "13211-0010", - "Content": "Arbeitslose: Bundesl?nder, Monate, Geschlecht", - "Time": "Januar 2005 - Februar 2023" - }, - { - "Code": "13211-0011", - "Content": "Arbeitslosenquote aller zivilen Erwerbspersonen:\nBundesl?nder, Jahre, Geschlecht", - "Time": "1991 - 2022" - }, - { - "Code": "13211-0012", - "Content": "Arbeitslosenquote aller zivilen Erwerbspersonen:\nBundesl?nder, Monate, Geschlecht", - "Time": "Januar 2005 - Februar 2023" - }, - { - "Code": "13311-0002", - "Content": "Erwerbst?tige, Arbeitnehmer, Selbst?ndige und mithelfende\nFamilienangeh?rige (im Inland): Bundesl?nder, Jahre,\nWirtschaftszweige", - "Time": "1991 - 2022" - }, - { - "Code": "14111-0003", - "Content": "Wahlberechtigte, W?hler, Wahlbeteiligung, Erststimmen,\nZweitstimmen (Allgemeine Bundestagswahlstatistik):\nBundesl?nder, Stichtag", - "Time": "22.09.2013 - 26.09.2021" - }, - { - "Code": "14111-0004", - "Content": "G?ltige Erststimmen, g?ltige Zweitstimmen (Allgemeine\nBundestagswahlstatistik): Bundesl?nder, Stichtag, Parteien", - "Time": "22.09.2013 - 26.09.2021" - }, - { - "Code": "14121-0004", - "Content": "G?ltige Zweitstimmen (Repr?sentative\nBundestagswahlstatistik): Bundesl?nder, Stichtag, Parteien,\nGeschlecht", - "Time": "22.09.2002 - 26.09.2021" - }, - { - "Code": "14121-0005", - "Content": "G?ltige Zweitstimmen (Repr?sentative\nBundestagswahlstatistik): Bundesl?nder, Stichtag, Parteien,\nAltersgruppen", - "Time": "22.09.2013 - 26.09.2021" - }, - { - "Code": "14121-0006", - "Content": "G?ltige Zweitstimmen (Repr?sentative\nBundestagswahlstatistik): Bundesl?nder, Stichtag, Parteien,\nGeschlecht, Altersgruppen", - "Time": "22.09.2013 - 26.09.2021" - }, - { - "Code": "14211-0002", - "Content": "G?ltige Stimmen (Allgemeine Europawahlstatistik):\nBundesl?nder, Stichtag, Parteien", - "Time": "12.06.1994 - 26.05.2019" - } - ], - "Copyright": "? Statistisches Bundesamt (Destatis), 2023" -} diff --git a/tests/testthat/xy_variable1/api/catalogue/timeseries2variable-b809d6.json b/tests/testthat/xy_variable1/api/catalogue/timeseries2variable-b809d6.json deleted file mode 100644 index 8a19f70..0000000 --- a/tests/testthat/xy_variable1/api/catalogue/timeseries2variable-b809d6.json +++ /dev/null @@ -1,823 +0,0 @@ -{ - "Ident": { - "Service": "catalogue", - "Method": "timeseries2variable" - }, - "Status": { - "Code": 0, - "Content": "erfolgreich", - "Type": "Information" - }, - "Parameter": { - "username": "********************", - "password": "********************", - "name": "DLAND", - "selection": "", - "area": "oeffentlich", - "pagelength": "100", - "language": "de" - }, - "List": [ - { - "Code": "11111LJ001", - "Content": "Feststellung des Gebietsstands, Gebietsfl?che, Bundesl?nder, Stichtag", - "State": "undefiniert", - "Time": "31.12.1995-31.12.2020", - "LatestUpdate": "06.12.2021 08:10:40h", - "Information": "false" - }, - { - "Code": "12111L1001", - "Content": "Zensus, Bev?lkerung (Zensus), Bundesl?nder, Stichtag", - "State": "undefiniert", - "Time": "09.05.2011", - "LatestUpdate": "10.04.2014 08:00:57h", - "Information": "false" - }, - { - "Code": "12111L1002", - "Content": "Zensus, Bev?lkerung (Zensus), Bundesl?nder, Nationalit?t, Stichtag", - "State": "undefiniert", - "Time": "09.05.2011", - "LatestUpdate": "10.04.2014 08:00:59h", - "Information": "false" - }, - { - "Code": "12111L1003", - "Content": "Zensus, Bev?lkerung (Zensus), Bundesl?nder, Geschlecht, Stichtag", - "State": "undefiniert", - "Time": "09.05.2011", - "LatestUpdate": "10.04.2014 08:01:00h", - "Information": "false" - }, - { - "Code": "12111L1004", - "Content": "Zensus, Bev?lkerung (Zensus), Bundesl?nder, Altersgruppen (u3-75m), Stichtag", - "State": "undefiniert", - "Time": "09.05.2011", - "LatestUpdate": "10.04.2014 08:01:02h", - "Information": "false" - }, - { - "Code": "12111L1005", - "Content": "Zensus, Bev?lkerung (Zensus), Bundesl?nder, Altersgruppen (u18-65m), Stichtag", - "State": "undefiniert", - "Time": "09.05.2011", - "LatestUpdate": "10.04.2014 08:01:04h", - "Information": "false" - }, - { - "Code": "12111L1006", - "Content": "Zensus, Bev?lkerung (Zensus), Bundesl?nder, Familienstand, Stichtag", - "State": "undefiniert", - "Time": "09.05.2011", - "LatestUpdate": "10.04.2014 08:01:05h", - "Information": "false" - }, - { - "Code": "12111L1007", - "Content": "Zensus, Bev?lkerung (Zensus), Bundesl?nder, Nationalit?t, Geschlecht, Stichtag", - "State": "undefiniert", - "Time": "09.05.2011", - "LatestUpdate": "10.04.2014 08:01:07h", - "Information": "false" - }, - { - "Code": "12111L1008", - "Content": "Zensus, Bev?lkerung (Zensus), Bundesl?nder, Nationalit?t, Altersgruppen (u3-75m), Stichtag", - "State": "undefiniert", - "Time": "09.05.2011", - "LatestUpdate": "10.04.2014 08:01:09h", - "Information": "false" - }, - { - "Code": "12111L1009", - "Content": "Zensus, Bev?lkerung (Zensus), Bundesl?nder, Nationalit?t, Familienstand, Stichtag", - "State": "undefiniert", - "Time": "09.05.2011", - "LatestUpdate": "10.04.2014 08:01:10h", - "Information": "false" - }, - { - "Code": "12111L1010", - "Content": "Zensus, Bev?lkerung (Zensus), Bundesl?nder, Geschlecht, Altersgruppen (u3-75m), Stichtag", - "State": "undefiniert", - "Time": "09.05.2011", - "LatestUpdate": "10.04.2014 08:01:12h", - "Information": "false" - }, - { - "Code": "12111L1011", - "Content": "Zensus, Bev?lkerung (Zensus), Bundesl?nder, Geschlecht, Familienstand, Stichtag", - "State": "undefiniert", - "Time": "09.05.2011", - "LatestUpdate": "10.04.2014 08:01:16h", - "Information": "false" - }, - { - "Code": "12111L1012", - "Content": "Zensus, Bev?lkerung (Zensus), Bundesl?nder, Altersgruppen (u18-65m), Familienstand, Stichtag", - "State": "undefiniert", - "Time": "09.05.2011", - "LatestUpdate": "10.04.2014 08:01:14h", - "Information": "false" - }, - { - "Code": "12211LJ001", - "Content": "Mikrozensus, Bev?lkerung, Erwerbspersonen, Erwerbst?tige, Erwerbslose, Nichterwerbspersonen, Bundesl?nder, Stichmonat", - "State": "undefiniert", - "Time": "04/1991-03/2004", - "LatestUpdate": "22.03.2005 11:46:17h", - "Information": "false" - }, - { - "Code": "12211LJ002", - "Content": "Mikrozensus, Privathaushalte, Bundesl?nder, Stichmonat", - "State": "undefiniert", - "Time": "05/1970-03/2004", - "LatestUpdate": "09.11.2020 11:43:47h", - "Information": "false" - }, - { - "Code": "12211LJ003", - "Content": "Mikrozensus, Privathaushalte, Bundesl?nder, Haushaltsgr??e, Stichmonat", - "State": "undefiniert", - "Time": "04/1991-03/2004", - "LatestUpdate": "09.11.2020 11:44:19h", - "Information": "false" - }, - { - "Code": "12211LJ004", - "Content": "Mikrozensus, Bev?lkerung in Familien/Lebensformen, Bundesl?nder, Stichmonat", - "State": "undefiniert", - "Time": "04/1996-03/2004", - "LatestUpdate": "09.11.2020 11:46:13h", - "Information": "false" - }, - { - "Code": "12211LJ005", - "Content": "Mikrozensus, Bev?lkerung in Familien/Lebensformen, Bundesl?nder, Lebensformen, Stichmonat", - "State": "undefiniert", - "Time": "04/1996-03/2004", - "LatestUpdate": "09.11.2020 11:46:47h", - "Information": "false" - }, - { - "Code": "12211LJ006", - "Content": "Mikrozensus, Familien, Bundesl?nder, Vorhandensein von Kindern, Stichmonat", - "State": "undefiniert", - "Time": "04/1996-03/2004", - "LatestUpdate": "09.11.2020 11:47:04h", - "Information": "false" - }, - { - "Code": "12211LJ007", - "Content": "Mikrozensus, Paare, Bundesl?nder, Vorhandensein von Kindern, Stichmonat", - "State": "undefiniert", - "Time": "04/1996-03/2004", - "LatestUpdate": "09.11.2020 11:47:17h", - "Information": "false" - }, - { - "Code": "12211LJ008", - "Content": "Mikrozensus, Ehepaare, Lebensgemeinschaften, Gemischtgeschlechtliche Lebensgemeinschaften, Bundesl?nder, Stichmonat", - "State": "undefiniert", - "Time": "04/1996-03/2004", - "LatestUpdate": "09.11.2020 11:47:33h", - "Information": "false" - }, - { - "Code": "12211LJ009", - "Content": "Mikrozensus, Ehepaare, Lebensgemeinschaften, Gemischtgeschlechtliche Lebensgemeinschaften, Bundesl?nder, Vorhandensein von Kindern, Stichmonat", - "State": "undefiniert", - "Time": "04/1996-03/2004", - "LatestUpdate": "09.11.2020 11:48:49h", - "Information": "false" - }, - { - "Code": "12211LJ010", - "Content": "Mikrozensus, Alleinerziehende, Bundesl?nder, Vorhandensein von Kindern, Stichmonat", - "State": "undefiniert", - "Time": "04/1996-03/2004", - "LatestUpdate": "09.11.2020 11:49:06h", - "Information": "false" - }, - { - "Code": "12211LJ011", - "Content": "Mikrozensus, Alleinerziehende, Bundesl?nder, Vorhandensein von Kindern, Geschlecht, Stichmonat", - "State": "undefiniert", - "Time": "04/1996-03/2004", - "LatestUpdate": "17.06.2021 16:45:09h", - "Information": "false" - }, - { - "Code": "12211LJ012", - "Content": "Mikrozensus, Alleinstehende, Bundesl?nder, Stichmonat", - "State": "undefiniert", - "Time": "04/1996-03/2004", - "LatestUpdate": "09.11.2020 11:50:28h", - "Information": "false" - }, - { - "Code": "12211LJ013", - "Content": "Mikrozensus, Alleinstehende, Bundesl?nder, Geschlecht, Stichmonat", - "State": "undefiniert", - "Time": "04/1996-03/2004", - "LatestUpdate": "09.11.2020 11:51:03h", - "Information": "false" - }, - { - "Code": "12211LJ014", - "Content": "Mikrozensus, Alleinstehende, Bundesl?nder, Haushaltsgr??e, Stichmonat", - "State": "undefiniert", - "Time": "04/1996-03/2004", - "LatestUpdate": "09.11.2020 11:52:36h", - "Information": "false" - }, - { - "Code": "12211LJ015", - "Content": "Mikrozensus, Alleinstehende, Bundesl?nder, Haushaltsgr??e, Geschlecht, Stichmonat", - "State": "undefiniert", - "Time": "04/1996-03/2004", - "LatestUpdate": "09.11.2020 11:52:53h", - "Information": "false" - }, - { - "Code": "12211LJ016", - "Content": "Mikrozensus, Ledige Kinder in der Familie, Ledige Kinder unter 18 Jahren in der Familie, Bundesl?nder, Stichmonat", - "State": "undefiniert", - "Time": "04/1996-03/2004", - "LatestUpdate": "09.11.2020 11:53:13h", - "Information": "false" - }, - { - "Code": "12211LJ017", - "Content": "Mikrozensus, Ledige Kinder in der Familie, Ledige Kinder unter 18 Jahren in der Familie, Bundesl?nder, Familienformen, Stichmonat", - "State": "undefiniert", - "Time": "04/1996-03/2004", - "LatestUpdate": "09.11.2020 11:53:34h", - "Information": "false" - }, - { - "Code": "12211LJ018", - "Content": "Mikrozensus, Bev?lkerung, Erwerbspersonen, Erwerbst?tige, Erwerbslose, Nichterwerbspersonen, Bundesl?nder, Jahr", - "State": "undefiniert", - "Time": "2005-2019", - "LatestUpdate": "09.11.2020 11:32:58h", - "Information": "false" - }, - { - "Code": "12211LJ019", - "Content": "Mikrozensus, Bev?lkerung (ab 15 Jahren), Bundesl?nder, Jahr", - "State": "undefiniert", - "Time": "2005-2019", - "LatestUpdate": "25.11.2020 16:54:17h", - "Information": "false" - }, - { - "Code": "12211LJ020", - "Content": "Mikrozensus, Bev?lkerung (ab 15 Jahren), Bundesl?nder, Geschlecht, Jahr", - "State": "undefiniert", - "Time": "2005-2019", - "LatestUpdate": "25.11.2020 16:54:15h", - "Information": "false" - }, - { - "Code": "12211LJ021", - "Content": "Mikrozensus, Bev?lkerung (ab 15 Jahren), Bundesl?nder, Allgemeine Schulausbildung, Jahr", - "State": "undefiniert", - "Time": "2005-2019", - "LatestUpdate": "25.11.2020 16:54:16h", - "Information": "false" - }, - { - "Code": "12211LJ022", - "Content": "Mikrozensus, Bev?lkerung (ab 15 Jahren), Bundesl?nder, Geschlecht, Allgemeine Schulausbildung, Jahr", - "State": "undefiniert", - "Time": "2005-2019", - "LatestUpdate": "25.11.2020 16:54:11h", - "Information": "false" - }, - { - "Code": "12211LJ023", - "Content": "Mikrozensus, Bev?lkerung (ab 15 Jahren), Bundesl?nder, Beruflicher Bildungsabschluss, Jahr", - "State": "undefiniert", - "Time": "2005-2019", - "LatestUpdate": "25.11.2020 16:54:14h", - "Information": "false" - }, - { - "Code": "12211LJ024", - "Content": "Mikrozensus, Bev?lkerung (ab 15 Jahren), Bundesl?nder, Geschlecht, Beruflicher Bildungsabschluss, Jahr", - "State": "undefiniert", - "Time": "2005-2019", - "LatestUpdate": "25.11.2020 16:54:13h", - "Information": "false" - }, - { - "Code": "12211LJ025", - "Content": "Mikrozensus, Privathaushalte, Bundesl?nder, Jahr", - "State": "undefiniert", - "Time": "2005-2019", - "LatestUpdate": "09.11.2020 11:44:43h", - "Information": "false" - }, - { - "Code": "12211LJ026", - "Content": "Mikrozensus, Privathaushalte, Bundesl?nder, Haushaltsgr??e, Jahr", - "State": "undefiniert", - "Time": "2005-2019", - "LatestUpdate": "09.11.2020 11:45:05h", - "Information": "false" - }, - { - "Code": "12211LJ027", - "Content": "Mikrozensus, Bev?lkerung in Familien/Lebensformen, Bundesl?nder, Jahr", - "State": "undefiniert", - "Time": "2005-2019", - "LatestUpdate": "09.11.2020 11:53:58h", - "Information": "false" - }, - { - "Code": "12211LJ028", - "Content": "Mikrozensus, Bev?lkerung in Familien/Lebensformen, Bundesl?nder, Lebensformen, Jahr", - "State": "undefiniert", - "Time": "2005-2019", - "LatestUpdate": "09.11.2020 11:54:40h", - "Information": "false" - }, - { - "Code": "12211LJ029", - "Content": "Mikrozensus, Familien, Bundesl?nder, Vorhandensein von Kindern, Jahr", - "State": "undefiniert", - "Time": "2005-2019", - "LatestUpdate": "09.11.2020 11:54:54h", - "Information": "false" - }, - { - "Code": "12211LJ030", - "Content": "Mikrozensus, Paare, Bundesl?nder, Vorhandensein von Kindern, Jahr", - "State": "undefiniert", - "Time": "2005-2019", - "LatestUpdate": "09.11.2020 11:55:15h", - "Information": "false" - }, - { - "Code": "12211LJ031", - "Content": "Mikrozensus, Ehepaare, Lebensgemeinschaften, Gemischtgeschlechtliche Lebensgemeinschaften, Bundesl?nder, Jahr", - "State": "undefiniert", - "Time": "2005-2019", - "LatestUpdate": "09.11.2020 11:55:36h", - "Information": "false" - }, - { - "Code": "12211LJ032", - "Content": "Mikrozensus, Ehepaare, Lebensgemeinschaften, Gemischtgeschlechtliche Lebensgemeinschaften, Bundesl?nder, Vorhandensein von Kindern, Jahr", - "State": "undefiniert", - "Time": "2005-2019", - "LatestUpdate": "09.11.2020 11:56:00h", - "Information": "false" - }, - { - "Code": "12211LJ033", - "Content": "Mikrozensus, Alleinerziehende, Bundesl?nder, Vorhandensein von Kindern, Jahr", - "State": "undefiniert", - "Time": "2005-2019", - "LatestUpdate": "09.11.2020 11:56:14h", - "Information": "false" - }, - { - "Code": "12211LJ034", - "Content": "Mikrozensus, Alleinerziehende, Bundesl?nder, Vorhandensein von Kindern, Geschlecht, Jahr", - "State": "undefiniert", - "Time": "2005-2019", - "LatestUpdate": "09.11.2020 11:56:32h", - "Information": "false" - }, - { - "Code": "12211LJ035", - "Content": "Mikrozensus, Alleinstehende, Bundesl?nder, Jahr", - "State": "undefiniert", - "Time": "2005-2019", - "LatestUpdate": "09.11.2020 11:57:58h", - "Information": "false" - }, - { - "Code": "12211LJ036", - "Content": "Mikrozensus, Alleinstehende, Bundesl?nder, Geschlecht, Jahr", - "State": "undefiniert", - "Time": "2005-2019", - "LatestUpdate": "09.11.2020 11:58:56h", - "Information": "false" - }, - { - "Code": "12211LJ037", - "Content": "Mikrozensus, Alleinstehende, Bundesl?nder, Haushaltsgr??e, Jahr", - "State": "undefiniert", - "Time": "2005-2019", - "LatestUpdate": "09.11.2020 11:59:13h", - "Information": "false" - }, - { - "Code": "12211LJ038", - "Content": "Mikrozensus, Alleinstehende, Bundesl?nder, Haushaltsgr??e, Geschlecht, Jahr", - "State": "undefiniert", - "Time": "2005-2019", - "LatestUpdate": "09.11.2020 12:00:39h", - "Information": "false" - }, - { - "Code": "12211LJ039", - "Content": "Mikrozensus, Ledige Kinder in der Familie, Ledige Kinder unter 18 Jahren in der Familie, Bundesl?nder, Jahr", - "State": "undefiniert", - "Time": "2005-2019", - "LatestUpdate": "09.11.2020 12:00:56h", - "Information": "false" - }, - { - "Code": "12211LJ040", - "Content": "Mikrozensus, Ledige Kinder in der Familie, Ledige Kinder unter 18 Jahren in der Familie, Bundesl?nder, Familienformen, Jahr", - "State": "undefiniert", - "Time": "2005-2019", - "LatestUpdate": "09.11.2020 12:01:10h", - "Information": "false" - }, - { - "Code": "12211LJ041", - "Content": "Mikrozensus, Bev?lkerung in Gemeinschaftsunterk?nften, Bundesl?nder, Jahr", - "State": "undefiniert", - "Time": "2017-2021", - "LatestUpdate": "30.01.2023 15:45:46h", - "Information": "false" - }, - { - "Code": "12211LJ042", - "Content": "Mikrozensus, Bev?lkerung in Gemeinschaftsunterk?nften, Bundesl?nder, Geschlecht, Jahr", - "State": "undefiniert", - "Time": "2017-2021", - "LatestUpdate": "30.01.2023 15:45:37h", - "Information": "false" - }, - { - "Code": "12211LJ043", - "Content": "Mikrozensus, Bev?lkerung in Gemeinschaftsunterk?nften, Bundesl?nder, Altersgruppen (u25-65m), Jahr", - "State": "undefiniert", - "Time": "2017-2021", - "LatestUpdate": "30.01.2023 15:45:56h", - "Information": "false" - }, - { - "Code": "12211LJ044", - "Content": "Mikrozensus, Bev?lkerung in Gemeinschaftsunterk?nften, Bundesl?nder, Art der Gemeinschaftsunterkunft, Jahr", - "State": "undefiniert", - "Time": "2017-2021", - "LatestUpdate": "30.01.2023 15:45:50h", - "Information": "false" - }, - { - "Code": "12211LJ045", - "Content": "Mikrozensus, Bev?lkerung in Gemeinschaftsunterk?nften, Bundesl?nder, Hauptstatus, Jahr", - "State": "undefiniert", - "Time": "2017-2021", - "LatestUpdate": "30.01.2023 15:45:59h", - "Information": "false" - }, - { - "Code": "12211LJ046", - "Content": "Mikrozensus, Bev?lkerung in Gemeinschaftsunterk?nften, Bundesl?nder, Geschlecht, Altersgruppen (u25-65m), Jahr", - "State": "undefiniert", - "Time": "2017-2021", - "LatestUpdate": "30.01.2023 15:45:53h", - "Information": "false" - }, - { - "Code": "12211LJ047", - "Content": "Mikrozensus, Bev?lkerung in Gemeinschaftsunterk?nften, Bundesl?nder, Geschlecht, Art der Gemeinschaftsunterkunft, Jahr", - "State": "undefiniert", - "Time": "2017-2021", - "LatestUpdate": "30.01.2023 15:45:40h", - "Information": "false" - }, - { - "Code": "12211LJ048", - "Content": "Mikrozensus, Bev?lkerung in Gemeinschaftsunterk?nften, Bundesl?nder, Geschlecht, Hauptstatus, Jahr", - "State": "undefiniert", - "Time": "2017-2021", - "LatestUpdate": "30.01.2023 15:45:43h", - "Information": "false" - }, - { - "Code": "12211LJ049", - "Content": "Mikrozensus, Bev?lkerung in Gemeinschaftsunterk?nften, Bundesl?nder, Altersgruppen (u25-65m), Hauptstatus, Jahr", - "State": "undefiniert", - "Time": "2017-2021", - "LatestUpdate": "30.01.2023 15:46:41h", - "Information": "false" - }, - { - "Code": "12211LJ050", - "Content": "Mikrozensus, Bev?lkerung in Gemeinschaftsunterk?nften, Bundesl?nder, Geschlecht, Altersgruppen (u25-65m), Hauptstatus, Jahr", - "State": "undefiniert", - "Time": "2017-2021", - "LatestUpdate": "30.01.2023 15:46:38h", - "Information": "false" - }, - { - "Code": "12211LJ240", - "Content": "Mikrozensus, Bev?lkerung in Hauptwohnsitzhaushalten, Erwerbspersonen aus Hauptwohnsitzhaushalten, Erwerbst?tige aus Hauptwohnsitzhaushalten, Erwerbslose aus Hauptwohnsitzhaushalten, Nichterwerbspersonen aus Hauptwohnsitzhaushalten, Bundesl?nder, Jahr", - "State": "undefiniert", - "Time": "2021", - "LatestUpdate": "30.01.2023 16:00:12h", - "Information": "false" - }, - { - "Code": "12211LJ241", - "Content": "Mikrozensus, Bev?lkerung in Hauptwohnsitzhaushalten, Erwerbspersonen aus Hauptwohnsitzhaushalten, Erwerbst?tige aus Hauptwohnsitzhaushalten, Erwerbslose aus Hauptwohnsitzhaushalten, Nichterwerbspersonen aus Hauptwohnsitzhaushalten, Bundesl?nder, Geschlecht, Jahr", - "State": "undefiniert", - "Time": "2021", - "LatestUpdate": "30.01.2023 16:00:09h", - "Information": "false" - }, - { - "Code": "12211LJ242", - "Content": "Mikrozensus, Bev?lkerung in Hauptwohnsitzhaushalten, Erwerbspersonen aus Hauptwohnsitzhaushalten, Erwerbst?tige aus Hauptwohnsitzhaushalten, Erwerbslose aus Hauptwohnsitzhaushalten, Nichterwerbspersonen aus Hauptwohnsitzhaushalten, Bundesl?nder, Altersgruppen (u15-75m), Jahr", - "State": "undefiniert", - "Time": "2021", - "LatestUpdate": "30.01.2023 15:59:44h", - "Information": "false" - }, - { - "Code": "12211LJ243", - "Content": "Mikrozensus, Bev?lkerung in Hauptwohnsitzhaushalten, Erwerbspersonen aus Hauptwohnsitzhaushalten, Erwerbst?tige aus Hauptwohnsitzhaushalten, Erwerbslose aus Hauptwohnsitzhaushalten, Nichterwerbspersonen aus Hauptwohnsitzhaushalten, Bundesl?nder, Geschlecht, Altersgruppen (u15-75m), Jahr", - "State": "undefiniert", - "Time": "2021", - "LatestUpdate": "30.01.2023 15:59:54h", - "Information": "false" - }, - { - "Code": "12211LJ244", - "Content": "Mikrozensus, Bev?lkerung in Hauptwohnsitzhaushalten, Erwerbspersonen aus Hauptwohnsitzhaushalten, Erwerbst?tige aus Hauptwohnsitzhaushalten, Erwerbslose aus Hauptwohnsitzhaushalten, Nichterwerbspersonen aus Hauptwohnsitzhaushalten, Bundesl?nder, Altersgruppen (u15-65m), Jahr", - "State": "undefiniert", - "Time": "2021", - "LatestUpdate": "30.01.2023 15:59:48h", - "Information": "false" - }, - { - "Code": "12211LJ245", - "Content": "Mikrozensus, Bev?lkerung in Hauptwohnsitzhaushalten, Erwerbspersonen aus Hauptwohnsitzhaushalten, Erwerbst?tige aus Hauptwohnsitzhaushalten, Erwerbslose aus Hauptwohnsitzhaushalten, Nichterwerbspersonen aus Hauptwohnsitzhaushalten, Bundesl?nder, ?berwiegender Lebensunterhalt, Jahr", - "State": "undefiniert", - "Time": "2021", - "LatestUpdate": "30.01.2023 15:59:41h", - "Information": "false" - }, - { - "Code": "12211LJ246", - "Content": "Mikrozensus, Bev?lkerung in Hauptwohnsitzhaushalten, Erwerbspersonen aus Hauptwohnsitzhaushalten, Erwerbst?tige aus Hauptwohnsitzhaushalten, Erwerbslose aus Hauptwohnsitzhaushalten, Nichterwerbspersonen aus Hauptwohnsitzhaushalten, Bundesl?nder, Altersgruppen (u15-65m), ?berwiegender Lebensunterhalt, Jahr", - "State": "undefiniert", - "Time": "2021", - "LatestUpdate": "30.01.2023 16:00:06h", - "Information": "false" - }, - { - "Code": "12211LJ247", - "Content": "Mikrozensus, Bev?lkerung in Hauptwohnsitzhaushalten, Erwerbspersonen aus Hauptwohnsitzhaushalten, Erwerbst?tige aus Hauptwohnsitzhaushalten, Erwerbslose aus Hauptwohnsitzhaushalten, Nichterwerbspersonen aus Hauptwohnsitzhaushalten, Bundesl?nder, Gr??enklassen des pers?nl. monatl. Nettoeinkommens, Jahr", - "State": "undefiniert", - "Time": "2021", - "LatestUpdate": "30.01.2023 15:59:37h", - "Information": "false" - }, - { - "Code": "12211LJ248", - "Content": "Mikrozensus, Bev?lkerung in Hauptwohnsitzhaushalten, Erwerbspersonen aus Hauptwohnsitzhaushalten, Erwerbst?tige aus Hauptwohnsitzhaushalten, Erwerbslose aus Hauptwohnsitzhaushalten, Nichterwerbspersonen aus Hauptwohnsitzhaushalten, Bundesl?nder, Geschlecht, Gr??enklassen des pers?nl. monatl. Nettoeinkommens, Jahr", - "State": "undefiniert", - "Time": "2021", - "LatestUpdate": "30.01.2023 16:00:01h", - "Information": "false" - }, - { - "Code": "12211LJ249", - "Content": "Mikrozensus, Erwerbst?tige aus Hauptwohnsitzhaushalten, Bundesl?nder, Altersgruppen (15-75m), Jahr", - "State": "undefiniert", - "Time": "2021", - "LatestUpdate": "30.01.2023 16:00:37h", - "Information": "false" - }, - { - "Code": "12211LJ250", - "Content": "Mikrozensus, Erwerbst?tige aus Hauptwohnsitzhaushalten, Bundesl?nder, Geschlecht, Altersgruppen (15-75m), Jahr", - "State": "undefiniert", - "Time": "2021", - "LatestUpdate": "30.01.2023 16:00:41h", - "Information": "false" - }, - { - "Code": "12211LJ251", - "Content": "Mikrozensus, Erwerbst?tige aus Hauptwohnsitzhaushalten, Bundesl?nder, Stellung im Beruf, Jahr", - "State": "undefiniert", - "Time": "2021", - "LatestUpdate": "30.01.2023 16:00:52h", - "Information": "false" - }, - { - "Code": "12211LJ252", - "Content": "Mikrozensus, Erwerbst?tige aus Hauptwohnsitzhaushalten, Bundesl?nder, Geschlecht, Stellung im Beruf, Jahr", - "State": "undefiniert", - "Time": "2021", - "LatestUpdate": "30.01.2023 16:00:56h", - "Information": "false" - }, - { - "Code": "12211LJ253", - "Content": "Mikrozensus, Erwerbst?tige aus Hauptwohnsitzhaushalten, Bundesl?nder, Altersgruppen (15-75m), Stellung im Beruf, Jahr", - "State": "undefiniert", - "Time": "2021", - "LatestUpdate": "30.01.2023 16:00:45h", - "Information": "false" - }, - { - "Code": "12211LJ254", - "Content": "Mikrozensus, Erwerbst?tige aus Hauptwohnsitzhaushalten, Bundesl?nder, Geschlecht, Altersgruppen (15-75m), Stellung im Beruf, Jahr", - "State": "undefiniert", - "Time": "2021", - "LatestUpdate": "30.01.2023 16:00:49h", - "Information": "false" - }, - { - "Code": "12231LJ030", - "Content": "IKT-Nutzung in privaten Haushalten, Bev?lkerung von 16-u75 J. in Hauptwohnsitzhaush., Bundesl?nder, Jahr", - "State": "undefiniert", - "Time": "2022", - "LatestUpdate": "23.01.2023 12:52:39h", - "Information": "false" - }, - { - "Code": "12231LJ031", - "Content": "IKT-Nutzung in privaten Haushalten, Bev?lkerung von 16-u75 J. in Hauptwohnsitzhaush., Bundesl?nder, Altersgruppen (16-u75), Jahr", - "State": "undefiniert", - "Time": "2022", - "LatestUpdate": "23.01.2023 12:52:39h", - "Information": "false" - }, - { - "Code": "12231LJ032", - "Content": "IKT-Nutzung in privaten Haushalten, Bev?lkerung von 16-u75 J. in Hauptwohnsitzhaush., Bundesl?nder, Priv. Internetaktivit?ten i.d.letzten drei Monaten, Jahr", - "State": "undefiniert", - "Time": "2022", - "LatestUpdate": "23.01.2023 12:52:39h", - "Information": "false" - }, - { - "Code": "12231LJ033", - "Content": "IKT-Nutzung in privaten Haushalten, Bev?lkerung von 16-u75 J. in Hauptwohnsitzhaush., Bundesl?nder, Altersgruppen (16-u75), Priv. Internetaktivit?ten i.d.letzten drei Monaten, Jahr", - "State": "undefiniert", - "Time": "2022", - "LatestUpdate": "23.01.2023 12:52:39h", - "Information": "false" - }, - { - "Code": "12231LJ034", - "Content": "IKT-Nutzung in privaten Haushalten, Bev?lkerung von 16-u75 J. in Hauptwohnsitzhaush., Bundesl?nder, Private Internetk?ufe in den letzten drei Monaten, Jahr", - "State": "undefiniert", - "Time": "2022", - "LatestUpdate": "23.01.2023 12:52:39h", - "Information": "false" - }, - { - "Code": "12231LJ035", - "Content": "IKT-Nutzung in privaten Haushalten, Bev?lkerung von 16-u75 J. in Hauptwohnsitzhaush., Bundesl?nder, Altersgruppen (16-u75), Private Internetk?ufe in den letzten drei Monaten, Jahr", - "State": "undefiniert", - "Time": "2022", - "LatestUpdate": "23.01.2023 12:52:39h", - "Information": "false" - }, - { - "Code": "12251LJ001", - "Content": "Arbeitsmarktstatistik des Mikrozensus, Erwerbst?tige aus Hauptwohnsitzhaushalten, Bundesl?nder, Jahr", - "State": "undefiniert", - "Time": "2021", - "LatestUpdate": "30.01.2023 16:37:43h", - "Information": "false" - }, - { - "Code": "12251LJ002", - "Content": "Arbeitsmarktstatistik des Mikrozensus, Erwerbst?tige aus Hauptwohnsitzhaushalten, Bundesl?nder, Geschlecht, Jahr", - "State": "undefiniert", - "Time": "2021", - "LatestUpdate": "30.01.2023 16:37:41h", - "Information": "false" - }, - { - "Code": "12251LJ003", - "Content": "Arbeitsmarktstatistik des Mikrozensus, Erwerbst?tige aus Hauptwohnsitzhaushalten, Bundesl?nder, Stellung im Beruf, Jahr", - "State": "undefiniert", - "Time": "2021", - "LatestUpdate": "30.01.2023 16:37:47h", - "Information": "false" - }, - { - "Code": "12251LJ004", - "Content": "Arbeitsmarktstatistik des Mikrozensus, Erwerbst?tige aus Hauptwohnsitzhaushalten, Bundesl?nder, Geschlecht, Stellung im Beruf, Jahr", - "State": "undefiniert", - "Time": "2021", - "LatestUpdate": "30.01.2023 16:37:54h", - "Information": "false" - }, - { - "Code": "12251LJ005", - "Content": "Arbeitsmarktstatistik des Mikrozensus, Erwerbst?tige aus Hauptwohnsitzhaushalten, Bundesl?nder, Gr??enkl. der in der Arbeitsst?tte t?tigen Pers., Jahr", - "State": "undefiniert", - "Time": "2021", - "LatestUpdate": "30.01.2023 16:37:57h", - "Information": "false" - }, - { - "Code": "12251LJ006", - "Content": "Arbeitsmarktstatistik des Mikrozensus, Erwerbst?tige aus Hauptwohnsitzhaushalten, Bundesl?nder, Geschlecht, Gr??enkl. der in der Arbeitsst?tte t?tigen Pers., Jahr", - "State": "undefiniert", - "Time": "2021", - "LatestUpdate": "30.01.2023 16:38:00h", - "Information": "false" - }, - { - "Code": "12251LJ007", - "Content": "Arbeitsmarktstatistik des Mikrozensus, Erwerbst?tige aus Hauptwohnsitzhaushalten, Bundesl?nder, Stellung im Beruf, Gr??enkl. der in der Arbeitsst?tte t?tigen Pers., Jahr", - "State": "undefiniert", - "Time": "2021", - "LatestUpdate": "30.01.2023 16:37:50h", - "Information": "false" - }, - { - "Code": "12251LJ008", - "Content": "Arbeitsmarktstatistik des Mikrozensus, Erwerbst?tige aus Hauptwohnsitzhaushalten, Bundesl?nder, Geschlecht, Stellung im Beruf, Gr??enkl. der in der Arbeitsst?tte t?tigen Pers., Jahr", - "State": "undefiniert", - "Time": "2021", - "LatestUpdate": "30.01.2023 16:38:40h", - "Information": "false" - }, - { - "Code": "12251LJ009", - "Content": "Arbeitsmarktstatistik des Mikrozensus, Erwerbst?tige aus Hauptwohnsitzhaushalten, Bundesl?nder, Wochenend- und Feiertagsarbeit, Jahr", - "State": "undefiniert", - "Time": "2021", - "LatestUpdate": "30.01.2023 16:38:43h", - "Information": "false" - }, - { - "Code": "12251LJ010", - "Content": "Arbeitsmarktstatistik des Mikrozensus, Erwerbst?tige aus Hauptwohnsitzhaushalten, Bundesl?nder, Geschlecht, Wochenend- und Feiertagsarbeit, Jahr", - "State": "undefiniert", - "Time": "2021", - "LatestUpdate": "30.01.2023 16:38:47h", - "Information": "false" - }, - { - "Code": "12251LJ011", - "Content": "Arbeitsmarktstatistik des Mikrozensus, Erwerbst?tige aus Hauptwohnsitzhaushalten, Bundesl?nder, Stellung im Beruf, Wochenend- und Feiertagsarbeit, Jahr", - "State": "undefiniert", - "Time": "2021", - "LatestUpdate": "30.01.2023 16:38:50h", - "Information": "false" - }, - { - "Code": "12251LJ012", - "Content": "Arbeitsmarktstatistik des Mikrozensus, Erwerbst?tige aus Hauptwohnsitzhaushalten, Bundesl?nder, Geschlecht, Stellung im Beruf, Wochenend- und Feiertagsarbeit, Jahr", - "State": "undefiniert", - "Time": "2021", - "LatestUpdate": "30.01.2023 16:38:55h", - "Information": "false" - }, - { - "Code": "12251LJ013", - "Content": "Arbeitsmarktstatistik des Mikrozensus, Erwerbst?tige aus Hauptwohnsitzhaushalten, Bundesl?nder, Abend-, Nacht- und Schichtarbeit, Jahr", - "State": "undefiniert", - "Time": "2021", - "LatestUpdate": "30.01.2023 16:38:58h", - "Information": "false" - }, - { - "Code": "12251LJ014", - "Content": "Arbeitsmarktstatistik des Mikrozensus, Erwerbst?tige aus Hauptwohnsitzhaushalten, Bundesl?nder, Geschlecht, Abend-, Nacht- und Schichtarbeit, Jahr", - "State": "undefiniert", - "Time": "2021", - "LatestUpdate": "30.01.2023 16:39:02h", - "Information": "false" - }, - { - "Code": "12251LJ015", - "Content": "Arbeitsmarktstatistik des Mikrozensus, Erwerbst?tige aus Hauptwohnsitzhaushalten, Bundesl?nder, Stellung im Beruf, Abend-, Nacht- und Schichtarbeit, Jahr", - "State": "undefiniert", - "Time": "2021", - "LatestUpdate": "30.01.2023 16:39:06h", - "Information": "false" - }, - { - "Code": "12251LJ016", - "Content": "Arbeitsmarktstatistik des Mikrozensus, Erwerbst?tige aus Hauptwohnsitzhaushalten, Bundesl?nder, Geschlecht, Stellung im Beruf, Abend-, Nacht- und Schichtarbeit, Jahr", - "State": "undefiniert", - "Time": "2021", - "LatestUpdate": "30.01.2023 16:39:56h", - "Information": "false" - } - ], - "Copyright": "? Statistisches Bundesamt (Destatis), 2023" -} diff --git a/tests/testthat/xy_variable2/api/catalogue/tables2variable-0e956d.json b/tests/testthat/xy_variable2/api/catalogue/tables2variable-0e956d.json deleted file mode 100644 index 7edf6f6..0000000 --- a/tests/testthat/xy_variable2/api/catalogue/tables2variable-0e956d.json +++ /dev/null @@ -1,523 +0,0 @@ -{ - "Ident": { - "Service": "catalogue", - "Method": "tables2variable" - }, - "Status": { - "Code": 0, - "Content": "erfolgreich", - "Type": "Information" - }, - "Parameter": { - "username": "********************", - "password": "********************", - "name": "DLAND", - "selection": "", - "area": "oeffentlich", - "pagelength": "100", - "language": "de" - }, - "List": [ - { - "Code": "11111-0001", - "Content": "Gebietsfl?che: Bundesl?nder, Stichtag", - "Time": "31.12.1995 - 31.12.2020" - }, - { - "Code": "12111-0101", - "Content": "Bev?lkerung (Zensus): Bundesl?nder, Stichtag, Nationalit?t,\nGeschlecht", - "Time": "" - }, - { - "Code": "12111-0102", - "Content": "Bev?lkerung (Zensus): Bundesl?nder, Stichtag, Nationalit?t,\nAltersgruppen", - "Time": "" - }, - { - "Code": "12111-0103", - "Content": "Bev?lkerung (Zensus): Bundesl?nder, Stichtag, Nationalit?t,\nFamilienstand", - "Time": "" - }, - { - "Code": "12111-0104", - "Content": "Bev?lkerung (Zensus): Bundesl?nder, Stichtag, Geschlecht,\nAltersgruppen", - "Time": "" - }, - { - "Code": "12111-0105", - "Content": "Bev?lkerung (Zensus): Bundesl?nder, Stichtag, Geschlecht,\nFamilienstand", - "Time": "" - }, - { - "Code": "12111-0106", - "Content": "Bev?lkerung (Zensus): Bundesl?nder, Stichtag, Familienstand,\nAltersgruppen", - "Time": "" - }, - { - "Code": "12211-0902", - "Content": "Bev?lkerung in Gemeinschaftsunterk?nften: Bundesl?nder,\nJahre, Hauptstatus, Geschlecht, Altersgruppen", - "Time": "2017 - 2021" - }, - { - "Code": "12211-0903", - "Content": "Bev?lkerung in Gemeinschaftsunterk?nften: Bundesl?nder,\nJahre, Art der Gemeinschaftsunterkunft, Geschlecht", - "Time": "2017 - 2021" - }, - { - "Code": "12211-1001", - "Content": "Bev?lkerung, Erwerbst?tige, Erwerbslose, Erwerbspersonen, Nichterwerbspersonen aus Hauptwohnsitzhaushalten: Bundesl?nder, Jahre, Geschlecht, Altersgruppen", - "Time": "2021 - 2021" - }, - { - "Code": "12211-1002", - "Content": "Bev?lkerung, Erwerbst?tige, Erwerbslose, Erwerbspersonen, Nichterwerbspersonen aus Hauptwohnsitzhaushalten: Bundesl?nder, Jahre, ?berwiegender Lebensunterhalt, Altersgruppen", - "Time": "2021 - 2021" - }, - { - "Code": "12211-1003", - "Content": "Bev?lkerung, Erwerbst?tige, Erwerbslose, Erwerbspersonen,\nNichterwerbspersonen aus Hauptwohnsitzhaush.: Bundesl?nder,\nJahre, Geschlecht, Gr??enkl. pers?nl. monatl. Nettoeinkommen", - "Time": "2021 - 2021" - }, - { - "Code": "12211-1004", - "Content": "Erwerbst?tige aus Hauptwohnsitzhaushalten: Bundesl?nder,\nJahre, Geschlecht, Altersgruppen, Stellung im Beruf", - "Time": "2021 - 2021" - }, - { - "Code": "12211-9004", - "Content": "Bev?lkerung, Erwerbst?tige, Erwerbslose, Erwerbspersonen,\nNichterwerbspersonen: Bundesl?nder, Jahre (bis 2019)", - "Time": "04/1991 - 2019" - }, - { - "Code": "12211-9014", - "Content": "Bev?lkerung (ab 15 Jahren): Bundesl?nder, Jahre (bis 2019),\nGeschlecht, Allgemeine Schulausbildung", - "Time": "2005 - 2019" - }, - { - "Code": "12211-9015", - "Content": "Bev?lkerung (ab 15 Jahren): Bundesl?nder, Jahre (bis 2019),\nGeschlecht, Beruflicher Bildungsabschluss", - "Time": "2005 - 2019" - }, - { - "Code": "12211-9033", - "Content": "Privathaushalte: Bundesl?nder, Jahre (bis 2019)", - "Time": "05/1970 - 2019" - }, - { - "Code": "12211-9034", - "Content": "Privathaushalte: Bundesl?nder, Jahre (bis 2019), Haushaltsgr??e", - "Time": "04/1991 - 2019" - }, - { - "Code": "12211-9041", - "Content": "Bev?lkerung in Familien/Lebensformen: Bundesl?nder, Jahre (bis 2019), Lebensformen", - "Time": "04/1996 - 2019" - }, - { - "Code": "12211-9044", - "Content": "Familien, Paare, Alleinerziehende: Bundesl?nder, Jahre (bis 2019), Vorhandensein von Kindern", - "Time": "04/1996 - 2019" - }, - { - "Code": "12211-9047", - "Content": "Ehepaare, Lebensgemeinschaften, Gemischtgeschlechtliche\nLebensgemeinschaften: Bundesl?nder, Jahre (bis 2019),\nVorhandensein von Kindern", - "Time": "04/1996 - 2019" - }, - { - "Code": "12211-9051", - "Content": "Alleinerziehende: Bundesl?nder, Jahre (bis 2019),\nGeschlecht, Vorhandensein von Kindern", - "Time": "04/1996 - 2019" - }, - { - "Code": "12211-9053", - "Content": "Alleinstehende: Bundesl?nder, Jahre (bis 2019), Geschlecht,\nHaushaltsgr??e", - "Time": "04/1996 - 2019" - }, - { - "Code": "12211-9056", - "Content": "Ledige Kinder in Familien: Bundesl?nder, Jahre (bis 2019),\nFamilienformen", - "Time": "04/1996 - 2019" - }, - { - "Code": "12231-0101", - "Content": "Bev?lkerung von 16 bis unter 75 Jahren in\nHauptwohnsitzhaushalten: Bundesl?nder, Jahre, Altersgruppen,\nPrivate Internetaktivit?ten in den letzten drei Monaten", - "Time": "2022 - 2022" - }, - { - "Code": "12231-0102", - "Content": "Bev?lkerung von 16 bis unter 75 Jahren in\nHauptwohnsitzhaushalten: Bundesl?nder, Jahre, Altersgruppen,\nPrivate Internetk?ufe in den letzten drei Monaten", - "Time": "2022 - 2022" - }, - { - "Code": "12251-0101", - "Content": "Erwerbst?tige aus Hauptwohnsitzhaushalten: Bundesl?nder, Jahre, Geschlecht, Stellung im Beruf, Gr??enklassen der in der Arbeitsst?tte t?tigen Personen", - "Time": "2021 - 2021" - }, - { - "Code": "12251-0102", - "Content": "Erwerbst?tige aus Hauptwohnsitzhaushalten: Bundesl?nder,\nJahre, Geschlecht, Stellung im Beruf, Wochenend- und\nFeiertagsarbeit", - "Time": "2021 - 2021" - }, - { - "Code": "12251-0103", - "Content": "Erwerbst?tige aus Hauptwohnsitzhaushalten: Bundesl?nder,\nJahre, Geschlecht, Stellung im Beruf, Abend-, Nacht- und\nSchichtarbeit", - "Time": "2021 - 2021" - }, - { - "Code": "12251-0104", - "Content": "Erwerbst?tige aus Hauptwohnsitzhaushalten: Bundesl?nder,\nJahre, Geschlecht, Stellung im Beruf, Erwerbsarbeit zu\nHause", - "Time": "2021 - 2021" - }, - { - "Code": "12251-0108", - "Content": "Abh?ngig Erwerbst?tige aus Hauptwohnsitzhaushalten:\nBundesl?nder, Jahre, Geschlecht, Altersgruppen, Art des\nArbeitsvertrages", - "Time": "2021 - 2021" - }, - { - "Code": "12411-0010", - "Content": "Bev?lkerung: Bundesl?nder, Stichtag", - "Time": "31.12.1958 - 31.12.2021" - }, - { - "Code": "12411-0011", - "Content": "Bev?lkerung: Bundesl?nder, Stichtag, Geschlecht", - "Time": "31.12.1967 - 31.12.2021" - }, - { - "Code": "12411-0012", - "Content": "Bev?lkerung: Bundesl?nder, Stichtag, Altersjahre", - "Time": "31.12.1967 - 31.12.2021" - }, - { - "Code": "12411-0013", - "Content": "Bev?lkerung: Bundesl?nder, Stichtag, Geschlecht, Altersjahre", - "Time": "31.12.1967 - 31.12.2021" - }, - { - "Code": "12411-0014", - "Content": "Bev?lkerung: Bundesl?nder, Stichtag, Nationalit?t,\nGeschlecht, Altersjahre", - "Time": "31.12.2000 - 31.12.2021" - }, - { - "Code": "12411-0021", - "Content": "Bev?lkerung: Bundesl?nder, Stichtag zum Quartalsende,\nGeschlecht", - "Time": "31.03.1991 - 30.09.2022" - }, - { - "Code": "12411-0042", - "Content": "Durchschnittliche Bev?lkerung: Bundesl?nder, Jahre,\nNationalit?t, Geschlecht", - "Time": "2000 - 2021" - }, - { - "Code": "12411-0050", - "Content": "Bev?lkerungsdichte: Bundesl?nder, Stichtag", - "Time": "31.12.1995 - 31.12.2020" - }, - { - "Code": "12421-0003", - "Content": "Vorausberechneter Bev?lkerungsstand: Bundesl?nder, Stichtag,\nVarianten der Bev?lkerungsvorausberechnung", - "Time": "31.12.2022 - 31.12.2070" - }, - { - "Code": "12421-0004", - "Content": "Vorausberechneter Bev?lkerungsstand: Bundesl?nder, Stichtag,\nVarianten der Bev?lkerungsvorausberechnung, Geschlecht,\nAltersjahre", - "Time": "31.12.2022 - 31.12.2070" - }, - { - "Code": "12421-0101", - "Content": "Vorausberechnete Privathaushalte: Bundesl?nder, Jahre,\nVarianten der Haushaltsvorausberechnung, Haushaltsgr??e", - "Time": "2019 - 2040" - }, - { - "Code": "12521-0020", - "Content": "Ausl?nder: Bundesl?nder, Stichtag, Geschlecht/Altersjahre/\nFamilienstand", - "Time": "30.09.1980 - 31.12.2021" - }, - { - "Code": "12521-0021", - "Content": "Ausl?nder: Bundesl?nder, Stichtag, Geschlecht/Altersjahre/\nFamilienstand, L?ndergruppierungen/Staatsangeh?rigkeit", - "Time": "30.09.1980 - 31.12.2021" - }, - { - "Code": "12521-0022", - "Content": "Ausl?nder: Bundesl?nder, Stichtag, Geschlecht, Altersjahre,\nL?ndergruppierungen/Staatsangeh?rigkeit", - "Time": "31.12.1998 - 31.12.2021" - }, - { - "Code": "12521-0023", - "Content": "Ausl?nder: Bundesl?nder, Stichtag, Geschlecht, Altersjahre,\nMigrantengeneration, L?ndergruppierungen/Staatsangeh?rigkeit", - "Time": "31.12.1998 - 31.12.2021" - }, - { - "Code": "12521-0024", - "Content": "Ausl?nder: Bundesl?nder, Stichtag, Geschlecht,\nFamilienstand, L?ndergruppierungen/Staatsangeh?rigkeit", - "Time": "31.12.1998 - 31.12.2021" - }, - { - "Code": "12521-0025", - "Content": "Ausl?nder: Bundesl?nder, Stichtag, Geschlecht,\nAufenthaltsdauer/Aufenthaltsdauer (Abgrenzung\nEinb?rgerungen), L?ndergruppierungen/Staatsangeh?rigkeit", - "Time": "31.12.1998 - 31.12.2021" - }, - { - "Code": "12521-0026", - "Content": "Ausl?nder: Bundesl?nder, Stichtag, Geschlecht,\nAufenthaltstitel/Ausgew?hlte Aufenthaltstitel,\nL?ndergruppierungen/Staatsangeh?rigkeit", - "Time": "31.12.1998 - 31.12.2021" - }, - { - "Code": "12521-0027", - "Content": "Ausl?nder: Bundesl?nder, Jahre, Geschlecht,\nRegisterbewegungen (regional), L?ndergruppierungen/\nStaatsangeh?rigkeit", - "Time": "2015 - 2021" - }, - { - "Code": "12521-0028", - "Content": "Ausl?nder: Bundesl?nder, Jahre, Geschlecht, Altersjahre,\nRegisterzu- und abg?nge (regional), L?ndergruppierungen/\nStaatsangeh?rigkeit", - "Time": "2015 - 2021" - }, - { - "Code": "12521-0029", - "Content": "Ausl?nder: Bundesl?nder, Jahre, Geschlecht,\nAufenthaltsdauer, Registerabg?nge (regional),\nL?ndergruppierungen/Staatsangeh?rigkeit", - "Time": "2015 - 2021" - }, - { - "Code": "12521-0030", - "Content": "Durchschnittsalter der Ausl?nder: Bundesl?nder, Stichtag,\nGeschlecht, L?ndergruppierungen/Staatsangeh?rigkeit", - "Time": "31.12.1998 - 31.12.2021" - }, - { - "Code": "12521-0031", - "Content": "Durchschnittliche Aufenthaltsdauer der Ausl?nder:\nBundesl?nder, Stichtag, Geschlecht, L?ndergruppierungen/\nStaatsangeh?rigkeit", - "Time": "31.12.1998 - 31.12.2021" - }, - { - "Code": "12531-0020", - "Content": "Schutzsuchende: Bundesl?nder, Stichtag, Geschlecht/\nAltersjahre/Familienstand", - "Time": "31.12.2007 - 31.12.2021" - }, - { - "Code": "12531-0021", - "Content": "Schutzsuchende: Bundesl?nder, Stichtag, Geschlecht/\nAltersjahre/Familienstand, L?ndergruppierungen/\nStaatsangeh?rigkeit", - "Time": "31.12.2007 - 31.12.2021" - }, - { - "Code": "12531-0022", - "Content": "Schutzsuchende: Bundesl?nder, Stichtag, Geschlecht,\nAltersjahre, L?ndergruppierungen/Staatsangeh?rigkeit", - "Time": "31.12.2007 - 31.12.2021" - }, - { - "Code": "12531-0023", - "Content": "Schutzsuchende: Bundesl?nder, Stichtag, Geschlecht,\nAltersjahre, Migrantengeneration, L?ndergruppierungen\n/Staatsangeh?rigkeit", - "Time": "31.12.2007 - 31.12.2021" - }, - { - "Code": "12531-0024", - "Content": "Schutzsuchende: Bundesl?nder, Stichtag, Geschlecht,\nFamilienstand, L?ndergruppierungen/Staatsangeh?rigkeit", - "Time": "31.12.2007 - 31.12.2021" - }, - { - "Code": "12531-0025", - "Content": "Schutzsuchende: Bundesl?nder, Stichtag, Geschlecht,\nAufenthaltsdauer/Aufenthaltsdauer (Abgrenzung\nEinb?rgerungen), L?ndergruppierungen/Staatsangeh?rigkeit", - "Time": "31.12.2007 - 31.12.2021" - }, - { - "Code": "12531-0026", - "Content": "Schutzsuchende: Bundesl?nder, Stichtag, Geschlecht,\nSchutzstatus/Schutzstatuskategorie, L?ndergruppierungen/\nStaatsangeh?rigkeit", - "Time": "31.12.2007 - 31.12.2021" - }, - { - "Code": "12531-0027", - "Content": "Durchschnittsalter der Schutzsuchenden: Bundesl?nder,\nStichtag, Geschlecht, L?ndergruppierungen/\nStaatsangeh?rigkeit", - "Time": "31.12.2007 - 31.12.2021" - }, - { - "Code": "12531-0028", - "Content": "Durchschnittliche Aufenthaltsdauer der Schutzsuchenden:\nBundesl?nder, Stichtag, Geschlecht, L?ndergruppierungen/\nStaatsangeh?rigkeit", - "Time": "31.12.2007 - 31.12.2021" - }, - { - "Code": "12611-0010", - "Content": "Eheschlie?ungen: Bundesl?nder, Jahre", - "Time": "1990 - 2021" - }, - { - "Code": "12611-0011", - "Content": "Eheschlie?ungen: Bundesl?nder, Monate", - "Time": "Januar 1990 - November 2022" - }, - { - "Code": "12612-0100", - "Content": "Lebendgeborene: Bundesl?nder, Jahre, Geschlecht", - "Time": "1990 - 2021" - }, - { - "Code": "12612-0101", - "Content": "Lebendgeborene: Bundesl?nder, Monate, Geschlecht", - "Time": "Januar 1990 - November 2022" - }, - { - "Code": "12612-0102", - "Content": "Lebendgeborene: Bundesl?nder, Jahre, Familienstand der\nEltern", - "Time": "1991 - 2021" - }, - { - "Code": "12612-0103", - "Content": "Lebendgeborene: Bundesl?nder, Jahre, Staatsangeh?rigkeit des\nKindes und der Eltern", - "Time": "1990 - 2021" - }, - { - "Code": "12612-0104", - "Content": "Zusammengefasste Geburtenziffern (je Frau): Bundesl?nder,\nJahre, Altersgruppen", - "Time": "1991 - 2021" - }, - { - "Code": "12612-0105", - "Content": "Nettoreproduktionsrate: Bundesl?nder, Jahre (bis 2010),\nAltersgruppen", - "Time": "2004 - 2010" - }, - { - "Code": "12612-0106", - "Content": "Totgeborene: Bundesl?nder, Jahre", - "Time": "1990 - 2021" - }, - { - "Code": "12613-0010", - "Content": "Gestorbene: Bundesl?nder, Jahre", - "Time": "1990 - 2021" - }, - { - "Code": "12613-0011", - "Content": "Gestorbene: Bundesl?nder, Jahre, Geschlecht", - "Time": "1990 - 2021" - }, - { - "Code": "12613-0012", - "Content": "Gestorbene: Bundesl?nder, Monate", - "Time": "Januar 1990 - November 2022" - }, - { - "Code": "12613-0013", - "Content": "Gestorbene: Bundesl?nder, Monate, Geschlecht", - "Time": "Januar 1990 - November 2022" - }, - { - "Code": "12621-0004", - "Content": "Durchschnittliche Lebenserwartung bei Geburt\n(Periodensterbetafel): Bundesl?nder, Jahre, Geschlecht", - "Time": "2002/04 - 2019/21" - }, - { - "Code": "12631-0010", - "Content": "Ehescheidungen: Bundesl?nder, Jahre", - "Time": "1990 - 2021" - }, - { - "Code": "12631-0011", - "Content": "Ehescheidungen: Bundesl?nder, Jahre, Ehedauer", - "Time": "1997 - 2021" - }, - { - "Code": "12631-0012", - "Content": "Ehescheidungen: Bundesl?nder, Jahre, Gemeinsame\nminderj?hrige Kinder", - "Time": "1997 - 2021" - }, - { - "Code": "12651-0003", - "Content": "Begr?ndungen von Lebenspartnerschaften: Bundesl?nder, Jahre (bis 2017), Geschlecht", - "Time": "2014 - 2017" - }, - { - "Code": "12661-0002", - "Content": "Aufhebungen von Lebenspartnerschaften: Bundesl?nder, Jahre,\nGeschlecht", - "Time": "2014 - 2021" - }, - { - "Code": "12711-0020", - "Content": "Gesamtwanderungen ?ber die Grenzen der Bundesl?nder: Bundesl?nder, Jahre, Nationalit?t, Geschlecht", - "Time": "2000 - 2021" - }, - { - "Code": "12711-0021", - "Content": "Wanderungen zwischen den Bundesl?ndern: Bundesl?nder, Jahre, Nationalit?t, Geschlecht", - "Time": "2000 - 2021" - }, - { - "Code": "12711-0023", - "Content": "Wanderungen zwischen Deutschland und dem Ausland:\nBundesl?nder, Jahre, Nationalit?t, Geschlecht", - "Time": "2000 - 2021" - }, - { - "Code": "13111-0005", - "Content": "Sozialversicherungspflichtig Besch?ftigte am Arbeitsort:\nBundesl?nder, Stichtag, Geschlecht", - "Time": "31.03.2008 - 30.06.2022" - }, - { - "Code": "13111-0006", - "Content": "Sozialversicherungspflichtig Besch?ftigte am Arbeitsort:\nBundesl?nder, Stichtag, Wirtschaftsabschnitte", - "Time": "31.03.2008 - 30.06.2022" - }, - { - "Code": "13211-0007", - "Content": "Arbeitslose, Arbeitslosenquoten, Gemeldete Arbeitsstellen:\nBundesl?nder, Jahre", - "Time": "1991 - 2022" - }, - { - "Code": "13211-0008", - "Content": "Arbeitslose, Arbeitslosenquoten, Gemeldete Arbeitsstellen:\nBundesl?nder, Monate", - "Time": "Januar 2005 - Februar 2023" - }, - { - "Code": "13211-0009", - "Content": "Arbeitslose: Bundesl?nder, Jahre, Geschlecht", - "Time": "1991 - 2022" - }, - { - "Code": "13211-0010", - "Content": "Arbeitslose: Bundesl?nder, Monate, Geschlecht", - "Time": "Januar 2005 - Februar 2023" - }, - { - "Code": "13211-0011", - "Content": "Arbeitslosenquote aller zivilen Erwerbspersonen:\nBundesl?nder, Jahre, Geschlecht", - "Time": "1991 - 2022" - }, - { - "Code": "13211-0012", - "Content": "Arbeitslosenquote aller zivilen Erwerbspersonen:\nBundesl?nder, Monate, Geschlecht", - "Time": "Januar 2005 - Februar 2023" - }, - { - "Code": "13311-0002", - "Content": "Erwerbst?tige, Arbeitnehmer, Selbst?ndige und mithelfende\nFamilienangeh?rige (im Inland): Bundesl?nder, Jahre,\nWirtschaftszweige", - "Time": "1991 - 2022" - }, - { - "Code": "14111-0003", - "Content": "Wahlberechtigte, W?hler, Wahlbeteiligung, Erststimmen,\nZweitstimmen (Allgemeine Bundestagswahlstatistik):\nBundesl?nder, Stichtag", - "Time": "22.09.2013 - 26.09.2021" - }, - { - "Code": "14111-0004", - "Content": "G?ltige Erststimmen, g?ltige Zweitstimmen (Allgemeine\nBundestagswahlstatistik): Bundesl?nder, Stichtag, Parteien", - "Time": "22.09.2013 - 26.09.2021" - }, - { - "Code": "14121-0004", - "Content": "G?ltige Zweitstimmen (Repr?sentative\nBundestagswahlstatistik): Bundesl?nder, Stichtag, Parteien,\nGeschlecht", - "Time": "22.09.2002 - 26.09.2021" - }, - { - "Code": "14121-0005", - "Content": "G?ltige Zweitstimmen (Repr?sentative\nBundestagswahlstatistik): Bundesl?nder, Stichtag, Parteien,\nAltersgruppen", - "Time": "22.09.2013 - 26.09.2021" - }, - { - "Code": "14121-0006", - "Content": "G?ltige Zweitstimmen (Repr?sentative\nBundestagswahlstatistik): Bundesl?nder, Stichtag, Parteien,\nGeschlecht, Altersgruppen", - "Time": "22.09.2013 - 26.09.2021" - }, - { - "Code": "14211-0002", - "Content": "G?ltige Stimmen (Allgemeine Europawahlstatistik):\nBundesl?nder, Stichtag, Parteien", - "Time": "12.06.1994 - 26.05.2019" - } - ], - "Copyright": "? Statistisches Bundesamt (Destatis), 2023" -} diff --git a/tests/testthat/xy_variable3/api/catalogue/tables2variable-0e956d.json b/tests/testthat/xy_variable3/api/catalogue/tables2variable-0e956d.json deleted file mode 100644 index 7edf6f6..0000000 --- a/tests/testthat/xy_variable3/api/catalogue/tables2variable-0e956d.json +++ /dev/null @@ -1,523 +0,0 @@ -{ - "Ident": { - "Service": "catalogue", - "Method": "tables2variable" - }, - "Status": { - "Code": 0, - "Content": "erfolgreich", - "Type": "Information" - }, - "Parameter": { - "username": "********************", - "password": "********************", - "name": "DLAND", - "selection": "", - "area": "oeffentlich", - "pagelength": "100", - "language": "de" - }, - "List": [ - { - "Code": "11111-0001", - "Content": "Gebietsfl?che: Bundesl?nder, Stichtag", - "Time": "31.12.1995 - 31.12.2020" - }, - { - "Code": "12111-0101", - "Content": "Bev?lkerung (Zensus): Bundesl?nder, Stichtag, Nationalit?t,\nGeschlecht", - "Time": "" - }, - { - "Code": "12111-0102", - "Content": "Bev?lkerung (Zensus): Bundesl?nder, Stichtag, Nationalit?t,\nAltersgruppen", - "Time": "" - }, - { - "Code": "12111-0103", - "Content": "Bev?lkerung (Zensus): Bundesl?nder, Stichtag, Nationalit?t,\nFamilienstand", - "Time": "" - }, - { - "Code": "12111-0104", - "Content": "Bev?lkerung (Zensus): Bundesl?nder, Stichtag, Geschlecht,\nAltersgruppen", - "Time": "" - }, - { - "Code": "12111-0105", - "Content": "Bev?lkerung (Zensus): Bundesl?nder, Stichtag, Geschlecht,\nFamilienstand", - "Time": "" - }, - { - "Code": "12111-0106", - "Content": "Bev?lkerung (Zensus): Bundesl?nder, Stichtag, Familienstand,\nAltersgruppen", - "Time": "" - }, - { - "Code": "12211-0902", - "Content": "Bev?lkerung in Gemeinschaftsunterk?nften: Bundesl?nder,\nJahre, Hauptstatus, Geschlecht, Altersgruppen", - "Time": "2017 - 2021" - }, - { - "Code": "12211-0903", - "Content": "Bev?lkerung in Gemeinschaftsunterk?nften: Bundesl?nder,\nJahre, Art der Gemeinschaftsunterkunft, Geschlecht", - "Time": "2017 - 2021" - }, - { - "Code": "12211-1001", - "Content": "Bev?lkerung, Erwerbst?tige, Erwerbslose, Erwerbspersonen, Nichterwerbspersonen aus Hauptwohnsitzhaushalten: Bundesl?nder, Jahre, Geschlecht, Altersgruppen", - "Time": "2021 - 2021" - }, - { - "Code": "12211-1002", - "Content": "Bev?lkerung, Erwerbst?tige, Erwerbslose, Erwerbspersonen, Nichterwerbspersonen aus Hauptwohnsitzhaushalten: Bundesl?nder, Jahre, ?berwiegender Lebensunterhalt, Altersgruppen", - "Time": "2021 - 2021" - }, - { - "Code": "12211-1003", - "Content": "Bev?lkerung, Erwerbst?tige, Erwerbslose, Erwerbspersonen,\nNichterwerbspersonen aus Hauptwohnsitzhaush.: Bundesl?nder,\nJahre, Geschlecht, Gr??enkl. pers?nl. monatl. Nettoeinkommen", - "Time": "2021 - 2021" - }, - { - "Code": "12211-1004", - "Content": "Erwerbst?tige aus Hauptwohnsitzhaushalten: Bundesl?nder,\nJahre, Geschlecht, Altersgruppen, Stellung im Beruf", - "Time": "2021 - 2021" - }, - { - "Code": "12211-9004", - "Content": "Bev?lkerung, Erwerbst?tige, Erwerbslose, Erwerbspersonen,\nNichterwerbspersonen: Bundesl?nder, Jahre (bis 2019)", - "Time": "04/1991 - 2019" - }, - { - "Code": "12211-9014", - "Content": "Bev?lkerung (ab 15 Jahren): Bundesl?nder, Jahre (bis 2019),\nGeschlecht, Allgemeine Schulausbildung", - "Time": "2005 - 2019" - }, - { - "Code": "12211-9015", - "Content": "Bev?lkerung (ab 15 Jahren): Bundesl?nder, Jahre (bis 2019),\nGeschlecht, Beruflicher Bildungsabschluss", - "Time": "2005 - 2019" - }, - { - "Code": "12211-9033", - "Content": "Privathaushalte: Bundesl?nder, Jahre (bis 2019)", - "Time": "05/1970 - 2019" - }, - { - "Code": "12211-9034", - "Content": "Privathaushalte: Bundesl?nder, Jahre (bis 2019), Haushaltsgr??e", - "Time": "04/1991 - 2019" - }, - { - "Code": "12211-9041", - "Content": "Bev?lkerung in Familien/Lebensformen: Bundesl?nder, Jahre (bis 2019), Lebensformen", - "Time": "04/1996 - 2019" - }, - { - "Code": "12211-9044", - "Content": "Familien, Paare, Alleinerziehende: Bundesl?nder, Jahre (bis 2019), Vorhandensein von Kindern", - "Time": "04/1996 - 2019" - }, - { - "Code": "12211-9047", - "Content": "Ehepaare, Lebensgemeinschaften, Gemischtgeschlechtliche\nLebensgemeinschaften: Bundesl?nder, Jahre (bis 2019),\nVorhandensein von Kindern", - "Time": "04/1996 - 2019" - }, - { - "Code": "12211-9051", - "Content": "Alleinerziehende: Bundesl?nder, Jahre (bis 2019),\nGeschlecht, Vorhandensein von Kindern", - "Time": "04/1996 - 2019" - }, - { - "Code": "12211-9053", - "Content": "Alleinstehende: Bundesl?nder, Jahre (bis 2019), Geschlecht,\nHaushaltsgr??e", - "Time": "04/1996 - 2019" - }, - { - "Code": "12211-9056", - "Content": "Ledige Kinder in Familien: Bundesl?nder, Jahre (bis 2019),\nFamilienformen", - "Time": "04/1996 - 2019" - }, - { - "Code": "12231-0101", - "Content": "Bev?lkerung von 16 bis unter 75 Jahren in\nHauptwohnsitzhaushalten: Bundesl?nder, Jahre, Altersgruppen,\nPrivate Internetaktivit?ten in den letzten drei Monaten", - "Time": "2022 - 2022" - }, - { - "Code": "12231-0102", - "Content": "Bev?lkerung von 16 bis unter 75 Jahren in\nHauptwohnsitzhaushalten: Bundesl?nder, Jahre, Altersgruppen,\nPrivate Internetk?ufe in den letzten drei Monaten", - "Time": "2022 - 2022" - }, - { - "Code": "12251-0101", - "Content": "Erwerbst?tige aus Hauptwohnsitzhaushalten: Bundesl?nder, Jahre, Geschlecht, Stellung im Beruf, Gr??enklassen der in der Arbeitsst?tte t?tigen Personen", - "Time": "2021 - 2021" - }, - { - "Code": "12251-0102", - "Content": "Erwerbst?tige aus Hauptwohnsitzhaushalten: Bundesl?nder,\nJahre, Geschlecht, Stellung im Beruf, Wochenend- und\nFeiertagsarbeit", - "Time": "2021 - 2021" - }, - { - "Code": "12251-0103", - "Content": "Erwerbst?tige aus Hauptwohnsitzhaushalten: Bundesl?nder,\nJahre, Geschlecht, Stellung im Beruf, Abend-, Nacht- und\nSchichtarbeit", - "Time": "2021 - 2021" - }, - { - "Code": "12251-0104", - "Content": "Erwerbst?tige aus Hauptwohnsitzhaushalten: Bundesl?nder,\nJahre, Geschlecht, Stellung im Beruf, Erwerbsarbeit zu\nHause", - "Time": "2021 - 2021" - }, - { - "Code": "12251-0108", - "Content": "Abh?ngig Erwerbst?tige aus Hauptwohnsitzhaushalten:\nBundesl?nder, Jahre, Geschlecht, Altersgruppen, Art des\nArbeitsvertrages", - "Time": "2021 - 2021" - }, - { - "Code": "12411-0010", - "Content": "Bev?lkerung: Bundesl?nder, Stichtag", - "Time": "31.12.1958 - 31.12.2021" - }, - { - "Code": "12411-0011", - "Content": "Bev?lkerung: Bundesl?nder, Stichtag, Geschlecht", - "Time": "31.12.1967 - 31.12.2021" - }, - { - "Code": "12411-0012", - "Content": "Bev?lkerung: Bundesl?nder, Stichtag, Altersjahre", - "Time": "31.12.1967 - 31.12.2021" - }, - { - "Code": "12411-0013", - "Content": "Bev?lkerung: Bundesl?nder, Stichtag, Geschlecht, Altersjahre", - "Time": "31.12.1967 - 31.12.2021" - }, - { - "Code": "12411-0014", - "Content": "Bev?lkerung: Bundesl?nder, Stichtag, Nationalit?t,\nGeschlecht, Altersjahre", - "Time": "31.12.2000 - 31.12.2021" - }, - { - "Code": "12411-0021", - "Content": "Bev?lkerung: Bundesl?nder, Stichtag zum Quartalsende,\nGeschlecht", - "Time": "31.03.1991 - 30.09.2022" - }, - { - "Code": "12411-0042", - "Content": "Durchschnittliche Bev?lkerung: Bundesl?nder, Jahre,\nNationalit?t, Geschlecht", - "Time": "2000 - 2021" - }, - { - "Code": "12411-0050", - "Content": "Bev?lkerungsdichte: Bundesl?nder, Stichtag", - "Time": "31.12.1995 - 31.12.2020" - }, - { - "Code": "12421-0003", - "Content": "Vorausberechneter Bev?lkerungsstand: Bundesl?nder, Stichtag,\nVarianten der Bev?lkerungsvorausberechnung", - "Time": "31.12.2022 - 31.12.2070" - }, - { - "Code": "12421-0004", - "Content": "Vorausberechneter Bev?lkerungsstand: Bundesl?nder, Stichtag,\nVarianten der Bev?lkerungsvorausberechnung, Geschlecht,\nAltersjahre", - "Time": "31.12.2022 - 31.12.2070" - }, - { - "Code": "12421-0101", - "Content": "Vorausberechnete Privathaushalte: Bundesl?nder, Jahre,\nVarianten der Haushaltsvorausberechnung, Haushaltsgr??e", - "Time": "2019 - 2040" - }, - { - "Code": "12521-0020", - "Content": "Ausl?nder: Bundesl?nder, Stichtag, Geschlecht/Altersjahre/\nFamilienstand", - "Time": "30.09.1980 - 31.12.2021" - }, - { - "Code": "12521-0021", - "Content": "Ausl?nder: Bundesl?nder, Stichtag, Geschlecht/Altersjahre/\nFamilienstand, L?ndergruppierungen/Staatsangeh?rigkeit", - "Time": "30.09.1980 - 31.12.2021" - }, - { - "Code": "12521-0022", - "Content": "Ausl?nder: Bundesl?nder, Stichtag, Geschlecht, Altersjahre,\nL?ndergruppierungen/Staatsangeh?rigkeit", - "Time": "31.12.1998 - 31.12.2021" - }, - { - "Code": "12521-0023", - "Content": "Ausl?nder: Bundesl?nder, Stichtag, Geschlecht, Altersjahre,\nMigrantengeneration, L?ndergruppierungen/Staatsangeh?rigkeit", - "Time": "31.12.1998 - 31.12.2021" - }, - { - "Code": "12521-0024", - "Content": "Ausl?nder: Bundesl?nder, Stichtag, Geschlecht,\nFamilienstand, L?ndergruppierungen/Staatsangeh?rigkeit", - "Time": "31.12.1998 - 31.12.2021" - }, - { - "Code": "12521-0025", - "Content": "Ausl?nder: Bundesl?nder, Stichtag, Geschlecht,\nAufenthaltsdauer/Aufenthaltsdauer (Abgrenzung\nEinb?rgerungen), L?ndergruppierungen/Staatsangeh?rigkeit", - "Time": "31.12.1998 - 31.12.2021" - }, - { - "Code": "12521-0026", - "Content": "Ausl?nder: Bundesl?nder, Stichtag, Geschlecht,\nAufenthaltstitel/Ausgew?hlte Aufenthaltstitel,\nL?ndergruppierungen/Staatsangeh?rigkeit", - "Time": "31.12.1998 - 31.12.2021" - }, - { - "Code": "12521-0027", - "Content": "Ausl?nder: Bundesl?nder, Jahre, Geschlecht,\nRegisterbewegungen (regional), L?ndergruppierungen/\nStaatsangeh?rigkeit", - "Time": "2015 - 2021" - }, - { - "Code": "12521-0028", - "Content": "Ausl?nder: Bundesl?nder, Jahre, Geschlecht, Altersjahre,\nRegisterzu- und abg?nge (regional), L?ndergruppierungen/\nStaatsangeh?rigkeit", - "Time": "2015 - 2021" - }, - { - "Code": "12521-0029", - "Content": "Ausl?nder: Bundesl?nder, Jahre, Geschlecht,\nAufenthaltsdauer, Registerabg?nge (regional),\nL?ndergruppierungen/Staatsangeh?rigkeit", - "Time": "2015 - 2021" - }, - { - "Code": "12521-0030", - "Content": "Durchschnittsalter der Ausl?nder: Bundesl?nder, Stichtag,\nGeschlecht, L?ndergruppierungen/Staatsangeh?rigkeit", - "Time": "31.12.1998 - 31.12.2021" - }, - { - "Code": "12521-0031", - "Content": "Durchschnittliche Aufenthaltsdauer der Ausl?nder:\nBundesl?nder, Stichtag, Geschlecht, L?ndergruppierungen/\nStaatsangeh?rigkeit", - "Time": "31.12.1998 - 31.12.2021" - }, - { - "Code": "12531-0020", - "Content": "Schutzsuchende: Bundesl?nder, Stichtag, Geschlecht/\nAltersjahre/Familienstand", - "Time": "31.12.2007 - 31.12.2021" - }, - { - "Code": "12531-0021", - "Content": "Schutzsuchende: Bundesl?nder, Stichtag, Geschlecht/\nAltersjahre/Familienstand, L?ndergruppierungen/\nStaatsangeh?rigkeit", - "Time": "31.12.2007 - 31.12.2021" - }, - { - "Code": "12531-0022", - "Content": "Schutzsuchende: Bundesl?nder, Stichtag, Geschlecht,\nAltersjahre, L?ndergruppierungen/Staatsangeh?rigkeit", - "Time": "31.12.2007 - 31.12.2021" - }, - { - "Code": "12531-0023", - "Content": "Schutzsuchende: Bundesl?nder, Stichtag, Geschlecht,\nAltersjahre, Migrantengeneration, L?ndergruppierungen\n/Staatsangeh?rigkeit", - "Time": "31.12.2007 - 31.12.2021" - }, - { - "Code": "12531-0024", - "Content": "Schutzsuchende: Bundesl?nder, Stichtag, Geschlecht,\nFamilienstand, L?ndergruppierungen/Staatsangeh?rigkeit", - "Time": "31.12.2007 - 31.12.2021" - }, - { - "Code": "12531-0025", - "Content": "Schutzsuchende: Bundesl?nder, Stichtag, Geschlecht,\nAufenthaltsdauer/Aufenthaltsdauer (Abgrenzung\nEinb?rgerungen), L?ndergruppierungen/Staatsangeh?rigkeit", - "Time": "31.12.2007 - 31.12.2021" - }, - { - "Code": "12531-0026", - "Content": "Schutzsuchende: Bundesl?nder, Stichtag, Geschlecht,\nSchutzstatus/Schutzstatuskategorie, L?ndergruppierungen/\nStaatsangeh?rigkeit", - "Time": "31.12.2007 - 31.12.2021" - }, - { - "Code": "12531-0027", - "Content": "Durchschnittsalter der Schutzsuchenden: Bundesl?nder,\nStichtag, Geschlecht, L?ndergruppierungen/\nStaatsangeh?rigkeit", - "Time": "31.12.2007 - 31.12.2021" - }, - { - "Code": "12531-0028", - "Content": "Durchschnittliche Aufenthaltsdauer der Schutzsuchenden:\nBundesl?nder, Stichtag, Geschlecht, L?ndergruppierungen/\nStaatsangeh?rigkeit", - "Time": "31.12.2007 - 31.12.2021" - }, - { - "Code": "12611-0010", - "Content": "Eheschlie?ungen: Bundesl?nder, Jahre", - "Time": "1990 - 2021" - }, - { - "Code": "12611-0011", - "Content": "Eheschlie?ungen: Bundesl?nder, Monate", - "Time": "Januar 1990 - November 2022" - }, - { - "Code": "12612-0100", - "Content": "Lebendgeborene: Bundesl?nder, Jahre, Geschlecht", - "Time": "1990 - 2021" - }, - { - "Code": "12612-0101", - "Content": "Lebendgeborene: Bundesl?nder, Monate, Geschlecht", - "Time": "Januar 1990 - November 2022" - }, - { - "Code": "12612-0102", - "Content": "Lebendgeborene: Bundesl?nder, Jahre, Familienstand der\nEltern", - "Time": "1991 - 2021" - }, - { - "Code": "12612-0103", - "Content": "Lebendgeborene: Bundesl?nder, Jahre, Staatsangeh?rigkeit des\nKindes und der Eltern", - "Time": "1990 - 2021" - }, - { - "Code": "12612-0104", - "Content": "Zusammengefasste Geburtenziffern (je Frau): Bundesl?nder,\nJahre, Altersgruppen", - "Time": "1991 - 2021" - }, - { - "Code": "12612-0105", - "Content": "Nettoreproduktionsrate: Bundesl?nder, Jahre (bis 2010),\nAltersgruppen", - "Time": "2004 - 2010" - }, - { - "Code": "12612-0106", - "Content": "Totgeborene: Bundesl?nder, Jahre", - "Time": "1990 - 2021" - }, - { - "Code": "12613-0010", - "Content": "Gestorbene: Bundesl?nder, Jahre", - "Time": "1990 - 2021" - }, - { - "Code": "12613-0011", - "Content": "Gestorbene: Bundesl?nder, Jahre, Geschlecht", - "Time": "1990 - 2021" - }, - { - "Code": "12613-0012", - "Content": "Gestorbene: Bundesl?nder, Monate", - "Time": "Januar 1990 - November 2022" - }, - { - "Code": "12613-0013", - "Content": "Gestorbene: Bundesl?nder, Monate, Geschlecht", - "Time": "Januar 1990 - November 2022" - }, - { - "Code": "12621-0004", - "Content": "Durchschnittliche Lebenserwartung bei Geburt\n(Periodensterbetafel): Bundesl?nder, Jahre, Geschlecht", - "Time": "2002/04 - 2019/21" - }, - { - "Code": "12631-0010", - "Content": "Ehescheidungen: Bundesl?nder, Jahre", - "Time": "1990 - 2021" - }, - { - "Code": "12631-0011", - "Content": "Ehescheidungen: Bundesl?nder, Jahre, Ehedauer", - "Time": "1997 - 2021" - }, - { - "Code": "12631-0012", - "Content": "Ehescheidungen: Bundesl?nder, Jahre, Gemeinsame\nminderj?hrige Kinder", - "Time": "1997 - 2021" - }, - { - "Code": "12651-0003", - "Content": "Begr?ndungen von Lebenspartnerschaften: Bundesl?nder, Jahre (bis 2017), Geschlecht", - "Time": "2014 - 2017" - }, - { - "Code": "12661-0002", - "Content": "Aufhebungen von Lebenspartnerschaften: Bundesl?nder, Jahre,\nGeschlecht", - "Time": "2014 - 2021" - }, - { - "Code": "12711-0020", - "Content": "Gesamtwanderungen ?ber die Grenzen der Bundesl?nder: Bundesl?nder, Jahre, Nationalit?t, Geschlecht", - "Time": "2000 - 2021" - }, - { - "Code": "12711-0021", - "Content": "Wanderungen zwischen den Bundesl?ndern: Bundesl?nder, Jahre, Nationalit?t, Geschlecht", - "Time": "2000 - 2021" - }, - { - "Code": "12711-0023", - "Content": "Wanderungen zwischen Deutschland und dem Ausland:\nBundesl?nder, Jahre, Nationalit?t, Geschlecht", - "Time": "2000 - 2021" - }, - { - "Code": "13111-0005", - "Content": "Sozialversicherungspflichtig Besch?ftigte am Arbeitsort:\nBundesl?nder, Stichtag, Geschlecht", - "Time": "31.03.2008 - 30.06.2022" - }, - { - "Code": "13111-0006", - "Content": "Sozialversicherungspflichtig Besch?ftigte am Arbeitsort:\nBundesl?nder, Stichtag, Wirtschaftsabschnitte", - "Time": "31.03.2008 - 30.06.2022" - }, - { - "Code": "13211-0007", - "Content": "Arbeitslose, Arbeitslosenquoten, Gemeldete Arbeitsstellen:\nBundesl?nder, Jahre", - "Time": "1991 - 2022" - }, - { - "Code": "13211-0008", - "Content": "Arbeitslose, Arbeitslosenquoten, Gemeldete Arbeitsstellen:\nBundesl?nder, Monate", - "Time": "Januar 2005 - Februar 2023" - }, - { - "Code": "13211-0009", - "Content": "Arbeitslose: Bundesl?nder, Jahre, Geschlecht", - "Time": "1991 - 2022" - }, - { - "Code": "13211-0010", - "Content": "Arbeitslose: Bundesl?nder, Monate, Geschlecht", - "Time": "Januar 2005 - Februar 2023" - }, - { - "Code": "13211-0011", - "Content": "Arbeitslosenquote aller zivilen Erwerbspersonen:\nBundesl?nder, Jahre, Geschlecht", - "Time": "1991 - 2022" - }, - { - "Code": "13211-0012", - "Content": "Arbeitslosenquote aller zivilen Erwerbspersonen:\nBundesl?nder, Monate, Geschlecht", - "Time": "Januar 2005 - Februar 2023" - }, - { - "Code": "13311-0002", - "Content": "Erwerbst?tige, Arbeitnehmer, Selbst?ndige und mithelfende\nFamilienangeh?rige (im Inland): Bundesl?nder, Jahre,\nWirtschaftszweige", - "Time": "1991 - 2022" - }, - { - "Code": "14111-0003", - "Content": "Wahlberechtigte, W?hler, Wahlbeteiligung, Erststimmen,\nZweitstimmen (Allgemeine Bundestagswahlstatistik):\nBundesl?nder, Stichtag", - "Time": "22.09.2013 - 26.09.2021" - }, - { - "Code": "14111-0004", - "Content": "G?ltige Erststimmen, g?ltige Zweitstimmen (Allgemeine\nBundestagswahlstatistik): Bundesl?nder, Stichtag, Parteien", - "Time": "22.09.2013 - 26.09.2021" - }, - { - "Code": "14121-0004", - "Content": "G?ltige Zweitstimmen (Repr?sentative\nBundestagswahlstatistik): Bundesl?nder, Stichtag, Parteien,\nGeschlecht", - "Time": "22.09.2002 - 26.09.2021" - }, - { - "Code": "14121-0005", - "Content": "G?ltige Zweitstimmen (Repr?sentative\nBundestagswahlstatistik): Bundesl?nder, Stichtag, Parteien,\nAltersgruppen", - "Time": "22.09.2013 - 26.09.2021" - }, - { - "Code": "14121-0006", - "Content": "G?ltige Zweitstimmen (Repr?sentative\nBundestagswahlstatistik): Bundesl?nder, Stichtag, Parteien,\nGeschlecht, Altersgruppen", - "Time": "22.09.2013 - 26.09.2021" - }, - { - "Code": "14211-0002", - "Content": "G?ltige Stimmen (Allgemeine Europawahlstatistik):\nBundesl?nder, Stichtag, Parteien", - "Time": "12.06.1994 - 26.05.2019" - } - ], - "Copyright": "? Statistisches Bundesamt (Destatis), 2023" -} From 41b720f7924cfe83f30b01100c7e5600f50130b0 Mon Sep 17 00:00:00 2001 From: buhly Date: Fri, 5 Jul 2024 12:54:42 +0200 Subject: [PATCH 28/52] fix gen_table gen_jobs --- R/gen_cube.R | 4 +- R/gen_jobs.R | 226 +++++++++++++++++++++++++++++++++++++++ R/gen_list_jobs.R | 79 -------------- R/gen_table.R | 6 +- R/utils_dataprocessing.R | 2 +- R/utils_httr2.R | 98 ++++++++++++----- R/zzz.R | 1 + 7 files changed, 302 insertions(+), 114 deletions(-) create mode 100644 R/gen_jobs.R delete mode 100644 R/gen_list_jobs.R diff --git a/R/gen_cube.R b/R/gen_cube.R index 4b6141e..e290d4b 100644 --- a/R/gen_cube.R +++ b/R/gen_cube.R @@ -52,7 +52,7 @@ gen_cube <- function(name, ...) { #------------------------------------------------------------------------------- gen_cube_ <- function(name, - database = c("genesis","regio"), + database = c("genesis", "regio"), area = c("public", "user"), values = TRUE, metadata = TRUE, @@ -140,7 +140,7 @@ gen_cube_ <- function(name, } else { - stop("Wrong specification of parameter 'database' (must be 'regio' or 'genesis'.", + stop("Wrong specification of parameter 'database' (must be 'regio' or 'genesis').", call. = FALSE) } diff --git a/R/gen_jobs.R b/R/gen_jobs.R new file mode 100644 index 0000000..bb396db --- /dev/null +++ b/R/gen_jobs.R @@ -0,0 +1,226 @@ +#' gen_list_jobs: Explore Current Jobs of Your User Account +#' +#' @description Function to list all current jobs connected to the given user in 'GENESIS' or 'regionalstatistik.de'. Important note: For this function it is also possible to use `searchcriterion`-parameter and `selection`-parameter, making it possible to filter the job list based on 'type','time','status' or 'code'. For more details see `vignette("additional_parameter")`. +#' +#' @param database Character string. Indicator if 'genesis' or 'regionalstatistik.de' database is called. Default option is 'genesis'. +#' @param sortcriterion A string. Indicator if the output should be sorted by 'type','time','status' or 'code'. This is a parameter of the Genesis/Zensus API call itself. The default is 'type'. +#' @param flat Should the function return a list with jobs and metadata or just a flat data.frame? Defaults to FALSE. +#' @param ... Additional parameters for the API call. These parameters are only affecting the Genesis/Zensus call itself, no further processing. For more details see `vignette("additional_parameter")`. +#' +#' @return A list of all current jobs connected to the given user. +#' @export +#' +gen_list_jobs <- function(database = c("genesis", "regio"), + sortcriterion = c("type", "time", "status", "code"), + flat = FALSE, + ...) { + + gen_fun <- test_database_function(database) + + if (!is.character(sortcriterion)) { + + stop("Parameter 'sortcriterion' has to be of type 'character'.", + call. = FALSE) + + } + + sortcriterion <- match.arg(sortcriterion) + + if(!(sortcriterion %in% c("type", "time", "status", "code"))){ + + stop("Parameter 'sortcriterion' has to be 'type', 'time', 'status', or 'code'.", + call. = FALSE) + + } + + #----------------------------------------------------------------------------- + + if(gen_fun == "gen_api"){ + + par_list <- list(endpoint = "catalogue/jobs", + sortcriterion = sortcriterion, + ...) + + } else if (gen_fun == "gen_regio_api") { + + par_list <- list(endpoint = "catalogue/jobs", + sortcriterion = sortcriterion, + ...) + + } + + results_raw <- do.call(gen_fun, par_list) + + results_json <- test_if_json(results_raw) + + #----------------------------------------------------------------------------- + + if (flat == FALSE) { + + res <- list("Output" = tibble::as_tibble(binding_lapply(results_json$List, + characteristics = c("State", + "Code", + "Date", + "Time", + "Content")))) + + attr(res, "Database") <- database[1] + attr(res, "Sortcriterion") <- results_json$Parameter$sortcriterion + attr(res, "Language") <- results_json$Parameter$language + attr(res, "Copyright") <- results_json$Copyright + + return(res) + + } else if (flat == TRUE) { + + res <- tibble::as_tibble(binding_lapply(results_json$List, + characteristics = c("State", + "Code", + "Date", + "Time", + "Content"))) + + return(res) + + } else { + + stop("Misspecification of the parameter 'flat': Only TRUE or FALSE allowed.", + call. = FALSE) + + } + +} + +#------------------------------------------------------------------------------- + +#' gen_download_job +#' +#' @param name The job code retrieved by using gen_list_jobs() +#' @param database The database where the job has been generated ('genesis' or 'regio') +#' @param area The area in which the table is stored +#' @param compress Should empty rows and columns be discarded? +#' @param language Search terms, returned messages and data descriptions in German ('de') or English ('en') +#' @param all_character Boolean. Should all variables be imported as +#' 'character' variables? Avoids fuzzy data type conversions if there are +#' leading zeros or other special characters. Defaults to TRUE. +#' +#' @return Returns a data.frame with the table content +#' @export +#' +#' @examples +#' #' \dontrun{ +#' gen_download_job("21311-00-01-1_123456789", "regio") +#' } +#' +gen_download_job <- function(name, + database = c("genesis", "regio"), + area = c("all", "public", "user"), + compress = FALSE, + language = Sys.getenv("GENESIS_LANG"), + all_character = TRUE) { + + #----------------------------------------------------------------------------- + + database <- match.arg(database) + + area <- match.arg(area) + + if (!isTRUE(language == "en")) { + + area <- switch(area, + all = "all", + public = "\u00F6ffentlich", + user = "benutzer") + + } + + #----------------------------------------------------------------------------- + # Short parameter processing of 'all character' for later use in read_delim + + if (isTRUE(all_character)) { + + all_character <- expression(readr::cols(.default = readr::col_character())) + + } else if (isFALSE(all_character)) { + + all_character <- expression(readr::cols()) + + } else { + + stop("Misspecification of parameter 'all_character'. Has to be TRUE or FALSE.", + call. = FALSE) + + } + + #----------------------------------------------------------------------------- + + if (database == "genesis") { + + response <- gen_api("data/resultfile", + name = name, + area = area, + compress = compress, + format = "ffcsv", + language = language) + + response_type <- resp_check_data(response) + + } else if (database == "regio"){ + + response <- gen_regio_api("data/resultfile", + name = name, + area = area, + compress = compress, + format = "ffcsv", + language = language) + + response_type <- resp_check_data(response) + + } else { + + stop("Misspecification of parameter 'database': Can only be 'genesis' or 'regio'.", + call. = FALSE) + + } + + #----------------------------------------------------------------------------- + + if (response_type == "text/csv") { + + if (language == "de") { + + result <- response %>% + httr2::resp_body_string() %>% + readr::read_delim(delim = ";", + show_col_types = FALSE, + locale = readr::locale(decimal_mark = ",", + grouping_mark = "."), + name_repair = "minimal", + col_types = eval(all_character)) + + } else if (language == "en") { + + result <- response %>% + httr2::resp_body_string() %>% + readr::read_delim(delim = ";", + show_col_types = FALSE, + name_repair = "minimal", + col_types = eval(all_character)) + + } else { + + stop("Error handling the parsing of your request (locale not 'de' or 'en').", + call. = FALSE) + + } # End of language check + + #----------------------------------------------------------------------------- + + } else { + + stop("The response type of the job request is invalid (not 'text/csv').\n You might have chosen the wrong database to check for your job.", + call. = FALSE) + + } # End of response type check + +} diff --git a/R/gen_list_jobs.R b/R/gen_list_jobs.R deleted file mode 100644 index 23e6c8c..0000000 --- a/R/gen_list_jobs.R +++ /dev/null @@ -1,79 +0,0 @@ -#' gen_list_jobs: Explore Current Jobs of Your User Account -#' -#' @description Function to list all current jobs connected to the given user in Genesis or Zensus. Important note: For this function it is also possible to use `searchcriterion`-parameter and `selection`-parameter, making it possible to filter the job list based on 'type','time','status' or 'code'. For more details see `vignette("additional_parameter")`. -#' -#' @param database Character string. Indicator if the Genesis or Zensus database is called. Default option is 'genesis'. -#' @param sortcriterion A string. Indicator if the output should be sorted by 'type','time','status' or 'code'. This is a parameter of the Genesis/Zensus API call itself. The default is 'type'. -#' @param ... Additional parameters for the Genesis/Zensus API call. These parameters are only affecting the Genesis/Zensus call itself, no further processing. For more details see `vignette("additional_parameter")`. -#' -#' @return A list of all current jobs connected to the given user. -#' @export -#' -gen_list_jobs <- function(sortcriterion = c("type", "time", "status", "code"), - database = c("genesis", "zensus", "regio"), - ...) { - - gen_fun <- test_database_function(database) - - if (!is.character(sortcriterion)) { - stop("Parameter 'sortcriterion' has to be of type 'character'.", - call. = FALSE - ) - } - - sortcriterion <- match.arg(sortcriterion) - - if(! sortcriterion %in% c("type", "time", "status", "code")){ - stop("Parameter 'sortcriterion' has to be 'type', 'time', 'status', or 'code'.", - call. = FALSE - ) - } - - #----------------------------------------------------------------------------- - - if(gen_fun == "gen_api"){ - - par_list <- list( - endpoint = "catalogue/jobs", - sortcriterion = sortcriterion, - ... - ) - - } else if (gen_fun == "gen_zensus_api"){ - - par_list <- list( - endpoint = "catalogue/jobs", - sortcriterion = sortcriterion, - ... - ) - - } else if (gen_fun == "gen_regio_api") { - - par_list <- list( - endpoint = "catalogue/jobs", - sortcriterion = sortcriterion, - ... - ) - - } - - results_raw <- do.call(gen_fun, par_list) - - results_json <- test_if_json(results_raw) - - res <- list("Output" = tibble::as_tibble(binding_lapply(results_json$List, - characteristics = c("State", - "Code", - "Date", - "Time", - "Content")))) - - - attr(res, "Database") <- database[1] - attr(res, "Sortcriterion") <- results_json$Parameter$sortcriterion - attr(res, "Language") <- results_json$Parameter$language - attr(res, "Copyright") <- results_json$Copyright - - return(res) - -} diff --git a/R/gen_table.R b/R/gen_table.R index 3d78824..dcb763c 100644 --- a/R/gen_table.R +++ b/R/gen_table.R @@ -146,7 +146,7 @@ gen_table_ <- function(name, stand = stand, language = language, format = "ffcsv", - job = FALSE) + job = job) #----------------------------------------------------------------------------- @@ -170,7 +170,7 @@ gen_table_ <- function(name, stand = stand, language = language, format = "ffcsv", - job = FALSE) + job = job) #----------------------------------------------------------------------------- @@ -184,7 +184,7 @@ gen_table_ <- function(name, #----------------------------------------------------------------------------- # Data processing - response_type <- resp_check_data_csv(response) + response_type <- resp_check_data(response) # Returning the table desired by the user return(return_table_object(response = response, diff --git a/R/utils_dataprocessing.R b/R/utils_dataprocessing.R index 858e458..70a54c8 100644 --- a/R/utils_dataprocessing.R +++ b/R/utils_dataprocessing.R @@ -1011,7 +1011,7 @@ test_database_function <- function(input){ if(is.na(input)){ - stop("Database parameter must be either 'genesis', 'regio' or 'zensus'.", + stop("You have to correctly specifiy a 'database' parameter. Please refer to the documentation for further information.", call. = FALSE) } diff --git a/R/utils_httr2.R b/R/utils_httr2.R index 5b06175..6602d72 100644 --- a/R/utils_httr2.R +++ b/R/utils_httr2.R @@ -2,24 +2,6 @@ # Util functions related to API calls #------------------------------------------------------------------------------- -#' resp_check_data_csv -#' -#' @param resp Response object -#' -resp_check_data_csv <- function(resp) { - - if (!(httr2::resp_content_type(resp) %in% c("text/csv", "application/zip"))) { - - stop("No data found that meets the specified parameters", call. = FALSE) - - } - - return <- httr2::resp_content_type(resp) - -} - -#------------------------------------------------------------------------------- - #' test_if_json #' #' @param input Response object @@ -199,11 +181,31 @@ test_if_error_light <- function(input) { #------------------------------------------------------------------------------- +#' resp_check_data +#' +#' @param resp Response object +#' +resp_check_data <- function(resp) { + + if (!(httr2::resp_content_type(resp) %in% c("application/zip", "text/csv", "application/json"))) { + + stop("Encountered an invalid response type.", + call. = FALSE) + + } + + return <- httr2::resp_content_type(resp) + +} + +#------------------------------------------------------------------------------- + #' return_table_object #' -#' @param response -#' @param response_type -#' @param language +#' @param response Response object +#' @param response_type Response type +#' @param language Language locale +#' @param all_character Read all variables as character? #' return_table_object <- function(response, response_type, @@ -228,9 +230,40 @@ return_table_object <- function(response, } - #------------------------------------------------------------------------------- + #----------------------------------------------------------------------------- + + if (response_type == "application/json") { + + response_parsed <- httr2::resp_body_json(response) + + if (response_parsed$Status$Code == 98) { + + error_message <- paste0("You have requested a table too big for simple download. \n", + "Consider making a range of smaller requests or use the \n", + "option to create a job by setting the 'job' parameter \n", + "of 'gen_table()' to TRUE. You can then download the job \n", + "later (use the function 'gen_list_jobs()' to check its status).") + + stop(error_message, call. = FALSE) + + } else if (response_parsed$Status$Code == 99) { + + message <- paste0("You have requested successfully created a job with \n", + "your request. Use the function 'gen_list_jobs()' ", + "to check its status and download it once completed.") + + message(message) + + } else { + + stop("There has been an error with your request (not parseable response type 'application/json').\n Please try again later or contact the package maintainer.", + call. = FALSE) + + } + + #----------------------------------------------------------------------------- - if (response_type == "text/csv"){ + } else if (response_type == "text/csv"){ # There has to be a check on language to display correct decimal marks # For German results, there needs to be a decimal mark set @@ -257,18 +290,18 @@ return_table_object <- function(response, } else { - stop("Error handling language setting locale (values different from 'de' and 'en'.", + stop("Error handling language setting locale (values different from 'de' and 'en').", call. = FALSE) } - } + return(result) - #------------------------------------------------------------------------------- + #----------------------------------------------------------------------------- # If the API response is a ZIP file, we need to temporarily save it - if (response_type == "application/zip") { + } else if (response_type == "application/zip") { content <- httr2::resp_body_raw(response) @@ -325,9 +358,16 @@ return_table_object <- function(response, # Remove temporarily created .csv file from temporary directory file.remove(extracted_file) - } + return(result) + + #----------------------------------------------------------------------------- + + } else { + + stop("Unknown API response type. Please refer to the package maintainers.", + call. = FALSE) - return(result) + } # End of check application/json, application/zip, text/csv } diff --git a/R/zzz.R b/R/zzz.R index bb50cb4..5b61aff 100644 --- a/R/zzz.R +++ b/R/zzz.R @@ -1,4 +1,5 @@ .onLoad <- function(libname, pkgname) { + gen_api <<- memoise::memoise(gen_api) gen_zensus_api <<- memoise::memoise(gen_zensus_api) gen_regio_api <<- memoise::memoise(gen_regio_api) From c67f5e17c83080a4e207494c4d22d5b29e3bf1a6 Mon Sep 17 00:00:00 2001 From: KovaZo Date: Sat, 6 Jul 2024 00:10:58 +0200 Subject: [PATCH 29/52] Updates Zoran before testing --- NAMESPACE | 8 +- R/gen_alternative_terms.R | 14 +- R/gen_catalogue.R | 18 ++- R/gen_find.R | 40 +++--- R/gen_meta_data.R | 202 ++++++++++++++++++++++------- R/gen_modified_data.R | 14 +- R/gen_objects2stat.R | 18 ++- R/gen_objects2var.R | 18 ++- R/gen_update_EVAS.R | 7 - R/gen_var2-val2.R | 96 ++++++++++---- R/utils_dataprocessing.R | 266 +++++++++++++++++++++++--------------- R/utils_httr2.R | 28 ++-- 12 files changed, 492 insertions(+), 237 deletions(-) diff --git a/NAMESPACE b/NAMESPACE index 8e6e8ff..4435bfb 100644 --- a/NAMESPACE +++ b/NAMESPACE @@ -8,10 +8,10 @@ export(gen_find) export(gen_list_jobs) export(gen_metadata) export(gen_metadata_cube) -export(gen_metadata_stats) -export(gen_metadata_tab) -export(gen_metadata_val) -export(gen_metadata_var) +export(gen_metadata_statistic) +export(gen_metadata_table) +export(gen_metadata_value) +export(gen_metadata_variable) export(gen_modified_data) export(gen_objects2stat) export(gen_objects2var) diff --git a/R/gen_alternative_terms.R b/R/gen_alternative_terms.R index d272d40..c2d38e1 100644 --- a/R/gen_alternative_terms.R +++ b/R/gen_alternative_terms.R @@ -5,6 +5,7 @@ #' @param term Character string. Maximum length of 15 characters. Term or word for which you are searching for alternative or related terms. Use of '*' as a placeholder is possible to generate broader search areas. #' @param similarity Logical. Indicator if the output of the function should be sorted based on a Levenshtein edit distance based on the \code{adist()} function. Default option is 'TRUE'. #' @param database Character string. Indicator if the Genesis or Zensus database is called. Only one database can be addressed per function call. Default option is 'genesis'. +#' @param verbose Logical. Indicator if the output of the function should include detailed messages and warnings. Default option is 'TRUE'. Set the parameter to 'FALSE' to suppress additional messages and warnings. #' @param ... Additional parameters for the Genesis or Zensus API call. These parameters are only affecting the call itself, no further processing. For more details see `vignette("additional_parameter")`. #' #' @return A list with all recalled elements from Genesis/Zensus/Regionalstatistik. Attributes are added to the data.frame, describing the search configuration for the returned output. @@ -26,6 +27,7 @@ gen_alternative_terms <- function(term = NULL, similarity = TRUE, database = c("all", "genesis", "zensus", "regio"), + verbose = TRUE, ...) { caller <- as.character(match.call()[1]) @@ -34,12 +36,18 @@ gen_alternative_terms <- function(term = NULL, check_function_input(term = term, similarity = similarity, - caller = caller) + caller = caller, + verbose = verbose) #----------------------------------------------------------------------------- res <- lapply(gen_fun, function(db){ + if(verbose) { + info <- paste("Started the processing of", rev_database_function(db), "database.") + message(info) + } + par_list <- list( endpoint = "catalogue/terms", username = gen_auth_get(database = rev_database_function(db))$username, @@ -62,8 +70,6 @@ gen_alternative_terms <- function(term = NULL, list_resp <- list("Output" = termslist) - return(list_resp) - } else { # similarity von Woertern berechnen und nach diesen Ordnen? @@ -98,7 +104,6 @@ gen_alternative_terms <- function(term = NULL, list_resp <- list("Output" = termslist) - return(list_resp) } @@ -108,6 +113,7 @@ gen_alternative_terms <- function(term = NULL, attr(list_resp, "Pagelength") <- results_json$Parameter$pagelength attr(list_resp, "Copyright") <- results_json$Copyright + return(list_resp) }) res <- check_results(res) diff --git a/R/gen_catalogue.R b/R/gen_catalogue.R index 6cbab9e..b16fd57 100644 --- a/R/gen_catalogue.R +++ b/R/gen_catalogue.R @@ -9,6 +9,7 @@ #' @param detailed A logical. Indicator if the function should return the detailed output of the iteration including all object-related information or only a shortened output including only code and object title. Default option is 'FALSE'. #' @param error.ignore A logical. Indicator if the function should stop if an error occurs or no object for the request is found or if it should produce a token as response. Default option is 'FALSE'. #' @param sortcriterion A string. Indicator if the output should be sorted by 'code' or 'content'. This is a parameter of the Genesis/Zensus API call itself. The default is "code". +#' @param verbose Logical. Indicator if the output of the function should include detailed messages and warnings. Default option is 'TRUE'. Set the parameter to 'FALSE' to suppress additional messages and warnings. #' @param ... Additional parameters for the Genesis/Zensus API call. These parameters are only affecting the Genesis/Zensus call itself, no further processing. For more details see `vignette("additional_parameter")`. #' #' @return A list with all recalled elements from Genesis/Zensus API. Based on the detailed-parameter it contains more or less information, but always includes the code of the object, the title, and the type of the object. This is done to facilitate further processing with the data. Attributes are added to the dataframe describing the search configuration for the returned output. @@ -33,6 +34,7 @@ gen_catalogue <- function(code = NULL, detailed = FALSE, error.ignore = FALSE, sortcriterion = c("code", "content"), + verbose = TRUE, ...) { caller <- as.character(match.call()[1]) @@ -45,7 +47,8 @@ gen_catalogue <- function(code = NULL, error.ignore = error.ignore, database = gen_fun, sortcriterion = sortcriterion, - caller = caller) + caller = caller, + verbose = verbose) area <- match.arg(area) @@ -58,6 +61,11 @@ gen_catalogue <- function(code = NULL, # Processing #### res <- lapply(gen_fun, function(db){ + if(verbose) { + info <- paste("Started the processing of", rev_database_function(db), "database.") + message(info) + } + #--------------------------------------------------------------------------- if ("cubes" %in% category && db == "gen_zensus_api") { @@ -77,7 +85,7 @@ gen_catalogue <- function(code = NULL, results_json <- test_if_json(results_raw) - empty_object <- test_if_error(results_json, para = error.ignore) + empty_object <- test_if_error(results_json, para = error.ignore, verbose = verbose) if(isTRUE(empty_object)){ @@ -132,7 +140,7 @@ gen_catalogue <- function(code = NULL, results_json <- test_if_json(results_raw) - empty_object <- test_if_error(results_json, para = error.ignore) + empty_object <- test_if_error(results_json, para = error.ignore, verbose = verbose) if(isTRUE(empty_object)){ @@ -187,7 +195,7 @@ gen_catalogue <- function(code = NULL, results_json <- test_if_json(results_raw) - empty_object <- test_if_error(results_json, para = error.ignore) + empty_object <- test_if_error(results_json, para = error.ignore, verbose = verbose) if(isTRUE(empty_object)){ @@ -229,7 +237,7 @@ gen_catalogue <- function(code = NULL, if (all(c("tables", "statistics", "cubes") %in% category)) { list_resp <- list( - "Cubes" = if(length(list_of_cubes) == 1 | db == "gen_zensus_api"){list_of_cubes} else {forming_evas(list_of_cubes)}, + "Cubes" = if(length(list_of_cubes) == 1 | db == "gen_zensus_api"){tibble::as_tibble(list_of_cubes)} else {forming_evas(list_of_cubes)}, "Statistics" = if(length(list_of.stats) == 1 | db == "gen_zensus_api"){tibble::as_tibble(list_of.stats)} else {forming_evas(list_of.stats)}, "Tables" = if(length(list_of.tabs) == 1 | db == "gen_zensus_api"){tibble::as_tibble(list_of.tabs)} else {forming_evas(list_of.tabs)} ) diff --git a/R/gen_find.R b/R/gen_find.R index c1f1dad..f6567a5 100644 --- a/R/gen_find.R +++ b/R/gen_find.R @@ -10,6 +10,7 @@ #' @param detailed A logical. Indicator if the function should return the detailed output of the iteration including all object related information or only a shortened output including only code and object title. Default Option is 'FALSE'. #' @param ordering A logical. Indicator if the function should return the output of the iteration ordered first based on the fact if the searched term is appearing in the title of the object and secondly on an estimator of the number of variables in this object. Default option is 'TRUE'. #' @param error.ignore A logical. Indicator if the function should stop if an error occurs or no object for the request is found or if it should produce an artificial response (e.g., for complex processes not to fail). Default option is 'FALSE'. +#' @param verbose Logical. Indicator if the output of the function should include detailed messages and warnings. Default option is 'TRUE'. Set the parameter to 'FALSE' to suppress additional messages and warnings. #' @param ... Additional parameters for the Genesis/Zensus API call. These parameters are only affecting the Genesis/Zensus call itself, no further processing. For more details see `vignette("additional_parameter")`. #' #' @return A list with all elements retrieved from Genesis/Zensus. Attributes are added to the data.frame describing the search configuration for the returned output. @@ -36,6 +37,7 @@ gen_find <- function(term = NULL, detailed = FALSE, ordering = TRUE, error.ignore = FALSE, + verbose = TRUE, ...) { caller <- as.character(match.call()[1]) @@ -48,7 +50,8 @@ gen_find <- function(term = NULL, ordering = ordering, error.ignore = error.ignore, database = gen_fun, - caller = caller) + caller = caller, + verbose = verbose) category <- match.arg(category) @@ -56,7 +59,10 @@ gen_find <- function(term = NULL, res <- lapply(gen_fun, function(db){ - browser() + if(verbose) { + info <- paste("Started the processing of", rev_database_function(db), "database.") + message(info) + } #--------------------------------------------------------------------------- if(db == "gen_zensus_api" & category == "cubes"){ @@ -78,9 +84,9 @@ gen_find <- function(term = NULL, results_json <- test_if_json(results_raw) - empty_object <- test_if_error_find(results_json, para = error.ignore) + empty_object <- test_if_error_find(results_json, para = error.ignore, verbose = verbose) - empty_object <- test_if_process_further(results_json, para = error.ignore) + empty_object <- test_if_process_further(results_json, para = error.ignore, verbose = verbose) } @@ -90,7 +96,7 @@ gen_find <- function(term = NULL, list_resp <- list("Output" = "No object found for your request.") attr(list_resp, "Term") <- results_json$Parameter$term - attr(list_resp, "Database") <- database[1] + attr(list_resp, "Database") <- rev_database_function(db) attr(list_resp, "Language") <- results_json$Parameter$language attr(list_resp, "Pagelength") <- results_json$Parameter$pagelength attr(list_resp, "Copyright") <- results_json$Copyright @@ -99,10 +105,10 @@ gen_find <- function(term = NULL, } else if(isTRUE(empty_object) & db == "gen_zensus_api" ){ - list_resp <- list("Output" = "No cubes at all avalaible in 'zensus'-database.") + list_resp <- list("Output" = "No object found for your request. No cubes at all avalaible in 'zensus'-database.") attr(list_resp, "Term") <- term - attr(list_resp, "Database") <- database[1] + attr(list_resp, "Database") <- rev_database_function(db) attr(list_resp, "Category") <- category return(list_resp) @@ -113,7 +119,7 @@ gen_find <- function(term = NULL, list_resp <- list("Output" = results_json$Status$Content) attr(list_resp, "Term") <- results_json$Parameter$term - attr(list_resp, "Database") <- database[1] + attr(list_resp, "Database") <- rev_database_function(db) attr(list_resp, "Language") <- results_json$Parameter$language attr(list_resp, "Pagelength") <- results_json$Parameter$pagelength attr(list_resp, "Copyright") <- results_json$Copyright @@ -300,7 +306,7 @@ gen_find <- function(term = NULL, "Cubes" = if(db == "gen_api" | db == "gen_regio_api"){tibble::as_tibble(df_cubes)} else {"No cubes at all avalaible in 'zensus'-database."}) attr(list_resp, "Term") <- results_json$Parameter$term - attr(list_resp, "Database") <- database[1] + attr(list_resp, "Database") <- rev_database_function(db) attr(list_resp, "Language") <- results_json$Parameter$language attr(list_resp, "Pagelength") <- results_json$Parameter$pagelength attr(list_resp, "Copyright") <- results_json$Copyright @@ -354,7 +360,7 @@ gen_find <- function(term = NULL, list_resp <- list("Tables" = tibble::as_tibble(df_table)) attr(list_resp, "Term") <- results_json$Parameter$term - attr(list_resp, "Database") <- database[1] + attr(list_resp, "Database") <- rev_database_function(db) attr(list_resp, "Language") <- results_json$Parameter$language attr(list_resp, "Pagelength") <- results_json$Parameter$pagelength attr(list_resp, "Copyright") <- results_json$Copyright @@ -412,7 +418,7 @@ gen_find <- function(term = NULL, list_resp <- list("Statistics" = tibble::as_tibble(df_stats)) attr(list_resp, "Term") <- results_json$Parameter$term - attr(list_resp, "Database") <- database[1] + attr(list_resp, "Database") <- rev_database_function(db) attr(list_resp, "Language") <- results_json$Parameter$language attr(list_resp, "Pagelength") <- results_json$Parameter$pagelength attr(list_resp, "Copyright") <- results_json$Copyright @@ -473,7 +479,7 @@ gen_find <- function(term = NULL, list_resp <- list("Variables" = tibble::as_tibble(df_variables)) attr(list_resp, "Term") <- results_json$Parameter$term - attr(list_resp, "Database") <- database[1] + attr(list_resp, "Database") <- rev_database_function(db) attr(list_resp, "Language") <- results_json$Parameter$language attr(list_resp, "Pagelength") <- results_json$Parameter$pagelength attr(list_resp, "Copyright") <- results_json$Copyright @@ -540,7 +546,7 @@ gen_find <- function(term = NULL, list_resp <- list("Cubes" = tibble::as_tibble(df_cubes)) attr(list_resp, "Term") <- results_json$Parameter$term - attr(list_resp, "Database") <- database[1] + attr(list_resp, "Database") <- rev_database_function(db) attr(list_resp, "Language") <- results_json$Parameter$language attr(list_resp, "Pagelength") <- results_json$Parameter$pagelength attr(list_resp, "Copyright") <- results_json$Copyright @@ -682,7 +688,7 @@ gen_find <- function(term = NULL, "Cubes" = if(db == "gen_api" | db == "gen_regio_api"){tibble::as_tibble(df_cubes)} else {"No cubes at all avalaible in 'zensus'-database."}) attr(list_resp, "Term") <- results_json$Parameter$term - attr(list_resp, "Database") <- database[1] + attr(list_resp, "Database") <- rev_database_function(db) attr(list_resp, "Language") <- results_json$Parameter$language attr(list_resp, "Pagelength") <- results_json$Parameter$pagelength attr(list_resp, "Copyright") <- results_json$Copyright @@ -730,7 +736,7 @@ gen_find <- function(term = NULL, list_resp <- list("Tables" = tibble::as_tibble(df_table)) attr(list_resp, "Term") <- results_json$Parameter$term - attr(list_resp, "Database") <- database[1] + attr(list_resp, "Database") <- rev_database_function(db) attr(list_resp, "Language") <- results_json$Parameter$language attr(list_resp, "Pagelength") <- results_json$Parameter$pagelength attr(list_resp, "Copyright") <- results_json$Copyright @@ -775,7 +781,7 @@ gen_find <- function(term = NULL, list_resp <- list("Statistics" = tibble::as_tibble(df_stats)) attr(list_resp, "Term") <- results_json$Parameter$term - attr(list_resp, "Database") <- database[1] + attr(list_resp, "Database") <- rev_database_function(db) attr(list_resp, "Language") <- results_json$Parameter$language attr(list_resp, "Pagelength") <- results_json$Parameter$pagelength attr(list_resp, "Copyright") <- results_json$Copyright @@ -824,7 +830,7 @@ gen_find <- function(term = NULL, list_resp <- list("Variables" = tibble::as_tibble(df_variables)) attr(list_resp, "Term") <- results_json$Parameter$term - attr(list_resp, "Database") <- database[1] + attr(list_resp, "Database") <- rev_database_function(db) attr(list_resp, "Language") <- results_json$Parameter$language attr(list_resp, "Pagelength") <- results_json$Parameter$pagelength attr(list_resp, "Copyright") <- results_json$Copyright diff --git a/R/gen_meta_data.R b/R/gen_meta_data.R index 567ecb0..ddccb5b 100644 --- a/R/gen_meta_data.R +++ b/R/gen_meta_data.R @@ -1,4 +1,4 @@ -#' gen_metadata_stat +#' gen_metadata_statistic #' #' @description Function to search for meta-information for a specific statistic. #' @@ -6,6 +6,7 @@ #' @param database Character string. Indicator if the Genesis or Zensus database is called. Only one database can be addressed per function call. Default option is 'genesis'. #' @param area A string. Indicator from which area of the database the results are called. In general, "all" is the appropriate solution. Default option is 'all'. Only used for Genesis. #' @param error.ignore A logical. Indicator if the function should stop if an error occurs or no object for the request is found or if it should produce a token as response. Default option is 'FALSE'. +#' @param verbose Logical. Indicator if the output of the function should include detailed messages and warnings. Default option is 'TRUE'. Set the parameter to 'FALSE' to suppress additional messages and warnings. #' @param ... Additional parameters for the Genesis/Zensus API call. These parameters are only affecting the Genesis/Zensus call itself, no further processing. For more details see `vignette("additional_parameter")`. #' #' @return A list with all recalled elements from Genesis/Zensus. Attributes are added to the dataframe describing the search configuration for the returned output. @@ -17,10 +18,12 @@ #' object <- gen_metadata_stats(code = "12411") #' } #' -gen_metadata_stats <- function(code = NULL, +gen_metadata_statistic <- function(code = NULL, database = c("all", "genesis", "zensus", "regio"), area = c("all", "public", "user"), error.ignore = FALSE, + verbose = TRUE, + raw = FALSE, ...) { caller <- as.character(match.call()[1]) @@ -30,7 +33,9 @@ gen_metadata_stats <- function(code = NULL, check_function_input(code = code, error.ignore = error.ignore, database = gen_fun, - caller = caller) + caller = caller, + verbose = verbose, + raw = raw) area <- match.arg(area) @@ -40,6 +45,11 @@ gen_metadata_stats <- function(code = NULL, res <- lapply(gen_fun, function(db){ + if(verbose) { + info <- paste("Started the processing of", rev_database_function(db), "database.") + message(info) + } + par_list <- list( endpoint = "metadata/statistic", username = gen_auth_get(database = rev_database_function(db))$username, @@ -56,7 +66,7 @@ gen_metadata_stats <- function(code = NULL, results_json <- test_if_json(results_raw) - empty_object <- test_if_error(results_json, para = error.ignore) + empty_object <- test_if_error(results_json, para = error.ignore, verbose = verbose) #--------------------------------------------------------------------------- if(isTRUE(empty_object)){ @@ -69,7 +79,8 @@ gen_metadata_stats <- function(code = NULL, } else if(empty_object == "DONE"){ - df_stats <- c("Code" = results_json$Object$Code, + if(isFALSE(raw)){ + df_stats <-cbind("Code" = results_json$Object$Code, "Content" = results_json$Object$Content, "Cubes" = results_json$Object$Cubes, "Variables" = results_json$Object$Variables, @@ -77,6 +88,9 @@ gen_metadata_stats <- function(code = NULL, "Time_from" = results_json$Object$Frequency[[1]]$From, "Time_to" = results_json$Object$Frequency[[1]]$To, "Time_type" = results_json$Object$Frequency[[1]]$Type) + } else { + df_stats <- results_json$Object + } } attr(df_stats, "Code") <- results_json$Parameter$name @@ -98,7 +112,7 @@ gen_metadata_stats <- function(code = NULL, } -#' gen_metadata_var +#' gen_metadata_variable #' #' @description Function to search for meta-information for a specific variable. #' @@ -106,6 +120,7 @@ gen_metadata_stats <- function(code = NULL, #' @param database Character string. Indicator if the Genesis or Zensus database is called. Only one database can be addressed per function call. Default option is 'genesis'. #' @param area A string. Indicator from which area of the database the results are called. In general, "all" is the appropriate solution. Default option is 'all'. Only used for Genesis. #' @param error.ignore A logical. Indicator if the function should stop if an error occurs or no object for the request is found or if it should produce a token as response. Default option is 'FALSE'. +#' @param verbose Logical. Indicator if the output of the function should include detailed messages and warnings. Default option is 'TRUE'. Set the parameter to 'FALSE' to suppress additional messages and warnings. #' @param ... Additional parameters for the Genesis/Zensus API call. These parameters are only affecting the Genesis/Zensus call itself, no further processing. For more details see `vignette("additional_parameter")`. #' #' @return A list with all recalled elements from Genesis/Zensus. Attributes are added to the dataframe describing the search configuration for the returned output. @@ -117,10 +132,12 @@ gen_metadata_stats <- function(code = NULL, #' object <- gen_metadata_var(code = "FAMSTD") #' } #' -gen_metadata_var <- function(code = NULL, +gen_metadata_variable <- function(code = NULL, database = c("all", "genesis", "zensus", "regio"), area = c("all", "public", "user"), error.ignore = FALSE, + verbose = TRUE, + raw = FALSE, ...) { caller <- as.character(match.call()[1]) @@ -130,7 +147,9 @@ gen_metadata_var <- function(code = NULL, check_function_input(code = code, error.ignore = error.ignore, database = gen_fun, - caller = caller) + caller = caller, + verbose = verbose, + raw = raw) area <- match.arg(area) @@ -140,6 +159,11 @@ gen_metadata_var <- function(code = NULL, res <- lapply(gen_fun, function(db){ + if(verbose) { + info <- paste("Started the processing of", rev_database_function(db), "database.") + message(info) + } + par_list <- list( endpoint = "metadata/variable", username = gen_auth_get(database = rev_database_function(db))$username, @@ -156,7 +180,7 @@ gen_metadata_var <- function(code = NULL, results_json <- test_if_json(results_raw) - empty_object <- test_if_error(results_json, para = error.ignore) + empty_object <- test_if_error(results_json, para = error.ignore, verbose = verbose) #--------------------------------------------------------------------------- if(isTRUE(empty_object)){ @@ -169,16 +193,23 @@ gen_metadata_var <- function(code = NULL, } else if(empty_object == "DONE"){ - df_var <- c("Code" = results_json$Object$Code, + if(isFALSE(raw)){ + + df_var <-cbind("Code" = results_json$Object$Code, "Content" = results_json$Object$Content, "Values" = results_json$Object$Values, "Type" = results_json$Object$Type, "Validity_from" = results_json$Object$Validity$From, "Validity_to" = results_json$Object$Validity$To) + } } - list_resp <- list("General" = df_var, + if(isFALSE(raw)){ + list_resp <- list("General" = df_var, "Information" = results_json$Object$Information) + } else { + list_resp <- results_json$Object + } attr(list_resp, "Code") <- results_json$Parameter$name attr(list_resp, "Database") <- rev_database_function(db) @@ -201,7 +232,7 @@ gen_metadata_var <- function(code = NULL, #------------------------------------------------------------------------------- -#' gen_metadata_val +#' gen_metadata_value #' #' @description Function to search for meta-information for a specific value. #' @@ -209,6 +240,7 @@ gen_metadata_var <- function(code = NULL, #' @param database Character string. Indicator if the Genesis or Zensus database is called. Only one database can be addressed per function call. Default option is 'genesis'. #' @param area A string. Indicator from which area of the database the results are called. In general, "all" is the appropriate solution. Default option is 'all'. Only used for Genesis. #' @param error.ignore A logical. Indicator if the function should stop if an error occurs or no object for the request is found or if it should produce a token as response. Default option is 'FALSE'. +#' @param verbose Logical. Indicator if the output of the function should include detailed messages and warnings. Default option is 'TRUE'. Set the parameter to 'FALSE' to suppress additional messages and warnings. #' @param ... Additional parameters for the Genesis/Zensus API call. These parameters are only affecting the Genesis/Zensus call itself, no further processing. For more details see `vignette("additional_parameter")`. #' #' @return A list with all recalled elements from Genesis/Zensus. Attributes are added to the dataframe describing the search configuration for the returned output. @@ -220,10 +252,12 @@ gen_metadata_var <- function(code = NULL, #' object <- gen_metadata_val(code = "LEDIG") #' } #' -gen_metadata_val <- function(code = NULL, +gen_metadata_value <- function(code = NULL, database = c("all", "genesis", "zensus", "regio"), area = c("all", "public", "user"), error.ignore = FALSE, + verbose = TRUE, + raw = FALSE, ...) { caller <- as.character(match.call()[1]) @@ -233,7 +267,9 @@ gen_metadata_val <- function(code = NULL, check_function_input(code = code, error.ignore = error.ignore, database = gen_fun, - caller = caller) + caller = caller, + verbose = verbose, + raw = raw) area <- match.arg(area) @@ -243,6 +279,11 @@ gen_metadata_val <- function(code = NULL, res <- lapply(gen_fun, function(db){ + if(verbose) { + info <- paste("Started the processing of", rev_database_function(db), "database.") + message(info) + } + par_list <- list( endpoint = "metadata/value", username = gen_auth_get(database = rev_database_function(db))$username, @@ -259,7 +300,7 @@ gen_metadata_val <- function(code = NULL, results_json <- test_if_json(results_raw) - empty_object <- test_if_error(results_json, para = error.ignore) + empty_object <- test_if_error(results_json, para = error.ignore, verbose = verbose) #--------------------------------------------------------------------------- if(isTRUE(empty_object)){ @@ -272,16 +313,23 @@ gen_metadata_val <- function(code = NULL, } else if(empty_object == "DONE"){ - df_value <- c("Code" = results_json$Object$Code, + if(isFALSE(raw)){ + + df_value <-cbind("Code" = results_json$Object$Code, "Content" = results_json$Object$Content, "Variables" = results_json$Object$Variables) + } } - list_resp <- list("General" = df_value, + if(isFALSE(raw)){ + list_resp <- list("General" = df_value, "Information" = results_json$Object$Information) + } else { + list_resp <- results_json$Object + } attr(list_resp, "Code") <- results_json$Parameter$name - attr(list_resp, "Database") <- database[1] + attr(list_resp, "Database") <- rev_database_function(db) attr(list_resp, "Method") <- results_json$Ident$Method attr(list_resp, "Updated") <- results_json$Object$Updated attr(list_resp, "Language") <- results_json$Parameter$language @@ -301,7 +349,7 @@ gen_metadata_val <- function(code = NULL, #------------------------------------------------------------------------------- -#' gen_metadata_tab +#' gen_metadata_table #' #' @description Function to search for meta-information for a specific table. #' @@ -309,6 +357,8 @@ gen_metadata_val <- function(code = NULL, #' @param database Character string. Indicator if the Genesis or Zensus database is called. Only one database can be addressed per function call. Default option is 'genesis'. #' @param area A string. Indicator from which area of the database the results are called. In general, "all" is the appropriate solution. Default option is 'all'. Used for both databases. #' @param error.ignore A logical. Indicator if the function should stop if an error occurs or no object for the request is found or if it should produce a token as response. Default option is 'FALSE'. +#' @param raw Logical. Indicator if the output of the function should be per default transformed into a more readable structure - simplifying some information to a significant level. Default option is 'TRUE'. Set the parameter to 'FALSE' to return as output the raw output. +#' @param verbose Logical. Indicator if the output of the function should include detailed messages and warnings. Default option is 'TRUE'. Set the parameter to 'FALSE' to suppress additional messages and warnings. #' @param ... Additional parameters for the Genesis/Zensus API call. These parameters are only affecting the Genesis/Zensus call itself, no further processing. For more details see `vignette("additional_parameter")`. #' #' @return A list with all recalled elements from Genesis/Zensus. Attributes are added to the dataframe describing the search configuration for the returned output. @@ -320,10 +370,12 @@ gen_metadata_val <- function(code = NULL, #' object <- gen_metadata_tab(code = "11111") #' } #' -gen_metadata_tab <- function(code = NULL, +gen_metadata_table <- function(code = NULL, database = c("all", "genesis", "zensus", "regio"), area = c("all", "public", "user"), error.ignore = FALSE, + verbose = TRUE, + raw = FALSE, ...) { caller <- as.character(match.call()[1]) @@ -333,7 +385,9 @@ gen_metadata_tab <- function(code = NULL, check_function_input(code = code, error.ignore = error.ignore, database = gen_fun, - caller = caller) + caller = caller, + verbose = verbose, + raw = raw) area <- match.arg(area) @@ -343,6 +397,11 @@ gen_metadata_tab <- function(code = NULL, res <- lapply(gen_fun, function(db){ + if(verbose) { + info <- paste("Started the processing of", rev_database_function(db), "database.") + message(info) + } + par_list <- list( endpoint = "metadata/table", username = gen_auth_get(database = rev_database_function(db))$username, @@ -356,7 +415,7 @@ gen_metadata_tab <- function(code = NULL, results_json <- test_if_json(results_raw) - empty_object <- test_if_error(results_json, para = error.ignore) + empty_object <- test_if_error(results_json, para = error.ignore, verbose = verbose) #--------------------------------------------------------------------------- if(isTRUE(empty_object)){ @@ -373,7 +432,9 @@ gen_metadata_tab <- function(code = NULL, } else if(empty_object == "DONE"){ - char <- c("Code" = results_json$Object$Code, + if(isFALSE(raw)){ + + char <- cbind("Code" = results_json$Object$Code, "Content" = results_json$Object$Content, "Time_From" = results_json$Object$Time$From, "Time_To" = results_json$Object$Time$To, @@ -400,7 +461,7 @@ gen_metadata_tab <- function(code = NULL, } else { - cbind("Code" = unlist(lapply(results_json$Object$Structure$Columns, `[[`, 1)), + cbind("Code" = unlist(lapply(results_json$Object$Structure$Columns, `[[`, 1)), "Content" = unlist(lapply(results_json$Object$Structure$Columns, `[[`, 2)), "Type" = unlist(lapply(results_json$Object$Structure$Columns, `[[`, 3)), "Values" = unlist(lapply(results_json$Object$Structure$Columns, `[[`, 4)), @@ -411,7 +472,7 @@ gen_metadata_tab <- function(code = NULL, structure$Columns <- if (length(results_json$Object$Structure$Columns) == 1) { - cbind("Code" = results_json$Object$Structure$Columns[[1]]$Code, + cbind("Code" = results_json$Object$Structure$Columns[[1]]$Code, "Content" = results_json$Object$Structure$Columns[[1]]$Content, "Type" = results_json$Object$Structure$Columns[[1]]$Type, "Unit" = results_json$Object$Structure$Columns[[1]]$Unit, @@ -420,7 +481,7 @@ gen_metadata_tab <- function(code = NULL, } else { - cbind("Code" = unlist(lapply(results_json$Object$Structure$Columns, `[[`, 1)), + cbind("Code" = unlist(lapply(results_json$Object$Structure$Columns, `[[`, 1)), "Content" = unlist(lapply(results_json$Object$Structure$Columns, `[[`, 2)), "Type" = unlist(lapply(results_json$Object$Structure$Columns, `[[`, 3)), "Unit" = unlist(lapply(results_json$Object$Structure$Columns, `[[`, 4)), @@ -431,7 +492,7 @@ gen_metadata_tab <- function(code = NULL, structure$Rows <- if (length(results_json$Object$Structure$Rows) == 1) { - cbind("Code" = results_json$Object$Structure$Rows[[1]]$Code, + cbind("Code" = results_json$Object$Structure$Rows[[1]]$Code, "Content" = results_json$Object$Structure$Rows[[1]]$Content, "Type" = results_json$Object$Structure$Rows[[1]]$Type, "Unit" = results_json$Object$Structure$Rows[[1]]$Unit, @@ -440,7 +501,7 @@ gen_metadata_tab <- function(code = NULL, } else { - cbind("Code" = unlist(lapply(results_json$Object$Structure$Rows, `[[`, 1)), + cbind("Code" = unlist(lapply(results_json$Object$Structure$Rows, `[[`, 1)), "Content" = unlist(lapply(results_json$Object$Structure$Rows, `[[`, 2)), "Type" = unlist(lapply(results_json$Object$Structure$Rows, `[[`, 3)), "Unit" = unlist(lapply(results_json$Object$Structure$Rows, `[[`, 4)), @@ -448,11 +509,16 @@ gen_metadata_tab <- function(code = NULL, "Updated" = unlist(lapply(results_json$Object$Structure$Rows, `[[`, 6))) } + } } - list_resp <- list("General" = char, + if(isFALSE(raw)){ + list_resp <- list("General" = char, "Structure" = structure, - "Embedded_in" = embedded) + "Embedded_in" = embedded ) + } else { + list_resp <- results_json$Object + } attr(list_resp, "Code") <- results_json$Parameter$name attr(list_resp, "Database") <- rev_database_function(db) @@ -482,6 +548,7 @@ gen_metadata_tab <- function(code = NULL, #' @param code A string with a maximum length of 15 characters. Code from a Genesis-Object. Only one code per iteration. #' @param area A string. Indicator from which area of the database the results are called. In general, "all" is the appropriate solution. Default option is 'all'. Only used for Genesis. #' @param error.ignore A logical. Indicator if the function should stop if an error occurs or no object for the request is found or if it should produce a token as response. Default option is 'FALSE'. +#' @param verbose Logical. Indicator if the output of the function should include detailed messages and warnings. Default option is 'TRUE'. Set the parameter to 'FALSE' to suppress additional messages and warnings. #' @param ... Additional parameters for the Genesis API call. These parameters are only affecting the Genesis call itself, no further processing. For more details see `vignette("additional_parameter")`. #' #' @return A list with all recalled elements from Genesis. Attributes are added to the dataframe describing the search configuration for the returned output. @@ -497,6 +564,8 @@ gen_metadata_cube <- function(code = NULL, database = c("all", "genesis", "regio"), error.ignore = FALSE, area = c("all", "public", "user"), + verbose = TRUE, + raw = raw, ...) { caller <- as.character(match.call()[1]) @@ -506,7 +575,9 @@ gen_metadata_cube <- function(code = NULL, check_function_input(code = code, error.ignore = error.ignore, database = gen_fun, - caller = caller) + caller = caller, + verbose = verbose, + raw = raw) area <- match.arg(area) @@ -516,6 +587,11 @@ gen_metadata_cube <- function(code = NULL, res <- lapply(gen_fun, function(db){ + if(verbose) { + info <- paste("Started the processing of", rev_database_function(db), "database.") + message(info) + } + par_list <- list( endpoint = "metadata/cube", username = gen_auth_get(database = rev_database_function(db))$username, @@ -529,7 +605,7 @@ gen_metadata_cube <- function(code = NULL, results_json <- test_if_json(results_raw) - empty_object <- test_if_error(results_json, para = error.ignore) + empty_object <- test_if_error(results_json, para = error.ignore, verbose = verbose) #--------------------------------------------------------------------------- if(isTRUE(empty_object)){ @@ -548,14 +624,16 @@ gen_metadata_cube <- function(code = NULL, } else if(empty_object == "DONE"){ - char <- c("Code" = results_json$Object$Code, + if(isFALSE(raw)){ + + char <-cbind("Code" = results_json$Object$Code, "Content" = results_json$Object$Content, "State" = results_json$Object$State, "Values" = results_json$Object$Values) - time <- unlist(results_json$Object$Timeslices) + time <-cbind(unlist(results_json$Object$Timeslices)) - stat <- c("Code" = results_json$Object$Statistic$Code, + stat <-cbind("Code" = results_json$Object$Statistic$Code, "Content" = results_json$Object$Statistic$Content, "Updated" = results_json$Object$Statistic$Updated) @@ -563,7 +641,7 @@ gen_metadata_cube <- function(code = NULL, structure$Axis <- if (length(results_json$Object$Structure$Axis) == 1) { - cbind( + cbind( "Code" = results_json$Object$Structure$Axis[[1]]$Code, "Content" = results_json$Object$Structure$Axis[[1]]$Content, "Type" = results_json$Object$Structure$Axis[[1]]$Type, @@ -571,7 +649,7 @@ gen_metadata_cube <- function(code = NULL, } else { - cbind( + cbind( "Code" = unlist(lapply(results_json$Object$Structure$Axis, `[[`, 1)), "Content" = unlist(lapply(results_json$Object$Structure$Axis, `[[`, 2)), "Type" = unlist(lapply(results_json$Object$Structure$Axis, `[[`, 3)), @@ -580,7 +658,7 @@ gen_metadata_cube <- function(code = NULL, structure$Content <- if (length(results_json$Object$Structure$Contents) == 1) { - cbind("Code" = results_json$Object$Structure$Contents[[1]]$Code, + cbind("Code" = results_json$Object$Structure$Contents[[1]]$Code, "Content" = results_json$Object$Structure$Contents[[1]]$Content, "Type" = results_json$Object$Structure$Contents[[1]]$Type, "Unit" = results_json$Object$Structure$Contents[[1]]$Unit, @@ -590,7 +668,7 @@ gen_metadata_cube <- function(code = NULL, } else { - cbind("Code" = unlist(lapply(results_json$Object$Structure$Contents, `[[`, 1)), + cbind("Code" = unlist(lapply(results_json$Object$Structure$Contents, `[[`, 1)), "Content" = unlist(lapply(results_json$Object$Structure$Contents, `[[`, 2)), "Type" = unlist(lapply(results_json$Object$Structure$Contents, `[[`, 3)), "Unit" = unlist(lapply(results_json$Object$Structure$Contents, `[[`, 4)), @@ -598,12 +676,17 @@ gen_metadata_cube <- function(code = NULL, "Updated" = unlist(lapply(results_json$Object$Structure$Contents, `[[`, 7)), "Updated" = unlist(lapply(results_json$Object$Structure$Contents, `[[`, 6))) } + } } - list_resp <- list("General" = char, + if(isFALSE(raw)){ + list_resp <- list("General" = char, "Timespan" = time, "Statistic_used" = stat, "Structure" = structure) + } else { + list_resp <- results_json$Object + } attr(list_resp, "Code") <- results_json$Parameter$name attr(list_resp, "Database") <- rev_database_function(db) @@ -635,6 +718,7 @@ gen_metadata_cube <- function(code = NULL, #' @param category A string. Specific object-types: 'Cube', 'Statistic', "Table", "Variable" and 'Value'. The function needs a specified object type. #' @param area A string. Indicator from which area of the database the results are called. In general, "all" is the appropriate solution. Default option is 'all'. Only used for Genesis. #' @param error.ignore A logical. Indicator if the function should stop if an error occurs or no object for the request is found or if it should produce a token as response. Default option is 'FALSE'. +#' @param verbose Logical. Indicator if the output of the function should include detailed messages and warnings. Default option is 'TRUE'. Set the parameter to 'FALSE' to suppress additional messages and warnings. #' @param ... Additional parameters for the Genesis/Zensus API call. These parameters are only affecting the Genesis/Zensus call itself, no further processing. For more details see `vignette("additional_parameter")`. #' #' @return A list with all recalled elements from Genesis/Zensus. Attributes are added to the dataframe describing the search configuration for the returned output. @@ -651,6 +735,8 @@ gen_metadata <- function(code = NULL, category = c("cube", "statistic", "table", "variable", "value"), area = c("all", "public", "user"), error.ignore = FALSE, + verbose = TRUE, + raw = FALSE, ...) { caller <- as.character(match.call()[1]) @@ -661,7 +747,8 @@ gen_metadata <- function(code = NULL, error.ignore = error.ignore, category = category, database = gen_fun, - caller = caller) + caller = caller, + verbose = verbose) #----------------------------------------------------------------------------- @@ -671,35 +758,50 @@ gen_metadata <- function(code = NULL, gen_metadata_cube(code = code, database = rev_database_function(odb), - error.ignore = error.ignore, ...) + error.ignore = error.ignore, + verbose = verbose, + raw = raw, + ...) } else if (category == "value") { - gen_metadata_val(code = code, + gen_metadata_value(code = code, database = rev_database_function(odb), area = area, - error.ignore = error.ignore, ...) + error.ignore = error.ignore, + verbose = verbose, + raw = raw, + ...) } else if (category == "variable") { - gen_metadata_var(code = code, + gen_metadata_variable(code = code, database = rev_database_function(odb), area = area, - error.ignore = error.ignore, ...) + error.ignore = error.ignore, + verbose = verbose, + raw = raw, + ...) } else if (category == "table") { - gen_metadata_tab(code = code, + gen_metadata_table(code = code, database = rev_database_function(odb), area = area, - error.ignore = error.ignore, ...) + error.ignore = error.ignore, + verbose = verbose, + raw = raw, + ...) } else if (category == "statistic") { - gen_metadata_stats(code = code, + gen_metadata_statistic(code = code, database = rev_database_function(odb), area = area, - error.ignore = error.ignore, ...) + error.ignore = error.ignore, + verbose = verbose, + raw = raw, + ...) } else { diff --git a/R/gen_modified_data.R b/R/gen_modified_data.R index 9e1ac97..5770955 100644 --- a/R/gen_modified_data.R +++ b/R/gen_modified_data.R @@ -6,6 +6,7 @@ #' @param database Character string. Indicator if the Genesis or Zensus database is called. Default option is 'genesis'. #' @param type A string. Specific Genesis object type: 'tables', 'statistics', and 'statisticsUpdates'. Specific Zensus object type: 'tables' and 'statistics'. All types that are specific for one database can be used together through "all", which is the default. #' @param date A string. Specific date that is used as the last update or upload time in Genesis/Zensus to include a Genesis/Zensus object in return. Default option is 'now', which uses the current date of your system. Alternative options are 'week_before', using the current date of your system minus 7 days, 'month_before', using the current date of your system minus 4 weeks, and 'year_before', using the current date of your system minus 52 weeks. Additionally, it is possible to fill in a specific date of format 'DD.MM.YYYY'. +#' @param verbose Logical. Indicator if the output of the function should include detailed messages and warnings. Default option is 'TRUE'. Set the parameter to 'FALSE' to suppress additional messages and warnings. #' @param ... Additional parameters for the Genesis/Zensus API call. These parameters are only affecting the Genesis/Zensus call itself, no further processing. For more details see `vignette("additional_parameter")`. #' #' @return A list with all recalled elements from Genesis/Zensus. Always includes the code of the object, the title, and the type of the object. This is done to facilitate further processing with the data. Attributes are added to the data.frame describing the search configuration for the returned output. @@ -27,6 +28,7 @@ gen_modified_data <- function(code = "", database = c("all", "genesis", "zensus", "regio"), type = c("all", "tables", "statistics", "statisticsUpdates"), date = c("now", "week_before", "month_before", "year_before"), + verbose = TRUE, ...) { gen_fun <- test_database_function(database) @@ -36,7 +38,8 @@ gen_modified_data <- function(code = "", date <- check_function_input(code = code, type = type, date = date, - database = gen_fun) + database = gen_fun, + verbose = verbose) #----------------------------------------------------------------------------- @@ -64,6 +67,11 @@ gen_modified_data <- function(code = "", # Processing #### res <- lapply(gen_fun, function(db){ + if(verbose) { + info <- paste("Started the processing of", rev_database_function(db), "database.") + message(info) + } + #--------------------------------------------------------------------------- if (type == "tables") { @@ -153,9 +161,11 @@ gen_modified_data <- function(code = "", if (is.null(unlist(results_json$List))) { + if(isTRUE(verbose)){ message(paste0("No modified objects found for your code and date in ", rev_database_function(db))) + } - return(NULL) + return("No modified objects found") } else { diff --git a/R/gen_objects2stat.R b/R/gen_objects2stat.R index b8e5f65..1134bb9 100644 --- a/R/gen_objects2stat.R +++ b/R/gen_objects2stat.R @@ -9,6 +9,7 @@ #' @param detailed A logical. Indicator if function should return the detailed output of the iteration including all object-related information or only a shortened output including only code and object title. The default is detailed = FALSE. #' @param error.ignore A logical. Indicator if the function should stop if an error occurs or no object for the request is found or if it should produce a token as response. Default option is 'FALSE'. #' @param sortcriterion A string. Indicator if the output should be sorted by 'code' or 'content'. This is a parameter of the Genesis/Zensus API call itself. The default is "code". +#' @param verbose Logical. Indicator if the output of the function should include detailed messages and warnings. Default option is 'TRUE'. Set the parameter to 'FALSE' to suppress additional messages and warnings. #' @param ... Additional parameters for the Genesis/Zensus API call. These parameters are only affecting the Genesis/Zensus call itself, no further processing. For more details see `vignette("additional_parameter")`. #' #' @return A list with all recalled elements from Genesis/Zensus based on the detailed-parameter it contains more or less information, but always includes the code of the object, the title, and the type of the object. This is done to facilitate further processing of the data. Attributes are added to the dataframe describing the search configuration for the returned output. @@ -32,6 +33,7 @@ gen_objects2stat <- function(code = NULL, detailed = FALSE, error.ignore = FALSE, sortcriterion = c("code", "content"), + verbose = TRUE, ...) { caller <- as.character(match.call()[1]) @@ -44,7 +46,8 @@ gen_objects2stat <- function(code = NULL, error.ignore = error.ignore, database = gen_fun, sortcriterion = sortcriterion, - caller = caller) + caller = caller, + verbose = verbose) area <- match.arg(area) @@ -56,6 +59,11 @@ gen_objects2stat <- function(code = NULL, res <- lapply(gen_fun, function(db){ + if(verbose) { + info <- paste("Started the processing of", rev_database_function(db), "database.") + message(info) + } + #--------------------------------------------------------------------------- if ("tables" %in% category) { @@ -73,7 +81,7 @@ gen_objects2stat <- function(code = NULL, results_json <- test_if_json(results_raw) - empty_object <- test_if_error(results_json, para = error.ignore) + empty_object <- test_if_error(results_json, para = error.ignore, verbose = verbose) if(isTRUE(empty_object)){ @@ -124,7 +132,7 @@ gen_objects2stat <- function(code = NULL, results_json <- test_if_json(results_raw) - empty_object <- test_if_error(results_json, para = error.ignore) + empty_object <- test_if_error(results_json, para = error.ignore, verbose = verbose) if(isTRUE(empty_object)){ @@ -167,7 +175,7 @@ gen_objects2stat <- function(code = NULL, return(df_cubes) - } else if ("cubes" %in% category && "gen_api" == db) { + } else if ("cubes" %in% category && (db == "gen_api" || db == "gen_regio_api")) { results_raw <- do.call(db, list( endpoint = "catalogue/cubes2statistic", @@ -181,7 +189,7 @@ gen_objects2stat <- function(code = NULL, results_json <- test_if_json(results_raw) - empty_object <- test_if_error(results_json, para = error.ignore) + empty_object <- test_if_error(results_json, para = error.ignore, verbose = verbose) if(isTRUE(empty_object)){ diff --git a/R/gen_objects2var.R b/R/gen_objects2var.R index 3f255a4..e1e1c2e 100644 --- a/R/gen_objects2var.R +++ b/R/gen_objects2var.R @@ -9,6 +9,7 @@ #' @param detailed A logical. Indicator if function should return the detailed output of the iteration including all object-related information or only a shortened output including only code and object title. The default is detailed = FALSE. #' @param error.ignore A logical. Indicator if the function should stop if an error occurs or no object for the request is found or if it should produce a token as response. Default option is 'FALSE'. #' @param sortcriterion A string. Indicator if the output should be sorted by 'code' or 'content'. This is a parameter of the Genesis/Zensus API call itself. The default is "code". +#' @param verbose Logical. Indicator if the output of the function should include detailed messages and warnings. Default option is 'TRUE'. Set the parameter to 'FALSE' to suppress additional messages and warnings. #' @param ... Additional parameters for the Genesis/Zensus API call. These parameters are only affecting the Genesis/Zensus call itself, no further processing. For more details see `vignette("additional_parameter")`. #' #' @return A list with all recalled elements from Genesis/Zensus. Based on the detailed-parameter it contains more or less information, but always includes the code of the object, the title, and the type of the object. This is done to facilitate further processing of the data. Attributes are added to the dataframe describing the search configuration for the returned output. @@ -32,6 +33,7 @@ gen_objects2var <- function(code = NULL, detailed = FALSE, error.ignore = FALSE, sortcriterion = c("code", "content"), + verbose = TRUE, ...) { caller <- as.character(match.call()[1]) @@ -44,7 +46,8 @@ gen_objects2var <- function(code = NULL, error.ignore = error.ignore, database = gen_fun, sortcriterion = sortcriterion, - caller = caller) + caller = caller, + verbose = verbose) area <- match.arg(area) @@ -56,6 +59,11 @@ gen_objects2var <- function(code = NULL, res <- lapply(gen_fun, function(db){ + if(verbose) { + info <- paste("Started the processing of", rev_database_function(db), "database.") + message(info) + } + #--------------------------------------------------------------------------- if ("tables" %in% category) { @@ -73,7 +81,7 @@ gen_objects2var <- function(code = NULL, results_json <- test_if_json(results_raw) - empty_object <- test_if_error(results_json, para = error.ignore) + empty_object <- test_if_error(results_json, para = error.ignore, verbose = verbose) if(isTRUE(empty_object)){ @@ -125,7 +133,7 @@ gen_objects2var <- function(code = NULL, results_json <- test_if_json(results_raw) - empty_object <- test_if_error(results_json, para = error.ignore) + empty_object <- test_if_error(results_json, para = error.ignore, verbose = verbose) if(isTRUE(empty_object)){ @@ -166,7 +174,7 @@ gen_objects2var <- function(code = NULL, return(df_cubes) - } else if ("cubes" %in% category && (db == "gen_api" || db == "gen_api_regio")) { + } else if ("cubes" %in% category && (db == "gen_api" || db == "gen_regio_api")) { results_raw <- do.call(db, list( endpoint = "catalogue/timeseries2variable", @@ -180,7 +188,7 @@ gen_objects2var <- function(code = NULL, results_json <- test_if_json(results_raw) - empty_object <- test_if_error(results_json, para = error.ignore) + empty_object <- test_if_error(results_json, para = error.ignore, verbose = verbose) if(isTRUE(empty_object)){ diff --git a/R/gen_update_EVAS.R b/R/gen_update_EVAS.R index b9d3624..42c5845 100644 --- a/R/gen_update_EVAS.R +++ b/R/gen_update_EVAS.R @@ -15,13 +15,6 @@ gen_update_EVAS <- function(){ } - if (!requireNamespace("purrr", quietly = TRUE)) { - - stop("If you want to use this specific function, the package {purrr} needs to be installed.", - call. = FALSE) - - } - # Path selection data_path <- system.file("data", "EVAS_numbers.RData", package = "restatis") diff --git a/R/gen_var2-val2.R b/R/gen_var2-val2.R index b232eef..6991010 100644 --- a/R/gen_var2-val2.R +++ b/R/gen_var2-val2.R @@ -8,6 +8,7 @@ #' @param detailed A logical. Indicator if function should return the detailed output of the iteration including all object-related information or only a shortened output including only code and object title. The default is detailed = FALSE. #' @param sortcriterion A string. Indicator if the output should be sorted by 'code' or 'content'. This is a parameter of the Genesis/Zensus API call itself. The default is "code". #' @param error.ignore A logical. Indicator if the function should stop if an error occurs or no object for the request is found or if it should produce a token as response. Default option is 'FALSE'. +#' @param verbose Logical. Indicator if the output of the function should include detailed messages and warnings. Default option is 'TRUE'. Set the parameter to 'FALSE' to suppress additional messages and warnings. #' @param ... Additional parameters for the Genesis/Zensus API call. These parameters are only affecting the Genesis/Zensus call itself, no further processing. For more details see `vignette("additional_parameter")`. #' #' @return A list with all recalled elements from Genesis/Zensus. Based on the detailed-parameter it contains more or less information, but always includes the code of the object, the title, and the type of the object. This is done to facilitate further processing of the data. Attributes are added to the dataframe describing the search configuration for the returned output. @@ -26,6 +27,7 @@ gen_var2stat <- function(code = NULL, detailed = FALSE, sortcriterion = c("code", "content"), error.ignore = FALSE, + verbose = TRUE, ...) { caller <- as.character(match.call()[1]) @@ -37,7 +39,8 @@ gen_var2stat <- function(code = NULL, error.ignore = error.ignore, sortcriterion = sortcriterion, database = gen_fun, - caller = caller) + caller = caller, + verbose = verbose) sortcriterion <- match.arg(sortcriterion) @@ -50,6 +53,12 @@ gen_var2stat <- function(code = NULL, # Processing #### res <- lapply(gen_fun, function(db){ + if(verbose) { + info <- paste("Started the processing of", rev_database_function(db), "database.") + message(info) + } + + #--------------------------------------------------------------------------- par_list <- list( endpoint = "catalogue/variables2statistic", @@ -63,11 +72,11 @@ gen_var2stat <- function(code = NULL, par_list <- append(par_list, list(area = area)) } - results_raw <- do.call(gen_fun, par_list) + results_raw <- do.call(db, par_list) results_json <- test_if_json(results_raw) - empty_object <- test_if_error(results_json, para = error.ignore) + empty_object <- test_if_error(results_json, para = error.ignore, verbose = verbose) if(isTRUE(empty_object)){ @@ -130,6 +139,7 @@ gen_var2stat <- function(code = NULL, #' @param area A string. Indicator from which area of the database the results are called. In general, "all" is the appropriate solution. Default option is 'all'. Only used for Genesis. #' @param sortcriterion A string. Indicator if the output should be sorted by 'code' or 'content'. This is a parameter of the Genesis/Zensus API call itself. The default is "code". #' @param error.ignore A logical. Indicator if the function should stop if an error occurs or no object for the request is found or if it should produce a token as response. Default option is 'TRUE' - . +#' @param verbose Logical. Indicator if the output of the function should include detailed messages and warnings. Default option is 'TRUE'. Set the parameter to 'FALSE' to suppress additional messages and warnings. #' @param ... Additional parameters for the Genesis/Zensus API call. These parameters are only affecting the Genesis/Zensus call itself, no further processing. For more details see `vignette("additional_parameter")`. #' #' @return A list with all recalled elements from Genesis/Zensus. Always includes the code of the object, the title, and the type of the object. This is done to facilitate further processing of the data. Attributes are added to the dataframe describing the search configuration for the returned output. @@ -146,6 +156,7 @@ gen_val2var <- function(code = NULL, area = c("all", "public", "user"), sortcriterion = c("code", "content"), error.ignore = TRUE, + verbose = TRUE, ...) { caller <- as.character(match.call()[1]) @@ -156,7 +167,8 @@ gen_val2var <- function(code = NULL, error.ignore = error.ignore, sortcriterion = sortcriterion, database = gen_fun, - caller = caller) + caller = caller, + verbose = verbose) sortcriterion <- match.arg(sortcriterion) @@ -164,12 +176,17 @@ gen_val2var <- function(code = NULL, area <- switch(area, all = "all", public = "\u00F6ffentlich", user = "benutzer") - embedding <- list(...)$frame + embedding <- deparse(sys.calls()) #----------------------------------------------------------------------------- res <- lapply(gen_fun, function(db){ + if(verbose) { + info <- paste("Started the processing of", rev_database_function(db), "database.") + message(info) + } + par_list <- list( endpoint = "catalogue/values2variable", username = gen_auth_get(database = rev_database_function(db))$username, @@ -182,14 +199,14 @@ gen_val2var <- function(code = NULL, par_list <- append(par_list, list(area = area)) } - results_raw <- do.call(gen_fun, par_list) + results_raw <- do.call(db, par_list) results_json <- test_if_json(results_raw) - if(isTRUE(grepl("gen_val2var2stat", embedding))){ + if(isFALSE(grepl("pairlist\\(gen_val2var", embedding))){ empty_object <- test_if_error_variables(results_json, para = error.ignore) } else { - empty_object <- test_if_error(results_json, para = error.ignore) + empty_object <- test_if_error(results_json, para = error.ignore, verbose = verbose) } if(isTRUE(empty_object)){ @@ -244,6 +261,7 @@ gen_val2var <- function(code = NULL, #' @param error.ignore.var A logical. Indicator for the variables if the function should stop if an error occurs or no object for the request is found or if it should produce a token as response. Default option is 'FALSE'. #' @param error.ignore.val A logical. Indicator for the values if the function should stop if an error occurs or no object for the request is found or if it should produce a token as response. Default option is 'TRUE' - this prevents the function to stop even if a varaible has no further explanation (as often the case for numerical variables). #' @param sortcriterion A string. Indicator if the output should be sorted by 'code' or 'content'. This is an parameter of the Genesis/Zensus API call itself. The default is "code". +#' @param verbose Logical. Indicator if the output of the function should include detailed messages and warnings. Default option is 'TRUE'. Set the parameter to 'FALSE' to suppress additional messages and warnings. #' @param ... Additional parameters for the Genesis/Zensus API call. These parameters are only affecting the Genesis/Zensus call itself, no further processing. For more details see `vignette("additional_parameter")`. #' #' @return A list with all recalled elements from Genesis/Zensus Based on the detailed-parameter it contains more or less information, but always includes the code of the object, the title, and the type of the object. This is done to facilitate further processing of the data. Attributes are added to the dataframe describing the search configuration for the returned output. @@ -263,19 +281,25 @@ gen_val2var2stat <- function(code = NULL, sortcriterion = c("code", "content"), error.ignore.var = FALSE, error.ignore.val = TRUE, + verbose = TRUE, ...) { caller <- as.character(match.call()[1]) + gen_fun <- test_database_function(database) + check_function_input(code = code, error.ignore = error.ignore.var, sortcriterion = sortcriterion, database = gen_fun, - caller = caller) + caller = caller, + verbose = verbose) sortcriterion <- match.arg(sortcriterion) - embedding <- deparse(sys.calls()) + if("all" %in% database){ + database <- c("genesis", "zensus", "regio") + } #----------------------------------------------------------------------------- @@ -287,23 +311,36 @@ gen_val2var2stat <- function(code = NULL, detailed = detailed, sortcriterion = sortcriterion, error.ignore = error.ignore.var, + verbose = verbose, ...))) - list_values <- list() + if(length(dim(variables$Variables)) != 2){ + if(variables$Variables == "No `variables`- object found for your request."){ + + list_resp <- variables - lapply(variables$Variables$Code, function(x) { + } + } else { + + list_values <- list() + + lapply(variables$Variables$Code, function(x) { + + zwisch <- suppressMessages(suppressWarnings(gen_val2var(code = x, + database = db, + area = area, + sortcriterion = sortcriterion, + error.ignore = error.ignore.val, + verbose = verbose))) + + list_values <<- append(list_values, zwisch) - zwisch <- suppressMessages(suppressWarnings(gen_val2var(code = x, - database = db, - area = area, - sortcriterion = sortcriterion, - error.ignore = error.ignore.val, - frame = embedding))) - list_values <<- append(list_values, zwisch) + }) - }) + list_resp <- list(variables, list_values) + + } - list_resp <- list(variables, list_values) return(list_resp) @@ -327,6 +364,7 @@ gen_val2var2stat <- function(code = NULL, #' @param database Character string. Indicator if the Genesis or Zensus database is called. Only one database can be addressed per function call. Default option is 'genesis'. #' @param sortcriterion A string. Indicator if the output should be sorted by 'code' or 'content'. This is a parameter of the Genesis/Zensus API call itself. The default is "code". #' @param error.ignore A logical. Indicator if the function should stop if an error occurs or no object for the request is found or if it should produce a token as response. Default option is 'FALSE'. +#' @param verbose Logical. Indicator if the output of the function should include detailed messages and warnings. Default option is 'TRUE'. Set the parameter to 'FALSE' to suppress additional messages and warnings. #' @param ... Additional parameters for the Genesis/Zensus API call. These parameters are only affecting the Genesis/Zensus call itself, no further processing. For more details see `vignette("additional_parameter")`. #' #' @return A list with all recalled elements from Genesis/Zensus Always includes the code of the object, the title, and the type of the object. This is done to facilitate further processing of the data. Attributes are added to the dataframe describing the search configuration for the returned output. @@ -343,6 +381,7 @@ gen_search_vars <- function(code = NULL, area = c("all", "public", "user"), sortcriterion = c("code", "content"), error.ignore = FALSE, + verbose = TRUE, ...) { caller <- as.character(match.call()[1]) @@ -353,7 +392,8 @@ gen_search_vars <- function(code = NULL, error.ignore = error.ignore, sortcriterion = sortcriterion, database = gen_fun, - caller = caller) + caller = caller, + verbose = verbose) sortcriterion <- match.arg(sortcriterion) @@ -365,13 +405,19 @@ gen_search_vars <- function(code = NULL, res <- lapply(gen_fun, function(db){ + if(verbose) { + info <- paste("Started the processing of", rev_database_function(db), "database.") + message(info) + } + #--------------------------------------------------------------------------- par_list <- list( endpoint = "catalogue/variables", - username = gen_zensus_auth_get(database = rev_database_function(db))$username, - password = gen_zensus_auth_get(database = rev_database_function(db))$password, + username = gen_auth_get(database = rev_database_function(db))$username, + password = gen_auth_get(database = rev_database_function(db))$password, selection = code, sortcriterion = sortcriterion, + area = area, ... ) @@ -379,7 +425,7 @@ gen_search_vars <- function(code = NULL, par_list <- append(par_list, list(area = area)) } - results_raw <- do.call(gen_fun, par_list) + results_raw <- do.call(db, par_list) results_json <- test_if_json(results_raw) diff --git a/R/utils_dataprocessing.R b/R/utils_dataprocessing.R index 283660d..5733aff 100644 --- a/R/utils_dataprocessing.R +++ b/R/utils_dataprocessing.R @@ -281,7 +281,31 @@ check_function_input <- function(code = NULL, ordering = NULL, database = NULL, area = NULL, - caller = NULL) { + caller = NULL, + verbose = NULL, + raw = NULL) { + + #----------------------------------------------------------------------------- + # verbose ---- + if (!is.null(verbose)) { + + #--------------------------------------------------------------------------- + + if (length(verbose == 1)) { + + #------------------------------------------------------------------------- + + if (!is.logical(verbose) || + length(verbose) != 1) { + + stop("Parameter 'verbose' has to be of type 'logical' and of length 1.", + call. = FALSE) + + } + + } + + } #----------------------------------------------------------------------------- # Code & Term ---- @@ -441,7 +465,7 @@ check_function_input <- function(code = NULL, if (length(category) == 1 && "cubes" %in% category && - isFALSE(error.ignore)) { + isFALSE(error.ignore) && isTRUE(verbose)) { stop("Available categories for 'zensus'-database are: 'tables' and 'statistics'.", call. = FALSE) @@ -452,16 +476,15 @@ check_function_input <- function(code = NULL, else if (length(category) == 1 && "cubes" %in% category && - isTRUE(error.ignore)) { + isTRUE(error.ignore) && isTRUE(verbose)) { - warning("Available categories for 'zensus'-database are: 'tables' and 'statistics'. - Function is continued with a placeholder for the 'cubes' output.", + warning("Available categories for 'zensus'-database are: 'tables' and 'statistics'.\nFunction is continued with a placeholder for the 'cubes' output.", call. = FALSE) } else if ("cubes" %in% category && - isFALSE(error.ignore)) { + isFALSE(error.ignore) && isTRUE(verbose)) { warning("Available categories for 'zensus'-database are: 'tables' and 'statistics'.", call. = FALSE) @@ -469,10 +492,9 @@ check_function_input <- function(code = NULL, } else if ("cubes" %in% category && - isTRUE(error.ignore)) { + isTRUE(error.ignore) && isTRUE(verbose)) { - warning("Available categories for 'zensus'-database are: 'tables' and 'statistics'. - Function is continued with specified 'category'-parameter excluding 'cubes'.", + warning("Available categories for 'zensus'-database are: 'tables' and 'statistics'.\nFunction is continued with specified 'category'-parameter excluding 'cubes'.", call. = FALSE) } @@ -526,10 +548,9 @@ check_function_input <- function(code = NULL, #----------------------------------------------------------------------- else if (length(category) == 1 && - "cubes" %in% category && isTRUE(error.ignore)) { + "cubes" %in% category && isTRUE(error.ignore) && isTRUE(verbose)) { - warning("Available categories for 'zensus'-database are: 'tables' and 'variables'. - Function is continued with a placeholder for the 'cubes' output.", + warning("Available categories for 'zensus'-database are: 'tables' and 'variables'.\nFunction is continued with a placeholder for the 'cubes' output.", call. = FALSE) } @@ -537,7 +558,7 @@ check_function_input <- function(code = NULL, #----------------------------------------------------------------------- else if ("cubes" %in% category && - isFALSE(error.ignore)) { + isFALSE(error.ignore) && isTRUE(verbose)) { warning("Available categories for 'zensus'-database are: 'tables' and 'variables'.", call. = FALSE) @@ -547,10 +568,9 @@ check_function_input <- function(code = NULL, #----------------------------------------------------------------------- else if ("cubes" %in% category && - isTRUE(error.ignore)) { + isTRUE(error.ignore) && isTRUE(verbose)) { - warning("Available categories for 'zensus'-database are: 'tables' and 'variables'. - Function is continued with specified 'category'-parameter excluding 'cubes'.", + warning("Available categories for 'zensus'-database are: 'tables' and 'variables'.\nFunction is continued with specified 'category'-parameter excluding 'cubes'.", call. = FALSE) } @@ -610,23 +630,22 @@ check_function_input <- function(code = NULL, if("gen_zensus_api" %in% database){ + #----------------------------------------------------------------------- if ("cubes" %in% category && - isTRUE(error.ignore)) { + isTRUE(error.ignore) && isTRUE(verbose)) { - warning("Available categories for 'zensus'-database are: 'all', 'tables', 'statistics', and 'variables'. - Function is continued with a placeholder for the 'cubes' output.", + warning("Available categories for 'zensus'-database are: 'all', 'tables', 'statistics', and 'variables'.\nFunction is continued with a placeholder for the 'cubes' output.", call. = FALSE) } #----------------------------------------------------------------------- - else if ("all" %in% category) { + else if ("all" %in% category && isTRUE(verbose)) { - warning("Available categories for 'zensus'-database are: 'all', 'tables', 'statistics', and 'variables'. - Function is continued with a placeholder for the 'cubes' output.", + warning("Available categories for 'zensus'-database are: 'all', 'tables', 'statistics', and 'variables'.\nFunction is continued with a placeholder for the 'cubes' output.", call. = FALSE) } @@ -636,7 +655,7 @@ check_function_input <- function(code = NULL, else if ("cubes" %in% category && isFALSE(error.ignore)) { - stop("Available categories are 'all', 'tables', 'statistics', and 'variables'.", + stop("Available categories for 'zensus'-database are 'all', 'tables', 'statistics', and 'variables'.", call. = FALSE) } @@ -697,7 +716,7 @@ check_function_input <- function(code = NULL, #--------------------------------------------------------------------------- - if (isFALSE(detailed)) { + if (isFALSE(detailed) && isTRUE(verbose)) { message("Use 'detailed = TRUE' to obtain the complete output.") @@ -740,79 +759,6 @@ check_function_input <- function(code = NULL, } - #----------------------------------------------------------------------------- - # date ---- - - if (!is.null(date)) { - - #--------------------------------------------------------------------------- - - if (identical(date, c("now", "week_before", "month_before", "year_before"))) { - - message("Please note that this date is calculated automatically and may differ - from manually entered data. Manually entered data must have - the format DD.MM.YYYY.") - - return("now") - - } - - #--------------------------------------------------------------------------- - - if (!(length(date) %in% c(1, 4))) { - - stop("Parameter 'date' has to be of length 4 (c('now', 'week_before', 'month_before', 'year_before') for the default option of 'now' or of length 1.))", - call. = FALSE) - - } - - #--------------------------------------------------------------------------- - - if (length(date) == 1) { - - #------------------------------------------------------------------------- - - if (date %in% c("now", "week_before", "month_before", "year_before")) { - - message("Please note that this date is calculated automatically and may differ - from manually entered data. Manually entered data must have - the format DD.MM.YYYY.") - - return(date) - - } - - #------------------------------------------------------------------------- - - if (!(date %in% c("now", "week_before", "month_before", "year_before"))) { - - #----------------------------------------------------------------------- - - if (!is.character(date)) { - - stop("If using a specific date for parameter 'date', it has to be of type 'character' (format: DD.MM.YYYY).", - call. = FALSE) - - } - - #----------------------------------------------------------------------- - - if (length(date) != 1 || - nchar(date) != 10) { - - stop("If specifying a specific date for parameter 'date', it has to be of length 1 and format DD.MM.YYYY.", - call. = FALSE) - - } - - return(date) - - } - - } - - } - #----------------------------------------------------------------------------- # similarity ---- @@ -850,7 +796,7 @@ check_function_input <- function(code = NULL, #--------------------------------------------------------------------------- - if (isTRUE(error.ignore)) { + if (isTRUE(error.ignore) && isTRUE(verbose)) { message("Use 'error.ignore = FALSE' to stop the function at the point where no object could be found.") @@ -873,7 +819,7 @@ check_function_input <- function(code = NULL, #--------------------------------------------------------------------------- - if (isFALSE(ordering)) { + if (isFALSE(ordering) && isTRUE(verbose)) { message("Use 'ordering = TRUE' to obtain the output ordered based on the search term presence.") @@ -903,6 +849,120 @@ check_function_input <- function(code = NULL, } + #----------------------------------------------------------------------------- + # Recommendation ---- + if(!is.null(verbose) && !is.null(error.ignore) && !is.null(database)){ + + if(isTRUE(verbose) && isFALSE(error.ignore) && length(database) > 1){ + + message("If you want to search through all databases it is often useful to set the 'error.ignore'-parameter to TRUE.\nThis will prevent the function from stopping if no object is found in one of the databases.") + + } + + } + + #----------------------------------------------------------------------------- + # raw ---- + if(!is.null(raw)){ + + if(!is.logical(raw) || length(raw) != 1){ + + stop("Parameter 'raw' has to be of type 'logical' and of length 1.", + call. = FALSE) + + } + + if(isTRUE(raw) && isTRUE(verbose)){ + + message("Use 'raw = FALSE' to obtain the output in a more readable format.") + + } + + if(isFALSE(raw) && isTRUE(verbose)){ + + message("The default 'raw = FALSE' can simplify some information to a significant extent.") + + } + + } + + #----------------------------------------------------------------------------- + # date ---- + + if (!is.null(date)) { + + #--------------------------------------------------------------------------- + + if (identical(date, c("now", "week_before", "month_before", "year_before"))) { + + if(isTRUE(verbose)){ + + message("Please note that per default the current system date is used.\nThis date is calculated automatically and may differ from manually entered data.\nManually entered data must have the format DD.MM.YYYY.") + + } + + return("now") + + } + + #--------------------------------------------------------------------------- + + if (!(length(date) %in% c(1, 4))) { + + stop("Parameter 'date' has to be of length 4 (c('now', 'week_before', 'month_before', 'year_before') for the default option of 'now' or of length 1.))", + call. = FALSE) + + } + + #--------------------------------------------------------------------------- + + if (length(date) == 1) { + + #------------------------------------------------------------------------- + + if (date %in% c("now", "week_before", "month_before", "year_before")) { + + if(isTRUE(verbose)){ + + message("Please note that this date is calculated automatically and may differ from manually entered data.\nManually entered data must have the format DD.MM.YYYY.") + + } + + return(date) + + } + + #------------------------------------------------------------------------- + + if (!(date %in% c("now", "week_before", "month_before", "year_before"))) { + + #----------------------------------------------------------------------- + + if (!is.character(date)) { + + stop("If using a specific date for parameter 'date', it has to be of type 'character' (format: DD.MM.YYYY).", + call. = FALSE) + + } + + #----------------------------------------------------------------------- + + if (length(date) != 1 || + nchar(date) != 10) { + + stop("If specifying a specific date for parameter 'date', it has to be of length 1 and format DD.MM.YYYY.", + call. = FALSE) + + } + + return(date) + + } + + } + + } # The aforementioned part must be at the end of the function + } #------------------------------------------------------------------------------- @@ -970,7 +1030,7 @@ spezifisch_create <- function(x) { #' titel_search <- function(x, term) { - split <- unlist(strsplit(gsub(" ", "und", term), c("und|UND|Und|\\&|ODER|oder|Oder|\\|"))) + split <- unlist(strsplit(gsub(" ", "\\bund\\b", term), c("\\bund\\b|\\bUND\\b|\\bUnd\\b|\\&|\\bODER\\b|\\boder\\b|\\bOder\\b|\\|"))) split <- split[sapply(split, function(y) { @@ -984,17 +1044,17 @@ titel_search <- function(x, term) { a <- grepl(split, x$Content, ignore.case = TRUE) - } else if (grep("ODER|oder|Oder|\\|", term, ignore.case = TRUE) && grep("UND|und|Und|\\|", term, ignore.case = TRUE)) { + } else if (grep("\\bODER\\b|\\boder\\b|\\bOder\\b|\\|", term, ignore.case = TRUE) && grep("\\bUND\\b|\\bund\\b|\\bUnd\\b|\\|", term, ignore.case = TRUE)) { a <- rep(FALSE, length(x$Content)) message("Combination of words too complex for ordering. Data is processed without ordering.") - } else if (grep("ODER|oder|Oder|\\|", term, ignore.case = TRUE)) { + } else if (grep("\\bODER\\b|\\boder\\b|\\bOder\\b|\\|", term, ignore.case = TRUE)) { a <- grepl(paste(split, collapse = "|"), x$Content, ignore.case = TRUE) - } else if (grep("UND|und|Und|\\|", term, ignore.case = TRUE)) { + } else if (grep("\\bUND\\b|\\bund\\b|\\bUnd\\b|\\|", term, ignore.case = TRUE)) { a <- sapply(x$Content, function(con) { diff --git a/R/utils_httr2.R b/R/utils_httr2.R index fa48cd5..d3fb275 100644 --- a/R/utils_httr2.R +++ b/R/utils_httr2.R @@ -62,17 +62,19 @@ test_if_okay <- function(input) { #' @param input Response object #' @param para Parameter TRUE/FALSE #' -test_if_error_find <- function(input, para) { +test_if_error_find <- function(input, para, verbose = NULL) { - if (input$Status$Code != 0 && isTRUE(para)) { + if (input$Status$Code != 0 && isTRUE(para) && input$Status$Code != 22) { stop(input$Status$Content) - } else if (input$Status$Code != 0 && isFALSE(para)) { + } else if (input$Status$Code != 0 && isFALSE(para) && input$Status$Code != 22) { + if( !is.null(verbose) && isTRUE(verbose)){ message(input$Status$Content) message("Artificial token is used.") + } empty_object <- FALSE @@ -93,29 +95,33 @@ test_if_error_find <- function(input, para) { #' @param input Response object #' @param para Parameter TRUE/FALSE #' -test_if_error <- function(input, para) { +test_if_error <- function(input, para, verbose = NULL) { if (input$Status$Code == 104 && isFALSE(para)) { stop("No object found for your request. Check your parameters if you expected an object for this request.", call. = FALSE) - } else if (input$Status$Code != 0 && isFALSE(para)) { + } else if (input$Status$Code != 0 && isFALSE(para) && input$Status$Code != 22) { stop(input$Status$Content, call. = FALSE) } else if (input$Status$Code == 104 && isTRUE(para)) { + if( !is.null(verbose) && isTRUE(verbose)){ message("No object found for your request. Check your parameters if you expected an object for this request. Artificial token is used.") + } empty_object <- TRUE - } else if (input$Status$Code != 0 && isTRUE(para)) { + } else if (input$Status$Code != 0 && isTRUE(para) && input$Status$Code != 22) { + if( !is.null(verbose) && isTRUE(verbose)){ message(input$Status$Content) message("Artificial token is used.") + } empty_object <- FALSE @@ -142,7 +148,7 @@ test_if_error_variables <- function(input, para) { empty_object <- TRUE - } else if (input$Status$Code != 0) { + } else if (input$Status$Code != 0 && input$Status$Code != 22) { empty_object <- FALSE @@ -163,7 +169,7 @@ test_if_error_variables <- function(input, para) { #' @param input Response object #' @param para Parameter TRUE/FALSE #' -test_if_process_further <- function(input, para) { +test_if_process_further <- function(input, para, verbose = NULL) { if (sum(unlist(lapply(input[4:8], function(x) { @@ -180,7 +186,9 @@ test_if_process_further <- function(input, para) { }))) == 5 && isTRUE(para)) { + if( !is.null(verbose) && isTRUE(verbose)){ message("No object found for your request. Check your parameters if you expected an object for this request. Artificial token is used.") + } empty_object <- TRUE @@ -200,9 +208,9 @@ test_if_process_further <- function(input, para) { #' #' @param input Response object #' -test_if_error_light <- function(input) { +test_if_error_light <- function(input, verbose = NULL) { - if (input$Status$Code != 0) { + if (input$Status$Code != 0 && !is.null(verbose) && isTRUE(verbose) && input$Status$Code != 22) { warning(input$Status$Content, call. = FALSE) From 4fba08cbac1c2a7afa8963c09d7143db5a41b9f2 Mon Sep 17 00:00:00 2001 From: bubux Date: Mon, 8 Jul 2024 14:35:39 +0200 Subject: [PATCH 30/52] update documentation pt.1 --- R/gen_alternative_terms.R | 46 ++-- R/gen_api.R | 30 ++- R/gen_auth.R | 104 ++++---- R/gen_catalogue.R | 178 +++++++------ R/gen_cube.R | 71 +++-- R/gen_find.R | 176 +++++++++---- R/gen_jobs.R | 51 ++-- R/gen_list_results.R | 54 ++-- R/gen_logincheck.R | 4 +- R/gen_meta_data.R | 527 ++++++++++++++++++++------------------ R/gen_modified_data.R | 111 ++++---- R/gen_objects2stat.R | 119 ++++----- R/gen_objects2var.R | 121 ++++----- R/gen_qualitysigns.R | 21 +- R/gen_table.R | 25 +- R/gen_update_EVAS.R | 17 +- 16 files changed, 932 insertions(+), 723 deletions(-) diff --git a/R/gen_alternative_terms.R b/R/gen_alternative_terms.R index c2d38e1..25fa6b7 100644 --- a/R/gen_alternative_terms.R +++ b/R/gen_alternative_terms.R @@ -1,26 +1,26 @@ -#' gen_alternative_terms: Call For Similiar or Spelling Related Terms for Further Search +#' gen_alternative_terms #' -#' @description Function to find search terms that are similar or related to one another in spelling and also represented in Genesis/Zensus/Regionalstatistik. Important note: The API call is searching for terms with the same characters. To be useful in searching for related terms it is highly recommended to work with "*"-placeholders (see examples). The placeholder can be placed before and/or after the search term. +#' @description Function to find search terms that are similar or related to one another in spelling and also represented in the GENESIS, Zensus 2022 or regionalstatistik.de databases. Important note: The API call is searching for terms with the same characters. To be useful in searching for related terms it is highly recommended to work with "*" placeholders (see examples). The placeholder can be placed before and/or after the search term. #' #' @param term Character string. Maximum length of 15 characters. Term or word for which you are searching for alternative or related terms. Use of '*' as a placeholder is possible to generate broader search areas. -#' @param similarity Logical. Indicator if the output of the function should be sorted based on a Levenshtein edit distance based on the \code{adist()} function. Default option is 'TRUE'. -#' @param database Character string. Indicator if the Genesis or Zensus database is called. Only one database can be addressed per function call. Default option is 'genesis'. -#' @param verbose Logical. Indicator if the output of the function should include detailed messages and warnings. Default option is 'TRUE'. Set the parameter to 'FALSE' to suppress additional messages and warnings. -#' @param ... Additional parameters for the Genesis or Zensus API call. These parameters are only affecting the call itself, no further processing. For more details see `vignette("additional_parameter")`. +#' @param similarity Boolean. Indicator if the output of the function should be sorted based on a Levenshtein edit distance based on the \code{adist()} function. Default is 'TRUE'. +#' @param database Character string. Indicator if the GENESIS ('genesis'), Zensus 2022 ('zensus') or regionalstatistik.de ('regio') database is called. Only one database can be addressed per function call. Default option is 'genesis'. +#' @param verbose Boolean. Indicator if the output of the function should include detailed messages and warnings. Default option is 'TRUE'. Set the parameter to 'FALSE' to suppress additional messages and warnings. +#' @param ... Additional parameters for the API call. These parameters are only affecting the call itself, no further processing. For more details see `vignette("additional_parameter")`. #' -#' @return A list with all recalled elements from Genesis/Zensus/Regionalstatistik. Attributes are added to the data.frame, describing the search configuration for the returned output. +#' @return A list with all recollected elements from the respective database. Attributes are added to the data.frame, describing the search configuration for the returned output. #' @export #' #' @examples #' \dontrun{ -#' # Find terms at Destatis that are the same (in spelling) to search term "bus" +#' # Find terms at GENESIS that are the same (in spelling) to search term "bus" #' # and sort them by Levenshtein edit distance #' object <- gen_alternative_terms(term = "bus", similarity = TRUE, database = "genesis") #' -#' # Find terms at Destatis that are related (in spelling) to search term "bus" +#' # Find terms at GENESIS that are related (in spelling) to search term "bus" #' object <- gen_alternative_terms(term = "bus*", similarity = TRUE, database = "genesis") #' -#' # Find terms at Zensus that are related (in spelling) to search term "wohn" +#' # Find terms at Zensus 2022 that are related (in spelling) to search term "wohn" #' object <- gen_alternative_terms(term = "wohn*", similarity = TRUE, database = "zensus") #' } #' @@ -43,21 +43,24 @@ gen_alternative_terms <- function(term = NULL, res <- lapply(gen_fun, function(db){ - if(verbose) { + if (verbose) { + info <- paste("Started the processing of", rev_database_function(db), "database.") + message(info) + } - par_list <- list( - endpoint = "catalogue/terms", - username = gen_auth_get(database = rev_database_function(db))$username, - password = gen_auth_get(database = rev_database_function(db))$password, - selection = term, - ... - ) + par_list <- list(endpoint = "catalogue/terms", + username = gen_auth_get(database = rev_database_function(db))$username, + password = gen_auth_get(database = rev_database_function(db))$password, + selection = term, + ...) results_raw <- do.call(db, par_list) + #--------------------------------------------------------------------------- + results_json <- test_if_json(results_raw) if (length(results_json$List) == 0 & length(gen_fun) == 1) { @@ -73,6 +76,7 @@ gen_alternative_terms <- function(term = NULL, } else { # similarity von Woertern berechnen und nach diesen Ordnen? + termslist <- c() termslist <- lapply(results_json$List, function(x) { @@ -89,9 +93,11 @@ gen_alternative_terms <- function(term = NULL, termslist <- unlist(termslist) + #------------------------------------------------------------------------- + if (isTRUE(similarity)) { - # generalized levenstein edit distance + # generalized Levenshtein edit distance termslist <- termslist[order(utils::adist(term, termslist, ignore.case = TRUE))] @@ -104,7 +110,6 @@ gen_alternative_terms <- function(term = NULL, list_resp <- list("Output" = termslist) - } attr(list_resp, "Term") <- term @@ -114,6 +119,7 @@ gen_alternative_terms <- function(term = NULL, attr(list_resp, "Copyright") <- results_json$Copyright return(list_resp) + }) res <- check_results(res) diff --git a/R/gen_api.R b/R/gen_api.R index 0c39e2b..a592922 100644 --- a/R/gen_api.R +++ b/R/gen_api.R @@ -1,66 +1,84 @@ -#' Low-level function to interact with Destatis' GENESIS API +#' gen_api #' -#' @param endpoint The endpoint of the API that is to be queried +#' @description Low-level function to interact with the GENESIS API +#' +#' @param endpoint Character string. The endpoint of the API that is to be queried. #' #' @importFrom httr2 `%>%` #' #' @noRd #' #' @examples +#' \dontrun{ #' gen_api("helloworld/logincheck") %>% #' httr2::resp_body_json() +#' } #' gen_api <- function(endpoint, ...) { + httr2::request("https://www-genesis.destatis.de/genesisWS/rest/2020") %>% httr2::req_user_agent("https://github.com/CorrelAid/restatis") %>% httr2::req_url_path_append(endpoint) %>% httr2::req_url_query(!!!gen_auth_get(database = "genesis"), ...) %>% httr2::req_retry(max_tries = 3) %>% httr2::req_perform() + } #------------------------------------------------------------------------------- -#' Low-level function to interact with Regionalstatistik' GENESIS API +#' gen_regio_api #' -#' @param endpoint The endpoint of the API that is to be queried +#' @description Low-level function to interact with the regionalstatistik.de API +#' +#' @param endpoint Character string. The endpoint of the API that is to be queried. #' #' @importFrom httr2 `%>%` #' #' @noRd #' #' @examples +#' \dontrun{ #' gen_regio_api("helloworld/logincheck") %>% #' httr2::resp_body_json() +#' } #' gen_regio_api <- function(endpoint, ...) { + httr2::request("https://www.regionalstatistik.de/genesisws/rest/2020/") %>% httr2::req_user_agent("https://github.com/CorrelAid/restatis") %>% httr2::req_url_path_append(endpoint) %>% httr2::req_url_query(!!!gen_auth_get(database = "regio"), ...) %>% httr2::req_retry(max_tries = 3) %>% httr2::req_perform() + } #------------------------------------------------------------------------------- -#' Low-level function to interact with the German Zensus 2022 database +#' gen_zensus_api +#' +#' @description Low-level function to interact with the Zensus 2022 database #' -#' @param endpoint The endpoint of the API that is to be queried +#' @param endpoint Character string. The endpoint of the API that is to be queried. #' #' @importFrom httr2 `%>%` #' #' @noRd #' #' @examples +#' \dontrun{ #' gen_zensus_api("helloworld/logincheck") %>% #' httr2::resp_body_json() +#' } #' gen_zensus_api <- function(endpoint, ...) { + httr2::request("https://ergebnisse2011.zensus2022.de/api/rest/2020") %>% httr2::req_user_agent("https://github.com/CorrelAid/restatis") %>% httr2::req_url_path_append(endpoint) %>% httr2::req_url_query(!!!gen_auth_get(database = "zensus"), ...) %>% httr2::req_retry(max_tries = 3) %>% httr2::req_perform() + } diff --git a/R/gen_auth.R b/R/gen_auth.R index 3a0ae26..e92dbed 100644 --- a/R/gen_auth.R +++ b/R/gen_auth.R @@ -1,8 +1,9 @@ #' gen_auth_save #' -#' @param database The database to store credentials for ('all', 'zensus', 'genesis', 'regio'). +#' @description Save credentials of the different databases for further convenient use +#' +#' @param database Character string. The database to store credentials for ('all', 'genesis', 'zensus' or 'regio'). #' -#' @description Save credentials of the different databases #' @details Username and password are encrypted and saved as RDS in the #' package config directory. A random string is generated and stored in the #' session environment variable `RESTATIS_KEY`. This string is used as the key @@ -13,14 +14,20 @@ #' #' @export #' +#' @examples +#' \dontrun{ +#' gen_auth_save("zensus") +#' } +#' +#' gen_auth_save <- function(database = c("all", "genesis", "zensus", "regio")) { - #----------------------------------------------------------------------------- - if (missing(database)) stop("You have to specify a value for parameter 'database'.", call. = FALSE) - if(database == "genesis"){ + #----------------------------------------------------------------------------- + + if (database == "genesis"){ username <- gen_auth_ask("username") password <- gen_auth_ask("password") @@ -31,7 +38,7 @@ gen_auth_save <- function(database = c("all", "genesis", "zensus", "regio")) { Sys.setenv(RESTATIS_KEY = key) - message("Saving 'GENESIS' database credentials to ", + message("Saving GENESIS database credentials to ", auth_path, "\n\n", "Please add the following line to your .Renviron, ", @@ -63,7 +70,7 @@ gen_auth_save <- function(database = c("all", "genesis", "zensus", "regio")) { Sys.setenv(ZENSUS_KEY = key) - message("Saving 'Zensus' database credentials to ", + message("Saving Zensus 2022 database credentials to ", auth_path, "\n\n", "Please add the following line to your .Renviron, ", @@ -95,7 +102,7 @@ gen_auth_save <- function(database = c("all", "genesis", "zensus", "regio")) { Sys.setenv(REGIO_KEY = key) - message("Saving 'Regionalstatistik' database credentials to ", + message("Saving regionalstatistik.de database credentials to ", auth_path, "\n\n", "Please add the following line to your .Renviron, ", @@ -118,7 +125,7 @@ gen_auth_save <- function(database = c("all", "genesis", "zensus", "regio")) { } else if (database == "all"){ - message("~~ Saving credentials for 'GENESIS' database.") + message("~~ Saving credentials for GENESIS database.") username <- gen_auth_ask("username") password <- gen_auth_ask("password") @@ -129,7 +136,7 @@ gen_auth_save <- function(database = c("all", "genesis", "zensus", "regio")) { Sys.setenv(RESTATIS_KEY = key) - message("Saving 'GENESIS' database credentials to ", + message("Saving GENESIS database credentials to ", auth_path, "\n\n", "Please add the following line to your .Renviron, ", @@ -150,7 +157,7 @@ gen_auth_save <- function(database = c("all", "genesis", "zensus", "regio")) { #------------------------------------------------------------------------- - message("~~ Saving credentials for 'Zensus' database.") + message("~~ Saving credentials for Zensus 2022 database.") username <- gen_auth_ask("username") password <- gen_auth_ask("password") @@ -161,7 +168,7 @@ gen_auth_save <- function(database = c("all", "genesis", "zensus", "regio")) { Sys.setenv(ZENSUS_KEY = key) - message("Saving 'Zensus' database credentials to ", + message("Saving Zensus 2022 database credentials to ", auth_path, "\n\n", "Please add the following line to your .Renviron, ", @@ -182,7 +189,7 @@ gen_auth_save <- function(database = c("all", "genesis", "zensus", "regio")) { #------------------------------------------------------------------------- - message("~~ Saving credentials for 'Regionalstatistik' database.") + message("~~ Saving credentials for regionalstatistik.de database.") username <- gen_auth_ask("username") password <- gen_auth_ask("password") @@ -193,7 +200,7 @@ gen_auth_save <- function(database = c("all", "genesis", "zensus", "regio")) { Sys.setenv(REGIO_KEY = key) - message("Saving 'Regionalstatistik' database credentials to ", + message("Saving regionalstatistik.de database credentials to ", auth_path, "\n\n", "Please add the following line to your .Renviron, ", @@ -216,7 +223,8 @@ gen_auth_save <- function(database = c("all", "genesis", "zensus", "regio")) { } else { - stop("Invalid 'database' argument. Please choose 'genesis', 'zensus', 'regio' or 'all'.") + stop("Invalid 'database' argument. Please choose 'all', 'genesis', 'zensus' or 'regio'.", + call. = FALSE) } @@ -226,11 +234,19 @@ gen_auth_save <- function(database = c("all", "genesis", "zensus", "regio")) { #' gen_auth_get #' -#' @param database Takes values of 'all', 'genesis', 'zensus' and 'regio' +#' @description Function to retrieve the credentials stored via \code{gen_auth_save()} +#' +#' @param database Character string. The database to get the credentials for ('all', 'genesis', 'zensus' and 'regio'). #' #' @return Credentials for the database(s) chosen by the user #' @export #' +#' @examples +#' \dontrun{ +#' gen_auth_get("all") +#' } +#' +#' gen_auth_get <- function(database = c("all", "genesis", "zensus", "regio")) { #----------------------------------------------------------------------------- @@ -239,7 +255,7 @@ gen_auth_get <- function(database = c("all", "genesis", "zensus", "regio")) { if (!(database %in% c("all", "genesis", "zensus", "regio"))) { - stop("Misspecification of parameter 'database': Must only be 'all', 'zensus', 'regio' or 'genesis'.", + stop("Misspecification of parameter 'database': Must only be 'all', 'genesis', 'zensus' or 'regio'.", call. = FALSE) } @@ -261,7 +277,7 @@ gen_auth_get <- function(database = c("all", "genesis", "zensus", "regio")) { if (!all(database %in% c("genesis", "zensus", "regio"))) { - stop("Misspecification of parameter 'database': Must only be 'zensus', 'regio' or 'genesis'.", + stop("Misspecification of parameter 'database': Must only be 'genesis', 'zensus' or 'regio'.", call. = FALSE) } @@ -280,8 +296,8 @@ gen_auth_get <- function(database = c("all", "genesis", "zensus", "regio")) { if (!(file.exists(auth_path) && nzchar(Sys.getenv("RESTATIS_KEY")))) { - stop(paste0("'GENESIS' database credentials not found. ", - "Please run 'gen_auth_save()' to store 'GENESIS' database username and password."), + stop(paste0("GENESIS database credentials not found. ", + "Please run 'gen_auth_save()' to store GENESIS database username and password."), call. = FALSE) } @@ -296,8 +312,8 @@ gen_auth_get <- function(database = c("all", "genesis", "zensus", "regio")) { if (!(file.exists(auth_path) && nzchar(Sys.getenv("ZENSUS_KEY")))) { - stop(paste0("'Zensus' database credentials not found. ", - "Please run 'gen_auth_save()' to store 'Zensus' database username and password."), + stop(paste0("Zensus 2022 database credentials not found. ", + "Please run 'gen_auth_save()' to store Zensus 2022 database username and password."), call. = FALSE) } @@ -312,8 +328,8 @@ gen_auth_get <- function(database = c("all", "genesis", "zensus", "regio")) { if (!(file.exists(auth_path) && nzchar(Sys.getenv("REGIO_KEY")))) { - stop(paste0("'Regionalstatistik' database credentials not found. ", - "Please run 'gen_auth_save()' to store 'Regionalstatistik' database username and password."), + stop(paste0("regionalstatistik.de database credentials not found. ", + "Please run 'gen_auth_save()' to store regionalstatistik.de database username and password."), call. = FALSE) } @@ -328,13 +344,13 @@ gen_auth_get <- function(database = c("all", "genesis", "zensus", "regio")) { if (!(file.exists(auth_path) && nzchar(Sys.getenv("RESTATIS_KEY")))) { - stop(paste0("'GENESIS' database credentials not found. ", - "Please run 'gen_auth_save()' to store 'GENESIS' database username and password."), + stop(paste0("GENESIS database credentials not found. ", + "Please run 'gen_auth_save()' to store GENESIS database username and password."), call. = FALSE) } - message("Password for database 'GENESIS':\n") + message("Credentials for database GENESIS:\n") print(httr2::secret_read_rds(auth_path, "RESTATIS_KEY")) #--------------------------------------------------------------------------- @@ -343,13 +359,13 @@ gen_auth_get <- function(database = c("all", "genesis", "zensus", "regio")) { if (!(file.exists(auth_path) && nzchar(Sys.getenv("ZENSUS_KEY")))) { - stop(paste0("'Zensus' database credentials not found. ", - "Please run 'gen_auth_save()' to store 'Zensus' database username and password."), + stop(paste0("Zensus 2022 database credentials not found. ", + "Please run 'gen_auth_save()' to store Zensus 2022 database username and password."), call. = FALSE) } - message("Password for database 'Zensus':\n") + message("Credentials for database Zensus 2022:\n") print(httr2::secret_read_rds(auth_path, "ZENSUS_KEY")) #--------------------------------------------------------------------------- @@ -358,13 +374,13 @@ gen_auth_get <- function(database = c("all", "genesis", "zensus", "regio")) { if (!(file.exists(auth_path) && nzchar(Sys.getenv("REGIO_KEY")))) { - stop(paste0("'Regionalstatistik' database credentials not found. ", - "Please run 'gen_auth_save()' to store 'Regionalstatistik' database username and password."), + stop(paste0("regionalstatistik.de database credentials not found. ", + "Please run 'gen_auth_save()' to store regionalstatistik.de database username and password."), call. = FALSE) } - message("Password for database 'regionalstatistik.de:\n") + message("Credentials for database regionalstatistik.de:\n") print(httr2::secret_read_rds(auth_path, "REGIO_KEY")) } # End of 'else if (database == "all")' @@ -381,13 +397,13 @@ gen_auth_get <- function(database = c("all", "genesis", "zensus", "regio")) { if (!(file.exists(auth_path) && nzchar(Sys.getenv("RESTATIS_KEY")))) { - stop(paste0("'GENESIS' database credentials not found. ", - "Please run 'gen_auth_save()' to store 'GENESIS' database username and password."), + stop(paste0("GENESIS database credentials not found. ", + "Please run 'gen_auth_save()' to store GENESIS database username and password."), call. = FALSE) } - message("Password for database 'GENESIS':\n") + message("Credentials for database GENESIS:\n") print(httr2::secret_read_rds(auth_path, "RESTATIS_KEY")) } @@ -400,13 +416,13 @@ gen_auth_get <- function(database = c("all", "genesis", "zensus", "regio")) { if (!(file.exists(auth_path) && nzchar(Sys.getenv("ZENSUS_KEY")))) { - stop(paste0("'Zensus' database credentials not found. ", - "Please run 'gen_auth_save()' to store 'Zensus' database username and password."), + stop(paste0("Zensus 2022 database credentials not found. ", + "Please run 'gen_auth_save()' to store Zensus 2022 database username and password."), call. = FALSE) } - message("Password for database 'Zensus':\n") + message("Credentials for database Zensus 2022:\n") print(httr2::secret_read_rds(auth_path, "ZENSUS_KEY")) } @@ -419,13 +435,13 @@ gen_auth_get <- function(database = c("all", "genesis", "zensus", "regio")) { if (!(file.exists(auth_path) && nzchar(Sys.getenv("REGIO_KEY")))) { - stop(paste0("'Regionalstatistik' database credentials not found. ", - "Please run 'gen_auth_save()' to store 'Regionalstatistik' database username and password."), + stop(paste0("regionalstatistik.de database credentials not found. ", + "Please run 'gen_auth_save()' to store regionalstatistik.de database username and password."), call. = FALSE) } - message("Password for database 'regionalstatistik.de:\n") + message("Credentials for database regionalstatistik.de:\n") print(httr2::secret_read_rds(auth_path, "REGIO_KEY")) } @@ -440,14 +456,12 @@ gen_auth_get <- function(database = c("all", "genesis", "zensus", "regio")) { #' gen_auth_ask #' -#' @param credential_type Type of credential to ask for +#' @param credential_type Character string. Type of credential to ask for #' #' @return The user response #' gen_auth_ask <- function(credential_type) { - - val <- askpass::askpass(paste0("Please enter your ", credential_type, ": ")) if (is.null(val)) { diff --git a/R/gen_catalogue.R b/R/gen_catalogue.R index b16fd57..0ffc946 100644 --- a/R/gen_catalogue.R +++ b/R/gen_catalogue.R @@ -1,24 +1,24 @@ -#' catalogue: Explore Different Objects and Their Structural Embedding in Genesis/Zensus +#' gen_catalogue #' -#' Function to enable searching for tables, statistics, and cubes from Genesis or Zensus. Additionally, it structures the Genesis-output based on the internal tree structure of Genesis itself based on the EVAS-numbers. Time-series are represented as cubes with a specified time span in Genesis. Important note: To be useful in searching for objects it is highly recommended to work with "*"-placeholders (see examples). The placeholder can be placed before and/or after the search term. +#' @description Function to search for tables, statistics, and cubes from GENESIS, Zensus 2022 or regionalstatistik.de. Additionally, it structures the output based on the internal tree structure based on the EVAS-numbers. Time-series are represented as cubes with a specified time span. Important note: To be useful in searching for objects it is highly recommended to work with "*" placeholders (see examples). The placeholder can be placed before and/or after the search term. #' -#' @param code A string with a maximum length of 10 characters for a Genesis-Object and 15 characters for a Zensus-Object. Only one code per iteration. "*"-Notations are possible. -#' @param database Character string. Indicator if the Genesis or Zensus database is called. Only one database can be addressed per function call. Default option is 'genesis'. -#' @param category A string. Includes specific Genesis-Object-types: 'tables', 'statistics', and 'cubes' - and specific Zensus-Object-types: "tables" and "statistics". All types that are specific for one database can be used together. Default option is to use all types that are possible for the specific database. -#' @param area A string. Indicator from which area of the database the results are called. In general, "all" is the appropriate solution. Default option is 'all'. Not used for "statistics". -#' @param detailed A logical. Indicator if the function should return the detailed output of the iteration including all object-related information or only a shortened output including only code and object title. Default option is 'FALSE'. -#' @param error.ignore A logical. Indicator if the function should stop if an error occurs or no object for the request is found or if it should produce a token as response. Default option is 'FALSE'. -#' @param sortcriterion A string. Indicator if the output should be sorted by 'code' or 'content'. This is a parameter of the Genesis/Zensus API call itself. The default is "code". -#' @param verbose Logical. Indicator if the output of the function should include detailed messages and warnings. Default option is 'TRUE'. Set the parameter to 'FALSE' to suppress additional messages and warnings. -#' @param ... Additional parameters for the Genesis/Zensus API call. These parameters are only affecting the Genesis/Zensus call itself, no further processing. For more details see `vignette("additional_parameter")`. +#' @param code String with a maximum length of 10 characters for a database object (GENESIS and regionalstatistik.de) and 15 characters for a Zensus 2022 object. Only one code per iteration. "*" notations are possible. +#' @param database Character string. Indicator if the GENESIS ('genesis'), Zensus 2022 ('zensus') or regionalstatistik.de ('regio') database is called. Only one database can be addressed per function call. Default option is 'genesis'. +#' @param category Character string. Specify specific GENESIS/regionalstatistik.de object types ('tables', 'statistics' and 'cubes') and specific Zensus 2022 object types ('tables' and 'statistics'). All types that are specific for one database can be used together. Default option is to use all types that are possible for the specific database. +#' @param area Character string. Indicator from which area of the database the results are called. In general, 'all' is the appropriate solution. Default option is 'all'. Not used for 'statistics'. +#' @param detailed Boolean. Indicator if the function should return the detailed output of the iteration including all object-related information or only a shortened output including only code and object title. Default option is 'FALSE'. +#' @param error.ignore Boolean. Indicator if the function should stop if an error occurs or no object for the request is found or if it should produce a token as response. Default option is 'FALSE'. +#' @param sortcriterion Character string. Indicator if the output should be sorted by 'code' or 'content'. This is a parameter of the API call itself. The default is 'code'. +#' @param verbose Boolean. Indicator if the output of the function should include detailed messages and warnings. Default option is 'TRUE'. Set the parameter to 'FALSE' to suppress additional messages and warnings. +#' @param ... Additional parameters for the API call. These parameters are only affecting the call itself, no further processing. For more details see `vignette("additional_parameter")`. #' -#' @return A list with all recalled elements from Genesis/Zensus API. Based on the detailed-parameter it contains more or less information, but always includes the code of the object, the title, and the type of the object. This is done to facilitate further processing with the data. Attributes are added to the dataframe describing the search configuration for the returned output. +#' @return A list with all recalled elements from the API. Based on the 'detailed' parameter it contains more or less information, but always includes the code of the object, the title, and the type of the object. This is done to facilitate further processing with the data. Attributes are added to the data.frame describing the search configuration for the returned output. #' @export #' #' @examples #' \dontrun{ -#' # Scroll through Objects under the topic "12*" -#' # which is "Bevölkerung" in Destatis from all categories and +#' # Scroll through objects under the topic "12*" +#' # which is "Bevoelkerung" in GENESIS from all categories and #' # with a detailed output #' object <- gen_catalogue(code = "12*", detailed = T) #' @@ -61,41 +61,44 @@ gen_catalogue <- function(code = NULL, # Processing #### res <- lapply(gen_fun, function(db){ - if(verbose) { + if (verbose) { + info <- paste("Started the processing of", rev_database_function(db), "database.") + message(info) + } #--------------------------------------------------------------------------- + if ("cubes" %in% category && db == "gen_zensus_api") { - list_of_cubes <- "No 'cubes' object available for 'zensus' database." + list_of_cubes <- "There are generally no 'cubes' objects available for the 'zensus' database." } else if ("cubes" %in% category && (db == "gen_api" | db == "gen_regio_api")) { - results_raw <- do.call(db, list( - endpoint = "catalogue/cubes", - username = gen_auth_get(database = rev_database_function(db))$username, - password = gen_auth_get(database = rev_database_function(db))$password, - selection = code, - sortcriterion = sortcriterion, - area = area, - ... - )) + results_raw <- do.call(db, + list(endpoint = "catalogue/cubes", + username = gen_auth_get(database = rev_database_function(db))$username, + password = gen_auth_get(database = rev_database_function(db))$password, + selection = code, + sortcriterion = sortcriterion, + area = area, + ...)) results_json <- test_if_json(results_raw) empty_object <- test_if_error(results_json, para = error.ignore, verbose = verbose) - if(isTRUE(empty_object)){ + if (isTRUE(empty_object)){ list_of_cubes <- "No 'cubes' object found for your request." - } else if(isFALSE(empty_object)){ + } else if (isFALSE(empty_object)){ list_of_cubes <- results_json$Status$Content - } else if(empty_object == "DONE"){ + } else if (empty_object == "DONE"){ if (isTRUE(detailed)) { @@ -113,8 +116,6 @@ gen_catalogue <- function(code = NULL, characteristics = c("Code", "Content")) - - } list_of_cubes$Object_Type <- "cube" @@ -122,19 +123,19 @@ gen_catalogue <- function(code = NULL, list_of_cubes <- tibble::as_tibble(list_of_cubes) } + } #--------------------------------------------------------------------------- + if ("statistics" %in% category) { - par_list <- list( - endpoint = "catalogue/statistics", - username = gen_auth_get(database = rev_database_function(db))$username, - password = gen_auth_get(database = rev_database_function(db))$password, - selection = db, - sortcriterion = sortcriterion, - ... - ) + par_list <- list(endpoint = "catalogue/statistics", + username = gen_auth_get(database = rev_database_function(db))$username, + password = gen_auth_get(database = rev_database_function(db))$password, + selection = db, + sortcriterion = sortcriterion, + ...) results_raw <- do.call(db, par_list) @@ -142,54 +143,50 @@ gen_catalogue <- function(code = NULL, empty_object <- test_if_error(results_json, para = error.ignore, verbose = verbose) - if(isTRUE(empty_object)){ + if (isTRUE(empty_object)){ - list_of.stats <- "No 'statistics' object found for your request." + list_of_stats <- "No 'statistics' object found for your request." - } else if(isFALSE(empty_object)){ + } else if (isFALSE(empty_object)){ - list_of.stats <- results_json$Status$Content + list_of_stats <- results_json$Status$Content - } else if(empty_object == "DONE"){ + } else if (empty_object == "DONE"){ if (isTRUE(detailed)) { - list_of.stats <- binding_lapply(results_json$List, + list_of_stats <- binding_lapply(results_json$List, characteristics = c("Code", "Content", "Cubes", "Information")) - } else { - list_of.stats <- binding_lapply(results_json$List, + list_of_stats <- binding_lapply(results_json$List, characteristics = c("Code", "Content")) - - - } - list_of.stats$Object_Type <- "statistic" + list_of_stats$Object_Type <- "statistic" - list_of.stats <- tibble::as_tibble(list_of.stats) + list_of_stats <- tibble::as_tibble(list_of_stats) } + } #--------------------------------------------------------------------------- + if ("tables" %in% category) { - par_list <- list( - endpoint = "catalogue/tables", - username = gen_auth_get(database = rev_database_function(db))$username, - password = gen_auth_get(database = rev_database_function(db))$password, - selection = code, - area = area, - sortcriterion = sortcriterion, - ... - ) + par_list <- list(endpoint = "catalogue/tables", + username = gen_auth_get(database = rev_database_function(db))$username, + password = gen_auth_get(database = rev_database_function(db))$password, + selection = code, + area = area, + sortcriterion = sortcriterion, + ...) results_raw <- do.call(db, par_list) @@ -197,54 +194,54 @@ gen_catalogue <- function(code = NULL, empty_object <- test_if_error(results_json, para = error.ignore, verbose = verbose) - if(isTRUE(empty_object)){ + if (isTRUE(empty_object)){ - list_of.tabs <- "No 'tables' object found for your request." + list_of_tabs <- "No 'tables' object found for your request." - } else if(isFALSE(empty_object)){ + } else if (isFALSE(empty_object)){ - list_of.tabs <- results_json$Status$Content + list_of_tabs <- results_json$Status$Content - } else if(empty_object == "DONE"){ + } else if (empty_object == "DONE"){ if (isTRUE(detailed)) { - list_of.tabs <- binding_lapply(results_json$List, + list_of_tabs <- binding_lapply(results_json$List, characteristics = c("Code", "Content", "Time")) - - } else { - list_of.tabs <- binding_lapply(results_json$List, + list_of_tabs <- binding_lapply(results_json$List, characteristics = c("Code", "Content")) } - list_of.tabs$Object_Type <- "table" + list_of_tabs$Object_Type <- "table" - list_of.tabs <- tibble::as_tibble(list_of.tabs) + list_of_tabs <- tibble::as_tibble(list_of_tabs) } + } #--------------------------------------------------------------------------- - # Summary #### + # Summary # + if (all(c("tables", "statistics", "cubes") %in% category)) { - list_resp <- list( - "Cubes" = if(length(list_of_cubes) == 1 | db == "gen_zensus_api"){tibble::as_tibble(list_of_cubes)} else {forming_evas(list_of_cubes)}, - "Statistics" = if(length(list_of.stats) == 1 | db == "gen_zensus_api"){tibble::as_tibble(list_of.stats)} else {forming_evas(list_of.stats)}, - "Tables" = if(length(list_of.tabs) == 1 | db == "gen_zensus_api"){tibble::as_tibble(list_of.tabs)} else {forming_evas(list_of.tabs)} - ) + list_resp <- list("Cubes" = if(length(list_of_cubes) == 1 | db == "gen_zensus_api"){tibble::as_tibble(list_of_cubes)} else {forming_evas(list_of_cubes)}, + "Statistics" = if(length(list_of_stats) == 1 | db == "gen_zensus_api"){tibble::as_tibble(list_of_stats)} else {forming_evas(list_of_stats)}, + "Tables" = if(length(list_of_tabs) == 1 | db == "gen_zensus_api"){tibble::as_tibble(list_of_tabs)} else {forming_evas(list_of_tabs)}) + + #--------------------------------------------------------------------------- } else if ("cubes" %in% category) { - if(length(list_of_cubes) == 1 && db == "gen_zensus_api"){ + if (length(list_of_cubes) == 1 && db == "gen_zensus_api"){ list_resp <- list_of_cubes @@ -258,44 +255,55 @@ gen_catalogue <- function(code = NULL, } + #--------------------------------------------------------------------------- } else if ("statistics" %in% category) { - if(length(list_of.stats) == 1 | db == "gen_zensus_api"){ + if (length(list_of_stats) == 1 | db == "gen_zensus_api"){ - list_resp <- list("Statistics" = tibble::as_tibble(list_of.stats)) + list_resp <- list("Statistics" = tibble::as_tibble(list_of_stats)) } else { - list_resp <- list("Statistics" = forming_evas(list_of.stats)) + list_resp <- list("Statistics" = forming_evas(list_of_stats)) } + + #--------------------------------------------------------------------------- } else if ("tables" %in% category) { - if(length(list_of.tabs) == 1 | db == "gen_zensus_api"){ + if(length(list_of_tabs) == 1 | db == "gen_zensus_api"){ - list_resp <- list("Tables" = tibble::as_tibble(list_of.tabs)) + list_resp <- list("Tables" = tibble::as_tibble(list_of_tabs)) } else { - list_resp <- list("Tables" = forming_evas(list_of.tabs)) + list_resp <- list("Tables" = forming_evas(list_of_tabs)) } } + #--------------------------------------------------------------------------- + attr(list_resp, "Code") <- code attr(list_resp, "Database") <- rev_database_function(db) attr(list_resp, "Category") <- category - if(length(category) == 1 && "cubes" %in% category && db == "gen_zensus_api"){ + + if (length(category) == 1 && "cubes" %in% category && db == "gen_zensus_api"){ + attr(list_resp, "Info") <- "NO API call done" + } else { + attr(list_resp, "Language") <- results_json$Parameter$language attr(list_resp, "Pagelength") <- results_json$Parameter$pagelength attr(list_resp, "Copyright") <- results_json$Copyright + } return(list_resp) + }) #----------------------------------------------------------------------------- diff --git a/R/gen_cube.R b/R/gen_cube.R index e290d4b..fb75b6c 100644 --- a/R/gen_cube.R +++ b/R/gen_cube.R @@ -1,38 +1,39 @@ #' gen_cube #' -#' @description Download a cube with data from Genesis +#' @description Download a cube with data from GENESIS or regionalstatistik.de database #' -#' @param name Name of the data cube -#' @param ... Optional parameters passed on to the Genesis API call: +#' @param name Character string for a cube object (only GENESIS and regionalstatistik.de) +#' @param ... Further (optional) parameters passed on to the API call: #' \describe{ -#' \item{\code{area}}{a string. The area in which the table is stored. Possible values: +#' \item{\code{area}}{Character string. The area in which the table is stored. Possible values: #' \itemize{ #' \item \code{"public"}: cube in the public catalogue #' \item \code{"user"}: cube in the user's account +#' \item \code{"all"}: both of the above #' }} -#' \item{\code{values}}{a logical. Should values be included?} -#' \item{\code{metadata}}{a logical. Should metadata be included?} -#' \item{\code{additionals}}{a logical. Should additional metadata be included?} -#' \item{\code{contents}}{a string. Names of required statistical specifications} -#' \item{\code{startyear,endyear}}{a number. Only retrieve data between these years.} -#' \item{\code{timeslices}}{a number. Number of timeslices (cumulative to startyear or endyear)} -#' \item{\code{regionalvariable}}{character. Code of the regional variable +#' \item{\code{values}}{Boolean. Should values be included?} +#' \item{\code{metadata}}{Boolean. Should metadata be included?} +#' \item{\code{additionals}}{Boolean. Should additional metadata be included?} +#' \item{\code{contents}}{Character string. Names of required statistical specifications} +#' \item{\code{startyear,endyear}}{Four-digit integers. Only retrieve data between these years.} +#' \item{\code{timeslices}}{Integer. Number of timeslices (cumulative to startyear or endyear)} +#' \item{\code{regionalvariable}}{Character string. Code of the regional variable #' whose value is specified in \code{regionalkey} to filter the results.} -#' \item{\code{regionalkey}}{character. One or more regional keys. Multiple +#' \item{\code{regionalkey}}{Character string. One or more regional keys. Multiple #' values can be supplied as a character vector or as a single string, #' with the regional keys separated by commas. Use of wildcard (`*`) allowed.} #' \item{\code{classifyingvariable1,classifyingvariable2 -#' ,classifyingvariable3}}{character. Code of the subject classification +#' ,classifyingvariable3}}{Character string. Code of the subject classification #' (SK-Merkmal) to which the selection by means of the corresponding #' `classifyingkey` parameter is to be applied.} -#' \item{\code{classifyingkey1,classifyingkey2,classifyingkey3}}{character. +#' \item{\code{classifyingkey1,classifyingkey2,classifyingkey3}}{Character string. #' One or more values of a subject classification (e.g. "WZ93012"). Applied #' to the corresponding `classifyingvariable` parameter. Multiple #' keys can be supplied as a character vector or as a single string, #' with the keys separated by commas. Use of wildcard (`*`) allowed.} -#' \item{\code{stand}}{a string \code{"DD.MM.YYYY"}. Only retrieve data -#' updated after this #' date.} -#' \item{\code{language}}{Search terms, returned messages and data +#' \item{\code{stand}}{Character string, format: \code{"DD.MM.YYYY"}. Only retrieve data +#' updated after this date.} +#' \item{\code{language}}{Character string. Search terms, returned messages and data #' descriptions in German (`"de"`) or English (`"en"`)?} #' } #' @@ -75,7 +76,9 @@ gen_cube_ <- function(name, area <- match.arg(area) if (!isTRUE(language == "en")) { + area <- switch(area, public = "\u00F6ffentlich", user = "benutzer") + } param_check_year(startyear) @@ -114,6 +117,8 @@ gen_cube_ <- function(name, language = language, job = FALSE) + #----------------------------------------------------------------------------- + } else if (database == "regio") { cube_raw <- gen_regio_api("data/cubefile", @@ -140,7 +145,7 @@ gen_cube_ <- function(name, } else { - stop("Wrong specification of parameter 'database' (must be 'regio' or 'genesis').", + stop("Wrong specification of parameter 'database' (must only be 'regio' or 'genesis').", call. = FALSE) } @@ -156,6 +161,10 @@ gen_cube_ <- function(name, #------------------------------------------------------------------------------- +#' read_cube +#' +#' @param resp API response object resulting from a call to 'data/cubefile' +#' read_cube <- function(resp) { cube_str <- resp %>% @@ -176,6 +185,10 @@ read_cube <- function(resp) { #------------------------------------------------------------------------------- +#' split_cube +#' +#' @param lines Lines to split a cube +#' split_cube <- function(lines) { block_idx <- ifelse(is_cube_metadata_header(lines), seq_along(lines), NA) @@ -188,6 +201,10 @@ split_cube <- function(lines) { #------------------------------------------------------------------------------- +#' is_cube_metadata_header +#' +#' @param lines Lines to check for header +#' is_cube_metadata_header <- function(lines) { startsWith(lines, "K") @@ -196,6 +213,10 @@ is_cube_metadata_header <- function(lines) { #------------------------------------------------------------------------------- +#' read_cube_block +#' +#' @param lines Lines to read as header +#' read_cube_block <- function(lines) { header <- read_cube_metadata_header(lines[1]) @@ -207,6 +228,11 @@ read_cube_block <- function(lines) { #------------------------------------------------------------------------------- +#' read_cube_metadata_header +#' +#' @param line Line to read +#' @param rename_dups Rename duplicates? +#' read_cube_metadata_header <- function(line, rename_dups = TRUE) { stopifnot(length(line) == 1L) @@ -227,6 +253,11 @@ read_cube_metadata_header <- function(line, rename_dups = TRUE) { #------------------------------------------------------------------------------- +#' read_cube_data_lines +#' +#' @param lines Lines to read data from +#' @param col_names Specify column names +#' read_cube_data_lines <- function(lines, col_names) { lines <- sub("D;", "", lines, fixed = TRUE) @@ -243,6 +274,10 @@ read_cube_data_lines <- function(lines, col_names) { #------------------------------------------------------------------------------- +#' rename_cube_data_columns +#' +#' @param cube A cube object to rename the columns in +#' rename_cube_data_columns <- function(cube) { data_cols <- names(cube$QEI) diff --git a/R/gen_find.R b/R/gen_find.R index f6567a5..2bd82b2 100644 --- a/R/gen_find.R +++ b/R/gen_find.R @@ -1,33 +1,33 @@ -#' find: Search for Different Objects in Genesis/Zensus +#' gen_find #' -#' @description Function to search through Genesis/Zensus. It is similar in usage as the search function on the Destatis main page (https://www.destatis.de/DE/Home/_inhalt.html). -#' In the search query, "UND" (german word for: and; can also be written "und" or "&") as well as "ODER" (german word for: or; can also be written "oder" or "|") can be included and logically combined. Furthermore, wildcards are possible by including "*". If more then one word is included in the term-string, automatically "and" is used to combine the different words. -#' Important note: Time-series are treated as cubes in Genesis, they are not longer distinguished. If you want to find a specific object with a clear code with this find function, you need to specify the object type or search for all object types. +#' @description Function to search through the databases GENESIS, Zensus 2022 and regionalstatistik.de. It is similar in usage as the search function on the GENESIS main page (https://www-genesis.destatis.de/genesis/online). +#' In the search query, "UND" (German word for 'and', also written "und" or "&") as well as "ODER" (German word for 'or', also written "oder" or "|") can be included and logically combined. Furthermore, wildcards are possible by including "*". If more then one word is included in the term string, 'and' is used automatically to combine the different words. +#' Important note: Time-series are treated as cubes in GENESIS and regionalstatistik.de, they are not longer distinguished. If you want to find a specific object with a clear code with this find function, you need to specify the object type or search for all object types. #' -#' @param term A string with no maximum character length, but a word limit of five words. -#' @param database Character string. Indicator if the Genesis or Zensus database is called. Default option is 'genesis'. -#' @param category A string. Includes specific Genesis-Object-types: ''tables', 'statistics', 'variables', and 'cubes' - and specific Zensus-Object-types: "tables", "statistics", and "variables". All types that are specific for one database can be used together. Default option is to use all types that are possible for the specific database indicated by 'all'. -#' @param detailed A logical. Indicator if the function should return the detailed output of the iteration including all object related information or only a shortened output including only code and object title. Default Option is 'FALSE'. +#' @param term A character string with no maximum character length, but a word limit of five words. +#' @param database Character string. Indicator if the GENESIS ('genesis'), Zensus 2022 ('zensus') or regionalstatistik.de ('regio') database is called. Only one database can be addressed per function call. Default option is 'genesis'. +#' @param category Character string. Specify specific GENESIS/regionalstatistik.de object types ('tables', 'statistics' and 'cubes') and specific Zensus 2022 object types ('tables' and 'statistics'). All types that are specific for one database can be used together. Default option is to use all types that are possible for the specific database. +#' @param detailed Boolean. Indicator if the function should return the detailed output of the iteration including all object-related information or only a shortened output including only code and object title. Default option is 'FALSE'. #' @param ordering A logical. Indicator if the function should return the output of the iteration ordered first based on the fact if the searched term is appearing in the title of the object and secondly on an estimator of the number of variables in this object. Default option is 'TRUE'. -#' @param error.ignore A logical. Indicator if the function should stop if an error occurs or no object for the request is found or if it should produce an artificial response (e.g., for complex processes not to fail). Default option is 'FALSE'. -#' @param verbose Logical. Indicator if the output of the function should include detailed messages and warnings. Default option is 'TRUE'. Set the parameter to 'FALSE' to suppress additional messages and warnings. -#' @param ... Additional parameters for the Genesis/Zensus API call. These parameters are only affecting the Genesis/Zensus call itself, no further processing. For more details see `vignette("additional_parameter")`. +#' @param error.ignore Boolean. Indicator if the function should stop if an error occurs or no object for the request is found or if it should produce a token as response. Default option is 'FALSE'. +#' @param verbose Boolean. Indicator if the output of the function should include detailed messages and warnings. Default option is 'TRUE'. Set the parameter to 'FALSE' to suppress additional messages and warnings. +#' @param ... Additional parameters for the API call. These parameters are only affecting the call itself, no further processing. For more details see `vignette("additional_parameter")`. #' -#' @return A list with all elements retrieved from Genesis/Zensus. Attributes are added to the data.frame describing the search configuration for the returned output. +#' @return A list with all recalled elements from the API. Based on the 'detailed' parameter it contains more or less information, but always includes the code of the object, the title, and the type of the object. This is done to facilitate further processing with the data. Attributes are added to the data.frame describing the search configuration for the returned output. #' @export #' #' @examples #' \dontrun{ -#' # Find objects related to "bus" in Genesis +#' # Find objects related to "bus" in GENESIS #' object <- gen_find(term = "bus") #' -#' # Find tables related to "bus" in Genesis and return a unordered detailed output +#' # Find tables related to "bus" in GENESIS and return a unordered detailed output #' object <- gen_find(term = "bus", detailed = TRUE, ordering = FALSE) #' -#' # Find tables related to "Autos" or "Corona" in Genesis and return a unordered detailed output +#' # Find tables related to "Autos" or "Corona" in GENESIS and return a unordered detailed output #' object <- gen_find(term = "autos ODER corona", detailed = TRUE, ordering = FALSE) #' -#' #' # Find tables related to "Autos" and "Corona" in Genesis and return a unordered detailed output +#' #' # Find tables related to "Autos" and "Corona" in GENESIS and return a unordered detailed output #' object <- gen_find(term = "autos UND corona", detailed = TRUE, ordering = FALSE) #' } #' @@ -59,26 +59,27 @@ gen_find <- function(term = NULL, res <- lapply(gen_fun, function(db){ - if(verbose) { + if (verbose) { + info <- paste("Started the processing of", rev_database_function(db), "database.") + message(info) + } #--------------------------------------------------------------------------- - if(db == "gen_zensus_api" & category == "cubes"){ + if (db == "gen_zensus_api" & category == "cubes") { empty_object <- TRUE } else { - par_list <- list( - endpoint = "find/find", - username = gen_auth_get(database = rev_database_function(db))$username, - password = gen_auth_get(database = rev_database_function(db))$password, - term = term, - category = category, - ... - ) + par_list <- list(endpoint = "find/find", + username = gen_auth_get(database = rev_database_function(db))$username, + password = gen_auth_get(database = rev_database_function(db))$password, + term = term, + category = category, + ...) results_raw <- do.call(db, par_list) @@ -91,7 +92,8 @@ gen_find <- function(term = NULL, } #--------------------------------------------------------------------------- - if(isTRUE(empty_object) && (db == "gen_api" || db == "gen_regio_api")){ + + if (isTRUE(empty_object) && (db == "gen_api" || db == "gen_regio_api")) { list_resp <- list("Output" = "No object found for your request.") @@ -103,9 +105,9 @@ gen_find <- function(term = NULL, return(list_resp) - } else if(isTRUE(empty_object) & db == "gen_zensus_api" ){ + } else if (isTRUE(empty_object) & db == "gen_zensus_api" ){ - list_resp <- list("Output" = "No object found for your request. No cubes at all avalaible in 'zensus'-database.") + list_resp <- list("Output" = "There are generally no 'cubes' objects available for the 'zensus' database.") attr(list_resp, "Term") <- term attr(list_resp, "Database") <- rev_database_function(db) @@ -113,8 +115,7 @@ gen_find <- function(term = NULL, return(list_resp) - } - else if (isFALSE(empty_object)){ + } else if (isFALSE(empty_object)){ list_resp <- list("Output" = results_json$Status$Content) @@ -176,7 +177,8 @@ gen_find <- function(term = NULL, #------------------------------------------------------------------------- - if(db == "gen_api" | db == "gen_regio_api"){ + if (db == "gen_api" | db == "gen_regio_api") { + df_cubes <- binding_lapply(results_json$Cubes, characteristics = c("Code", "Content", @@ -190,31 +192,42 @@ gen_find <- function(term = NULL, df_cubes$Variablen <- spezifisch_create(df_cubes) df_cubes$Object_Type <- "cube" + } #------------------------------------------------------------------------- if (nrow(df_table) != 0) { + df_table$Titel <- titel_search(df_table, term) + } if (nrow(df_stats) != 0) { + df_stats$Titel <- titel_search(df_stats, term) + } if (nrow(df_variables) != 0) { + df_variables$Titel <- titel_search(df_variables, term) + } - if(db == "gen_api" | db == "gen_regio_api"){ + if (db == "gen_api" | db == "gen_regio_api") { + if (nrow(df_cubes) != 0) { + df_cubes$Titel <- titel_search(df_cubes, term) + } + } #------------------------------------------------------------------------- - if(isTRUE(ordering)) { + if (isTRUE(ordering)) { df_table <- df_table[with(df_table, order(-Titel, -Variablen)), c("Code", "Content", @@ -242,7 +255,10 @@ gen_find <- function(term = NULL, "Spezifisch", "Object_Type")] - if(db == "gen_api" | db == "gen_regio_api"){ + #------------------------------------------------------------------- + + if (db == "gen_api" | db == "gen_regio_api") { + df_cubes <- df_cubes[with(df_cubes, order(-Titel, -Variablen)), c( "Code", "Content", "Titel", @@ -253,9 +269,11 @@ gen_find <- function(term = NULL, "Variablen", "Spezifisch", "Object_Type")] + } - } else { + + } else { # End of if (isTRUE(ordering)) df_table <- df_table[, c("Code", "Content", @@ -283,7 +301,10 @@ gen_find <- function(term = NULL, "Spezifisch", "Object_Type")] - if(db == "gen_api" | db == "gen_regio_api"){ + #------------------------------------------------------------------- + + if (db == "gen_api" | db == "gen_regio_api") { + df_cubes <- df_cubes[, c("Code", "Content", "Titel", @@ -294,6 +315,7 @@ gen_find <- function(term = NULL, "Variablen", "Spezifisch", "Object_Type")] + } } @@ -303,7 +325,7 @@ gen_find <- function(term = NULL, list_resp <- list("Tables" = tibble::as_tibble(df_table), "Statistics" = tibble::as_tibble(df_stats), "Variables" = tibble::as_tibble(df_variables), - "Cubes" = if(db == "gen_api" | db == "gen_regio_api"){tibble::as_tibble(df_cubes)} else {"No cubes at all avalaible in 'zensus'-database."}) + "Cubes" = if (db == "gen_api" | db == "gen_regio_api") { tibble::as_tibble(df_cubes) } else { "There are generally no 'cubes' objects available for the 'zensus' database." }) attr(list_resp, "Term") <- results_json$Parameter$term attr(list_resp, "Database") <- rev_database_function(db) @@ -313,7 +335,9 @@ gen_find <- function(term = NULL, return(list_resp) - } + } # End of (if category == "all") + + #----------------------------------------------------------------------- if (category == "tables") { @@ -331,7 +355,9 @@ gen_find <- function(term = NULL, #------------------------------------------------------------------------- if (nrow(df_table) != 0) { + df_table$Titel <- titel_search(df_table, term) + } if (isTRUE(ordering)) { @@ -353,6 +379,7 @@ gen_find <- function(term = NULL, "Variablen", "Spezifisch", "Object_Type")] + } #------------------------------------------------------------------------- @@ -388,10 +415,12 @@ gen_find <- function(term = NULL, #------------------------------------------------------------------------- if (nrow(df_stats) != 0) { + df_stats$Titel <- titel_search(df_stats, term) + } - if(isTRUE(ordering)) { + if (isTRUE(ordering)) { df_stats <- df_stats[with(df_stats, order(-Titel, -Variablen)), c( "Code", "Content", @@ -447,10 +476,12 @@ gen_find <- function(term = NULL, #------------------------------------------------------------------------- if (nrow(df_variables) != 0) { + df_variables$Titel <- titel_search(df_variables, term) + } - if(isTRUE(ordering)) { + if (isTRUE(ordering)) { df_variables <- df_variables[with(df_variables, order(-Titel, -Variablen)), c( "Code", "Content", @@ -485,13 +516,14 @@ gen_find <- function(term = NULL, attr(list_resp, "Copyright") <- results_json$Copyright return(list_resp) + } #--------------------------------------------------------------------------- if (category == "cubes") { - if(db == "gen_api" | db == "gen_regio_api"){ + if (db == "gen_api" | db == "gen_regio_api") { df_cubes <- binding_lapply(results_json$Cubes, characteristics = c("Code", @@ -510,10 +542,12 @@ gen_find <- function(term = NULL, #------------------------------------------------------------------------- if (nrow(df_cubes) != 0) { + df_cubes$Titel <- titel_search(df_cubes, term) + } - if(isTRUE(ordering)) { + if (isTRUE(ordering)) { df_cubes <- df_cubes[with(df_cubes, order(-Titel, -Variablen)), c( "Code", "Content", @@ -552,12 +586,15 @@ gen_find <- function(term = NULL, attr(list_resp, "Copyright") <- results_json$Copyright return(list_resp) + } else { - list_resp <- "No cubes at all avalaible in 'zensus'-database." + list_resp <- "There are generally no 'cubes' objects available for the 'zensus' database." } + } + } #----------------------------------------------------------------------------- @@ -604,7 +641,8 @@ gen_find <- function(term = NULL, #------------------------------------------------------------------------- - if(db == "gen_api" | db == "gen_regio_api"){ + if (db == "gen_api" | db == "gen_regio_api") { + df_cubes <- binding_lapply(results_json$Cubes, characteristics = c("Code", "Content")) @@ -620,26 +658,36 @@ gen_find <- function(term = NULL, #------------------------------------------------------------------------- if (nrow(df_table) != 0) { + df_table$Titel <- titel_search(df_table, term) + } if (nrow(df_stats) != 0) { + df_stats$Titel <- titel_search(df_stats, term) + } if (nrow(df_variables) != 0) { + df_variables$Titel <- titel_search(df_variables, term) + } - if(db == "gen_api" | db == "gen_regio_api"){ + if (db == "gen_api" | db == "gen_regio_api") { + if (nrow(df_cubes) != 0) { + df_cubes$Titel <- titel_search(df_cubes, term) + } + } #------------------------------------------------------------------------- - if(isTRUE(ordering)) { + if (isTRUE(ordering)) { df_table <- df_table[with(df_table, order(-Titel, -Variablen)), c("Code", "Content", @@ -653,11 +701,14 @@ gen_find <- function(term = NULL, "Content", "Object_Type")] - if(db == "gen_api" | db == "gen_regio_api"){ + if (db == "gen_api" | db == "gen_regio_api") { + df_cubes <- df_cubes[with(df_cubes, order(-Titel, -Variablen)), c( "Code", "Content", "Object_Type")] + } + } else { df_table <- df_table[, c("Code", @@ -672,10 +723,12 @@ gen_find <- function(term = NULL, "Content", "Object_Type")] - if(db == "gen_api" | db == "gen_regio_api"){ + if (db == "gen_api" | db == "gen_regio_api") { + df_cubes <- df_cubes[, c("Code", "Content", "Object_Type")] + } } @@ -685,7 +738,7 @@ gen_find <- function(term = NULL, list_resp <- list("Tables" = tibble::as_tibble(df_table), "Statistics" = tibble::as_tibble(df_stats), "Variables" = tibble::as_tibble(df_variables), - "Cubes" = if(db == "gen_api" | db == "gen_regio_api"){tibble::as_tibble(df_cubes)} else {"No cubes at all avalaible in 'zensus'-database."}) + "Cubes" = if (db == "gen_api" | db == "gen_regio_api") { tibble::as_tibble(df_cubes) } else { "There are generally no 'cubes' objects available for the 'zensus' database." }) attr(list_resp, "Term") <- results_json$Parameter$term attr(list_resp, "Database") <- rev_database_function(db) @@ -714,10 +767,12 @@ gen_find <- function(term = NULL, #------------------------------------------------------------------------- if (nrow(df_table) != 0) { + df_table$Titel <- titel_search(df_table, term) + } - if(isTRUE(ordering)) { + if (isTRUE(ordering)) { df_table <- df_table[with(df_table, order(-Titel, -Variablen)), c("Code", "Content", @@ -760,10 +815,13 @@ gen_find <- function(term = NULL, #------------------------------------------------------------------------- if (nrow(df_stats) != 0) { + df_stats$Titel <- titel_search(df_stats, term) + } - if(isTRUE(ordering)) { + if (isTRUE(ordering)) { + df_stats <- df_stats[with(df_stats, order(-Titel, -Variablen)), c( "Code", "Content", "Object_Type")] @@ -787,6 +845,7 @@ gen_find <- function(term = NULL, attr(list_resp, "Copyright") <- results_json$Copyright return(list_resp) + } #--------------------------------------------------------------------------- @@ -806,12 +865,14 @@ gen_find <- function(term = NULL, #------------------------------------------------------------------------- if (nrow(df_variables) != 0) { + df_variables$Titel <- titel_search(df_variables, term) + } #------------------------------------------------------------------------- - if(isTRUE(ordering)) { + if (isTRUE(ordering)) { df_variables <- df_variables[with(df_variables, order(-Titel, -Variablen)), c( "Code", "Content", @@ -836,6 +897,7 @@ gen_find <- function(term = NULL, attr(list_resp, "Copyright") <- results_json$Copyright return(list_resp) + } } @@ -857,10 +919,12 @@ gen_find <- function(term = NULL, #------------------------------------------------------------------------- if (nrow(df_cubes) != 0) { + df_cubes$Titel <- titel_search(df_cubes, term) + } - if(isTRUE(ordering)) { + if (isTRUE(ordering)) { df_cubes <- df_cubes[with(df_cubes, order(-Titel, -Variablen)), c( "Code", "Content", @@ -887,7 +951,9 @@ gen_find <- function(term = NULL, return(list_resp) } else { - list_resp <- "No cubes at all avalaible in 'zensus'-database." + + list_resp <- "There are generally no 'cubes' objects available for the 'zensus' database." + } } diff --git a/R/gen_jobs.R b/R/gen_jobs.R index bb396db..9ea32d3 100644 --- a/R/gen_jobs.R +++ b/R/gen_jobs.R @@ -1,15 +1,20 @@ -#' gen_list_jobs: Explore Current Jobs of Your User Account +#' gen_list_jobs #' -#' @description Function to list all current jobs connected to the given user in 'GENESIS' or 'regionalstatistik.de'. Important note: For this function it is also possible to use `searchcriterion`-parameter and `selection`-parameter, making it possible to filter the job list based on 'type','time','status' or 'code'. For more details see `vignette("additional_parameter")`. +#' @description Function to list all current jobs connected to the given user in the GENESIS or regionalstatistik.de database. Important note: For this function it is also possible to use `searchcriterion` parameter and `selection` parameter, making it possible to filter the job list based on 'type','time','status' or 'code'. For more details see `vignette("additional_parameter")`. #' #' @param database Character string. Indicator if 'genesis' or 'regionalstatistik.de' database is called. Default option is 'genesis'. -#' @param sortcriterion A string. Indicator if the output should be sorted by 'type','time','status' or 'code'. This is a parameter of the Genesis/Zensus API call itself. The default is 'type'. -#' @param flat Should the function return a list with jobs and metadata or just a flat data.frame? Defaults to FALSE. -#' @param ... Additional parameters for the API call. These parameters are only affecting the Genesis/Zensus call itself, no further processing. For more details see `vignette("additional_parameter")`. +#' @param sortcriterion Character string. Indicator if the output should be sorted by 'type','time','status' or 'code'. This is a parameter of the API call itself. The default is 'type'. +#' @param flat Boolean. Should the function return a list with jobs and metadata ('FALSE') or just a flat data.frame ('TRUE')? Defaults to FALSE. +#' @param ... Additional parameters for the API call. These parameters are only affecting the call itself, no further processing. For more details see `vignette("additional_parameter")`. #' -#' @return A list of all current jobs connected to the given user. +#' @return A list or data.frame (see parameter 'flat') of all current jobs of the user. #' @export #' +#' @examples +#' \dontrun{ +#' gen_list_jobs("regio", flat = TRUE) +#' } +#' gen_list_jobs <- function(database = c("genesis", "regio"), sortcriterion = c("type", "time", "status", "code"), flat = FALSE, @@ -17,6 +22,13 @@ gen_list_jobs <- function(database = c("genesis", "regio"), gen_fun <- test_database_function(database) + if (length(database) != 1) { + + stop("This function allows only two values of 'database': 'genesis' or 'regio'.", + call. = FALSE) + + } + if (!is.character(sortcriterion)) { stop("Parameter 'sortcriterion' has to be of type 'character'.", @@ -26,7 +38,7 @@ gen_list_jobs <- function(database = c("genesis", "regio"), sortcriterion <- match.arg(sortcriterion) - if(!(sortcriterion %in% c("type", "time", "status", "code"))){ + if (!(sortcriterion %in% c("type", "time", "status", "code"))) { stop("Parameter 'sortcriterion' has to be 'type', 'time', 'status', or 'code'.", call. = FALSE) @@ -35,7 +47,7 @@ gen_list_jobs <- function(database = c("genesis", "regio"), #----------------------------------------------------------------------------- - if(gen_fun == "gen_api"){ + if (gen_fun == "gen_api"){ par_list <- list(endpoint = "catalogue/jobs", sortcriterion = sortcriterion, @@ -47,6 +59,11 @@ gen_list_jobs <- function(database = c("genesis", "regio"), sortcriterion = sortcriterion, ...) + } else { + + stop("Misspecification of the parameter 'database': Only 'genesis' and 'regio' allowed.", + call. = FALSE) + } results_raw <- do.call(gen_fun, par_list) @@ -95,14 +112,12 @@ gen_list_jobs <- function(database = c("genesis", "regio"), #' gen_download_job #' -#' @param name The job code retrieved by using gen_list_jobs() -#' @param database The database where the job has been generated ('genesis' or 'regio') -#' @param area The area in which the table is stored -#' @param compress Should empty rows and columns be discarded? -#' @param language Search terms, returned messages and data descriptions in German ('de') or English ('en') -#' @param all_character Boolean. Should all variables be imported as -#' 'character' variables? Avoids fuzzy data type conversions if there are -#' leading zeros or other special characters. Defaults to TRUE. +#' @param name Character string. The job code retrieved by using gen_list_jobs(). +#' @param database Character string. Indicator if the GENESIS ('genesis') or regionalstatistik.de ('regio') database is called. Only one database can be addressed per function call. Default option is 'genesis'. +#' @param area Character string. Indicator from which area of the database the results are called. In general, 'all' is the appropriate solution. Default option is 'all'. +#' @param compress Boolean. Should empty rows and columns be discarded? Default is FALSE. +#' @param language Character string. Search terms, returned messages and data descriptions in German ("de") or English ("en")? +#' @param all_character Boolean. Should all variables be imported as 'character' variables? Avoids fuzzy data type conversions if there are leading zeros or other special characters. Defaults to TRUE. #' #' @return Returns a data.frame with the table content #' @export @@ -135,7 +150,7 @@ gen_download_job <- function(name, } #----------------------------------------------------------------------------- - # Short parameter processing of 'all character' for later use in read_delim + # Parameter processing of 'all character' for later use in read_delim if (isTRUE(all_character)) { @@ -216,6 +231,8 @@ gen_download_job <- function(name, #----------------------------------------------------------------------------- + return(result) + } else { stop("The response type of the job request is invalid (not 'text/csv').\n You might have chosen the wrong database to check for your job.", diff --git a/R/gen_list_results.R b/R/gen_list_results.R index e0c8180..0e2106f 100644 --- a/R/gen_list_results.R +++ b/R/gen_list_results.R @@ -1,50 +1,46 @@ -#' gen_list_results: Get List of Results of Your User Account +#' gen_list_results #' -#' @description Function to list all current results connected to the given user in Genesis or Zensus. Important note: For this function it is also possible to use `selection`-parameter, making it possible to filter the results based on the 'code' of the object. For more details see `vignette("additional_parameter")`. +#' @description Function to list all current results connected to the given user in the GENESIS, Zensus 2022 or regionalstatistik.de database. Important note: For this function it is also possible to use `selection` parameter, making it possible to filter the results based on the 'code' of the object. For more details see `vignette("additional_parameter")`. #' -#' @param database Character string. Indicator if the Genesis or Zensus database is called. Default option is 'genesis'. -#' @param area A string. Indicator from which area of the database the results are called. In general, "all" is the appropriate solution. Default option is 'all'. -#' @param ... Additional parameters for the Genesis/Zensus API call. These parameters are only affecting the Genesis/Zensus call itself, no further processing. For more details see `vignette("additional_parameter")`. +#' @param database Character string. Indicator if the GENESIS ('genesis'), Zensus 2022 ('zensus') or regionalstatistik.de ('regio') database is called. Only one database can be addressed per function call. Default option is 'genesis'. +#' @param area Character string. Indicator from which area of the database the results are called. In general, 'all' is the appropriate solution. Default option is 'all'. Not used for 'statistics'. +#' @param ... Additional parameters for the API call. These parameters are only affecting the call itself, no further processing. For more details see `vignette("additional_parameter")`. #' -#' @return A list of all current jobs connected to the given user. +#' @return A list of all current results connected to the given user. #' @export #' -gen_list_results <- function(database = c("genesis", "zensus"), +gen_list_results <- function(database = c("genesis", "zensus", "regio"), area = c("all", "public", "user"), - ... -) { + ...) { gen_fun <- test_database_function(database) - ############################################################## + area <- match.arg(area) - if(gen_fun == "gen_api"){ + area <- switch(area, + all = "all", + public = "\u00F6ffentlich", + user = "benutzer") - par_list <- list( - endpoint = "catalogue/results", - area = area, - ... - ) + par_list <- list(endpoint = "catalogue/results", + area = area, + ...) - } else if ( gen_fun == "gen_zensus_api"){ + results_raw <- do.call(gen_fun, par_list) - par_list <- list( - endpoint = "catalogue/results", - area = area, - ... - ) + results_json <- test_if_json(results_raw) - } + if (results_json$Status$Code %in% c(103, 104)) { - results_raw <- do.call(gen_fun, par_list) + stop("There are not (yet) any objects matching your request.", + call. = FALSE) - results_json <- test_if_json(results_raw) + } res <- list("Output" = tibble::as_tibble(binding_lapply(results_json$List, - characteristics = c("Code", - "Content", - "Values")))) - + characteristics = c("Code", + "Content", + "Values")))) attr(res, "Database") <- database[1] attr(res, "Database") <- results_json$Parameter$area diff --git a/R/gen_logincheck.R b/R/gen_logincheck.R index 1c3c85f..361fb73 100644 --- a/R/gen_logincheck.R +++ b/R/gen_logincheck.R @@ -1,10 +1,10 @@ #' gen_logincheck #' #' @description Function to check if a login is possible for a certain database. -#' @param database Takes the values 'genesis', 'regio', 'zensus' and 'all'. +#' @param database Character string. Indicator if the GENESIS ('genesis'), Zensus 2022 ('zensus') or regionalstatistik.de ('regio') database is called. Only one database can be addressed per function call. Default option is 'genesis'. #' @param verbose Boolean. In case of success, should a message be printed? Defaults to FALSE. #' -#' @return Leads to an informative error message if the login check failed. Invisibly returns TRUE otherwise. +#' @return Leads to an informative error message if the login check failed and returns FALSE invisibly. Invisibly returns TRUE otherwise. #' @export #' #' @examples diff --git a/R/gen_meta_data.R b/R/gen_meta_data.R index ddccb5b..86af349 100644 --- a/R/gen_meta_data.R +++ b/R/gen_meta_data.R @@ -1,15 +1,15 @@ #' gen_metadata_statistic #' -#' @description Function to search for meta-information for a specific statistic. +#' @description Function to search for meta information for a specific statistic. #' -#' @param code A string with a maximum length of 15 characters. Code from a Genesis/Zensus-Object. Only one code per iteration. -#' @param database Character string. Indicator if the Genesis or Zensus database is called. Only one database can be addressed per function call. Default option is 'genesis'. -#' @param area A string. Indicator from which area of the database the results are called. In general, "all" is the appropriate solution. Default option is 'all'. Only used for Genesis. -#' @param error.ignore A logical. Indicator if the function should stop if an error occurs or no object for the request is found or if it should produce a token as response. Default option is 'FALSE'. -#' @param verbose Logical. Indicator if the output of the function should include detailed messages and warnings. Default option is 'TRUE'. Set the parameter to 'FALSE' to suppress additional messages and warnings. -#' @param ... Additional parameters for the Genesis/Zensus API call. These parameters are only affecting the Genesis/Zensus call itself, no further processing. For more details see `vignette("additional_parameter")`. +#' @param code A character string with a maximum length of 15 characters. Code from a GENESIS, Zensus 2022 or regionalstatistik.de object. Only one code per iteration. +#' @param database Character string. Indicator if the GENESIS ('genesis'), Zensus 2022 ('zensus') or regionalstatistik.de ('regio') database is called. Only one database can be addressed per function call. Default option is 'genesis'. +#' @param area Character string. Indicator from which area of the database the results are called. In general, 'all' is the appropriate solution. Default option is 'all'. Not used for 'statistics'. +#' @param error.ignore Boolean. Indicator if the function should stop if an error occurs or no object for the request is found or if it should produce a token as response. Default option is 'FALSE'. +#' @param verbose Boolean. Indicator if the output of the function should include detailed messages and warnings. Default option is 'TRUE'. Set the parameter to 'FALSE' to suppress additional messages and warnings. +#' @param ... Additional parameters for the API call. These parameters are only affecting the call itself, no further processing. For more details see `vignette("additional_parameter")`. #' -#' @return A list with all recalled elements from Genesis/Zensus. Attributes are added to the dataframe describing the search configuration for the returned output. +#' @return A list with all recalled elements from the API. Attributes are added to the data.frame describing the search configuration for the returned output. #' @export #' #' @examples @@ -19,12 +19,12 @@ #' } #' gen_metadata_statistic <- function(code = NULL, - database = c("all", "genesis", "zensus", "regio"), - area = c("all", "public", "user"), - error.ignore = FALSE, - verbose = TRUE, - raw = FALSE, - ...) { + database = c("all", "genesis", "zensus", "regio"), + area = c("all", "public", "user"), + error.ignore = FALSE, + verbose = TRUE, + raw = FALSE, + ...) { caller <- as.character(match.call()[1]) @@ -45,21 +45,24 @@ gen_metadata_statistic <- function(code = NULL, res <- lapply(gen_fun, function(db){ - if(verbose) { + if (isTRUE(verbose)) { + info <- paste("Started the processing of", rev_database_function(db), "database.") + message(info) + } - par_list <- list( - endpoint = "metadata/statistic", - username = gen_auth_get(database = rev_database_function(db))$username, - password = gen_auth_get(database = rev_database_function(db))$password, - name = code, - ... - ) + par_list <- list(endpoint = "metadata/statistic", + username = gen_auth_get(database = rev_database_function(db))$username, + password = gen_auth_get(database = rev_database_function(db))$password, + name = code, + ...) + + if (db == "gen_api" | db == "gen_regio_api") { - if(db == "gen_api" | db == "gen_regio_api"){ par_list <- append(par_list, list(area = area)) + } results_raw <- do.call(db, par_list) @@ -69,17 +72,19 @@ gen_metadata_statistic <- function(code = NULL, empty_object <- test_if_error(results_json, para = error.ignore, verbose = verbose) #--------------------------------------------------------------------------- - if(isTRUE(empty_object)){ + + if (isTRUE(empty_object)){ df_stats <- "No 'meta_information' object found for your request." - } else if(isFALSE(empty_object)){ + } else if (isFALSE(empty_object)) { df_stats <- results_json$Status$Content - } else if(empty_object == "DONE"){ + } else if (empty_object == "DONE") { + + if (isFALSE(raw)) { - if(isFALSE(raw)){ df_stats <-cbind("Code" = results_json$Object$Code, "Content" = results_json$Object$Content, "Cubes" = results_json$Object$Cubes, @@ -89,8 +94,11 @@ gen_metadata_statistic <- function(code = NULL, "Time_to" = results_json$Object$Frequency[[1]]$To, "Time_type" = results_json$Object$Frequency[[1]]$Type) } else { + df_stats <- results_json$Object + } + } attr(df_stats, "Code") <- results_json$Parameter$name @@ -114,16 +122,16 @@ gen_metadata_statistic <- function(code = NULL, #' gen_metadata_variable #' -#' @description Function to search for meta-information for a specific variable. +#' @description Function to search for meta information for a specific variable. #' -#' @param code A string with a maximum length of 15 characters. Code from a Genesis/Zensus-Object. Only one code per iteration. "*"-Notation is possible. -#' @param database Character string. Indicator if the Genesis or Zensus database is called. Only one database can be addressed per function call. Default option is 'genesis'. -#' @param area A string. Indicator from which area of the database the results are called. In general, "all" is the appropriate solution. Default option is 'all'. Only used for Genesis. -#' @param error.ignore A logical. Indicator if the function should stop if an error occurs or no object for the request is found or if it should produce a token as response. Default option is 'FALSE'. -#' @param verbose Logical. Indicator if the output of the function should include detailed messages and warnings. Default option is 'TRUE'. Set the parameter to 'FALSE' to suppress additional messages and warnings. -#' @param ... Additional parameters for the Genesis/Zensus API call. These parameters are only affecting the Genesis/Zensus call itself, no further processing. For more details see `vignette("additional_parameter")`. +#' @param code A character string with a maximum length of 15 characters. Code from a GENESIS, Zensus 2022 or regionalstatistik.de object. Only one code per iteration. +#' @param database Character string. Indicator if the GENESIS ('genesis'), Zensus 2022 ('zensus') or regionalstatistik.de ('regio') database is called. Only one database can be addressed per function call. Default option is 'genesis'. +#' @param area Character string. Indicator from which area of the database the results are called. In general, 'all' is the appropriate solution. Default option is 'all'. Not used for 'statistics'. +#' @param error.ignore Boolean. Indicator if the function should stop if an error occurs or no object for the request is found or if it should produce a token as response. Default option is 'FALSE'. +#' @param verbose Boolean. Indicator if the output of the function should include detailed messages and warnings. Default option is 'TRUE'. Set the parameter to 'FALSE' to suppress additional messages and warnings. +#' @param ... Additional parameters for the API call. These parameters are only affecting the call itself, no further processing. For more details see `vignette("additional_parameter")`. #' -#' @return A list with all recalled elements from Genesis/Zensus. Attributes are added to the dataframe describing the search configuration for the returned output. +#' @return A list with all recalled elements from the API. Attributes are added to the data.frame describing the search configuration for the returned output. #' @export #' #' @examples @@ -133,12 +141,12 @@ gen_metadata_statistic <- function(code = NULL, #' } #' gen_metadata_variable <- function(code = NULL, - database = c("all", "genesis", "zensus", "regio"), - area = c("all", "public", "user"), - error.ignore = FALSE, - verbose = TRUE, - raw = FALSE, - ...) { + database = c("all", "genesis", "zensus", "regio"), + area = c("all", "public", "user"), + error.ignore = FALSE, + verbose = TRUE, + raw = FALSE, + ...) { caller <- as.character(match.call()[1]) @@ -159,21 +167,24 @@ gen_metadata_variable <- function(code = NULL, res <- lapply(gen_fun, function(db){ - if(verbose) { + if (isTRUE(verbose)) { + info <- paste("Started the processing of", rev_database_function(db), "database.") + message(info) + } - par_list <- list( - endpoint = "metadata/variable", - username = gen_auth_get(database = rev_database_function(db))$username, - password = gen_auth_get(database = rev_database_function(db))$password, - name = code, - ... - ) + par_list <- list(endpoint = "metadata/variable", + username = gen_auth_get(database = rev_database_function(db))$username, + password = gen_auth_get(database = rev_database_function(db))$password, + name = code, + ...) + + if (db == "gen_api" | db == "gen_regio_api") { - if(db == "gen_api" | db == "gen_regio_api"){ par_list <- append(par_list, list(area = area)) + } results_raw <- do.call(db, par_list) @@ -183,17 +194,18 @@ gen_metadata_variable <- function(code = NULL, empty_object <- test_if_error(results_json, para = error.ignore, verbose = verbose) #--------------------------------------------------------------------------- - if(isTRUE(empty_object)){ + + if (isTRUE(empty_object)) { df_var <- "No 'meta_information' object found for your request." - } else if(isFALSE(empty_object)){ + } else if (isFALSE(empty_object)){ df_var <- results_json$Status$Content - } else if(empty_object == "DONE"){ + } else if (empty_object == "DONE"){ - if(isFALSE(raw)){ + if (isFALSE(raw)) { df_var <-cbind("Code" = results_json$Object$Code, "Content" = results_json$Object$Content, @@ -201,14 +213,20 @@ gen_metadata_variable <- function(code = NULL, "Type" = results_json$Object$Type, "Validity_from" = results_json$Object$Validity$From, "Validity_to" = results_json$Object$Validity$To) + } + } - if(isFALSE(raw)){ + if (isFALSE(raw)){ + list_resp <- list("General" = df_var, - "Information" = results_json$Object$Information) + "Information" = results_json$Object$Information) + } else { + list_resp <- results_json$Object + } attr(list_resp, "Code") <- results_json$Parameter$name @@ -234,16 +252,16 @@ gen_metadata_variable <- function(code = NULL, #' gen_metadata_value #' -#' @description Function to search for meta-information for a specific value. +#' @description Function to search for meta information for a specific value. #' -#' @param code A string with a maximum length of 15 characters. Code from a Genesis/Zensus-Object. Only one code per iteration. -#' @param database Character string. Indicator if the Genesis or Zensus database is called. Only one database can be addressed per function call. Default option is 'genesis'. -#' @param area A string. Indicator from which area of the database the results are called. In general, "all" is the appropriate solution. Default option is 'all'. Only used for Genesis. -#' @param error.ignore A logical. Indicator if the function should stop if an error occurs or no object for the request is found or if it should produce a token as response. Default option is 'FALSE'. -#' @param verbose Logical. Indicator if the output of the function should include detailed messages and warnings. Default option is 'TRUE'. Set the parameter to 'FALSE' to suppress additional messages and warnings. -#' @param ... Additional parameters for the Genesis/Zensus API call. These parameters are only affecting the Genesis/Zensus call itself, no further processing. For more details see `vignette("additional_parameter")`. +#' @param code A character string with a maximum length of 15 characters. Code from a GENESIS, Zensus 2022 or regionalstatistik.de object. Only one code per iteration. +#' @param database Character string. Indicator if the GENESIS ('genesis'), Zensus 2022 ('zensus') or regionalstatistik.de ('regio') database is called. Only one database can be addressed per function call. Default option is 'genesis'. +#' @param area Character string. Indicator from which area of the database the results are called. In general, 'all' is the appropriate solution. Default option is 'all'. Not used for 'statistics'. +#' @param error.ignore Boolean. Indicator if the function should stop if an error occurs or no object for the request is found or if it should produce a token as response. Default option is 'FALSE'. +#' @param verbose Boolean. Indicator if the output of the function should include detailed messages and warnings. Default option is 'TRUE'. Set the parameter to 'FALSE' to suppress additional messages and warnings. +#' @param ... Additional parameters for the API call. These parameters are only affecting the call itself, no further processing. For more details see `vignette("additional_parameter")`. #' -#' @return A list with all recalled elements from Genesis/Zensus. Attributes are added to the dataframe describing the search configuration for the returned output. +#' @return A list with all recalled elements from the API. Attributes are added to the data.frame describing the search configuration for the returned output. #' @export #' #' @examples @@ -253,12 +271,12 @@ gen_metadata_variable <- function(code = NULL, #' } #' gen_metadata_value <- function(code = NULL, - database = c("all", "genesis", "zensus", "regio"), - area = c("all", "public", "user"), - error.ignore = FALSE, - verbose = TRUE, - raw = FALSE, - ...) { + database = c("all", "genesis", "zensus", "regio"), + area = c("all", "public", "user"), + error.ignore = FALSE, + verbose = TRUE, + raw = FALSE, + ...) { caller <- as.character(match.call()[1]) @@ -279,21 +297,24 @@ gen_metadata_value <- function(code = NULL, res <- lapply(gen_fun, function(db){ - if(verbose) { + if (isTRUE(verbose)) { + info <- paste("Started the processing of", rev_database_function(db), "database.") + message(info) + } - par_list <- list( - endpoint = "metadata/value", - username = gen_auth_get(database = rev_database_function(db))$username, - password = gen_auth_get(database = rev_database_function(db))$password, - name = code, - ... - ) + par_list <- list(endpoint = "metadata/value", + username = gen_auth_get(database = rev_database_function(db))$username, + password = gen_auth_get(database = rev_database_function(db))$password, + name = code, + ...) + + if (db == "gen_api" | db == "gen_regio_api") { - if(db == "gen_api" | db == "gen_regio_api"){ par_list <- append(par_list, list(area = area)) + } results_raw <- do.call(db, par_list) @@ -303,29 +324,36 @@ gen_metadata_value <- function(code = NULL, empty_object <- test_if_error(results_json, para = error.ignore, verbose = verbose) #--------------------------------------------------------------------------- - if(isTRUE(empty_object)){ + + if (isTRUE(empty_object)) { df_value <- "No 'meta_information' object found for your request." - } else if(isFALSE(empty_object)){ + } else if (isFALSE(empty_object)) { df_value <- results_json$Status$Content - } else if(empty_object == "DONE"){ + } else if (empty_object == "DONE") { - if(isFALSE(raw)){ + if (isFALSE(raw)) { df_value <-cbind("Code" = results_json$Object$Code, - "Content" = results_json$Object$Content, - "Variables" = results_json$Object$Variables) + "Content" = results_json$Object$Content, + "Variables" = results_json$Object$Variables) + } + } - if(isFALSE(raw)){ + if (isFALSE(raw)) { + list_resp <- list("General" = df_value, - "Information" = results_json$Object$Information) + "Information" = results_json$Object$Information) + } else { + list_resp <- results_json$Object + } attr(list_resp, "Code") <- results_json$Parameter$name @@ -351,17 +379,16 @@ gen_metadata_value <- function(code = NULL, #' gen_metadata_table #' -#' @description Function to search for meta-information for a specific table. +#' @description Function to search for meta information for a specific table. #' -#' @param code A string with a maximum length of 15 characters. Code from a Genesis/Zensus-Object. Only one code per iteration. -#' @param database Character string. Indicator if the Genesis or Zensus database is called. Only one database can be addressed per function call. Default option is 'genesis'. -#' @param area A string. Indicator from which area of the database the results are called. In general, "all" is the appropriate solution. Default option is 'all'. Used for both databases. -#' @param error.ignore A logical. Indicator if the function should stop if an error occurs or no object for the request is found or if it should produce a token as response. Default option is 'FALSE'. -#' @param raw Logical. Indicator if the output of the function should be per default transformed into a more readable structure - simplifying some information to a significant level. Default option is 'TRUE'. Set the parameter to 'FALSE' to return as output the raw output. -#' @param verbose Logical. Indicator if the output of the function should include detailed messages and warnings. Default option is 'TRUE'. Set the parameter to 'FALSE' to suppress additional messages and warnings. -#' @param ... Additional parameters for the Genesis/Zensus API call. These parameters are only affecting the Genesis/Zensus call itself, no further processing. For more details see `vignette("additional_parameter")`. +#' @param code A character string with a maximum length of 15 characters. Code from a GENESIS, Zensus 2022 or regionalstatistik.de object. Only one code per iteration. +#' @param database Character string. Indicator if the GENESIS ('genesis'), Zensus 2022 ('zensus') or regionalstatistik.de ('regio') database is called. Only one database can be addressed per function call. Default option is 'genesis'. +#' @param area Character string. Indicator from which area of the database the results are called. In general, 'all' is the appropriate solution. Default option is 'all'. Not used for 'statistics'. +#' @param error.ignore Boolean. Indicator if the function should stop if an error occurs or no object for the request is found or if it should produce a token as response. Default option is 'FALSE'. +#' @param verbose Boolean. Indicator if the output of the function should include detailed messages and warnings. Default option is 'TRUE'. Set the parameter to 'FALSE' to suppress additional messages and warnings. +#' @param ... Additional parameters for the API call. These parameters are only affecting the call itself, no further processing. For more details see `vignette("additional_parameter")`. #' -#' @return A list with all recalled elements from Genesis/Zensus. Attributes are added to the dataframe describing the search configuration for the returned output. +#' @return A list with all recalled elements from the API. Attributes are added to the data.frame describing the search configuration for the returned output. #' @export #' #' @examples @@ -371,12 +398,12 @@ gen_metadata_value <- function(code = NULL, #' } #' gen_metadata_table <- function(code = NULL, - database = c("all", "genesis", "zensus", "regio"), - area = c("all", "public", "user"), - error.ignore = FALSE, - verbose = TRUE, - raw = FALSE, - ...) { + database = c("all", "genesis", "zensus", "regio"), + area = c("all", "public", "user"), + error.ignore = FALSE, + verbose = TRUE, + raw = FALSE, + ...) { caller <- as.character(match.call()[1]) @@ -397,19 +424,20 @@ gen_metadata_table <- function(code = NULL, res <- lapply(gen_fun, function(db){ - if(verbose) { + if (isTRUE(verbose)) { + info <- paste("Started the processing of", rev_database_function(db), "database.") + message(info) + } - par_list <- list( - endpoint = "metadata/table", - username = gen_auth_get(database = rev_database_function(db))$username, - password = gen_auth_get(database = rev_database_function(db))$password, - name = code, - area = area, - ... - ) + par_list <- list(endpoint = "metadata/table", + username = gen_auth_get(database = rev_database_function(db))$username, + password = gen_auth_get(database = rev_database_function(db))$password, + name = code, + area = area, + ...) results_raw <- do.call(db, par_list) @@ -418,27 +446,27 @@ gen_metadata_table <- function(code = NULL, empty_object <- test_if_error(results_json, para = error.ignore, verbose = verbose) #--------------------------------------------------------------------------- - if(isTRUE(empty_object)){ + if (isTRUE(empty_object)) { char <- "No 'meta_information' object found for your request." structure <- NULL embedded <- NULL - } else if(isFALSE(empty_object)){ + } else if (isFALSE(empty_object)) { char <- results_json$Status$Content structure <- NULL embedded <- NULL - } else if(empty_object == "DONE"){ + } else if (empty_object == "DONE") { - if(isFALSE(raw)){ + if (isFALSE(raw)) { char <- cbind("Code" = results_json$Object$Code, - "Content" = results_json$Object$Content, - "Time_From" = results_json$Object$Time$From, - "Time_To" = results_json$Object$Time$To, - "Valid" = results_json$Object$Valid) + "Content" = results_json$Object$Content, + "Time_From" = results_json$Object$Time$From, + "Time_To" = results_json$Object$Time$To, + "Valid" = results_json$Object$Valid) embedded <- cbind("Code" = results_json$Object$Structure$Head$Code, "Content" = results_json$Object$Structure$Head$Content, @@ -462,62 +490,69 @@ gen_metadata_table <- function(code = NULL, } else { cbind("Code" = unlist(lapply(results_json$Object$Structure$Columns, `[[`, 1)), - "Content" = unlist(lapply(results_json$Object$Structure$Columns, `[[`, 2)), - "Type" = unlist(lapply(results_json$Object$Structure$Columns, `[[`, 3)), - "Values" = unlist(lapply(results_json$Object$Structure$Columns, `[[`, 4)), - "Selected" = unlist(lapply(results_json$Object$Structure$Columns, `[[`, 5)), - "Structure" = unlist(lapply(results_json$Object$Structure$Columns, `[[`, 6)), - "Updated" = unlist(lapply(results_json$Object$Structure$Columns, `[[`, 7))) + "Content" = unlist(lapply(results_json$Object$Structure$Columns, `[[`, 2)), + "Type" = unlist(lapply(results_json$Object$Structure$Columns, `[[`, 3)), + "Values" = unlist(lapply(results_json$Object$Structure$Columns, `[[`, 4)), + "Selected" = unlist(lapply(results_json$Object$Structure$Columns, `[[`, 5)), + "Structure" = unlist(lapply(results_json$Object$Structure$Columns, `[[`, 6)), + "Updated" = unlist(lapply(results_json$Object$Structure$Columns, `[[`, 7))) + } structure$Columns <- if (length(results_json$Object$Structure$Columns) == 1) { cbind("Code" = results_json$Object$Structure$Columns[[1]]$Code, - "Content" = results_json$Object$Structure$Columns[[1]]$Content, - "Type" = results_json$Object$Structure$Columns[[1]]$Type, - "Unit" = results_json$Object$Structure$Columns[[1]]$Unit, - "Values" = results_json$Object$Structure$Columns[[1]]$Values, - "Updated" = results_json$Object$Structure$Columns[[1]]$Updated) + "Content" = results_json$Object$Structure$Columns[[1]]$Content, + "Type" = results_json$Object$Structure$Columns[[1]]$Type, + "Unit" = results_json$Object$Structure$Columns[[1]]$Unit, + "Values" = results_json$Object$Structure$Columns[[1]]$Values, + "Updated" = results_json$Object$Structure$Columns[[1]]$Updated) } else { cbind("Code" = unlist(lapply(results_json$Object$Structure$Columns, `[[`, 1)), - "Content" = unlist(lapply(results_json$Object$Structure$Columns, `[[`, 2)), - "Type" = unlist(lapply(results_json$Object$Structure$Columns, `[[`, 3)), - "Unit" = unlist(lapply(results_json$Object$Structure$Columns, `[[`, 4)), - "Values" = unlist(lapply(results_json$Object$Structure$Columns, `[[`, 5)), - "Updated" = unlist(lapply(results_json$Object$Structure$Columns, `[[`, 6))) + "Content" = unlist(lapply(results_json$Object$Structure$Columns, `[[`, 2)), + "Type" = unlist(lapply(results_json$Object$Structure$Columns, `[[`, 3)), + "Unit" = unlist(lapply(results_json$Object$Structure$Columns, `[[`, 4)), + "Values" = unlist(lapply(results_json$Object$Structure$Columns, `[[`, 5)), + "Updated" = unlist(lapply(results_json$Object$Structure$Columns, `[[`, 6))) } structure$Rows <- if (length(results_json$Object$Structure$Rows) == 1) { cbind("Code" = results_json$Object$Structure$Rows[[1]]$Code, - "Content" = results_json$Object$Structure$Rows[[1]]$Content, - "Type" = results_json$Object$Structure$Rows[[1]]$Type, - "Unit" = results_json$Object$Structure$Rows[[1]]$Unit, - "Values" = results_json$Object$Structure$Rows[[1]]$Values, - "Updated" = results_json$Object$Structure$Rows[[1]]$Updated) + "Content" = results_json$Object$Structure$Rows[[1]]$Content, + "Type" = results_json$Object$Structure$Rows[[1]]$Type, + "Unit" = results_json$Object$Structure$Rows[[1]]$Unit, + "Values" = results_json$Object$Structure$Rows[[1]]$Values, + "Updated" = results_json$Object$Structure$Rows[[1]]$Updated) } else { cbind("Code" = unlist(lapply(results_json$Object$Structure$Rows, `[[`, 1)), - "Content" = unlist(lapply(results_json$Object$Structure$Rows, `[[`, 2)), - "Type" = unlist(lapply(results_json$Object$Structure$Rows, `[[`, 3)), - "Unit" = unlist(lapply(results_json$Object$Structure$Rows, `[[`, 4)), - "Values" = unlist(lapply(results_json$Object$Structure$Rows, `[[`, 5)), - "Updated" = unlist(lapply(results_json$Object$Structure$Rows, `[[`, 6))) + "Content" = unlist(lapply(results_json$Object$Structure$Rows, `[[`, 2)), + "Type" = unlist(lapply(results_json$Object$Structure$Rows, `[[`, 3)), + "Unit" = unlist(lapply(results_json$Object$Structure$Rows, `[[`, 4)), + "Values" = unlist(lapply(results_json$Object$Structure$Rows, `[[`, 5)), + "Updated" = unlist(lapply(results_json$Object$Structure$Rows, `[[`, 6))) } - } + } - if(isFALSE(raw)){ + } # End of empty_object == "DONE" + + if (isFALSE(raw)) { + list_resp <- list("General" = char, - "Structure" = structure, - "Embedded_in" = embedded ) + "Structure" = structure, + "Embedded_in" = embedded) + } else { + list_resp <- results_json$Object + } attr(list_resp, "Code") <- results_json$Parameter$name @@ -543,15 +578,17 @@ gen_metadata_table <- function(code = NULL, #' gen_metadata_cube #' -#' @description Function to search for meta-information for a specific cube. Usable only for Genesis. +#' @description Function to search for meta information for a specific cube. Usable only for GENESIS and regionalstatistik.de. #' -#' @param code A string with a maximum length of 15 characters. Code from a Genesis-Object. Only one code per iteration. -#' @param area A string. Indicator from which area of the database the results are called. In general, "all" is the appropriate solution. Default option is 'all'. Only used for Genesis. -#' @param error.ignore A logical. Indicator if the function should stop if an error occurs or no object for the request is found or if it should produce a token as response. Default option is 'FALSE'. -#' @param verbose Logical. Indicator if the output of the function should include detailed messages and warnings. Default option is 'TRUE'. Set the parameter to 'FALSE' to suppress additional messages and warnings. -#' @param ... Additional parameters for the Genesis API call. These parameters are only affecting the Genesis call itself, no further processing. For more details see `vignette("additional_parameter")`. +#' @param code A character string with a maximum length of 15 characters. Code from a GENESIS or regionalstatistik.de object. Only one code per iteration. +#' @param database Character string. Indicator if the GENESIS ('genesis') or regionalstatistik.de ('regio') database is called. Only one database can be addressed per function call. Default option is 'genesis'. +#' @param area Character string. Indicator from which area of the database the results are called. In general, 'all' is the appropriate solution. Default option is 'all'. Not used for 'statistics'. +#' @param error.ignore Boolean. Indicator if the function should stop if an error occurs or no object for the request is found or if it should produce a token as response. Default option is 'FALSE'. +#' @param verbose Boolean. Indicator if the output of the function should include detailed messages and warnings. Default option is 'TRUE'. Set the parameter to 'FALSE' to suppress additional messages and warnings. +#' @param ... Additional parameters for the API call. These parameters are only affecting the call itself, no further processing. For more details see `vignette("additional_parameter")`. #' -#' @return A list with all recalled elements from Genesis. Attributes are added to the dataframe describing the search configuration for the returned output. +#' @return A list with all recalled elements from the API. Attributes are added to the data.frame describing the search configuration for the returned output. + #' @export #' #' @examples @@ -561,12 +598,12 @@ gen_metadata_table <- function(code = NULL, #' } #' gen_metadata_cube <- function(code = NULL, - database = c("all", "genesis", "regio"), - error.ignore = FALSE, - area = c("all", "public", "user"), - verbose = TRUE, - raw = raw, - ...) { + database = c("all", "genesis", "regio"), + error.ignore = FALSE, + area = c("all", "public", "user"), + verbose = TRUE, + raw = raw, + ...) { caller <- as.character(match.call()[1]) @@ -587,19 +624,20 @@ gen_metadata_cube <- function(code = NULL, res <- lapply(gen_fun, function(db){ - if(verbose) { + if (isTRUE(verbose)) { + info <- paste("Started the processing of", rev_database_function(db), "database.") + message(info) + } - par_list <- list( - endpoint = "metadata/cube", - username = gen_auth_get(database = rev_database_function(db))$username, - password = gen_auth_get(database = rev_database_function(db))$password, - name = code, - area = area, - ... - ) + par_list <- list(endpoint = "metadata/cube", + username = gen_auth_get(database = rev_database_function(db))$username, + password = gen_auth_get(database = rev_database_function(db))$password, + name = code, + area = area, + ...) results_raw <- do.call(db, par_list) @@ -608,84 +646,87 @@ gen_metadata_cube <- function(code = NULL, empty_object <- test_if_error(results_json, para = error.ignore, verbose = verbose) #--------------------------------------------------------------------------- - if(isTRUE(empty_object)){ + + if (isTRUE(empty_object)) { char <- "No 'meta_information' object found for your request." time <- NULL stat <- NULL structure <- NULL - } else if(isFALSE(empty_object)){ + } else if (isFALSE(empty_object)) { char <- results_json$Status$Content time <- NULL stat <- NULL structure <- NULL - } else if(empty_object == "DONE"){ + } else if (empty_object == "DONE") { - if(isFALSE(raw)){ + if (isFALSE(raw)) { char <-cbind("Code" = results_json$Object$Code, - "Content" = results_json$Object$Content, - "State" = results_json$Object$State, - "Values" = results_json$Object$Values) + "Content" = results_json$Object$Content, + "State" = results_json$Object$State, + "Values" = results_json$Object$Values) time <-cbind(unlist(results_json$Object$Timeslices)) stat <-cbind("Code" = results_json$Object$Statistic$Code, - "Content" = results_json$Object$Statistic$Content, - "Updated" = results_json$Object$Statistic$Updated) + "Content" = results_json$Object$Statistic$Content, + "Updated" = results_json$Object$Statistic$Updated) structure <- list() structure$Axis <- if (length(results_json$Object$Structure$Axis) == 1) { - cbind( - "Code" = results_json$Object$Structure$Axis[[1]]$Code, - "Content" = results_json$Object$Structure$Axis[[1]]$Content, - "Type" = results_json$Object$Structure$Axis[[1]]$Type, - "Updated" = results_json$Object$Structure$Axis[[1]]$Updated) + cbind("Code" = results_json$Object$Structure$Axis[[1]]$Code, + "Content" = results_json$Object$Structure$Axis[[1]]$Content, + "Type" = results_json$Object$Structure$Axis[[1]]$Type, + "Updated" = results_json$Object$Structure$Axis[[1]]$Updated) } else { - cbind( - "Code" = unlist(lapply(results_json$Object$Structure$Axis, `[[`, 1)), - "Content" = unlist(lapply(results_json$Object$Structure$Axis, `[[`, 2)), - "Type" = unlist(lapply(results_json$Object$Structure$Axis, `[[`, 3)), - "Updated" = unlist(lapply(results_json$Object$Structure$Axis, `[[`, 4))) + cbind("Code" = unlist(lapply(results_json$Object$Structure$Axis, `[[`, 1)), + "Content" = unlist(lapply(results_json$Object$Structure$Axis, `[[`, 2)), + "Type" = unlist(lapply(results_json$Object$Structure$Axis, `[[`, 3)), + "Updated" = unlist(lapply(results_json$Object$Structure$Axis, `[[`, 4))) } structure$Content <- if (length(results_json$Object$Structure$Contents) == 1) { cbind("Code" = results_json$Object$Structure$Contents[[1]]$Code, - "Content" = results_json$Object$Structure$Contents[[1]]$Content, - "Type" = results_json$Object$Structure$Contents[[1]]$Type, - "Unit" = results_json$Object$Structure$Contents[[1]]$Unit, - "Values" = results_json$Object$Structure$Contents[[1]]$Values, - "Updated" = results_json$Object$Structure$Contents[[1]]$Updated, - "Timeslices" = results_json$Object$Structure$Contents[[1]]$Timeslices) + "Content" = results_json$Object$Structure$Contents[[1]]$Content, + "Type" = results_json$Object$Structure$Contents[[1]]$Type, + "Unit" = results_json$Object$Structure$Contents[[1]]$Unit, + "Values" = results_json$Object$Structure$Contents[[1]]$Values, + "Updated" = results_json$Object$Structure$Contents[[1]]$Updated, + "Timeslices" = results_json$Object$Structure$Contents[[1]]$Timeslices) } else { cbind("Code" = unlist(lapply(results_json$Object$Structure$Contents, `[[`, 1)), - "Content" = unlist(lapply(results_json$Object$Structure$Contents, `[[`, 2)), - "Type" = unlist(lapply(results_json$Object$Structure$Contents, `[[`, 3)), - "Unit" = unlist(lapply(results_json$Object$Structure$Contents, `[[`, 4)), - "Values" = unlist(lapply(results_json$Object$Structure$Contents, `[[`, 5)), - "Updated" = unlist(lapply(results_json$Object$Structure$Contents, `[[`, 7)), - "Updated" = unlist(lapply(results_json$Object$Structure$Contents, `[[`, 6))) + "Content" = unlist(lapply(results_json$Object$Structure$Contents, `[[`, 2)), + "Type" = unlist(lapply(results_json$Object$Structure$Contents, `[[`, 3)), + "Unit" = unlist(lapply(results_json$Object$Structure$Contents, `[[`, 4)), + "Values" = unlist(lapply(results_json$Object$Structure$Contents, `[[`, 5)), + "Updated" = unlist(lapply(results_json$Object$Structure$Contents, `[[`, 7)), + "Timeslices" = unlist(lapply(results_json$Object$Structure$Contents, `[[`, 6))) } } } - if(isFALSE(raw)){ + if (isFALSE(raw)) { + list_resp <- list("General" = char, - "Timespan" = time, - "Statistic_used" = stat, - "Structure" = structure) + "Timespan" = time, + "Statistic_used" = stat, + "Structure" = structure) + } else { + list_resp <- results_json$Object + } attr(list_resp, "Code") <- results_json$Parameter$name @@ -713,15 +754,15 @@ gen_metadata_cube <- function(code = NULL, #' #' @description Search For Meta-Information For All Types Of Objects #' -#' @param code A string with a maximum length of 15 characters. Code from a Genesis/Zensus-Object. Only one code per iteration. -#' @param database Character string. Indicator if the Genesis or Zensus database is called. Only one database can be addressed per function call. Default option is 'genesis'. -#' @param category A string. Specific object-types: 'Cube', 'Statistic', "Table", "Variable" and 'Value'. The function needs a specified object type. -#' @param area A string. Indicator from which area of the database the results are called. In general, "all" is the appropriate solution. Default option is 'all'. Only used for Genesis. -#' @param error.ignore A logical. Indicator if the function should stop if an error occurs or no object for the request is found or if it should produce a token as response. Default option is 'FALSE'. -#' @param verbose Logical. Indicator if the output of the function should include detailed messages and warnings. Default option is 'TRUE'. Set the parameter to 'FALSE' to suppress additional messages and warnings. -#' @param ... Additional parameters for the Genesis/Zensus API call. These parameters are only affecting the Genesis/Zensus call itself, no further processing. For more details see `vignette("additional_parameter")`. +#' @param code String with a maximum length of 10 characters for a database object (GENESIS and regionalstatistik.de) and 15 characters for a Zensus 2022 object. Only one code per iteration. "*" notations are possible. +#' @param database Character string. Indicator if the GENESIS ('genesis'), Zensus 2022 ('zensus') or regionalstatistik.de ('regio') database is called. Only one database can be addressed per function call. Default option is 'genesis'. +#' @param category Character string. Specify specific GENESIS/regionalstatistik.de object types ('tables', 'statistics' and 'cubes') and specific Zensus 2022 object types ('tables' and 'statistics'). All types that are specific for one database can be used together. Default option is to use all types that are possible for the specific database. +#' @param area Character string. Indicator from which area of the database the results are called. In general, 'all' is the appropriate solution. Default option is 'all'. Not used for 'statistics'. +#' @param error.ignore Boolean. Indicator if the function should stop if an error occurs or no object for the request is found or if it should produce a token as response. Default option is 'FALSE'. +#' @param verbose Boolean. Indicator if the output of the function should include detailed messages and warnings. Default option is 'TRUE'. Set the parameter to 'FALSE' to suppress additional messages and warnings. +#' @param ... Additional parameters for the API call. These parameters are only affecting the call itself, no further processing. For more details see `vignette("additional_parameter")`. #' -#' @return A list with all recalled elements from Genesis/Zensus. Attributes are added to the dataframe describing the search configuration for the returned output. +#' @return A list with all recalled elements from the API. Attributes are added to the data.frame describing the search configuration for the returned output. #' @export #' #' @examples @@ -731,13 +772,13 @@ gen_metadata_cube <- function(code = NULL, #' } #' gen_metadata <- function(code = NULL, - database = c("all", "genesis", "zensus", "regio"), - category = c("cube", "statistic", "table", "variable", "value"), - area = c("all", "public", "user"), - error.ignore = FALSE, - verbose = TRUE, - raw = FALSE, - ...) { + database = c("all", "genesis", "zensus", "regio"), + category = c("cube", "statistic", "table", "variable", "value"), + area = c("all", "public", "user"), + error.ignore = FALSE, + verbose = TRUE, + raw = FALSE, + ...) { caller <- as.character(match.call()[1]) @@ -766,36 +807,26 @@ gen_metadata <- function(code = NULL, } else if (category == "value") { gen_metadata_value(code = code, - database = rev_database_function(odb), - area = area, - error.ignore = error.ignore, - verbose = verbose, - raw = raw, - ...) + database = rev_database_function(odb), + area = area, + error.ignore = error.ignore, + verbose = verbose, + raw = raw, + ...) } else if (category == "variable") { gen_metadata_variable(code = code, - database = rev_database_function(odb), - area = area, - error.ignore = error.ignore, - verbose = verbose, - raw = raw, - ...) + database = rev_database_function(odb), + area = area, + error.ignore = error.ignore, + verbose = verbose, + raw = raw, + ...) } else if (category == "table") { gen_metadata_table(code = code, - database = rev_database_function(odb), - area = area, - error.ignore = error.ignore, - verbose = verbose, - raw = raw, - ...) - - } else if (category == "statistic") { - - gen_metadata_statistic(code = code, database = rev_database_function(odb), area = area, error.ignore = error.ignore, @@ -803,6 +834,16 @@ gen_metadata <- function(code = NULL, raw = raw, ...) + } else if (category == "statistic") { + + gen_metadata_statistic(code = code, + database = rev_database_function(odb), + area = area, + error.ignore = error.ignore, + verbose = verbose, + raw = raw, + ...) + } else { stop("Category is not found, please select a correct category. diff --git a/R/gen_modified_data.R b/R/gen_modified_data.R index 5770955..ec2cc03 100644 --- a/R/gen_modified_data.R +++ b/R/gen_modified_data.R @@ -1,15 +1,16 @@ -#' gen_modified_data: Explore New Added Objects or Changed Objects in Genesis/Zensus +#' gen_modified_data #' -#' @description Function to check for updates, changes, or new objects in Genesis/Zensus based on a specific date. +#' @description Function to check for updates, changes, or new objects based on a specific date. #' -#' @param code A string with a maximum length of 15 characters. Code from a Genesis/Zensus object. Only one code per iteration. "*" notations are possible. Empty code (default value) includes all changes, updates, and new added objects. -#' @param database Character string. Indicator if the Genesis or Zensus database is called. Default option is 'genesis'. -#' @param type A string. Specific Genesis object type: 'tables', 'statistics', and 'statisticsUpdates'. Specific Zensus object type: 'tables' and 'statistics'. All types that are specific for one database can be used together through "all", which is the default. -#' @param date A string. Specific date that is used as the last update or upload time in Genesis/Zensus to include a Genesis/Zensus object in return. Default option is 'now', which uses the current date of your system. Alternative options are 'week_before', using the current date of your system minus 7 days, 'month_before', using the current date of your system minus 4 weeks, and 'year_before', using the current date of your system minus 52 weeks. Additionally, it is possible to fill in a specific date of format 'DD.MM.YYYY'. -#' @param verbose Logical. Indicator if the output of the function should include detailed messages and warnings. Default option is 'TRUE'. Set the parameter to 'FALSE' to suppress additional messages and warnings. -#' @param ... Additional parameters for the Genesis/Zensus API call. These parameters are only affecting the Genesis/Zensus call itself, no further processing. For more details see `vignette("additional_parameter")`. +#' @param code A character string with a maximum length of 15 characters. Code from a GENESIS, Zensus 2022 or regionalstatistik.de object. Only one code per iteration. +#' @param database Character string. Indicator if the GENESIS ('genesis'), Zensus 2022 ('zensus') or regionalstatistik.de ('regio') database is called. Only one database can be addressed per function call. Default option is 'genesis'. +#' @param type Character string. Specific GENESIS and regionalstatistik.de object types: 'tables', 'statistics', and 'statisticsUpdates'. Specific Zensus 2022 object types: 'tables' and 'statistics'. All types that are specific for one database can be used together through 'all', which is the default. +#' @param date Character string. Specific date that is used as the last update or upload time to include an object in return. Default option is 'now', which uses the current date of your system. Alternative options are 'week_before', using the current date of your system minus 7 days, 'month_before', using the current date of your system minus 4 weeks, and 'year_before', using the current date of your system minus 52 weeks. Additionally, it is possible to fill in a specific date of format 'DD.MM.YYYY'. +#' @param verbose Boolean. Indicator if the output of the function should include detailed messages and warnings. Default option is 'TRUE'. Set the parameter to 'FALSE' to suppress additional messages and warnings. +#' @param ... Additional parameters for the API call. These parameters are only affecting the call itself, no further processing. For more details see `vignette("additional_parameter")`. +#' +#' @return A list with all recalled elements from the API. Always includes the code of the object, the title, and the type of the object. This is done to facilitate further processing with the data. Attributes are added to the data.frame describing the search configuration for the returned output. #' -#' @return A list with all recalled elements from Genesis/Zensus. Always includes the code of the object, the title, and the type of the object. This is done to facilitate further processing with the data. Attributes are added to the data.frame describing the search configuration for the returned output. #' @export #' #' @examples @@ -64,26 +65,28 @@ gen_modified_data <- function(code = "", #----------------------------------------------------------------------------- - # Processing #### + # Processing # res <- lapply(gen_fun, function(db){ - if(verbose) { + if (isTRUE(verbose)) { + info <- paste("Started the processing of", rev_database_function(db), "database.") + message(info) + } #--------------------------------------------------------------------------- + if (type == "tables") { - par_list <- list( - endpoint = "catalogue/modifieddata", - username = gen_auth_get(database = rev_database_function(db))$username, - password = gen_auth_get(database = rev_database_function(db))$password, - selection = code, - type = "Neue Tabellen", - date = date, - ... - ) + par_list <- list(endpoint = "catalogue/modifieddata", + username = gen_auth_get(database = rev_database_function(db))$username, + password = gen_auth_get(database = rev_database_function(db))$password, + selection = code, + type = "Neue Tabellen", + date = date, + ...) results_raw <- do.call(db, par_list) @@ -94,39 +97,39 @@ gen_modified_data <- function(code = "", } #--------------------------------------------------------------------------- + if (type == "statistics") { - par_list <- list( - endpoint = "catalogue/modifieddata", - username = gen_auth_get(database = rev_database_function(db))$username, - password = gen_auth_get(database = rev_database_function(db))$password, - selection = code, - type = "Neue Statistiken", - date = date, - ... - ) + par_list <- list(endpoint = "catalogue/modifieddata", + username = gen_auth_get(database = rev_database_function(db))$username, + password = gen_auth_get(database = rev_database_function(db))$password, + selection = code, + type = "Neue Statistiken", + date = date, + ...) results_raw <- do.call(db, par_list) results_json <- test_if_json(results_raw) test_if_error_light(results_json) + + } #--------------------------------------------------------------------------- + if (type == "statisticsUpdates") { - if(db == "gen_api" | db == "gen_api_regio"){ + if (db == "gen_api" | db == "gen_api_regio") { - par_list <- list( - endpoint = "catalogue/modifieddata", - username = gen_auth_get(database = rev_database_function(db))$username, - password = gen_auth_get(database = rev_database_function(db))$password, - selection = code, - type = "Aktualisierte Statistiken", - date = date, - ... - ) + par_list <- list(endpoint = "catalogue/modifieddata", + username = gen_auth_get(database = rev_database_function(db))$username, + password = gen_auth_get(database = rev_database_function(db))$password, + selection = code, + type = "Aktualisierte Statistiken", + date = date, + ...) } @@ -135,20 +138,20 @@ gen_modified_data <- function(code = "", results_json <- test_if_json(results_raw) test_if_error_light(results_json) + } #--------------------------------------------------------------------------- + if (type == "all") { - par_list <- list( - endpoint = "catalogue/modifieddata", - username = gen_auth_get(database = rev_database_function(db))$username, - password = gen_auth_get(database = rev_database_function(db))$password, - selection = code, - type = "all", - date = date, - ... - ) + par_list <- list(endpoint = "catalogue/modifieddata", + username = gen_auth_get(database = rev_database_function(db))$username, + password = gen_auth_get(database = rev_database_function(db))$password, + selection = code, + type = "all", + date = date, + ...) results_raw <- do.call(db, par_list) @@ -158,14 +161,15 @@ gen_modified_data <- function(code = "", } - if (is.null(unlist(results_json$List))) { - if(isTRUE(verbose)){ + if (isTRUE(verbose)) { + message(paste0("No modified objects found for your code and date in ", rev_database_function(db))) + } - return("No modified objects found") + return("No modified objects found.") } else { @@ -194,12 +198,13 @@ gen_modified_data <- function(code = "", return(list_resp) - } + } + }) #----------------------------------------------------------------------------- - if(!is.null(unlist(res))){ + if (!is.null(unlist(res))) { res <- check_results(res) diff --git a/R/gen_objects2stat.R b/R/gen_objects2stat.R index 1134bb9..61536ff 100644 --- a/R/gen_objects2stat.R +++ b/R/gen_objects2stat.R @@ -1,18 +1,18 @@ -#' gen_objects2stat: Get Objects Related To Statistics +#' gen_objects2stat #' -#' Function to find objects related to a statistic in Genesis/Zensus. +#' Function to find objects related to a statistic #' -#' @param code A string with a maximum length of 6 characters (15 characters if cubes are not used as a category). Code from a Genesis/Zensus-Object. Only one code per iteration. -#' @param database Character string. Indicator if the Genesis or Zensus database is called. Only one database can be addressed per function call. Default option is 'genesis'. -#' @param category A string. Includes specific Genesis-Object-types: 'tables', 'variables', and 'cubes' - and specific Zensus-Object-types: "tables" and "variables". All types that are specific for one database can be used together. Default option is to use all types that are possible for the specific database. -#' @param area A string. Indicator from which area of the database the results are called. In general, "all" is the appropriate solution. Default option is 'all'. -#' @param detailed A logical. Indicator if function should return the detailed output of the iteration including all object-related information or only a shortened output including only code and object title. The default is detailed = FALSE. -#' @param error.ignore A logical. Indicator if the function should stop if an error occurs or no object for the request is found or if it should produce a token as response. Default option is 'FALSE'. -#' @param sortcriterion A string. Indicator if the output should be sorted by 'code' or 'content'. This is a parameter of the Genesis/Zensus API call itself. The default is "code". -#' @param verbose Logical. Indicator if the output of the function should include detailed messages and warnings. Default option is 'TRUE'. Set the parameter to 'FALSE' to suppress additional messages and warnings. -#' @param ... Additional parameters for the Genesis/Zensus API call. These parameters are only affecting the Genesis/Zensus call itself, no further processing. For more details see `vignette("additional_parameter")`. +#' @param code Character string with a maximum length of 6 characters (15 characters if 'cubes' are not used as a category). Code from a GENESIS, Zensus 2022 or regionalstatistik.de object. Only one code per iteration. +#' @param database Character string. Indicator if the GENESIS ('genesis'), Zensus 2022 ('zensus') or regionalstatistik.de ('regio') database is called. Only one database can be addressed per function call. Default option is 'genesis'. +#' @param category Character string. Specify specific GENESIS/regionalstatistik.de object types ('tables', 'statistics' and 'cubes') and specific Zensus 2022 object types ('tables' and 'statistics'). All types that are specific for one database can be used together. Default option is to use all types that are possible for the specific database. +#' @param area Character string. Indicator from which area of the database the results are called. In general, 'all' is the appropriate solution. Default option is 'all'. Not used for 'statistics'. +#' @param detailed Boolean. Indicator if the function should return the detailed output of the iteration including all object-related information or only a shortened output including only code and object title. Default option is 'FALSE'. +#' @param error.ignore Boolean. Indicator if the function should stop if an error occurs or no object for the request is found or if it should produce a token as response. Default option is 'FALSE'. +#' @param sortcriterion Character string. Indicator if the output should be sorted by 'code' or 'content'. This is a parameter of the API call itself. The default is 'code'. +#' @param verbose Boolean. Indicator if the output of the function should include detailed messages and warnings. Default option is 'TRUE'. Set the parameter to 'FALSE' to suppress additional messages and warnings. +#' @param ... Additional parameters for the API call. These parameters are only affecting the call itself, no further processing. For more details see `vignette("additional_parameter")`. #' -#' @return A list with all recalled elements from Genesis/Zensus based on the detailed-parameter it contains more or less information, but always includes the code of the object, the title, and the type of the object. This is done to facilitate further processing of the data. Attributes are added to the dataframe describing the search configuration for the returned output. +#' @return A list with all recalled elements from the API. Based on the 'detailed' parameter it contains more or less information, but always includes the code of the object, the title, and the type of the object. This is done to facilitate further processing with the data. Attributes are added to the data.frame describing the search configuration for the returned output. #' @export #' #' @examples @@ -59,23 +59,25 @@ gen_objects2stat <- function(code = NULL, res <- lapply(gen_fun, function(db){ - if(verbose) { + if (isTRUE(verbose)) { + info <- paste("Started the processing of", rev_database_function(db), "database.") + message(info) + } #--------------------------------------------------------------------------- + if ("tables" %in% category) { - par_list <- list( - endpoint = "catalogue/tables2statistic", - username = gen_auth_get(database = rev_database_function(db))$username, - password = gen_auth_get(database = rev_database_function(db))$password, - name = code, - area = area, - sortcriterion = sortcriterion, - ... - ) + par_list <- list(endpoint = "catalogue/tables2statistic", + username = gen_auth_get(database = rev_database_function(db))$username, + password = gen_auth_get(database = rev_database_function(db))$password, + name = code, + area = area, + sortcriterion = sortcriterion, + ...) results_raw <- do.call(db, par_list) @@ -83,16 +85,15 @@ gen_objects2stat <- function(code = NULL, empty_object <- test_if_error(results_json, para = error.ignore, verbose = verbose) - - if(isTRUE(empty_object)){ + if (isTRUE(empty_object)) { df_tables <- "No 'tables' object found for your request." - } else if(isFALSE(empty_object)){ + } else if (isFALSE(empty_object)) { df_tables <- results_json$Status$Content - } else if(empty_object == "DONE"){ + } else if (empty_object == "DONE") { if (isTRUE(detailed)) { @@ -106,27 +107,28 @@ gen_objects2stat <- function(code = NULL, df_tables <- binding_lapply(results_json$List, characteristics = c("Code", "Content")) + } df_tables$Object_Type <- "Table" df_tables <- tibble::as_tibble(df_tables) + } } #--------------------------------------------------------------------------- + if ("variables" %in% category) { - par_list <- list( - endpoint = "catalogue/variables2statistic", - username = gen_auth_get(database = rev_database_function(db))$username, - password = gen_auth_get(database = rev_database_function(db))$password, - name = code, - area = area, - sortcriterion = sortcriterion, - ... - ) + par_list <- list(endpoint = "catalogue/variables2statistic", + username = gen_auth_get(database = rev_database_function(db))$username, + password = gen_auth_get(database = rev_database_function(db))$password, + name = code, + area = area, + sortcriterion = sortcriterion, + ...) results_raw <- do.call(db, par_list) @@ -134,16 +136,15 @@ gen_objects2stat <- function(code = NULL, empty_object <- test_if_error(results_json, para = error.ignore, verbose = verbose) - - if(isTRUE(empty_object)){ + if (isTRUE(empty_object)) { df_variables <- "No 'variables' object found for your request." - } else if(isFALSE(empty_object)){ + } else if (isFALSE(empty_object)) { df_variables <- results_json$Status$Content - } else if(empty_object == "DONE"){ + } else if (empty_object == "DONE") { if (detailed == TRUE) { @@ -165,41 +166,42 @@ gen_objects2stat <- function(code = NULL, df_variables$Object_Type <- "Variable" df_variables <- tibble::as_tibble(df_variables) + } + } #--------------------------------------------------------------------------- + if ("cubes" %in% category && "gen_zensus_api" == db) { - df_cubes <- "No 'cubes' object available for 'zensus'-database." + df_cubes <- "There are generally no 'cubes' objects available for the 'zensus' database." return(df_cubes) } else if ("cubes" %in% category && (db == "gen_api" || db == "gen_regio_api")) { - results_raw <- do.call(db, list( - endpoint = "catalogue/cubes2statistic", - username = gen_auth_get(database = rev_database_function(db))$username, - password = gen_auth_get(database = rev_database_function(db))$password, - name = code, - area = area, - sortcriterion = sortcriterion, - ... - )) + results_raw <- do.call(db, list(endpoint = "catalogue/cubes2statistic", + username = gen_auth_get(database = rev_database_function(db))$username, + password = gen_auth_get(database = rev_database_function(db))$password, + name = code, + area = area, + sortcriterion = sortcriterion, + ...)) results_json <- test_if_json(results_raw) empty_object <- test_if_error(results_json, para = error.ignore, verbose = verbose) - if(isTRUE(empty_object)){ + if (isTRUE(empty_object)) { df_cubes <- "No 'cubes' object found for your request." - } else if(isFALSE(empty_object)){ + } else if (isFALSE(empty_object)) { df_cubes <- results_json$Status$Content - } else if(empty_object == "DONE"){ + } else if (empty_object == "DONE") { if (isTRUE(detailed)) { @@ -222,17 +224,20 @@ gen_objects2stat <- function(code = NULL, df_cubes$Object_Type <- "Cube" df_cubes <- tibble::as_tibble(df_cubes) + } + } #--------------------------------------------------------------------------- - # Summary + + # Summary # + if (all(c("tables", "variables", "cubes") %in% category)) { - list_resp <- list( - "Tables" = df_tables, - "Variables" = df_variables, - "Cubes" = df_cubes) + list_resp <- list("Tables" = df_tables, + "Variables" = df_variables, + "Cubes" = df_cubes) } else if (category == "tables") { diff --git a/R/gen_objects2var.R b/R/gen_objects2var.R index e1e1c2e..151c648 100644 --- a/R/gen_objects2var.R +++ b/R/gen_objects2var.R @@ -1,18 +1,18 @@ -#' gen_objects2var: Get Objects Related To Variable +#' gen_objects2var #' -#' @description Function to find objects related to a variable in Genesis/Zensus. +#' @description Function to find objects related to a variable #' -#' @param code A string with a maximum length of 15 characters. Code from a Genesis/Zensus-Object. Only one code per iteration. -#' @param database Character string. Indicator if the Genesis or Zensus database is called. Only one database can be addressed per function call. Default option is 'genesis'. -#' @param category A string. Includes specific Genesis-Object-types: 'tables', 'statistics', and 'cubes' - and specific Zensus-Object-types: "tables" and "statistics". All types that are specific for one database can be used together. Default option is to use all types that are possible for the specific database. -#' @param area A string. Indicator from which area of the database the results are called. In general, "all" is the appropriate solution. Default option is 'all'. -#' @param detailed A logical. Indicator if function should return the detailed output of the iteration including all object-related information or only a shortened output including only code and object title. The default is detailed = FALSE. -#' @param error.ignore A logical. Indicator if the function should stop if an error occurs or no object for the request is found or if it should produce a token as response. Default option is 'FALSE'. -#' @param sortcriterion A string. Indicator if the output should be sorted by 'code' or 'content'. This is a parameter of the Genesis/Zensus API call itself. The default is "code". -#' @param verbose Logical. Indicator if the output of the function should include detailed messages and warnings. Default option is 'TRUE'. Set the parameter to 'FALSE' to suppress additional messages and warnings. -#' @param ... Additional parameters for the Genesis/Zensus API call. These parameters are only affecting the Genesis/Zensus call itself, no further processing. For more details see `vignette("additional_parameter")`. +#' @param code Character string with a maximum length of 15 characters. Code from a GENESIS, Zensus 2022 or regionalstatistik.de object. Only one code per iteration. +#' @param database Character string. Indicator if the GENESIS ('genesis'), Zensus 2022 ('zensus') or regionalstatistik.de ('regio') database is called. Only one database can be addressed per function call. Default option is 'genesis'. +#' @param category Character string. Specify specific GENESIS/regionalstatistik.de object types ('tables', 'statistics' and 'cubes') and specific Zensus 2022 object types ('tables' and 'statistics'). All types that are specific for one database can be used together. Default option is to use all types that are possible for the specific database. +#' @param area Character string. Indicator from which area of the database the results are called. In general, 'all' is the appropriate solution. Default option is 'all'. Not used for 'statistics'. +#' @param detailed Boolean. Indicator if the function should return the detailed output of the iteration including all object-related information or only a shortened output including only code and object title. Default option is 'FALSE'. +#' @param error.ignore Boolean. Indicator if the function should stop if an error occurs or no object for the request is found or if it should produce a token as response. Default option is 'FALSE'. +#' @param sortcriterion Character string. Indicator if the output should be sorted by 'code' or 'content'. This is a parameter of the API call itself. The default is 'code'. +#' @param verbose Boolean. Indicator if the output of the function should include detailed messages and warnings. Default option is 'TRUE'. Set the parameter to 'FALSE' to suppress additional messages and warnings. +#' @param ... Additional parameters for the API call. These parameters are only affecting the call itself, no further processing. For more details see `vignette("additional_parameter")`. #' -#' @return A list with all recalled elements from Genesis/Zensus. Based on the detailed-parameter it contains more or less information, but always includes the code of the object, the title, and the type of the object. This is done to facilitate further processing of the data. Attributes are added to the dataframe describing the search configuration for the returned output. +#' @return A list with all recalled elements from the API. Based on the 'detailed' parameter it contains more or less information, but always includes the code of the object, the title, and the type of the object. This is done to facilitate further processing with the data. Attributes are added to the data.frame describing the search configuration for the returned output. #' @export #' #' @examples @@ -59,23 +59,25 @@ gen_objects2var <- function(code = NULL, res <- lapply(gen_fun, function(db){ - if(verbose) { + if (isTRUE(verbose)) { + info <- paste("Started the processing of", rev_database_function(db), "database.") + message(info) + } #--------------------------------------------------------------------------- + if ("tables" %in% category) { - par_list <- list( - endpoint = "catalogue/tables2variable", - username = gen_auth_get(database = rev_database_function(db))$username, - password = gen_auth_get(database = rev_database_function(db))$password, - name = code, - area = area, - sortcriterion = sortcriterion, - ... - ) + par_list <- list(endpoint = "catalogue/tables2variable", + username = gen_auth_get(database = rev_database_function(db))$username, + password = gen_auth_get(database = rev_database_function(db))$password, + name = code, + area = area, + sortcriterion = sortcriterion, + ...) results_raw <- do.call(db, par_list) @@ -83,16 +85,15 @@ gen_objects2var <- function(code = NULL, empty_object <- test_if_error(results_json, para = error.ignore, verbose = verbose) - - if(isTRUE(empty_object)){ + if (isTRUE(empty_object)) { df_tables <- "No 'tables' object found for your request." - } else if(isFALSE(empty_object)){ + } else if (isFALSE(empty_object)) { df_tables <- results_json$Status$Content - } else if(empty_object == "DONE"){ + } else if (empty_object == "DONE") { if (isTRUE(detailed)) { @@ -101,7 +102,6 @@ gen_objects2var <- function(code = NULL, "Content", "Time")) - } else { df_tables <- binding_lapply(results_json$List, @@ -113,21 +113,22 @@ gen_objects2var <- function(code = NULL, df_tables$Object_Type <- "Table" df_tables <- tibble::as_tibble(df_tables) + } + } #--------------------------------------------------------------------------- + if ("statistics" %in% category) { - par_list <- list( - endpoint = "catalogue/statistics2variable", - username = gen_auth_get(database = rev_database_function(db))$username, - password = gen_auth_get(database = rev_database_function(db))$password, - name = code, - area = area, - sortcriterion = sortcriterion, - ... - ) + par_list <- list(endpoint = "catalogue/statistics2variable", + username = gen_auth_get(database = rev_database_function(db))$username, + password = gen_auth_get(database = rev_database_function(db))$password, + name = code, + area = area, + sortcriterion = sortcriterion, + ...) results_raw <- do.call(db, par_list) @@ -135,16 +136,15 @@ gen_objects2var <- function(code = NULL, empty_object <- test_if_error(results_json, para = error.ignore, verbose = verbose) - - if(isTRUE(empty_object)){ + if (isTRUE(empty_object)) { df_statistics <- "No 'statistics' object found for your request." - } else if(isFALSE(empty_object)){ + } else if (isFALSE(empty_object)) { df_statistics <- results_json$Status$Content - } else if(empty_object == "DONE"){ + } else if (empty_object == "DONE") { if (isTRUE(detailed)) { @@ -159,15 +159,19 @@ gen_objects2var <- function(code = NULL, df_statistics <- binding_lapply(results_json$List, characteristics = c("Code", "Content")) + } df_statistics$Object_Type <- "Statistic" df_statistics <- tibble::as_tibble(df_statistics) + } + } #--------------------------------------------------------------------------- + if ("cubes" %in% category && db == "gen_zensus_api") { df_cubes <- "No 'cubes' object available for 'zensus'-database." @@ -176,30 +180,27 @@ gen_objects2var <- function(code = NULL, } else if ("cubes" %in% category && (db == "gen_api" || db == "gen_regio_api")) { - results_raw <- do.call(db, list( - endpoint = "catalogue/timeseries2variable", - username = gen_auth_get(database = rev_database_function(db))$username, - password = gen_auth_get(database = rev_database_function(db))$password, - name = code, - area = area, - sortcriterion = sortcriterion, - ... - )) + results_raw <- do.call(db, list(endpoint = "catalogue/timeseries2variable", + username = gen_auth_get(database = rev_database_function(db))$username, + password = gen_auth_get(database = rev_database_function(db))$password, + name = code, + area = area, + sortcriterion = sortcriterion, + ...)) results_json <- test_if_json(results_raw) empty_object <- test_if_error(results_json, para = error.ignore, verbose = verbose) - - if(isTRUE(empty_object)){ + if (isTRUE(empty_object)) { df_cubes <- "No 'cubes' object found for your request." - } else if(isFALSE(empty_object)){ + } else if (isFALSE(empty_object)) { df_cubes <- results_json$Status$Content - } else if(empty_object == "DONE"){ + } else if (empty_object == "DONE") { if (isTRUE(detailed)) { @@ -216,23 +217,25 @@ gen_objects2var <- function(code = NULL, df_cubes <- binding_lapply(results_json$List, characteristics = c("Code", "Content")) + } df_cubes$Object_Type <- "Cube" df_cubes <- tibble::as_tibble(df_cubes) + } + } #--------------------------------------------------------------------------- - # Summary + # Summary # + if (all(c("tables", "statistics", "cubes") %in% category)) { - list_resp <- list( - "Tables" = df_tables, - "Statistics" = df_statistics, - "Cubes" = df_cubes - ) + list_resp <- list("Tables" = df_tables, + "Statistics" = df_statistics, + "Cubes" = df_cubes) } else if (category == "tables") { diff --git a/R/gen_qualitysigns.R b/R/gen_qualitysigns.R index edf7c79..931828e 100644 --- a/R/gen_qualitysigns.R +++ b/R/gen_qualitysigns.R @@ -1,33 +1,30 @@ -#' gen_signs: Explore Meaning of Special Signs in the Objects +#' gen_signs #' -#' @description Function to list all current used special signs (e.g., 0, *, X, (), p, ...) and their meaning in Genesis, Zensus, and/or regio. +#' @description Function to list all currently used special signs (e.g., 0, *, X, (), p, ...) and their meaning in GENESIS, Zensus 2022 and/or regionalstatistik.de. #' -#' @param database Character string. Indicator if the Genesis or Zensus database is called. Default option is 'genesis'. -#' @param ... Additional parameters for the Genesis/Zensus API call. These parameters are only affecting the Genesis/Zensus call itself, no further processing. For more details see `vignette("additional_parameter")`. +#' @param database Character string. Indicator if the GENESIS ('genesis'), Zensus 2022 ('zensus') or regionalstatistik.de ('regio') database is called. Only one database can be addressed per function call. Default option is 'genesis'. +#' @param ... Additional parameters for the API call. These parameters are only affecting the call itself, no further processing. For more details see `vignette("additional_parameter")`. #' #' @return A list of all current used special signs. #' @export #' gen_signs <- function(database = c("all", "genesis", "zensus", "regio"), - ... - ) { + ...) { gen_fun <- test_database_function(database) res <- lapply(gen_fun, function(db){ - par_list <- list( - endpoint = "catalogue/qualitysigns", - ... - ) + par_list <- list(endpoint = "catalogue/qualitysigns", + ...) results_raw <- do.call(db, par_list) results_json <- test_if_json(results_raw) mid_res <- list("Output" = tibble::as_tibble(binding_lapply(results_json$List, - characteristics = c("Code", - "Content")))) + characteristics = c("Code", + "Content")))) attr(mid_res, "Database") <- rev_database_function(db) attr(mid_res, "Language") <- results_json$Parameter$language diff --git a/R/gen_table.R b/R/gen_table.R index dcb763c..a1e14e6 100644 --- a/R/gen_table.R +++ b/R/gen_table.R @@ -1,35 +1,36 @@ #' gen_table #' -#' @description Download a table with data from Genesis +#' @description Download a table with data from GENESIS, Zensus 2022 or regionalstatistik.de databases #' -#' @param name a string. Name of the table. Use of wildcards (`*`) allowed. +#' @param name Character string. Name/code of the table. Use of wildcards (`*`) is possible. #' @param ... Optional parameters passed on to the Genesis API call: #' \describe{ -#' \item{\code{area}}{a string. The area in which the table is stored. Possible values: +#' \item{\code{area}}{Character string. The area in which the table is stored. Possible values: #' \itemize{ #' \item \code{"public"}: table in the public catalogue #' \item \code{"user"}: table in the user's account +#' \item \code{"all"}: both of the above #' }} -#' \item{\code{compress}}{a logical. Should empty rows and columns be discarded?} -#' \item{\code{transpose}}{a logical. Reshape the table between "wide" and +#' \item{\code{compress}}{Boolean. Should empty rows and columns be discarded?} +#' \item{\code{transpose}}{Boolean. Reshape the table between "wide" and #' "long" format.} -#' \item{\code{startyear,endyear}}{a number. Only retrieve data between these years.} -#' \item{\code{regionalvariable}}{character. Code of the regional variable +#' \item{\code{startyear,endyear}}{Four-digit integers. Only retrieve data between these years.} +#' \item{\code{regionalvariable}}{Character string. Code of the regional variable #' whose value is specified in \code{regionalkey} to filter the results.} -#' \item{\code{regionalkey}}{character. One or more regional keys. Multiple +#' \item{\code{regionalkey}}{Character string. One or more regional keys. Multiple #' values can be supplied as a character vector or as a single string, #' with the regional keys separated by commas. Use of wildcard (`*`) allowed.} #' \item{\code{classifyingvariable1,classifyingvariable2 -#' ,classifyingvariable3}}{character. Code of the subject classification +#' ,classifyingvariable3}}{Character string. Code of the subject classification #' (SK-Merkmal) to which the selection by means of the corresponding #' `classifyingkey` parameter is to be applied.} -#' \item{\code{classifyingkey1,classifyingkey2,classifyingkey3}}{character. +#' \item{\code{classifyingkey1,classifyingkey2,classifyingkey3}}{Character string. #' One or more values of a subject classification (e.g. "WZ93012"). Applied #' to the corresponding `classifyingvariable` parameter. Multiple #' keys can be supplied as a character vector or as a single string, #' with the keys separated by commas. Use of wildcard (`*`) allowed.} -#' \item{\code{stand}}{a string \code{"DD.MM.YYYY"}. Only retrieve data -#' updated after this #' date.} +#' \item{\code{stand}}{Character string, format: \code{"DD.MM.YYYY"}. Only retrieve data +#' updated after this date.} #' \item{\code{language}}{Search terms, returned messages and data #' descriptions in German (`"de"`) or English (`"en"`)?} #' \item{\code{job}}{Boolean. Indicate as to whether a job should be created diff --git a/R/gen_update_EVAS.R b/R/gen_update_EVAS.R index 42c5845..55be0ba 100644 --- a/R/gen_update_EVAS.R +++ b/R/gen_update_EVAS.R @@ -1,13 +1,13 @@ -#' gen_update_EVAS: Update the EVAS numbers used in the gen_catalogue function +#' gen_update_evas #' -#' @description Function to web scrape the EVAS numbers from the EVAS website and save them as a RData file. +#' @description Function to web scrape the EVAS numbers from the EVAS website and save them as a RData file. Takes no parameters. #' -#' @return An update RData file containing the EVAS numbers. +#' @return An updated .RData file containing the latest EVAS numbers #' @export #' -gen_update_EVAS <- function(){ +gen_update_evas <- function(){ - # Check rvest and purrr packages + # Check rvest package if (!requireNamespace("rvest", quietly = TRUE)) { stop("If you want to use this specific function, the package {rvest} needs to be installed.", @@ -24,7 +24,7 @@ gen_update_EVAS <- function(){ # Read the HTML content of the URL html <- rvest::read_html(url) html <- rvest::html_nodes(html, "table") - html <- purrr::map_dfr(html, function(table){rvest::html_table(table, convert = FALSE)}) + html <- purrr::map_dfr(html, function(table){ rvest::html_table(table, convert = FALSE) }) html <- html[, c("EVAS", "Beschreibung")] html$Titel <- paste(html$EVAS, html$Beschreibung, sep = " - ") attr(html, "Update_Date") <- format(Sys.Date(), "%Y%m%d") @@ -34,8 +34,5 @@ gen_update_EVAS <- function(){ # Return the modified data object save(evas_list ,file = data_path) -} - - - +} From 8d29e1af0a8eb4d25d6e598fac12b1d9d82afced Mon Sep 17 00:00:00 2001 From: bubux Date: Mon, 8 Jul 2024 15:32:53 +0200 Subject: [PATCH 31/52] improve docs pt.2 --- R/gen_var2-val2.R | 226 ++++++++++++++++++++++----------------- R/utils_dataprocessing.R | 139 +++++++++++++----------- R/utils_httr2.R | 30 ++++-- R/zzz.R | 1 + 4 files changed, 230 insertions(+), 166 deletions(-) diff --git a/R/gen_var2-val2.R b/R/gen_var2-val2.R index 6991010..751d415 100644 --- a/R/gen_var2-val2.R +++ b/R/gen_var2-val2.R @@ -1,17 +1,17 @@ -#' gen_var2stat: Get Variables From a Statistic +#' gen_var2stat #' -#' @description Function to generate variables from statistics in Genesis/Zensus. +#' @description Function to generate variables from statistics #' -#' @param code A string with a maximum length of 15 characters. Code from a Genesis/Zensus-Object. Only one code per iteration. "*"-Notations are possibly to be used as a placeholder. -#' @param database Character string. Indicator if the Genesis or Zensus database is called. Only one database can be addressed per function call. Default option is 'genesis'. -#' @param area A string. Indicator from which area of the database the results are called. In general, "all" is the appropriate solution. Default option is 'all'. Only used for Genesis. -#' @param detailed A logical. Indicator if function should return the detailed output of the iteration including all object-related information or only a shortened output including only code and object title. The default is detailed = FALSE. -#' @param sortcriterion A string. Indicator if the output should be sorted by 'code' or 'content'. This is a parameter of the Genesis/Zensus API call itself. The default is "code". -#' @param error.ignore A logical. Indicator if the function should stop if an error occurs or no object for the request is found or if it should produce a token as response. Default option is 'FALSE'. -#' @param verbose Logical. Indicator if the output of the function should include detailed messages and warnings. Default option is 'TRUE'. Set the parameter to 'FALSE' to suppress additional messages and warnings. -#' @param ... Additional parameters for the Genesis/Zensus API call. These parameters are only affecting the Genesis/Zensus call itself, no further processing. For more details see `vignette("additional_parameter")`. +#' @param code Character string with a maximum length of 15 characters. Code from a GENESIS, Zensus 2022 or regionalstatistik.de object. Only one code per iteration. +#' @param database Character string. Indicator if the GENESIS ('genesis'), Zensus 2022 ('zensus') or regionalstatistik.de ('regio') database is called. Only one database can be addressed per function call. Default option is 'genesis'. +#' @param area Character string. Indicator from which area of the database the results are called. In general, 'all' is the appropriate solution. Default option is 'all'. Not used for 'statistics'. +#' @param detailed Boolean. Indicator if the function should return the detailed output of the iteration including all object-related information or only a shortened output including only code and object title. Default option is 'FALSE'. +#' @param error.ignore Boolean. Indicator if the function should stop if an error occurs or no object for the request is found or if it should produce a token as response. Default option is 'FALSE'. +#' @param sortcriterion Character string. Indicator if the output should be sorted by 'code' or 'content'. This is a parameter of the API call itself. The default is 'code'. +#' @param verbose Boolean. Indicator if the output of the function should include detailed messages and warnings. Default option is 'TRUE'. Set the parameter to 'FALSE' to suppress additional messages and warnings. +#' @param ... Additional parameters for the API call. These parameters are only affecting the call itself, no further processing. For more details see `vignette("additional_parameter")`. #' -#' @return A list with all recalled elements from Genesis/Zensus. Based on the detailed-parameter it contains more or less information, but always includes the code of the object, the title, and the type of the object. This is done to facilitate further processing of the data. Attributes are added to the dataframe describing the search configuration for the returned output. +#' @return A list with all recalled elements from the API. Based on the 'detailed' parameter it contains more or less information, but always includes the code of the object, the title, and the type of the object. This is done to facilitate further processing with the data. Attributes are added to the data.frame describing the search configuration for the returned output. #' @export #' #' @examples @@ -50,26 +50,29 @@ gen_var2stat <- function(code = NULL, #----------------------------------------------------------------------------- - # Processing #### + # Processing # res <- lapply(gen_fun, function(db){ - if(verbose) { + if (isTRUE(verbose)) { + info <- paste("Started the processing of", rev_database_function(db), "database.") + message(info) - } + } #--------------------------------------------------------------------------- - par_list <- list( - endpoint = "catalogue/variables2statistic", - username = gen_auth_get(database = rev_database_function(db))$username, - password = gen_auth_get(database = rev_database_function(db))$password, - name = code, - ... - ) - - if(db == "gen_api" | db == "gen_regio_api"){ + + par_list <- list(endpoint = "catalogue/variables2statistic", + username = gen_auth_get(database = rev_database_function(db))$username, + password = gen_auth_get(database = rev_database_function(db))$password, + name = code, + ...) + + if (db == "gen_api" | db == "gen_regio_api") { + par_list <- append(par_list, list(area = area)) + } results_raw <- do.call(db, par_list) @@ -78,12 +81,16 @@ gen_var2stat <- function(code = NULL, empty_object <- test_if_error(results_json, para = error.ignore, verbose = verbose) + if (isTRUE(empty_object)) { + + list_of_variables <- "No 'variables' object found for your request." + + } else if (isFALSE(empty_object)) { - if(isTRUE(empty_object)){ - list_of_variables <- "No `variables`- object found for your request." - } else if(isFALSE(empty_object)){ list_of_variables <- results_json$Status$Content - } else if(empty_object == "DONE"){ + + } else if (empty_object == "DONE") { + if (isTRUE(detailed)) { list_of_variables <- binding_lapply(results_json$List, @@ -97,18 +104,19 @@ gen_var2stat <- function(code = NULL, list_of_variables <- binding_lapply(results_json$List, characteristics = c("Code", - "Content" - )) + "Content")) } list_of_variables$Object_Type <- "Variable" list_of_variables <- tibble::as_tibble(list_of_variables) + } #--------------------------------------------------------------------------- - # Summary #### + + # Summary # list_resp <- list("Variables" = list_of_variables) attr(list_resp, "Code") <- results_json$Parameter$name @@ -122,6 +130,7 @@ gen_var2stat <- function(code = NULL, }) #----------------------------------------------------------------------------- + res <- check_results(res) return(res) @@ -130,19 +139,19 @@ gen_var2stat <- function(code = NULL, #------------------------------------------------------------------------------- -#' gen_val2var: Get Values From a Variable +#' gen_val2var #' -#' @description Function to extract the possible values from a variable from Genesis/Zensus. Values for continuous variables are not extractable, so the function returns a warning message. +#' @description Function to extract the possible values from a variable. Values for continuous variables are not extractable, which is why the function returns a warning message in this case. #' -#' @param code A string with a maximum length of 15 characters. Code from a Genesis/Zensus-Object. Only one code per iteration. -#' @param database Character string. Indicator if the Genesis or Zensus database is called. Only one database can be addressed per function call. Default option is 'genesis'. -#' @param area A string. Indicator from which area of the database the results are called. In general, "all" is the appropriate solution. Default option is 'all'. Only used for Genesis. -#' @param sortcriterion A string. Indicator if the output should be sorted by 'code' or 'content'. This is a parameter of the Genesis/Zensus API call itself. The default is "code". -#' @param error.ignore A logical. Indicator if the function should stop if an error occurs or no object for the request is found or if it should produce a token as response. Default option is 'TRUE' - . -#' @param verbose Logical. Indicator if the output of the function should include detailed messages and warnings. Default option is 'TRUE'. Set the parameter to 'FALSE' to suppress additional messages and warnings. -#' @param ... Additional parameters for the Genesis/Zensus API call. These parameters are only affecting the Genesis/Zensus call itself, no further processing. For more details see `vignette("additional_parameter")`. +#' @param code Character string with a maximum length of 15 characters. Code from a GENESIS, Zensus 2022 or regionalstatistik.de object. Only one code per iteration. +#' @param database Character string. Indicator if the GENESIS ('genesis'), Zensus 2022 ('zensus') or regionalstatistik.de ('regio') database is called. Only one database can be addressed per function call. Default option is 'genesis'. +#' @param area Character string. Indicator from which area of the database the results are called. In general, 'all' is the appropriate solution. Default option is 'all'. Not used for 'statistics'. +#' @param error.ignore Boolean. Indicator if the function should stop if an error occurs or no object for the request is found or if it should produce a token as response. Default option is 'FALSE'. +#' @param sortcriterion Character string. Indicator if the output should be sorted by 'code' or 'content'. This is a parameter of the API call itself. The default is 'code'. +#' @param verbose Boolean. Indicator if the output of the function should include detailed messages and warnings. Default option is 'TRUE'. Set the parameter to 'FALSE' to suppress additional messages and warnings. +#' @param ... Additional parameters for the API call. These parameters are only affecting the call itself, no further processing. For more details see `vignette("additional_parameter")`. #' -#' @return A list with all recalled elements from Genesis/Zensus. Always includes the code of the object, the title, and the type of the object. This is done to facilitate further processing of the data. Attributes are added to the dataframe describing the search configuration for the returned output. +#' @return A list with all recalled elements from the API. Always includes the code of the object, the title, and the type of the object. This is done to facilitate further processing with the data. Attributes are added to the data.frame describing the search configuration for the returned output. #' @export #' #' @examples @@ -182,38 +191,50 @@ gen_val2var <- function(code = NULL, res <- lapply(gen_fun, function(db){ - if(verbose) { + if (isTRUE(verbose)) { + info <- paste("Started the processing of", rev_database_function(db), "database.") + message(info) + } - par_list <- list( - endpoint = "catalogue/values2variable", - username = gen_auth_get(database = rev_database_function(db))$username, - password = gen_auth_get(database = rev_database_function(db))$password, - name = code, - ... - ) + par_list <- list(endpoint = "catalogue/values2variable", + username = gen_auth_get(database = rev_database_function(db))$username, + password = gen_auth_get(database = rev_database_function(db))$password, + name = code, + ...) + + if (db == "gen_api" | db == "gen_regio_api") { - if(db == "gen_api" | db == "gen_regio_api"){ par_list <- append(par_list, list(area = area)) + } results_raw <- do.call(db, par_list) results_json <- test_if_json(results_raw) - if(isFALSE(grepl("pairlist\\(gen_val2var", embedding))){ + if (isFALSE(grepl("pairlist\\(gen_val2var", embedding))) { + empty_object <- test_if_error_variables(results_json, para = error.ignore) + } else { + empty_object <- test_if_error(results_json, para = error.ignore, verbose = verbose) + } - if(isTRUE(empty_object)){ - list_of_variables <- "No `values`- object found for your request." - } else if(isFALSE(empty_object)){ + if (isTRUE(empty_object)) { + + list_of_variables <- "No 'values' object found for your request." + + } else if (isFALSE(empty_object)) { + list_of_variables <- results_json$Status$Content - } else if(empty_object == "DONE"){ + + } else if (empty_object == "DONE") { + list_of_variables <- binding_lapply(results_json$List, characteristics = c("Code", "Content", @@ -250,21 +271,21 @@ gen_val2var <- function(code = NULL, #------------------------------------------------------------------------------- -#' gen_val2var2stat: Get Values From a Variable From a Statistic +#' gen_val2var2stat #' #' @description Get values from variables from a statistic. Values for continuous variables cannot be extracted, so the function returns a warning message. #' -#' @param code A string with a maximum length of 15 characters. Code from a Genesis/Zensus-Object. Only one code per iteration. "*"-Notations are possibly to be used as a placeholder. -#' @param database Character string. Indicator if the Genesis or Zensus database is called. Only one database can be addressed per function call. Default option is 'genesis'. -#' @param area A string. Indicator from which area of the database the results are called. In general, "all" is the appropriate solution. Default option is 'all'. Only used for Genesis. -#' @param detailed A logical. Indicator if function should return the detailed output of the iteration including all object-related information or only a shortened output including only code and object title. This parameter only affects the details of the variables-related output. The default is FALSE. -#' @param error.ignore.var A logical. Indicator for the variables if the function should stop if an error occurs or no object for the request is found or if it should produce a token as response. Default option is 'FALSE'. -#' @param error.ignore.val A logical. Indicator for the values if the function should stop if an error occurs or no object for the request is found or if it should produce a token as response. Default option is 'TRUE' - this prevents the function to stop even if a varaible has no further explanation (as often the case for numerical variables). -#' @param sortcriterion A string. Indicator if the output should be sorted by 'code' or 'content'. This is an parameter of the Genesis/Zensus API call itself. The default is "code". -#' @param verbose Logical. Indicator if the output of the function should include detailed messages and warnings. Default option is 'TRUE'. Set the parameter to 'FALSE' to suppress additional messages and warnings. -#' @param ... Additional parameters for the Genesis/Zensus API call. These parameters are only affecting the Genesis/Zensus call itself, no further processing. For more details see `vignette("additional_parameter")`. +#' @param code Character string with a maximum length of 15 characters. Code from a GENESIS, Zensus 2022 or regionalstatistik.de object. Only one code per iteration. +#' @param database Character string. Indicator if the GENESIS ('genesis'), Zensus 2022 ('zensus') or regionalstatistik.de ('regio') database is called. Only one database can be addressed per function call. Default option is 'genesis'. +#' @param area Character string. Indicator from which area of the database the results are called. In general, 'all' is the appropriate solution. Default option is 'all'. Not used for 'statistics'. +#' @param detailed Boolean. Indicator if the function should return the detailed output of the iteration including all object-related information or only a shortened output including only code and object title. Default option is 'FALSE'. +#' @param error.ignore.var Boolean. Indicator for variables if the function should stop if an error occurs or no object for the request is found or if it should produce a token as response. Default option is 'FALSE'. +#' @param error.ignore.val Boolean. Indicator for values if the function should stop if an error occurs or no object for the request is found or if it should produce a token as response. Default option is 'TRUE', this prevents the function to stop even if a variable has no further explanation (often the case for numerical variables). +#' @param sortcriterion Character string. Indicator if the output should be sorted by 'code' or 'content'. This is a parameter of the API call itself. The default is 'code'. +#' @param verbose Boolean. Indicator if the output of the function should include detailed messages and warnings. Default option is 'TRUE'. Set the parameter to 'FALSE' to suppress additional messages and warnings. +#' @param ... Additional parameters for the API call. These parameters are only affecting the call itself, no further processing. For more details see `vignette("additional_parameter")`. #' -#' @return A list with all recalled elements from Genesis/Zensus Based on the detailed-parameter it contains more or less information, but always includes the code of the object, the title, and the type of the object. This is done to facilitate further processing of the data. Attributes are added to the dataframe describing the search configuration for the returned output. +#' @return A list with all recalled elements from the API. Based on the 'detailed' parameter it contains more or less information, but always includes the code of the object, the title, and the type of the object. This is done to facilitate further processing with the data. Attributes are added to the data.frame describing the search configuration for the returned output. #' @export #' #' @examples @@ -297,8 +318,10 @@ gen_val2var2stat <- function(code = NULL, sortcriterion <- match.arg(sortcriterion) - if("all" %in% database){ + if ("all" %in% database) { + database <- c("genesis", "zensus", "regio") + } #----------------------------------------------------------------------------- @@ -314,12 +337,14 @@ gen_val2var2stat <- function(code = NULL, verbose = verbose, ...))) - if(length(dim(variables$Variables)) != 2){ - if(variables$Variables == "No `variables`- object found for your request."){ + if (length(dim(variables$Variables)) != 2) { + + if (variables$Variables == "No 'variables' object found for your request.") { list_resp <- variables - } + } + } else { list_values <- list() @@ -339,8 +364,7 @@ gen_val2var2stat <- function(code = NULL, list_resp <- list(variables, list_values) - } - + } return(list_resp) @@ -356,18 +380,18 @@ gen_val2var2stat <- function(code = NULL, #------------------------------------------------------------------------------- -#' gen_search_vars: Search for Specific Variables +#' gen_search_vars #' -#' @description Function to search for specific variables in Genesis/Zensus +#' @description Function to search for specific variables #' -#' @param code A string with a maximum length of 6. Code from a Genesis/Zensus-Object. Only one code per iteration. "*"-Notations are possibly to be used as a placeholder. -#' @param database Character string. Indicator if the Genesis or Zensus database is called. Only one database can be addressed per function call. Default option is 'genesis'. -#' @param sortcriterion A string. Indicator if the output should be sorted by 'code' or 'content'. This is a parameter of the Genesis/Zensus API call itself. The default is "code". -#' @param error.ignore A logical. Indicator if the function should stop if an error occurs or no object for the request is found or if it should produce a token as response. Default option is 'FALSE'. -#' @param verbose Logical. Indicator if the output of the function should include detailed messages and warnings. Default option is 'TRUE'. Set the parameter to 'FALSE' to suppress additional messages and warnings. -#' @param ... Additional parameters for the Genesis/Zensus API call. These parameters are only affecting the Genesis/Zensus call itself, no further processing. For more details see `vignette("additional_parameter")`. +#' @param code Character string with a maximum length of 6 characters. Code from a GENESIS, Zensus 2022 or regionalstatistik.de object. Only one code per iteration. +#' @param database Character string. Indicator if the GENESIS ('genesis'), Zensus 2022 ('zensus') or regionalstatistik.de ('regio') database is called. Only one database can be addressed per function call. Default option is 'genesis'. +#' @param sortcriterion Character string. Indicator if the output should be sorted by 'code' or 'content'. This is a parameter of the API call itself. The default is 'code'. +#' @param error.ignore Boolean. Indicator if the function should stop if an error occurs or no object for the request is found or if it should produce a token as response. Default option is 'FALSE'. +#' @param verbose Boolean. Indicator if the output of the function should include detailed messages and warnings. Default option is 'TRUE'. Set the parameter to 'FALSE' to suppress additional messages and warnings. +#' @param ... Additional parameters for the API call. These parameters are only affecting the call itself, no further processing. For more details see `vignette("additional_parameter")`. #' -#' @return A list with all recalled elements from Genesis/Zensus Always includes the code of the object, the title, and the type of the object. This is done to facilitate further processing of the data. Attributes are added to the dataframe describing the search configuration for the returned output. +#' @return A list with all recalled elements from the API. Always includes the code of the object, the title, and the type of the object. This is done to facilitate further processing with the data. Attributes are added to the data.frame describing the search configuration for the returned output. #' @export #' #' @examples @@ -405,24 +429,28 @@ gen_search_vars <- function(code = NULL, res <- lapply(gen_fun, function(db){ - if(verbose) { + if (isTRUE(verbose)) { + info <- paste("Started the processing of", rev_database_function(db), "database.") + message(info) + } #--------------------------------------------------------------------------- - par_list <- list( - endpoint = "catalogue/variables", - username = gen_auth_get(database = rev_database_function(db))$username, - password = gen_auth_get(database = rev_database_function(db))$password, - selection = code, - sortcriterion = sortcriterion, - area = area, - ... - ) - - if(db == "gen_api" | db == "gen_regio_api"){ + + par_list <- list(endpoint = "catalogue/variables", + username = gen_auth_get(database = rev_database_function(db))$username, + password = gen_auth_get(database = rev_database_function(db))$password, + selection = code, + sortcriterion = sortcriterion, + area = area, + ...) + + if (db == "gen_api" | db == "gen_regio_api") { + par_list <- append(par_list, list(area = area)) + } results_raw <- do.call(db, par_list) @@ -431,11 +459,16 @@ gen_search_vars <- function(code = NULL, empty_object <- test_if_error(results_json, para = error.ignore) - if(isTRUE(empty_object)){ - list_of_variables <- "No `variables`- object found for your request." - } else if(isFALSE(empty_object)){ + if (isTRUE(empty_object)) { + + list_of_variables <- "No 'variables' object found for your request." + + } else if (isFALSE(empty_object)) { + list_of_variables <- results_json$Status$Content - } else if(empty_object == "DONE"){ + + } else if (empty_object == "DONE") { + list_of_variables <- binding_lapply(results_json$List, characteristics = c("Code", "Content", @@ -445,6 +478,7 @@ gen_search_vars <- function(code = NULL, list_of_variables$Object_Type <- "Variable" list_of_variables <- tibble::as_tibble(list_of_variables) + } list_resp <- list("Variables" = list_of_variables) diff --git a/R/utils_dataprocessing.R b/R/utils_dataprocessing.R index 7d7b189..1d08305 100644 --- a/R/utils_dataprocessing.R +++ b/R/utils_dataprocessing.R @@ -67,7 +67,7 @@ forming_evas <- function(list_of) { obj <- evas_list$Titel[evas_list$EVAS == substr(x["Code"], 1, 1)] - if(length(obj) == 0){ + if (length(obj) == 0) { obj <- "No assignment" @@ -83,7 +83,7 @@ forming_evas <- function(list_of) { obj <- evas_list$Titel[evas_list$EVAS == substr(x["Code"], 1, 2)] - if(length(obj) == 0){ + if (length(obj) == 0) { obj <- "No assignment" @@ -99,7 +99,7 @@ forming_evas <- function(list_of) { obj <- evas_list$Titel[evas_list$EVAS == substr(x["Code"], 1, 3)] - if(length(obj) == 0){ + if (length(obj) == 0) { obj <- "No assignment" @@ -115,7 +115,7 @@ forming_evas <- function(list_of) { obj <- evas_list$Titel[evas_list$EVAS == substr(x["Code"], 1, 5)] - if(length(obj) == 0){ + if (length(obj) == 0) { obj <- "No assignment" @@ -130,20 +130,21 @@ forming_evas <- function(list_of) { keep <- colnames(list_of[,1:(ncol(list_of) - 4)]) #----------------------------------------------------------------------------- - if(sum(list_of$Main == "No assignment") != nrow(list_of)){ + if (sum(list_of$Main == "No assignment") != nrow(list_of)) { nestedlist <- split(list_of, list_of$Main, drop = TRUE) #--------------------------------------------------------------------------- - if(sum(list_of$Main2 == "No assignment") != nrow(list_of)){ + if (sum(list_of$Main2 == "No assignment") != nrow(list_of)) { nestedlist <- lapply(nestedlist, function(x) { obj <- split(x, x["Main2"], drop = TRUE) }) + #------------------------------------------------------------------------- - if(sum(list_of$Main3 == "No assignment") != nrow(list_of)){ + if (sum(list_of$Main3 == "No assignment") != nrow(list_of)) { nestedlist <- lapply(nestedlist, function(x) { @@ -156,7 +157,7 @@ forming_evas <- function(list_of) { }) #----------------------------------------------------------------------- - if(sum(list_of$Main5 == "No assignment") != nrow(list_of)){ + if (sum(list_of$Main5 == "No assignment") != nrow(list_of)) { nestedlist <- lapply(nestedlist, function(x) { @@ -188,6 +189,7 @@ forming_evas <- function(list_of) { obj <- tibble::as_tibble(obj) }, + remain = keep)}) }) @@ -195,6 +197,7 @@ forming_evas <- function(list_of) { }) #----------------------------------------------------------------------- + } else { nestedlist <- lapply(nestedlist, function(d){ @@ -207,13 +210,17 @@ forming_evas <- function(list_of) { obj <- tibble::as_tibble(obj) }, + remain = keep )} + )} + )} #------------------------------------------------------------------------- + } else { nestedlist <- lapply(nestedlist, function(d){ @@ -223,6 +230,7 @@ forming_evas <- function(list_of) { obj <- r[keep] obj <- tibble::as_tibble(obj) }, + remain = keep )} @@ -230,6 +238,7 @@ forming_evas <- function(list_of) { )} #--------------------------------------------------------------------------- + } else { nestedlist <- lapply(nestedlist, function(r, remain){ @@ -238,6 +247,7 @@ forming_evas <- function(list_of) { obj <- tibble::as_tibble(obj) }, + remain = keep) } @@ -268,6 +278,9 @@ forming_evas <- function(list_of) { #' @param ordering Parameter to be checked #' @param database Parameter to be checked #' @param caller Parameter to be checked +#' @param area Parameter to be checked +#' @param verbose Parameter to be checked +#' @param raw Parameter to be checked #' check_function_input <- function(code = NULL, term = NULL, @@ -295,8 +308,7 @@ check_function_input <- function(code = NULL, #------------------------------------------------------------------------- - if (!is.logical(verbose) || - length(verbose) != 1) { + if (!is.logical(verbose) || length(verbose) != 1) { stop("Parameter 'verbose' has to be of type 'logical' and of length 1.", call. = FALSE) @@ -433,8 +445,7 @@ check_function_input <- function(code = NULL, #---------------------------------------- - if (length(category) != 1 && - caller %in% c("restatis::gen_metadata", "gen_metadata")) { + if (length(category) != 1 && caller %in% c("restatis::gen_metadata", "gen_metadata")) { stop("Parameter 'category' must have a length of 1. Please specify the category.", call. = FALSE) @@ -465,34 +476,32 @@ check_function_input <- function(code = NULL, if (length(category) == 1 && "cubes" %in% category && - isFALSE(error.ignore) && isTRUE(verbose)) { + isFALSE(error.ignore) && + isTRUE(verbose)) { - stop("Available categories for 'zensus'-database are: 'tables' and 'statistics'.", + stop("Available categories for 'zensus' database are: 'tables' and 'statistics'.", call. = FALSE) - } #----------------------------------------------------------------------- - else if (length(category) == 1 && - "cubes" %in% category && - isTRUE(error.ignore) && isTRUE(verbose)) { + } else if (length(category) == 1 && + "cubes" %in% category && + isTRUE(error.ignore) && + isTRUE(verbose)) { - warning("Available categories for 'zensus'-database are: 'tables' and 'statistics'.\nFunction is continued with a placeholder for the 'cubes' output.", + warning("Available categories for the 'zensus' database are: 'tables' and 'statistics'.\nFunction is continued with a placeholder for the 'cubes' output.", call. = FALSE) - } - - else if ("cubes" %in% category && - isFALSE(error.ignore) && isTRUE(verbose)) { + } else if ("cubes" %in% category && + isFALSE(error.ignore) && + isTRUE(verbose)) { warning("Available categories for 'zensus'-database are: 'tables' and 'statistics'.", call. = FALSE) - } - - else if ("cubes" %in% category && - isTRUE(error.ignore) && isTRUE(verbose)) { + } else if ("cubes" %in% category && + isTRUE(error.ignore) && isTRUE(verbose)) { warning("Available categories for 'zensus'-database are: 'tables' and 'statistics'.\nFunction is continued with specified 'category'-parameter excluding 'cubes'.", call. = FALSE) @@ -516,7 +525,7 @@ check_function_input <- function(code = NULL, } - #---------------------------------------- + #--------------------------------------------------------------------------- if (caller %in% c("restatis::gen_objects2stat", "gen_objects2stat")) { @@ -540,7 +549,7 @@ check_function_input <- function(code = NULL, "cubes" %in% category && isFALSE(error.ignore)) { - stop("Available categories for 'zensus'-database are: 'tables' and 'variables'.", + stop("Available categories for 'zensus' database are: 'tables' and 'variables'.", call. = FALSE) } @@ -548,9 +557,11 @@ check_function_input <- function(code = NULL, #----------------------------------------------------------------------- else if (length(category) == 1 && - "cubes" %in% category && isTRUE(error.ignore) && isTRUE(verbose)) { + "cubes" %in% category && + isTRUE(error.ignore) && + isTRUE(verbose)) { - warning("Available categories for 'zensus'-database are: 'tables' and 'variables'.\nFunction is continued with a placeholder for the 'cubes' output.", + warning("Available categories for 'zensus' database are: 'tables' and 'variables'.\nFunction is continued with a placeholder for the 'cubes' output.", call. = FALSE) } @@ -558,7 +569,8 @@ check_function_input <- function(code = NULL, #----------------------------------------------------------------------- else if ("cubes" %in% category && - isFALSE(error.ignore) && isTRUE(verbose)) { + isFALSE(error.ignore) && + isTRUE(verbose)) { warning("Available categories for 'zensus'-database are: 'tables' and 'variables'.", call. = FALSE) @@ -568,9 +580,10 @@ check_function_input <- function(code = NULL, #----------------------------------------------------------------------- else if ("cubes" %in% category && - isTRUE(error.ignore) && isTRUE(verbose)) { + isTRUE(error.ignore) && + isTRUE(verbose)) { - warning("Available categories for 'zensus'-database are: 'tables' and 'variables'.\nFunction is continued with specified 'category'-parameter excluding 'cubes'.", + warning("Available categories for 'zensus' database are: 'tables' and 'variables'.\nFunction is continued with specified 'category'-parameter excluding 'cubes'.", call. = FALSE) } @@ -592,7 +605,7 @@ check_function_input <- function(code = NULL, } - #---------------------------------------- + #--------------------------------------------------------------------------- if (caller %in% c("restatis::gen_find", "gen_find")) { @@ -604,7 +617,7 @@ check_function_input <- function(code = NULL, if("gen_api" %in% database){ - stop("Available categories for parameter 'category' for 'genesis'-database are 'all', 'tables', 'statistics', 'variables', and 'cubes'.", + stop("Available categories for parameter 'category' for 'genesis' database are 'all', 'tables', 'statistics', 'variables', and 'cubes'.", call. = FALSE) } @@ -613,7 +626,7 @@ check_function_input <- function(code = NULL, if("gen_zensus_api" %in% database){ - stop("Available categories for parameter 'category' for 'zensus'-database are 'all', 'tables', 'statistics', and 'variables'.", + stop("Available categories for parameter 'category' for 'zensus' database are 'all', 'tables', 'statistics', and 'variables'.", call. = FALSE) } @@ -630,13 +643,13 @@ check_function_input <- function(code = NULL, if("gen_zensus_api" %in% database){ - #----------------------------------------------------------------------- if ("cubes" %in% category && - isTRUE(error.ignore) && isTRUE(verbose)) { + isTRUE(error.ignore) && + isTRUE(verbose)) { - warning("Available categories for 'zensus'-database are: 'all', 'tables', 'statistics', and 'variables'.\nFunction is continued with a placeholder for the 'cubes' output.", + warning("Available categories for 'zensus' database are: 'all', 'tables', 'statistics', and 'variables'.\nFunction is continued with a placeholder for the 'cubes' output.", call. = FALSE) } @@ -645,7 +658,7 @@ check_function_input <- function(code = NULL, else if ("all" %in% category && isTRUE(verbose)) { - warning("Available categories for 'zensus'-database are: 'all', 'tables', 'statistics', and 'variables'.\nFunction is continued with a placeholder for the 'cubes' output.", + warning("Available categories for 'zensus' database are: 'all', 'tables', 'statistics', and 'variables'.\nFunction is continued with a placeholder for the 'cubes' output.", call. = FALSE) } @@ -655,7 +668,7 @@ check_function_input <- function(code = NULL, else if ("cubes" %in% category && isFALSE(error.ignore)) { - stop("Available categories for 'zensus'-database are 'all', 'tables', 'statistics', and 'variables'.", + stop("Available categories for 'zensus' database are 'all', 'tables', 'statistics', and 'variables'.", call. = FALSE) } @@ -676,7 +689,7 @@ check_function_input <- function(code = NULL, if (!all(category %in% c("cube", "statistic", "table", "variable", "value"))) { - stop("Available categories for parameter 'category' for 'genesis'-database are 'cube', 'table', 'statistic', 'variable', and 'value'.", + stop("Available categories for parameter 'category' for 'genesis' database are 'cube', 'table', 'statistic', 'variable', and 'value'.", call. = FALSE) } @@ -689,7 +702,7 @@ check_function_input <- function(code = NULL, if (!all(category %in% c("statistic", "table", "variable", "value"))) { - stop("Available categories for parameter 'category' for 'zensus'-database are 'table', 'statistic', 'variable', and 'value'.", + stop("Available categories for parameter 'category' for 'zensus' database are 'table', 'statistic', 'variable', and 'value'.", call. = FALSE) } @@ -706,8 +719,7 @@ check_function_input <- function(code = NULL, if (!is.null(detailed)) { - if (!is.logical(detailed) || - length(detailed) != 1) { + if (!is.logical(detailed) || length(detailed) != 1) { stop("Parameter 'detailed' has to be of type 'logical' and of length 1.", call. = FALSE) @@ -737,7 +749,7 @@ check_function_input <- function(code = NULL, if (!all(type %in% c("all", "tables", "statistics", "statisticsUpdates"))) { - stop("Available categories for parameter 'type' for 'genesis'-database are 'tables', 'statistics', 'statistic updates', and 'all'.", + stop("Available categories for parameter 'type' for 'genesis' database are 'tables', 'statistics', 'statistic updates', and 'all'.", call. = FALSE) } @@ -750,7 +762,7 @@ check_function_input <- function(code = NULL, if (!all(type %in% c("all", "tables", "statistics"))) { - stop("Available categories for parameter 'type' for 'zensus'-database are 'tables', 'statistics', and 'all'.", + stop("Available categories for parameter 'type' for 'zensus' database are 'tables', 'statistics', and 'all'.", call. = FALSE) } @@ -796,7 +808,7 @@ check_function_input <- function(code = NULL, #--------------------------------------------------------------------------- - if (isTRUE(error.ignore) && isTRUE(verbose)) { + if (isTRUE(error.ignore) && isTRUE(verbose)) { message("Use 'error.ignore = FALSE' to stop the function at the point where no object could be found.") @@ -809,8 +821,7 @@ check_function_input <- function(code = NULL, if (!is.null(ordering)) { - if (!is.logical(ordering) || - length(ordering) != 1) { + if (!is.logical(ordering) || length(ordering) != 1) { stop("Parameter 'ordering' has to be of type 'logical' and of length 1.", call. = FALSE) @@ -819,7 +830,7 @@ check_function_input <- function(code = NULL, #--------------------------------------------------------------------------- - if (isFALSE(ordering) && isTRUE(verbose)) { + if (isFALSE(ordering) && isTRUE(verbose)) { message("Use 'ordering = TRUE' to obtain the output ordered based on the search term presence.") @@ -831,8 +842,7 @@ check_function_input <- function(code = NULL, # area ---- if (!is.null(area)) { - if (!is.character(area) || - length(area) != 1) { + if (!is.character(area) || length(area) != 1) { stop("Parameter 'area' has to be of type 'character' and of length 1.", call. = FALSE) @@ -855,7 +865,7 @@ check_function_input <- function(code = NULL, if(isTRUE(verbose) && isFALSE(error.ignore) && length(database) > 1){ - message("If you want to search through all databases it is often useful to set the 'error.ignore'-parameter to TRUE.\nThis will prevent the function from stopping if no object is found in one of the databases.") + message("If you want to search through all databases it is often useful to set the 'error.ignore' parameter to TRUE.\nThis will prevent the function from stopping if no object is found in one of the databases.") } @@ -865,20 +875,20 @@ check_function_input <- function(code = NULL, # raw ---- if(!is.null(raw)){ - if(!is.logical(raw) || length(raw) != 1){ + if (!is.logical(raw) || length(raw) != 1) { stop("Parameter 'raw' has to be of type 'logical' and of length 1.", call. = FALSE) } - if(isTRUE(raw) && isTRUE(verbose)){ + if (isTRUE(raw) && isTRUE(verbose)) { message("Use 'raw = FALSE' to obtain the output in a more readable format.") } - if(isFALSE(raw) && isTRUE(verbose)){ + if (isFALSE(raw) && isTRUE(verbose)) { message("The default 'raw = FALSE' can simplify some information to a significant extent.") @@ -922,7 +932,7 @@ check_function_input <- function(code = NULL, if (date %in% c("now", "week_before", "month_before", "year_before")) { - if(isTRUE(verbose)){ + if (isTRUE(verbose)) { message("Please note that this date is calculated automatically and may differ from manually entered data.\nManually entered data must have the format DD.MM.YYYY.") @@ -1044,7 +1054,8 @@ titel_search <- function(x, term) { a <- grepl(split, x$Content, ignore.case = TRUE) - } else if (grep("\\bODER\\b|\\boder\\b|\\bOder\\b|\\|", term, ignore.case = TRUE) && grep("\\bUND\\b|\\bund\\b|\\bUnd\\b|\\|", term, ignore.case = TRUE)) { + } else if (grep("\\bODER\\b|\\boder\\b|\\bOder\\b|\\|", term, ignore.case = TRUE) && + grep("\\bUND\\b|\\bund\\b|\\bUnd\\b|\\|", term, ignore.case = TRUE)) { a <- rep(FALSE, length(x$Content)) @@ -1140,12 +1151,15 @@ test_database_function <- function(input){ #' @param input Input to test for database name #' rev_database_function <- function(input){ + input[which(input == "gen_api")] <- "genesis" input[which(input == "gen_zensus_api")] <- "zensus" input[which(input == "gen_regio_api")] <- "regio" return(input) + } + #------------------------------------------------------------------------------- #' check_results #' @@ -1154,11 +1168,14 @@ rev_database_function <- function(input){ check_results <- function(input){ if(length(input) > 1){ + return(input) + } else { + input <- input[[1]] return(input) + } } - diff --git a/R/utils_httr2.R b/R/utils_httr2.R index a57ba45..bb21e0a 100644 --- a/R/utils_httr2.R +++ b/R/utils_httr2.R @@ -43,6 +43,7 @@ test_if_okay <- function(input) { #' #' @param input Response object #' @param para Parameter TRUE/FALSE +#' @param verbose Verbose TRUE/FALSE #' test_if_error_find <- function(input, para, verbose = NULL) { @@ -52,10 +53,12 @@ test_if_error_find <- function(input, para, verbose = NULL) { } else if (input$Status$Code != 0 && isFALSE(para) && input$Status$Code != 22) { - if( !is.null(verbose) && isTRUE(verbose)){ - message(input$Status$Content) + if(!is.null(verbose) && isTRUE(verbose)) { + + message(input$Status$Content) + + message("Artificial token is used.") - message("Artificial token is used.") } empty_object <- FALSE @@ -76,6 +79,7 @@ test_if_error_find <- function(input, para, verbose = NULL) { #' #' @param input Response object #' @param para Parameter TRUE/FALSE +#' @param verbose Verbose TRUE/FALSE #' test_if_error <- function(input, para, verbose = NULL) { @@ -91,8 +95,10 @@ test_if_error <- function(input, para, verbose = NULL) { } else if (input$Status$Code == 104 && isTRUE(para)) { - if( !is.null(verbose) && isTRUE(verbose)){ - message("No object found for your request. Check your parameters if you expected an object for this request. Artificial token is used.") + if(!is.null(verbose) && isTRUE(verbose)){ + + message("No object found for your request. Check your parameters if you expected an object for this request. Artificial token is used.") + } empty_object <- TRUE @@ -100,9 +106,11 @@ test_if_error <- function(input, para, verbose = NULL) { } else if (input$Status$Code != 0 && isTRUE(para) && input$Status$Code != 22) { if( !is.null(verbose) && isTRUE(verbose)){ - message(input$Status$Content) - message("Artificial token is used.") + message(input$Status$Content) + + message("Artificial token is used.") + } empty_object <- FALSE @@ -150,6 +158,7 @@ test_if_error_variables <- function(input, para) { #' #' @param input Response object #' @param para Parameter TRUE/FALSE +#' @param verbose Verbose TRUE/FALSE #' test_if_process_further <- function(input, para, verbose = NULL) { @@ -168,8 +177,10 @@ test_if_process_further <- function(input, para, verbose = NULL) { }))) == 5 && isTRUE(para)) { - if( !is.null(verbose) && isTRUE(verbose)){ - message("No object found for your request. Check your parameters if you expected an object for this request. Artificial token is used.") + if(!is.null(verbose) && isTRUE(verbose)){ + + message("No object found for your request. Check your parameters if you expected an object for this request. Artificial token is used.") + } empty_object <- TRUE @@ -189,6 +200,7 @@ test_if_process_further <- function(input, para, verbose = NULL) { #' test_if_error_light #' #' @param input Response object +#' @param verbose Verbose TRUE/FALSE #' test_if_error_light <- function(input, verbose = NULL) { diff --git a/R/zzz.R b/R/zzz.R index 5b61aff..0526d54 100644 --- a/R/zzz.R +++ b/R/zzz.R @@ -5,4 +5,5 @@ gen_regio_api <<- memoise::memoise(gen_regio_api) if (!nzchar(Sys.getenv("GENESIS_LANG"))) Sys.setenv(GENESIS_LANG = "en") + } From b3ca07c8abcf508d01cca14c680e3e036f5c8ac1 Mon Sep 17 00:00:00 2001 From: KovaZo Date: Tue, 9 Jul 2024 12:16:32 +0200 Subject: [PATCH 32/52] =?UTF-8?q?l=C3=B6sung=20catalouge?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- R/gen_catalogue.R | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/R/gen_catalogue.R b/R/gen_catalogue.R index 0ffc946..59cea25 100644 --- a/R/gen_catalogue.R +++ b/R/gen_catalogue.R @@ -133,7 +133,7 @@ gen_catalogue <- function(code = NULL, par_list <- list(endpoint = "catalogue/statistics", username = gen_auth_get(database = rev_database_function(db))$username, password = gen_auth_get(database = rev_database_function(db))$password, - selection = db, + selection = code, sortcriterion = sortcriterion, ...) From bd70207ec009c22bf5549398b5e4098243764e4d Mon Sep 17 00:00:00 2001 From: KovaZo Date: Tue, 9 Jul 2024 18:48:25 +0200 Subject: [PATCH 33/52] zoran gen_find --- R/gen_find.R | 863 +++++++++++---------------------------- R/utils_dataprocessing.R | 30 +- 2 files changed, 262 insertions(+), 631 deletions(-) diff --git a/R/gen_find.R b/R/gen_find.R index 2bd82b2..2b66e50 100644 --- a/R/gen_find.R +++ b/R/gen_find.R @@ -9,7 +9,7 @@ #' @param category Character string. Specify specific GENESIS/regionalstatistik.de object types ('tables', 'statistics' and 'cubes') and specific Zensus 2022 object types ('tables' and 'statistics'). All types that are specific for one database can be used together. Default option is to use all types that are possible for the specific database. #' @param detailed Boolean. Indicator if the function should return the detailed output of the iteration including all object-related information or only a shortened output including only code and object title. Default option is 'FALSE'. #' @param ordering A logical. Indicator if the function should return the output of the iteration ordered first based on the fact if the searched term is appearing in the title of the object and secondly on an estimator of the number of variables in this object. Default option is 'TRUE'. -#' @param error.ignore Boolean. Indicator if the function should stop if an error occurs or no object for the request is found or if it should produce a token as response. Default option is 'FALSE'. +#' @param error.ignore Boolean. Indicator if the function should stop if an error occurs or no object for the request is found or if it should produce a token as response. Default option is 'TRUE'. #' @param verbose Boolean. Indicator if the output of the function should include detailed messages and warnings. Default option is 'TRUE'. Set the parameter to 'FALSE' to suppress additional messages and warnings. #' @param ... Additional parameters for the API call. These parameters are only affecting the call itself, no further processing. For more details see `vignette("additional_parameter")`. #' @@ -68,9 +68,10 @@ gen_find <- function(term = NULL, } #--------------------------------------------------------------------------- - if (db == "gen_zensus_api" & category == "cubes") { - empty_object <- TRUE + if (db == "gen_zensus_api" && category == "cubes") { + + empty_object <- "FAIL" } else { @@ -93,7 +94,7 @@ gen_find <- function(term = NULL, #--------------------------------------------------------------------------- - if (isTRUE(empty_object) && (db == "gen_api" || db == "gen_regio_api")) { + if (isTRUE(empty_object)) { list_resp <- list("Output" = "No object found for your request.") @@ -105,7 +106,7 @@ gen_find <- function(term = NULL, return(list_resp) - } else if (isTRUE(empty_object) & db == "gen_zensus_api" ){ + } else if (empty_object == "FAIL" & db == "gen_zensus_api" ){ list_resp <- list("Output" = "There are generally no 'cubes' objects available for the 'zensus' database.") @@ -129,603 +130,191 @@ gen_find <- function(term = NULL, } else if (empty_object == "DONE") { - if (detailed == TRUE) { - - #----------------------------------------------------------------------------- - - if (category == "all") { - - df_table <- binding_lapply(results_json$Tables, - characteristics = c("Code", - "Content", - "Time")) - - df_table$Spezifisch <- ggsub(df_table) - - df_table$Variablen <- spezifisch_create(df_table) - - df_table$Object_Type <- "table" - - #------------------------------------------------------------------------- - - df_stats <- binding_lapply(results_json$Statistics, - characteristics = c("Code", - "Content", - "Information", - "Cubes")) - - df_stats$Spezifisch <- ggsub(df_stats) - - df_stats$Variablen <- spezifisch_create(df_stats) - - df_stats$Object_Type <- "statistic" + #--------------------------------------------------------------------------- - #------------------------------------------------------------------------- + if (category == "all") { - df_variables <- binding_lapply(results_json$Variables, - characteristics = c("Code", - "Content", - "Type", - "Values", - "Information")) + category <- c("tables", "statistics", "variables", "cubes") - df_variables$Spezifisch <- ggsub(df_variables) + } - df_variables$Variablen <- spezifisch_create(df_variables) + #--------------------------------------------------------------------------- - df_variables$Object_Type <- "variable" + if("tables" %in% category) { - #------------------------------------------------------------------------- + if(!is.null(results_json$Tables)) { - if (db == "gen_api" | db == "gen_regio_api") { + if(isTRUE(detailed)){ - df_cubes <- binding_lapply(results_json$Cubes, + df_table <- binding_lapply(results_json$Tables, characteristics = c("Code", "Content", - "Time", - "LatestUpdate", - "State", - "Information")) - - df_cubes$Spezifisch <- ggsub(df_cubes) - - df_cubes$Variablen <- spezifisch_create(df_cubes) - - df_cubes$Object_Type <- "cube" - - } - - #------------------------------------------------------------------------- - - if (nrow(df_table) != 0) { - - df_table$Titel <- titel_search(df_table, term) - - } - - if (nrow(df_stats) != 0) { - - df_stats$Titel <- titel_search(df_stats, term) + "Time")) - } - - if (nrow(df_variables) != 0) { + df_table$Spezifisch <- ggsub(df_table) - df_variables$Titel <- titel_search(df_variables, term) + df_table$Variablen <- spezifisch_create(df_table) - } + df_table$Object_Type <- "table" - if (db == "gen_api" | db == "gen_regio_api") { - if (nrow(df_cubes) != 0) { + if (nrow(df_table) != 0) { - df_cubes$Titel <- titel_search(df_cubes, term) + df_table$Titel <- titel_search(df_table, term) } - } - - #------------------------------------------------------------------------- - - if (isTRUE(ordering)) { - - df_table <- df_table[with(df_table, order(-Titel, -Variablen)), c("Code", - "Content", - "Titel", - "Time", - "Variablen", - "Spezifisch", - "Object_Type")] - - df_stats <- df_stats[with(df_stats, order(-Titel, -Variablen)), c( "Code", - "Content", - "Titel", - "Information", - "Cubes", - "Variablen", - "Spezifisch", - "Object_Type")] - - df_variables <- df_variables[with(df_variables, order(-Titel, -Variablen)), c( "Code", - "Content", - "Titel", - "Values", - "Information", - "Variablen", - "Spezifisch", - "Object_Type")] - - #------------------------------------------------------------------- - - if (db == "gen_api" | db == "gen_regio_api") { - - df_cubes <- df_cubes[with(df_cubes, order(-Titel, -Variablen)), c( "Code", - "Content", - "Titel", - "Time", - "LatestUpdate", - "State", - "Information", - "Variablen", - "Spezifisch", - "Object_Type")] - - } - - - } else { # End of if (isTRUE(ordering)) - df_table <- df_table[, c("Code", - "Content", - "Titel", - "Time", - "Variablen", - "Spezifisch", - "Object_Type")] - - df_stats <- df_stats[, c("Code", - "Content", - "Titel", - "Information", - "Cubes", - "Variablen", - "Spezifisch", - "Object_Type")] - - df_variables <- df_variables[, c("Code", - "Content", - "Titel", - "Values", - "Information", - "Variablen", - "Spezifisch", - "Object_Type")] + if (isTRUE(ordering)) { - #------------------------------------------------------------------- + df_table <- df_table[with(df_table, order(-Titel, -Variablen)), c("Code", + "Content", + "Titel", + "Time", + "Variablen", + "Spezifisch", + "Object_Type")] - if (db == "gen_api" | db == "gen_regio_api") { + } else { - df_cubes <- df_cubes[, c("Code", + df_table <- df_table[, c("Code", "Content", "Titel", "Time", - "LatestUpdate", - "State", - "Information", "Variablen", "Spezifisch", "Object_Type")] } - } - - #------------------------------------------------------------------------- - - list_resp <- list("Tables" = tibble::as_tibble(df_table), - "Statistics" = tibble::as_tibble(df_stats), - "Variables" = tibble::as_tibble(df_variables), - "Cubes" = if (db == "gen_api" | db == "gen_regio_api") { tibble::as_tibble(df_cubes) } else { "There are generally no 'cubes' objects available for the 'zensus' database." }) - - attr(list_resp, "Term") <- results_json$Parameter$term - attr(list_resp, "Database") <- rev_database_function(db) - attr(list_resp, "Language") <- results_json$Parameter$language - attr(list_resp, "Pagelength") <- results_json$Parameter$pagelength - attr(list_resp, "Copyright") <- results_json$Copyright - - return(list_resp) - - } # End of (if category == "all") - - #----------------------------------------------------------------------- - - if (category == "tables") { - - df_table <- binding_lapply(results_json$Tables, - characteristics = c("Code", - "Content", - "Time")) - - df_table$Spezifisch <- ggsub(df_table) - df_table$Variablen <- spezifisch_create(df_table) + } else if (isFALSE(detailed)) { - df_table$Object_Type <- "table" - - #------------------------------------------------------------------------- - - if (nrow(df_table) != 0) { - - df_table$Titel <- titel_search(df_table, term) - - } - - if (isTRUE(ordering)) { - - df_table <- df_table[with(df_table, order(-Titel, -Variablen)), c("Code", - "Content", - "Titel", - "Time", - "Variablen", - "Spezifisch", - "Object_Type")] - - } else { - - df_table <- df_table[, c("Code", - "Content", - "Titel", - "Time", - "Variablen", - "Spezifisch", - "Object_Type")] - - } - - #------------------------------------------------------------------------- - - list_resp <- list("Tables" = tibble::as_tibble(df_table)) - - attr(list_resp, "Term") <- results_json$Parameter$term - attr(list_resp, "Database") <- rev_database_function(db) - attr(list_resp, "Language") <- results_json$Parameter$language - attr(list_resp, "Pagelength") <- results_json$Parameter$pagelength - attr(list_resp, "Copyright") <- results_json$Copyright - - return(list_resp) - - } - - #--------------------------------------------------------------------------- + df_table <- binding_lapply(results_json$Tables, + characteristics = c("Code", + "Content")) - if (category == "statistics") { + df_table$Spezifisch <- ggsub(df_table) - df_stats <- binding_lapply(results_json$Statistics, - characteristics = c("Code", - "Content", - "Information", - "Cubes")) + df_table$Variablen <- spezifisch_create(df_table) - df_stats$Spezifisch <- ggsub(df_stats) + df_table$Object_Type <- "table" - df_stats$Variablen <- spezifisch_create(df_stats) - df_stats$Object_Type <- "statistic" + if (nrow(df_table) != 0) { - #------------------------------------------------------------------------- + df_table$Titel <- titel_search(df_table, term) - if (nrow(df_stats) != 0) { + } - df_stats$Titel <- titel_search(df_stats, term) - } - - if (isTRUE(ordering)) { + if (isTRUE(ordering)) { - df_stats <- df_stats[with(df_stats, order(-Titel, -Variablen)), c( "Code", - "Content", - "Titel", - "Information", - "Cubes", - "Variablen", - "Spezifisch", - "Object_Type")] + df_table <- df_table[with(df_table, order(-Titel, -Variablen)), c("Code", + "Content", + "Object_Type")] + } else { - } else { + df_table <- df_table[, c("Code", + "Content", + "Object_Type")] - df_stats <- df_stats[, c("Code", - "Content", - "Titel", - "Information", - "Cubes", - "Variablen", - "Spezifisch", - "Object_Type")] + } } - list_resp <- list("Statistics" = tibble::as_tibble(df_stats)) - - attr(list_resp, "Term") <- results_json$Parameter$term - attr(list_resp, "Database") <- rev_database_function(db) - attr(list_resp, "Language") <- results_json$Parameter$language - attr(list_resp, "Pagelength") <- results_json$Parameter$pagelength - attr(list_resp, "Copyright") <- results_json$Copyright + } else { - return(list_resp) + df_table <- find_token(results_json$Tables, + error.input = error.ignore, + text = verbose, + sub_category = "Tables") } - #--------------------------------------------------------------------------- - - if (category == "variables") { - - df_variables <- binding_lapply(results_json$Variables, - characteristics = c("Code", - "Content", - "Type", - "Values", - "Information")) - - df_variables$Spezifisch <- ggsub(df_variables) - - df_variables$Variablen <- spezifisch_create(df_variables) - - df_variables$Object_Type <- "variable" - - #------------------------------------------------------------------------- - - if (nrow(df_variables) != 0) { - - df_variables$Titel <- titel_search(df_variables, term) - - } - - if (isTRUE(ordering)) { - - df_variables <- df_variables[with(df_variables, order(-Titel, -Variablen)), c( "Code", - "Content", - "Titel", - "Values", - "Information", - "Variablen", - "Spezifisch", - "Object_Type")] - - } else { - - df_variables <- df_variables[, c("Code", - "Content", - "Titel", - "Values", - "Information", - "Variablen", - "Spezifisch", - "Object_Type")] - - } - - #------------------------------------------------------------------------- - - list_resp <- list("Variables" = tibble::as_tibble(df_variables)) - - attr(list_resp, "Term") <- results_json$Parameter$term - attr(list_resp, "Database") <- rev_database_function(db) - attr(list_resp, "Language") <- results_json$Parameter$language - attr(list_resp, "Pagelength") <- results_json$Parameter$pagelength - attr(list_resp, "Copyright") <- results_json$Copyright - - return(list_resp) + } - } + #--------------------------------------------------------------------------- - #--------------------------------------------------------------------------- + if("statistics" %in% category) { - if (category == "cubes") { + if(!is.null(results_json$Statistics)) { - if (db == "gen_api" | db == "gen_regio_api") { + if(isTRUE(detailed)){ - df_cubes <- binding_lapply(results_json$Cubes, + df_stats <- binding_lapply(results_json$Statistics, characteristics = c("Code", "Content", - "Time", - "LatestUpdate", - "State", - "Information")) + "Information", + "Cubes")) - df_cubes$Spezifisch <- ggsub(df_cubes) + df_stats$Spezifisch <- ggsub(df_stats) - df_cubes$Variablen <- spezifisch_create(df_cubes) + df_stats$Variablen <- spezifisch_create(df_stats) - df_cubes$Object_Type <- "cube" + df_stats$Object_Type <- "statistic" - #------------------------------------------------------------------------- - if (nrow(df_cubes) != 0) { + if (nrow(df_stats) != 0) { - df_cubes$Titel <- titel_search(df_cubes, term) + df_stats$Titel <- titel_search(df_stats, term) } + if (isTRUE(ordering)) { - df_cubes <- df_cubes[with(df_cubes, order(-Titel, -Variablen)), c( "Code", + df_stats <- df_stats[with(df_stats, order(-Titel, -Variablen)), c( "Code", "Content", "Titel", - "Time", - "LatestUpdate", - "State", "Information", + "Cubes", "Variablen", "Spezifisch", "Object_Type")] } else { - df_cubes <- df_cubes[, c("Code", + df_stats <- df_stats[, c("Code", "Content", "Titel", - "Time", - "LatestUpdate", - "State", "Information", + "Cubes", "Variablen", "Spezifisch", "Object_Type")] } - #------------------------------------------------------------------------- - - list_resp <- list("Cubes" = tibble::as_tibble(df_cubes)) - - attr(list_resp, "Term") <- results_json$Parameter$term - attr(list_resp, "Database") <- rev_database_function(db) - attr(list_resp, "Language") <- results_json$Parameter$language - attr(list_resp, "Pagelength") <- results_json$Parameter$pagelength - attr(list_resp, "Copyright") <- results_json$Copyright - - return(list_resp) - - } else { - - list_resp <- "There are generally no 'cubes' objects available for the 'zensus' database." - - } - - } - - } - - #----------------------------------------------------------------------------- - - if (detailed == FALSE) { - - if (category == "all") { - - #------------------------------------------------------------------------- - - df_table <- binding_lapply(results_json$Tables, - characteristics = c("Code", - "Content")) - - df_table$Spezifisch <- ggsub(df_table) - - df_table$Variablen <- spezifisch_create(df_table) - - df_table$Object_Type <- "table" - - #------------------------------------------------------------------------- - - df_stats <- binding_lapply(results_json$Statistics, - characteristics = c("Code", - "Content")) - - df_stats$Spezifisch <- ggsub(df_stats) - - df_stats$Variablen <- spezifisch_create(df_stats) - - df_stats$Object_Type <- "statistic" - - #------------------------------------------------------------------------- - - df_variables <- binding_lapply(results_json$Variables, - characteristics = c("Code", - "Content")) - - df_variables$Spezifisch <- ggsub(df_variables) - - df_variables$Variablen <- spezifisch_create(df_variables) - - df_variables$Object_Type <- "variable" - #------------------------------------------------------------------------- + } else if (isFALSE(detailed)) { - if (db == "gen_api" | db == "gen_regio_api") { - - df_cubes <- binding_lapply(results_json$Cubes, + df_stats <- binding_lapply(results_json$Statistics, characteristics = c("Code", "Content")) - df_cubes$Spezifisch <- ggsub(df_cubes) - - df_cubes$Variablen <- spezifisch_create(df_cubes) - - df_cubes$Object_Type <- "cube" - - } - - #------------------------------------------------------------------------- - - if (nrow(df_table) != 0) { - - df_table$Titel <- titel_search(df_table, term) - - } - - if (nrow(df_stats) != 0) { + df_stats$Spezifisch <- ggsub(df_stats) - df_stats$Titel <- titel_search(df_stats, term) + df_stats$Variablen <- spezifisch_create(df_stats) - } - - if (nrow(df_variables) != 0) { - - df_variables$Titel <- titel_search(df_variables, term) - - } + df_stats$Object_Type <- "statistic" - if (db == "gen_api" | db == "gen_regio_api") { - if (nrow(df_cubes) != 0) { + if (nrow(df_stats) != 0) { - df_cubes$Titel <- titel_search(df_cubes, term) + df_stats$Titel <- titel_search(df_stats, term) } - } - - #------------------------------------------------------------------------- - - if (isTRUE(ordering)) { - df_table <- df_table[with(df_table, order(-Titel, -Variablen)), c("Code", - "Content", - "Object_Type")] - - df_stats <- df_stats[with(df_stats, order(-Titel, -Variablen)), c( "Code", - "Content", - "Object_Type")] - - df_variables <- df_variables[with(df_variables, order(-Titel, -Variablen)), c( "Code", - "Content", - "Object_Type")] - - if (db == "gen_api" | db == "gen_regio_api") { + if (isTRUE(ordering)) { - df_cubes <- df_cubes[with(df_cubes, order(-Titel, -Variablen)), c( "Code", + df_stats <- df_stats[with(df_stats, order(-Titel, -Variablen)), c( "Code", "Content", "Object_Type")] + } else { - } - - } else { - - df_table <- df_table[, c("Code", - "Content", - "Object_Type")] - - df_stats <- df_stats[, c("Code", - "Content", - "Object_Type")] - - df_variables <- df_variables[, c("Code", - "Content", - "Object_Type")] - - if (db == "gen_api" | db == "gen_regio_api") { - - df_cubes <- df_cubes[, c("Code", + df_stats <- df_stats[, c("Code", "Content", "Object_Type")] @@ -733,214 +322,239 @@ gen_find <- function(term = NULL, } - #------------------------------------------------------------------------- + } else { - list_resp <- list("Tables" = tibble::as_tibble(df_table), - "Statistics" = tibble::as_tibble(df_stats), - "Variables" = tibble::as_tibble(df_variables), - "Cubes" = if (db == "gen_api" | db == "gen_regio_api") { tibble::as_tibble(df_cubes) } else { "There are generally no 'cubes' objects available for the 'zensus' database." }) + df_stats <- find_token(results_json$Statistics, + error.input = error.ignore, + text = verbose, + sub_category = "Statistics") - attr(list_resp, "Term") <- results_json$Parameter$term - attr(list_resp, "Database") <- rev_database_function(db) - attr(list_resp, "Language") <- results_json$Parameter$language - attr(list_resp, "Pagelength") <- results_json$Parameter$pagelength - attr(list_resp, "Copyright") <- results_json$Copyright + } - return(list_resp) + } - } + #--------------------------------------------------------------------------- - #--------------------------------------------------------------------------- + if("variables" %in% category) { - if (category == "tables") { + if(!is.null(results_json$Variables)) { - df_table <- binding_lapply(results_json$Tables, - characteristics = c("Code", - "Content")) + if(isTRUE(detailed)){ - df_table$Spezifisch <- ggsub(df_table) + df_variables <- binding_lapply(results_json$Variables, + characteristics = c("Code", + "Content", + "Type", + "Values", + "Information")) - df_table$Variablen <- spezifisch_create(df_table) + df_variables$Spezifisch <- ggsub(df_variables) - df_table$Object_Type <- "table" + df_variables$Variablen <- spezifisch_create(df_variables) - #------------------------------------------------------------------------- + df_variables$Object_Type <- "variable" - if (nrow(df_table) != 0) { - df_table$Titel <- titel_search(df_table, term) + if (nrow(df_variables) != 0) { - } + df_variables$Titel <- titel_search(df_variables, term) - if (isTRUE(ordering)) { + } - df_table <- df_table[with(df_table, order(-Titel, -Variablen)), c("Code", - "Content", - "Object_Type")] - } else { + if (isTRUE(ordering)) { - df_table <- df_table[, c("Code", - "Content", - "Object_Type")] + df_variables <- df_variables[with(df_variables, order(-Titel, -Variablen)), c( "Code", + "Content", + "Titel", + "Values", + "Information", + "Variablen", + "Spezifisch", + "Object_Type")] - } + } else { - #------------------------------------------------------------------------- + df_variables <- df_variables[, c("Code", + "Content", + "Titel", + "Values", + "Information", + "Variablen", + "Spezifisch", + "Object_Type")] - list_resp <- list("Tables" = tibble::as_tibble(df_table)) + } - attr(list_resp, "Term") <- results_json$Parameter$term - attr(list_resp, "Database") <- rev_database_function(db) - attr(list_resp, "Language") <- results_json$Parameter$language - attr(list_resp, "Pagelength") <- results_json$Parameter$pagelength - attr(list_resp, "Copyright") <- results_json$Copyright - return(list_resp) + } else if (isFALSE(detailed)) { - } + df_variables <- binding_lapply(results_json$Variables, + characteristics = c("Code", + "Content")) - if (category == "statistics") { + df_variables$Spezifisch <- ggsub(df_variables) - df_stats <- binding_lapply(results_json$Statistics, - characteristics = c("Code", - "Content")) + df_variables$Variablen <- spezifisch_create(df_variables) - df_stats$Spezifisch <- ggsub(df_stats) + df_variables$Object_Type <- "variable" - df_stats$Variablen <- spezifisch_create(df_stats) - df_stats$Object_Type <- "statistic" + if (nrow(df_variables) != 0) { - #------------------------------------------------------------------------- + df_variables$Titel <- titel_search(df_variables, term) - if (nrow(df_stats) != 0) { + } - df_stats$Titel <- titel_search(df_stats, term) - } + if (isTRUE(ordering)) { - if (isTRUE(ordering)) { + df_variables <- df_variables[with(df_variables, order(-Titel, -Variablen)), c( "Code", + "Content", + "Object_Type")] - df_stats <- df_stats[with(df_stats, order(-Titel, -Variablen)), c( "Code", - "Content", - "Object_Type")] + } else { - } else { + df_variables <- df_variables[, c("Code", + "Content", + "Object_Type")] - df_stats <- df_stats[, c("Code", - "Content", - "Object_Type")] + } } - #------------------------------------------------------------------------- + } else { - list_resp <- list("Statistics" = tibble::as_tibble(df_stats)) + df_stats <- find_token(results_json$Variables, + error.input = error.ignore, + text = verbose, + sub_category = "Variables") - attr(list_resp, "Term") <- results_json$Parameter$term - attr(list_resp, "Database") <- rev_database_function(db) - attr(list_resp, "Language") <- results_json$Parameter$language - attr(list_resp, "Pagelength") <- results_json$Parameter$pagelength - attr(list_resp, "Copyright") <- results_json$Copyright + } - return(list_resp) + } - } + #--------------------------------------------------------------------------- - #--------------------------------------------------------------------------- + if("cubes" %in% category) { - if (category == "variables") { + if (db == "gen_api" | db == "gen_regio_api") { - df_variables <- binding_lapply(results_json$Variables, + if(!is.null(results_json$Cubes)) { + + if(isTRUE(detailed)){ + + df_cubes <- binding_lapply(results_json$Cubes, characteristics = c("Code", - "Content")) + "Content", + "Time", + "LatestUpdate", + "State", + "Information")) - df_variables$Spezifisch <- ggsub(df_variables) + df_cubes$Spezifisch <- ggsub(df_cubes) - df_variables$Variablen <- spezifisch_create(df_variables) + df_cubes$Variablen <- spezifisch_create(df_cubes) - df_variables$Object_Type <- "variable" + df_cubes$Object_Type <- "cube" - #------------------------------------------------------------------------- - if (nrow(df_variables) != 0) { + if (nrow(df_cubes) != 0) { - df_variables$Titel <- titel_search(df_variables, term) + df_cubes$Titel <- titel_search(df_cubes, term) - } + } - #------------------------------------------------------------------------- - if (isTRUE(ordering)) { + if (isTRUE(ordering)) { - df_variables <- df_variables[with(df_variables, order(-Titel, -Variablen)), c( "Code", - "Content", - "Object_Type")] + df_cubes <- df_cubes[with(df_cubes, order(-Titel, -Variablen)), c( "Code", + "Content", + "Titel", + "Time", + "LatestUpdate", + "State", + "Information", + "Variablen", + "Spezifisch", + "Object_Type")] - } else { + } else { - df_variables <- df_variables[, c("Code", - "Content", - "Object_Type")] + df_cubes <- df_cubes[, c("Code", + "Content", + "Titel", + "Time", + "LatestUpdate", + "State", + "Information", + "Variablen", + "Spezifisch", + "Object_Type")] - } + } - #------------------------------------------------------------------------- - list_resp <- list("Variables" = tibble::as_tibble(df_variables)) + } else if (isFALSE(detailed)) { - attr(list_resp, "Term") <- results_json$Parameter$term - attr(list_resp, "Database") <- rev_database_function(db) - attr(list_resp, "Language") <- results_json$Parameter$language - attr(list_resp, "Pagelength") <- results_json$Parameter$pagelength - attr(list_resp, "Copyright") <- results_json$Copyright + df_cubes <- binding_lapply(results_json$Cubes, + characteristics = c("Code", + "Content")) - return(list_resp) + df_cubes$Spezifisch <- ggsub(df_cubes) - } + df_cubes$Variablen <- spezifisch_create(df_cubes) - } + df_cubes$Object_Type <- "cube" - #--------------------------------------------------------------------------- - if (category == "cubes" && (db == "gen_api" || db == "gen_regio_api")) { + if (nrow(df_cubes) != 0) { - df_cubes <- binding_lapply(results_json$Cubes, - characteristics = c("Code", - "Content")) + df_cubes$Titel <- titel_search(df_cubes, term) - df_cubes$Spezifisch <- ggsub(df_cubes) + } - df_cubes$Variablen <- spezifisch_create(df_cubes) - df_cubes$Object_Type <- "cube" + if (isTRUE(ordering)) { - #------------------------------------------------------------------------- + df_cubes <- df_cubes[with(df_cubes, order(-Titel, -Variablen)), c( "Code", + "Content", + "Object_Type")] - if (nrow(df_cubes) != 0) { + } else { - df_cubes$Titel <- titel_search(df_cubes, term) + df_cubes <- df_cubes[, c("Code", + "Content", + "Object_Type")] - } + } - if (isTRUE(ordering)) { + } - df_cubes <- df_cubes[with(df_cubes, order(-Titel, -Variablen)), c( "Code", - "Content", - "Object_Type")] + } else { + + df_cubes <- find_token(results_json$Cubes, + error.input = error.ignore, + text = verbose, + sub_category = "Cubes") + + } - } else { - df_cubes <- df_cubes[, c("Code", - "Content", - "Object_Type")] + } else if (db == "gen_zensus_api") { + + df_cubes <- "There are generally no 'cubes' objects available for the 'zensus' database." } - #------------------------------------------------------------------------- + #--------------------------------------------------------------------------- - list_resp <- list("Cubes" = tibble::as_tibble(df_cubes)) + list_resp <- list( + "Tables" = if("tables" %in% category) { tibble::as_tibble(df_table) }, + "Statistics" = if("statistics" %in% category) { tibble::as_tibble(df_stats) }, + "Variables" = if("variables" %in% category) { tibble::as_tibble(df_variables) }, + "Cubes" = if("cubes" %in% category) { tibble::as_tibble(df_cubes) } + ) attr(list_resp, "Term") <- results_json$Parameter$term attr(list_resp, "Database") <- rev_database_function(db) @@ -950,19 +564,8 @@ gen_find <- function(term = NULL, return(list_resp) - } else { - - list_resp <- "There are generally no 'cubes' objects available for the 'zensus' database." - - } - } - - return(list_resp) - - }) - - #----------------------------------------------------------------------------- + }}) res <- check_results(res) diff --git a/R/utils_dataprocessing.R b/R/utils_dataprocessing.R index 1d08305..be2c776 100644 --- a/R/utils_dataprocessing.R +++ b/R/utils_dataprocessing.R @@ -658,7 +658,7 @@ check_function_input <- function(code = NULL, else if ("all" %in% category && isTRUE(verbose)) { - warning("Available categories for 'zensus' database are: 'all', 'tables', 'statistics', and 'variables'.\nFunction is continued with a placeholder for the 'cubes' output.", + warning("There are generally no 'cubes' objects available for the 'zensus' database. Token is automatically used.", call. = FALSE) } @@ -1179,3 +1179,31 @@ check_results <- function(input){ } } + +#------------------------------------------------------------------------------- +#' find_token +#' +#' @param input Input to test result structure +#' @param error.input error.ignore TRUE or FALSE +#' @param text verbose TRUE or FALSE +#' #' @param text sub_category character string +#' +find_token <- function(input, error.input, text, sub_category){ + + mes <- paste("No", sub_category, "found for the search term.") + + if(isTRUE(error.input)) { + + if(isTRUE(text)){ + message(mes) + } + + return(mes) + + } else { + + stop(mes) + + } + +} From f39895c249fdf2c5fa4ffa5f9b2cad519aab1357 Mon Sep 17 00:00:00 2001 From: bubux Date: Tue, 9 Jul 2024 20:03:45 +0200 Subject: [PATCH 34/52] fix tests --- DESCRIPTION | 4 +- NAMESPACE | 6 + R/data.R | 7 +- R/gen_catalogue.R | 4 +- R/gen_cube.R | 1 + R/gen_jobs.R | 2 +- R/gen_meta_data.R | 20 +- R/{gen_update_EVAS.R => gen_update_evas.R} | 8 +- R/gen_var2-val2.R | 1 + R/globals.R | 1 + R/utils_dataprocessing.R | 2 +- R/utils_httr2.R | 2 +- data/EVAS_numbers.RData | Bin 39014 -> 0 bytes data/evas_list.rda | Bin 0 -> 25354 bytes man/binding_lapply.Rd | 16 + man/check_function_input.Rd | 58 + man/check_results.Rd | 14 + ...vas_list_long_20220724.Rd => evas_list.Rd} | 11 +- man/forming_evas.Rd | 14 + man/gen_alternative_terms.Rd | 33 +- man/gen_auth_ask.Rd | 17 + man/gen_auth_get.Rd | 24 + man/gen_auth_path.Rd | 17 + man/gen_auth_save.Rd | 29 +- man/gen_catalogue.Rd | 32 +- man/gen_cube.Rd | 35 +- man/gen_download_job.Rd | 40 + man/gen_find.Rd | 34 +- man/gen_list_jobs.Rd | 27 +- man/gen_list_results.Rd | 25 + man/gen_logincheck.Rd | 25 + man/gen_metadata.Rd | 26 +- man/gen_metadata_cube.Rd | 28 +- man/gen_metadata_statistic.Rd | 44 + man/gen_metadata_stats.Rd | 28 - man/gen_metadata_tab.Rd | 28 - man/gen_metadata_table.Rd | 44 + man/gen_metadata_val.Rd | 28 - man/gen_metadata_value.Rd | 44 + man/gen_metadata_var.Rd | 28 - man/gen_metadata_variable.Rd | 44 + man/gen_modified_data.Rd | 20 +- man/gen_objects2stat.Rd | 28 +- man/gen_objects2var.Rd | 28 +- man/gen_search_vars.Rd | 23 +- man/gen_signs.Rd | 19 + man/gen_table.Rd | 30 +- man/gen_update_evas.Rd | 14 + man/gen_val2var.Rd | 25 +- man/gen_val2var2stat.Rd | 28 +- man/gen_var2stat.Rd | 25 +- man/ggsub.Rd | 14 + man/is_cube_metadata_header.Rd | 14 + man/logincheck_http_error.Rd | 19 + man/logincheck_stop_or_warn.Rd | 23 + man/param_check_regionalkey.Rd | 14 + man/param_check_year.Rd | 14 + man/param_collapse_vec.Rd | 14 + man/read_cube.Rd | 14 + man/read_cube_block.Rd | 14 + man/read_cube_data_lines.Rd | 16 + man/read_cube_metadata_header.Rd | 16 + man/rename_cube_data_columns.Rd | 14 + man/resp_check_data.Rd | 14 + man/return_table_object.Rd | 20 + man/rev_database_function.Rd | 14 + man/spezifisch_create.Rd | 14 + man/split_cube.Rd | 14 + man/test_database_function.Rd | 14 + man/test_if_error.Rd | 18 + man/test_if_error_find.Rd | 18 + man/test_if_error_light.Rd | 16 + man/test_if_error_variables.Rd | 16 + man/test_if_json.Rd | 14 + man/test_if_okay.Rd | 14 + man/test_if_process_further.Rd | 18 + man/titel_search.Rd | 16 + .../api/catalogue/tables-30cbd2.json | 119 + .../api/catalogue/statistics-f5c1c1.json | 30 + .../api/catalogue/cubes-57cf25.json | 21 + .../api/catalogue/cubes-e28931.json | 310 ++ .../api/catalogue/statistics-c47d1c.json | 42 + .../api/catalogue/tables-e234ed.json | 119 + .../api/catalogue/tables-5b59e0.json | 54 + .../api/catalogue/tables-5b59e0.json | 54 + .../cube1/api/data/cubefile-4e2e46.csv | 2811 +++++++++++++++++ .../testthat/find1/api/find/find-c24582.json | 742 +++++ .../find2_fake/api/find/find-ef22fd.json | 580 ++++ .../testthat/find3/api/find/find-9961d3.json | 40 + .../api/helloworld/logincheck-aabf05.R | 5 + .../meta1/api/metadata/table-4041ce.json | 74 + .../meta2_fake/api/metadata/cube-844a6b.json | 99 + .../meta3/api/metadata/table-4041ce.json | 74 + .../api/catalogue/modifieddata-00f7a4.json | 31 + .../api/catalogue/modifieddata-febf13.json | 25 + .../api/catalogue/modifieddata-00f7a4.json | 31 + .../api/catalogue/modifieddata-66ae58.json | 23 + .../api/catalogue/variables-fa86e3.json | 725 +++++ .../api/catalogue/variables-05bbfd.json | 24 + .../table1/api/data/tablefile-768a25.csv | 6 + .../terms1/api/catalogue/terms-6ad002.json | 148 + tests/testthat/test_gen_alternative_terms.R | 10 +- tests/testthat/test_gen_catalogue.R | 93 +- tests/testthat/test_gen_cube.R | 1 + tests/testthat/test_gen_find.R | 33 +- tests/testthat/test_gen_logincheck.R | 6 +- tests/testthat/test_gen_meta_data.R | 36 +- tests/testthat/test_gen_modified_data.R | 42 +- tests/testthat/test_gen_objects2stat.R | 31 +- tests/testthat/test_gen_objects2var.R | 30 +- tests/testthat/test_gen_search_vars.R | 25 +- tests/testthat/test_gen_val2var.R | 32 +- tests/testthat/test_gen_var2stat.R | 29 +- .../api/catalogue/values2variable-8361bb.json | 24 + .../api/catalogue/values2variable-d9d8dc.json | 121 + .../catalogue/variables2statistic-49290a.json | 117 + .../catalogue/variables2statistic-e15459.json | 11 + .../catalogue/variables2statistic-f8d69a.json | 117 + .../api/catalogue/cubes2statistic-30c942.json | 199 ++ .../catalogue/tables2statistic-30c942.json | 78 + .../catalogue/variables2statistic-30c942.json | 117 + .../catalogue/tables2statistic-30c942.json | 78 + .../catalogue/tables2statistic-30c942.json | 78 + .../catalogue/statistics2variable-93dc8a.json | 625 ++++ .../api/catalogue/tables2variable-93dc8a.json | 523 +++ .../catalogue/timeseries2variable-93dc8a.json | 823 +++++ .../api/catalogue/tables2variable-93dc8a.json | 523 +++ .../api/catalogue/tables2variable-93dc8a.json | 523 +++ 128 files changed, 11573 insertions(+), 436 deletions(-) rename R/{gen_update_EVAS.R => gen_update_evas.R} (78%) create mode 100644 R/globals.R delete mode 100644 data/EVAS_numbers.RData create mode 100644 data/evas_list.rda create mode 100644 man/binding_lapply.Rd create mode 100644 man/check_function_input.Rd create mode 100644 man/check_results.Rd rename man/{evas_list_long_20220724.Rd => evas_list.Rd} (70%) create mode 100644 man/forming_evas.Rd create mode 100644 man/gen_auth_ask.Rd create mode 100644 man/gen_auth_get.Rd create mode 100644 man/gen_auth_path.Rd create mode 100644 man/gen_download_job.Rd create mode 100644 man/gen_list_results.Rd create mode 100644 man/gen_logincheck.Rd create mode 100644 man/gen_metadata_statistic.Rd delete mode 100644 man/gen_metadata_stats.Rd delete mode 100644 man/gen_metadata_tab.Rd create mode 100644 man/gen_metadata_table.Rd delete mode 100644 man/gen_metadata_val.Rd create mode 100644 man/gen_metadata_value.Rd delete mode 100644 man/gen_metadata_var.Rd create mode 100644 man/gen_metadata_variable.Rd create mode 100644 man/gen_signs.Rd create mode 100644 man/gen_update_evas.Rd create mode 100644 man/ggsub.Rd create mode 100644 man/is_cube_metadata_header.Rd create mode 100644 man/logincheck_http_error.Rd create mode 100644 man/logincheck_stop_or_warn.Rd create mode 100644 man/param_check_regionalkey.Rd create mode 100644 man/param_check_year.Rd create mode 100644 man/param_collapse_vec.Rd create mode 100644 man/read_cube.Rd create mode 100644 man/read_cube_block.Rd create mode 100644 man/read_cube_data_lines.Rd create mode 100644 man/read_cube_metadata_header.Rd create mode 100644 man/rename_cube_data_columns.Rd create mode 100644 man/resp_check_data.Rd create mode 100644 man/return_table_object.Rd create mode 100644 man/rev_database_function.Rd create mode 100644 man/spezifisch_create.Rd create mode 100644 man/split_cube.Rd create mode 100644 man/test_database_function.Rd create mode 100644 man/test_if_error.Rd create mode 100644 man/test_if_error_find.Rd create mode 100644 man/test_if_error_light.Rd create mode 100644 man/test_if_error_variables.Rd create mode 100644 man/test_if_json.Rd create mode 100644 man/test_if_okay.Rd create mode 100644 man/test_if_process_further.Rd create mode 100644 man/titel_search.Rd create mode 100644 tests/testthat/catalogue1/api/catalogue/tables-30cbd2.json create mode 100644 tests/testthat/catalogue2/api/catalogue/statistics-f5c1c1.json create mode 100644 tests/testthat/catalogue3/api/catalogue/cubes-57cf25.json create mode 100644 tests/testthat/catalogue4/api/catalogue/cubes-e28931.json create mode 100644 tests/testthat/catalogue4/api/catalogue/statistics-c47d1c.json create mode 100644 tests/testthat/catalogue4/api/catalogue/tables-e234ed.json create mode 100644 tests/testthat/catalogue5/api/catalogue/tables-5b59e0.json create mode 100644 tests/testthat/catalogue6/api/catalogue/tables-5b59e0.json create mode 100644 tests/testthat/cube1/api/data/cubefile-4e2e46.csv create mode 100644 tests/testthat/find1/api/find/find-c24582.json create mode 100644 tests/testthat/find2_fake/api/find/find-ef22fd.json create mode 100644 tests/testthat/find3/api/find/find-9961d3.json create mode 100644 tests/testthat/logincheck1/api/helloworld/logincheck-aabf05.R create mode 100644 tests/testthat/meta1/api/metadata/table-4041ce.json create mode 100644 tests/testthat/meta2_fake/api/metadata/cube-844a6b.json create mode 100644 tests/testthat/meta3/api/metadata/table-4041ce.json create mode 100644 tests/testthat/modified1/api/catalogue/modifieddata-00f7a4.json create mode 100644 tests/testthat/modified2/api/catalogue/modifieddata-febf13.json create mode 100644 tests/testthat/modified3/api/catalogue/modifieddata-00f7a4.json create mode 100644 tests/testthat/modified4_fake/api/catalogue/modifieddata-66ae58.json create mode 100644 tests/testthat/searchvars1/api/catalogue/variables-fa86e3.json create mode 100644 tests/testthat/searchvars2/api/catalogue/variables-05bbfd.json create mode 100644 tests/testthat/table1/api/data/tablefile-768a25.csv create mode 100644 tests/testthat/terms1/api/catalogue/terms-6ad002.json create mode 100644 tests/testthat/values1/api/catalogue/values2variable-8361bb.json create mode 100644 tests/testthat/values2/api/catalogue/values2variable-d9d8dc.json create mode 100644 tests/testthat/variables1/api/catalogue/variables2statistic-49290a.json create mode 100644 tests/testthat/variables2_fake/api/catalogue/variables2statistic-e15459.json create mode 100644 tests/testthat/variables3/api/catalogue/variables2statistic-f8d69a.json create mode 100644 tests/testthat/xy_statistic1/api/catalogue/cubes2statistic-30c942.json create mode 100644 tests/testthat/xy_statistic1/api/catalogue/tables2statistic-30c942.json create mode 100644 tests/testthat/xy_statistic1/api/catalogue/variables2statistic-30c942.json create mode 100644 tests/testthat/xy_statistic2/api/catalogue/tables2statistic-30c942.json create mode 100644 tests/testthat/xy_statistic3/api/catalogue/tables2statistic-30c942.json create mode 100644 tests/testthat/xy_variable1/api/catalogue/statistics2variable-93dc8a.json create mode 100644 tests/testthat/xy_variable1/api/catalogue/tables2variable-93dc8a.json create mode 100644 tests/testthat/xy_variable1/api/catalogue/timeseries2variable-93dc8a.json create mode 100644 tests/testthat/xy_variable2/api/catalogue/tables2variable-93dc8a.json create mode 100644 tests/testthat/xy_variable3/api/catalogue/tables2variable-93dc8a.json diff --git a/DESCRIPTION b/DESCRIPTION index 2ba4bc3..8749078 100644 --- a/DESCRIPTION +++ b/DESCRIPTION @@ -28,10 +28,10 @@ Imports: readr, tibble, vctrs, - usethis, purrr Suggests: httptest2, + usethis, knitr, rmarkdown, testthat (>= 3.0.0), @@ -42,4 +42,4 @@ Config/testthat/edition: 3 Encoding: UTF-8 LazyData: true Roxygen: list(markdown = TRUE) -RoxygenNote: 7.2.3 +RoxygenNote: 7.3.2 diff --git a/NAMESPACE b/NAMESPACE index 4435bfb..4bab419 100644 --- a/NAMESPACE +++ b/NAMESPACE @@ -1,11 +1,15 @@ # Generated by roxygen2: do not edit by hand export(gen_alternative_terms) +export(gen_auth_get) export(gen_auth_save) export(gen_catalogue) export(gen_cube) +export(gen_download_job) export(gen_find) export(gen_list_jobs) +export(gen_list_results) +export(gen_logincheck) export(gen_metadata) export(gen_metadata_cube) export(gen_metadata_statistic) @@ -16,7 +20,9 @@ export(gen_modified_data) export(gen_objects2stat) export(gen_objects2var) export(gen_search_vars) +export(gen_signs) export(gen_table) +export(gen_update_evas) export(gen_val2var) export(gen_val2var2stat) export(gen_var2stat) diff --git a/R/data.R b/R/data.R index 250d54c..4e0532b 100644 --- a/R/data.R +++ b/R/data.R @@ -1,12 +1,11 @@ #' List of EVAS codes #' -#' @format ## `EVAS_numbers` -#' A data frame with 1128 rows and 3 columns: +#' @format ## `evas_list` +#' A data frame with 1132 rows and 3 columns: #' \describe{ #' \item{EVAS}{EVAS code} #' \item{Beschreibung}{Details on the EVAS code} #' \item{Titel}{Alternative desription of EVAS code contents} -#' ... #' } #' @source -"EVAS_numbers" +"evas_list" diff --git a/R/gen_catalogue.R b/R/gen_catalogue.R index 59cea25..eac3050 100644 --- a/R/gen_catalogue.R +++ b/R/gen_catalogue.R @@ -58,10 +58,10 @@ gen_catalogue <- function(code = NULL, #----------------------------------------------------------------------------- - # Processing #### + # Processing # res <- lapply(gen_fun, function(db){ - if (verbose) { + if (isTRUE(verbose)) { info <- paste("Started the processing of", rev_database_function(db), "database.") diff --git a/R/gen_cube.R b/R/gen_cube.R index fb75b6c..8c45065 100644 --- a/R/gen_cube.R +++ b/R/gen_cube.R @@ -74,6 +74,7 @@ gen_cube_ <- function(name, language = Sys.getenv("GENESIS_LANG")) { area <- match.arg(area) + database <- match.arg(database) if (!isTRUE(language == "en")) { diff --git a/R/gen_jobs.R b/R/gen_jobs.R index 9ea32d3..7917af5 100644 --- a/R/gen_jobs.R +++ b/R/gen_jobs.R @@ -123,7 +123,7 @@ gen_list_jobs <- function(database = c("genesis", "regio"), #' @export #' #' @examples -#' #' \dontrun{ +#' \dontrun{ #' gen_download_job("21311-00-01-1_123456789", "regio") #' } #' diff --git a/R/gen_meta_data.R b/R/gen_meta_data.R index 86af349..18515bf 100644 --- a/R/gen_meta_data.R +++ b/R/gen_meta_data.R @@ -7,6 +7,7 @@ #' @param area Character string. Indicator from which area of the database the results are called. In general, 'all' is the appropriate solution. Default option is 'all'. Not used for 'statistics'. #' @param error.ignore Boolean. Indicator if the function should stop if an error occurs or no object for the request is found or if it should produce a token as response. Default option is 'FALSE'. #' @param verbose Boolean. Indicator if the output of the function should include detailed messages and warnings. Default option is 'TRUE'. Set the parameter to 'FALSE' to suppress additional messages and warnings. +#' @param raw Boolean. Should a non-parsed API response be returned? #' @param ... Additional parameters for the API call. These parameters are only affecting the call itself, no further processing. For more details see `vignette("additional_parameter")`. #' #' @return A list with all recalled elements from the API. Attributes are added to the data.frame describing the search configuration for the returned output. @@ -86,13 +87,13 @@ gen_metadata_statistic <- function(code = NULL, if (isFALSE(raw)) { df_stats <-cbind("Code" = results_json$Object$Code, - "Content" = results_json$Object$Content, - "Cubes" = results_json$Object$Cubes, - "Variables" = results_json$Object$Variables, - "Information" = results_json$Object$Information, - "Time_from" = results_json$Object$Frequency[[1]]$From, - "Time_to" = results_json$Object$Frequency[[1]]$To, - "Time_type" = results_json$Object$Frequency[[1]]$Type) + "Content" = results_json$Object$Content, + "Cubes" = results_json$Object$Cubes, + "Variables" = results_json$Object$Variables, + "Information" = results_json$Object$Information, + "Time_from" = results_json$Object$Frequency[[1]]$From, + "Time_to" = results_json$Object$Frequency[[1]]$To, + "Time_type" = results_json$Object$Frequency[[1]]$Type) } else { df_stats <- results_json$Object @@ -129,6 +130,7 @@ gen_metadata_statistic <- function(code = NULL, #' @param area Character string. Indicator from which area of the database the results are called. In general, 'all' is the appropriate solution. Default option is 'all'. Not used for 'statistics'. #' @param error.ignore Boolean. Indicator if the function should stop if an error occurs or no object for the request is found or if it should produce a token as response. Default option is 'FALSE'. #' @param verbose Boolean. Indicator if the output of the function should include detailed messages and warnings. Default option is 'TRUE'. Set the parameter to 'FALSE' to suppress additional messages and warnings. +#' @param raw Boolean. Should a non-parsed API response be returned? #' @param ... Additional parameters for the API call. These parameters are only affecting the call itself, no further processing. For more details see `vignette("additional_parameter")`. #' #' @return A list with all recalled elements from the API. Attributes are added to the data.frame describing the search configuration for the returned output. @@ -259,6 +261,7 @@ gen_metadata_variable <- function(code = NULL, #' @param area Character string. Indicator from which area of the database the results are called. In general, 'all' is the appropriate solution. Default option is 'all'. Not used for 'statistics'. #' @param error.ignore Boolean. Indicator if the function should stop if an error occurs or no object for the request is found or if it should produce a token as response. Default option is 'FALSE'. #' @param verbose Boolean. Indicator if the output of the function should include detailed messages and warnings. Default option is 'TRUE'. Set the parameter to 'FALSE' to suppress additional messages and warnings. +#' @param raw Boolean. Should a non-parsed API response be returned? #' @param ... Additional parameters for the API call. These parameters are only affecting the call itself, no further processing. For more details see `vignette("additional_parameter")`. #' #' @return A list with all recalled elements from the API. Attributes are added to the data.frame describing the search configuration for the returned output. @@ -386,6 +389,7 @@ gen_metadata_value <- function(code = NULL, #' @param area Character string. Indicator from which area of the database the results are called. In general, 'all' is the appropriate solution. Default option is 'all'. Not used for 'statistics'. #' @param error.ignore Boolean. Indicator if the function should stop if an error occurs or no object for the request is found or if it should produce a token as response. Default option is 'FALSE'. #' @param verbose Boolean. Indicator if the output of the function should include detailed messages and warnings. Default option is 'TRUE'. Set the parameter to 'FALSE' to suppress additional messages and warnings. +#' @param raw Boolean. Should a non-parsed API response be returned? #' @param ... Additional parameters for the API call. These parameters are only affecting the call itself, no further processing. For more details see `vignette("additional_parameter")`. #' #' @return A list with all recalled elements from the API. Attributes are added to the data.frame describing the search configuration for the returned output. @@ -585,6 +589,7 @@ gen_metadata_table <- function(code = NULL, #' @param area Character string. Indicator from which area of the database the results are called. In general, 'all' is the appropriate solution. Default option is 'all'. Not used for 'statistics'. #' @param error.ignore Boolean. Indicator if the function should stop if an error occurs or no object for the request is found or if it should produce a token as response. Default option is 'FALSE'. #' @param verbose Boolean. Indicator if the output of the function should include detailed messages and warnings. Default option is 'TRUE'. Set the parameter to 'FALSE' to suppress additional messages and warnings. +#' @param raw Boolean. Should a non-parsed API response be returned? #' @param ... Additional parameters for the API call. These parameters are only affecting the call itself, no further processing. For more details see `vignette("additional_parameter")`. #' #' @return A list with all recalled elements from the API. Attributes are added to the data.frame describing the search configuration for the returned output. @@ -760,6 +765,7 @@ gen_metadata_cube <- function(code = NULL, #' @param area Character string. Indicator from which area of the database the results are called. In general, 'all' is the appropriate solution. Default option is 'all'. Not used for 'statistics'. #' @param error.ignore Boolean. Indicator if the function should stop if an error occurs or no object for the request is found or if it should produce a token as response. Default option is 'FALSE'. #' @param verbose Boolean. Indicator if the output of the function should include detailed messages and warnings. Default option is 'TRUE'. Set the parameter to 'FALSE' to suppress additional messages and warnings. +#' @param raw Boolean. Should a non-parsed API response be returned? #' @param ... Additional parameters for the API call. These parameters are only affecting the call itself, no further processing. For more details see `vignette("additional_parameter")`. #' #' @return A list with all recalled elements from the API. Attributes are added to the data.frame describing the search configuration for the returned output. diff --git a/R/gen_update_EVAS.R b/R/gen_update_evas.R similarity index 78% rename from R/gen_update_EVAS.R rename to R/gen_update_evas.R index 55be0ba..2de1a87 100644 --- a/R/gen_update_EVAS.R +++ b/R/gen_update_evas.R @@ -1,8 +1,8 @@ #' gen_update_evas #' -#' @description Function to web scrape the EVAS numbers from the EVAS website and save them as a RData file. Takes no parameters. +#' @description Function to web scrape the EVAS numbers from the EVAS website and save them as a .rda file. Takes no parameters. #' -#' @return An updated .RData file containing the latest EVAS numbers +#' @return An updated .rda file containing the latest EVAS numbers #' @export #' gen_update_evas <- function(){ @@ -16,7 +16,7 @@ gen_update_evas <- function(){ } # Path selection - data_path <- system.file("data", "EVAS_numbers.RData", package = "restatis") + data_path <- system.file("data", "evas_list.rda", package = "restatis") # Define the src URL of the EVAS numbers url <- "https://erhebungsdatenbank.estatistik.de/eid/TabelleEvas.jsp" @@ -33,6 +33,6 @@ gen_update_evas <- function(){ evas_list <- html # Return the modified data object - save(evas_list ,file = data_path) + save(evas_list, file = data_path) } diff --git a/R/gen_var2-val2.R b/R/gen_var2-val2.R index 751d415..256ad0f 100644 --- a/R/gen_var2-val2.R +++ b/R/gen_var2-val2.R @@ -386,6 +386,7 @@ gen_val2var2stat <- function(code = NULL, #' #' @param code Character string with a maximum length of 6 characters. Code from a GENESIS, Zensus 2022 or regionalstatistik.de object. Only one code per iteration. #' @param database Character string. Indicator if the GENESIS ('genesis'), Zensus 2022 ('zensus') or regionalstatistik.de ('regio') database is called. Only one database can be addressed per function call. Default option is 'genesis'. +#' @param area Character string. Indicator from which area of the database the results are called. In general, 'all' is the appropriate solution. Default option is 'all'. Not used for 'statistics'. #' @param sortcriterion Character string. Indicator if the output should be sorted by 'code' or 'content'. This is a parameter of the API call itself. The default is 'code'. #' @param error.ignore Boolean. Indicator if the function should stop if an error occurs or no object for the request is found or if it should produce a token as response. Default option is 'FALSE'. #' @param verbose Boolean. Indicator if the output of the function should include detailed messages and warnings. Default option is 'TRUE'. Set the parameter to 'FALSE' to suppress additional messages and warnings. diff --git a/R/globals.R b/R/globals.R new file mode 100644 index 0000000..c5d0ec0 --- /dev/null +++ b/R/globals.R @@ -0,0 +1 @@ +utils::globalVariables(c("evas_list")) diff --git a/R/utils_dataprocessing.R b/R/utils_dataprocessing.R index be2c776..d45ec8f 100644 --- a/R/utils_dataprocessing.R +++ b/R/utils_dataprocessing.R @@ -55,7 +55,7 @@ param_collapse_vec <- function(vec) { forming_evas <- function(list_of) { # Path selection - data_path <- system.file("data", "EVAS_numbers.RData", package = "restatis") + data_path <- system.file("data", "evas_list.rda", package = "restatis") # Load data load(data_path) diff --git a/R/utils_httr2.R b/R/utils_httr2.R index bb21e0a..ea9040d 100644 --- a/R/utils_httr2.R +++ b/R/utils_httr2.R @@ -412,7 +412,7 @@ return_table_object <- function(response, #' @param database The user input to 'gen_logincheck' #' @param verbose Boolean. Should the function message in case of success? #' -#' @return +#' @return Informative error/warning messages + invisibly TRUE/FALSE #' logincheck_http_error <- function(database, verbose) { diff --git a/data/EVAS_numbers.RData b/data/EVAS_numbers.RData deleted file mode 100644 index 9e4613e98e601145e94b52c4ae39790a7c5a6d18..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 39014 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 Ue_!DJ*4p{#uFR{c(6ieA1LCPo1poj5 literal 0 HcmV?d00001 diff --git a/man/binding_lapply.Rd b/man/binding_lapply.Rd new file mode 100644 index 0000000..667f010 --- /dev/null +++ b/man/binding_lapply.Rd @@ -0,0 +1,16 @@ +% Generated by roxygen2: do not edit by hand +% Please edit documentation in R/utils_dataprocessing.R +\name{binding_lapply} +\alias{binding_lapply} +\title{binding_lapply} +\usage{ +binding_lapply(x, characteristics) +} +\arguments{ +\item{x}{Element to bind} + +\item{characteristics}{Characteristics to filter for} +} +\description{ +binding_lapply +} diff --git a/man/check_function_input.Rd b/man/check_function_input.Rd new file mode 100644 index 0000000..02cbae6 --- /dev/null +++ b/man/check_function_input.Rd @@ -0,0 +1,58 @@ +% Generated by roxygen2: do not edit by hand +% Please edit documentation in R/utils_dataprocessing.R +\name{check_function_input} +\alias{check_function_input} +\title{check_function_input} +\usage{ +check_function_input( + code = NULL, + term = NULL, + sortcriterion = NULL, + category = NULL, + detailed = NULL, + type = NULL, + date = NULL, + similarity = NULL, + error.ignore = NULL, + ordering = NULL, + database = NULL, + area = NULL, + caller = NULL, + verbose = NULL, + raw = NULL +) +} +\arguments{ +\item{code}{Parameter to be checked} + +\item{term}{Parameter to be checked} + +\item{sortcriterion}{Parameter to be checked} + +\item{category}{Parameter to be checked} + +\item{detailed}{Parameter to be checked} + +\item{type}{Parameter to be checked} + +\item{date}{Parameter to be checked} + +\item{similarity}{Parameter to be checked} + +\item{error.ignore}{Parameter to be checked} + +\item{ordering}{Parameter to be checked} + +\item{database}{Parameter to be checked} + +\item{area}{Parameter to be checked} + +\item{caller}{Parameter to be checked} + +\item{verbose}{Parameter to be checked} + +\item{raw}{Parameter to be checked} +} +\description{ +check_function_input +} diff --git a/man/check_results.Rd b/man/check_results.Rd new file mode 100644 index 0000000..a101ad7 --- /dev/null +++ b/man/check_results.Rd @@ -0,0 +1,14 @@ +% Generated by roxygen2: do not edit by hand +% Please edit documentation in R/utils_dataprocessing.R +\name{check_results} +\alias{check_results} +\title{check_results} +\usage{ +check_results(input) +} +\arguments{ +\item{input}{Input to test result structure} +} +\description{ +check_results +} diff --git a/man/evas_list_long_20220724.Rd b/man/evas_list.Rd similarity index 70% rename from man/evas_list_long_20220724.Rd rename to man/evas_list.Rd index b41de3e..884d1cb 100644 --- a/man/evas_list_long_20220724.Rd +++ b/man/evas_list.Rd @@ -1,18 +1,17 @@ % Generated by roxygen2: do not edit by hand % Please edit documentation in R/data.R \docType{data} -\name{evas_list_long_20220724} -\alias{evas_list_long_20220724} +\name{evas_list} +\alias{evas_list} \title{List of EVAS codes} \format{ -\subsection{\code{evas_list_long_20220724}}{ +\subsection{\code{evas_list}}{ -A data frame with 1,097 rows and 3 columns: +A data frame with 1132 rows and 3 columns: \describe{ \item{EVAS}{EVAS code} \item{Beschreibung}{Details on the EVAS code} \item{Titel}{Alternative desription of EVAS code contents} -... } } } @@ -20,7 +19,7 @@ A data frame with 1,097 rows and 3 columns: \url{https://www.destatis.de/DE/Methoden/Revisionen/Glossar/EVAS.html} } \usage{ -evas_list_long_20220724 +evas_list } \description{ List of EVAS codes diff --git a/man/forming_evas.Rd b/man/forming_evas.Rd new file mode 100644 index 0000000..9e4f19a --- /dev/null +++ b/man/forming_evas.Rd @@ -0,0 +1,14 @@ +% Generated by roxygen2: do not edit by hand +% Please edit documentation in R/utils_dataprocessing.R +\name{forming_evas} +\alias{forming_evas} +\title{forming_evas} +\usage{ +forming_evas(list_of) +} +\arguments{ +\item{list_of}{List of EVAS to iterate over} +} +\description{ +forming_evas +} diff --git a/man/gen_alternative_terms.Rd b/man/gen_alternative_terms.Rd index 35f01be..6673797 100644 --- a/man/gen_alternative_terms.Rd +++ b/man/gen_alternative_terms.Rd @@ -2,31 +2,44 @@ % Please edit documentation in R/gen_alternative_terms.R \name{gen_alternative_terms} \alias{gen_alternative_terms} -\title{gen_alternative_terms: Call For Similiar or Spelling Related Terms for Further Search} +\title{gen_alternative_terms} \usage{ -gen_alternative_terms(term = NULL, similarity = TRUE, ...) +gen_alternative_terms( + term = NULL, + similarity = TRUE, + database = c("all", "genesis", "zensus", "regio"), + verbose = TRUE, + ... +) } \arguments{ \item{term}{Character string. Maximum length of 15 characters. Term or word for which you are searching for alternative or related terms. Use of '*' as a placeholder is possible to generate broader search areas.} -\item{similarity}{Logical. Indicator if the output of the function should be sorted based on a Levenshtein edit distance based on the \code{adist()} function.} +\item{similarity}{Boolean. Indicator if the output of the function should be sorted based on a Levenshtein edit distance based on the \code{adist()} function. Default is 'TRUE'.} -\item{...}{Additional parameters for the Genesis API call. These parameters are only affecting the Genesis call itself, no further processing. For more details see \code{vignette("additional_parameter")}.} +\item{database}{Character string. Indicator if the GENESIS ('genesis'), Zensus 2022 ('zensus') or regionalstatistik.de ('regio') database is called. Only one database can be addressed per function call. Default option is 'genesis'.} + +\item{verbose}{Boolean. Indicator if the output of the function should include detailed messages and warnings. Default option is 'TRUE'. Set the parameter to 'FALSE' to suppress additional messages and warnings.} + +\item{...}{Additional parameters for the API call. These parameters are only affecting the call itself, no further processing. For more details see \code{vignette("additional_parameter")}.} } \value{ -A list with all recalled elements from Genesis. Attributes are added to the data.frame, describing the search configuration for the returned output. +A list with all recollected elements from the respective database. Attributes are added to the data.frame, describing the search configuration for the returned output. } \description{ -Function to find search terms that are similar or related to one another and also represented in Genesis. +Function to find search terms that are similar or related to one another in spelling and also represented in the GENESIS, Zensus 2022 or regionalstatistik.de databases. Important note: The API call is searching for terms with the same characters. To be useful in searching for related terms it is highly recommended to work with "*" placeholders (see examples). The placeholder can be placed before and/or after the search term. } \examples{ \dontrun{ -# Find terms that are similar (in spelling) to search term "bus" +# Find terms at GENESIS that are the same (in spelling) to search term "bus" # and sort them by Levenshtein edit distance -object <- gen_alternative_terms(term = "bus", similarity = TRUE) +object <- gen_alternative_terms(term = "bus", similarity = TRUE, database = "genesis") + +# Find terms at GENESIS that are related (in spelling) to search term "bus" +object <- gen_alternative_terms(term = "bus*", similarity = TRUE, database = "genesis") -# Find terms that are related (in spelling) to search term "bus" -object <- gen_alternative_terms(term = "bus*", similarity = TRUE) +# Find terms at Zensus 2022 that are related (in spelling) to search term "wohn" +object <- gen_alternative_terms(term = "wohn*", similarity = TRUE, database = "zensus") } } diff --git a/man/gen_auth_ask.Rd b/man/gen_auth_ask.Rd new file mode 100644 index 0000000..35c41d0 --- /dev/null +++ b/man/gen_auth_ask.Rd @@ -0,0 +1,17 @@ +% Generated by roxygen2: do not edit by hand +% Please edit documentation in R/gen_auth.R +\name{gen_auth_ask} +\alias{gen_auth_ask} +\title{gen_auth_ask} +\usage{ +gen_auth_ask(credential_type) +} +\arguments{ +\item{credential_type}{Character string. Type of credential to ask for} +} +\value{ +The user response +} +\description{ +gen_auth_ask +} diff --git a/man/gen_auth_get.Rd b/man/gen_auth_get.Rd new file mode 100644 index 0000000..3831c5f --- /dev/null +++ b/man/gen_auth_get.Rd @@ -0,0 +1,24 @@ +% Generated by roxygen2: do not edit by hand +% Please edit documentation in R/gen_auth.R +\name{gen_auth_get} +\alias{gen_auth_get} +\title{gen_auth_get} +\usage{ +gen_auth_get(database = c("all", "genesis", "zensus", "regio")) +} +\arguments{ +\item{database}{Character string. The database to get the credentials for ('all', 'genesis', 'zensus' and 'regio').} +} +\value{ +Credentials for the database(s) chosen by the user +} +\description{ +Function to retrieve the credentials stored via \code{gen_auth_save()} +} +\examples{ +\dontrun{ +gen_auth_get("all") +} + + +} diff --git a/man/gen_auth_path.Rd b/man/gen_auth_path.Rd new file mode 100644 index 0000000..2c16c8f --- /dev/null +++ b/man/gen_auth_path.Rd @@ -0,0 +1,17 @@ +% Generated by roxygen2: do not edit by hand +% Please edit documentation in R/gen_auth.R +\name{gen_auth_path} +\alias{gen_auth_path} +\title{gen_auth_path} +\usage{ +gen_auth_path(...) +} +\arguments{ +\item{...}{Optional arguments for file.path()} +} +\value{ +A file path for the storage of config files +} +\description{ +gen_auth_path +} diff --git a/man/gen_auth_save.Rd b/man/gen_auth_save.Rd index e8ce643..70db029 100644 --- a/man/gen_auth_save.Rd +++ b/man/gen_auth_save.Rd @@ -2,22 +2,29 @@ % Please edit documentation in R/gen_auth.R \name{gen_auth_save} \alias{gen_auth_save} -\title{Save authentication} +\title{gen_auth_save} \usage{ -gen_auth_save() +gen_auth_save(database = c("all", "genesis", "zensus", "regio")) +} +\arguments{ +\item{database}{Character string. The database to store credentials for ('all', 'genesis', 'zensus' or 'regio').} } \description{ -See Details. +Save credentials of the different databases for further convenient use } \details{ -Genesis username and password are encrypted and saved as RDS in the -package config directory. +Username and password are encrypted and saved as RDS in the +package config directory. A random string is generated and stored in the +session environment variable \code{RESTATIS_KEY}. This string is used as the key +to encrypt and decrypt the entered credentials. To avoid having to save +authentication in future sessions, \code{RESTATIS_KEY} can be added to .Renviron. +The usethis package includes a helper function for editing .Renviron files +from an R session with \code{\link[usethis:edit]{usethis::edit_r_environ()}}. +} +\examples{ +\dontrun{ +gen_auth_save("zensus") +} -A random string is generated and stored in the session environment -variable \code{RESTATIS_KEY}. This string is used as the key to encrypt and -decrypt the entered Genesis credentials. -To avoid having to save authentication in future sessions, \code{RESTATIS_KEY} can -be added to .Renviron. The usethis package includes a helper function for -editing .Renviron files from an R session with \code{\link[usethis:edit]{usethis::edit_r_environ()}}. } diff --git a/man/gen_catalogue.Rd b/man/gen_catalogue.Rd index 4435194..03d58e0 100644 --- a/man/gen_catalogue.Rd +++ b/man/gen_catalogue.Rd @@ -2,37 +2,49 @@ % Please edit documentation in R/gen_catalogue.R \name{gen_catalogue} \alias{gen_catalogue} -\title{catalogue: Explore Different Objects and Their Structural Embedding in Genesis} +\title{gen_catalogue} \usage{ gen_catalogue( code = NULL, + database = c("all", "genesis", "zensus", "regio"), category = c("tables", "statistics", "cubes"), + area = c("all", "public", "user"), detailed = FALSE, error.ignore = FALSE, + sortcriterion = c("code", "content"), + verbose = TRUE, ... ) } \arguments{ -\item{code}{a string with a maximum length of 10 characters. Code from a Genesis-Object. Only one code per iteration. "*"-Notations are possible.} +\item{code}{String with a maximum length of 10 characters for a database object (GENESIS and regionalstatistik.de) and 15 characters for a Zensus 2022 object. Only one code per iteration. "*" notations are possible.} -\item{category}{a string. Specific Genesis-Object-types: 'tables', 'statistics', and 'cubes'. All three together are possible.} +\item{database}{Character string. Indicator if the GENESIS ('genesis'), Zensus 2022 ('zensus') or regionalstatistik.de ('regio') database is called. Only one database can be addressed per function call. Default option is 'genesis'.} -\item{detailed}{a logical. Indicator if the function should return the detailed output of the iteration including all object-related information or only a shortened output including only code and object title.} +\item{category}{Character string. Specify specific GENESIS/regionalstatistik.de object types ('tables', 'statistics' and 'cubes') and specific Zensus 2022 object types ('tables' and 'statistics'). All types that are specific for one database can be used together. Default option is to use all types that are possible for the specific database.} -\item{error.ignore}{a logical. Indicator if the function should stop if an error occurs or no object for the request is found or if it should produce a token as response.} +\item{area}{Character string. Indicator from which area of the database the results are called. In general, 'all' is the appropriate solution. Default option is 'all'. Not used for 'statistics'.} -\item{...}{Additional parameters for the Genesis API call. These parameters are only affecting the Genesis call itself, no further processing. For more details see \code{vignette("additional_parameter")}.} +\item{detailed}{Boolean. Indicator if the function should return the detailed output of the iteration including all object-related information or only a shortened output including only code and object title. Default option is 'FALSE'.} + +\item{error.ignore}{Boolean. Indicator if the function should stop if an error occurs or no object for the request is found or if it should produce a token as response. Default option is 'FALSE'.} + +\item{sortcriterion}{Character string. Indicator if the output should be sorted by 'code' or 'content'. This is a parameter of the API call itself. The default is 'code'.} + +\item{verbose}{Boolean. Indicator if the output of the function should include detailed messages and warnings. Default option is 'TRUE'. Set the parameter to 'FALSE' to suppress additional messages and warnings.} + +\item{...}{Additional parameters for the API call. These parameters are only affecting the call itself, no further processing. For more details see \code{vignette("additional_parameter")}.} } \value{ -A list with all recalled elements from Genesis API. Based on the detailed-parameter it contains more or less information, but always includes the code of the object, the title, and the type of the object. This is done to facilitate further processing with the data. Attributes are added to the dataframe describing the search configuration for the returned output. +A list with all recalled elements from the API. Based on the 'detailed' parameter it contains more or less information, but always includes the code of the object, the title, and the type of the object. This is done to facilitate further processing with the data. Attributes are added to the data.frame describing the search configuration for the returned output. } \description{ -Function to enable searching for tables, statistics, and cubes from Genesis. Additionally, it structures the output based on the internal tree structure of Genesis itself based on the EVAS-numbers. Time-series are represented as cubes with a specified time span. +Function to search for tables, statistics, and cubes from GENESIS, Zensus 2022 or regionalstatistik.de. Additionally, it structures the output based on the internal tree structure based on the EVAS-numbers. Time-series are represented as cubes with a specified time span. Important note: To be useful in searching for objects it is highly recommended to work with "*" placeholders (see examples). The placeholder can be placed before and/or after the search term. } \examples{ \dontrun{ -# Scroll through Objects under the topic "12*" -# which is "Bevölkerung" in Destatis from all categories and +# Scroll through objects under the topic "12*" +# which is "Bevoelkerung" in GENESIS from all categories and # with a detailed output object <- gen_catalogue(code = "12*", detailed = T) diff --git a/man/gen_cube.Rd b/man/gen_cube.Rd index 85a8314..d97b2b4 100644 --- a/man/gen_cube.Rd +++ b/man/gen_cube.Rd @@ -7,43 +7,44 @@ gen_cube(name, ...) } \arguments{ -\item{name}{Name of the data cube} +\item{name}{Character string for a cube object (only GENESIS and regionalstatistik.de)} -\item{...}{Optional parameters passed on to the Genesis API call: +\item{...}{Further (optional) parameters passed on to the API call: \describe{ -\item{\code{area}}{a string. The area in which the table is stored. Possible values: +\item{\code{area}}{Character string. The area in which the table is stored. Possible values: \itemize{ \item \code{"public"}: cube in the public catalogue \item \code{"user"}: cube in the user's account +\item \code{"all"}: both of the above }} -\item{\code{values}}{a logical. Should values be included?} -\item{\code{metadata}}{a logical. Should metadata be included?} -\item{\code{additionals}}{a logical. Should additional metadata be included?} -\item{\code{contents}}{a string. Names of required statistical specifications} -\item{\code{startyear,endyear}}{a number. Only retrieve data between these years.} -\item{\code{timeslices}}{a number. Number of timeslices (cumulative to startyear or endyear)} -\item{\code{regionalvariable}}{character. Code of the regional variable +\item{\code{values}}{Boolean. Should values be included?} +\item{\code{metadata}}{Boolean. Should metadata be included?} +\item{\code{additionals}}{Boolean. Should additional metadata be included?} +\item{\code{contents}}{Character string. Names of required statistical specifications} +\item{\code{startyear,endyear}}{Four-digit integers. Only retrieve data between these years.} +\item{\code{timeslices}}{Integer. Number of timeslices (cumulative to startyear or endyear)} +\item{\code{regionalvariable}}{Character string. Code of the regional variable whose value is specified in \code{regionalkey} to filter the results.} -\item{\code{regionalkey}}{character. One or more regional keys. Multiple +\item{\code{regionalkey}}{Character string. One or more regional keys. Multiple values can be supplied as a character vector or as a single string, with the regional keys separated by commas. Use of wildcard (\code{*}) allowed.} \item{\code{classifyingvariable1,classifyingvariable2 - ,classifyingvariable3}}{character. Code of the subject classification + ,classifyingvariable3}}{Character string. Code of the subject classification (SK-Merkmal) to which the selection by means of the corresponding \code{classifyingkey} parameter is to be applied.} -\item{\code{classifyingkey1,classifyingkey2,classifyingkey3}}{character. +\item{\code{classifyingkey1,classifyingkey2,classifyingkey3}}{Character string. One or more values of a subject classification (e.g. "WZ93012"). Applied to the corresponding \code{classifyingvariable} parameter. Multiple keys can be supplied as a character vector or as a single string, with the keys separated by commas. Use of wildcard (\code{*}) allowed.} -\item{\code{stand}}{a string \code{"DD.MM.YYYY"}. Only retrieve data -updated after this #' date.} -\item{\code{language}}{Search terms, returned messages and data +\item{\code{stand}}{Character string, format: \code{"DD.MM.YYYY"}. Only retrieve data +updated after this date.} +\item{\code{language}}{Character string. Search terms, returned messages and data descriptions in German (\code{"de"}) or English (\code{"en"})?} }} } \description{ -Download a cube with data from Genesis +Download a cube with data from GENESIS or regionalstatistik.de database } \examples{ \dontrun{ diff --git a/man/gen_download_job.Rd b/man/gen_download_job.Rd new file mode 100644 index 0000000..529fb41 --- /dev/null +++ b/man/gen_download_job.Rd @@ -0,0 +1,40 @@ +% Generated by roxygen2: do not edit by hand +% Please edit documentation in R/gen_jobs.R +\name{gen_download_job} +\alias{gen_download_job} +\title{gen_download_job} +\usage{ +gen_download_job( + name, + database = c("genesis", "regio"), + area = c("all", "public", "user"), + compress = FALSE, + language = Sys.getenv("GENESIS_LANG"), + all_character = TRUE +) +} +\arguments{ +\item{name}{Character string. The job code retrieved by using gen_list_jobs().} + +\item{database}{Character string. Indicator if the GENESIS ('genesis') or regionalstatistik.de ('regio') database is called. Only one database can be addressed per function call. Default option is 'genesis'.} + +\item{area}{Character string. Indicator from which area of the database the results are called. In general, 'all' is the appropriate solution. Default option is 'all'.} + +\item{compress}{Boolean. Should empty rows and columns be discarded? Default is FALSE.} + +\item{language}{Character string. Search terms, returned messages and data descriptions in German ("de") or English ("en")?} + +\item{all_character}{Boolean. Should all variables be imported as 'character' variables? Avoids fuzzy data type conversions if there are leading zeros or other special characters. Defaults to TRUE.} +} +\value{ +Returns a data.frame with the table content +} +\description{ +gen_download_job +} +\examples{ +\dontrun{ +gen_download_job("21311-00-01-1_123456789", "regio") +} + +} diff --git a/man/gen_find.Rd b/man/gen_find.Rd index ca156f1..3cc1a15 100644 --- a/man/gen_find.Rd +++ b/man/gen_find.Rd @@ -6,46 +6,52 @@ \usage{ gen_find( term = NULL, + database = c("all", "genesis", "zensus", "regio"), category = c("all", "tables", "statistics", "variables", "cubes"), detailed = FALSE, ordering = TRUE, error.ignore = FALSE, + verbose = TRUE, ... ) } \arguments{ -\item{term}{A string with no maximum character length, but a word limit of five words.} +\item{term}{A character string with no maximum character length, but a word limit of five words.} -\item{category}{A string. Specific object types: 'tables', 'statistics', 'variables', and 'cubes'. Using all together is possible. Default option are 'all' objects.} +\item{database}{Character string. Indicator if the GENESIS ('genesis'), Zensus 2022 ('zensus') or regionalstatistik.de ('regio') database is called. Only one database can be addressed per function call. Default option is 'genesis'.} -\item{detailed}{A logical. Indicator if the function should return the detailed output of the iteration including all object related information or only a shortened output including only code and object title. Default Option is FALSE.} +\item{category}{Character string. Specify specific GENESIS/regionalstatistik.de object types ('tables', 'statistics' and 'cubes') and specific Zensus 2022 object types ('tables' and 'statistics'). All types that are specific for one database can be used together. Default option is to use all types that are possible for the specific database.} -\item{ordering}{A logical. Indicator if the function should return the output of the iteration ordered first based on the fact if the searched term is appearing in the title of the object and secondly on an estimator of the number of variables in this object. Default option is TRUE.} +\item{detailed}{Boolean. Indicator if the function should return the detailed output of the iteration including all object-related information or only a shortened output including only code and object title. Default option is 'FALSE'.} -\item{error.ignore}{A logical. Indicator if the function should stop if an error occurs or no object for the request is found or if it should produce an artificial response (e.g., for complex processes not to fail).} +\item{ordering}{A logical. Indicator if the function should return the output of the iteration ordered first based on the fact if the searched term is appearing in the title of the object and secondly on an estimator of the number of variables in this object. Default option is 'TRUE'.} -\item{...}{Additional parameters for the Genesis API call. These parameters are only affecting the Genesis call itself, no further processing. For more details see \code{vignette("additional_parameter")}.} +\item{error.ignore}{Boolean. Indicator if the function should stop if an error occurs or no object for the request is found or if it should produce a token as response. Default option is 'FALSE'.} + +\item{verbose}{Boolean. Indicator if the output of the function should include detailed messages and warnings. Default option is 'TRUE'. Set the parameter to 'FALSE' to suppress additional messages and warnings.} + +\item{...}{Additional parameters for the API call. These parameters are only affecting the call itself, no further processing. For more details see \code{vignette("additional_parameter")}.} } \value{ -A list with all elements retrieved from Genesis. Attributes are added to the data.frame describing the search configuration for the returned output. +A list with all recalled elements from the API. Based on the 'detailed' parameter it contains more or less information, but always includes the code of the object, the title, and the type of the object. This is done to facilitate further processing with the data. Attributes are added to the data.frame describing the search configuration for the returned output. } \description{ -Function to search through Genesis. It is similar in usage as the search function on the Destatis main page (https://www.destatis.de/DE/Home/_inhalt.html). -In the search query, "UND" (german word for: and; can also be written "und" or "&") as well as "ODER" (german word for: or; can also be written "oder" or "|") can be included and logically combined. Furthermore, wildcards are possible by including "*". If more then one word is included in the term-string, automatically "and" is used to combine the different words. -Important note: Time-series are treated as cubes, they are not longer distinguished. If you want to find a specific object with a clear code with this find function, you need to specify the object type or search for all object types. +Function to search through the databases GENESIS, Zensus 2022 and regionalstatistik.de. It is similar in usage as the search function on the GENESIS main page (https://www-genesis.destatis.de/genesis/online). +In the search query, "UND" (German word for 'and', also written "und" or "&") as well as "ODER" (German word for 'or', also written "oder" or "|") can be included and logically combined. Furthermore, wildcards are possible by including "*". If more then one word is included in the term string, 'and' is used automatically to combine the different words. +Important note: Time-series are treated as cubes in GENESIS and regionalstatistik.de, they are not longer distinguished. If you want to find a specific object with a clear code with this find function, you need to specify the object type or search for all object types. } \examples{ \dontrun{ -# Find objects related to "bus" in Genesis +# Find objects related to "bus" in GENESIS object <- gen_find(term = "bus") -# Find tables related to "bus" in Genesis and return a unordered detailed output +# Find tables related to "bus" in GENESIS and return a unordered detailed output object <- gen_find(term = "bus", detailed = TRUE, ordering = FALSE) -# Find tables related to "Autos" or "Corona" in Genesis and return a unordered detailed output +# Find tables related to "Autos" or "Corona" in GENESIS and return a unordered detailed output object <- gen_find(term = "autos ODER corona", detailed = TRUE, ordering = FALSE) -#' # Find tables related to "Autos" and "Corona" in Genesis and return a unordered detailed output +#' # Find tables related to "Autos" and "Corona" in GENESIS and return a unordered detailed output object <- gen_find(term = "autos UND corona", detailed = TRUE, ordering = FALSE) } diff --git a/man/gen_list_jobs.Rd b/man/gen_list_jobs.Rd index 5dcd876..6899f90 100644 --- a/man/gen_list_jobs.Rd +++ b/man/gen_list_jobs.Rd @@ -1,25 +1,34 @@ % Generated by roxygen2: do not edit by hand -% Please edit documentation in R/gen_list_jobs.R +% Please edit documentation in R/gen_jobs.R \name{gen_list_jobs} \alias{gen_list_jobs} -\title{gen_list_jobs: Explore current jobs of your user account} +\title{gen_list_jobs} \usage{ gen_list_jobs( - selection = NULL, - sortcriterion = c("content", "time", "status"), + database = c("genesis", "regio"), + sortcriterion = c("type", "time", "status", "code"), + flat = FALSE, ... ) } \arguments{ -\item{selection}{Filter the list of jobs for matching codes.} +\item{database}{Character string. Indicator if 'genesis' or 'regionalstatistik.de' database is called. Default option is 'genesis'.} -\item{sortcriterion}{Allows to sort the resulting list of jobs by their Code ("content"), the time of completion ("time") or status ("status")} +\item{sortcriterion}{Character string. Indicator if the output should be sorted by 'type','time','status' or 'code'. This is a parameter of the API call itself. The default is 'type'.} -\item{...}{Additional parameters for the Genesis API call. These parameters are only affecting the Genesis call itself, no further processing. For more details see \code{vignette("additional_parameter")}.} +\item{flat}{Boolean. Should the function return a list with jobs and metadata ('FALSE') or just a flat data.frame ('TRUE')? Defaults to FALSE.} + +\item{...}{Additional parameters for the API call. These parameters are only affecting the call itself, no further processing. For more details see \code{vignette("additional_parameter")}.} } \value{ -A list of all current jobs connected to the given user. +A list or data.frame (see parameter 'flat') of all current jobs of the user. } \description{ -Function to list all current jobs connected to the given user. +Function to list all current jobs connected to the given user in the GENESIS or regionalstatistik.de database. Important note: For this function it is also possible to use \code{searchcriterion} parameter and \code{selection} parameter, making it possible to filter the job list based on 'type','time','status' or 'code'. For more details see \code{vignette("additional_parameter")}. +} +\examples{ +\dontrun{ +gen_list_jobs("regio", flat = TRUE) +} + } diff --git a/man/gen_list_results.Rd b/man/gen_list_results.Rd new file mode 100644 index 0000000..62155c1 --- /dev/null +++ b/man/gen_list_results.Rd @@ -0,0 +1,25 @@ +% Generated by roxygen2: do not edit by hand +% Please edit documentation in R/gen_list_results.R +\name{gen_list_results} +\alias{gen_list_results} +\title{gen_list_results} +\usage{ +gen_list_results( + database = c("genesis", "zensus", "regio"), + area = c("all", "public", "user"), + ... +) +} +\arguments{ +\item{database}{Character string. Indicator if the GENESIS ('genesis'), Zensus 2022 ('zensus') or regionalstatistik.de ('regio') database is called. Only one database can be addressed per function call. Default option is 'genesis'.} + +\item{area}{Character string. Indicator from which area of the database the results are called. In general, 'all' is the appropriate solution. Default option is 'all'. Not used for 'statistics'.} + +\item{...}{Additional parameters for the API call. These parameters are only affecting the call itself, no further processing. For more details see \code{vignette("additional_parameter")}.} +} +\value{ +A list of all current results connected to the given user. +} +\description{ +Function to list all current results connected to the given user in the GENESIS, Zensus 2022 or regionalstatistik.de database. Important note: For this function it is also possible to use \code{selection} parameter, making it possible to filter the results based on the 'code' of the object. For more details see \code{vignette("additional_parameter")}. +} diff --git a/man/gen_logincheck.Rd b/man/gen_logincheck.Rd new file mode 100644 index 0000000..cc93b1d --- /dev/null +++ b/man/gen_logincheck.Rd @@ -0,0 +1,25 @@ +% Generated by roxygen2: do not edit by hand +% Please edit documentation in R/gen_logincheck.R +\name{gen_logincheck} +\alias{gen_logincheck} +\title{gen_logincheck} +\usage{ +gen_logincheck(database, verbose = FALSE) +} +\arguments{ +\item{database}{Character string. Indicator if the GENESIS ('genesis'), Zensus 2022 ('zensus') or regionalstatistik.de ('regio') database is called. Only one database can be addressed per function call. Default option is 'genesis'.} + +\item{verbose}{Boolean. In case of success, should a message be printed? Defaults to FALSE.} +} +\value{ +Leads to an informative error message if the login check failed and returns FALSE invisibly. Invisibly returns TRUE otherwise. +} +\description{ +Function to check if a login is possible for a certain database. +} +\examples{ +\dontrun{ +gen_logincheck("zensus") +} + +} diff --git a/man/gen_metadata.Rd b/man/gen_metadata.Rd index e530e38..2119f4b 100644 --- a/man/gen_metadata.Rd +++ b/man/gen_metadata.Rd @@ -6,22 +6,34 @@ \usage{ gen_metadata( code = NULL, - category = c("Cube", "Statistic", "Table", "Variable", "Value"), + database = c("all", "genesis", "zensus", "regio"), + category = c("cube", "statistic", "table", "variable", "value"), + area = c("all", "public", "user"), error.ignore = FALSE, + verbose = TRUE, + raw = FALSE, ... ) } \arguments{ -\item{code}{string with a maximum length of 15 characters. Code from a Genesis-Object. Only one code per iteration.} +\item{code}{String with a maximum length of 10 characters for a database object (GENESIS and regionalstatistik.de) and 15 characters for a Zensus 2022 object. Only one code per iteration. "*" notations are possible.} -\item{category}{a string. Specific object-types: 'Cube', 'Statistic', "Table", "Variable" and 'Value'. The function needs a specified object type.} +\item{database}{Character string. Indicator if the GENESIS ('genesis'), Zensus 2022 ('zensus') or regionalstatistik.de ('regio') database is called. Only one database can be addressed per function call. Default option is 'genesis'.} -\item{error.ignore}{a logical. Indicator if the function should stop if an error occurs or no object for the request is found or if it should produce a token as response.} +\item{category}{Character string. Specify specific GENESIS/regionalstatistik.de object types ('tables', 'statistics' and 'cubes') and specific Zensus 2022 object types ('tables' and 'statistics'). All types that are specific for one database can be used together. Default option is to use all types that are possible for the specific database.} -\item{...}{Additional parameters for the Genesis API call. These parameters are only affecting the Genesis call itself, no further processing. For more details see \code{vignette("additional_parameter")}.} +\item{area}{Character string. Indicator from which area of the database the results are called. In general, 'all' is the appropriate solution. Default option is 'all'. Not used for 'statistics'.} + +\item{error.ignore}{Boolean. Indicator if the function should stop if an error occurs or no object for the request is found or if it should produce a token as response. Default option is 'FALSE'.} + +\item{verbose}{Boolean. Indicator if the output of the function should include detailed messages and warnings. Default option is 'TRUE'. Set the parameter to 'FALSE' to suppress additional messages and warnings.} + +\item{raw}{Boolean. Should a non-parsed API response be returned?} + +\item{...}{Additional parameters for the API call. These parameters are only affecting the call itself, no further processing. For more details see \code{vignette("additional_parameter")}.} } \value{ -A list with all recalled elements from Genesis. Attributes are added to the dataframe describing the search configuration for the returned output. +A list with all recalled elements from the API. Attributes are added to the data.frame describing the search configuration for the returned output. } \description{ Search For Meta-Information For All Types Of Objects @@ -29,7 +41,7 @@ Search For Meta-Information For All Types Of Objects \examples{ \dontrun{ # Find meta-information of the table with the code "11111" -object <- gen_metadata(code = "11111", category = "Table") +object <- gen_metadata(code = "11111", category = "table") } } diff --git a/man/gen_metadata_cube.Rd b/man/gen_metadata_cube.Rd index 9c45f9a..b78cbb1 100644 --- a/man/gen_metadata_cube.Rd +++ b/man/gen_metadata_cube.Rd @@ -4,20 +4,36 @@ \alias{gen_metadata_cube} \title{gen_metadata_cube} \usage{ -gen_metadata_cube(code = NULL, error.ignore = FALSE, ...) +gen_metadata_cube( + code = NULL, + database = c("all", "genesis", "regio"), + error.ignore = FALSE, + area = c("all", "public", "user"), + verbose = TRUE, + raw = raw, + ... +) } \arguments{ -\item{code}{a string with a maximum length of 15 characters. Code from a Genesis-Object. Only one code per iteration.} +\item{code}{A character string with a maximum length of 15 characters. Code from a GENESIS or regionalstatistik.de object. Only one code per iteration.} -\item{error.ignore}{a logical. Indicator if the function should stop if an error occurs or no object for the request is found or if it should produce a token as response.} +\item{database}{Character string. Indicator if the GENESIS ('genesis') or regionalstatistik.de ('regio') database is called. Only one database can be addressed per function call. Default option is 'genesis'.} -\item{...}{Additional parameters for the Genesis API call. These parameters are only affecting the Genesis call itself, no further processing. For more details see \code{vignette("additional_parameter")}.} +\item{error.ignore}{Boolean. Indicator if the function should stop if an error occurs or no object for the request is found or if it should produce a token as response. Default option is 'FALSE'.} + +\item{area}{Character string. Indicator from which area of the database the results are called. In general, 'all' is the appropriate solution. Default option is 'all'. Not used for 'statistics'.} + +\item{verbose}{Boolean. Indicator if the output of the function should include detailed messages and warnings. Default option is 'TRUE'. Set the parameter to 'FALSE' to suppress additional messages and warnings.} + +\item{raw}{Boolean. Should a non-parsed API response be returned?} + +\item{...}{Additional parameters for the API call. These parameters are only affecting the call itself, no further processing. For more details see \code{vignette("additional_parameter")}.} } \value{ -A list with all recalled elements from Genesis. Attributes are added to the dataframe describing the search configuration for the returned output. +A list with all recalled elements from the API. Attributes are added to the data.frame describing the search configuration for the returned output. } \description{ -Function to search for meta-information for a specific cube. +Function to search for meta information for a specific cube. Usable only for GENESIS and regionalstatistik.de. } \examples{ \dontrun{ diff --git a/man/gen_metadata_statistic.Rd b/man/gen_metadata_statistic.Rd new file mode 100644 index 0000000..aa4ec0a --- /dev/null +++ b/man/gen_metadata_statistic.Rd @@ -0,0 +1,44 @@ +% Generated by roxygen2: do not edit by hand +% Please edit documentation in R/gen_meta_data.R +\name{gen_metadata_statistic} +\alias{gen_metadata_statistic} +\title{gen_metadata_statistic} +\usage{ +gen_metadata_statistic( + code = NULL, + database = c("all", "genesis", "zensus", "regio"), + area = c("all", "public", "user"), + error.ignore = FALSE, + verbose = TRUE, + raw = FALSE, + ... +) +} +\arguments{ +\item{code}{A character string with a maximum length of 15 characters. Code from a GENESIS, Zensus 2022 or regionalstatistik.de object. Only one code per iteration.} + +\item{database}{Character string. Indicator if the GENESIS ('genesis'), Zensus 2022 ('zensus') or regionalstatistik.de ('regio') database is called. Only one database can be addressed per function call. Default option is 'genesis'.} + +\item{area}{Character string. Indicator from which area of the database the results are called. In general, 'all' is the appropriate solution. Default option is 'all'. Not used for 'statistics'.} + +\item{error.ignore}{Boolean. Indicator if the function should stop if an error occurs or no object for the request is found or if it should produce a token as response. Default option is 'FALSE'.} + +\item{verbose}{Boolean. Indicator if the output of the function should include detailed messages and warnings. Default option is 'TRUE'. Set the parameter to 'FALSE' to suppress additional messages and warnings.} + +\item{raw}{Boolean. Should a non-parsed API response be returned?} + +\item{...}{Additional parameters for the API call. These parameters are only affecting the call itself, no further processing. For more details see \code{vignette("additional_parameter")}.} +} +\value{ +A list with all recalled elements from the API. Attributes are added to the data.frame describing the search configuration for the returned output. +} +\description{ +Function to search for meta information for a specific statistic. +} +\examples{ +\dontrun{ +# Find meta-information of the statistic with the code "12411" +object <- gen_metadata_stats(code = "12411") +} + +} diff --git a/man/gen_metadata_stats.Rd b/man/gen_metadata_stats.Rd deleted file mode 100644 index f3448d7..0000000 --- a/man/gen_metadata_stats.Rd +++ /dev/null @@ -1,28 +0,0 @@ -% Generated by roxygen2: do not edit by hand -% Please edit documentation in R/gen_meta_data.R -\name{gen_metadata_stats} -\alias{gen_metadata_stats} -\title{gen_metadata_stat} -\usage{ -gen_metadata_stats(code = NULL, error.ignore = FALSE, ...) -} -\arguments{ -\item{code}{a string with a maximum length of 15 characters. Code from a Genesis-Object. Only one code per iteration.} - -\item{error.ignore}{a logical. Indicator if the function should stop if an error occurs or no object for the request is found or if it should produce a token as response.} - -\item{...}{Additional parameters for the Genesis API call. These parameters are only affecting the Genesis call itself, no further processing. For more details see \code{vignette("additional_parameter")}.} -} -\value{ -A list with all recalled elements from Genesis. Attributes are added to the dataframe describing the search configuration for the returned output. -} -\description{ -Function to search for meta-information for a specific statistic. -} -\examples{ -\dontrun{ -# Find meta-information of the statistic with the code "12411" -object <- gen_metadata_stats(code = "12411") -} - -} diff --git a/man/gen_metadata_tab.Rd b/man/gen_metadata_tab.Rd deleted file mode 100644 index 872ddc6..0000000 --- a/man/gen_metadata_tab.Rd +++ /dev/null @@ -1,28 +0,0 @@ -% Generated by roxygen2: do not edit by hand -% Please edit documentation in R/gen_meta_data.R -\name{gen_metadata_tab} -\alias{gen_metadata_tab} -\title{gen_metadata_tab} -\usage{ -gen_metadata_tab(code = NULL, error.ignore = FALSE, ...) -} -\arguments{ -\item{code}{a string with a maximum length of 15 characters. Code from a Genesis-Object. Only one code per iteration.} - -\item{error.ignore}{a logical. Indicator if the function should stop if an error occurs or no object for the request is found or if it should produce a token as response.} - -\item{...}{Additional parameters for the Genesis API call. These parameters are only affecting the Genesis call itself, no further processing. For more details see \code{vignette("additional_parameter")}.} -} -\value{ -A list with all recalled elements from Genesis. Attributes are added to the dataframe describing the search configuration for the returned output. -} -\description{ -Function to search for meta-information for a specific table. -} -\examples{ -\dontrun{ -# Find meta-information of the table with the code "11111" -object <- gen_metadata_tab(code = "11111") -} - -} diff --git a/man/gen_metadata_table.Rd b/man/gen_metadata_table.Rd new file mode 100644 index 0000000..38c3bfd --- /dev/null +++ b/man/gen_metadata_table.Rd @@ -0,0 +1,44 @@ +% Generated by roxygen2: do not edit by hand +% Please edit documentation in R/gen_meta_data.R +\name{gen_metadata_table} +\alias{gen_metadata_table} +\title{gen_metadata_table} +\usage{ +gen_metadata_table( + code = NULL, + database = c("all", "genesis", "zensus", "regio"), + area = c("all", "public", "user"), + error.ignore = FALSE, + verbose = TRUE, + raw = FALSE, + ... +) +} +\arguments{ +\item{code}{A character string with a maximum length of 15 characters. Code from a GENESIS, Zensus 2022 or regionalstatistik.de object. Only one code per iteration.} + +\item{database}{Character string. Indicator if the GENESIS ('genesis'), Zensus 2022 ('zensus') or regionalstatistik.de ('regio') database is called. Only one database can be addressed per function call. Default option is 'genesis'.} + +\item{area}{Character string. Indicator from which area of the database the results are called. In general, 'all' is the appropriate solution. Default option is 'all'. Not used for 'statistics'.} + +\item{error.ignore}{Boolean. Indicator if the function should stop if an error occurs or no object for the request is found or if it should produce a token as response. Default option is 'FALSE'.} + +\item{verbose}{Boolean. Indicator if the output of the function should include detailed messages and warnings. Default option is 'TRUE'. Set the parameter to 'FALSE' to suppress additional messages and warnings.} + +\item{raw}{Boolean. Should a non-parsed API response be returned?} + +\item{...}{Additional parameters for the API call. These parameters are only affecting the call itself, no further processing. For more details see \code{vignette("additional_parameter")}.} +} +\value{ +A list with all recalled elements from the API. Attributes are added to the data.frame describing the search configuration for the returned output. +} +\description{ +Function to search for meta information for a specific table. +} +\examples{ +\dontrun{ +# Find meta-information of the table with the code "11111" +object <- gen_metadata_tab(code = "11111") +} + +} diff --git a/man/gen_metadata_val.Rd b/man/gen_metadata_val.Rd deleted file mode 100644 index e81bb3e..0000000 --- a/man/gen_metadata_val.Rd +++ /dev/null @@ -1,28 +0,0 @@ -% Generated by roxygen2: do not edit by hand -% Please edit documentation in R/gen_meta_data.R -\name{gen_metadata_val} -\alias{gen_metadata_val} -\title{gen_metadata_val} -\usage{ -gen_metadata_val(code = NULL, error.ignore = FALSE, ...) -} -\arguments{ -\item{code}{a string with a maximum length of 15 characters. Code from a Genesis-Object. Only one code per iteration.} - -\item{error.ignore}{a logical. Indicator if the function should stop if an error occurs or no object for the request is found or if it should produce a token as response.} - -\item{...}{Additional parameters for the Genesis API call. These parameters are only affecting the Genesis call itself, no further processing. For more details see \code{vignette("additional_parameter")}.} -} -\value{ -A list with all recalled elements from Genesis. Attributes are added to the dataframe describing the search configuration for the returned output. -} -\description{ -Function to search for meta-information for a specific value. -} -\examples{ -\dontrun{ -# Find meta-information of the value with the code "LEDIG" -object <- gen_metadata_val(code = "LEDIG") -} - -} diff --git a/man/gen_metadata_value.Rd b/man/gen_metadata_value.Rd new file mode 100644 index 0000000..7badb51 --- /dev/null +++ b/man/gen_metadata_value.Rd @@ -0,0 +1,44 @@ +% Generated by roxygen2: do not edit by hand +% Please edit documentation in R/gen_meta_data.R +\name{gen_metadata_value} +\alias{gen_metadata_value} +\title{gen_metadata_value} +\usage{ +gen_metadata_value( + code = NULL, + database = c("all", "genesis", "zensus", "regio"), + area = c("all", "public", "user"), + error.ignore = FALSE, + verbose = TRUE, + raw = FALSE, + ... +) +} +\arguments{ +\item{code}{A character string with a maximum length of 15 characters. Code from a GENESIS, Zensus 2022 or regionalstatistik.de object. Only one code per iteration.} + +\item{database}{Character string. Indicator if the GENESIS ('genesis'), Zensus 2022 ('zensus') or regionalstatistik.de ('regio') database is called. Only one database can be addressed per function call. Default option is 'genesis'.} + +\item{area}{Character string. Indicator from which area of the database the results are called. In general, 'all' is the appropriate solution. Default option is 'all'. Not used for 'statistics'.} + +\item{error.ignore}{Boolean. Indicator if the function should stop if an error occurs or no object for the request is found or if it should produce a token as response. Default option is 'FALSE'.} + +\item{verbose}{Boolean. Indicator if the output of the function should include detailed messages and warnings. Default option is 'TRUE'. Set the parameter to 'FALSE' to suppress additional messages and warnings.} + +\item{raw}{Boolean. Should a non-parsed API response be returned?} + +\item{...}{Additional parameters for the API call. These parameters are only affecting the call itself, no further processing. For more details see \code{vignette("additional_parameter")}.} +} +\value{ +A list with all recalled elements from the API. Attributes are added to the data.frame describing the search configuration for the returned output. +} +\description{ +Function to search for meta information for a specific value. +} +\examples{ +\dontrun{ +# Find meta-information of the value with the code "LEDIG" +object <- gen_metadata_val(code = "LEDIG") +} + +} diff --git a/man/gen_metadata_var.Rd b/man/gen_metadata_var.Rd deleted file mode 100644 index 4a301c2..0000000 --- a/man/gen_metadata_var.Rd +++ /dev/null @@ -1,28 +0,0 @@ -% Generated by roxygen2: do not edit by hand -% Please edit documentation in R/gen_meta_data.R -\name{gen_metadata_var} -\alias{gen_metadata_var} -\title{gen_metadata_var} -\usage{ -gen_metadata_var(code = NULL, error.ignore = FALSE, ...) -} -\arguments{ -\item{code}{a string with a maximum length of 15 characters. Code from a Genesis-Object. Only one code per iteration. "*"-Notation is possible.} - -\item{error.ignore}{a logical. Indicator if the function should stop if an error occurs or no object for the request is found or if it should produce a token as response.} - -\item{...}{Additional parameters for the Genesis API call. These parameters are only affecting the Genesis call itself, no further processing. For more details see \code{vignette("additional_parameter")}.} -} -\value{ -A list with all recalled elements from Genesis. Attributes are added to the dataframe describing the search configuration for the returned output. -} -\description{ -Function to search for meta-information for a specific variable. -} -\examples{ -\dontrun{ -# Find meta-information of the variable with the code "FAMSTD" -object <- gen_metadata_var(code = "FAMSTD") -} - -} diff --git a/man/gen_metadata_variable.Rd b/man/gen_metadata_variable.Rd new file mode 100644 index 0000000..692c70e --- /dev/null +++ b/man/gen_metadata_variable.Rd @@ -0,0 +1,44 @@ +% Generated by roxygen2: do not edit by hand +% Please edit documentation in R/gen_meta_data.R +\name{gen_metadata_variable} +\alias{gen_metadata_variable} +\title{gen_metadata_variable} +\usage{ +gen_metadata_variable( + code = NULL, + database = c("all", "genesis", "zensus", "regio"), + area = c("all", "public", "user"), + error.ignore = FALSE, + verbose = TRUE, + raw = FALSE, + ... +) +} +\arguments{ +\item{code}{A character string with a maximum length of 15 characters. Code from a GENESIS, Zensus 2022 or regionalstatistik.de object. Only one code per iteration.} + +\item{database}{Character string. Indicator if the GENESIS ('genesis'), Zensus 2022 ('zensus') or regionalstatistik.de ('regio') database is called. Only one database can be addressed per function call. Default option is 'genesis'.} + +\item{area}{Character string. Indicator from which area of the database the results are called. In general, 'all' is the appropriate solution. Default option is 'all'. Not used for 'statistics'.} + +\item{error.ignore}{Boolean. Indicator if the function should stop if an error occurs or no object for the request is found or if it should produce a token as response. Default option is 'FALSE'.} + +\item{verbose}{Boolean. Indicator if the output of the function should include detailed messages and warnings. Default option is 'TRUE'. Set the parameter to 'FALSE' to suppress additional messages and warnings.} + +\item{raw}{Boolean. Should a non-parsed API response be returned?} + +\item{...}{Additional parameters for the API call. These parameters are only affecting the call itself, no further processing. For more details see \code{vignette("additional_parameter")}.} +} +\value{ +A list with all recalled elements from the API. Attributes are added to the data.frame describing the search configuration for the returned output. +} +\description{ +Function to search for meta information for a specific variable. +} +\examples{ +\dontrun{ +# Find meta-information of the variable with the code "FAMSTD" +object <- gen_metadata_var(code = "FAMSTD") +} + +} diff --git a/man/gen_modified_data.Rd b/man/gen_modified_data.Rd index dd3cc69..5cdbebc 100644 --- a/man/gen_modified_data.Rd +++ b/man/gen_modified_data.Rd @@ -2,29 +2,35 @@ % Please edit documentation in R/gen_modified_data.R \name{gen_modified_data} \alias{gen_modified_data} -\title{gen_modified_data: Explore New Added Objects or Changed Objects in Genesis} +\title{gen_modified_data} \usage{ gen_modified_data( code = "", + database = c("all", "genesis", "zensus", "regio"), type = c("all", "tables", "statistics", "statisticsUpdates"), date = c("now", "week_before", "month_before", "year_before"), + verbose = TRUE, ... ) } \arguments{ -\item{code}{a string with a maximum length of 15 characters. Code from a Genesis object. Only one code per iteration. "*" notations are possible. Empty code (default value) includes all changes, updates, and new added objects.} +\item{code}{A character string with a maximum length of 15 characters. Code from a GENESIS, Zensus 2022 or regionalstatistik.de object. Only one code per iteration.} -\item{type}{a string. Specific Genesis object type: 'tables', 'statistics', and 'statisticsUpdates'. All three can be accessed through "all", which is the default.} +\item{database}{Character string. Indicator if the GENESIS ('genesis'), Zensus 2022 ('zensus') or regionalstatistik.de ('regio') database is called. Only one database can be addressed per function call. Default option is 'genesis'.} -\item{date}{a string. Specific date that is used as the last update or upload time in Genesis to include a Genesis object in return. Default option is 'now', which uses the current date of your system. Alternative options are 'week_before', using the current date of your system minus 7 days, 'month_before', using the current date of your system minus 4 weeks, and 'year_before', using the current date of your system minus 52 weeks. Additionally, it is possible to fill in a specific date of format 'DD.MM.YYYY'.} +\item{type}{Character string. Specific GENESIS and regionalstatistik.de object types: 'tables', 'statistics', and 'statisticsUpdates'. Specific Zensus 2022 object types: 'tables' and 'statistics'. All types that are specific for one database can be used together through 'all', which is the default.} -\item{...}{Additional parameters for the Genesis API call. These parameters are only affecting the Genesis call itself, no further processing. For more details see \code{vignette("additional_parameter")}.} +\item{date}{Character string. Specific date that is used as the last update or upload time to include an object in return. Default option is 'now', which uses the current date of your system. Alternative options are 'week_before', using the current date of your system minus 7 days, 'month_before', using the current date of your system minus 4 weeks, and 'year_before', using the current date of your system minus 52 weeks. Additionally, it is possible to fill in a specific date of format 'DD.MM.YYYY'.} + +\item{verbose}{Boolean. Indicator if the output of the function should include detailed messages and warnings. Default option is 'TRUE'. Set the parameter to 'FALSE' to suppress additional messages and warnings.} + +\item{...}{Additional parameters for the API call. These parameters are only affecting the call itself, no further processing. For more details see \code{vignette("additional_parameter")}.} } \value{ -A list with all recalled elements from Genesis. Always includes the code of the object, the title, and the type of the object. This is done to facilitate further processing with the data. Attributes are added to the data.frame describing the search configuration for the returned output. +A list with all recalled elements from the API. Always includes the code of the object, the title, and the type of the object. This is done to facilitate further processing with the data. Attributes are added to the data.frame describing the search configuration for the returned output. } \description{ -Function to check for updates, changes, or new objects in Genesis based on a specific date. +Function to check for updates, changes, or new objects based on a specific date. } \examples{ \dontrun{ diff --git a/man/gen_objects2stat.Rd b/man/gen_objects2stat.Rd index 01662c9..19cb85c 100644 --- a/man/gen_objects2stat.Rd +++ b/man/gen_objects2stat.Rd @@ -2,32 +2,44 @@ % Please edit documentation in R/gen_objects2stat.R \name{gen_objects2stat} \alias{gen_objects2stat} -\title{gen_objects2stat: Get Objects Related To Statistics} +\title{gen_objects2stat} \usage{ gen_objects2stat( code = NULL, + database = c("all", "genesis", "zensus", "regio"), category = c("tables", "variables", "cubes"), + area = c("all", "public", "user"), detailed = FALSE, error.ignore = FALSE, + sortcriterion = c("code", "content"), + verbose = TRUE, ... ) } \arguments{ -\item{code}{a string with a maximum length of 6 characters (15 characters if cubes are not used as a category). Code from a Genesis-Object. Only one code per iteration.} +\item{code}{Character string with a maximum length of 6 characters (15 characters if 'cubes' are not used as a category). Code from a GENESIS, Zensus 2022 or regionalstatistik.de object. Only one code per iteration.} -\item{category}{a string. Specific object-types: 'tables', 'variables', and 'cubes'. All three together are possible and the default option.} +\item{database}{Character string. Indicator if the GENESIS ('genesis'), Zensus 2022 ('zensus') or regionalstatistik.de ('regio') database is called. Only one database can be addressed per function call. Default option is 'genesis'.} -\item{detailed}{a logical. Indicator if function should return the detailed output of the iteration including all object-related information or only a shortened output including only code and object title. The default is detailed = FALSE.} +\item{category}{Character string. Specify specific GENESIS/regionalstatistik.de object types ('tables', 'statistics' and 'cubes') and specific Zensus 2022 object types ('tables' and 'statistics'). All types that are specific for one database can be used together. Default option is to use all types that are possible for the specific database.} -\item{error.ignore}{a logical. Indicator if the function should stop if an error occurs or no object for the request is found or if it should produce a token as response.} +\item{area}{Character string. Indicator from which area of the database the results are called. In general, 'all' is the appropriate solution. Default option is 'all'. Not used for 'statistics'.} -\item{...}{Additional parameters for the Genesis API call. These parameters are only affecting the Genesis call itself, no further processing. For more details see \code{vignette("additional_parameter")}.} +\item{detailed}{Boolean. Indicator if the function should return the detailed output of the iteration including all object-related information or only a shortened output including only code and object title. Default option is 'FALSE'.} + +\item{error.ignore}{Boolean. Indicator if the function should stop if an error occurs or no object for the request is found or if it should produce a token as response. Default option is 'FALSE'.} + +\item{sortcriterion}{Character string. Indicator if the output should be sorted by 'code' or 'content'. This is a parameter of the API call itself. The default is 'code'.} + +\item{verbose}{Boolean. Indicator if the output of the function should include detailed messages and warnings. Default option is 'TRUE'. Set the parameter to 'FALSE' to suppress additional messages and warnings.} + +\item{...}{Additional parameters for the API call. These parameters are only affecting the call itself, no further processing. For more details see \code{vignette("additional_parameter")}.} } \value{ -A list with all recalled elements from Genesis Based on the detailed-parameter it contains more or less information, but always includes the code of the object, the title, and the type of the object. This is done to facilitate further processing of the data. Attributes are added to the dataframe describing the search configuration for the returned output. +A list with all recalled elements from the API. Based on the 'detailed' parameter it contains more or less information, but always includes the code of the object, the title, and the type of the object. This is done to facilitate further processing with the data. Attributes are added to the data.frame describing the search configuration for the returned output. } \description{ -Function to find objects related to a statistic in Genesis. +Function to find objects related to a statistic } \examples{ \dontrun{ diff --git a/man/gen_objects2var.Rd b/man/gen_objects2var.Rd index a364c79..cc38a64 100644 --- a/man/gen_objects2var.Rd +++ b/man/gen_objects2var.Rd @@ -2,32 +2,44 @@ % Please edit documentation in R/gen_objects2var.R \name{gen_objects2var} \alias{gen_objects2var} -\title{gen_objects2var: Get Objects Related To Variable} +\title{gen_objects2var} \usage{ gen_objects2var( code = NULL, + database = c("all", "genesis", "zensus", "regio"), category = c("tables", "statistics", "cubes"), + area = c("all", "public", "user"), detailed = FALSE, error.ignore = FALSE, + sortcriterion = c("code", "content"), + verbose = TRUE, ... ) } \arguments{ -\item{code}{a string with a maximum length of 15 characters. Code from a Genesis-Object. Only one code per iteration.} +\item{code}{Character string with a maximum length of 15 characters. Code from a GENESIS, Zensus 2022 or regionalstatistik.de object. Only one code per iteration.} -\item{category}{a string. Specific object-types: 'tables', 'statistics', and 'cubes'. All three together are possible and the default option.} +\item{database}{Character string. Indicator if the GENESIS ('genesis'), Zensus 2022 ('zensus') or regionalstatistik.de ('regio') database is called. Only one database can be addressed per function call. Default option is 'genesis'.} -\item{detailed}{a logical. Indicator if function should return the detailed output of the iteration including all object-related information or only a shortened output including only code and object title. The default is detailed = FALSE.} +\item{category}{Character string. Specify specific GENESIS/regionalstatistik.de object types ('tables', 'statistics' and 'cubes') and specific Zensus 2022 object types ('tables' and 'statistics'). All types that are specific for one database can be used together. Default option is to use all types that are possible for the specific database.} -\item{error.ignore}{a logical. Indicator if the function should stop if an error occurs or no object for the request is found or if it should produce a token as response.} +\item{area}{Character string. Indicator from which area of the database the results are called. In general, 'all' is the appropriate solution. Default option is 'all'. Not used for 'statistics'.} -\item{...}{Additional parameters for the Genesis API call. These parameters are only affecting the Genesis call itself, no further processing. For more details see \code{vignette("additional_parameter")}.} +\item{detailed}{Boolean. Indicator if the function should return the detailed output of the iteration including all object-related information or only a shortened output including only code and object title. Default option is 'FALSE'.} + +\item{error.ignore}{Boolean. Indicator if the function should stop if an error occurs or no object for the request is found or if it should produce a token as response. Default option is 'FALSE'.} + +\item{sortcriterion}{Character string. Indicator if the output should be sorted by 'code' or 'content'. This is a parameter of the API call itself. The default is 'code'.} + +\item{verbose}{Boolean. Indicator if the output of the function should include detailed messages and warnings. Default option is 'TRUE'. Set the parameter to 'FALSE' to suppress additional messages and warnings.} + +\item{...}{Additional parameters for the API call. These parameters are only affecting the call itself, no further processing. For more details see \code{vignette("additional_parameter")}.} } \value{ -A list with all recalled elements from Genesis. Based on the detailed-parameter it contains more or less information, but always includes the code of the object, the title, and the type of the object. This is done to facilitate further processing of the data. Attributes are added to the dataframe describing the search configuration for the returned output. +A list with all recalled elements from the API. Based on the 'detailed' parameter it contains more or less information, but always includes the code of the object, the title, and the type of the object. This is done to facilitate further processing with the data. Attributes are added to the data.frame describing the search configuration for the returned output. } \description{ -Function to find objects related to a variable in Genesis. +Function to find objects related to a variable } \examples{ \dontrun{ diff --git a/man/gen_search_vars.Rd b/man/gen_search_vars.Rd index 5ef1a04..390071e 100644 --- a/man/gen_search_vars.Rd +++ b/man/gen_search_vars.Rd @@ -2,29 +2,38 @@ % Please edit documentation in R/gen_var2-val2.R \name{gen_search_vars} \alias{gen_search_vars} -\title{gen_search_vars: Search for Specific Variables} +\title{gen_search_vars} \usage{ gen_search_vars( code = NULL, + database = c("all", "genesis", "zensus", "regio"), + area = c("all", "public", "user"), sortcriterion = c("code", "content"), error.ignore = FALSE, + verbose = TRUE, ... ) } \arguments{ -\item{code}{a string with a maximum length of 6. Code from a Genesis-Object. Only one code per iteration. "*"-Notations are possibly to be used as a placeholder.} +\item{code}{Character string with a maximum length of 6 characters. Code from a GENESIS, Zensus 2022 or regionalstatistik.de object. Only one code per iteration.} -\item{sortcriterion}{a string. Indicator if the output should be sorted by 'code' or 'content'. This is a parameter of the Genesis API call itself. The default is "code".} +\item{database}{Character string. Indicator if the GENESIS ('genesis'), Zensus 2022 ('zensus') or regionalstatistik.de ('regio') database is called. Only one database can be addressed per function call. Default option is 'genesis'.} -\item{error.ignore}{a logical. Indicator if the function should stop if an error occurs or no object for the request is found or if it should produce a token as response.} +\item{area}{Character string. Indicator from which area of the database the results are called. In general, 'all' is the appropriate solution. Default option is 'all'. Not used for 'statistics'.} -\item{...}{Additional parameters for the Genesis API call. These parameters are only affecting the Genesis call itself, no further processing. For more details see \code{vignette("additional_parameter")}.} +\item{sortcriterion}{Character string. Indicator if the output should be sorted by 'code' or 'content'. This is a parameter of the API call itself. The default is 'code'.} + +\item{error.ignore}{Boolean. Indicator if the function should stop if an error occurs or no object for the request is found or if it should produce a token as response. Default option is 'FALSE'.} + +\item{verbose}{Boolean. Indicator if the output of the function should include detailed messages and warnings. Default option is 'TRUE'. Set the parameter to 'FALSE' to suppress additional messages and warnings.} + +\item{...}{Additional parameters for the API call. These parameters are only affecting the call itself, no further processing. For more details see \code{vignette("additional_parameter")}.} } \value{ -A list with all recalled elements from Genesis. Always includes the code of the object, the title, and the type of the object. This is done to facilitate further processing of the data. Attributes are added to the dataframe describing the search configuration for the returned output. +A list with all recalled elements from the API. Always includes the code of the object, the title, and the type of the object. This is done to facilitate further processing with the data. Attributes are added to the data.frame describing the search configuration for the returned output. } \description{ -Function to search for specific variables in Genesis. +Function to search for specific variables } \examples{ \dontrun{ diff --git a/man/gen_signs.Rd b/man/gen_signs.Rd new file mode 100644 index 0000000..5b39ef8 --- /dev/null +++ b/man/gen_signs.Rd @@ -0,0 +1,19 @@ +% Generated by roxygen2: do not edit by hand +% Please edit documentation in R/gen_qualitysigns.R +\name{gen_signs} +\alias{gen_signs} +\title{gen_signs} +\usage{ +gen_signs(database = c("all", "genesis", "zensus", "regio"), ...) +} +\arguments{ +\item{database}{Character string. Indicator if the GENESIS ('genesis'), Zensus 2022 ('zensus') or regionalstatistik.de ('regio') database is called. Only one database can be addressed per function call. Default option is 'genesis'.} + +\item{...}{Additional parameters for the API call. These parameters are only affecting the call itself, no further processing. For more details see \code{vignette("additional_parameter")}.} +} +\value{ +A list of all current used special signs. +} +\description{ +Function to list all currently used special signs (e.g., 0, *, X, (), p, ...) and their meaning in GENESIS, Zensus 2022 and/or regionalstatistik.de. +} diff --git a/man/gen_table.Rd b/man/gen_table.Rd index 5d4ac6f..84f3632 100644 --- a/man/gen_table.Rd +++ b/man/gen_table.Rd @@ -7,41 +7,47 @@ gen_table(name, ...) } \arguments{ -\item{name}{a string. Name of the table. Use of wildcards (\code{*}) allowed.} +\item{name}{Character string. Name/code of the table. Use of wildcards (\code{*}) is possible.} \item{...}{Optional parameters passed on to the Genesis API call: \describe{ -\item{\code{area}}{a string. The area in which the table is stored. Possible values: +\item{\code{area}}{Character string. The area in which the table is stored. Possible values: \itemize{ \item \code{"public"}: table in the public catalogue \item \code{"user"}: table in the user's account +\item \code{"all"}: both of the above }} -\item{\code{compress}}{a logical. Should empty rows and columns be discarded?} -\item{\code{transpose}}{a logical. Reshape the table between "wide" and +\item{\code{compress}}{Boolean. Should empty rows and columns be discarded?} +\item{\code{transpose}}{Boolean. Reshape the table between "wide" and "long" format.} -\item{\code{startyear,endyear}}{a number. Only retrieve data between these years.} -\item{\code{regionalvariable}}{character. Code of the regional variable +\item{\code{startyear,endyear}}{Four-digit integers. Only retrieve data between these years.} +\item{\code{regionalvariable}}{Character string. Code of the regional variable whose value is specified in \code{regionalkey} to filter the results.} -\item{\code{regionalkey}}{character. One or more regional keys. Multiple +\item{\code{regionalkey}}{Character string. One or more regional keys. Multiple values can be supplied as a character vector or as a single string, with the regional keys separated by commas. Use of wildcard (\code{*}) allowed.} \item{\code{classifyingvariable1,classifyingvariable2 - ,classifyingvariable3}}{character. Code of the subject classification + ,classifyingvariable3}}{Character string. Code of the subject classification (SK-Merkmal) to which the selection by means of the corresponding \code{classifyingkey} parameter is to be applied.} -\item{\code{classifyingkey1,classifyingkey2,classifyingkey3}}{character. +\item{\code{classifyingkey1,classifyingkey2,classifyingkey3}}{Character string. One or more values of a subject classification (e.g. "WZ93012"). Applied to the corresponding \code{classifyingvariable} parameter. Multiple keys can be supplied as a character vector or as a single string, with the keys separated by commas. Use of wildcard (\code{*}) allowed.} -\item{\code{stand}}{a string \code{"DD.MM.YYYY"}. Only retrieve data -updated after this #' date.} +\item{\code{stand}}{Character string, format: \code{"DD.MM.YYYY"}. Only retrieve data +updated after this date.} \item{\code{language}}{Search terms, returned messages and data descriptions in German (\code{"de"}) or English (\code{"en"})?} +\item{\code{job}}{Boolean. Indicate as to whether a job should be created +(not available with the 'Zensus' database).)} +\item{\code{all_character}}{Boolean. Should all variables be imported as +'character' variables? Avoids fuzzy data type conversions if there are +leading zeros or other special characters. Defaults to TRUE.} }} } \description{ -Download a table with data from Genesis +Download a table with data from GENESIS, Zensus 2022 or regionalstatistik.de databases } \examples{ \dontrun{ diff --git a/man/gen_update_evas.Rd b/man/gen_update_evas.Rd new file mode 100644 index 0000000..714a1b9 --- /dev/null +++ b/man/gen_update_evas.Rd @@ -0,0 +1,14 @@ +% Generated by roxygen2: do not edit by hand +% Please edit documentation in R/gen_update_evas.R +\name{gen_update_evas} +\alias{gen_update_evas} +\title{gen_update_evas} +\usage{ +gen_update_evas() +} +\value{ +An updated .rda file containing the latest EVAS numbers +} +\description{ +Function to web scrape the EVAS numbers from the EVAS website and save them as a .rda file. Takes no parameters. +} diff --git a/man/gen_val2var.Rd b/man/gen_val2var.Rd index f51da25..3bd4e80 100644 --- a/man/gen_val2var.Rd +++ b/man/gen_val2var.Rd @@ -2,29 +2,38 @@ % Please edit documentation in R/gen_var2-val2.R \name{gen_val2var} \alias{gen_val2var} -\title{gen_val2var: Get Values From a Variable} +\title{gen_val2var} \usage{ gen_val2var( code = NULL, + database = c("all", "genesis", "zensus", "regio"), + area = c("all", "public", "user"), sortcriterion = c("code", "content"), - error.ignore = FALSE, + error.ignore = TRUE, + verbose = TRUE, ... ) } \arguments{ -\item{code}{a string with a maximum length of 15 characters. Code from a Genesis-Object. Only one code per iteration.} +\item{code}{Character string with a maximum length of 15 characters. Code from a GENESIS, Zensus 2022 or regionalstatistik.de object. Only one code per iteration.} -\item{sortcriterion}{a string. Indicator if the output should be sorted by 'code' or 'content'. This is a parameter of the Genesis API call itself. The default is "code".} +\item{database}{Character string. Indicator if the GENESIS ('genesis'), Zensus 2022 ('zensus') or regionalstatistik.de ('regio') database is called. Only one database can be addressed per function call. Default option is 'genesis'.} -\item{error.ignore}{a logical. Indicator if the function should stop if an error occurs or no object for the request is found or if it should produce a token as response.} +\item{area}{Character string. Indicator from which area of the database the results are called. In general, 'all' is the appropriate solution. Default option is 'all'. Not used for 'statistics'.} -\item{...}{Additional parameters for the Genesis API call. These parameters are only affecting the Genesis call itself, no further processing. For more details see \code{vignette("additional_parameter")}.} +\item{sortcriterion}{Character string. Indicator if the output should be sorted by 'code' or 'content'. This is a parameter of the API call itself. The default is 'code'.} + +\item{error.ignore}{Boolean. Indicator if the function should stop if an error occurs or no object for the request is found or if it should produce a token as response. Default option is 'FALSE'.} + +\item{verbose}{Boolean. Indicator if the output of the function should include detailed messages and warnings. Default option is 'TRUE'. Set the parameter to 'FALSE' to suppress additional messages and warnings.} + +\item{...}{Additional parameters for the API call. These parameters are only affecting the call itself, no further processing. For more details see \code{vignette("additional_parameter")}.} } \value{ -A list with all recalled elements from Genesis. Always includes the code of the object, the title, and the type of the object. This is done to facilitate further processing of the data. Attributes are added to the dataframe describing the search configuration for the returned output. +A list with all recalled elements from the API. Always includes the code of the object, the title, and the type of the object. This is done to facilitate further processing with the data. Attributes are added to the data.frame describing the search configuration for the returned output. } \description{ -Function to extract the possible values from a variable from Genesis. Values for continuous variables are not extractable, so the function returns a warning message. +Function to extract the possible values from a variable. Values for continuous variables are not extractable, which is why the function returns a warning message in this case. } \examples{ \dontrun{ diff --git a/man/gen_val2var2stat.Rd b/man/gen_val2var2stat.Rd index 1ad607b..3453ef9 100644 --- a/man/gen_val2var2stat.Rd +++ b/man/gen_val2var2stat.Rd @@ -2,29 +2,41 @@ % Please edit documentation in R/gen_var2-val2.R \name{gen_val2var2stat} \alias{gen_val2var2stat} -\title{gen_val2var2stat: Get Values From a Variable From a Statistic} +\title{gen_val2var2stat} \usage{ gen_val2var2stat( code = NULL, + database = c("all", "genesis", "zensus", "regio"), + area = c("all", "public", "user"), detailed = FALSE, sortcriterion = c("code", "content"), - error.ignore = FALSE, + error.ignore.var = FALSE, + error.ignore.val = TRUE, + verbose = TRUE, ... ) } \arguments{ -\item{code}{a string with a maximum length of 15 characters. Code from a Genesis-Object. Only one code per iteration. "*"-Notations are possibly to be used as a placeholder.} +\item{code}{Character string with a maximum length of 15 characters. Code from a GENESIS, Zensus 2022 or regionalstatistik.de object. Only one code per iteration.} -\item{detailed}{a logical. Indicator if function should return the detailed output of the iteration including all object-related information or only a shortened output including only code and object title. This parameter only affects the details of the variables-related output. The default is FALSE.} +\item{database}{Character string. Indicator if the GENESIS ('genesis'), Zensus 2022 ('zensus') or regionalstatistik.de ('regio') database is called. Only one database can be addressed per function call. Default option is 'genesis'.} -\item{sortcriterion}{a string. Indicator if the output should be sorted by 'code' or 'content'. This is an parameter of the Genesis API call itself. The default is "code".} +\item{area}{Character string. Indicator from which area of the database the results are called. In general, 'all' is the appropriate solution. Default option is 'all'. Not used for 'statistics'.} -\item{error.ignore}{a logical. Indicator if the function should stop if an error occurs or no object for the request is found or if it should produce a token as response.} +\item{detailed}{Boolean. Indicator if the function should return the detailed output of the iteration including all object-related information or only a shortened output including only code and object title. Default option is 'FALSE'.} -\item{...}{Additional parameters for the Genesis API call. These parameters are only affecting the Genesis call itself, no further processing. For more details see \code{vignette("additional_parameter")}.} +\item{sortcriterion}{Character string. Indicator if the output should be sorted by 'code' or 'content'. This is a parameter of the API call itself. The default is 'code'.} + +\item{error.ignore.var}{Boolean. Indicator for variables if the function should stop if an error occurs or no object for the request is found or if it should produce a token as response. Default option is 'FALSE'.} + +\item{error.ignore.val}{Boolean. Indicator for values if the function should stop if an error occurs or no object for the request is found or if it should produce a token as response. Default option is 'TRUE', this prevents the function to stop even if a variable has no further explanation (often the case for numerical variables).} + +\item{verbose}{Boolean. Indicator if the output of the function should include detailed messages and warnings. Default option is 'TRUE'. Set the parameter to 'FALSE' to suppress additional messages and warnings.} + +\item{...}{Additional parameters for the API call. These parameters are only affecting the call itself, no further processing. For more details see \code{vignette("additional_parameter")}.} } \value{ -A list with all recalled elements from Genesis. Based on the detailed-parameter it contains more or less information, but always includes the code of the object, the title, and the type of the object. This is done to facilitate further processing of the data. Attributes are added to the dataframe describing the search configuration for the returned output. +A list with all recalled elements from the API. Based on the 'detailed' parameter it contains more or less information, but always includes the code of the object, the title, and the type of the object. This is done to facilitate further processing with the data. Attributes are added to the data.frame describing the search configuration for the returned output. } \description{ Get values from variables from a statistic. Values for continuous variables cannot be extracted, so the function returns a warning message. diff --git a/man/gen_var2stat.Rd b/man/gen_var2stat.Rd index 29f39b9..b2bb821 100644 --- a/man/gen_var2stat.Rd +++ b/man/gen_var2stat.Rd @@ -2,32 +2,41 @@ % Please edit documentation in R/gen_var2-val2.R \name{gen_var2stat} \alias{gen_var2stat} -\title{gen_var2stat: Get Variables From a Statistic} +\title{gen_var2stat} \usage{ gen_var2stat( code = NULL, + database = c("all", "genesis", "zensus", "regio"), + area = c("all", "public", "user"), detailed = FALSE, sortcriterion = c("code", "content"), error.ignore = FALSE, + verbose = TRUE, ... ) } \arguments{ -\item{code}{a string with a maximum length of 15 characters. Code from a Genesis-Object. Only one code per iteration. "*"-Notations are possibly to be used as a placeholder.} +\item{code}{Character string with a maximum length of 15 characters. Code from a GENESIS, Zensus 2022 or regionalstatistik.de object. Only one code per iteration.} -\item{detailed}{a logical. Indicator if function should return the detailed output of the iteration including all object-related information or only a shortened output including only code and object title. The default is detailed = FALSE.} +\item{database}{Character string. Indicator if the GENESIS ('genesis'), Zensus 2022 ('zensus') or regionalstatistik.de ('regio') database is called. Only one database can be addressed per function call. Default option is 'genesis'.} -\item{sortcriterion}{a string. Indicator if the output should be sorted by 'code' or 'content'. This is a parameter of the Genesis API call itself. The default is "code".} +\item{area}{Character string. Indicator from which area of the database the results are called. In general, 'all' is the appropriate solution. Default option is 'all'. Not used for 'statistics'.} -\item{error.ignore}{a logical. Indicator if the function should stop if an error occurs or no object for the request is found or if it should produce a token as response.} +\item{detailed}{Boolean. Indicator if the function should return the detailed output of the iteration including all object-related information or only a shortened output including only code and object title. Default option is 'FALSE'.} -\item{...}{Additional parameters for the Genesis API call. These parameters are only affecting the Genesis call itself, no further processing. For more details see \code{vignette("additional_parameter")}.} +\item{sortcriterion}{Character string. Indicator if the output should be sorted by 'code' or 'content'. This is a parameter of the API call itself. The default is 'code'.} + +\item{error.ignore}{Boolean. Indicator if the function should stop if an error occurs or no object for the request is found or if it should produce a token as response. Default option is 'FALSE'.} + +\item{verbose}{Boolean. Indicator if the output of the function should include detailed messages and warnings. Default option is 'TRUE'. Set the parameter to 'FALSE' to suppress additional messages and warnings.} + +\item{...}{Additional parameters for the API call. These parameters are only affecting the call itself, no further processing. For more details see \code{vignette("additional_parameter")}.} } \value{ -A list with all recalled elements from Genesis. Based on the detailed-parameter it contains more or less information, but always includes the code of the object, the title, and the type of the object. This is done to facilitate further processing of the data. Attributes are added to the dataframe describing the search configuration for the returned output. +A list with all recalled elements from the API. Based on the 'detailed' parameter it contains more or less information, but always includes the code of the object, the title, and the type of the object. This is done to facilitate further processing with the data. Attributes are added to the data.frame describing the search configuration for the returned output. } \description{ -Function to generate variables from statistics in Genesis. +Function to generate variables from statistics } \examples{ \dontrun{ diff --git a/man/ggsub.Rd b/man/ggsub.Rd new file mode 100644 index 0000000..d895d1e --- /dev/null +++ b/man/ggsub.Rd @@ -0,0 +1,14 @@ +% Generated by roxygen2: do not edit by hand +% Please edit documentation in R/utils_dataprocessing.R +\name{ggsub} +\alias{ggsub} +\title{ggsub} +\usage{ +ggsub(x) +} +\arguments{ +\item{x}{Element to subset with $Content} +} +\description{ +ggsub +} diff --git a/man/is_cube_metadata_header.Rd b/man/is_cube_metadata_header.Rd new file mode 100644 index 0000000..7b12709 --- /dev/null +++ b/man/is_cube_metadata_header.Rd @@ -0,0 +1,14 @@ +% Generated by roxygen2: do not edit by hand +% Please edit documentation in R/gen_cube.R +\name{is_cube_metadata_header} +\alias{is_cube_metadata_header} +\title{is_cube_metadata_header} +\usage{ +is_cube_metadata_header(lines) +} +\arguments{ +\item{lines}{Lines to check for header} +} +\description{ +is_cube_metadata_header +} diff --git a/man/logincheck_http_error.Rd b/man/logincheck_http_error.Rd new file mode 100644 index 0000000..75e1cf1 --- /dev/null +++ b/man/logincheck_http_error.Rd @@ -0,0 +1,19 @@ +% Generated by roxygen2: do not edit by hand +% Please edit documentation in R/utils_httr2.R +\name{logincheck_http_error} +\alias{logincheck_http_error} +\title{logincheck_http_error} +\usage{ +logincheck_http_error(database, verbose) +} +\arguments{ +\item{database}{The user input to 'gen_logincheck'} + +\item{verbose}{Boolean. Should the function message in case of success?} +} +\value{ +Informative error/warning messages + invisibly TRUE/FALSE +} +\description{ +logincheck_http_error +} diff --git a/man/logincheck_stop_or_warn.Rd b/man/logincheck_stop_or_warn.Rd new file mode 100644 index 0000000..0c966d0 --- /dev/null +++ b/man/logincheck_stop_or_warn.Rd @@ -0,0 +1,23 @@ +% Generated by roxygen2: do not edit by hand +% Please edit documentation in R/utils_httr2.R +\name{logincheck_stop_or_warn} +\alias{logincheck_stop_or_warn} +\title{logincheck_stop_or_warn} +\usage{ +logincheck_stop_or_warn(response, error, verbose, database) +} +\arguments{ +\item{response}{A HTTP response object} + +\item{error}{Boolean. Should the function warn or throw an error?} + +\item{verbose}{Boolean. Should the function message in case of success?} + +\item{database}{The database that the check should be run for} +} +\value{ +In case of failure warns or errors. Invisibly returns TRUE (success) or FALSE (failure) +} +\description{ +logincheck_stop_or_warn +} diff --git a/man/param_check_regionalkey.Rd b/man/param_check_regionalkey.Rd new file mode 100644 index 0000000..551318a --- /dev/null +++ b/man/param_check_regionalkey.Rd @@ -0,0 +1,14 @@ +% Generated by roxygen2: do not edit by hand +% Please edit documentation in R/utils_dataprocessing.R +\name{param_check_regionalkey} +\alias{param_check_regionalkey} +\title{param_check_regionalkey} +\usage{ +param_check_regionalkey(regionalkey) +} +\arguments{ +\item{regionalkey}{Regional key} +} +\description{ +param_check_regionalkey +} diff --git a/man/param_check_year.Rd b/man/param_check_year.Rd new file mode 100644 index 0000000..83f01cd --- /dev/null +++ b/man/param_check_year.Rd @@ -0,0 +1,14 @@ +% Generated by roxygen2: do not edit by hand +% Please edit documentation in R/utils_dataprocessing.R +\name{param_check_year} +\alias{param_check_year} +\title{param_check_year} +\usage{ +param_check_year(year) +} +\arguments{ +\item{year}{Year as parameter value} +} +\description{ +param_check_year +} diff --git a/man/param_collapse_vec.Rd b/man/param_collapse_vec.Rd new file mode 100644 index 0000000..f1d4182 --- /dev/null +++ b/man/param_collapse_vec.Rd @@ -0,0 +1,14 @@ +% Generated by roxygen2: do not edit by hand +% Please edit documentation in R/utils_dataprocessing.R +\name{param_collapse_vec} +\alias{param_collapse_vec} +\title{param_collapse_vec} +\usage{ +param_collapse_vec(vec) +} +\arguments{ +\item{vec}{Vector to be collapsed} +} +\description{ +param_collapse_vec +} diff --git a/man/read_cube.Rd b/man/read_cube.Rd new file mode 100644 index 0000000..fe3aa0a --- /dev/null +++ b/man/read_cube.Rd @@ -0,0 +1,14 @@ +% Generated by roxygen2: do not edit by hand +% Please edit documentation in R/gen_cube.R +\name{read_cube} +\alias{read_cube} +\title{read_cube} +\usage{ +read_cube(resp) +} +\arguments{ +\item{resp}{API response object resulting from a call to 'data/cubefile'} +} +\description{ +read_cube +} diff --git a/man/read_cube_block.Rd b/man/read_cube_block.Rd new file mode 100644 index 0000000..caa66f0 --- /dev/null +++ b/man/read_cube_block.Rd @@ -0,0 +1,14 @@ +% Generated by roxygen2: do not edit by hand +% Please edit documentation in R/gen_cube.R +\name{read_cube_block} +\alias{read_cube_block} +\title{read_cube_block} +\usage{ +read_cube_block(lines) +} +\arguments{ +\item{lines}{Lines to read as header} +} +\description{ +read_cube_block +} diff --git a/man/read_cube_data_lines.Rd b/man/read_cube_data_lines.Rd new file mode 100644 index 0000000..64f5578 --- /dev/null +++ b/man/read_cube_data_lines.Rd @@ -0,0 +1,16 @@ +% Generated by roxygen2: do not edit by hand +% Please edit documentation in R/gen_cube.R +\name{read_cube_data_lines} +\alias{read_cube_data_lines} +\title{read_cube_data_lines} +\usage{ +read_cube_data_lines(lines, col_names) +} +\arguments{ +\item{lines}{Lines to read data from} + +\item{col_names}{Specify column names} +} +\description{ +read_cube_data_lines +} diff --git a/man/read_cube_metadata_header.Rd b/man/read_cube_metadata_header.Rd new file mode 100644 index 0000000..46789ce --- /dev/null +++ b/man/read_cube_metadata_header.Rd @@ -0,0 +1,16 @@ +% Generated by roxygen2: do not edit by hand +% Please edit documentation in R/gen_cube.R +\name{read_cube_metadata_header} +\alias{read_cube_metadata_header} +\title{read_cube_metadata_header} +\usage{ +read_cube_metadata_header(line, rename_dups = TRUE) +} +\arguments{ +\item{line}{Line to read} + +\item{rename_dups}{Rename duplicates?} +} +\description{ +read_cube_metadata_header +} diff --git a/man/rename_cube_data_columns.Rd b/man/rename_cube_data_columns.Rd new file mode 100644 index 0000000..1ffd4ab --- /dev/null +++ b/man/rename_cube_data_columns.Rd @@ -0,0 +1,14 @@ +% Generated by roxygen2: do not edit by hand +% Please edit documentation in R/gen_cube.R +\name{rename_cube_data_columns} +\alias{rename_cube_data_columns} +\title{rename_cube_data_columns} +\usage{ +rename_cube_data_columns(cube) +} +\arguments{ +\item{cube}{A cube object to rename the columns in} +} +\description{ +rename_cube_data_columns +} diff --git a/man/resp_check_data.Rd b/man/resp_check_data.Rd new file mode 100644 index 0000000..cc1deb2 --- /dev/null +++ b/man/resp_check_data.Rd @@ -0,0 +1,14 @@ +% Generated by roxygen2: do not edit by hand +% Please edit documentation in R/utils_httr2.R +\name{resp_check_data} +\alias{resp_check_data} +\title{resp_check_data} +\usage{ +resp_check_data(resp) +} +\arguments{ +\item{resp}{Response object} +} +\description{ +resp_check_data +} diff --git a/man/return_table_object.Rd b/man/return_table_object.Rd new file mode 100644 index 0000000..3922872 --- /dev/null +++ b/man/return_table_object.Rd @@ -0,0 +1,20 @@ +% Generated by roxygen2: do not edit by hand +% Please edit documentation in R/utils_httr2.R +\name{return_table_object} +\alias{return_table_object} +\title{return_table_object} +\usage{ +return_table_object(response, response_type, language, all_character) +} +\arguments{ +\item{response}{Response object} + +\item{response_type}{Response type} + +\item{language}{Language locale} + +\item{all_character}{Read all variables as character?} +} +\description{ +return_table_object +} diff --git a/man/rev_database_function.Rd b/man/rev_database_function.Rd new file mode 100644 index 0000000..4ed4acd --- /dev/null +++ b/man/rev_database_function.Rd @@ -0,0 +1,14 @@ +% Generated by roxygen2: do not edit by hand +% Please edit documentation in R/utils_dataprocessing.R +\name{rev_database_function} +\alias{rev_database_function} +\title{rev_database_function} +\usage{ +rev_database_function(input) +} +\arguments{ +\item{input}{Input to test for database name} +} +\description{ +rev_database_function +} diff --git a/man/spezifisch_create.Rd b/man/spezifisch_create.Rd new file mode 100644 index 0000000..5b562fb --- /dev/null +++ b/man/spezifisch_create.Rd @@ -0,0 +1,14 @@ +% Generated by roxygen2: do not edit by hand +% Please edit documentation in R/utils_dataprocessing.R +\name{spezifisch_create} +\alias{spezifisch_create} +\title{spezifisch_create} +\usage{ +spezifisch_create(x) +} +\arguments{ +\item{x}{Element to extract $Spezifisch from} +} +\description{ +spezifisch_create +} diff --git a/man/split_cube.Rd b/man/split_cube.Rd new file mode 100644 index 0000000..f83a4db --- /dev/null +++ b/man/split_cube.Rd @@ -0,0 +1,14 @@ +% Generated by roxygen2: do not edit by hand +% Please edit documentation in R/gen_cube.R +\name{split_cube} +\alias{split_cube} +\title{split_cube} +\usage{ +split_cube(lines) +} +\arguments{ +\item{lines}{Lines to split a cube} +} +\description{ +split_cube +} diff --git a/man/test_database_function.Rd b/man/test_database_function.Rd new file mode 100644 index 0000000..b74bcdd --- /dev/null +++ b/man/test_database_function.Rd @@ -0,0 +1,14 @@ +% Generated by roxygen2: do not edit by hand +% Please edit documentation in R/utils_dataprocessing.R +\name{test_database_function} +\alias{test_database_function} +\title{test_database_function} +\usage{ +test_database_function(input) +} +\arguments{ +\item{input}{Input to test for database name} +} +\description{ +test_database_function +} diff --git a/man/test_if_error.Rd b/man/test_if_error.Rd new file mode 100644 index 0000000..8f25f55 --- /dev/null +++ b/man/test_if_error.Rd @@ -0,0 +1,18 @@ +% Generated by roxygen2: do not edit by hand +% Please edit documentation in R/utils_httr2.R +\name{test_if_error} +\alias{test_if_error} +\title{test_if_error} +\usage{ +test_if_error(input, para, verbose = NULL) +} +\arguments{ +\item{input}{Response object} + +\item{para}{Parameter TRUE/FALSE} + +\item{verbose}{Verbose TRUE/FALSE} +} +\description{ +test_if_error +} diff --git a/man/test_if_error_find.Rd b/man/test_if_error_find.Rd new file mode 100644 index 0000000..6905adb --- /dev/null +++ b/man/test_if_error_find.Rd @@ -0,0 +1,18 @@ +% Generated by roxygen2: do not edit by hand +% Please edit documentation in R/utils_httr2.R +\name{test_if_error_find} +\alias{test_if_error_find} +\title{test_if_error_find} +\usage{ +test_if_error_find(input, para, verbose = NULL) +} +\arguments{ +\item{input}{Response object} + +\item{para}{Parameter TRUE/FALSE} + +\item{verbose}{Verbose TRUE/FALSE} +} +\description{ +test_if_error_find +} diff --git a/man/test_if_error_light.Rd b/man/test_if_error_light.Rd new file mode 100644 index 0000000..68843fd --- /dev/null +++ b/man/test_if_error_light.Rd @@ -0,0 +1,16 @@ +% Generated by roxygen2: do not edit by hand +% Please edit documentation in R/utils_httr2.R +\name{test_if_error_light} +\alias{test_if_error_light} +\title{test_if_error_light} +\usage{ +test_if_error_light(input, verbose = NULL) +} +\arguments{ +\item{input}{Response object} + +\item{verbose}{Verbose TRUE/FALSE} +} +\description{ +test_if_error_light +} diff --git a/man/test_if_error_variables.Rd b/man/test_if_error_variables.Rd new file mode 100644 index 0000000..501028c --- /dev/null +++ b/man/test_if_error_variables.Rd @@ -0,0 +1,16 @@ +% Generated by roxygen2: do not edit by hand +% Please edit documentation in R/utils_httr2.R +\name{test_if_error_variables} +\alias{test_if_error_variables} +\title{test_if_error_variables} +\usage{ +test_if_error_variables(input, para) +} +\arguments{ +\item{input}{Response object} + +\item{para}{Parameter TRUE/FALSE} +} +\description{ +test_if_error_variables +} diff --git a/man/test_if_json.Rd b/man/test_if_json.Rd new file mode 100644 index 0000000..c90b682 --- /dev/null +++ b/man/test_if_json.Rd @@ -0,0 +1,14 @@ +% Generated by roxygen2: do not edit by hand +% Please edit documentation in R/utils_httr2.R +\name{test_if_json} +\alias{test_if_json} +\title{test_if_json} +\usage{ +test_if_json(input) +} +\arguments{ +\item{input}{Response object} +} +\description{ +test_if_json +} diff --git a/man/test_if_okay.Rd b/man/test_if_okay.Rd new file mode 100644 index 0000000..4a56348 --- /dev/null +++ b/man/test_if_okay.Rd @@ -0,0 +1,14 @@ +% Generated by roxygen2: do not edit by hand +% Please edit documentation in R/utils_httr2.R +\name{test_if_okay} +\alias{test_if_okay} +\title{test_if_okay} +\usage{ +test_if_okay(input) +} +\arguments{ +\item{input}{Response object} +} +\description{ +test_if_okay +} diff --git a/man/test_if_process_further.Rd b/man/test_if_process_further.Rd new file mode 100644 index 0000000..430d82e --- /dev/null +++ b/man/test_if_process_further.Rd @@ -0,0 +1,18 @@ +% Generated by roxygen2: do not edit by hand +% Please edit documentation in R/utils_httr2.R +\name{test_if_process_further} +\alias{test_if_process_further} +\title{test_if_process_further} +\usage{ +test_if_process_further(input, para, verbose = NULL) +} +\arguments{ +\item{input}{Response object} + +\item{para}{Parameter TRUE/FALSE} + +\item{verbose}{Verbose TRUE/FALSE} +} +\description{ +test_if_process_further +} diff --git a/man/titel_search.Rd b/man/titel_search.Rd new file mode 100644 index 0000000..17b66e5 --- /dev/null +++ b/man/titel_search.Rd @@ -0,0 +1,16 @@ +% Generated by roxygen2: do not edit by hand +% Please edit documentation in R/utils_dataprocessing.R +\name{titel_search} +\alias{titel_search} +\title{titel_search} +\usage{ +titel_search(x, term) +} +\arguments{ +\item{x}{Element to extract $Content from} + +\item{term}{Search term} +} +\description{ +titel_search +} diff --git a/tests/testthat/catalogue1/api/catalogue/tables-30cbd2.json b/tests/testthat/catalogue1/api/catalogue/tables-30cbd2.json new file mode 100644 index 0000000..fb67add --- /dev/null +++ b/tests/testthat/catalogue1/api/catalogue/tables-30cbd2.json @@ -0,0 +1,119 @@ +{ + "Ident": { + "Service": "catalogue", + "Method": "tables" + }, + "Status": { + "Code": 0, + "Content": "successfull", + "Type": "information" + }, + "Parameter": { + "username": "********************", + "password": "********************", + "selection": "611*", + "area": "all", + "searchcriterion": "code", + "sortcriterion": "code", + "pagelength": "100", + "language": "en" + }, + "List": [ + { + "Code": "61111-0001", + "Content": "Consumer price index: Germany, years", + "Time": "1991 to 2023" + }, + { + "Code": "61111-0002", + "Content": "Consumer price index: Germany, months", + "Time": "January 1991 to May 2024" + }, + { + "Code": "61111-0003", + "Content": "Consumer price index: Germany, years, individual consumption\nby purpose (COICOP 2-5-digit hierarchy)", + "Time": "1991 to 2023" + }, + { + "Code": "61111-0004", + "Content": "Consumer price index: Germany, months, individual\nconsumption by purpose (COICOP 2-5-digit hierarchy)", + "Time": "January 1991 to May 2024" + }, + { + "Code": "61111-0005", + "Content": "Consumer price index: Germany, years, individual consumption\nby purpose (COICOP 2-/3-/4-/5-/10-digit codes/special items)", + "Time": "1991 to 2023" + }, + { + "Code": "61111-0006", + "Content": "Consumer price index: Germany, months, individual\nconsumption by purpose (COICOP 2-/3-/4-/5-/10-digit codes/\nspecial items)", + "Time": "January 1991 to May 2024" + }, + { + "Code": "61111-0007", + "Content": "Weighting scheme of the consumer price index: Germany,\nyears, individual consumption by purpose (COICOP 2-5-digit\nhierarchy)", + "Time": "2020 to 2020" + }, + { + "Code": "61111-0010", + "Content": "Consumer price index: Länder, years", + "Time": "1995 to 2023" + }, + { + "Code": "61111-0011", + "Content": "Consumer price index: Länder, months", + "Time": "January 1995 to May 2024" + }, + { + "Code": "61111-0020", + "Content": "Index of net rents exclusive of heating expenses:\nLänder, years", + "Time": "2005 to 2023" + }, + { + "Code": "61111-0021", + "Content": "Index of net rents exclusive of heating expenses:\nLänder, months", + "Time": "January 2005 to May 2024" + }, + { + "Code": "61121-0001", + "Content": "Harmonised index of consumer prices: Germany, years", + "Time": "1996 to 2023" + }, + { + "Code": "61121-0002", + "Content": "Harmonised index of consumer prices: Germany, months", + "Time": "January 1996 to May 2024" + }, + { + "Code": "61121-0003", + "Content": "Harmonised index of consumer prices: Germany, years,\nEuropean classification of individual consumption by purpose\n(ECOICOP 2-5-digit hierarchy)", + "Time": "1996 to 2023" + }, + { + "Code": "61121-0004", + "Content": "Harmonised index of consumer prices: Germany, months,\nEuropean classification of individual consumption by purpose\n(ECOICOP 2-5-digit hierarchy)", + "Time": "January 1996 to May 2024" + }, + { + "Code": "61121-0005", + "Content": "Harmonised index of consumer prices: Germany, years,\nEuropean classification of individual consumption by purpose\n(ECOICOP 2-/3-/4-/5-digit codes/special items)", + "Time": "1996 to 2023" + }, + { + "Code": "61121-0006", + "Content": "Harmonised index of consumer prices: Germany, months,\nEuropean classification of individual consumption by purpose\n(ECOICOP 2-/3-/4-/5-digit codes/special items)", + "Time": "January 1996 to May 2024" + }, + { + "Code": "61131-0001", + "Content": "Index of retail prices: Germany, years, value added tax,\neconomic activities", + "Time": "1991 to 2023" + }, + { + "Code": "61131-0002", + "Content": "Index of retail prices: Germany, months, value added tax,\neconomic activities", + "Time": "January 1991 to May 2024" + } + ], + "Copyright": "© Federal Statistical Office, Wiesbaden 2024" +} diff --git a/tests/testthat/catalogue2/api/catalogue/statistics-f5c1c1.json b/tests/testthat/catalogue2/api/catalogue/statistics-f5c1c1.json new file mode 100644 index 0000000..8c38095 --- /dev/null +++ b/tests/testthat/catalogue2/api/catalogue/statistics-f5c1c1.json @@ -0,0 +1,30 @@ +{ + "Ident": { + "Service": "catalogue", + "Method": "statistics" + }, + "Status": { + "Code": 0, + "Content": "erfolgreich", + "Type": "Information" + }, + "Parameter": { + "username": "********************", + "password": "********************", + "selection": "41141", + "searchcriterion": "Code", + "sortcriterion": "Code", + "pagelength": "100", + "language": "de", + "area": "Alle" + }, + "List": [ + { + "Code": "41141", + "Content": "Landwirtschaftszählung: Haupterhebung", + "Cubes": "176", + "Information": "true" + } + ], + "Copyright": "© Statistisches Bundesamt (Destatis), 2024" +} diff --git a/tests/testthat/catalogue3/api/catalogue/cubes-57cf25.json b/tests/testthat/catalogue3/api/catalogue/cubes-57cf25.json new file mode 100644 index 0000000..60b6e2d --- /dev/null +++ b/tests/testthat/catalogue3/api/catalogue/cubes-57cf25.json @@ -0,0 +1,21 @@ +{ + "Ident": { + "Service": "catalogue", + "Method": "cubes" + }, + "Status": { + "Code": 104, + "Content": "Es gibt keine Objekte zum angegebenen Selektionskriterium", + "Type": "Information" + }, + "Parameter": { + "username": "********************", + "password": "********************", + "selection": "41141", + "area": "Alle", + "pagelength": "100", + "language": "de" + }, + "List": null, + "Copyright": "© Statistisches Bundesamt (Destatis), 2024" +} diff --git a/tests/testthat/catalogue4/api/catalogue/cubes-e28931.json b/tests/testthat/catalogue4/api/catalogue/cubes-e28931.json new file mode 100644 index 0000000..e6bc3e0 --- /dev/null +++ b/tests/testthat/catalogue4/api/catalogue/cubes-e28931.json @@ -0,0 +1,310 @@ +{ + "Ident": { + "Service": "catalogue", + "Method": "cubes" + }, + "Status": { + "Code": 0, + "Content": "erfolgreich", + "Type": "Information" + }, + "Parameter": { + "username": "********************", + "password": "********************", + "selection": "611*", + "area": "Alle", + "pagelength": "100", + "language": "de" + }, + "List": [ + { + "Code": "61111B5001", + "Content": "Verbraucherpreisindex für Deutschland, Gewichtung, Deutschland insgesamt, Verwendungszwecke des Individualkonsums, 2-Steller, Jahr", + "State": "vollständig mit Werten", + "Time": "2020", + "LatestUpdate": "18.04.2024 13:34:49h", + "Information": "false" + }, + { + "Code": "61111B5002", + "Content": "Verbraucherpreisindex für Deutschland, Gewichtung, Deutschland insgesamt, Verwendungszwecke des Individualkonsums, 3-Steller, Jahr", + "State": "vollständig mit Werten", + "Time": "2020", + "LatestUpdate": "18.04.2024 13:35:14h", + "Information": "false" + }, + { + "Code": "61111B5003", + "Content": "Verbraucherpreisindex für Deutschland, Gewichtung, Deutschland insgesamt, Verwendungszwecke des Individualkonsums, 4-Steller, Jahr", + "State": "vollständig mit Werten", + "Time": "2020", + "LatestUpdate": "18.04.2024 13:35:42h", + "Information": "false" + }, + { + "Code": "61111B5004", + "Content": "Verbraucherpreisindex für Deutschland, Gewichtung, Deutschland insgesamt, Verwendungszwecke des Individualkonsums, 5-Steller, Jahr", + "State": "vollständig mit Werten", + "Time": "2020", + "LatestUpdate": "18.04.2024 13:36:07h", + "Information": "false" + }, + { + "Code": "61111BJ001", + "Content": "Verbraucherpreisindex für Deutschland, Verbraucherpreisindex, Deutschland insgesamt, Jahr", + "State": "vollständig mit Werten", + "Time": "1991-2023", + "LatestUpdate": "16.01.2024 08:00:32h", + "Information": "false" + }, + { + "Code": "61111BJ002", + "Content": "Verbraucherpreisindex für Deutschland, Verbraucherpreisindex, Deutschland insgesamt, Verwendungszwecke des Individualkonsums, 2-Steller, Jahr", + "State": "vollständig mit Werten", + "Time": "1991-2023", + "LatestUpdate": "16.01.2024 08:00:23h", + "Information": "false" + }, + { + "Code": "61111BJ003", + "Content": "Verbraucherpreisindex für Deutschland, Verbraucherpreisindex, Deutschland insgesamt, Verwendungszwecke des Individualkonsums, 3-Steller, Jahr", + "State": "vollständig mit Werten", + "Time": "1991-2023", + "LatestUpdate": "16.01.2024 08:00:26h", + "Information": "false" + }, + { + "Code": "61111BJ004", + "Content": "Verbraucherpreisindex für Deutschland, Verbraucherpreisindex, Deutschland insgesamt, Verwendungszwecke des Individualkonsums, 4-Steller, Jahr", + "State": "vollständig mit Werten", + "Time": "1991-2023", + "LatestUpdate": "16.01.2024 08:00:51h", + "Information": "false" + }, + { + "Code": "61111BJ005", + "Content": "Verbraucherpreisindex für Deutschland, Verbraucherpreisindex, Deutschland insgesamt, Verwendungszwecke des Individualkonsums, 5-Steller, Jahr", + "State": "vollständig mit Werten", + "Time": "1991-2023", + "LatestUpdate": "16.01.2024 08:00:47h", + "Information": "false" + }, + { + "Code": "61111BJ006", + "Content": "Verbraucherpreisindex für Deutschland, Verbraucherpreisindex, Deutschland insgesamt, Verwendungszw.d.Individualkonsums,Sonderpositionen, Jahr", + "State": "vollständig mit Werten", + "Time": "1991-2023", + "LatestUpdate": "16.01.2024 08:00:29h", + "Information": "false" + }, + { + "Code": "61111BJ007", + "Content": "Verbraucherpreisindex für Deutschland, Verbraucherpreisindex, Deutschland insgesamt, Verwendungszwecke des Individualkonsums,10-Steller, Jahr", + "State": "vollständig mit Werten", + "Time": "2020-2023", + "LatestUpdate": "16.01.2024 08:00:43h", + "Information": "false" + }, + { + "Code": "61111BM001", + "Content": "Verbraucherpreisindex für Deutschland, Verbraucherpreisindex, Deutschland insgesamt, Monate, Jahr", + "State": "vollständig mit Werten", + "Time": "Januar 1991-Mai 2024", + "LatestUpdate": "12.06.2024 08:00:40h", + "Information": "false" + }, + { + "Code": "61111BM002", + "Content": "Verbraucherpreisindex für Deutschland, Verbraucherpreisindex, Deutschland insgesamt, Verwendungszwecke des Individualkonsums, 2-Steller, Monate, Jahr", + "State": "vollständig mit Werten", + "Time": "Januar 1991-Mai 2024", + "LatestUpdate": "12.06.2024 08:00:16h", + "Information": "false" + }, + { + "Code": "61111BM003", + "Content": "Verbraucherpreisindex für Deutschland, Verbraucherpreisindex, Deutschland insgesamt, Verwendungszwecke des Individualkonsums, 3-Steller, Monate, Jahr", + "State": "vollständig mit Werten", + "Time": "Januar 1991-Mai 2024", + "LatestUpdate": "12.06.2024 08:00:19h", + "Information": "false" + }, + { + "Code": "61111BM004", + "Content": "Verbraucherpreisindex für Deutschland, Verbraucherpreisindex, Deutschland insgesamt, Verwendungszwecke des Individualkonsums, 4-Steller, Monate, Jahr", + "State": "vollständig mit Werten", + "Time": "Januar 1991-Mai 2024", + "LatestUpdate": "12.06.2024 08:00:34h", + "Information": "false" + }, + { + "Code": "61111BM005", + "Content": "Verbraucherpreisindex für Deutschland, Verbraucherpreisindex, Deutschland insgesamt, Verwendungszwecke des Individualkonsums, 5-Steller, Monate, Jahr", + "State": "vollständig mit Werten", + "Time": "Januar 1991-Mai 2024", + "LatestUpdate": "12.06.2024 08:00:27h", + "Information": "false" + }, + { + "Code": "61111BM006", + "Content": "Verbraucherpreisindex für Deutschland, Verbraucherpreisindex, Deutschland insgesamt, Verwendungszw.d.Individualkonsums,Sonderpositionen, Monate, Jahr", + "State": "vollständig mit Werten", + "Time": "Januar 1991-Mai 2024", + "LatestUpdate": "12.06.2024 08:00:30h", + "Information": "false" + }, + { + "Code": "61111BM007", + "Content": "Verbraucherpreisindex für Deutschland, Verbraucherpreisindex, Deutschland insgesamt, Verwendungszwecke des Individualkonsums,10-Steller, Monate, Jahr", + "State": "vollständig mit Werten", + "Time": "Januar 2020-Mai 2024", + "LatestUpdate": "12.06.2024 08:00:23h", + "Information": "false" + }, + { + "Code": "61111LJ001", + "Content": "Verbraucherpreisindex für Deutschland, Verbraucherpreisindex, Bundesländer, Jahr", + "State": "vollständig mit Werten", + "Time": "1995-2023", + "LatestUpdate": "16.01.2024 08:00:38h", + "Information": "false" + }, + { + "Code": "61111LJ100", + "Content": "Verbraucherpreisindex für Deutschland, Index der Nettokaltmieten, Bundesländer, Jahr", + "State": "vollständig mit Werten", + "Time": "2005-2023", + "LatestUpdate": "16.01.2024 08:00:35h", + "Information": "false" + }, + { + "Code": "61111LM001", + "Content": "Verbraucherpreisindex für Deutschland, Verbraucherpreisindex, Bundesländer, Monate, Jahr", + "State": "vollständig mit Werten", + "Time": "Januar 1995-Mai 2024", + "LatestUpdate": "12.06.2024 08:00:37h", + "Information": "false" + }, + { + "Code": "61111LM100", + "Content": "Verbraucherpreisindex für Deutschland, Index der Nettokaltmieten, Bundesländer, Monate, Jahr", + "State": "vollständig mit Werten", + "Time": "Januar 2005-Mai 2024", + "LatestUpdate": "12.06.2024 08:00:12h", + "Information": "false" + }, + { + "Code": "61121BJ001", + "Content": "Harmonisierter Verbraucherpreisindex, Harmonisierter Verbraucherpreisindex, Veränderungsrate zum Vorjahr, Deutschland insgesamt, Jahr", + "State": "vollständig mit Werten", + "Time": "1996-2023", + "LatestUpdate": "18.01.2024 10:54:46h", + "Information": "false" + }, + { + "Code": "61121BJ002", + "Content": "Harmonisierter Verbraucherpreisindex, Harmonisierter Verbraucherpreisindex, Deutschland insgesamt, ECOICOP: Harmon. Verbraucherpreisindex, 2-Steller, Jahr", + "State": "vollständig mit Werten", + "Time": "1996-2023", + "LatestUpdate": "16.01.2024 08:01:58h", + "Information": "false" + }, + { + "Code": "61121BJ003", + "Content": "Harmonisierter Verbraucherpreisindex, Harmonisierter Verbraucherpreisindex, Deutschland insgesamt, ECOICOP: Harmon. Verbraucherpreisindex, 3-Steller, Jahr", + "State": "vollständig mit Werten", + "Time": "1996-2023", + "LatestUpdate": "16.01.2024 08:02:34h", + "Information": "false" + }, + { + "Code": "61121BJ004", + "Content": "Harmonisierter Verbraucherpreisindex, Harmonisierter Verbraucherpreisindex, Deutschland insgesamt, ECOICOP: Harmon. Verbraucherpreisindex, 4-Steller, Jahr", + "State": "vollständig mit Werten", + "Time": "1996-2023", + "LatestUpdate": "16.01.2024 08:02:26h", + "Information": "false" + }, + { + "Code": "61121BJ005", + "Content": "Harmonisierter Verbraucherpreisindex, Harmonisierter Verbraucherpreisindex, Deutschland insgesamt, ECOICOP: Harmon. Verbraucherpreisindex, 5-Steller, Jahr", + "State": "vollständig mit Werten", + "Time": "1996-2023", + "LatestUpdate": "16.01.2024 08:01:54h", + "Information": "false" + }, + { + "Code": "61121BJ006", + "Content": "Harmonisierter Verbraucherpreisindex, Harmonisierter Verbraucherpreisindex, Deutschland insgesamt, ECOICOP: Harmon. Verbraucherpreisindex, Sonderpos., Jahr", + "State": "vollständig mit Werten", + "Time": "1996-2023", + "LatestUpdate": "16.01.2024 08:02:23h", + "Information": "false" + }, + { + "Code": "61121BM001", + "Content": "Harmonisierter Verbraucherpreisindex, Harmonisierter Verbraucherpreisindex, Veränderungsrate zum Vorjahresmonat, Veränderungsrate zum Vormonat, Deutschland insgesamt, Monate, Jahr", + "State": "vollständig mit Werten", + "Time": "Januar 1996-Mai 2024", + "LatestUpdate": "12.06.2024 08:01:26h", + "Information": "false" + }, + { + "Code": "61121BM002", + "Content": "Harmonisierter Verbraucherpreisindex, Harmonisierter Verbraucherpreisindex, Deutschland insgesamt, ECOICOP: Harmon. Verbraucherpreisindex, 2-Steller, Monate, Jahr", + "State": "vollständig mit Werten", + "Time": "Januar 1996-Mai 2024", + "LatestUpdate": "12.06.2024 08:00:43h", + "Information": "false" + }, + { + "Code": "61121BM003", + "Content": "Harmonisierter Verbraucherpreisindex, Harmonisierter Verbraucherpreisindex, Deutschland insgesamt, ECOICOP: Harmon. Verbraucherpreisindex, 3-Steller, Monate, Jahr", + "State": "vollständig mit Werten", + "Time": "Januar 1996-Mai 2024", + "LatestUpdate": "12.06.2024 08:01:23h", + "Information": "false" + }, + { + "Code": "61121BM004", + "Content": "Harmonisierter Verbraucherpreisindex, Harmonisierter Verbraucherpreisindex, Deutschland insgesamt, ECOICOP: Harmon. Verbraucherpreisindex, 4-Steller, Monate, Jahr", + "State": "vollständig mit Werten", + "Time": "Januar 1996-Mai 2024", + "LatestUpdate": "12.06.2024 08:01:19h", + "Information": "false" + }, + { + "Code": "61121BM005", + "Content": "Harmonisierter Verbraucherpreisindex, Harmonisierter Verbraucherpreisindex, Deutschland insgesamt, ECOICOP: Harmon. Verbraucherpreisindex, 5-Steller, Monate, Jahr", + "State": "vollständig mit Werten", + "Time": "Januar 1996-Mai 2024", + "LatestUpdate": "12.06.2024 08:01:13h", + "Information": "false" + }, + { + "Code": "61121BM006", + "Content": "Harmonisierter Verbraucherpreisindex, Harmonisierter Verbraucherpreisindex, Deutschland insgesamt, ECOICOP: Harmon. Verbraucherpreisindex, Sonderpos., Monate, Jahr", + "State": "vollständig mit Werten", + "Time": "Januar 1996-Mai 2024", + "LatestUpdate": "12.06.2024 08:01:16h", + "Information": "false" + }, + { + "Code": "61131BJ001", + "Content": "Index der Einzelhandelspreise, Index der Einzelhandelspreise, WZ2008 (ausgewählte Pos.): Einzelhandelspreise, Mehrwertsteuer, Deutschland insgesamt, Jahr", + "State": "vollständig mit Werten", + "Time": "1991-2023", + "LatestUpdate": "16.01.2024 08:03:00h", + "Information": "false" + }, + { + "Code": "61131BM001", + "Content": "Index der Einzelhandelspreise, Index der Einzelhandelspreise, WZ2008 (ausgewählte Pos.): Einzelhandelspreise, Mehrwertsteuer, Deutschland insgesamt, Monate, Jahr", + "State": "vollständig mit Werten", + "Time": "Januar 1991-Mai 2024", + "LatestUpdate": "12.06.2024 08:01:30h", + "Information": "false" + } + ], + "Copyright": "© Statistisches Bundesamt (Destatis), 2024" +} diff --git a/tests/testthat/catalogue4/api/catalogue/statistics-c47d1c.json b/tests/testthat/catalogue4/api/catalogue/statistics-c47d1c.json new file mode 100644 index 0000000..c4223ca --- /dev/null +++ b/tests/testthat/catalogue4/api/catalogue/statistics-c47d1c.json @@ -0,0 +1,42 @@ +{ + "Ident": { + "Service": "catalogue", + "Method": "statistics" + }, + "Status": { + "Code": 0, + "Content": "erfolgreich", + "Type": "Information" + }, + "Parameter": { + "username": "********************", + "password": "********************", + "selection": "611*", + "searchcriterion": "Code", + "sortcriterion": "Code", + "pagelength": "100", + "language": "de", + "area": "Alle" + }, + "List": [ + { + "Code": "61111", + "Content": "Verbraucherpreisindex für Deutschland", + "Cubes": "22", + "Information": "true" + }, + { + "Code": "61121", + "Content": "Harmonisierter Verbraucherpreisindex", + "Cubes": "12", + "Information": "true" + }, + { + "Code": "61131", + "Content": "Index der Einzelhandelspreise", + "Cubes": "2", + "Information": "false" + } + ], + "Copyright": "© Statistisches Bundesamt (Destatis), 2024" +} diff --git a/tests/testthat/catalogue4/api/catalogue/tables-e234ed.json b/tests/testthat/catalogue4/api/catalogue/tables-e234ed.json new file mode 100644 index 0000000..0c8982c --- /dev/null +++ b/tests/testthat/catalogue4/api/catalogue/tables-e234ed.json @@ -0,0 +1,119 @@ +{ + "Ident": { + "Service": "catalogue", + "Method": "tables" + }, + "Status": { + "Code": 0, + "Content": "erfolgreich", + "Type": "Information" + }, + "Parameter": { + "username": "********************", + "password": "********************", + "selection": "611*", + "area": "Alle", + "searchcriterion": "Code", + "sortcriterion": "Code", + "pagelength": "100", + "language": "de" + }, + "List": [ + { + "Code": "61111-0001", + "Content": "Verbraucherpreisindex: Deutschland, Jahre", + "Time": "1991 - 2023" + }, + { + "Code": "61111-0002", + "Content": "Verbraucherpreisindex: Deutschland, Monate", + "Time": "Januar 1991 - Mai 2024" + }, + { + "Code": "61111-0003", + "Content": "Verbraucherpreisindex: Deutschland, Jahre,\nKlassifikation der Verwendungszwecke des Individualkonsums\n(COICOP 2-5-Steller Hierarchie)", + "Time": "1991 - 2023" + }, + { + "Code": "61111-0004", + "Content": "Verbraucherpreisindex: Deutschland, Monate,\nKlassifikation der Verwendungszwecke des Individualkonsums\n(COICOP 2-5-Steller Hierarchie)", + "Time": "Januar 1991 - Mai 2024" + }, + { + "Code": "61111-0005", + "Content": "Verbraucherpreisindex: Deutschland, Jahre,\nKlassifikation der Verwendungszwecke des Individualkonsums\n(COICOP 2-/3-/4-/5-/10-Steller/Sonderpositionen)", + "Time": "1991 - 2023" + }, + { + "Code": "61111-0006", + "Content": "Verbraucherpreisindex: Deutschland, Monate,\nKlassifikation der Verwendungszwecke des Individualkonsums\n(COICOP 2-/3-/4-/5-/10-Steller/Sonderpositionen)", + "Time": "Januar 1991 - Mai 2024" + }, + { + "Code": "61111-0007", + "Content": "Wägungsschema des Verbraucherpreisindex: Deutschland, Jahre,\nKlassifikation der Verwendungszwecke des Individualkonsums\n(COICOP 2-5-Steller Hierarchie)", + "Time": "2020 - 2020" + }, + { + "Code": "61111-0010", + "Content": "Verbraucherpreisindex: Bundesländer, Jahre", + "Time": "1995 - 2023" + }, + { + "Code": "61111-0011", + "Content": "Verbraucherpreisindex: Bundesländer, Monate", + "Time": "Januar 1995 - Mai 2024" + }, + { + "Code": "61111-0020", + "Content": "Index der Nettokaltmieten: Bundesländer, Jahre", + "Time": "2005 - 2023" + }, + { + "Code": "61111-0021", + "Content": "Index der Nettokaltmieten: Bundesländer, Monate", + "Time": "Januar 2005 - Mai 2024" + }, + { + "Code": "61121-0001", + "Content": "Harmonisierter Verbraucherpreisindex: Deutschland, Jahre", + "Time": "1996 - 2023" + }, + { + "Code": "61121-0002", + "Content": "Harmonisierter Verbraucherpreisindex: Deutschland, Monate", + "Time": "Januar 1996 - Mai 2024" + }, + { + "Code": "61121-0003", + "Content": "Harmonisierter Verbraucherpreisindex: Deutschland, Jahre, Europäische Klassifikation der Verwendungszwecke des Individualkonsums (ECOICOP 2-5-Steller Hierarchie)", + "Time": "1996 - 2023" + }, + { + "Code": "61121-0004", + "Content": "Harmonisierter Verbraucherpreisindex: Deutschland, Monate, Europäische Klassifikation der Verwendungszwecke des Individualkonsums (ECOICOP 2-5-Steller Hierarchie)", + "Time": "Januar 1996 - Mai 2024" + }, + { + "Code": "61121-0005", + "Content": "Harmonisierter Verbraucherpreisindex: Deutschland, Jahre, Europäische Klassifikation der Verwendungszwecke des Individualkonsums (ECOICOP 2-/3-/4-/5-Steller/Sonderpositionen)", + "Time": "1996 - 2023" + }, + { + "Code": "61121-0006", + "Content": "Harmonisierter Verbraucherpreisindex: Deutschland, Monate, Europäische Klassifikation der Verwendungszwecke des Individualkonsums (ECOICOP 2-/3-/4-/5-Steller/Sonderpositionen)", + "Time": "Januar 1996 - Mai 2024" + }, + { + "Code": "61131-0001", + "Content": "Index der Einzelhandelspreise: Deutschland, Jahre,\nMehrwertsteuer, Wirtschaftszweige", + "Time": "1991 - 2023" + }, + { + "Code": "61131-0002", + "Content": "Index der Einzelhandelspreise: Deutschland, Monate,\nMehrwertsteuer, Wirtschaftszweige", + "Time": "Januar 1991 - Mai 2024" + } + ], + "Copyright": "© Statistisches Bundesamt (Destatis), 2024" +} diff --git a/tests/testthat/catalogue5/api/catalogue/tables-5b59e0.json b/tests/testthat/catalogue5/api/catalogue/tables-5b59e0.json new file mode 100644 index 0000000..e627dd3 --- /dev/null +++ b/tests/testthat/catalogue5/api/catalogue/tables-5b59e0.json @@ -0,0 +1,54 @@ +{ + "Ident": { + "Service": "catalogue", + "Method": "tables" + }, + "Status": { + "Code": 0, + "Content": "erfolgreich", + "Type": "Information" + }, + "Parameter": { + "username": "********************", + "password": "********************", + "selection": "711*", + "area": "Alle", + "searchcriterion": "Code", + "sortcriterion": "Code", + "pagelength": "100", + "language": "de" + }, + "List": [ + { + "Code": "71141-0001", + "Content": "Rechnungsergebnisse des öffentlichen Gesamthaushalts\n(Ausgaben): Deutschland, Jahre, Körperschaftsgruppen,\nAusgabearten", + "Time": "1992 - 2011" + }, + { + "Code": "71141-0002", + "Content": "Rechnungsergebnisse des öffentlichen Gesamthaushalts\n(Einnahmen): Deutschland, Jahre, Körperschaftsgruppen,\nEinnahmearten", + "Time": "1992 - 2011" + }, + { + "Code": "71141-0003", + "Content": "Rechnungsergebnisse des öffentlichen Gesamthaushalts\n(Finanzierungssaldo, Besondere Finanzierungsvorgänge):\nDeutschland, Jahre, Körperschaftsgruppen", + "Time": "1992 - 2011" + }, + { + "Code": "71141-0004", + "Content": "Rechnungsergebnisse des öffentlichen Gesamthaushalts\n(Nettoausgaben, Personalausgaben, Baumaßnahmen):\nDeutschland, Jahre, Körperschaftsgruppen, Aufgabenbereiche", + "Time": "1992 - 2011" + }, + { + "Code": "71141-0005", + "Content": "Investitionsausgaben der öffentlichen Haushalte:\nDeutschland, Jahre, Körperschaftsgruppen, Art der\nInvestitionsausgaben", + "Time": "1984 - 2011" + }, + { + "Code": "71141-0006", + "Content": "Investitionsausgaben der öffentlichen Haushalte:\nBundesländer, Jahre, Körperschaftsgruppen, Art der\nInvestitionsausgaben", + "Time": "1984 - 2011" + } + ], + "Copyright": "© Statistisches Bundesamt (Destatis), 2024" +} diff --git a/tests/testthat/catalogue6/api/catalogue/tables-5b59e0.json b/tests/testthat/catalogue6/api/catalogue/tables-5b59e0.json new file mode 100644 index 0000000..e627dd3 --- /dev/null +++ b/tests/testthat/catalogue6/api/catalogue/tables-5b59e0.json @@ -0,0 +1,54 @@ +{ + "Ident": { + "Service": "catalogue", + "Method": "tables" + }, + "Status": { + "Code": 0, + "Content": "erfolgreich", + "Type": "Information" + }, + "Parameter": { + "username": "********************", + "password": "********************", + "selection": "711*", + "area": "Alle", + "searchcriterion": "Code", + "sortcriterion": "Code", + "pagelength": "100", + "language": "de" + }, + "List": [ + { + "Code": "71141-0001", + "Content": "Rechnungsergebnisse des öffentlichen Gesamthaushalts\n(Ausgaben): Deutschland, Jahre, Körperschaftsgruppen,\nAusgabearten", + "Time": "1992 - 2011" + }, + { + "Code": "71141-0002", + "Content": "Rechnungsergebnisse des öffentlichen Gesamthaushalts\n(Einnahmen): Deutschland, Jahre, Körperschaftsgruppen,\nEinnahmearten", + "Time": "1992 - 2011" + }, + { + "Code": "71141-0003", + "Content": "Rechnungsergebnisse des öffentlichen Gesamthaushalts\n(Finanzierungssaldo, Besondere Finanzierungsvorgänge):\nDeutschland, Jahre, Körperschaftsgruppen", + "Time": "1992 - 2011" + }, + { + "Code": "71141-0004", + "Content": "Rechnungsergebnisse des öffentlichen Gesamthaushalts\n(Nettoausgaben, Personalausgaben, Baumaßnahmen):\nDeutschland, Jahre, Körperschaftsgruppen, Aufgabenbereiche", + "Time": "1992 - 2011" + }, + { + "Code": "71141-0005", + "Content": "Investitionsausgaben der öffentlichen Haushalte:\nDeutschland, Jahre, Körperschaftsgruppen, Art der\nInvestitionsausgaben", + "Time": "1984 - 2011" + }, + { + "Code": "71141-0006", + "Content": "Investitionsausgaben der öffentlichen Haushalte:\nBundesländer, Jahre, Körperschaftsgruppen, Art der\nInvestitionsausgaben", + "Time": "1984 - 2011" + } + ], + "Copyright": "© Statistisches Bundesamt (Destatis), 2024" +} diff --git a/tests/testthat/cube1/api/data/cubefile-4e2e46.csv b/tests/testthat/cube1/api/data/cubefile-4e2e46.csv new file mode 100644 index 0000000..7b8bdaa --- /dev/null +++ b/tests/testthat/cube1/api/data/cubefile-4e2e46.csv @@ -0,0 +1,2811 @@ +* Der Benutzer DE5256891X der Benutzergruppe DE0089 hat am 09.07.2024 um 11:39:16 diesen Export angestossen. +K;DQ;FACH-SCHL;GHH-ART;GHM-WERTE-JN;GENESIS-VBD;REGIOSTAT;EU-VBD;"mit Werten" +D;47414BJ002;;N;N;N;N +K;DQ-ERH;FACH-SCHL +D;47414 +K;DQA;NAME;RHF-BSR;RHF-ACHSE +D;DINSG;1;1 +D;WZ08N7;2;2 +D;WERTE4;3;3 +K;DQZ;NAME;ZI-RHF-BSR;ZI-RHF-ACHSE +D;JAHR;4;4 +K;DQI;NAME;ME-NAME;DST;TYP;NKM-STELLEN;GHH-ART;GHM-WERTE-JN +D;UMS103;2015=100;FEST;PROZENT;1;;N +K;QEI;FACH-SCHL;FACH-SCHL;FACH-SCHL;ZI-WERT;WERT;QUALITAET;GESPERRT;WERT-VERFAELSCHT +D;DG;WZ08-49-01;NOMINAL;2015;100.0;e;;0.0 +D;DG;WZ08-49-01;NOMINAL;2016;99.3;e;;0.0 +D;DG;WZ08-49-01;NOMINAL;2017;105.7;e;;0.0 +D;DG;WZ08-49-01;NOMINAL;2018;111.6;e;;0.0 +D;DG;WZ08-49-01;NOMINAL;2019;115.6;e;;0.0 +D;DG;WZ08-49-01;NOMINAL;2020;95.7;e;;0.0 +D;DG;WZ08-49-01;NOMINAL;2021;118.8;e;;0.0 +D;DG;WZ08-49-01;NOMINAL;2022;146.9;e;;0.0 +D;DG;WZ08-49-01;NOMINAL;2023;134.2;p;;0.0 +D;DG;WZ08-49-01;REAL;2015;100.0;e;;0.0 +D;DG;WZ08-49-01;REAL;2016;102.0;e;;0.0 +D;DG;WZ08-49-01;REAL;2017;103.7;e;;0.0 +D;DG;WZ08-49-01;REAL;2018;109.0;e;;0.0 +D;DG;WZ08-49-01;REAL;2019;114.5;e;;0.0 +D;DG;WZ08-49-01;REAL;2020;96.2;e;;0.0 +D;DG;WZ08-49-01;REAL;2021;98.7;e;;0.0 +D;DG;WZ08-49-01;REAL;2022;113.0;e;;0.0 +D;DG;WZ08-49-01;REAL;2023;124.1;p;;0.0 +D;DG;WZ08-49-02;NOMINAL;2015;100.0;e;;0.0 +D;DG;WZ08-49-02;NOMINAL;2016;98.1;e;;0.0 +D;DG;WZ08-49-02;NOMINAL;2017;103.1;e;;0.0 +D;DG;WZ08-49-02;NOMINAL;2018;105.5;e;;0.0 +D;DG;WZ08-49-02;NOMINAL;2019;108.2;e;;0.0 +D;DG;WZ08-49-02;NOMINAL;2020;68.2;e;;0.0 +D;DG;WZ08-49-02;NOMINAL;2021;76.4;e;;0.0 +D;DG;WZ08-49-02;NOMINAL;2022;105.3;e;;0.0 +D;DG;WZ08-49-02;NOMINAL;2023;118.7;p;;0.0 +D;DG;WZ08-49-02;REAL;2015;100.0;e;;0.0 +D;DG;WZ08-49-02;REAL;2016;99.8;e;;0.0 +D;DG;WZ08-49-02;REAL;2017;102.1;e;;0.0 +D;DG;WZ08-49-02;REAL;2018;104.1;e;;0.0 +D;DG;WZ08-49-02;REAL;2019;107.2;e;;0.0 +D;DG;WZ08-49-02;REAL;2020;75.4;e;;0.0 +D;DG;WZ08-49-02;REAL;2021;82.5;e;;0.0 +D;DG;WZ08-49-02;REAL;2022;109.0;e;;0.0 +D;DG;WZ08-49-02;REAL;2023;132.6;p;;0.0 +D;DG;WZ08-49-03;NOMINAL;2015;100.0;e;;0.0 +D;DG;WZ08-49-03;NOMINAL;2016;100.4;e;;0.0 +D;DG;WZ08-49-03;NOMINAL;2017;108.5;e;;0.0 +D;DG;WZ08-49-03;NOMINAL;2018;116.5;e;;0.0 +D;DG;WZ08-49-03;NOMINAL;2019;120.6;e;;0.0 +D;DG;WZ08-49-03;NOMINAL;2020;115.0;e;;0.0 +D;DG;WZ08-49-03;NOMINAL;2021;150.7;e;;0.0 +D;DG;WZ08-49-03;NOMINAL;2022;178.3;e;;0.0 +D;DG;WZ08-49-03;NOMINAL;2023;146.6;p;;0.0 +D;DG;WZ08-49-03;REAL;2015;100.0;e;;0.0 +D;DG;WZ08-49-03;REAL;2016;104.0;e;;0.0 +D;DG;WZ08-49-03;REAL;2017;105.6;e;;0.0 +D;DG;WZ08-49-03;REAL;2018;113.3;e;;0.0 +D;DG;WZ08-49-03;REAL;2019;120.0;e;;0.0 +D;DG;WZ08-49-03;REAL;2020;111.2;e;;0.0 +D;DG;WZ08-49-03;REAL;2021;111.0;e;;0.0 +D;DG;WZ08-49-03;REAL;2022;116.8;e;;0.0 +D;DG;WZ08-49-03;REAL;2023;120.9;p;;0.0 +D;DG;WZ08-49-04;NOMINAL;2015;100.0;e;;0.0 +D;DG;WZ08-49-04;NOMINAL;2016;103.5;e;;0.0 +D;DG;WZ08-49-04;NOMINAL;2017;107.9;e;;0.0 +D;DG;WZ08-49-04;NOMINAL;2018;114.3;e;;0.0 +D;DG;WZ08-49-04;NOMINAL;2019;117.8;e;;0.0 +D;DG;WZ08-49-04;NOMINAL;2020;94.0;e;;0.0 +D;DG;WZ08-49-04;NOMINAL;2021;102.3;e;;0.0 +D;DG;WZ08-49-04;NOMINAL;2022;129.5;e;;0.0 +D;DG;WZ08-49-04;NOMINAL;2023;148.3;p;;0.0 +D;DG;WZ08-49-04;REAL;2015;100.0;e;;0.0 +D;DG;WZ08-49-04;REAL;2016;103.5;e;;0.0 +D;DG;WZ08-49-04;REAL;2017;106.6;e;;0.0 +D;DG;WZ08-49-04;REAL;2018;111.2;e;;0.0 +D;DG;WZ08-49-04;REAL;2019;113.4;e;;0.0 +D;DG;WZ08-49-04;REAL;2020;94.9;e;;0.0 +D;DG;WZ08-49-04;REAL;2021;103.6;e;;0.0 +D;DG;WZ08-49-04;REAL;2022;133.5;e;;0.0 +D;DG;WZ08-49-04;REAL;2023;146.5;p;;0.0 +D;DG;WZ08-49-05;NOMINAL;2015;100.0;e;;0.0 +D;DG;WZ08-49-05;NOMINAL;2016;93.8;e;;0.0 +D;DG;WZ08-49-05;NOMINAL;2017;106.0;e;;0.0 +D;DG;WZ08-49-05;NOMINAL;2018;116.6;e;;0.0 +D;DG;WZ08-49-05;NOMINAL;2019;122.2;e;;0.0 +D;DG;WZ08-49-05;NOMINAL;2020;109.7;e;;0.0 +D;DG;WZ08-49-05;NOMINAL;2021;173.6;e;;0.0 +D;DG;WZ08-49-05;NOMINAL;2022;211.4;e;;0.0 +D;DG;WZ08-49-05;NOMINAL;2023;138.6;p;;0.0 +D;DG;WZ08-49-05;REAL;2015;100.0;e;;0.0 +D;DG;WZ08-49-05;REAL;2016;101.6;e;;0.0 +D;DG;WZ08-49-05;REAL;2017;98.6;e;;0.0 +D;DG;WZ08-49-05;REAL;2018;111.7;e;;0.0 +D;DG;WZ08-49-05;REAL;2019;128.4;e;;0.0 +D;DG;WZ08-49-05;REAL;2020;110.1;e;;0.0 +D;DG;WZ08-49-05;REAL;2021;93.7;e;;0.0 +D;DG;WZ08-49-05;REAL;2022;104.2;e;;0.0 +D;DG;WZ08-49-05;REAL;2023;124.3;p;;0.0 +D;DG;WZ08-49-06;NOMINAL;2015;100.0;e;;0.0 +D;DG;WZ08-49-06;NOMINAL;2016;104.8;e;;0.0 +D;DG;WZ08-49-06;NOMINAL;2017;110.2;e;;0.0 +D;DG;WZ08-49-06;NOMINAL;2018;116.5;e;;0.0 +D;DG;WZ08-49-06;NOMINAL;2019;119.5;e;;0.0 +D;DG;WZ08-49-06;NOMINAL;2020;118.6;e;;0.0 +D;DG;WZ08-49-06;NOMINAL;2021;135.0;e;;0.0 +D;DG;WZ08-49-06;NOMINAL;2022;155.9;e;;0.0 +D;DG;WZ08-49-06;NOMINAL;2023;152.0;p;;0.0 +D;DG;WZ08-49-06;REAL;2015;100.0;e;;0.0 +D;DG;WZ08-49-06;REAL;2016;105.7;e;;0.0 +D;DG;WZ08-49-06;REAL;2017;110.4;e;;0.0 +D;DG;WZ08-49-06;REAL;2018;114.5;e;;0.0 +D;DG;WZ08-49-06;REAL;2019;114.1;e;;0.0 +D;DG;WZ08-49-06;REAL;2020;111.9;e;;0.0 +D;DG;WZ08-49-06;REAL;2021;123.1;e;;0.0 +D;DG;WZ08-49-06;REAL;2022;125.6;e;;0.0 +D;DG;WZ08-49-06;REAL;2023;118.6;p;;0.0 +D;DG;WZ08-49-07;NOMINAL;2015;100.0;e;;0.0 +D;DG;WZ08-49-07;NOMINAL;2016;100.2;e;;0.0 +D;DG;WZ08-49-07;NOMINAL;2017;108.8;e;;0.0 +D;DG;WZ08-49-07;NOMINAL;2018;117.0;e;;0.0 +D;DG;WZ08-49-07;NOMINAL;2019;121.6;e;;0.0 +D;DG;WZ08-49-07;NOMINAL;2020;116.0;e;;0.0 +D;DG;WZ08-49-07;NOMINAL;2021;154.1;e;;0.0 +D;DG;WZ08-49-07;NOMINAL;2022;183.8;e;;0.0 +D;DG;WZ08-49-07;NOMINAL;2023;147.7;p;;0.0 +D;DG;WZ08-49-07;REAL;2015;100.0;e;;0.0 +D;DG;WZ08-49-07;REAL;2016;104.3;e;;0.0 +D;DG;WZ08-49-07;REAL;2017;105.6;e;;0.0 +D;DG;WZ08-49-07;REAL;2018;113.8;e;;0.0 +D;DG;WZ08-49-07;REAL;2019;121.4;e;;0.0 +D;DG;WZ08-49-07;REAL;2020;112.3;e;;0.0 +D;DG;WZ08-49-07;REAL;2021;111.2;e;;0.0 +D;DG;WZ08-49-07;REAL;2022;117.2;e;;0.0 +D;DG;WZ08-49-07;REAL;2023;122.3;p;;0.0 +D;DG;WZ08-49-08;NOMINAL;2015;100.0;e;;0.0 +D;DG;WZ08-49-08;NOMINAL;2016;102.5;e;;0.0 +D;DG;WZ08-49-08;NOMINAL;2017;105.1;e;;0.0 +D;DG;WZ08-49-08;NOMINAL;2018;109.6;e;;0.0 +D;DG;WZ08-49-08;NOMINAL;2019;114.3;e;;0.0 +D;DG;WZ08-49-08;NOMINAL;2020;105.5;e;;0.0 +D;DG;WZ08-49-08;NOMINAL;2021;112.4;e;;0.0 +D;DG;WZ08-49-08;NOMINAL;2022;128.0;e;;0.0 +D;DG;WZ08-49-08;NOMINAL;2023;134.5;p;;0.0 +D;DG;WZ08-49-08;REAL;2015;100.0;e;;0.0 +D;DG;WZ08-49-08;REAL;2016;103.3;e;;0.0 +D;DG;WZ08-49-08;REAL;2017;104.5;e;;0.0 +D;DG;WZ08-49-08;REAL;2018;106.7;e;;0.0 +D;DG;WZ08-49-08;REAL;2019;109.0;e;;0.0 +D;DG;WZ08-49-08;REAL;2020;106.3;e;;0.0 +D;DG;WZ08-49-08;REAL;2021;112.1;e;;0.0 +D;DG;WZ08-49-08;REAL;2022;119.5;e;;0.0 +D;DG;WZ08-49-08;REAL;2023;125.3;p;;0.0 +D;DG;WZ08-491;NOMINAL;2015;100.0;e;;0.0 +D;DG;WZ08-491;NOMINAL;2016;106.0;e;;0.0 +D;DG;WZ08-491;NOMINAL;2017;110.7;e;;0.0 +D;DG;WZ08-491;NOMINAL;2018;118.6;e;;0.0 +D;DG;WZ08-491;NOMINAL;2019;128.7;e;;0.0 +D;DG;WZ08-491;NOMINAL;2020;78.2;e;;0.0 +D;DG;WZ08-491;NOMINAL;2021;83.0;e;;0.0 +D;DG;WZ08-491;NOMINAL;2022;137.8;e;;0.0 +D;DG;WZ08-491;NOMINAL;2023;165.9;p;;0.0 +D;DG;WZ08-491;REAL;2015;100.0;e;;0.0 +D;DG;WZ08-491;REAL;2016;107.0;e;;0.0 +D;DG;WZ08-491;REAL;2017;108.9;e;;0.0 +D;DG;WZ08-491;REAL;2018;114.7;e;;0.0 +D;DG;WZ08-491;REAL;2019;124.4;e;;0.0 +D;DG;WZ08-491;REAL;2020;88.7;e;;0.0 +D;DG;WZ08-491;REAL;2021;95.6;e;;0.0 +D;DG;WZ08-491;REAL;2022;162.5;e;;0.0 +D;DG;WZ08-491;REAL;2023;204.2;p;;0.0 +D;DG;WZ08-492;NOMINAL;2015;100.0;e;;0.0 +D;DG;WZ08-492;NOMINAL;2016;101.8;e;;0.0 +D;DG;WZ08-492;NOMINAL;2017;106.0;e;;0.0 +D;DG;WZ08-492;NOMINAL;2018;111.3;e;;0.0 +D;DG;WZ08-492;NOMINAL;2019;110.1;e;;0.0 +D;DG;WZ08-492;NOMINAL;2020;105.0;e;;0.0 +D;DG;WZ08-492;NOMINAL;2021;115.8;e;;0.0 +D;DG;WZ08-492;NOMINAL;2022;123.8;e;;0.0 +D;DG;WZ08-492;NOMINAL;2023;136.1;p;;0.0 +D;DG;WZ08-492;REAL;2015;100.0;e;;0.0 +D;DG;WZ08-492;REAL;2016;101.1;e;;0.0 +D;DG;WZ08-492;REAL;2017;105.0;e;;0.0 +D;DG;WZ08-492;REAL;2018;108.7;e;;0.0 +D;DG;WZ08-492;REAL;2019;105.8;e;;0.0 +D;DG;WZ08-492;REAL;2020;99.2;e;;0.0 +D;DG;WZ08-492;REAL;2021;109.1;e;;0.0 +D;DG;WZ08-492;REAL;2022;113.3;e;;0.0 +D;DG;WZ08-492;REAL;2023;106.3;p;;0.0 +D;DG;WZ08-4931;NOMINAL;2015;100.0;e;;0.0 +D;DG;WZ08-4931;NOMINAL;2016;102.5;e;;0.0 +D;DG;WZ08-4931;NOMINAL;2017;102.6;e;;0.0 +D;DG;WZ08-4931;NOMINAL;2018;105.1;e;;0.0 +D;DG;WZ08-4931;NOMINAL;2019;107.8;e;;0.0 +D;DG;WZ08-4931;NOMINAL;2020;97.3;e;;0.0 +D;DG;WZ08-4931;NOMINAL;2021;104.0;e;;0.0 +D;DG;WZ08-4931;NOMINAL;2022;114.3;e;;0.0 +D;DG;WZ08-4931;NOMINAL;2023;124.8;p;;0.0 +D;DG;WZ08-4932;NOMINAL;2015;100.0;e;;0.0 +D;DG;WZ08-4932;NOMINAL;2016;103.8;e;;0.0 +D;DG;WZ08-4932;NOMINAL;2017;109.9;e;;0.0 +D;DG;WZ08-4932;NOMINAL;2018;113.7;e;;0.0 +D;DG;WZ08-4932;NOMINAL;2019;115.5;e;;0.0 +D;DG;WZ08-4932;NOMINAL;2020;84.0;e;;0.0 +D;DG;WZ08-4932;NOMINAL;2021;86.6;e;;0.0 +D;DG;WZ08-4932;NOMINAL;2022;109.4;e;;0.0 +D;DG;WZ08-4932;NOMINAL;2023;129.0;p;;0.0 +D;DG;WZ08-4939;NOMINAL;2015;100.0;e;;0.0 +D;DG;WZ08-4939;NOMINAL;2016;94.9;e;;0.0 +D;DG;WZ08-4939;NOMINAL;2017;89.1;e;;0.0 +D;DG;WZ08-4939;NOMINAL;2018;88.0;e;;0.0 +D;DG;WZ08-4939;NOMINAL;2019;92.2;e;;0.0 +D;DG;WZ08-4939;NOMINAL;2020;65.6;e;;0.0 +D;DG;WZ08-4939;NOMINAL;2021;68.9;e;;0.0 +D;DG;WZ08-4939;NOMINAL;2022;88.0;e;;0.0 +D;DG;WZ08-4939;NOMINAL;2023;100.7;p;;0.0 +D;DG;WZ08-493;NOMINAL;2015;100.0;e;;0.0 +D;DG;WZ08-493;NOMINAL;2016;101.5;e;;0.0 +D;DG;WZ08-493;NOMINAL;2017;101.3;e;;0.0 +D;DG;WZ08-493;NOMINAL;2018;103.4;e;;0.0 +D;DG;WZ08-493;NOMINAL;2019;106.3;e;;0.0 +D;DG;WZ08-493;NOMINAL;2020;90.4;e;;0.0 +D;DG;WZ08-493;NOMINAL;2021;96.0;e;;0.0 +D;DG;WZ08-493;NOMINAL;2022;109.4;e;;0.0 +D;DG;WZ08-493;NOMINAL;2023;121.4;p;;0.0 +D;DG;WZ08-493;REAL;2015;100.0;e;;0.0 +D;DG;WZ08-493;REAL;2016;102.4;e;;0.0 +D;DG;WZ08-493;REAL;2017;99.8;e;;0.0 +D;DG;WZ08-493;REAL;2018;100.0;e;;0.0 +D;DG;WZ08-493;REAL;2019;102.7;e;;0.0 +D;DG;WZ08-493;REAL;2020;102.8;e;;0.0 +D;DG;WZ08-493;REAL;2021;110.9;e;;0.0 +D;DG;WZ08-493;REAL;2022;129.0;e;;0.0 +D;DG;WZ08-493;REAL;2023;149.7;p;;0.0 +D;DG;WZ08-4941;NOMINAL;2015;100.0;e;;0.0 +D;DG;WZ08-4941;NOMINAL;2016;103.4;e;;0.0 +D;DG;WZ08-4941;NOMINAL;2017;108.5;e;;0.0 +D;DG;WZ08-4941;NOMINAL;2018;114.1;e;;0.0 +D;DG;WZ08-4941;NOMINAL;2019;117.6;e;;0.0 +D;DG;WZ08-4941;NOMINAL;2020;115.2;e;;0.0 +D;DG;WZ08-4941;NOMINAL;2021;124.6;e;;0.0 +D;DG;WZ08-4941;NOMINAL;2022;141.0;e;;0.0 +D;DG;WZ08-4941;NOMINAL;2023;144.5;p;;0.0 +D;DG;WZ08-4942;NOMINAL;2015;100.0;e;;0.0 +D;DG;WZ08-4942;NOMINAL;2016;102.3;e;;0.0 +D;DG;WZ08-4942;NOMINAL;2017;105.7;e;;0.0 +D;DG;WZ08-4942;NOMINAL;2018;106.8;e;;0.0 +D;DG;WZ08-4942;NOMINAL;2019;111.7;e;;0.0 +D;DG;WZ08-4942;NOMINAL;2020;112.8;e;;0.0 +D;DG;WZ08-4942;NOMINAL;2021;124.8;e;;0.0 +D;DG;WZ08-4942;NOMINAL;2022;140.7;e;;0.0 +D;DG;WZ08-4942;NOMINAL;2023;143.5;p;;0.0 +D;DG;WZ08-494;NOMINAL;2015;100.0;e;;0.0 +D;DG;WZ08-494;NOMINAL;2016;103.4;e;;0.0 +D;DG;WZ08-494;NOMINAL;2017;108.4;e;;0.0 +D;DG;WZ08-494;NOMINAL;2018;113.9;e;;0.0 +D;DG;WZ08-494;NOMINAL;2019;117.5;e;;0.0 +D;DG;WZ08-494;NOMINAL;2020;115.1;e;;0.0 +D;DG;WZ08-494;NOMINAL;2021;124.6;e;;0.0 +D;DG;WZ08-494;NOMINAL;2022;141.1;e;;0.0 +D;DG;WZ08-494;NOMINAL;2023;144.5;p;;0.0 +D;DG;WZ08-494;REAL;2015;100.0;e;;0.0 +D;DG;WZ08-494;REAL;2016;104.1;e;;0.0 +D;DG;WZ08-494;REAL;2017;108.5;e;;0.0 +D;DG;WZ08-494;REAL;2018;111.3;e;;0.0 +D;DG;WZ08-494;REAL;2019;111.1;e;;0.0 +D;DG;WZ08-494;REAL;2020;108.5;e;;0.0 +D;DG;WZ08-494;REAL;2021;114.3;e;;0.0 +D;DG;WZ08-494;REAL;2022;114.2;e;;0.0 +D;DG;WZ08-494;REAL;2023;110.8;p;;0.0 +D;DG;WZ08-495;NOMINAL;2015;100.0;e;;0.0 +D;DG;WZ08-495;NOMINAL;2016;101.2;e;;0.0 +D;DG;WZ08-495;NOMINAL;2017;97.8;e;;0.0 +D;DG;WZ08-495;NOMINAL;2018;109.7;e;;0.0 +D;DG;WZ08-495;NOMINAL;2019;141.8;e;;0.0 +D;DG;WZ08-495;NOMINAL;2020;116.0;e;;0.0 +D;DG;WZ08-495;NOMINAL;2021;107.0;e;;0.0 +D;DG;WZ08-495;NOMINAL;2022;129.7;e;;0.0 +D;DG;WZ08-495;NOMINAL;2023;126.5;p;;0.0 +D;DG;WZ08-495;REAL;2015;100.0;e;;0.0 +D;DG;WZ08-495;REAL;2016;101.9;e;;0.0 +D;DG;WZ08-495;REAL;2017;97.9;e;;0.0 +D;DG;WZ08-495;REAL;2018;107.2;e;;0.0 +D;DG;WZ08-495;REAL;2019;134.2;e;;0.0 +D;DG;WZ08-495;REAL;2020;109.3;e;;0.0 +D;DG;WZ08-495;REAL;2021;98.2;e;;0.0 +D;DG;WZ08-495;REAL;2022;104.8;e;;0.0 +D;DG;WZ08-495;REAL;2023;97.1;p;;0.0 +D;DG;WZ08-49;NOMINAL;2015;100.0;e;;0.0 +D;DG;WZ08-49;NOMINAL;2016;102.7;e;;0.0 +D;DG;WZ08-49;NOMINAL;2017;105.5;e;;0.0 +D;DG;WZ08-49;NOMINAL;2018;110.2;e;;0.0 +D;DG;WZ08-49;NOMINAL;2019;114.8;e;;0.0 +D;DG;WZ08-49;NOMINAL;2020;103.9;e;;0.0 +D;DG;WZ08-49;NOMINAL;2021;111.1;e;;0.0 +D;DG;WZ08-49;NOMINAL;2022;128.2;e;;0.0 +D;DG;WZ08-49;NOMINAL;2023;136.3;p;;0.0 +D;DG;WZ08-49;REAL;2015;100.0;e;;0.0 +D;DG;WZ08-49;REAL;2016;103.4;e;;0.0 +D;DG;WZ08-49;REAL;2017;104.8;e;;0.0 +D;DG;WZ08-49;REAL;2018;107.3;e;;0.0 +D;DG;WZ08-49;REAL;2019;109.6;e;;0.0 +D;DG;WZ08-49;REAL;2020;104.8;e;;0.0 +D;DG;WZ08-49;REAL;2021;111.0;e;;0.0 +D;DG;WZ08-49;REAL;2022;121.4;e;;0.0 +D;DG;WZ08-49;REAL;2023;128.2;p;;0.0 +D;DG;WZ08-50-01;NOMINAL;2015;100.0;e;;0.0 +D;DG;WZ08-50-01;NOMINAL;2016;89.5;e;;0.0 +D;DG;WZ08-50-01;NOMINAL;2017;102.8;e;;0.0 +D;DG;WZ08-50-01;NOMINAL;2018;113.4;e;;0.0 +D;DG;WZ08-50-01;NOMINAL;2019;120.0;e;;0.0 +D;DG;WZ08-50-01;NOMINAL;2020;100.9;e;;0.0 +D;DG;WZ08-50-01;NOMINAL;2021;168.2;e;;0.0 +D;DG;WZ08-50-01;NOMINAL;2022;215.2;e;;0.0 +D;DG;WZ08-50-01;NOMINAL;2023;137.1;p;;0.0 +D;DG;WZ08-50-01;REAL;2015;100.0;e;;0.0 +D;DG;WZ08-50-01;REAL;2016;98.3;e;;0.0 +D;DG;WZ08-50-01;REAL;2017;94.2;e;;0.0 +D;DG;WZ08-50-01;REAL;2018;107.9;e;;0.0 +D;DG;WZ08-50-01;REAL;2019;127.5;e;;0.0 +D;DG;WZ08-50-01;REAL;2020;102.0;e;;0.0 +D;DG;WZ08-50-01;REAL;2021;81.4;e;;0.0 +D;DG;WZ08-50-01;REAL;2022;96.1;e;;0.0 +D;DG;WZ08-50-01;REAL;2023;125.7;p;;0.0 +D;DG;WZ08-50-02;NOMINAL;2015;100.0;e;;0.0 +D;DG;WZ08-50-02;NOMINAL;2016;76.3;e;;0.0 +D;DG;WZ08-50-02;NOMINAL;2017;86.2;e;;0.0 +D;DG;WZ08-50-02;NOMINAL;2018;90.6;e;;0.0 +D;DG;WZ08-50-02;NOMINAL;2019;106.0;e;;0.0 +D;DG;WZ08-50-02;NOMINAL;2020;39.8;e;;0.0 +D;DG;WZ08-50-02;NOMINAL;2021;49.1;e;;0.0 +D;DG;WZ08-50-02;NOMINAL;2022;111.5;e;;0.0 +D;DG;WZ08-50-02;NOMINAL;2023;146.8;p;;0.0 +D;DG;WZ08-50-02;REAL;2015;100.0;e;;0.0 +D;DG;WZ08-50-02;REAL;2016;81.6;e;;0.0 +D;DG;WZ08-50-02;REAL;2017;79.5;e;;0.0 +D;DG;WZ08-50-02;REAL;2018;85.9;e;;0.0 +D;DG;WZ08-50-02;REAL;2019;109.0;e;;0.0 +D;DG;WZ08-50-02;REAL;2020;38.3;e;;0.0 +D;DG;WZ08-50-02;REAL;2021;25.9;e;;0.0 +D;DG;WZ08-50-02;REAL;2022;56.8;e;;0.0 +D;DG;WZ08-50-02;REAL;2023;132.1;p;;0.0 +D;DG;WZ08-501;NOMINAL;2015;100.0;e;;0.0 +D;DG;WZ08-501;NOMINAL;2016;71.5;e;;0.0 +D;DG;WZ08-501;NOMINAL;2017;80.0;e;;0.0 +D;DG;WZ08-501;NOMINAL;2018;86.7;e;;0.0 +D;DG;WZ08-501;NOMINAL;2019;106.2;e;;0.0 +D;DG;WZ08-501;NOMINAL;2020;36.9;e;;0.0 +D;DG;WZ08-501;NOMINAL;2021;45.1;e;;0.0 +D;DG;WZ08-501;NOMINAL;2022;107.8;e;;0.0 +D;DG;WZ08-501;NOMINAL;2023;144.9;p;;0.0 +D;DG;WZ08-501;REAL;2015;100.0;e;;0.0 +D;DG;WZ08-501;REAL;2016;78.5;e;;0.0 +D;DG;WZ08-501;REAL;2017;73.5;e;;0.0 +D;DG;WZ08-501;REAL;2018;82.7;e;;0.0 +D;DG;WZ08-501;REAL;2019;111.4;e;;0.0 +D;DG;WZ08-501;REAL;2020;36.4;e;;0.0 +D;DG;WZ08-501;REAL;2021;20.0;e;;0.0 +D;DG;WZ08-501;REAL;2022;49.2;e;;0.0 +D;DG;WZ08-501;REAL;2023;134.9;p;;0.0 +D;DG;WZ08-502;NOMINAL;2015;100.0;e;;0.0 +D;DG;WZ08-502;NOMINAL;2016;91.6;e;;0.0 +D;DG;WZ08-502;NOMINAL;2017;105.9;e;;0.0 +D;DG;WZ08-502;NOMINAL;2018;118.1;e;;0.0 +D;DG;WZ08-502;NOMINAL;2019;125.7;e;;0.0 +D;DG;WZ08-502;NOMINAL;2020;111.1;e;;0.0 +D;DG;WZ08-502;NOMINAL;2021;190.2;e;;0.0 +D;DG;WZ08-502;NOMINAL;2022;236.4;e;;0.0 +D;DG;WZ08-502;NOMINAL;2023;139.4;p;;0.0 +D;DG;WZ08-502;REAL;2015;100.0;e;;0.0 +D;DG;WZ08-502;REAL;2016;101.7;e;;0.0 +D;DG;WZ08-502;REAL;2017;96.8;e;;0.0 +D;DG;WZ08-502;REAL;2018;112.5;e;;0.0 +D;DG;WZ08-502;REAL;2019;134.6;e;;0.0 +D;DG;WZ08-502;REAL;2020;113.2;e;;0.0 +D;DG;WZ08-502;REAL;2021;89.5;e;;0.0 +D;DG;WZ08-502;REAL;2022;101.7;e;;0.0 +D;DG;WZ08-502;REAL;2023;129.3;p;;0.0 +D;DG;WZ08-503;NOMINAL;2015;100.0;e;;0.0 +D;DG;WZ08-503;NOMINAL;2016;104.6;e;;0.0 +D;DG;WZ08-503;NOMINAL;2017;123.3;e;;0.0 +D;DG;WZ08-503;NOMINAL;2018;114.2;e;;0.0 +D;DG;WZ08-503;NOMINAL;2019;104.9;e;;0.0 +D;DG;WZ08-503;NOMINAL;2020;57.4;e;;0.0 +D;DG;WZ08-503;NOMINAL;2021;73.0;e;;0.0 +D;DG;WZ08-503;NOMINAL;2022;133.9;e;;0.0 +D;DG;WZ08-503;NOMINAL;2023;158.7;p;;0.0 +D;DG;WZ08-503;REAL;2015;100.0;e;;0.0 +D;DG;WZ08-503;REAL;2016;100.5;e;;0.0 +D;DG;WZ08-503;REAL;2017;115.6;e;;0.0 +D;DG;WZ08-503;REAL;2018;105.1;e;;0.0 +D;DG;WZ08-503;REAL;2019;94.3;e;;0.0 +D;DG;WZ08-503;REAL;2020;49.8;e;;0.0 +D;DG;WZ08-503;REAL;2021;61.9;e;;0.0 +D;DG;WZ08-503;REAL;2022;102.7;e;;0.0 +D;DG;WZ08-503;REAL;2023;114.9;p;;0.0 +D;DG;WZ08-504;NOMINAL;2015;100.0;e;;0.0 +D;DG;WZ08-504;NOMINAL;2016;83.7;e;;0.0 +D;DG;WZ08-504;NOMINAL;2017;87.9;e;;0.0 +D;DG;WZ08-504;NOMINAL;2018;89.9;e;;0.0 +D;DG;WZ08-504;NOMINAL;2019;69.9;e;;0.0 +D;DG;WZ08-504;NOMINAL;2020;66.9;e;;0.0 +D;DG;WZ08-504;NOMINAL;2021;76.5;e;;0.0 +D;DG;WZ08-504;NOMINAL;2022;109.4;e;;0.0 +D;DG;WZ08-504;NOMINAL;2023;93.3;p;;0.0 +D;DG;WZ08-504;REAL;2015;100.0;e;;0.0 +D;DG;WZ08-504;REAL;2016;81.6;e;;0.0 +D;DG;WZ08-504;REAL;2017;83.6;e;;0.0 +D;DG;WZ08-504;REAL;2018;83.7;e;;0.0 +D;DG;WZ08-504;REAL;2019;63.7;e;;0.0 +D;DG;WZ08-504;REAL;2020;58.8;e;;0.0 +D;DG;WZ08-504;REAL;2021;65.8;e;;0.0 +D;DG;WZ08-504;REAL;2022;86.0;e;;0.0 +D;DG;WZ08-504;REAL;2023;68.1;p;;0.0 +D;DG;WZ08-50;NOMINAL;2015;100.0;e;;0.0 +D;DG;WZ08-50;NOMINAL;2016;89.5;e;;0.0 +D;DG;WZ08-50;NOMINAL;2017;102.8;e;;0.0 +D;DG;WZ08-50;NOMINAL;2018;113.4;e;;0.0 +D;DG;WZ08-50;NOMINAL;2019;120.0;e;;0.0 +D;DG;WZ08-50;NOMINAL;2020;100.9;e;;0.0 +D;DG;WZ08-50;NOMINAL;2021;168.2;e;;0.0 +D;DG;WZ08-50;NOMINAL;2022;215.2;e;;0.0 +D;DG;WZ08-50;NOMINAL;2023;137.1;p;;0.0 +D;DG;WZ08-50;REAL;2015;100.0;e;;0.0 +D;DG;WZ08-50;REAL;2016;98.3;e;;0.0 +D;DG;WZ08-50;REAL;2017;94.2;e;;0.0 +D;DG;WZ08-50;REAL;2018;107.9;e;;0.0 +D;DG;WZ08-50;REAL;2019;127.5;e;;0.0 +D;DG;WZ08-50;REAL;2020;102.0;e;;0.0 +D;DG;WZ08-50;REAL;2021;81.4;e;;0.0 +D;DG;WZ08-50;REAL;2022;96.1;e;;0.0 +D;DG;WZ08-50;REAL;2023;125.7;p;;0.0 +D;DG;WZ08-51-01;NOMINAL;2015;100.0;e;;0.0 +D;DG;WZ08-51-01;NOMINAL;2016;98.7;e;;0.0 +D;DG;WZ08-51-01;NOMINAL;2017;110.9;e;;0.0 +D;DG;WZ08-51-01;NOMINAL;2018;114.6;e;;0.0 +D;DG;WZ08-51-01;NOMINAL;2019;112.5;e;;0.0 +D;DG;WZ08-51-01;NOMINAL;2020;54.8;e;;0.0 +D;DG;WZ08-51-01;NOMINAL;2021;82.6;e;;0.0 +D;DG;WZ08-51-01;NOMINAL;2022;129.8;e;;0.0 +D;DG;WZ08-51-01;NOMINAL;2023;121.2;p;;0.0 +D;DG;WZ08-51-01;REAL;2015;100.0;e;;0.0 +D;DG;WZ08-51-01;REAL;2016;101.3;e;;0.0 +D;DG;WZ08-51-01;REAL;2017;112.5;e;;0.0 +D;DG;WZ08-51-01;REAL;2018;118.1;e;;0.0 +D;DG;WZ08-51-01;REAL;2019;116.6;e;;0.0 +D;DG;WZ08-51-01;REAL;2020;52.7;e;;0.0 +D;DG;WZ08-51-01;REAL;2021;72.5;e;;0.0 +D;DG;WZ08-51-01;REAL;2022;102.1;e;;0.0 +D;DG;WZ08-51-01;REAL;2023;105.3;p;;0.0 +D;DG;WZ08-511;NOMINAL;2015;100.0;e;;0.0 +D;DG;WZ08-511;NOMINAL;2016;94.0;e;;0.0 +D;DG;WZ08-511;NOMINAL;2017;106.7;e;;0.0 +D;DG;WZ08-511;NOMINAL;2018;107.9;e;;0.0 +D;DG;WZ08-511;NOMINAL;2019;106.2;e;;0.0 +D;DG;WZ08-511;NOMINAL;2020;32.3;e;;0.0 +D;DG;WZ08-511;NOMINAL;2021;45.9;e;;0.0 +D;DG;WZ08-511;NOMINAL;2022;88.3;e;;0.0 +D;DG;WZ08-511;NOMINAL;2023;96.2;p;;0.0 +D;DG;WZ08-511;REAL;2015;100.0;e;;0.0 +D;DG;WZ08-511;REAL;2016;96.5;e;;0.0 +D;DG;WZ08-511;REAL;2017;108.2;e;;0.0 +D;DG;WZ08-511;REAL;2018;111.2;e;;0.0 +D;DG;WZ08-511;REAL;2019;109.9;e;;0.0 +D;DG;WZ08-511;REAL;2020;31.5;e;;0.0 +D;DG;WZ08-511;REAL;2021;40.2;e;;0.0 +D;DG;WZ08-511;REAL;2022;69.3;e;;0.0 +D;DG;WZ08-511;REAL;2023;83.7;p;;0.0 +D;DG;WZ08-5121;NOMINAL;2015;100.0;e;;0.0 +D;DG;WZ08-5121;NOMINAL;2016;119.8;e;;0.0 +D;DG;WZ08-5121;NOMINAL;2017;130.1;e;;0.0 +D;DG;WZ08-5121;NOMINAL;2018;145.0;e;;0.0 +D;DG;WZ08-5121;NOMINAL;2019;141.5;e;;0.0 +D;DG;WZ08-5121;NOMINAL;2020;156.8;e;;0.0 +D;DG;WZ08-5121;NOMINAL;2021;249.8;e;;0.0 +D;DG;WZ08-5121;NOMINAL;2022;318.6;e;;0.0 +D;DG;WZ08-5121;NOMINAL;2023;234.9;p;;0.0 +D;DG;WZ08-512;NOMINAL;2015;100.0;e;;0.0 +D;DG;WZ08-512;NOMINAL;2016;119.9;e;;0.0 +D;DG;WZ08-512;NOMINAL;2017;130.1;e;;0.0 +D;DG;WZ08-512;NOMINAL;2018;145.0;e;;0.0 +D;DG;WZ08-512;NOMINAL;2019;141.5;e;;0.0 +D;DG;WZ08-512;NOMINAL;2020;156.8;e;;0.0 +D;DG;WZ08-512;NOMINAL;2021;249.8;e;;0.0 +D;DG;WZ08-512;NOMINAL;2022;318.6;e;;0.0 +D;DG;WZ08-512;NOMINAL;2023;234.9;p;;0.0 +D;DG;WZ08-512;REAL;2015;100.0;e;;0.0 +D;DG;WZ08-512;REAL;2016;123.2;e;;0.0 +D;DG;WZ08-512;REAL;2017;132.1;e;;0.0 +D;DG;WZ08-512;REAL;2018;149.6;e;;0.0 +D;DG;WZ08-512;REAL;2019;146.8;e;;0.0 +D;DG;WZ08-512;REAL;2020;149.0;e;;0.0 +D;DG;WZ08-512;REAL;2021;219.3;e;;0.0 +D;DG;WZ08-512;REAL;2022;251.8;e;;0.0 +D;DG;WZ08-512;REAL;2023;203.7;p;;0.0 +D;DG;WZ08-51;NOMINAL;2015;100.0;e;;0.0 +D;DG;WZ08-51;NOMINAL;2016;98.7;e;;0.0 +D;DG;WZ08-51;NOMINAL;2017;110.9;e;;0.0 +D;DG;WZ08-51;NOMINAL;2018;114.6;e;;0.0 +D;DG;WZ08-51;NOMINAL;2019;112.5;e;;0.0 +D;DG;WZ08-51;NOMINAL;2020;54.8;e;;0.0 +D;DG;WZ08-51;NOMINAL;2021;82.6;e;;0.0 +D;DG;WZ08-51;NOMINAL;2022;129.8;e;;0.0 +D;DG;WZ08-51;NOMINAL;2023;121.2;p;;0.0 +D;DG;WZ08-51;REAL;2015;100.0;e;;0.0 +D;DG;WZ08-51;REAL;2016;101.3;e;;0.0 +D;DG;WZ08-51;REAL;2017;112.5;e;;0.0 +D;DG;WZ08-51;REAL;2018;118.1;e;;0.0 +D;DG;WZ08-51;REAL;2019;116.6;e;;0.0 +D;DG;WZ08-51;REAL;2020;52.7;e;;0.0 +D;DG;WZ08-51;REAL;2021;72.5;e;;0.0 +D;DG;WZ08-51;REAL;2022;102.1;e;;0.0 +D;DG;WZ08-51;REAL;2023;105.3;p;;0.0 +D;DG;WZ08-521;NOMINAL;2015;100.0;e;;0.0 +D;DG;WZ08-521;NOMINAL;2016;105.9;e;;0.0 +D;DG;WZ08-521;NOMINAL;2017;136.6;e;;0.0 +D;DG;WZ08-521;NOMINAL;2018;133.4;e;;0.0 +D;DG;WZ08-521;NOMINAL;2019;143.1;e;;0.0 +D;DG;WZ08-521;NOMINAL;2020;143.5;e;;0.0 +D;DG;WZ08-521;NOMINAL;2021;168.4;e;;0.0 +D;DG;WZ08-521;NOMINAL;2022;174.6;e;;0.0 +D;DG;WZ08-521;NOMINAL;2023;174.4;p;;0.0 +D;DG;WZ08-521;REAL;2015;100.0;e;;0.0 +D;DG;WZ08-521;REAL;2016;105.3;e;;0.0 +D;DG;WZ08-521;REAL;2017;135.4;e;;0.0 +D;DG;WZ08-521;REAL;2018;130.4;e;;0.0 +D;DG;WZ08-521;REAL;2019;136.3;e;;0.0 +D;DG;WZ08-521;REAL;2020;134.7;e;;0.0 +D;DG;WZ08-521;REAL;2021;154.8;e;;0.0 +D;DG;WZ08-521;REAL;2022;149.3;e;;0.0 +D;DG;WZ08-521;REAL;2023;139.4;p;;0.0 +D;DG;WZ08-5221;NOMINAL;2015;100.0;e;;0.0 +D;DG;WZ08-5221;NOMINAL;2016;103.3;e;;0.0 +D;DG;WZ08-5221;NOMINAL;2017;106.5;e;;0.0 +D;DG;WZ08-5221;NOMINAL;2018;114.0;e;;0.0 +D;DG;WZ08-5221;NOMINAL;2019;117.9;e;;0.0 +D;DG;WZ08-5221;NOMINAL;2020;113.1;e;;0.0 +D;DG;WZ08-5221;NOMINAL;2021;115.7;e;;0.0 +D;DG;WZ08-5221;NOMINAL;2022;133.8;e;;0.0 +D;DG;WZ08-5221;NOMINAL;2023;129.3;p;;0.0 +D;DG;WZ08-5222;NOMINAL;2015;100.0;e;;0.0 +D;DG;WZ08-5222;NOMINAL;2016;104.2;e;;0.0 +D;DG;WZ08-5222;NOMINAL;2017;87.9;e;;0.0 +D;DG;WZ08-5222;NOMINAL;2018;87.7;e;;0.0 +D;DG;WZ08-5222;NOMINAL;2019;100.0;e;;0.0 +D;DG;WZ08-5222;NOMINAL;2020;91.2;e;;0.0 +D;DG;WZ08-5222;NOMINAL;2021;81.9;e;;0.0 +D;DG;WZ08-5222;NOMINAL;2022;111.7;e;;0.0 +D;DG;WZ08-5222;NOMINAL;2023;88.4;p;;0.0 +D;DG;WZ08-5223;NOMINAL;2015;100.0;e;;0.0 +D;DG;WZ08-5223;NOMINAL;2016;101.3;e;;0.0 +D;DG;WZ08-5223;NOMINAL;2017;106.6;e;;0.0 +D;DG;WZ08-5223;NOMINAL;2018;113.6;e;;0.0 +D;DG;WZ08-5223;NOMINAL;2019;113.8;e;;0.0 +D;DG;WZ08-5223;NOMINAL;2020;67.2;e;;0.0 +D;DG;WZ08-5223;NOMINAL;2021;74.8;e;;0.0 +D;DG;WZ08-5223;NOMINAL;2022;98.9;e;;0.0 +D;DG;WZ08-5223;NOMINAL;2023;115.1;p;;0.0 +D;DG;WZ08-5224;NOMINAL;2015;100.0;e;;0.0 +D;DG;WZ08-5224;NOMINAL;2016;104.1;e;;0.0 +D;DG;WZ08-5224;NOMINAL;2017;102.2;e;;0.0 +D;DG;WZ08-5224;NOMINAL;2018;106.4;e;;0.0 +D;DG;WZ08-5224;NOMINAL;2019;103.9;e;;0.0 +D;DG;WZ08-5224;NOMINAL;2020;100.3;e;;0.0 +D;DG;WZ08-5224;NOMINAL;2021;113.1;e;;0.0 +D;DG;WZ08-5224;NOMINAL;2022;119.3;e;;0.0 +D;DG;WZ08-5224;NOMINAL;2023;111.9;p;;0.0 +D;DG;WZ08-5229;NOMINAL;2015;100.0;e;;0.0 +D;DG;WZ08-5229;NOMINAL;2016;100.5;e;;0.0 +D;DG;WZ08-5229;NOMINAL;2017;102.2;e;;0.0 +D;DG;WZ08-5229;NOMINAL;2018;104.3;e;;0.0 +D;DG;WZ08-5229;NOMINAL;2019;101.8;e;;0.0 +D;DG;WZ08-5229;NOMINAL;2020;98.0;e;;0.0 +D;DG;WZ08-5229;NOMINAL;2021;122.9;e;;0.0 +D;DG;WZ08-5229;NOMINAL;2022;142.3;e;;0.0 +D;DG;WZ08-5229;NOMINAL;2023;130.7;p;;0.0 +D;DG;WZ08-522;NOMINAL;2015;100.0;e;;0.0 +D;DG;WZ08-522;NOMINAL;2016;101.1;e;;0.0 +D;DG;WZ08-522;NOMINAL;2017;102.6;e;;0.0 +D;DG;WZ08-522;NOMINAL;2018;105.6;e;;0.0 +D;DG;WZ08-522;NOMINAL;2019;104.4;e;;0.0 +D;DG;WZ08-522;NOMINAL;2020;96.5;e;;0.0 +D;DG;WZ08-522;NOMINAL;2021;116.4;e;;0.0 +D;DG;WZ08-522;NOMINAL;2022;135.9;e;;0.0 +D;DG;WZ08-522;NOMINAL;2023;127.3;p;;0.0 +D;DG;WZ08-522;REAL;2015;100.0;e;;0.0 +D;DG;WZ08-522;REAL;2016;103.5;e;;0.0 +D;DG;WZ08-522;REAL;2017;102.1;e;;0.0 +D;DG;WZ08-522;REAL;2018;102.2;e;;0.0 +D;DG;WZ08-522;REAL;2019;98.2;e;;0.0 +D;DG;WZ08-522;REAL;2020;87.6;e;;0.0 +D;DG;WZ08-522;REAL;2021;94.0;e;;0.0 +D;DG;WZ08-522;REAL;2022;98.1;e;;0.0 +D;DG;WZ08-522;REAL;2023;98.3;p;;0.0 +D;DG;WZ08-52;NOMINAL;2015;100.0;e;;0.0 +D;DG;WZ08-52;NOMINAL;2016;101.5;e;;0.0 +D;DG;WZ08-52;NOMINAL;2017;105.7;e;;0.0 +D;DG;WZ08-52;NOMINAL;2018;108.2;e;;0.0 +D;DG;WZ08-52;NOMINAL;2019;108.0;e;;0.0 +D;DG;WZ08-52;NOMINAL;2020;100.8;e;;0.0 +D;DG;WZ08-52;NOMINAL;2021;121.1;e;;0.0 +D;DG;WZ08-52;NOMINAL;2022;139.4;e;;0.0 +D;DG;WZ08-52;NOMINAL;2023;131.6;p;;0.0 +D;DG;WZ08-52;REAL;2015;100.0;e;;0.0 +D;DG;WZ08-52;REAL;2016;103.7;e;;0.0 +D;DG;WZ08-52;REAL;2017;105.1;e;;0.0 +D;DG;WZ08-52;REAL;2018;104.7;e;;0.0 +D;DG;WZ08-52;REAL;2019;101.7;e;;0.0 +D;DG;WZ08-52;REAL;2020;91.9;e;;0.0 +D;DG;WZ08-52;REAL;2021;99.5;e;;0.0 +D;DG;WZ08-52;REAL;2022;102.8;e;;0.0 +D;DG;WZ08-52;REAL;2023;102.0;p;;0.0 +D;DG;WZ08-532;NOMINAL;2015;100.0;e;;0.0 +D;DG;WZ08-532;NOMINAL;2016;108.5;e;;0.0 +D;DG;WZ08-532;NOMINAL;2017;127.9;e;;0.0 +D;DG;WZ08-532;NOMINAL;2018;116.7;e;;0.0 +D;DG;WZ08-532;NOMINAL;2019;123.9;e;;0.0 +D;DG;WZ08-532;NOMINAL;2020;137.0;e;;0.0 +D;DG;WZ08-532;NOMINAL;2021;150.6;e;;0.0 +D;DG;WZ08-532;NOMINAL;2022;153.2;e;;0.0 +D;DG;WZ08-532;NOMINAL;2023;151.5;p;;0.0 +D;DG;WZ08-532;REAL;2015;100.0;e;;0.0 +D;DG;WZ08-532;REAL;2016;107.1;e;;0.0 +D;DG;WZ08-532;REAL;2017;124.3;e;;0.0 +D;DG;WZ08-532;REAL;2018;111.8;e;;0.0 +D;DG;WZ08-532;REAL;2019;114.7;e;;0.0 +D;DG;WZ08-532;REAL;2020;123.2;e;;0.0 +D;DG;WZ08-532;REAL;2021;132.1;e;;0.0 +D;DG;WZ08-532;REAL;2022;127.6;e;;0.0 +D;DG;WZ08-532;REAL;2023;121.2;p;;0.0 +D;DG;WZ08-53;NOMINAL;2015;100.0;e;;0.0 +D;DG;WZ08-53;NOMINAL;2016;108.5;e;;0.0 +D;DG;WZ08-53;NOMINAL;2017;127.9;e;;0.0 +D;DG;WZ08-53;NOMINAL;2018;116.7;e;;0.0 +D;DG;WZ08-53;NOMINAL;2019;123.9;e;;0.0 +D;DG;WZ08-53;NOMINAL;2020;137.0;e;;0.0 +D;DG;WZ08-53;NOMINAL;2021;150.6;e;;0.0 +D;DG;WZ08-53;NOMINAL;2022;153.2;e;;0.0 +D;DG;WZ08-53;NOMINAL;2023;151.5;p;;0.0 +D;DG;WZ08-53;REAL;2015;100.0;e;;0.0 +D;DG;WZ08-53;REAL;2016;107.1;e;;0.0 +D;DG;WZ08-53;REAL;2017;124.3;e;;0.0 +D;DG;WZ08-53;REAL;2018;111.8;e;;0.0 +D;DG;WZ08-53;REAL;2019;114.7;e;;0.0 +D;DG;WZ08-53;REAL;2020;123.2;e;;0.0 +D;DG;WZ08-53;REAL;2021;132.1;e;;0.0 +D;DG;WZ08-53;REAL;2022;127.6;e;;0.0 +D;DG;WZ08-53;REAL;2023;121.2;p;;0.0 +D;DG;WZ08-551;NOMINAL;2015;100.0;e;;0.0 +D;DG;WZ08-551;NOMINAL;2016;105.7;e;;0.0 +D;DG;WZ08-551;NOMINAL;2017;109.5;e;;0.0 +D;DG;WZ08-551;NOMINAL;2018;115.9;e;;0.0 +D;DG;WZ08-551;NOMINAL;2019;120.4;e;;0.0 +D;DG;WZ08-551;NOMINAL;2020;64.7;e;;0.0 +D;DG;WZ08-551;NOMINAL;2021;74.1;e;;0.0 +D;DG;WZ08-551;NOMINAL;2022;133.7;e;;0.0 +D;DG;WZ08-551;NOMINAL;2023;147.8;p;;0.0 +D;DG;WZ08-551;REAL;2015;100.0;e;;0.0 +D;DG;WZ08-551;REAL;2016;103.7;e;;0.0 +D;DG;WZ08-551;REAL;2017;105.4;e;;0.0 +D;DG;WZ08-551;REAL;2018;109.2;e;;0.0 +D;DG;WZ08-551;REAL;2019;111.2;e;;0.0 +D;DG;WZ08-551;REAL;2020;58.7;e;;0.0 +D;DG;WZ08-551;REAL;2021;66.5;e;;0.0 +D;DG;WZ08-551;REAL;2022;110.7;e;;0.0 +D;DG;WZ08-551;REAL;2023;113.5;p;;0.0 +D;DG;WZ08-552;NOMINAL;2015;100.0;e;;0.0 +D;DG;WZ08-552;NOMINAL;2016;105.7;e;;0.0 +D;DG;WZ08-552;NOMINAL;2017;107.0;e;;0.0 +D;DG;WZ08-552;NOMINAL;2018;109.8;e;;0.0 +D;DG;WZ08-552;NOMINAL;2019;114.0;e;;0.0 +D;DG;WZ08-552;NOMINAL;2020;75.8;e;;0.0 +D;DG;WZ08-552;NOMINAL;2021;90.2;e;;0.0 +D;DG;WZ08-552;NOMINAL;2022;147.1;e;;0.0 +D;DG;WZ08-552;NOMINAL;2023;155.2;p;;0.0 +D;DG;WZ08-552;REAL;2015;100.0;e;;0.0 +D;DG;WZ08-552;REAL;2016;103.7;e;;0.0 +D;DG;WZ08-552;REAL;2017;102.2;e;;0.0 +D;DG;WZ08-552;REAL;2018;102.4;e;;0.0 +D;DG;WZ08-552;REAL;2019;104.2;e;;0.0 +D;DG;WZ08-552;REAL;2020;66.1;e;;0.0 +D;DG;WZ08-552;REAL;2021;76.7;e;;0.0 +D;DG;WZ08-552;REAL;2022;119.1;e;;0.0 +D;DG;WZ08-552;REAL;2023;116.3;p;;0.0 +D;DG;WZ08-553;NOMINAL;2015;100.0;e;;0.0 +D;DG;WZ08-553;NOMINAL;2016;100.9;e;;0.0 +D;DG;WZ08-553;NOMINAL;2017;110.8;e;;0.0 +D;DG;WZ08-553;NOMINAL;2018;120.4;e;;0.0 +D;DG;WZ08-553;NOMINAL;2019;123.1;e;;0.0 +D;DG;WZ08-553;NOMINAL;2020;118.8;e;;0.0 +D;DG;WZ08-553;NOMINAL;2021;126.1;e;;0.0 +D;DG;WZ08-553;NOMINAL;2022;151.0;e;;0.0 +D;DG;WZ08-553;NOMINAL;2023;156.5;p;;0.0 +D;DG;WZ08-553;REAL;2015;100.0;e;;0.0 +D;DG;WZ08-553;REAL;2016;98.7;e;;0.0 +D;DG;WZ08-553;REAL;2017;106.8;e;;0.0 +D;DG;WZ08-553;REAL;2018;114.0;e;;0.0 +D;DG;WZ08-553;REAL;2019;114.4;e;;0.0 +D;DG;WZ08-553;REAL;2020;106.1;e;;0.0 +D;DG;WZ08-553;REAL;2021;108.1;e;;0.0 +D;DG;WZ08-553;REAL;2022;122.6;e;;0.0 +D;DG;WZ08-553;REAL;2023;119.9;p;;0.0 +D;DG;WZ08-55;NOMINAL;2015;100.0;e;;0.0 +D;DG;WZ08-55;NOMINAL;2016;105.7;e;;0.0 +D;DG;WZ08-55;NOMINAL;2017;109.4;e;;0.0 +D;DG;WZ08-55;NOMINAL;2018;115.7;e;;0.0 +D;DG;WZ08-55;NOMINAL;2019;120.1;e;;0.0 +D;DG;WZ08-55;NOMINAL;2020;66.4;e;;0.0 +D;DG;WZ08-55;NOMINAL;2021;76.1;e;;0.0 +D;DG;WZ08-55;NOMINAL;2022;134.7;e;;0.0 +D;DG;WZ08-55;NOMINAL;2023;148.3;p;;0.0 +D;DG;WZ08-55;REAL;2015;100.0;e;;0.0 +D;DG;WZ08-55;REAL;2016;103.8;e;;0.0 +D;DG;WZ08-55;REAL;2017;105.4;e;;0.0 +D;DG;WZ08-55;REAL;2018;109.0;e;;0.0 +D;DG;WZ08-55;REAL;2019;110.8;e;;0.0 +D;DG;WZ08-55;REAL;2020;60.1;e;;0.0 +D;DG;WZ08-55;REAL;2021;67.9;e;;0.0 +D;DG;WZ08-55;REAL;2022;111.3;e;;0.0 +D;DG;WZ08-55;REAL;2023;113.7;p;;0.0 +D;DG;WZ08-561-01;NOMINAL;2015;100.0;e;;0.0 +D;DG;WZ08-561-01;NOMINAL;2016;103.1;e;;0.0 +D;DG;WZ08-561-01;NOMINAL;2017;108.7;e;;0.0 +D;DG;WZ08-561-01;NOMINAL;2018;113.8;e;;0.0 +D;DG;WZ08-561-01;NOMINAL;2019;119.4;e;;0.0 +D;DG;WZ08-561-01;NOMINAL;2020;80.3;e;;0.0 +D;DG;WZ08-561-01;NOMINAL;2021;84.0;e;;0.0 +D;DG;WZ08-561-01;NOMINAL;2022;120.0;e;;0.0 +D;DG;WZ08-561-01;NOMINAL;2023;127.7;p;;0.0 +D;DG;WZ08-561-01;REAL;2015;100.0;e;;0.0 +D;DG;WZ08-561-01;REAL;2016;100.6;e;;0.0 +D;DG;WZ08-561-01;REAL;2017;103.9;e;;0.0 +D;DG;WZ08-561-01;REAL;2018;106.4;e;;0.0 +D;DG;WZ08-561-01;REAL;2019;108.5;e;;0.0 +D;DG;WZ08-561-01;REAL;2020;69.4;e;;0.0 +D;DG;WZ08-561-01;REAL;2021;70.1;e;;0.0 +D;DG;WZ08-561-01;REAL;2022;93.8;e;;0.0 +D;DG;WZ08-561-01;REAL;2023;90.0;p;;0.0 +D;DG;WZ08-561;NOMINAL;2015;100.0;e;;0.0 +D;DG;WZ08-561;NOMINAL;2016;103.3;e;;0.0 +D;DG;WZ08-561;NOMINAL;2017;109.0;e;;0.0 +D;DG;WZ08-561;NOMINAL;2018;114.1;e;;0.0 +D;DG;WZ08-561;NOMINAL;2019;120.2;e;;0.0 +D;DG;WZ08-561;NOMINAL;2020;83.6;e;;0.0 +D;DG;WZ08-561;NOMINAL;2021;87.5;e;;0.0 +D;DG;WZ08-561;NOMINAL;2022;123.3;e;;0.0 +D;DG;WZ08-561;NOMINAL;2023;131.6;p;;0.0 +D;DG;WZ08-561;REAL;2015;100.0;e;;0.0 +D;DG;WZ08-561;REAL;2016;100.8;e;;0.0 +D;DG;WZ08-561;REAL;2017;104.2;e;;0.0 +D;DG;WZ08-561;REAL;2018;106.7;e;;0.0 +D;DG;WZ08-561;REAL;2019;109.3;e;;0.0 +D;DG;WZ08-561;REAL;2020;72.2;e;;0.0 +D;DG;WZ08-561;REAL;2021;73.1;e;;0.0 +D;DG;WZ08-561;REAL;2022;96.7;e;;0.0 +D;DG;WZ08-561;REAL;2023;92.5;p;;0.0 +D;DG;WZ08-562;NOMINAL;2015;100.0;e;;0.0 +D;DG;WZ08-562;NOMINAL;2016;103.5;e;;0.0 +D;DG;WZ08-562;NOMINAL;2017;106.7;e;;0.0 +D;DG;WZ08-562;NOMINAL;2018;111.3;e;;0.0 +D;DG;WZ08-562;NOMINAL;2019;116.3;e;;0.0 +D;DG;WZ08-562;NOMINAL;2020;85.0;e;;0.0 +D;DG;WZ08-562;NOMINAL;2021;86.2;e;;0.0 +D;DG;WZ08-562;NOMINAL;2022;116.7;e;;0.0 +D;DG;WZ08-562;NOMINAL;2023;130.7;p;;0.0 +D;DG;WZ08-562;REAL;2015;100.0;e;;0.0 +D;DG;WZ08-562;REAL;2016;101.6;e;;0.0 +D;DG;WZ08-562;REAL;2017;102.5;e;;0.0 +D;DG;WZ08-562;REAL;2018;105.4;e;;0.0 +D;DG;WZ08-562;REAL;2019;107.9;e;;0.0 +D;DG;WZ08-562;REAL;2020;76.9;e;;0.0 +D;DG;WZ08-562;REAL;2021;75.9;e;;0.0 +D;DG;WZ08-562;REAL;2022;95.8;e;;0.0 +D;DG;WZ08-562;REAL;2023;97.4;p;;0.0 +D;DG;WZ08-563;NOMINAL;2015;100.0;e;;0.0 +D;DG;WZ08-563;NOMINAL;2016;101.4;e;;0.0 +D;DG;WZ08-563;NOMINAL;2017;106.6;e;;0.0 +D;DG;WZ08-563;NOMINAL;2018;111.6;e;;0.0 +D;DG;WZ08-563;NOMINAL;2019;112.8;e;;0.0 +D;DG;WZ08-563;NOMINAL;2020;54.9;e;;0.0 +D;DG;WZ08-563;NOMINAL;2021;56.6;e;;0.0 +D;DG;WZ08-563;NOMINAL;2022;94.3;e;;0.0 +D;DG;WZ08-563;NOMINAL;2023;97.1;p;;0.0 +D;DG;WZ08-563;REAL;2015;100.0;e;;0.0 +D;DG;WZ08-563;REAL;2016;99.3;e;;0.0 +D;DG;WZ08-563;REAL;2017;102.3;e;;0.0 +D;DG;WZ08-563;REAL;2018;104.9;e;;0.0 +D;DG;WZ08-563;REAL;2019;103.4;e;;0.0 +D;DG;WZ08-563;REAL;2020;47.4;e;;0.0 +D;DG;WZ08-563;REAL;2021;46.0;e;;0.0 +D;DG;WZ08-563;REAL;2022;70.5;e;;0.0 +D;DG;WZ08-563;REAL;2023;70.2;p;;0.0 +D;DG;WZ08-56;NOMINAL;2015;100.0;e;;0.0 +D;DG;WZ08-56;NOMINAL;2016;103.1;e;;0.0 +D;DG;WZ08-56;NOMINAL;2017;108.3;e;;0.0 +D;DG;WZ08-56;NOMINAL;2018;113.2;e;;0.0 +D;DG;WZ08-56;NOMINAL;2019;118.7;e;;0.0 +D;DG;WZ08-56;NOMINAL;2020;81.4;e;;0.0 +D;DG;WZ08-56;NOMINAL;2021;84.5;e;;0.0 +D;DG;WZ08-56;NOMINAL;2022;119.3;e;;0.0 +D;DG;WZ08-56;NOMINAL;2023;128.4;p;;0.0 +D;DG;WZ08-56;REAL;2015;100.0;e;;0.0 +D;DG;WZ08-56;REAL;2016;100.8;e;;0.0 +D;DG;WZ08-56;REAL;2017;103.6;e;;0.0 +D;DG;WZ08-56;REAL;2018;106.2;e;;0.0 +D;DG;WZ08-56;REAL;2019;108.4;e;;0.0 +D;DG;WZ08-56;REAL;2020;71.0;e;;0.0 +D;DG;WZ08-56;REAL;2021;71.4;e;;0.0 +D;DG;WZ08-56;REAL;2022;94.2;e;;0.0 +D;DG;WZ08-56;REAL;2023;91.6;p;;0.0 +D;DG;WZ08-58-02;NOMINAL;2015;100.0;e;;0.0 +D;DG;WZ08-58-02;NOMINAL;2016;102.6;e;;0.0 +D;DG;WZ08-58-02;NOMINAL;2017;104.8;e;;0.0 +D;DG;WZ08-58-02;NOMINAL;2018;102.7;e;;0.0 +D;DG;WZ08-58-02;NOMINAL;2019;101.8;e;;0.0 +D;DG;WZ08-58-02;NOMINAL;2020;96.2;e;;0.0 +D;DG;WZ08-58-02;NOMINAL;2021;102.2;e;;0.0 +D;DG;WZ08-58-02;NOMINAL;2022;109.2;e;;0.0 +D;DG;WZ08-58-02;NOMINAL;2023;111.0;p;;0.0 +D;DG;WZ08-58-02;REAL;2015;100.0;e;;0.0 +D;DG;WZ08-58-02;REAL;2016;100.9;e;;0.0 +D;DG;WZ08-58-02;REAL;2017;101.7;e;;0.0 +D;DG;WZ08-58-02;REAL;2018;99.0;e;;0.0 +D;DG;WZ08-58-02;REAL;2019;96.3;e;;0.0 +D;DG;WZ08-58-02;REAL;2020;90.4;e;;0.0 +D;DG;WZ08-58-02;REAL;2021;94.7;e;;0.0 +D;DG;WZ08-58-02;REAL;2022;98.2;e;;0.0 +D;DG;WZ08-58-02;REAL;2023;95.9;p;;0.0 +D;DG;WZ08-58-03;NOMINAL;2015;100.0;e;;0.0 +D;DG;WZ08-58-03;NOMINAL;2016;112.4;e;;0.0 +D;DG;WZ08-58-03;NOMINAL;2017;110.0;e;;0.0 +D;DG;WZ08-58-03;NOMINAL;2018;102.1;e;;0.0 +D;DG;WZ08-58-03;NOMINAL;2019;100.0;e;;0.0 +D;DG;WZ08-58-03;NOMINAL;2020;92.7;e;;0.0 +D;DG;WZ08-58-03;NOMINAL;2021;97.9;e;;0.0 +D;DG;WZ08-58-03;NOMINAL;2022;104.5;e;;0.0 +D;DG;WZ08-58-03;NOMINAL;2023;104.6;p;;0.0 +D;DG;WZ08-58-03;REAL;2015;100.0;e;;0.0 +D;DG;WZ08-58-03;REAL;2016;110.5;e;;0.0 +D;DG;WZ08-58-03;REAL;2017;106.8;e;;0.0 +D;DG;WZ08-58-03;REAL;2018;98.3;e;;0.0 +D;DG;WZ08-58-03;REAL;2019;94.3;e;;0.0 +D;DG;WZ08-58-03;REAL;2020;86.7;e;;0.0 +D;DG;WZ08-58-03;REAL;2021;90.1;e;;0.0 +D;DG;WZ08-58-03;REAL;2022;93.1;e;;0.0 +D;DG;WZ08-58-03;REAL;2023;89.5;p;;0.0 +D;DG;WZ08-58-04;NOMINAL;2015;100.0;e;;0.0 +D;DG;WZ08-58-04;NOMINAL;2016;109.7;e;;0.0 +D;DG;WZ08-58-04;NOMINAL;2017;104.8;e;;0.0 +D;DG;WZ08-58-04;NOMINAL;2018;114.0;e;;0.0 +D;DG;WZ08-58-04;NOMINAL;2019;115.6;e;;0.0 +D;DG;WZ08-58-04;NOMINAL;2020;117.2;e;;0.0 +D;DG;WZ08-58-04;NOMINAL;2021;125.2;e;;0.0 +D;DG;WZ08-58-04;NOMINAL;2022;137.4;e;;0.0 +D;DG;WZ08-58-04;NOMINAL;2023;146.4;p;;0.0 +D;DG;WZ08-58-04;REAL;2015;100.0;e;;0.0 +D;DG;WZ08-58-04;REAL;2016;110.5;e;;0.0 +D;DG;WZ08-58-04;REAL;2017;105.8;e;;0.0 +D;DG;WZ08-58-04;REAL;2018;114.1;e;;0.0 +D;DG;WZ08-58-04;REAL;2019;115.0;e;;0.0 +D;DG;WZ08-58-04;REAL;2020;115.9;e;;0.0 +D;DG;WZ08-58-04;REAL;2021;122.5;e;;0.0 +D;DG;WZ08-58-04;REAL;2022;132.7;e;;0.0 +D;DG;WZ08-58-04;REAL;2023;138.3;p;;0.0 +D;DG;WZ08-58-05;NOMINAL;2015;100.0;e;;0.0 +D;DG;WZ08-58-05;NOMINAL;2016;106.5;e;;0.0 +D;DG;WZ08-58-05;NOMINAL;2017;112.9;e;;0.0 +D;DG;WZ08-58-05;NOMINAL;2018;122.8;e;;0.0 +D;DG;WZ08-58-05;NOMINAL;2019;127.4;e;;0.0 +D;DG;WZ08-58-05;NOMINAL;2020;127.8;e;;0.0 +D;DG;WZ08-58-05;NOMINAL;2021;139.9;e;;0.0 +D;DG;WZ08-58-05;NOMINAL;2022;156.1;e;;0.0 +D;DG;WZ08-58-05;NOMINAL;2023;165.2;p;;0.0 +D;DG;WZ08-58-05;REAL;2015;100.0;e;;0.0 +D;DG;WZ08-58-05;REAL;2016;107.0;e;;0.0 +D;DG;WZ08-58-05;REAL;2017;113.2;e;;0.0 +D;DG;WZ08-58-05;REAL;2018;122.4;e;;0.0 +D;DG;WZ08-58-05;REAL;2019;126.4;e;;0.0 +D;DG;WZ08-58-05;REAL;2020;126.4;e;;0.0 +D;DG;WZ08-58-05;REAL;2021;137.6;e;;0.0 +D;DG;WZ08-58-05;REAL;2022;151.9;e;;0.0 +D;DG;WZ08-58-05;REAL;2023;157.0;p;;0.0 +D;DG;WZ08-5811;NOMINAL;2015;100.0;e;;0.0 +D;DG;WZ08-5811;NOMINAL;2016;100.4;e;;0.0 +D;DG;WZ08-5811;NOMINAL;2017;103.4;e;;0.0 +D;DG;WZ08-5811;NOMINAL;2018;100.2;e;;0.0 +D;DG;WZ08-5811;NOMINAL;2019;98.6;e;;0.0 +D;DG;WZ08-5811;NOMINAL;2020;99.5;e;;0.0 +D;DG;WZ08-5811;NOMINAL;2021;106.6;e;;0.0 +D;DG;WZ08-5811;NOMINAL;2022;108.1;e;;0.0 +D;DG;WZ08-5811;NOMINAL;2023;113.3;p;;0.0 +D;DG;WZ08-5812;NOMINAL;2015;100.0;e;;0.0 +D;DG;WZ08-5812;NOMINAL;2016;84.0;e;;0.0 +D;DG;WZ08-5812;NOMINAL;2017;79.4;e;;0.0 +D;DG;WZ08-5812;NOMINAL;2018;71.6;e;;0.0 +D;DG;WZ08-5812;NOMINAL;2019;68.0;e;;0.0 +D;DG;WZ08-5812;NOMINAL;2020;68.9;e;;0.0 +D;DG;WZ08-5812;NOMINAL;2021;60.1;e;;0.0 +D;DG;WZ08-5812;NOMINAL;2022;55.5;e;;0.0 +D;DG;WZ08-5812;NOMINAL;2023;51.6;p;;0.0 +D;DG;WZ08-5813;NOMINAL;2015;100.0;e;;0.0 +D;DG;WZ08-5813;NOMINAL;2016;98.5;e;;0.0 +D;DG;WZ08-5813;NOMINAL;2017;100.2;e;;0.0 +D;DG;WZ08-5813;NOMINAL;2018;95.2;e;;0.0 +D;DG;WZ08-5813;NOMINAL;2019;93.2;e;;0.0 +D;DG;WZ08-5813;NOMINAL;2020;88.1;e;;0.0 +D;DG;WZ08-5813;NOMINAL;2021;92.3;e;;0.0 +D;DG;WZ08-5813;NOMINAL;2022;94.7;e;;0.0 +D;DG;WZ08-5813;NOMINAL;2023;95.4;p;;0.0 +D;DG;WZ08-5814;NOMINAL;2015;100.0;e;;0.0 +D;DG;WZ08-5814;NOMINAL;2016;99.1;e;;0.0 +D;DG;WZ08-5814;NOMINAL;2017;96.7;e;;0.0 +D;DG;WZ08-5814;NOMINAL;2018;94.3;e;;0.0 +D;DG;WZ08-5814;NOMINAL;2019;92.7;e;;0.0 +D;DG;WZ08-5814;NOMINAL;2020;89.9;e;;0.0 +D;DG;WZ08-5814;NOMINAL;2021;85.8;e;;0.0 +D;DG;WZ08-5814;NOMINAL;2022;91.2;e;;0.0 +D;DG;WZ08-5814;NOMINAL;2023;91.1;p;;0.0 +D;DG;WZ08-5819;NOMINAL;2015;100.0;e;;0.0 +D;DG;WZ08-5819;NOMINAL;2016;104.4;e;;0.0 +D;DG;WZ08-5819;NOMINAL;2017;96.8;e;;0.0 +D;DG;WZ08-5819;NOMINAL;2018;99.3;e;;0.0 +D;DG;WZ08-5819;NOMINAL;2019;96.0;e;;0.0 +D;DG;WZ08-5819;NOMINAL;2020;88.6;e;;0.0 +D;DG;WZ08-5819;NOMINAL;2021;92.6;e;;0.0 +D;DG;WZ08-5819;NOMINAL;2022;98.7;e;;0.0 +D;DG;WZ08-5819;NOMINAL;2023;97.9;p;;0.0 +D;DG;WZ08-581;NOMINAL;2015;100.0;e;;0.0 +D;DG;WZ08-581;NOMINAL;2016;98.7;e;;0.0 +D;DG;WZ08-581;NOMINAL;2017;98.4;e;;0.0 +D;DG;WZ08-581;NOMINAL;2018;95.0;e;;0.0 +D;DG;WZ08-581;NOMINAL;2019;92.9;e;;0.0 +D;DG;WZ08-581;NOMINAL;2020;89.7;e;;0.0 +D;DG;WZ08-581;NOMINAL;2021;91.5;e;;0.0 +D;DG;WZ08-581;NOMINAL;2022;94.4;e;;0.0 +D;DG;WZ08-581;NOMINAL;2023;95.4;p;;0.0 +D;DG;WZ08-581;REAL;2015;100.0;e;;0.0 +D;DG;WZ08-581;REAL;2016;96.5;e;;0.0 +D;DG;WZ08-581;REAL;2017;94.6;e;;0.0 +D;DG;WZ08-581;REAL;2018;90.1;e;;0.0 +D;DG;WZ08-581;REAL;2019;85.2;e;;0.0 +D;DG;WZ08-581;REAL;2020;81.7;e;;0.0 +D;DG;WZ08-581;REAL;2021;81.6;e;;0.0 +D;DG;WZ08-581;REAL;2022;82.0;e;;0.0 +D;DG;WZ08-581;REAL;2023;78.6;p;;0.0 +D;DG;WZ08-5821;NOMINAL;2015;100.0;e;;0.0 +D;DG;WZ08-5821;NOMINAL;2016;113.1;e;;0.0 +D;DG;WZ08-5821;NOMINAL;2017;136.7;e;;0.0 +D;DG;WZ08-5821;NOMINAL;2018;114.7;e;;0.0 +D;DG;WZ08-5821;NOMINAL;2019;101.8;e;;0.0 +D;DG;WZ08-5821;NOMINAL;2020;150.8;e;;0.0 +D;DG;WZ08-5821;NOMINAL;2021;149.8;e;;0.0 +D;DG;WZ08-5821;NOMINAL;2022;171.4;e;;0.0 +D;DG;WZ08-5821;NOMINAL;2023;197.0;p;;0.0 +D;DG;WZ08-5829;NOMINAL;2015;100.0;e;;0.0 +D;DG;WZ08-5829;NOMINAL;2016;111.0;e;;0.0 +D;DG;WZ08-5829;NOMINAL;2017;116.9;e;;0.0 +D;DG;WZ08-5829;NOMINAL;2018;114.8;e;;0.0 +D;DG;WZ08-5829;NOMINAL;2019;123.8;e;;0.0 +D;DG;WZ08-5829;NOMINAL;2020;122.0;e;;0.0 +D;DG;WZ08-5829;NOMINAL;2021;145.0;e;;0.0 +D;DG;WZ08-5829;NOMINAL;2022;153.5;e;;0.0 +D;DG;WZ08-5829;NOMINAL;2023;168.5;p;;0.0 +D;DG;WZ08-582;NOMINAL;2015;100.0;e;;0.0 +D;DG;WZ08-582;NOMINAL;2016;111.2;e;;0.0 +D;DG;WZ08-582;NOMINAL;2017;118.6;e;;0.0 +D;DG;WZ08-582;NOMINAL;2018;114.8;e;;0.0 +D;DG;WZ08-582;NOMINAL;2019;122.0;e;;0.0 +D;DG;WZ08-582;NOMINAL;2020;124.4;e;;0.0 +D;DG;WZ08-582;NOMINAL;2021;145.4;e;;0.0 +D;DG;WZ08-582;NOMINAL;2022;155.0;e;;0.0 +D;DG;WZ08-582;NOMINAL;2023;170.8;p;;0.0 +D;DG;WZ08-582;REAL;2015;100.0;e;;0.0 +D;DG;WZ08-582;REAL;2016;111.2;e;;0.0 +D;DG;WZ08-582;REAL;2017;117.8;e;;0.0 +D;DG;WZ08-582;REAL;2018;113.9;e;;0.0 +D;DG;WZ08-582;REAL;2019;121.0;e;;0.0 +D;DG;WZ08-582;REAL;2020;122.8;e;;0.0 +D;DG;WZ08-582;REAL;2021;143.3;e;;0.0 +D;DG;WZ08-582;REAL;2022;149.7;e;;0.0 +D;DG;WZ08-582;REAL;2023;159.6;p;;0.0 +D;DG;WZ08-58;NOMINAL;2015;100.0;e;;0.0 +D;DG;WZ08-58;NOMINAL;2016;101.0;e;;0.0 +D;DG;WZ08-58;NOMINAL;2017;102.1;e;;0.0 +D;DG;WZ08-58;NOMINAL;2018;98.6;e;;0.0 +D;DG;WZ08-58;NOMINAL;2019;98.2;e;;0.0 +D;DG;WZ08-58;NOMINAL;2020;96.0;e;;0.0 +D;DG;WZ08-58;NOMINAL;2021;101.3;e;;0.0 +D;DG;WZ08-58;NOMINAL;2022;105.5;e;;0.0 +D;DG;WZ08-58;NOMINAL;2023;109.1;p;;0.0 +D;DG;WZ08-58;REAL;2015;100.0;e;;0.0 +D;DG;WZ08-58;REAL;2016;99.1;e;;0.0 +D;DG;WZ08-58;REAL;2017;98.9;e;;0.0 +D;DG;WZ08-58;REAL;2018;94.4;e;;0.0 +D;DG;WZ08-58;REAL;2019;91.7;e;;0.0 +D;DG;WZ08-58;REAL;2020;89.1;e;;0.0 +D;DG;WZ08-58;REAL;2021;92.9;e;;0.0 +D;DG;WZ08-58;REAL;2022;94.4;e;;0.0 +D;DG;WZ08-58;REAL;2023;93.4;p;;0.0 +D;DG;WZ08-5911;NOMINAL;2015;100.0;e;;0.0 +D;DG;WZ08-5911;NOMINAL;2016;115.4;e;;0.0 +D;DG;WZ08-5911;NOMINAL;2017;105.0;e;;0.0 +D;DG;WZ08-5911;NOMINAL;2018;116.3;e;;0.0 +D;DG;WZ08-5911;NOMINAL;2019;120.7;e;;0.0 +D;DG;WZ08-5911;NOMINAL;2020;100.6;e;;0.0 +D;DG;WZ08-5911;NOMINAL;2021;112.8;e;;0.0 +D;DG;WZ08-5911;NOMINAL;2022;144.5;e;;0.0 +D;DG;WZ08-5911;NOMINAL;2023;149.7;p;;0.0 +D;DG;WZ08-5912;NOMINAL;2015;100.0;e;;0.0 +D;DG;WZ08-5912;NOMINAL;2016;101.7;e;;0.0 +D;DG;WZ08-5912;NOMINAL;2017;124.6;e;;0.0 +D;DG;WZ08-5912;NOMINAL;2018;126.0;e;;0.0 +D;DG;WZ08-5912;NOMINAL;2019;132.2;e;;0.0 +D;DG;WZ08-5912;NOMINAL;2020;120.6;e;;0.0 +D;DG;WZ08-5912;NOMINAL;2021;133.9;e;;0.0 +D;DG;WZ08-5912;NOMINAL;2022;162.4;e;;0.0 +D;DG;WZ08-5912;NOMINAL;2023;152.0;p;;0.0 +D;DG;WZ08-5913;NOMINAL;2015;100.0;e;;0.0 +D;DG;WZ08-5913;NOMINAL;2016;107.3;e;;0.0 +D;DG;WZ08-5913;NOMINAL;2017;92.1;e;;0.0 +D;DG;WZ08-5913;NOMINAL;2018;101.6;e;;0.0 +D;DG;WZ08-5913;NOMINAL;2019;90.1;e;;0.0 +D;DG;WZ08-5913;NOMINAL;2020;88.3;e;;0.0 +D;DG;WZ08-5913;NOMINAL;2021;81.1;e;;0.0 +D;DG;WZ08-5913;NOMINAL;2022;90.4;e;;0.0 +D;DG;WZ08-5913;NOMINAL;2023;78.0;p;;0.0 +D;DG;WZ08-5914;NOMINAL;2015;100.0;e;;0.0 +D;DG;WZ08-5914;NOMINAL;2016;90.6;e;;0.0 +D;DG;WZ08-5914;NOMINAL;2017;92.5;e;;0.0 +D;DG;WZ08-5914;NOMINAL;2018;83.9;e;;0.0 +D;DG;WZ08-5914;NOMINAL;2019;95.9;e;;0.0 +D;DG;WZ08-5914;NOMINAL;2020;30.4;e;;0.0 +D;DG;WZ08-5914;NOMINAL;2021;45.6;e;;0.0 +D;DG;WZ08-5914;NOMINAL;2022;85.5;e;;0.0 +D;DG;WZ08-5914;NOMINAL;2023;109.0;p;;0.0 +D;DG;WZ08-591;NOMINAL;2015;100.0;e;;0.0 +D;DG;WZ08-591;NOMINAL;2016;108.6;e;;0.0 +D;DG;WZ08-591;NOMINAL;2017;101.1;e;;0.0 +D;DG;WZ08-591;NOMINAL;2018;107.8;e;;0.0 +D;DG;WZ08-591;NOMINAL;2019;110.9;e;;0.0 +D;DG;WZ08-591;NOMINAL;2020;85.8;e;;0.0 +D;DG;WZ08-591;NOMINAL;2021;95.1;e;;0.0 +D;DG;WZ08-591;NOMINAL;2022;124.1;e;;0.0 +D;DG;WZ08-591;NOMINAL;2023;129.0;p;;0.0 +D;DG;WZ08-591;REAL;2015;100.0;e;;0.0 +D;DG;WZ08-591;REAL;2016;107.0;e;;0.0 +D;DG;WZ08-591;REAL;2017;97.6;e;;0.0 +D;DG;WZ08-591;REAL;2018;102.4;e;;0.0 +D;DG;WZ08-591;REAL;2019;104.3;e;;0.0 +D;DG;WZ08-591;REAL;2020;80.4;e;;0.0 +D;DG;WZ08-591;REAL;2021;87.0;e;;0.0 +D;DG;WZ08-591;REAL;2022;107.8;e;;0.0 +D;DG;WZ08-591;REAL;2023;106.1;p;;0.0 +D;DG;WZ08-592;NOMINAL;2015;100.0;e;;0.0 +D;DG;WZ08-592;NOMINAL;2016;96.9;e;;0.0 +D;DG;WZ08-592;NOMINAL;2017;112.4;e;;0.0 +D;DG;WZ08-592;NOMINAL;2018;120.6;e;;0.0 +D;DG;WZ08-592;NOMINAL;2019;122.9;e;;0.0 +D;DG;WZ08-592;NOMINAL;2020;119.1;e;;0.0 +D;DG;WZ08-592;NOMINAL;2021;116.8;e;;0.0 +D;DG;WZ08-592;NOMINAL;2022;133.7;e;;0.0 +D;DG;WZ08-592;NOMINAL;2023;148.1;p;;0.0 +D;DG;WZ08-592;REAL;2015;100.0;e;;0.0 +D;DG;WZ08-592;REAL;2016;96.3;e;;0.0 +D;DG;WZ08-592;REAL;2017;108.2;e;;0.0 +D;DG;WZ08-592;REAL;2018;117.8;e;;0.0 +D;DG;WZ08-592;REAL;2019;112.4;e;;0.0 +D;DG;WZ08-592;REAL;2020;104.7;e;;0.0 +D;DG;WZ08-592;REAL;2021;106.0;e;;0.0 +D;DG;WZ08-592;REAL;2022;116.2;e;;0.0 +D;DG;WZ08-592;REAL;2023;125.7;p;;0.0 +D;DG;WZ08-59;NOMINAL;2015;100.0;e;;0.0 +D;DG;WZ08-59;NOMINAL;2016;105.8;e;;0.0 +D;DG;WZ08-59;NOMINAL;2017;103.8;e;;0.0 +D;DG;WZ08-59;NOMINAL;2018;110.8;e;;0.0 +D;DG;WZ08-59;NOMINAL;2019;113.7;e;;0.0 +D;DG;WZ08-59;NOMINAL;2020;93.5;e;;0.0 +D;DG;WZ08-59;NOMINAL;2021;100.2;e;;0.0 +D;DG;WZ08-59;NOMINAL;2022;126.4;e;;0.0 +D;DG;WZ08-59;NOMINAL;2023;133.4;p;;0.0 +D;DG;WZ08-59;REAL;2015;100.0;e;;0.0 +D;DG;WZ08-59;REAL;2016;104.5;e;;0.0 +D;DG;WZ08-59;REAL;2017;100.1;e;;0.0 +D;DG;WZ08-59;REAL;2018;106.0;e;;0.0 +D;DG;WZ08-59;REAL;2019;106.2;e;;0.0 +D;DG;WZ08-59;REAL;2020;86.1;e;;0.0 +D;DG;WZ08-59;REAL;2021;91.5;e;;0.0 +D;DG;WZ08-59;REAL;2022;109.7;e;;0.0 +D;DG;WZ08-59;REAL;2023;110.6;p;;0.0 +D;DG;WZ08-601;NOMINAL;2015;100.0;e;;0.0 +D;DG;WZ08-601;NOMINAL;2016;99.4;e;;0.0 +D;DG;WZ08-601;NOMINAL;2017;96.5;e;;0.0 +D;DG;WZ08-601;NOMINAL;2018;95.9;e;;0.0 +D;DG;WZ08-601;NOMINAL;2019;68.2;e;;0.0 +D;DG;WZ08-601;NOMINAL;2020;66.1;e;;0.0 +D;DG;WZ08-601;NOMINAL;2021;68.7;e;;0.0 +D;DG;WZ08-601;NOMINAL;2022;72.2;e;;0.0 +D;DG;WZ08-601;NOMINAL;2023;74.2;p;;0.0 +D;DG;WZ08-601;REAL;2015;100.0;e;;0.0 +D;DG;WZ08-601;REAL;2016;100.3;e;;0.0 +D;DG;WZ08-601;REAL;2017;97.3;e;;0.0 +D;DG;WZ08-601;REAL;2018;96.7;e;;0.0 +D;DG;WZ08-601;REAL;2019;68.8;e;;0.0 +D;DG;WZ08-601;REAL;2020;66.7;e;;0.0 +D;DG;WZ08-601;REAL;2021;67.6;e;;0.0 +D;DG;WZ08-601;REAL;2022;69.4;e;;0.0 +D;DG;WZ08-601;REAL;2023;71.3;p;;0.0 +D;DG;WZ08-602;NOMINAL;2015;100.0;e;;0.0 +D;DG;WZ08-602;NOMINAL;2016;104.4;e;;0.0 +D;DG;WZ08-602;NOMINAL;2017;111.2;e;;0.0 +D;DG;WZ08-602;NOMINAL;2018;110.1;e;;0.0 +D;DG;WZ08-602;NOMINAL;2019;109.1;e;;0.0 +D;DG;WZ08-602;NOMINAL;2020;108.4;e;;0.0 +D;DG;WZ08-602;NOMINAL;2021;117.2;e;;0.0 +D;DG;WZ08-602;NOMINAL;2022;113.9;e;;0.0 +D;DG;WZ08-602;NOMINAL;2023;103.8;p;;0.0 +D;DG;WZ08-602;REAL;2015;100.0;e;;0.0 +D;DG;WZ08-602;REAL;2016;102.2;e;;0.0 +D;DG;WZ08-602;REAL;2017;108.7;e;;0.0 +D;DG;WZ08-602;REAL;2018;108.3;e;;0.0 +D;DG;WZ08-602;REAL;2019;107.7;e;;0.0 +D;DG;WZ08-602;REAL;2020;106.5;e;;0.0 +D;DG;WZ08-602;REAL;2021;112.4;e;;0.0 +D;DG;WZ08-602;REAL;2022;107.2;e;;0.0 +D;DG;WZ08-602;REAL;2023;96.3;p;;0.0 +D;DG;WZ08-60;NOMINAL;2015;100.0;e;;0.0 +D;DG;WZ08-60;NOMINAL;2016;103.5;e;;0.0 +D;DG;WZ08-60;NOMINAL;2017;108.7;e;;0.0 +D;DG;WZ08-60;NOMINAL;2018;107.6;e;;0.0 +D;DG;WZ08-60;NOMINAL;2019;102.1;e;;0.0 +D;DG;WZ08-60;NOMINAL;2020;101.1;e;;0.0 +D;DG;WZ08-60;NOMINAL;2021;108.8;e;;0.0 +D;DG;WZ08-60;NOMINAL;2022;106.7;e;;0.0 +D;DG;WZ08-60;NOMINAL;2023;98.7;p;;0.0 +D;DG;WZ08-60;REAL;2015;100.0;e;;0.0 +D;DG;WZ08-60;REAL;2016;101.9;e;;0.0 +D;DG;WZ08-60;REAL;2017;106.8;e;;0.0 +D;DG;WZ08-60;REAL;2018;106.4;e;;0.0 +D;DG;WZ08-60;REAL;2019;101.0;e;;0.0 +D;DG;WZ08-60;REAL;2020;99.7;e;;0.0 +D;DG;WZ08-60;REAL;2021;104.7;e;;0.0 +D;DG;WZ08-60;REAL;2022;100.7;e;;0.0 +D;DG;WZ08-60;REAL;2023;92.0;p;;0.0 +D;DG;WZ08-61-01;NOMINAL;2015;100.0;e;;0.0 +D;DG;WZ08-61-01;NOMINAL;2016;108.0;e;;0.0 +D;DG;WZ08-61-01;NOMINAL;2017;107.2;e;;0.0 +D;DG;WZ08-61-01;NOMINAL;2018;111.5;e;;0.0 +D;DG;WZ08-61-01;NOMINAL;2019;113.5;e;;0.0 +D;DG;WZ08-61-01;NOMINAL;2020;112.5;e;;0.0 +D;DG;WZ08-61-01;NOMINAL;2021;120.8;e;;0.0 +D;DG;WZ08-61-01;NOMINAL;2022;132.8;e;;0.0 +D;DG;WZ08-61-01;NOMINAL;2023;140.2;p;;0.0 +D;DG;WZ08-61-01;REAL;2015;100.0;e;;0.0 +D;DG;WZ08-61-01;REAL;2016;107.5;e;;0.0 +D;DG;WZ08-61-01;REAL;2017;105.9;e;;0.0 +D;DG;WZ08-61-01;REAL;2018;108.8;e;;0.0 +D;DG;WZ08-61-01;REAL;2019;109.5;e;;0.0 +D;DG;WZ08-61-01;REAL;2020;107.5;e;;0.0 +D;DG;WZ08-61-01;REAL;2021;112.9;e;;0.0 +D;DG;WZ08-61-01;REAL;2022;121.1;e;;0.0 +D;DG;WZ08-61-01;REAL;2023;123.9;p;;0.0 +D;DG;WZ08-61-02;NOMINAL;2015;100.0;e;;0.0 +D;DG;WZ08-61-02;NOMINAL;2016;108.1;e;;0.0 +D;DG;WZ08-61-02;NOMINAL;2017;106.5;e;;0.0 +D;DG;WZ08-61-02;NOMINAL;2018;111.5;e;;0.0 +D;DG;WZ08-61-02;NOMINAL;2019;114.4;e;;0.0 +D;DG;WZ08-61-02;NOMINAL;2020;114.7;e;;0.0 +D;DG;WZ08-61-02;NOMINAL;2021;122.5;e;;0.0 +D;DG;WZ08-61-02;NOMINAL;2022;134.7;e;;0.0 +D;DG;WZ08-61-02;NOMINAL;2023;142.4;p;;0.0 +D;DG;WZ08-61-02;REAL;2015;100.0;e;;0.0 +D;DG;WZ08-61-02;REAL;2016;107.9;e;;0.0 +D;DG;WZ08-61-02;REAL;2017;105.8;e;;0.0 +D;DG;WZ08-61-02;REAL;2018;109.4;e;;0.0 +D;DG;WZ08-61-02;REAL;2019;111.0;e;;0.0 +D;DG;WZ08-61-02;REAL;2020;110.3;e;;0.0 +D;DG;WZ08-61-02;REAL;2021;115.4;e;;0.0 +D;DG;WZ08-61-02;REAL;2022;123.9;e;;0.0 +D;DG;WZ08-61-02;REAL;2023;127.2;p;;0.0 +D;DG;WZ08-61-03;NOMINAL;2015;100.0;e;;0.0 +D;DG;WZ08-61-03;NOMINAL;2016;105.6;e;;0.0 +D;DG;WZ08-61-03;NOMINAL;2017;111.6;e;;0.0 +D;DG;WZ08-61-03;NOMINAL;2018;118.1;e;;0.0 +D;DG;WZ08-61-03;NOMINAL;2019;122.6;e;;0.0 +D;DG;WZ08-61-03;NOMINAL;2020;121.5;e;;0.0 +D;DG;WZ08-61-03;NOMINAL;2021;130.5;e;;0.0 +D;DG;WZ08-61-03;NOMINAL;2022;142.8;e;;0.0 +D;DG;WZ08-61-03;NOMINAL;2023;147.8;p;;0.0 +D;DG;WZ08-61-03;REAL;2015;100.0;e;;0.0 +D;DG;WZ08-61-03;REAL;2016;105.0;e;;0.0 +D;DG;WZ08-61-03;REAL;2017;110.1;e;;0.0 +D;DG;WZ08-61-03;REAL;2018;115.4;e;;0.0 +D;DG;WZ08-61-03;REAL;2019;118.5;e;;0.0 +D;DG;WZ08-61-03;REAL;2020;115.9;e;;0.0 +D;DG;WZ08-61-03;REAL;2021;122.3;e;;0.0 +D;DG;WZ08-61-03;REAL;2022;131.1;e;;0.0 +D;DG;WZ08-61-03;REAL;2023;131.5;p;;0.0 +D;DG;WZ08-611;NOMINAL;2015;100.0;e;;0.0 +D;DG;WZ08-611;NOMINAL;2016;90.1;e;;0.0 +D;DG;WZ08-611;NOMINAL;2017;89.3;e;;0.0 +D;DG;WZ08-611;NOMINAL;2018;95.5;e;;0.0 +D;DG;WZ08-611;NOMINAL;2019;89.9;e;;0.0 +D;DG;WZ08-611;NOMINAL;2020;91.8;e;;0.0 +D;DG;WZ08-611;NOMINAL;2021;88.4;e;;0.0 +D;DG;WZ08-611;NOMINAL;2022;90.1;e;;0.0 +D;DG;WZ08-611;NOMINAL;2023;92.1;p;;0.0 +D;DG;WZ08-611;REAL;2015;100.0;e;;0.0 +D;DG;WZ08-611;REAL;2016;91.1;e;;0.0 +D;DG;WZ08-611;REAL;2017;91.5;e;;0.0 +D;DG;WZ08-611;REAL;2018;96.1;e;;0.0 +D;DG;WZ08-611;REAL;2019;89.4;e;;0.0 +D;DG;WZ08-611;REAL;2020;90.0;e;;0.0 +D;DG;WZ08-611;REAL;2021;83.7;e;;0.0 +D;DG;WZ08-611;REAL;2022;82.8;e;;0.0 +D;DG;WZ08-611;REAL;2023;83.4;p;;0.0 +D;DG;WZ08-612;NOMINAL;2015;100.0;e;;0.0 +D;DG;WZ08-612;NOMINAL;2016;174.5;e;;0.0 +D;DG;WZ08-612;NOMINAL;2017;80.1;e;;0.0 +D;DG;WZ08-612;NOMINAL;2018;83.5;e;;0.0 +D;DG;WZ08-612;NOMINAL;2019;81.8;e;;0.0 +D;DG;WZ08-612;NOMINAL;2020;84.3;e;;0.0 +D;DG;WZ08-612;NOMINAL;2021;86.4;e;;0.0 +D;DG;WZ08-612;NOMINAL;2022;92.0;e;;0.0 +D;DG;WZ08-612;NOMINAL;2023;92.0;p;;0.0 +D;DG;WZ08-612;REAL;2015;100.0;e;;0.0 +D;DG;WZ08-612;REAL;2016;176.4;e;;0.0 +D;DG;WZ08-612;REAL;2017;82.1;e;;0.0 +D;DG;WZ08-612;REAL;2018;84.0;e;;0.0 +D;DG;WZ08-612;REAL;2019;81.4;e;;0.0 +D;DG;WZ08-612;REAL;2020;82.6;e;;0.0 +D;DG;WZ08-612;REAL;2021;81.9;e;;0.0 +D;DG;WZ08-612;REAL;2022;84.5;e;;0.0 +D;DG;WZ08-612;REAL;2023;83.4;p;;0.0 +D;DG;WZ08-613;NOMINAL;2015;100.0;e;;0.0 +D;DG;WZ08-613;NOMINAL;2016;87.1;e;;0.0 +D;DG;WZ08-613;NOMINAL;2017;117.2;e;;0.0 +D;DG;WZ08-613;NOMINAL;2018;149.1;e;;0.0 +D;DG;WZ08-613;NOMINAL;2019;136.1;e;;0.0 +D;DG;WZ08-613;NOMINAL;2020;98.6;e;;0.0 +D;DG;WZ08-613;NOMINAL;2021;97.8;e;;0.0 +D;DG;WZ08-613;NOMINAL;2022;97.6;e;;0.0 +D;DG;WZ08-613;NOMINAL;2023;109.4;p;;0.0 +D;DG;WZ08-613;REAL;2015;100.0;e;;0.0 +D;DG;WZ08-613;REAL;2016;88.0;e;;0.0 +D;DG;WZ08-613;REAL;2017;120.1;e;;0.0 +D;DG;WZ08-613;REAL;2018;150.0;e;;0.0 +D;DG;WZ08-613;REAL;2019;135.3;e;;0.0 +D;DG;WZ08-613;REAL;2020;96.6;e;;0.0 +D;DG;WZ08-613;REAL;2021;92.7;e;;0.0 +D;DG;WZ08-613;REAL;2022;89.7;e;;0.0 +D;DG;WZ08-613;REAL;2023;99.1;p;;0.0 +D;DG;WZ08-619;NOMINAL;2015;100.0;e;;0.0 +D;DG;WZ08-619;NOMINAL;2016;95.4;e;;0.0 +D;DG;WZ08-619;NOMINAL;2017;94.0;e;;0.0 +D;DG;WZ08-619;NOMINAL;2018;95.1;e;;0.0 +D;DG;WZ08-619;NOMINAL;2019;93.4;e;;0.0 +D;DG;WZ08-619;NOMINAL;2020;96.0;e;;0.0 +D;DG;WZ08-619;NOMINAL;2021;93.6;e;;0.0 +D;DG;WZ08-619;NOMINAL;2022;95.2;e;;0.0 +D;DG;WZ08-619;NOMINAL;2023;114.6;p;;0.0 +D;DG;WZ08-619;REAL;2015;100.0;e;;0.0 +D;DG;WZ08-619;REAL;2016;96.5;e;;0.0 +D;DG;WZ08-619;REAL;2017;96.2;e;;0.0 +D;DG;WZ08-619;REAL;2018;95.7;e;;0.0 +D;DG;WZ08-619;REAL;2019;92.9;e;;0.0 +D;DG;WZ08-619;REAL;2020;94.0;e;;0.0 +D;DG;WZ08-619;REAL;2021;88.6;e;;0.0 +D;DG;WZ08-619;REAL;2022;87.5;e;;0.0 +D;DG;WZ08-619;REAL;2023;103.9;p;;0.0 +D;DG;WZ08-61;NOMINAL;2015;100.0;e;;0.0 +D;DG;WZ08-61;NOMINAL;2016;115.3;e;;0.0 +D;DG;WZ08-61;NOMINAL;2017;87.6;e;;0.0 +D;DG;WZ08-61;NOMINAL;2018;92.3;e;;0.0 +D;DG;WZ08-61;NOMINAL;2019;88.5;e;;0.0 +D;DG;WZ08-61;NOMINAL;2020;90.4;e;;0.0 +D;DG;WZ08-61;NOMINAL;2021;88.8;e;;0.0 +D;DG;WZ08-61;NOMINAL;2022;91.5;e;;0.0 +D;DG;WZ08-61;NOMINAL;2023;96.0;p;;0.0 +D;DG;WZ08-61;REAL;2015;100.0;e;;0.0 +D;DG;WZ08-61;REAL;2016;116.5;e;;0.0 +D;DG;WZ08-61;REAL;2017;89.8;e;;0.0 +D;DG;WZ08-61;REAL;2018;92.9;e;;0.0 +D;DG;WZ08-61;REAL;2019;88.0;e;;0.0 +D;DG;WZ08-61;REAL;2020;88.6;e;;0.0 +D;DG;WZ08-61;REAL;2021;84.1;e;;0.0 +D;DG;WZ08-61;REAL;2022;84.1;e;;0.0 +D;DG;WZ08-61;REAL;2023;87.0;p;;0.0 +D;DG;WZ08-6201;NOMINAL;2015;100.0;e;;0.0 +D;DG;WZ08-6201;NOMINAL;2016;109.9;e;;0.0 +D;DG;WZ08-6201;NOMINAL;2017;116.8;e;;0.0 +D;DG;WZ08-6201;NOMINAL;2018;127.1;e;;0.0 +D;DG;WZ08-6201;NOMINAL;2019;136.9;e;;0.0 +D;DG;WZ08-6201;NOMINAL;2020;135.0;e;;0.0 +D;DG;WZ08-6201;NOMINAL;2021;150.1;e;;0.0 +D;DG;WZ08-6201;NOMINAL;2022;172.7;e;;0.0 +D;DG;WZ08-6201;NOMINAL;2023;184.5;p;;0.0 +D;DG;WZ08-6202;NOMINAL;2015;100.0;e;;0.0 +D;DG;WZ08-6202;NOMINAL;2016;108.6;e;;0.0 +D;DG;WZ08-6202;NOMINAL;2017;123.4;e;;0.0 +D;DG;WZ08-6202;NOMINAL;2018;133.0;e;;0.0 +D;DG;WZ08-6202;NOMINAL;2019;139.0;e;;0.0 +D;DG;WZ08-6202;NOMINAL;2020;141.3;e;;0.0 +D;DG;WZ08-6202;NOMINAL;2021;153.1;e;;0.0 +D;DG;WZ08-6202;NOMINAL;2022;170.4;e;;0.0 +D;DG;WZ08-6202;NOMINAL;2023;174.3;p;;0.0 +D;DG;WZ08-6203;NOMINAL;2015;100.0;e;;0.0 +D;DG;WZ08-6203;NOMINAL;2016;104.5;e;;0.0 +D;DG;WZ08-6203;NOMINAL;2017;107.9;e;;0.0 +D;DG;WZ08-6203;NOMINAL;2018;101.6;e;;0.0 +D;DG;WZ08-6203;NOMINAL;2019;106.9;e;;0.0 +D;DG;WZ08-6203;NOMINAL;2020;111.9;e;;0.0 +D;DG;WZ08-6203;NOMINAL;2021;114.3;e;;0.0 +D;DG;WZ08-6203;NOMINAL;2022;117.8;e;;0.0 +D;DG;WZ08-6203;NOMINAL;2023;129.8;p;;0.0 +D;DG;WZ08-6209;NOMINAL;2015;100.0;e;;0.0 +D;DG;WZ08-6209;NOMINAL;2016;100.8;e;;0.0 +D;DG;WZ08-6209;NOMINAL;2017;101.9;e;;0.0 +D;DG;WZ08-6209;NOMINAL;2018;118.9;e;;0.0 +D;DG;WZ08-6209;NOMINAL;2019;115.5;e;;0.0 +D;DG;WZ08-6209;NOMINAL;2020;115.7;e;;0.0 +D;DG;WZ08-6209;NOMINAL;2021;126.0;e;;0.0 +D;DG;WZ08-6209;NOMINAL;2022;138.3;e;;0.0 +D;DG;WZ08-6209;NOMINAL;2023;145.4;p;;0.0 +D;DG;WZ08-620;NOMINAL;2015;100.0;e;;0.0 +D;DG;WZ08-620;NOMINAL;2016;106.3;e;;0.0 +D;DG;WZ08-620;NOMINAL;2017;112.6;e;;0.0 +D;DG;WZ08-620;NOMINAL;2018;123.2;e;;0.0 +D;DG;WZ08-620;NOMINAL;2019;127.7;e;;0.0 +D;DG;WZ08-620;NOMINAL;2020;128.0;e;;0.0 +D;DG;WZ08-620;NOMINAL;2021;139.7;e;;0.0 +D;DG;WZ08-620;NOMINAL;2022;156.1;e;;0.0 +D;DG;WZ08-620;NOMINAL;2023;164.9;p;;0.0 +D;DG;WZ08-620;REAL;2015;100.0;e;;0.0 +D;DG;WZ08-620;REAL;2016;106.8;e;;0.0 +D;DG;WZ08-620;REAL;2017;113.0;e;;0.0 +D;DG;WZ08-620;REAL;2018;122.9;e;;0.0 +D;DG;WZ08-620;REAL;2019;126.7;e;;0.0 +D;DG;WZ08-620;REAL;2020;126.6;e;;0.0 +D;DG;WZ08-620;REAL;2021;137.4;e;;0.0 +D;DG;WZ08-620;REAL;2022;152.0;e;;0.0 +D;DG;WZ08-620;REAL;2023;156.8;p;;0.0 +D;DG;WZ08-62;NOMINAL;2015;100.0;e;;0.0 +D;DG;WZ08-62;NOMINAL;2016;106.3;e;;0.0 +D;DG;WZ08-62;NOMINAL;2017;112.6;e;;0.0 +D;DG;WZ08-62;NOMINAL;2018;123.2;e;;0.0 +D;DG;WZ08-62;NOMINAL;2019;127.7;e;;0.0 +D;DG;WZ08-62;NOMINAL;2020;128.0;e;;0.0 +D;DG;WZ08-62;NOMINAL;2021;139.7;e;;0.0 +D;DG;WZ08-62;NOMINAL;2022;156.1;e;;0.0 +D;DG;WZ08-62;NOMINAL;2023;164.9;p;;0.0 +D;DG;WZ08-62;REAL;2015;100.0;e;;0.0 +D;DG;WZ08-62;REAL;2016;106.8;e;;0.0 +D;DG;WZ08-62;REAL;2017;113.0;e;;0.0 +D;DG;WZ08-62;REAL;2018;122.9;e;;0.0 +D;DG;WZ08-62;REAL;2019;126.7;e;;0.0 +D;DG;WZ08-62;REAL;2020;126.6;e;;0.0 +D;DG;WZ08-62;REAL;2021;137.4;e;;0.0 +D;DG;WZ08-62;REAL;2022;152.0;e;;0.0 +D;DG;WZ08-62;REAL;2023;156.8;p;;0.0 +D;DG;WZ08-63-01;NOMINAL;2015;100.0;e;;0.0 +D;DG;WZ08-63-01;NOMINAL;2016;107.9;e;;0.0 +D;DG;WZ08-63-01;NOMINAL;2017;107.5;e;;0.0 +D;DG;WZ08-63-01;NOMINAL;2018;117.8;e;;0.0 +D;DG;WZ08-63-01;NOMINAL;2019;119.6;e;;0.0 +D;DG;WZ08-63-01;NOMINAL;2020;114.2;e;;0.0 +D;DG;WZ08-63-01;NOMINAL;2021;130.7;e;;0.0 +D;DG;WZ08-63-01;NOMINAL;2022;144.6;e;;0.0 +D;DG;WZ08-63-01;NOMINAL;2023;160.2;p;;0.0 +D;DG;WZ08-63-01;REAL;2015;100.0;e;;0.0 +D;DG;WZ08-63-01;REAL;2016;106.4;e;;0.0 +D;DG;WZ08-63-01;REAL;2017;104.9;e;;0.0 +D;DG;WZ08-63-01;REAL;2018;113.5;e;;0.0 +D;DG;WZ08-63-01;REAL;2019;114.7;e;;0.0 +D;DG;WZ08-63-01;REAL;2020;109.8;e;;0.0 +D;DG;WZ08-63-01;REAL;2021;123.1;e;;0.0 +D;DG;WZ08-63-01;REAL;2022;134.2;e;;0.0 +D;DG;WZ08-63-01;REAL;2023;144.3;p;;0.0 +D;DG;WZ08-63-02;NOMINAL;2015;100.0;e;;0.0 +D;DG;WZ08-63-02;NOMINAL;2016;111.0;e;;0.0 +D;DG;WZ08-63-02;NOMINAL;2017;116.8;e;;0.0 +D;DG;WZ08-63-02;NOMINAL;2018;142.3;e;;0.0 +D;DG;WZ08-63-02;NOMINAL;2019;141.3;e;;0.0 +D;DG;WZ08-63-02;NOMINAL;2020;151.6;e;;0.0 +D;DG;WZ08-63-02;NOMINAL;2021;172.3;e;;0.0 +D;DG;WZ08-63-02;NOMINAL;2022;195.7;e;;0.0 +D;DG;WZ08-63-02;NOMINAL;2023;228.2;p;;0.0 +D;DG;WZ08-63-02;REAL;2015;100.0;e;;0.0 +D;DG;WZ08-63-02;REAL;2016;112.2;e;;0.0 +D;DG;WZ08-63-02;REAL;2017;118.5;e;;0.0 +D;DG;WZ08-63-02;REAL;2018;145.0;e;;0.0 +D;DG;WZ08-63-02;REAL;2019;145.1;e;;0.0 +D;DG;WZ08-63-02;REAL;2020;155.9;e;;0.0 +D;DG;WZ08-63-02;REAL;2021;177.1;e;;0.0 +D;DG;WZ08-63-02;REAL;2022;200.9;e;;0.0 +D;DG;WZ08-63-02;REAL;2023;226.6;p;;0.0 +D;DG;WZ08-63-03;NOMINAL;2015;100.0;e;;0.0 +D;DG;WZ08-63-03;NOMINAL;2016;106.4;e;;0.0 +D;DG;WZ08-63-03;NOMINAL;2017;109.2;e;;0.0 +D;DG;WZ08-63-03;NOMINAL;2018;119.9;e;;0.0 +D;DG;WZ08-63-03;NOMINAL;2019;123.3;e;;0.0 +D;DG;WZ08-63-03;NOMINAL;2020;121.6;e;;0.0 +D;DG;WZ08-63-03;NOMINAL;2021;134.7;e;;0.0 +D;DG;WZ08-63-03;NOMINAL;2022;150.2;e;;0.0 +D;DG;WZ08-63-03;NOMINAL;2023;161.9;p;;0.0 +D;DG;WZ08-63-03;REAL;2015;100.0;e;;0.0 +D;DG;WZ08-63-03;REAL;2016;106.3;e;;0.0 +D;DG;WZ08-63-03;REAL;2017;108.7;e;;0.0 +D;DG;WZ08-63-03;REAL;2018;118.4;e;;0.0 +D;DG;WZ08-63-03;REAL;2019;121.2;e;;0.0 +D;DG;WZ08-63-03;REAL;2020;119.4;e;;0.0 +D;DG;WZ08-63-03;REAL;2021;130.9;e;;0.0 +D;DG;WZ08-63-03;REAL;2022;144.3;e;;0.0 +D;DG;WZ08-63-03;REAL;2023;151.6;p;;0.0 +D;DG;WZ08-63-04;NOMINAL;2015;100.0;e;;0.0 +D;DG;WZ08-63-04;NOMINAL;2016;106.3;e;;0.0 +D;DG;WZ08-63-04;NOMINAL;2017;110.7;e;;0.0 +D;DG;WZ08-63-04;NOMINAL;2018;123.1;e;;0.0 +D;DG;WZ08-63-04;NOMINAL;2019;126.6;e;;0.0 +D;DG;WZ08-63-04;NOMINAL;2020;127.5;e;;0.0 +D;DG;WZ08-63-04;NOMINAL;2021;140.1;e;;0.0 +D;DG;WZ08-63-04;NOMINAL;2022;157.1;e;;0.0 +D;DG;WZ08-63-04;NOMINAL;2023;169.5;p;;0.0 +D;DG;WZ08-63-04;REAL;2015;100.0;e;;0.0 +D;DG;WZ08-63-04;REAL;2016;106.9;e;;0.0 +D;DG;WZ08-63-04;REAL;2017;111.1;e;;0.0 +D;DG;WZ08-63-04;REAL;2018;123.0;e;;0.0 +D;DG;WZ08-63-04;REAL;2019;126.1;e;;0.0 +D;DG;WZ08-63-04;REAL;2020;126.7;e;;0.0 +D;DG;WZ08-63-04;REAL;2021;138.6;e;;0.0 +D;DG;WZ08-63-04;REAL;2022;154.1;e;;0.0 +D;DG;WZ08-63-04;REAL;2023;162.3;p;;0.0 +D;DG;WZ08-6311;NOMINAL;2015;100.0;e;;0.0 +D;DG;WZ08-6311;NOMINAL;2016;110.7;e;;0.0 +D;DG;WZ08-6311;NOMINAL;2017;105.2;e;;0.0 +D;DG;WZ08-6311;NOMINAL;2018;118.5;e;;0.0 +D;DG;WZ08-6311;NOMINAL;2019;132.7;e;;0.0 +D;DG;WZ08-6311;NOMINAL;2020;155.4;e;;0.0 +D;DG;WZ08-6311;NOMINAL;2021;170.9;e;;0.0 +D;DG;WZ08-6311;NOMINAL;2022;199.6;e;;0.0 +D;DG;WZ08-6311;NOMINAL;2023;251.9;p;;0.0 +D;DG;WZ08-6312;NOMINAL;2015;100.0;e;;0.0 +D;DG;WZ08-6312;NOMINAL;2016;117.2;e;;0.0 +D;DG;WZ08-6312;NOMINAL;2017;141.7;e;;0.0 +D;DG;WZ08-6312;NOMINAL;2018;206.2;e;;0.0 +D;DG;WZ08-6312;NOMINAL;2019;181.6;e;;0.0 +D;DG;WZ08-6312;NOMINAL;2020;186.4;e;;0.0 +D;DG;WZ08-6312;NOMINAL;2021;220.8;e;;0.0 +D;DG;WZ08-6312;NOMINAL;2022;245.2;e;;0.0 +D;DG;WZ08-6312;NOMINAL;2023;266.8;p;;0.0 +D;DG;WZ08-631;NOMINAL;2015;100.0;e;;0.0 +D;DG;WZ08-631;NOMINAL;2016;113.2;e;;0.0 +D;DG;WZ08-631;NOMINAL;2017;119.0;e;;0.0 +D;DG;WZ08-631;NOMINAL;2018;151.7;e;;0.0 +D;DG;WZ08-631;NOMINAL;2019;151.2;e;;0.0 +D;DG;WZ08-631;NOMINAL;2020;167.1;e;;0.0 +D;DG;WZ08-631;NOMINAL;2021;189.8;e;;0.0 +D;DG;WZ08-631;NOMINAL;2022;216.9;e;;0.0 +D;DG;WZ08-631;NOMINAL;2023;257.5;p;;0.0 +D;DG;WZ08-631;REAL;2015;100.0;e;;0.0 +D;DG;WZ08-631;REAL;2016;115.0;e;;0.0 +D;DG;WZ08-631;REAL;2017;121.4;e;;0.0 +D;DG;WZ08-631;REAL;2018;155.4;e;;0.0 +D;DG;WZ08-631;REAL;2019;156.5;e;;0.0 +D;DG;WZ08-631;REAL;2020;173.1;e;;0.0 +D;DG;WZ08-631;REAL;2021;196.7;e;;0.0 +D;DG;WZ08-631;REAL;2022;225.0;e;;0.0 +D;DG;WZ08-631;REAL;2023;258.2;p;;0.0 +D;DG;WZ08-6391;NOMINAL;2015;100.0;e;;0.0 +D;DG;WZ08-6391;NOMINAL;2016;81.1;e;;0.0 +D;DG;WZ08-6391;NOMINAL;2017;77.3;e;;0.0 +D;DG;WZ08-6391;NOMINAL;2018;77.1;e;;0.0 +D;DG;WZ08-6391;NOMINAL;2019;90.4;e;;0.0 +D;DG;WZ08-6391;NOMINAL;2020;76.6;e;;0.0 +D;DG;WZ08-6391;NOMINAL;2021;76.7;e;;0.0 +D;DG;WZ08-6391;NOMINAL;2022;77.1;e;;0.0 +D;DG;WZ08-6391;NOMINAL;2023;72.5;p;;0.0 +D;DG;WZ08-6399;NOMINAL;2015;100.0;e;;0.0 +D;DG;WZ08-6399;NOMINAL;2016;262.5;e;;0.0 +D;DG;WZ08-6399;NOMINAL;2017;219.6;e;;0.0 +D;DG;WZ08-6399;NOMINAL;2018;112.3;e;;0.0 +D;DG;WZ08-6399;NOMINAL;2019;105.0;e;;0.0 +D;DG;WZ08-6399;NOMINAL;2020;86.4;e;;0.0 +D;DG;WZ08-6399;NOMINAL;2021;104.4;e;;0.0 +D;DG;WZ08-6399;NOMINAL;2022;108.0;e;;0.0 +D;DG;WZ08-6399;NOMINAL;2023;110.4;p;;0.0 +D;DG;WZ08-639;NOMINAL;2015;100.0;e;;0.0 +D;DG;WZ08-639;NOMINAL;2016;236.8;e;;0.0 +D;DG;WZ08-639;NOMINAL;2017;199.4;e;;0.0 +D;DG;WZ08-639;NOMINAL;2018;107.3;e;;0.0 +D;DG;WZ08-639;NOMINAL;2019;103.0;e;;0.0 +D;DG;WZ08-639;NOMINAL;2020;85.0;e;;0.0 +D;DG;WZ08-639;NOMINAL;2021;100.5;e;;0.0 +D;DG;WZ08-639;NOMINAL;2022;103.6;e;;0.0 +D;DG;WZ08-639;NOMINAL;2023;105.0;p;;0.0 +D;DG;WZ08-639;REAL;2015;100.0;e;;0.0 +D;DG;WZ08-639;REAL;2016;235.2;e;;0.0 +D;DG;WZ08-639;REAL;2017;197.0;e;;0.0 +D;DG;WZ08-639;REAL;2018;105.3;e;;0.0 +D;DG;WZ08-639;REAL;2019;99.9;e;;0.0 +D;DG;WZ08-639;REAL;2020;81.5;e;;0.0 +D;DG;WZ08-639;REAL;2021;96.1;e;;0.0 +D;DG;WZ08-639;REAL;2022;96.4;e;;0.0 +D;DG;WZ08-639;REAL;2023;95.1;p;;0.0 +D;DG;WZ08-63;NOMINAL;2015;100.0;e;;0.0 +D;DG;WZ08-63;NOMINAL;2016;154.8;e;;0.0 +D;DG;WZ08-63;NOMINAL;2017;146.1;e;;0.0 +D;DG;WZ08-63;NOMINAL;2018;136.7;e;;0.0 +D;DG;WZ08-63;NOMINAL;2019;135.0;e;;0.0 +D;DG;WZ08-63;NOMINAL;2020;139.5;e;;0.0 +D;DG;WZ08-63;NOMINAL;2021;159.7;e;;0.0 +D;DG;WZ08-63;NOMINAL;2022;178.8;e;;0.0 +D;DG;WZ08-63;NOMINAL;2023;206.2;p;;0.0 +D;DG;WZ08-63;REAL;2015;100.0;e;;0.0 +D;DG;WZ08-63;REAL;2016;155.4;e;;0.0 +D;DG;WZ08-63;REAL;2017;146.9;e;;0.0 +D;DG;WZ08-63;REAL;2018;138.5;e;;0.0 +D;DG;WZ08-63;REAL;2019;137.5;e;;0.0 +D;DG;WZ08-63;REAL;2020;142.3;e;;0.0 +D;DG;WZ08-63;REAL;2021;162.9;e;;0.0 +D;DG;WZ08-63;REAL;2022;181.7;e;;0.0 +D;DG;WZ08-63;REAL;2023;203.4;p;;0.0 +D;DG;WZ08-681;NOMINAL;2015;100.0;e;;0.0 +D;DG;WZ08-681;NOMINAL;2016;96.6;e;;0.0 +D;DG;WZ08-681;NOMINAL;2017;80.0;e;;0.0 +D;DG;WZ08-681;NOMINAL;2018;91.8;e;;0.0 +D;DG;WZ08-681;NOMINAL;2019;95.0;e;;0.0 +D;DG;WZ08-681;NOMINAL;2020;69.4;e;;0.0 +D;DG;WZ08-681;NOMINAL;2021;72.1;e;;0.0 +D;DG;WZ08-681;NOMINAL;2022;73.5;e;;0.0 +D;DG;WZ08-681;NOMINAL;2023;72.9;p;;0.0 +D;DG;WZ08-681;REAL;2015;100.0;e;;0.0 +D;DG;WZ08-681;REAL;2016;95.5;e;;0.0 +D;DG;WZ08-681;REAL;2017;78.0;e;;0.0 +D;DG;WZ08-681;REAL;2018;88.2;e;;0.0 +D;DG;WZ08-681;REAL;2019;90.0;e;;0.0 +D;DG;WZ08-681;REAL;2020;64.9;e;;0.0 +D;DG;WZ08-681;REAL;2021;66.4;e;;0.0 +D;DG;WZ08-681;REAL;2022;66.6;e;;0.0 +D;DG;WZ08-681;REAL;2023;64.9;p;;0.0 +D;DG;WZ08-682;NOMINAL;2015;100.0;e;;0.0 +D;DG;WZ08-682;NOMINAL;2016;109.9;e;;0.0 +D;DG;WZ08-682;NOMINAL;2017;109.6;e;;0.0 +D;DG;WZ08-682;NOMINAL;2018;108.4;e;;0.0 +D;DG;WZ08-682;NOMINAL;2019;112.9;e;;0.0 +D;DG;WZ08-682;NOMINAL;2020;76.9;e;;0.0 +D;DG;WZ08-682;NOMINAL;2021;89.0;e;;0.0 +D;DG;WZ08-682;NOMINAL;2022;95.0;e;;0.0 +D;DG;WZ08-682;NOMINAL;2023;96.1;p;;0.0 +D;DG;WZ08-682;REAL;2015;100.0;e;;0.0 +D;DG;WZ08-682;REAL;2016;108.6;e;;0.0 +D;DG;WZ08-682;REAL;2017;106.9;e;;0.0 +D;DG;WZ08-682;REAL;2018;104.1;e;;0.0 +D;DG;WZ08-682;REAL;2019;107.0;e;;0.0 +D;DG;WZ08-682;REAL;2020;71.8;e;;0.0 +D;DG;WZ08-682;REAL;2021;82.0;e;;0.0 +D;DG;WZ08-682;REAL;2022;86.0;e;;0.0 +D;DG;WZ08-682;REAL;2023;85.6;p;;0.0 +D;DG;WZ08-6831;NOMINAL;2015;100.0;e;;0.0 +D;DG;WZ08-6831;NOMINAL;2016;98.5;e;;0.0 +D;DG;WZ08-6831;NOMINAL;2017;100.1;e;;0.0 +D;DG;WZ08-6831;NOMINAL;2018;106.4;e;;0.0 +D;DG;WZ08-6831;NOMINAL;2019;116.4;e;;0.0 +D;DG;WZ08-6831;NOMINAL;2020;113.2;e;;0.0 +D;DG;WZ08-6831;NOMINAL;2021;119.8;e;;0.0 +D;DG;WZ08-6831;NOMINAL;2022;119.7;e;;0.0 +D;DG;WZ08-6831;NOMINAL;2023;105.9;p;;0.0 +D;DG;WZ08-6832;NOMINAL;2015;100.0;e;;0.0 +D;DG;WZ08-6832;NOMINAL;2016;101.7;e;;0.0 +D;DG;WZ08-6832;NOMINAL;2017;103.4;e;;0.0 +D;DG;WZ08-6832;NOMINAL;2018;125.4;e;;0.0 +D;DG;WZ08-6832;NOMINAL;2019;114.4;e;;0.0 +D;DG;WZ08-6832;NOMINAL;2020;118.0;e;;0.0 +D;DG;WZ08-6832;NOMINAL;2021;118.3;e;;0.0 +D;DG;WZ08-6832;NOMINAL;2022;127.0;e;;0.0 +D;DG;WZ08-6832;NOMINAL;2023;129.5;p;;0.0 +D;DG;WZ08-683;NOMINAL;2015;100.0;e;;0.0 +D;DG;WZ08-683;NOMINAL;2016;100.4;e;;0.0 +D;DG;WZ08-683;NOMINAL;2017;102.1;e;;0.0 +D;DG;WZ08-683;NOMINAL;2018;117.8;e;;0.0 +D;DG;WZ08-683;NOMINAL;2019;115.2;e;;0.0 +D;DG;WZ08-683;NOMINAL;2020;116.0;e;;0.0 +D;DG;WZ08-683;NOMINAL;2021;118.9;e;;0.0 +D;DG;WZ08-683;NOMINAL;2022;124.0;e;;0.0 +D;DG;WZ08-683;NOMINAL;2023;120.0;p;;0.0 +D;DG;WZ08-683;REAL;2015;100.0;e;;0.0 +D;DG;WZ08-683;REAL;2016;99.3;e;;0.0 +D;DG;WZ08-683;REAL;2017;99.5;e;;0.0 +D;DG;WZ08-683;REAL;2018;113.2;e;;0.0 +D;DG;WZ08-683;REAL;2019;109.2;e;;0.0 +D;DG;WZ08-683;REAL;2020;108.4;e;;0.0 +D;DG;WZ08-683;REAL;2021;109.6;e;;0.0 +D;DG;WZ08-683;REAL;2022;112.4;e;;0.0 +D;DG;WZ08-683;REAL;2023;106.8;p;;0.0 +D;DG;WZ08-68;NOMINAL;2015;100.0;e;;0.0 +D;DG;WZ08-68;NOMINAL;2016;107.2;e;;0.0 +D;DG;WZ08-68;NOMINAL;2017;105.8;e;;0.0 +D;DG;WZ08-68;NOMINAL;2018;108.4;e;;0.0 +D;DG;WZ08-68;NOMINAL;2019;111.7;e;;0.0 +D;DG;WZ08-68;NOMINAL;2020;82.5;e;;0.0 +D;DG;WZ08-68;NOMINAL;2021;92.3;e;;0.0 +D;DG;WZ08-68;NOMINAL;2022;97.7;e;;0.0 +D;DG;WZ08-68;NOMINAL;2023;97.9;p;;0.0 +D;DG;WZ08-68;REAL;2015;100.0;e;;0.0 +D;DG;WZ08-68;REAL;2016;106.0;e;;0.0 +D;DG;WZ08-68;REAL;2017;103.2;e;;0.0 +D;DG;WZ08-68;REAL;2018;104.2;e;;0.0 +D;DG;WZ08-68;REAL;2019;105.8;e;;0.0 +D;DG;WZ08-68;REAL;2020;77.1;e;;0.0 +D;DG;WZ08-68;REAL;2021;85.1;e;;0.0 +D;DG;WZ08-68;REAL;2022;88.5;e;;0.0 +D;DG;WZ08-68;REAL;2023;87.2;p;;0.0 +D;DG;WZ08-69-01;NOMINAL;2015;100.0;e;;0.0 +D;DG;WZ08-69-01;NOMINAL;2016;105.5;e;;0.0 +D;DG;WZ08-69-01;NOMINAL;2017;109.5;e;;0.0 +D;DG;WZ08-69-01;NOMINAL;2018;115.5;e;;0.0 +D;DG;WZ08-69-01;NOMINAL;2019;119.1;e;;0.0 +D;DG;WZ08-69-01;NOMINAL;2020;121.0;e;;0.0 +D;DG;WZ08-69-01;NOMINAL;2021;129.6;e;;0.0 +D;DG;WZ08-69-01;NOMINAL;2022;140.7;e;;0.0 +D;DG;WZ08-69-01;NOMINAL;2023;146.9;p;;0.0 +D;DG;WZ08-69-01;REAL;2015;100.0;e;;0.0 +D;DG;WZ08-69-01;REAL;2016;104.5;e;;0.0 +D;DG;WZ08-69-01;REAL;2017;107.5;e;;0.0 +D;DG;WZ08-69-01;REAL;2018;112.2;e;;0.0 +D;DG;WZ08-69-01;REAL;2019;114.3;e;;0.0 +D;DG;WZ08-69-01;REAL;2020;114.1;e;;0.0 +D;DG;WZ08-69-01;REAL;2021;119.5;e;;0.0 +D;DG;WZ08-69-01;REAL;2022;127.0;e;;0.0 +D;DG;WZ08-69-01;REAL;2023;128.2;p;;0.0 +D;DG;WZ08-691;NOMINAL;2015;100.0;e;;0.0 +D;DG;WZ08-691;NOMINAL;2016;102.5;e;;0.0 +D;DG;WZ08-691;NOMINAL;2017;105.6;e;;0.0 +D;DG;WZ08-691;NOMINAL;2018;110.5;e;;0.0 +D;DG;WZ08-691;NOMINAL;2019;115.5;e;;0.0 +D;DG;WZ08-691;NOMINAL;2020;117.6;e;;0.0 +D;DG;WZ08-691;NOMINAL;2021;121.0;e;;0.0 +D;DG;WZ08-691;NOMINAL;2022;122.0;e;;0.0 +D;DG;WZ08-691;NOMINAL;2023;123.7;p;;0.0 +D;DG;WZ08-691;REAL;2015;100.0;e;;0.0 +D;DG;WZ08-691;REAL;2016;101.7;e;;0.0 +D;DG;WZ08-691;REAL;2017;103.7;e;;0.0 +D;DG;WZ08-691;REAL;2018;107.2;e;;0.0 +D;DG;WZ08-691;REAL;2019;110.8;e;;0.0 +D;DG;WZ08-691;REAL;2020;111.5;e;;0.0 +D;DG;WZ08-691;REAL;2021;109.2;e;;0.0 +D;DG;WZ08-691;REAL;2022;107.8;e;;0.0 +D;DG;WZ08-691;REAL;2023;106.0;p;;0.0 +D;DG;WZ08-692;NOMINAL;2015;100.0;e;;0.0 +D;DG;WZ08-692;NOMINAL;2016;103.2;e;;0.0 +D;DG;WZ08-692;NOMINAL;2017;106.5;e;;0.0 +D;DG;WZ08-692;NOMINAL;2018;111.3;e;;0.0 +D;DG;WZ08-692;NOMINAL;2019;117.1;e;;0.0 +D;DG;WZ08-692;NOMINAL;2020;123.6;e;;0.0 +D;DG;WZ08-692;NOMINAL;2021;130.0;e;;0.0 +D;DG;WZ08-692;NOMINAL;2022;141.6;e;;0.0 +D;DG;WZ08-692;NOMINAL;2023;153.3;p;;0.0 +D;DG;WZ08-692;REAL;2015;100.0;e;;0.0 +D;DG;WZ08-692;REAL;2016;101.9;e;;0.0 +D;DG;WZ08-692;REAL;2017;104.3;e;;0.0 +D;DG;WZ08-692;REAL;2018;107.2;e;;0.0 +D;DG;WZ08-692;REAL;2019;111.3;e;;0.0 +D;DG;WZ08-692;REAL;2020;113.1;e;;0.0 +D;DG;WZ08-692;REAL;2021;116.5;e;;0.0 +D;DG;WZ08-692;REAL;2022;123.3;e;;0.0 +D;DG;WZ08-692;REAL;2023;128.2;p;;0.0 +D;DG;WZ08-69;NOMINAL;2015;100.0;e;;0.0 +D;DG;WZ08-69;NOMINAL;2016;102.9;e;;0.0 +D;DG;WZ08-69;NOMINAL;2017;106.1;e;;0.0 +D;DG;WZ08-69;NOMINAL;2018;110.9;e;;0.0 +D;DG;WZ08-69;NOMINAL;2019;116.4;e;;0.0 +D;DG;WZ08-69;NOMINAL;2020;121.0;e;;0.0 +D;DG;WZ08-69;NOMINAL;2021;126.0;e;;0.0 +D;DG;WZ08-69;NOMINAL;2022;132.9;e;;0.0 +D;DG;WZ08-69;NOMINAL;2023;140.2;p;;0.0 +D;DG;WZ08-69;REAL;2015;100.0;e;;0.0 +D;DG;WZ08-69;REAL;2016;101.8;e;;0.0 +D;DG;WZ08-69;REAL;2017;104.0;e;;0.0 +D;DG;WZ08-69;REAL;2018;107.2;e;;0.0 +D;DG;WZ08-69;REAL;2019;111.1;e;;0.0 +D;DG;WZ08-69;REAL;2020;112.4;e;;0.0 +D;DG;WZ08-69;REAL;2021;113.2;e;;0.0 +D;DG;WZ08-69;REAL;2022;116.4;e;;0.0 +D;DG;WZ08-69;REAL;2023;118.3;p;;0.0 +D;DG;WZ08-7021;NOMINAL;2015;100.0;e;;0.0 +D;DG;WZ08-7021;NOMINAL;2016;112.6;e;;0.0 +D;DG;WZ08-7021;NOMINAL;2017;105.6;e;;0.0 +D;DG;WZ08-7021;NOMINAL;2018;110.4;e;;0.0 +D;DG;WZ08-7021;NOMINAL;2019;114.1;e;;0.0 +D;DG;WZ08-7021;NOMINAL;2020;110.8;e;;0.0 +D;DG;WZ08-7021;NOMINAL;2021;116.9;e;;0.0 +D;DG;WZ08-7021;NOMINAL;2022;130.7;e;;0.0 +D;DG;WZ08-7021;NOMINAL;2023;137.0;p;;0.0 +D;DG;WZ08-7022;NOMINAL;2015;100.0;e;;0.0 +D;DG;WZ08-7022;NOMINAL;2016;109.7;e;;0.0 +D;DG;WZ08-7022;NOMINAL;2017;115.7;e;;0.0 +D;DG;WZ08-7022;NOMINAL;2018;123.9;e;;0.0 +D;DG;WZ08-7022;NOMINAL;2019;124.0;e;;0.0 +D;DG;WZ08-7022;NOMINAL;2020;121.7;e;;0.0 +D;DG;WZ08-7022;NOMINAL;2021;136.5;e;;0.0 +D;DG;WZ08-7022;NOMINAL;2022;155.0;e;;0.0 +D;DG;WZ08-7022;NOMINAL;2023;159.4;p;;0.0 +D;DG;WZ08-702;NOMINAL;2015;100.0;e;;0.0 +D;DG;WZ08-702;NOMINAL;2016;109.8;e;;0.0 +D;DG;WZ08-702;NOMINAL;2017;115.2;e;;0.0 +D;DG;WZ08-702;NOMINAL;2018;123.2;e;;0.0 +D;DG;WZ08-702;NOMINAL;2019;123.6;e;;0.0 +D;DG;WZ08-702;NOMINAL;2020;121.2;e;;0.0 +D;DG;WZ08-702;NOMINAL;2021;135.5;e;;0.0 +D;DG;WZ08-702;NOMINAL;2022;153.8;e;;0.0 +D;DG;WZ08-702;NOMINAL;2023;158.3;p;;0.0 +D;DG;WZ08-702;REAL;2015;100.0;e;;0.0 +D;DG;WZ08-702;REAL;2016;109.2;e;;0.0 +D;DG;WZ08-702;REAL;2017;113.5;e;;0.0 +D;DG;WZ08-702;REAL;2018;120.7;e;;0.0 +D;DG;WZ08-702;REAL;2019;119.7;e;;0.0 +D;DG;WZ08-702;REAL;2020;116.9;e;;0.0 +D;DG;WZ08-702;REAL;2021;130.0;e;;0.0 +D;DG;WZ08-702;REAL;2022;144.8;e;;0.0 +D;DG;WZ08-702;REAL;2023;144.9;p;;0.0 +D;DG;WZ08-70;NOMINAL;2015;100.0;e;;0.0 +D;DG;WZ08-70;NOMINAL;2016;109.8;e;;0.0 +D;DG;WZ08-70;NOMINAL;2017;115.2;e;;0.0 +D;DG;WZ08-70;NOMINAL;2018;123.2;e;;0.0 +D;DG;WZ08-70;NOMINAL;2019;123.6;e;;0.0 +D;DG;WZ08-70;NOMINAL;2020;121.2;e;;0.0 +D;DG;WZ08-70;NOMINAL;2021;135.5;e;;0.0 +D;DG;WZ08-70;NOMINAL;2022;153.8;e;;0.0 +D;DG;WZ08-70;NOMINAL;2023;158.3;p;;0.0 +D;DG;WZ08-70;REAL;2015;100.0;e;;0.0 +D;DG;WZ08-70;REAL;2016;109.2;e;;0.0 +D;DG;WZ08-70;REAL;2017;113.5;e;;0.0 +D;DG;WZ08-70;REAL;2018;120.7;e;;0.0 +D;DG;WZ08-70;REAL;2019;119.7;e;;0.0 +D;DG;WZ08-70;REAL;2020;116.9;e;;0.0 +D;DG;WZ08-70;REAL;2021;130.0;e;;0.0 +D;DG;WZ08-70;REAL;2022;144.8;e;;0.0 +D;DG;WZ08-70;REAL;2023;144.9;p;;0.0 +D;DG;WZ08-71-01;NOMINAL;2015;100.0;e;;0.0 +D;DG;WZ08-71-01;NOMINAL;2016;106.0;e;;0.0 +D;DG;WZ08-71-01;NOMINAL;2017;113.9;e;;0.0 +D;DG;WZ08-71-01;NOMINAL;2018;118.1;e;;0.0 +D;DG;WZ08-71-01;NOMINAL;2019;122.1;e;;0.0 +D;DG;WZ08-71-01;NOMINAL;2020;101.9;e;;0.0 +D;DG;WZ08-71-01;NOMINAL;2021;109.4;e;;0.0 +D;DG;WZ08-71-01;NOMINAL;2022;130.2;e;;0.0 +D;DG;WZ08-71-01;NOMINAL;2023;136.3;p;;0.0 +D;DG;WZ08-71-01;REAL;2015;100.0;e;;0.0 +D;DG;WZ08-71-01;REAL;2016;104.6;e;;0.0 +D;DG;WZ08-71-01;REAL;2017;110.7;e;;0.0 +D;DG;WZ08-71-01;REAL;2018;112.5;e;;0.0 +D;DG;WZ08-71-01;REAL;2019;114.3;e;;0.0 +D;DG;WZ08-71-01;REAL;2020;94.6;e;;0.0 +D;DG;WZ08-71-01;REAL;2021;98.4;e;;0.0 +D;DG;WZ08-71-01;REAL;2022;112.1;e;;0.0 +D;DG;WZ08-71-01;REAL;2023;112.5;p;;0.0 +D;DG;WZ08-7111;NOMINAL;2015;100.0;e;;0.0 +D;DG;WZ08-7111;NOMINAL;2016;106.7;e;;0.0 +D;DG;WZ08-7111;NOMINAL;2017;118.6;e;;0.0 +D;DG;WZ08-7111;NOMINAL;2018;124.9;e;;0.0 +D;DG;WZ08-7111;NOMINAL;2019;132.9;e;;0.0 +D;DG;WZ08-7111;NOMINAL;2020;133.2;e;;0.0 +D;DG;WZ08-7111;NOMINAL;2021;135.6;e;;0.0 +D;DG;WZ08-7111;NOMINAL;2022;146.3;e;;0.0 +D;DG;WZ08-7111;NOMINAL;2023;149.9;p;;0.0 +D;DG;WZ08-7112;NOMINAL;2015;100.0;e;;0.0 +D;DG;WZ08-7112;NOMINAL;2016;99.9;e;;0.0 +D;DG;WZ08-7112;NOMINAL;2017;102.7;e;;0.0 +D;DG;WZ08-7112;NOMINAL;2018;101.3;e;;0.0 +D;DG;WZ08-7112;NOMINAL;2019;107.9;e;;0.0 +D;DG;WZ08-7112;NOMINAL;2020;108.8;e;;0.0 +D;DG;WZ08-7112;NOMINAL;2021;110.8;e;;0.0 +D;DG;WZ08-7112;NOMINAL;2022;126.3;e;;0.0 +D;DG;WZ08-7112;NOMINAL;2023;132.7;p;;0.0 +D;DG;WZ08-711;NOMINAL;2015;100.0;e;;0.0 +D;DG;WZ08-711;NOMINAL;2016;101.0;e;;0.0 +D;DG;WZ08-711;NOMINAL;2017;105.2;e;;0.0 +D;DG;WZ08-711;NOMINAL;2018;104.9;e;;0.0 +D;DG;WZ08-711;NOMINAL;2019;111.7;e;;0.0 +D;DG;WZ08-711;NOMINAL;2020;112.5;e;;0.0 +D;DG;WZ08-711;NOMINAL;2021;114.7;e;;0.0 +D;DG;WZ08-711;NOMINAL;2022;129.4;e;;0.0 +D;DG;WZ08-711;NOMINAL;2023;135.3;p;;0.0 +D;DG;WZ08-711;REAL;2015;100.0;e;;0.0 +D;DG;WZ08-711;REAL;2016;99.8;e;;0.0 +D;DG;WZ08-711;REAL;2017;102.4;e;;0.0 +D;DG;WZ08-711;REAL;2018;100.4;e;;0.0 +D;DG;WZ08-711;REAL;2019;104.8;e;;0.0 +D;DG;WZ08-711;REAL;2020;104.3;e;;0.0 +D;DG;WZ08-711;REAL;2021;103.6;e;;0.0 +D;DG;WZ08-711;REAL;2022;110.3;e;;0.0 +D;DG;WZ08-711;REAL;2023;109.8;p;;0.0 +D;DG;WZ08-712;NOMINAL;2015;100.0;e;;0.0 +D;DG;WZ08-712;NOMINAL;2016;106.1;e;;0.0 +D;DG;WZ08-712;NOMINAL;2017;107.2;e;;0.0 +D;DG;WZ08-712;NOMINAL;2018;105.8;e;;0.0 +D;DG;WZ08-712;NOMINAL;2019;109.7;e;;0.0 +D;DG;WZ08-712;NOMINAL;2020;112.1;e;;0.0 +D;DG;WZ08-712;NOMINAL;2021;116.7;e;;0.0 +D;DG;WZ08-712;NOMINAL;2022;122.5;e;;0.0 +D;DG;WZ08-712;NOMINAL;2023;132.5;p;;0.0 +D;DG;WZ08-712;REAL;2015;100.0;e;;0.0 +D;DG;WZ08-712;REAL;2016;105.2;e;;0.0 +D;DG;WZ08-712;REAL;2017;106.7;e;;0.0 +D;DG;WZ08-712;REAL;2018;102.8;e;;0.0 +D;DG;WZ08-712;REAL;2019;104.5;e;;0.0 +D;DG;WZ08-712;REAL;2020;103.8;e;;0.0 +D;DG;WZ08-712;REAL;2021;106.0;e;;0.0 +D;DG;WZ08-712;REAL;2022;106.6;e;;0.0 +D;DG;WZ08-712;REAL;2023;109.7;p;;0.0 +D;DG;WZ08-71;NOMINAL;2015;100.0;e;;0.0 +D;DG;WZ08-71;NOMINAL;2016;101.7;e;;0.0 +D;DG;WZ08-71;NOMINAL;2017;105.4;e;;0.0 +D;DG;WZ08-71;NOMINAL;2018;105.0;e;;0.0 +D;DG;WZ08-71;NOMINAL;2019;111.5;e;;0.0 +D;DG;WZ08-71;NOMINAL;2020;112.5;e;;0.0 +D;DG;WZ08-71;NOMINAL;2021;114.9;e;;0.0 +D;DG;WZ08-71;NOMINAL;2022;128.5;e;;0.0 +D;DG;WZ08-71;NOMINAL;2023;134.9;p;;0.0 +D;DG;WZ08-71;REAL;2015;100.0;e;;0.0 +D;DG;WZ08-71;REAL;2016;100.6;e;;0.0 +D;DG;WZ08-71;REAL;2017;102.9;e;;0.0 +D;DG;WZ08-71;REAL;2018;100.7;e;;0.0 +D;DG;WZ08-71;REAL;2019;104.8;e;;0.0 +D;DG;WZ08-71;REAL;2020;104.3;e;;0.0 +D;DG;WZ08-71;REAL;2021;103.9;e;;0.0 +D;DG;WZ08-71;REAL;2022;109.8;e;;0.0 +D;DG;WZ08-71;REAL;2023;109.8;p;;0.0 +D;DG;WZ08-7311;NOMINAL;2015;100.0;e;;0.0 +D;DG;WZ08-7311;NOMINAL;2016;102.6;e;;0.0 +D;DG;WZ08-7311;NOMINAL;2017;98.8;e;;0.0 +D;DG;WZ08-7311;NOMINAL;2018;102.0;e;;0.0 +D;DG;WZ08-7311;NOMINAL;2019;104.2;e;;0.0 +D;DG;WZ08-7311;NOMINAL;2020;90.8;e;;0.0 +D;DG;WZ08-7311;NOMINAL;2021;99.9;e;;0.0 +D;DG;WZ08-7311;NOMINAL;2022;111.2;e;;0.0 +D;DG;WZ08-7311;NOMINAL;2023;116.1;p;;0.0 +D;DG;WZ08-7312;NOMINAL;2015;100.0;e;;0.0 +D;DG;WZ08-7312;NOMINAL;2016;114.0;e;;0.0 +D;DG;WZ08-7312;NOMINAL;2017;112.7;e;;0.0 +D;DG;WZ08-7312;NOMINAL;2018;118.6;e;;0.0 +D;DG;WZ08-7312;NOMINAL;2019;122.8;e;;0.0 +D;DG;WZ08-7312;NOMINAL;2020;114.1;e;;0.0 +D;DG;WZ08-7312;NOMINAL;2021;139.3;e;;0.0 +D;DG;WZ08-7312;NOMINAL;2022;146.8;e;;0.0 +D;DG;WZ08-7312;NOMINAL;2023;162.7;p;;0.0 +D;DG;WZ08-731;NOMINAL;2015;100.0;e;;0.0 +D;DG;WZ08-731;NOMINAL;2016;106.6;e;;0.0 +D;DG;WZ08-731;NOMINAL;2017;103.8;e;;0.0 +D;DG;WZ08-731;NOMINAL;2018;107.9;e;;0.0 +D;DG;WZ08-731;NOMINAL;2019;110.8;e;;0.0 +D;DG;WZ08-731;NOMINAL;2020;99.0;e;;0.0 +D;DG;WZ08-731;NOMINAL;2021;113.9;e;;0.0 +D;DG;WZ08-731;NOMINAL;2022;123.8;e;;0.0 +D;DG;WZ08-731;NOMINAL;2023;132.6;p;;0.0 +D;DG;WZ08-731;REAL;2015;100.0;e;;0.0 +D;DG;WZ08-731;REAL;2016;104.1;e;;0.0 +D;DG;WZ08-731;REAL;2017;99.4;e;;0.0 +D;DG;WZ08-731;REAL;2018;100.7;e;;0.0 +D;DG;WZ08-731;REAL;2019;102.3;e;;0.0 +D;DG;WZ08-731;REAL;2020;91.0;e;;0.0 +D;DG;WZ08-731;REAL;2021;101.1;e;;0.0 +D;DG;WZ08-731;REAL;2022;107.0;e;;0.0 +D;DG;WZ08-731;REAL;2023;110.8;p;;0.0 +D;DG;WZ08-732;NOMINAL;2015;100.0;e;;0.0 +D;DG;WZ08-732;NOMINAL;2016;103.1;e;;0.0 +D;DG;WZ08-732;NOMINAL;2017;109.0;e;;0.0 +D;DG;WZ08-732;NOMINAL;2018;109.2;e;;0.0 +D;DG;WZ08-732;NOMINAL;2019;106.1;e;;0.0 +D;DG;WZ08-732;NOMINAL;2020;96.4;e;;0.0 +D;DG;WZ08-732;NOMINAL;2021;110.4;e;;0.0 +D;DG;WZ08-732;NOMINAL;2022;120.6;e;;0.0 +D;DG;WZ08-732;NOMINAL;2023;124.1;p;;0.0 +D;DG;WZ08-732;REAL;2015;100.0;e;;0.0 +D;DG;WZ08-732;REAL;2016;102.5;e;;0.0 +D;DG;WZ08-732;REAL;2017;108.1;e;;0.0 +D;DG;WZ08-732;REAL;2018;108.2;e;;0.0 +D;DG;WZ08-732;REAL;2019;104.6;e;;0.0 +D;DG;WZ08-732;REAL;2020;94.7;e;;0.0 +D;DG;WZ08-732;REAL;2021;107.7;e;;0.0 +D;DG;WZ08-732;REAL;2022;114.9;e;;0.0 +D;DG;WZ08-732;REAL;2023;114.2;p;;0.0 +D;DG;WZ08-73;NOMINAL;2015;100.0;e;;0.0 +D;DG;WZ08-73;NOMINAL;2016;106.3;e;;0.0 +D;DG;WZ08-73;NOMINAL;2017;104.2;e;;0.0 +D;DG;WZ08-73;NOMINAL;2018;108.0;e;;0.0 +D;DG;WZ08-73;NOMINAL;2019;110.4;e;;0.0 +D;DG;WZ08-73;NOMINAL;2020;98.8;e;;0.0 +D;DG;WZ08-73;NOMINAL;2021;113.6;e;;0.0 +D;DG;WZ08-73;NOMINAL;2022;123.5;e;;0.0 +D;DG;WZ08-73;NOMINAL;2023;131.9;p;;0.0 +D;DG;WZ08-73;REAL;2015;100.0;e;;0.0 +D;DG;WZ08-73;REAL;2016;103.9;e;;0.0 +D;DG;WZ08-73;REAL;2017;100.1;e;;0.0 +D;DG;WZ08-73;REAL;2018;101.3;e;;0.0 +D;DG;WZ08-73;REAL;2019;102.5;e;;0.0 +D;DG;WZ08-73;REAL;2020;91.3;e;;0.0 +D;DG;WZ08-73;REAL;2021;101.7;e;;0.0 +D;DG;WZ08-73;REAL;2022;107.7;e;;0.0 +D;DG;WZ08-73;REAL;2023;111.1;p;;0.0 +D;DG;WZ08-741;NOMINAL;2015;100.0;e;;0.0 +D;DG;WZ08-741;NOMINAL;2016;104.5;e;;0.0 +D;DG;WZ08-741;NOMINAL;2017;111.2;e;;0.0 +D;DG;WZ08-741;NOMINAL;2018;118.3;e;;0.0 +D;DG;WZ08-741;NOMINAL;2019;126.1;e;;0.0 +D;DG;WZ08-741;NOMINAL;2020;113.5;e;;0.0 +D;DG;WZ08-741;NOMINAL;2021;127.8;e;;0.0 +D;DG;WZ08-741;NOMINAL;2022;142.2;e;;0.0 +D;DG;WZ08-741;NOMINAL;2023;148.1;p;;0.0 +D;DG;WZ08-741;REAL;2015;100.0;e;;0.0 +D;DG;WZ08-741;REAL;2016;104.5;e;;0.0 +D;DG;WZ08-741;REAL;2017;111.0;e;;0.0 +D;DG;WZ08-741;REAL;2018;114.6;e;;0.0 +D;DG;WZ08-741;REAL;2019;121.4;e;;0.0 +D;DG;WZ08-741;REAL;2020;108.3;e;;0.0 +D;DG;WZ08-741;REAL;2021;117.2;e;;0.0 +D;DG;WZ08-741;REAL;2022;128.8;e;;0.0 +D;DG;WZ08-741;REAL;2023;131.7;p;;0.0 +D;DG;WZ08-742;NOMINAL;2015;100.0;e;;0.0 +D;DG;WZ08-742;NOMINAL;2016;101.2;e;;0.0 +D;DG;WZ08-742;NOMINAL;2017;105.6;e;;0.0 +D;DG;WZ08-742;NOMINAL;2018;105.4;e;;0.0 +D;DG;WZ08-742;NOMINAL;2019;109.4;e;;0.0 +D;DG;WZ08-742;NOMINAL;2020;97.7;e;;0.0 +D;DG;WZ08-742;NOMINAL;2021;102.4;e;;0.0 +D;DG;WZ08-742;NOMINAL;2022;104.8;e;;0.0 +D;DG;WZ08-742;NOMINAL;2023;101.2;p;;0.0 +D;DG;WZ08-742;REAL;2015;100.0;e;;0.0 +D;DG;WZ08-742;REAL;2016;101.3;e;;0.0 +D;DG;WZ08-742;REAL;2017;105.2;e;;0.0 +D;DG;WZ08-742;REAL;2018;102.1;e;;0.0 +D;DG;WZ08-742;REAL;2019;105.3;e;;0.0 +D;DG;WZ08-742;REAL;2020;93.0;e;;0.0 +D;DG;WZ08-742;REAL;2021;93.8;e;;0.0 +D;DG;WZ08-742;REAL;2022;94.9;e;;0.0 +D;DG;WZ08-742;REAL;2023;90.0;p;;0.0 +D;DG;WZ08-743;NOMINAL;2015;100.0;e;;0.0 +D;DG;WZ08-743;NOMINAL;2016;110.5;e;;0.0 +D;DG;WZ08-743;NOMINAL;2017;117.3;e;;0.0 +D;DG;WZ08-743;NOMINAL;2018;117.7;e;;0.0 +D;DG;WZ08-743;NOMINAL;2019;109.4;e;;0.0 +D;DG;WZ08-743;NOMINAL;2020;99.9;e;;0.0 +D;DG;WZ08-743;NOMINAL;2021;106.4;e;;0.0 +D;DG;WZ08-743;NOMINAL;2022;110.0;e;;0.0 +D;DG;WZ08-743;NOMINAL;2023;111.4;p;;0.0 +D;DG;WZ08-743;REAL;2015;100.0;e;;0.0 +D;DG;WZ08-743;REAL;2016;109.1;e;;0.0 +D;DG;WZ08-743;REAL;2017;114.1;e;;0.0 +D;DG;WZ08-743;REAL;2018;112.7;e;;0.0 +D;DG;WZ08-743;REAL;2019;103.3;e;;0.0 +D;DG;WZ08-743;REAL;2020;93.8;e;;0.0 +D;DG;WZ08-743;REAL;2021;94.2;e;;0.0 +D;DG;WZ08-743;REAL;2022;94.9;e;;0.0 +D;DG;WZ08-743;REAL;2023;92.4;p;;0.0 +D;DG;WZ08-749;NOMINAL;2015;100.0;e;;0.0 +D;DG;WZ08-749;NOMINAL;2016;105.4;e;;0.0 +D;DG;WZ08-749;NOMINAL;2017;99.4;e;;0.0 +D;DG;WZ08-749;NOMINAL;2018;98.8;e;;0.0 +D;DG;WZ08-749;NOMINAL;2019;99.9;e;;0.0 +D;DG;WZ08-749;NOMINAL;2020;105.6;e;;0.0 +D;DG;WZ08-749;NOMINAL;2021;122.8;e;;0.0 +D;DG;WZ08-749;NOMINAL;2022;142.6;e;;0.0 +D;DG;WZ08-749;NOMINAL;2023;153.7;p;;0.0 +D;DG;WZ08-749;REAL;2015;100.0;e;;0.0 +D;DG;WZ08-749;REAL;2016;104.6;e;;0.0 +D;DG;WZ08-749;REAL;2017;98.0;e;;0.0 +D;DG;WZ08-749;REAL;2018;96.3;e;;0.0 +D;DG;WZ08-749;REAL;2019;96.4;e;;0.0 +D;DG;WZ08-749;REAL;2020;102.6;e;;0.0 +D;DG;WZ08-749;REAL;2021;107.9;e;;0.0 +D;DG;WZ08-749;REAL;2022;123.4;e;;0.0 +D;DG;WZ08-749;REAL;2023;130.1;p;;0.0 +D;DG;WZ08-74;NOMINAL;2015;100.0;e;;0.0 +D;DG;WZ08-74;NOMINAL;2016;105.1;e;;0.0 +D;DG;WZ08-74;NOMINAL;2017;102.8;e;;0.0 +D;DG;WZ08-74;NOMINAL;2018;103.4;e;;0.0 +D;DG;WZ08-74;NOMINAL;2019;105.4;e;;0.0 +D;DG;WZ08-74;NOMINAL;2020;105.9;e;;0.0 +D;DG;WZ08-74;NOMINAL;2021;121.0;e;;0.0 +D;DG;WZ08-74;NOMINAL;2022;137.5;e;;0.0 +D;DG;WZ08-74;NOMINAL;2023;146.0;p;;0.0 +D;DG;WZ08-74;REAL;2015;100.0;e;;0.0 +D;DG;WZ08-74;REAL;2016;104.5;e;;0.0 +D;DG;WZ08-74;REAL;2017;101.5;e;;0.0 +D;DG;WZ08-74;REAL;2018;100.6;e;;0.0 +D;DG;WZ08-74;REAL;2019;101.6;e;;0.0 +D;DG;WZ08-74;REAL;2020;102.2;e;;0.0 +D;DG;WZ08-74;REAL;2021;107.5;e;;0.0 +D;DG;WZ08-74;REAL;2022;120.4;e;;0.0 +D;DG;WZ08-74;REAL;2023;124.9;p;;0.0 +D;DG;WZ08-7711;NOMINAL;2015;100.0;e;;0.0 +D;DG;WZ08-7711;NOMINAL;2016;114.8;e;;0.0 +D;DG;WZ08-7711;NOMINAL;2017;111.2;e;;0.0 +D;DG;WZ08-7711;NOMINAL;2018;120.3;e;;0.0 +D;DG;WZ08-7711;NOMINAL;2019;139.9;e;;0.0 +D;DG;WZ08-7711;NOMINAL;2020;133.4;e;;0.0 +D;DG;WZ08-7711;NOMINAL;2021;204.6;e;;0.0 +D;DG;WZ08-7711;NOMINAL;2022;222.2;e;;0.0 +D;DG;WZ08-7711;NOMINAL;2023;235.0;p;;0.0 +D;DG;WZ08-7712;NOMINAL;2015;100.0;e;;0.0 +D;DG;WZ08-7712;NOMINAL;2016;99.1;e;;0.0 +D;DG;WZ08-7712;NOMINAL;2017;103.1;e;;0.0 +D;DG;WZ08-7712;NOMINAL;2018;108.3;e;;0.0 +D;DG;WZ08-7712;NOMINAL;2019;125.8;e;;0.0 +D;DG;WZ08-7712;NOMINAL;2020;121.2;e;;0.0 +D;DG;WZ08-7712;NOMINAL;2021;141.8;e;;0.0 +D;DG;WZ08-7712;NOMINAL;2022;156.6;e;;0.0 +D;DG;WZ08-7712;NOMINAL;2023;167.6;p;;0.0 +D;DG;WZ08-771;NOMINAL;2015;100.0;e;;0.0 +D;DG;WZ08-771;NOMINAL;2016;112.6;e;;0.0 +D;DG;WZ08-771;NOMINAL;2017;110.0;e;;0.0 +D;DG;WZ08-771;NOMINAL;2018;118.6;e;;0.0 +D;DG;WZ08-771;NOMINAL;2019;137.9;e;;0.0 +D;DG;WZ08-771;NOMINAL;2020;131.7;e;;0.0 +D;DG;WZ08-771;NOMINAL;2021;195.8;e;;0.0 +D;DG;WZ08-771;NOMINAL;2022;213.0;e;;0.0 +D;DG;WZ08-771;NOMINAL;2023;225.6;p;;0.0 +D;DG;WZ08-771;REAL;2015;100.0;e;;0.0 +D;DG;WZ08-771;REAL;2016;111.0;e;;0.0 +D;DG;WZ08-771;REAL;2017;106.9;e;;0.0 +D;DG;WZ08-771;REAL;2018;113.2;e;;0.0 +D;DG;WZ08-771;REAL;2019;128.9;e;;0.0 +D;DG;WZ08-771;REAL;2020;122.1;e;;0.0 +D;DG;WZ08-771;REAL;2021;174.1;e;;0.0 +D;DG;WZ08-771;REAL;2022;173.9;e;;0.0 +D;DG;WZ08-771;REAL;2023;170.8;p;;0.0 +D;DG;WZ08-7721;NOMINAL;2015;100.0;e;;0.0 +D;DG;WZ08-7721;NOMINAL;2016;84.2;e;;0.0 +D;DG;WZ08-7721;NOMINAL;2017;129.1;e;;0.0 +D;DG;WZ08-7721;NOMINAL;2018;175.7;e;;0.0 +D;DG;WZ08-7721;NOMINAL;2019;276.9;e;;0.0 +D;DG;WZ08-7721;NOMINAL;2020;267.2;e;;0.0 +D;DG;WZ08-7721;NOMINAL;2021;415.2;e;;0.0 +D;DG;WZ08-7721;NOMINAL;2022;529.7;e;;0.0 +D;DG;WZ08-7721;NOMINAL;2023;557.0;p;;0.0 +D;DG;WZ08-7722;NOMINAL;2015;100.0;e;;0.0 +D;DG;WZ08-7722;NOMINAL;2016;116.8;e;;0.0 +D;DG;WZ08-7722;NOMINAL;2017;228.0;e;;0.0 +D;DG;WZ08-7722;NOMINAL;2018;58.0;e;;0.0 +D;DG;WZ08-7722;NOMINAL;2019;51.9;e;;0.0 +D;DG;WZ08-7722;NOMINAL;2020;27.1;e;;0.0 +D;DG;WZ08-7722;NOMINAL;2021;18.4;e;;0.0 +D;DG;WZ08-7722;NOMINAL;2022;18.1;e;;0.0 +D;DG;WZ08-7722;NOMINAL;2023;20.2;p;;0.0 +D;DG;WZ08-7729;NOMINAL;2015;100.0;e;;0.0 +D;DG;WZ08-7729;NOMINAL;2016;112.1;e;;0.0 +D;DG;WZ08-7729;NOMINAL;2017;115.9;e;;0.0 +D;DG;WZ08-7729;NOMINAL;2018;123.3;e;;0.0 +D;DG;WZ08-7729;NOMINAL;2019;134.3;e;;0.0 +D;DG;WZ08-7729;NOMINAL;2020;149.0;e;;0.0 +D;DG;WZ08-7729;NOMINAL;2021;188.2;e;;0.0 +D;DG;WZ08-7729;NOMINAL;2022;226.6;e;;0.0 +D;DG;WZ08-7729;NOMINAL;2023;232.4;p;;0.0 +D;DG;WZ08-772;NOMINAL;2015;100.0;e;;0.0 +D;DG;WZ08-772;NOMINAL;2016;111.3;e;;0.0 +D;DG;WZ08-772;NOMINAL;2017;127.4;e;;0.0 +D;DG;WZ08-772;NOMINAL;2018;119.4;e;;0.0 +D;DG;WZ08-772;NOMINAL;2019;132.9;e;;0.0 +D;DG;WZ08-772;NOMINAL;2020;142.6;e;;0.0 +D;DG;WZ08-772;NOMINAL;2021;182.2;e;;0.0 +D;DG;WZ08-772;NOMINAL;2022;220.4;e;;0.0 +D;DG;WZ08-772;NOMINAL;2023;226.8;p;;0.0 +D;DG;WZ08-772;REAL;2015;100.0;e;;0.0 +D;DG;WZ08-772;REAL;2016;109.8;e;;0.0 +D;DG;WZ08-772;REAL;2017;124.7;e;;0.0 +D;DG;WZ08-772;REAL;2018;115.0;e;;0.0 +D;DG;WZ08-772;REAL;2019;127.0;e;;0.0 +D;DG;WZ08-772;REAL;2020;134.8;e;;0.0 +D;DG;WZ08-772;REAL;2021;167.1;e;;0.0 +D;DG;WZ08-772;REAL;2022;193.0;e;;0.0 +D;DG;WZ08-772;REAL;2023;196.3;p;;0.0 +D;DG;WZ08-7731;NOMINAL;2015;100.0;e;;0.0 +D;DG;WZ08-7731;NOMINAL;2016;59.7;e;;0.0 +D;DG;WZ08-7731;NOMINAL;2017;61.6;e;;0.0 +D;DG;WZ08-7731;NOMINAL;2018;59.1;e;;0.0 +D;DG;WZ08-7731;NOMINAL;2019;57.5;e;;0.0 +D;DG;WZ08-7731;NOMINAL;2020;72.6;e;;0.0 +D;DG;WZ08-7731;NOMINAL;2021;103.7;e;;0.0 +D;DG;WZ08-7731;NOMINAL;2022;106.7;e;;0.0 +D;DG;WZ08-7731;NOMINAL;2023;87.4;p;;0.0 +D;DG;WZ08-7732;NOMINAL;2015;100.0;e;;0.0 +D;DG;WZ08-7732;NOMINAL;2016;102.4;e;;0.0 +D;DG;WZ08-7732;NOMINAL;2017;112.3;e;;0.0 +D;DG;WZ08-7732;NOMINAL;2018;120.2;e;;0.0 +D;DG;WZ08-7732;NOMINAL;2019;152.4;e;;0.0 +D;DG;WZ08-7732;NOMINAL;2020;160.9;e;;0.0 +D;DG;WZ08-7732;NOMINAL;2021;180.1;e;;0.0 +D;DG;WZ08-7732;NOMINAL;2022;193.7;e;;0.0 +D;DG;WZ08-7732;NOMINAL;2023;203.0;p;;0.0 +D;DG;WZ08-7733;NOMINAL;2015;100.0;e;;0.0 +D;DG;WZ08-7733;NOMINAL;2016;97.2;e;;0.0 +D;DG;WZ08-7733;NOMINAL;2017;102.0;e;;0.0 +D;DG;WZ08-7733;NOMINAL;2018;112.8;e;;0.0 +D;DG;WZ08-7733;NOMINAL;2019;142.9;e;;0.0 +D;DG;WZ08-7733;NOMINAL;2020;128.2;e;;0.0 +D;DG;WZ08-7733;NOMINAL;2021;121.7;e;;0.0 +D;DG;WZ08-7733;NOMINAL;2022;134.2;e;;0.0 +D;DG;WZ08-7733;NOMINAL;2023;136.9;p;;0.0 +D;DG;WZ08-7734;NOMINAL;2015;100.0;e;;0.0 +D;DG;WZ08-7734;NOMINAL;2016;47.3;e;;0.0 +D;DG;WZ08-7734;NOMINAL;2017;55.1;e;;0.0 +D;DG;WZ08-7734;NOMINAL;2018;50.3;e;;0.0 +D;DG;WZ08-7734;NOMINAL;2019;48.6;e;;0.0 +D;DG;WZ08-7734;NOMINAL;2020;87.2;e;;0.0 +D;DG;WZ08-7734;NOMINAL;2021;63.3;e;;0.0 +D;DG;WZ08-7734;NOMINAL;2022;64.5;e;;0.0 +D;DG;WZ08-7734;NOMINAL;2023;65.1;p;;0.0 +D;DG;WZ08-7735;NOMINAL;2015;100.0;e;;0.0 +D;DG;WZ08-7735;NOMINAL;2016;66.5;e;;0.0 +D;DG;WZ08-7735;NOMINAL;2017;84.9;e;;0.0 +D;DG;WZ08-7735;NOMINAL;2018;200.4;e;;0.0 +D;DG;WZ08-7735;NOMINAL;2019;129.9;e;;0.0 +D;DG;WZ08-7735;NOMINAL;2020;45.5;e;;0.0 +D;DG;WZ08-7735;NOMINAL;2021;80.6;e;;0.0 +D;DG;WZ08-7735;NOMINAL;2022;53.5;e;;0.0 +D;DG;WZ08-7735;NOMINAL;2023;38.2;p;;0.0 +D;DG;WZ08-7739;NOMINAL;2015;100.0;e;;0.0 +D;DG;WZ08-7739;NOMINAL;2016;108.8;e;;0.0 +D;DG;WZ08-7739;NOMINAL;2017;115.0;e;;0.0 +D;DG;WZ08-7739;NOMINAL;2018;114.4;e;;0.0 +D;DG;WZ08-7739;NOMINAL;2019;128.6;e;;0.0 +D;DG;WZ08-7739;NOMINAL;2020;132.2;e;;0.0 +D;DG;WZ08-7739;NOMINAL;2021;203.3;e;;0.0 +D;DG;WZ08-7739;NOMINAL;2022;225.4;e;;0.0 +D;DG;WZ08-7739;NOMINAL;2023;234.1;p;;0.0 +D;DG;WZ08-773;NOMINAL;2015;100.0;e;;0.0 +D;DG;WZ08-773;NOMINAL;2016;99.6;e;;0.0 +D;DG;WZ08-773;NOMINAL;2017;106.9;e;;0.0 +D;DG;WZ08-773;NOMINAL;2018;114.8;e;;0.0 +D;DG;WZ08-773;NOMINAL;2019;130.7;e;;0.0 +D;DG;WZ08-773;NOMINAL;2020;130.5;e;;0.0 +D;DG;WZ08-773;NOMINAL;2021;171.6;e;;0.0 +D;DG;WZ08-773;NOMINAL;2022;186.6;e;;0.0 +D;DG;WZ08-773;NOMINAL;2023;192.1;p;;0.0 +D;DG;WZ08-773;REAL;2015;100.0;e;;0.0 +D;DG;WZ08-773;REAL;2016;99.8;e;;0.0 +D;DG;WZ08-773;REAL;2017;106.6;e;;0.0 +D;DG;WZ08-773;REAL;2018;113.9;e;;0.0 +D;DG;WZ08-773;REAL;2019;129.8;e;;0.0 +D;DG;WZ08-773;REAL;2020;130.7;e;;0.0 +D;DG;WZ08-773;REAL;2021;168.8;e;;0.0 +D;DG;WZ08-773;REAL;2022;175.9;e;;0.0 +D;DG;WZ08-773;REAL;2023;174.2;p;;0.0 +D;DG;WZ08-774;NOMINAL;2015;100.0;e;;0.0 +D;DG;WZ08-774;NOMINAL;2016;107.1;e;;0.0 +D;DG;WZ08-774;NOMINAL;2017;122.0;e;;0.0 +D;DG;WZ08-774;NOMINAL;2018;127.9;e;;0.0 +D;DG;WZ08-774;NOMINAL;2019;98.4;e;;0.0 +D;DG;WZ08-774;NOMINAL;2020;48.9;e;;0.0 +D;DG;WZ08-774;NOMINAL;2021;51.2;e;;0.0 +D;DG;WZ08-774;NOMINAL;2022;56.7;e;;0.0 +D;DG;WZ08-774;NOMINAL;2023;54.6;p;;0.0 +D;DG;WZ08-774;REAL;2015;100.0;e;;0.0 +D;DG;WZ08-774;REAL;2016;104.8;e;;0.0 +D;DG;WZ08-774;REAL;2017;118.4;e;;0.0 +D;DG;WZ08-774;REAL;2018;123.3;e;;0.0 +D;DG;WZ08-774;REAL;2019;94.3;e;;0.0 +D;DG;WZ08-774;REAL;2020;46.5;e;;0.0 +D;DG;WZ08-774;REAL;2021;48.0;e;;0.0 +D;DG;WZ08-774;REAL;2022;51.7;e;;0.0 +D;DG;WZ08-774;REAL;2023;48.5;p;;0.0 +D;DG;WZ08-77;NOMINAL;2015;100.0;e;;0.0 +D;DG;WZ08-77;NOMINAL;2016;105.8;e;;0.0 +D;DG;WZ08-77;NOMINAL;2017;112.4;e;;0.0 +D;DG;WZ08-77;NOMINAL;2018;118.4;e;;0.0 +D;DG;WZ08-77;NOMINAL;2019;128.3;e;;0.0 +D;DG;WZ08-77;NOMINAL;2020;120.2;e;;0.0 +D;DG;WZ08-77;NOMINAL;2021;162.1;e;;0.0 +D;DG;WZ08-77;NOMINAL;2022;178.9;e;;0.0 +D;DG;WZ08-77;NOMINAL;2023;185.5;p;;0.0 +D;DG;WZ08-77;REAL;2015;100.0;e;;0.0 +D;DG;WZ08-77;REAL;2016;104.9;e;;0.0 +D;DG;WZ08-77;REAL;2017;110.5;e;;0.0 +D;DG;WZ08-77;REAL;2018;115.2;e;;0.0 +D;DG;WZ08-77;REAL;2019;123.9;e;;0.0 +D;DG;WZ08-77;REAL;2020;116.2;e;;0.0 +D;DG;WZ08-77;REAL;2021;152.3;e;;0.0 +D;DG;WZ08-77;REAL;2022;158.9;e;;0.0 +D;DG;WZ08-77;REAL;2023;157.1;p;;0.0 +D;DG;WZ08-781;NOMINAL;2015;100.0;e;;0.0 +D;DG;WZ08-781;NOMINAL;2016;114.3;e;;0.0 +D;DG;WZ08-781;NOMINAL;2017;124.6;e;;0.0 +D;DG;WZ08-781;NOMINAL;2018;141.2;e;;0.0 +D;DG;WZ08-781;NOMINAL;2019;141.8;e;;0.0 +D;DG;WZ08-781;NOMINAL;2020;120.7;e;;0.0 +D;DG;WZ08-781;NOMINAL;2021;150.8;e;;0.0 +D;DG;WZ08-781;NOMINAL;2022;175.0;e;;0.0 +D;DG;WZ08-781;NOMINAL;2023;182.0;p;;0.0 +D;DG;WZ08-781;REAL;2015;100.0;e;;0.0 +D;DG;WZ08-781;REAL;2016;111.4;e;;0.0 +D;DG;WZ08-781;REAL;2017;118.5;e;;0.0 +D;DG;WZ08-781;REAL;2018;130.0;e;;0.0 +D;DG;WZ08-781;REAL;2019;126.0;e;;0.0 +D;DG;WZ08-781;REAL;2020;108.9;e;;0.0 +D;DG;WZ08-781;REAL;2021;131.3;e;;0.0 +D;DG;WZ08-781;REAL;2022;146.6;e;;0.0 +D;DG;WZ08-781;REAL;2023;144.2;p;;0.0 +D;DG;WZ08-782;NOMINAL;2015;100.0;e;;0.0 +D;DG;WZ08-782;NOMINAL;2016;104.0;e;;0.0 +D;DG;WZ08-782;NOMINAL;2017;111.1;e;;0.0 +D;DG;WZ08-782;NOMINAL;2018;112.5;e;;0.0 +D;DG;WZ08-782;NOMINAL;2019;102.8;e;;0.0 +D;DG;WZ08-782;NOMINAL;2020;83.0;e;;0.0 +D;DG;WZ08-782;NOMINAL;2021;95.2;e;;0.0 +D;DG;WZ08-782;NOMINAL;2022;103.0;e;;0.0 +D;DG;WZ08-782;NOMINAL;2023;104.9;p;;0.0 +D;DG;WZ08-782;REAL;2015;100.0;e;;0.0 +D;DG;WZ08-782;REAL;2016;101.7;e;;0.0 +D;DG;WZ08-782;REAL;2017;106.1;e;;0.0 +D;DG;WZ08-782;REAL;2018;104.3;e;;0.0 +D;DG;WZ08-782;REAL;2019;92.7;e;;0.0 +D;DG;WZ08-782;REAL;2020;72.9;e;;0.0 +D;DG;WZ08-782;REAL;2021;81.3;e;;0.0 +D;DG;WZ08-782;REAL;2022;84.5;e;;0.0 +D;DG;WZ08-782;REAL;2023;80.7;p;;0.0 +D;DG;WZ08-783;NOMINAL;2015;100.0;e;;0.0 +D;DG;WZ08-783;NOMINAL;2016;95.9;e;;0.0 +D;DG;WZ08-783;NOMINAL;2017;115.0;e;;0.0 +D;DG;WZ08-783;NOMINAL;2018;93.5;e;;0.0 +D;DG;WZ08-783;NOMINAL;2019;84.4;e;;0.0 +D;DG;WZ08-783;NOMINAL;2020;75.9;e;;0.0 +D;DG;WZ08-783;NOMINAL;2021;83.9;e;;0.0 +D;DG;WZ08-783;NOMINAL;2022;90.8;e;;0.0 +D;DG;WZ08-783;NOMINAL;2023;93.7;p;;0.0 +D;DG;WZ08-783;REAL;2015;100.0;e;;0.0 +D;DG;WZ08-783;REAL;2016;93.8;e;;0.0 +D;DG;WZ08-783;REAL;2017;109.8;e;;0.0 +D;DG;WZ08-783;REAL;2018;86.7;e;;0.0 +D;DG;WZ08-783;REAL;2019;76.1;e;;0.0 +D;DG;WZ08-783;REAL;2020;66.8;e;;0.0 +D;DG;WZ08-783;REAL;2021;71.8;e;;0.0 +D;DG;WZ08-783;REAL;2022;74.6;e;;0.0 +D;DG;WZ08-783;REAL;2023;72.3;p;;0.0 +D;DG;WZ08-78;NOMINAL;2015;100.0;e;;0.0 +D;DG;WZ08-78;NOMINAL;2016;103.4;e;;0.0 +D;DG;WZ08-78;NOMINAL;2017;112.7;e;;0.0 +D;DG;WZ08-78;NOMINAL;2018;111.4;e;;0.0 +D;DG;WZ08-78;NOMINAL;2019;102.5;e;;0.0 +D;DG;WZ08-78;NOMINAL;2020;84.4;e;;0.0 +D;DG;WZ08-78;NOMINAL;2021;97.2;e;;0.0 +D;DG;WZ08-78;NOMINAL;2022;106.0;e;;0.0 +D;DG;WZ08-78;NOMINAL;2023;108.3;p;;0.0 +D;DG;WZ08-78;REAL;2015;100.0;e;;0.0 +D;DG;WZ08-78;REAL;2016;101.1;e;;0.0 +D;DG;WZ08-78;REAL;2017;107.6;e;;0.0 +D;DG;WZ08-78;REAL;2018;103.3;e;;0.0 +D;DG;WZ08-78;REAL;2019;92.4;e;;0.0 +D;DG;WZ08-78;REAL;2020;74.3;e;;0.0 +D;DG;WZ08-78;REAL;2021;83.2;e;;0.0 +D;DG;WZ08-78;REAL;2022;87.1;e;;0.0 +D;DG;WZ08-78;REAL;2023;83.7;p;;0.0 +D;DG;WZ08-7911;NOMINAL;2015;100.0;e;;0.0 +D;DG;WZ08-7911;NOMINAL;2016;106.7;e;;0.0 +D;DG;WZ08-7911;NOMINAL;2017;112.0;e;;0.0 +D;DG;WZ08-7911;NOMINAL;2018;114.3;e;;0.0 +D;DG;WZ08-7911;NOMINAL;2019;114.4;e;;0.0 +D;DG;WZ08-7911;NOMINAL;2020;41.6;e;;0.0 +D;DG;WZ08-7911;NOMINAL;2021;50.7;e;;0.0 +D;DG;WZ08-7911;NOMINAL;2022;82.9;e;;0.0 +D;DG;WZ08-7911;NOMINAL;2023;112.3;p;;0.0 +D;DG;WZ08-7912;NOMINAL;2015;100.0;e;;0.0 +D;DG;WZ08-7912;NOMINAL;2016;97.3;e;;0.0 +D;DG;WZ08-7912;NOMINAL;2017;104.7;e;;0.0 +D;DG;WZ08-7912;NOMINAL;2018;109.5;e;;0.0 +D;DG;WZ08-7912;NOMINAL;2019;111.3;e;;0.0 +D;DG;WZ08-7912;NOMINAL;2020;30.5;e;;0.0 +D;DG;WZ08-7912;NOMINAL;2021;57.0;e;;0.0 +D;DG;WZ08-7912;NOMINAL;2022;122.8;e;;0.0 +D;DG;WZ08-7912;NOMINAL;2023;152.2;p;;0.0 +D;DG;WZ08-791;NOMINAL;2015;100.0;e;;0.0 +D;DG;WZ08-791;NOMINAL;2016;99.0;e;;0.0 +D;DG;WZ08-791;NOMINAL;2017;106.0;e;;0.0 +D;DG;WZ08-791;NOMINAL;2018;110.3;e;;0.0 +D;DG;WZ08-791;NOMINAL;2019;111.9;e;;0.0 +D;DG;WZ08-791;NOMINAL;2020;32.4;e;;0.0 +D;DG;WZ08-791;NOMINAL;2021;55.9;e;;0.0 +D;DG;WZ08-791;NOMINAL;2022;115.9;e;;0.0 +D;DG;WZ08-791;NOMINAL;2023;145.3;p;;0.0 +D;DG;WZ08-791;REAL;2015;100.0;e;;0.0 +D;DG;WZ08-791;REAL;2016;100.7;e;;0.0 +D;DG;WZ08-791;REAL;2017;105.2;e;;0.0 +D;DG;WZ08-791;REAL;2018;106.4;e;;0.0 +D;DG;WZ08-791;REAL;2019;107.6;e;;0.0 +D;DG;WZ08-791;REAL;2020;35.3;e;;0.0 +D;DG;WZ08-791;REAL;2021;51.9;e;;0.0 +D;DG;WZ08-791;REAL;2022;100.1;e;;0.0 +D;DG;WZ08-791;REAL;2023;115.6;p;;0.0 +D;DG;WZ08-799;NOMINAL;2015;100.0;e;;0.0 +D;DG;WZ08-799;NOMINAL;2016;109.2;e;;0.0 +D;DG;WZ08-799;NOMINAL;2017;116.3;e;;0.0 +D;DG;WZ08-799;NOMINAL;2018;122.5;e;;0.0 +D;DG;WZ08-799;NOMINAL;2019;113.9;e;;0.0 +D;DG;WZ08-799;NOMINAL;2020;43.4;e;;0.0 +D;DG;WZ08-799;NOMINAL;2021;54.7;e;;0.0 +D;DG;WZ08-799;NOMINAL;2022;94.4;e;;0.0 +D;DG;WZ08-799;NOMINAL;2023;111.1;p;;0.0 +D;DG;WZ08-799;REAL;2015;100.0;e;;0.0 +D;DG;WZ08-799;REAL;2016;111.0;e;;0.0 +D;DG;WZ08-799;REAL;2017;116.3;e;;0.0 +D;DG;WZ08-799;REAL;2018;119.3;e;;0.0 +D;DG;WZ08-799;REAL;2019;110.9;e;;0.0 +D;DG;WZ08-799;REAL;2020;46.1;e;;0.0 +D;DG;WZ08-799;REAL;2021;51.4;e;;0.0 +D;DG;WZ08-799;REAL;2022;82.7;e;;0.0 +D;DG;WZ08-799;REAL;2023;87.6;p;;0.0 +D;DG;WZ08-79;NOMINAL;2015;100.0;e;;0.0 +D;DG;WZ08-79;NOMINAL;2016;99.5;e;;0.0 +D;DG;WZ08-79;NOMINAL;2017;106.5;e;;0.0 +D;DG;WZ08-79;NOMINAL;2018;110.9;e;;0.0 +D;DG;WZ08-79;NOMINAL;2019;112.0;e;;0.0 +D;DG;WZ08-79;NOMINAL;2020;32.9;e;;0.0 +D;DG;WZ08-79;NOMINAL;2021;55.8;e;;0.0 +D;DG;WZ08-79;NOMINAL;2022;114.8;e;;0.0 +D;DG;WZ08-79;NOMINAL;2023;143.6;p;;0.0 +D;DG;WZ08-79;REAL;2015;100.0;e;;0.0 +D;DG;WZ08-79;REAL;2016;101.2;e;;0.0 +D;DG;WZ08-79;REAL;2017;105.8;e;;0.0 +D;DG;WZ08-79;REAL;2018;107.1;e;;0.0 +D;DG;WZ08-79;REAL;2019;107.8;e;;0.0 +D;DG;WZ08-79;REAL;2020;35.8;e;;0.0 +D;DG;WZ08-79;REAL;2021;51.8;e;;0.0 +D;DG;WZ08-79;REAL;2022;99.2;e;;0.0 +D;DG;WZ08-79;REAL;2023;114.2;p;;0.0 +D;DG;WZ08-801;NOMINAL;2015;100.0;e;;0.0 +D;DG;WZ08-801;NOMINAL;2016;120.7;e;;0.0 +D;DG;WZ08-801;NOMINAL;2017;115.6;e;;0.0 +D;DG;WZ08-801;NOMINAL;2018;113.4;e;;0.0 +D;DG;WZ08-801;NOMINAL;2019;120.3;e;;0.0 +D;DG;WZ08-801;NOMINAL;2020;128.1;e;;0.0 +D;DG;WZ08-801;NOMINAL;2021;143.0;e;;0.0 +D;DG;WZ08-801;NOMINAL;2022;158.0;e;;0.0 +D;DG;WZ08-801;NOMINAL;2023;177.9;p;;0.0 +D;DG;WZ08-801;REAL;2015;100.0;e;;0.0 +D;DG;WZ08-801;REAL;2016;117.6;e;;0.0 +D;DG;WZ08-801;REAL;2017;109.1;e;;0.0 +D;DG;WZ08-801;REAL;2018;104.4;e;;0.0 +D;DG;WZ08-801;REAL;2019;107.2;e;;0.0 +D;DG;WZ08-801;REAL;2020;111.1;e;;0.0 +D;DG;WZ08-801;REAL;2021;121.9;e;;0.0 +D;DG;WZ08-801;REAL;2022;130.9;e;;0.0 +D;DG;WZ08-801;REAL;2023;136.9;p;;0.0 +D;DG;WZ08-802;NOMINAL;2015;100.0;e;;0.0 +D;DG;WZ08-802;NOMINAL;2016;111.1;e;;0.0 +D;DG;WZ08-802;NOMINAL;2017;104.0;e;;0.0 +D;DG;WZ08-802;NOMINAL;2018;110.7;e;;0.0 +D;DG;WZ08-802;NOMINAL;2019;114.4;e;;0.0 +D;DG;WZ08-802;NOMINAL;2020;124.0;e;;0.0 +D;DG;WZ08-802;NOMINAL;2021;123.4;e;;0.0 +D;DG;WZ08-802;NOMINAL;2022;135.0;e;;0.0 +D;DG;WZ08-802;NOMINAL;2023;142.9;p;;0.0 +D;DG;WZ08-802;REAL;2015;100.0;e;;0.0 +D;DG;WZ08-802;REAL;2016;108.2;e;;0.0 +D;DG;WZ08-802;REAL;2017;98.1;e;;0.0 +D;DG;WZ08-802;REAL;2018;102.0;e;;0.0 +D;DG;WZ08-802;REAL;2019;102.0;e;;0.0 +D;DG;WZ08-802;REAL;2020;107.5;e;;0.0 +D;DG;WZ08-802;REAL;2021;105.2;e;;0.0 +D;DG;WZ08-802;REAL;2022;111.8;e;;0.0 +D;DG;WZ08-802;REAL;2023;110.1;p;;0.0 +D;DG;WZ08-803;NOMINAL;2015;100.0;e;;0.0 +D;DG;WZ08-803;NOMINAL;2016;114.7;e;;0.0 +D;DG;WZ08-803;NOMINAL;2017;92.0;e;;0.0 +D;DG;WZ08-803;NOMINAL;2018;89.3;e;;0.0 +D;DG;WZ08-803;NOMINAL;2019;82.7;e;;0.0 +D;DG;WZ08-803;NOMINAL;2020;83.6;e;;0.0 +D;DG;WZ08-803;NOMINAL;2021;87.7;e;;0.0 +D;DG;WZ08-803;NOMINAL;2022;94.9;e;;0.0 +D;DG;WZ08-803;NOMINAL;2023;102.7;p;;0.0 +D;DG;WZ08-803;REAL;2015;100.0;e;;0.0 +D;DG;WZ08-803;REAL;2016;111.7;e;;0.0 +D;DG;WZ08-803;REAL;2017;86.8;e;;0.0 +D;DG;WZ08-803;REAL;2018;82.3;e;;0.0 +D;DG;WZ08-803;REAL;2019;73.7;e;;0.0 +D;DG;WZ08-803;REAL;2020;72.5;e;;0.0 +D;DG;WZ08-803;REAL;2021;74.7;e;;0.0 +D;DG;WZ08-803;REAL;2022;78.6;e;;0.0 +D;DG;WZ08-803;REAL;2023;79.1;p;;0.0 +D;DG;WZ08-80;NOMINAL;2015;100.0;e;;0.0 +D;DG;WZ08-80;NOMINAL;2016;119.5;e;;0.0 +D;DG;WZ08-80;NOMINAL;2017;113.7;e;;0.0 +D;DG;WZ08-80;NOMINAL;2018;112.4;e;;0.0 +D;DG;WZ08-80;NOMINAL;2019;118.5;e;;0.0 +D;DG;WZ08-80;NOMINAL;2020;126.4;e;;0.0 +D;DG;WZ08-80;NOMINAL;2021;139.3;e;;0.0 +D;DG;WZ08-80;NOMINAL;2022;153.7;e;;0.0 +D;DG;WZ08-80;NOMINAL;2023;171.9;p;;0.0 +D;DG;WZ08-80;REAL;2015;100.0;e;;0.0 +D;DG;WZ08-80;REAL;2016;116.4;e;;0.0 +D;DG;WZ08-80;REAL;2017;107.3;e;;0.0 +D;DG;WZ08-80;REAL;2018;103.5;e;;0.0 +D;DG;WZ08-80;REAL;2019;105.7;e;;0.0 +D;DG;WZ08-80;REAL;2020;109.6;e;;0.0 +D;DG;WZ08-80;REAL;2021;118.8;e;;0.0 +D;DG;WZ08-80;REAL;2022;127.3;e;;0.0 +D;DG;WZ08-80;REAL;2023;132.4;p;;0.0 +D;DG;WZ08-811;NOMINAL;2015;100.0;e;;0.0 +D;DG;WZ08-811;NOMINAL;2016;103.8;e;;0.0 +D;DG;WZ08-811;NOMINAL;2017;107.0;e;;0.0 +D;DG;WZ08-811;NOMINAL;2018;112.2;e;;0.0 +D;DG;WZ08-811;NOMINAL;2019;123.4;e;;0.0 +D;DG;WZ08-811;NOMINAL;2020;115.1;e;;0.0 +D;DG;WZ08-811;NOMINAL;2021;123.1;e;;0.0 +D;DG;WZ08-811;NOMINAL;2022;133.4;e;;0.0 +D;DG;WZ08-811;NOMINAL;2023;142.7;p;;0.0 +D;DG;WZ08-811;REAL;2015;100.0;e;;0.0 +D;DG;WZ08-811;REAL;2016;101.9;e;;0.0 +D;DG;WZ08-811;REAL;2017;103.2;e;;0.0 +D;DG;WZ08-811;REAL;2018;105.8;e;;0.0 +D;DG;WZ08-811;REAL;2019;113.7;e;;0.0 +D;DG;WZ08-811;REAL;2020;104.2;e;;0.0 +D;DG;WZ08-811;REAL;2021;108.4;e;;0.0 +D;DG;WZ08-811;REAL;2022;112.1;e;;0.0 +D;DG;WZ08-811;REAL;2023;111.1;p;;0.0 +D;DG;WZ08-8121;NOMINAL;2015;100.0;e;;0.0 +D;DG;WZ08-8121;NOMINAL;2016;107.4;e;;0.0 +D;DG;WZ08-8121;NOMINAL;2017;109.7;e;;0.0 +D;DG;WZ08-8121;NOMINAL;2018;115.8;e;;0.0 +D;DG;WZ08-8121;NOMINAL;2019;120.9;e;;0.0 +D;DG;WZ08-8121;NOMINAL;2020;119.7;e;;0.0 +D;DG;WZ08-8121;NOMINAL;2021;135.4;e;;0.0 +D;DG;WZ08-8121;NOMINAL;2022;150.6;e;;0.0 +D;DG;WZ08-8121;NOMINAL;2023;163.0;p;;0.0 +D;DG;WZ08-8122;NOMINAL;2015;100.0;e;;0.0 +D;DG;WZ08-8122;NOMINAL;2016;107.2;e;;0.0 +D;DG;WZ08-8122;NOMINAL;2017;106.6;e;;0.0 +D;DG;WZ08-8122;NOMINAL;2018;117.8;e;;0.0 +D;DG;WZ08-8122;NOMINAL;2019;123.3;e;;0.0 +D;DG;WZ08-8122;NOMINAL;2020;126.2;e;;0.0 +D;DG;WZ08-8122;NOMINAL;2021;132.1;e;;0.0 +D;DG;WZ08-8122;NOMINAL;2022;142.8;e;;0.0 +D;DG;WZ08-8122;NOMINAL;2023;159.6;p;;0.0 +D;DG;WZ08-8129;NOMINAL;2015;100.0;e;;0.0 +D;DG;WZ08-8129;NOMINAL;2016;106.4;e;;0.0 +D;DG;WZ08-8129;NOMINAL;2017;117.8;e;;0.0 +D;DG;WZ08-8129;NOMINAL;2018;122.5;e;;0.0 +D;DG;WZ08-8129;NOMINAL;2019;128.7;e;;0.0 +D;DG;WZ08-8129;NOMINAL;2020;131.5;e;;0.0 +D;DG;WZ08-8129;NOMINAL;2021;139.5;e;;0.0 +D;DG;WZ08-8129;NOMINAL;2022;150.3;e;;0.0 +D;DG;WZ08-8129;NOMINAL;2023;163.0;p;;0.0 +D;DG;WZ08-812;NOMINAL;2015;100.0;e;;0.0 +D;DG;WZ08-812;NOMINAL;2016;107.3;e;;0.0 +D;DG;WZ08-812;NOMINAL;2017;109.8;e;;0.0 +D;DG;WZ08-812;NOMINAL;2018;116.7;e;;0.0 +D;DG;WZ08-812;NOMINAL;2019;121.9;e;;0.0 +D;DG;WZ08-812;NOMINAL;2020;121.8;e;;0.0 +D;DG;WZ08-812;NOMINAL;2021;135.2;e;;0.0 +D;DG;WZ08-812;NOMINAL;2022;149.2;e;;0.0 +D;DG;WZ08-812;NOMINAL;2023;162.4;p;;0.0 +D;DG;WZ08-812;REAL;2015;100.0;e;;0.0 +D;DG;WZ08-812;REAL;2016;105.2;e;;0.0 +D;DG;WZ08-812;REAL;2017;105.9;e;;0.0 +D;DG;WZ08-812;REAL;2018;110.1;e;;0.0 +D;DG;WZ08-812;REAL;2019;112.4;e;;0.0 +D;DG;WZ08-812;REAL;2020;110.3;e;;0.0 +D;DG;WZ08-812;REAL;2021;119.0;e;;0.0 +D;DG;WZ08-812;REAL;2022;125.4;e;;0.0 +D;DG;WZ08-812;REAL;2023;126.4;p;;0.0 +D;DG;WZ08-813;NOMINAL;2015;100.0;e;;0.0 +D;DG;WZ08-813;NOMINAL;2016;155.5;e;;0.0 +D;DG;WZ08-813;NOMINAL;2017;165.1;e;;0.0 +D;DG;WZ08-813;NOMINAL;2018;182.0;e;;0.0 +D;DG;WZ08-813;NOMINAL;2019;198.7;e;;0.0 +D;DG;WZ08-813;NOMINAL;2020;214.5;e;;0.0 +D;DG;WZ08-813;NOMINAL;2021;229.3;e;;0.0 +D;DG;WZ08-813;NOMINAL;2022;251.3;e;;0.0 +D;DG;WZ08-813;NOMINAL;2023;259.5;p;;0.0 +D;DG;WZ08-813;REAL;2015;100.0;e;;0.0 +D;DG;WZ08-813;REAL;2016;150.8;e;;0.0 +D;DG;WZ08-813;REAL;2017;155.7;e;;0.0 +D;DG;WZ08-813;REAL;2018;167.0;e;;0.0 +D;DG;WZ08-813;REAL;2019;177.4;e;;0.0 +D;DG;WZ08-813;REAL;2020;188.8;e;;0.0 +D;DG;WZ08-813;REAL;2021;196.9;e;;0.0 +D;DG;WZ08-813;REAL;2022;207.3;e;;0.0 +D;DG;WZ08-813;REAL;2023;197.1;p;;0.0 +D;DG;WZ08-81;NOMINAL;2015;100.0;e;;0.0 +D;DG;WZ08-81;NOMINAL;2016;120.2;e;;0.0 +D;DG;WZ08-81;NOMINAL;2017;124.8;e;;0.0 +D;DG;WZ08-81;NOMINAL;2018;134.2;e;;0.0 +D;DG;WZ08-81;NOMINAL;2019;143.8;e;;0.0 +D;DG;WZ08-81;NOMINAL;2020;146.6;e;;0.0 +D;DG;WZ08-81;NOMINAL;2021;159.4;e;;0.0 +D;DG;WZ08-81;NOMINAL;2022;175.0;e;;0.0 +D;DG;WZ08-81;NOMINAL;2023;186.0;p;;0.0 +D;DG;WZ08-81;REAL;2015;100.0;e;;0.0 +D;DG;WZ08-81;REAL;2016;117.4;e;;0.0 +D;DG;WZ08-81;REAL;2017;119.4;e;;0.0 +D;DG;WZ08-81;REAL;2018;125.2;e;;0.0 +D;DG;WZ08-81;REAL;2019;130.9;e;;0.0 +D;DG;WZ08-81;REAL;2020;131.2;e;;0.0 +D;DG;WZ08-81;REAL;2021;139.0;e;;0.0 +D;DG;WZ08-81;REAL;2022;145.9;e;;0.0 +D;DG;WZ08-81;REAL;2023;143.4;p;;0.0 +D;DG;WZ08-8211;NOMINAL;2015;100.0;e;;0.0 +D;DG;WZ08-8211;NOMINAL;2016;79.7;e;;0.0 +D;DG;WZ08-8211;NOMINAL;2017;88.0;e;;0.0 +D;DG;WZ08-8211;NOMINAL;2018;112.0;e;;0.0 +D;DG;WZ08-8211;NOMINAL;2019;111.7;e;;0.0 +D;DG;WZ08-8211;NOMINAL;2020;102.9;e;;0.0 +D;DG;WZ08-8211;NOMINAL;2021;117.8;e;;0.0 +D;DG;WZ08-8211;NOMINAL;2022;143.5;e;;0.0 +D;DG;WZ08-8211;NOMINAL;2023;189.9;p;;0.0 +D;DG;WZ08-8219;NOMINAL;2015;100.0;e;;0.0 +D;DG;WZ08-8219;NOMINAL;2016;87.0;e;;0.0 +D;DG;WZ08-8219;NOMINAL;2017;81.3;e;;0.0 +D;DG;WZ08-8219;NOMINAL;2018;81.3;e;;0.0 +D;DG;WZ08-8219;NOMINAL;2019;73.4;e;;0.0 +D;DG;WZ08-8219;NOMINAL;2020;71.1;e;;0.0 +D;DG;WZ08-8219;NOMINAL;2021;66.6;e;;0.0 +D;DG;WZ08-8219;NOMINAL;2022;69.3;e;;0.0 +D;DG;WZ08-8219;NOMINAL;2023;68.5;p;;0.0 +D;DG;WZ08-821;NOMINAL;2015;100.0;e;;0.0 +D;DG;WZ08-821;NOMINAL;2016;82.7;e;;0.0 +D;DG;WZ08-821;NOMINAL;2017;85.2;e;;0.0 +D;DG;WZ08-821;NOMINAL;2018;99.4;e;;0.0 +D;DG;WZ08-821;NOMINAL;2019;95.9;e;;0.0 +D;DG;WZ08-821;NOMINAL;2020;89.8;e;;0.0 +D;DG;WZ08-821;NOMINAL;2021;96.7;e;;0.0 +D;DG;WZ08-821;NOMINAL;2022;112.9;e;;0.0 +D;DG;WZ08-821;NOMINAL;2023;139.8;p;;0.0 +D;DG;WZ08-821;REAL;2015;100.0;e;;0.0 +D;DG;WZ08-821;REAL;2016;81.7;e;;0.0 +D;DG;WZ08-821;REAL;2017;82.8;e;;0.0 +D;DG;WZ08-821;REAL;2018;95.2;e;;0.0 +D;DG;WZ08-821;REAL;2019;90.6;e;;0.0 +D;DG;WZ08-821;REAL;2020;84.3;e;;0.0 +D;DG;WZ08-821;REAL;2021;85.6;e;;0.0 +D;DG;WZ08-821;REAL;2022;97.5;e;;0.0 +D;DG;WZ08-821;REAL;2023;116.0;p;;0.0 +D;DG;WZ08-822;NOMINAL;2015;100.0;e;;0.0 +D;DG;WZ08-822;NOMINAL;2016;103.5;e;;0.0 +D;DG;WZ08-822;NOMINAL;2017;121.7;e;;0.0 +D;DG;WZ08-822;NOMINAL;2018;132.7;e;;0.0 +D;DG;WZ08-822;NOMINAL;2019;124.7;e;;0.0 +D;DG;WZ08-822;NOMINAL;2020;131.8;e;;0.0 +D;DG;WZ08-822;NOMINAL;2021;126.4;e;;0.0 +D;DG;WZ08-822;NOMINAL;2022;126.1;e;;0.0 +D;DG;WZ08-822;NOMINAL;2023;132.9;p;;0.0 +D;DG;WZ08-822;REAL;2015;100.0;e;;0.0 +D;DG;WZ08-822;REAL;2016;102.1;e;;0.0 +D;DG;WZ08-822;REAL;2017;118.2;e;;0.0 +D;DG;WZ08-822;REAL;2018;127.2;e;;0.0 +D;DG;WZ08-822;REAL;2019;115.5;e;;0.0 +D;DG;WZ08-822;REAL;2020;118.5;e;;0.0 +D;DG;WZ08-822;REAL;2021;110.9;e;;0.0 +D;DG;WZ08-822;REAL;2022;105.1;e;;0.0 +D;DG;WZ08-822;REAL;2023;106.4;p;;0.0 +D;DG;WZ08-823;NOMINAL;2015;100.0;e;;0.0 +D;DG;WZ08-823;NOMINAL;2016;107.1;e;;0.0 +D;DG;WZ08-823;NOMINAL;2017;110.3;e;;0.0 +D;DG;WZ08-823;NOMINAL;2018;111.5;e;;0.0 +D;DG;WZ08-823;NOMINAL;2019;107.3;e;;0.0 +D;DG;WZ08-823;NOMINAL;2020;50.6;e;;0.0 +D;DG;WZ08-823;NOMINAL;2021;62.9;e;;0.0 +D;DG;WZ08-823;NOMINAL;2022;107.4;e;;0.0 +D;DG;WZ08-823;NOMINAL;2023;119.9;p;;0.0 +D;DG;WZ08-823;REAL;2015;100.0;e;;0.0 +D;DG;WZ08-823;REAL;2016;104.3;e;;0.0 +D;DG;WZ08-823;REAL;2017;104.7;e;;0.0 +D;DG;WZ08-823;REAL;2018;103.6;e;;0.0 +D;DG;WZ08-823;REAL;2019;97.6;e;;0.0 +D;DG;WZ08-823;REAL;2020;44.9;e;;0.0 +D;DG;WZ08-823;REAL;2021;54.3;e;;0.0 +D;DG;WZ08-823;REAL;2022;89.4;e;;0.0 +D;DG;WZ08-823;REAL;2023;95.6;p;;0.0 +D;DG;WZ08-8291;NOMINAL;2015;100.0;e;;0.0 +D;DG;WZ08-8291;NOMINAL;2016;104.7;e;;0.0 +D;DG;WZ08-8291;NOMINAL;2017;114.3;e;;0.0 +D;DG;WZ08-8291;NOMINAL;2018;118.2;e;;0.0 +D;DG;WZ08-8291;NOMINAL;2019;109.5;e;;0.0 +D;DG;WZ08-8291;NOMINAL;2020;106.0;e;;0.0 +D;DG;WZ08-8291;NOMINAL;2021;103.0;e;;0.0 +D;DG;WZ08-8291;NOMINAL;2022;95.9;e;;0.0 +D;DG;WZ08-8291;NOMINAL;2023;100.1;p;;0.0 +D;DG;WZ08-8292;NOMINAL;2015;100.0;e;;0.0 +D;DG;WZ08-8292;NOMINAL;2016;111.4;e;;0.0 +D;DG;WZ08-8292;NOMINAL;2017;113.9;e;;0.0 +D;DG;WZ08-8292;NOMINAL;2018;115.5;e;;0.0 +D;DG;WZ08-8292;NOMINAL;2019;121.4;e;;0.0 +D;DG;WZ08-8292;NOMINAL;2020;143.8;e;;0.0 +D;DG;WZ08-8292;NOMINAL;2021;131.6;e;;0.0 +D;DG;WZ08-8292;NOMINAL;2022;146.1;e;;0.0 +D;DG;WZ08-8292;NOMINAL;2023;139.8;p;;0.0 +D;DG;WZ08-8299;NOMINAL;2015;100.0;e;;0.0 +D;DG;WZ08-8299;NOMINAL;2016;96.2;e;;0.0 +D;DG;WZ08-8299;NOMINAL;2017;96.7;e;;0.0 +D;DG;WZ08-8299;NOMINAL;2018;101.4;e;;0.0 +D;DG;WZ08-8299;NOMINAL;2019;103.0;e;;0.0 +D;DG;WZ08-8299;NOMINAL;2020;98.2;e;;0.0 +D;DG;WZ08-8299;NOMINAL;2021;112.0;e;;0.0 +D;DG;WZ08-8299;NOMINAL;2022;126.8;e;;0.0 +D;DG;WZ08-8299;NOMINAL;2023;141.2;p;;0.0 +D;DG;WZ08-829;NOMINAL;2015;100.0;e;;0.0 +D;DG;WZ08-829;NOMINAL;2016;98.5;e;;0.0 +D;DG;WZ08-829;NOMINAL;2017;100.1;e;;0.0 +D;DG;WZ08-829;NOMINAL;2018;104.4;e;;0.0 +D;DG;WZ08-829;NOMINAL;2019;105.3;e;;0.0 +D;DG;WZ08-829;NOMINAL;2020;103.1;e;;0.0 +D;DG;WZ08-829;NOMINAL;2021;112.8;e;;0.0 +D;DG;WZ08-829;NOMINAL;2022;125.2;e;;0.0 +D;DG;WZ08-829;NOMINAL;2023;136.6;p;;0.0 +D;DG;WZ08-829;REAL;2015;100.0;e;;0.0 +D;DG;WZ08-829;REAL;2016;97.3;e;;0.0 +D;DG;WZ08-829;REAL;2017;97.4;e;;0.0 +D;DG;WZ08-829;REAL;2018;100.1;e;;0.0 +D;DG;WZ08-829;REAL;2019;99.5;e;;0.0 +D;DG;WZ08-829;REAL;2020;96.9;e;;0.0 +D;DG;WZ08-829;REAL;2021;99.9;e;;0.0 +D;DG;WZ08-829;REAL;2022;108.1;e;;0.0 +D;DG;WZ08-829;REAL;2023;113.3;p;;0.0 +D;DG;WZ08-82;NOMINAL;2015;100.0;e;;0.0 +D;DG;WZ08-82;NOMINAL;2016;99.8;e;;0.0 +D;DG;WZ08-82;NOMINAL;2017;103.7;e;;0.0 +D;DG;WZ08-82;NOMINAL;2018;108.7;e;;0.0 +D;DG;WZ08-82;NOMINAL;2019;107.6;e;;0.0 +D;DG;WZ08-82;NOMINAL;2020;98.3;e;;0.0 +D;DG;WZ08-82;NOMINAL;2021;106.5;e;;0.0 +D;DG;WZ08-82;NOMINAL;2022;122.2;e;;0.0 +D;DG;WZ08-82;NOMINAL;2023;133.8;p;;0.0 +D;DG;WZ08-82;REAL;2015;100.0;e;;0.0 +D;DG;WZ08-82;REAL;2016;98.3;e;;0.0 +D;DG;WZ08-82;REAL;2017;100.5;e;;0.0 +D;DG;WZ08-82;REAL;2018;103.7;e;;0.0 +D;DG;WZ08-82;REAL;2019;100.9;e;;0.0 +D;DG;WZ08-82;REAL;2020;91.3;e;;0.0 +D;DG;WZ08-82;REAL;2021;94.0;e;;0.0 +D;DG;WZ08-82;REAL;2022;104.6;e;;0.0 +D;DG;WZ08-82;REAL;2023;110.0;p;;0.0 +D;DG;WZ08-H-02;NOMINAL;2015;100.0;e;;0.0 +D;DG;WZ08-H-02;NOMINAL;2016;105.4;e;;0.0 +D;DG;WZ08-H-02;NOMINAL;2017;108.0;e;;0.0 +D;DG;WZ08-H-02;NOMINAL;2018;111.8;e;;0.0 +D;DG;WZ08-H-02;NOMINAL;2019;114.3;e;;0.0 +D;DG;WZ08-H-02;NOMINAL;2020;107.2;e;;0.0 +D;DG;WZ08-H-02;NOMINAL;2021;121.0;e;;0.0 +D;DG;WZ08-H-02;NOMINAL;2022;137.3;e;;0.0 +D;DG;WZ08-H-02;NOMINAL;2023;140.3;p;;0.0 +D;DG;WZ08-H-02;REAL;2015;100.0;e;;0.0 +D;DG;WZ08-H-02;REAL;2016;105.5;e;;0.0 +D;DG;WZ08-H-02;REAL;2017;106.2;e;;0.0 +D;DG;WZ08-H-02;REAL;2018;108.5;e;;0.0 +D;DG;WZ08-H-02;REAL;2019;109.6;e;;0.0 +D;DG;WZ08-H-02;REAL;2020;101.9;e;;0.0 +D;DG;WZ08-H-02;REAL;2021;108.7;e;;0.0 +D;DG;WZ08-H-02;REAL;2022;117.6;e;;0.0 +D;DG;WZ08-H-02;REAL;2023;120.6;p;;0.0 +D;DG;WZ08-H-04;NOMINAL;2015;100.0;e;;0.0 +D;DG;WZ08-H-04;NOMINAL;2016;105.5;e;;0.0 +D;DG;WZ08-H-04;NOMINAL;2017;107.7;e;;0.0 +D;DG;WZ08-H-04;NOMINAL;2018;111.5;e;;0.0 +D;DG;WZ08-H-04;NOMINAL;2019;114.2;e;;0.0 +D;DG;WZ08-H-04;NOMINAL;2020;102.3;e;;0.0 +D;DG;WZ08-H-04;NOMINAL;2021;115.1;e;;0.0 +D;DG;WZ08-H-04;NOMINAL;2022;131.7;e;;0.0 +D;DG;WZ08-H-04;NOMINAL;2023;134.8;p;;0.0 +D;DG;WZ08-H-04;REAL;2015;100.0;e;;0.0 +D;DG;WZ08-H-04;REAL;2016;105.3;e;;0.0 +D;DG;WZ08-H-04;REAL;2017;105.7;e;;0.0 +D;DG;WZ08-H-04;REAL;2018;107.9;e;;0.0 +D;DG;WZ08-H-04;REAL;2019;109.1;e;;0.0 +D;DG;WZ08-H-04;REAL;2020;96.8;e;;0.0 +D;DG;WZ08-H-04;REAL;2021;103.5;e;;0.0 +D;DG;WZ08-H-04;REAL;2022;113.0;e;;0.0 +D;DG;WZ08-H-04;REAL;2023;115.3;p;;0.0 +D;DG;WZ08-H-05;NOMINAL;2015;100.0;e;;0.0 +D;DG;WZ08-H-05;NOMINAL;2016;105.6;e;;0.0 +D;DG;WZ08-H-05;NOMINAL;2017;107.7;e;;0.0 +D;DG;WZ08-H-05;NOMINAL;2018;111.3;e;;0.0 +D;DG;WZ08-H-05;NOMINAL;2019;113.9;e;;0.0 +D;DG;WZ08-H-05;NOMINAL;2020;103.9;e;;0.0 +D;DG;WZ08-H-05;NOMINAL;2021;117.2;e;;0.0 +D;DG;WZ08-H-05;NOMINAL;2022;132.1;e;;0.0 +D;DG;WZ08-H-05;NOMINAL;2023;134.8;p;;0.0 +D;DG;WZ08-H-05;REAL;2015;100.0;e;;0.0 +D;DG;WZ08-H-05;REAL;2016;105.5;e;;0.0 +D;DG;WZ08-H-05;REAL;2017;105.8;e;;0.0 +D;DG;WZ08-H-05;REAL;2018;107.9;e;;0.0 +D;DG;WZ08-H-05;REAL;2019;109.1;e;;0.0 +D;DG;WZ08-H-05;REAL;2020;98.7;e;;0.0 +D;DG;WZ08-H-05;REAL;2021;105.6;e;;0.0 +D;DG;WZ08-H-05;REAL;2022;113.8;e;;0.0 +D;DG;WZ08-H-05;REAL;2023;116.3;p;;0.0 +D;DG;WZ08-H-06;NOMINAL;2020;82.0;e;;0.0 +D;DG;WZ08-H-06;NOMINAL;2021;91.5;e;;0.0 +D;DG;WZ08-H-06;NOMINAL;2022;120.0;e;;0.0 +D;DG;WZ08-H-06;NOMINAL;2023;129.3;p;;0.0 +D;DG;WZ08-H-06;REAL;2020;78.3;e;;0.0 +D;DG;WZ08-H-06;REAL;2021;84.8;e;;0.0 +D;DG;WZ08-H-06;REAL;2022;105.7;e;;0.0 +D;DG;WZ08-H-06;REAL;2023;111.1;p;;0.0 +D;DG;WZ08-H-07;NOMINAL;2020;107.5;e;;0.0 +D;DG;WZ08-H-07;NOMINAL;2021;121.2;e;;0.0 +D;DG;WZ08-H-07;NOMINAL;2022;134.7;e;;0.0 +D;DG;WZ08-H-07;NOMINAL;2023;136.2;p;;0.0 +D;DG;WZ08-H-07;REAL;2020;101.5;e;;0.0 +D;DG;WZ08-H-07;REAL;2021;108.2;e;;0.0 +D;DG;WZ08-H-07;REAL;2022;114.9;e;;0.0 +D;DG;WZ08-H-07;REAL;2023;116.4;p;;0.0 +D;DG;WZ08-H;NOMINAL;2015;100.0;e;;0.0 +D;DG;WZ08-H;NOMINAL;2016;101.2;e;;0.0 +D;DG;WZ08-H;NOMINAL;2017;108.1;e;;0.0 +D;DG;WZ08-H;NOMINAL;2018;110.7;e;;0.0 +D;DG;WZ08-H;NOMINAL;2019;113.4;e;;0.0 +D;DG;WZ08-H;NOMINAL;2020;102.1;e;;0.0 +D;DG;WZ08-H;NOMINAL;2021;123.1;e;;0.0 +D;DG;WZ08-H;NOMINAL;2022;144.5;e;;0.0 +D;DG;WZ08-H;NOMINAL;2023;135.0;p;;0.0 +D;DG;WZ08-H;REAL;2015;100.0;e;;0.0 +D;DG;WZ08-H;REAL;2016;103.2;e;;0.0 +D;DG;WZ08-H;REAL;2017;106.4;e;;0.0 +D;DG;WZ08-H;REAL;2018;107.6;e;;0.0 +D;DG;WZ08-H;REAL;2019;109.4;e;;0.0 +D;DG;WZ08-H;REAL;2020;97.3;e;;0.0 +D;DG;WZ08-H;REAL;2021;102.6;e;;0.0 +D;DG;WZ08-H;REAL;2022;110.4;e;;0.0 +D;DG;WZ08-H;REAL;2023;114.9;p;;0.0 +D;DG;WZ08-I;NOMINAL;2015;100.0;e;;0.0 +D;DG;WZ08-I;NOMINAL;2016;104.1;e;;0.0 +D;DG;WZ08-I;NOMINAL;2017;108.7;e;;0.0 +D;DG;WZ08-I;NOMINAL;2018;114.2;e;;0.0 +D;DG;WZ08-I;NOMINAL;2019;119.2;e;;0.0 +D;DG;WZ08-I;NOMINAL;2020;75.7;e;;0.0 +D;DG;WZ08-I;NOMINAL;2021;81.3;e;;0.0 +D;DG;WZ08-I;NOMINAL;2022;125.1;e;;0.0 +D;DG;WZ08-I;NOMINAL;2023;135.9;p;;0.0 +D;DG;WZ08-I;REAL;2015;100.0;e;;0.0 +D;DG;WZ08-I;REAL;2016;101.9;e;;0.0 +D;DG;WZ08-I;REAL;2017;104.2;e;;0.0 +D;DG;WZ08-I;REAL;2018;107.2;e;;0.0 +D;DG;WZ08-I;REAL;2019;109.3;e;;0.0 +D;DG;WZ08-I;REAL;2020;66.9;e;;0.0 +D;DG;WZ08-I;REAL;2021;70.1;e;;0.0 +D;DG;WZ08-I;REAL;2022;100.7;e;;0.0 +D;DG;WZ08-I;REAL;2023;100.0;p;;0.0 +D;DG;WZ08-J;NOMINAL;2015;100.0;e;;0.0 +D;DG;WZ08-J;NOMINAL;2016;110.3;e;;0.0 +D;DG;WZ08-J;NOMINAL;2017;106.0;e;;0.0 +D;DG;WZ08-J;NOMINAL;2018;111.4;e;;0.0 +D;DG;WZ08-J;NOMINAL;2019;112.2;e;;0.0 +D;DG;WZ08-J;NOMINAL;2020;111.9;e;;0.0 +D;DG;WZ08-J;NOMINAL;2021;119.3;e;;0.0 +D;DG;WZ08-J;NOMINAL;2022;130.3;e;;0.0 +D;DG;WZ08-J;NOMINAL;2023;137.3;p;;0.0 +D;DG;WZ08-J;REAL;2015;100.0;e;;0.0 +D;DG;WZ08-J;REAL;2016;110.5;e;;0.0 +D;DG;WZ08-J;REAL;2017;106.0;e;;0.0 +D;DG;WZ08-J;REAL;2018;110.7;e;;0.0 +D;DG;WZ08-J;REAL;2019;110.5;e;;0.0 +D;DG;WZ08-J;REAL;2020;109.6;e;;0.0 +D;DG;WZ08-J;REAL;2021;115.5;e;;0.0 +D;DG;WZ08-J;REAL;2022;124.1;e;;0.0 +D;DG;WZ08-J;REAL;2023;127.7;p;;0.0 +D;DG;WZ08-L;NOMINAL;2015;100.0;e;;0.0 +D;DG;WZ08-L;NOMINAL;2016;107.2;e;;0.0 +D;DG;WZ08-L;NOMINAL;2017;105.8;e;;0.0 +D;DG;WZ08-L;NOMINAL;2018;108.4;e;;0.0 +D;DG;WZ08-L;NOMINAL;2019;111.7;e;;0.0 +D;DG;WZ08-L;NOMINAL;2020;82.5;e;;0.0 +D;DG;WZ08-L;NOMINAL;2021;92.3;e;;0.0 +D;DG;WZ08-L;NOMINAL;2022;97.7;e;;0.0 +D;DG;WZ08-L;NOMINAL;2023;97.9;p;;0.0 +D;DG;WZ08-L;REAL;2015;100.0;e;;0.0 +D;DG;WZ08-L;REAL;2016;106.0;e;;0.0 +D;DG;WZ08-L;REAL;2017;103.2;e;;0.0 +D;DG;WZ08-L;REAL;2018;104.2;e;;0.0 +D;DG;WZ08-L;REAL;2019;105.8;e;;0.0 +D;DG;WZ08-L;REAL;2020;77.1;e;;0.0 +D;DG;WZ08-L;REAL;2021;85.1;e;;0.0 +D;DG;WZ08-L;REAL;2022;88.5;e;;0.0 +D;DG;WZ08-L;REAL;2023;87.2;p;;0.0 +D;DG;WZ08-M;NOMINAL;2015;100.0;e;;0.0 +D;DG;WZ08-M;NOMINAL;2016;104.1;e;;0.0 +D;DG;WZ08-M;NOMINAL;2017;106.6;e;;0.0 +D;DG;WZ08-M;NOMINAL;2018;109.3;e;;0.0 +D;DG;WZ08-M;NOMINAL;2019;113.7;e;;0.0 +D;DG;WZ08-M;NOMINAL;2020;113.2;e;;0.0 +D;DG;WZ08-M;NOMINAL;2021;121.0;e;;0.0 +D;DG;WZ08-M;NOMINAL;2022;133.4;e;;0.0 +D;DG;WZ08-M;NOMINAL;2023;140.3;p;;0.0 +D;DG;WZ08-M;REAL;2015;100.0;e;;0.0 +D;DG;WZ08-M;REAL;2016;103.0;e;;0.0 +D;DG;WZ08-M;REAL;2017;104.2;e;;0.0 +D;DG;WZ08-M;REAL;2018;105.2;e;;0.0 +D;DG;WZ08-M;REAL;2019;107.8;e;;0.0 +D;DG;WZ08-M;REAL;2020;106.1;e;;0.0 +D;DG;WZ08-M;REAL;2021;110.0;e;;0.0 +D;DG;WZ08-M;REAL;2022;117.2;e;;0.0 +D;DG;WZ08-M;REAL;2023;118.6;p;;0.0 +D;DG;WZ08-N;NOMINAL;2015;100.0;e;;0.0 +D;DG;WZ08-N;NOMINAL;2016;106.4;e;;0.0 +D;DG;WZ08-N;NOMINAL;2017;112.0;e;;0.0 +D;DG;WZ08-N;NOMINAL;2018;116.6;e;;0.0 +D;DG;WZ08-N;NOMINAL;2019;118.8;e;;0.0 +D;DG;WZ08-N;NOMINAL;2020;101.7;e;;0.0 +D;DG;WZ08-N;NOMINAL;2021;120.1;e;;0.0 +D;DG;WZ08-N;NOMINAL;2022;140.7;e;;0.0 +D;DG;WZ08-N;NOMINAL;2023;152.1;p;;0.0 +D;DG;WZ08-N;REAL;2015;100.0;e;;0.0 +D;DG;WZ08-N;REAL;2016;105.0;e;;0.0 +D;DG;WZ08-N;REAL;2017;108.4;e;;0.0 +D;DG;WZ08-N;REAL;2018;110.6;e;;0.0 +D;DG;WZ08-N;REAL;2019;110.8;e;;0.0 +D;DG;WZ08-N;REAL;2020;94.1;e;;0.0 +D;DG;WZ08-N;REAL;2021;107.2;e;;0.0 +D;DG;WZ08-N;REAL;2022;120.0;e;;0.0 +D;DG;WZ08-N;REAL;2023;122.2;p;;0.0 diff --git a/tests/testthat/find1/api/find/find-c24582.json b/tests/testthat/find1/api/find/find-c24582.json new file mode 100644 index 0000000..45f58c4 --- /dev/null +++ b/tests/testthat/find1/api/find/find-c24582.json @@ -0,0 +1,742 @@ +{ + "Ident": { + "Service": "find", + "Method": "find" + }, + "Status": { + "Code": 0, + "Content": "erfolgreich", + "Type": "Information" + }, + "Parameter": { + "username": "********************", + "password": "********************", + "term": "forst", + "category": "Alle", + "pagelength": "100", + "language": "de" + }, + "Cubes": [ + { + "Code": "12211BJ424", + "Content": "Mikrozensus, Erwerbstätige aus Hauptwohnsitzhaushalten, Deutschland insgesamt, Berufsbereiche (KB2010), 1-Steller, Jahr", + "State": "vollständig mit Werten", + "Time": "2020-2023", + "LatestUpdate": "11.04.2024 15:23:28h", + "Information": "false" + }, + { + "Code": "12211BJ425", + "Content": "Mikrozensus, Erwerbstätige aus Hauptwohnsitzhaushalten, Deutschland insgesamt, Geschlecht, Berufsbereiche (KB2010), 1-Steller, Jahr", + "State": "vollständig mit Werten", + "Time": "2020-2023", + "LatestUpdate": "11.04.2024 15:23:06h", + "Information": "false" + }, + { + "Code": "12211BJ426", + "Content": "Mikrozensus, Erwerbstätige aus Hauptwohnsitzhaushalten, Deutschland insgesamt, Stellung im Beruf, Berufsbereiche (KB2010), 1-Steller, Jahr", + "State": "vollständig mit Werten", + "Time": "2020-2023", + "LatestUpdate": "11.04.2024 15:23:35h", + "Information": "false" + }, + { + "Code": "12211BJ427", + "Content": "Mikrozensus, Erwerbstätige aus Hauptwohnsitzhaushalten, Deutschland insgesamt, Geschlecht, Stellung im Beruf, Berufsbereiche (KB2010), 1-Steller, Jahr", + "State": "vollständig mit Werten", + "Time": "2020-2023", + "LatestUpdate": "11.04.2024 15:23:59h", + "Information": "false" + }, + { + "Code": "21331BS002", + "Content": "Statistik der Gasthörer, Gasthörer, Deutschland insgesamt, Fächergruppen, Semester", + "State": "vollständig mit Werten", + "Time": "WS 1994/95-WS 2023/24", + "LatestUpdate": "05.06.2024 08:00:23h", + "Information": "false" + }, + { + "Code": "21341BJ002", + "Content": "Statistik des Hochschulpersonals, Hauptberufl. wissenschaftl. u. künstler. Personal, Deutschland insgesamt, Geschlecht, Lehr- und Forschungsbereiche, Jahr", + "State": "vollständig mit Werten", + "Time": "1997-2022", + "LatestUpdate": "06.10.2023 08:00:06h", + "Information": "false" + }, + { + "Code": "21341BJ003", + "Content": "Statistik des Hochschulpersonals, Professoren, Deutschland insgesamt, Geschlecht, Fächergruppen, Jahr", + "State": "vollständig mit Werten", + "Time": "1997-2022", + "LatestUpdate": "06.10.2023 08:00:10h", + "Information": "false" + }, + { + "Code": "21351BJ001", + "Content": "Statistik der Habilitationen, Habilitationen, Deutschland insgesamt, Fächergruppen, Geschlecht, Nationalität, Jahr", + "State": "vollständig mit Werten", + "Time": "1992-2023", + "LatestUpdate": "02.07.2024 08:00:09h", + "Information": "false" + }, + { + "Code": "21351BJ003", + "Content": "Statistik der Habilitationen, Durchschnittsalter der habilitierten Personen, Deutschland insgesamt, Fächergruppen, Jahr", + "State": "vollständig mit Werten", + "Time": "1992-2023", + "LatestUpdate": "02.07.2024 08:00:06h", + "Information": "false" + }, + { + "Code": "21351BJ005", + "Content": "Statistik der Habilitationen, Durchschnittsalter der habilitierten Personen, Deutschland insgesamt, Fächergruppen, Geschlecht, Jahr", + "State": "vollständig mit Werten", + "Time": "1992-2023", + "LatestUpdate": "02.07.2024 08:00:03h", + "Information": "false" + }, + { + "Code": "21352BJ011", + "Content": "Statistik der Promovierenden, Promovierende, Deutschland insgesamt, Fächergruppen, Altersgruppen (u24-40m, unbekannt), Stichtag", + "State": "vollständig mit Werten", + "Time": "01.12.2019-01.12.2022", + "LatestUpdate": "17.08.2023 14:04:59h", + "Information": "false" + }, + { + "Code": "21352BJ012", + "Content": "Statistik der Promovierenden, Promovierende, Deutschland insgesamt, Geschlecht, Fächergruppen, Altersgruppen (u24-40m, unbekannt), Stichtag", + "State": "vollständig mit Werten", + "Time": "01.12.2019-01.12.2022", + "LatestUpdate": "17.08.2023 14:04:56h", + "Information": "false" + }, + { + "Code": "21352BJ013", + "Content": "Statistik der Promovierenden, Promovierende, Durchschnittsalter der Promovierenden, Deutschland insgesamt, Fächergruppen, Stichtag", + "State": "vollständig mit Werten", + "Time": "01.12.2019-01.12.2022", + "LatestUpdate": "17.08.2023 14:04:37h", + "Information": "false" + }, + { + "Code": "21352BJ014", + "Content": "Statistik der Promovierenden, Promovierende, Durchschnittsalter der Promovierenden, Deutschland insgesamt, Geschlecht, Fächergruppen, Stichtag", + "State": "vollständig mit Werten", + "Time": "01.12.2019-01.12.2022", + "LatestUpdate": "17.08.2023 14:04:46h", + "Information": "false" + }, + { + "Code": "21352BJ015", + "Content": "Statistik der Promovierenden, Promovierende, Deutschland insgesamt, Nationalität, Fächergruppen, Stichtag", + "State": "vollständig mit Werten", + "Time": "01.12.2019-01.12.2022", + "LatestUpdate": "17.08.2023 14:04:43h", + "Information": "false" + }, + { + "Code": "21352BJ016", + "Content": "Statistik der Promovierenden, Promovierende, Deutschland insgesamt, Geschlecht, Nationalität, Fächergruppen, Stichtag", + "State": "vollständig mit Werten", + "Time": "01.12.2019-01.12.2022", + "LatestUpdate": "17.08.2023 14:05:02h", + "Information": "false" + }, + { + "Code": "21371BJ003", + "Content": "Hochschulfinanzstatistik, Ausgaben der Hochschulen, Deutschland insgesamt, Fächergruppen, Jahr", + "State": "vollständig mit Werten", + "Time": "2006-2022", + "LatestUpdate": "19.03.2024 08:00:47h", + "Information": "false" + }, + { + "Code": "21371BJ004", + "Content": "Hochschulfinanzstatistik, Ausgaben der Hochschulen, Deutschland insgesamt, Hochschulart, Fächergruppen, Jahr", + "State": "vollständig mit Werten", + "Time": "2006-2022", + "LatestUpdate": "19.03.2024 08:00:44h", + "Information": "false" + }, + { + "Code": "21371LJ003", + "Content": "Hochschulfinanzstatistik, Ausgaben der Hochschulen, Bundesländer, Fächergruppen, Jahr", + "State": "vollständig mit Werten", + "Time": "2006-2022", + "LatestUpdate": "19.03.2024 08:00:38h", + "Information": "false" + }, + { + "Code": "21371LJ004", + "Content": "Hochschulfinanzstatistik, Ausgaben der Hochschulen, Bundesländer, Hochschulart, Fächergruppen, Jahr", + "State": "vollständig mit Werten", + "Time": "2006-2022", + "LatestUpdate": "19.03.2024 08:00:54h", + "Information": "false" + }, + { + "Code": "21381BJ102", + "Content": "Hochschulstatistische Kennzahlen, Laufende Ausgaben der Hochschulen je Studierenden, Laufende Ausgaben d. Hochschulen je Wiss. Personal, Laufende Ausgaben der Hochschulen je Professor, Drittmittel der Hochschulen je Wiss. Personal, Drittmittel der Hochschulen je Professor, Deutschland insgesamt, Fächergruppen, Jahr", + "State": "vollständig mit Werten", + "Time": "2011-2021", + "LatestUpdate": "12.10.2023 08:00:03h", + "Information": "false" + }, + { + "Code": "21431BJ009", + "Content": "Förderung nach dem Stipendienprogramm-Gesetz, Stipendiaten, Deutschland insgesamt, Fächergruppen, Jahr", + "State": "vollständig mit Werten", + "Time": "2020-2023", + "LatestUpdate": "07.05.2024 08:01:35h", + "Information": "false" + }, + { + "Code": "21431BJ010", + "Content": "Förderung nach dem Stipendienprogramm-Gesetz, Stipendiaten, Deutschland insgesamt, Geschlecht, Fächergruppen, Jahr", + "State": "vollständig mit Werten", + "Time": "2020-2023", + "LatestUpdate": "07.05.2024 08:03:24h", + "Information": "false" + }, + { + "Code": "21431BJ011", + "Content": "Förderung nach dem Stipendienprogramm-Gesetz, Stipendiaten, Deutschland insgesamt, Nationalität, Fächergruppen, Jahr", + "State": "vollständig mit Werten", + "Time": "2020-2023", + "LatestUpdate": "07.05.2024 08:03:21h", + "Information": "false" + }, + { + "Code": "21431BJ012", + "Content": "Förderung nach dem Stipendienprogramm-Gesetz, Stipendiaten, Deutschland insgesamt, Geschlecht, Nationalität, Fächergruppen, Jahr", + "State": "vollständig mit Werten", + "Time": "2020-2023", + "LatestUpdate": "07.05.2024 08:02:08h", + "Information": "false" + }, + { + "Code": "21811BJ007", + "Content": "Ausgaben, Einnahmen, Personal öff. Forschungseinr., Interne Ausgaben für Forschung und Entwicklung, Personal für FuE (Vollzeitäquivalente), Deutschland insgesamt, Wissenschaftszweige, Jahr", + "State": "vollständig mit Werten", + "Time": "2019-2022", + "LatestUpdate": "08.03.2024 08:00:17h", + "Information": "false" + }, + { + "Code": "21811BJ008", + "Content": "Ausgaben, Einnahmen, Personal öff. Forschungseinr., Interne Ausgaben für Forschung und Entwicklung, Personal für FuE (Vollzeitäquivalente), Deutschland insgesamt, Einrichtungsgruppe, Wissenschaftszweige, Jahr", + "State": "vollständig mit Werten", + "Time": "2019-2022", + "LatestUpdate": "08.03.2024 08:00:14h", + "Information": "false" + }, + { + "Code": "21811BJ009", + "Content": "Ausgaben, Einnahmen, Personal öff. Forschungseinr., Interne Ausgaben für Forschung und Entwicklung, Personal für FuE (Vollzeitäquivalente), Deutschland insgesamt, Einrichtungsart, Wissenschaftszweige, Jahr", + "State": "vollständig mit Werten", + "Time": "2019-2022", + "LatestUpdate": "08.03.2024 08:00:08h", + "Information": "false" + }, + { + "Code": "21811BJ034", + "Content": "Ausgaben, Einnahmen, Personal öff. Forschungseinr., Personal für FuE (Vollzeitäquivalente), Deutschland insgesamt, Wissenschaftszweige, Personalgruppen, Jahr", + "State": "vollständig mit Werten", + "Time": "2019-2022", + "LatestUpdate": "08.03.2024 08:03:17h", + "Information": "false" + }, + { + "Code": "21811LJ003", + "Content": "Ausgaben, Einnahmen, Personal öff. Forschungseinr., Interne Ausgaben für Forschung und Entwicklung, Bundesländer und Ausland, Wissenschaftszweige, Jahr", + "State": "vollständig mit Werten", + "Time": "2019-2022", + "LatestUpdate": "08.03.2024 08:04:10h", + "Information": "false" + }, + { + "Code": "51000BJ160", + "Content": "Außenhandel, Ausfuhr: Gewicht, Ausfuhr: Wert, Ausfuhr: Wert (US-Dollar), Einfuhr: Gewicht, Einfuhr: Wert, Einfuhr: Wert (US-Dollar), Warenverzeichnis Außenhandelsstatistik (6-Steller), Deutschland insgesamt, Jahr", + "State": "vollständig mit Werten", + "Time": "2008-2023", + "LatestUpdate": "17.06.2024 18:09:56h", + "Information": "false" + }, + { + "Code": "51000BJ161", + "Content": "Außenhandel, Ausfuhr: Gewicht, Ausfuhr: Wert, Ausfuhr: Wert (US-Dollar), Einfuhr: Gewicht, Einfuhr: Wert, Einfuhr: Wert (US-Dollar), Warenverzeichnis Außenhandelsstatistik (6-Steller), Deutschland insgesamt, Länderverzeichnis für die Außenhandelsstatistik, Jahr", + "State": "vollständig mit Werten", + "Time": "2008-2023", + "LatestUpdate": "17.06.2024 18:22:32h", + "Information": "false" + }, + { + "Code": "51000BJ180", + "Content": "Außenhandel, Ausfuhr: Besondere Maßeinheit, Ausfuhr: Gewicht, Ausfuhr: Wert, Ausfuhr: Wert (US-Dollar), Einfuhr: Besondere Maßeinheit, Einfuhr: Gewicht, Einfuhr: Wert, Einfuhr: Wert (US-Dollar), Warenverzeichnis Außenhandelsstatistik (8-Steller), Deutschland insgesamt, Jahr", + "State": "vollständig mit Werten", + "Time": "2006-2023", + "LatestUpdate": "17.06.2024 18:09:29h", + "Information": "false" + }, + { + "Code": "51000BJ181", + "Content": "Außenhandel, Ausfuhr: Besondere Maßeinheit, Ausfuhr: Gewicht, Ausfuhr: Wert, Ausfuhr: Wert (US-Dollar), Einfuhr: Besondere Maßeinheit, Einfuhr: Gewicht, Einfuhr: Wert, Einfuhr: Wert (US-Dollar), Warenverzeichnis Außenhandelsstatistik (8-Steller), Deutschland insgesamt, Länderverzeichnis für die Außenhandelsstatistik, Jahr", + "State": "vollständig mit Werten", + "Time": "2006-2023", + "LatestUpdate": "17.06.2024 18:24:36h", + "Information": "false" + }, + { + "Code": "51000BM160", + "Content": "Außenhandel, Ausfuhr: Gewicht, Ausfuhr: Wert, Ausfuhr: Wert (US-Dollar), Einfuhr: Gewicht, Einfuhr: Wert, Einfuhr: Wert (US-Dollar), Warenverzeichnis Außenhandelsstatistik (6-Steller), Deutschland insgesamt, Monate, Jahr", + "State": "vollständig mit Werten", + "Time": "Januar 2008-April 2024", + "LatestUpdate": "17.06.2024 18:31:57h", + "Information": "false" + }, + { + "Code": "51000BM161", + "Content": "Außenhandel, Ausfuhr: Gewicht, Ausfuhr: Wert, Ausfuhr: Wert (US-Dollar), Einfuhr: Gewicht, Einfuhr: Wert, Einfuhr: Wert (US-Dollar), Warenverzeichnis Außenhandelsstatistik (6-Steller), Deutschland insgesamt, Länderverzeichnis für die Außenhandelsstatistik, Monate, Jahr", + "State": "vollständig mit Werten", + "Time": "Januar 2008-April 2024", + "LatestUpdate": "17.06.2024 20:38:26h", + "Information": "false" + }, + { + "Code": "51000BM180", + "Content": "Außenhandel, Ausfuhr: Besondere Maßeinheit, Ausfuhr: Gewicht, Ausfuhr: Wert, Ausfuhr: Wert (US-Dollar), Einfuhr: Besondere Maßeinheit, Einfuhr: Gewicht, Einfuhr: Wert, Einfuhr: Wert (US-Dollar), Warenverzeichnis Außenhandelsstatistik (8-Steller), Deutschland insgesamt, Monate, Jahr", + "State": "vollständig mit Werten", + "Time": "Januar 2006-April 2024", + "LatestUpdate": "17.06.2024 18:34:13h", + "Information": "false" + }, + { + "Code": "51000BM181", + "Content": "Außenhandel, Ausfuhr: Besondere Maßeinheit, Ausfuhr: Gewicht, Ausfuhr: Wert, Ausfuhr: Wert (US-Dollar), Einfuhr: Besondere Maßeinheit, Einfuhr: Gewicht, Einfuhr: Wert, Einfuhr: Wert (US-Dollar), Warenverzeichnis Außenhandelsstatistik (8-Steller), Deutschland insgesamt, Länderverzeichnis für die Außenhandelsstatistik, Monate, Jahr", + "State": "vollständig mit Werten", + "Time": "Januar 2006-April 2024", + "LatestUpdate": "17.06.2024 21:33:17h", + "Information": "false" + }, + { + "Code": "62361BJ009", + "Content": "Verdiensterhebung, Durchschn. Bruttostundenverdienste ohne Sonderz., Durchschn. Bruttomonatsverdienste ohne Sonderz., Mittlere Bruttostundenverdienste ohne Sonderz., Mittlere Bruttomonatsverdienste ohne Sonderz., Deutschland insgesamt, Berufsgruppen (KB2010), 3-Steller, Stichmonat", + "State": "vollständig mit Werten", + "Time": "04/2022-04/2023", + "LatestUpdate": "18.01.2024 08:00:34h", + "Information": "false" + }, + { + "Code": "62361BJ010", + "Content": "Verdiensterhebung, Durchschn. Bruttostundenverdienste ohne Sonderz., Durchschn. Bruttomonatsverdienste ohne Sonderz., Mittlere Bruttostundenverdienste ohne Sonderz., Mittlere Bruttomonatsverdienste ohne Sonderz., Deutschland insgesamt, Berufsgattungen (KB2010), 5-Steller, Stichmonat", + "State": "vollständig mit Werten", + "Time": "04/2022-04/2023", + "LatestUpdate": "18.01.2024 08:01:17h", + "Information": "false" + }, + { + "Code": "62361BJ012", + "Content": "Verdiensterhebung, Durchschn. Bruttostundenverdienste ohne Sonderz., Durchschn. Bruttomonatsverdienste ohne Sonderz., Mittlere Bruttostundenverdienste ohne Sonderz., Mittlere Bruttomonatsverdienste ohne Sonderz., Deutschland insgesamt, Geschlecht, Berufsgruppen (KB2010), 3-Steller, Stichmonat", + "State": "vollständig mit Werten", + "Time": "04/2022-04/2023", + "LatestUpdate": "18.01.2024 08:00:59h", + "Information": "false" + }, + { + "Code": "62361BJ013", + "Content": "Verdiensterhebung, Durchschn. Bruttostundenverdienste ohne Sonderz., Durchschn. Bruttomonatsverdienste ohne Sonderz., Mittlere Bruttostundenverdienste ohne Sonderz., Mittlere Bruttomonatsverdienste ohne Sonderz., Deutschland insgesamt, Geschlecht, Berufsgattungen (KB2010), 5-Steller, Stichmonat", + "State": "vollständig mit Werten", + "Time": "04/2022-04/2023", + "LatestUpdate": "18.01.2024 08:00:53h", + "Information": "false" + }, + { + "Code": "62361BJ015", + "Content": "Verdiensterhebung, Durchschn. Bruttojahresverdienste inkl. Sonderz., Mittlere Bruttojahresverdienste inkl. Sonderz., Deutschland insgesamt, Berufsgruppen (KB2010), 3-Steller, Jahr", + "State": "vollständig mit Werten", + "Time": "2022-2023", + "LatestUpdate": "28.03.2024 08:04:58h", + "Information": "false" + }, + { + "Code": "62361BJ016", + "Content": "Verdiensterhebung, Durchschn. Bruttojahresverdienste inkl. Sonderz., Mittlere Bruttojahresverdienste inkl. Sonderz., Deutschland insgesamt, Berufsgattungen (KB2010), 5-Steller, Jahr", + "State": "vollständig mit Werten", + "Time": "2022-2023", + "LatestUpdate": "28.03.2024 08:04:39h", + "Information": "false" + }, + { + "Code": "62361BJ018", + "Content": "Verdiensterhebung, Durchschn. Bruttojahresverdienste inkl. Sonderz., Mittlere Bruttojahresverdienste inkl. Sonderz., Deutschland insgesamt, Geschlecht, Berufsgruppen (KB2010), 3-Steller, Jahr", + "State": "vollständig mit Werten", + "Time": "2022-2023", + "LatestUpdate": "28.03.2024 08:04:55h", + "Information": "false" + }, + { + "Code": "62361BJ019", + "Content": "Verdiensterhebung, Durchschn. Bruttojahresverdienste inkl. Sonderz., Mittlere Bruttojahresverdienste inkl. Sonderz., Deutschland insgesamt, Geschlecht, Berufsgattungen (KB2010), 5-Steller, Jahr", + "State": "vollständig mit Werten", + "Time": "2022-2023", + "LatestUpdate": "28.03.2024 08:04:51h", + "Information": "false" + }, + { + "Code": "71141BJ006", + "Content": "Rechnungsergebnisse d.öffentlichen Gesamthaushalts, Nettoausgaben, Personalausgaben, Baumaßnahmen, Deutschland insgesamt, Körperschaftsgruppen, Aufgabenbereiche der öffentlichen Haushalte, Jahr", + "State": "vollständig mit Werten", + "Time": "1992-2011", + "LatestUpdate": "26.02.2014 15:37:23h", + "Information": "false" + } + ], + "Statistics": [ + { + "Code": "12211", + "Content": "Mikrozensus", + "Cubes": "487", + "Information": "true" + }, + { + "Code": "21331", + "Content": "Statistik der Gasthörer", + "Cubes": "2", + "Information": "true" + }, + { + "Code": "21341", + "Content": "Statistik des Hochschulpersonals", + "Cubes": "3", + "Information": "true" + }, + { + "Code": "21351", + "Content": "Statistik der Habilitationen", + "Cubes": "6", + "Information": "true" + }, + { + "Code": "21352", + "Content": "Statistik der Promovierenden", + "Cubes": "28", + "Information": "true" + }, + { + "Code": "21371", + "Content": "Hochschulfinanzstatistik", + "Cubes": "8", + "Information": "true" + }, + { + "Code": "21381", + "Content": "Hochschulstatistische Kennzahlen", + "Cubes": "11", + "Information": "false" + }, + { + "Code": "21431", + "Content": "Förderung nach dem Stipendienprogramm-Gesetz", + "Cubes": "37", + "Information": "true" + }, + { + "Code": "21811", + "Content": "Ausgaben, Einnahmen, Personal öff. Forschungseinr.", + "Cubes": "47", + "Information": "true" + }, + { + "Code": "51000", + "Content": "Außenhandel", + "Cubes": "79", + "Information": "true" + }, + { + "Code": "62361", + "Content": "Verdiensterhebung", + "Cubes": "152", + "Information": "true" + }, + { + "Code": "71141", + "Content": "Rechnungsergebnisse d.öffentlichen Gesamthaushalts", + "Cubes": "10", + "Information": "true" + } + ], + "Tables": [ + { + "Code": "12211-0009", + "Content": "Erwerbstätige aus Hauptwohnsitzhaushalten: Deutschland,\nJahre, Geschlecht, Stellung im Beruf, Berufe", + "Time": "" + }, + { + "Code": "21331-0002", + "Content": "Gasthörer: Deutschland, Semester, Fächergruppen", + "Time": "" + }, + { + "Code": "21341-0002", + "Content": "Hauptberufliches wissenschaftliches und künstlerisches\nPersonal an Hochschulen: Deutschland, Jahre, Lehr- und\nForschungsbereiche nach Fächergruppen, Geschlecht", + "Time": "" + }, + { + "Code": "21341-0003", + "Content": "Professoren: Deutschland, Jahre, Fächergruppen, Geschlecht", + "Time": "" + }, + { + "Code": "21351-0001", + "Content": "Habilitationen: Deutschland, Jahre, Fächergruppen,\nNationalität, Geschlecht", + "Time": "" + }, + { + "Code": "21351-0002", + "Content": "Durchschnittsalter der habilitierten Personen: Deutschland,\nJahre, Fächergruppen, Geschlecht", + "Time": "" + }, + { + "Code": "21352-0002", + "Content": "Promovierende: Deutschland, Stichtag, Geschlecht,\nAltersgruppen, Fächergruppen", + "Time": "" + }, + { + "Code": "21352-0003", + "Content": "Promovierende: Deutschland, Stichtag, Nationalität,\nGeschlecht, Fächergruppen und Studienbereiche", + "Time": "" + }, + { + "Code": "21352-0004", + "Content": "Durchschnittsalter der Promovierenden: Deutschland,\nStichtag, Geschlecht, Fächergruppen", + "Time": "" + }, + { + "Code": "21371-0001", + "Content": "Ausgaben der Hochschulen: Deutschland, Jahre, Hochschulart,\nFächergruppen", + "Time": "" + }, + { + "Code": "21371-0002", + "Content": "Ausgaben der Hochschulen: Bundesländer, Jahre, Hochschulart,\nFächergruppen", + "Time": "" + }, + { + "Code": "21381-0005", + "Content": "Laufende Ausgaben der Hochschulen, Drittmittel der\nHochschulen: Deutschland, Jahre, Fächergruppen", + "Time": "" + }, + { + "Code": "21431-0004", + "Content": "Stipendiaten: Deutschland, Jahre, Nationalität, Geschlecht,\nFächergruppen", + "Time": "" + }, + { + "Code": "21811-0003", + "Content": "Interne Ausgaben für Forschung und Entwicklung: Deutschland,\nJahre, Einrichtungsart, Wissenschaftszweige", + "Time": "" + }, + { + "Code": "21811-0005", + "Content": "Personal für Forschung und Entwicklung (Vollzeitäquivalente): Deutschland, Jahre, Einrichtungsart, Wissenschaftszweige", + "Time": "" + }, + { + "Code": "21811-0007", + "Content": "Personal für Forschung und Entwicklung (Vollzeitäquivalente): Deutschland, Jahre, Personalgruppen, Wissenschaftszweige", + "Time": "" + }, + { + "Code": "21811-0022", + "Content": "Interne Ausgaben für Forschung und Entwicklung: Bundesländer\nund Ausland, Jahre, Wissenschaftszweige", + "Time": "" + }, + { + "Code": "51000-0005", + "Content": "Aus- und Einfuhr (Außenhandel): Deutschland, Jahre,\nWarensystematik", + "Time": "" + }, + { + "Code": "51000-0006", + "Content": "Aus- und Einfuhr (Außenhandel): Deutschland, Monate,\nWarensystematik", + "Time": "" + }, + { + "Code": "51000-0009", + "Content": "Aus- und Einfuhr (Außenhandel): Deutschland, Jahre, Land,\nWarenverzeichnis (4-/6-Steller)", + "Time": "" + }, + { + "Code": "51000-0010", + "Content": "Aus- und Einfuhr (Außenhandel): Deutschland, Jahre,\nWare (4-/6-Steller), Länder", + "Time": "" + }, + { + "Code": "51000-0011", + "Content": "Aus- und Einfuhr (Außenhandel): Deutschland, Monate, Land,\nWarenverzeichnis (4-/6-Steller)", + "Time": "" + }, + { + "Code": "51000-0012", + "Content": "Aus- und Einfuhr (Außenhandel): Deutschland, Monate,\nWare (4-/6-Steller), Länder", + "Time": "" + }, + { + "Code": "51000-0013", + "Content": "Aus- und Einfuhr (Außenhandel): Deutschland, Jahre,\nWarenverzeichnis (8-Steller)", + "Time": "" + }, + { + "Code": "51000-0014", + "Content": "Aus- und Einfuhr (Außenhandel): Deutschland, Monate,\nWarenverzeichnis (8-Steller)", + "Time": "" + }, + { + "Code": "51000-0015", + "Content": "Aus- und Einfuhr (Außenhandel): Deutschland, Jahre, Land,\nWarenverzeichnis (8-Steller)", + "Time": "" + }, + { + "Code": "51000-0016", + "Content": "Aus- und Einfuhr (Außenhandel): Deutschland, Jahre,\nWare (8-Steller), Länder", + "Time": "" + }, + { + "Code": "51000-0017", + "Content": "Aus- und Einfuhr (Außenhandel): Deutschland, Monate, Land,\nWarenverzeichnis (8-Steller)", + "Time": "" + }, + { + "Code": "51000-0018", + "Content": "Aus- und Einfuhr (Außenhandel): Deutschland, Monate,\nWare (8-Steller), Länder", + "Time": "" + }, + { + "Code": "62361-0030", + "Content": "Bruttostundenverdienste, Bruttomonatsverdienste: Deutschland, Stichmonat, Geschlecht, Berufe", + "Time": "" + }, + { + "Code": "62361-0034", + "Content": "Bruttojahresverdienste: Deutschland, Jahre, Geschlecht, Berufe", + "Time": "" + }, + { + "Code": "71141-0004", + "Content": "Rechnungsergebnisse des öffentlichen Gesamthaushalts\n(Nettoausgaben, Personalausgaben, Baumaßnahmen):\nDeutschland, Jahre, Körperschaftsgruppen, Aufgabenbereiche", + "Time": "" + } + ], + "Timeseries": null, + "Variables": [ + { + "Code": "AFGBE3", + "Content": "Aufgabenbereiche der öffentlichen Haushalte", + "Type": "sachlich", + "Values": "22", + "Information": "false" + }, + { + "Code": "BERLF1", + "Content": "Lehr- und Forschungsbereiche", + "Type": "sachlich", + "Values": "84", + "Information": "false" + }, + { + "Code": "BILFG1", + "Content": "Fächergruppen", + "Type": "sachlich", + "Values": "10", + "Information": "false" + }, + { + "Code": "BILFG2", + "Content": "Fächergruppen", + "Type": "sachlich", + "Values": "10", + "Information": "false" + }, + { + "Code": "BILFG3", + "Content": "Fächergruppen", + "Type": "sachlich", + "Values": "11", + "Information": "false" + }, + { + "Code": "BILFG4", + "Content": "Fächergruppen", + "Type": "sachlich", + "Values": "9", + "Information": "false" + }, + { + "Code": "BILFG5", + "Content": "Fächergruppen", + "Type": "sachlich", + "Values": "8", + "Information": "false" + }, + { + "Code": "BILFG6", + "Content": "Fächergruppen", + "Type": "sachlich", + "Values": "12", + "Information": "false" + }, + { + "Code": "BILFG7", + "Content": "Fächergruppen", + "Type": "sachlich", + "Values": "9", + "Information": "false" + }, + { + "Code": "KB10A1", + "Content": "Berufsbereiche (KB2010), 1-Steller", + "Type": "sachlich", + "Values": "10", + "Information": "false" + }, + { + "Code": "KB10A3", + "Content": "Berufsgruppen (KB2010), 3-Steller", + "Type": "sachlich", + "Values": "144", + "Information": "true" + }, + { + "Code": "KB10A5", + "Content": "Berufsgattungen (KB2010), 5-Steller", + "Type": "sachlich", + "Values": "1300", + "Information": "true" + }, + { + "Code": "WAM6", + "Content": "Warenverzeichnis Außenhandelsstatistik (6-Steller)", + "Type": "sachlich", + "Values": "6435", + "Information": "true" + }, + { + "Code": "WAM8", + "Content": "Warenverzeichnis Außenhandelsstatistik (8-Steller)", + "Type": "sachlich", + "Values": "14270", + "Information": "true" + }, + { + "Code": "WISZW1", + "Content": "Wissenschaftszweige", + "Type": "sachlich", + "Values": "6", + "Information": "false" + } + ], + "Copyright": "© Statistisches Bundesamt (Destatis), 2024" +} diff --git a/tests/testthat/find2_fake/api/find/find-ef22fd.json b/tests/testthat/find2_fake/api/find/find-ef22fd.json new file mode 100644 index 0000000..0da09bb --- /dev/null +++ b/tests/testthat/find2_fake/api/find/find-ef22fd.json @@ -0,0 +1,580 @@ +{ + "Ident": { + "Service": "find", + "Method": "find" + }, + "Status": { + "Code": 999, + "Content": "test error message", + "Type": "Information" + }, + "Parameter": { + "username": "********************", + "password": "********************", + "term": "bus", + "category": "Alle", + "pagelength": "100", + "language": "de" + }, + "Cubes": [ + { + "Code": "12251B4005", + "Content": "Arbeitsmarktstatistik des Mikrozensus, Erwerbstätige aus Hauptwohnsitzhaushalten, Deutschland insgesamt, Benutztes Verkehrsmittel f.d. Hinweg z. Arbeitsst., Jahr", + "State": "vollständig mit Werten", + "Time": "2020", + "LatestUpdate": "17.11.2022 12:12:42h", + "Information": "false" + }, + { + "Code": "12251B4006", + "Content": "Arbeitsmarktstatistik des Mikrozensus, Erwerbstätige aus Hauptwohnsitzhaushalten, Deutschland insgesamt, Geschlecht, Benutztes Verkehrsmittel f.d. Hinweg z. Arbeitsst., Jahr", + "State": "vollständig mit Werten", + "Time": "2020", + "LatestUpdate": "17.11.2022 12:12:59h", + "Information": "false" + }, + { + "Code": "12251B4007", + "Content": "Arbeitsmarktstatistik des Mikrozensus, Erwerbstätige aus Hauptwohnsitzhaushalten, Deutschland insgesamt, Stellung im Beruf, Benutztes Verkehrsmittel f.d. Hinweg z. Arbeitsst., Jahr", + "State": "vollständig mit Werten", + "Time": "2020", + "LatestUpdate": "17.11.2022 12:13:19h", + "Information": "false" + }, + { + "Code": "12251B4008", + "Content": "Arbeitsmarktstatistik des Mikrozensus, Erwerbstätige aus Hauptwohnsitzhaushalten, Deutschland insgesamt, Geschlecht, Stellung im Beruf, Benutztes Verkehrsmittel f.d. Hinweg z. Arbeitsst., Jahr", + "State": "vollständig mit Werten", + "Time": "2020", + "LatestUpdate": "17.11.2022 12:13:40h", + "Information": "false" + }, + { + "Code": "45413BJ008", + "Content": "Statistik über die touristische Nachfrage, Reisen, Deutschland insgesamt, Verkehrsmittel, Jahr", + "State": "vollständig mit Werten", + "Time": "2012-2023", + "LatestUpdate": "03.07.2024 08:02:18h", + "Information": "false" + }, + { + "Code": "46181BJ001", + "Content": "Personenverkehr mit Bussen und Bahnen, Beförderte Personen, Beförderungsleistung, Deutschland insgesamt, Verkehrsart, Hauptverkehrsverbindung, Jahr", + "State": "vollständig mit Werten", + "Time": "2004-2022", + "LatestUpdate": "29.11.2023 14:33:17h", + "Information": "false" + }, + { + "Code": "46181BJ002", + "Content": "Personenverkehr mit Bussen und Bahnen, Unternehmen, Beförderte Personen, Beförderungsleistung, Fahrleistung, Beförderungsangebot, Deutschland insgesamt, Tätigkeit der Unternehmen im Liniennahverkehr, Jahr", + "State": "vollständig mit Werten", + "Time": "2004-2022", + "LatestUpdate": "29.11.2023 14:33:27h", + "Information": "false" + }, + { + "Code": "46181BJ003", + "Content": "Personenverkehr mit Bussen und Bahnen, Fahrleistung, Beförderungsangebot, Deutschland insgesamt, Verkehrsart, Einsatzgebiet, Jahr", + "State": "vollständig mit Werten", + "Time": "2004-2022", + "LatestUpdate": "29.11.2023 14:33:35h", + "Information": "false" + }, + { + "Code": "46181BV001", + "Content": "Personenverkehr mit Bussen und Bahnen, Unternehmen, Beförderte Personen, Personenkilometer, Deutschland insgesamt, Verkehrsart (Liniennah- und Linienfernverkehr), Quartale, Jahr", + "State": "vollständig mit Werten", + "Time": "1. Quartal 2004-1. Quartal 2024", + "LatestUpdate": "27.06.2024 08:08:11h", + "Information": "false" + }, + { + "Code": "46181L5001", + "Content": "Personenverkehr mit Bussen und Bahnen, Linienlängen im Nahverkehr, Linien im Nahverkehr, Bundesländer, Verkehrsart, Stichtag", + "State": "vollständig mit Werten", + "Time": "31.12.2004-31.12.2019", + "LatestUpdate": "05.08.2022 13:05:31h", + "Information": "false" + }, + { + "Code": "46181L5002", + "Content": "Personenverkehr mit Bussen und Bahnen, Fahrzeuge, Sitzplätze, Stehplätze, Bundesländer, Verkehrsart, Stichtag", + "State": "vollständig mit Werten", + "Time": "31.12.2004-31.12.2019", + "LatestUpdate": "05.08.2022 13:05:28h", + "Information": "false" + }, + { + "Code": "46181L5003", + "Content": "Personenverkehr mit Bussen und Bahnen, Beschäftigte, Bundesländer, Einsatzart, Stichtag", + "State": "vollständig mit Werten", + "Time": "31.12.2004-31.12.2019", + "LatestUpdate": "05.08.2022 13:05:30h", + "Information": "false" + }, + { + "Code": "46181LJ001", + "Content": "Personenverkehr mit Bussen und Bahnen, Unternehmen, Beförderte Personen, Beförderungsleistung, Fahrleistung, Beförderungsangebot, Bundesländer, Verkehrsart, Jahr", + "State": "vollständig mit Werten", + "Time": "2004-2022", + "LatestUpdate": "29.11.2023 14:33:31h", + "Information": "false" + }, + { + "Code": "46181LJ002", + "Content": "Personenverkehr mit Bussen und Bahnen, Unternehmen, Beförderte Personen, Beförderungsleistung, Fahrleistung, Beförderungsangebot, Einnahmen im Liniennahverkehr, Bundesländer, Unternehmensart, Jahr", + "State": "vollständig mit Werten", + "Time": "2004-2022", + "LatestUpdate": "29.11.2023 14:33:24h", + "Information": "false" + }, + { + "Code": "46181LJ003", + "Content": "Personenverkehr mit Bussen und Bahnen, Beförderungsleistung, Beförderungsleistung von großen Unternehmen, Fahrleistung, Fahrleistung von großen Unternehmen, Bundesländer, Verkehrsart, Jahr", + "State": "vollständig mit Werten", + "Time": "2004-2022", + "LatestUpdate": "29.11.2023 14:33:21h", + "Information": "false" + }, + { + "Code": "46181LV001", + "Content": "Personenverkehr mit Bussen und Bahnen, Unternehmen, Beförderte Personen, Personenkilometer, Bundesländer, Verkehrsart (Liniennah- und Linienfernverkehr), Quartale, Jahr", + "State": "vollständig mit Werten", + "Time": "1. Quartal 2004-1. Quartal 2024", + "LatestUpdate": "27.06.2024 08:08:15h", + "Information": "false" + }, + { + "Code": "51000BJ160", + "Content": "Außenhandel, Ausfuhr: Gewicht, Ausfuhr: Wert, Ausfuhr: Wert (US-Dollar), Einfuhr: Gewicht, Einfuhr: Wert, Einfuhr: Wert (US-Dollar), Warenverzeichnis Außenhandelsstatistik (6-Steller), Deutschland insgesamt, Jahr", + "State": "vollständig mit Werten", + "Time": "2008-2023", + "LatestUpdate": "17.06.2024 18:09:56h", + "Information": "false" + }, + { + "Code": "51000BJ161", + "Content": "Außenhandel, Ausfuhr: Gewicht, Ausfuhr: Wert, Ausfuhr: Wert (US-Dollar), Einfuhr: Gewicht, Einfuhr: Wert, Einfuhr: Wert (US-Dollar), Warenverzeichnis Außenhandelsstatistik (6-Steller), Deutschland insgesamt, Länderverzeichnis für die Außenhandelsstatistik, Jahr", + "State": "vollständig mit Werten", + "Time": "2008-2023", + "LatestUpdate": "17.06.2024 18:22:32h", + "Information": "false" + }, + { + "Code": "51000BJ180", + "Content": "Außenhandel, Ausfuhr: Besondere Maßeinheit, Ausfuhr: Gewicht, Ausfuhr: Wert, Ausfuhr: Wert (US-Dollar), Einfuhr: Besondere Maßeinheit, Einfuhr: Gewicht, Einfuhr: Wert, Einfuhr: Wert (US-Dollar), Warenverzeichnis Außenhandelsstatistik (8-Steller), Deutschland insgesamt, Jahr", + "State": "vollständig mit Werten", + "Time": "2006-2023", + "LatestUpdate": "17.06.2024 18:09:29h", + "Information": "false" + }, + { + "Code": "51000BJ181", + "Content": "Außenhandel, Ausfuhr: Besondere Maßeinheit, Ausfuhr: Gewicht, Ausfuhr: Wert, Ausfuhr: Wert (US-Dollar), Einfuhr: Besondere Maßeinheit, Einfuhr: Gewicht, Einfuhr: Wert, Einfuhr: Wert (US-Dollar), Warenverzeichnis Außenhandelsstatistik (8-Steller), Deutschland insgesamt, Länderverzeichnis für die Außenhandelsstatistik, Jahr", + "State": "vollständig mit Werten", + "Time": "2006-2023", + "LatestUpdate": "17.06.2024 18:24:36h", + "Information": "false" + }, + { + "Code": "51000BJ330", + "Content": "Außenhandel, Ausfuhr: Gewicht, Ausfuhr: Wert, Ausfuhr: Wert (US-Dollar), Einfuhr: Gewicht, Einfuhr: Wert, Einfuhr: Wert (US-Dollar), Warengruppen (EGW 2002: 3-Steller), Deutschland insgesamt, Jahr", + "State": "vollständig mit Werten", + "Time": "2008-2023", + "LatestUpdate": "17.06.2024 18:12:08h", + "Information": "false" + }, + { + "Code": "51000BJ331", + "Content": "Außenhandel, Ausfuhr: Gewicht, Ausfuhr: Wert, Ausfuhr: Wert (US-Dollar), Einfuhr: Gewicht, Einfuhr: Wert, Einfuhr: Wert (US-Dollar), Warengruppen (EGW 2002: 3-Steller), Deutschland insgesamt, Länderverzeichnis für die Außenhandelsstatistik, Jahr", + "State": "vollständig mit Werten", + "Time": "2008-2023", + "LatestUpdate": "17.06.2024 18:13:04h", + "Information": "false" + }, + { + "Code": "51000BJ903", + "Content": "Außenhandel, Ausfuhr: Volumen, Einfuhr: Volumen, Warengruppen (EGW 2002: 3-Steller), Deutschland insgesamt, Ländergruppen, Jahr", + "State": "vollständig mit Werten", + "Time": "2008-2023", + "LatestUpdate": "13.02.2024 18:42:27h", + "Information": "false" + }, + { + "Code": "51000BM160", + "Content": "Außenhandel, Ausfuhr: Gewicht, Ausfuhr: Wert, Ausfuhr: Wert (US-Dollar), Einfuhr: Gewicht, Einfuhr: Wert, Einfuhr: Wert (US-Dollar), Warenverzeichnis Außenhandelsstatistik (6-Steller), Deutschland insgesamt, Monate, Jahr", + "State": "vollständig mit Werten", + "Time": "Januar 2008-April 2024", + "LatestUpdate": "17.06.2024 18:31:57h", + "Information": "false" + }, + { + "Code": "51000BM161", + "Content": "Außenhandel, Ausfuhr: Gewicht, Ausfuhr: Wert, Ausfuhr: Wert (US-Dollar), Einfuhr: Gewicht, Einfuhr: Wert, Einfuhr: Wert (US-Dollar), Warenverzeichnis Außenhandelsstatistik (6-Steller), Deutschland insgesamt, Länderverzeichnis für die Außenhandelsstatistik, Monate, Jahr", + "State": "vollständig mit Werten", + "Time": "Januar 2008-April 2024", + "LatestUpdate": "17.06.2024 20:38:26h", + "Information": "false" + }, + { + "Code": "51000BM180", + "Content": "Außenhandel, Ausfuhr: Besondere Maßeinheit, Ausfuhr: Gewicht, Ausfuhr: Wert, Ausfuhr: Wert (US-Dollar), Einfuhr: Besondere Maßeinheit, Einfuhr: Gewicht, Einfuhr: Wert, Einfuhr: Wert (US-Dollar), Warenverzeichnis Außenhandelsstatistik (8-Steller), Deutschland insgesamt, Monate, Jahr", + "State": "vollständig mit Werten", + "Time": "Januar 2006-April 2024", + "LatestUpdate": "17.06.2024 18:34:13h", + "Information": "false" + }, + { + "Code": "51000BM181", + "Content": "Außenhandel, Ausfuhr: Besondere Maßeinheit, Ausfuhr: Gewicht, Ausfuhr: Wert, Ausfuhr: Wert (US-Dollar), Einfuhr: Besondere Maßeinheit, Einfuhr: Gewicht, Einfuhr: Wert, Einfuhr: Wert (US-Dollar), Warenverzeichnis Außenhandelsstatistik (8-Steller), Deutschland insgesamt, Länderverzeichnis für die Außenhandelsstatistik, Monate, Jahr", + "State": "vollständig mit Werten", + "Time": "Januar 2006-April 2024", + "LatestUpdate": "17.06.2024 21:33:17h", + "Information": "false" + }, + { + "Code": "51000BM330", + "Content": "Außenhandel, Ausfuhr: Gewicht, Ausfuhr: Wert, Ausfuhr: Wert (US-Dollar), Einfuhr: Gewicht, Einfuhr: Wert, Einfuhr: Wert (US-Dollar), Warengruppen (EGW 2002: 3-Steller), Deutschland insgesamt, Monate, Jahr", + "State": "vollständig mit Werten", + "Time": "Januar 2001-April 2024", + "LatestUpdate": "17.06.2024 18:42:51h", + "Information": "false" + }, + { + "Code": "51000BM331", + "Content": "Außenhandel, Ausfuhr: Gewicht, Ausfuhr: Wert, Ausfuhr: Wert (US-Dollar), Einfuhr: Gewicht, Einfuhr: Wert, Einfuhr: Wert (US-Dollar), Warengruppen (EGW 2002: 3-Steller), Deutschland insgesamt, Länderverzeichnis für die Außenhandelsstatistik, Monate, Jahr", + "State": "vollständig mit Werten", + "Time": "Januar 2001-April 2024", + "LatestUpdate": "17.06.2024 18:51:36h", + "Information": "false" + }, + { + "Code": "51000BM903", + "Content": "Außenhandel, Ausfuhr: Volumen, Einfuhr: Volumen, Warengruppen (EGW 2002: 3-Steller), Deutschland insgesamt, Ländergruppen, Monate, Jahr", + "State": "vollständig mit Werten", + "Time": "Januar 2008-April 2024", + "LatestUpdate": "17.06.2024 18:00:20h", + "Information": "false" + }, + { + "Code": "51000LJ330", + "Content": "Außenhandel, Ausfuhr: Gewicht, Ausfuhr: Wert, Einfuhr: Gewicht, Einfuhr: Wert, Warengruppen (EGW 2002: 3-Steller), Bundesländer mit Ausland und Restposition, Jahr", + "State": "vollständig mit Werten", + "Time": "2008-2023", + "LatestUpdate": "17.06.2024 18:16:20h", + "Information": "false" + }, + { + "Code": "51000LJ331", + "Content": "Außenhandel, Ausfuhr: Gewicht, Ausfuhr: Wert, Einfuhr: Gewicht, Einfuhr: Wert, Warengruppen (EGW 2002: 3-Steller), Bundesländer mit Ausland und Restposition, Länderverzeichnis für die Außenhandelsstatistik, Jahr", + "State": "vollständig mit Werten", + "Time": "2008-2023", + "LatestUpdate": "17.06.2024 18:29:59h", + "Information": "false" + }, + { + "Code": "51000LM330", + "Content": "Außenhandel, Ausfuhr: Gewicht, Ausfuhr: Wert, Einfuhr: Gewicht, Einfuhr: Wert, Warengruppen (EGW 2002: 3-Steller), Bundesländer mit Ausland und Restposition, Monate, Jahr", + "State": "vollständig mit Werten", + "Time": "Januar 2008-April 2024", + "LatestUpdate": "17.06.2024 18:30:47h", + "Information": "false" + }, + { + "Code": "51000LM331", + "Content": "Außenhandel, Ausfuhr: Gewicht, Ausfuhr: Wert, Einfuhr: Gewicht, Einfuhr: Wert, Warengruppen (EGW 2002: 3-Steller), Bundesländer mit Ausland und Restposition, Länderverzeichnis für die Außenhandelsstatistik, Monate, Jahr", + "State": "vollständig mit Werten", + "Time": "Januar 2008-April 2024", + "LatestUpdate": "17.06.2024 19:37:22h", + "Information": "false" + }, + { + "Code": "62361BJ010", + "Content": "Verdiensterhebung, Durchschn. Bruttostundenverdienste ohne Sonderz., Durchschn. Bruttomonatsverdienste ohne Sonderz., Mittlere Bruttostundenverdienste ohne Sonderz., Mittlere Bruttomonatsverdienste ohne Sonderz., Deutschland insgesamt, Berufsgattungen (KB2010), 5-Steller, Stichmonat", + "State": "vollständig mit Werten", + "Time": "04/2022-04/2023", + "LatestUpdate": "18.01.2024 08:01:17h", + "Information": "false" + }, + { + "Code": "62361BJ013", + "Content": "Verdiensterhebung, Durchschn. Bruttostundenverdienste ohne Sonderz., Durchschn. Bruttomonatsverdienste ohne Sonderz., Mittlere Bruttostundenverdienste ohne Sonderz., Mittlere Bruttomonatsverdienste ohne Sonderz., Deutschland insgesamt, Geschlecht, Berufsgattungen (KB2010), 5-Steller, Stichmonat", + "State": "vollständig mit Werten", + "Time": "04/2022-04/2023", + "LatestUpdate": "18.01.2024 08:00:53h", + "Information": "false" + }, + { + "Code": "62361BJ016", + "Content": "Verdiensterhebung, Durchschn. Bruttojahresverdienste inkl. Sonderz., Mittlere Bruttojahresverdienste inkl. Sonderz., Deutschland insgesamt, Berufsgattungen (KB2010), 5-Steller, Jahr", + "State": "vollständig mit Werten", + "Time": "2022-2023", + "LatestUpdate": "28.03.2024 08:04:39h", + "Information": "false" + }, + { + "Code": "62361BJ019", + "Content": "Verdiensterhebung, Durchschn. Bruttojahresverdienste inkl. Sonderz., Mittlere Bruttojahresverdienste inkl. Sonderz., Deutschland insgesamt, Geschlecht, Berufsgattungen (KB2010), 5-Steller, Jahr", + "State": "vollständig mit Werten", + "Time": "2022-2023", + "LatestUpdate": "28.03.2024 08:04:51h", + "Information": "false" + } + ], + "Statistics": [ + { + "Code": "12251", + "Content": "Arbeitsmarktstatistik des Mikrozensus", + "Cubes": "60", + "Information": "false" + }, + { + "Code": "45413", + "Content": "Statistik über die touristische Nachfrage", + "Cubes": "10", + "Information": "true" + }, + { + "Code": "46181", + "Content": "Personenverkehr mit Bussen und Bahnen", + "Cubes": "11", + "Information": "true" + }, + { + "Code": "51000", + "Content": "Außenhandel", + "Cubes": "79", + "Information": "true" + }, + { + "Code": "62361", + "Content": "Verdiensterhebung", + "Cubes": "152", + "Information": "true" + } + ], + "Tables": [ + { + "Code": "12251-0006", + "Content": "Erwerbstätige aus Hauptwohnsitzhaushalten: Deutschland, Jahre, Geschlecht, Stellung im Beruf, Benutztes Verkehrsmittel für den Hinweg zur Arbeitsstätte", + "Time": "" + }, + { + "Code": "45413-0004", + "Content": "Reisen: Deutschland, Jahre,\nReisedauer/Reisegründe/Unterkünfte/Verkehrsmittel", + "Time": "" + }, + { + "Code": "46181-0001", + "Content": "Beförderte Personen, Beförderungsleistung\n(Personenfernverkehr mit Bussen): Deutschland, Jahre,\nVerkehrsart, Hauptverkehrsverbindung", + "Time": "" + }, + { + "Code": "46181-0002", + "Content": "Fahrleistung, Beförderungsangebot (Personenfernverkehr mit\nBussen): Deutschland, Jahre, Verkehrsart, Einsatzgebiet", + "Time": "" + }, + { + "Code": "46181-0003", + "Content": "Unternehmen, Beförderte Personen, Beförderungsleistung,\nFahrleistung, Beförderungsangebot (Personenverkehr m. Bussen\nu. Bahnen): Deutschland, Jahre, Tätigkeit der Unternehmen", + "Time": "" + }, + { + "Code": "46181-0005", + "Content": "Unternehmen, Beförderte Personen, Personenkilometer\n(Personenverkehr mit Bussen und Bahnen): Deutschland,\nQuartale, Verkehrsart", + "Time": "" + }, + { + "Code": "46181-0010", + "Content": "Unternehmen, Beförderte Personen, Beförderungsleistung,\nFahrleistung, Beförderungsangebot (Personenverkehr mit\nBussen und Bahnen): Bundesländer, Jahre, Verkehrsart", + "Time": "" + }, + { + "Code": "46181-0011", + "Content": "Unternehmen, Beförderte Pers., Beförderungs-, Fahrleistung,\nBeförderungsangebot, Einnahmen (Personenverkehr mit\nBussen und Bahnen): Bundesländer, Jahre, Unternehmensart", + "Time": "" + }, + { + "Code": "46181-0012", + "Content": "Beförderungs-, Fahrleistung (von großen Unternehmen)\n(Personenverkehr mit Bussen und Bahnen): Bundesländer,\nJahre, Verkehrsart", + "Time": "" + }, + { + "Code": "46181-0015", + "Content": "Unternehmen, Beförderte Personen, Personenkilometer\n(Personenverkehr mit Bussen und Bahnen): Bundesländer,\nQuartale, Verkehrsart", + "Time": "" + }, + { + "Code": "46181-0020", + "Content": "Linienlängen, Linien im Nahverkehr (Personenverkehr mit\nBussen und Bahnen): Bundesländer, Stichtag, Verkehrsart", + "Time": "" + }, + { + "Code": "46181-0021", + "Content": "Fahrzeuge, Sitz-, Stehplätze (Personenverkehr mit Bussen und\nBahnen): Bundesländer, Stichtag, Verkehrsart", + "Time": "" + }, + { + "Code": "46181-0022", + "Content": "Beschäftigte (Personenverkehr mit Bussen und Bahnen):\nBundesländer, Stichtag, Einsatzart", + "Time": "" + }, + { + "Code": "51000-0005", + "Content": "Aus- und Einfuhr (Außenhandel): Deutschland, Jahre,\nWarensystematik", + "Time": "" + }, + { + "Code": "51000-0006", + "Content": "Aus- und Einfuhr (Außenhandel): Deutschland, Monate,\nWarensystematik", + "Time": "" + }, + { + "Code": "51000-0007", + "Content": "Aus- und Einfuhr (Außenhandel): Deutschland, Jahre, Länder,\nWarensystematik", + "Time": "" + }, + { + "Code": "51000-0008", + "Content": "Aus- und Einfuhr (Außenhandel): Deutschland, Monate, Länder,\nWarensystematik", + "Time": "" + }, + { + "Code": "51000-0009", + "Content": "Aus- und Einfuhr (Außenhandel): Deutschland, Jahre, Land,\nWarenverzeichnis (4-/6-Steller)", + "Time": "" + }, + { + "Code": "51000-0010", + "Content": "Aus- und Einfuhr (Außenhandel): Deutschland, Jahre,\nWare (4-/6-Steller), Länder", + "Time": "" + }, + { + "Code": "51000-0011", + "Content": "Aus- und Einfuhr (Außenhandel): Deutschland, Monate, Land,\nWarenverzeichnis (4-/6-Steller)", + "Time": "" + }, + { + "Code": "51000-0012", + "Content": "Aus- und Einfuhr (Außenhandel): Deutschland, Monate,\nWare (4-/6-Steller), Länder", + "Time": "" + }, + { + "Code": "51000-0013", + "Content": "Aus- und Einfuhr (Außenhandel): Deutschland, Jahre,\nWarenverzeichnis (8-Steller)", + "Time": "" + }, + { + "Code": "51000-0014", + "Content": "Aus- und Einfuhr (Außenhandel): Deutschland, Monate,\nWarenverzeichnis (8-Steller)", + "Time": "" + }, + { + "Code": "51000-0015", + "Content": "Aus- und Einfuhr (Außenhandel): Deutschland, Jahre, Land,\nWarenverzeichnis (8-Steller)", + "Time": "" + }, + { + "Code": "51000-0016", + "Content": "Aus- und Einfuhr (Außenhandel): Deutschland, Jahre,\nWare (8-Steller), Länder", + "Time": "" + }, + { + "Code": "51000-0017", + "Content": "Aus- und Einfuhr (Außenhandel): Deutschland, Monate, Land,\nWarenverzeichnis (8-Steller)", + "Time": "" + }, + { + "Code": "51000-0018", + "Content": "Aus- und Einfuhr (Außenhandel): Deutschland, Monate,\nWare (8-Steller), Länder", + "Time": "" + }, + { + "Code": "51000-0034", + "Content": "Aus- und Einfuhr (Außenhandel): Bundesländer, Jahre,\nWarensystematik", + "Time": "" + }, + { + "Code": "51000-0035", + "Content": "Aus- und Einfuhr (Außenhandel): Bundesländer, Monate,\nWarensystematik", + "Time": "" + }, + { + "Code": "51000-0036", + "Content": "Aus- und Einfuhr (Außenhandel): Bundesländer, Jahre,\nLänder, Warensystematik", + "Time": "" + }, + { + "Code": "51000-0037", + "Content": "Aus- und Einfuhr (Außenhandel): Bundesländer, Monate,\nLänder, Warensystematik", + "Time": "" + }, + { + "Code": "51000-0050", + "Content": "Ein- u. Ausfuhr (Volumen) (Außenhandel): Deutschland, Jahre,\nLändergruppen, Warengruppen (EGW 2002: 3-Steller)", + "Time": "" + }, + { + "Code": "51000-0051", + "Content": "Ein- u. Ausfuhr (Volumen) (Außenhandel): Deutschland,\nMonate, Ländergruppen, Warengruppen (EGW 2002: 3-Steller)", + "Time": "" + }, + { + "Code": "62361-0030", + "Content": "Bruttostundenverdienste, Bruttomonatsverdienste: Deutschland, Stichmonat, Geschlecht, Berufe", + "Time": "" + }, + { + "Code": "62361-0034", + "Content": "Bruttojahresverdienste: Deutschland, Jahre, Geschlecht, Berufe", + "Time": "" + } + ], + "Timeseries": null, + "Variables": [ + { + "Code": "ARBVK1", + "Content": "Benutztes Verkehrsmittel f.d. Hinweg z. Arbeitsst.", + "Type": "sachlich", + "Values": "10", + "Information": "true" + }, + { + "Code": "EGW3", + "Content": "Warengruppen (EGW 2002: 3-Steller)", + "Type": "sachlich", + "Values": "212", + "Information": "true" + }, + { + "Code": "KB10A5", + "Content": "Berufsgattungen (KB2010), 5-Steller", + "Type": "sachlich", + "Values": "1300", + "Information": "true" + }, + { + "Code": "VERKM1", + "Content": "Verkehrsmittel", + "Type": "sachlich", + "Values": "6", + "Information": "false" + }, + { + "Code": "WAM6", + "Content": "Warenverzeichnis Außenhandelsstatistik (6-Steller)", + "Type": "sachlich", + "Values": "6435", + "Information": "true" + }, + { + "Code": "WAM8", + "Content": "Warenverzeichnis Außenhandelsstatistik (8-Steller)", + "Type": "sachlich", + "Values": "14270", + "Information": "true" + } + ], + "Copyright": "© Statistisches Bundesamt (Destatis), 2024" +} diff --git a/tests/testthat/find3/api/find/find-9961d3.json b/tests/testthat/find3/api/find/find-9961d3.json new file mode 100644 index 0000000..e477ce6 --- /dev/null +++ b/tests/testthat/find3/api/find/find-9961d3.json @@ -0,0 +1,40 @@ +{ + "Ident": { + "Service": "find", + "Method": "find" + }, + "Status": { + "Code": 0, + "Content": "erfolgreich", + "Type": "Information" + }, + "Parameter": { + "username": "********************", + "password": "********************", + "term": "zensus", + "category": "Alle", + "pagelength": "100", + "language": "de" + }, + "Cubes": null, + "Statistics": [ + { + "Code": "12111", + "Content": "Zensus", + "Cubes": "0", + "Information": "true" + } + ], + "Tables": null, + "Timeseries": null, + "Variables": [ + { + "Code": "BEVZ01", + "Content": "Bevölkerung (Zensus)", + "Type": "Wert", + "Values": "-1", + "Information": "false" + } + ], + "Copyright": "© Statistisches Bundesamt (Destatis), 2024" +} diff --git a/tests/testthat/logincheck1/api/helloworld/logincheck-aabf05.R b/tests/testthat/logincheck1/api/helloworld/logincheck-aabf05.R new file mode 100644 index 0000000..c3f7dd6 --- /dev/null +++ b/tests/testthat/logincheck1/api/helloworld/logincheck-aabf05.R @@ -0,0 +1,5 @@ +structure(list(method = "GET", url = "/api/helloworld/logincheck?username=ABCDEF&password=1234abcd&username=ABCDEF&password=1234abcd", + status_code = 200L, headers = structure(list(Date = "Tue, 09 Jul 2024 09:39:46 GMT", + Server = "Apache", `Content-Length` = "79", `Content-Type` = "application/json;charset=UTF-8"), class = "httr2_headers"), + body = charToRaw("{\"Status\":\"Ein Fehler ist aufgetreten\",\"Username\":\"DE5256891X\"}"), + cache = new.env(parent = emptyenv())), class = "httr2_response") diff --git a/tests/testthat/meta1/api/metadata/table-4041ce.json b/tests/testthat/meta1/api/metadata/table-4041ce.json new file mode 100644 index 0000000..a735760 --- /dev/null +++ b/tests/testthat/meta1/api/metadata/table-4041ce.json @@ -0,0 +1,74 @@ +{ + "Ident": { + "Service": "metadata", + "Method": "table" + }, + "Status": { + "Code": 0, + "Content": "erfolgreich", + "Type": "Information" + }, + "Parameter": { + "username": "********************", + "password": "********************", + "name": "11111-0001", + "area": "Alle", + "language": "de" + }, + "Object": { + "Code": "11111-0001", + "Content": "Gebietsfläche: Bundesländer, Stichtag", + "Time": { + "From": "31.12.1995", + "To": "31.12.2022" + }, + "Valid": "false", + "Structure": { + "Head": { + "Code": "11111", + "Content": "Feststellung des Gebietsstands", + "Type": "Statistik", + "Values": null, + "Selected": null, + "Structure": [ + { + "Code": "FLC006", + "Content": "Gebietsfläche", + "Type": "Merkmal", + "Values": null, + "Selected": null, + "Structure": null, + "Updated": "see parent" + } + ], + "Updated": "see parent" + }, + "Columns": [ + { + "Code": "STAG", + "Content": "Stichtag", + "Type": "Merkmal", + "Values": "1", + "Selected": "1", + "Structure": null, + "Updated": "see parent" + } + ], + "Rows": [ + { + "Code": "DLAND", + "Content": "Bundesländer", + "Type": "Merkmal", + "Values": null, + "Selected": null, + "Structure": null, + "Updated": "see parent" + } + ], + "Subtitel": null, + "Subheading": null + }, + "Updated": "28.12.2022 09:24:14h" + }, + "Copyright": "© Statistisches Bundesamt (Destatis), 2024" +} diff --git a/tests/testthat/meta2_fake/api/metadata/cube-844a6b.json b/tests/testthat/meta2_fake/api/metadata/cube-844a6b.json new file mode 100644 index 0000000..acf4d5a --- /dev/null +++ b/tests/testthat/meta2_fake/api/metadata/cube-844a6b.json @@ -0,0 +1,99 @@ +{ + "Ident": { + "Service": "metadata", + "Method": "cube" + }, + "Status": { + "Code": 999, + "Content": "test error message", + "Type": "Information" + }, + "Parameter": { + "username": "********************", + "password": "********************", + "name": "1*", + "area": "Alle", + "language": "de" + }, + "Object": { + "Code": "12631BJ003", + "Content": "Statistik rechtskräftiger Urteile in Ehesachen, Ehescheidungen, Ehedauer, Gemeinsame minderjährige Kinder, Deutschland insgesamt, Jahr", + "State": "undefiniert", + "Timeslices": [ + "1997", + "1998", + "1999", + "2000", + "2001", + "2002", + "2003", + "2004", + "2005", + "2006", + "2007", + "2008", + "2009", + "2010", + "2011", + "2012", + "2013", + "2014", + "2015", + "2016", + "2017", + "2018", + "2019", + "2020", + "2021", + "2022", + "2023" + ], + "Values": "0", + "Statistic": { + "Code": "12631", + "Content": "Statistik rechtskräftiger Urteile in Ehesachen", + "Updated": "10.10.2023 13:47:12h" + }, + "Structure": { + "Axis": [ + { + "Code": "BEVED1", + "Content": "Ehedauer", + "Type": "klassifizierend", + "Updated": "19.02.2019 16:40:34h" + }, + { + "Code": "BEVMK1", + "Content": "Gemeinsame minderjährige Kinder", + "Type": "klassifizierend", + "Updated": "25.01.2016 13:54:27h" + }, + { + "Code": "DINSG", + "Content": "Deutschland insgesamt", + "Type": "klassifizierend", + "Updated": "25.01.2016 13:54:17h" + }, + { + "Code": "JAHR", + "Content": "Jahr", + "Type": "zeitidentifizierend", + "Updated": "28.12.2022 09:37:21h" + } + ], + "Contents": [ + { + "Code": "BEV004", + "Content": "Ehescheidungen", + "Type": "Ganzzahl", + "Unit": "Anzahl", + "Values": "", + "Timeslices": null, + "Updated": "04.08.2016 11:00:13h" + } + ] + }, + "Updated": "27.06.2024 08:06:32h" + }, + "Copyright": "© Statistisches Bundesamt (Destatis), 2024" +} diff --git a/tests/testthat/meta3/api/metadata/table-4041ce.json b/tests/testthat/meta3/api/metadata/table-4041ce.json new file mode 100644 index 0000000..a735760 --- /dev/null +++ b/tests/testthat/meta3/api/metadata/table-4041ce.json @@ -0,0 +1,74 @@ +{ + "Ident": { + "Service": "metadata", + "Method": "table" + }, + "Status": { + "Code": 0, + "Content": "erfolgreich", + "Type": "Information" + }, + "Parameter": { + "username": "********************", + "password": "********************", + "name": "11111-0001", + "area": "Alle", + "language": "de" + }, + "Object": { + "Code": "11111-0001", + "Content": "Gebietsfläche: Bundesländer, Stichtag", + "Time": { + "From": "31.12.1995", + "To": "31.12.2022" + }, + "Valid": "false", + "Structure": { + "Head": { + "Code": "11111", + "Content": "Feststellung des Gebietsstands", + "Type": "Statistik", + "Values": null, + "Selected": null, + "Structure": [ + { + "Code": "FLC006", + "Content": "Gebietsfläche", + "Type": "Merkmal", + "Values": null, + "Selected": null, + "Structure": null, + "Updated": "see parent" + } + ], + "Updated": "see parent" + }, + "Columns": [ + { + "Code": "STAG", + "Content": "Stichtag", + "Type": "Merkmal", + "Values": "1", + "Selected": "1", + "Structure": null, + "Updated": "see parent" + } + ], + "Rows": [ + { + "Code": "DLAND", + "Content": "Bundesländer", + "Type": "Merkmal", + "Values": null, + "Selected": null, + "Structure": null, + "Updated": "see parent" + } + ], + "Subtitel": null, + "Subheading": null + }, + "Updated": "28.12.2022 09:24:14h" + }, + "Copyright": "© Statistisches Bundesamt (Destatis), 2024" +} diff --git a/tests/testthat/modified1/api/catalogue/modifieddata-00f7a4.json b/tests/testthat/modified1/api/catalogue/modifieddata-00f7a4.json new file mode 100644 index 0000000..639831e --- /dev/null +++ b/tests/testthat/modified1/api/catalogue/modifieddata-00f7a4.json @@ -0,0 +1,31 @@ +{ + "Ident": { + "Service": "catalogue", + "Method": "modifieddata" + }, + "Status": { + "Code": 0, + "Content": "erfolgreich", + "Type": "Information" + }, + "Parameter": { + "username": "********************", + "password": "********************", + "selection": "61111", + "type": "Alle", + "date": "01.01.2022", + "pagelength": "100", + "language": "de", + "area": "Alle" + }, + "List": [ + { + "Code": "61111", + "Content": "Verbraucherpreisindex für Deutschland", + "Type": "Aktualisierte Statistiken", + "Date": "12.06.2024", + "Added": "Mai 2024" + } + ], + "Copyright": "© Statistisches Bundesamt (Destatis), 2024" +} diff --git a/tests/testthat/modified2/api/catalogue/modifieddata-febf13.json b/tests/testthat/modified2/api/catalogue/modifieddata-febf13.json new file mode 100644 index 0000000..93b2ada --- /dev/null +++ b/tests/testthat/modified2/api/catalogue/modifieddata-febf13.json @@ -0,0 +1,25 @@ +{ + "Ident": { + "Service": "catalogue", + "Method": "modifieddata" + }, + "Status": { + "Code": 0, + "Content": "erfolgreich", + "Type": "Information" + }, + "Parameter": { + "username": "********************", + "password": "********************", + "selection": "61111", + "type": "Alle", + "date": "09.07.2024", + "pagelength": "100", + "language": "de", + "area": "Alle" + }, + "List": [ + null + ], + "Copyright": "© Statistisches Bundesamt (Destatis), 2024" +} diff --git a/tests/testthat/modified3/api/catalogue/modifieddata-00f7a4.json b/tests/testthat/modified3/api/catalogue/modifieddata-00f7a4.json new file mode 100644 index 0000000..639831e --- /dev/null +++ b/tests/testthat/modified3/api/catalogue/modifieddata-00f7a4.json @@ -0,0 +1,31 @@ +{ + "Ident": { + "Service": "catalogue", + "Method": "modifieddata" + }, + "Status": { + "Code": 0, + "Content": "erfolgreich", + "Type": "Information" + }, + "Parameter": { + "username": "********************", + "password": "********************", + "selection": "61111", + "type": "Alle", + "date": "01.01.2022", + "pagelength": "100", + "language": "de", + "area": "Alle" + }, + "List": [ + { + "Code": "61111", + "Content": "Verbraucherpreisindex für Deutschland", + "Type": "Aktualisierte Statistiken", + "Date": "12.06.2024", + "Added": "Mai 2024" + } + ], + "Copyright": "© Statistisches Bundesamt (Destatis), 2024" +} diff --git a/tests/testthat/modified4_fake/api/catalogue/modifieddata-66ae58.json b/tests/testthat/modified4_fake/api/catalogue/modifieddata-66ae58.json new file mode 100644 index 0000000..300b6b4 --- /dev/null +++ b/tests/testthat/modified4_fake/api/catalogue/modifieddata-66ae58.json @@ -0,0 +1,23 @@ +{ + "Ident": { + "Service": "catalogue", + "Method": "modifieddata" + }, + "Status": { + "Code": 104, + "Content": "Es gibt keine Objekte zum angegebenen Selektionskriterium", + "Type": "Information" + }, + "Parameter": { + "username": "********************", + "password": "********************", + "selection": "61234", + "type": "Alle", + "date": "01.01.2022", + "pagelength": "100", + "language": "de", + "area": "Alle" + }, + "List": null, + "Copyright": "© Statistisches Bundesamt (Destatis), 2024" +} diff --git a/tests/testthat/searchvars1/api/catalogue/variables-fa86e3.json b/tests/testthat/searchvars1/api/catalogue/variables-fa86e3.json new file mode 100644 index 0000000..8e1a30e --- /dev/null +++ b/tests/testthat/searchvars1/api/catalogue/variables-fa86e3.json @@ -0,0 +1,725 @@ +{ + "Ident": { + "Service": "catalogue", + "Method": "variables" + }, + "Status": { + "Code": 0, + "Content": "erfolgreich", + "Type": "Information" + }, + "Parameter": { + "username": "********************", + "password": "********************", + "selection": "", + "area": "Alle", + "searchcriterion": "Code", + "sortcriterion": "Code", + "type": "Alle", + "pagelength": "100", + "language": "de" + }, + "List": [ + { + "Code": "ABF001", + "Content": "Input von Abfallentsorgungsanlagen", + "Type": "Wert", + "Values": "-1", + "Information": "false" + }, + { + "Code": "ABF002", + "Content": "Im eigenen Betrieb erzeugte Abfälle", + "Type": "Wert", + "Values": "-1", + "Information": "false" + }, + { + "Code": "ABF003", + "Content": "Aus dem Inland angelieferter Abfall", + "Type": "Wert", + "Values": "-1", + "Information": "false" + }, + { + "Code": "ABF004", + "Content": "Aus dem Ausland angelieferter Abfall", + "Type": "Wert", + "Values": "-1", + "Information": "false" + }, + { + "Code": "ABF005", + "Content": "Output von Abfallentsorgungsanlagen", + "Type": "Wert", + "Values": "-1", + "Information": "false" + }, + { + "Code": "ABF006", + "Content": "Abfälle zur Beseitigung", + "Type": "Wert", + "Values": "-1", + "Information": "false" + }, + { + "Code": "ABF007", + "Content": "Abfälle zur Verwertung", + "Type": "Wert", + "Values": "-1", + "Information": "false" + }, + { + "Code": "ABF008", + "Content": "Beim Erstempfänger beseitigte Haushaltsabfälle", + "Type": "Wert", + "Values": "-1", + "Information": "false" + }, + { + "Code": "ABF009", + "Content": "Beim Erstempfänger verwertete Haushaltsabfälle", + "Type": "Wert", + "Values": "-1", + "Information": "false" + }, + { + "Code": "ABF010", + "Content": "Abfallerzeuger", + "Type": "Wert", + "Values": "-1", + "Information": "false" + }, + { + "Code": "ABF011", + "Content": "Abfallmengen", + "Type": "Wert", + "Values": "-1", + "Information": "false" + }, + { + "Code": "ABF012", + "Content": "Abfallmengen, von Primärerzeugern erzeugt", + "Type": "Wert", + "Values": "-1", + "Information": "false" + }, + { + "Code": "ABF013", + "Content": "Einsammler", + "Type": "Wert", + "Values": "-1", + "Information": "false" + }, + { + "Code": "ABF014", + "Content": "Erzeugte Abfallmenge", + "Type": "Wert", + "Values": "-1", + "Information": "true" + }, + { + "Code": "ABF015", + "Content": "Abfälle zu vorbereitenden Verfahren", + "Type": "Wert", + "Values": "-1", + "Information": "false" + }, + { + "Code": "ABF016", + "Content": "Abfallaufkommen", + "Type": "Wert", + "Values": "-1", + "Information": "false" + }, + { + "Code": "ABF017", + "Content": "Abfallverwertungsquote", + "Type": "Wert", + "Values": "-1", + "Information": "true" + }, + { + "Code": "ABF018", + "Content": "Abfallrecyclingquote", + "Type": "Wert", + "Values": "-1", + "Information": "true" + }, + { + "Code": "ABFAT1", + "Content": "Abfallarten", + "Type": "sachlich", + "Values": "5", + "Information": "false" + }, + { + "Code": "ABFAT2", + "Content": "Abfallarten", + "Type": "sachlich", + "Values": "14", + "Information": "false" + }, + { + "Code": "ABFAT3", + "Content": "Abfallarten", + "Type": "sachlich", + "Values": "9", + "Information": "false" + }, + { + "Code": "ABFAT4", + "Content": "Abfallarten", + "Type": "sachlich", + "Values": "2", + "Information": "false" + }, + { + "Code": "ABFES1", + "Content": "Art der Abfallentsorgung", + "Type": "sachlich", + "Values": "5", + "Information": "false" + }, + { + "Code": "ABG002", + "Content": "Produktions- und Importabgaben abzgl. Subventionen", + "Type": "Wert", + "Values": "-1", + "Information": "true" + }, + { + "Code": "ABG003", + "Content": "Abgaben auf soz.Leistungen, verbrauchsnahe Steuern", + "Type": "Wert", + "Values": "-1", + "Information": "true" + }, + { + "Code": "ABG004", + "Content": "Abgabe an Sonstige", + "Type": "Wert", + "Values": "-1", + "Information": "false" + }, + { + "Code": "ABG005", + "Content": "Stromabgabe", + "Type": "Wert", + "Values": "-1", + "Information": "false" + }, + { + "Code": "ABG006", + "Content": "Wärmeabgabe", + "Type": "Wert", + "Values": "-1", + "Information": "false" + }, + { + "Code": "ABNAT1", + "Content": "Abnehmer", + "Type": "sachlich", + "Values": "4", + "Information": "false" + }, + { + "Code": "ABNGR1", + "Content": "Abnehmergruppen", + "Type": "sachlich", + "Values": "3", + "Information": "false" + }, + { + "Code": "ABNGR2", + "Content": "Abnehmergruppen", + "Type": "sachlich", + "Values": "3", + "Information": "false" + }, + { + "Code": "ABS002", + "Content": "Abschreibungen", + "Type": "Wert", + "Values": "-1", + "Information": "true" + }, + { + "Code": "ABS008", + "Content": "Abschreibungen (Anteil am BPW)", + "Type": "Wert", + "Values": "-1", + "Information": "true" + }, + { + "Code": "ABS009", + "Content": "Stromabsatz", + "Type": "Wert", + "Values": "-1", + "Information": "false" + }, + { + "Code": "ABS010", + "Content": "Gasabsatz", + "Type": "Wert", + "Values": "-1", + "Information": "false" + }, + { + "Code": "ABS011", + "Content": "Absatz von Bier", + "Type": "Wert", + "Values": "-1", + "Information": "true" + }, + { + "Code": "ABS012", + "Content": "Absatz von Biermischungen", + "Type": "Wert", + "Values": "-1", + "Information": "true" + }, + { + "Code": "ABS013", + "Content": "Versteuerter Bierabsatz", + "Type": "Wert", + "Values": "-1", + "Information": "true" + }, + { + "Code": "ABS014", + "Content": "Steuerfreier Bierabsatz", + "Type": "Wert", + "Values": "-1", + "Information": "true" + }, + { + "Code": "ABS015", + "Content": "Steuerfreier Bierabsatz in EU-Länder", + "Type": "Wert", + "Values": "-1", + "Information": "false" + }, + { + "Code": "ABS016", + "Content": "Steuerfreier Bierabsatz in Drittländer", + "Type": "Wert", + "Values": "-1", + "Information": "false" + }, + { + "Code": "ABS017", + "Content": "Steuerfreier Bierabsatz als Haustrunk", + "Type": "Wert", + "Values": "-1", + "Information": "false" + }, + { + "Code": "ABS019", + "Content": "Absatz von Schaumwein", + "Type": "Wert", + "Values": "-1", + "Information": "false" + }, + { + "Code": "ABS020", + "Content": "Versteuerter Schaumweinabsatz", + "Type": "Wert", + "Values": "-1", + "Information": "false" + }, + { + "Code": "ABS021", + "Content": "Steuerfreier Schaumweinabsatz", + "Type": "Wert", + "Values": "-1", + "Information": "false" + }, + { + "Code": "ABSAT1", + "Content": "Absatzrichtung", + "Type": "sachlich", + "Values": "3", + "Information": "false" + }, + { + "Code": "ABSATZ", + "Content": "Absatzrichtung", + "Type": "sachlich", + "Values": "5", + "Information": "true" + }, + { + "Code": "ABSBQ1", + "Content": "Bereits erworbener Ausbildungsabschluss", + "Type": "sachlich", + "Values": "9", + "Information": "true" + }, + { + "Code": "ABZ002", + "Content": "Abzüge der Arbeitnehmer", + "Type": "Wert", + "Values": "-1", + "Information": "true" + }, + { + "Code": "ADAFW1", + "Content": "Art der Aufwendungen", + "Type": "sachlich", + "Values": "2", + "Information": "false" + }, + { + "Code": "ADAFW2", + "Content": "Art der Aufwendungen", + "Type": "sachlich", + "Values": "5", + "Information": "false" + }, + { + "Code": "ADANS1", + "Content": "Art der Anstellung", + "Type": "sachlich", + "Values": "2", + "Information": "false" + }, + { + "Code": "ADANS2", + "Content": "Art der Anstellung", + "Type": "sachlich", + "Values": "3", + "Information": "false" + }, + { + "Code": "ADANS3", + "Content": "Art der Tätigkeit", + "Type": "sachlich", + "Values": "11", + "Information": "false" + }, + { + "Code": "ADBES1", + "Content": "Art der Bestände", + "Type": "sachlich", + "Values": "4", + "Information": "false" + }, + { + "Code": "ADFAW1", + "Content": "Art des finanziellen Aufwandes", + "Type": "sachlich", + "Values": "2", + "Information": "false" + }, + { + "Code": "ADINV1", + "Content": "Art der Investitionen", + "Type": "sachlich", + "Values": "8", + "Information": "false" + }, + { + "Code": "ADOEL1", + "Content": "Verwandtschaftsverhältnis zu den Adoptiveltern", + "Type": "sachlich", + "Values": "3", + "Information": "false" + }, + { + "Code": "ADP001", + "Content": "Aufgehobene Adoptionen", + "Type": "Wert", + "Values": "-1", + "Information": "false" + }, + { + "Code": "ADP002", + "Content": "Abgebrochene Adoptionspflegen", + "Type": "Wert", + "Values": "-1", + "Information": "false" + }, + { + "Code": "ADP003", + "Content": "Zur Adoption vorgemerkte Kinder und Jugendliche", + "Type": "Wert", + "Values": "-1", + "Information": "false" + }, + { + "Code": "ADP004", + "Content": "Vorgemerkte Adoptionsbewerbungen", + "Type": "Wert", + "Values": "-1", + "Information": "false" + }, + { + "Code": "ADP005", + "Content": "In Adoptionspflege untergebrachte Kinder/Jugendl.", + "Type": "Wert", + "Values": "-1", + "Information": "true" + }, + { + "Code": "ADPAT1", + "Content": "Art der Adoption", + "Type": "sachlich", + "Values": "2", + "Information": "false" + }, + { + "Code": "ADPAW1", + "Content": "Art der Personalaufwendungen", + "Type": "sachlich", + "Values": "3", + "Information": "false" + }, + { + "Code": "ADPAW2", + "Content": "Art der Personalaufwendungen", + "Type": "sachlich", + "Values": "4", + "Information": "false" + }, + { + "Code": "ADSAW1", + "Content": "Art der Sachaufwendungen", + "Type": "sachlich", + "Values": "5", + "Information": "false" + }, + { + "Code": "ADSAW2", + "Content": "Art der Sachaufwendungen", + "Type": "sachlich", + "Values": "10", + "Information": "false" + }, + { + "Code": "ADSAW6", + "Content": "Art der Sachaufwendungen", + "Type": "sachlich", + "Values": "16", + "Information": "false" + }, + { + "Code": "ADSST2", + "Content": "Soziale Stellung des Haupteinkommensbeziehers", + "Type": "sachlich", + "Values": "8", + "Information": "false" + }, + { + "Code": "ADSST3", + "Content": "Soziale Stellung des Haupteinkommensbeziehers", + "Type": "sachlich", + "Values": "4", + "Information": "false" + }, + { + "Code": "ADVTN3", + "Content": "Nutzungsarten (AdV-Nutzungsartenverzeichnis 1991)", + "Type": "sachlich", + "Values": "8", + "Information": "true" + }, + { + "Code": "ADVTN4", + "Content": "Nutzungsarten (AdV-Nutzungsartenverzeichnis 1991)", + "Type": "sachlich", + "Values": "9", + "Information": "true" + }, + { + "Code": "ADVTN5", + "Content": "Nutzungsarten (AdV-Nutzungsartenverzeichnis 1991)", + "Type": "sachlich", + "Values": "5", + "Information": "true" + }, + { + "Code": "ADVTN6", + "Content": "Nutzungsarten", + "Type": "sachlich", + "Values": "4", + "Information": "false" + }, + { + "Code": "ADVTN7", + "Content": "Nutzungsarten (AdV-Nutzungsartenkatalog 2009)", + "Type": "sachlich", + "Values": "32", + "Information": "true" + }, + { + "Code": "AEW006", + "Content": "Erzeuger von primär nachgewiesenen Abfallmengen", + "Type": "Wert", + "Values": "-1", + "Information": "true" + }, + { + "Code": "AEW007", + "Content": "Abgegebene Abfallmenge an Entsorger", + "Type": "Wert", + "Values": "-1", + "Information": "false" + }, + { + "Code": "AFGBE1", + "Content": "Aufgabenbereiche", + "Type": "sachlich", + "Values": "14", + "Information": "false" + }, + { + "Code": "AFGBE2", + "Content": "Aufgabenbereiche", + "Type": "sachlich", + "Values": "11", + "Information": "false" + }, + { + "Code": "AFGBE3", + "Content": "Aufgabenbereiche der öffentlichen Haushalte", + "Type": "sachlich", + "Values": "22", + "Information": "false" + }, + { + "Code": "AFGBE4", + "Content": "Aufgabenbereiche der öffentlichen Haushalte", + "Type": "sachlich", + "Values": "6", + "Information": "false" + }, + { + "Code": "AFGBE5", + "Content": "Aufgabenbereiche des Trägers", + "Type": "sachlich", + "Values": "4", + "Information": "false" + }, + { + "Code": "AFHMN1", + "Content": "Aufenthalt vor der Maßnahme", + "Type": "sachlich", + "Values": "12", + "Information": "false" + }, + { + "Code": "AFTAT1", + "Content": "Auftragsart", + "Type": "sachlich", + "Values": "5", + "Information": "false" + }, + { + "Code": "AFTAT2", + "Content": "Auftragsart", + "Type": "sachlich", + "Values": "3", + "Information": "false" + }, + { + "Code": "AFTAT3", + "Content": "Auftragsart", + "Type": "sachlich", + "Values": "3", + "Information": "false" + }, + { + "Code": "AGEBN1", + "Content": "Auftraggeberebene", + "Type": "sachlich", + "Values": "4", + "Information": "false" + }, + { + "Code": "AGEBN2", + "Content": "Auftraggeberebene", + "Type": "sachlich", + "Values": "2", + "Information": "false" + }, + { + "Code": "AGL001", + "Content": "Relative Armutsgefährdungslücke (60%-Median)", + "Type": "Wert", + "Values": "-1", + "Information": "true" + }, + { + "Code": "AGQ001", + "Content": "Armutsgefährdungsquote", + "Type": "Wert", + "Values": "-1", + "Information": "true" + }, + { + "Code": "AGQ002", + "Content": "Armutsgefährdungsquote von Personen ab 16 Jahren", + "Type": "Wert", + "Values": "-1", + "Information": "true" + }, + { + "Code": "AGQ003", + "Content": "Armutsgefährdungsquote v.erwerbstät. Pers.ab 16 J.", + "Type": "Wert", + "Values": "-1", + "Information": "true" + }, + { + "Code": "AGQ004", + "Content": "Armutsgefährdungsquote v.erwerbstät. Pers.ab 18 J.", + "Type": "Wert", + "Values": "-1", + "Information": "true" + }, + { + "Code": "AGS001", + "Content": "Armutsgefährdungsschwelle (60%-Median)", + "Type": "Wert", + "Values": "-1", + "Information": "true" + }, + { + "Code": "AKEA01", + "Content": "Arbeitskostenarten", + "Type": "sachlich", + "Values": "52", + "Information": "true" + }, + { + "Code": "AKG001", + "Content": "Wägung Index der Arbeitskosten je geleistete Std.", + "Type": "Wert", + "Values": "-1", + "Information": "true" + }, + { + "Code": "AKG002", + "Content": "Wägung Index d.Bruttoverdienste je geleistete Std.", + "Type": "Wert", + "Values": "-1", + "Information": "true" + }, + { + "Code": "AKG003", + "Content": "Wägung Index d. Lohnnebenkosten je geleistete Std.", + "Type": "Wert", + "Values": "-1", + "Information": "true" + }, + { + "Code": "AKI001", + "Content": "Index der Arbeitskosten je geleistete Stunde", + "Type": "Wert", + "Values": "-1", + "Information": "true" + } + ], + "Copyright": "© Statistisches Bundesamt (Destatis), 2024" +} diff --git a/tests/testthat/searchvars2/api/catalogue/variables-05bbfd.json b/tests/testthat/searchvars2/api/catalogue/variables-05bbfd.json new file mode 100644 index 0000000..c7f5aef --- /dev/null +++ b/tests/testthat/searchvars2/api/catalogue/variables-05bbfd.json @@ -0,0 +1,24 @@ +{ + "Ident": { + "Service": "catalogue", + "Method": "variables" + }, + "Status": { + "Code": 104, + "Content": "There are no objects matching your selection.", + "Type": "Information" + }, + "Parameter": { + "username": "********************", + "password": "********************", + "selection": "74111", + "area": "all", + "searchcriterion": "code", + "sortcriterion": "code", + "type": "all", + "pagelength": "100", + "language": "en" + }, + "List": null, + "Copyright": "© Federal Statistical Office, Wiesbaden 2024" +} diff --git a/tests/testthat/table1/api/data/tablefile-768a25.csv b/tests/testthat/table1/api/data/tablefile-768a25.csv new file mode 100644 index 0000000..814dab5 --- /dev/null +++ b/tests/testthat/table1/api/data/tablefile-768a25.csv @@ -0,0 +1,6 @@ +statistics_code;statistics_label;time_code;time_label;time;1_variable_code;1_variable_label;1_variable_code;1_variable_code;PREIS1__Consumer_price_index__2020=100;PREIS1__CH0004 +61111;Consumer price index for Germany;JAHR;Year;2019;DINSG;Germany;DG;Germany;99.5;+1.4 +61111;Consumer price index for Germany;JAHR;Year;2020;DINSG;Germany;DG;Germany;100.0;+0.5 +61111;Consumer price index for Germany;JAHR;Year;2021;DINSG;Germany;DG;Germany;103.1;+3.1 +61111;Consumer price index for Germany;JAHR;Year;2022;DINSG;Germany;DG;Germany;110.2;+6.9 +61111;Consumer price index for Germany;JAHR;Year;2023;DINSG;Germany;DG;Germany;116.7;+5.9 diff --git a/tests/testthat/terms1/api/catalogue/terms-6ad002.json b/tests/testthat/terms1/api/catalogue/terms-6ad002.json new file mode 100644 index 0000000..33c113a --- /dev/null +++ b/tests/testthat/terms1/api/catalogue/terms-6ad002.json @@ -0,0 +1,148 @@ +{ + "Ident": { + "Service": "catalogue", + "Method": "terms" + }, + "Status": { + "Code": 0, + "Content": "erfolgreich", + "Type": "Information" + }, + "Parameter": { + "username": "********************", + "password": "********************", + "selection": "forst*", + "pagelength": "100", + "language": "de", + "area": "Alle" + }, + "List": [ + { + "Content": "forst" + }, + { + "Content": "forst- und jagdwirtschaft, landschaftspflege" + }, + { + "Content": "forstbaumschulen" + }, + { + "Content": "forstbetriebe" + }, + { + "Content": "forsteinheiten" + }, + { + "Content": "forsten" + }, + { + "Content": "forstgehölze" + }, + { + "Content": "forstgehölze st" + }, + { + "Content": "forstgehölzpflanzen" + }, + { + "Content": "forstl" + }, + { + "Content": "forstmaschinen" + }, + { + "Content": "forstpflanzen" + }, + { + "Content": "forstsamen" + }, + { + "Content": "forstschlepper" + }, + { + "Content": "forstw" + }, + { + "Content": "forstw.fahrzeuge" + }, + { + "Content": "forstwirt" + }, + { + "Content": "forstwirte" + }, + { + "Content": "forstwirtsch" + }, + { + "Content": "forstwirtschaft" + }, + { + "Content": "forstwirtschaft - experte" + }, + { + "Content": "forstwirtschaft - fachkraft" + }, + { + "Content": "forstwirtschaft - helfer" + }, + { + "Content": "forstwirtschaft - spezialist" + }, + { + "Content": "forstwirtschaft und holzeinschlag" + }, + { + "Content": "forstwirtschaftl" + }, + { + "Content": "forstwirtschaftl. erzeugnisse und dienstleistungen" + }, + { + "Content": "forstwirtschaftl.maschinen" + }, + { + "Content": "forstwirtschaftliche" + }, + { + "Content": "forstwirtschaftliche erzeugnisse" + }, + { + "Content": "forstwirtschaftlichen" + }, + { + "Content": "forstwirtschaftlicher" + }, + { + "Content": "forstwirtschaftsabfälle" + }, + { + "Content": "forstwirtschaftsberufe" + }, + { + "Content": "forstwirtschaftserzeugnisse" + }, + { + "Content": "forstwirtschaftsfahrzeuge" + }, + { + "Content": "forstwirtschaftsmaschinen" + }, + { + "Content": "forstwirtschaftsmaschinenteile" + }, + { + "Content": "forstwissenschaft" + }, + { + "Content": "forstwissenschaft, -wirtschaft" + }, + { + "Content": "forstwissenschaft, holzwirtschaft" + }, + { + "Content": "forstwissenschaften" + } + ], + "Copyright": "© Statistisches Bundesamt (Destatis), 2024" +} diff --git a/tests/testthat/test_gen_alternative_terms.R b/tests/testthat/test_gen_alternative_terms.R index c4b5311..14f94ed 100644 --- a/tests/testthat/test_gen_alternative_terms.R +++ b/tests/testthat/test_gen_alternative_terms.R @@ -8,7 +8,7 @@ with_mock_dir("terms1", { skip_on_cran() skip_on_ci() - result <- restatis::gen_alternative_terms("forst*", TRUE) + result <- gen_alternative_terms("forst*", TRUE, database = "genesis") expect_type(result, type = "list") @@ -28,25 +28,25 @@ with_mock_dir("terms1", { test_that("search term errors on multiple codes", { expect_error( - restatis::gen_alternative_terms(term = c("611*", "711*")), + gen_alternative_terms(term = c("611*", "711*"), database = "genesis"), regexp = "Parameter 'term' must be a single string.") }) test_that("search term errors on too long search term", { expect_error( - restatis::gen_alternative_terms(term = "dies das ananas!"), + gen_alternative_terms(term = "dies das ananas!", database = "genesis"), regexp = "Parameter 'term' cannot consist of more than 15 characters.") }) test_that("search term errors on wrong parameter type", { expect_error( - restatis::gen_alternative_terms(term = "Krankenhaus", similarity = 1), + gen_alternative_terms(term = "Krankenhaus", similarity = 1, database = "genesis"), regexp = "Parameter 'similarity' has to be of type 'logical'.") }) test_that("search term errors on wrong parameter type", { expect_error( - restatis::gen_alternative_terms(term = 1992, similarity = TRUE), + gen_alternative_terms(term = 1992, similarity = TRUE, database = "genesis"), regexp = "Parameter 'term' has to be of type 'character'.") }) diff --git a/tests/testthat/test_gen_catalogue.R b/tests/testthat/test_gen_catalogue.R index 680866f..49e1579 100644 --- a/tests/testthat/test_gen_catalogue.R +++ b/tests/testthat/test_gen_catalogue.R @@ -8,13 +8,17 @@ with_mock_dir("catalogue1", { skip_on_cran() skip_on_ci() - result <- restatis::gen_catalogue(code = "611*", - detailed = TRUE, - category = "tables", - error.ignore = FALSE) + result <- gen_catalogue(code = "611*", + detailed = TRUE, + category = "tables", + error.ignore = FALSE, + database = "genesis", + language = "en") expect_type(result, type = "list") + }) + }) #------------------------------------------------------------------------------- @@ -26,12 +30,15 @@ with_mock_dir("catalogue2", { skip_on_ci() expect_type( - restatis::gen_catalogue(code = "41141", - detailed = FALSE, - category = "statistics", - error.ignore = FALSE), + gen_catalogue(code = "41141", + detailed = FALSE, + category = "statistics", + error.ignore = FALSE, + database = "genesis"), type = "list") + }) + }) #------------------------------------------------------------------------------- @@ -43,10 +50,11 @@ with_mock_dir("catalogue3", { skip_on_ci() expect_error( - restatis::gen_catalogue(code = "41141", - detailed = FALSE, - category = "cubes", - error.ignore = FALSE), + gen_catalogue(code = "41141", + detailed = FALSE, + category = "cubes", + error.ignore = FALSE, + database = "genesis"), regexp = "No object found for your request") }) }) @@ -59,13 +67,15 @@ with_mock_dir("catalogue4", { skip_on_cran() skip_on_ci() - res <- restatis::gen_catalogue(code = "611*", - detailed = FALSE, - error.ignore = TRUE) + res <- gen_catalogue(code = "611*", + detailed = FALSE, + error.ignore = TRUE, + database = "genesis") expect_equal(length(res), 3) }) + }) with_mock_dir("catalogue5", { @@ -75,7 +85,11 @@ with_mock_dir("catalogue5", { skip_on_ci() expect_message( - restatis::gen_catalogue(code = "711*", detailed = TRUE, category = "tables", error.ignore = TRUE), + gen_catalogue(code = "711*", + detailed = TRUE, + category = "tables", + error.ignore = TRUE, + database = "genesis"), regexp = "Use 'error.ignore = FALSE' to stop the function at the point where no object could be found.") }) }) @@ -86,13 +100,19 @@ with_mock_dir("catalogue5", { test_that("gen_catalogue function errors on multiple codes", { expect_error( - restatis::gen_catalogue(code = c("611*", "711*"), detailed = TRUE, category = "tables"), + gen_catalogue(code = c("611*", "711*"), + detailed = TRUE, + category = "tables", + database = "genesis"), regexp = "Parameter 'code' must be a single string.") }) test_that("gen_catalogue function errors on numeric code param", { expect_error( - restatis::gen_catalogue(code = 12345, detailed = TRUE, category = "tables"), + gen_catalogue(code = 12345, + detailed = TRUE, + category = "tables", + database = "genesis"), regexp = "Parameter 'code' has to be of type 'character'.") }) @@ -100,14 +120,19 @@ test_that("gen_catalogue function errors on numeric code param", { test_that("gen_catalogue function errors on wrong categories", { expect_error( - restatis::gen_catalogue(code = "611*", detailed = TRUE, category = "variables"), - regexp = "Available categories are tables, statistics, and cubes.") + gen_catalogue(code = "611*", + detailed = TRUE, + category = "variables", + database = "genesis"), + regexp = "Available categories are 'tables', 'statistics', and 'cubes'.") }) test_that("gen_catalogue function errors on too many categories", { expect_error( - restatis::gen_catalogue(code = "611*", detailed = TRUE, - category = c("variables", "statistics", "tables", "cubes")), + gen_catalogue(code = "611*", + detailed = TRUE, + category = c("variables", "statistics", "tables", "cubes"), + database = "genesis"), regexp = "Parameter 'category' has to have a length of 1 to 3.") }) @@ -115,7 +140,10 @@ test_that("gen_catalogue function errors on too many categories", { test_that("gen_catalogue function errors on numeric detailed param", { expect_error( - restatis::gen_catalogue(code = "711*", detailed = 1, category = "tables"), + gen_catalogue(code = "711*", + detailed = 1, + category = "tables", + database = "genesis"), regexp = "Parameter 'detailed' has to be of type 'logical' and of length 1.") }) @@ -126,24 +154,23 @@ with_mock_dir("catalogue6", { skip_on_ci() expect_message( - restatis::gen_catalogue(code = "711*", detailed = FALSE, category = "tables"), + gen_catalogue(code = "711*", + detailed = FALSE, + category = "tables", + database = "genesis"), regexp = "Use 'detailed = TRUE' to obtain the complete output.") }) }) #------------------------------------------------------------------------------- -# test_that("gen_catalogue function errors on numeric sortcriterion param", { -# expect_error( -# restatis::gen_catalogue(code = "711*", detailed = TRUE, category = "tables", sortcriterion = c(1, 2)), -# regexp = "Parameter 'sortcriterion' has to be of type 'character'") -# }) - -#------------------------------------------------------------------------------- - test_that("gen_catalogue function errors on wrong error.ignore param", { expect_error( - restatis::gen_catalogue(code = "711*", detailed = TRUE, category = "tables", error.ignore = 1), + gen_catalogue(code = "711*", + detailed = TRUE, + category = "tables", + error.ignore = 1, + database = "genesis"), regexp = "Parameter 'error.ignore' has to be of type 'logical' and of length 1.") }) diff --git a/tests/testthat/test_gen_cube.R b/tests/testthat/test_gen_cube.R index 7d47c92..1704a53 100644 --- a/tests/testthat/test_gen_cube.R +++ b/tests/testthat/test_gen_cube.R @@ -20,6 +20,7 @@ with_mock_dir("cube1", { expect_true("spec" %in% names(attrs)) }) + }) #------------------------------------------------------------------------------- diff --git a/tests/testthat/test_gen_find.R b/tests/testthat/test_gen_find.R index ad07d9f..bfe9c5f 100644 --- a/tests/testthat/test_gen_find.R +++ b/tests/testthat/test_gen_find.R @@ -8,10 +8,11 @@ with_mock_dir("find1", { skip_on_cran() skip_on_ci() - result <- restatis::gen_find(term = "forst", - detailed = TRUE, - ordering = TRUE, - error.ignore = FALSE) + result <- gen_find(term = "forst", + detailed = TRUE, + ordering = TRUE, + error.ignore = FALSE, + database = "genesis") expect_type(result, type = "list") @@ -27,13 +28,17 @@ with_mock_dir("find1", { #------------------------------------------------------------------------------- with_mock_dir("find2_fake", { - test_that("gen_find errors if there is an error code", { + test_that("gen_find errors if there is an error code (fake response)", { + + # Here, the mockfile needs to be altered: + # The Status$Code needs, e.g., 999 + # The Status$Content needs to be "test error message" skip_on_cran() skip_on_ci() expect_error( - restatis::gen_find(term = "bus", error.ignore = TRUE), + gen_find(term = "bus", error.ignore = TRUE, database = "genesis"), regexp = "test error message") }) }) @@ -47,9 +52,11 @@ with_mock_dir("find3", { skip_on_ci() expect_message( - restatis::gen_find(term = "zensus", error.ignore = TRUE), + gen_find(term = "zensus", error.ignore = TRUE, database = "genesis"), regexp = "Use 'detailed = TRUE' to obtain the complete output.") + }) + }) #------------------------------------------------------------------------------- @@ -58,30 +65,30 @@ with_mock_dir("find3", { test_that("gen_find function errors on numeric term param", { expect_error( - restatis::gen_find(term = 12345, detailed = TRUE, category = "tables"), + gen_find(term = 12345, detailed = TRUE, category = "tables", database = "genesis"), regexp = "Parameter 'term' has to be of type 'character'.") }) test_that("gen_find function errors on wrong category", { expect_error( - restatis::gen_find(term = "bus", detailed = TRUE, category = "table"), - regexp = "Available categories are all, tables, statistics, variables, and cubes.") + gen_find(term = "bus", detailed = TRUE, category = "table", database = "genesis"), + regexp = "Available categories for parameter 'category' for 'genesis' database are 'all', 'tables', 'statistics', 'variables', and 'cubes'.") }) test_that("gen_find function errors on wrong detailed param", { expect_error( - restatis::gen_find(term = "bus", detailed = 1, category = "tables"), + gen_find(term = "bus", detailed = 1, category = "tables", database = "genesis"), regexp = "Parameter 'detailed' has to be of type 'logical' and of length 1.") }) test_that("gen_find function errors on wrong ordering param", { expect_error( - restatis::gen_find(term = "bus", ordering = 1, category = "tables"), + gen_find(term = "bus", ordering = 1, category = "tables", database = "genesis"), regexp = "Parameter 'ordering' has to be of type 'logical' and of length 1.") }) test_that("gen_find function errors on wrong error.ignore param", { expect_error( - restatis::gen_find(term = "bus", error.ignore = 1, category = "tables"), + gen_find(term = "bus", error.ignore = 1, category = "tables", database = "genesis"), regexp = "Parameter 'error.ignore' has to be of type 'logical' and of length 1.") }) diff --git a/tests/testthat/test_gen_logincheck.R b/tests/testthat/test_gen_logincheck.R index c5332f0..a3a1d3c 100644 --- a/tests/testthat/test_gen_logincheck.R +++ b/tests/testthat/test_gen_logincheck.R @@ -4,7 +4,11 @@ with_mock_dir("logincheck1", { - test_that("gen_logincheck errors when the login failed", { + test_that("gen_logincheck errors when the login failed (fake response)", { + + # The mockfile needs to be altered with respect to the body/content + # It needs to include the string "Ein Fehler ist aufgetreten" + # So that the below error message is displayed skip_on_cran() skip_on_ci() diff --git a/tests/testthat/test_gen_meta_data.R b/tests/testthat/test_gen_meta_data.R index 7007e29..d93636d 100644 --- a/tests/testthat/test_gen_meta_data.R +++ b/tests/testthat/test_gen_meta_data.R @@ -8,8 +8,9 @@ with_mock_dir("meta1", { skip_on_cran() skip_on_ci() - result <- restatis::gen_metadata(code = "11111-0001", - category = "Table") + result <- gen_metadata(code = "11111-0001", + category = "table", + database = "genesis") expect_type(result, type = "list") @@ -20,20 +21,27 @@ with_mock_dir("meta1", { expect_true("Updated" %in% names(attrs)) expect_true("Language" %in% names(attrs)) expect_true("Copyright" %in% names(attrs)) + }) + }) #------------------------------------------------------------------------------- with_mock_dir("meta2_fake", { - test_that("gen_metadata errors if there is an error code", { + test_that("gen_metadata errors if there is an error code (fake response)", { + + # Here, the mockfile needs to be altered: + # Status$Code = 999 + # Status$Content = "test error message" skip_on_cran() skip_on_ci() expect_error( - restatis::gen_metadata(code = "1*", - category = "Cube"), + gen_metadata(code = "1*", + category = "cube", + database = "genesis"), regexp = "test error message") }) }) @@ -47,9 +55,10 @@ with_mock_dir("meta3", { skip_on_ci() expect_message( - restatis::gen_metadata(code = "11111-0001", - category = "Table", - error.ignore = TRUE), + gen_metadata(code = "11111-0001", + category = "table", + error.ignore = TRUE, + database = "genesis"), regexp = "Use 'error.ignore = FALSE' to stop the function at the point where no object could be found.") }) }) @@ -60,24 +69,25 @@ with_mock_dir("meta3", { test_that("gen_metadata function errors on numeric code param", { expect_error( - restatis::gen_metadata(code = 12345, category = "Table"), + gen_metadata(code = 12345, category = "Table", database = "genesis"), regexp = "Parameter 'code' has to be of type 'character'.") }) test_that("gen_metadata function errors on multiple categories", { expect_error( - restatis::gen_metadata(code = "12345", category = c("Table", "Cube")), + gen_metadata(code = "12345", category = c("Table", "Cube"), database = "genesis"), regexp = "Parameter 'category' must have a length of 1. Please specify the category.") }) test_that("gen_metadata function errors on wrong category", { expect_error( - restatis::gen_metadata(code = "11111", category = "table"), - regexp = "Available categories are Cube, Table, Statistic, Variable, and Value.") + gen_metadata(code = "11111", category = "Table", database = "genesis"), + regexp = "Available categories for parameter 'category' for 'genesis' database are 'cube', 'table', 'statistic', 'variable', and 'value'") + }) test_that("gen_metadata function errors on wrong error.ignore param", { expect_error( - restatis::gen_metadata(code = "11111", error.ignore = 1, category = "Table"), + gen_metadata(code = "11111", error.ignore = 1, category = "table", database = "genesis"), regexp = "Parameter 'error.ignore' has to be of type 'logical' and of length 1.") }) diff --git a/tests/testthat/test_gen_modified_data.R b/tests/testthat/test_gen_modified_data.R index 2e7abe0..37114a1 100644 --- a/tests/testthat/test_gen_modified_data.R +++ b/tests/testthat/test_gen_modified_data.R @@ -8,10 +8,11 @@ with_mock_dir("modified1", { skip_on_cran() skip_on_ci() - expect_type( - restatis::gen_modified_data(code = "61111", date = "01.01.2022"), - type = "list") + expect_type(gen_modified_data(code = "61111", date = "01.01.2022", database = "genesis"), + type = "list") + }) + }) with_mock_dir("modified2", { @@ -21,11 +22,11 @@ with_mock_dir("modified2", { skip_on_ci() expect_message( - restatis::gen_modified_data(code = "61111"), - regexp = "Please note that this date is calculated automatically and may differ - from manually entered data. Manually entered data must have - the format DD.MM.YYYY.") + gen_modified_data(code = "61111", database = "genesis"), + regexp = "Please note that per default the current system date is used.") + }) + }) #------------------------------------------------------------------------------- @@ -36,7 +37,7 @@ with_mock_dir("modified3", { skip_on_cran() skip_on_ci() - result <- restatis::gen_modified_data(code = "61111", date = "01.01.2022") + result <- gen_modified_data(code = "61111", date = "01.01.2022", database = "genesis") attrs <- attributes(result) @@ -47,18 +48,23 @@ with_mock_dir("modified3", { expect_true("Copyright" %in% names(attrs)) }) + }) with_mock_dir("modified4_fake", { - test_that("gen_modified_data function warns if there is a non-zero status code", { + test_that("gen_modified_data function warns if there is a non-zero status code (fake response)", { skip_on_cran() skip_on_ci() - expect_warning( - restatis::gen_modified_data(code = "61234", date = "01.01.2022"), - regexp = "test warning message") + expect_message( + gen_modified_data(code = "61234", + date = "01.01.2022", + database = "genesis"), + regexp = "No modified objects found for your code and date in genesis") + }) + }) #------------------------------------------------------------------------------- @@ -67,13 +73,13 @@ with_mock_dir("modified4_fake", { test_that("gen_modified_data errors on misspecified dates", { expect_error( - restatis::gen_modified_data(code = "61111", date = "1.1.2022"), + gen_modified_data(code = "61111", date = "1.1.2022"), regexp = "it has to be of length 1 and format DD.MM.YYYY") }) test_that("gen_modified_data errors on misspecified dates", { expect_error( - restatis::gen_modified_data(code = "61111", date = 23456), + gen_modified_data(code = "61111", date = 23456), regexp = "'date', it has to be of type 'character'.") }) @@ -81,13 +87,13 @@ test_that("gen_modified_data errors on misspecified dates", { test_that("gen_modified_data errors on multiple codes", { expect_error( - restatis::gen_modified_data(code = c("611*", "711*")), + gen_modified_data(code = c("611*", "711*")), regexp = "Parameter 'code' must be a single string.") }) test_that("gen_modified_data function errors on numeric code param", { expect_error( - restatis::gen_modified_data(code = 12345), + gen_modified_data(code = 12345), regexp = "Parameter 'code' has to be of type 'character'.") }) @@ -95,6 +101,6 @@ test_that("gen_modified_data function errors on numeric code param", { test_that("gen_modified_data function errors on wrong type value", { expect_error( - restatis::gen_modified_data(code = "12345", type = "diesdasananas"), - regexp = "Available categories for parameter 'type' are 'tables', 'statistics', 'statistic updates', and 'all'.") + gen_modified_data(code = "12345", type = "diesdasananas"), + regexp = "'arg' should be one of") }) diff --git a/tests/testthat/test_gen_objects2stat.R b/tests/testthat/test_gen_objects2stat.R index f1e4897..9ac5e1d 100644 --- a/tests/testthat/test_gen_objects2stat.R +++ b/tests/testthat/test_gen_objects2stat.R @@ -8,7 +8,7 @@ with_mock_dir("xy_statistic1", { skip_on_cran() skip_on_ci() - result <- restatis::gen_objects2stat(code = "61111") + result <- gen_objects2stat(code = "61111", database = "genesis") expect_type(result, type = "list") @@ -30,8 +30,9 @@ with_mock_dir("xy_statistic2", { skip_on_cran() skip_on_ci() - expect_s3_class(restatis::gen_objects2stat(code = "61111", - category = "tables"), + expect_s3_class(gen_objects2stat(code = "61111", + category = "tables", + database = "genesis"), class = "data.frame") }) }) @@ -42,13 +43,13 @@ with_mock_dir("xy_statistic2", { test_that("gen_objects2stat function errors on multiple codes", { expect_error( - restatis::gen_objects2stat(code = c("611*", "711*"), detailed = TRUE, category = "tables"), + gen_objects2stat(code = c("611*", "711*"), detailed = TRUE, category = "tables", database = "genesis"), regexp = "Parameter 'code' must be a single string.") }) test_that("gen_objects2stat function errors on numeric code param", { expect_error( - restatis::gen_objects2stat(code = 12345, detailed = TRUE, category = "tables"), + gen_objects2stat(code = 12345, detailed = TRUE, category = "tables", database = "genesis"), regexp = "Parameter 'code' has to be of type 'character'.") }) @@ -56,14 +57,14 @@ test_that("gen_objects2stat function errors on numeric code param", { test_that("gen_objects2stat function errors on wrong categories", { expect_error( - restatis::gen_objects2stat(code = "611*", detailed = TRUE, category = "statistics"), - regexp = "Available categories are tables, variables, and cubes.") + gen_objects2stat(code = "611*", detailed = TRUE, category = "statistics", database = "genesis"), + regexp = "Available categories are 'tables', 'variables', and 'cubes'.") }) test_that("gen_objects2stat function errors on too many categories", { expect_error( - restatis::gen_objects2stat(code = "611*", detailed = TRUE, - category = c("variables", "statistics", "tables", "cubes")), + gen_objects2stat(code = "611*", detailed = TRUE, + category = c("variables", "statistics", "tables", "cubes"), database = "genesis"), regexp = "Parameter 'category' has to have a length of 1 to 3.") }) @@ -71,7 +72,7 @@ test_that("gen_objects2stat function errors on too many categories", { test_that("gen_objects2stat function errors on numeric detailed param", { expect_error( - restatis::gen_objects2stat(code = "711*", detailed = 1, category = "tables"), + gen_objects2stat(code = "711*", detailed = 1, category = "tables", database = "genesis"), regexp = "Parameter 'detailed' has to be of type 'logical' and of length 1.") }) @@ -82,22 +83,24 @@ with_mock_dir("xy_statistic3", { skip_on_ci() expect_message( - restatis::gen_objects2stat(code = "61111", detailed = FALSE, category = "tables"), + gen_objects2stat(code = "61111", detailed = FALSE, category = "tables", database = "genesis"), regexp = "Use 'detailed = TRUE' to obtain the complete output.") + }) + }) #------------------------------------------------------------------------------- # test_that("gen_objects2stat function errors on wrong sort param", { # expect_error( -# restatis::gen_objects2stat(code = "61111", sortcriterion = "date"), +# gen_objects2stat(code = "61111", sortcriterion = "date"), # regexp = "Parameter 'sortcriterion' has to be 'code' or 'content'.") # }) # test_that("gen_objects2stat function errors on wrong sort param type", { # expect_error( -# restatis::gen_objects2stat(code = "6111*", sortcriterion = 123), +# gen_objects2stat(code = "6111*", sortcriterion = 123), # regexp = "Parameter 'sortcriterion' has to be of type 'character'.") # }) @@ -105,6 +108,6 @@ with_mock_dir("xy_statistic3", { test_that("gen_objects2stat function errors on wrong error.ignore param", { expect_error( - restatis::gen_objects2stat(code = "711*", error.ignore = 1), + gen_objects2stat(code = "711*", error.ignore = 1), regexp = "Parameter 'error.ignore' has to be of type 'logical' and of length 1.") }) diff --git a/tests/testthat/test_gen_objects2var.R b/tests/testthat/test_gen_objects2var.R index fb4b31d..7a39a2a 100644 --- a/tests/testthat/test_gen_objects2var.R +++ b/tests/testthat/test_gen_objects2var.R @@ -8,7 +8,7 @@ with_mock_dir("xy_variable1", { skip_on_cran() skip_on_ci() - result <- restatis::gen_objects2var(code = "DLAND") + result <- gen_objects2var(code = "DLAND", database = "genesis") expect_type(result, type = "list") @@ -25,15 +25,19 @@ with_mock_dir("xy_variable1", { #------------------------------------------------------------------------------- with_mock_dir("xy_variable2", { + test_that("gen_objects2var does return a data.frame for a single category", { skip_on_cran() skip_on_ci() - expect_s3_class(restatis::gen_objects2var(code = "DLAND", - category = "tables"), + expect_s3_class(gen_objects2var(code = "DLAND", + category = "tables", + database = "genesis"), class = "data.frame") + }) + }) #------------------------------------------------------------------------------- @@ -42,13 +46,13 @@ with_mock_dir("xy_variable2", { test_that("gen_objects2var function errors on multiple codes", { expect_error( - restatis::gen_objects2var(code = c("DLAND", "LAND"), detailed = TRUE, category = "tables"), + gen_objects2var(code = c("DLAND", "LAND"), detailed = TRUE, category = "tables"), regexp = "Parameter 'code' must be a single string.") }) test_that("gen_objects2var function errors on numeric code param", { expect_error( - restatis::gen_objects2var(code = 12345, detailed = TRUE, category = "tables"), + gen_objects2var(code = 12345, detailed = TRUE, category = "tables"), regexp = "Parameter 'code' has to be of type 'character'.") }) @@ -56,13 +60,13 @@ test_that("gen_objects2var function errors on numeric code param", { test_that("gen_objects2var function errors on wrong categories", { expect_error( - restatis::gen_objects2var(code = "DLAND", detailed = TRUE, category = "variables"), - regexp = "Available categories are tables, statistics, and cubes.") + gen_objects2var(code = "DLAND", detailed = TRUE, category = "variables", database = "genesis"), + regexp = "Available categories are 'tables', 'statistics', and 'cubes'.") }) test_that("gen_objects2var function errors on too many categories", { expect_error( - restatis::gen_objects2var(code = "611*", detailed = TRUE, + gen_objects2var(code = "611*", detailed = TRUE, category = c("variables", "statistics", "tables", "cubes")), regexp = "Parameter 'category' has to have a length of 1 to 3.") }) @@ -71,7 +75,7 @@ test_that("gen_objects2var function errors on too many categories", { test_that("gen_objects2var function errors on numeric detailed param", { expect_error( - restatis::gen_objects2var(code = "DLAND", detailed = 1, category = "tables"), + gen_objects2var(code = "DLAND", detailed = 1, category = "tables"), regexp = "Parameter 'detailed' has to be of type 'logical' and of length 1.") }) @@ -82,7 +86,7 @@ with_mock_dir("xy_variable3", { skip_on_ci() expect_message( - restatis::gen_objects2var(code = "DLAND", detailed = FALSE, category = "tables"), + gen_objects2var(code = "DLAND", detailed = FALSE, category = "tables", database = "genesis"), regexp = "Use 'detailed = TRUE' to obtain the complete output.") }) }) @@ -91,13 +95,13 @@ with_mock_dir("xy_variable3", { # test_that("gen_objects2var function errors on wrong sort param", { # expect_error( -# restatis::gen_objects2var(code = "DLAND", sortcriterion = "date"), +# gen_objects2var(code = "DLAND", sortcriterion = "date"), # regexp = "Parameter 'sortcriterion' has to be 'code' or 'content'.") # }) # test_that("gen_objects2var function errors on wrong sort param type", { # expect_error( -# restatis::gen_objects2var(code = "DLAND", sortcriterion = 123), +# gen_objects2var(code = "DLAND", sortcriterion = 123), # regexp = "Parameter 'sortcriterion' has to be of type 'character'.") # }) @@ -105,6 +109,6 @@ with_mock_dir("xy_variable3", { test_that("gen_objects2var function errors on wrong error.ignore param", { expect_error( - restatis::gen_objects2var(code = "7DLAND", error.ignore = 1), + gen_objects2var(code = "7DLAND", error.ignore = 1), regexp = "Parameter 'error.ignore' has to be of type 'logical' and of length 1.") }) diff --git a/tests/testthat/test_gen_search_vars.R b/tests/testthat/test_gen_search_vars.R index 99f5f3a..a0ca3b8 100644 --- a/tests/testthat/test_gen_search_vars.R +++ b/tests/testthat/test_gen_search_vars.R @@ -10,7 +10,8 @@ with_mock_dir("searchvars1", { result <- gen_search_vars(code = NULL, sortcriterion = c("code", "content"), - error.ignore = FALSE) + error.ignore = FALSE, + database = "genesis") expect_type(result, type = "list") @@ -27,17 +28,19 @@ with_mock_dir("searchvars1", { #------------------------------------------------------------------------------- -with_mock_dir("searchvars2_fake", { - test_that("gen_search_vars returns a list element", { +with_mock_dir("searchvars2", { + test_that("gen_search_vars errors if there is no object found", { skip_on_cran() skip_on_ci() expect_error( gen_search_vars(code = "74111", - sortcriterion = c("code", "content"), - error.ignore = FALSE), - regexp = "test error message") + sortcriterion = c("code", "content"), + error.ignore = FALSE, + database = "genesis", + language = "en"), + regexp = "No object found for your request.") }) }) @@ -48,13 +51,13 @@ with_mock_dir("searchvars2_fake", { test_that("gen_search_vars function errors on multiple codes", { expect_error( - restatis::gen_search_vars(code = c("611*", "711*"), detailed = TRUE, category = "tables"), + gen_search_vars(code = c("611*", "711*"), detailed = TRUE, category = "tables"), regexp = "Parameter 'code' must be a single string.") }) test_that("gen_search_vars function errors on numeric code param", { expect_error( - restatis::gen_search_vars(code = 12345, detailed = TRUE, category = "tables"), + gen_search_vars(code = 12345, detailed = TRUE, category = "tables"), regexp = "Parameter 'code' has to be of type 'character'.") }) @@ -62,13 +65,13 @@ test_that("gen_search_vars function errors on numeric code param", { test_that("gen_search_vars function errors on wrong sort param", { expect_error( - restatis::gen_search_vars(code = "61111", sortcriterion = "date"), + gen_search_vars(code = "61111", sortcriterion = "date"), regexp = "Parameter 'sortcriterion' has to be 'code' or 'content'.") }) test_that("gen_search_vars function errors on wrong sort param type", { expect_error( - restatis::gen_search_vars(code = "6111*", sortcriterion = 123), + gen_search_vars(code = "6111*", sortcriterion = 123), regexp = "Parameter 'sortcriterion' has to be of type 'character'.") }) @@ -76,7 +79,7 @@ test_that("gen_search_vars function errors on wrong sort param type", { test_that("gen_search_vars function errors on wrong error.ignore param", { expect_error( - restatis::gen_search_vars(code = "711*", error.ignore = 1), + gen_search_vars(code = "711*", error.ignore = 1), regexp = "Parameter 'error.ignore' has to be of type 'logical' and of length 1.") }) diff --git a/tests/testthat/test_gen_val2var.R b/tests/testthat/test_gen_val2var.R index 7295b80..c11ff23 100644 --- a/tests/testthat/test_gen_val2var.R +++ b/tests/testthat/test_gen_val2var.R @@ -8,12 +8,16 @@ with_mock_dir("values1", { skip_on_cran() skip_on_ci() - expect_error( - restatis::gen_val2var(code = "61111", - detailed = TRUE, - sortcriterion = "code"), - regexp = "No object found for your request.") + expect_message( + gen_val2var(code = "61111", + detailed = TRUE, + sortcriterion = "code", + database = "genesis", + language = "en"), + regexp = "No objects found.") + }) + }) # #------------------------------------------------------------------------------- @@ -24,9 +28,10 @@ with_mock_dir("values2", { skip_on_cran() skip_on_ci() - result <- restatis::gen_val2var(code = "DLAND", - detailed = TRUE, - sortcriterion = "code") + result <- gen_val2var(code = "DLAND", + detailed = TRUE, + sortcriterion = "code", + database = "genesis") expect_type(result, type = "list") @@ -46,13 +51,13 @@ with_mock_dir("values2", { test_that("gen_val2var function errors on multiple codes", { expect_error( - restatis::gen_val2var(code = c("611*", "711*"), detailed = TRUE, category = "tables"), + gen_val2var(code = c("611*", "711*"), detailed = TRUE, category = "tables", database = "genesis"), regexp = "Parameter 'code' must be a single string.") }) test_that("gen_val2var function errors on numeric code param", { expect_error( - restatis::gen_val2var(code = 12345, detailed = TRUE, category = "tables"), + gen_val2var(code = 12345, detailed = TRUE, category = "tables", "genesis"), regexp = "Parameter 'code' has to be of type 'character'.") }) @@ -60,13 +65,13 @@ test_that("gen_val2var function errors on numeric code param", { test_that("gen_val2var function errors on wrong sort param", { expect_error( - restatis::gen_val2var(code = "61111", sortcriterion = "date"), + gen_val2var(code = "61111", sortcriterion = "date", database = "genesis"), regexp = "Parameter 'sortcriterion' has to be 'code' or 'content'.") }) test_that("gen_val2var function errors on wrong sort param type", { expect_error( - restatis::gen_val2var(code = "6111*", sortcriterion = 123), + gen_val2var(code = "6111*", sortcriterion = 123, database = "genesis"), regexp = "Parameter 'sortcriterion' has to be of type 'character'.") }) @@ -74,6 +79,7 @@ test_that("gen_val2var function errors on wrong sort param type", { test_that("gen_val2var function errors on wrong error.ignore param", { expect_error( - restatis::gen_val2var(code = "711*", error.ignore = 1), + gen_val2var(code = "711*", error.ignore = 1, database = "genesis"), regexp = "Parameter 'error.ignore' has to be of type 'logical' and of length 1.") }) + diff --git a/tests/testthat/test_gen_var2stat.R b/tests/testthat/test_gen_var2stat.R index b46132a..7514830 100644 --- a/tests/testthat/test_gen_var2stat.R +++ b/tests/testthat/test_gen_var2stat.R @@ -8,9 +8,10 @@ with_mock_dir("variables1", { skip_on_cran() skip_on_ci() - result <- restatis::gen_var2stat(code = "61111", - detailed = TRUE, - sortcriterion = "code") + result <- gen_var2stat(code = "61111", + detailed = TRUE, + sortcriterion = "code", + database = "genesis") expect_type(result, type = "list") @@ -27,13 +28,17 @@ with_mock_dir("variables1", { #------------------------------------------------------------------------------- with_mock_dir("variables2_fake", { - test_that("gen_var2stat function errors if there is a problem", { + test_that("gen_var2stat function errors if there is a problem (fake response)", { + + # Here, it is necessary to change the mockfile: + # Change the Status$Code to, e.g., 999 + # Change the Status$Content to contain "test error message" skip_on_cran() skip_on_ci() expect_error( - restatis::gen_var2stat(code = "74111"), + gen_var2stat(code = "74111", database = "genesis"), regexp = "test error message") }) }) @@ -44,13 +49,13 @@ with_mock_dir("variables2_fake", { test_that("gen_var2stat function errors on multiple codes", { expect_error( - restatis::gen_var2stat(code = c("611*", "711*"), detailed = TRUE, category = "tables"), + gen_var2stat(code = c("611*", "711*"), detailed = TRUE, category = "tables"), regexp = "Parameter 'code' must be a single string.") }) test_that("gen_var2stat function errors on numeric code param", { expect_error( - restatis::gen_var2stat(code = 12345, detailed = TRUE, category = "tables"), + gen_var2stat(code = 12345, detailed = TRUE, category = "tables"), regexp = "Parameter 'code' has to be of type 'character'.") }) @@ -58,7 +63,7 @@ test_that("gen_var2stat function errors on numeric code param", { test_that("gen_var2stat function errors on numeric detailed param", { expect_error( - restatis::gen_var2stat(code = "711*", detailed = 1, category = "tables"), + gen_var2stat(code = "711*", detailed = 1, category = "tables"), regexp = "Parameter 'detailed' has to be of type 'logical' and of length 1.") }) @@ -69,7 +74,7 @@ with_mock_dir("variables3", { skip_on_ci() expect_message( - restatis::gen_var2stat(code = "61111", detailed = FALSE, category = "tables"), + gen_var2stat(code = "61111", detailed = FALSE, category = "tables", database = "genesis"), regexp = "Use 'detailed = TRUE' to obtain the complete output.") }) }) @@ -78,13 +83,13 @@ with_mock_dir("variables3", { test_that("gen_var2stat function errors on wrong sort param", { expect_error( - restatis::gen_var2stat(code = "61111", sortcriterion = "date"), + gen_var2stat(code = "61111", sortcriterion = "date"), regexp = "Parameter 'sortcriterion' has to be 'code' or 'content'.") }) test_that("gen_var2stat function errors on wrong sort param type", { expect_error( - restatis::gen_var2stat(code = "6111*", sortcriterion = 123), + gen_var2stat(code = "6111*", sortcriterion = 123), regexp = "Parameter 'sortcriterion' has to be of type 'character'.") }) @@ -92,6 +97,6 @@ test_that("gen_var2stat function errors on wrong sort param type", { test_that("gen_var2stat function errors on wrong error.ignore param", { expect_error( - restatis::gen_var2stat(code = "711*", error.ignore = 1), + gen_var2stat(code = "711*", error.ignore = 1), regexp = "Parameter 'error.ignore' has to be of type 'logical' and of length 1.") }) diff --git a/tests/testthat/values1/api/catalogue/values2variable-8361bb.json b/tests/testthat/values1/api/catalogue/values2variable-8361bb.json new file mode 100644 index 0000000..f38f26e --- /dev/null +++ b/tests/testthat/values1/api/catalogue/values2variable-8361bb.json @@ -0,0 +1,24 @@ +{ + "Ident": { + "Service": "catalogue", + "Method": "values2variable" + }, + "Status": { + "Code": 103, + "Content": "No objects found. (At least one parameter contains invalid values. It was changed to perform the service.: sortcriterion)", + "Type": "Information" + }, + "Parameter": { + "username": "********************", + "password": "********************", + "name": "61111", + "selection": "", + "area": "all", + "searchcriterion": "code", + "sortcriterion": "code", + "pagelength": "100", + "language": "en" + }, + "List": null, + "Copyright": "© Federal Statistical Office, Wiesbaden 2024" +} diff --git a/tests/testthat/values2/api/catalogue/values2variable-d9d8dc.json b/tests/testthat/values2/api/catalogue/values2variable-d9d8dc.json new file mode 100644 index 0000000..77d8496 --- /dev/null +++ b/tests/testthat/values2/api/catalogue/values2variable-d9d8dc.json @@ -0,0 +1,121 @@ +{ + "Ident": { + "Service": "catalogue", + "Method": "values2variable" + }, + "Status": { + "Code": 22, + "Content": "erfolgreich (Mindestens ein Parameter enthält ungültige Werte. Er wurde angepasst, um den Service starten zu können.: sortcriterion)", + "Type": "Warnung" + }, + "Parameter": { + "username": "********************", + "password": "********************", + "name": "DLAND", + "selection": "", + "area": "Alle", + "searchcriterion": "Code", + "sortcriterion": "Code", + "pagelength": "100", + "language": "de" + }, + "List": [ + { + "Code": "08", + "Content": "Baden-Württemberg", + "Variables": "9", + "Information": "false" + }, + { + "Code": "09", + "Content": "Bayern", + "Variables": "9", + "Information": "false" + }, + { + "Code": "11", + "Content": "Berlin", + "Variables": "11", + "Information": "false" + }, + { + "Code": "12", + "Content": "Brandenburg", + "Variables": "9", + "Information": "false" + }, + { + "Code": "04", + "Content": "Bremen", + "Variables": "12", + "Information": "false" + }, + { + "Code": "02", + "Content": "Hamburg", + "Variables": "12", + "Information": "false" + }, + { + "Code": "06", + "Content": "Hessen", + "Variables": "9", + "Information": "false" + }, + { + "Code": "13", + "Content": "Mecklenburg-Vorpommern", + "Variables": "12", + "Information": "false" + }, + { + "Code": "03", + "Content": "Niedersachsen", + "Variables": "10", + "Information": "false" + }, + { + "Code": "05", + "Content": "Nordrhein-Westfalen", + "Variables": "9", + "Information": "false" + }, + { + "Code": "07", + "Content": "Rheinland-Pfalz", + "Variables": "9", + "Information": "false" + }, + { + "Code": "10", + "Content": "Saarland", + "Variables": "11", + "Information": "false" + }, + { + "Code": "14", + "Content": "Sachsen", + "Variables": "9", + "Information": "false" + }, + { + "Code": "15", + "Content": "Sachsen-Anhalt", + "Variables": "11", + "Information": "false" + }, + { + "Code": "01", + "Content": "Schleswig-Holstein", + "Variables": "12", + "Information": "false" + }, + { + "Code": "16", + "Content": "Thüringen", + "Variables": "11", + "Information": "false" + } + ], + "Copyright": "© Statistisches Bundesamt (Destatis), 2024" +} diff --git a/tests/testthat/variables1/api/catalogue/variables2statistic-49290a.json b/tests/testthat/variables1/api/catalogue/variables2statistic-49290a.json new file mode 100644 index 0000000..6030c3e --- /dev/null +++ b/tests/testthat/variables1/api/catalogue/variables2statistic-49290a.json @@ -0,0 +1,117 @@ +{ + "Ident": { + "Service": "catalogue", + "Method": "variables2statistic" + }, + "Status": { + "Code": 22, + "Content": "erfolgreich (Mindestens ein Parameter enthält ungültige Werte. Er wurde angepasst, um den Service starten zu können.: sortcriterion)", + "Type": "Warnung" + }, + "Parameter": { + "username": "********************", + "password": "********************", + "name": "61111", + "selection": "", + "area": "Alle", + "searchcriterion": "Code", + "sortcriterion": "Code", + "type": "Alle", + "pagelength": "100", + "language": "de" + }, + "List": [ + { + "Code": "CC13A2", + "Content": "Verwendungszwecke des Individualkonsums, 2-Steller", + "Type": "sachlich", + "Values": "-1", + "Information": "true" + }, + { + "Code": "CC13A3", + "Content": "Verwendungszwecke des Individualkonsums, 3-Steller", + "Type": "sachlich", + "Values": "-1", + "Information": "true" + }, + { + "Code": "CC13A4", + "Content": "Verwendungszwecke des Individualkonsums, 4-Steller", + "Type": "sachlich", + "Values": "-1", + "Information": "true" + }, + { + "Code": "CC13A5", + "Content": "Verwendungszwecke des Individualkonsums, 5-Steller", + "Type": "sachlich", + "Values": "-1", + "Information": "true" + }, + { + "Code": "CC13B1", + "Content": "Verwendungszw.d.Individualkonsums,Sonderpositionen", + "Type": "sachlich", + "Values": "-1", + "Information": "true" + }, + { + "Code": "CC13Z1", + "Content": "Verwendungszwecke des Individualkonsums,10-Steller", + "Type": "sachlich", + "Values": "-1", + "Information": "true" + }, + { + "Code": "DINSG", + "Content": "Deutschland insgesamt", + "Type": "räumlich insgesamt", + "Values": "-1", + "Information": "false" + }, + { + "Code": "DLAND", + "Content": "Bundesländer", + "Type": "räumlich", + "Values": "-1", + "Information": "true" + }, + { + "Code": "JAHR", + "Content": "Jahr", + "Type": "zeitidentifizierend", + "Values": "-1", + "Information": "false" + }, + { + "Code": "MONAT", + "Content": "Monate", + "Type": "zeitlich", + "Values": "-1", + "Information": "false" + }, + { + "Code": "PRE034", + "Content": "Index der Nettokaltmieten", + "Type": "Wert", + "Values": "-1", + "Information": "false" + }, + { + "Code": "PRE999", + "Content": "Gewichtung", + "Type": "Wert", + "Values": "-1", + "Information": "false" + }, + { + "Code": "PREIS1", + "Content": "Verbraucherpreisindex", + "Type": "Wert", + "Values": "-1", + "Information": "true" + } + ], + "Copyright": "© Statistisches Bundesamt (Destatis), 2024" +} diff --git a/tests/testthat/variables2_fake/api/catalogue/variables2statistic-e15459.json b/tests/testthat/variables2_fake/api/catalogue/variables2statistic-e15459.json new file mode 100644 index 0000000..0e73082 --- /dev/null +++ b/tests/testthat/variables2_fake/api/catalogue/variables2statistic-e15459.json @@ -0,0 +1,11 @@ +{ + "Ident": { + "Service": "catalogue", + "Method": "variables2statistic" + }, + "Status": { + "Code": 999, + "Content": "test error message", + "Type": "Warnung" + } +} diff --git a/tests/testthat/variables3/api/catalogue/variables2statistic-f8d69a.json b/tests/testthat/variables3/api/catalogue/variables2statistic-f8d69a.json new file mode 100644 index 0000000..6030c3e --- /dev/null +++ b/tests/testthat/variables3/api/catalogue/variables2statistic-f8d69a.json @@ -0,0 +1,117 @@ +{ + "Ident": { + "Service": "catalogue", + "Method": "variables2statistic" + }, + "Status": { + "Code": 22, + "Content": "erfolgreich (Mindestens ein Parameter enthält ungültige Werte. Er wurde angepasst, um den Service starten zu können.: sortcriterion)", + "Type": "Warnung" + }, + "Parameter": { + "username": "********************", + "password": "********************", + "name": "61111", + "selection": "", + "area": "Alle", + "searchcriterion": "Code", + "sortcriterion": "Code", + "type": "Alle", + "pagelength": "100", + "language": "de" + }, + "List": [ + { + "Code": "CC13A2", + "Content": "Verwendungszwecke des Individualkonsums, 2-Steller", + "Type": "sachlich", + "Values": "-1", + "Information": "true" + }, + { + "Code": "CC13A3", + "Content": "Verwendungszwecke des Individualkonsums, 3-Steller", + "Type": "sachlich", + "Values": "-1", + "Information": "true" + }, + { + "Code": "CC13A4", + "Content": "Verwendungszwecke des Individualkonsums, 4-Steller", + "Type": "sachlich", + "Values": "-1", + "Information": "true" + }, + { + "Code": "CC13A5", + "Content": "Verwendungszwecke des Individualkonsums, 5-Steller", + "Type": "sachlich", + "Values": "-1", + "Information": "true" + }, + { + "Code": "CC13B1", + "Content": "Verwendungszw.d.Individualkonsums,Sonderpositionen", + "Type": "sachlich", + "Values": "-1", + "Information": "true" + }, + { + "Code": "CC13Z1", + "Content": "Verwendungszwecke des Individualkonsums,10-Steller", + "Type": "sachlich", + "Values": "-1", + "Information": "true" + }, + { + "Code": "DINSG", + "Content": "Deutschland insgesamt", + "Type": "räumlich insgesamt", + "Values": "-1", + "Information": "false" + }, + { + "Code": "DLAND", + "Content": "Bundesländer", + "Type": "räumlich", + "Values": "-1", + "Information": "true" + }, + { + "Code": "JAHR", + "Content": "Jahr", + "Type": "zeitidentifizierend", + "Values": "-1", + "Information": "false" + }, + { + "Code": "MONAT", + "Content": "Monate", + "Type": "zeitlich", + "Values": "-1", + "Information": "false" + }, + { + "Code": "PRE034", + "Content": "Index der Nettokaltmieten", + "Type": "Wert", + "Values": "-1", + "Information": "false" + }, + { + "Code": "PRE999", + "Content": "Gewichtung", + "Type": "Wert", + "Values": "-1", + "Information": "false" + }, + { + "Code": "PREIS1", + "Content": "Verbraucherpreisindex", + "Type": "Wert", + "Values": "-1", + "Information": "true" + } + ], + "Copyright": "© Statistisches Bundesamt (Destatis), 2024" +} diff --git a/tests/testthat/xy_statistic1/api/catalogue/cubes2statistic-30c942.json b/tests/testthat/xy_statistic1/api/catalogue/cubes2statistic-30c942.json new file mode 100644 index 0000000..ef5cb1a --- /dev/null +++ b/tests/testthat/xy_statistic1/api/catalogue/cubes2statistic-30c942.json @@ -0,0 +1,199 @@ +{ + "Ident": { + "Service": "catalogue", + "Method": "cubes2statistic" + }, + "Status": { + "Code": 0, + "Content": "erfolgreich", + "Type": "Information" + }, + "Parameter": { + "username": "********************", + "password": "********************", + "name": "61111", + "selection": "", + "area": "Alle", + "pagelength": "100", + "language": "de" + }, + "List": [ + { + "Code": "61111B5001", + "Content": "Verbraucherpreisindex für Deutschland, Gewichtung, Deutschland insgesamt, Verwendungszwecke des Individualkonsums, 2-Steller, Jahr", + "State": "vollständig mit Werten", + "Time": "2020", + "LatestUpdate": "18.04.2024 13:34:49h", + "Information": "false" + }, + { + "Code": "61111B5002", + "Content": "Verbraucherpreisindex für Deutschland, Gewichtung, Deutschland insgesamt, Verwendungszwecke des Individualkonsums, 3-Steller, Jahr", + "State": "vollständig mit Werten", + "Time": "2020", + "LatestUpdate": "18.04.2024 13:35:14h", + "Information": "false" + }, + { + "Code": "61111B5003", + "Content": "Verbraucherpreisindex für Deutschland, Gewichtung, Deutschland insgesamt, Verwendungszwecke des Individualkonsums, 4-Steller, Jahr", + "State": "vollständig mit Werten", + "Time": "2020", + "LatestUpdate": "18.04.2024 13:35:42h", + "Information": "false" + }, + { + "Code": "61111B5004", + "Content": "Verbraucherpreisindex für Deutschland, Gewichtung, Deutschland insgesamt, Verwendungszwecke des Individualkonsums, 5-Steller, Jahr", + "State": "vollständig mit Werten", + "Time": "2020", + "LatestUpdate": "18.04.2024 13:36:07h", + "Information": "false" + }, + { + "Code": "61111BJ001", + "Content": "Verbraucherpreisindex für Deutschland, Verbraucherpreisindex, Deutschland insgesamt, Jahr", + "State": "vollständig mit Werten", + "Time": "1991-2023", + "LatestUpdate": "16.01.2024 08:00:32h", + "Information": "false" + }, + { + "Code": "61111BJ002", + "Content": "Verbraucherpreisindex für Deutschland, Verbraucherpreisindex, Deutschland insgesamt, Verwendungszwecke des Individualkonsums, 2-Steller, Jahr", + "State": "vollständig mit Werten", + "Time": "1991-2023", + "LatestUpdate": "16.01.2024 08:00:23h", + "Information": "false" + }, + { + "Code": "61111BJ003", + "Content": "Verbraucherpreisindex für Deutschland, Verbraucherpreisindex, Deutschland insgesamt, Verwendungszwecke des Individualkonsums, 3-Steller, Jahr", + "State": "vollständig mit Werten", + "Time": "1991-2023", + "LatestUpdate": "16.01.2024 08:00:26h", + "Information": "false" + }, + { + "Code": "61111BJ004", + "Content": "Verbraucherpreisindex für Deutschland, Verbraucherpreisindex, Deutschland insgesamt, Verwendungszwecke des Individualkonsums, 4-Steller, Jahr", + "State": "vollständig mit Werten", + "Time": "1991-2023", + "LatestUpdate": "16.01.2024 08:00:51h", + "Information": "false" + }, + { + "Code": "61111BJ005", + "Content": "Verbraucherpreisindex für Deutschland, Verbraucherpreisindex, Deutschland insgesamt, Verwendungszwecke des Individualkonsums, 5-Steller, Jahr", + "State": "vollständig mit Werten", + "Time": "1991-2023", + "LatestUpdate": "16.01.2024 08:00:47h", + "Information": "false" + }, + { + "Code": "61111BJ006", + "Content": "Verbraucherpreisindex für Deutschland, Verbraucherpreisindex, Deutschland insgesamt, Verwendungszw.d.Individualkonsums,Sonderpositionen, Jahr", + "State": "vollständig mit Werten", + "Time": "1991-2023", + "LatestUpdate": "16.01.2024 08:00:29h", + "Information": "false" + }, + { + "Code": "61111BJ007", + "Content": "Verbraucherpreisindex für Deutschland, Verbraucherpreisindex, Deutschland insgesamt, Verwendungszwecke des Individualkonsums,10-Steller, Jahr", + "State": "vollständig mit Werten", + "Time": "2020-2023", + "LatestUpdate": "16.01.2024 08:00:43h", + "Information": "false" + }, + { + "Code": "61111BM001", + "Content": "Verbraucherpreisindex für Deutschland, Verbraucherpreisindex, Deutschland insgesamt, Monate, Jahr", + "State": "vollständig mit Werten", + "Time": "Januar 1991-Mai 2024", + "LatestUpdate": "12.06.2024 08:00:40h", + "Information": "false" + }, + { + "Code": "61111BM002", + "Content": "Verbraucherpreisindex für Deutschland, Verbraucherpreisindex, Deutschland insgesamt, Verwendungszwecke des Individualkonsums, 2-Steller, Monate, Jahr", + "State": "vollständig mit Werten", + "Time": "Januar 1991-Mai 2024", + "LatestUpdate": "12.06.2024 08:00:16h", + "Information": "false" + }, + { + "Code": "61111BM003", + "Content": "Verbraucherpreisindex für Deutschland, Verbraucherpreisindex, Deutschland insgesamt, Verwendungszwecke des Individualkonsums, 3-Steller, Monate, Jahr", + "State": "vollständig mit Werten", + "Time": "Januar 1991-Mai 2024", + "LatestUpdate": "12.06.2024 08:00:19h", + "Information": "false" + }, + { + "Code": "61111BM004", + "Content": "Verbraucherpreisindex für Deutschland, Verbraucherpreisindex, Deutschland insgesamt, Verwendungszwecke des Individualkonsums, 4-Steller, Monate, Jahr", + "State": "vollständig mit Werten", + "Time": "Januar 1991-Mai 2024", + "LatestUpdate": "12.06.2024 08:00:34h", + "Information": "false" + }, + { + "Code": "61111BM005", + "Content": "Verbraucherpreisindex für Deutschland, Verbraucherpreisindex, Deutschland insgesamt, Verwendungszwecke des Individualkonsums, 5-Steller, Monate, Jahr", + "State": "vollständig mit Werten", + "Time": "Januar 1991-Mai 2024", + "LatestUpdate": "12.06.2024 08:00:27h", + "Information": "false" + }, + { + "Code": "61111BM006", + "Content": "Verbraucherpreisindex für Deutschland, Verbraucherpreisindex, Deutschland insgesamt, Verwendungszw.d.Individualkonsums,Sonderpositionen, Monate, Jahr", + "State": "vollständig mit Werten", + "Time": "Januar 1991-Mai 2024", + "LatestUpdate": "12.06.2024 08:00:30h", + "Information": "false" + }, + { + "Code": "61111BM007", + "Content": "Verbraucherpreisindex für Deutschland, Verbraucherpreisindex, Deutschland insgesamt, Verwendungszwecke des Individualkonsums,10-Steller, Monate, Jahr", + "State": "vollständig mit Werten", + "Time": "Januar 2020-Mai 2024", + "LatestUpdate": "12.06.2024 08:00:23h", + "Information": "false" + }, + { + "Code": "61111LJ001", + "Content": "Verbraucherpreisindex für Deutschland, Verbraucherpreisindex, Bundesländer, Jahr", + "State": "vollständig mit Werten", + "Time": "1995-2023", + "LatestUpdate": "16.01.2024 08:00:38h", + "Information": "false" + }, + { + "Code": "61111LJ100", + "Content": "Verbraucherpreisindex für Deutschland, Index der Nettokaltmieten, Bundesländer, Jahr", + "State": "vollständig mit Werten", + "Time": "2005-2023", + "LatestUpdate": "16.01.2024 08:00:35h", + "Information": "false" + }, + { + "Code": "61111LM001", + "Content": "Verbraucherpreisindex für Deutschland, Verbraucherpreisindex, Bundesländer, Monate, Jahr", + "State": "vollständig mit Werten", + "Time": "Januar 1995-Mai 2024", + "LatestUpdate": "12.06.2024 08:00:37h", + "Information": "false" + }, + { + "Code": "61111LM100", + "Content": "Verbraucherpreisindex für Deutschland, Index der Nettokaltmieten, Bundesländer, Monate, Jahr", + "State": "vollständig mit Werten", + "Time": "Januar 2005-Mai 2024", + "LatestUpdate": "12.06.2024 08:00:12h", + "Information": "false" + } + ], + "Copyright": "© Statistisches Bundesamt (Destatis), 2024" +} diff --git a/tests/testthat/xy_statistic1/api/catalogue/tables2statistic-30c942.json b/tests/testthat/xy_statistic1/api/catalogue/tables2statistic-30c942.json new file mode 100644 index 0000000..d0c38cb --- /dev/null +++ b/tests/testthat/xy_statistic1/api/catalogue/tables2statistic-30c942.json @@ -0,0 +1,78 @@ +{ + "Ident": { + "Service": "catalogue", + "Method": "tables2statistic" + }, + "Status": { + "Code": 0, + "Content": "erfolgreich", + "Type": "Information" + }, + "Parameter": { + "username": "********************", + "password": "********************", + "name": "61111", + "selection": "", + "area": "Alle", + "pagelength": "100", + "language": "de" + }, + "List": [ + { + "Code": "61111-0001", + "Content": "Verbraucherpreisindex: Deutschland, Jahre", + "Time": "1991 - 2023" + }, + { + "Code": "61111-0002", + "Content": "Verbraucherpreisindex: Deutschland, Monate", + "Time": "Januar 1991 - Mai 2024" + }, + { + "Code": "61111-0003", + "Content": "Verbraucherpreisindex: Deutschland, Jahre,\nKlassifikation der Verwendungszwecke des Individualkonsums\n(COICOP 2-5-Steller Hierarchie)", + "Time": "1991 - 2023" + }, + { + "Code": "61111-0004", + "Content": "Verbraucherpreisindex: Deutschland, Monate,\nKlassifikation der Verwendungszwecke des Individualkonsums\n(COICOP 2-5-Steller Hierarchie)", + "Time": "Januar 1991 - Mai 2024" + }, + { + "Code": "61111-0005", + "Content": "Verbraucherpreisindex: Deutschland, Jahre,\nKlassifikation der Verwendungszwecke des Individualkonsums\n(COICOP 2-/3-/4-/5-/10-Steller/Sonderpositionen)", + "Time": "1991 - 2023" + }, + { + "Code": "61111-0006", + "Content": "Verbraucherpreisindex: Deutschland, Monate,\nKlassifikation der Verwendungszwecke des Individualkonsums\n(COICOP 2-/3-/4-/5-/10-Steller/Sonderpositionen)", + "Time": "Januar 1991 - Mai 2024" + }, + { + "Code": "61111-0007", + "Content": "Wägungsschema des Verbraucherpreisindex: Deutschland, Jahre,\nKlassifikation der Verwendungszwecke des Individualkonsums\n(COICOP 2-5-Steller Hierarchie)", + "Time": "2020 - 2020" + }, + { + "Code": "61111-0010", + "Content": "Verbraucherpreisindex: Bundesländer, Jahre", + "Time": "1995 - 2023" + }, + { + "Code": "61111-0011", + "Content": "Verbraucherpreisindex: Bundesländer, Monate", + "Time": "Januar 1995 - Mai 2024" + }, + { + "Code": "61111-0020", + "Content": "Index der Nettokaltmieten: Bundesländer, Jahre", + "Time": "2005 - 2023" + }, + { + "Code": "61111-0021", + "Content": "Index der Nettokaltmieten: Bundesländer, Monate", + "Time": "Januar 2005 - Mai 2024" + } + ], + "Copyright": "© Statistisches Bundesamt (Destatis), 2024" +} diff --git a/tests/testthat/xy_statistic1/api/catalogue/variables2statistic-30c942.json b/tests/testthat/xy_statistic1/api/catalogue/variables2statistic-30c942.json new file mode 100644 index 0000000..4946432 --- /dev/null +++ b/tests/testthat/xy_statistic1/api/catalogue/variables2statistic-30c942.json @@ -0,0 +1,117 @@ +{ + "Ident": { + "Service": "catalogue", + "Method": "variables2statistic" + }, + "Status": { + "Code": 0, + "Content": "erfolgreich", + "Type": "Information" + }, + "Parameter": { + "username": "********************", + "password": "********************", + "name": "61111", + "selection": "", + "area": "Alle", + "searchcriterion": "Code", + "sortcriterion": "Code", + "type": "Alle", + "pagelength": "100", + "language": "de" + }, + "List": [ + { + "Code": "CC13A2", + "Content": "Verwendungszwecke des Individualkonsums, 2-Steller", + "Type": "sachlich", + "Values": "-1", + "Information": "true" + }, + { + "Code": "CC13A3", + "Content": "Verwendungszwecke des Individualkonsums, 3-Steller", + "Type": "sachlich", + "Values": "-1", + "Information": "true" + }, + { + "Code": "CC13A4", + "Content": "Verwendungszwecke des Individualkonsums, 4-Steller", + "Type": "sachlich", + "Values": "-1", + "Information": "true" + }, + { + "Code": "CC13A5", + "Content": "Verwendungszwecke des Individualkonsums, 5-Steller", + "Type": "sachlich", + "Values": "-1", + "Information": "true" + }, + { + "Code": "CC13B1", + "Content": "Verwendungszw.d.Individualkonsums,Sonderpositionen", + "Type": "sachlich", + "Values": "-1", + "Information": "true" + }, + { + "Code": "CC13Z1", + "Content": "Verwendungszwecke des Individualkonsums,10-Steller", + "Type": "sachlich", + "Values": "-1", + "Information": "true" + }, + { + "Code": "DINSG", + "Content": "Deutschland insgesamt", + "Type": "räumlich insgesamt", + "Values": "-1", + "Information": "false" + }, + { + "Code": "DLAND", + "Content": "Bundesländer", + "Type": "räumlich", + "Values": "-1", + "Information": "true" + }, + { + "Code": "JAHR", + "Content": "Jahr", + "Type": "zeitidentifizierend", + "Values": "-1", + "Information": "false" + }, + { + "Code": "MONAT", + "Content": "Monate", + "Type": "zeitlich", + "Values": "-1", + "Information": "false" + }, + { + "Code": "PRE034", + "Content": "Index der Nettokaltmieten", + "Type": "Wert", + "Values": "-1", + "Information": "false" + }, + { + "Code": "PRE999", + "Content": "Gewichtung", + "Type": "Wert", + "Values": "-1", + "Information": "false" + }, + { + "Code": "PREIS1", + "Content": "Verbraucherpreisindex", + "Type": "Wert", + "Values": "-1", + "Information": "true" + } + ], + "Copyright": "© Statistisches Bundesamt (Destatis), 2024" +} diff --git a/tests/testthat/xy_statistic2/api/catalogue/tables2statistic-30c942.json b/tests/testthat/xy_statistic2/api/catalogue/tables2statistic-30c942.json new file mode 100644 index 0000000..d0c38cb --- /dev/null +++ b/tests/testthat/xy_statistic2/api/catalogue/tables2statistic-30c942.json @@ -0,0 +1,78 @@ +{ + "Ident": { + "Service": "catalogue", + "Method": "tables2statistic" + }, + "Status": { + "Code": 0, + "Content": "erfolgreich", + "Type": "Information" + }, + "Parameter": { + "username": "********************", + "password": "********************", + "name": "61111", + "selection": "", + "area": "Alle", + "pagelength": "100", + "language": "de" + }, + "List": [ + { + "Code": "61111-0001", + "Content": "Verbraucherpreisindex: Deutschland, Jahre", + "Time": "1991 - 2023" + }, + { + "Code": "61111-0002", + "Content": "Verbraucherpreisindex: Deutschland, Monate", + "Time": "Januar 1991 - Mai 2024" + }, + { + "Code": "61111-0003", + "Content": "Verbraucherpreisindex: Deutschland, Jahre,\nKlassifikation der Verwendungszwecke des Individualkonsums\n(COICOP 2-5-Steller Hierarchie)", + "Time": "1991 - 2023" + }, + { + "Code": "61111-0004", + "Content": "Verbraucherpreisindex: Deutschland, Monate,\nKlassifikation der Verwendungszwecke des Individualkonsums\n(COICOP 2-5-Steller Hierarchie)", + "Time": "Januar 1991 - Mai 2024" + }, + { + "Code": "61111-0005", + "Content": "Verbraucherpreisindex: Deutschland, Jahre,\nKlassifikation der Verwendungszwecke des Individualkonsums\n(COICOP 2-/3-/4-/5-/10-Steller/Sonderpositionen)", + "Time": "1991 - 2023" + }, + { + "Code": "61111-0006", + "Content": "Verbraucherpreisindex: Deutschland, Monate,\nKlassifikation der Verwendungszwecke des Individualkonsums\n(COICOP 2-/3-/4-/5-/10-Steller/Sonderpositionen)", + "Time": "Januar 1991 - Mai 2024" + }, + { + "Code": "61111-0007", + "Content": "Wägungsschema des Verbraucherpreisindex: Deutschland, Jahre,\nKlassifikation der Verwendungszwecke des Individualkonsums\n(COICOP 2-5-Steller Hierarchie)", + "Time": "2020 - 2020" + }, + { + "Code": "61111-0010", + "Content": "Verbraucherpreisindex: Bundesländer, Jahre", + "Time": "1995 - 2023" + }, + { + "Code": "61111-0011", + "Content": "Verbraucherpreisindex: Bundesländer, Monate", + "Time": "Januar 1995 - Mai 2024" + }, + { + "Code": "61111-0020", + "Content": "Index der Nettokaltmieten: Bundesländer, Jahre", + "Time": "2005 - 2023" + }, + { + "Code": "61111-0021", + "Content": "Index der Nettokaltmieten: Bundesländer, Monate", + "Time": "Januar 2005 - Mai 2024" + } + ], + "Copyright": "© Statistisches Bundesamt (Destatis), 2024" +} diff --git a/tests/testthat/xy_statistic3/api/catalogue/tables2statistic-30c942.json b/tests/testthat/xy_statistic3/api/catalogue/tables2statistic-30c942.json new file mode 100644 index 0000000..d0c38cb --- /dev/null +++ b/tests/testthat/xy_statistic3/api/catalogue/tables2statistic-30c942.json @@ -0,0 +1,78 @@ +{ + "Ident": { + "Service": "catalogue", + "Method": "tables2statistic" + }, + "Status": { + "Code": 0, + "Content": "erfolgreich", + "Type": "Information" + }, + "Parameter": { + "username": "********************", + "password": "********************", + "name": "61111", + "selection": "", + "area": "Alle", + "pagelength": "100", + "language": "de" + }, + "List": [ + { + "Code": "61111-0001", + "Content": "Verbraucherpreisindex: Deutschland, Jahre", + "Time": "1991 - 2023" + }, + { + "Code": "61111-0002", + "Content": "Verbraucherpreisindex: Deutschland, Monate", + "Time": "Januar 1991 - Mai 2024" + }, + { + "Code": "61111-0003", + "Content": "Verbraucherpreisindex: Deutschland, Jahre,\nKlassifikation der Verwendungszwecke des Individualkonsums\n(COICOP 2-5-Steller Hierarchie)", + "Time": "1991 - 2023" + }, + { + "Code": "61111-0004", + "Content": "Verbraucherpreisindex: Deutschland, Monate,\nKlassifikation der Verwendungszwecke des Individualkonsums\n(COICOP 2-5-Steller Hierarchie)", + "Time": "Januar 1991 - Mai 2024" + }, + { + "Code": "61111-0005", + "Content": "Verbraucherpreisindex: Deutschland, Jahre,\nKlassifikation der Verwendungszwecke des Individualkonsums\n(COICOP 2-/3-/4-/5-/10-Steller/Sonderpositionen)", + "Time": "1991 - 2023" + }, + { + "Code": "61111-0006", + "Content": "Verbraucherpreisindex: Deutschland, Monate,\nKlassifikation der Verwendungszwecke des Individualkonsums\n(COICOP 2-/3-/4-/5-/10-Steller/Sonderpositionen)", + "Time": "Januar 1991 - Mai 2024" + }, + { + "Code": "61111-0007", + "Content": "Wägungsschema des Verbraucherpreisindex: Deutschland, Jahre,\nKlassifikation der Verwendungszwecke des Individualkonsums\n(COICOP 2-5-Steller Hierarchie)", + "Time": "2020 - 2020" + }, + { + "Code": "61111-0010", + "Content": "Verbraucherpreisindex: Bundesländer, Jahre", + "Time": "1995 - 2023" + }, + { + "Code": "61111-0011", + "Content": "Verbraucherpreisindex: Bundesländer, Monate", + "Time": "Januar 1995 - Mai 2024" + }, + { + "Code": "61111-0020", + "Content": "Index der Nettokaltmieten: Bundesländer, Jahre", + "Time": "2005 - 2023" + }, + { + "Code": "61111-0021", + "Content": "Index der Nettokaltmieten: Bundesländer, Monate", + "Time": "Januar 2005 - Mai 2024" + } + ], + "Copyright": "© Statistisches Bundesamt (Destatis), 2024" +} diff --git a/tests/testthat/xy_variable1/api/catalogue/statistics2variable-93dc8a.json b/tests/testthat/xy_variable1/api/catalogue/statistics2variable-93dc8a.json new file mode 100644 index 0000000..3c4029d --- /dev/null +++ b/tests/testthat/xy_variable1/api/catalogue/statistics2variable-93dc8a.json @@ -0,0 +1,625 @@ +{ + "Ident": { + "Service": "catalogue", + "Method": "statistics2variable" + }, + "Status": { + "Code": 0, + "Content": "erfolgreich", + "Type": "Information" + }, + "Parameter": { + "username": "********************", + "password": "********************", + "name": "DLAND", + "selection": "", + "area": "Alle", + "searchcriterion": "Code", + "sortcriterion": "Code", + "pagelength": "100", + "language": "de" + }, + "List": [ + { + "Code": "11111", + "Content": "Feststellung des Gebietsstands", + "Cubes": "3", + "Information": "true" + }, + { + "Code": "12111", + "Content": "Zensus", + "Cubes": "0", + "Information": "true" + }, + { + "Code": "12211", + "Content": "Mikrozensus", + "Cubes": "487", + "Information": "true" + }, + { + "Code": "12231", + "Content": "IKT-Nutzung in privaten Haushalten", + "Cubes": "44", + "Information": "true" + }, + { + "Code": "12251", + "Content": "Arbeitsmarktstatistik des Mikrozensus", + "Cubes": "60", + "Information": "false" + }, + { + "Code": "12411", + "Content": "Fortschreibung des Bevölkerungsstandes", + "Cubes": "28", + "Information": "true" + }, + { + "Code": "12421", + "Content": "Bevölkerungsvorausberechnungen", + "Cubes": "16", + "Information": "true" + }, + { + "Code": "12521", + "Content": "Ausländerstatistik", + "Cubes": "98", + "Information": "true" + }, + { + "Code": "12531", + "Content": "Statistik über Schutzsuchende", + "Cubes": "78", + "Information": "true" + }, + { + "Code": "12611", + "Content": "Statistik der Eheschließungen", + "Cubes": "7", + "Information": "true" + }, + { + "Code": "12612", + "Content": "Statistik der Geburten", + "Cubes": "37", + "Information": "true" + }, + { + "Code": "12613", + "Content": "Statistik der Sterbefälle", + "Cubes": "17", + "Information": "true" + }, + { + "Code": "12621", + "Content": "Sterbetafeln", + "Cubes": "3", + "Information": "true" + }, + { + "Code": "12631", + "Content": "Statistik rechtskräftiger Urteile in Ehesachen", + "Cubes": "6", + "Information": "true" + }, + { + "Code": "12651", + "Content": "Begründung von Lebenspartnerschaften", + "Cubes": "3", + "Information": "true" + }, + { + "Code": "12661", + "Content": "Aufhebung von Lebenspartnerschaften", + "Cubes": "4", + "Information": "true" + }, + { + "Code": "12711", + "Content": "Wanderungsstatistik", + "Cubes": "65", + "Information": "true" + }, + { + "Code": "13111", + "Content": "Statistik d. sozialversicherungspfl. Beschäftigten", + "Cubes": "13", + "Information": "true" + }, + { + "Code": "13211", + "Content": "Arbeitsmarktstatistik der Bundesagentur für Arbeit", + "Cubes": "16", + "Information": "true" + }, + { + "Code": "13311", + "Content": "Länderberechnung Erwerbstätige", + "Cubes": "4", + "Information": "true" + }, + { + "Code": "14111", + "Content": "Allgemeine Bundestagswahlstatistik", + "Cubes": "4", + "Information": "true" + }, + { + "Code": "14121", + "Content": "Repräsentative Bundestagswahlstatistik", + "Cubes": "10", + "Information": "true" + }, + { + "Code": "14211", + "Content": "Allgemeine Europawahlstatistik", + "Cubes": "2", + "Information": "true" + }, + { + "Code": "14221", + "Content": "Repräsentative Europawahlstatistik", + "Cubes": "4", + "Information": "true" + }, + { + "Code": "21111", + "Content": "Statistik der allgemeinbildenden Schulen", + "Cubes": "96", + "Information": "true" + }, + { + "Code": "21121", + "Content": "Statistik der beruflichen Schulen", + "Cubes": "36", + "Information": "true" + }, + { + "Code": "21211", + "Content": "Berufsbildungsstatistik", + "Cubes": "48", + "Information": "true" + }, + { + "Code": "21241", + "Content": "Pflegeausbildungsstatistik", + "Cubes": "18", + "Information": "true" + }, + { + "Code": "21311", + "Content": "Statistik der Studenten", + "Cubes": "48", + "Information": "true" + }, + { + "Code": "21321", + "Content": "Statistik der Prüfungen", + "Cubes": "5", + "Information": "true" + }, + { + "Code": "21351", + "Content": "Statistik der Habilitationen", + "Cubes": "6", + "Information": "true" + }, + { + "Code": "21352", + "Content": "Statistik der Promovierenden", + "Cubes": "28", + "Information": "true" + }, + { + "Code": "21353", + "Content": "Statistik der Hochschulräte", + "Cubes": "8", + "Information": "true" + }, + { + "Code": "21354", + "Content": "Statistik der Berufsakademien", + "Cubes": "10", + "Information": "true" + }, + { + "Code": "21371", + "Content": "Hochschulfinanzstatistik", + "Cubes": "8", + "Information": "true" + }, + { + "Code": "21381", + "Content": "Hochschulstatistische Kennzahlen", + "Cubes": "11", + "Information": "false" + }, + { + "Code": "21411", + "Content": "Statistik der Bundesausbildungsförderung (BAföG)", + "Cubes": "51", + "Information": "true" + }, + { + "Code": "21421", + "Content": "Statistik der Aufstiegsfortbildungsförderung", + "Cubes": "30", + "Information": "true" + }, + { + "Code": "21431", + "Content": "Förderung nach dem Stipendienprogramm-Gesetz", + "Cubes": "37", + "Information": "true" + }, + { + "Code": "21611", + "Content": "Kulturstatistik", + "Cubes": "24", + "Information": "true" + }, + { + "Code": "21621", + "Content": "Berichterstattung über öffentliche Kulturausgaben", + "Cubes": "6", + "Information": "true" + }, + { + "Code": "21711", + "Content": "Bildungsberichterstattung für nationale Zwecke", + "Cubes": "13", + "Information": "false" + }, + { + "Code": "21821", + "Content": "Berichterstattung über Forschung und Entwicklung", + "Cubes": "5", + "Information": "false" + }, + { + "Code": "22111", + "Content": "Statistik d. Ausgaben u. Einnahmen der Sozialhilfe", + "Cubes": "36", + "Information": "true" + }, + { + "Code": "22121", + "Content": "Statistik d. Empfänger v. Hilfe z. Lebensunterhalt", + "Cubes": "26", + "Information": "true" + }, + { + "Code": "22131", + "Content": "Statistik d. Empfänger v. Leist.(5.-9.Kap.SGB XII)", + "Cubes": "20", + "Information": "true" + }, + { + "Code": "22151", + "Content": "Grundsicherung im Alter und bei Erwerbsminderung", + "Cubes": "98", + "Information": "true" + }, + { + "Code": "22161", + "Content": "Statistik der Empf. v.Eingliederungshilfe (SGB IX)", + "Cubes": "24", + "Information": "true" + }, + { + "Code": "22162", + "Content": "Stat.d.Ausg.u.Einn.d.Eingliederungshilfe (SGB IX)", + "Cubes": "3", + "Information": "true" + }, + { + "Code": "22211", + "Content": "Ausgaben und Einnahmen für Asylbewerberleistungen", + "Cubes": "12", + "Information": "true" + }, + { + "Code": "22221", + "Content": "Statistik der Empfänger von Asylbewerberleistungen", + "Cubes": "91", + "Information": "true" + }, + { + "Code": "22231", + "Content": "Stat.d. Empfänger von besonderen Asylbewerberlstg.", + "Cubes": "6", + "Information": "true" + }, + { + "Code": "22311", + "Content": "Wohngeld zum 31.12.", + "Cubes": "23", + "Information": "true" + }, + { + "Code": "22411", + "Content": "Statistik über ambulante Pflegeeinrichtungen", + "Cubes": "21", + "Information": "true" + }, + { + "Code": "22412", + "Content": "Statistik über stationäre Pflegeeinrichtungen", + "Cubes": "23", + "Information": "true" + }, + { + "Code": "22421", + "Content": "Statistik über d. Empfänger v.Pflegegeldleistungen", + "Cubes": "19", + "Information": "true" + }, + { + "Code": "22517", + "Content": "Statistik der erzieherischen Hilfen", + "Cubes": "12", + "Information": "true" + }, + { + "Code": "22518", + "Content": "Stat. ü. d. Schutzauftrag bei Kindeswohlgefährdung", + "Cubes": "26", + "Information": "true" + }, + { + "Code": "22521", + "Content": "Statistik der Adoptionen", + "Cubes": "22", + "Information": "true" + }, + { + "Code": "22522", + "Content": "Statistik der Pflegeerlaubnis, Vormundschaften etc", + "Cubes": "13", + "Information": "true" + }, + { + "Code": "22523", + "Content": "Statistik der vorläufigen Schutzmaßnahmen", + "Cubes": "31", + "Information": "true" + }, + { + "Code": "22541", + "Content": "Kinder und tätige Personen in Tageseinrichtungen", + "Cubes": "67", + "Information": "true" + }, + { + "Code": "22542", + "Content": "Statistik der Träger der Jugendhilfe", + "Cubes": "29", + "Information": "true" + }, + { + "Code": "22543", + "Content": "Kinder und tätige Personen in Kindertagespflege", + "Cubes": "29", + "Information": "true" + }, + { + "Code": "22551", + "Content": "Ausgaben und Einnahmen der Kinder- und Jugendhilfe", + "Cubes": "20", + "Information": "true" + }, + { + "Code": "22922", + "Content": "Statistik zum Elterngeld", + "Cubes": "98", + "Information": "true" + }, + { + "Code": "22923", + "Content": "Statistik zum Betreuungsgeld", + "Cubes": "3", + "Information": "true" + }, + { + "Code": "22971", + "Content": "Statistik untergebrachter wohnungsloser Personen", + "Cubes": "107", + "Information": "true" + }, + { + "Code": "23131", + "Content": "Diagnosen der Krankenhauspatienten", + "Cubes": "70", + "Information": "true" + }, + { + "Code": "23141", + "Content": "Fallpauschalenbezogene Krankenhausstatistik (DRG)", + "Cubes": "88", + "Information": "true" + }, + { + "Code": "23311", + "Content": "Statistik der Schwangerschaftsabbrüche", + "Cubes": "12", + "Information": "true" + }, + { + "Code": "24111", + "Content": "Statistik der Zahl der Gerichte", + "Cubes": "1", + "Information": "true" + }, + { + "Code": "24211", + "Content": "Statistik bei den Staats- und Amtsanwaltschaften", + "Cubes": "6", + "Information": "true" + }, + { + "Code": "24221", + "Content": "Statistik über Straf- und Bußgeldverfahren", + "Cubes": "6", + "Information": "true" + }, + { + "Code": "24231", + "Content": "Statistik über Zivilsachen", + "Cubes": "4", + "Information": "true" + }, + { + "Code": "24241", + "Content": "Statistik über Familiensachen", + "Cubes": "6", + "Information": "true" + }, + { + "Code": "24251", + "Content": "Statistik in der Verwaltungsgerichtsbarkeit", + "Cubes": "4", + "Information": "true" + }, + { + "Code": "24261", + "Content": "Statistik in der Finanzgerichtsbarkeit", + "Cubes": "4", + "Information": "true" + }, + { + "Code": "24271", + "Content": "Statistik in der Sozialgerichtsbarkeit", + "Cubes": "4", + "Information": "true" + }, + { + "Code": "24281", + "Content": "Statistik in der Arbeitsgerichtsbarkeit", + "Cubes": "4", + "Information": "true" + }, + { + "Code": "24321", + "Content": "Strafvollzugsstatistik", + "Cubes": "3", + "Information": "true" + }, + { + "Code": "31111", + "Content": "Statistik der Baugenehmigungen", + "Cubes": "29", + "Information": "true" + }, + { + "Code": "31121", + "Content": "Statistik der Baufertigstellungen", + "Cubes": "7", + "Information": "true" + }, + { + "Code": "31131", + "Content": "Statistik des Bauüberhangs", + "Cubes": "8", + "Information": "true" + }, + { + "Code": "31141", + "Content": "Statistik des Bauabgangs", + "Cubes": "8", + "Information": "true" + }, + { + "Code": "31231", + "Content": "Fortschreibung Wohngebäude- und Wohnungsbestand", + "Cubes": "25", + "Information": "true" + }, + { + "Code": "32111", + "Content": "Erhebung der Abfallentsorgung", + "Cubes": "8", + "Information": "true" + }, + { + "Code": "32121", + "Content": "Erhebung der öffentlich-rechtl. Abfallentsorgung", + "Cubes": "5", + "Information": "true" + }, + { + "Code": "32131", + "Content": "Erh. d. Einsammlung v. Transport- u.Umverpackungen", + "Cubes": "6", + "Information": "true" + }, + { + "Code": "32136", + "Content": "Erhebung über zurückgenommene Verkaufsverpackungen", + "Cubes": "10", + "Information": "true" + }, + { + "Code": "32141", + "Content": "Aufbereitung,Verwertung v. Bau- u. Abbruchabfällen", + "Cubes": "7", + "Information": "true" + }, + { + "Code": "32151", + "Content": "Erhebung der gefährlichen Abfälle", + "Cubes": "12", + "Information": "true" + }, + { + "Code": "32161", + "Content": "Erhebung über die Abfallerzeugung", + "Cubes": "6", + "Information": "true" + }, + { + "Code": "32211", + "Content": "Erhebung der öffentlichen Wasserversorgung", + "Cubes": "4", + "Information": "true" + }, + { + "Code": "32212", + "Content": "Erhebung der öffentlichen Abwasserentsorgung", + "Cubes": "2", + "Information": "true" + }, + { + "Code": "32213", + "Content": "Erhebung der öffentlichen Abwasserbehandlung", + "Cubes": "4", + "Information": "true" + }, + { + "Code": "32214", + "Content": "Erhebung der öff. Abwasserentsorgung - Klärschlamm", + "Cubes": "1", + "Information": "true" + }, + { + "Code": "32221", + "Content": "Erh. nichtöff. Wasserversorgung,Abwasserentsorgung", + "Cubes": "12", + "Information": "true" + }, + { + "Code": "32251", + "Content": "Wassereigenversorgung u.-entsorgung priv.Haushalte", + "Cubes": "1", + "Information": "true" + }, + { + "Code": "32331", + "Content": "Erh. der Anlagen zum Umgang mit wassergef. Stoffen", + "Cubes": "40", + "Information": "true" + } + ], + "Copyright": "© Statistisches Bundesamt (Destatis), 2024" +} diff --git a/tests/testthat/xy_variable1/api/catalogue/tables2variable-93dc8a.json b/tests/testthat/xy_variable1/api/catalogue/tables2variable-93dc8a.json new file mode 100644 index 0000000..9d1e0e0 --- /dev/null +++ b/tests/testthat/xy_variable1/api/catalogue/tables2variable-93dc8a.json @@ -0,0 +1,523 @@ +{ + "Ident": { + "Service": "catalogue", + "Method": "tables2variable" + }, + "Status": { + "Code": 0, + "Content": "erfolgreich", + "Type": "Information" + }, + "Parameter": { + "username": "********************", + "password": "********************", + "name": "DLAND", + "selection": "", + "area": "Alle", + "pagelength": "100", + "language": "de" + }, + "List": [ + { + "Code": "11111-0001", + "Content": "Gebietsfläche: Bundesländer, Stichtag", + "Time": "31.12.1995 - 31.12.2022" + }, + { + "Code": "12211-0902", + "Content": "Bevölkerung in Gemeinschaftsunterkünften: Bundesländer,\nJahre, Hauptstatus, Geschlecht, Altersgruppen", + "Time": "2017 - 2023" + }, + { + "Code": "12211-0903", + "Content": "Bevölkerung in Gemeinschaftsunterkünften: Bundesländer,\nJahre, Art der Gemeinschaftsunterkunft, Geschlecht", + "Time": "2017 - 2023" + }, + { + "Code": "12211-1001", + "Content": "Bevölkerung, Erwerbstätige, Erwerbslose, Erwerbspersonen, Nichterwerbspersonen aus Hauptwohnsitzhaushalten: Bundesländer, Jahre, Geschlecht, Altersgruppen", + "Time": "2021 - 2023" + }, + { + "Code": "12211-1002", + "Content": "Bevölkerung, Erwerbstätige, Erwerbslose, Erwerbspersonen, Nichterwerbspersonen aus Hauptwohnsitzhaushalten: Bundesländer, Jahre, Überwiegender Lebensunterhalt, Altersgruppen", + "Time": "2023 - 2023" + }, + { + "Code": "12211-1003", + "Content": "Bevölkerung, Erwerbstätige, Erwerbslose, Erwerbspersonen,\nNichterwerbspersonen aus Hauptwohnsitzhaush.: Bundesländer,\nJahre, Geschlecht, Größenkl. persönl. monatl. Nettoeinkommen", + "Time": "2021 - 2023" + }, + { + "Code": "12211-1004", + "Content": "Erwerbstätige aus Hauptwohnsitzhaushalten: Bundesländer,\nJahre, Geschlecht, Altersgruppen, Stellung im Beruf", + "Time": "2021 - 2023" + }, + { + "Code": "12211-9004", + "Content": "Bevölkerung, Erwerbstätige, Erwerbslose, Erwerbspersonen,\nNichterwerbspersonen: Bundesländer, Jahre (bis 2019)", + "Time": "04/1991 - 2019" + }, + { + "Code": "12211-9014", + "Content": "Bevölkerung (ab 15 Jahren): Bundesländer, Jahre (bis 2019),\nGeschlecht, Allgemeine Schulausbildung", + "Time": "2005 - 2019" + }, + { + "Code": "12211-9015", + "Content": "Bevölkerung (ab 15 Jahren): Bundesländer, Jahre (bis 2019),\nGeschlecht, Beruflicher Bildungsabschluss", + "Time": "2005 - 2019" + }, + { + "Code": "12211-9033", + "Content": "Privathaushalte: Bundesländer, Jahre (bis 2019)", + "Time": "05/1970 - 2019" + }, + { + "Code": "12211-9034", + "Content": "Privathaushalte: Bundesländer, Jahre (bis 2019), Haushaltsgröße", + "Time": "04/1991 - 2019" + }, + { + "Code": "12211-9041", + "Content": "Bevölkerung in Familien/Lebensformen: Bundesländer, Jahre (bis 2019), Lebensformen", + "Time": "04/1996 - 2019" + }, + { + "Code": "12211-9044", + "Content": "Familien, Paare, Alleinerziehende: Bundesländer, Jahre (bis 2019), Vorhandensein von Kindern", + "Time": "04/1996 - 2019" + }, + { + "Code": "12211-9047", + "Content": "Ehepaare, Lebensgemeinschaften, Gemischtgeschlechtliche\nLebensgemeinschaften: Bundesländer, Jahre (bis 2019),\nVorhandensein von Kindern", + "Time": "04/1996 - 2019" + }, + { + "Code": "12211-9051", + "Content": "Alleinerziehende: Bundesländer, Jahre (bis 2019),\nGeschlecht, Vorhandensein von Kindern", + "Time": "04/1996 - 2019" + }, + { + "Code": "12211-9053", + "Content": "Alleinstehende: Bundesländer, Jahre (bis 2019), Geschlecht,\nHaushaltsgröße", + "Time": "04/1996 - 2019" + }, + { + "Code": "12211-9056", + "Content": "Ledige Kinder in Familien: Bundesländer, Jahre (bis 2019),\nFamilienformen", + "Time": "04/1996 - 2019" + }, + { + "Code": "12231-0101", + "Content": "Bevölkerung von 16 bis unter 75 Jahren in\nHauptwohnsitzhaushalten: Bundesländer, Jahre, Altersgruppen,\nPrivate Internetaktivitäten in den letzten drei Monaten", + "Time": "2022 - 2023" + }, + { + "Code": "12231-0102", + "Content": "Bevölkerung von 16 bis unter 75 Jahren in\nHauptwohnsitzhaushalten: Bundesländer, Jahre, Altersgruppen,\nPrivate Internetkäufe in den letzten drei Monaten", + "Time": "2022 - 2023" + }, + { + "Code": "12231-0103", + "Content": "Bevölkerung von 16 bis unter 75 Jahren in\nHauptwohnsitzhaushalten: Bundesländer, Jahre, Altersgruppen,\nArt der Computer- und Internetkenntnisse", + "Time": "2023 - 2023" + }, + { + "Code": "12251-0101", + "Content": "Erwerbstätige aus Hauptwohnsitzhaushalten: Bundesländer, Jahre, Geschlecht, Stellung im Beruf", + "Time": "2021 - 2023" + }, + { + "Code": "12251-0102", + "Content": "Erwerbstätige aus Hauptwohnsitzhaushalten: Bundesländer,\nJahre, Geschlecht, Stellung im Beruf, Wochenend- und\nFeiertagsarbeit", + "Time": "2021 - 2023" + }, + { + "Code": "12251-0103", + "Content": "Erwerbstätige aus Hauptwohnsitzhaushalten: Bundesländer,\nJahre, Geschlecht, Stellung im Beruf, Abend-, Nacht- und\nSchichtarbeit", + "Time": "2021 - 2023" + }, + { + "Code": "12251-0104", + "Content": "Erwerbstätige aus Hauptwohnsitzhaushalten: Bundesländer,\nJahre, Geschlecht, Stellung im Beruf, Erwerbsarbeit zu\nHause", + "Time": "2021 - 2023" + }, + { + "Code": "12251-0108", + "Content": "Abhängig Erwerbstätige aus Hauptwohnsitzhaushalten:\nBundesländer, Jahre, Geschlecht, Altersgruppen, Art des\nArbeitsvertrages", + "Time": "2021 - 2023" + }, + { + "Code": "12411-0010", + "Content": "Bevölkerung: Bundesländer, Stichtag", + "Time": "31.12.1958 - 31.12.2023" + }, + { + "Code": "12411-0011", + "Content": "Bevölkerung: Bundesländer, Stichtag, Geschlecht", + "Time": "31.12.1967 - 31.12.2023" + }, + { + "Code": "12411-0012", + "Content": "Bevölkerung: Bundesländer, Stichtag, Altersjahre", + "Time": "31.12.1967 - 31.12.2023" + }, + { + "Code": "12411-0013", + "Content": "Bevölkerung: Bundesländer, Stichtag, Geschlecht, Altersjahre", + "Time": "31.12.1967 - 31.12.2023" + }, + { + "Code": "12411-0014", + "Content": "Bevölkerung: Bundesländer, Stichtag, Nationalität,\nGeschlecht, Altersjahre", + "Time": "31.12.2000 - 31.12.2023" + }, + { + "Code": "12411-0021", + "Content": "Bevölkerung: Bundesländer, Stichtag zum Quartalsende,\nGeschlecht", + "Time": "31.03.1991 - 31.12.2023" + }, + { + "Code": "12411-0042", + "Content": "Durchschnittliche Bevölkerung: Bundesländer, Jahre,\nNationalität, Geschlecht", + "Time": "2000 - 2023" + }, + { + "Code": "12411-0050", + "Content": "Bevölkerungsdichte: Bundesländer, Stichtag", + "Time": "31.12.1995 - 31.12.2022" + }, + { + "Code": "12421-0003", + "Content": "Vorausberechneter Bevölkerungsstand: Bundesländer, Stichtag,\nVarianten der Bevölkerungsvorausberechnung", + "Time": "31.12.2022 - 31.12.2070" + }, + { + "Code": "12421-0004", + "Content": "Vorausberechneter Bevölkerungsstand: Bundesländer, Stichtag,\nVarianten der Bevölkerungsvorausberechnung, Geschlecht,\nAltersjahre", + "Time": "31.12.2022 - 31.12.2070" + }, + { + "Code": "12421-0101", + "Content": "Vorausberechnete Privathaushalte: Bundesländer, Jahre,\nVarianten der Haushaltsvorausberechnung, Haushaltsgröße", + "Time": "2019 - 2040" + }, + { + "Code": "12521-0020", + "Content": "Ausländer: Bundesländer, Stichtag, Geschlecht/Altersjahre/\nFamilienstand", + "Time": "30.09.1980 - 31.12.2023" + }, + { + "Code": "12521-0021", + "Content": "Ausländer: Bundesländer, Stichtag, Geschlecht/Altersjahre/\nFamilienstand, Ländergruppierungen/Staatsangehörigkeit", + "Time": "30.09.1980 - 31.12.2023" + }, + { + "Code": "12521-0022", + "Content": "Ausländer: Bundesländer, Stichtag, Geschlecht, Altersjahre,\nLändergruppierungen/Staatsangehörigkeit", + "Time": "31.12.1998 - 31.12.2023" + }, + { + "Code": "12521-0023", + "Content": "Ausländer: Bundesländer, Stichtag, Geschlecht, Altersjahre,\nMigrantengeneration, Ländergruppierungen/Staatsangehörigkeit", + "Time": "31.12.1998 - 31.12.2023" + }, + { + "Code": "12521-0024", + "Content": "Ausländer: Bundesländer, Stichtag, Geschlecht,\nFamilienstand, Ländergruppierungen/Staatsangehörigkeit", + "Time": "31.12.1998 - 31.12.2023" + }, + { + "Code": "12521-0025", + "Content": "Ausländer: Bundesländer, Stichtag, Geschlecht,\nAufenthaltsdauer/Aufenthaltsdauer (Abgrenzung\nEinbürgerungen), Ländergruppierungen/Staatsangehörigkeit", + "Time": "31.12.1998 - 31.12.2023" + }, + { + "Code": "12521-0026", + "Content": "Ausländer: Bundesländer, Stichtag, Geschlecht,\nAufenthaltstitel/Ausgewählte Aufenthaltstitel,\nLändergruppierungen/Staatsangehörigkeit", + "Time": "31.12.1998 - 31.12.2023" + }, + { + "Code": "12521-0027", + "Content": "Ausländer: Bundesländer, Jahre, Geschlecht,\nRegisterbewegungen (regional), Ländergruppierungen/\nStaatsangehörigkeit", + "Time": "2013 - 2023" + }, + { + "Code": "12521-0028", + "Content": "Ausländer: Bundesländer, Jahre, Geschlecht, Altersjahre,\nRegisterzu- und abgänge (regional), Ländergruppierungen/\nStaatsangehörigkeit", + "Time": "2013 - 2023" + }, + { + "Code": "12521-0029", + "Content": "Ausländer: Bundesländer, Jahre, Geschlecht,\nAufenthaltsdauer, Registerabgänge (regional),\nLändergruppierungen/Staatsangehörigkeit", + "Time": "2013 - 2023" + }, + { + "Code": "12521-0030", + "Content": "Durchschnittsalter der Ausländer: Bundesländer, Stichtag,\nGeschlecht, Ländergruppierungen/Staatsangehörigkeit", + "Time": "31.12.1998 - 31.12.2023" + }, + { + "Code": "12521-0031", + "Content": "Durchschnittliche Aufenthaltsdauer der Ausländer:\nBundesländer, Stichtag, Geschlecht, Ländergruppierungen/\nStaatsangehörigkeit", + "Time": "31.12.1998 - 31.12.2023" + }, + { + "Code": "12531-0020", + "Content": "Schutzsuchende: Bundesländer, Stichtag, Geschlecht/\nAltersjahre/Familienstand", + "Time": "31.12.2007 - 31.12.2023" + }, + { + "Code": "12531-0021", + "Content": "Schutzsuchende: Bundesländer, Stichtag, Geschlecht/\nAltersjahre/Familienstand, Ländergruppierungen/\nStaatsangehörigkeit", + "Time": "31.12.2007 - 31.12.2023" + }, + { + "Code": "12531-0022", + "Content": "Schutzsuchende: Bundesländer, Stichtag, Geschlecht,\nAltersjahre, Ländergruppierungen/Staatsangehörigkeit", + "Time": "31.12.2007 - 31.12.2023" + }, + { + "Code": "12531-0023", + "Content": "Schutzsuchende: Bundesländer, Stichtag, Geschlecht,\nAltersjahre, Migrantengeneration, Ländergruppierungen\n/Staatsangehörigkeit", + "Time": "31.12.2007 - 31.12.2023" + }, + { + "Code": "12531-0024", + "Content": "Schutzsuchende: Bundesländer, Stichtag, Geschlecht,\nFamilienstand, Ländergruppierungen/Staatsangehörigkeit", + "Time": "31.12.2007 - 31.12.2023" + }, + { + "Code": "12531-0025", + "Content": "Schutzsuchende: Bundesländer, Stichtag, Geschlecht,\nAufenthaltsdauer/Aufenthaltsdauer (Abgrenzung\nEinbürgerungen), Ländergruppierungen/Staatsangehörigkeit", + "Time": "31.12.2007 - 31.12.2023" + }, + { + "Code": "12531-0026", + "Content": "Schutzsuchende: Bundesländer, Stichtag, Geschlecht,\nSchutzstatus/Schutzstatuskategorie, Ländergruppierungen/\nStaatsangehörigkeit", + "Time": "31.12.2007 - 31.12.2023" + }, + { + "Code": "12531-0027", + "Content": "Durchschnittsalter der Schutzsuchenden: Bundesländer,\nStichtag, Geschlecht, Ländergruppierungen/\nStaatsangehörigkeit", + "Time": "31.12.2007 - 31.12.2023" + }, + { + "Code": "12531-0028", + "Content": "Durchschnittliche Aufenthaltsdauer der Schutzsuchenden:\nBundesländer, Stichtag, Geschlecht, Ländergruppierungen/\nStaatsangehörigkeit", + "Time": "31.12.2007 - 31.12.2023" + }, + { + "Code": "12611-0010", + "Content": "Eheschließungen: Bundesländer, Jahre", + "Time": "1990 - 2023" + }, + { + "Code": "12611-0011", + "Content": "Eheschließungen: Bundesländer, Monate", + "Time": "Januar 1990 - März 2024" + }, + { + "Code": "12612-0100", + "Content": "Lebendgeborene: Bundesländer, Jahre, Geschlecht", + "Time": "1990 - 2023" + }, + { + "Code": "12612-0101", + "Content": "Lebendgeborene: Bundesländer, Monate, Geschlecht", + "Time": "Januar 1990 - März 2024" + }, + { + "Code": "12612-0102", + "Content": "Lebendgeborene: Bundesländer, Jahre, Familienstand der\nEltern", + "Time": "1991 - 2023" + }, + { + "Code": "12612-0103", + "Content": "Lebendgeborene: Bundesländer, Jahre, Staatsangehörigkeit des\nKindes und der Eltern", + "Time": "1990 - 2023" + }, + { + "Code": "12612-0104", + "Content": "Zusammengefasste Geburtenziffern (je Frau): Bundesländer,\nJahre, Altersgruppen", + "Time": "1991 - 2022" + }, + { + "Code": "12612-0105", + "Content": "Nettoreproduktionsrate: Bundesländer, Jahre (bis 2010),\nAltersgruppen", + "Time": "2004 - 2010" + }, + { + "Code": "12612-0106", + "Content": "Totgeborene: Bundesländer, Jahre", + "Time": "1990 - 2023" + }, + { + "Code": "12613-0010", + "Content": "Gestorbene: Bundesländer, Jahre", + "Time": "1990 - 2023" + }, + { + "Code": "12613-0011", + "Content": "Gestorbene: Bundesländer, Jahre, Geschlecht", + "Time": "1990 - 2023" + }, + { + "Code": "12613-0012", + "Content": "Gestorbene: Bundesländer, Monate", + "Time": "Januar 1990 - Mai 2024" + }, + { + "Code": "12613-0013", + "Content": "Gestorbene: Bundesländer, Monate, Geschlecht", + "Time": "Januar 1990 - Mai 2024" + }, + { + "Code": "12621-0004", + "Content": "Durchschnittliche Lebenserwartung bei Geburt\n(Periodensterbetafel): Bundesländer, Jahre, Geschlecht", + "Time": "2002/04 - 2020/22" + }, + { + "Code": "12631-0010", + "Content": "Ehescheidungen: Bundesländer, Jahre", + "Time": "1990 - 2023" + }, + { + "Code": "12631-0011", + "Content": "Ehescheidungen: Bundesländer, Jahre, Ehedauer", + "Time": "1997 - 2023" + }, + { + "Code": "12631-0012", + "Content": "Ehescheidungen: Bundesländer, Jahre, Gemeinsame\nminderjährige Kinder", + "Time": "1997 - 2023" + }, + { + "Code": "12651-0003", + "Content": "Begründungen von Lebenspartnerschaften: Bundesländer, Jahre (bis 2017), Geschlecht", + "Time": "2014 - 2017" + }, + { + "Code": "12661-0002", + "Content": "Aufhebungen von Lebenspartnerschaften: Bundesländer, Jahre,\nGeschlecht", + "Time": "2014 - 2023" + }, + { + "Code": "12711-0020", + "Content": "Gesamtwanderungen über die Grenzen der Bundesländer: Bundesländer, Jahre, Nationalität, Geschlecht", + "Time": "2000 - 2023" + }, + { + "Code": "12711-0021", + "Content": "Wanderungen zwischen den Bundesländern: Bundesländer, Jahre, Nationalität, Geschlecht", + "Time": "2000 - 2023" + }, + { + "Code": "12711-0023", + "Content": "Wanderungen zwischen Deutschland und dem Ausland:\nBundesländer, Jahre, Nationalität, Geschlecht", + "Time": "2000 - 2023" + }, + { + "Code": "13111-0005", + "Content": "Sozialversicherungspflichtig Beschäftigte am Arbeitsort:\nBundesländer, Stichtag, Geschlecht", + "Time": "31.03.2008 - 30.09.2023" + }, + { + "Code": "13111-0006", + "Content": "Sozialversicherungspflichtig Beschäftigte am Arbeitsort:\nBundesländer, Stichtag, Wirtschaftsabschnitte", + "Time": "31.03.2008 - 30.09.2023" + }, + { + "Code": "13211-0007", + "Content": "Arbeitslose, Arbeitslosenquoten, Gemeldete Arbeitsstellen:\nBundesländer, Jahre", + "Time": "1991 - 2023" + }, + { + "Code": "13211-0008", + "Content": "Arbeitslose, Arbeitslosenquoten, Gemeldete Arbeitsstellen:\nBundesländer, Monate", + "Time": "Januar 2005 - Juni 2024" + }, + { + "Code": "13211-0009", + "Content": "Arbeitslose: Bundesländer, Jahre, Geschlecht", + "Time": "1991 - 2022" + }, + { + "Code": "13211-0010", + "Content": "Arbeitslose: Bundesländer, Monate, Geschlecht", + "Time": "Januar 2005 - Juni 2024" + }, + { + "Code": "13211-0011", + "Content": "Arbeitslosenquote aller zivilen Erwerbspersonen:\nBundesländer, Jahre, Geschlecht", + "Time": "1991 - 2022" + }, + { + "Code": "13211-0012", + "Content": "Arbeitslosenquote aller zivilen Erwerbspersonen:\nBundesländer, Monate, Geschlecht", + "Time": "Januar 2005 - Juni 2024" + }, + { + "Code": "13311-0002", + "Content": "Erwerbstätige, Arbeitnehmer, Selbständige und mithelfende\nFamilienangehörige (im Inland): Bundesländer, Jahre,\nWirtschaftszweige", + "Time": "1991 - 2023" + }, + { + "Code": "14111-0003", + "Content": "Wahlberechtigte, Wähler, Wahlbeteiligung, Erststimmen,\nZweitstimmen (Allgemeine Bundestagswahlstatistik):\nBundesländer, Stichtag", + "Time": "22.09.2013 - 26.09.2021" + }, + { + "Code": "14111-0004", + "Content": "Gültige Erststimmen, gültige Zweitstimmen (Allgemeine\nBundestagswahlstatistik): Bundesländer, Stichtag, Parteien", + "Time": "22.09.2013 - 26.09.2021" + }, + { + "Code": "14121-0004", + "Content": "Gültige Zweitstimmen (Repräsentative\nBundestagswahlstatistik): Bundesländer, Stichtag, Parteien,\nGeschlecht", + "Time": "22.09.2002 - 26.09.2021" + }, + { + "Code": "14121-0005", + "Content": "Gültige Zweitstimmen (Repräsentative\nBundestagswahlstatistik): Bundesländer, Stichtag, Parteien,\nAltersgruppen", + "Time": "22.09.2013 - 26.09.2021" + }, + { + "Code": "14121-0006", + "Content": "Gültige Zweitstimmen (Repräsentative\nBundestagswahlstatistik): Bundesländer, Stichtag, Parteien,\nGeschlecht, Altersgruppen", + "Time": "22.09.2013 - 26.09.2021" + }, + { + "Code": "14211-0002", + "Content": "Gültige Stimmen (Allgemeine Europawahlstatistik):\nBundesländer, Stichtag, Parteien", + "Time": "12.06.1994 - 09.06.2024" + }, + { + "Code": "14221-0002", + "Content": "Anteil gültiger Stimmen (Repräsentative\nEuropawahlstatistik): Bundesländer, Stichtag, Parteien,\nGeschlecht, Altersgruppen", + "Time": "25.05.2014 - 26.05.2019" + }, + { + "Code": "21111-0010", + "Content": "Schüler, Schulanfänger, Absolventen und Abgänger:\nBundesländer, Schuljahr, Geschlecht", + "Time": "1997/98 - 2022/23" + }, + { + "Code": "21111-0011", + "Content": "Schüler: Bundesländer, Schuljahr, Geschlecht, Schulart,\nJahrgangsstufen", + "Time": "1998/99 - 2022/23" + }, + { + "Code": "21111-0012", + "Content": "Schulanfänger: Bundesländer, Schuljahr, Geschlecht, Schulart, Einschulungsart", + "Time": "1999/00 - 2022/23" + }, + { + "Code": "21111-0013", + "Content": "Absolventen und Abgänger: Bundesländer, Schuljahr,\nGeschlecht, Schulart, Schulabschlüsse", + "Time": "1997/98 - 2021/22" + } + ], + "Copyright": "© Statistisches Bundesamt (Destatis), 2024" +} diff --git a/tests/testthat/xy_variable1/api/catalogue/timeseries2variable-93dc8a.json b/tests/testthat/xy_variable1/api/catalogue/timeseries2variable-93dc8a.json new file mode 100644 index 0000000..d0ed62a --- /dev/null +++ b/tests/testthat/xy_variable1/api/catalogue/timeseries2variable-93dc8a.json @@ -0,0 +1,823 @@ +{ + "Ident": { + "Service": "catalogue", + "Method": "timeseries2variable" + }, + "Status": { + "Code": 0, + "Content": "erfolgreich", + "Type": "Information" + }, + "Parameter": { + "username": "********************", + "password": "********************", + "name": "DLAND", + "selection": "", + "area": "Alle", + "pagelength": "100", + "language": "de" + }, + "List": [ + { + "Code": "11111LJ001", + "Content": "Feststellung des Gebietsstands, Gebietsfläche, Bundesländer, Stichtag", + "State": "undefiniert", + "Time": "31.12.1995-31.12.2022", + "LatestUpdate": "14.12.2023 10:12:15h", + "Information": "false" + }, + { + "Code": "12211LJ001", + "Content": "Mikrozensus, Bevölkerung, Erwerbspersonen, Erwerbstätige, Erwerbslose, Nichterwerbspersonen, Bundesländer, Stichmonat", + "State": "undefiniert", + "Time": "04/1991-03/2004", + "LatestUpdate": "22.03.2005 11:46:17h", + "Information": "false" + }, + { + "Code": "12211LJ002", + "Content": "Mikrozensus, Privathaushalte, Bundesländer, Stichmonat", + "State": "undefiniert", + "Time": "05/1970-03/2004", + "LatestUpdate": "09.11.2020 11:43:47h", + "Information": "false" + }, + { + "Code": "12211LJ003", + "Content": "Mikrozensus, Privathaushalte, Bundesländer, Haushaltsgröße, Stichmonat", + "State": "undefiniert", + "Time": "04/1991-03/2004", + "LatestUpdate": "09.11.2020 11:44:19h", + "Information": "false" + }, + { + "Code": "12211LJ004", + "Content": "Mikrozensus, Bevölkerung in Familien/Lebensformen, Bundesländer, Stichmonat", + "State": "undefiniert", + "Time": "04/1996-03/2004", + "LatestUpdate": "09.11.2020 11:46:13h", + "Information": "false" + }, + { + "Code": "12211LJ005", + "Content": "Mikrozensus, Bevölkerung in Familien/Lebensformen, Bundesländer, Lebensformen, Stichmonat", + "State": "undefiniert", + "Time": "04/1996-03/2004", + "LatestUpdate": "09.11.2020 11:46:47h", + "Information": "false" + }, + { + "Code": "12211LJ006", + "Content": "Mikrozensus, Familien, Bundesländer, Vorhandensein von Kindern, Stichmonat", + "State": "undefiniert", + "Time": "04/1996-03/2004", + "LatestUpdate": "09.11.2020 11:47:04h", + "Information": "false" + }, + { + "Code": "12211LJ007", + "Content": "Mikrozensus, Paare, Bundesländer, Vorhandensein von Kindern, Stichmonat", + "State": "undefiniert", + "Time": "04/1996-03/2004", + "LatestUpdate": "09.11.2020 11:47:17h", + "Information": "false" + }, + { + "Code": "12211LJ008", + "Content": "Mikrozensus, Ehepaare, Lebensgemeinschaften, Gemischtgeschlechtliche Lebensgemeinschaften, Bundesländer, Stichmonat", + "State": "undefiniert", + "Time": "04/1996-03/2004", + "LatestUpdate": "09.11.2020 11:47:33h", + "Information": "false" + }, + { + "Code": "12211LJ009", + "Content": "Mikrozensus, Ehepaare, Lebensgemeinschaften, Gemischtgeschlechtliche Lebensgemeinschaften, Bundesländer, Vorhandensein von Kindern, Stichmonat", + "State": "undefiniert", + "Time": "04/1996-03/2004", + "LatestUpdate": "09.11.2020 11:48:49h", + "Information": "false" + }, + { + "Code": "12211LJ010", + "Content": "Mikrozensus, Alleinerziehende, Bundesländer, Vorhandensein von Kindern, Stichmonat", + "State": "undefiniert", + "Time": "04/1996-03/2004", + "LatestUpdate": "09.11.2020 11:49:06h", + "Information": "false" + }, + { + "Code": "12211LJ011", + "Content": "Mikrozensus, Alleinerziehende, Bundesländer, Vorhandensein von Kindern, Geschlecht, Stichmonat", + "State": "undefiniert", + "Time": "04/1996-03/2004", + "LatestUpdate": "17.06.2021 16:45:09h", + "Information": "false" + }, + { + "Code": "12211LJ012", + "Content": "Mikrozensus, Alleinstehende, Bundesländer, Stichmonat", + "State": "undefiniert", + "Time": "04/1996-03/2004", + "LatestUpdate": "09.11.2020 11:50:28h", + "Information": "false" + }, + { + "Code": "12211LJ013", + "Content": "Mikrozensus, Alleinstehende, Bundesländer, Geschlecht, Stichmonat", + "State": "undefiniert", + "Time": "04/1996-03/2004", + "LatestUpdate": "09.11.2020 11:51:03h", + "Information": "false" + }, + { + "Code": "12211LJ014", + "Content": "Mikrozensus, Alleinstehende, Bundesländer, Haushaltsgröße, Stichmonat", + "State": "undefiniert", + "Time": "04/1996-03/2004", + "LatestUpdate": "09.11.2020 11:52:36h", + "Information": "false" + }, + { + "Code": "12211LJ015", + "Content": "Mikrozensus, Alleinstehende, Bundesländer, Haushaltsgröße, Geschlecht, Stichmonat", + "State": "undefiniert", + "Time": "04/1996-03/2004", + "LatestUpdate": "09.11.2020 11:52:53h", + "Information": "false" + }, + { + "Code": "12211LJ016", + "Content": "Mikrozensus, Ledige Kinder in der Familie, Ledige Kinder unter 18 Jahren in der Familie, Bundesländer, Stichmonat", + "State": "undefiniert", + "Time": "04/1996-03/2004", + "LatestUpdate": "09.11.2020 11:53:13h", + "Information": "false" + }, + { + "Code": "12211LJ017", + "Content": "Mikrozensus, Ledige Kinder in der Familie, Ledige Kinder unter 18 Jahren in der Familie, Bundesländer, Familienformen, Stichmonat", + "State": "undefiniert", + "Time": "04/1996-03/2004", + "LatestUpdate": "09.11.2020 11:53:34h", + "Information": "false" + }, + { + "Code": "12211LJ018", + "Content": "Mikrozensus, Bevölkerung, Erwerbspersonen, Erwerbstätige, Erwerbslose, Nichterwerbspersonen, Bundesländer, Jahr", + "State": "undefiniert", + "Time": "2005-2019", + "LatestUpdate": "09.11.2020 11:32:58h", + "Information": "false" + }, + { + "Code": "12211LJ019", + "Content": "Mikrozensus, Bevölkerung (ab 15 Jahren), Bundesländer, Jahr", + "State": "undefiniert", + "Time": "2005-2019", + "LatestUpdate": "25.11.2020 16:54:17h", + "Information": "false" + }, + { + "Code": "12211LJ020", + "Content": "Mikrozensus, Bevölkerung (ab 15 Jahren), Bundesländer, Geschlecht, Jahr", + "State": "undefiniert", + "Time": "2005-2019", + "LatestUpdate": "25.11.2020 16:54:15h", + "Information": "false" + }, + { + "Code": "12211LJ021", + "Content": "Mikrozensus, Bevölkerung (ab 15 Jahren), Bundesländer, Allgemeine Schulausbildung, Jahr", + "State": "undefiniert", + "Time": "2005-2019", + "LatestUpdate": "25.11.2020 16:54:16h", + "Information": "false" + }, + { + "Code": "12211LJ022", + "Content": "Mikrozensus, Bevölkerung (ab 15 Jahren), Bundesländer, Geschlecht, Allgemeine Schulausbildung, Jahr", + "State": "undefiniert", + "Time": "2005-2019", + "LatestUpdate": "25.11.2020 16:54:11h", + "Information": "false" + }, + { + "Code": "12211LJ023", + "Content": "Mikrozensus, Bevölkerung (ab 15 Jahren), Bundesländer, Beruflicher Bildungsabschluss, Jahr", + "State": "undefiniert", + "Time": "2005-2019", + "LatestUpdate": "25.11.2020 16:54:14h", + "Information": "false" + }, + { + "Code": "12211LJ024", + "Content": "Mikrozensus, Bevölkerung (ab 15 Jahren), Bundesländer, Geschlecht, Beruflicher Bildungsabschluss, Jahr", + "State": "undefiniert", + "Time": "2005-2019", + "LatestUpdate": "25.11.2020 16:54:13h", + "Information": "false" + }, + { + "Code": "12211LJ025", + "Content": "Mikrozensus, Privathaushalte, Bundesländer, Jahr", + "State": "undefiniert", + "Time": "2005-2019", + "LatestUpdate": "09.11.2020 11:44:43h", + "Information": "false" + }, + { + "Code": "12211LJ026", + "Content": "Mikrozensus, Privathaushalte, Bundesländer, Haushaltsgröße, Jahr", + "State": "undefiniert", + "Time": "2005-2019", + "LatestUpdate": "09.11.2020 11:45:05h", + "Information": "false" + }, + { + "Code": "12211LJ027", + "Content": "Mikrozensus, Bevölkerung in Familien/Lebensformen, Bundesländer, Jahr", + "State": "undefiniert", + "Time": "2005-2019", + "LatestUpdate": "09.11.2020 11:53:58h", + "Information": "false" + }, + { + "Code": "12211LJ028", + "Content": "Mikrozensus, Bevölkerung in Familien/Lebensformen, Bundesländer, Lebensformen, Jahr", + "State": "undefiniert", + "Time": "2005-2019", + "LatestUpdate": "09.11.2020 11:54:40h", + "Information": "false" + }, + { + "Code": "12211LJ029", + "Content": "Mikrozensus, Familien, Bundesländer, Vorhandensein von Kindern, Jahr", + "State": "undefiniert", + "Time": "2005-2019", + "LatestUpdate": "09.11.2020 11:54:54h", + "Information": "false" + }, + { + "Code": "12211LJ030", + "Content": "Mikrozensus, Paare, Bundesländer, Vorhandensein von Kindern, Jahr", + "State": "undefiniert", + "Time": "2005-2019", + "LatestUpdate": "09.11.2020 11:55:15h", + "Information": "false" + }, + { + "Code": "12211LJ031", + "Content": "Mikrozensus, Ehepaare, Lebensgemeinschaften, Gemischtgeschlechtliche Lebensgemeinschaften, Bundesländer, Jahr", + "State": "undefiniert", + "Time": "2005-2019", + "LatestUpdate": "09.11.2020 11:55:36h", + "Information": "false" + }, + { + "Code": "12211LJ032", + "Content": "Mikrozensus, Ehepaare, Lebensgemeinschaften, Gemischtgeschlechtliche Lebensgemeinschaften, Bundesländer, Vorhandensein von Kindern, Jahr", + "State": "undefiniert", + "Time": "2005-2019", + "LatestUpdate": "09.11.2020 11:56:00h", + "Information": "false" + }, + { + "Code": "12211LJ033", + "Content": "Mikrozensus, Alleinerziehende, Bundesländer, Vorhandensein von Kindern, Jahr", + "State": "undefiniert", + "Time": "2005-2019", + "LatestUpdate": "09.11.2020 11:56:14h", + "Information": "false" + }, + { + "Code": "12211LJ034", + "Content": "Mikrozensus, Alleinerziehende, Bundesländer, Vorhandensein von Kindern, Geschlecht, Jahr", + "State": "undefiniert", + "Time": "2005-2019", + "LatestUpdate": "09.11.2020 11:56:32h", + "Information": "false" + }, + { + "Code": "12211LJ035", + "Content": "Mikrozensus, Alleinstehende, Bundesländer, Jahr", + "State": "undefiniert", + "Time": "2005-2019", + "LatestUpdate": "09.11.2020 11:57:58h", + "Information": "false" + }, + { + "Code": "12211LJ036", + "Content": "Mikrozensus, Alleinstehende, Bundesländer, Geschlecht, Jahr", + "State": "undefiniert", + "Time": "2005-2019", + "LatestUpdate": "09.11.2020 11:58:56h", + "Information": "false" + }, + { + "Code": "12211LJ037", + "Content": "Mikrozensus, Alleinstehende, Bundesländer, Haushaltsgröße, Jahr", + "State": "undefiniert", + "Time": "2005-2019", + "LatestUpdate": "09.11.2020 11:59:13h", + "Information": "false" + }, + { + "Code": "12211LJ038", + "Content": "Mikrozensus, Alleinstehende, Bundesländer, Haushaltsgröße, Geschlecht, Jahr", + "State": "undefiniert", + "Time": "2005-2019", + "LatestUpdate": "09.11.2020 12:00:39h", + "Information": "false" + }, + { + "Code": "12211LJ039", + "Content": "Mikrozensus, Ledige Kinder in der Familie, Ledige Kinder unter 18 Jahren in der Familie, Bundesländer, Jahr", + "State": "undefiniert", + "Time": "2005-2019", + "LatestUpdate": "09.11.2020 12:00:56h", + "Information": "false" + }, + { + "Code": "12211LJ040", + "Content": "Mikrozensus, Ledige Kinder in der Familie, Ledige Kinder unter 18 Jahren in der Familie, Bundesländer, Familienformen, Jahr", + "State": "undefiniert", + "Time": "2005-2019", + "LatestUpdate": "09.11.2020 12:01:10h", + "Information": "false" + }, + { + "Code": "12211LJ041", + "Content": "Mikrozensus, Bevölkerung in Gemeinschaftsunterkünften, Bundesländer, Jahr", + "State": "undefiniert", + "Time": "2017-2023", + "LatestUpdate": "28.03.2024 15:20:37h", + "Information": "false" + }, + { + "Code": "12211LJ042", + "Content": "Mikrozensus, Bevölkerung in Gemeinschaftsunterkünften, Bundesländer, Geschlecht, Jahr", + "State": "undefiniert", + "Time": "2017-2023", + "LatestUpdate": "28.03.2024 15:20:34h", + "Information": "false" + }, + { + "Code": "12211LJ043", + "Content": "Mikrozensus, Bevölkerung in Gemeinschaftsunterkünften, Bundesländer, Altersgruppen (u25-65m), Jahr", + "State": "undefiniert", + "Time": "2017-2023", + "LatestUpdate": "28.03.2024 15:20:27h", + "Information": "false" + }, + { + "Code": "12211LJ044", + "Content": "Mikrozensus, Bevölkerung in Gemeinschaftsunterkünften, Bundesländer, Art der Gemeinschaftsunterkunft, Jahr", + "State": "undefiniert", + "Time": "2017-2023", + "LatestUpdate": "28.03.2024 15:20:24h", + "Information": "false" + }, + { + "Code": "12211LJ045", + "Content": "Mikrozensus, Bevölkerung in Gemeinschaftsunterkünften, Bundesländer, Hauptstatus, Jahr", + "State": "undefiniert", + "Time": "2017-2023", + "LatestUpdate": "28.03.2024 15:20:31h", + "Information": "false" + }, + { + "Code": "12211LJ046", + "Content": "Mikrozensus, Bevölkerung in Gemeinschaftsunterkünften, Bundesländer, Geschlecht, Altersgruppen (u25-65m), Jahr", + "State": "undefiniert", + "Time": "2017-2023", + "LatestUpdate": "28.03.2024 15:20:17h", + "Information": "false" + }, + { + "Code": "12211LJ047", + "Content": "Mikrozensus, Bevölkerung in Gemeinschaftsunterkünften, Bundesländer, Geschlecht, Art der Gemeinschaftsunterkunft, Jahr", + "State": "undefiniert", + "Time": "2017-2023", + "LatestUpdate": "28.03.2024 15:20:21h", + "Information": "false" + }, + { + "Code": "12211LJ048", + "Content": "Mikrozensus, Bevölkerung in Gemeinschaftsunterkünften, Bundesländer, Geschlecht, Hauptstatus, Jahr", + "State": "undefiniert", + "Time": "2017-2023", + "LatestUpdate": "28.03.2024 15:21:17h", + "Information": "false" + }, + { + "Code": "12211LJ049", + "Content": "Mikrozensus, Bevölkerung in Gemeinschaftsunterkünften, Bundesländer, Altersgruppen (u25-65m), Hauptstatus, Jahr", + "State": "undefiniert", + "Time": "2017-2023", + "LatestUpdate": "28.03.2024 15:21:21h", + "Information": "false" + }, + { + "Code": "12211LJ050", + "Content": "Mikrozensus, Bevölkerung in Gemeinschaftsunterkünften, Bundesländer, Geschlecht, Altersgruppen (u25-65m), Hauptstatus, Jahr", + "State": "undefiniert", + "Time": "2017-2023", + "LatestUpdate": "28.03.2024 15:21:25h", + "Information": "false" + }, + { + "Code": "12211LJ240", + "Content": "Mikrozensus, Bevölkerung in Hauptwohnsitzhaushalten, Erwerbspersonen aus Hauptwohnsitzhaushalten, Erwerbstätige aus Hauptwohnsitzhaushalten, Erwerbslose aus Hauptwohnsitzhaushalten, Nichterwerbspersonen aus Hauptwohnsitzhaushalten, Bundesländer, Jahr", + "State": "undefiniert", + "Time": "2021-2023", + "LatestUpdate": "11.04.2024 15:27:30h", + "Information": "false" + }, + { + "Code": "12211LJ241", + "Content": "Mikrozensus, Bevölkerung in Hauptwohnsitzhaushalten, Erwerbspersonen aus Hauptwohnsitzhaushalten, Erwerbstätige aus Hauptwohnsitzhaushalten, Erwerbslose aus Hauptwohnsitzhaushalten, Nichterwerbspersonen aus Hauptwohnsitzhaushalten, Bundesländer, Geschlecht, Jahr", + "State": "undefiniert", + "Time": "2021-2023", + "LatestUpdate": "11.04.2024 15:27:21h", + "Information": "false" + }, + { + "Code": "12211LJ242", + "Content": "Mikrozensus, Bevölkerung in Hauptwohnsitzhaushalten, Erwerbspersonen aus Hauptwohnsitzhaushalten, Erwerbstätige aus Hauptwohnsitzhaushalten, Erwerbslose aus Hauptwohnsitzhaushalten, Nichterwerbspersonen aus Hauptwohnsitzhaushalten, Bundesländer, Altersgruppen (u15-75m), Jahr", + "State": "undefiniert", + "Time": "2021-2023", + "LatestUpdate": "11.04.2024 15:27:17h", + "Information": "false" + }, + { + "Code": "12211LJ243", + "Content": "Mikrozensus, Bevölkerung in Hauptwohnsitzhaushalten, Erwerbspersonen aus Hauptwohnsitzhaushalten, Erwerbstätige aus Hauptwohnsitzhaushalten, Erwerbslose aus Hauptwohnsitzhaushalten, Nichterwerbspersonen aus Hauptwohnsitzhaushalten, Bundesländer, Geschlecht, Altersgruppen (u15-75m), Jahr", + "State": "undefiniert", + "Time": "2021-2023", + "LatestUpdate": "11.04.2024 15:27:27h", + "Information": "false" + }, + { + "Code": "12211LJ244", + "Content": "Mikrozensus, Bevölkerung in Hauptwohnsitzhaushalten, Erwerbspersonen aus Hauptwohnsitzhaushalten, Erwerbstätige aus Hauptwohnsitzhaushalten, Erwerbslose aus Hauptwohnsitzhaushalten, Nichterwerbspersonen aus Hauptwohnsitzhaushalten, Bundesländer, Altersgruppen (u15-65m), Jahr", + "State": "undefiniert", + "Time": "2021-2023", + "LatestUpdate": "11.04.2024 15:27:13h", + "Information": "false" + }, + { + "Code": "12211LJ245", + "Content": "Mikrozensus, Bevölkerung in Hauptwohnsitzhaushalten, Erwerbspersonen aus Hauptwohnsitzhaushalten, Erwerbstätige aus Hauptwohnsitzhaushalten, Erwerbslose aus Hauptwohnsitzhaushalten, Nichterwerbspersonen aus Hauptwohnsitzhaushalten, Bundesländer, Überwiegender Lebensunterhalt, Jahr", + "State": "undefiniert", + "Time": "2021-2022", + "LatestUpdate": "16.02.2024 14:18:02h", + "Information": "false" + }, + { + "Code": "12211LJ246", + "Content": "Mikrozensus, Bevölkerung in Hauptwohnsitzhaushalten, Erwerbspersonen aus Hauptwohnsitzhaushalten, Erwerbstätige aus Hauptwohnsitzhaushalten, Erwerbslose aus Hauptwohnsitzhaushalten, Nichterwerbspersonen aus Hauptwohnsitzhaushalten, Bundesländer, Altersgruppen (u15-65m), Überwiegender Lebensunterhalt, Jahr", + "State": "undefiniert", + "Time": "2021-2022", + "LatestUpdate": "16.02.2024 14:19:03h", + "Information": "false" + }, + { + "Code": "12211LJ247", + "Content": "Mikrozensus, Bevölkerung in Hauptwohnsitzhaushalten, Erwerbspersonen aus Hauptwohnsitzhaushalten, Erwerbstätige aus Hauptwohnsitzhaushalten, Erwerbslose aus Hauptwohnsitzhaushalten, Nichterwerbspersonen aus Hauptwohnsitzhaushalten, Bundesländer, Größenklassen des persönl. monatl. Nettoeinkommens, Jahr", + "State": "undefiniert", + "Time": "2021-2023", + "LatestUpdate": "11.04.2024 15:27:09h", + "Information": "false" + }, + { + "Code": "12211LJ248", + "Content": "Mikrozensus, Bevölkerung in Hauptwohnsitzhaushalten, Erwerbspersonen aus Hauptwohnsitzhaushalten, Erwerbstätige aus Hauptwohnsitzhaushalten, Erwerbslose aus Hauptwohnsitzhaushalten, Nichterwerbspersonen aus Hauptwohnsitzhaushalten, Bundesländer, Geschlecht, Größenklassen des persönl. monatl. Nettoeinkommens, Jahr", + "State": "undefiniert", + "Time": "2021-2023", + "LatestUpdate": "11.04.2024 15:27:04h", + "Information": "false" + }, + { + "Code": "12211LJ249", + "Content": "Mikrozensus, Erwerbstätige aus Hauptwohnsitzhaushalten, Bundesländer, Altersgruppen (15-75m), Jahr", + "State": "undefiniert", + "Time": "2021-2023", + "LatestUpdate": "11.04.2024 15:26:18h", + "Information": "false" + }, + { + "Code": "12211LJ250", + "Content": "Mikrozensus, Erwerbstätige aus Hauptwohnsitzhaushalten, Bundesländer, Geschlecht, Altersgruppen (15-75m), Jahr", + "State": "undefiniert", + "Time": "2021-2023", + "LatestUpdate": "11.04.2024 15:09:03h", + "Information": "false" + }, + { + "Code": "12211LJ251", + "Content": "Mikrozensus, Erwerbstätige aus Hauptwohnsitzhaushalten, Bundesländer, Stellung im Beruf, Jahr", + "State": "undefiniert", + "Time": "2021-2023", + "LatestUpdate": "11.04.2024 15:09:06h", + "Information": "false" + }, + { + "Code": "12211LJ252", + "Content": "Mikrozensus, Erwerbstätige aus Hauptwohnsitzhaushalten, Bundesländer, Geschlecht, Stellung im Beruf, Jahr", + "State": "undefiniert", + "Time": "2021-2023", + "LatestUpdate": "11.04.2024 15:26:07h", + "Information": "false" + }, + { + "Code": "12211LJ253", + "Content": "Mikrozensus, Erwerbstätige aus Hauptwohnsitzhaushalten, Bundesländer, Altersgruppen (15-75m), Stellung im Beruf, Jahr", + "State": "undefiniert", + "Time": "2021-2023", + "LatestUpdate": "11.04.2024 15:26:22h", + "Information": "false" + }, + { + "Code": "12211LJ254", + "Content": "Mikrozensus, Erwerbstätige aus Hauptwohnsitzhaushalten, Bundesländer, Geschlecht, Altersgruppen (15-75m), Stellung im Beruf, Jahr", + "State": "undefiniert", + "Time": "2021-2023", + "LatestUpdate": "11.04.2024 15:26:15h", + "Information": "false" + }, + { + "Code": "12211LJ255", + "Content": "Mikrozensus, Bevölkerung in Hauptwohnsitzhaushalten, Erwerbspersonen aus Hauptwohnsitzhaushalten, Erwerbstätige aus Hauptwohnsitzhaushalten, Erwerbslose aus Hauptwohnsitzhaushalten, Nichterwerbspersonen aus Hauptwohnsitzhaushalten, Bundesländer, Überwiegender Lebensunterhalt, Jahr", + "State": "undefiniert", + "Time": "2023", + "LatestUpdate": "11.04.2024 16:34:01h", + "Information": "false" + }, + { + "Code": "12211LJ256", + "Content": "Mikrozensus, Bevölkerung in Hauptwohnsitzhaushalten, Erwerbspersonen aus Hauptwohnsitzhaushalten, Erwerbstätige aus Hauptwohnsitzhaushalten, Erwerbslose aus Hauptwohnsitzhaushalten, Nichterwerbspersonen aus Hauptwohnsitzhaushalten, Bundesländer, Altersgruppen (u15-65m), Überwiegender Lebensunterhalt, Jahr", + "State": "undefiniert", + "Time": "2023", + "LatestUpdate": "11.04.2024 16:34:01h", + "Information": "false" + }, + { + "Code": "12231L2001", + "Content": "IKT-Nutzung in privaten Haushalten, Bevölkerung von 16-u75 J. in Hauptwohnsitzhaush., Bundesländer, Art der Computer- und Internetkenntnisse, Jahr", + "State": "undefiniert", + "Time": "2023", + "LatestUpdate": "06.12.2023 16:08:58h", + "Information": "false" + }, + { + "Code": "12231L2002", + "Content": "IKT-Nutzung in privaten Haushalten, Bevölkerung von 16-u75 J. in Hauptwohnsitzhaush., Bundesländer, Altersgruppen (16-u75), Art der Computer- und Internetkenntnisse, Jahr", + "State": "undefiniert", + "Time": "2023", + "LatestUpdate": "06.12.2023 16:08:58h", + "Information": "false" + }, + { + "Code": "12231LJ030", + "Content": "IKT-Nutzung in privaten Haushalten, Bevölkerung von 16-u75 J. in Hauptwohnsitzhaush., Bundesländer, Jahr", + "State": "undefiniert", + "Time": "2022-2023", + "LatestUpdate": "06.12.2023 15:05:23h", + "Information": "false" + }, + { + "Code": "12231LJ031", + "Content": "IKT-Nutzung in privaten Haushalten, Bevölkerung von 16-u75 J. in Hauptwohnsitzhaush., Bundesländer, Altersgruppen (16-u75), Jahr", + "State": "undefiniert", + "Time": "2022-2023", + "LatestUpdate": "06.12.2023 15:05:41h", + "Information": "false" + }, + { + "Code": "12231LJ032", + "Content": "IKT-Nutzung in privaten Haushalten, Bevölkerung von 16-u75 J. in Hauptwohnsitzhaush., Bundesländer, Priv. Internetaktivitäten i.d.letzten drei Monaten, Jahr", + "State": "undefiniert", + "Time": "2022-2023", + "LatestUpdate": "06.12.2023 15:04:23h", + "Information": "false" + }, + { + "Code": "12231LJ033", + "Content": "IKT-Nutzung in privaten Haushalten, Bevölkerung von 16-u75 J. in Hauptwohnsitzhaush., Bundesländer, Altersgruppen (16-u75), Priv. Internetaktivitäten i.d.letzten drei Monaten, Jahr", + "State": "undefiniert", + "Time": "2022-2023", + "LatestUpdate": "06.12.2023 15:05:32h", + "Information": "false" + }, + { + "Code": "12231LJ034", + "Content": "IKT-Nutzung in privaten Haushalten, Bevölkerung von 16-u75 J. in Hauptwohnsitzhaush., Bundesländer, Private Internetkäufe in den letzten drei Monaten, Jahr", + "State": "undefiniert", + "Time": "2022-2023", + "LatestUpdate": "06.12.2023 15:06:26h", + "Information": "false" + }, + { + "Code": "12231LJ035", + "Content": "IKT-Nutzung in privaten Haushalten, Bevölkerung von 16-u75 J. in Hauptwohnsitzhaush., Bundesländer, Altersgruppen (16-u75), Private Internetkäufe in den letzten drei Monaten, Jahr", + "State": "undefiniert", + "Time": "2022-2023", + "LatestUpdate": "06.12.2023 15:05:28h", + "Information": "false" + }, + { + "Code": "12251LJ001", + "Content": "Arbeitsmarktstatistik des Mikrozensus, Erwerbstätige aus Hauptwohnsitzhaushalten, Bundesländer, Jahr", + "State": "undefiniert", + "Time": "2021-2023", + "LatestUpdate": "11.04.2024 15:33:06h", + "Information": "false" + }, + { + "Code": "12251LJ002", + "Content": "Arbeitsmarktstatistik des Mikrozensus, Erwerbstätige aus Hauptwohnsitzhaushalten, Bundesländer, Geschlecht, Jahr", + "State": "undefiniert", + "Time": "2021-2023", + "LatestUpdate": "11.04.2024 15:33:13h", + "Information": "false" + }, + { + "Code": "12251LJ003", + "Content": "Arbeitsmarktstatistik des Mikrozensus, Erwerbstätige aus Hauptwohnsitzhaushalten, Bundesländer, Stellung im Beruf, Jahr", + "State": "undefiniert", + "Time": "2021-2023", + "LatestUpdate": "11.04.2024 15:33:10h", + "Information": "false" + }, + { + "Code": "12251LJ004", + "Content": "Arbeitsmarktstatistik des Mikrozensus, Erwerbstätige aus Hauptwohnsitzhaushalten, Bundesländer, Geschlecht, Stellung im Beruf, Jahr", + "State": "undefiniert", + "Time": "2021-2023", + "LatestUpdate": "11.04.2024 15:33:18h", + "Information": "false" + }, + { + "Code": "12251LJ009", + "Content": "Arbeitsmarktstatistik des Mikrozensus, Erwerbstätige aus Hauptwohnsitzhaushalten, Bundesländer, Wochenend- und Feiertagsarbeit, Jahr", + "State": "undefiniert", + "Time": "2021-2023", + "LatestUpdate": "11.04.2024 15:34:19h", + "Information": "false" + }, + { + "Code": "12251LJ010", + "Content": "Arbeitsmarktstatistik des Mikrozensus, Erwerbstätige aus Hauptwohnsitzhaushalten, Bundesländer, Geschlecht, Wochenend- und Feiertagsarbeit, Jahr", + "State": "undefiniert", + "Time": "2021-2023", + "LatestUpdate": "11.04.2024 15:35:17h", + "Information": "false" + }, + { + "Code": "12251LJ011", + "Content": "Arbeitsmarktstatistik des Mikrozensus, Erwerbstätige aus Hauptwohnsitzhaushalten, Bundesländer, Stellung im Beruf, Wochenend- und Feiertagsarbeit, Jahr", + "State": "undefiniert", + "Time": "2021-2023", + "LatestUpdate": "11.04.2024 15:36:04h", + "Information": "false" + }, + { + "Code": "12251LJ012", + "Content": "Arbeitsmarktstatistik des Mikrozensus, Erwerbstätige aus Hauptwohnsitzhaushalten, Bundesländer, Geschlecht, Stellung im Beruf, Wochenend- und Feiertagsarbeit, Jahr", + "State": "undefiniert", + "Time": "2021-2023", + "LatestUpdate": "11.04.2024 15:35:06h", + "Information": "false" + }, + { + "Code": "12251LJ013", + "Content": "Arbeitsmarktstatistik des Mikrozensus, Erwerbstätige aus Hauptwohnsitzhaushalten, Bundesländer, Abend-, Nacht- und Schichtarbeit, Jahr", + "State": "undefiniert", + "Time": "2021-2023", + "LatestUpdate": "11.04.2024 15:35:10h", + "Information": "false" + }, + { + "Code": "12251LJ014", + "Content": "Arbeitsmarktstatistik des Mikrozensus, Erwerbstätige aus Hauptwohnsitzhaushalten, Bundesländer, Geschlecht, Abend-, Nacht- und Schichtarbeit, Jahr", + "State": "undefiniert", + "Time": "2021-2023", + "LatestUpdate": "11.04.2024 15:35:13h", + "Information": "false" + }, + { + "Code": "12251LJ015", + "Content": "Arbeitsmarktstatistik des Mikrozensus, Erwerbstätige aus Hauptwohnsitzhaushalten, Bundesländer, Stellung im Beruf, Abend-, Nacht- und Schichtarbeit, Jahr", + "State": "undefiniert", + "Time": "2021-2023", + "LatestUpdate": "11.04.2024 15:36:17h", + "Information": "false" + }, + { + "Code": "12251LJ016", + "Content": "Arbeitsmarktstatistik des Mikrozensus, Erwerbstätige aus Hauptwohnsitzhaushalten, Bundesländer, Geschlecht, Stellung im Beruf, Abend-, Nacht- und Schichtarbeit, Jahr", + "State": "undefiniert", + "Time": "2021-2023", + "LatestUpdate": "11.04.2024 15:36:12h", + "Information": "false" + }, + { + "Code": "12251LJ017", + "Content": "Arbeitsmarktstatistik des Mikrozensus, Erwerbstätige aus Hauptwohnsitzhaushalten, Bundesländer, Erwerbsarbeit zu Hause, Jahr", + "State": "undefiniert", + "Time": "2021-2023", + "LatestUpdate": "11.04.2024 15:36:27h", + "Information": "false" + }, + { + "Code": "12251LJ018", + "Content": "Arbeitsmarktstatistik des Mikrozensus, Erwerbstätige aus Hauptwohnsitzhaushalten, Bundesländer, Geschlecht, Erwerbsarbeit zu Hause, Jahr", + "State": "undefiniert", + "Time": "2021-2023", + "LatestUpdate": "11.04.2024 15:36:24h", + "Information": "false" + }, + { + "Code": "12251LJ019", + "Content": "Arbeitsmarktstatistik des Mikrozensus, Erwerbstätige aus Hauptwohnsitzhaushalten, Bundesländer, Stellung im Beruf, Erwerbsarbeit zu Hause, Jahr", + "State": "undefiniert", + "Time": "2021-2023", + "LatestUpdate": "11.04.2024 15:36:21h", + "Information": "false" + }, + { + "Code": "12251LJ020", + "Content": "Arbeitsmarktstatistik des Mikrozensus, Erwerbstätige aus Hauptwohnsitzhaushalten, Bundesländer, Geschlecht, Stellung im Beruf, Erwerbsarbeit zu Hause, Jahr", + "State": "undefiniert", + "Time": "2021-2023", + "LatestUpdate": "11.04.2024 15:37:15h", + "Information": "false" + }, + { + "Code": "12251LJ021", + "Content": "Arbeitsmarktstatistik des Mikrozensus, Abhängig Erwerbstätige aus Hauptwohnsitzhaushalten, Bundesländer, Jahr", + "State": "undefiniert", + "Time": "2021-2023", + "LatestUpdate": "11.04.2024 15:38:02h", + "Information": "false" + }, + { + "Code": "12251LJ022", + "Content": "Arbeitsmarktstatistik des Mikrozensus, Abhängig Erwerbstätige aus Hauptwohnsitzhaushalten, Bundesländer, Geschlecht, Jahr", + "State": "undefiniert", + "Time": "2021-2023", + "LatestUpdate": "11.04.2024 15:37:05h", + "Information": "false" + }, + { + "Code": "12251LJ023", + "Content": "Arbeitsmarktstatistik des Mikrozensus, Abhängig Erwerbstätige aus Hauptwohnsitzhaushalten, Bundesländer, Altersgruppen (15-75m), Jahr", + "State": "undefiniert", + "Time": "2021-2023", + "LatestUpdate": "11.04.2024 15:37:09h", + "Information": "false" + }, + { + "Code": "12251LJ024", + "Content": "Arbeitsmarktstatistik des Mikrozensus, Abhängig Erwerbstätige aus Hauptwohnsitzhaushalten, Bundesländer, Geschlecht, Altersgruppen (15-75m), Jahr", + "State": "undefiniert", + "Time": "2021-2023", + "LatestUpdate": "11.04.2024 15:37:20h", + "Information": "false" + }, + { + "Code": "12251LJ025", + "Content": "Arbeitsmarktstatistik des Mikrozensus, Abhängig Erwerbstätige aus Hauptwohnsitzhaushalten, Bundesländer, Art des Arbeitsvertrages, Jahr", + "State": "undefiniert", + "Time": "2021-2023", + "LatestUpdate": "11.04.2024 15:37:02h", + "Information": "false" + }, + { + "Code": "12251LJ026", + "Content": "Arbeitsmarktstatistik des Mikrozensus, Abhängig Erwerbstätige aus Hauptwohnsitzhaushalten, Bundesländer, Geschlecht, Art des Arbeitsvertrages, Jahr", + "State": "undefiniert", + "Time": "2021-2023", + "LatestUpdate": "11.04.2024 15:38:06h", + "Information": "false" + }, + { + "Code": "12251LJ027", + "Content": "Arbeitsmarktstatistik des Mikrozensus, Abhängig Erwerbstätige aus Hauptwohnsitzhaushalten, Bundesländer, Altersgruppen (15-75m), Art des Arbeitsvertrages, Jahr", + "State": "undefiniert", + "Time": "2021-2023", + "LatestUpdate": "11.04.2024 15:38:11h", + "Information": "false" + }, + { + "Code": "12251LJ028", + "Content": "Arbeitsmarktstatistik des Mikrozensus, Abhängig Erwerbstätige aus Hauptwohnsitzhaushalten, Bundesländer, Geschlecht, Altersgruppen (15-75m), Art des Arbeitsvertrages, Jahr", + "State": "undefiniert", + "Time": "2021-2023", + "LatestUpdate": "11.04.2024 15:38:18h", + "Information": "false" + } + ], + "Copyright": "© Statistisches Bundesamt (Destatis), 2024" +} diff --git a/tests/testthat/xy_variable2/api/catalogue/tables2variable-93dc8a.json b/tests/testthat/xy_variable2/api/catalogue/tables2variable-93dc8a.json new file mode 100644 index 0000000..9d1e0e0 --- /dev/null +++ b/tests/testthat/xy_variable2/api/catalogue/tables2variable-93dc8a.json @@ -0,0 +1,523 @@ +{ + "Ident": { + "Service": "catalogue", + "Method": "tables2variable" + }, + "Status": { + "Code": 0, + "Content": "erfolgreich", + "Type": "Information" + }, + "Parameter": { + "username": "********************", + "password": "********************", + "name": "DLAND", + "selection": "", + "area": "Alle", + "pagelength": "100", + "language": "de" + }, + "List": [ + { + "Code": "11111-0001", + "Content": "Gebietsfläche: Bundesländer, Stichtag", + "Time": "31.12.1995 - 31.12.2022" + }, + { + "Code": "12211-0902", + "Content": "Bevölkerung in Gemeinschaftsunterkünften: Bundesländer,\nJahre, Hauptstatus, Geschlecht, Altersgruppen", + "Time": "2017 - 2023" + }, + { + "Code": "12211-0903", + "Content": "Bevölkerung in Gemeinschaftsunterkünften: Bundesländer,\nJahre, Art der Gemeinschaftsunterkunft, Geschlecht", + "Time": "2017 - 2023" + }, + { + "Code": "12211-1001", + "Content": "Bevölkerung, Erwerbstätige, Erwerbslose, Erwerbspersonen, Nichterwerbspersonen aus Hauptwohnsitzhaushalten: Bundesländer, Jahre, Geschlecht, Altersgruppen", + "Time": "2021 - 2023" + }, + { + "Code": "12211-1002", + "Content": "Bevölkerung, Erwerbstätige, Erwerbslose, Erwerbspersonen, Nichterwerbspersonen aus Hauptwohnsitzhaushalten: Bundesländer, Jahre, Überwiegender Lebensunterhalt, Altersgruppen", + "Time": "2023 - 2023" + }, + { + "Code": "12211-1003", + "Content": "Bevölkerung, Erwerbstätige, Erwerbslose, Erwerbspersonen,\nNichterwerbspersonen aus Hauptwohnsitzhaush.: Bundesländer,\nJahre, Geschlecht, Größenkl. persönl. monatl. Nettoeinkommen", + "Time": "2021 - 2023" + }, + { + "Code": "12211-1004", + "Content": "Erwerbstätige aus Hauptwohnsitzhaushalten: Bundesländer,\nJahre, Geschlecht, Altersgruppen, Stellung im Beruf", + "Time": "2021 - 2023" + }, + { + "Code": "12211-9004", + "Content": "Bevölkerung, Erwerbstätige, Erwerbslose, Erwerbspersonen,\nNichterwerbspersonen: Bundesländer, Jahre (bis 2019)", + "Time": "04/1991 - 2019" + }, + { + "Code": "12211-9014", + "Content": "Bevölkerung (ab 15 Jahren): Bundesländer, Jahre (bis 2019),\nGeschlecht, Allgemeine Schulausbildung", + "Time": "2005 - 2019" + }, + { + "Code": "12211-9015", + "Content": "Bevölkerung (ab 15 Jahren): Bundesländer, Jahre (bis 2019),\nGeschlecht, Beruflicher Bildungsabschluss", + "Time": "2005 - 2019" + }, + { + "Code": "12211-9033", + "Content": "Privathaushalte: Bundesländer, Jahre (bis 2019)", + "Time": "05/1970 - 2019" + }, + { + "Code": "12211-9034", + "Content": "Privathaushalte: Bundesländer, Jahre (bis 2019), Haushaltsgröße", + "Time": "04/1991 - 2019" + }, + { + "Code": "12211-9041", + "Content": "Bevölkerung in Familien/Lebensformen: Bundesländer, Jahre (bis 2019), Lebensformen", + "Time": "04/1996 - 2019" + }, + { + "Code": "12211-9044", + "Content": "Familien, Paare, Alleinerziehende: Bundesländer, Jahre (bis 2019), Vorhandensein von Kindern", + "Time": "04/1996 - 2019" + }, + { + "Code": "12211-9047", + "Content": "Ehepaare, Lebensgemeinschaften, Gemischtgeschlechtliche\nLebensgemeinschaften: Bundesländer, Jahre (bis 2019),\nVorhandensein von Kindern", + "Time": "04/1996 - 2019" + }, + { + "Code": "12211-9051", + "Content": "Alleinerziehende: Bundesländer, Jahre (bis 2019),\nGeschlecht, Vorhandensein von Kindern", + "Time": "04/1996 - 2019" + }, + { + "Code": "12211-9053", + "Content": "Alleinstehende: Bundesländer, Jahre (bis 2019), Geschlecht,\nHaushaltsgröße", + "Time": "04/1996 - 2019" + }, + { + "Code": "12211-9056", + "Content": "Ledige Kinder in Familien: Bundesländer, Jahre (bis 2019),\nFamilienformen", + "Time": "04/1996 - 2019" + }, + { + "Code": "12231-0101", + "Content": "Bevölkerung von 16 bis unter 75 Jahren in\nHauptwohnsitzhaushalten: Bundesländer, Jahre, Altersgruppen,\nPrivate Internetaktivitäten in den letzten drei Monaten", + "Time": "2022 - 2023" + }, + { + "Code": "12231-0102", + "Content": "Bevölkerung von 16 bis unter 75 Jahren in\nHauptwohnsitzhaushalten: Bundesländer, Jahre, Altersgruppen,\nPrivate Internetkäufe in den letzten drei Monaten", + "Time": "2022 - 2023" + }, + { + "Code": "12231-0103", + "Content": "Bevölkerung von 16 bis unter 75 Jahren in\nHauptwohnsitzhaushalten: Bundesländer, Jahre, Altersgruppen,\nArt der Computer- und Internetkenntnisse", + "Time": "2023 - 2023" + }, + { + "Code": "12251-0101", + "Content": "Erwerbstätige aus Hauptwohnsitzhaushalten: Bundesländer, Jahre, Geschlecht, Stellung im Beruf", + "Time": "2021 - 2023" + }, + { + "Code": "12251-0102", + "Content": "Erwerbstätige aus Hauptwohnsitzhaushalten: Bundesländer,\nJahre, Geschlecht, Stellung im Beruf, Wochenend- und\nFeiertagsarbeit", + "Time": "2021 - 2023" + }, + { + "Code": "12251-0103", + "Content": "Erwerbstätige aus Hauptwohnsitzhaushalten: Bundesländer,\nJahre, Geschlecht, Stellung im Beruf, Abend-, Nacht- und\nSchichtarbeit", + "Time": "2021 - 2023" + }, + { + "Code": "12251-0104", + "Content": "Erwerbstätige aus Hauptwohnsitzhaushalten: Bundesländer,\nJahre, Geschlecht, Stellung im Beruf, Erwerbsarbeit zu\nHause", + "Time": "2021 - 2023" + }, + { + "Code": "12251-0108", + "Content": "Abhängig Erwerbstätige aus Hauptwohnsitzhaushalten:\nBundesländer, Jahre, Geschlecht, Altersgruppen, Art des\nArbeitsvertrages", + "Time": "2021 - 2023" + }, + { + "Code": "12411-0010", + "Content": "Bevölkerung: Bundesländer, Stichtag", + "Time": "31.12.1958 - 31.12.2023" + }, + { + "Code": "12411-0011", + "Content": "Bevölkerung: Bundesländer, Stichtag, Geschlecht", + "Time": "31.12.1967 - 31.12.2023" + }, + { + "Code": "12411-0012", + "Content": "Bevölkerung: Bundesländer, Stichtag, Altersjahre", + "Time": "31.12.1967 - 31.12.2023" + }, + { + "Code": "12411-0013", + "Content": "Bevölkerung: Bundesländer, Stichtag, Geschlecht, Altersjahre", + "Time": "31.12.1967 - 31.12.2023" + }, + { + "Code": "12411-0014", + "Content": "Bevölkerung: Bundesländer, Stichtag, Nationalität,\nGeschlecht, Altersjahre", + "Time": "31.12.2000 - 31.12.2023" + }, + { + "Code": "12411-0021", + "Content": "Bevölkerung: Bundesländer, Stichtag zum Quartalsende,\nGeschlecht", + "Time": "31.03.1991 - 31.12.2023" + }, + { + "Code": "12411-0042", + "Content": "Durchschnittliche Bevölkerung: Bundesländer, Jahre,\nNationalität, Geschlecht", + "Time": "2000 - 2023" + }, + { + "Code": "12411-0050", + "Content": "Bevölkerungsdichte: Bundesländer, Stichtag", + "Time": "31.12.1995 - 31.12.2022" + }, + { + "Code": "12421-0003", + "Content": "Vorausberechneter Bevölkerungsstand: Bundesländer, Stichtag,\nVarianten der Bevölkerungsvorausberechnung", + "Time": "31.12.2022 - 31.12.2070" + }, + { + "Code": "12421-0004", + "Content": "Vorausberechneter Bevölkerungsstand: Bundesländer, Stichtag,\nVarianten der Bevölkerungsvorausberechnung, Geschlecht,\nAltersjahre", + "Time": "31.12.2022 - 31.12.2070" + }, + { + "Code": "12421-0101", + "Content": "Vorausberechnete Privathaushalte: Bundesländer, Jahre,\nVarianten der Haushaltsvorausberechnung, Haushaltsgröße", + "Time": "2019 - 2040" + }, + { + "Code": "12521-0020", + "Content": "Ausländer: Bundesländer, Stichtag, Geschlecht/Altersjahre/\nFamilienstand", + "Time": "30.09.1980 - 31.12.2023" + }, + { + "Code": "12521-0021", + "Content": "Ausländer: Bundesländer, Stichtag, Geschlecht/Altersjahre/\nFamilienstand, Ländergruppierungen/Staatsangehörigkeit", + "Time": "30.09.1980 - 31.12.2023" + }, + { + "Code": "12521-0022", + "Content": "Ausländer: Bundesländer, Stichtag, Geschlecht, Altersjahre,\nLändergruppierungen/Staatsangehörigkeit", + "Time": "31.12.1998 - 31.12.2023" + }, + { + "Code": "12521-0023", + "Content": "Ausländer: Bundesländer, Stichtag, Geschlecht, Altersjahre,\nMigrantengeneration, Ländergruppierungen/Staatsangehörigkeit", + "Time": "31.12.1998 - 31.12.2023" + }, + { + "Code": "12521-0024", + "Content": "Ausländer: Bundesländer, Stichtag, Geschlecht,\nFamilienstand, Ländergruppierungen/Staatsangehörigkeit", + "Time": "31.12.1998 - 31.12.2023" + }, + { + "Code": "12521-0025", + "Content": "Ausländer: Bundesländer, Stichtag, Geschlecht,\nAufenthaltsdauer/Aufenthaltsdauer (Abgrenzung\nEinbürgerungen), Ländergruppierungen/Staatsangehörigkeit", + "Time": "31.12.1998 - 31.12.2023" + }, + { + "Code": "12521-0026", + "Content": "Ausländer: Bundesländer, Stichtag, Geschlecht,\nAufenthaltstitel/Ausgewählte Aufenthaltstitel,\nLändergruppierungen/Staatsangehörigkeit", + "Time": "31.12.1998 - 31.12.2023" + }, + { + "Code": "12521-0027", + "Content": "Ausländer: Bundesländer, Jahre, Geschlecht,\nRegisterbewegungen (regional), Ländergruppierungen/\nStaatsangehörigkeit", + "Time": "2013 - 2023" + }, + { + "Code": "12521-0028", + "Content": "Ausländer: Bundesländer, Jahre, Geschlecht, Altersjahre,\nRegisterzu- und abgänge (regional), Ländergruppierungen/\nStaatsangehörigkeit", + "Time": "2013 - 2023" + }, + { + "Code": "12521-0029", + "Content": "Ausländer: Bundesländer, Jahre, Geschlecht,\nAufenthaltsdauer, Registerabgänge (regional),\nLändergruppierungen/Staatsangehörigkeit", + "Time": "2013 - 2023" + }, + { + "Code": "12521-0030", + "Content": "Durchschnittsalter der Ausländer: Bundesländer, Stichtag,\nGeschlecht, Ländergruppierungen/Staatsangehörigkeit", + "Time": "31.12.1998 - 31.12.2023" + }, + { + "Code": "12521-0031", + "Content": "Durchschnittliche Aufenthaltsdauer der Ausländer:\nBundesländer, Stichtag, Geschlecht, Ländergruppierungen/\nStaatsangehörigkeit", + "Time": "31.12.1998 - 31.12.2023" + }, + { + "Code": "12531-0020", + "Content": "Schutzsuchende: Bundesländer, Stichtag, Geschlecht/\nAltersjahre/Familienstand", + "Time": "31.12.2007 - 31.12.2023" + }, + { + "Code": "12531-0021", + "Content": "Schutzsuchende: Bundesländer, Stichtag, Geschlecht/\nAltersjahre/Familienstand, Ländergruppierungen/\nStaatsangehörigkeit", + "Time": "31.12.2007 - 31.12.2023" + }, + { + "Code": "12531-0022", + "Content": "Schutzsuchende: Bundesländer, Stichtag, Geschlecht,\nAltersjahre, Ländergruppierungen/Staatsangehörigkeit", + "Time": "31.12.2007 - 31.12.2023" + }, + { + "Code": "12531-0023", + "Content": "Schutzsuchende: Bundesländer, Stichtag, Geschlecht,\nAltersjahre, Migrantengeneration, Ländergruppierungen\n/Staatsangehörigkeit", + "Time": "31.12.2007 - 31.12.2023" + }, + { + "Code": "12531-0024", + "Content": "Schutzsuchende: Bundesländer, Stichtag, Geschlecht,\nFamilienstand, Ländergruppierungen/Staatsangehörigkeit", + "Time": "31.12.2007 - 31.12.2023" + }, + { + "Code": "12531-0025", + "Content": "Schutzsuchende: Bundesländer, Stichtag, Geschlecht,\nAufenthaltsdauer/Aufenthaltsdauer (Abgrenzung\nEinbürgerungen), Ländergruppierungen/Staatsangehörigkeit", + "Time": "31.12.2007 - 31.12.2023" + }, + { + "Code": "12531-0026", + "Content": "Schutzsuchende: Bundesländer, Stichtag, Geschlecht,\nSchutzstatus/Schutzstatuskategorie, Ländergruppierungen/\nStaatsangehörigkeit", + "Time": "31.12.2007 - 31.12.2023" + }, + { + "Code": "12531-0027", + "Content": "Durchschnittsalter der Schutzsuchenden: Bundesländer,\nStichtag, Geschlecht, Ländergruppierungen/\nStaatsangehörigkeit", + "Time": "31.12.2007 - 31.12.2023" + }, + { + "Code": "12531-0028", + "Content": "Durchschnittliche Aufenthaltsdauer der Schutzsuchenden:\nBundesländer, Stichtag, Geschlecht, Ländergruppierungen/\nStaatsangehörigkeit", + "Time": "31.12.2007 - 31.12.2023" + }, + { + "Code": "12611-0010", + "Content": "Eheschließungen: Bundesländer, Jahre", + "Time": "1990 - 2023" + }, + { + "Code": "12611-0011", + "Content": "Eheschließungen: Bundesländer, Monate", + "Time": "Januar 1990 - März 2024" + }, + { + "Code": "12612-0100", + "Content": "Lebendgeborene: Bundesländer, Jahre, Geschlecht", + "Time": "1990 - 2023" + }, + { + "Code": "12612-0101", + "Content": "Lebendgeborene: Bundesländer, Monate, Geschlecht", + "Time": "Januar 1990 - März 2024" + }, + { + "Code": "12612-0102", + "Content": "Lebendgeborene: Bundesländer, Jahre, Familienstand der\nEltern", + "Time": "1991 - 2023" + }, + { + "Code": "12612-0103", + "Content": "Lebendgeborene: Bundesländer, Jahre, Staatsangehörigkeit des\nKindes und der Eltern", + "Time": "1990 - 2023" + }, + { + "Code": "12612-0104", + "Content": "Zusammengefasste Geburtenziffern (je Frau): Bundesländer,\nJahre, Altersgruppen", + "Time": "1991 - 2022" + }, + { + "Code": "12612-0105", + "Content": "Nettoreproduktionsrate: Bundesländer, Jahre (bis 2010),\nAltersgruppen", + "Time": "2004 - 2010" + }, + { + "Code": "12612-0106", + "Content": "Totgeborene: Bundesländer, Jahre", + "Time": "1990 - 2023" + }, + { + "Code": "12613-0010", + "Content": "Gestorbene: Bundesländer, Jahre", + "Time": "1990 - 2023" + }, + { + "Code": "12613-0011", + "Content": "Gestorbene: Bundesländer, Jahre, Geschlecht", + "Time": "1990 - 2023" + }, + { + "Code": "12613-0012", + "Content": "Gestorbene: Bundesländer, Monate", + "Time": "Januar 1990 - Mai 2024" + }, + { + "Code": "12613-0013", + "Content": "Gestorbene: Bundesländer, Monate, Geschlecht", + "Time": "Januar 1990 - Mai 2024" + }, + { + "Code": "12621-0004", + "Content": "Durchschnittliche Lebenserwartung bei Geburt\n(Periodensterbetafel): Bundesländer, Jahre, Geschlecht", + "Time": "2002/04 - 2020/22" + }, + { + "Code": "12631-0010", + "Content": "Ehescheidungen: Bundesländer, Jahre", + "Time": "1990 - 2023" + }, + { + "Code": "12631-0011", + "Content": "Ehescheidungen: Bundesländer, Jahre, Ehedauer", + "Time": "1997 - 2023" + }, + { + "Code": "12631-0012", + "Content": "Ehescheidungen: Bundesländer, Jahre, Gemeinsame\nminderjährige Kinder", + "Time": "1997 - 2023" + }, + { + "Code": "12651-0003", + "Content": "Begründungen von Lebenspartnerschaften: Bundesländer, Jahre (bis 2017), Geschlecht", + "Time": "2014 - 2017" + }, + { + "Code": "12661-0002", + "Content": "Aufhebungen von Lebenspartnerschaften: Bundesländer, Jahre,\nGeschlecht", + "Time": "2014 - 2023" + }, + { + "Code": "12711-0020", + "Content": "Gesamtwanderungen über die Grenzen der Bundesländer: Bundesländer, Jahre, Nationalität, Geschlecht", + "Time": "2000 - 2023" + }, + { + "Code": "12711-0021", + "Content": "Wanderungen zwischen den Bundesländern: Bundesländer, Jahre, Nationalität, Geschlecht", + "Time": "2000 - 2023" + }, + { + "Code": "12711-0023", + "Content": "Wanderungen zwischen Deutschland und dem Ausland:\nBundesländer, Jahre, Nationalität, Geschlecht", + "Time": "2000 - 2023" + }, + { + "Code": "13111-0005", + "Content": "Sozialversicherungspflichtig Beschäftigte am Arbeitsort:\nBundesländer, Stichtag, Geschlecht", + "Time": "31.03.2008 - 30.09.2023" + }, + { + "Code": "13111-0006", + "Content": "Sozialversicherungspflichtig Beschäftigte am Arbeitsort:\nBundesländer, Stichtag, Wirtschaftsabschnitte", + "Time": "31.03.2008 - 30.09.2023" + }, + { + "Code": "13211-0007", + "Content": "Arbeitslose, Arbeitslosenquoten, Gemeldete Arbeitsstellen:\nBundesländer, Jahre", + "Time": "1991 - 2023" + }, + { + "Code": "13211-0008", + "Content": "Arbeitslose, Arbeitslosenquoten, Gemeldete Arbeitsstellen:\nBundesländer, Monate", + "Time": "Januar 2005 - Juni 2024" + }, + { + "Code": "13211-0009", + "Content": "Arbeitslose: Bundesländer, Jahre, Geschlecht", + "Time": "1991 - 2022" + }, + { + "Code": "13211-0010", + "Content": "Arbeitslose: Bundesländer, Monate, Geschlecht", + "Time": "Januar 2005 - Juni 2024" + }, + { + "Code": "13211-0011", + "Content": "Arbeitslosenquote aller zivilen Erwerbspersonen:\nBundesländer, Jahre, Geschlecht", + "Time": "1991 - 2022" + }, + { + "Code": "13211-0012", + "Content": "Arbeitslosenquote aller zivilen Erwerbspersonen:\nBundesländer, Monate, Geschlecht", + "Time": "Januar 2005 - Juni 2024" + }, + { + "Code": "13311-0002", + "Content": "Erwerbstätige, Arbeitnehmer, Selbständige und mithelfende\nFamilienangehörige (im Inland): Bundesländer, Jahre,\nWirtschaftszweige", + "Time": "1991 - 2023" + }, + { + "Code": "14111-0003", + "Content": "Wahlberechtigte, Wähler, Wahlbeteiligung, Erststimmen,\nZweitstimmen (Allgemeine Bundestagswahlstatistik):\nBundesländer, Stichtag", + "Time": "22.09.2013 - 26.09.2021" + }, + { + "Code": "14111-0004", + "Content": "Gültige Erststimmen, gültige Zweitstimmen (Allgemeine\nBundestagswahlstatistik): Bundesländer, Stichtag, Parteien", + "Time": "22.09.2013 - 26.09.2021" + }, + { + "Code": "14121-0004", + "Content": "Gültige Zweitstimmen (Repräsentative\nBundestagswahlstatistik): Bundesländer, Stichtag, Parteien,\nGeschlecht", + "Time": "22.09.2002 - 26.09.2021" + }, + { + "Code": "14121-0005", + "Content": "Gültige Zweitstimmen (Repräsentative\nBundestagswahlstatistik): Bundesländer, Stichtag, Parteien,\nAltersgruppen", + "Time": "22.09.2013 - 26.09.2021" + }, + { + "Code": "14121-0006", + "Content": "Gültige Zweitstimmen (Repräsentative\nBundestagswahlstatistik): Bundesländer, Stichtag, Parteien,\nGeschlecht, Altersgruppen", + "Time": "22.09.2013 - 26.09.2021" + }, + { + "Code": "14211-0002", + "Content": "Gültige Stimmen (Allgemeine Europawahlstatistik):\nBundesländer, Stichtag, Parteien", + "Time": "12.06.1994 - 09.06.2024" + }, + { + "Code": "14221-0002", + "Content": "Anteil gültiger Stimmen (Repräsentative\nEuropawahlstatistik): Bundesländer, Stichtag, Parteien,\nGeschlecht, Altersgruppen", + "Time": "25.05.2014 - 26.05.2019" + }, + { + "Code": "21111-0010", + "Content": "Schüler, Schulanfänger, Absolventen und Abgänger:\nBundesländer, Schuljahr, Geschlecht", + "Time": "1997/98 - 2022/23" + }, + { + "Code": "21111-0011", + "Content": "Schüler: Bundesländer, Schuljahr, Geschlecht, Schulart,\nJahrgangsstufen", + "Time": "1998/99 - 2022/23" + }, + { + "Code": "21111-0012", + "Content": "Schulanfänger: Bundesländer, Schuljahr, Geschlecht, Schulart, Einschulungsart", + "Time": "1999/00 - 2022/23" + }, + { + "Code": "21111-0013", + "Content": "Absolventen und Abgänger: Bundesländer, Schuljahr,\nGeschlecht, Schulart, Schulabschlüsse", + "Time": "1997/98 - 2021/22" + } + ], + "Copyright": "© Statistisches Bundesamt (Destatis), 2024" +} diff --git a/tests/testthat/xy_variable3/api/catalogue/tables2variable-93dc8a.json b/tests/testthat/xy_variable3/api/catalogue/tables2variable-93dc8a.json new file mode 100644 index 0000000..9d1e0e0 --- /dev/null +++ b/tests/testthat/xy_variable3/api/catalogue/tables2variable-93dc8a.json @@ -0,0 +1,523 @@ +{ + "Ident": { + "Service": "catalogue", + "Method": "tables2variable" + }, + "Status": { + "Code": 0, + "Content": "erfolgreich", + "Type": "Information" + }, + "Parameter": { + "username": "********************", + "password": "********************", + "name": "DLAND", + "selection": "", + "area": "Alle", + "pagelength": "100", + "language": "de" + }, + "List": [ + { + "Code": "11111-0001", + "Content": "Gebietsfläche: Bundesländer, Stichtag", + "Time": "31.12.1995 - 31.12.2022" + }, + { + "Code": "12211-0902", + "Content": "Bevölkerung in Gemeinschaftsunterkünften: Bundesländer,\nJahre, Hauptstatus, Geschlecht, Altersgruppen", + "Time": "2017 - 2023" + }, + { + "Code": "12211-0903", + "Content": "Bevölkerung in Gemeinschaftsunterkünften: Bundesländer,\nJahre, Art der Gemeinschaftsunterkunft, Geschlecht", + "Time": "2017 - 2023" + }, + { + "Code": "12211-1001", + "Content": "Bevölkerung, Erwerbstätige, Erwerbslose, Erwerbspersonen, Nichterwerbspersonen aus Hauptwohnsitzhaushalten: Bundesländer, Jahre, Geschlecht, Altersgruppen", + "Time": "2021 - 2023" + }, + { + "Code": "12211-1002", + "Content": "Bevölkerung, Erwerbstätige, Erwerbslose, Erwerbspersonen, Nichterwerbspersonen aus Hauptwohnsitzhaushalten: Bundesländer, Jahre, Überwiegender Lebensunterhalt, Altersgruppen", + "Time": "2023 - 2023" + }, + { + "Code": "12211-1003", + "Content": "Bevölkerung, Erwerbstätige, Erwerbslose, Erwerbspersonen,\nNichterwerbspersonen aus Hauptwohnsitzhaush.: Bundesländer,\nJahre, Geschlecht, Größenkl. persönl. monatl. Nettoeinkommen", + "Time": "2021 - 2023" + }, + { + "Code": "12211-1004", + "Content": "Erwerbstätige aus Hauptwohnsitzhaushalten: Bundesländer,\nJahre, Geschlecht, Altersgruppen, Stellung im Beruf", + "Time": "2021 - 2023" + }, + { + "Code": "12211-9004", + "Content": "Bevölkerung, Erwerbstätige, Erwerbslose, Erwerbspersonen,\nNichterwerbspersonen: Bundesländer, Jahre (bis 2019)", + "Time": "04/1991 - 2019" + }, + { + "Code": "12211-9014", + "Content": "Bevölkerung (ab 15 Jahren): Bundesländer, Jahre (bis 2019),\nGeschlecht, Allgemeine Schulausbildung", + "Time": "2005 - 2019" + }, + { + "Code": "12211-9015", + "Content": "Bevölkerung (ab 15 Jahren): Bundesländer, Jahre (bis 2019),\nGeschlecht, Beruflicher Bildungsabschluss", + "Time": "2005 - 2019" + }, + { + "Code": "12211-9033", + "Content": "Privathaushalte: Bundesländer, Jahre (bis 2019)", + "Time": "05/1970 - 2019" + }, + { + "Code": "12211-9034", + "Content": "Privathaushalte: Bundesländer, Jahre (bis 2019), Haushaltsgröße", + "Time": "04/1991 - 2019" + }, + { + "Code": "12211-9041", + "Content": "Bevölkerung in Familien/Lebensformen: Bundesländer, Jahre (bis 2019), Lebensformen", + "Time": "04/1996 - 2019" + }, + { + "Code": "12211-9044", + "Content": "Familien, Paare, Alleinerziehende: Bundesländer, Jahre (bis 2019), Vorhandensein von Kindern", + "Time": "04/1996 - 2019" + }, + { + "Code": "12211-9047", + "Content": "Ehepaare, Lebensgemeinschaften, Gemischtgeschlechtliche\nLebensgemeinschaften: Bundesländer, Jahre (bis 2019),\nVorhandensein von Kindern", + "Time": "04/1996 - 2019" + }, + { + "Code": "12211-9051", + "Content": "Alleinerziehende: Bundesländer, Jahre (bis 2019),\nGeschlecht, Vorhandensein von Kindern", + "Time": "04/1996 - 2019" + }, + { + "Code": "12211-9053", + "Content": "Alleinstehende: Bundesländer, Jahre (bis 2019), Geschlecht,\nHaushaltsgröße", + "Time": "04/1996 - 2019" + }, + { + "Code": "12211-9056", + "Content": "Ledige Kinder in Familien: Bundesländer, Jahre (bis 2019),\nFamilienformen", + "Time": "04/1996 - 2019" + }, + { + "Code": "12231-0101", + "Content": "Bevölkerung von 16 bis unter 75 Jahren in\nHauptwohnsitzhaushalten: Bundesländer, Jahre, Altersgruppen,\nPrivate Internetaktivitäten in den letzten drei Monaten", + "Time": "2022 - 2023" + }, + { + "Code": "12231-0102", + "Content": "Bevölkerung von 16 bis unter 75 Jahren in\nHauptwohnsitzhaushalten: Bundesländer, Jahre, Altersgruppen,\nPrivate Internetkäufe in den letzten drei Monaten", + "Time": "2022 - 2023" + }, + { + "Code": "12231-0103", + "Content": "Bevölkerung von 16 bis unter 75 Jahren in\nHauptwohnsitzhaushalten: Bundesländer, Jahre, Altersgruppen,\nArt der Computer- und Internetkenntnisse", + "Time": "2023 - 2023" + }, + { + "Code": "12251-0101", + "Content": "Erwerbstätige aus Hauptwohnsitzhaushalten: Bundesländer, Jahre, Geschlecht, Stellung im Beruf", + "Time": "2021 - 2023" + }, + { + "Code": "12251-0102", + "Content": "Erwerbstätige aus Hauptwohnsitzhaushalten: Bundesländer,\nJahre, Geschlecht, Stellung im Beruf, Wochenend- und\nFeiertagsarbeit", + "Time": "2021 - 2023" + }, + { + "Code": "12251-0103", + "Content": "Erwerbstätige aus Hauptwohnsitzhaushalten: Bundesländer,\nJahre, Geschlecht, Stellung im Beruf, Abend-, Nacht- und\nSchichtarbeit", + "Time": "2021 - 2023" + }, + { + "Code": "12251-0104", + "Content": "Erwerbstätige aus Hauptwohnsitzhaushalten: Bundesländer,\nJahre, Geschlecht, Stellung im Beruf, Erwerbsarbeit zu\nHause", + "Time": "2021 - 2023" + }, + { + "Code": "12251-0108", + "Content": "Abhängig Erwerbstätige aus Hauptwohnsitzhaushalten:\nBundesländer, Jahre, Geschlecht, Altersgruppen, Art des\nArbeitsvertrages", + "Time": "2021 - 2023" + }, + { + "Code": "12411-0010", + "Content": "Bevölkerung: Bundesländer, Stichtag", + "Time": "31.12.1958 - 31.12.2023" + }, + { + "Code": "12411-0011", + "Content": "Bevölkerung: Bundesländer, Stichtag, Geschlecht", + "Time": "31.12.1967 - 31.12.2023" + }, + { + "Code": "12411-0012", + "Content": "Bevölkerung: Bundesländer, Stichtag, Altersjahre", + "Time": "31.12.1967 - 31.12.2023" + }, + { + "Code": "12411-0013", + "Content": "Bevölkerung: Bundesländer, Stichtag, Geschlecht, Altersjahre", + "Time": "31.12.1967 - 31.12.2023" + }, + { + "Code": "12411-0014", + "Content": "Bevölkerung: Bundesländer, Stichtag, Nationalität,\nGeschlecht, Altersjahre", + "Time": "31.12.2000 - 31.12.2023" + }, + { + "Code": "12411-0021", + "Content": "Bevölkerung: Bundesländer, Stichtag zum Quartalsende,\nGeschlecht", + "Time": "31.03.1991 - 31.12.2023" + }, + { + "Code": "12411-0042", + "Content": "Durchschnittliche Bevölkerung: Bundesländer, Jahre,\nNationalität, Geschlecht", + "Time": "2000 - 2023" + }, + { + "Code": "12411-0050", + "Content": "Bevölkerungsdichte: Bundesländer, Stichtag", + "Time": "31.12.1995 - 31.12.2022" + }, + { + "Code": "12421-0003", + "Content": "Vorausberechneter Bevölkerungsstand: Bundesländer, Stichtag,\nVarianten der Bevölkerungsvorausberechnung", + "Time": "31.12.2022 - 31.12.2070" + }, + { + "Code": "12421-0004", + "Content": "Vorausberechneter Bevölkerungsstand: Bundesländer, Stichtag,\nVarianten der Bevölkerungsvorausberechnung, Geschlecht,\nAltersjahre", + "Time": "31.12.2022 - 31.12.2070" + }, + { + "Code": "12421-0101", + "Content": "Vorausberechnete Privathaushalte: Bundesländer, Jahre,\nVarianten der Haushaltsvorausberechnung, Haushaltsgröße", + "Time": "2019 - 2040" + }, + { + "Code": "12521-0020", + "Content": "Ausländer: Bundesländer, Stichtag, Geschlecht/Altersjahre/\nFamilienstand", + "Time": "30.09.1980 - 31.12.2023" + }, + { + "Code": "12521-0021", + "Content": "Ausländer: Bundesländer, Stichtag, Geschlecht/Altersjahre/\nFamilienstand, Ländergruppierungen/Staatsangehörigkeit", + "Time": "30.09.1980 - 31.12.2023" + }, + { + "Code": "12521-0022", + "Content": "Ausländer: Bundesländer, Stichtag, Geschlecht, Altersjahre,\nLändergruppierungen/Staatsangehörigkeit", + "Time": "31.12.1998 - 31.12.2023" + }, + { + "Code": "12521-0023", + "Content": "Ausländer: Bundesländer, Stichtag, Geschlecht, Altersjahre,\nMigrantengeneration, Ländergruppierungen/Staatsangehörigkeit", + "Time": "31.12.1998 - 31.12.2023" + }, + { + "Code": "12521-0024", + "Content": "Ausländer: Bundesländer, Stichtag, Geschlecht,\nFamilienstand, Ländergruppierungen/Staatsangehörigkeit", + "Time": "31.12.1998 - 31.12.2023" + }, + { + "Code": "12521-0025", + "Content": "Ausländer: Bundesländer, Stichtag, Geschlecht,\nAufenthaltsdauer/Aufenthaltsdauer (Abgrenzung\nEinbürgerungen), Ländergruppierungen/Staatsangehörigkeit", + "Time": "31.12.1998 - 31.12.2023" + }, + { + "Code": "12521-0026", + "Content": "Ausländer: Bundesländer, Stichtag, Geschlecht,\nAufenthaltstitel/Ausgewählte Aufenthaltstitel,\nLändergruppierungen/Staatsangehörigkeit", + "Time": "31.12.1998 - 31.12.2023" + }, + { + "Code": "12521-0027", + "Content": "Ausländer: Bundesländer, Jahre, Geschlecht,\nRegisterbewegungen (regional), Ländergruppierungen/\nStaatsangehörigkeit", + "Time": "2013 - 2023" + }, + { + "Code": "12521-0028", + "Content": "Ausländer: Bundesländer, Jahre, Geschlecht, Altersjahre,\nRegisterzu- und abgänge (regional), Ländergruppierungen/\nStaatsangehörigkeit", + "Time": "2013 - 2023" + }, + { + "Code": "12521-0029", + "Content": "Ausländer: Bundesländer, Jahre, Geschlecht,\nAufenthaltsdauer, Registerabgänge (regional),\nLändergruppierungen/Staatsangehörigkeit", + "Time": "2013 - 2023" + }, + { + "Code": "12521-0030", + "Content": "Durchschnittsalter der Ausländer: Bundesländer, Stichtag,\nGeschlecht, Ländergruppierungen/Staatsangehörigkeit", + "Time": "31.12.1998 - 31.12.2023" + }, + { + "Code": "12521-0031", + "Content": "Durchschnittliche Aufenthaltsdauer der Ausländer:\nBundesländer, Stichtag, Geschlecht, Ländergruppierungen/\nStaatsangehörigkeit", + "Time": "31.12.1998 - 31.12.2023" + }, + { + "Code": "12531-0020", + "Content": "Schutzsuchende: Bundesländer, Stichtag, Geschlecht/\nAltersjahre/Familienstand", + "Time": "31.12.2007 - 31.12.2023" + }, + { + "Code": "12531-0021", + "Content": "Schutzsuchende: Bundesländer, Stichtag, Geschlecht/\nAltersjahre/Familienstand, Ländergruppierungen/\nStaatsangehörigkeit", + "Time": "31.12.2007 - 31.12.2023" + }, + { + "Code": "12531-0022", + "Content": "Schutzsuchende: Bundesländer, Stichtag, Geschlecht,\nAltersjahre, Ländergruppierungen/Staatsangehörigkeit", + "Time": "31.12.2007 - 31.12.2023" + }, + { + "Code": "12531-0023", + "Content": "Schutzsuchende: Bundesländer, Stichtag, Geschlecht,\nAltersjahre, Migrantengeneration, Ländergruppierungen\n/Staatsangehörigkeit", + "Time": "31.12.2007 - 31.12.2023" + }, + { + "Code": "12531-0024", + "Content": "Schutzsuchende: Bundesländer, Stichtag, Geschlecht,\nFamilienstand, Ländergruppierungen/Staatsangehörigkeit", + "Time": "31.12.2007 - 31.12.2023" + }, + { + "Code": "12531-0025", + "Content": "Schutzsuchende: Bundesländer, Stichtag, Geschlecht,\nAufenthaltsdauer/Aufenthaltsdauer (Abgrenzung\nEinbürgerungen), Ländergruppierungen/Staatsangehörigkeit", + "Time": "31.12.2007 - 31.12.2023" + }, + { + "Code": "12531-0026", + "Content": "Schutzsuchende: Bundesländer, Stichtag, Geschlecht,\nSchutzstatus/Schutzstatuskategorie, Ländergruppierungen/\nStaatsangehörigkeit", + "Time": "31.12.2007 - 31.12.2023" + }, + { + "Code": "12531-0027", + "Content": "Durchschnittsalter der Schutzsuchenden: Bundesländer,\nStichtag, Geschlecht, Ländergruppierungen/\nStaatsangehörigkeit", + "Time": "31.12.2007 - 31.12.2023" + }, + { + "Code": "12531-0028", + "Content": "Durchschnittliche Aufenthaltsdauer der Schutzsuchenden:\nBundesländer, Stichtag, Geschlecht, Ländergruppierungen/\nStaatsangehörigkeit", + "Time": "31.12.2007 - 31.12.2023" + }, + { + "Code": "12611-0010", + "Content": "Eheschließungen: Bundesländer, Jahre", + "Time": "1990 - 2023" + }, + { + "Code": "12611-0011", + "Content": "Eheschließungen: Bundesländer, Monate", + "Time": "Januar 1990 - März 2024" + }, + { + "Code": "12612-0100", + "Content": "Lebendgeborene: Bundesländer, Jahre, Geschlecht", + "Time": "1990 - 2023" + }, + { + "Code": "12612-0101", + "Content": "Lebendgeborene: Bundesländer, Monate, Geschlecht", + "Time": "Januar 1990 - März 2024" + }, + { + "Code": "12612-0102", + "Content": "Lebendgeborene: Bundesländer, Jahre, Familienstand der\nEltern", + "Time": "1991 - 2023" + }, + { + "Code": "12612-0103", + "Content": "Lebendgeborene: Bundesländer, Jahre, Staatsangehörigkeit des\nKindes und der Eltern", + "Time": "1990 - 2023" + }, + { + "Code": "12612-0104", + "Content": "Zusammengefasste Geburtenziffern (je Frau): Bundesländer,\nJahre, Altersgruppen", + "Time": "1991 - 2022" + }, + { + "Code": "12612-0105", + "Content": "Nettoreproduktionsrate: Bundesländer, Jahre (bis 2010),\nAltersgruppen", + "Time": "2004 - 2010" + }, + { + "Code": "12612-0106", + "Content": "Totgeborene: Bundesländer, Jahre", + "Time": "1990 - 2023" + }, + { + "Code": "12613-0010", + "Content": "Gestorbene: Bundesländer, Jahre", + "Time": "1990 - 2023" + }, + { + "Code": "12613-0011", + "Content": "Gestorbene: Bundesländer, Jahre, Geschlecht", + "Time": "1990 - 2023" + }, + { + "Code": "12613-0012", + "Content": "Gestorbene: Bundesländer, Monate", + "Time": "Januar 1990 - Mai 2024" + }, + { + "Code": "12613-0013", + "Content": "Gestorbene: Bundesländer, Monate, Geschlecht", + "Time": "Januar 1990 - Mai 2024" + }, + { + "Code": "12621-0004", + "Content": "Durchschnittliche Lebenserwartung bei Geburt\n(Periodensterbetafel): Bundesländer, Jahre, Geschlecht", + "Time": "2002/04 - 2020/22" + }, + { + "Code": "12631-0010", + "Content": "Ehescheidungen: Bundesländer, Jahre", + "Time": "1990 - 2023" + }, + { + "Code": "12631-0011", + "Content": "Ehescheidungen: Bundesländer, Jahre, Ehedauer", + "Time": "1997 - 2023" + }, + { + "Code": "12631-0012", + "Content": "Ehescheidungen: Bundesländer, Jahre, Gemeinsame\nminderjährige Kinder", + "Time": "1997 - 2023" + }, + { + "Code": "12651-0003", + "Content": "Begründungen von Lebenspartnerschaften: Bundesländer, Jahre (bis 2017), Geschlecht", + "Time": "2014 - 2017" + }, + { + "Code": "12661-0002", + "Content": "Aufhebungen von Lebenspartnerschaften: Bundesländer, Jahre,\nGeschlecht", + "Time": "2014 - 2023" + }, + { + "Code": "12711-0020", + "Content": "Gesamtwanderungen über die Grenzen der Bundesländer: Bundesländer, Jahre, Nationalität, Geschlecht", + "Time": "2000 - 2023" + }, + { + "Code": "12711-0021", + "Content": "Wanderungen zwischen den Bundesländern: Bundesländer, Jahre, Nationalität, Geschlecht", + "Time": "2000 - 2023" + }, + { + "Code": "12711-0023", + "Content": "Wanderungen zwischen Deutschland und dem Ausland:\nBundesländer, Jahre, Nationalität, Geschlecht", + "Time": "2000 - 2023" + }, + { + "Code": "13111-0005", + "Content": "Sozialversicherungspflichtig Beschäftigte am Arbeitsort:\nBundesländer, Stichtag, Geschlecht", + "Time": "31.03.2008 - 30.09.2023" + }, + { + "Code": "13111-0006", + "Content": "Sozialversicherungspflichtig Beschäftigte am Arbeitsort:\nBundesländer, Stichtag, Wirtschaftsabschnitte", + "Time": "31.03.2008 - 30.09.2023" + }, + { + "Code": "13211-0007", + "Content": "Arbeitslose, Arbeitslosenquoten, Gemeldete Arbeitsstellen:\nBundesländer, Jahre", + "Time": "1991 - 2023" + }, + { + "Code": "13211-0008", + "Content": "Arbeitslose, Arbeitslosenquoten, Gemeldete Arbeitsstellen:\nBundesländer, Monate", + "Time": "Januar 2005 - Juni 2024" + }, + { + "Code": "13211-0009", + "Content": "Arbeitslose: Bundesländer, Jahre, Geschlecht", + "Time": "1991 - 2022" + }, + { + "Code": "13211-0010", + "Content": "Arbeitslose: Bundesländer, Monate, Geschlecht", + "Time": "Januar 2005 - Juni 2024" + }, + { + "Code": "13211-0011", + "Content": "Arbeitslosenquote aller zivilen Erwerbspersonen:\nBundesländer, Jahre, Geschlecht", + "Time": "1991 - 2022" + }, + { + "Code": "13211-0012", + "Content": "Arbeitslosenquote aller zivilen Erwerbspersonen:\nBundesländer, Monate, Geschlecht", + "Time": "Januar 2005 - Juni 2024" + }, + { + "Code": "13311-0002", + "Content": "Erwerbstätige, Arbeitnehmer, Selbständige und mithelfende\nFamilienangehörige (im Inland): Bundesländer, Jahre,\nWirtschaftszweige", + "Time": "1991 - 2023" + }, + { + "Code": "14111-0003", + "Content": "Wahlberechtigte, Wähler, Wahlbeteiligung, Erststimmen,\nZweitstimmen (Allgemeine Bundestagswahlstatistik):\nBundesländer, Stichtag", + "Time": "22.09.2013 - 26.09.2021" + }, + { + "Code": "14111-0004", + "Content": "Gültige Erststimmen, gültige Zweitstimmen (Allgemeine\nBundestagswahlstatistik): Bundesländer, Stichtag, Parteien", + "Time": "22.09.2013 - 26.09.2021" + }, + { + "Code": "14121-0004", + "Content": "Gültige Zweitstimmen (Repräsentative\nBundestagswahlstatistik): Bundesländer, Stichtag, Parteien,\nGeschlecht", + "Time": "22.09.2002 - 26.09.2021" + }, + { + "Code": "14121-0005", + "Content": "Gültige Zweitstimmen (Repräsentative\nBundestagswahlstatistik): Bundesländer, Stichtag, Parteien,\nAltersgruppen", + "Time": "22.09.2013 - 26.09.2021" + }, + { + "Code": "14121-0006", + "Content": "Gültige Zweitstimmen (Repräsentative\nBundestagswahlstatistik): Bundesländer, Stichtag, Parteien,\nGeschlecht, Altersgruppen", + "Time": "22.09.2013 - 26.09.2021" + }, + { + "Code": "14211-0002", + "Content": "Gültige Stimmen (Allgemeine Europawahlstatistik):\nBundesländer, Stichtag, Parteien", + "Time": "12.06.1994 - 09.06.2024" + }, + { + "Code": "14221-0002", + "Content": "Anteil gültiger Stimmen (Repräsentative\nEuropawahlstatistik): Bundesländer, Stichtag, Parteien,\nGeschlecht, Altersgruppen", + "Time": "25.05.2014 - 26.05.2019" + }, + { + "Code": "21111-0010", + "Content": "Schüler, Schulanfänger, Absolventen und Abgänger:\nBundesländer, Schuljahr, Geschlecht", + "Time": "1997/98 - 2022/23" + }, + { + "Code": "21111-0011", + "Content": "Schüler: Bundesländer, Schuljahr, Geschlecht, Schulart,\nJahrgangsstufen", + "Time": "1998/99 - 2022/23" + }, + { + "Code": "21111-0012", + "Content": "Schulanfänger: Bundesländer, Schuljahr, Geschlecht, Schulart, Einschulungsart", + "Time": "1999/00 - 2022/23" + }, + { + "Code": "21111-0013", + "Content": "Absolventen und Abgänger: Bundesländer, Schuljahr,\nGeschlecht, Schulart, Schulabschlüsse", + "Time": "1997/98 - 2021/22" + } + ], + "Copyright": "© Statistisches Bundesamt (Destatis), 2024" +} From 7a315f580f690f3b00d3e88ef6545867b0e98ae6 Mon Sep 17 00:00:00 2001 From: bubux Date: Wed, 10 Jul 2024 09:05:28 +0200 Subject: [PATCH 35/52] fix last tests --- .../{modifieddata-febf13.json => modifieddata-87a36f.json} | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) rename tests/testthat/modified2/api/catalogue/{modifieddata-febf13.json => modifieddata-87a36f.json} (94%) diff --git a/tests/testthat/modified2/api/catalogue/modifieddata-febf13.json b/tests/testthat/modified2/api/catalogue/modifieddata-87a36f.json similarity index 94% rename from tests/testthat/modified2/api/catalogue/modifieddata-febf13.json rename to tests/testthat/modified2/api/catalogue/modifieddata-87a36f.json index 93b2ada..957456c 100644 --- a/tests/testthat/modified2/api/catalogue/modifieddata-febf13.json +++ b/tests/testthat/modified2/api/catalogue/modifieddata-87a36f.json @@ -13,7 +13,7 @@ "password": "********************", "selection": "61111", "type": "Alle", - "date": "09.07.2024", + "date": "10.07.2024", "pagelength": "100", "language": "de", "area": "Alle" From d8fbeb5584b6ff021ec365284ed245874cee9aff Mon Sep 17 00:00:00 2001 From: bubux Date: Thu, 11 Jul 2024 12:45:31 +0200 Subject: [PATCH 36/52] update Zensus API URL --- R/gen_api.R | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/R/gen_api.R b/R/gen_api.R index a592922..6410c3a 100644 --- a/R/gen_api.R +++ b/R/gen_api.R @@ -74,7 +74,7 @@ gen_regio_api <- function(endpoint, ...) { #' gen_zensus_api <- function(endpoint, ...) { - httr2::request("https://ergebnisse2011.zensus2022.de/api/rest/2020") %>% + httr2::request("https://ergebnisse.zensus2022.de/api/rest/2020") %>% httr2::req_user_agent("https://github.com/CorrelAid/restatis") %>% httr2::req_url_path_append(endpoint) %>% httr2::req_url_query(!!!gen_auth_get(database = "zensus"), ...) %>% From c32c9d5a11e1f2453d4387c87198064720636b24 Mon Sep 17 00:00:00 2001 From: KovaZo Date: Thu, 11 Jul 2024 17:26:35 +0200 Subject: [PATCH 37/52] gen_catalouge anpassung --- R/gen_catalogue.R | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/R/gen_catalogue.R b/R/gen_catalogue.R index eac3050..b988c39 100644 --- a/R/gen_catalogue.R +++ b/R/gen_catalogue.R @@ -233,9 +233,9 @@ gen_catalogue <- function(code = NULL, if (all(c("tables", "statistics", "cubes") %in% category)) { - list_resp <- list("Cubes" = if(length(list_of_cubes) == 1 | db == "gen_zensus_api"){tibble::as_tibble(list_of_cubes)} else {forming_evas(list_of_cubes)}, - "Statistics" = if(length(list_of_stats) == 1 | db == "gen_zensus_api"){tibble::as_tibble(list_of_stats)} else {forming_evas(list_of_stats)}, - "Tables" = if(length(list_of_tabs) == 1 | db == "gen_zensus_api"){tibble::as_tibble(list_of_tabs)} else {forming_evas(list_of_tabs)}) + list_resp <- list("Cubes" = if(length(list_of_cubes) == 1){tibble::as_tibble(list_of_cubes)} else {forming_evas(list_of_cubes)}, + "Statistics" = if(length(list_of_stats) == 1){tibble::as_tibble(list_of_stats)} else {forming_evas(list_of_stats)}, + "Tables" = if(length(list_of_tabs) == 1){tibble::as_tibble(list_of_tabs)} else {forming_evas(list_of_tabs)}) #--------------------------------------------------------------------------- @@ -245,7 +245,7 @@ gen_catalogue <- function(code = NULL, list_resp <- list_of_cubes - } else if (length(list_of_cubes) == 1 | db == "gen_zensus_api"){ + } else if (length(list_of_cubes) == 1 ){ list_resp <- list("Cubes" = tibble::as_tibble(list_of_cubes)) @@ -258,7 +258,7 @@ gen_catalogue <- function(code = NULL, #--------------------------------------------------------------------------- } else if ("statistics" %in% category) { - if (length(list_of_stats) == 1 | db == "gen_zensus_api"){ + if (length(list_of_stats) == 1 ){ list_resp <- list("Statistics" = tibble::as_tibble(list_of_stats)) @@ -272,7 +272,7 @@ gen_catalogue <- function(code = NULL, #--------------------------------------------------------------------------- } else if ("tables" %in% category) { - if(length(list_of_tabs) == 1 | db == "gen_zensus_api"){ + if(length(list_of_tabs) == 1 ){ list_resp <- list("Tables" = tibble::as_tibble(list_of_tabs)) From 363c88e7649c02afbc0f155a79d8b8669adcb3f9 Mon Sep 17 00:00:00 2001 From: KovaZo Date: Fri, 12 Jul 2024 19:51:43 +0200 Subject: [PATCH 38/52] Updates for zensus --- R/gen_find.R | 17 +++++++++-------- R/gen_objects2var.R | 4 +--- R/utils_dataprocessing.R | 6 ++++++ 3 files changed, 16 insertions(+), 11 deletions(-) diff --git a/R/gen_find.R b/R/gen_find.R index 2b66e50..96482d3 100644 --- a/R/gen_find.R +++ b/R/gen_find.R @@ -425,7 +425,7 @@ gen_find <- function(term = NULL, } else { - df_stats <- find_token(results_json$Variables, + df_variables <- find_token(results_json$Variables, error.input = error.ignore, text = verbose, sub_category = "Variables") @@ -546,15 +546,16 @@ gen_find <- function(term = NULL, df_cubes <- "There are generally no 'cubes' objects available for the 'zensus' database." } + } #--------------------------------------------------------------------------- - list_resp <- list( - "Tables" = if("tables" %in% category) { tibble::as_tibble(df_table) }, - "Statistics" = if("statistics" %in% category) { tibble::as_tibble(df_stats) }, - "Variables" = if("variables" %in% category) { tibble::as_tibble(df_variables) }, - "Cubes" = if("cubes" %in% category) { tibble::as_tibble(df_cubes) } - ) + list_resp <- list() + + if("tables" %in% category) {list_resp$Tables <- tibble::as_tibble(df_table) } + if("statistics" %in% category) {list_resp$Statistics <- tibble::as_tibble(df_stats) } + if("variables" %in% category) {list_resp$Variables <- tibble::as_tibble(df_variables) } + if("cubes" %in% category) {list_resp$Cubes <- tibble::as_tibble(df_cubes) } attr(list_resp, "Term") <- results_json$Parameter$term attr(list_resp, "Database") <- rev_database_function(db) @@ -565,7 +566,7 @@ gen_find <- function(term = NULL, return(list_resp) } - }}) + }) res <- check_results(res) diff --git a/R/gen_objects2var.R b/R/gen_objects2var.R index 151c648..17f39f8 100644 --- a/R/gen_objects2var.R +++ b/R/gen_objects2var.R @@ -174,9 +174,7 @@ gen_objects2var <- function(code = NULL, if ("cubes" %in% category && db == "gen_zensus_api") { - df_cubes <- "No 'cubes' object available for 'zensus'-database." - - return(df_cubes) + df_cubes <- "There are generally no 'cubes' objects available for the 'zensus' database." } else if ("cubes" %in% category && (db == "gen_api" || db == "gen_regio_api")) { diff --git a/R/utils_dataprocessing.R b/R/utils_dataprocessing.R index d45ec8f..b526565 100644 --- a/R/utils_dataprocessing.R +++ b/R/utils_dataprocessing.R @@ -1131,8 +1131,14 @@ test_database_function <- function(input){ res <- c("genesis" = "gen_api", "zensus" = "gen_zensus_api", "regio" = "gen_regio_api") + } else if(length(res) != length(input)){ + + stop("One or more of the specified databases are not part of this package. Currently only 'genesis', 'zensus', and 'regio' are implemented.", + call. = FALSE) } + #----------------------------------------------------------------------------- + if (identical(res, c())){ stop("You have to correctly specifiy a 'database' parameter. Please refer to the documentation for further information.", From 2593b371576e11b5fbc90ef4756f3a21fbd952d0 Mon Sep 17 00:00:00 2001 From: KovaZo Date: Fri, 12 Jul 2024 21:05:01 +0200 Subject: [PATCH 39/52] database check update --- R/gen_alternative_terms.R | 6 ++- R/gen_catalogue.R | 7 ++- R/gen_find.R | 23 ++++++---- R/gen_jobs.R | 4 +- R/gen_list_results.R | 4 +- R/gen_meta_data.R | 44 ++++++++++++++++--- R/gen_modified_data.R | 6 ++- R/gen_objects2stat.R | 7 ++- R/gen_objects2var.R | 7 ++- R/gen_qualitysigns.R | 4 +- R/gen_var2-val2.R | 28 ++++++++++-- R/utils_dataprocessing.R | 89 +++++++++++++++++++++++++++++++++++++-- 12 files changed, 197 insertions(+), 32 deletions(-) diff --git a/R/gen_alternative_terms.R b/R/gen_alternative_terms.R index 25fa6b7..fbb9a49 100644 --- a/R/gen_alternative_terms.R +++ b/R/gen_alternative_terms.R @@ -32,7 +32,11 @@ gen_alternative_terms <- function(term = NULL, caller <- as.character(match.call()[1]) - gen_fun <- test_database_function(database) + check_function_input(verbose = verbose) + + gen_fun <- test_database_function(database, + error.input = T, + text = verbose) check_function_input(term = term, similarity = similarity, diff --git a/R/gen_catalogue.R b/R/gen_catalogue.R index b988c39..4f21d18 100644 --- a/R/gen_catalogue.R +++ b/R/gen_catalogue.R @@ -39,7 +39,12 @@ gen_catalogue <- function(code = NULL, caller <- as.character(match.call()[1]) - gen_fun <- test_database_function(database) + check_function_input(error.ignore = error.ignore, + verbose = verbose) + + gen_fun <- test_database_function(database, + error.input = error.ignore, + text = verbose) check_function_input(code = code, category = category, diff --git a/R/gen_find.R b/R/gen_find.R index 96482d3..70aeefd 100644 --- a/R/gen_find.R +++ b/R/gen_find.R @@ -42,7 +42,12 @@ gen_find <- function(term = NULL, caller <- as.character(match.call()[1]) - gen_fun <- test_database_function(database) + check_function_input(error.ignore = error.ignore, + verbose = verbose) + + gen_fun <- test_database_function(database, + error.input = error.ignore, + text = verbose) check_function_input(term = term, category = category, @@ -160,7 +165,7 @@ gen_find <- function(term = NULL, if (nrow(df_table) != 0) { - df_table$Titel <- titel_search(df_table, term) + df_table$Titel <- titel_search(df_table, term, text = verbose) } @@ -203,7 +208,7 @@ gen_find <- function(term = NULL, if (nrow(df_table) != 0) { - df_table$Titel <- titel_search(df_table, term) + df_table$Titel <- titel_search(df_table, term, text = verbose) } @@ -257,7 +262,7 @@ gen_find <- function(term = NULL, if (nrow(df_stats) != 0) { - df_stats$Titel <- titel_search(df_stats, term) + df_stats$Titel <- titel_search(df_stats, term, text = verbose) } @@ -302,7 +307,7 @@ gen_find <- function(term = NULL, if (nrow(df_stats) != 0) { - df_stats$Titel <- titel_search(df_stats, term) + df_stats$Titel <- titel_search(df_stats, term, text = verbose) } @@ -357,7 +362,7 @@ gen_find <- function(term = NULL, if (nrow(df_variables) != 0) { - df_variables$Titel <- titel_search(df_variables, term) + df_variables$Titel <- titel_search(df_variables, term, text = verbose) } @@ -402,7 +407,7 @@ gen_find <- function(term = NULL, if (nrow(df_variables) != 0) { - df_variables$Titel <- titel_search(df_variables, term) + df_variables$Titel <- titel_search(df_variables, term, text = verbose) } @@ -461,7 +466,7 @@ gen_find <- function(term = NULL, if (nrow(df_cubes) != 0) { - df_cubes$Titel <- titel_search(df_cubes, term) + df_cubes$Titel <- titel_search(df_cubes, term, text = verbose) } @@ -510,7 +515,7 @@ gen_find <- function(term = NULL, if (nrow(df_cubes) != 0) { - df_cubes$Titel <- titel_search(df_cubes, term) + df_cubes$Titel <- titel_search(df_cubes, term, text = verbose) } diff --git a/R/gen_jobs.R b/R/gen_jobs.R index 7917af5..d4395b8 100644 --- a/R/gen_jobs.R +++ b/R/gen_jobs.R @@ -20,7 +20,9 @@ gen_list_jobs <- function(database = c("genesis", "regio"), flat = FALSE, ...) { - gen_fun <- test_database_function(database) + gen_fun <- test_database_function(database, + error.input = T, + text = T) if (length(database) != 1) { diff --git a/R/gen_list_results.R b/R/gen_list_results.R index 0e2106f..3647ba0 100644 --- a/R/gen_list_results.R +++ b/R/gen_list_results.R @@ -13,7 +13,9 @@ gen_list_results <- function(database = c("genesis", "zensus", "regio"), area = c("all", "public", "user"), ...) { - gen_fun <- test_database_function(database) + gen_fun <- test_database_function(database, + error.input = T, + text = T) area <- match.arg(area) diff --git a/R/gen_meta_data.R b/R/gen_meta_data.R index 18515bf..1a2d98b 100644 --- a/R/gen_meta_data.R +++ b/R/gen_meta_data.R @@ -29,7 +29,12 @@ gen_metadata_statistic <- function(code = NULL, caller <- as.character(match.call()[1]) - gen_fun <- test_database_function(database) + check_function_input(error.ignore = error.ignore, + verbose = verbose) + + gen_fun <- test_database_function(database, + error.input = error.ignore, + text = verbose) check_function_input(code = code, error.ignore = error.ignore, @@ -152,7 +157,12 @@ gen_metadata_variable <- function(code = NULL, caller <- as.character(match.call()[1]) - gen_fun <- test_database_function(database) + check_function_input(error.ignore = error.ignore, + verbose = verbose) + + gen_fun <- test_database_function(database, + error.input = error.ignore, + text = verbose) check_function_input(code = code, error.ignore = error.ignore, @@ -283,7 +293,12 @@ gen_metadata_value <- function(code = NULL, caller <- as.character(match.call()[1]) - gen_fun <- test_database_function(database) + check_function_input(error.ignore = error.ignore, + verbose = verbose) + + gen_fun <- test_database_function(database, + error.input = error.ignore, + text = verbose) check_function_input(code = code, error.ignore = error.ignore, @@ -411,7 +426,12 @@ gen_metadata_table <- function(code = NULL, caller <- as.character(match.call()[1]) - gen_fun <- test_database_function(database) + check_function_input(error.ignore = error.ignore, + verbose = verbose) + + gen_fun <- test_database_function(database, + error.input = error.ignore, + text = verbose) check_function_input(code = code, error.ignore = error.ignore, @@ -604,15 +624,20 @@ gen_metadata_table <- function(code = NULL, #' gen_metadata_cube <- function(code = NULL, database = c("all", "genesis", "regio"), - error.ignore = FALSE, area = c("all", "public", "user"), + error.ignore = FALSE, verbose = TRUE, raw = raw, ...) { caller <- as.character(match.call()[1]) - gen_fun <- test_database_function(database) + check_function_input(error.ignore = error.ignore, + verbose = verbose) + + gen_fun <- test_database_function(database, + error.input = error.ignore, + text = verbose) check_function_input(code = code, error.ignore = error.ignore, @@ -788,7 +813,12 @@ gen_metadata <- function(code = NULL, caller <- as.character(match.call()[1]) - gen_fun <- test_database_function(database) + check_function_input(error.ignore = error.ignore, + verbose = verbose) + + gen_fun <- test_database_function(database, + error.input = error.ignore, + text = verbose) check_function_input(code = code, error.ignore = error.ignore, diff --git a/R/gen_modified_data.R b/R/gen_modified_data.R index ec2cc03..62dc2fe 100644 --- a/R/gen_modified_data.R +++ b/R/gen_modified_data.R @@ -32,7 +32,11 @@ gen_modified_data <- function(code = "", verbose = TRUE, ...) { - gen_fun <- test_database_function(database) + check_function_input(verbose = verbose) + + gen_fun <- test_database_function(database, + error.input = T, + text = verbose) type <- match.arg(type) diff --git a/R/gen_objects2stat.R b/R/gen_objects2stat.R index 61536ff..fe8777c 100644 --- a/R/gen_objects2stat.R +++ b/R/gen_objects2stat.R @@ -38,7 +38,12 @@ gen_objects2stat <- function(code = NULL, caller <- as.character(match.call()[1]) - gen_fun <- test_database_function(database) + check_function_input(error.ignore = error.ignore, + verbose = verbose) + + gen_fun <- test_database_function(database, + error.input = error.ignore, + text = verbose) check_function_input(code = code, category = category, diff --git a/R/gen_objects2var.R b/R/gen_objects2var.R index 17f39f8..1073d57 100644 --- a/R/gen_objects2var.R +++ b/R/gen_objects2var.R @@ -38,7 +38,12 @@ gen_objects2var <- function(code = NULL, caller <- as.character(match.call()[1]) - gen_fun <- test_database_function(database) + check_function_input(error.ignore = error.ignore, + verbose = verbose) + + gen_fun <- test_database_function(database, + error.input = error.ignore, + text = verbose) check_function_input(code = code, category = category, diff --git a/R/gen_qualitysigns.R b/R/gen_qualitysigns.R index 931828e..8561f1e 100644 --- a/R/gen_qualitysigns.R +++ b/R/gen_qualitysigns.R @@ -11,7 +11,9 @@ gen_signs <- function(database = c("all", "genesis", "zensus", "regio"), ...) { - gen_fun <- test_database_function(database) + gen_fun <- test_database_function(database, + error.input = T, + text = T) res <- lapply(gen_fun, function(db){ diff --git a/R/gen_var2-val2.R b/R/gen_var2-val2.R index 256ad0f..e4f2985 100644 --- a/R/gen_var2-val2.R +++ b/R/gen_var2-val2.R @@ -32,7 +32,12 @@ gen_var2stat <- function(code = NULL, caller <- as.character(match.call()[1]) - gen_fun <- test_database_function(database) + check_function_input(error.ignore = error.ignore, + verbose = verbose) + + gen_fun <- test_database_function(database, + error.input = error.ignore, + text = verbose) check_function_input(code = code, detailed = detailed, @@ -170,7 +175,12 @@ gen_val2var <- function(code = NULL, caller <- as.character(match.call()[1]) - gen_fun <- test_database_function(database) + check_function_input(error.ignore = error.ignore, + verbose = verbose) + + gen_fun <- test_database_function(database, + error.input = error.ignore, + text = verbose) check_function_input(code = code, error.ignore = error.ignore, @@ -307,7 +317,12 @@ gen_val2var2stat <- function(code = NULL, caller <- as.character(match.call()[1]) - gen_fun <- test_database_function(database) + check_function_input(error.ignore = error.ignore.var, + verbose = verbose) + + gen_fun <- test_database_function(database, + error.input = error.ignore.var, + text = verbose) check_function_input(code = code, error.ignore = error.ignore.var, @@ -411,7 +426,12 @@ gen_search_vars <- function(code = NULL, caller <- as.character(match.call()[1]) - gen_fun <- test_database_function(database) + check_function_input(error.ignore = error.ignore, + verbose = verbose) + + gen_fun <- test_database_function(database, + error.input = error.ignore, + text = verbose) check_function_input(code = code, error.ignore = error.ignore, diff --git a/R/utils_dataprocessing.R b/R/utils_dataprocessing.R index b526565..b747bb7 100644 --- a/R/utils_dataprocessing.R +++ b/R/utils_dataprocessing.R @@ -1037,8 +1037,9 @@ spezifisch_create <- function(x) { #' #' @param x Element to extract $Content from #' @param term Search term +#' @param text Indicator verbose #' -titel_search <- function(x, term) { +titel_search <- function(x, term, text) { split <- unlist(strsplit(gsub(" ", "\\bund\\b", term), c("\\bund\\b|\\bUND\\b|\\bUnd\\b|\\&|\\bODER\\b|\\boder\\b|\\bOder\\b|\\|"))) @@ -1059,7 +1060,9 @@ titel_search <- function(x, term) { a <- rep(FALSE, length(x$Content)) + if(isTRUE(verbose)){ message("Combination of words too complex for ordering. Data is processed without ordering.") + } } else if (grep("\\bODER\\b|\\boder\\b|\\bOder\\b|\\|", term, ignore.case = TRUE)) { @@ -1081,7 +1084,9 @@ titel_search <- function(x, term) { a <- rep(FALSE, length(x$Content)) - message("Combination of words not valid for ordering. Data is processed without ordering.") + if(isTRUE(verbose)){ + message("Combination of words not valid for ordering. Data is processed without ordering.") + } } @@ -1093,8 +1098,10 @@ titel_search <- function(x, term) { #' test_database_function #' #' @param input Input to test for database name +#' @param error.input Indicator error.ignore +#' @param text Indicator verbose #' -test_database_function <- function(input){ +test_database_function <- function(input, error.input, text){ #----------------------------------------------------------------------------- @@ -1129,12 +1136,86 @@ test_database_function <- function(input){ if("all" %in% input){ + if(isTRUE(text)){ + + message("All databases accessible to you are selected. Additional databases specified in the 'database'-parameter are ignored.") + + } + res <- c("genesis" = "gen_api", "zensus" = "gen_zensus_api", "regio" = "gen_regio_api") } else if(length(res) != length(input)){ - stop("One or more of the specified databases are not part of this package. Currently only 'genesis', 'zensus', and 'regio' are implemented.", + if(isFALSE(error.input)){ + + + + stop("One or more of the specified databases are not part of this package. Currently only 'genesis', 'zensus', and 'regio' are implemented.", + call. = FALSE) + + } else { + + if(isTRUE(text)){ + + message("One or more of the specified databases are not part of this package. The function is continued with the available databases that you specified.") + + } + + } + + } + + #----------------------------------------------------------------------------- + + check <- sapply(res, function(y){ + + nam <- rev_database_function(y) + + result <- tryCatch( + { + user <- gen_auth_get(nam)$username + }, + error = function(e) { + return(FALSE) + } + ) + + if(isFALSE(result)){ + + return(FALSE) + + } else { + + return(TRUE) + } + }) + + if(sum(check) == 0){ + + stop("None of the specified databases are accessible to you. Please check your credentials.", call. = FALSE) + + } else if (any(check == FALSE)){ + + if(isTRUE(error.input)){ + + if(isTRUE(text)){ + + mess <- paste("The following databases are not accessible to you:", names(res[!check])) + message(mess) + + message("The function is continued with the available databases that you specified.") + + } + + res <- res[check] + + } else { + + mess <- paste("The following databases are not accessible to you:", names(res[!check]), "\nPlease check your credentials.") + stop(mess, call. = FALSE) + + } } #----------------------------------------------------------------------------- From 35307627fc619162a12cfdc18ab2583f8447b64e Mon Sep 17 00:00:00 2001 From: KovaZo Date: Fri, 12 Jul 2024 21:41:59 +0200 Subject: [PATCH 40/52] changes in checks and texts --- R/gen_alternative_terms.R | 4 +--- R/gen_catalogue.R | 11 ++++------ R/gen_find.R | 7 ++---- R/gen_meta_data.R | 46 ++++++++++++--------------------------- R/gen_modified_data.R | 4 +--- R/gen_objects2stat.R | 9 +++----- R/gen_objects2var.R | 9 +++----- R/gen_qualitysigns.R | 2 +- R/gen_var2-val2.R | 26 ++++++---------------- R/utils_dataprocessing.R | 26 +++++++++++++++------- 10 files changed, 54 insertions(+), 90 deletions(-) diff --git a/R/gen_alternative_terms.R b/R/gen_alternative_terms.R index fbb9a49..2999ddb 100644 --- a/R/gen_alternative_terms.R +++ b/R/gen_alternative_terms.R @@ -4,7 +4,7 @@ #' #' @param term Character string. Maximum length of 15 characters. Term or word for which you are searching for alternative or related terms. Use of '*' as a placeholder is possible to generate broader search areas. #' @param similarity Boolean. Indicator if the output of the function should be sorted based on a Levenshtein edit distance based on the \code{adist()} function. Default is 'TRUE'. -#' @param database Character string. Indicator if the GENESIS ('genesis'), Zensus 2022 ('zensus') or regionalstatistik.de ('regio') database is called. Only one database can be addressed per function call. Default option is 'genesis'. +#' @param database Character string. Indicator if the GENESIS ('genesis'), Zensus 2022 ('zensus') or regionalstatistik.de ('regio') database is called. Default option is 'all'. #' @param verbose Boolean. Indicator if the output of the function should include detailed messages and warnings. Default option is 'TRUE'. Set the parameter to 'FALSE' to suppress additional messages and warnings. #' @param ... Additional parameters for the API call. These parameters are only affecting the call itself, no further processing. For more details see `vignette("additional_parameter")`. #' @@ -32,8 +32,6 @@ gen_alternative_terms <- function(term = NULL, caller <- as.character(match.call()[1]) - check_function_input(verbose = verbose) - gen_fun <- test_database_function(database, error.input = T, text = verbose) diff --git a/R/gen_catalogue.R b/R/gen_catalogue.R index 4f21d18..594cd0f 100644 --- a/R/gen_catalogue.R +++ b/R/gen_catalogue.R @@ -2,13 +2,13 @@ #' #' @description Function to search for tables, statistics, and cubes from GENESIS, Zensus 2022 or regionalstatistik.de. Additionally, it structures the output based on the internal tree structure based on the EVAS-numbers. Time-series are represented as cubes with a specified time span. Important note: To be useful in searching for objects it is highly recommended to work with "*" placeholders (see examples). The placeholder can be placed before and/or after the search term. #' -#' @param code String with a maximum length of 10 characters for a database object (GENESIS and regionalstatistik.de) and 15 characters for a Zensus 2022 object. Only one code per iteration. "*" notations are possible. -#' @param database Character string. Indicator if the GENESIS ('genesis'), Zensus 2022 ('zensus') or regionalstatistik.de ('regio') database is called. Only one database can be addressed per function call. Default option is 'genesis'. +#' @param code String with a maximum length of 15 characters for a database object (GENESIS and regionalstatistik.de) and 15 characters for a Zensus 2022 object. Only one code per iteration. "*" notations are possible. +#' @param database Character string. Indicator if the GENESIS ('genesis'), Zensus 2022 ('zensus') or regionalstatistik.de ('regio') database is called. Default option is 'all'. #' @param category Character string. Specify specific GENESIS/regionalstatistik.de object types ('tables', 'statistics' and 'cubes') and specific Zensus 2022 object types ('tables' and 'statistics'). All types that are specific for one database can be used together. Default option is to use all types that are possible for the specific database. #' @param area Character string. Indicator from which area of the database the results are called. In general, 'all' is the appropriate solution. Default option is 'all'. Not used for 'statistics'. #' @param detailed Boolean. Indicator if the function should return the detailed output of the iteration including all object-related information or only a shortened output including only code and object title. Default option is 'FALSE'. -#' @param error.ignore Boolean. Indicator if the function should stop if an error occurs or no object for the request is found or if it should produce a token as response. Default option is 'FALSE'. #' @param sortcriterion Character string. Indicator if the output should be sorted by 'code' or 'content'. This is a parameter of the API call itself. The default is 'code'. +#' @param error.ignore Boolean. Indicator if the function should stop if an error occurs or no object for the request is found or if it should produce a token as response. Default option is 'FALSE'. #' @param verbose Boolean. Indicator if the output of the function should include detailed messages and warnings. Default option is 'TRUE'. Set the parameter to 'FALSE' to suppress additional messages and warnings. #' @param ... Additional parameters for the API call. These parameters are only affecting the call itself, no further processing. For more details see `vignette("additional_parameter")`. #' @@ -32,16 +32,13 @@ gen_catalogue <- function(code = NULL, category = c("tables", "statistics", "cubes"), area = c("all", "public", "user"), detailed = FALSE, - error.ignore = FALSE, sortcriterion = c("code", "content"), + error.ignore = FALSE, verbose = TRUE, ...) { caller <- as.character(match.call()[1]) - check_function_input(error.ignore = error.ignore, - verbose = verbose) - gen_fun <- test_database_function(database, error.input = error.ignore, text = verbose) diff --git a/R/gen_find.R b/R/gen_find.R index 70aeefd..2fd9ac9 100644 --- a/R/gen_find.R +++ b/R/gen_find.R @@ -5,7 +5,7 @@ #' Important note: Time-series are treated as cubes in GENESIS and regionalstatistik.de, they are not longer distinguished. If you want to find a specific object with a clear code with this find function, you need to specify the object type or search for all object types. #' #' @param term A character string with no maximum character length, but a word limit of five words. -#' @param database Character string. Indicator if the GENESIS ('genesis'), Zensus 2022 ('zensus') or regionalstatistik.de ('regio') database is called. Only one database can be addressed per function call. Default option is 'genesis'. +#' @param database Character string. Indicator if the GENESIS ('genesis'), Zensus 2022 ('zensus') or regionalstatistik.de ('regio') database is called. Default option is 'all'. #' @param category Character string. Specify specific GENESIS/regionalstatistik.de object types ('tables', 'statistics' and 'cubes') and specific Zensus 2022 object types ('tables' and 'statistics'). All types that are specific for one database can be used together. Default option is to use all types that are possible for the specific database. #' @param detailed Boolean. Indicator if the function should return the detailed output of the iteration including all object-related information or only a shortened output including only code and object title. Default option is 'FALSE'. #' @param ordering A logical. Indicator if the function should return the output of the iteration ordered first based on the fact if the searched term is appearing in the title of the object and secondly on an estimator of the number of variables in this object. Default option is 'TRUE'. @@ -36,15 +36,12 @@ gen_find <- function(term = NULL, category = c("all", "tables", "statistics", "variables", "cubes"), detailed = FALSE, ordering = TRUE, - error.ignore = FALSE, + error.ignore = TRUE, verbose = TRUE, ...) { caller <- as.character(match.call()[1]) - check_function_input(error.ignore = error.ignore, - verbose = verbose) - gen_fun <- test_database_function(database, error.input = error.ignore, text = verbose) diff --git a/R/gen_meta_data.R b/R/gen_meta_data.R index 1a2d98b..84c1f12 100644 --- a/R/gen_meta_data.R +++ b/R/gen_meta_data.R @@ -3,11 +3,11 @@ #' @description Function to search for meta information for a specific statistic. #' #' @param code A character string with a maximum length of 15 characters. Code from a GENESIS, Zensus 2022 or regionalstatistik.de object. Only one code per iteration. -#' @param database Character string. Indicator if the GENESIS ('genesis'), Zensus 2022 ('zensus') or regionalstatistik.de ('regio') database is called. Only one database can be addressed per function call. Default option is 'genesis'. +#' @param database Character string. Indicator if the GENESIS ('genesis'), Zensus 2022 ('zensus') or regionalstatistik.de ('regio') database is called. Default option is 'all'. #' @param area Character string. Indicator from which area of the database the results are called. In general, 'all' is the appropriate solution. Default option is 'all'. Not used for 'statistics'. #' @param error.ignore Boolean. Indicator if the function should stop if an error occurs or no object for the request is found or if it should produce a token as response. Default option is 'FALSE'. #' @param verbose Boolean. Indicator if the output of the function should include detailed messages and warnings. Default option is 'TRUE'. Set the parameter to 'FALSE' to suppress additional messages and warnings. -#' @param raw Boolean. Should a non-parsed API response be returned? +#' @param raw Boolean. Should a non-parsed API response be returned? Default option is 'FALSE'. #' @param ... Additional parameters for the API call. These parameters are only affecting the call itself, no further processing. For more details see `vignette("additional_parameter")`. #' #' @return A list with all recalled elements from the API. Attributes are added to the data.frame describing the search configuration for the returned output. @@ -29,9 +29,6 @@ gen_metadata_statistic <- function(code = NULL, caller <- as.character(match.call()[1]) - check_function_input(error.ignore = error.ignore, - verbose = verbose) - gen_fun <- test_database_function(database, error.input = error.ignore, text = verbose) @@ -131,11 +128,11 @@ gen_metadata_statistic <- function(code = NULL, #' @description Function to search for meta information for a specific variable. #' #' @param code A character string with a maximum length of 15 characters. Code from a GENESIS, Zensus 2022 or regionalstatistik.de object. Only one code per iteration. -#' @param database Character string. Indicator if the GENESIS ('genesis'), Zensus 2022 ('zensus') or regionalstatistik.de ('regio') database is called. Only one database can be addressed per function call. Default option is 'genesis'. +#' @param database Character string. Indicator if the GENESIS ('genesis'), Zensus 2022 ('zensus') or regionalstatistik.de ('regio') database is called. Default option is 'all'. #' @param area Character string. Indicator from which area of the database the results are called. In general, 'all' is the appropriate solution. Default option is 'all'. Not used for 'statistics'. #' @param error.ignore Boolean. Indicator if the function should stop if an error occurs or no object for the request is found or if it should produce a token as response. Default option is 'FALSE'. #' @param verbose Boolean. Indicator if the output of the function should include detailed messages and warnings. Default option is 'TRUE'. Set the parameter to 'FALSE' to suppress additional messages and warnings. -#' @param raw Boolean. Should a non-parsed API response be returned? +#' @param raw Boolean. Should a non-parsed API response be returned? Default option is 'FALSE'. #' @param ... Additional parameters for the API call. These parameters are only affecting the call itself, no further processing. For more details see `vignette("additional_parameter")`. #' #' @return A list with all recalled elements from the API. Attributes are added to the data.frame describing the search configuration for the returned output. @@ -157,9 +154,6 @@ gen_metadata_variable <- function(code = NULL, caller <- as.character(match.call()[1]) - check_function_input(error.ignore = error.ignore, - verbose = verbose) - gen_fun <- test_database_function(database, error.input = error.ignore, text = verbose) @@ -267,11 +261,11 @@ gen_metadata_variable <- function(code = NULL, #' @description Function to search for meta information for a specific value. #' #' @param code A character string with a maximum length of 15 characters. Code from a GENESIS, Zensus 2022 or regionalstatistik.de object. Only one code per iteration. -#' @param database Character string. Indicator if the GENESIS ('genesis'), Zensus 2022 ('zensus') or regionalstatistik.de ('regio') database is called. Only one database can be addressed per function call. Default option is 'genesis'. +#' @param database Character string. Indicator if the GENESIS ('genesis'), Zensus 2022 ('zensus') or regionalstatistik.de ('regio') database is called. Default option is 'all'. #' @param area Character string. Indicator from which area of the database the results are called. In general, 'all' is the appropriate solution. Default option is 'all'. Not used for 'statistics'. #' @param error.ignore Boolean. Indicator if the function should stop if an error occurs or no object for the request is found or if it should produce a token as response. Default option is 'FALSE'. #' @param verbose Boolean. Indicator if the output of the function should include detailed messages and warnings. Default option is 'TRUE'. Set the parameter to 'FALSE' to suppress additional messages and warnings. -#' @param raw Boolean. Should a non-parsed API response be returned? +#' @param raw Boolean. Should a non-parsed API response be returned? Default option is 'FALSE'. #' @param ... Additional parameters for the API call. These parameters are only affecting the call itself, no further processing. For more details see `vignette("additional_parameter")`. #' #' @return A list with all recalled elements from the API. Attributes are added to the data.frame describing the search configuration for the returned output. @@ -293,9 +287,6 @@ gen_metadata_value <- function(code = NULL, caller <- as.character(match.call()[1]) - check_function_input(error.ignore = error.ignore, - verbose = verbose) - gen_fun <- test_database_function(database, error.input = error.ignore, text = verbose) @@ -400,11 +391,11 @@ gen_metadata_value <- function(code = NULL, #' @description Function to search for meta information for a specific table. #' #' @param code A character string with a maximum length of 15 characters. Code from a GENESIS, Zensus 2022 or regionalstatistik.de object. Only one code per iteration. -#' @param database Character string. Indicator if the GENESIS ('genesis'), Zensus 2022 ('zensus') or regionalstatistik.de ('regio') database is called. Only one database can be addressed per function call. Default option is 'genesis'. +#' @param database Character string. Indicator if the GENESIS ('genesis'), Zensus 2022 ('zensus') or regionalstatistik.de ('regio') database is called. Default option is 'all'. #' @param area Character string. Indicator from which area of the database the results are called. In general, 'all' is the appropriate solution. Default option is 'all'. Not used for 'statistics'. #' @param error.ignore Boolean. Indicator if the function should stop if an error occurs or no object for the request is found or if it should produce a token as response. Default option is 'FALSE'. #' @param verbose Boolean. Indicator if the output of the function should include detailed messages and warnings. Default option is 'TRUE'. Set the parameter to 'FALSE' to suppress additional messages and warnings. -#' @param raw Boolean. Should a non-parsed API response be returned? +#' @param raw Boolean. Should a non-parsed API response be returned? Default option is 'FALSE'. #' @param ... Additional parameters for the API call. These parameters are only affecting the call itself, no further processing. For more details see `vignette("additional_parameter")`. #' #' @return A list with all recalled elements from the API. Attributes are added to the data.frame describing the search configuration for the returned output. @@ -426,9 +417,6 @@ gen_metadata_table <- function(code = NULL, caller <- as.character(match.call()[1]) - check_function_input(error.ignore = error.ignore, - verbose = verbose) - gen_fun <- test_database_function(database, error.input = error.ignore, text = verbose) @@ -605,11 +593,11 @@ gen_metadata_table <- function(code = NULL, #' @description Function to search for meta information for a specific cube. Usable only for GENESIS and regionalstatistik.de. #' #' @param code A character string with a maximum length of 15 characters. Code from a GENESIS or regionalstatistik.de object. Only one code per iteration. -#' @param database Character string. Indicator if the GENESIS ('genesis') or regionalstatistik.de ('regio') database is called. Only one database can be addressed per function call. Default option is 'genesis'. +#' @param database Character string. Indicator if the GENESIS ('genesis') or regionalstatistik.de ('regio') database is called. Default option is 'all'. #' @param area Character string. Indicator from which area of the database the results are called. In general, 'all' is the appropriate solution. Default option is 'all'. Not used for 'statistics'. #' @param error.ignore Boolean. Indicator if the function should stop if an error occurs or no object for the request is found or if it should produce a token as response. Default option is 'FALSE'. #' @param verbose Boolean. Indicator if the output of the function should include detailed messages and warnings. Default option is 'TRUE'. Set the parameter to 'FALSE' to suppress additional messages and warnings. -#' @param raw Boolean. Should a non-parsed API response be returned? +#' @param raw Boolean. Should a non-parsed API response be returned? Default option is 'FALSE'. #' @param ... Additional parameters for the API call. These parameters are only affecting the call itself, no further processing. For more details see `vignette("additional_parameter")`. #' #' @return A list with all recalled elements from the API. Attributes are added to the data.frame describing the search configuration for the returned output. @@ -627,14 +615,11 @@ gen_metadata_cube <- function(code = NULL, area = c("all", "public", "user"), error.ignore = FALSE, verbose = TRUE, - raw = raw, + raw = FALSE, ...) { caller <- as.character(match.call()[1]) - check_function_input(error.ignore = error.ignore, - verbose = verbose) - gen_fun <- test_database_function(database, error.input = error.ignore, text = verbose) @@ -784,13 +769,13 @@ gen_metadata_cube <- function(code = NULL, #' #' @description Search For Meta-Information For All Types Of Objects #' -#' @param code String with a maximum length of 10 characters for a database object (GENESIS and regionalstatistik.de) and 15 characters for a Zensus 2022 object. Only one code per iteration. "*" notations are possible. -#' @param database Character string. Indicator if the GENESIS ('genesis'), Zensus 2022 ('zensus') or regionalstatistik.de ('regio') database is called. Only one database can be addressed per function call. Default option is 'genesis'. +#' @param code String with a maximum length of 15 characters for a database object (GENESIS, regionalstatistik.de, Zensus 2022). Only one code per iteration. +#' @param database Character string. Indicator if the GENESIS ('genesis'), Zensus 2022 ('zensus') or regionalstatistik.de ('regio') database is called. Default option is 'all'. #' @param category Character string. Specify specific GENESIS/regionalstatistik.de object types ('tables', 'statistics' and 'cubes') and specific Zensus 2022 object types ('tables' and 'statistics'). All types that are specific for one database can be used together. Default option is to use all types that are possible for the specific database. #' @param area Character string. Indicator from which area of the database the results are called. In general, 'all' is the appropriate solution. Default option is 'all'. Not used for 'statistics'. #' @param error.ignore Boolean. Indicator if the function should stop if an error occurs or no object for the request is found or if it should produce a token as response. Default option is 'FALSE'. #' @param verbose Boolean. Indicator if the output of the function should include detailed messages and warnings. Default option is 'TRUE'. Set the parameter to 'FALSE' to suppress additional messages and warnings. -#' @param raw Boolean. Should a non-parsed API response be returned? +#' @param raw Boolean. Should a non-parsed API response be returned? Default option is 'FALSE'. #' @param ... Additional parameters for the API call. These parameters are only affecting the call itself, no further processing. For more details see `vignette("additional_parameter")`. #' #' @return A list with all recalled elements from the API. Attributes are added to the data.frame describing the search configuration for the returned output. @@ -813,9 +798,6 @@ gen_metadata <- function(code = NULL, caller <- as.character(match.call()[1]) - check_function_input(error.ignore = error.ignore, - verbose = verbose) - gen_fun <- test_database_function(database, error.input = error.ignore, text = verbose) diff --git a/R/gen_modified_data.R b/R/gen_modified_data.R index 62dc2fe..5b9b80f 100644 --- a/R/gen_modified_data.R +++ b/R/gen_modified_data.R @@ -3,7 +3,7 @@ #' @description Function to check for updates, changes, or new objects based on a specific date. #' #' @param code A character string with a maximum length of 15 characters. Code from a GENESIS, Zensus 2022 or regionalstatistik.de object. Only one code per iteration. -#' @param database Character string. Indicator if the GENESIS ('genesis'), Zensus 2022 ('zensus') or regionalstatistik.de ('regio') database is called. Only one database can be addressed per function call. Default option is 'genesis'. +#' @param database Character string. Indicator if the GENESIS ('genesis'), Zensus 2022 ('zensus') or regionalstatistik.de ('regio') database is called. Default option is 'all'. #' @param type Character string. Specific GENESIS and regionalstatistik.de object types: 'tables', 'statistics', and 'statisticsUpdates'. Specific Zensus 2022 object types: 'tables' and 'statistics'. All types that are specific for one database can be used together through 'all', which is the default. #' @param date Character string. Specific date that is used as the last update or upload time to include an object in return. Default option is 'now', which uses the current date of your system. Alternative options are 'week_before', using the current date of your system minus 7 days, 'month_before', using the current date of your system minus 4 weeks, and 'year_before', using the current date of your system minus 52 weeks. Additionally, it is possible to fill in a specific date of format 'DD.MM.YYYY'. #' @param verbose Boolean. Indicator if the output of the function should include detailed messages and warnings. Default option is 'TRUE'. Set the parameter to 'FALSE' to suppress additional messages and warnings. @@ -32,8 +32,6 @@ gen_modified_data <- function(code = "", verbose = TRUE, ...) { - check_function_input(verbose = verbose) - gen_fun <- test_database_function(database, error.input = T, text = verbose) diff --git a/R/gen_objects2stat.R b/R/gen_objects2stat.R index fe8777c..2cac359 100644 --- a/R/gen_objects2stat.R +++ b/R/gen_objects2stat.R @@ -3,12 +3,12 @@ #' Function to find objects related to a statistic #' #' @param code Character string with a maximum length of 6 characters (15 characters if 'cubes' are not used as a category). Code from a GENESIS, Zensus 2022 or regionalstatistik.de object. Only one code per iteration. -#' @param database Character string. Indicator if the GENESIS ('genesis'), Zensus 2022 ('zensus') or regionalstatistik.de ('regio') database is called. Only one database can be addressed per function call. Default option is 'genesis'. +#' @param database Character string. Indicator if the GENESIS ('genesis'), Zensus 2022 ('zensus') or regionalstatistik.de ('regio') database is called. Default option is 'all'. #' @param category Character string. Specify specific GENESIS/regionalstatistik.de object types ('tables', 'statistics' and 'cubes') and specific Zensus 2022 object types ('tables' and 'statistics'). All types that are specific for one database can be used together. Default option is to use all types that are possible for the specific database. #' @param area Character string. Indicator from which area of the database the results are called. In general, 'all' is the appropriate solution. Default option is 'all'. Not used for 'statistics'. #' @param detailed Boolean. Indicator if the function should return the detailed output of the iteration including all object-related information or only a shortened output including only code and object title. Default option is 'FALSE'. -#' @param error.ignore Boolean. Indicator if the function should stop if an error occurs or no object for the request is found or if it should produce a token as response. Default option is 'FALSE'. #' @param sortcriterion Character string. Indicator if the output should be sorted by 'code' or 'content'. This is a parameter of the API call itself. The default is 'code'. +#' @param error.ignore Boolean. Indicator if the function should stop if an error occurs or no object for the request is found or if it should produce a token as response. Default option is 'FALSE'. #' @param verbose Boolean. Indicator if the output of the function should include detailed messages and warnings. Default option is 'TRUE'. Set the parameter to 'FALSE' to suppress additional messages and warnings. #' @param ... Additional parameters for the API call. These parameters are only affecting the call itself, no further processing. For more details see `vignette("additional_parameter")`. #' @@ -31,16 +31,13 @@ gen_objects2stat <- function(code = NULL, category = c("tables", "variables", "cubes"), area = c("all", "public", "user"), detailed = FALSE, - error.ignore = FALSE, sortcriterion = c("code", "content"), + error.ignore = FALSE, verbose = TRUE, ...) { caller <- as.character(match.call()[1]) - check_function_input(error.ignore = error.ignore, - verbose = verbose) - gen_fun <- test_database_function(database, error.input = error.ignore, text = verbose) diff --git a/R/gen_objects2var.R b/R/gen_objects2var.R index 1073d57..763b070 100644 --- a/R/gen_objects2var.R +++ b/R/gen_objects2var.R @@ -3,12 +3,12 @@ #' @description Function to find objects related to a variable #' #' @param code Character string with a maximum length of 15 characters. Code from a GENESIS, Zensus 2022 or regionalstatistik.de object. Only one code per iteration. -#' @param database Character string. Indicator if the GENESIS ('genesis'), Zensus 2022 ('zensus') or regionalstatistik.de ('regio') database is called. Only one database can be addressed per function call. Default option is 'genesis'. +#' @param database Character string. Indicator if the GENESIS ('genesis'), Zensus 2022 ('zensus') or regionalstatistik.de ('regio') database is called. Default option is 'all'. #' @param category Character string. Specify specific GENESIS/regionalstatistik.de object types ('tables', 'statistics' and 'cubes') and specific Zensus 2022 object types ('tables' and 'statistics'). All types that are specific for one database can be used together. Default option is to use all types that are possible for the specific database. #' @param area Character string. Indicator from which area of the database the results are called. In general, 'all' is the appropriate solution. Default option is 'all'. Not used for 'statistics'. #' @param detailed Boolean. Indicator if the function should return the detailed output of the iteration including all object-related information or only a shortened output including only code and object title. Default option is 'FALSE'. -#' @param error.ignore Boolean. Indicator if the function should stop if an error occurs or no object for the request is found or if it should produce a token as response. Default option is 'FALSE'. #' @param sortcriterion Character string. Indicator if the output should be sorted by 'code' or 'content'. This is a parameter of the API call itself. The default is 'code'. +#' @param error.ignore Boolean. Indicator if the function should stop if an error occurs or no object for the request is found or if it should produce a token as response. Default option is 'FALSE'. #' @param verbose Boolean. Indicator if the output of the function should include detailed messages and warnings. Default option is 'TRUE'. Set the parameter to 'FALSE' to suppress additional messages and warnings. #' @param ... Additional parameters for the API call. These parameters are only affecting the call itself, no further processing. For more details see `vignette("additional_parameter")`. #' @@ -31,16 +31,13 @@ gen_objects2var <- function(code = NULL, category = c("tables", "statistics", "cubes"), area = c("all", "public", "user"), detailed = FALSE, - error.ignore = FALSE, sortcriterion = c("code", "content"), + error.ignore = FALSE, verbose = TRUE, ...) { caller <- as.character(match.call()[1]) - check_function_input(error.ignore = error.ignore, - verbose = verbose) - gen_fun <- test_database_function(database, error.input = error.ignore, text = verbose) diff --git a/R/gen_qualitysigns.R b/R/gen_qualitysigns.R index 8561f1e..daa2a1c 100644 --- a/R/gen_qualitysigns.R +++ b/R/gen_qualitysigns.R @@ -2,7 +2,7 @@ #' #' @description Function to list all currently used special signs (e.g., 0, *, X, (), p, ...) and their meaning in GENESIS, Zensus 2022 and/or regionalstatistik.de. #' -#' @param database Character string. Indicator if the GENESIS ('genesis'), Zensus 2022 ('zensus') or regionalstatistik.de ('regio') database is called. Only one database can be addressed per function call. Default option is 'genesis'. +#' @param database Character string. Indicator if the GENESIS ('genesis'), Zensus 2022 ('zensus') or regionalstatistik.de ('regio') database is called. Default option is 'all'. #' @param ... Additional parameters for the API call. These parameters are only affecting the call itself, no further processing. For more details see `vignette("additional_parameter")`. #' #' @return A list of all current used special signs. diff --git a/R/gen_var2-val2.R b/R/gen_var2-val2.R index e4f2985..ec1e2ec 100644 --- a/R/gen_var2-val2.R +++ b/R/gen_var2-val2.R @@ -3,11 +3,11 @@ #' @description Function to generate variables from statistics #' #' @param code Character string with a maximum length of 15 characters. Code from a GENESIS, Zensus 2022 or regionalstatistik.de object. Only one code per iteration. -#' @param database Character string. Indicator if the GENESIS ('genesis'), Zensus 2022 ('zensus') or regionalstatistik.de ('regio') database is called. Only one database can be addressed per function call. Default option is 'genesis'. +#' @param database Character string. Indicator if the GENESIS ('genesis'), Zensus 2022 ('zensus') or regionalstatistik.de ('regio') database is called. Default option is 'all'. #' @param area Character string. Indicator from which area of the database the results are called. In general, 'all' is the appropriate solution. Default option is 'all'. Not used for 'statistics'. #' @param detailed Boolean. Indicator if the function should return the detailed output of the iteration including all object-related information or only a shortened output including only code and object title. Default option is 'FALSE'. -#' @param error.ignore Boolean. Indicator if the function should stop if an error occurs or no object for the request is found or if it should produce a token as response. Default option is 'FALSE'. #' @param sortcriterion Character string. Indicator if the output should be sorted by 'code' or 'content'. This is a parameter of the API call itself. The default is 'code'. +#' @param error.ignore Boolean. Indicator if the function should stop if an error occurs or no object for the request is found or if it should produce a token as response. Default option is 'FALSE'. #' @param verbose Boolean. Indicator if the output of the function should include detailed messages and warnings. Default option is 'TRUE'. Set the parameter to 'FALSE' to suppress additional messages and warnings. #' @param ... Additional parameters for the API call. These parameters are only affecting the call itself, no further processing. For more details see `vignette("additional_parameter")`. #' @@ -32,9 +32,6 @@ gen_var2stat <- function(code = NULL, caller <- as.character(match.call()[1]) - check_function_input(error.ignore = error.ignore, - verbose = verbose) - gen_fun <- test_database_function(database, error.input = error.ignore, text = verbose) @@ -149,10 +146,10 @@ gen_var2stat <- function(code = NULL, #' @description Function to extract the possible values from a variable. Values for continuous variables are not extractable, which is why the function returns a warning message in this case. #' #' @param code Character string with a maximum length of 15 characters. Code from a GENESIS, Zensus 2022 or regionalstatistik.de object. Only one code per iteration. -#' @param database Character string. Indicator if the GENESIS ('genesis'), Zensus 2022 ('zensus') or regionalstatistik.de ('regio') database is called. Only one database can be addressed per function call. Default option is 'genesis'. +#' @param database Character string. Indicator if the GENESIS ('genesis'), Zensus 2022 ('zensus') or regionalstatistik.de ('regio') database is called. Default option is 'all'. #' @param area Character string. Indicator from which area of the database the results are called. In general, 'all' is the appropriate solution. Default option is 'all'. Not used for 'statistics'. -#' @param error.ignore Boolean. Indicator if the function should stop if an error occurs or no object for the request is found or if it should produce a token as response. Default option is 'FALSE'. #' @param sortcriterion Character string. Indicator if the output should be sorted by 'code' or 'content'. This is a parameter of the API call itself. The default is 'code'. +#' @param error.ignore Boolean. Indicator for values if the function should stop if an error occurs or no object for the request is found or if it should produce a token as response. Default option is 'TRUE', this prevents the function to stop even if a variable has no further explanation (often the case for numerical variables). #' @param verbose Boolean. Indicator if the output of the function should include detailed messages and warnings. Default option is 'TRUE'. Set the parameter to 'FALSE' to suppress additional messages and warnings. #' @param ... Additional parameters for the API call. These parameters are only affecting the call itself, no further processing. For more details see `vignette("additional_parameter")`. #' @@ -175,9 +172,6 @@ gen_val2var <- function(code = NULL, caller <- as.character(match.call()[1]) - check_function_input(error.ignore = error.ignore, - verbose = verbose) - gen_fun <- test_database_function(database, error.input = error.ignore, text = verbose) @@ -286,12 +280,12 @@ gen_val2var <- function(code = NULL, #' @description Get values from variables from a statistic. Values for continuous variables cannot be extracted, so the function returns a warning message. #' #' @param code Character string with a maximum length of 15 characters. Code from a GENESIS, Zensus 2022 or regionalstatistik.de object. Only one code per iteration. -#' @param database Character string. Indicator if the GENESIS ('genesis'), Zensus 2022 ('zensus') or regionalstatistik.de ('regio') database is called. Only one database can be addressed per function call. Default option is 'genesis'. +#' @param database Character string. Indicator if the GENESIS ('genesis'), Zensus 2022 ('zensus') or regionalstatistik.de ('regio') database is called. Default option is 'all'. #' @param area Character string. Indicator from which area of the database the results are called. In general, 'all' is the appropriate solution. Default option is 'all'. Not used for 'statistics'. #' @param detailed Boolean. Indicator if the function should return the detailed output of the iteration including all object-related information or only a shortened output including only code and object title. Default option is 'FALSE'. +#' @param sortcriterion Character string. Indicator if the output should be sorted by 'code' or 'content'. This is a parameter of the API call itself. The default is 'code'. #' @param error.ignore.var Boolean. Indicator for variables if the function should stop if an error occurs or no object for the request is found or if it should produce a token as response. Default option is 'FALSE'. #' @param error.ignore.val Boolean. Indicator for values if the function should stop if an error occurs or no object for the request is found or if it should produce a token as response. Default option is 'TRUE', this prevents the function to stop even if a variable has no further explanation (often the case for numerical variables). -#' @param sortcriterion Character string. Indicator if the output should be sorted by 'code' or 'content'. This is a parameter of the API call itself. The default is 'code'. #' @param verbose Boolean. Indicator if the output of the function should include detailed messages and warnings. Default option is 'TRUE'. Set the parameter to 'FALSE' to suppress additional messages and warnings. #' @param ... Additional parameters for the API call. These parameters are only affecting the call itself, no further processing. For more details see `vignette("additional_parameter")`. #' @@ -317,9 +311,6 @@ gen_val2var2stat <- function(code = NULL, caller <- as.character(match.call()[1]) - check_function_input(error.ignore = error.ignore.var, - verbose = verbose) - gen_fun <- test_database_function(database, error.input = error.ignore.var, text = verbose) @@ -400,7 +391,7 @@ gen_val2var2stat <- function(code = NULL, #' @description Function to search for specific variables #' #' @param code Character string with a maximum length of 6 characters. Code from a GENESIS, Zensus 2022 or regionalstatistik.de object. Only one code per iteration. -#' @param database Character string. Indicator if the GENESIS ('genesis'), Zensus 2022 ('zensus') or regionalstatistik.de ('regio') database is called. Only one database can be addressed per function call. Default option is 'genesis'. +#' @param database Character string. Indicator if the GENESIS ('genesis'), Zensus 2022 ('zensus') or regionalstatistik.de ('regio') database is called. Default option is 'all'. #' @param area Character string. Indicator from which area of the database the results are called. In general, 'all' is the appropriate solution. Default option is 'all'. Not used for 'statistics'. #' @param sortcriterion Character string. Indicator if the output should be sorted by 'code' or 'content'. This is a parameter of the API call itself. The default is 'code'. #' @param error.ignore Boolean. Indicator if the function should stop if an error occurs or no object for the request is found or if it should produce a token as response. Default option is 'FALSE'. @@ -426,9 +417,6 @@ gen_search_vars <- function(code = NULL, caller <- as.character(match.call()[1]) - check_function_input(error.ignore = error.ignore, - verbose = verbose) - gen_fun <- test_database_function(database, error.input = error.ignore, text = verbose) diff --git a/R/utils_dataprocessing.R b/R/utils_dataprocessing.R index b747bb7..9cb4425 100644 --- a/R/utils_dataprocessing.R +++ b/R/utils_dataprocessing.R @@ -322,7 +322,7 @@ check_function_input <- function(code = NULL, #----------------------------------------------------------------------------- # Code & Term ---- - if (is.null(code) && is.null(term)) { + if (is.null(code) && is.null(term) && !is.null(caller)) { if (!(caller %in% c("gen_search_vars", "restatis::gen_search_vars"))) { @@ -792,18 +792,12 @@ check_function_input <- function(code = NULL, #--------------------------------------------------------------------------- - if (length(error.ignore == 1)) { - - #------------------------------------------------------------------------- - - if (!is.logical(error.ignore) || + if (!is.logical(error.ignore) || length(error.ignore) != 1) { stop("Parameter 'error.ignore' has to be of type 'logical' and of length 1.", call. = FALSE) - } - } #--------------------------------------------------------------------------- @@ -1103,6 +1097,22 @@ titel_search <- function(x, term, text) { #' test_database_function <- function(input, error.input, text){ + #------------------------------------------------------------------------- + + if (!is.logical(text) || length(text) != 1) { + + stop("Parameter 'verbose' has to be of type 'logical' and of length 1.", + call. = FALSE) + + } + + if (!is.logical(error.input) || length(error.input) != 1) { + + stop("Parameter 'error.ignore' has to be of type 'logical' and of length 1.", + call. = FALSE) + + } + #----------------------------------------------------------------------------- if(sum(is.na(input)) == length(input)){ From 5b3762750ca8a83e236e03f9e97265547baa3cb9 Mon Sep 17 00:00:00 2001 From: bubux Date: Sat, 13 Jul 2024 11:09:01 +0200 Subject: [PATCH 41/52] add support for API tokens --- R/gen_auth.R | 17 +++++++++++++++-- 1 file changed, 15 insertions(+), 2 deletions(-) diff --git a/R/gen_auth.R b/R/gen_auth.R index e92dbed..af81e7a 100644 --- a/R/gen_auth.R +++ b/R/gen_auth.R @@ -61,8 +61,21 @@ gen_auth_save <- function(database = c("all", "genesis", "zensus", "regio")) { } else if (database == "zensus"){ - username <- gen_auth_ask("username") - password <- gen_auth_ask("password") + want_token_resp <- askpass::askpass("Do you want to specifiy a Zensus 2022 API token for API access? Type 'yes'.\n + If you want to specify username and password, type any character.") + want_token <- ifelse(trimws(tolower(want_token_resp)) == "yes", TRUE, FALSE) + + if (isTRUE(want_token)) { + + username <- gen_auth_ask("API token") + password <- NULL + + } else { + + username <- gen_auth_ask("username") + password <- gen_auth_ask("password") + + } auth_path <- gen_auth_path("auth_zensus.rds") From 9c0f6da038e44857ef24b641e7710fccf0e97c1b Mon Sep 17 00:00:00 2001 From: buhly Date: Sun, 14 Jul 2024 16:01:05 +0200 Subject: [PATCH 42/52] fix tests --- R/globals.R | 3 ++- R/utils_dataprocessing.R | 16 +++++++++++++-- man/find_token.Rd | 20 +++++++++++++++++++ man/gen_alternative_terms.Rd | 2 +- man/gen_catalogue.Rd | 10 +++++----- man/gen_find.Rd | 6 +++--- man/gen_metadata.Rd | 6 +++--- man/gen_metadata_cube.Rd | 12 +++++------ man/gen_metadata_statistic.Rd | 4 ++-- man/gen_metadata_table.Rd | 4 ++-- man/gen_metadata_value.Rd | 4 ++-- man/gen_metadata_variable.Rd | 4 ++-- man/gen_modified_data.Rd | 2 +- man/gen_objects2stat.Rd | 8 ++++---- man/gen_objects2var.Rd | 8 ++++---- man/gen_search_vars.Rd | 2 +- man/gen_signs.Rd | 2 +- man/gen_val2var.Rd | 4 ++-- man/gen_val2var2stat.Rd | 2 +- man/gen_var2stat.Rd | 2 +- man/test_database_function.Rd | 6 +++++- man/titel_search.Rd | 4 +++- ...a-87a36f.json => modifieddata-1a134d.json} | 2 +- 23 files changed, 86 insertions(+), 47 deletions(-) create mode 100644 man/find_token.Rd rename tests/testthat/modified2/api/catalogue/{modifieddata-87a36f.json => modifieddata-1a134d.json} (94%) diff --git a/R/globals.R b/R/globals.R index c5d0ec0..c994aa4 100644 --- a/R/globals.R +++ b/R/globals.R @@ -1 +1,2 @@ -utils::globalVariables(c("evas_list")) +utils::globalVariables(c("evas_list", + "verbose")) diff --git a/R/utils_dataprocessing.R b/R/utils_dataprocessing.R index 9cb4425..7f35b97 100644 --- a/R/utils_dataprocessing.R +++ b/R/utils_dataprocessing.R @@ -55,7 +55,19 @@ param_collapse_vec <- function(vec) { forming_evas <- function(list_of) { # Path selection - data_path <- system.file("data", "evas_list.rda", package = "restatis") + if (file.exists(system.file("data", "evas_list.rda", package = "restatis"))) { + + data_path <- system.file("data", "evas_list.rda", package = "restatis") + + } else if (!file.exists(system.file("data", "evas_list.rda", package = "restatis"))) { + + # This applies to the case of using devtools::check() + # and running it via check_dir = "tests/testthat" + data_path <- "../../../../../data/evas_list.rda" + print(data_path) + print(getwd()) + + } # Load data load(data_path) @@ -1283,7 +1295,7 @@ check_results <- function(input){ #' @param input Input to test result structure #' @param error.input error.ignore TRUE or FALSE #' @param text verbose TRUE or FALSE -#' #' @param text sub_category character string +#' @param sub_category sub_category character string #' find_token <- function(input, error.input, text, sub_category){ diff --git a/man/find_token.Rd b/man/find_token.Rd new file mode 100644 index 0000000..b83c33f --- /dev/null +++ b/man/find_token.Rd @@ -0,0 +1,20 @@ +% Generated by roxygen2: do not edit by hand +% Please edit documentation in R/utils_dataprocessing.R +\name{find_token} +\alias{find_token} +\title{find_token} +\usage{ +find_token(input, error.input, text, sub_category) +} +\arguments{ +\item{input}{Input to test result structure} + +\item{error.input}{error.ignore TRUE or FALSE} + +\item{text}{verbose TRUE or FALSE} + +\item{sub_category}{sub_category character string} +} +\description{ +find_token +} diff --git a/man/gen_alternative_terms.Rd b/man/gen_alternative_terms.Rd index 6673797..9585f92 100644 --- a/man/gen_alternative_terms.Rd +++ b/man/gen_alternative_terms.Rd @@ -17,7 +17,7 @@ gen_alternative_terms( \item{similarity}{Boolean. Indicator if the output of the function should be sorted based on a Levenshtein edit distance based on the \code{adist()} function. Default is 'TRUE'.} -\item{database}{Character string. Indicator if the GENESIS ('genesis'), Zensus 2022 ('zensus') or regionalstatistik.de ('regio') database is called. Only one database can be addressed per function call. Default option is 'genesis'.} +\item{database}{Character string. Indicator if the GENESIS ('genesis'), Zensus 2022 ('zensus') or regionalstatistik.de ('regio') database is called. Default option is 'all'.} \item{verbose}{Boolean. Indicator if the output of the function should include detailed messages and warnings. Default option is 'TRUE'. Set the parameter to 'FALSE' to suppress additional messages and warnings.} diff --git a/man/gen_catalogue.Rd b/man/gen_catalogue.Rd index 03d58e0..fd8e0d3 100644 --- a/man/gen_catalogue.Rd +++ b/man/gen_catalogue.Rd @@ -10,16 +10,16 @@ gen_catalogue( category = c("tables", "statistics", "cubes"), area = c("all", "public", "user"), detailed = FALSE, - error.ignore = FALSE, sortcriterion = c("code", "content"), + error.ignore = FALSE, verbose = TRUE, ... ) } \arguments{ -\item{code}{String with a maximum length of 10 characters for a database object (GENESIS and regionalstatistik.de) and 15 characters for a Zensus 2022 object. Only one code per iteration. "*" notations are possible.} +\item{code}{String with a maximum length of 15 characters for a database object (GENESIS and regionalstatistik.de) and 15 characters for a Zensus 2022 object. Only one code per iteration. "*" notations are possible.} -\item{database}{Character string. Indicator if the GENESIS ('genesis'), Zensus 2022 ('zensus') or regionalstatistik.de ('regio') database is called. Only one database can be addressed per function call. Default option is 'genesis'.} +\item{database}{Character string. Indicator if the GENESIS ('genesis'), Zensus 2022 ('zensus') or regionalstatistik.de ('regio') database is called. Default option is 'all'.} \item{category}{Character string. Specify specific GENESIS/regionalstatistik.de object types ('tables', 'statistics' and 'cubes') and specific Zensus 2022 object types ('tables' and 'statistics'). All types that are specific for one database can be used together. Default option is to use all types that are possible for the specific database.} @@ -27,10 +27,10 @@ gen_catalogue( \item{detailed}{Boolean. Indicator if the function should return the detailed output of the iteration including all object-related information or only a shortened output including only code and object title. Default option is 'FALSE'.} -\item{error.ignore}{Boolean. Indicator if the function should stop if an error occurs or no object for the request is found or if it should produce a token as response. Default option is 'FALSE'.} - \item{sortcriterion}{Character string. Indicator if the output should be sorted by 'code' or 'content'. This is a parameter of the API call itself. The default is 'code'.} +\item{error.ignore}{Boolean. Indicator if the function should stop if an error occurs or no object for the request is found or if it should produce a token as response. Default option is 'FALSE'.} + \item{verbose}{Boolean. Indicator if the output of the function should include detailed messages and warnings. Default option is 'TRUE'. Set the parameter to 'FALSE' to suppress additional messages and warnings.} \item{...}{Additional parameters for the API call. These parameters are only affecting the call itself, no further processing. For more details see \code{vignette("additional_parameter")}.} diff --git a/man/gen_find.Rd b/man/gen_find.Rd index 3cc1a15..7fbbd1f 100644 --- a/man/gen_find.Rd +++ b/man/gen_find.Rd @@ -10,7 +10,7 @@ gen_find( category = c("all", "tables", "statistics", "variables", "cubes"), detailed = FALSE, ordering = TRUE, - error.ignore = FALSE, + error.ignore = TRUE, verbose = TRUE, ... ) @@ -18,7 +18,7 @@ gen_find( \arguments{ \item{term}{A character string with no maximum character length, but a word limit of five words.} -\item{database}{Character string. Indicator if the GENESIS ('genesis'), Zensus 2022 ('zensus') or regionalstatistik.de ('regio') database is called. Only one database can be addressed per function call. Default option is 'genesis'.} +\item{database}{Character string. Indicator if the GENESIS ('genesis'), Zensus 2022 ('zensus') or regionalstatistik.de ('regio') database is called. Default option is 'all'.} \item{category}{Character string. Specify specific GENESIS/regionalstatistik.de object types ('tables', 'statistics' and 'cubes') and specific Zensus 2022 object types ('tables' and 'statistics'). All types that are specific for one database can be used together. Default option is to use all types that are possible for the specific database.} @@ -26,7 +26,7 @@ gen_find( \item{ordering}{A logical. Indicator if the function should return the output of the iteration ordered first based on the fact if the searched term is appearing in the title of the object and secondly on an estimator of the number of variables in this object. Default option is 'TRUE'.} -\item{error.ignore}{Boolean. Indicator if the function should stop if an error occurs or no object for the request is found or if it should produce a token as response. Default option is 'FALSE'.} +\item{error.ignore}{Boolean. Indicator if the function should stop if an error occurs or no object for the request is found or if it should produce a token as response. Default option is 'TRUE'.} \item{verbose}{Boolean. Indicator if the output of the function should include detailed messages and warnings. Default option is 'TRUE'. Set the parameter to 'FALSE' to suppress additional messages and warnings.} diff --git a/man/gen_metadata.Rd b/man/gen_metadata.Rd index 2119f4b..31e8abc 100644 --- a/man/gen_metadata.Rd +++ b/man/gen_metadata.Rd @@ -16,9 +16,9 @@ gen_metadata( ) } \arguments{ -\item{code}{String with a maximum length of 10 characters for a database object (GENESIS and regionalstatistik.de) and 15 characters for a Zensus 2022 object. Only one code per iteration. "*" notations are possible.} +\item{code}{String with a maximum length of 15 characters for a database object (GENESIS, regionalstatistik.de, Zensus 2022). Only one code per iteration.} -\item{database}{Character string. Indicator if the GENESIS ('genesis'), Zensus 2022 ('zensus') or regionalstatistik.de ('regio') database is called. Only one database can be addressed per function call. Default option is 'genesis'.} +\item{database}{Character string. Indicator if the GENESIS ('genesis'), Zensus 2022 ('zensus') or regionalstatistik.de ('regio') database is called. Default option is 'all'.} \item{category}{Character string. Specify specific GENESIS/regionalstatistik.de object types ('tables', 'statistics' and 'cubes') and specific Zensus 2022 object types ('tables' and 'statistics'). All types that are specific for one database can be used together. Default option is to use all types that are possible for the specific database.} @@ -28,7 +28,7 @@ gen_metadata( \item{verbose}{Boolean. Indicator if the output of the function should include detailed messages and warnings. Default option is 'TRUE'. Set the parameter to 'FALSE' to suppress additional messages and warnings.} -\item{raw}{Boolean. Should a non-parsed API response be returned?} +\item{raw}{Boolean. Should a non-parsed API response be returned? Default option is 'FALSE'.} \item{...}{Additional parameters for the API call. These parameters are only affecting the call itself, no further processing. For more details see \code{vignette("additional_parameter")}.} } diff --git a/man/gen_metadata_cube.Rd b/man/gen_metadata_cube.Rd index b78cbb1..665c7f5 100644 --- a/man/gen_metadata_cube.Rd +++ b/man/gen_metadata_cube.Rd @@ -7,25 +7,25 @@ gen_metadata_cube( code = NULL, database = c("all", "genesis", "regio"), - error.ignore = FALSE, area = c("all", "public", "user"), + error.ignore = FALSE, verbose = TRUE, - raw = raw, + raw = FALSE, ... ) } \arguments{ \item{code}{A character string with a maximum length of 15 characters. Code from a GENESIS or regionalstatistik.de object. Only one code per iteration.} -\item{database}{Character string. Indicator if the GENESIS ('genesis') or regionalstatistik.de ('regio') database is called. Only one database can be addressed per function call. Default option is 'genesis'.} - -\item{error.ignore}{Boolean. Indicator if the function should stop if an error occurs or no object for the request is found or if it should produce a token as response. Default option is 'FALSE'.} +\item{database}{Character string. Indicator if the GENESIS ('genesis') or regionalstatistik.de ('regio') database is called. Default option is 'all'.} \item{area}{Character string. Indicator from which area of the database the results are called. In general, 'all' is the appropriate solution. Default option is 'all'. Not used for 'statistics'.} +\item{error.ignore}{Boolean. Indicator if the function should stop if an error occurs or no object for the request is found or if it should produce a token as response. Default option is 'FALSE'.} + \item{verbose}{Boolean. Indicator if the output of the function should include detailed messages and warnings. Default option is 'TRUE'. Set the parameter to 'FALSE' to suppress additional messages and warnings.} -\item{raw}{Boolean. Should a non-parsed API response be returned?} +\item{raw}{Boolean. Should a non-parsed API response be returned? Default option is 'FALSE'.} \item{...}{Additional parameters for the API call. These parameters are only affecting the call itself, no further processing. For more details see \code{vignette("additional_parameter")}.} } diff --git a/man/gen_metadata_statistic.Rd b/man/gen_metadata_statistic.Rd index aa4ec0a..28326df 100644 --- a/man/gen_metadata_statistic.Rd +++ b/man/gen_metadata_statistic.Rd @@ -17,7 +17,7 @@ gen_metadata_statistic( \arguments{ \item{code}{A character string with a maximum length of 15 characters. Code from a GENESIS, Zensus 2022 or regionalstatistik.de object. Only one code per iteration.} -\item{database}{Character string. Indicator if the GENESIS ('genesis'), Zensus 2022 ('zensus') or regionalstatistik.de ('regio') database is called. Only one database can be addressed per function call. Default option is 'genesis'.} +\item{database}{Character string. Indicator if the GENESIS ('genesis'), Zensus 2022 ('zensus') or regionalstatistik.de ('regio') database is called. Default option is 'all'.} \item{area}{Character string. Indicator from which area of the database the results are called. In general, 'all' is the appropriate solution. Default option is 'all'. Not used for 'statistics'.} @@ -25,7 +25,7 @@ gen_metadata_statistic( \item{verbose}{Boolean. Indicator if the output of the function should include detailed messages and warnings. Default option is 'TRUE'. Set the parameter to 'FALSE' to suppress additional messages and warnings.} -\item{raw}{Boolean. Should a non-parsed API response be returned?} +\item{raw}{Boolean. Should a non-parsed API response be returned? Default option is 'FALSE'.} \item{...}{Additional parameters for the API call. These parameters are only affecting the call itself, no further processing. For more details see \code{vignette("additional_parameter")}.} } diff --git a/man/gen_metadata_table.Rd b/man/gen_metadata_table.Rd index 38c3bfd..3214a9b 100644 --- a/man/gen_metadata_table.Rd +++ b/man/gen_metadata_table.Rd @@ -17,7 +17,7 @@ gen_metadata_table( \arguments{ \item{code}{A character string with a maximum length of 15 characters. Code from a GENESIS, Zensus 2022 or regionalstatistik.de object. Only one code per iteration.} -\item{database}{Character string. Indicator if the GENESIS ('genesis'), Zensus 2022 ('zensus') or regionalstatistik.de ('regio') database is called. Only one database can be addressed per function call. Default option is 'genesis'.} +\item{database}{Character string. Indicator if the GENESIS ('genesis'), Zensus 2022 ('zensus') or regionalstatistik.de ('regio') database is called. Default option is 'all'.} \item{area}{Character string. Indicator from which area of the database the results are called. In general, 'all' is the appropriate solution. Default option is 'all'. Not used for 'statistics'.} @@ -25,7 +25,7 @@ gen_metadata_table( \item{verbose}{Boolean. Indicator if the output of the function should include detailed messages and warnings. Default option is 'TRUE'. Set the parameter to 'FALSE' to suppress additional messages and warnings.} -\item{raw}{Boolean. Should a non-parsed API response be returned?} +\item{raw}{Boolean. Should a non-parsed API response be returned? Default option is 'FALSE'.} \item{...}{Additional parameters for the API call. These parameters are only affecting the call itself, no further processing. For more details see \code{vignette("additional_parameter")}.} } diff --git a/man/gen_metadata_value.Rd b/man/gen_metadata_value.Rd index 7badb51..a99f338 100644 --- a/man/gen_metadata_value.Rd +++ b/man/gen_metadata_value.Rd @@ -17,7 +17,7 @@ gen_metadata_value( \arguments{ \item{code}{A character string with a maximum length of 15 characters. Code from a GENESIS, Zensus 2022 or regionalstatistik.de object. Only one code per iteration.} -\item{database}{Character string. Indicator if the GENESIS ('genesis'), Zensus 2022 ('zensus') or regionalstatistik.de ('regio') database is called. Only one database can be addressed per function call. Default option is 'genesis'.} +\item{database}{Character string. Indicator if the GENESIS ('genesis'), Zensus 2022 ('zensus') or regionalstatistik.de ('regio') database is called. Default option is 'all'.} \item{area}{Character string. Indicator from which area of the database the results are called. In general, 'all' is the appropriate solution. Default option is 'all'. Not used for 'statistics'.} @@ -25,7 +25,7 @@ gen_metadata_value( \item{verbose}{Boolean. Indicator if the output of the function should include detailed messages and warnings. Default option is 'TRUE'. Set the parameter to 'FALSE' to suppress additional messages and warnings.} -\item{raw}{Boolean. Should a non-parsed API response be returned?} +\item{raw}{Boolean. Should a non-parsed API response be returned? Default option is 'FALSE'.} \item{...}{Additional parameters for the API call. These parameters are only affecting the call itself, no further processing. For more details see \code{vignette("additional_parameter")}.} } diff --git a/man/gen_metadata_variable.Rd b/man/gen_metadata_variable.Rd index 692c70e..4cabb23 100644 --- a/man/gen_metadata_variable.Rd +++ b/man/gen_metadata_variable.Rd @@ -17,7 +17,7 @@ gen_metadata_variable( \arguments{ \item{code}{A character string with a maximum length of 15 characters. Code from a GENESIS, Zensus 2022 or regionalstatistik.de object. Only one code per iteration.} -\item{database}{Character string. Indicator if the GENESIS ('genesis'), Zensus 2022 ('zensus') or regionalstatistik.de ('regio') database is called. Only one database can be addressed per function call. Default option is 'genesis'.} +\item{database}{Character string. Indicator if the GENESIS ('genesis'), Zensus 2022 ('zensus') or regionalstatistik.de ('regio') database is called. Default option is 'all'.} \item{area}{Character string. Indicator from which area of the database the results are called. In general, 'all' is the appropriate solution. Default option is 'all'. Not used for 'statistics'.} @@ -25,7 +25,7 @@ gen_metadata_variable( \item{verbose}{Boolean. Indicator if the output of the function should include detailed messages and warnings. Default option is 'TRUE'. Set the parameter to 'FALSE' to suppress additional messages and warnings.} -\item{raw}{Boolean. Should a non-parsed API response be returned?} +\item{raw}{Boolean. Should a non-parsed API response be returned? Default option is 'FALSE'.} \item{...}{Additional parameters for the API call. These parameters are only affecting the call itself, no further processing. For more details see \code{vignette("additional_parameter")}.} } diff --git a/man/gen_modified_data.Rd b/man/gen_modified_data.Rd index 5cdbebc..de0e4df 100644 --- a/man/gen_modified_data.Rd +++ b/man/gen_modified_data.Rd @@ -16,7 +16,7 @@ gen_modified_data( \arguments{ \item{code}{A character string with a maximum length of 15 characters. Code from a GENESIS, Zensus 2022 or regionalstatistik.de object. Only one code per iteration.} -\item{database}{Character string. Indicator if the GENESIS ('genesis'), Zensus 2022 ('zensus') or regionalstatistik.de ('regio') database is called. Only one database can be addressed per function call. Default option is 'genesis'.} +\item{database}{Character string. Indicator if the GENESIS ('genesis'), Zensus 2022 ('zensus') or regionalstatistik.de ('regio') database is called. Default option is 'all'.} \item{type}{Character string. Specific GENESIS and regionalstatistik.de object types: 'tables', 'statistics', and 'statisticsUpdates'. Specific Zensus 2022 object types: 'tables' and 'statistics'. All types that are specific for one database can be used together through 'all', which is the default.} diff --git a/man/gen_objects2stat.Rd b/man/gen_objects2stat.Rd index 19cb85c..47c1b29 100644 --- a/man/gen_objects2stat.Rd +++ b/man/gen_objects2stat.Rd @@ -10,8 +10,8 @@ gen_objects2stat( category = c("tables", "variables", "cubes"), area = c("all", "public", "user"), detailed = FALSE, - error.ignore = FALSE, sortcriterion = c("code", "content"), + error.ignore = FALSE, verbose = TRUE, ... ) @@ -19,7 +19,7 @@ gen_objects2stat( \arguments{ \item{code}{Character string with a maximum length of 6 characters (15 characters if 'cubes' are not used as a category). Code from a GENESIS, Zensus 2022 or regionalstatistik.de object. Only one code per iteration.} -\item{database}{Character string. Indicator if the GENESIS ('genesis'), Zensus 2022 ('zensus') or regionalstatistik.de ('regio') database is called. Only one database can be addressed per function call. Default option is 'genesis'.} +\item{database}{Character string. Indicator if the GENESIS ('genesis'), Zensus 2022 ('zensus') or regionalstatistik.de ('regio') database is called. Default option is 'all'.} \item{category}{Character string. Specify specific GENESIS/regionalstatistik.de object types ('tables', 'statistics' and 'cubes') and specific Zensus 2022 object types ('tables' and 'statistics'). All types that are specific for one database can be used together. Default option is to use all types that are possible for the specific database.} @@ -27,10 +27,10 @@ gen_objects2stat( \item{detailed}{Boolean. Indicator if the function should return the detailed output of the iteration including all object-related information or only a shortened output including only code and object title. Default option is 'FALSE'.} -\item{error.ignore}{Boolean. Indicator if the function should stop if an error occurs or no object for the request is found or if it should produce a token as response. Default option is 'FALSE'.} - \item{sortcriterion}{Character string. Indicator if the output should be sorted by 'code' or 'content'. This is a parameter of the API call itself. The default is 'code'.} +\item{error.ignore}{Boolean. Indicator if the function should stop if an error occurs or no object for the request is found or if it should produce a token as response. Default option is 'FALSE'.} + \item{verbose}{Boolean. Indicator if the output of the function should include detailed messages and warnings. Default option is 'TRUE'. Set the parameter to 'FALSE' to suppress additional messages and warnings.} \item{...}{Additional parameters for the API call. These parameters are only affecting the call itself, no further processing. For more details see \code{vignette("additional_parameter")}.} diff --git a/man/gen_objects2var.Rd b/man/gen_objects2var.Rd index cc38a64..0ef8516 100644 --- a/man/gen_objects2var.Rd +++ b/man/gen_objects2var.Rd @@ -10,8 +10,8 @@ gen_objects2var( category = c("tables", "statistics", "cubes"), area = c("all", "public", "user"), detailed = FALSE, - error.ignore = FALSE, sortcriterion = c("code", "content"), + error.ignore = FALSE, verbose = TRUE, ... ) @@ -19,7 +19,7 @@ gen_objects2var( \arguments{ \item{code}{Character string with a maximum length of 15 characters. Code from a GENESIS, Zensus 2022 or regionalstatistik.de object. Only one code per iteration.} -\item{database}{Character string. Indicator if the GENESIS ('genesis'), Zensus 2022 ('zensus') or regionalstatistik.de ('regio') database is called. Only one database can be addressed per function call. Default option is 'genesis'.} +\item{database}{Character string. Indicator if the GENESIS ('genesis'), Zensus 2022 ('zensus') or regionalstatistik.de ('regio') database is called. Default option is 'all'.} \item{category}{Character string. Specify specific GENESIS/regionalstatistik.de object types ('tables', 'statistics' and 'cubes') and specific Zensus 2022 object types ('tables' and 'statistics'). All types that are specific for one database can be used together. Default option is to use all types that are possible for the specific database.} @@ -27,10 +27,10 @@ gen_objects2var( \item{detailed}{Boolean. Indicator if the function should return the detailed output of the iteration including all object-related information or only a shortened output including only code and object title. Default option is 'FALSE'.} -\item{error.ignore}{Boolean. Indicator if the function should stop if an error occurs or no object for the request is found or if it should produce a token as response. Default option is 'FALSE'.} - \item{sortcriterion}{Character string. Indicator if the output should be sorted by 'code' or 'content'. This is a parameter of the API call itself. The default is 'code'.} +\item{error.ignore}{Boolean. Indicator if the function should stop if an error occurs or no object for the request is found or if it should produce a token as response. Default option is 'FALSE'.} + \item{verbose}{Boolean. Indicator if the output of the function should include detailed messages and warnings. Default option is 'TRUE'. Set the parameter to 'FALSE' to suppress additional messages and warnings.} \item{...}{Additional parameters for the API call. These parameters are only affecting the call itself, no further processing. For more details see \code{vignette("additional_parameter")}.} diff --git a/man/gen_search_vars.Rd b/man/gen_search_vars.Rd index 390071e..c6c1917 100644 --- a/man/gen_search_vars.Rd +++ b/man/gen_search_vars.Rd @@ -17,7 +17,7 @@ gen_search_vars( \arguments{ \item{code}{Character string with a maximum length of 6 characters. Code from a GENESIS, Zensus 2022 or regionalstatistik.de object. Only one code per iteration.} -\item{database}{Character string. Indicator if the GENESIS ('genesis'), Zensus 2022 ('zensus') or regionalstatistik.de ('regio') database is called. Only one database can be addressed per function call. Default option is 'genesis'.} +\item{database}{Character string. Indicator if the GENESIS ('genesis'), Zensus 2022 ('zensus') or regionalstatistik.de ('regio') database is called. Default option is 'all'.} \item{area}{Character string. Indicator from which area of the database the results are called. In general, 'all' is the appropriate solution. Default option is 'all'. Not used for 'statistics'.} diff --git a/man/gen_signs.Rd b/man/gen_signs.Rd index 5b39ef8..714d264 100644 --- a/man/gen_signs.Rd +++ b/man/gen_signs.Rd @@ -7,7 +7,7 @@ gen_signs(database = c("all", "genesis", "zensus", "regio"), ...) } \arguments{ -\item{database}{Character string. Indicator if the GENESIS ('genesis'), Zensus 2022 ('zensus') or regionalstatistik.de ('regio') database is called. Only one database can be addressed per function call. Default option is 'genesis'.} +\item{database}{Character string. Indicator if the GENESIS ('genesis'), Zensus 2022 ('zensus') or regionalstatistik.de ('regio') database is called. Default option is 'all'.} \item{...}{Additional parameters for the API call. These parameters are only affecting the call itself, no further processing. For more details see \code{vignette("additional_parameter")}.} } diff --git a/man/gen_val2var.Rd b/man/gen_val2var.Rd index 3bd4e80..40df213 100644 --- a/man/gen_val2var.Rd +++ b/man/gen_val2var.Rd @@ -17,13 +17,13 @@ gen_val2var( \arguments{ \item{code}{Character string with a maximum length of 15 characters. Code from a GENESIS, Zensus 2022 or regionalstatistik.de object. Only one code per iteration.} -\item{database}{Character string. Indicator if the GENESIS ('genesis'), Zensus 2022 ('zensus') or regionalstatistik.de ('regio') database is called. Only one database can be addressed per function call. Default option is 'genesis'.} +\item{database}{Character string. Indicator if the GENESIS ('genesis'), Zensus 2022 ('zensus') or regionalstatistik.de ('regio') database is called. Default option is 'all'.} \item{area}{Character string. Indicator from which area of the database the results are called. In general, 'all' is the appropriate solution. Default option is 'all'. Not used for 'statistics'.} \item{sortcriterion}{Character string. Indicator if the output should be sorted by 'code' or 'content'. This is a parameter of the API call itself. The default is 'code'.} -\item{error.ignore}{Boolean. Indicator if the function should stop if an error occurs or no object for the request is found or if it should produce a token as response. Default option is 'FALSE'.} +\item{error.ignore}{Boolean. Indicator for values if the function should stop if an error occurs or no object for the request is found or if it should produce a token as response. Default option is 'TRUE', this prevents the function to stop even if a variable has no further explanation (often the case for numerical variables).} \item{verbose}{Boolean. Indicator if the output of the function should include detailed messages and warnings. Default option is 'TRUE'. Set the parameter to 'FALSE' to suppress additional messages and warnings.} diff --git a/man/gen_val2var2stat.Rd b/man/gen_val2var2stat.Rd index 3453ef9..31b1825 100644 --- a/man/gen_val2var2stat.Rd +++ b/man/gen_val2var2stat.Rd @@ -19,7 +19,7 @@ gen_val2var2stat( \arguments{ \item{code}{Character string with a maximum length of 15 characters. Code from a GENESIS, Zensus 2022 or regionalstatistik.de object. Only one code per iteration.} -\item{database}{Character string. Indicator if the GENESIS ('genesis'), Zensus 2022 ('zensus') or regionalstatistik.de ('regio') database is called. Only one database can be addressed per function call. Default option is 'genesis'.} +\item{database}{Character string. Indicator if the GENESIS ('genesis'), Zensus 2022 ('zensus') or regionalstatistik.de ('regio') database is called. Default option is 'all'.} \item{area}{Character string. Indicator from which area of the database the results are called. In general, 'all' is the appropriate solution. Default option is 'all'. Not used for 'statistics'.} diff --git a/man/gen_var2stat.Rd b/man/gen_var2stat.Rd index b2bb821..606dba9 100644 --- a/man/gen_var2stat.Rd +++ b/man/gen_var2stat.Rd @@ -18,7 +18,7 @@ gen_var2stat( \arguments{ \item{code}{Character string with a maximum length of 15 characters. Code from a GENESIS, Zensus 2022 or regionalstatistik.de object. Only one code per iteration.} -\item{database}{Character string. Indicator if the GENESIS ('genesis'), Zensus 2022 ('zensus') or regionalstatistik.de ('regio') database is called. Only one database can be addressed per function call. Default option is 'genesis'.} +\item{database}{Character string. Indicator if the GENESIS ('genesis'), Zensus 2022 ('zensus') or regionalstatistik.de ('regio') database is called. Default option is 'all'.} \item{area}{Character string. Indicator from which area of the database the results are called. In general, 'all' is the appropriate solution. Default option is 'all'. Not used for 'statistics'.} diff --git a/man/test_database_function.Rd b/man/test_database_function.Rd index b74bcdd..61fccf5 100644 --- a/man/test_database_function.Rd +++ b/man/test_database_function.Rd @@ -4,10 +4,14 @@ \alias{test_database_function} \title{test_database_function} \usage{ -test_database_function(input) +test_database_function(input, error.input, text) } \arguments{ \item{input}{Input to test for database name} + +\item{error.input}{Indicator error.ignore} + +\item{text}{Indicator verbose} } \description{ test_database_function diff --git a/man/titel_search.Rd b/man/titel_search.Rd index 17b66e5..b908e46 100644 --- a/man/titel_search.Rd +++ b/man/titel_search.Rd @@ -4,12 +4,14 @@ \alias{titel_search} \title{titel_search} \usage{ -titel_search(x, term) +titel_search(x, term, text) } \arguments{ \item{x}{Element to extract $Content from} \item{term}{Search term} + +\item{text}{Indicator verbose} } \description{ titel_search diff --git a/tests/testthat/modified2/api/catalogue/modifieddata-87a36f.json b/tests/testthat/modified2/api/catalogue/modifieddata-1a134d.json similarity index 94% rename from tests/testthat/modified2/api/catalogue/modifieddata-87a36f.json rename to tests/testthat/modified2/api/catalogue/modifieddata-1a134d.json index 957456c..4b7ad4b 100644 --- a/tests/testthat/modified2/api/catalogue/modifieddata-87a36f.json +++ b/tests/testthat/modified2/api/catalogue/modifieddata-1a134d.json @@ -13,7 +13,7 @@ "password": "********************", "selection": "61111", "type": "Alle", - "date": "10.07.2024", + "date": "14.07.2024", "pagelength": "100", "language": "de", "area": "Alle" From b482db8183b24170bc3787e4dedee3ba04dadcfc Mon Sep 17 00:00:00 2001 From: buhly Date: Sun, 14 Jul 2024 17:35:05 +0200 Subject: [PATCH 43/52] rewrite gen_auth_save --- R/gen_auth.R | 209 +++++------------------------------------------- R/utils_httr2.R | 112 ++++++++++++++++++++++++++ 2 files changed, 134 insertions(+), 187 deletions(-) diff --git a/R/gen_auth.R b/R/gen_auth.R index af81e7a..fac3507 100644 --- a/R/gen_auth.R +++ b/R/gen_auth.R @@ -6,9 +6,9 @@ #' #' @details Username and password are encrypted and saved as RDS in the #' package config directory. A random string is generated and stored in the -#' session environment variable `RESTATIS_KEY`. This string is used as the key -#' to encrypt and decrypt the entered credentials. To avoid having to save -#' authentication in future sessions, `RESTATIS_KEY` can be added to .Renviron. +#' session environment variable `GENESIS_KEY`. This string is used as the key +#' to encrypt and decrypt the entered credentials. To avoid havding to save +#' authentication in future sessions, `GENESIS_KEY` can be added to .Renviron. #' The usethis package includes a helper function for editing .Renviron files #' from an R session with [usethis::edit_r_environ()]. #' @@ -27,209 +27,44 @@ gen_auth_save <- function(database = c("all", "genesis", "zensus", "regio")) { #----------------------------------------------------------------------------- - if (database == "genesis"){ + if (database %in% c("genesis", "regio")) { - username <- gen_auth_ask("username") - password <- gen_auth_ask("password") + insert_and_save_credentials(database) - auth_path <- gen_auth_path("auth.rds") - - key <- httr2::secret_make_key() - - Sys.setenv(RESTATIS_KEY = key) - - message("Saving GENESIS database credentials to ", - auth_path, - "\n\n", - "Please add the following line to your .Renviron, ", - "e.g. via `usethis::edit_r_environ()`, ", - "to use the specified username and password across sessions:\n\n", - "RESTATIS_KEY=", - key, - "\n\n") - - dir.create(gen_auth_path(), showWarnings = FALSE, recursive = TRUE) - - httr2::secret_write_rds(list(username = username, password = password), - path = auth_path, - key = "RESTATIS_KEY") - - # Logincheck - gen_logincheck(database = "genesis") + gen_logincheck(database = database) #----------------------------------------------------------------------------- } else if (database == "zensus"){ - want_token_resp <- askpass::askpass("Do you want to specifiy a Zensus 2022 API token for API access? Type 'yes'.\n - If you want to specify username and password, type any character.") - want_token <- ifelse(trimws(tolower(want_token_resp)) == "yes", TRUE, FALSE) - - if (isTRUE(want_token)) { - - username <- gen_auth_ask("API token") - password <- NULL - - } else { - - username <- gen_auth_ask("username") - password <- gen_auth_ask("password") - - } - - auth_path <- gen_auth_path("auth_zensus.rds") - - key <- httr2::secret_make_key() - - Sys.setenv(ZENSUS_KEY = key) - - message("Saving Zensus 2022 database credentials to ", - auth_path, - "\n\n", - "Please add the following line to your .Renviron, ", - "e.g. via `usethis::edit_r_environ()`, ", - "to use the specified username and password across sessions:\n\n", - "ZENSUS_KEY=", - key, - "\n\n") + insert_and_save_credentials("zensus") - dir.create(gen_auth_path(), showWarnings = FALSE, recursive = TRUE) - - httr2::secret_write_rds(list(username = username, password = password), - path = auth_path, - key = "ZENSUS_KEY") - - # Logincheck gen_logincheck(database = "zensus") - #----------------------------------------------------------------------------- - - } else if (database == "regio"){ - - username <- gen_auth_ask("username") - password <- gen_auth_ask("password") - - auth_path <- gen_auth_path("auth_regio.rds") - - key <- httr2::secret_make_key() - - Sys.setenv(REGIO_KEY = key) - - message("Saving regionalstatistik.de database credentials to ", - auth_path, - "\n\n", - "Please add the following line to your .Renviron, ", - "e.g. via `usethis::edit_r_environ()`, ", - "to use the specified username and password across sessions:\n\n", - "REGIO_KEY=", - key, - "\n\n") - - dir.create(gen_auth_path(), showWarnings = FALSE, recursive = TRUE) - - httr2::secret_write_rds(list(username = username, password = password), - path = auth_path, - key = "REGIO_KEY") - - # Logincheck - gen_logincheck(database = "regio") - - #----------------------------------------------------------------------------- - } else if (database == "all"){ - message("~~ Saving credentials for GENESIS database.") - - username <- gen_auth_ask("username") - password <- gen_auth_ask("password") - - auth_path <- gen_auth_path("auth.rds") - - key <- httr2::secret_make_key() - - Sys.setenv(RESTATIS_KEY = key) - - message("Saving GENESIS database credentials to ", - auth_path, - "\n\n", - "Please add the following line to your .Renviron, ", - "e.g. via `usethis::edit_r_environ()`, ", - "to use the specified username and password across sessions:\n\n", - "RESTATIS_KEY=", - key, - "\n\n") + #--------------------------------------------------------------------------- - dir.create(gen_auth_path(), showWarnings = FALSE, recursive = TRUE) + message("~~ Saving credentials for the 'genesis' database.") - httr2::secret_write_rds(list(username = username, password = password), - path = auth_path, - key = "RESTATIS_KEY") + insert_and_save_credentials("genesis") - # Logincheck gen_logincheck(database = "genesis") #------------------------------------------------------------------------- - message("~~ Saving credentials for Zensus 2022 database.") + message("~~ Saving credentials for the Zensus 2022 database.\n") - username <- gen_auth_ask("username") - password <- gen_auth_ask("password") + insert_and_save_credentials("zensus") - auth_path <- gen_auth_path("auth_zensus.rds") - - key <- httr2::secret_make_key() - - Sys.setenv(ZENSUS_KEY = key) - - message("Saving Zensus 2022 database credentials to ", - auth_path, - "\n\n", - "Please add the following line to your .Renviron, ", - "e.g. via `usethis::edit_r_environ()`, ", - "to use the specified username and password across sessions:\n\n", - "ZENSUS_KEY=", - key, - "\n\n") - - dir.create(gen_auth_path(), showWarnings = FALSE, recursive = TRUE) - - httr2::secret_write_rds(list(username = username, password = password), - path = auth_path, - key = "ZENSUS_KEY") - - # Logincheck gen_logincheck(database = "zensus") #------------------------------------------------------------------------- message("~~ Saving credentials for regionalstatistik.de database.") - username <- gen_auth_ask("username") - password <- gen_auth_ask("password") - - auth_path <- gen_auth_path("auth_regio.rds") - - key <- httr2::secret_make_key() - - Sys.setenv(REGIO_KEY = key) - - message("Saving regionalstatistik.de database credentials to ", - auth_path, - "\n\n", - "Please add the following line to your .Renviron, ", - "e.g. via `usethis::edit_r_environ()`, ", - "to use the specified username and password across sessions:\n\n", - "REGIO_KEY=", - key, - "\n\n") - - dir.create(gen_auth_path(), showWarnings = FALSE, recursive = TRUE) - - httr2::secret_write_rds(list(username = username, password = password), - path = auth_path, - key = "REGIO_KEY") + insert_and_save_credentials("regio") - # Logincheck gen_logincheck(database = "regio") #----------------------------------------------------------------------------- @@ -305,9 +140,9 @@ gen_auth_get <- function(database = c("all", "genesis", "zensus", "regio")) { if (database == "genesis") { - auth_path <- gen_auth_path("auth.rds") + auth_path <- gen_auth_path("auth_genesis.rds") - if (!(file.exists(auth_path) && nzchar(Sys.getenv("RESTATIS_KEY")))) { + if (!(file.exists(auth_path) && nzchar(Sys.getenv("GENESIS_KEY")))) { stop(paste0("GENESIS database credentials not found. ", "Please run 'gen_auth_save()' to store GENESIS database username and password."), @@ -315,7 +150,7 @@ gen_auth_get <- function(database = c("all", "genesis", "zensus", "regio")) { } - return(httr2::secret_read_rds(auth_path, "RESTATIS_KEY")) + return(httr2::secret_read_rds(auth_path, "GENESIS_KEY")) #--------------------------------------------------------------------------- @@ -353,9 +188,9 @@ gen_auth_get <- function(database = c("all", "genesis", "zensus", "regio")) { } else if (database == "all") { - auth_path <- gen_auth_path("auth.rds") + auth_path <- gen_auth_path("auth_genesis.rds") - if (!(file.exists(auth_path) && nzchar(Sys.getenv("RESTATIS_KEY")))) { + if (!(file.exists(auth_path) && nzchar(Sys.getenv("GENESIS_KEY")))) { stop(paste0("GENESIS database credentials not found. ", "Please run 'gen_auth_save()' to store GENESIS database username and password."), @@ -364,7 +199,7 @@ gen_auth_get <- function(database = c("all", "genesis", "zensus", "regio")) { } message("Credentials for database GENESIS:\n") - print(httr2::secret_read_rds(auth_path, "RESTATIS_KEY")) + print(httr2::secret_read_rds(auth_path, "GENESIS_KEY")) #--------------------------------------------------------------------------- @@ -406,9 +241,9 @@ gen_auth_get <- function(database = c("all", "genesis", "zensus", "regio")) { if ("genesis" %in% database) { - auth_path <- gen_auth_path("auth.rds") + auth_path <- gen_auth_path("auth_genesis.rds") - if (!(file.exists(auth_path) && nzchar(Sys.getenv("RESTATIS_KEY")))) { + if (!(file.exists(auth_path) && nzchar(Sys.getenv("GENESIS_KEY")))) { stop(paste0("GENESIS database credentials not found. ", "Please run 'gen_auth_save()' to store GENESIS database username and password."), @@ -417,7 +252,7 @@ gen_auth_get <- function(database = c("all", "genesis", "zensus", "regio")) { } message("Credentials for database GENESIS:\n") - print(httr2::secret_read_rds(auth_path, "RESTATIS_KEY")) + print(httr2::secret_read_rds(auth_path, "GENESIS_KEY")) } diff --git a/R/utils_httr2.R b/R/utils_httr2.R index ea9040d..653c62d 100644 --- a/R/utils_httr2.R +++ b/R/utils_httr2.R @@ -575,3 +575,115 @@ logincheck_stop_or_warn <- function(response, } } + +#------------------------------------------------------------------------------- + +#' insert_and_save_credentials +#' +#' @param database The database to specify credentials for +#' +insert_and_save_credentials <- function(database) { + + if (database %in% c("genesis", "regio")) { + + username <- gen_auth_ask("username") + password <- gen_auth_ask("password") + + auth_path <- gen_auth_path(paste0("auth_", database, ".rds")) + + key <- httr2::secret_make_key() + + key_name <- paste0(toupper(database), "_KEY") + + do.call("Sys.setenv", setNames(list(key), key_name)) + + message(paste0("Saving '", database, "' database credentials to "), + auth_path, + "\n\n", + "Please add the following line to your .Renviron, ", + "e.g. via `usethis::edit_r_environ()`, ", + "to use the specified username and password across sessions:\n\n", + paste0(key_name, "="), + key, + "\n\n") + + dir.create(gen_auth_path(), showWarnings = FALSE, recursive = TRUE) + + httr2::secret_write_rds(list(username = username, + password = password), + path = auth_path, + key = key_name) + + } else if (database == "zensus") { + + want_token_resp <- menu(choices = c("Zensus 2022 API token", + "username/mail address + password"), + graphics = FALSE, + title = "Do you want to specifiy a Zensus 2022 API token or regular credentials for access?") + + want_token <- ifelse(want_token_resp == 1L, TRUE, FALSE) + + if (isTRUE(want_token)) { + + username <- gen_auth_ask("API token") + + auth_path <- gen_auth_path("auth_zensus.rds") + + key <- httr2::secret_make_key() + + Sys.setenv(ZENSUS_KEY = key) + + message("Saving Zensus 2022 database credentials to ", + auth_path, + "\n\n", + "Please add the following line to your .Renviron, ", + "e.g. via `usethis::edit_r_environ()`, ", + "to use the specified username and password across sessions:\n\n", + "ZENSUS_KEY=", + key, + "\n\n") + + dir.create(gen_auth_path(), showWarnings = FALSE, recursive = TRUE) + + httr2::secret_write_rds(list(username = username), + path = auth_path, + key = "ZENSUS_KEY") + + } else { + + username <- gen_auth_ask("username") + password <- gen_auth_ask("password") + + auth_path <- gen_auth_path("auth_zensus.rds") + + key <- httr2::secret_make_key() + + Sys.setenv(ZENSUS_KEY = key) + + message("Saving Zensus 2022 database credentials to ", + auth_path, + "\n\n", + "Please add the following line to your .Renviron, ", + "e.g. via `usethis::edit_r_environ()`, ", + "to use the specified username and password across sessions:\n\n", + "ZENSUS_KEY=", + key, + "\n\n") + + dir.create(gen_auth_path(), showWarnings = FALSE, recursive = TRUE) + + httr2::secret_write_rds(list(username = username, password = password), + path = auth_path, + key = "ZENSUS_KEY") + + } + + + } else { + + stop("Misspecification of parameter 'database' in function 'insert_and_save_credentials'.", + call. = FALSE) + + } + +} From 90a7084dba9bbb951a351b541537a1c6cf3f1639 Mon Sep 17 00:00:00 2001 From: buhly Date: Sun, 14 Jul 2024 18:20:36 +0200 Subject: [PATCH 44/52] fixes --- R/utils_dataprocessing.R | 5 +---- R/utils_httr2.R | 5 +++-- 2 files changed, 4 insertions(+), 6 deletions(-) diff --git a/R/utils_dataprocessing.R b/R/utils_dataprocessing.R index 7f35b97..110b4e3 100644 --- a/R/utils_dataprocessing.R +++ b/R/utils_dataprocessing.R @@ -61,11 +61,8 @@ forming_evas <- function(list_of) { } else if (!file.exists(system.file("data", "evas_list.rda", package = "restatis"))) { - # This applies to the case of using devtools::check() - # and running it via check_dir = "tests/testthat" + # This applies to the case of using devtools::check(check_dir = "tests/testthat") data_path <- "../../../../../data/evas_list.rda" - print(data_path) - print(getwd()) } diff --git a/R/utils_httr2.R b/R/utils_httr2.R index 653c62d..cd2910d 100644 --- a/R/utils_httr2.R +++ b/R/utils_httr2.R @@ -614,10 +614,12 @@ insert_and_save_credentials <- function(database) { path = auth_path, key = key_name) + #----------------------------------------------------------------------------- + } else if (database == "zensus") { want_token_resp <- menu(choices = c("Zensus 2022 API token", - "username/mail address + password"), + "mail address + password"), graphics = FALSE, title = "Do you want to specifiy a Zensus 2022 API token or regular credentials for access?") @@ -678,7 +680,6 @@ insert_and_save_credentials <- function(database) { } - } else { stop("Misspecification of parameter 'database' in function 'insert_and_save_credentials'.", From 958e69f312968f206cb1056e02c07c8b7560da26 Mon Sep 17 00:00:00 2001 From: buhly Date: Sun, 14 Jul 2024 18:44:33 +0200 Subject: [PATCH 45/52] fixeeeees --- R/gen_jobs.R | 14 ++++-------- R/gen_list_results.R | 54 -------------------------------------------- 2 files changed, 5 insertions(+), 63 deletions(-) delete mode 100644 R/gen_list_results.R diff --git a/R/gen_jobs.R b/R/gen_jobs.R index d4395b8..50005a4 100644 --- a/R/gen_jobs.R +++ b/R/gen_jobs.R @@ -118,7 +118,7 @@ gen_list_jobs <- function(database = c("genesis", "regio"), #' @param database Character string. Indicator if the GENESIS ('genesis') or regionalstatistik.de ('regio') database is called. Only one database can be addressed per function call. Default option is 'genesis'. #' @param area Character string. Indicator from which area of the database the results are called. In general, 'all' is the appropriate solution. Default option is 'all'. #' @param compress Boolean. Should empty rows and columns be discarded? Default is FALSE. -#' @param language Character string. Search terms, returned messages and data descriptions in German ("de") or English ("en")? +#' @param language Character string. Defines if the decimal mark and grouping mark of integers should be represented based on the European (e.g.: '100,5', '200.000,5') or American ('100.5', '200,000.5') system. Defaults to 'Sys.getenv("GENESIS_LANG")'. #' @param all_character Boolean. Should all variables be imported as 'character' variables? Avoids fuzzy data type conversions if there are leading zeros or other special characters. Defaults to TRUE. #' #' @return Returns a data.frame with the table content @@ -142,14 +142,10 @@ gen_download_job <- function(name, area <- match.arg(area) - if (!isTRUE(language == "en")) { - - area <- switch(area, - all = "all", - public = "\u00F6ffentlich", - user = "benutzer") - - } + area <- switch(area, + all = "all", + public = "\u00F6ffentlich", + user = "benutzer") #----------------------------------------------------------------------------- # Parameter processing of 'all character' for later use in read_delim diff --git a/R/gen_list_results.R b/R/gen_list_results.R deleted file mode 100644 index 3647ba0..0000000 --- a/R/gen_list_results.R +++ /dev/null @@ -1,54 +0,0 @@ -#' gen_list_results -#' -#' @description Function to list all current results connected to the given user in the GENESIS, Zensus 2022 or regionalstatistik.de database. Important note: For this function it is also possible to use `selection` parameter, making it possible to filter the results based on the 'code' of the object. For more details see `vignette("additional_parameter")`. -#' -#' @param database Character string. Indicator if the GENESIS ('genesis'), Zensus 2022 ('zensus') or regionalstatistik.de ('regio') database is called. Only one database can be addressed per function call. Default option is 'genesis'. -#' @param area Character string. Indicator from which area of the database the results are called. In general, 'all' is the appropriate solution. Default option is 'all'. Not used for 'statistics'. -#' @param ... Additional parameters for the API call. These parameters are only affecting the call itself, no further processing. For more details see `vignette("additional_parameter")`. -#' -#' @return A list of all current results connected to the given user. -#' @export -#' -gen_list_results <- function(database = c("genesis", "zensus", "regio"), - area = c("all", "public", "user"), - ...) { - - gen_fun <- test_database_function(database, - error.input = T, - text = T) - - area <- match.arg(area) - - area <- switch(area, - all = "all", - public = "\u00F6ffentlich", - user = "benutzer") - - par_list <- list(endpoint = "catalogue/results", - area = area, - ...) - - results_raw <- do.call(gen_fun, par_list) - - results_json <- test_if_json(results_raw) - - if (results_json$Status$Code %in% c(103, 104)) { - - stop("There are not (yet) any objects matching your request.", - call. = FALSE) - - } - - res <- list("Output" = tibble::as_tibble(binding_lapply(results_json$List, - characteristics = c("Code", - "Content", - "Values")))) - - attr(res, "Database") <- database[1] - attr(res, "Database") <- results_json$Parameter$area - attr(res, "Language") <- results_json$Parameter$language - attr(res, "Copyright") <- results_json$Copyright - - return(res) - -} From 0eb02601c285cb6e5e46b654401a4f0fc53e2dfb Mon Sep 17 00:00:00 2001 From: buhly Date: Tue, 16 Jul 2024 20:38:15 +0200 Subject: [PATCH 46/52] fixes --- NAMESPACE | 1 - R/utils_dataprocessing.R | 14 +------------- man/gen_auth_save.Rd | 6 +++--- man/gen_download_job.Rd | 2 +- man/gen_list_results.Rd | 25 ------------------------- man/insert_and_save_credentials.Rd | 14 ++++++++++++++ 6 files changed, 19 insertions(+), 43 deletions(-) delete mode 100644 man/gen_list_results.Rd create mode 100644 man/insert_and_save_credentials.Rd diff --git a/NAMESPACE b/NAMESPACE index 4bab419..0c42084 100644 --- a/NAMESPACE +++ b/NAMESPACE @@ -8,7 +8,6 @@ export(gen_cube) export(gen_download_job) export(gen_find) export(gen_list_jobs) -export(gen_list_results) export(gen_logincheck) export(gen_metadata) export(gen_metadata_cube) diff --git a/R/utils_dataprocessing.R b/R/utils_dataprocessing.R index 110b4e3..ff9df60 100644 --- a/R/utils_dataprocessing.R +++ b/R/utils_dataprocessing.R @@ -54,20 +54,8 @@ param_collapse_vec <- function(vec) { #' forming_evas <- function(list_of) { - # Path selection - if (file.exists(system.file("data", "evas_list.rda", package = "restatis"))) { - - data_path <- system.file("data", "evas_list.rda", package = "restatis") - - } else if (!file.exists(system.file("data", "evas_list.rda", package = "restatis"))) { - - # This applies to the case of using devtools::check(check_dir = "tests/testthat") - data_path <- "../../../../../data/evas_list.rda" - - } - # Load data - load(data_path) + data(evas_list) #----------------------------------------------------------------------------- # Process them diff --git a/man/gen_auth_save.Rd b/man/gen_auth_save.Rd index 70db029..5cb642d 100644 --- a/man/gen_auth_save.Rd +++ b/man/gen_auth_save.Rd @@ -15,9 +15,9 @@ Save credentials of the different databases for further convenient use \details{ Username and password are encrypted and saved as RDS in the package config directory. A random string is generated and stored in the -session environment variable \code{RESTATIS_KEY}. This string is used as the key -to encrypt and decrypt the entered credentials. To avoid having to save -authentication in future sessions, \code{RESTATIS_KEY} can be added to .Renviron. +session environment variable \code{GENESIS_KEY}. This string is used as the key +to encrypt and decrypt the entered credentials. To avoid havding to save +authentication in future sessions, \code{GENESIS_KEY} can be added to .Renviron. The usethis package includes a helper function for editing .Renviron files from an R session with \code{\link[usethis:edit]{usethis::edit_r_environ()}}. } diff --git a/man/gen_download_job.Rd b/man/gen_download_job.Rd index 529fb41..b41f715 100644 --- a/man/gen_download_job.Rd +++ b/man/gen_download_job.Rd @@ -22,7 +22,7 @@ gen_download_job( \item{compress}{Boolean. Should empty rows and columns be discarded? Default is FALSE.} -\item{language}{Character string. Search terms, returned messages and data descriptions in German ("de") or English ("en")?} +\item{language}{Character string. Defines if the decimal mark and grouping mark of integers should be represented based on the European (e.g.: '100,5', '200.000,5') or American ('100.5', '200,000.5') system. Defaults to 'Sys.getenv("GENESIS_LANG")'.} \item{all_character}{Boolean. Should all variables be imported as 'character' variables? Avoids fuzzy data type conversions if there are leading zeros or other special characters. Defaults to TRUE.} } diff --git a/man/gen_list_results.Rd b/man/gen_list_results.Rd deleted file mode 100644 index 62155c1..0000000 --- a/man/gen_list_results.Rd +++ /dev/null @@ -1,25 +0,0 @@ -% Generated by roxygen2: do not edit by hand -% Please edit documentation in R/gen_list_results.R -\name{gen_list_results} -\alias{gen_list_results} -\title{gen_list_results} -\usage{ -gen_list_results( - database = c("genesis", "zensus", "regio"), - area = c("all", "public", "user"), - ... -) -} -\arguments{ -\item{database}{Character string. Indicator if the GENESIS ('genesis'), Zensus 2022 ('zensus') or regionalstatistik.de ('regio') database is called. Only one database can be addressed per function call. Default option is 'genesis'.} - -\item{area}{Character string. Indicator from which area of the database the results are called. In general, 'all' is the appropriate solution. Default option is 'all'. Not used for 'statistics'.} - -\item{...}{Additional parameters for the API call. These parameters are only affecting the call itself, no further processing. For more details see \code{vignette("additional_parameter")}.} -} -\value{ -A list of all current results connected to the given user. -} -\description{ -Function to list all current results connected to the given user in the GENESIS, Zensus 2022 or regionalstatistik.de database. Important note: For this function it is also possible to use \code{selection} parameter, making it possible to filter the results based on the 'code' of the object. For more details see \code{vignette("additional_parameter")}. -} diff --git a/man/insert_and_save_credentials.Rd b/man/insert_and_save_credentials.Rd new file mode 100644 index 0000000..7778e79 --- /dev/null +++ b/man/insert_and_save_credentials.Rd @@ -0,0 +1,14 @@ +% Generated by roxygen2: do not edit by hand +% Please edit documentation in R/utils_httr2.R +\name{insert_and_save_credentials} +\alias{insert_and_save_credentials} +\title{insert_and_save_credentials} +\usage{ +insert_and_save_credentials(database) +} +\arguments{ +\item{database}{The database to specify credentials for} +} +\description{ +insert_and_save_credentials +} From 8d8e81b8a288599a728c805efbef1412c1d2b43b Mon Sep 17 00:00:00 2001 From: buhly Date: Tue, 16 Jul 2024 20:55:57 +0200 Subject: [PATCH 47/52] fix authorization with token --- R/utils_httr2.R | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/R/utils_httr2.R b/R/utils_httr2.R index cd2910d..4e5929c 100644 --- a/R/utils_httr2.R +++ b/R/utils_httr2.R @@ -628,6 +628,7 @@ insert_and_save_credentials <- function(database) { if (isTRUE(want_token)) { username <- gen_auth_ask("API token") + password <- "" auth_path <- gen_auth_path("auth_zensus.rds") @@ -647,7 +648,8 @@ insert_and_save_credentials <- function(database) { dir.create(gen_auth_path(), showWarnings = FALSE, recursive = TRUE) - httr2::secret_write_rds(list(username = username), + httr2::secret_write_rds(list(username = username, + password = password), path = auth_path, key = "ZENSUS_KEY") From 06e137f7f74db108a14f750dbb766a3e7c69b1c3 Mon Sep 17 00:00:00 2001 From: bubux Date: Thu, 18 Jul 2024 16:30:52 +0200 Subject: [PATCH 48/52] fix gen cat --- R/utils_dataprocessing.R | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/R/utils_dataprocessing.R b/R/utils_dataprocessing.R index ff9df60..4c78cca 100644 --- a/R/utils_dataprocessing.R +++ b/R/utils_dataprocessing.R @@ -55,7 +55,7 @@ param_collapse_vec <- function(vec) { forming_evas <- function(list_of) { # Load data - data(evas_list) + evas_list <- restatis::evas_list #----------------------------------------------------------------------------- # Process them From abeda787d2b09cd5978a2ecb2aee99f4d9b458bc Mon Sep 17 00:00:00 2001 From: bubux Date: Thu, 18 Jul 2024 16:50:53 +0200 Subject: [PATCH 49/52] fix stuff --- R/gen_alternative_terms.R | 2 +- R/utils_dataprocessing.R | 75 +++++++++++++++++++++++---------------- 2 files changed, 45 insertions(+), 32 deletions(-) diff --git a/R/gen_alternative_terms.R b/R/gen_alternative_terms.R index 2999ddb..0b14964 100644 --- a/R/gen_alternative_terms.R +++ b/R/gen_alternative_terms.R @@ -33,7 +33,7 @@ gen_alternative_terms <- function(term = NULL, caller <- as.character(match.call()[1]) gen_fun <- test_database_function(database, - error.input = T, + error.input = TRUE, text = verbose) check_function_input(term = term, diff --git a/R/utils_dataprocessing.R b/R/utils_dataprocessing.R index 4c78cca..da6ac80 100644 --- a/R/utils_dataprocessing.R +++ b/R/utils_dataprocessing.R @@ -1051,8 +1051,10 @@ titel_search <- function(x, term, text) { a <- rep(FALSE, length(x$Content)) - if(isTRUE(verbose)){ - message("Combination of words too complex for ordering. Data is processed without ordering.") + if (isTRUE(verbose)) { + + message("Combination of words too complex for ordering. Data is processed without ordering.") + } } else if (grep("\\bODER\\b|\\boder\\b|\\bOder\\b|\\|", term, ignore.case = TRUE)) { @@ -1075,8 +1077,10 @@ titel_search <- function(x, term, text) { a <- rep(FALSE, length(x$Content)) - if(isTRUE(verbose)){ + if (isTRUE(verbose)) { + message("Combination of words not valid for ordering. Data is processed without ordering.") + } } @@ -1112,7 +1116,7 @@ test_database_function <- function(input, error.input, text){ #----------------------------------------------------------------------------- - if(sum(is.na(input)) == length(input)){ + if (sum(is.na(input)) == length(input)) { stop("You have to correctly specifiy a 'database' parameter. Please refer to the documentation for further information.", call. = FALSE) @@ -1123,27 +1127,27 @@ test_database_function <- function(input, error.input, text){ res <- c() - if("genesis" %in% input){ + if ("genesis" %in% input) { res <- c(res, "genesis" = "gen_api") } - if("zensus" %in% input){ + if ("zensus" %in% input) { res <- c(res, "zensus" = "gen_zensus_api") } - if("regio" %in% input){ + if ("regio" %in% input) { res <- c(res, "regio" = "gen_regio_api") } - if("all" %in% input){ + if ("all" %in% input) { - if(isTRUE(text)){ + if (isTRUE(text)) { message("All databases accessible to you are selected. Additional databases specified in the 'database'-parameter are ignored.") @@ -1151,18 +1155,16 @@ test_database_function <- function(input, error.input, text){ res <- c("genesis" = "gen_api", "zensus" = "gen_zensus_api", "regio" = "gen_regio_api") - } else if(length(res) != length(input)){ - - if(isFALSE(error.input)){ - + } else if (length(res) != length(input)) { + if (isFALSE(error.input)) { stop("One or more of the specified databases are not part of this package. Currently only 'genesis', 'zensus', and 'regio' are implemented.", call. = FALSE) } else { - if(isTRUE(text)){ + if (isTRUE(text)) { message("One or more of the specified databases are not part of this package. The function is continued with the available databases that you specified.") @@ -1174,41 +1176,47 @@ test_database_function <- function(input, error.input, text){ #----------------------------------------------------------------------------- - check <- sapply(res, function(y){ + check <- sapply(res, function(y) { nam <- rev_database_function(y) - result <- tryCatch( - { + result <- tryCatch({ + user <- gen_auth_get(nam)$username - }, - error = function(e) { + + }, error = function(e) { + return(FALSE) - } - ) - if(isFALSE(result)){ + }) + + if (isFALSE(result)) { return(FALSE) } else { return(TRUE) + } + }) - if(sum(check) == 0){ + #----------------------------------------------------------------------------- + + if (sum(check) == 0) { stop("None of the specified databases are accessible to you. Please check your credentials.", call. = FALSE) - } else if (any(check == FALSE)){ + } else if (any(check == FALSE)) { - if(isTRUE(error.input)){ + if (isTRUE(error.input)) { - if(isTRUE(text)){ + if (isTRUE(text)) { mess <- paste("The following databases are not accessible to you:", names(res[!check])) + message(mess) message("The function is continued with the available databases that you specified.") @@ -1220,14 +1228,16 @@ test_database_function <- function(input, error.input, text){ } else { mess <- paste("The following databases are not accessible to you:", names(res[!check]), "\nPlease check your credentials.") + stop(mess, call. = FALSE) } + } #----------------------------------------------------------------------------- - if (identical(res, c())){ + if (identical(res, c())) { stop("You have to correctly specifiy a 'database' parameter. Please refer to the documentation for further information.", call. = FALSE) @@ -1239,6 +1249,7 @@ test_database_function <- function(input, error.input, text){ } } + #------------------------------------------------------------------------------- #' rev_database_function #' @@ -1261,7 +1272,7 @@ rev_database_function <- function(input){ #' check_results <- function(input){ - if(length(input) > 1){ + if (length(input) > 1) { return(input) @@ -1282,14 +1293,16 @@ check_results <- function(input){ #' @param text verbose TRUE or FALSE #' @param sub_category sub_category character string #' -find_token <- function(input, error.input, text, sub_category){ +find_token <- function(input, error.input, text, sub_category) { mes <- paste("No", sub_category, "found for the search term.") - if(isTRUE(error.input)) { + if (isTRUE(error.input)) { + + if (isTRUE(text)) { - if(isTRUE(text)){ message(mes) + } return(mes) From 8b35592291cee3e13e61dabdeaaef11d987aa472 Mon Sep 17 00:00:00 2001 From: bubux Date: Thu, 18 Jul 2024 17:06:57 +0200 Subject: [PATCH 50/52] fix test --- R/globals.R | 4 +++- .../{modifieddata-1a134d.json => modifieddata-03cbb4.json} | 2 +- 2 files changed, 4 insertions(+), 2 deletions(-) rename tests/testthat/modified2/api/catalogue/{modifieddata-1a134d.json => modifieddata-03cbb4.json} (94%) diff --git a/R/globals.R b/R/globals.R index c994aa4..5ddbeb3 100644 --- a/R/globals.R +++ b/R/globals.R @@ -1,2 +1,4 @@ utils::globalVariables(c("evas_list", - "verbose")) + "verbose", + "menu", + "setNames")) diff --git a/tests/testthat/modified2/api/catalogue/modifieddata-1a134d.json b/tests/testthat/modified2/api/catalogue/modifieddata-03cbb4.json similarity index 94% rename from tests/testthat/modified2/api/catalogue/modifieddata-1a134d.json rename to tests/testthat/modified2/api/catalogue/modifieddata-03cbb4.json index 4b7ad4b..945cd14 100644 --- a/tests/testthat/modified2/api/catalogue/modifieddata-1a134d.json +++ b/tests/testthat/modified2/api/catalogue/modifieddata-03cbb4.json @@ -13,7 +13,7 @@ "password": "********************", "selection": "61111", "type": "Alle", - "date": "14.07.2024", + "date": "18.07.2024", "pagelength": "100", "language": "de", "area": "Alle" From c785b8868678a7cc2557966dc8f6801355ca5428 Mon Sep 17 00:00:00 2001 From: bubux Date: Fri, 19 Jul 2024 22:46:32 +0200 Subject: [PATCH 51/52] update vignettes --- .Rbuildignore | 1 + R/{gen_meta_data.R => gen_metadata.R} | 2 +- man/gen_metadata.Rd | 4 +- man/gen_metadata_cube.Rd | 2 +- man/gen_metadata_statistic.Rd | 2 +- man/gen_metadata_table.Rd | 2 +- man/gen_metadata_value.Rd | 2 +- man/gen_metadata_variable.Rd | 2 +- .../api/catalogue/modifieddata-03cbb4.json | 25 --- vignettes/additional_parameter.Rmd | 110 ++++++------ vignettes/restatis.Rmd | 170 ++++-------------- 11 files changed, 103 insertions(+), 219 deletions(-) rename R/{gen_meta_data.R => gen_metadata.R} (99%) delete mode 100644 tests/testthat/modified2/api/catalogue/modifieddata-03cbb4.json diff --git a/.Rbuildignore b/.Rbuildignore index e79efb0..61b9dae 100644 --- a/.Rbuildignore +++ b/.Rbuildignore @@ -9,3 +9,4 @@ ^docs$ ^pkgdown$ ^codecov\.yml$ +^cran-comments\.md$ diff --git a/R/gen_meta_data.R b/R/gen_metadata.R similarity index 99% rename from R/gen_meta_data.R rename to R/gen_metadata.R index 84c1f12..bfca047 100644 --- a/R/gen_meta_data.R +++ b/R/gen_metadata.R @@ -771,7 +771,7 @@ gen_metadata_cube <- function(code = NULL, #' #' @param code String with a maximum length of 15 characters for a database object (GENESIS, regionalstatistik.de, Zensus 2022). Only one code per iteration. #' @param database Character string. Indicator if the GENESIS ('genesis'), Zensus 2022 ('zensus') or regionalstatistik.de ('regio') database is called. Default option is 'all'. -#' @param category Character string. Specify specific GENESIS/regionalstatistik.de object types ('tables', 'statistics' and 'cubes') and specific Zensus 2022 object types ('tables' and 'statistics'). All types that are specific for one database can be used together. Default option is to use all types that are possible for the specific database. +#' @param category Character string. Specifying the specific object type of the object that you want meta data for. No default option - you need to specify the object type. Hint: The functions in 'restatis' often return information on object 'Type'. #' @param area Character string. Indicator from which area of the database the results are called. In general, 'all' is the appropriate solution. Default option is 'all'. Not used for 'statistics'. #' @param error.ignore Boolean. Indicator if the function should stop if an error occurs or no object for the request is found or if it should produce a token as response. Default option is 'FALSE'. #' @param verbose Boolean. Indicator if the output of the function should include detailed messages and warnings. Default option is 'TRUE'. Set the parameter to 'FALSE' to suppress additional messages and warnings. diff --git a/man/gen_metadata.Rd b/man/gen_metadata.Rd index 31e8abc..7d546cb 100644 --- a/man/gen_metadata.Rd +++ b/man/gen_metadata.Rd @@ -1,5 +1,5 @@ % Generated by roxygen2: do not edit by hand -% Please edit documentation in R/gen_meta_data.R +% Please edit documentation in R/gen_metadata.R \name{gen_metadata} \alias{gen_metadata} \title{gen_metadata} @@ -20,7 +20,7 @@ gen_metadata( \item{database}{Character string. Indicator if the GENESIS ('genesis'), Zensus 2022 ('zensus') or regionalstatistik.de ('regio') database is called. Default option is 'all'.} -\item{category}{Character string. Specify specific GENESIS/regionalstatistik.de object types ('tables', 'statistics' and 'cubes') and specific Zensus 2022 object types ('tables' and 'statistics'). All types that are specific for one database can be used together. Default option is to use all types that are possible for the specific database.} +\item{category}{Character string. Specifying the specific object type of the object that you want meta data for. No default option - you need to specify the object type. Hint: The functions in 'restatis' often return information on object 'Type'.} \item{area}{Character string. Indicator from which area of the database the results are called. In general, 'all' is the appropriate solution. Default option is 'all'. Not used for 'statistics'.} diff --git a/man/gen_metadata_cube.Rd b/man/gen_metadata_cube.Rd index 665c7f5..dd3a81c 100644 --- a/man/gen_metadata_cube.Rd +++ b/man/gen_metadata_cube.Rd @@ -1,5 +1,5 @@ % Generated by roxygen2: do not edit by hand -% Please edit documentation in R/gen_meta_data.R +% Please edit documentation in R/gen_metadata.R \name{gen_metadata_cube} \alias{gen_metadata_cube} \title{gen_metadata_cube} diff --git a/man/gen_metadata_statistic.Rd b/man/gen_metadata_statistic.Rd index 28326df..442d80e 100644 --- a/man/gen_metadata_statistic.Rd +++ b/man/gen_metadata_statistic.Rd @@ -1,5 +1,5 @@ % Generated by roxygen2: do not edit by hand -% Please edit documentation in R/gen_meta_data.R +% Please edit documentation in R/gen_metadata.R \name{gen_metadata_statistic} \alias{gen_metadata_statistic} \title{gen_metadata_statistic} diff --git a/man/gen_metadata_table.Rd b/man/gen_metadata_table.Rd index 3214a9b..8c4ef0f 100644 --- a/man/gen_metadata_table.Rd +++ b/man/gen_metadata_table.Rd @@ -1,5 +1,5 @@ % Generated by roxygen2: do not edit by hand -% Please edit documentation in R/gen_meta_data.R +% Please edit documentation in R/gen_metadata.R \name{gen_metadata_table} \alias{gen_metadata_table} \title{gen_metadata_table} diff --git a/man/gen_metadata_value.Rd b/man/gen_metadata_value.Rd index a99f338..bfc591f 100644 --- a/man/gen_metadata_value.Rd +++ b/man/gen_metadata_value.Rd @@ -1,5 +1,5 @@ % Generated by roxygen2: do not edit by hand -% Please edit documentation in R/gen_meta_data.R +% Please edit documentation in R/gen_metadata.R \name{gen_metadata_value} \alias{gen_metadata_value} \title{gen_metadata_value} diff --git a/man/gen_metadata_variable.Rd b/man/gen_metadata_variable.Rd index 4cabb23..2870d76 100644 --- a/man/gen_metadata_variable.Rd +++ b/man/gen_metadata_variable.Rd @@ -1,5 +1,5 @@ % Generated by roxygen2: do not edit by hand -% Please edit documentation in R/gen_meta_data.R +% Please edit documentation in R/gen_metadata.R \name{gen_metadata_variable} \alias{gen_metadata_variable} \title{gen_metadata_variable} diff --git a/tests/testthat/modified2/api/catalogue/modifieddata-03cbb4.json b/tests/testthat/modified2/api/catalogue/modifieddata-03cbb4.json deleted file mode 100644 index 945cd14..0000000 --- a/tests/testthat/modified2/api/catalogue/modifieddata-03cbb4.json +++ /dev/null @@ -1,25 +0,0 @@ -{ - "Ident": { - "Service": "catalogue", - "Method": "modifieddata" - }, - "Status": { - "Code": 0, - "Content": "erfolgreich", - "Type": "Information" - }, - "Parameter": { - "username": "********************", - "password": "********************", - "selection": "61111", - "type": "Alle", - "date": "18.07.2024", - "pagelength": "100", - "language": "de", - "area": "Alle" - }, - "List": [ - null - ], - "Copyright": "© Statistisches Bundesamt (Destatis), 2024" -} diff --git a/vignettes/additional_parameter.Rmd b/vignettes/additional_parameter.Rmd index a750039..863f2a3 100644 --- a/vignettes/additional_parameter.Rmd +++ b/vignettes/additional_parameter.Rmd @@ -1,5 +1,5 @@ --- -title: "Additional Parameters for the Genesis API Call" +title: "Additional Parameters for API Calls with {restatis}" output: rmarkdown::html_vignette vignette: > %\VignetteIndexEntry{vignette-additional_parameter} @@ -7,43 +7,39 @@ vignette: > %\VignetteEncoding{UTF-8} --- - - - ```{r eval=FALSE, echo=FALSE} library(restatis) ``` ## Information -This is a brief overview of the additional parameters for the Genesis API call. These parameters only affect the Genesis API call itself, no further processing. +This is a brief overview of the additional parameters for an API call via {restatis}. These parameters only affect the API call itself, not the data processing. Be aware: Not all parameters are available for all functions. -Not all parameters are available for all functions. +Especially `gen_table()` and `gen_cube()` have a lot of different additional parameters to specify the API call. For a detailed overview, see the following official documents: -Especially `gen_table()` and `gen_cube()` have a lot of different additional parameters to specify the API call. - -For a detailed overview, see the following official document for Genesis: https://www-genesis.destatis.de/genesis/misc/GENESIS-Webservices_Einfuehrung.pdf -For a detailed overview, see the following official document for Zensus: https://ergebnisse2011.zensus2022.de/datenbank/misc/ZENSUS-Webservices_Einfuehrung.pdf +- The GENESIS database: https://www-genesis.destatis.de/genesis/misc/GENESIS-Webservices_Einfuehrung.pdf +- The Zensus 2022 database: https://ergebnisse2011.zensus2022.de/datenbank/misc/ZENSUS-Webservices_Einfuehrung.pdf +- regionalstatistik.de: https://www.regionalstatistik.de/genesis/misc/GENESIS-Webservices_Einfuehrung.pdf ## Short Overview of the Most Used Additional Parameters ### Parameter: Selection & Searchcriterion -The `selection`-parameter is a string that specifies the filter to use for filtering the API call. The criterion to which this parameter is applied is defined by the `searchcriterion`-parameter. The maximum length of the string depends on the function being used, but often varies between 10 and 15 characters. It is possible to use '*' as a placeholder. The default for this parameter is NO filtering. +The `selection` parameter is a string that specifies the filter to use for filtering the API call. The criterion to which this parameter is applied to is defined by the `searchcriterion` parameter. The maximum length of the string depends on the function being used, but often times varies between 10 and 15 characters. It is possible to use '\*' as a placeholder. The default for this parameter is *no* filtering. -The `searchcriterion`-parameter is a string that specifies the criteria to be used by the `selection`-parameter. Possible values depend on the function being used, but are often "code" for filtering based on code, or "content" for filtering based on content description. The default for this parameter is NO filter criterion. Often `searchcriterion`-parameter and `sortcriterion`-parameter have the same possible values. +The `searchcriterion` parameter is a string that specifies the criterion to be used by the `selection` parameter. Possible values depend on the function being used, but are often times "code" for filtering based on code or "content" for filtering based on the content description. The default for this parameter is *no* filter criterion. Often times, the `searchcriterion` parameter and the `sortcriterion` parameter have the same possible values. Examples: ```{r eval=FALSE} # Get the values of the variable "WAM8" which code starts with "WA29" -gen_val2var("WAM8", selection = "WA29*", searchcriterion = "code") +gen_val2var("WAM8", selection = "WA29*", searchcriterion = "code", database = "genesis") -# Same result can be achieved by the following line due to the default of the "searchcriterion"-parameter: -gen_val2var("WAM8", selection = "WA29*") +# The same result can be achieved by the following line due to the default of the "searchcriterion" parameter: +gen_val2var("WAM8", selection = "WA29*", database = "genesis") ``` ### Parameter: Sortcriterion -The `sortcriterion`-parameter is a string that specifies whether the raw output of the API call is sorted according to the specified input. Possible values depend on the function being used, but often "code" for sorting based on code and "content" for sorting based on content description are possible. The default is NO sorting. +The `sortcriterion` parameter is a string that specifies whether the raw output of the API call is sorted according to the specified input. Possible values depend on the function being used, but often times "code" for sorting based on code and "content" for sorting based on the content description are possible. The default is *no* sorting. Examples: ```{r eval=FALSE} @@ -52,7 +48,7 @@ gen_val2var("WAM8", sortcriterion = "code") ``` ### Parameter: Pagelength -The `pagelength`-parameter is a number between 1 and 2500. It indicates the maximum length of the API call output. Default is 100. +The `pagelength` parameter is a number between 1 and 2500. It indicates the maximum length of the API call output. Default is 100. Examples: ```{r eval=FALSE} @@ -61,7 +57,7 @@ gen_val2var("WAM8", pagelength = 2500) ``` ### Parameter: Language -The `language`-parameter is a string. It indicates if the API call output is in German by using "de" or in English by using "en". Default is "de". +The `language` parameter is a string. It indicates if the API call output is in German by using "de" or in English by using "en". Default is "en" (API default is "de" but it is overwritten by {restatis} to being "en"). Examples: ```{r eval=FALSE} @@ -80,7 +76,7 @@ gen_val2var("WAM8", language = "en") | Parameter | Description | | ----------- | ----------- | -| selection | 1-15 characters; filtering based on "code" of the objects; "*"-Notations are possible | +| selection | 1-15 characters; filtering based on "code" of the objects; "*" notations are possible | | pagelength | 1-2500 | | language | "de" / "en" | @@ -88,11 +84,11 @@ gen_val2var("WAM8", language = "en")
gen_catalogue -For cubes: (only Genesis) +For cubes: (only GENESIS and regionalstatistik.de) | Parameter | Description | | ----------- | ----------- | -| selection | 1-10 characters; filtering based on "code" of the objects; "*"-Notations are possible | +| selection | 1-10 characters; filtering based on "code" of the objects; "*" notations are possible | | pagelength | 1-2500 | | language | "de" / "en" | | area | "all" / "public" / "user" | @@ -101,7 +97,7 @@ For statistics: | Parameter | Description | | ----------- | ----------- | -| selection | 1-15 characters; filtering based on searchcriterion; "*"-Notations are possible | +| selection | 1-15 characters; filtering based on searchcriterion; "*" notations are possible | | searchcriterion | "code" / "content" | | sortcriterion | "code" / "content" | | pagelength | 1-2500 | @@ -111,8 +107,8 @@ For tables: | Parameter | Description | | ----------- | ----------- | -| selection | 1-15 characters; filtering based on searchcriterion; "*"-Notations are possible | -| searchcriterion | "code" / "content" (only Zensus) | +| selection | 1-15 characters; filtering based on searchcriterion; "*" notations are possible | +| searchcriterion | "code" / "content" (only Zensus 2022 database) | | sortcriterion | "code" / "top" | | pagelength | 1-2500 | | language | "de" / "en" | @@ -122,8 +118,10 @@ For tables:
gen_cube + see the following official documentation: https://www-genesis.destatis.de/genesis/misc/GENESIS-Webservices_Einfuehrung.pdf -Only available for Genesis +see the following official documentation: https://www.regionalstatistik.de/genesis/misc/GENESIS-Webservices_Einfuehrung.pdf +Only available for GENESIS and regionalstatistik.de
@@ -140,15 +138,15 @@ Only available for Genesis gen_list_jobs | Parameter | Description | | ----------- | ----------- | -| selection | 1-50 characters; filtering based on "code" of the objects or searchcriterion; "*"-Notations are possible | +| selection | 1-50 characters; filtering based on "code" of the objects or searchcriterion; "*" notations are possible | | searchcriterion | "type" / "code" / "time" / "status" | | sortcriterion | "type" / "code" / "time" / "status" | | pagelength | 1-2500 | | language | "de" / "en" | | type | - | -see more in the following official documentation for Genesis: https://www-genesis.destatis.de/genesis/misc/GENESIS-Webservices_Einfuehrung.pdf -see more in the following official documentation for Zensus: https://ergebnisse2011.zensus2022.de/datenbank/misc/ZENSUS-Webservices_Einfuehrung.pdf +- See more in the following official documentation for GENESIS: https://www-genesis.destatis.de/genesis/misc/GENESIS-Webservices_Einfuehrung.pdf +- See more in the following official documentation for regionalstatistik.de: https://www.regionalstatistik.de/genesis/misc/GENESIS-Webservices_Einfuehrung.pdf
@@ -159,25 +157,25 @@ see more in the following official documentation for Zensus: https://ergebnisse2 | language | "de" / "en" | | area | "all" / "public" / "user" *1 | -*1 for Zensus only tables offer the additional parameter "area". +*1 for Zensus 2022 database only tables offer the additional parameter "area".
gen_modified_data | Parameter | Description | | ----------- | ----------- | -| selection | 1-15 characters; filtering based on "code" of the objects; "*"-Notations are possible | +| selection | 1-15 characters; filtering based on "code" of the objects; "*" notations are possible | | pagelength | 1-2500 | | language | "de" / "en" |
gen_objects2stat -For cubes: (only Genesis) +For cubes: (only GENESIS and regionalstatistik.de) | Parameter | Description | | ----------- | ----------- | -| selection | 1-10 characters; filtering based on "code" of the objects; "*"-Notations are possible | +| selection | 1-10 characters; filtering based on "code" of the objects; "*" notations are possible | | area | "all" / "public" / "user" | | pagelength | 1-2500 | | language | "de" / "en" | @@ -186,7 +184,7 @@ For variables: | Parameter | Description | | ----------- | ----------- | -| selection | 1-6 characters; filtering based on searchcriterion; "*"-Notations are possible | +| selection | 1-6 characters; filtering based on searchcriterion; "*" notations are possible | | searchcriterion | "code" / "content" | | sortcriterion | "code" / "content" | | pagelength | 1-2500 | @@ -194,14 +192,15 @@ For variables: | area | "all" / "public" / "user" | | type | - | -see more in the following official documentation for Genesis: https://www-genesis.destatis.de/genesis/misc/GENESIS-Webservices_Einfuehrung.pdf -see more in the following official documentation for Zensus: https://ergebnisse2011.zensus2022.de/datenbank/misc/ZENSUS-Webservices_Einfuehrung.pdf +- See more in the following official documentation for GENESIS: https://www-genesis.destatis.de/genesis/misc/GENESIS-Webservices_Einfuehrung.pdf +- See more in the following official documentation for the Zensus 2022 database: https://ergebnisse2011.zensus2022.de/datenbank/misc/ZENSUS-Webservices_Einfuehrung.pdf +- See more in the following official documentation for regionalstatistik.de: https://www.regionalstatistik.de/genesis/misc/GENESIS-Webservices_Einfuehrung.pdf For tables: | Parameter | Description | | ----------- | ----------- | -| selection | 1-15 characters; filtering based on "code" of the objects; "*"-Notations are possible | +| selection | 1-15 characters; filtering based on "code" of the objects; "*" notations are possible | | pagelength | 1-2500 | | language | "de" / "en" | | area | "all" / "public" / "user" | @@ -209,11 +208,11 @@ For tables:
gen_objects2var -For cubes: (only Genesis) +For cubes: (only GENESIS and regionalstatistik.de) | Parameter | Description | | ----------- | ----------- | -| selection | 1-15 characters; filtering based on "code" of the objects; "*"-Notations are possible | +| selection | 1-15 characters; filtering based on "code" of the objects; "*" notations are possible | | pagelength | 1-2500 | | language | "de" / "en" | | area | "all" / "public" / "user" | @@ -222,7 +221,7 @@ For statistics: | Parameter | Description | | ----------- | ----------- | -| selection | 1-15 characters; filtering based on searchcriterion; "*"-Notations are possible | +| selection | 1-15 characters; filtering based on searchcriterion; "*" notations are possible | | searchcriterion | "code" / "content" | | sortcriterion | "code" / "content" | | pagelength | 1-2500 | @@ -233,7 +232,7 @@ For tables: | Parameter | Description | | ----------- | ----------- | -| selection | 1-15 characters; filtering based on "code" of the objects; "*"-Notations are possible | +| selection | 1-15 characters; filtering based on "code" of the objects; "*" notations are possible | | pagelength | 1-2500 | | language | "de" / "en" | | area | "all" / "public" / "user" | @@ -241,8 +240,10 @@ For tables:
gen_table -see the following official documentation for Genesis: https://www-genesis.destatis.de/genesis/misc/GENESIS-Webservices_Einfuehrung.pdf -see the following official documentation for Zensus: https://ergebnisse2011.zensus2022.de/datenbank/misc/ZENSUS-Webservices_Einfuehrung.pdf + +- See more in the following official documentation for GENESIS: https://www-genesis.destatis.de/genesis/misc/GENESIS-Webservices_Einfuehrung.pdf +- See more in the following official documentation for the Zensus 2022 database: https://ergebnisse2011.zensus2022.de/datenbank/misc/ZENSUS-Webservices_Einfuehrung.pdf +- See more in the following official documentation for regionalstatistik.de: https://www.regionalstatistik.de/genesis/misc/GENESIS-Webservices_Einfuehrung.pdf
@@ -250,7 +251,7 @@ see the following official documentation for Zensus: https://ergebnisse2011.zens gen_var2stat | Parameter | Description | | ----------- | ----------- | -| selection | 1-6 characters; filtering based on searchcriterion; "*"-Notations are possible | +| selection | 1-6 characters; filtering based on searchcriterion; "*" notations are possible | | searchcriterion | "code" / "content" | | sortcriterion | "code" / "content" | | pagelength | 1-2500 | @@ -258,8 +259,9 @@ see the following official documentation for Zensus: https://ergebnisse2011.zens | area | "all" / "public" / "user" | | type | - | -see more in the following official documentation: https://www-genesis.destatis.de/genesis/misc/GENESIS-Webservices_Einfuehrung.pdf -see more in the following official documentation for Zensus: https://ergebnisse2011.zensus2022.de/datenbank/misc/ZENSUS-Webservices_Einfuehrung.pdf +- See more in the following official documentation for GENESIS: https://www-genesis.destatis.de/genesis/misc/GENESIS-Webservices_Einfuehrung.pdf +- See more in the following official documentation for the Zensus 2022 database: https://ergebnisse2011.zensus2022.de/datenbank/misc/ZENSUS-Webservices_Einfuehrung.pdf +- See more in the following official documentation for regionalstatistik.de: https://www.regionalstatistik.de/genesis/misc/GENESIS-Webservices_Einfuehrung.pdf
@@ -267,7 +269,7 @@ see more in the following official documentation for Zensus: https://ergebnisse2 gen_val2var | Parameter | Description | | ----------- | ----------- | -| selection | 1-15 characters; filtering based on searchcriterion; "*"-Notations are possible | +| selection | 1-15 characters; filtering based on searchcriterion; "*" notations are possible | | searchcriterion | "code" / "content" | | sortcriterion | "code" / "content" | | pagelength | 1-2500 | @@ -279,7 +281,7 @@ see more in the following official documentation for Zensus: https://ergebnisse2 gen_val2var2stat | Parameter | Description | | ----------- | ----------- | -| selection | 1-6 characters; filtering based on searchcriterion; "*"-Notations are possible | +| selection | 1-6 characters; filtering based on searchcriterion; "*" notations are possible | | searchcriterion | "code" / "content" | | sortcriterion | "code" / "content" | | pagelength | 1-2500 | @@ -287,8 +289,9 @@ see more in the following official documentation for Zensus: https://ergebnisse2 | area | "all" / "public" / "user" | | type | - | -see more in the following official documentation: https://www-genesis.destatis.de/genesis/misc/GENESIS-Webservices_Einfuehrung.pdf -see more in the following official documentation for Zensus: https://ergebnisse2011.zensus2022.de/datenbank/misc/ZENSUS-Webservices_Einfuehrung.pdf +- See more in the following official documentation for GENESIS: https://www-genesis.destatis.de/genesis/misc/GENESIS-Webservices_Einfuehrung.pdf +- See more in the following official documentation for the Zensus 2022 database: https://ergebnisse2011.zensus2022.de/datenbank/misc/ZENSUS-Webservices_Einfuehrung.pdf +- See more in the following official documentation for regionalstatistik.de: https://www.regionalstatistik.de/genesis/misc/GENESIS-Webservices_Einfuehrung.pdf
@@ -296,7 +299,7 @@ see more in the following official documentation for Zensus: https://ergebnisse2 gen_search_vars | Parameter | Description | | ----------- | ----------- | -| selection | 1-6 characters; filtering based on searchcriterion; "*"-Notations are possible | +| selection | 1-6 characters; filtering based on searchcriterion; "*" notations are possible | | searchcriterion | "code" / "content" | | sortcriterion | "code" / "content" | | pagelength | 1-2500 | @@ -304,8 +307,9 @@ see more in the following official documentation for Zensus: https://ergebnisse2 | area | "all" / "public" / "user" | | type | - | -see more in the following official documentation: https://www-genesis.destatis.de/genesis/misc/GENESIS-Webservices_Einfuehrung.pdf -see more in the following official documentation for Zensus: https://ergebnisse2011.zensus2022.de/datenbank/misc/ZENSUS-Webservices_Einfuehrung.pdf +- See more in the following official documentation for GENESIS: https://www-genesis.destatis.de/genesis/misc/GENESIS-Webservices_Einfuehrung.pdf +- See more in the following official documentation for the Zensus 2022 database: https://ergebnisse2011.zensus2022.de/datenbank/misc/ZENSUS-Webservices_Einfuehrung.pdf +- See more in the following official documentation for regionalstatistik.de: https://www.regionalstatistik.de/genesis/misc/GENESIS-Webservices_Einfuehrung.pdf @@ -323,7 +327,7 @@ see more in the following official documentation for Zensus: https://ergebnisse2 | Parameter | Description | | ----------- | ----------- | -| selection | 1-15 characters; filtering based on "code"; "*"-Notations are possible | +| selection | 1-15 characters; filtering based on "code"; "*" notations are possible | | area | "all" / "public" / "user" | | pagelength | 1-2500 | | language | "de" / "en" | diff --git a/vignettes/restatis.Rmd b/vignettes/restatis.Rmd index 7081100..9fcd96b 100644 --- a/vignettes/restatis.Rmd +++ b/vignettes/restatis.Rmd @@ -7,20 +7,17 @@ vignette: > %\VignetteEncoding{UTF-8} --- - - - -```r +```{r} library(restatis) ``` ## Introduction -This vignette describes the basic workflow for finding, exploring, and retrieving data from the GENESIS API using [restatis](https://correlaid.github.io/restatis/). +This vignette describes the basic workflow for finding, exploring, and retrieving data from the GENESIS, Zensus 2022 or regionalstatistik.de API using [restatis](https://correlaid.github.io/restatis/). -For more details on additional parameters that can be used to specify the Genesis API call, see `vignette("additional_parameter")`. +For more details on additional parameters that can be used to specify the API call, see `vignette("additional_parameter")`. -For the scenario in this vignette, we are going to be a researcher trying to find data on the income of bus drivers, called "Busfahrer". +For the scenario in this vignette, we are going to be a researcher trying to find data on the income of bus drivers, called "Busfahrer" in German. The following example focuses on the GENESIS database, however, it works practically identical for regionalstatistik.de. For the Zensus 2022 database, the functions also work almost similarly to GENESIS and regionalstatistik.de, but have a few quirks (such as that there are no cubes for Zensus 2022 or that you can also authenticate using an API token). ## Premilinary: finding relevant search terms @@ -28,20 +25,9 @@ First, we can and should explore if and how our keyword is represented in the GE To be as broad as possible, we want to search for any term in the database that contains our keyword. To do this, we can use a "*" wildcard at the beginning and end of the search term: +```{r} +restatis::gen_alternative_terms(term = "*busfahrer*", database = "genesis") -```r -gen_alternative_terms(term = "*busfahrer*") -#> $Output -#> [1] "busfahrer" -#> -#> attr(,"Term") -#> [1] "*busfahrer*" -#> attr(,"Language") -#> [1] "de" -#> attr(,"Pagelength") -#> [1] "100" -#> attr(,"Copyright") -#> [1] "© Statistisches Bundesamt (Destatis), 2023" ``` Based on the results, our original keyword "busfahrer" is already specific enough, and no additional specifications are necessary. @@ -49,30 +35,9 @@ Based on the results, our original keyword "busfahrer" is already specific enoug Had we started with the keyword "bus" - the vehicle itself - we can see that the database has several related terms that might be helpful to narrow our search radius further. In this example, it might be helpful to see that there are at least three different types of buses that are searchable: "fernbus", "schienenbus" and "kraftomnibusse". -```r -gen_alternative_terms(term = "*bus*") -#> $Output -#> [1] "Bus" "bus" "busin" -#> [4] "Busse" "busse" "bambus" -#> [7] "bussen" "büsche" "cottbus" -#> [10] "fernbus" "a.bambus" "aubussons" -#> [13] "business" "jadebusen" "busfahrer" -#> [16] "busin.and" "bambusmöbel" "bambuswaren" -#> [19] "bustickets" "f.omnibusse" "buschbohnen" -#> [22] "kraftomnibus" "bambussprossen" "büstenhalter" -#> [25] "kraftomnibusse" "businessschool" "freilandbüsche" -#> [28] "busin.sch.berlin" "doppellumentubus" "bambusflechtstoffen" -#> [31] "flugticket, business" "business-class-tarif" -#> [ reached getOption("max.print") -- omitted 68 entries ] -#> -#> attr(,"Term") -#> [1] "*bus*" -#> attr(,"Language") -#> [1] "de" -#> attr(,"Pagelength") -#> [1] "100" -#> attr(,"Copyright") -#> [1] "© Statistisches Bundesamt (Destatis), 2023" +```{r} +gen_alternative_terms(term = "*bus*", database = "genesis") + ``` ## Search for data objects @@ -80,106 +45,48 @@ gen_alternative_terms(term = "*bus*") Now that we have our specific keyword for our search, we can search the database for exactly that term. We want the results to be ordered so that items with a title that includes our search term are at the top. We also want to explore all object types for now: -```r -search_results <- gen_find( - term = "busfahrer", - detailed = FALSE, - ordering = TRUE, - category = "all" -) -#> Use 'detailed = TRUE' to obtain the complete output. - +```{r} +search_results <- gen_find(term = "busfahrer", + detailed = FALSE, + ordering = TRUE, + category = "all", + database = "genesis") + search_results -#> $Tables -#> # A tibble: 2 × 3 -#> Code Content Object_Type -#> -#> 1 62361-0030 Bruttostundenverdienste, Bruttomonatsverdienste: Deutschland,… Table -#> 2 62361-0034 Bruttojahresverdienste: Deutschland, Jahre, Geschlecht, Berufe Table -#> -#> $Statistics -#> # A tibble: 1 × 3 -#> Code Content Object_Type -#> -#> 1 62361 Verdiensterhebung Statistic -#> -#> $Variables -#> # A tibble: 1 × 3 -#> Code Content Object_Type -#> -#> 1 KB10A5 Berufsgattungen (KB2010), 5-Steller Variable -#> -#> $Cubes -#> # A tibble: 4 × 3 -#> Code Content Object_Type -#> -#> 1 62361BJ013 Verdiensterhebung, Durchschn. Bruttostundenverdienste ohne So… Cube -#> 2 62361BJ010 Verdiensterhebung, Durchschn. Bruttostundenverdienste ohne So… Cube -#> 3 62361BJ019 Verdiensterhebung, Durchschn. Bruttojahresverdienste inkl. So… Cube -#> 4 62361BJ016 Verdiensterhebung, Durchschn. Bruttojahresverdienste inkl. So… Cube -#> -#> attr(,"Term") -#> [1] "busfahrer" -#> attr(,"Language") -#> [1] "de" -#> attr(,"Pagelength") -#> [1] "100" -#> attr(,"Copyright") -#> [1] "© Statistisches Bundesamt (Destatis), 2023" + ``` We can see that we find results for our keyword "busfahrer" in each category of objects (statistics, tables, variables, and cubes). Based on the promising content description of the first cube object, our next step will be to check what it contains before requesting the data. -As a side note, most of the functions in this package will return objects with additional attributes that represent the parameters and additional information of your GENESIS API query. So check the attributes if you ever need help recognising how you got the output. +As a side note, most of the functions in this package will return objects with additional attributes that represent the parameters and additional information of your API query. So check the attributes if you ever need help recognising how you got the output. ## Checking object metadata -To check whether GENESIS data objects are relevant to your interest, you should obtain the metadata for these objects before requesting the data itself. The metadata for each type of object stores different key characteristics that will help you understand what the object is about. +To check whether data objects are relevant to your interest, you should obtain the metadata for these objects before requesting the data itself. The metadata for each type of object stores different key characteristics that will help you understand what the object is about. For our question about the income of bus drivers, we want to check the metadata of the first cube object we got from the find function: -```r -gen_metadata( - code = search_results$Cubes$Code[1], - category = search_results$Cubes$Object_Type[1] -) -#> Error in gen_metadata(code = search_results$Cubes$Code[1], category = search_results$Cubes$Object_Type[1]): could not find function "gen_metadata" +```{r} +gen_metadata(code = search_results$Cubes$Code[1], + category = search_results$Cubes$Object_Type[1], + database = "genesis") + ``` ## Retrieving data -We are now pretty sure that this cube object will help us find information about our research question. The next step is to get the data from the GENESIS API. - -Based on the fact that we want a cube object, we now use the `gen_cube()` function. For other GENESIS object types, use the corresponding functions (e.g., `gen_table()` for tables). - -Important note: It is not possible to get a whole GENESIS statistic object, but it is possible to collect the different related cube objects independently and then try to recombine them. - - -```r -gen_cube(search_results$Cubes$Code[1]) -#> # A tibble: 2,508 × 20 -#> DINSG GES KB10A5 SMONAT VST045_WERT VST045_QUALITAET VST045_GESPERRT -#> * -#> 1 DG GESM KB10-01104 04/2022 31.3 e NA -#> 2 DG GESM KB10-01203 04/2022 21.6 e NA -#> 3 DG GESM KB10-01302 04/2022 17.4 e NA -#> 4 DG GESM KB10-01402 04/2022 15.3 e NA -#> 5 DG GESM KB10-11101 04/2022 12.8 e NA -#> 6 DG GESM KB10-11102 04/2022 13.7 e NA -#> 7 DG GESM KB10-11103 04/2022 23.6 () NA -#> 8 DG GESM KB10-11104 04/2022 30.8 e NA -#> 9 DG GESM KB10-11113 04/2022 21.4 () NA -#> 10 DG GESM KB10-11114 04/2022 0 / NA -#> # ℹ 2,498 more rows -#> # ℹ 13 more variables: `VST045_WERT-VERFAELSCHT` , VST047_WERT , -#> # VST047_QUALITAET , VST047_GESPERRT , `VST047_WERT-VERFAELSCHT` , -#> # VST051_WERT , VST051_QUALITAET , VST051_GESPERRT , -#> # `VST051_WERT-VERFAELSCHT` , VST052_WERT , VST052_QUALITAET , -#> # VST052_GESPERRT , `VST052_WERT-VERFAELSCHT` -``` +We are now pretty sure that this cube object will help us find information about our research question. The next step is to get the data from the API. + +Based on the fact that we want a cube object, we now use the `gen_cube()` function. For other object types, use the corresponding functions (e.g., `gen_table()` for tables). + +Important note: It is not possible to get a whole statistic object, but it is possible to collect the different related cube objects independently and then try to recombine them. + -TODO: Create helpers to decipher column names. +```{r} +gen_cube(search_results$Cubes$Code[1], database = "genesis") + +``` ## Appendix: check for changes in previously collected data @@ -187,15 +94,12 @@ As a small additional step, we would like to check one week later if the collect If we only want to check if something related has been updated, we only need to use the first part of the code until we are sure that it only covers the topic we are interested in. For example, use "62361*" if you want to check if some updated objects have been published for the specific statistic "Verdiensterhebung". -For convenience, the functions have already implemented the most common `date` specifications, such as "week_before", "month_before", or "year_before". If you prefer a fixed date, you can enter it as a string in the format "DD-MM-YYYY". +For convenience, the functions have already implemented the most common `date` specifications, such as "week_before", "month_before", or "year_before". If you prefer a fixed date, you can enter it as a string in the format "DD.MM.YYYY". For example, we might want to check to see if something new has been published about our collected cube object. So we use only the first part of the code "62361*": -```r +```{r} gen_modified_data(code = "62361", date = "week_before") -#> Please note that this date is calculated automatically and may differ -#> from manually entered data. Manually entered data must have -#> the format DD.MM.YYYY. -#> No modified objects found for your code and date. + ``` From c38f3fd299b53d1bb9c088d5f0b7f579a895cd04 Mon Sep 17 00:00:00 2001 From: bubux Date: Sat, 20 Jul 2024 08:07:17 +0200 Subject: [PATCH 52/52] fix vignette --- vignettes/restatis.Rmd | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/vignettes/restatis.Rmd b/vignettes/restatis.Rmd index 9fcd96b..3a4d072 100644 --- a/vignettes/restatis.Rmd +++ b/vignettes/restatis.Rmd @@ -7,7 +7,7 @@ vignette: > %\VignetteEncoding{UTF-8} --- -```{r} +```{r eval=FALSE} library(restatis) ``` @@ -25,7 +25,7 @@ First, we can and should explore if and how our keyword is represented in the GE To be as broad as possible, we want to search for any term in the database that contains our keyword. To do this, we can use a "*" wildcard at the beginning and end of the search term: -```{r} +```{r eval=FALSE} restatis::gen_alternative_terms(term = "*busfahrer*", database = "genesis") ``` @@ -35,7 +35,7 @@ Based on the results, our original keyword "busfahrer" is already specific enoug Had we started with the keyword "bus" - the vehicle itself - we can see that the database has several related terms that might be helpful to narrow our search radius further. In this example, it might be helpful to see that there are at least three different types of buses that are searchable: "fernbus", "schienenbus" and "kraftomnibusse". -```{r} +```{r eval=FALSE} gen_alternative_terms(term = "*bus*", database = "genesis") ``` @@ -45,7 +45,7 @@ gen_alternative_terms(term = "*bus*", database = "genesis") Now that we have our specific keyword for our search, we can search the database for exactly that term. We want the results to be ordered so that items with a title that includes our search term are at the top. We also want to explore all object types for now: -```{r} +```{r eval=FALSE} search_results <- gen_find(term = "busfahrer", detailed = FALSE, ordering = TRUE, @@ -67,7 +67,7 @@ To check whether data objects are relevant to your interest, you should obtain t For our question about the income of bus drivers, we want to check the metadata of the first cube object we got from the find function: -```{r} +```{r eval=FALSE} gen_metadata(code = search_results$Cubes$Code[1], category = search_results$Cubes$Object_Type[1], database = "genesis") @@ -83,7 +83,7 @@ Based on the fact that we want a cube object, we now use the `gen_cube()` functi Important note: It is not possible to get a whole statistic object, but it is possible to collect the different related cube objects independently and then try to recombine them. -```{r} +```{r eval=FALSE} gen_cube(search_results$Cubes$Code[1], database = "genesis") ``` @@ -99,7 +99,7 @@ For convenience, the functions have already implemented the most common `date` s For example, we might want to check to see if something new has been published about our collected cube object. So we use only the first part of the code "62361*": -```{r} +```{r eval=FALSE} gen_modified_data(code = "62361", date = "week_before") ```