## ----include = FALSE----------------------------------------------------------
knitr::opts_chunk$set(
  collapse = TRUE,
  comment = "#>"
)

## ----library, eval = requireNamespace("tidyverse")----------------------------
library(tidyverse)

## ----setup, include = FALSE, eval = requireNamespace("tidyverse")-------------

forecasts_full <- tribble(
  ~City, ~Forecast, ~ForecastDate,
  "New York",    20, "2023-09-28",
  "Los Angeles", 23, "2023-09-28",
  "Seattle",     16, "2023-09-28",
  "Houston",     34, "2023-09-28",
  "New York",    18, "2023-09-29",
  "Los Angeles", 25, "2023-09-29",
  "Seattle",     17, "2023-09-29",
  "Houston",     34, "2023-09-29"
) %>%
  mutate(across("ForecastDate", as.Date))

forecasts_scd <- forecasts_full %>%
  mutate(ForecastFrom = ForecastDate,
         ForecastUntil = case_when(
           City == "Houston" ~ as.Date(NA),
           ForecastDate == "2023-09-29" ~ as.Date(NA),
           TRUE ~ as.Date("2023-09-29")
         )) %>%
  filter(!(City == "Houston" & ForecastFrom == "2023-09-29")) %>%
  distinct() %>%
  select(!"ForecastDate") %>%
  arrange(ForecastFrom)

forecasts_dated <- filter(forecasts_full, ForecastDate == "2023-09-28")
forecasts <- select(forecasts_dated, !"ForecastDate")

forecasts2 <- filter(forecasts_full, ForecastDate == "2023-09-29") %>%
  select(!"ForecastDate")
forecasts2a <- filter(forecasts_full, ForecastDate == "2023-09-29")

## ----forecasts, eval = requireNamespace("tidyverse")--------------------------
# Current date: 2023-09-28
forecasts

## ----forecasts2a, eval = requireNamespace("tidyverse")------------------------
# Current date: 2023-09-29
forecasts2

## ----forecasts_full, eval = requireNamespace("tidyverse")---------------------
forecasts_full

## ----forecasts_full_examples, eval = requireNamespace("tidyverse")------------

# Current forecasts
forecasts_full %>%
  slice_max(ForecastDate, n = 1) %>%
  select(!"ForecastDate")

# Forecasts for a given date
forecasts_full %>%
  filter(ForecastDate == "2023-09-28")

# Full history for a given city
forecasts_full %>%
  filter(City == "New York")

## ----forecasts_scd, eval = requireNamespace("tidyverse")----------------------
forecasts_scd

## ----adresses_setup, include = FALSE, eval = requireNamespace("tidyverse")----
addresses <- tibble::tibble(
  ID = c(1,
         2,
         1,
         1),
  GivenName = c("Alice",
                "Robert",
                "Alice",
                "Alice"),
  Surname = c("Doe",
              "Tables",
              "Doe",
              "Doe"),
  Address = c("Donut Plains 1",
              "Rainbow Road 8",
              "Donut Plains 1",
              "Rainbow Road 8"),
  MovedIn = c("1989-06-26",
              "1989-12-13",
              "1989-06-26",
              "2021-03-01"),
  MovedOut = c(NA,
               NA,
               "2021-03-01",
               NA),
  ValidFrom = c("1989-06-26",
                "1989-12-13",
                "2021-03-08",
                "2021-03-08"),
  ValidUntil = c("2021-03-08",
                 NA,
                 NA,
                 NA)
) %>%
  mutate(across(c("MovedIn", "MovedOut", "ValidFrom", "ValidUntil"), as.Date))


name_change_date <- as.Date("2023-08-28")
addresses2 <- addresses %>%
  filter(ID == 1) %>%
  {
    .data <- .

    .data %>%
      filter(Address == "Rainbow Road 8") %>%
      mutate(Surname = "Tables",
             ValidFrom = !!name_change_date) %>%
      bind_rows(.data)
  } %>%
  mutate(
    ValidUntil = as.Date(
      c(NA, !!name_change_date, NA, !!name_change_date),
      origin = "1970-01-01"
    )
  ) %>%
  bind_rows(filter(addresses,
                   ID == 2)) %>%
  arrange(ValidFrom) %>%
  distinct()

## ----addresses1, eval = requireNamespace("tidyverse")-------------------------
addresses

## ----addresses1a, eval = requireNamespace("tidyverse")------------------------
slice_timestamp <- "2021-03-02"

addresses %>%
  filter(ID == 1,
         ValidFrom < !!slice_timestamp,
         ValidUntil >= !!slice_timestamp | is.na(ValidUntil)) %>%
  select(!c("ValidFrom", "ValidUntil"))

## ----addresses2, eval = requireNamespace("tidyverse")-------------------------
filter(addresses2,
       ID == 1,
       Address == "Rainbow Road 8") %>%
  select(ID, GivenName, Surname, MovedIn, MovedOut, ValidFrom, ValidUntil)

## ----addresses3, eval = requireNamespace("tidyverse")-------------------------
slice_timestamp <- "2022-03-04"

addresses2 %>%
  filter(Address == "Rainbow Road 8",
         is.na(MovedOut),
         ValidFrom < !!slice_timestamp,
         ValidUntil >= !!slice_timestamp | is.na(ValidUntil)) %>%
  select(ID, GivenName, Surname, MovedIn, MovedOut)

slice_timestamp <- "2023-09-29"

addresses2 %>%
  filter(Address == "Rainbow Road 8",
         is.na(MovedOut),
         ValidFrom < !!slice_timestamp,
         ValidUntil >= !!slice_timestamp | is.na(ValidUntil)) %>%
  select(ID, GivenName, Surname, MovedIn, MovedOut)

