Skip to content
Snippets Groups Projects
ScreenHandle.R 4.85 KiB
Newer Older
#' ScreenHandle
#' @description Object for handling database operations related to the storage and 
#' retrieval of Screen objects.
#' @field dbConnection A dbConnection object
Jean-Karim Heriche's avatar
Jean-Karim Heriche committed
#' @export
ScreenHandle <- R6Class(
  classname = "ScreenHandle",
  lock_class = TRUE,
  public = list(
    dbConnection = NULL,
    #' @description Create an object for handling database operations related to 
    #' the storage and retrieval of Screen objects.
    #' @param dbConnection A dbConnection object
Jean-Karim Heriche's avatar
Jean-Karim Heriche committed
    initialize = function(dbConnection = NA) {
      self$dbConnection <- dbConnection
    },
    #' @description Retrieve a Screen object using its database ID
    #' @param dbID Database ID of the Screen object to retrieve
    #' @return A Screen object
Jean-Karim Heriche's avatar
Jean-Karim Heriche committed
    get_by_id = function(dbID) {
      query <- "SELECT * FROM Screen WHERE ID = ?"
      df <- self$dbConnection$get_data(query, list(dbID))
      if(length(df$ID)>0) {
        screen <- Screen$new(dbConnection = self$dbConnection,
                             ID = df$ID,
                             name = df$name,
                             description = df$description,
                             status = df$status, 
                             date_started = df$date_started,
                             date_ended = df$date_ended)
        return(screen)
      } else { return(NULL) }
    },
Jean-Karim Heriche's avatar
Jean-Karim Heriche committed
    #' @description Retrieve all screens
    #' @return Vector of Screen objects
    get_all_screens = function() {
      query <- "SELECT DISTINCT ID FROM Screen"
      df <- self$dbConnection$get_data(query)
      if(length(df$ID)>0) {
        screens <- list()
        for(id in df$ID) {
          sc <- self$get_by_id(id)
          screens <- c(screens, sc)
        }
        return(screens)
      }
    },
    #' @description Retrieve all screens with the given name
    #' @param name A screen name
    #' @return Vector of Screen objects
Jean-Karim Heriche's avatar
Jean-Karim Heriche committed
    get_all_by_name = function(name) {
      query <- "SELECT DISTINCT ID FROM Screen WHERE name = ?"
      df <- self$dbConnection$get_data(query, list(name))
      if(length(df$ID)>0) {
        screens <- list()
Jean-Karim Heriche's avatar
Jean-Karim Heriche committed
        for(id in df$ID) {
Jean-Karim Heriche's avatar
Jean-Karim Heriche committed
          sc <- self$get_by_id(id)
          screens <- c(screens, sc)
        }
        return(screens)
      }
    },
    #' @description Retrieve all screens with the given status
    #' @param status One of unknown, planned, running, awaiting analysis, 
    #' completed, archived
    #' @return Vector of Screen objects
Jean-Karim Heriche's avatar
Jean-Karim Heriche committed
    get_all_by_status = function(status) {
      query <- "SELECT DISTINCT ID FROM Screen WHERE status = ?"
      df <- self$dbConnection$get_data(query, list(status))
      if(length(df$ID)>0) {
        screens <- list()
        for(id in df$ID) {
          sc <- self$get_by_id(id)
          screens <- c(screens, sc)
        }
        return(screens)
      }
    },
    #' @description Generate a database ID for a Screen object
    #' @return A string starting with the prefix SCR:
Jean-Karim Heriche's avatar
Jean-Karim Heriche committed
    get_new_ID = function() {
      query <- "SELECT seq FROM Screen ORDER BY seq DESC LIMIT 1"
      df <- self$dbConnection$get_data(query)
      if(nrow(df)>0) {
        ID <- paste0("SCR:", sprintf("%012d", df$seq+1))
      } else { # The table is empty
        ID <- paste0("SCR:", sprintf("%012d",1))
      }
      return(ID)
    },
    #' @description Store Screen objects in the database
    #' @param screen.list A vector of Screen objects
Jean-Karim Heriche's avatar
Jean-Karim Heriche committed
    store = function(screen.list) {
      statement <- "INSERT IGNORE INTO Screen (ID, name, description, status, date_started, date_ended)
Jean-Karim Heriche's avatar
Jean-Karim Heriche committed
      for(screen in screen.list) {
        result <- self$dbConnection$execute(statement, list(screen$ID, 
                                                            screen$name,
                                                            screen$description,
                                                            screen$status,
                                                            screen$date_started,
                                                            screen$date_ended))
        if(length(screen$plates)>0) {
          plh <- PlateHandle$new(self$dbConnection)
          result <- plh$store(screen$plates)
          for(plate in screen$plates) {
            st <- "INSERT IGNORE INTO Screen_has_Plate (Screen_ID, Plate_ID)
                                                VALUES (?, ?)"
            r <- self$dbConnection$execute(st, list(screen$ID, plate$ID))
          }
Jean-Karim Heriche's avatar
Jean-Karim Heriche committed
        }
        if(length(screen$analyses)>0) {
          ah <- AnalysisHandle$new(self$dbConnection)
          result <- ah$store(screen$analyses)
          for(analysis in screen$analyses) {
            st <- "INSERT IGNORE INTO Screen_has_Analysis (Screen_ID, Analysis_ID)
                                                   VALUES (?, ?)"
            r <- self$dbConnection$execute(st, list(screen$ID, analysis$ID))
          }