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$
|
||||||
^\.Rproj\.user$
|
^\.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
|
Type: Package
|
||||||
Title: OMOP CDM DDL and Documentation Generator
|
Title: OMOP CDM DDL and Documentation Generator
|
||||||
Version: 0.1.0
|
Version: 0.1.0
|
||||||
|
@ -14,6 +14,15 @@ Imports:
|
||||||
rmarkdown,
|
rmarkdown,
|
||||||
stringr,
|
stringr,
|
||||||
readxl,
|
readxl,
|
||||||
dplyr
|
DatabaseConnector,
|
||||||
|
DBI,
|
||||||
|
dplyr,
|
||||||
|
readr
|
||||||
|
Suggests:
|
||||||
|
knitr,
|
||||||
|
testthat (>= 3.0.0),
|
||||||
|
RSQLite,
|
||||||
|
withr
|
||||||
NeedsCompilation: no
|
NeedsCompilation: no
|
||||||
RoxygenNote: 7.1.1
|
RoxygenNote: 7.1.1
|
||||||
|
Config/testthat/edition: 3
|
||||||
|
|
|
@ -4,9 +4,10 @@ export(createDdl)
|
||||||
export(createForeignKeys)
|
export(createForeignKeys)
|
||||||
export(createPrimaryKeys)
|
export(createPrimaryKeys)
|
||||||
export(downloadCurrentDdl)
|
export(downloadCurrentDdl)
|
||||||
|
export(executeDdl)
|
||||||
export(listSupportedVersions)
|
export(listSupportedVersions)
|
||||||
export(parseWiki)
|
export(parseWiki)
|
||||||
export(writeDDL)
|
export(writeDdl)
|
||||||
export(writeForeignKeys)
|
export(writeForeignKeys)
|
||||||
export(writeIndex)
|
export(writeIndex)
|
||||||
export(writePrimaryKeys)
|
export(writePrimaryKeys)
|
||||||
|
|
|
@ -1,4 +1,3 @@
|
||||||
|
|
||||||
# Copyright 2019 Observational Health Data Sciences and Informatics
|
# Copyright 2019 Observational Health Data Sciences and Informatics
|
||||||
#
|
#
|
||||||
# This file is part of CdmDdlBase
|
# This file is part of CdmDdlBase
|
||||||
|
@ -15,21 +14,30 @@
|
||||||
# See the License for the specific language governing permissions and
|
# See the License for the specific language governing permissions and
|
||||||
# limitations under the License.
|
# 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.
|
#' Dashboard.
|
||||||
#'
|
#'
|
||||||
#' @param cdmVersionNum The version of the CDM you are creating, e.g. 5.3.1
|
#' @param cdmVersion The version of the CDM you are creating, e.g. 5.3, 5.4
|
||||||
#'
|
#' @return A character string containing the OHDSQL DDL
|
||||||
#' @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.
|
|
||||||
#' @export
|
#' @export
|
||||||
|
#' @examples
|
||||||
|
#' ddl <- createDdl("5.4")
|
||||||
|
#' pk <- createPrimaryKeys("5.4")
|
||||||
|
#' fk <- createForeignKeys("5.4")
|
||||||
|
createDdl <- function(cdmVersion){
|
||||||
|
|
||||||
createDdl <- function(cdmVersion = cdmVersion){
|
# argument checks
|
||||||
cdmTableCsvLoc = paste0("inst/csv/OMOP_CDMv", cdmVersion, "_Table_Level.csv")
|
stopifnot(is.character(cdmVersion), length(cdmVersion) == 1, cdmVersion %in% listSupportedVersions())
|
||||||
cdmFieldCsvLoc = paste0("inst/csv/OMOP_CDMv", cdmVersion, "_Field_Level.csv")
|
|
||||||
|
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)
|
tableSpecs <- read.csv(cdmTableCsvLoc, stringsAsFactors = FALSE)
|
||||||
cdmSpecs <- read.csv(cdmFieldCsvLoc, stringsAsFactors = FALSE)
|
cdmSpecs <- read.csv(cdmFieldCsvLoc, stringsAsFactors = FALSE)
|
||||||
|
@ -37,7 +45,7 @@ createDdl <- function(cdmVersion = cdmVersion){
|
||||||
tableList <- tableSpecs$cdmTableName
|
tableList <- tableSpecs$cdmTableName
|
||||||
|
|
||||||
sql_result <- c()
|
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){
|
for (tableName in tableList){
|
||||||
fields <- subset(cdmSpecs, cdmTableName == tableName)
|
fields <- subset(cdmSpecs, cdmTableName == tableName)
|
||||||
fieldNames <- fields$cdmFieldName
|
fieldNames <- fields$cdmFieldName
|
||||||
|
@ -81,3 +89,52 @@ createDdl <- function(cdmVersion = cdmVersion){
|
||||||
}
|
}
|
||||||
return(paste0(sql_result, collapse = ""))
|
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
|
#' @examples
|
||||||
#' \dontrun{
|
#' \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
|
#' @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
|
#' Write DDL script
|
||||||
#'
|
#'
|
||||||
#' @param targetdialect The dialect of the target database. Choices are "oracle", "postgresql", "pdw", "redshift", "impala", "netezza", "bigquery", "sql server"
|
#' Write the DDL to a SQL file. The SQL will be rendered (parameters replaced) and translated to the target SQL
|
||||||
#' @param cdmVersion The version of the CDM for which you are creating the DDL. e.g. 5.3.1
|
#' 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.
|
#' @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"
|
#' Defaults to "@cdmDatabaseSchema"
|
||||||
#'
|
#'
|
||||||
#' @export
|
#' @export
|
||||||
writeDDL <- function(targetdialect, cdmVersion, cdmDatabaseSchema = "@cdmDatabaseSchema") {
|
writeDdl <- function(targetDialect, cdmVersion, outputpath, cdmDatabaseSchema = "@cdmDatabaseSchema") {
|
||||||
outputpath <- file.path("ddl", cdmVersion, targetdialect)
|
|
||||||
dir.create(outputpath, showWarnings = FALSE, recursive = TRUE)
|
# 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 <- createDdl(cdmVersion)
|
||||||
sql <- SqlRender::render(sql = sql, cdmDatabaseSchema = cdmDatabaseSchema, targetdialect = targetdialect)
|
sql <- SqlRender::render(sql = sql, cdmDatabaseSchema = cdmDatabaseSchema, targetDialect = targetDialect)
|
||||||
sql <- SqlRender::translate(sql, targetDialect = targetdialect)
|
sql <- SqlRender::translate(sql, targetDialect = targetDialect)
|
||||||
|
|
||||||
filename <- paste("OMOPCDM", targetdialect, cdmVersion, "ddl.sql", sep = "_")
|
filename <- paste("OMOPCDM", gsub(" ", "_", targetDialect), cdmVersion, "ddl.sql", sep = "_")
|
||||||
SqlRender::writeSql(sql = sql,
|
SqlRender::writeSql(sql = sql, targetFile = file.path(outputpath, filename))
|
||||||
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()
|
supportedVersions <- listSupportedVersions()
|
||||||
|
|
||||||
for (cdmVersion in supportedVersions) {
|
for (cdmVersion in supportedVersions) {
|
||||||
for (targetdialect in c("oracle", "postgresql", "pdw", "redshift", "impala", "netezza", "bigquery", "sql server")) {
|
for (targetDialect in c("oracle", "postgresql", "pdw", "redshift", "impala", "netezza", "bigquery", "sql server")) {
|
||||||
writeDDL(targetdialect = targetdialect,
|
writeDdl(targetDialect = targetDialect,
|
||||||
cdmVersion = cdmVersion)
|
cdmVersion = cdmVersion)
|
||||||
|
|
||||||
writePrimaryKeys(targetdialect = targetdialect,
|
writePrimaryKeys(targetDialect = targetDialect,
|
||||||
cdmVersion = cdmVersion)
|
cdmVersion = cdmVersion)
|
||||||
|
|
||||||
writeForeignKeys(targetdialect = targetdialect,
|
writeForeignKeys(targetDialect = targetDialect,
|
||||||
cdmVersion = cdmVersion)
|
cdmVersion = cdmVersion)
|
||||||
|
|
||||||
writeIndex(targetdialect = targetdialect,
|
writeIndex(targetDialect = targetDialect,
|
||||||
cdmVersion = cdmVersion)
|
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_description,No,varchar(MAX),,,No,No,,,,,
|
||||||
ATTRIBUTE_DEFINITION,attribute_type_concept_id,Yes,integer,,,No,Yes,CONCEPT,CONCEPT_ID,,,
|
ATTRIBUTE_DEFINITION,attribute_type_concept_id,Yes,integer,,,No,Yes,CONCEPT,CONCEPT_ID,,,
|
||||||
ATTRIBUTE_DEFINITION,attribute_syntax,No,varchar(MAX),,,No,No,,,,,
|
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
|
There are no unique indices created because it is assumed that the primary key constraints have been run prior to
|
||||||
implementing indices.
|
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
|
There are no unique indices created because it is assumed that the primary key constraints have been run prior to
|
||||||
implementing indices.
|
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
|
% Generated by roxygen2: do not edit by hand
|
||||||
% Please edit documentation in R/createDdl.R
|
% Please edit documentation in R/createdDdl.R
|
||||||
\name{createDdl}
|
\name{createDdl}
|
||||||
\alias{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
|
\alias{createPrimaryKeys}
|
||||||
Dashboard.}
|
\alias{createForeignKeys}
|
||||||
|
\title{Create the OHDSI-SQL Common Data Model DDL code}
|
||||||
\usage{
|
\usage{
|
||||||
createDdl(cdmVersion = cdmVersion)
|
createDdl(cdmVersion)
|
||||||
|
|
||||||
|
createPrimaryKeys(cdmVersion)
|
||||||
|
|
||||||
|
createForeignKeys(cdmVersion)
|
||||||
}
|
}
|
||||||
\arguments{
|
\arguments{
|
||||||
\item{cdmVersionNum}{The version of the CDM you are creating, e.g. 5.3.1}
|
\item{cdmVersion}{The version of the CDM you are creating, e.g. 5.3, 5.4}
|
||||||
|
}
|
||||||
\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".
|
\value{
|
||||||
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/".}
|
A character string containing the OHDSQL DDL
|
||||||
|
|
||||||
\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.}
|
|
||||||
}
|
}
|
||||||
\description{
|
\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.
|
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{
|
\examples{
|
||||||
\dontrun{
|
\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
|
% Generated by roxygen2: do not edit by hand
|
||||||
% Please edit documentation in R/writeDDL.R
|
% Please edit documentation in R/writeDdl.R
|
||||||
\name{writeDDL}
|
\name{writeDdl}
|
||||||
\alias{writeDDL}
|
\alias{writeDdl}
|
||||||
|
\alias{writePrimaryKeys}
|
||||||
|
\alias{writeForeignKeys}
|
||||||
|
\alias{writeIndex}
|
||||||
\title{Write DDL script}
|
\title{Write DDL script}
|
||||||
\usage{
|
\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{
|
\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.
|
\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"}
|
Defaults to "@cdmDatabaseSchema"}
|
||||||
}
|
}
|
||||||
\description{
|
\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