returnModel <- function()

in modelServR/R/returnModel.R [45:120]


returnModel <- function(queryIn = jsonlite::toJSON(
                              list(
                                SELECT   =list(COLUMN=c('pathogen','site_type','residence_census_tract')),
                                WHERE   =list(COLUMN='pathogen', IN = 'all'),
                                GROUP_BY =list(COLUMN=c('site_type','residence_census_tract')),
                                SUMMARIZE=list(COLUMN='pathogen', IN= 'all')
                                  )),
                            type = 'observed',
                            version = 'latest',
                            cloudDir = Sys.getenv('MODEL_STORE', '/home/rstudio/seattle_flu/test_model_store')){

  basicConfig()

  if(class(queryIn)== 'list'){
    queryList <- queryIn
    queryIn <- jsonlite::toJSON(queryIn)
  } else if(class(queryIn)=='json'){
    queryList <- jsonlite::fromJSON(queryIn)
  }

  modelID <- getModelIdFromQuery(queryList)
  logdebug("ModelID: ", modelID)

  modelDBfile<-paste(cloudDir,'modelDB.tsv',sep='/')

  modelDB <- read.table(modelDBfile,header=TRUE,sep='\t',stringsAsFactors = FALSE)
  modelDB$created <- as.POSIXct(modelDB$created,tz='UTC')


  queryIdx <- gsub('\\\\','',modelDB$queryJSON) %in% gsub('\"','',as.character(queryIn))
  typeIdx <- modelDB$type == type

  matchIdx <- which(queryIdx & typeIdx)

  if(version == 'latest'){
    createdIdx <- which.max(modelDB$created[matchIdx])
  } else {
    version = as.Date(version)
    createdIdx <- which.min(abs(version-modelDB$created))
  }
  matchIdx<-matchIdx[createdIdx]


  if(!any(matchIdx)){
    return('unknown model')
  } else {
    filename<-paste(cloudDir,modelDB$filename[matchIdx],sep='/')
  }

  if (format %in% c('csv','json')){
    db <- loadModelFile(modelID, cloudDir)

    dataOut<-list(query = queryList, type = type)

    if(format == 'csv'){
      
      return(dataOut)
      
    } else {
      
      # flat data format
      dataOut$data <- db
      
      # reformat for hierarchical JSON
      # dataOut$data <-db %>% dplyr::group_by_at(queryList$GROUP_BY$COLUMN) %>% tidyr::nest(names(db))
  
      return(jsonlite::toJSON(dataOut,pretty = TRUE, na="string"))
    }

  } else if(format == 'inla'){

    model <- readRDS(paste(filename,'inla.RDS',sep='.'))

    return(model)
  }
}