R/init.r

Defines functions init_grafo_impl

Documented in init_grafo_impl

#' Funzione d'inizializzazione del grafo.
#'
#' Questa funzione va utilizzata nell'initialize S4 dell'oggetto `GrafoDB`
#'
#' @name init_grafo_impl
#' @rdname init-internal
#' @param object (creato da new)
#' @param tag tag del grafo (default=`cf10`)
#' @param con Connessione la DB
#' @return un istanza di grafo popolata correttamente secono i parametri (`tag`)
#' @note e' stata scorporata dall'initialize S4 per finalita' di debug
#' @include persistence.r sqlhelper.r
#' @include db.r persistence_utils.r

init_grafo_impl <- function(object, tag = "cf10", con = NULL) {
  ln <- "GrafoDB.functions.init_grafo_impl"
  if (is.null(tag)) {
    tag <- "cf10"
  } else {
    tag <- tolower(tag)
  }

  object@edges <- hash::hash()
  object@data <- hash::hash()
  object@functions <- hash::hash()
  object@touched <- character(0)

  rutils::.debug("GRAFODB_ENV: %s", getenv(), name = ln)
  object@tag <- tag

  if (is.null(con)) {
    con <- build_connection()
    on.exit(disconnect(con))
  }

  archi <- load_edges(tag, con = con)
  object <- resync(object, con = con)

  network <- if (nrow(archi) > 0) {
    archi <- archi[, c("partenza", "arrivo")]
    igraph::graph.data.frame(as.data.frame(archi), directed = TRUE)
  } else {
    igraph::graph.empty(directed = TRUE)
  }

  object@network <- network
  nomi <- names(object)
  if (length(nomi) > 0) {
    pending_names <- setdiff(nomi, igraph::V(network)$name)
    network <- network + igraph::vertex(pending_names)
  }

  object@network <- network

  df <- rilasci(tag, con = con)
  dftag <- df[df$tag == tag, ]
  if (nrow(dftag)) {
    ## il grafo esiste nel DB
    object@timestamp <- as.numeric(dftag$last_updated)
    if (interactive()) {
      message(dftag$comment)
    }
  } else {
    ## il grafo non esiste nel DB
    object <- create_new_grafo(object, tag, con = con)
  }

  object
}
giupo/GrafoDB documentation built on Oct. 12, 2022, 9:43 a.m.