# packages
library(metaDigitise)
library(magrittr)
library(tibble)
library(dplyr)
library(lubridate)
library(dpeatdecomposition)
library(dm)
library(RMariaDB)

1 Preparations

Connect to database

# connect to database
con <-
  RMariaDB::dbConnect(
    drv = RMariaDB::MariaDB(),
    dbname = "dpeatdecomposition",
    default.file = "~/my.cnf"
  )

# get database as dm object
dm_dpeatdecomposition <-
  dpeatdecomposition::dp_get_dm(con, learn_keys = TRUE)

Get most current IDs

id_last <- 
  list(
    id_dataset = 
      dm_dpeatdecomposition %>%
      dm::pull_tbl(datasets) %>%
      dplyr::pull(id_dataset) %>%
      tail(1),
    id_sample = 
      dm_dpeatdecomposition %>%
      dm::pull_tbl(samples) %>%
      dplyr::pull(id_sample) %>%
      tail(1),
    id_measurement = 
      dm_dpeatdecomposition %>%
      dm::pull_tbl(data) %>%
      dplyr::pull(id_measurement) %>%
      tail(1)
    ) %>%
  purrr::map(function(.x) {
    if(length(.x) == 0) {
      0L
    } else {
      .x
    }
  })

Create directories

dir_name <- "d14"
dir_source <- "../raw_data/data/d14"
dir_target <- paste0("../derived_data/", id_last$id_dataset + 1L)

if(!dir.exists(dir_target)) {
  dir.create(dir_target)
}

2 Data wrangling

2.1 dataset

datasets <- 
  tibble::tibble(
    id_dataset = id_last$id_dataset + 1L
  )

2.2 citations_to_datasets

citations_to_datasets <- 
  dplyr::bind_rows(
    db_template_tables$citations_to_datasets,
    tibble::tibble(
      id_dataset = datasets$id_dataset,
      id_citation = c("Farrish.1988") 
    )
  )

2.3 samples

## mass remaining

samples2 <- 
  readODS::read_ods(paste0(dir_source, "/derived/Farrish.1988-Tab1_4_5.ods")) %>%
  dplyr::mutate(
    sampling_longitude = -93.459632, #---note: no exact location given in the paper, approximate location of the Marcell experimental forest
    sampling_latitude = 47.519077, #---note: no exact location given in the paper, approximate location of the Marcell experimental forest
    comments_samples = "No exact location given in the paper, approximate location of the Marcell experimental forest. Sampling dates are unknwon."
  ) %>%
  dplyr::rename(
    mass_relative_mass = "mass_remaining",
    sample_microhabitat = "microtopography",
    incubation_duration = "incubation_time"
  ) %>%
  dplyr::mutate(
    id_dataset = datasets$id_dataset[[1]],
    incubation_duration = 365,
    mesh_size_absolute = 550/1000,
    mass_absolute = NA_real_,
    treatment = "control",
    is_incubated = TRUE,
    incubation_enironment = "peat",
    experimental_design = {
      site <- as.numeric(as.factor(site_name))
      microhabitat <- as.numeric(as.factor(sample_microhabitat))
      microhabitat <- ifelse(is.na(microhabitat), 1, microhabitat)
      paste0(site, "_", microhabitat)
    }
  )

# initial mass
samples1 <- 
  samples2 %>%
  dplyr::mutate(
    mass_relative_mass = 1,
    incubation_duration = 0,
    id_sample = seq_len(nrow(.)) + id_last$id_sample,
    id_sample_origin = id_sample,
    id_sample_parent = id_sample,
    id_sample_incubation_start = id_sample
  )

samples2 <- 
  samples2 %>%
  dplyr::mutate(
    id_sample = seq_len(nrow(.)) + max(samples1$id_sample),
    id_sample_origin = samples1$id_sample,
    id_sample_parent = samples1$id_sample,
    id_sample_incubation_start = samples1$id_sample
  )

# water table depth
samples3 <- 
  samples2 %>%
  dplyr::filter(!duplicated(experimental_design)) %>%
  dplyr::mutate(
    id_sample = seq_len(nrow(.)) + max(samples2$id_sample),
    id_sample_origin = id_sample,
    id_sample_parent = id_sample,
    sample_type = "peat",
    sample_type2 = NA_character_,
    sample_depth_upper = 0,
    sample_depth_lower = 0,
    incubation_duration = 0,
    is_incubated = FALSE,
    incubation_enironment = NA_character_,
    water_table_depth =
      dplyr::case_when(
        site_name == "S-3 fen" ~ 10,
        site_name == "S-2 bog" & sample_microhabitat == "hollow" ~ 11,
        site_name == "S-2 bog" & sample_microhabitat == "hummock" ~ 11 + 33, #---note: from text
      ),
    comments_samples = "No exact location given in the paper, approximate location of the Marcell experimental forest. Sampling dates are unknwon."
  ) %>%
  dplyr::select(-mesh_size_absolute, -mass_relative_mass, -mass_absolute)


## combine
samples <- 
  dplyr::bind_rows(
    db_template_tables$samples,
    samples1 %>%
      dplyr::mutate(
        type = "samples1"
      ),
    samples2 %>%
      dplyr::mutate(
        type = "samples2"
      ),
    samples3 %>%
      dplyr::mutate(
        type = "samples3"
      )
  )

2.4 samples_to_samples

samples_to_samples <- 
  samples %>%
  dplyr::filter(! id_sample %in% id_sample_origin) %>%
  dplyr::mutate(
    transition_description =
      dplyr::case_when(
        type %in% c("samples2") ~ "wait",
        TRUE ~ NA_character_
      )
  ) %>%
  dplyr::select(id_sample_parent, id_sample, transition_description) %>%
  dplyr::rename(
    id_sample_child = "id_sample"
  )

2.5 data

d1 <- 
  samples1 %>%
  tidyr::pivot_longer(
    cols = dplyr::all_of(c("mass_absolute", "mass_relative_mass", "mesh_size_absolute")),
    names_to = "attribute_name",
    values_to = "value"
  ) %>%
  dplyr::mutate(
    id_measurement = seq_len(nrow(.)) + id_last$id_measurement,
    id_measurement_numerator =
      purrr::map_int(seq_len(nrow(.)), function(i) {
        switch(
          attribute_name[[i]],
          "mass_relative_mass" = {
            id_measurement[id_sample == id_sample[[i]] & attribute_name == "mass_absolute"]
          },
          NA_integer_
        )
      }),
    id_measurement_denominator =
      purrr::map_int(seq_len(nrow(.)), function(i) {
        switch(
          attribute_name[[i]],
          "mass_relative_mass" = {
            id_measurement[id_sample == id_sample[[i]] & attribute_name == "mass_absolute"]
          },
          NA_integer_
        )
      }),
    value_type = 
      dplyr::case_when(
        attribute_name == "mesh_size_absolute" ~ "point", 
        TRUE ~ "mean"
      ),
    sample_size = NA_integer_
  )

d2 <- 
  samples2 %>%
  tidyr::pivot_longer(
    cols = dplyr::all_of(c("mass_absolute", "mass_relative_mass", "mesh_size_absolute")),
    names_to = "attribute_name",
    values_to = "value"
  ) %>%
  dplyr::mutate(
    id_measurement = seq_len(nrow(.)) + max(d1$id_measurement),
    id_measurement_numerator =
      purrr::map_int(seq_len(nrow(.)), function(i) {
        switch(
          attribute_name[[i]],
          "mass_relative_mass" = {
            id_measurement[id_sample == id_sample[[i]] & attribute_name == "mass_absolute"]
          },
          NA_integer_
        )
      }),
    id_measurement_denominator =
      purrr::map_int(seq_len(nrow(.)), function(i) {
        switch(
          attribute_name[[i]],
          "mass_relative_mass" = {
            d1$id_measurement[d1$id_sample == id_sample_origin[[i]] & d1$attribute_name == "mass_absolute"]
          },
          NA_integer_
        )
      }),
    value_type = 
      dplyr::case_when(
        attribute_name == "mesh_size_absolute" ~ "point", 
        TRUE ~ "mean"
      ),
    sample_size = NA_integer_
  )

d3 <- 
  samples3 %>%
  tidyr::pivot_longer(
    cols = dplyr::all_of(c("water_table_depth")),
    names_to = "attribute_name",
    values_to = "value"
  ) %>%
  dplyr::mutate(
    id_measurement = seq_len(nrow(.)) + max(d2$id_measurement),
    value_type = "mean",
    sample_size = 
      dplyr::case_when(
        site_name == "S-3 fen" ~ 47L,
        site_name == "S-2 bog" ~ 41L
      ),
    comments_measurement =
      dplyr::case_when(
        attribute_name == "water_table_depth" & sample_microhabitat != "hummock" ~ "Approximate position of the water table depth defined as sulfide horizon.",
        attribute_name == "water_table_depth" & sample_microhabitat == "hummock" ~ "Approximate position of the water table depth defined as sulfide horizon. Computed by adding the average height of hummocks to the value for hollows.",
        TRUE ~ NA_character_
      )
  )

# combine
d <- 
  dplyr::bind_rows(
    db_template_tables$data,
    d1,
    d2,
    d3
  ) %>%
  dplyr::select(dplyr::all_of(colnames(db_template_tables$data)))

2.6 experimental_design_format

experimental_design_format <- 
  tibble::tibble(
    id_dataset = datasets$id_dataset,
    file = paste0(id_last$id_dataset + 1L, "/experimental_design_format.csv"),
    experimental_design_description = "`site_name`: Name of the site. `sample_microhabitat`: Name of the microhabitat type."
  )

# csv file to export
experimental_design_format2 <- 
  samples %>%
  dplyr::filter(! is.na(experimental_design)) %>%
  dplyr::filter(! duplicated(experimental_design)) %>%
  dplyr::select(experimental_design, site_name, sample_microhabitat)

# export
write.csv(experimental_design_format2, paste0(dir_target, "/experimental_design_format.csv"), row.names = FALSE)

3 Export to database

# list all tables
dm_insert_in <-
  list(
    datasets = 
      datasets %>% 
      dplyr::select(dplyr::all_of(colnames(dm_dpeatdecomposition$datasets))),
    samples = 
      samples %>% 
      dplyr::select(dplyr::all_of(colnames(dm_dpeatdecomposition$samples))),
    data = 
      d %>% 
      dplyr::select(dplyr::all_of(colnames(dm_dpeatdecomposition$data))),
    samples_to_samples = 
      samples_to_samples %>% 
      dplyr::select(dplyr::all_of(colnames(dm_dpeatdecomposition$samples_to_samples))),
    citations_to_datasets = 
      citations_to_datasets %>% 
      dplyr::select(dplyr::all_of(colnames(dm_dpeatdecomposition$citations_to_datasets))),
    experimental_design_format = 
      experimental_design_format %>% 
      dplyr::select(dplyr::all_of(colnames(dm_dpeatdecomposition$experimental_design_format)))
  )

# check whether all column names as present in table attributes
all_column_names <- 
  purrr::map(dm_insert_in, colnames) %>%
  unlist() %>%
  unique()

if(! all(all_column_names %in% (dm_dpeatdecomposition %>% dm::pull_tbl(attributes) %>% dplyr::pull(attribute_name)))) {
  cond <- purrr::map_lgl(all_column_names, function(.x) ! .x %in% (dm_dpeatdecomposition %>% dm::pull_tbl(attributes) %>% dplyr::pull(attribute_name)))
  RMariaDB::dbDisconnect(con)
  stop(paste0("New `attribute_name`s discovered: ", paste(all_column_names[cond], collapse = ", ")))
}

all_data_attributes <- unique(dm_insert_in$data$attribute_name)

if(! all(all_data_attributes %in% (dm_dpeatdecomposition %>% dm::pull_tbl(attributes) %>% dplyr::pull(attribute_name)))) {
  RMariaDB::dbDisconnect(con)
  cond <- purrr::map_lgl(all_data_attributes, function(.x) ! .x %in% (dm_dpeatdecomposition %>% dm::pull_tbl(attributes) %>% dplyr::pull(attribute_name)))
  stop(paste0("New `attribute_name`s discovered: ", paste(all_data_attributes[cond], collapse = ", ")))
}


# filter empty tables
dm_insert_in_check <-
  dm_insert_in[purrr::map_lgl(dm_insert_in, function(x) nrow(x) > 0)] %>%
  dm::as_dm() %>%
  dp_dm_add_keys(dm_dpeatdecomposition)

# copy into dm_pmird
for(i in seq_along(dm_insert_in)) {
  RMariaDB::dbAppendTable(con, name = names(dm_insert_in)[[i]], value = dm_insert_in[[i]])
}

RMariaDB::dbDisconnect(con)

4 Notes