R/fct_google.R

Defines functions pull_sunburst_data pull_ga_data_set pull_ga_data

Documented in pull_ga_data pull_ga_data_set pull_sunburst_data

#' generic function to pull GA data
#' @description generic function to pull GA data; it performs a single query
#' @details Function is atomic, performing one query, for one GA view, for a given period of time
#' @import googleAnalyticsR
#' @import data.table
#' @param parameters a structured list with parameters
#' @param ga_view_id an ID of Google Analytics view
#' @param dates_interval an interval to pull data
#' @export
pull_ga_data <- function(parameters, ga_view_id, dates_interval){

    metrics    <- parameters$metrics
    dimensions <- parameters$dimensions
    start_date <- lubridate::int_start(dates_interval) %>% as.Date()
    end_date   <- lubridate::int_end(dates_interval) %>% as.Date()

    if (!is.null(parameters$segment)) seg_obj <- googleAnalyticsR::segment_ga4("Sellwerk segment nickname", segment_id = parameters$segment) else (seg_obj <- NULL)
    if (!is.null(parameters$filter)) filter   <- googleAnalyticsR::filter_clause_ga4(parameters$filter, operator = "AND") else (filter <- NULL)

    ga_data_raw <- googleAnalyticsR::google_analytics(ga_view_id,
                                    date_range = c(start_date, end_date),
                                    metrics = metrics, dimensions = dimensions,
                                    segments = seg_obj,
                                    dim_filters = filter,
                                    max = -1, anti_sample = T)
    ga_dt <- ga_data_raw
    setDT(ga_dt)
    return(ga_dt)
}

#' Pull a list of queries for a given ga_view_id
#' @description Pull a list of queries for a given ga_view_id
#' @import googleAuthR
#' @importFrom rlist list.match
#' @importFrom here here
#' @param ga_view_id an ID of Google Analytics view
#' @param queries_list a list of queries
#' @param dates_interval an interval to pull data
#'
#' @export
pull_ga_data_set <- function(ga_view_id, queries_list, dates_interval){

    #-- authentication
    googleAuthR::gar_auth(here::here(".httr-oauth")) #-- authentication using token

    #-- query itself, all the sub-queries for a given view; it returns a list, with a one element per query
    dt_list <- purrr::map(queries_list, pull_ga_data, ga_view_id, dates_interval)

    return(dt_list)
}

#' Pulling data to chart sunburst
#' @description complete sequence to pull data needed for sunburst for a given period
#' @details we are defining list of queries, and call function [pull_ga_data_set()] for each element on a list
#' @importFrom rlist list.match list.names list.ungroup
#' @param dates_interval a period to use while pulling the data
#'
#' @export
pull_sunburst_data <- function(dates_interval) {

    ga_account      <- config$ga_account
    ga_max_results  <- config$ga_max_result
    #ga_views_subset <- config$ga_view

    #-- define list of queries, as a reference; we can have more queries than we use in a particular application
    ga_queries_list <- list(
        sellwerk_1_of_5 = list(metrics    = c("ga:users"),
                               dimensions = c("ga:dimension20", "ga:date", "ga:deviceCategory", "ga:campaign", "ga:sourceMedium", "ga:sessionCount")),
        sellwerk_2_of_5 = list(metrics    = c("ga:users"),
                               dimensions = c("ga:dimension2", "ga:dimension15", "ga:dimension16", "ga:dimension17", "ga:dimension20",
                                              "ga:pagePath")),
        sellwerk_3_of_5 = list(metrics    = c("ga:totalEvents"),
                               dimensions = c("ga:dimension2", "ga:dimension3", "ga:dimension4", "ga:dimension7", "ga:dimension15",
                                              "ga:dimension16", "ga:dimension20"),
                               segment    = c("gaid::evmYLN5FSdyl9JpB2ekbsQ"))
                               # segment    = segment_element("eventAction",
                               #                              operator = "EXACT",
                               #                              type = "DIMENSION",
                               #                              expression = "Login Success",
                               #                              scope = "SESSION"))
    )

    #-- select a subset of queries, which we are using right now, using string match
    ga_queries_subset_pattern <- list("1|3") # limit to queries 1, 3
    ga_queries_subset_list    <- rlist::list.match(ga_queries_list, ga_queries_subset_pattern)

    #-- pull the data
    ga_views_identifiers = c("Sellwerk" = "ga:233250370")
    ga_views_subset <- ga_views_identifiers["Sellwerk"]
    ga_dt_list <- purrr::map(ga_views_subset, pull_ga_data_set, ga_queries_subset_list, dates_interval)

    #-- unlist to a data.table structure
    queries_list <- ga_queries_subset_list %>% rlist::list.names()

    dt_list <- lapply(queries_list, function(x) {
        dt <- rlist::list.select(ga_dt_list, eval(as.name(x))) %>%
            list.ungroup(group.names = TRUE) %>%
            rbindlist(use.names = TRUE, idcol = TRUE) %>%
            setDT()
        dt[, `:=` (query = x)]
        setnames(dt, ".id", "ga_view", skip_absent = T)
        return(dt)
    })

    names(dt_list) <- queries_list

    #dt <- rbindlist(dt_list, use.names = T, fill = T)

    return(dt_list)
}
piotrgruszecki/sw.dashboard documentation built on March 22, 2021, 2:24 a.m.