diff --git a/shiny/app.R b/shiny/app.R index 69ade1f..8b93770 100644 --- a/shiny/app.R +++ b/shiny/app.R @@ -3,26 +3,9 @@ library(DBI) library(RPostgres) library(DT) library(bslib) - -# Define UI for the application -# ui <- fluidPage( -# titlePanel("Binary Package Build Metadata"), -# sidebarLayout( -# sidebarPanel( -# textInput("name", "Package Name:", "ggplot2"), -# selectInput("arch", "Architecture:", c("amd64", "arm64", "any"), selected = "amd64"), -# selectInput("platform", "Platform:", c("ubuntu-2404", "ubuntu-2204", "redhat-8", "redhat-9", "alpine-320", "any"), selected = "ubuntu-2404"), -# textInput("tag", "Tag:", ""), -# dateRangeInput("timestamp", "Build Date Range:", start = Sys.Date() - 365, end = Sys.Date()), -# selectInput("error_occurred", "Error:", c("true", "false", "any"), selected = "false") -# ), -# mainPanel( -# textOutput("totalEntries"), -# textOutput("query"), -# DTOutput("table") -# ) -# ) -# ) +library(dplyr) +library(bincraftR) +library(data.table) ui <- page_navbar( @@ -61,7 +44,24 @@ ui <- page_navbar( full_screen = TRUE, DTOutput("table") )), - nav_panel("Statistics"), + nav_panel( + "Statistics", + layout_column_wrap( + # card(card_header(paste0("Distinct package binary count by OS/Arch of", textOutput("total_cran_pkgs"), "possible")), + card(card_header("Number of processed packages by OS/Arch"), + full_screen = TRUE, + DTOutput("processed") + ), + card(card_header("Successful distinct binary builds (n >=1) by OS/Arch"), + full_screen = TRUE, + DTOutput("distinct_success") + ), + card(card_header("Total successful builds (incl. historic versions)"), + full_screen = TRUE, + DTOutput("successful_perc") + ) + ) + ), title = "Binary Package Build Metadata", sidebar = sidebar( conditionalPanel( @@ -72,12 +72,10 @@ ui <- page_navbar( selectInput("platform", "Platform:", c("ubuntu-2404", "ubuntu-2204", "redhat-8", "redhat-9", "alpine-320", "any"), selected = "ubuntu-2404"), textInput("tag", "Tag:", ""), dateRangeInput("timestamp", "Build Date Range:", start = Sys.Date() - 365, end = Sys.Date()), - input_switch("error_occurred", "Error", value = FALSE, width = NULL), - # selectInput(, "Error:", c("true", "false", "any"), selected = "false") + input_switch("error_occurred", "Error during build", value = FALSE, width = NULL), + input_switch("removed", "Removed from CRAN", value = FALSE, width = NULL), ) - ), - # mainPanel( - # ) + ) ) @@ -95,7 +93,7 @@ server <- function(input, output, session) { # Query to get the total count of entries output$totalEntries <- renderText({ - total_query <- "SELECT COUNT(*) AS total_entries FROM single_builds" + total_query <- "SELECT COUNT(*) AS total_entries FROM single_builds WHERE error_occurred = 'false'" total_count <- dbGetQuery(con, total_query) pretty_count <- format(as.numeric(total_count$total_entries), big.mark = ".", small.mark = ",", scientific = FALSE) paste(pretty_count) @@ -111,7 +109,8 @@ server <- function(input, output, session) { if (input$arch != "" && input$arch != "any") paste0("AND arch = '", input$arch, "' "), if (input$platform != "" && input$platform != "any") paste0("AND platform = '", input$platform, "' "), if (input$tag != "") paste0("AND tag = '%", input$tag, "%' "), - if (input$error_occurred != "" && input$error_occurred != "any") paste0("AND error_occurred = '", input$error_occurred, "' ") + if (input$error_occurred != "" && input$error_occurred != "any") paste0("AND error_occurred = '", input$error_occurred, "' "), + if (input$removed != "" && input$removed != "any") paste0("AND removed = '", input$removed, "' ") ) output$query <- renderUI({ tagList( @@ -128,10 +127,63 @@ server <- function(input, output, session) { df <- dbGetQuery(con, query) df <- df[order(df$tag, decreasing = TRUE), ] - colnames(df) <- c("Name", "Tag", "Platform", "Error occurred", "Error", "Size (MB)", "Build Timestamp", "Build Duration (s)", "Architecture") + colnames(df) <- c("Name", "Tag", "Platform", "Error occurred", "Error", "Size (MB)", "Build Timestamp", "Build Duration (s)", "Architecture", "Removed") datatable(df) }) + cachedData <- reactiveVal(NULL) + total_pkgs = length(tools::CRAN_package_db()$Package) + + observeEvent(input, { + if (is.null(cachedData())) { + result <- as.data.table(query_metadata_table()) + cachedData(result) + } + }) + + # data = as.data.table(query_metadata_table()) + + output$processed <- renderDT({ + out <- cachedData() |> + filter(removed == FALSE) |> + group_by(platform, arch) |> + distinct(name) |> + count() |> + arrange(platform) |> + as_tibble() + + out <- out |> + mutate("%" = round((n / total_pkgs) * 100, 1)) + }) + + output$distinct_success <- renderDT({ + out <- cachedData() |> + filter(removed == FALSE) |> + group_by(platform, arch) |> + filter(error_occurred == FALSE) |> + distinct(name) |> + count() |> + arrange(platform) |> + as_tibble() + + out <- out |> + mutate("%" = round((n / total_pkgs) * 100, 1)) + }) + + output$successful_perc <- renderDT({ + out <- cachedData() |> + filter(removed == FALSE) |> + group_by(platform, arch) |> + count(error_occurred) |> + mutate("%" = round(n / sum(n) * 100), 2) |> + filter(error_occurred == FALSE) |> + select(platform, arch, "%") |> + as_tibble() + }) + + # output$total_cran_pkgs <- renderText(paste("Number of processed packages by OS/Arch of", length(tools::CRAN_package_db()$Package), "(total number of CRAN packages) possible")) + # output$total_cran_pkgs = renderText("20000") + # bs_themer() # Disconnect on app stop