Skip to content
Snippets Groups Projects
ScreenHandle.R 2.84 KiB
Newer Older
Jean-Karim Heriche's avatar
Jean-Karim Heriche committed
#' @export
ScreenHandle <- R6Class(
  classname = "ScreenHandle",
  lock_class = TRUE,
  public = list(
    dbConnection = NULL,
    initialize = function(dbConnection = NA) {
      self$dbConnection <- dbConnection
    },
    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) }
    },
    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()
        for(id in df$dbID) {
          sc <- self$get_by_id(id)
          screens <- c(screens, sc)
        }
        return(screens)
      }
    },
    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)
      }
    },
    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)
    },
    store = function(screen.list) {
      statement <- "INSERT IGNORE INTO Screen (ID, name, description, status, date_started, date_ended)
                            VALUES (?, ?, ?, ?, ?, ?)" 
      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)
        }
        if(length(screen$analyses)>0) {
          ah <- AnalysisHandle$new(self$dbConnection)
          result <- ah$store(screen$analyses)
        }
      }
    }
  )
)