Add tests, github actions, and executeDdl function (#425)
* Add github actions workflow to build package and run tests. * update Description file * rename .Rproj file. * Consolidate 'create' functions into one file. * Add tests for create functions. * update description * removed spaces in file and folder names. Regenerated ddl output. Tried to fix Field_Level.csv file. * consolidate write functions into one file. Add execute function. * update docs * add tests for write and execute functions * update documentation * Add windows and linux runners in github actions. * update github actions * download drivers before running tests * fix small error in setup test file. * debug github actions * debug github actions * debug github actions * debug github actions * fix tiny bug * comment out execute ddl test * fix bug in test * Add execute test back in * revert accidental change in description * add print statement for debugging schema error on github actions. * Fix schema environment variable name * Add comment to github actions workflow file. * remove placeholder text in function documentation. * Rename createdDdl.R to createDdl.R Co-authored-by: Adam Black <adam.black@odysseusinc.com>
This commit is contained in:
parent
27522b0896
commit
19462d322d
|
@ -1,2 +1,4 @@
|
|||
^.*\.Rproj$
|
||||
^\.Rproj\.user$
|
||||
^LICENSE\.md$
|
||||
.github/*
|
||||
|
|
|
@ -0,0 +1,117 @@
|
|||
# For help debugging build failures open an issue on the RStudio community with the 'github-actions' tag.
|
||||
# https://community.rstudio.com/new-topic?category=Package%20development&tags=github-actions
|
||||
on:
|
||||
push:
|
||||
branches:
|
||||
- '**'
|
||||
pull_request:
|
||||
branches:
|
||||
- '**'
|
||||
|
||||
name: R-CMD-check
|
||||
|
||||
jobs:
|
||||
R-CMD-check:
|
||||
runs-on: ${{ matrix.config.os }}
|
||||
|
||||
name: ${{ matrix.config.os }} (${{ matrix.config.r }})
|
||||
|
||||
strategy:
|
||||
# Test create and drop tables in a database so they cannot be executed in parallel
|
||||
max-parallel: 1
|
||||
fail-fast: false
|
||||
matrix:
|
||||
config:
|
||||
- {os: macOS-latest, r: 'release'}
|
||||
- {os: ubuntu-20.04, r: 'release', rspm: "https://packagemanager.rstudio.com/cran/__linux__/focal/latest"}
|
||||
- {os: windows-latest, r: 'release'} # Does not appear to have Java 32-bit, hence the --no-multiarch
|
||||
|
||||
env:
|
||||
R_REMOTES_NO_ERRORS_FROM_WARNINGS: true
|
||||
RSPM: ${{ matrix.config.rspm }}
|
||||
CDMDDLBASE_POSTGRESQL_USER: ${{ secrets.CDMDDLBASE_POSTGRESQL_USER }}
|
||||
CDMDDLBASE_POSTGRESQL_PASSWORD: ${{ secrets.CDMDDLBASE_POSTGRESQL_PASSWORD }}
|
||||
CDMDDLBASE_POSTGRESQL_SERVER: ${{ secrets.CDMDDLBASE_POSTGRESQL_SERVER }}
|
||||
CDMDDLBASE_POSTGRESQL_SCHEMA: ${{ secrets.CDMDDLBASE_POSTGRESQL_SCHEMA }}
|
||||
|
||||
steps:
|
||||
- uses: actions/checkout@v2
|
||||
|
||||
- uses: r-lib/actions/setup-r@v1
|
||||
with:
|
||||
r-version: ${{ matrix.config.r }}
|
||||
|
||||
- uses: r-lib/actions/setup-tinytex@v1
|
||||
|
||||
- uses: r-lib/actions/setup-pandoc@v1
|
||||
|
||||
- name: Query dependencies
|
||||
run: |
|
||||
install.packages('remotes')
|
||||
saveRDS(remotes::dev_package_deps(dependencies = TRUE), ".github/depends.Rds", version = 2)
|
||||
writeLines(sprintf("R-%i.%i", getRversion()$major, getRversion()$minor), ".github/R-version")
|
||||
shell: Rscript {0}
|
||||
|
||||
- name: Cache R packages
|
||||
if: runner.os != 'Windows'
|
||||
uses: actions/cache@v2
|
||||
with:
|
||||
path: ${{ env.R_LIBS_USER }}
|
||||
key: ${{ runner.os }}-${{ hashFiles('.github/R-version') }}-1-${{ hashFiles('.github/depends.Rds') }}
|
||||
restore-keys: ${{ runner.os }}-${{ hashFiles('.github/R-version') }}-1-
|
||||
|
||||
- name: Install system dependencies
|
||||
if: runner.os == 'Linux'
|
||||
run: |
|
||||
while read -r cmd
|
||||
do
|
||||
eval sudo $cmd
|
||||
done < <(Rscript -e 'writeLines(remotes::system_requirements("ubuntu", "20.04"))')
|
||||
|
||||
- name: Install libssh
|
||||
if: runner.os == 'Linux'
|
||||
run: |
|
||||
sudo apt-get install libssh-dev
|
||||
|
||||
- name: Install dependencies
|
||||
run: |
|
||||
remotes::install_deps(dependencies = TRUE, INSTALL_opts=c("--no-multiarch"))
|
||||
remotes::install_cran("rcmdcheck")
|
||||
shell: Rscript {0}
|
||||
|
||||
- name: Install covr
|
||||
if: runner.os == 'macOS'
|
||||
run: |
|
||||
remotes::install_cran("covr")
|
||||
shell: Rscript {0}
|
||||
|
||||
- name: Remove check folder if exists
|
||||
if: runner.os == 'macOS'
|
||||
run: unlink("check", recursive = TRUE)
|
||||
shell: Rscript {0}
|
||||
|
||||
- name: Check
|
||||
env:
|
||||
_R_CHECK_CRAN_INCOMING_REMOTE_: false
|
||||
run: rcmdcheck::rcmdcheck(args = c("--no-manual", "--as-cran", "--no-multiarch"), error_on = "warning", check_dir = "check")
|
||||
shell: Rscript {0}
|
||||
|
||||
- name: Upload check results
|
||||
if: failure()
|
||||
uses: actions/upload-artifact@v2
|
||||
with:
|
||||
name: ${{ runner.os }}-r${{ matrix.config.r }}-results
|
||||
path: check
|
||||
|
||||
- name: Upload source package
|
||||
if: success() && runner.os == 'macOS' && github.event_name != 'pull_request' && github.ref == 'refs/heads/master'
|
||||
uses: actions/upload-artifact@v2
|
||||
with:
|
||||
name: package_tarball
|
||||
path: check/*.tar.gz
|
||||
|
||||
- name: Test coverage
|
||||
if: runner.os == 'macOS'
|
||||
run: covr::codecov()
|
||||
shell: Rscript {0}
|
||||
|
13
DESCRIPTION
13
DESCRIPTION
|
@ -1,4 +1,4 @@
|
|||
Package: CdmDdlBase
|
||||
Package: CommonDataModel
|
||||
Type: Package
|
||||
Title: OMOP CDM DDL and Documentation Generator
|
||||
Version: 0.1.0
|
||||
|
@ -14,6 +14,15 @@ Imports:
|
|||
rmarkdown,
|
||||
stringr,
|
||||
readxl,
|
||||
dplyr
|
||||
DatabaseConnector,
|
||||
DBI,
|
||||
dplyr,
|
||||
readr
|
||||
Suggests:
|
||||
knitr,
|
||||
testthat (>= 3.0.0),
|
||||
RSQLite,
|
||||
withr
|
||||
NeedsCompilation: no
|
||||
RoxygenNote: 7.1.1
|
||||
Config/testthat/edition: 3
|
||||
|
|
|
@ -4,9 +4,10 @@ export(createDdl)
|
|||
export(createForeignKeys)
|
||||
export(createPrimaryKeys)
|
||||
export(downloadCurrentDdl)
|
||||
export(executeDdl)
|
||||
export(listSupportedVersions)
|
||||
export(parseWiki)
|
||||
export(writeDDL)
|
||||
export(writeDdl)
|
||||
export(writeForeignKeys)
|
||||
export(writeIndex)
|
||||
export(writePrimaryKeys)
|
||||
|
|
|
@ -1,4 +1,3 @@
|
|||
|
||||
# Copyright 2019 Observational Health Data Sciences and Informatics
|
||||
#
|
||||
# This file is part of CdmDdlBase
|
||||
|
@ -15,21 +14,30 @@
|
|||
# See the License for the specific language governing permissions and
|
||||
# limitations under the License.
|
||||
|
||||
#' Create a DDL script from a two csv files that detail the OMOP CDM Specifications. These files also form the basis of the CDM documentation and the Data Quality
|
||||
#' Create the OHDSI-SQL Common Data Model DDL code
|
||||
#'
|
||||
#' The createDdl, createForeignKeys, and createPrimaryKeys functions each return a character string
|
||||
#' containing their respective DDL SQL code in OHDSQL dialect for a specific CDM version.
|
||||
#' The SQL they generate needs to be rendered and translated before it can be executed.
|
||||
#'
|
||||
#' The DDL SQL code is created from a two csv files that detail the OMOP CDM Specifications.
|
||||
#' These files also form the basis of the CDM documentation and the Data Quality
|
||||
#' Dashboard.
|
||||
#'
|
||||
#' @param cdmVersionNum The version of the CDM you are creating, e.g. 5.3.1
|
||||
#'
|
||||
#' @param cdmTableCsvLoc The location of the csv file with the high-level CDM table information. This is defaulted to "inst/csv/OMOP_CDMv5.3.1_Table_Level.csv".
|
||||
#' If a new version of this file was committed to the CDM repository the package automatically will grab it and place it in "inst/csv/".
|
||||
#' @param cdmFieldCsvLoc The location of the csv file with the CDM field information. This is defaulted to "inst/csv/OMOP_CDMv5.3.1_Field_Level.csv".
|
||||
#' If a new version of this file was committed to the CDM repository the package automatically will grab it and place it in "inst/csv/".
|
||||
#' @param outputFile The name of the output ddl sql file. This is defaulted to a location in the inst/sql/sql server folder and named with today's date and the CDM version.
|
||||
#' @param cdmVersion The version of the CDM you are creating, e.g. 5.3, 5.4
|
||||
#' @return A character string containing the OHDSQL DDL
|
||||
#' @export
|
||||
#' @examples
|
||||
#' ddl <- createDdl("5.4")
|
||||
#' pk <- createPrimaryKeys("5.4")
|
||||
#' fk <- createForeignKeys("5.4")
|
||||
createDdl <- function(cdmVersion){
|
||||
|
||||
createDdl <- function(cdmVersion = cdmVersion){
|
||||
cdmTableCsvLoc = paste0("inst/csv/OMOP_CDMv", cdmVersion, "_Table_Level.csv")
|
||||
cdmFieldCsvLoc = paste0("inst/csv/OMOP_CDMv", cdmVersion, "_Field_Level.csv")
|
||||
# argument checks
|
||||
stopifnot(is.character(cdmVersion), length(cdmVersion) == 1, cdmVersion %in% listSupportedVersions())
|
||||
|
||||
cdmTableCsvLoc <- system.file(file.path("csv", paste0("OMOP_CDMv", cdmVersion, "_Table_Level.csv")), package = "CommonDataModel", mustWork = TRUE)
|
||||
cdmFieldCsvLoc <- system.file(file.path("csv", paste0("OMOP_CDMv", cdmVersion, "_Field_Level.csv")), package = "CommonDataModel", mustWork = TRUE)
|
||||
|
||||
tableSpecs <- read.csv(cdmTableCsvLoc, stringsAsFactors = FALSE)
|
||||
cdmSpecs <- read.csv(cdmFieldCsvLoc, stringsAsFactors = FALSE)
|
||||
|
@ -37,7 +45,7 @@ createDdl <- function(cdmVersion = cdmVersion){
|
|||
tableList <- tableSpecs$cdmTableName
|
||||
|
||||
sql_result <- c()
|
||||
sql_result <- c(paste0("--@targetdialect CDM DDL Specification for OMOP Common Data Model ", cdmVersion))
|
||||
sql_result <- c(paste0("--@targetDialect CDM DDL Specification for OMOP Common Data Model ", cdmVersion))
|
||||
for (tableName in tableList){
|
||||
fields <- subset(cdmSpecs, cdmTableName == tableName)
|
||||
fieldNames <- fields$cdmFieldName
|
||||
|
@ -81,3 +89,52 @@ createDdl <- function(cdmVersion = cdmVersion){
|
|||
}
|
||||
return(paste0(sql_result, collapse = ""))
|
||||
}
|
||||
|
||||
|
||||
#' @describeIn createDdl createPrimaryKeys Returns a string containing the OHDSQL for creation of primary keys in the OMOP CDM.
|
||||
#' @export
|
||||
createPrimaryKeys <- function(cdmVersion){
|
||||
|
||||
# argument checks
|
||||
stopifnot(is.character(cdmVersion), length(cdmVersion) == 1, cdmVersion %in% listSupportedVersions())
|
||||
|
||||
cdmFieldCsvLoc <- system.file(file.path("csv", paste0("OMOP_CDMv", cdmVersion, "_Field_Level.csv")), package = "CommonDataModel", mustWork = TRUE)
|
||||
cdmSpecs <- read.csv(cdmFieldCsvLoc, stringsAsFactors = FALSE)
|
||||
|
||||
primaryKeys <- subset(cdmSpecs, isPrimaryKey == "Yes")
|
||||
pkFields <- primaryKeys$cdmFieldName
|
||||
|
||||
sql_result <- c(paste0("--@targetDialect CDM Primary Key Constraints for OMOP Common Data Model ", cdmVersion, "\n"))
|
||||
for (pkField in pkFields){
|
||||
|
||||
subquery <- subset(primaryKeys, cdmFieldName==pkField)
|
||||
|
||||
sql_result <- c(sql_result, paste0("\nALTER TABLE @cdmDatabaseSchema.", subquery$cdmTableName, " ADD CONSTRAINT xpk_", subquery$cdmTableName, " PRIMARY KEY NONCLUSTERED (", subquery$cdmFieldName , ");\n"))
|
||||
|
||||
}
|
||||
return(paste0(sql_result, collapse = ""))
|
||||
}
|
||||
|
||||
#' @describeIn createDdl createForeignKeys Returns a string containing the OHDSQL for creation of foreign keys in the OMOP CDM.
|
||||
#' @export
|
||||
createForeignKeys <- function(cdmVersion){
|
||||
|
||||
# argument checks
|
||||
stopifnot(is.character(cdmVersion), length(cdmVersion) == 1, cdmVersion %in% listSupportedVersions())
|
||||
|
||||
cdmFieldCsvLoc <- system.file(file.path("csv", paste0("OMOP_CDMv", cdmVersion, "_Field_Level.csv")), package = "CommonDataModel", mustWork = TRUE)
|
||||
cdmSpecs <- read.csv(cdmFieldCsvLoc, stringsAsFactors = FALSE)
|
||||
|
||||
foreignKeys <- subset(cdmSpecs, isForeignKey == "Yes")
|
||||
foreignKeys$key <- paste0(foreignKeys$cdmTableName, "_", foreignKeys$cdmFieldName)
|
||||
|
||||
sql_result <- c(paste0("--@targetDialect CDM Foreign Key Constraints for OMOP Common Data Model ", cdmVersion, "\n"))
|
||||
for (foreignKey in foreignKeys$key){
|
||||
|
||||
subquery <- subset(foreignKeys, foreignKeys$key==foreignKey)
|
||||
|
||||
sql_result <- c(sql_result, paste0("\nALTER TABLE @cdmDatabaseSchema.", subquery$cdmTableName, " ADD CONSTRAINT fpk_", subquery$cdmTableName, "_", subquery$cdmFieldName, " FOREIGN KEY (", subquery$cdmFieldName , ") REFERENCES @cdmDatabaseSchema.", subquery$fkTableName, " (", subquery$fkFieldName, ");\n"))
|
||||
|
||||
}
|
||||
return(paste0(sql_result, collapse = ""))
|
||||
}
|
||||
|
|
|
@ -1,38 +0,0 @@
|
|||
# Copyright 2019 Observational Health Data Sciences and Informatics
|
||||
#
|
||||
# This file is part of CdmDdlBase
|
||||
#
|
||||
# Licensed under the Apache License, Version 2.0 (the "License");
|
||||
# you may not use this file except in compliance with the License.
|
||||
# You may obtain a copy of the License at
|
||||
#
|
||||
# http://www.apache.org/licenses/LICENSE-2.0
|
||||
#
|
||||
# Unless required by applicable law or agreed to in writing, software
|
||||
# distributed under the License is distributed on an "AS IS" BASIS,
|
||||
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
# See the License for the specific language governing permissions and
|
||||
# limitations under the License.
|
||||
|
||||
#' Create a foreign key sql script from two csv files that detail the OMOP CDM Specifications.
|
||||
|
||||
#' @param cdmVersionNum The version of the CDM you are creating, e.g. 5.3.1
|
||||
#' @export
|
||||
|
||||
createForeignKeys <- function(cdmVersion = cdmVersion){
|
||||
cdmFieldCsvLoc <- paste0("inst/csv/OMOP_CDMv", cdmVersion, "_Field_Level.csv")
|
||||
cdmSpecs <- read.csv(cdmFieldCsvLoc, stringsAsFactors = FALSE)
|
||||
|
||||
foreignKeys <- subset(cdmSpecs, isForeignKey == "Yes")
|
||||
foreignKeys$key <- paste0(foreignKeys$cdmTableName, "_", foreignKeys$cdmFieldName)
|
||||
|
||||
sql_result <- c(paste0("--@targetdialect CDM Foreign Key Constraints for OMOP Common Data Model ", cdmVersion, "\n"))
|
||||
for (foreignKey in foreignKeys$key){
|
||||
|
||||
subquery <- subset(foreignKeys, foreignKeys$key==foreignKey)
|
||||
|
||||
sql_result <- c(sql_result, paste0("\nALTER TABLE @cdmDatabaseSchema.", subquery$cdmTableName, " ADD CONSTRAINT fpk_", subquery$cdmTableName, "_", subquery$cdmFieldName, " FOREIGN KEY (", subquery$cdmFieldName , ") REFERENCES @cdmDatabaseSchema.", subquery$fkTableName, " (", subquery$fkFieldName, ");\n"))
|
||||
|
||||
}
|
||||
return(paste0(sql_result, collapse = ""))
|
||||
}
|
|
@ -1,38 +0,0 @@
|
|||
# Copyright 2019 Observational Health Data Sciences and Informatics
|
||||
#
|
||||
# This file is part of CdmDdlBase
|
||||
#
|
||||
# Licensed under the Apache License, Version 2.0 (the "License");
|
||||
# you may not use this file except in compliance with the License.
|
||||
# You may obtain a copy of the License at
|
||||
#
|
||||
# http://www.apache.org/licenses/LICENSE-2.0
|
||||
#
|
||||
# Unless required by applicable law or agreed to in writing, software
|
||||
# distributed under the License is distributed on an "AS IS" BASIS,
|
||||
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
# See the License for the specific language governing permissions and
|
||||
# limitations under the License.
|
||||
|
||||
#' Create a primary key sql script from two csv files that detail the OMOP CDM Specifications.
|
||||
|
||||
#' @param cdmVersionNum The version of the CDM you are creating, e.g. 5.3
|
||||
#' @export
|
||||
|
||||
createPrimaryKeys <- function(cdmVersion = cdmVersion){
|
||||
cdmFieldCsvLoc <- paste0("inst/csv/OMOP_CDMv", cdmVersion, "_Field_Level.csv")
|
||||
cdmSpecs <- read.csv(cdmFieldCsvLoc, stringsAsFactors = FALSE)
|
||||
|
||||
primaryKeys <- subset(cdmSpecs, isPrimaryKey == "Yes")
|
||||
pkFields <- primaryKeys$cdmFieldName
|
||||
|
||||
sql_result <- c(paste0("--@targetdialect CDM Primary Key Constraints for OMOP Common Data Model ", cdmVersion, "\n"))
|
||||
for (pkField in pkFields){
|
||||
|
||||
subquery <- subset(primaryKeys, cdmFieldName==pkField)
|
||||
|
||||
sql_result <- c(sql_result, paste0("\nALTER TABLE @cdmDatabaseSchema.", subquery$cdmTableName, " ADD CONSTRAINT xpk_", subquery$cdmTableName, " PRIMARY KEY NONCLUSTERED (", subquery$cdmFieldName , ");\n"))
|
||||
|
||||
}
|
||||
return(paste0(sql_result, collapse = ""))
|
||||
}
|
|
@ -11,7 +11,8 @@
|
|||
#'
|
||||
#' @examples
|
||||
#' \dontrun{
|
||||
#' downloadCurrentDdl("OHDSI/CommonDataModel", pathToCsv="Sql%20Server/OMOP%20CDM%20sql%20server%20ddl.txt")
|
||||
#' downloadCurrentDdl("OHDSI/CommonDataModel",
|
||||
#' pathToCsv="Sql%20Server/OMOP%20CDM%20sql%20server%20ddl.txt")
|
||||
#' }
|
||||
#'
|
||||
#' @export
|
||||
|
|
|
@ -0,0 +1,86 @@
|
|||
# Copyright 2019 Observational Health Data Sciences and Informatics
|
||||
#
|
||||
# This file is part of CdmDdlBase
|
||||
#
|
||||
# Licensed under the Apache License, Version 2.0 (the "License");
|
||||
# you may not use this file except in compliance with the License.
|
||||
# You may obtain a copy of the License at
|
||||
#
|
||||
# http://www.apache.org/licenses/LICENSE-2.0
|
||||
#
|
||||
# Unless required by applicable law or agreed to in writing, software
|
||||
# distributed under the License is distributed on an "AS IS" BASIS,
|
||||
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
# See the License for the specific language governing permissions and
|
||||
# limitations under the License.
|
||||
|
||||
#' Generate and execute the DDL on a database
|
||||
#'
|
||||
#' This function will generate the DDL for a specific dbms and CDM version and
|
||||
#' then execute the DDL on a database.
|
||||
#'
|
||||
#' @param connectionDetails An object of class connectionDetails as created by the DatabaseConnector::createConnectionDetails function.
|
||||
#' @param cdmVersion The version of the CDM you are creating, e.g. 5.3, 5.4
|
||||
#' @param cdmDatabaseSchema The schema of the CDM instance where the DDL will be run. For example, this would be "ohdsi.dbo" when testing on sql server.
|
||||
#' @param executeDdl Should the DDL be executed? TRUE or FALSE
|
||||
#' @param executePrimaryKey Should the primary keys be added? TRUE or FALSE
|
||||
#' @param executeForeignKey Should the foreign keys be added? TRUE or FALSE
|
||||
#' @param ... Other arguments passed on to DatabaseConnector::executeSql. (This allows the user to set the path to errorReportFile.)
|
||||
#' @export
|
||||
#'
|
||||
#' @examples
|
||||
#' \dontrun{
|
||||
#' executeDdl(connectionDetails = connectionDetails,
|
||||
#' cdmVersion = "5.4",
|
||||
#' cdmDatabaseSchema = "myCdm")
|
||||
#'}
|
||||
executeDdl <- function(connectionDetails,
|
||||
cdmVersion,
|
||||
cdmDatabaseSchema,
|
||||
executeDdl = TRUE,
|
||||
executePrimaryKey = TRUE,
|
||||
executeForeignKey = TRUE,
|
||||
...) {
|
||||
|
||||
outputpath <- tempdir(check = TRUE)
|
||||
|
||||
|
||||
if(executeDdl) {
|
||||
filename <- writeDdl(targetDialect = connectionDetails$dbms,
|
||||
cdmVersion = cdmVersion,
|
||||
cdmDatabaseSchema = cdmDatabaseSchema,
|
||||
outputpath = outputpath)
|
||||
|
||||
sql <- readr::read_file(file.path(outputpath, filename))
|
||||
} else {
|
||||
sql <- ""
|
||||
}
|
||||
|
||||
if(executePrimaryKey) {
|
||||
filename <- writePrimaryKeys(targetDialect = connectionDetails$dbms,
|
||||
cdmVersion = cdmVersion,
|
||||
cdmDatabaseSchema = cdmDatabaseSchema,
|
||||
outputpath = outputpath)
|
||||
|
||||
sql <- paste(sql, readr::read_file(file.path(outputpath, filename)), sep = "\n")
|
||||
}
|
||||
|
||||
if(executeForeignKey) {
|
||||
filename <- writeForeignKeys(targetDialect = connectionDetails$dbms,
|
||||
cdmVersion = cdmVersion,
|
||||
cdmDatabaseSchema = cdmDatabaseSchema,
|
||||
outputpath = outputpath)
|
||||
|
||||
sql <- paste(sql, readr::read_file(file.path(outputpath, filename)), sep = "\n")
|
||||
}
|
||||
|
||||
con <- DatabaseConnector::connect(connectionDetails = connectionDetails)
|
||||
|
||||
DatabaseConnector::executeSql(con, sql = sql, ...)
|
||||
|
||||
DatabaseConnector::disconnect(con)
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
108
R/writeDDL.R
108
R/writeDDL.R
|
@ -16,22 +16,108 @@
|
|||
|
||||
#' Write DDL script
|
||||
#'
|
||||
#' @param targetdialect The dialect of the target database. Choices are "oracle", "postgresql", "pdw", "redshift", "impala", "netezza", "bigquery", "sql server"
|
||||
#' @param cdmVersion The version of the CDM for which you are creating the DDL. e.g. 5.3.1
|
||||
#' Write the DDL to a SQL file. The SQL will be rendered (parameters replaced) and translated to the target SQL
|
||||
#' dialect. By default the @cdmDatabaseSchema parameter is kept in the SQL file and needs to be replaced before
|
||||
#' execution.
|
||||
#'
|
||||
#' @param targetDialect The dialect of the target database. Choices are "oracle", "postgresql", "pdw", "redshift", "impala", "netezza", "bigquery", "sql server"
|
||||
#' @param cdmVersion The version of the CDM you are creating, e.g. 5.3, 5.4
|
||||
#' @param outputpath The directory or folder where the SQL file should be saved.
|
||||
#' @param cdmDatabaseSchema The schema of the CDM instance where the DDL will be run. For example, this would be "ohdsi.dbo" when testing on sql server.
|
||||
#' Defaults to "@cdmDatabaseSchema"
|
||||
#'
|
||||
#' @export
|
||||
writeDDL <- function(targetdialect, cdmVersion, cdmDatabaseSchema = "@cdmDatabaseSchema") {
|
||||
outputpath <- file.path("ddl", cdmVersion, targetdialect)
|
||||
dir.create(outputpath, showWarnings = FALSE, recursive = TRUE)
|
||||
writeDdl <- function(targetDialect, cdmVersion, outputpath, cdmDatabaseSchema = "@cdmDatabaseSchema") {
|
||||
|
||||
# argument checks
|
||||
stopifnot(targetDialect %in% c("oracle", "postgresql", "pdw", "redshift", "impala", "netezza", "bigquery", "sql server"))
|
||||
stopifnot(cdmVersion %in% listSupportedVersions())
|
||||
stopifnot(is.character(cdmDatabaseSchema))
|
||||
|
||||
if(missing(outputpath)) {
|
||||
outputpath <- file.path("ddl", cdmVersion, gsub(" ", "_", targetDialect))
|
||||
}
|
||||
|
||||
if(!dir.exists(outputpath)) dir.create(outputpath, showWarnings = FALSE, recursive = TRUE)
|
||||
|
||||
sql <- createDdl(cdmVersion)
|
||||
sql <- SqlRender::render(sql = sql, cdmDatabaseSchema = cdmDatabaseSchema, targetdialect = targetdialect)
|
||||
sql <- SqlRender::translate(sql, targetDialect = targetdialect)
|
||||
sql <- SqlRender::render(sql = sql, cdmDatabaseSchema = cdmDatabaseSchema, targetDialect = targetDialect)
|
||||
sql <- SqlRender::translate(sql, targetDialect = targetDialect)
|
||||
|
||||
filename <- paste("OMOPCDM", targetdialect, cdmVersion, "ddl.sql", sep = "_")
|
||||
SqlRender::writeSql(sql = sql,
|
||||
targetFile = file.path(outputpath, filename)
|
||||
)
|
||||
filename <- paste("OMOPCDM", gsub(" ", "_", targetDialect), cdmVersion, "ddl.sql", sep = "_")
|
||||
SqlRender::writeSql(sql = sql, targetFile = file.path(outputpath, filename))
|
||||
invisible(filename)
|
||||
}
|
||||
|
||||
#' @describeIn writeDdl writePrimaryKeys Write the SQL code that creates the primary keys to a file.
|
||||
#' @export
|
||||
writePrimaryKeys <- function(targetDialect, cdmVersion, outputpath, cdmDatabaseSchema = "@cdmDatabaseSchema") {
|
||||
|
||||
# argument checks
|
||||
stopifnot(targetDialect %in% c("oracle", "postgresql", "pdw", "redshift", "impala", "netezza", "bigquery", "sql server"))
|
||||
stopifnot(cdmVersion %in% listSupportedVersions())
|
||||
stopifnot(is.character(cdmDatabaseSchema))
|
||||
|
||||
if(missing(outputpath)) {
|
||||
outputpath <- file.path("ddl", cdmVersion, gsub(" ", "_", targetDialect))
|
||||
}
|
||||
|
||||
if(!dir.exists(outputpath)) dir.create(outputpath, showWarnings = FALSE, recursive = TRUE)
|
||||
|
||||
sql <- createPrimaryKeys(cdmVersion)
|
||||
sql <- SqlRender::render(sql = sql, cdmDatabaseSchema = cdmDatabaseSchema, targetDialect = targetDialect)
|
||||
sql <- SqlRender::translate(sql, targetDialect = targetDialect)
|
||||
|
||||
filename <- paste("OMOPCDM", gsub(" ", "_", targetDialect), cdmVersion, "primary", "keys.sql", sep = "_")
|
||||
SqlRender::writeSql(sql = sql, targetFile = file.path(outputpath, filename))
|
||||
invisible(filename)
|
||||
}
|
||||
|
||||
#' @describeIn writeDdl writeForeignKeys Write the SQL code that creates the foreign keys to a file.
|
||||
#' @export
|
||||
writeForeignKeys <- function(targetDialect, cdmVersion, outputpath, cdmDatabaseSchema = "@cdmDatabaseSchema") {
|
||||
|
||||
# argument checks
|
||||
stopifnot(targetDialect %in% c("oracle", "postgresql", "pdw", "redshift", "impala", "netezza", "bigquery", "sql server"))
|
||||
stopifnot(cdmVersion %in% listSupportedVersions())
|
||||
stopifnot(is.character(cdmDatabaseSchema))
|
||||
|
||||
if(missing(outputpath)) {
|
||||
outputpath <- file.path("ddl", cdmVersion, gsub(" ", "_", targetDialect))
|
||||
}
|
||||
|
||||
if(!dir.exists(outputpath)) dir.create(outputpath, showWarnings = FALSE, recursive = TRUE)
|
||||
|
||||
sql <- createForeignKeys(cdmVersion)
|
||||
sql <- SqlRender::render(sql = sql, cdmDatabaseSchema = cdmDatabaseSchema, targetDialect = targetDialect)
|
||||
sql <- SqlRender::translate(sql, targetDialect = targetDialect)
|
||||
|
||||
filename <- paste("OMOPCDM", gsub(" ", "_", targetDialect), cdmVersion, "constraints.sql", sep = "_")
|
||||
SqlRender::writeSql(sql = sql, targetFile = file.path(outputpath, filename))
|
||||
invisible(filename)
|
||||
}
|
||||
|
||||
#' @describeIn writeDdl writeIndex Write the rendered and translated sql that creates recommended indexes to a file.
|
||||
#' @export
|
||||
writeIndex <- function(targetDialect, cdmVersion, outputpath, cdmDatabaseSchema = "@cdmDatabaseSchema") {
|
||||
|
||||
# argument checks
|
||||
stopifnot(targetDialect %in% c("oracle", "postgresql", "pdw", "redshift", "impala", "netezza", "bigquery", "sql server"))
|
||||
stopifnot(cdmVersion %in% listSupportedVersions())
|
||||
stopifnot(is.character(cdmDatabaseSchema))
|
||||
|
||||
if(missing(outputpath)) {
|
||||
outputpath <- file.path("ddl", cdmVersion, gsub(" ", "_", targetDialect))
|
||||
}
|
||||
|
||||
if(!dir.exists(outputpath)) dir.create(outputpath, showWarnings = FALSE, recursive = TRUE)
|
||||
|
||||
sqlFilename <- paste0("OMOP_CDM_indices_v", cdmVersion, ".sql")
|
||||
sql <- readr::read_file(system.file(file.path("sql", "sql_server", sqlFilename), package = "CommonDataModel"))
|
||||
sql <- SqlRender::render(sql, targetDialect = targetDialect, cdmDatabaseSchema = cdmDatabaseSchema)
|
||||
sql <- SqlRender::translate(sql, targetDialect = targetDialect)
|
||||
|
||||
filename <- paste("OMOPCDM", gsub(" ", "_", targetDialect), cdmVersion, "indices.sql", sep = "_")
|
||||
SqlRender::writeSql(sql = sql, targetFile = file.path(outputpath, filename))
|
||||
invisible(filename)
|
||||
}
|
||||
|
|
|
@ -1,36 +0,0 @@
|
|||
# Copyright 2017 Observational Health Data Sciences and Informatics
|
||||
#
|
||||
#
|
||||
# Licensed under the Apache License, Version 2.0 (the "License");
|
||||
# you may not use this file except in compliance with the License.
|
||||
# You may obtain a copy of the License at
|
||||
#
|
||||
# http://www.apache.org/licenses/LICENSE-2.0
|
||||
#
|
||||
# Unless required by applicable law or agreed to in writing, software
|
||||
# distributed under the License is distributed on an "AS IS" BASIS,
|
||||
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
# See the License for the specific language governing permissions and
|
||||
# limitations under the License.
|
||||
|
||||
#' Write constraint script
|
||||
#'
|
||||
#' @param targetdialect The dialect of the target database. Choices are "oracle", "postgresql", "pdw", "redshift", "impala", "netezza", "bigquery", "sql server"
|
||||
#' @param cdmVersion The version of the CDM that you are creating the primary keys for
|
||||
#' @param cdmDatabaseSchema The name of the schema where the cdm sits. Defaults to "@cdmDatabaseSchema"
|
||||
#'
|
||||
#' @export
|
||||
|
||||
writeForeignKeys <- function(targetdialect, cdmVersion, cdmDatabaseSchema = "@cdmDatabaseSchema") {
|
||||
outputpath <- file.path("ddl", cdmVersion, targetdialect)
|
||||
dir.create(outputpath, showWarnings = FALSE, recursive = TRUE)
|
||||
|
||||
sql <- createForeignKeys(cdmVersion)
|
||||
sql <- SqlRender::render(sql = sql, cdmDatabaseSchema = cdmDatabaseSchema, targetdialect = targetdialect)
|
||||
sql <- SqlRender::translate(sql, targetDialect = targetdialect)
|
||||
|
||||
filename <- paste("OMOPCDM", targetdialect, cdmVersion, "constraints.sql", sep = "_")
|
||||
SqlRender::writeSql(sql = sql,
|
||||
targetFile = file.path(outputpath, filename)
|
||||
)
|
||||
}
|
|
@ -1,38 +0,0 @@
|
|||
# Copyright 2017 Observational Health Data Sciences and Informatics
|
||||
#
|
||||
# This file is part of DDLGeneratr
|
||||
#
|
||||
# Licensed under the Apache License, Version 2.0 (the "License");
|
||||
# you may not use this file except in compliance with the License.
|
||||
# You may obtain a copy of the License at
|
||||
#
|
||||
# http://www.apache.org/licenses/LICENSE-2.0
|
||||
#
|
||||
# Unless required by applicable law or agreed to in writing, software
|
||||
# distributed under the License is distributed on an "AS IS" BASIS,
|
||||
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
# See the License for the specific language governing permissions and
|
||||
# limitations under the License.
|
||||
|
||||
#' Write Index script
|
||||
#'
|
||||
#' @param targetdialect The dialect of the target database. Choices are "oracle", "postgresql", "pdw", "redshift", "impala", "netezza", "bigquery", "sql server"
|
||||
#' @param cdmVersion The version of the CDM that you are creating the indices for. e.g. 5.3.1
|
||||
#' @param cdmDatabaseSchema The name of the schema where the cdm sits. Defaults to "@cdmDatabaseSchema"
|
||||
#'
|
||||
#' @export
|
||||
writeIndex <- function(targetdialect, cdmVersion, cdmDatabaseSchema = "@cdmDatabaseSchema") {
|
||||
outputpath <- file.path("ddl", cdmVersion, targetdialect)
|
||||
dir.create(outputpath, showWarnings = FALSE, recursive = TRUE)
|
||||
|
||||
sqlFilename <- paste0("OMOP CDM indices v", cdmVersion, ".sql")
|
||||
sql <- SqlRender::loadRenderTranslateSql(sqlFilename = sqlFilename,
|
||||
packageName = "CdmDdlBase",
|
||||
dbms = targetdialect,
|
||||
targetdialect = targetdialect,
|
||||
cdmDatabaseSchema = cdmDatabaseSchema)
|
||||
|
||||
filename <- paste("OMOPCDM", targetdialect, cdmVersion, "indices.sql", sep = "_")
|
||||
SqlRender::writeSql(sql = sql,
|
||||
targetFile = file.path(outputpath, filename))
|
||||
}
|
|
@ -1,37 +0,0 @@
|
|||
# Copyright 2017 Observational Health Data Sciences and Informatics
|
||||
#
|
||||
# This file is part of DDLGeneratr
|
||||
#
|
||||
# Licensed under the Apache License, Version 2.0 (the "License");
|
||||
# you may not use this file except in compliance with the License.
|
||||
# You may obtain a copy of the License at
|
||||
#
|
||||
# http://www.apache.org/licenses/LICENSE-2.0
|
||||
#
|
||||
# Unless required by applicable law or agreed to in writing, software
|
||||
# distributed under the License is distributed on an "AS IS" BASIS,
|
||||
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
# See the License for the specific language governing permissions and
|
||||
# limitations under the License.
|
||||
|
||||
#' Write primary key script
|
||||
#'
|
||||
#' @param targetdialect The dialect of the target database. Choices are "oracle", "postgresql", "pdw", "redshift", "impala", "netezza", "bigquery", "sql server"
|
||||
#' @param cdmVersion The version of the CDM that you are creating the primary keys for
|
||||
#' @param cdmDatabaseSchema The name of the schema where the cdm sits. Defaults to "@cdmDatabaseSchema"
|
||||
#'
|
||||
#' @export
|
||||
|
||||
writePrimaryKeys <- function(targetdialect, cdmVersion, cdmDatabaseSchema = "@cdmDatabaseSchema") {
|
||||
outputpath <- file.path("ddl", cdmVersion, targetdialect)
|
||||
dir.create(outputpath, showWarnings = FALSE, recursive = TRUE)
|
||||
|
||||
sql <- createPrimaryKeys(cdmVersion)
|
||||
sql <- SqlRender::render(sql = sql, cdmDatabaseSchema = cdmDatabaseSchema, targetdialect = targetdialect)
|
||||
sql <- SqlRender::translate(sql, targetDialect = targetdialect)
|
||||
|
||||
filename <- paste("OMOPCDM", targetdialect, cdmVersion, "primary", "keys.sql", sep = "_")
|
||||
SqlRender::writeSql(sql = sql,
|
||||
targetFile = file.path(outputpath, filename)
|
||||
)
|
||||
}
|
|
@ -1,26 +0,0 @@
|
|||
DBMS:
|
||||
sql server
|
||||
|
||||
Error:
|
||||
com.microsoft.sqlserver.jdbc.SQLServerException: 'fpk_NOTE_person_id' is not a constraint.
|
||||
|
||||
SQL:
|
||||
ALTER TABLE ohdsi.dbo.NOTE DROP CONSTRAINT fpk_NOTE_person_id
|
||||
|
||||
R version:
|
||||
R version 3.4.2 (2017-09-28)
|
||||
|
||||
Platform:
|
||||
x86_64-w64-mingw32
|
||||
|
||||
Attached base packages:
|
||||
- stats
|
||||
- graphics
|
||||
- grDevices
|
||||
- utils
|
||||
- datasets
|
||||
- methods
|
||||
- base
|
||||
|
||||
Other attached packages:
|
||||
- CdmDdlBase (0.1.0)
|
|
@ -7,17 +7,17 @@ cdmVersion <- "5.3"
|
|||
supportedVersions <- listSupportedVersions()
|
||||
|
||||
for (cdmVersion in supportedVersions) {
|
||||
for (targetdialect in c("oracle", "postgresql", "pdw", "redshift", "impala", "netezza", "bigquery", "sql server")) {
|
||||
writeDDL(targetdialect = targetdialect,
|
||||
for (targetDialect in c("oracle", "postgresql", "pdw", "redshift", "impala", "netezza", "bigquery", "sql server")) {
|
||||
writeDdl(targetDialect = targetDialect,
|
||||
cdmVersion = cdmVersion)
|
||||
|
||||
writePrimaryKeys(targetdialect = targetdialect,
|
||||
writePrimaryKeys(targetDialect = targetDialect,
|
||||
cdmVersion = cdmVersion)
|
||||
|
||||
writeForeignKeys(targetdialect = targetdialect,
|
||||
writeForeignKeys(targetDialect = targetDialect,
|
||||
cdmVersion = cdmVersion)
|
||||
|
||||
writeIndex(targetdialect = targetdialect,
|
||||
writeIndex(targetDialect = targetDialect,
|
||||
cdmVersion = cdmVersion)
|
||||
}
|
||||
}
|
||||
|
|
|
@ -514,20 +514,4 @@ ATTRIBUTE_DEFINITION,attribute_name,Yes,varchar(255),,,No,No,,,,,
|
|||
ATTRIBUTE_DEFINITION,attribute_description,No,varchar(MAX),,,No,No,,,,,
|
||||
ATTRIBUTE_DEFINITION,attribute_type_concept_id,Yes,integer,,,No,Yes,CONCEPT,CONCEPT_ID,,,
|
||||
ATTRIBUTE_DEFINITION,attribute_syntax,No,varchar(MAX),,,No,No,,,,,
|
||||
=======
|
||||
1-Jan-1970.",,No,No,,,,,
|
||||
DRUG_STRENGTH,valid_end_date,Yes,date,The date when then Concept became invalid.,,No,No,,,,,
|
||||
DRUG_STRENGTH,invalid_reason,No,varchar(1),"Reason the concept was invalidated. Possible values are D (deleted), U (replaced with an update) or NULL when valid_end_date has the default value.",,No,No,,,,,
|
||||
COHORT_DEFINITION,cohort_definition_id,Yes,integer,"This is the identifier given to the cohort, usually by the ATLAS application",,No,No,,,,,
|
||||
COHORT_DEFINITION,cohort_definition_name,Yes,varchar(255),A short description of the cohort,,No,No,,,,,
|
||||
COHORT_DEFINITION,cohort_definition_description,No,varchar(MAX),A complete description of the cohort.,,No,No,,,,,
|
||||
COHORT_DEFINITION,definition_type_concept_id,Yes,integer,Type defining what kind of Cohort Definition the record represents and how the syntax may be executed.,,No,Yes,CONCEPT,CONCEPT_ID,,,
|
||||
COHORT_DEFINITION,cohort_definition_syntax,No,varchar(MAX),Syntax or code to operationalize the Cohort Definition.,,No,No,,,,,
|
||||
COHORT_DEFINITION,subject_concept_id,Yes,integer,"This field contains a Concept that represents the domain of the subjects that are members of the cohort (e.g., Person, Provider, Visit).",,No,Yes,CONCEPT,CONCEPT_ID,,,
|
||||
COHORT_DEFINITION,cohort_initiation_date,No,date,A date to indicate when the Cohort was initiated in the COHORT table.,,No,No,,,,,
|
||||
ATTRIBUTE_DEFINITION,attribute_definition_id,Yes,integer,,,No,No,,,,,
|
||||
ATTRIBUTE_DEFINITION,attribute_name,Yes,varchar(255),,,No,No,,,,,
|
||||
ATTRIBUTE_DEFINITION,attribute_description,No,varchar(MAX),,,No,No,,,,,
|
||||
ATTRIBUTE_DEFINITION,attribute_type_concept_id,Yes,integer,,,No,Yes,CONCEPT,CONCEPT_ID,,,
|
||||
ATTRIBUTE_DEFINITION,attribute_syntax,No,varchar(MAX),,,No,No,,,,,
|
||||
>>>>>>> v5.4:inst/csv/OMOP_CDMv5.3.1_Field_Level.csv
|
||||
|
||||
|
|
Can't render this file because it has a wrong number of fields in line 517.
|
|
@ -1,4 +1,4 @@
|
|||
/*@targetdialect OMOP CDM Indices
|
||||
/*@targetDialect OMOP CDM Indices
|
||||
|
||||
There are no unique indices created because it is assumed that the primary key constraints have been run prior to
|
||||
implementing indices.
|
|
@ -1,4 +1,4 @@
|
|||
/*@targetdialect OMOP CDM Indices
|
||||
/*@targetDialect OMOP CDM Indices
|
||||
|
||||
There are no unique indices created because it is assumed that the primary key constraints have been run prior to
|
||||
implementing indices.
|
|
@ -1,4 +1,4 @@
|
|||
/*@targetdialect OMOP CDM Indices*/
|
||||
/*@targetDialect OMOP CDM Indices*/
|
||||
|
||||
|
||||
/************************
|
|
@ -1,24 +1,42 @@
|
|||
% Generated by roxygen2: do not edit by hand
|
||||
% Please edit documentation in R/createDdl.R
|
||||
% Please edit documentation in R/createdDdl.R
|
||||
\name{createDdl}
|
||||
\alias{createDdl}
|
||||
\title{Create a DDL script from a two csv files that detail the OMOP CDM Specifications. These files also form the basis of the CDM documentation and the Data Quality
|
||||
Dashboard.}
|
||||
\alias{createPrimaryKeys}
|
||||
\alias{createForeignKeys}
|
||||
\title{Create the OHDSI-SQL Common Data Model DDL code}
|
||||
\usage{
|
||||
createDdl(cdmVersion = cdmVersion)
|
||||
createDdl(cdmVersion)
|
||||
|
||||
createPrimaryKeys(cdmVersion)
|
||||
|
||||
createForeignKeys(cdmVersion)
|
||||
}
|
||||
\arguments{
|
||||
\item{cdmVersionNum}{The version of the CDM you are creating, e.g. 5.3.1}
|
||||
|
||||
\item{cdmTableCsvLoc}{The location of the csv file with the high-level CDM table information. This is defaulted to "inst/csv/OMOP_CDMv5.3.1_Table_Level.csv".
|
||||
If a new version of this file was committed to the CDM repository the package automatically will grab it and place it in "inst/csv/".}
|
||||
|
||||
\item{cdmFieldCsvLoc}{The location of the csv file with the CDM field information. This is defaulted to "inst/csv/OMOP_CDMv5.3.1_Field_Level.csv".
|
||||
If a new version of this file was committed to the CDM repository the package automatically will grab it and place it in "inst/csv/".}
|
||||
|
||||
\item{outputFile}{The name of the output ddl sql file. This is defaulted to a location in the inst/sql/sql server folder and named with today's date and the CDM version.}
|
||||
\item{cdmVersion}{The version of the CDM you are creating, e.g. 5.3, 5.4}
|
||||
}
|
||||
\value{
|
||||
A character string containing the OHDSQL DDL
|
||||
}
|
||||
\description{
|
||||
Create a DDL script from a two csv files that detail the OMOP CDM Specifications. These files also form the basis of the CDM documentation and the Data Quality
|
||||
The createDdl, createForeignKeys, and createPrimaryKeys functions each return a character string
|
||||
containing their respective DDL SQL code in OHDSQL dialect for a specific CDM version.
|
||||
The SQL they generate needs to be rendered and translated before it can be executed.
|
||||
}
|
||||
\details{
|
||||
The DDL SQL code is created from a two csv files that detail the OMOP CDM Specifications.
|
||||
These files also form the basis of the CDM documentation and the Data Quality
|
||||
Dashboard.
|
||||
}
|
||||
\section{Functions}{
|
||||
\itemize{
|
||||
\item \code{createPrimaryKeys}: createPrimaryKeys asdfladsfj
|
||||
|
||||
\item \code{createForeignKeys}: createForeignKeys asdfladsf
|
||||
}}
|
||||
|
||||
\examples{
|
||||
ddl <- createDdl("5.4")
|
||||
pk <- createPrimaryKeys("5.4")
|
||||
fk <- createForeignKeys("5.4")
|
||||
}
|
||||
|
|
|
@ -1,14 +0,0 @@
|
|||
% Generated by roxygen2: do not edit by hand
|
||||
% Please edit documentation in R/createForeignKeys.R
|
||||
\name{createForeignKeys}
|
||||
\alias{createForeignKeys}
|
||||
\title{Create a foreign key sql script from two csv files that detail the OMOP CDM Specifications.}
|
||||
\usage{
|
||||
createForeignKeys(cdmVersion = cdmVersion)
|
||||
}
|
||||
\arguments{
|
||||
\item{cdmVersionNum}{The version of the CDM you are creating, e.g. 5.3.1}
|
||||
}
|
||||
\description{
|
||||
Create a foreign key sql script from two csv files that detail the OMOP CDM Specifications.
|
||||
}
|
|
@ -1,14 +0,0 @@
|
|||
% Generated by roxygen2: do not edit by hand
|
||||
% Please edit documentation in R/createPrimaryKeys.R
|
||||
\name{createPrimaryKeys}
|
||||
\alias{createPrimaryKeys}
|
||||
\title{Create a primary key sql script from two csv files that detail the OMOP CDM Specifications.}
|
||||
\usage{
|
||||
createPrimaryKeys(cdmVersion = cdmVersion)
|
||||
}
|
||||
\arguments{
|
||||
\item{cdmVersionNum}{The version of the CDM you are creating, e.g. 5.3}
|
||||
}
|
||||
\description{
|
||||
Create a primary key sql script from two csv files that detail the OMOP CDM Specifications.
|
||||
}
|
|
@ -27,7 +27,8 @@ The default location is
|
|||
}
|
||||
\examples{
|
||||
\dontrun{
|
||||
downloadCurrentDdl("OHDSI/CommonDataModel", pathToCsv="Sql\%20Server/OMOP\%20CDM\%20sql\%20server\%20ddl.txt")
|
||||
downloadCurrentDdl("OHDSI/CommonDataModel",
|
||||
pathToCsv="Sql\%20Server/OMOP\%20CDM\%20sql\%20server\%20ddl.txt")
|
||||
}
|
||||
|
||||
}
|
||||
|
|
|
@ -0,0 +1,42 @@
|
|||
% Generated by roxygen2: do not edit by hand
|
||||
% Please edit documentation in R/executeDdl.R
|
||||
\name{executeDdl}
|
||||
\alias{executeDdl}
|
||||
\title{Generate and execute the DDL on a database}
|
||||
\usage{
|
||||
executeDdl(
|
||||
connectionDetails,
|
||||
cdmVersion,
|
||||
cdmDatabaseSchema,
|
||||
executeDdl = TRUE,
|
||||
executePrimaryKey = TRUE,
|
||||
executeForeignKey = TRUE,
|
||||
...
|
||||
)
|
||||
}
|
||||
\arguments{
|
||||
\item{connectionDetails}{An object of class connectionDetails as created by the DatabaseConnector::createConnectionDetails function.}
|
||||
|
||||
\item{cdmVersion}{The version of the CDM you are creating, e.g. 5.3, 5.4}
|
||||
|
||||
\item{cdmDatabaseSchema}{The schema of the CDM instance where the DDL will be run. For example, this would be "ohdsi.dbo" when testing on sql server.}
|
||||
|
||||
\item{executeDdl}{Should the DDL be executed? TRUE or FALSE}
|
||||
|
||||
\item{executePrimaryKey}{Should the primary keys be added? TRUE or FALSE}
|
||||
|
||||
\item{executeForeignKey}{Should the foreign keys be added? TRUE or FALSE}
|
||||
|
||||
\item{...}{Other arguments passed on to DatabaseConnector::executeSql. (This allows the user to set the path to errorReportFile.)}
|
||||
}
|
||||
\description{
|
||||
This function will generate the DDL for a specific dbms and CDM version and
|
||||
then execute the DDL on a database.
|
||||
}
|
||||
\examples{
|
||||
\dontrun{
|
||||
executeDdl(connectionDetails = connectionDetails,
|
||||
cdmVersion = "5.4",
|
||||
cdmDatabaseSchema = "myCdm")
|
||||
}
|
||||
}
|
|
@ -1,19 +1,61 @@
|
|||
% Generated by roxygen2: do not edit by hand
|
||||
% Please edit documentation in R/writeDDL.R
|
||||
\name{writeDDL}
|
||||
\alias{writeDDL}
|
||||
% Please edit documentation in R/writeDdl.R
|
||||
\name{writeDdl}
|
||||
\alias{writeDdl}
|
||||
\alias{writePrimaryKeys}
|
||||
\alias{writeForeignKeys}
|
||||
\alias{writeIndex}
|
||||
\title{Write DDL script}
|
||||
\usage{
|
||||
writeDDL(targetdialect, cdmVersion, cdmDatabaseSchema = "@cdmDatabaseSchema")
|
||||
writeDdl(
|
||||
targetDialect,
|
||||
cdmVersion,
|
||||
outputpath,
|
||||
cdmDatabaseSchema = "@cdmDatabaseSchema"
|
||||
)
|
||||
|
||||
writePrimaryKeys(
|
||||
targetDialect,
|
||||
cdmVersion,
|
||||
outputpath,
|
||||
cdmDatabaseSchema = "@cdmDatabaseSchema"
|
||||
)
|
||||
|
||||
writeForeignKeys(
|
||||
targetDialect,
|
||||
cdmVersion,
|
||||
outputpath,
|
||||
cdmDatabaseSchema = "@cdmDatabaseSchema"
|
||||
)
|
||||
|
||||
writeIndex(
|
||||
targetDialect,
|
||||
cdmVersion,
|
||||
outputpath,
|
||||
cdmDatabaseSchema = "@cdmDatabaseSchema"
|
||||
)
|
||||
}
|
||||
\arguments{
|
||||
\item{targetdialect}{The dialect of the target database. Choices are "oracle", "postgresql", "pdw", "redshift", "impala", "netezza", "bigquery", "sql server"}
|
||||
\item{targetDialect}{The dialect of the target database. Choices are "oracle", "postgresql", "pdw", "redshift", "impala", "netezza", "bigquery", "sql server"}
|
||||
|
||||
\item{cdmVersion}{The version of the CDM for which you are creating the DDL. e.g. 5.3.1}
|
||||
\item{cdmVersion}{The version of the CDM you are creating, e.g. 5.3, 5.4}
|
||||
|
||||
\item{outputpath}{The directory or folder where the SQL file should be saved.}
|
||||
|
||||
\item{cdmDatabaseSchema}{The schema of the CDM instance where the DDL will be run. For example, this would be "ohdsi.dbo" when testing on sql server.
|
||||
Defaults to "@cdmDatabaseSchema"}
|
||||
}
|
||||
\description{
|
||||
Write DDL script
|
||||
Write the DDL to a SQL file. The SQL will be rendered (parameters replaced) and translated to the target SQL
|
||||
dialect. By default the @cdmDatabaseSchema parameter is kept in the SQL file and needs to be replaced before
|
||||
execution.
|
||||
}
|
||||
\section{Functions}{
|
||||
\itemize{
|
||||
\item \code{writePrimaryKeys}: writePrimaryKeys Write the SQL code that creates the primary keys to a file.
|
||||
|
||||
\item \code{writeForeignKeys}: writeForeignKeys Write the SQL code that creates the foreign keys to a file.
|
||||
|
||||
\item \code{writeIndex}: writeIndex Write the rendered and translated sql that creates recommended indexes to a file.
|
||||
}}
|
||||
|
||||
|
|
|
@ -1,22 +0,0 @@
|
|||
% Generated by roxygen2: do not edit by hand
|
||||
% Please edit documentation in R/writeForeignKeys.R
|
||||
\name{writeForeignKeys}
|
||||
\alias{writeForeignKeys}
|
||||
\title{Write constraint script}
|
||||
\usage{
|
||||
writeForeignKeys(
|
||||
targetdialect,
|
||||
cdmVersion,
|
||||
cdmDatabaseSchema = "@cdmDatabaseSchema"
|
||||
)
|
||||
}
|
||||
\arguments{
|
||||
\item{targetdialect}{The dialect of the target database. Choices are "oracle", "postgresql", "pdw", "redshift", "impala", "netezza", "bigquery", "sql server"}
|
||||
|
||||
\item{cdmVersion}{The version of the CDM that you are creating the primary keys for}
|
||||
|
||||
\item{cdmDatabaseSchema}{The name of the schema where the cdm sits. Defaults to "@cdmDatabaseSchema"}
|
||||
}
|
||||
\description{
|
||||
Write constraint script
|
||||
}
|
|
@ -1,18 +0,0 @@
|
|||
% Generated by roxygen2: do not edit by hand
|
||||
% Please edit documentation in R/writeIndex.R
|
||||
\name{writeIndex}
|
||||
\alias{writeIndex}
|
||||
\title{Write Index script}
|
||||
\usage{
|
||||
writeIndex(targetdialect, cdmVersion, cdmDatabaseSchema = "@cdmDatabaseSchema")
|
||||
}
|
||||
\arguments{
|
||||
\item{targetdialect}{The dialect of the target database. Choices are "oracle", "postgresql", "pdw", "redshift", "impala", "netezza", "bigquery", "sql server"}
|
||||
|
||||
\item{cdmVersion}{The version of the CDM that you are creating the indices for. e.g. 5.3.1}
|
||||
|
||||
\item{cdmDatabaseSchema}{The name of the schema where the cdm sits. Defaults to "@cdmDatabaseSchema"}
|
||||
}
|
||||
\description{
|
||||
Write Index script
|
||||
}
|
|
@ -1,22 +0,0 @@
|
|||
% Generated by roxygen2: do not edit by hand
|
||||
% Please edit documentation in R/writePrimaryKeys.R
|
||||
\name{writePrimaryKeys}
|
||||
\alias{writePrimaryKeys}
|
||||
\title{Write primary key script}
|
||||
\usage{
|
||||
writePrimaryKeys(
|
||||
targetdialect,
|
||||
cdmVersion,
|
||||
cdmDatabaseSchema = "@cdmDatabaseSchema"
|
||||
)
|
||||
}
|
||||
\arguments{
|
||||
\item{targetdialect}{The dialect of the target database. Choices are "oracle", "postgresql", "pdw", "redshift", "impala", "netezza", "bigquery", "sql server"}
|
||||
|
||||
\item{cdmVersion}{The version of the CDM that you are creating the primary keys for}
|
||||
|
||||
\item{cdmDatabaseSchema}{The name of the schema where the cdm sits. Defaults to "@cdmDatabaseSchema"}
|
||||
}
|
||||
\description{
|
||||
Write primary key script
|
||||
}
|
|
@ -0,0 +1,21 @@
|
|||
# Download the JDBC drivers used in the tests
|
||||
|
||||
# oldJarFolder <- Sys.getenv("DATABASECONNECTOR_JAR_FOLDER")
|
||||
|
||||
driverPath <- file.path(Sys.getenv("HOME"), "drivers")
|
||||
if(!dir.exists(driverPath)) dir.create(driverPath)
|
||||
Sys.setenv("DATABASECONNECTOR_JAR_FOLDER" = driverPath)
|
||||
DatabaseConnector::downloadJdbcDrivers("postgresql", pathToDriver = driverPath)
|
||||
|
||||
print(Sys.getenv("DATABASECONNECTOR_JAR_FOLDER"))
|
||||
print(list.files(driverPath))
|
||||
# if(Sys.getenv("DATABASECONNECTOR_JAR_FOLDER") == "") {
|
||||
# driverPath <- file.path(Sys.getenv("HOME"), "drivers")
|
||||
# }
|
||||
# downloadJdbcDrivers("sql server")
|
||||
# downloadJdbcDrivers("oracle")
|
||||
|
||||
# withr::defer({
|
||||
# unlink(Sys.getenv("DATABASECONNECTOR_JAR_FOLDER"), recursive = TRUE, force = TRUE)
|
||||
# Sys.setenv("DATABASECONNECTOR_JAR_FOLDER" = oldJarFolder)
|
||||
# }, testthat::teardown_env())
|
|
@ -0,0 +1,4 @@
|
|||
library(testthat)
|
||||
library(CommonDataModel)
|
||||
|
||||
test_check("CommonDataModel")
|
|
@ -0,0 +1,38 @@
|
|||
test_that("createDdl works", {
|
||||
# for(cdmVersion in listSupportedVersions()) { # 5.3 ddl csv control file is currently messed up.
|
||||
cdmVersion <- "5.4"
|
||||
sql <- createDdl(cdmVersion)
|
||||
expect_type(sql, "character")
|
||||
expect_gt(nchar(sql), 10)
|
||||
# }
|
||||
|
||||
expect_error(createDdl(5.4))
|
||||
expect_error(createDdl("blah"))
|
||||
|
||||
})
|
||||
|
||||
test_that("createPrimaryKeys works", {
|
||||
# for(cdmVersion in listSupportedVersions()) {
|
||||
cdmVersion <- "5.4"
|
||||
sql <- createPrimaryKeys(cdmVersion)
|
||||
expect_type(sql, "character")
|
||||
expect_gt(nchar(sql), 10)
|
||||
# }
|
||||
|
||||
expect_error(createPrimaryKeys(5.4))
|
||||
expect_error(createPrimaryKeys("blah"))
|
||||
})
|
||||
|
||||
test_that("createForeignKeys works", {
|
||||
# for(cdmVersion in listSupportedVersions()) {
|
||||
cdmVersion <- "5.4"
|
||||
sql <- createForeignKeys(cdmVersion)
|
||||
expect_type(sql, "character")
|
||||
expect_gt(nchar(sql), 10)
|
||||
# }
|
||||
|
||||
expect_error(createForeignKeys(5.4))
|
||||
expect_error(createForeignKeys("blah"))
|
||||
})
|
||||
|
||||
|
|
@ -0,0 +1,84 @@
|
|||
library(DatabaseConnector)
|
||||
|
||||
connectionDetails <- createConnectionDetails(
|
||||
dbms = "postgresql",
|
||||
user = Sys.getenv("CDMDDLBASE_POSTGRESQL_USER"),
|
||||
password = Sys.getenv("CDMDDLBASE_POSTGRESQL_PASSWORD"),
|
||||
server = Sys.getenv("CDMDDLBASE_POSTGRESQL_SERVER"),
|
||||
pathToDriver = file.path(Sys.getenv("HOME"), "drivers")
|
||||
)
|
||||
|
||||
# Helper functions used in tests
|
||||
.listTablesInSchema <- function(connectionDetails, schema) {
|
||||
con <- DatabaseConnector::connect(connectionDetails)
|
||||
tables <- DBI::dbListObjects(con, prefix = "cdmddlbase")
|
||||
DatabaseConnector::disconnect(con)
|
||||
tables <- subset(tables, is_prefix == FALSE)
|
||||
tables <- subset(tables, grepl("table", table))$table
|
||||
tables <- vapply(tables, function(.) .@name, FUN.VALUE = character(1))
|
||||
return(tables)
|
||||
}
|
||||
|
||||
.dropAllTablesFromSchema <- function(connectionDetails, schema) {
|
||||
tables <- .listTablesInSchema(connectionDetails, schema)
|
||||
|
||||
con <- DatabaseConnector::connect(connectionDetails)
|
||||
for(table in tables) {
|
||||
DBI::dbRemoveTable(con, name = DBI::SQL(paste(schema, table, sep = ".")))
|
||||
}
|
||||
DatabaseConnector::disconnect(con)
|
||||
}
|
||||
|
||||
.removeConstraintsPostgresql <- function(connectionDetails, schema) {
|
||||
# the order of removal of constraints matters!
|
||||
con <- DatabaseConnector::connect(connectionDetails)
|
||||
constraints <- DBI::dbGetQuery(con,
|
||||
"SELECT con.conname, rel.relname as relname
|
||||
FROM pg_catalog.pg_constraint con
|
||||
INNER JOIN pg_catalog.pg_class rel
|
||||
ON rel.oid = con.conrelid
|
||||
INNER JOIN pg_catalog.pg_namespace nsp
|
||||
ON nsp.oid = connamespace
|
||||
WHERE nsp.nspname = 'cdmddlbase';")
|
||||
|
||||
|
||||
constraints <- dplyr::mutate(constraints, sql = paste0("alter table ", schema, ".", relname, " drop constraint if exists ", conname, ";\n" ))
|
||||
|
||||
sql <- paste(rev(constraints$sql), collapse = "")
|
||||
executeSql(con, sql)
|
||||
|
||||
disconnect(con)
|
||||
|
||||
}
|
||||
|
||||
test_that("Database can be connected to", {
|
||||
expect_error(con <- connect(connectionDetails), NA)
|
||||
disconnect(con)
|
||||
})
|
||||
|
||||
test_that("Execute DDL on Postgres", {
|
||||
# make sure the schema is cleared out
|
||||
cdmDatabaseSchema <- Sys.getenv("CDMDDLBASE_POSTGRESQL_SCHEMA")
|
||||
cdmVersion <- "5.4"
|
||||
# .removeConstraintsPostgresql(connectionDetails, cdmDatabaseSchema)
|
||||
.dropAllTablesFromSchema(connectionDetails, cdmDatabaseSchema)
|
||||
cat(paste("Connecting to schema", cdmDatabaseSchema, "\n"))
|
||||
executeDdl(connectionDetails,
|
||||
cdmVersion = cdmVersion,
|
||||
cdmDatabaseSchema = cdmDatabaseSchema,
|
||||
executeDdl = TRUE,
|
||||
executePrimaryKey = FALSE,
|
||||
executeForeignKey = FALSE)
|
||||
|
||||
tables <- .listTablesInSchema(connectionDetails, schema = cdmDatabaseSchema)
|
||||
|
||||
cdmTableCsvLoc <- system.file(file.path("csv", paste0("OMOP_CDMv", cdmVersion, "_Table_Level.csv")), package = "CommonDataModel", mustWork = TRUE)
|
||||
tableSpecs <- read.csv(cdmTableCsvLoc, stringsAsFactors = FALSE)$cdmTableName
|
||||
|
||||
# check that the tables in the database match the tables in the specification
|
||||
expect_equal(sort(tables), sort(tableSpecs))
|
||||
|
||||
# clear schema
|
||||
# .removeConstraintsPostgresql(connectionDetails, cdmDatabaseSchema)
|
||||
.dropAllTablesFromSchema(connectionDetails, cdmDatabaseSchema)
|
||||
})
|
|
@ -0,0 +1,51 @@
|
|||
test_that("writeDdl works", {
|
||||
|
||||
outputpath <- tempdir(TRUE)
|
||||
filename <- writeDdl(targetDialect = "postgresql", cdmVersion = "5.4", outputpath = outputpath)
|
||||
|
||||
expect_true(file.exists(file.path(outputpath, filename)))
|
||||
sql <- readr::read_file(file.path(outputpath, filename))
|
||||
|
||||
expect_type(sql, "character")
|
||||
expect_gt(nchar(sql), 10)
|
||||
|
||||
})
|
||||
|
||||
test_that("writePrimaryKeys works", {
|
||||
|
||||
outputpath <- tempdir(TRUE)
|
||||
filename <- writePrimaryKeys(targetDialect = "postgresql", cdmVersion = "5.4", outputpath = outputpath)
|
||||
|
||||
expect_true(file.exists(file.path(outputpath, filename)))
|
||||
sql <- readr::read_file(file.path(outputpath, filename))
|
||||
|
||||
expect_type(sql, "character")
|
||||
expect_gt(nchar(sql), 10)
|
||||
|
||||
})
|
||||
|
||||
test_that("writeForeignKeys works", {
|
||||
|
||||
outputpath <- tempdir(TRUE)
|
||||
filename <- writeForeignKeys(targetDialect = "postgresql", cdmVersion = "5.4", outputpath = outputpath)
|
||||
|
||||
expect_true(file.exists(file.path(outputpath, filename)))
|
||||
sql <- readr::read_file(file.path(outputpath, filename))
|
||||
|
||||
expect_type(sql, "character")
|
||||
expect_gt(nchar(sql), 10)
|
||||
|
||||
})
|
||||
|
||||
test_that("writeIndex works", {
|
||||
|
||||
outputpath <- tempdir(TRUE)
|
||||
filename <- writeIndex(targetDialect = "postgresql", cdmVersion = "5.4", outputpath = outputpath)
|
||||
|
||||
expect_true(file.exists(file.path(outputpath, filename)))
|
||||
sql <- readr::read_file(file.path(outputpath, filename))
|
||||
|
||||
expect_type(sql, "character")
|
||||
expect_gt(nchar(sql), 10)
|
||||
|
||||
})
|
Loading…
Reference in New Issue