view db/access_db.R @ 0:205974c9568c tip

Initial commit. Predictions not included for lack of space.
author franrodalg <f.rodriguezalgarra@qmul.ac.uk>
date Sat, 29 Jun 2019 18:45:50 +0100
parents
children
line wrap: on
line source
library(tidyverse)
library(RSQLite)


#
get_excerpts <- function(db = "../db/gtzan.db"){

  con <- dbConnect(SQLite(), db)

  res <- dbGetQuery(
    con, "SELECT ex_id FROM excerpts")

  dbDisconnect(con)
  
  return(res)

}

#
get_excerpts_artists <- function(db = "../db/gtzan.db"){
  
  con <- dbConnect(RSQLite::SQLite(), db)
  
  res <- dbGetQuery(
    con, 
    "SELECT ex_id, artist_id FROM
    recordings_artists AS r INNER JOIN excerpts AS e
    ON r.rec_id = e.rec_id;")
  
  dbDisconnect(con)
  
  return(res)
  
}

.filter_by_class <- function(df,
  db = "../db/gtzan.db", classes = NULL){
  
  class_ids <- get_class_names(db = db) %>% 
    filter(class %in% classes) %>%
    select(class_id) %>%
    unlist()
  df %>% filter(class_id %in% class_ids)
  
}

#
get_excerpts_classes <- function(db = "../db/gtzan.db", 
                                 classes = NULL){
  
  con <- dbConnect(SQLite(), db)
  
  res <- dbGetQuery(
    con, 
    "SELECT ex_id, class_id, ex_id_class FROM
    excerpts_classes;")
  
  if (!is.null(classes)) 
    res <- .filter_by_class(res, db, classes)
  
  dbDisconnect(con)
  
  return(res)
  
}

#
get_class_names <- function(db = "../db/gtzan.db"){
  
  con <- dbConnect(SQLite(), db)
  
  res <- dbGetQuery(
    con, 
    "SELECT class_id, class FROM
    classes;")
  
  dbDisconnect(con)
  
  return(res)  
  
}

#
get_artists <- function(excerpts, unique_artists = T, 
                        db = "../db/gtzan.db"){
  
  excerpts_artists <- get_excerpts_artists(db = db)
  
  res <- 
    excerpts_artists %>% 
    inner_join(data.frame(ex_id = excerpts), by = c('ex_id')) %>% 
    select(artist_id) %>%
    unlist() %>%
    unname()
  
  if(unique_artists)
    return(unique(res))
  else
    return(res)
  
}

#
get_classes <- function(excerpts, unique_classes = T,
                        use_names = T,
                        db = "../db/gtzan.db"){
  
  excerpts_classes <- get_excerpts_classes(db = db)
  class_names <- get_class_names(db = db)
  
  res <-
    excerpts_classes %>% 
    inner_join(data.frame(ex_id = excerpts), by = c('ex_id')) %>%
    select(class_id)
  
  if(use_names)
    res <- res %>%
    inner_join(class_names, by = c('class_id')) %>%
    select(class) %>% 
    mutate(class = factor(class,
                          levels = unique(class_names$class)))
  else
    res <- res %>%
    mutate(class_id = factor(class_id,
                             levels = unique(class_names$class_id)))
  
  res <- res %>% unlist() %>% unname()
  
  if(unique_classes)
    return(unique(res))
  else
    return(res) 
  
}