From 4299f64a044edab1de317a61b97ef2e6103f4654 Mon Sep 17 00:00:00 2001 From: Anastasiia Klochkova Date: Thu, 26 Sep 2019 10:18:04 +0200 Subject: [PATCH 1/8] added hive support --- pom.xml | 40 +++- src/main/extras/bigquery/README.md | 2 +- src/main/extras/hive/README.md | 6 + src/main/extras/impala/README.md | 4 +- .../org/ohdsi/webapi/DataAccessConfig.java | 10 +- .../DropCohortTableListener.java | 9 +- ...GenerateCohortCharacterizationTasklet.java | 2 +- .../common/generation/GenerationUtils.java | 4 + .../webapi/pathway/PathwayServiceImpl.java | 7 +- .../org/ohdsi/webapi/service/DDLService.java | 21 +- .../java/org/ohdsi/webapi/source/Source.java | 10 +- .../ddl/results/heracles_results.sql | 2 + .../ddl/results/heracles_results_dist.sql | 2 + .../results/init_hive_heracles_analysis.sql | 215 ++++++++++++++++++ .../resources/pathway/runPathwayAnalysis.sql | 3 + .../webapi/util/DataSourceDTOParserTest.java | 14 ++ 16 files changed, 333 insertions(+), 18 deletions(-) create mode 100644 src/main/extras/hive/README.md create mode 100644 src/main/resources/ddl/results/init_hive_heracles_analysis.sql diff --git a/pom.xml b/pom.xml index e0d78b424c..6730232738 100644 --- a/pom.xml +++ b/pom.xml @@ -130,7 +130,7 @@ 2000 5 1 - 5000 + 30000 true authDataSource @@ -185,6 +185,8 @@ classpath:config/ehcache.xml + 1.6.3-SNAPSHOT + 3.1.0 WebAPI @@ -495,7 +497,7 @@ org.ohdsi.sql SqlRender - 1.6.3-SNAPSHOT + ${SqlRender.version} commons-dbutils @@ -634,7 +636,7 @@ org.ohdsi circe - 1.8.1 + 1.8.2-SNAPSHOT org.ohdsi @@ -1194,5 +1196,37 @@ + + webapi-hive + + + org.apache.hive + hive-jdbc + ${hive-jdbc.version} + + + + + + + org.eclipse.jetty + * + + + tomcat + jasper-compiler + + + tomcat + jasper-runtime + + + com.sun.jersey + * + + + + + diff --git a/src/main/extras/bigquery/README.md b/src/main/extras/bigquery/README.md index 1ba409964c..1b52d3fe98 100644 --- a/src/main/extras/bigquery/README.md +++ b/src/main/extras/bigquery/README.md @@ -1,6 +1,6 @@ To build WebAPI with Google BigQuery support do the following: 1. Go to https://cloud.google.com/bigquery/partners/simba-drivers/ and 2. Download the JDBC 4.2 driver -3. Unpack archive and and set the bigquery.classpath property in your settings.xml to the unpacked archive location (ie: C://downloads/bigquery) inside the webapi-bigquery profile. +3. Unpack archive and set the bigquery.classpath property in your settings.xml to the unpacked archive location (ie: C://downloads/bigquery) inside the webapi-bigquery profile. 4. Build WebAPI with webapi-bigquery profile. * mvn -Pwebapi-postgresql,webapi-bigquery clean package diff --git a/src/main/extras/hive/README.md b/src/main/extras/hive/README.md new file mode 100644 index 0000000000..864f491d48 --- /dev/null +++ b/src/main/extras/hive/README.md @@ -0,0 +1,6 @@ +To build WebAPI with Apache Hive LLAP support do the following: +1. Add to your hosts line: " sandbox-hdp.hortonworks.com" +2. Download the JDBC driver from http://sandbox-hdp.hortonworks.com:10002/jdbcjar +3. Set the hive.classpath property in your settings.xml to the archive location (ie: C://downloads/hive) inside the webapi-hive profile +4. Build WebAPI with webapi-hive profile: + * mvn -Pwebapi-hive clean package \ No newline at end of file diff --git a/src/main/extras/impala/README.md b/src/main/extras/impala/README.md index dc2dacd636..3270a144d0 100644 --- a/src/main/extras/impala/README.md +++ b/src/main/extras/impala/README.md @@ -1,7 +1,7 @@ To build WebAPI with Impala support do the following: 1. Go to the https://www.cloudera.com/downloads/connectors/impala/jdbc/2-5-43.html -2. Register to clouder if you did not registered earlier or sign in to your Cloudera account +2. Register to Cloudera if you did not registered earlier or sign in to your Cloudera account 3. Download the latest Impala JDBC drivers -4. Unpack archive and and set the impala.classpath property in your settings.xml to the unpacked archive location (ie: C://downloads/impalaJDBC) inside the webapi-impala profile. +4. Unpack archive and set the impala.classpath property in your settings.xml to the unpacked archive location (ie: C://downloads/impalaJDBC) inside the webapi-impala profile. 5. Build WebAPI with webapi-impala profile. * mvn -Pwebapi-postgresql,webapi-impala clean package diff --git a/src/main/java/org/ohdsi/webapi/DataAccessConfig.java b/src/main/java/org/ohdsi/webapi/DataAccessConfig.java index 91ee21efa3..e6c8fa004b 100644 --- a/src/main/java/org/ohdsi/webapi/DataAccessConfig.java +++ b/src/main/java/org/ohdsi/webapi/DataAccessConfig.java @@ -77,7 +77,15 @@ public DataSource primaryDataSource() { //note autocommit defaults vary across vendors. use provided @Autowired TransactionTemplate String[] supportedDrivers; - supportedDrivers = new String[]{"org.postgresql.Driver", "com.microsoft.sqlserver.jdbc.SQLServerDriver", "oracle.jdbc.driver.OracleDriver", "com.amazon.redshift.jdbc.Driver", "com.cloudera.impala.jdbc41.Driver", "net.starschema.clouddb.jdbc.BQDriver", "org.netezza.Driver", "com.simba.googlebigquery.jdbc42.Driver"}; + supportedDrivers = new String[]{"org.postgresql.Driver", + "com.microsoft.sqlserver.jdbc.SQLServerDriver", + "oracle.jdbc.driver.OracleDriver", + "com.amazon.redshift.jdbc.Driver", + "com.cloudera.impala.jdbc41.Driver", + "net.starschema.clouddb.jdbc.BQDriver", + "org.netezza.Driver", + "com.simba.googlebigquery.jdbc42.Driver", + "org.apache.hive.jdbc.HiveDriver"}; for (String driverName : supportedDrivers) { try { Class.forName(driverName); diff --git a/src/main/java/org/ohdsi/webapi/cohortcharacterization/DropCohortTableListener.java b/src/main/java/org/ohdsi/webapi/cohortcharacterization/DropCohortTableListener.java index d14328ad25..4a9da42ae7 100644 --- a/src/main/java/org/ohdsi/webapi/cohortcharacterization/DropCohortTableListener.java +++ b/src/main/java/org/ohdsi/webapi/cohortcharacterization/DropCohortTableListener.java @@ -1,5 +1,8 @@ package org.ohdsi.webapi.cohortcharacterization; +import com.odysseusinc.arachne.commons.types.DBMSType; +import java.util.Objects; +import org.apache.commons.lang3.StringUtils; import org.ohdsi.circe.helper.ResourceHelper; import org.ohdsi.sql.SqlTranslate; import org.ohdsi.webapi.service.SourceService; @@ -44,8 +47,12 @@ private Object doTask(JobParameters parameters) { final Source source = sourceService.findBySourceId(sourceId); final String resultsQualifier = SourceUtils.getResultsQualifier(source); final String tempQualifier = SourceUtils.getTempQualifier(source, resultsQualifier); - jdbcTemplate.execute(SqlTranslate.translateSql(sql, source.getSourceDialect(), null, tempQualifier)); + String toRemove = SqlTranslate.translateSql(sql, source.getSourceDialect(), null, tempQualifier); + if (Objects.equals(DBMSType.HIVE.getOhdsiDB(), source.getSourceDialect())){ + toRemove = StringUtils.remove(toRemove, ';'); + } + jdbcTemplate.execute(toRemove); return null; } diff --git a/src/main/java/org/ohdsi/webapi/cohortcharacterization/GenerateCohortCharacterizationTasklet.java b/src/main/java/org/ohdsi/webapi/cohortcharacterization/GenerateCohortCharacterizationTasklet.java index 1437e7bd66..dd96c5d87c 100644 --- a/src/main/java/org/ohdsi/webapi/cohortcharacterization/GenerateCohortCharacterizationTasklet.java +++ b/src/main/java/org/ohdsi/webapi/cohortcharacterization/GenerateCohortCharacterizationTasklet.java @@ -91,7 +91,7 @@ protected String[] prepareQueries(ChunkContext chunkContext, CancelableJdbcTempl * * Therefore, there are two ways: * - either precisely group SQLs into statements so that temp tables aren't re-used in a single statement, - * - or use ‘permenant temporary tables’ + * - or use ‘permanent temporary tables’ * * The second option looks better since such SQL could be exported and executed manually, * which is not the case with the first option. diff --git a/src/main/java/org/ohdsi/webapi/common/generation/GenerationUtils.java b/src/main/java/org/ohdsi/webapi/common/generation/GenerationUtils.java index de2123a079..6bb8b9062d 100644 --- a/src/main/java/org/ohdsi/webapi/common/generation/GenerationUtils.java +++ b/src/main/java/org/ohdsi/webapi/common/generation/GenerationUtils.java @@ -164,11 +164,15 @@ public SimpleJobBuilder buildJobForExecutionEngineBasedAnalysisTasklet(String an Step waitCallbackStep = stepBuilderFactory.get(analysisTypeName + ".waitForCallback") .tasklet(callbackTasklet) .build(); + + DropCohortTableListener dropCohortTableListener = new DropCohortTableListener(getSourceJdbcTemplate(source), + transactionTemplate, sourceService, sourceAwareSqlRender); return jobBuilders.get(analysisTypeName) .start(createAnalysisExecutionStep) .next(runExecutionStep) .next(waitCallbackStep) + .listener(dropCohortTableListener) .listener(new AutoremoveJobListener(jobService)); } } diff --git a/src/main/java/org/ohdsi/webapi/pathway/PathwayServiceImpl.java b/src/main/java/org/ohdsi/webapi/pathway/PathwayServiceImpl.java index a3d5842324..bdfd264e02 100644 --- a/src/main/java/org/ohdsi/webapi/pathway/PathwayServiceImpl.java +++ b/src/main/java/org/ohdsi/webapi/pathway/PathwayServiceImpl.java @@ -2,6 +2,7 @@ import com.cosium.spring.data.jpa.entity.graph.domain.EntityGraph; import com.google.common.base.MoreObjects; +import com.odysseusinc.arachne.commons.types.DBMSType; import org.hibernate.Hibernate; import org.ohdsi.circe.helper.ResourceHelper; import org.ohdsi.sql.SqlRender; @@ -324,7 +325,8 @@ public String buildAnalysisSql(Long generationId, PathwayAnalysisEntity pathwayA "pathway_target_cohort_id", "max_depth", "combo_window", - "allow_repeats" + "allow_repeats", + "isHive" }; String[] values = new String[]{ generationId.toString(), @@ -335,7 +337,8 @@ public String buildAnalysisSql(Long generationId, PathwayAnalysisEntity pathwayA tc.getCohortDefinition().getId().toString(), pathwayAnalysis.getMaxDepth().toString(), MoreObjects.firstNonNull(pathwayAnalysis.getCombinationWindow(), 1).toString(), - String.valueOf(pathwayAnalysis.isAllowRepeats()) + String.valueOf(pathwayAnalysis.isAllowRepeats()), + String.valueOf(Objects.equals(DBMSType.HIVE.getOhdsiDB(), source.getSourceDialect())) }; String renderedSql = SqlRender.renderSql(analysisSql, params, values); diff --git a/src/main/java/org/ohdsi/webapi/service/DDLService.java b/src/main/java/org/ohdsi/webapi/service/DDLService.java index 869087200d..69a40d42ac 100644 --- a/src/main/java/org/ohdsi/webapi/service/DDLService.java +++ b/src/main/java/org/ohdsi/webapi/service/DDLService.java @@ -20,11 +20,13 @@ import static org.ohdsi.webapi.service.SqlRenderService.translateSQL; +import com.odysseusinc.arachne.commons.types.DBMSType; import java.util.ArrayList; import java.util.Arrays; import java.util.Collection; import java.util.HashMap; import java.util.Map; +import java.util.Objects; import javax.ws.rs.DefaultValue; import javax.ws.rs.GET; import javax.ws.rs.Path; @@ -76,9 +78,14 @@ public class DDLService { "/ddl/results/pathway_analysis_stats.sql" ); + private static final String INIT_HERACLES_PERIODS = "/ddl/results/init_heracles_periods.sql"; + public static final Collection RESULT_INIT_FILE_PATHS = Arrays.asList( - "/ddl/results/init_heracles_analysis.sql", - "/ddl/results/init_heracles_periods.sql" + "/ddl/results/init_heracles_analysis.sql", INIT_HERACLES_PERIODS + ); + + public static final Collection HIVE_RESULT_INIT_FILE_PATHS = Arrays.asList( + "/ddl/results/init_hive_heracles_analysis.sql", INIT_HERACLES_PERIODS ); public static final Collection INIT_CONCEPT_HIERARCHY_FILE_PATHS = Arrays.asList( @@ -123,7 +130,15 @@ public String generateResultSQL( put(TEMP_SCHEMA, oracleTempSchema); }}; - return generateSQL(dialect, params, resultDDLFilePaths, RESULT_INIT_FILE_PATHS, RESULT_INDEX_FILE_PATHS); + return generateSQL(dialect, params, resultDDLFilePaths, getResultInitFilePaths(dialect), RESULT_INDEX_FILE_PATHS); + } + + private Collection getResultInitFilePaths(String dialect) { + if (Objects.equals(DBMSType.HIVE.getOhdsiDB(), dialect)) { + return HIVE_RESULT_INIT_FILE_PATHS; + } else { + return RESULT_INIT_FILE_PATHS; + } } @GET diff --git a/src/main/java/org/ohdsi/webapi/source/Source.java b/src/main/java/org/ohdsi/webapi/source/Source.java index 6402bd8371..d5e77a47f2 100644 --- a/src/main/java/org/ohdsi/webapi/source/Source.java +++ b/src/main/java/org/ohdsi/webapi/source/Source.java @@ -117,12 +117,14 @@ public String getTableQualifier(DaimonType daimonType) { } public String getTableQualifierOrNull(DaimonType daimonType) { - for (SourceDaimon sourceDaimon : this.getDaimons()) { - if (sourceDaimon.getDaimonType() == daimonType) { - return sourceDaimon.getTableQualifier(); + if (this.getDaimons() != null){ + for (SourceDaimon sourceDaimon : this.getDaimons()) { + if (sourceDaimon.getDaimonType() == daimonType) { + return sourceDaimon.getTableQualifier(); + } } } - return null; + return null; } public String getSourceKey() { diff --git a/src/main/resources/ddl/results/heracles_results.sql b/src/main/resources/ddl/results/heracles_results.sql index 3fd8431ce2..8ae9e40eef 100644 --- a/src/main/resources/ddl/results/heracles_results.sql +++ b/src/main/resources/ddl/results/heracles_results.sql @@ -1,3 +1,5 @@ +--HINT PARTITION(cohort_definition_id) +--HINT BUCKET(analysis_id, 64) IF OBJECT_ID('@results_schema.heracles_results', 'U') IS NULL create table @results_schema.heracles_results ( diff --git a/src/main/resources/ddl/results/heracles_results_dist.sql b/src/main/resources/ddl/results/heracles_results_dist.sql index d6e6307e2f..8c84300d19 100644 --- a/src/main/resources/ddl/results/heracles_results_dist.sql +++ b/src/main/resources/ddl/results/heracles_results_dist.sql @@ -1,3 +1,5 @@ +--HINT PARTITION(cohort_definition_id) +--HINT BUCKET(analysis_id, 64) IF OBJECT_ID('@results_schema.heracles_results_dist', 'U') IS NULL create table @results_schema.heracles_results_dist ( diff --git a/src/main/resources/ddl/results/init_hive_heracles_analysis.sql b/src/main/resources/ddl/results/init_hive_heracles_analysis.sql new file mode 100644 index 0000000000..99e75122b5 --- /dev/null +++ b/src/main/resources/ddl/results/init_hive_heracles_analysis.sql @@ -0,0 +1,215 @@ +TRUNCATE TABLE @results_schema.heracles_analysis; + +insert into table @results_schema.heracles_analysis (analysis_id,analysis_name,stratum_1_name,stratum_2_name,stratum_3_name,stratum_4_name,stratum_5_name,analysis_type) +values + (0, CAST('Source name' as VARCHAR(255)), CAST(NULL AS VARCHAR(255)), CAST(NULL AS VARCHAR(255)), CAST(NULL AS VARCHAR(255)), CAST(NULL AS VARCHAR(255)), CAST(NULL AS VARCHAR(255)), CAST('PERSON' as VARCHAR(255))), + (1, CAST('Number of persons' as VARCHAR(255)), CAST(NULL AS VARCHAR(255)), CAST(NULL AS VARCHAR(255)), CAST(NULL AS VARCHAR(255)), CAST(NULL AS VARCHAR(255)), CAST(NULL AS VARCHAR(255)), CAST('PERSON' as VARCHAR(255))), + (2, CAST('Number of persons by gender' as VARCHAR(255)), CAST('gender_concept_id' as VARCHAR(255)), CAST(NULL AS VARCHAR(255)), CAST(NULL AS VARCHAR(255)), CAST(NULL AS VARCHAR(255)), CAST(NULL AS VARCHAR(255)), CAST('PERSON' as VARCHAR(255))), + (3, CAST('Number of persons by year of birth' as VARCHAR(255)), CAST('year_of_birth' as VARCHAR(255)), CAST(NULL AS VARCHAR(255)), CAST(NULL AS VARCHAR(255)), CAST(NULL AS VARCHAR(255)), CAST(NULL AS VARCHAR(255)), CAST('PERSON' as VARCHAR(255))), + (4, CAST('Number of persons by race' as VARCHAR(255)), CAST('race_concept_id' as VARCHAR(255)), CAST(NULL AS VARCHAR(255)), CAST(NULL AS VARCHAR(255)), CAST(NULL AS VARCHAR(255)), CAST(NULL AS VARCHAR(255)), CAST('PERSON' as VARCHAR(255))), + (5, CAST('Number of persons by ethnicity' as VARCHAR(255)), CAST('ethnicity_concept_id' as VARCHAR(255)), CAST(NULL AS VARCHAR(255)), CAST(NULL AS VARCHAR(255)), CAST(NULL AS VARCHAR(255)), CAST(NULL AS VARCHAR(255)), CAST('PERSON' as VARCHAR(255))), + (7, CAST('Number of persons with invalid provider_id' as VARCHAR(255)), CAST(NULL AS VARCHAR(255)), CAST(NULL AS VARCHAR(255)), CAST(NULL AS VARCHAR(255)), CAST(NULL AS VARCHAR(255)), CAST(NULL AS VARCHAR(255)), CAST('PERSON' as VARCHAR(255))), + (8, CAST('Number of persons with invalid location_id' as VARCHAR(255)), CAST(NULL AS VARCHAR(255)), CAST(NULL AS VARCHAR(255)), CAST(NULL AS VARCHAR(255)), CAST(NULL AS VARCHAR(255)), CAST(NULL AS VARCHAR(255)), CAST('PERSON' as VARCHAR(255))), + (9, CAST('Number of persons with invalid care_site_id' as VARCHAR(255)), CAST(NULL AS VARCHAR(255)), CAST(NULL AS VARCHAR(255)), CAST(NULL AS VARCHAR(255)), CAST(NULL AS VARCHAR(255)), CAST(NULL AS VARCHAR(255)), CAST('PERSON' as VARCHAR(255))), + (101, CAST('Number of persons by age, with age at first observation period' as VARCHAR(255)), CAST('age' as VARCHAR(255)), CAST(NULL AS VARCHAR(255)), CAST(NULL AS VARCHAR(255)), CAST(NULL AS VARCHAR(255)), CAST(NULL AS VARCHAR(255)), CAST('OBSERVATION' as VARCHAR(255))), + (102, CAST('Number of persons by gender by age, with age at first observation period' as VARCHAR(255)), CAST('gender_concept_id' as VARCHAR(255)), CAST('age' as VARCHAR(255)), CAST(NULL AS VARCHAR(255)), CAST(NULL AS VARCHAR(255)), CAST(NULL AS VARCHAR(255)), CAST('OBSERVATION' as VARCHAR(255))), + (103, CAST('Distribution of age at first observation period' as VARCHAR(255)), CAST(NULL AS VARCHAR(255)), CAST(NULL AS VARCHAR(255)), CAST(NULL AS VARCHAR(255)), CAST(NULL AS VARCHAR(255)), CAST(NULL AS VARCHAR(255)), CAST('OBSERVATION' as VARCHAR(255))), + (104, CAST('Distribution of age at first observation period by gender' as VARCHAR(255)), CAST('gender_concept_id' as VARCHAR(255)), CAST(NULL AS VARCHAR(255)), CAST(NULL AS VARCHAR(255)), CAST(NULL AS VARCHAR(255)), CAST(NULL AS VARCHAR(255)), CAST('OBSERVATION' as VARCHAR(255))), + (105, CAST('Length of observation (days) of first observation period' as VARCHAR(255)), CAST(NULL AS VARCHAR(255)), CAST(NULL AS VARCHAR(255)), CAST(NULL AS VARCHAR(255)), CAST(NULL AS VARCHAR(255)), CAST(NULL AS VARCHAR(255)), CAST('OBSERVATION' as VARCHAR(255))), + (106, CAST('Length of observation (days) of first observation period by gender' as VARCHAR(255)), CAST('gender_concept_id' as VARCHAR(255)), CAST(NULL AS VARCHAR(255)), CAST(NULL AS VARCHAR(255)), CAST(NULL AS VARCHAR(255)), CAST(NULL AS VARCHAR(255)), CAST('OBSERVATION' as VARCHAR(255))), + (107, CAST('Length of observation (days) of first observation period by age decile' as VARCHAR(255)), CAST('age decile' as VARCHAR(255)), CAST(NULL AS VARCHAR(255)), CAST(NULL AS VARCHAR(255)), CAST(NULL AS VARCHAR(255)), CAST(NULL AS VARCHAR(255)), CAST('OBSERVATION' as VARCHAR(255))), + (108, CAST('Number of persons by length of first observation period, in 30d increments' as VARCHAR(255)), CAST('Observation period length 30d increments' as VARCHAR(255)), CAST(NULL AS VARCHAR(255)), CAST(NULL AS VARCHAR(255)), CAST(NULL AS VARCHAR(255)), CAST(NULL AS VARCHAR(255)), CAST('OBSERVATION' as VARCHAR(255))), + (109, CAST('Number of persons with continuous observation in each year' as VARCHAR(255)), CAST('calendar year' as VARCHAR(255)), CAST(NULL AS VARCHAR(255)), CAST(NULL AS VARCHAR(255)), CAST(NULL AS VARCHAR(255)), CAST(NULL AS VARCHAR(255)), CAST('OBSERVATION' as VARCHAR(255))), + (110, CAST('Number of persons with continuous observation in each month' as VARCHAR(255)), CAST('calendar month' as VARCHAR(255)), CAST(NULL AS VARCHAR(255)), CAST(NULL AS VARCHAR(255)), CAST(NULL AS VARCHAR(255)), CAST(NULL AS VARCHAR(255)), CAST('OBSERVATION' as VARCHAR(255))), + (111, CAST('Number of persons by observation period start month' as VARCHAR(255)), CAST('calendar month' as VARCHAR(255)), CAST(NULL AS VARCHAR(255)), CAST(NULL AS VARCHAR(255)), CAST(NULL AS VARCHAR(255)), CAST(NULL AS VARCHAR(255)), CAST('OBSERVATION' as VARCHAR(255))), + (112, CAST('Number of persons by observation period end month' as VARCHAR(255)), CAST('calendar month' as VARCHAR(255)), CAST(NULL AS VARCHAR(255)), CAST(NULL AS VARCHAR(255)), CAST(NULL AS VARCHAR(255)), CAST(NULL AS VARCHAR(255)), CAST('OBSERVATION' as VARCHAR(255))), + (113, CAST('Number of persons by number of observation periods' as VARCHAR(255)), CAST('number of observation periods' as VARCHAR(255)), CAST(NULL AS VARCHAR(255)), CAST(NULL AS VARCHAR(255)), CAST(NULL AS VARCHAR(255)), CAST(NULL AS VARCHAR(255)), CAST('OBSERVATION' as VARCHAR(255))), + (114, CAST('Number of persons with observation period before year-of-birth' as VARCHAR(255)), CAST(NULL AS VARCHAR(255)), CAST(NULL AS VARCHAR(255)), CAST(NULL AS VARCHAR(255)), CAST(NULL AS VARCHAR(255)), CAST(NULL AS VARCHAR(255)), CAST('OBSERVATION' as VARCHAR(255))), + (115, CAST('Number of persons with observation period end < observation period start' as VARCHAR(255)), CAST(NULL AS VARCHAR(255)), CAST(NULL AS VARCHAR(255)), CAST(NULL AS VARCHAR(255)), CAST(NULL AS VARCHAR(255)), CAST(NULL AS VARCHAR(255)), CAST('OBSERVATION' as VARCHAR(255))), + (116, CAST('Number of persons with at least one day of observation in each year by gender and age decile' as VARCHAR(255)), CAST('calendar year' as VARCHAR(255)), CAST('gender_concept_id' as VARCHAR(255)), CAST('age decile' as VARCHAR(255)), CAST(NULL AS VARCHAR(255)), CAST(NULL AS VARCHAR(255)), CAST('OBSERVATION' as VARCHAR(255))), + (117, CAST('Number of persons with at least one day of observation in each month' as VARCHAR(255)), CAST('calendar month' as VARCHAR(255)), CAST(NULL AS VARCHAR(255)), CAST(NULL AS VARCHAR(255)), CAST(NULL AS VARCHAR(255)), CAST(NULL AS VARCHAR(255)), CAST('OBSERVATION' as VARCHAR(255))), + (200, CAST('Number of persons with at least one visit occurrence, by visit_concept_id' as VARCHAR(255)), CAST('visit_concept_id' as VARCHAR(255)), CAST(NULL AS VARCHAR(255)), CAST(NULL AS VARCHAR(255)), CAST(NULL AS VARCHAR(255)), CAST(NULL AS VARCHAR(255)), CAST('VISITS' as VARCHAR(255))), + (201, CAST('Number of visit occurrence records, by visit_concept_id' as VARCHAR(255)), CAST('visit_concept_id' as VARCHAR(255)), CAST(NULL AS VARCHAR(255)), CAST(NULL AS VARCHAR(255)), CAST(NULL AS VARCHAR(255)), CAST(NULL AS VARCHAR(255)), CAST('VISITS' as VARCHAR(255))), + (202, CAST('Number of persons by visit occurrence start month, by visit_concept_id' as VARCHAR(255)), CAST('visit_concept_id' as VARCHAR(255)), CAST('calendar month' as VARCHAR(255)), CAST(NULL AS VARCHAR(255)), CAST(NULL AS VARCHAR(255)), CAST(NULL AS VARCHAR(255)), CAST('VISITS' as VARCHAR(255))), + (203, CAST('Number of distinct visit occurrence concepts per person' as VARCHAR(255)), CAST(NULL AS VARCHAR(255)), CAST(NULL AS VARCHAR(255)), CAST(NULL AS VARCHAR(255)), CAST(NULL AS VARCHAR(255)), CAST(NULL AS VARCHAR(255)), CAST('VISITS' as VARCHAR(255))), + (204, CAST('Number of persons with at least one visit occurrence, by visit_concept_id by calendar year by gender by age decile' as VARCHAR(255)), CAST('visit_concept_id' as VARCHAR(255)), CAST('calendar year' as VARCHAR(255)), CAST('gender_concept_id' as VARCHAR(255)), CAST('age decile' as VARCHAR(255)), CAST(NULL AS VARCHAR(255)), CAST('VISITS' as VARCHAR(255))), + (206, CAST('Distribution of age by visit_concept_id' as VARCHAR(255)), CAST('visit_concept_id' as VARCHAR(255)), CAST('gender_concept_id' as VARCHAR(255)), CAST(NULL AS VARCHAR(255)), CAST(NULL AS VARCHAR(255)), CAST(NULL AS VARCHAR(255)), CAST('VISITS' as VARCHAR(255))), + (207, CAST('Number of visit records with invalid person_id' as VARCHAR(255)), CAST(NULL AS VARCHAR(255)), CAST(NULL AS VARCHAR(255)), CAST(NULL AS VARCHAR(255)), CAST(NULL AS VARCHAR(255)), CAST(NULL AS VARCHAR(255)), CAST('VISITS' as VARCHAR(255))), + (208, CAST('Number of visit records outside valid observation period' as VARCHAR(255)), CAST(NULL AS VARCHAR(255)), CAST(NULL AS VARCHAR(255)), CAST(NULL AS VARCHAR(255)), CAST(NULL AS VARCHAR(255)), CAST(NULL AS VARCHAR(255)), CAST('VISITS' as VARCHAR(255))), + (209, CAST('Number of visit records with end date < start date' as VARCHAR(255)), CAST(NULL AS VARCHAR(255)), CAST(NULL AS VARCHAR(255)), CAST(NULL AS VARCHAR(255)), CAST(NULL AS VARCHAR(255)), CAST(NULL AS VARCHAR(255)), CAST('VISITS' as VARCHAR(255))), + (210, CAST('Number of visit records with invalid care_site_id' as VARCHAR(255)), CAST(NULL AS VARCHAR(255)), CAST(NULL AS VARCHAR(255)), CAST(NULL AS VARCHAR(255)), CAST(NULL AS VARCHAR(255)), CAST(NULL AS VARCHAR(255)), CAST('VISITS' as VARCHAR(255))), + (211, CAST('Distribution of length of stay by visit_concept_id' as VARCHAR(255)), CAST('visit_concept_id' as VARCHAR(255)), CAST(NULL AS VARCHAR(255)), CAST(NULL AS VARCHAR(255)), CAST(NULL AS VARCHAR(255)), CAST(NULL AS VARCHAR(255)), CAST('VISITS' as VARCHAR(255))), + (220, CAST('Number of visit occurrence records by visit occurrence start month' as VARCHAR(255)), CAST('calendar month' as VARCHAR(255)), CAST(NULL AS VARCHAR(255)), CAST(NULL AS VARCHAR(255)), CAST(NULL AS VARCHAR(255)), CAST(NULL AS VARCHAR(255)), CAST('VISITS' as VARCHAR(255))), + (400, CAST('Number of persons with at least one condition occurrence, by condition_concept_id' as VARCHAR(255)), CAST('condition_concept_id' as VARCHAR(255)), CAST(NULL AS VARCHAR(255)), CAST(NULL AS VARCHAR(255)), CAST(NULL AS VARCHAR(255)), CAST(NULL AS VARCHAR(255)), CAST('CONDITION' as VARCHAR(255))), + (401, CAST('Number of condition occurrence records, by condition_concept_id' as VARCHAR(255)), CAST('condition_concept_id' as VARCHAR(255)), CAST(NULL AS VARCHAR(255)), CAST(NULL AS VARCHAR(255)), CAST(NULL AS VARCHAR(255)), CAST(NULL AS VARCHAR(255)), CAST('CONDITION' as VARCHAR(255))), + (402, CAST('Number of persons by condition occurrence start month, by condition_concept_id' as VARCHAR(255)), CAST('condition_concept_id' as VARCHAR(255)), CAST('calendar month' as VARCHAR(255)), CAST(NULL AS VARCHAR(255)), CAST(NULL AS VARCHAR(255)), CAST(NULL AS VARCHAR(255)), CAST('CONDITION' as VARCHAR(255))), + (403, CAST('Number of distinct condition occurrence concepts per person' as VARCHAR(255)), CAST(NULL AS VARCHAR(255)), CAST(NULL AS VARCHAR(255)), CAST(NULL AS VARCHAR(255)), CAST(NULL AS VARCHAR(255)), CAST(NULL AS VARCHAR(255)), CAST('CONDITION' as VARCHAR(255))), + (404, CAST('Number of persons with at least one condition occurrence, by condition_concept_id by calendar year by gender by age decile' as VARCHAR(255)), CAST('condition_concept_id' as VARCHAR(255)), CAST('calendar year' as VARCHAR(255)), CAST('gender_concept_id' as VARCHAR(255)), CAST('age decile' as VARCHAR(255)), CAST(NULL AS VARCHAR(255)), CAST('CONDITION' as VARCHAR(255))), + (405, CAST('Number of condition occurrence records, by condition_concept_id by condition_type_concept_id' as VARCHAR(255)), CAST('condition_concept_id' as VARCHAR(255)), CAST('condition_type_concept_id' as VARCHAR(255)), CAST(NULL AS VARCHAR(255)), CAST(NULL AS VARCHAR(255)), CAST(NULL AS VARCHAR(255)), CAST('CONDITION' as VARCHAR(255))), + (406, CAST('Distribution of age by condition_concept_id' as VARCHAR(255)), CAST('condition_concept_id' as VARCHAR(255)), CAST('gender_concept_id' as VARCHAR(255)), CAST(NULL AS VARCHAR(255)), CAST(NULL AS VARCHAR(255)), CAST(NULL AS VARCHAR(255)), CAST('CONDITION' as VARCHAR(255))), + (409, CAST('Number of condition occurrence records with invalid person_id' as VARCHAR(255)), CAST(NULL AS VARCHAR(255)), CAST(NULL AS VARCHAR(255)), CAST(NULL AS VARCHAR(255)), CAST(NULL AS VARCHAR(255)), CAST(NULL AS VARCHAR(255)), CAST('CONDITION' as VARCHAR(255))), + (410, CAST('Number of condition occurrence records outside valid observation period' as VARCHAR(255)), CAST(NULL AS VARCHAR(255)), CAST(NULL AS VARCHAR(255)), CAST(NULL AS VARCHAR(255)), CAST(NULL AS VARCHAR(255)), CAST(NULL AS VARCHAR(255)), CAST('CONDITION' as VARCHAR(255))), + (411, CAST('Number of condition occurrence records with end date < start date' as VARCHAR(255)), CAST(NULL AS VARCHAR(255)), CAST(NULL AS VARCHAR(255)), CAST(NULL AS VARCHAR(255)), CAST(NULL AS VARCHAR(255)), CAST(NULL AS VARCHAR(255)), CAST('CONDITION' as VARCHAR(255))), + (412, CAST('Number of condition occurrence records with invalid provider_id' as VARCHAR(255)), CAST(NULL AS VARCHAR(255)), CAST(NULL AS VARCHAR(255)), CAST(NULL AS VARCHAR(255)), CAST(NULL AS VARCHAR(255)), CAST(NULL AS VARCHAR(255)), CAST('CONDITION' as VARCHAR(255))), + (413, CAST('Number of condition occurrence records with invalid visit_id' as VARCHAR(255)), CAST(NULL AS VARCHAR(255)), CAST(NULL AS VARCHAR(255)), CAST(NULL AS VARCHAR(255)), CAST(NULL AS VARCHAR(255)), CAST(NULL AS VARCHAR(255)), CAST('CONDITION' as VARCHAR(255))), + (420, CAST('Number of condition occurrence records by condition occurrence start month' as VARCHAR(255)), CAST('calendar month' as VARCHAR(255)), CAST(NULL AS VARCHAR(255)), CAST(NULL AS VARCHAR(255)), CAST(NULL AS VARCHAR(255)), CAST(NULL AS VARCHAR(255)), CAST('CONDITION' as VARCHAR(255))), + (500, CAST('Number of persons with death, by cause_of_death_concept_id' as VARCHAR(255)), CAST('cause_of_death_concept_id' as VARCHAR(255)), CAST(NULL AS VARCHAR(255)), CAST(NULL AS VARCHAR(255)), CAST(NULL AS VARCHAR(255)), CAST(NULL AS VARCHAR(255)), CAST('DEATH' as VARCHAR(255))), + (501, CAST('Number of records of death, by cause_of_death_concept_id' as VARCHAR(255)), CAST('cause_of_death_concept_id' as VARCHAR(255)), CAST(NULL AS VARCHAR(255)), CAST(NULL AS VARCHAR(255)), CAST(NULL AS VARCHAR(255)), CAST(NULL AS VARCHAR(255)), CAST('DEATH' as VARCHAR(255))), + (502, CAST('Number of persons by death month' as VARCHAR(255)), CAST('calendar month' as VARCHAR(255)), CAST(NULL AS VARCHAR(255)), CAST(NULL AS VARCHAR(255)), CAST(NULL AS VARCHAR(255)), CAST(NULL AS VARCHAR(255)), CAST('DEATH' as VARCHAR(255))), + (504, CAST('Number of persons with a death, by calendar year by gender by age decile' as VARCHAR(255)), CAST('calendar year' as VARCHAR(255)), CAST('gender_concept_id' as VARCHAR(255)), CAST('age decile' as VARCHAR(255)), CAST(NULL AS VARCHAR(255)), CAST(NULL AS VARCHAR(255)), CAST('DEATH' as VARCHAR(255))), + (505, CAST('Number of death records, by death_type_concept_id' as VARCHAR(255)), CAST('death_type_concept_id' as VARCHAR(255)), CAST(NULL AS VARCHAR(255)), CAST(NULL AS VARCHAR(255)), CAST(NULL AS VARCHAR(255)), CAST(NULL AS VARCHAR(255)), CAST('DEATH' as VARCHAR(255))), + (506, CAST('Distribution of age at death by gender' as VARCHAR(255)), CAST('gender_concept_id' as VARCHAR(255)), CAST(NULL AS VARCHAR(255)), CAST(NULL AS VARCHAR(255)), CAST(NULL AS VARCHAR(255)), CAST(NULL AS VARCHAR(255)), CAST('DEATH' as VARCHAR(255))), + (509, CAST('Number of death records with invalid person_id' as VARCHAR(255)), CAST(NULL AS VARCHAR(255)), CAST(NULL AS VARCHAR(255)), CAST(NULL AS VARCHAR(255)), CAST(NULL AS VARCHAR(255)), CAST(NULL AS VARCHAR(255)), CAST('DEATH' as VARCHAR(255))), + (510, CAST('Number of death records outside valid observation period' as VARCHAR(255)), CAST(NULL AS VARCHAR(255)), CAST(NULL AS VARCHAR(255)), CAST(NULL AS VARCHAR(255)), CAST(NULL AS VARCHAR(255)), CAST(NULL AS VARCHAR(255)), CAST('DEATH' as VARCHAR(255))), + (511, CAST('Distribution of time from death to last condition' as VARCHAR(255)), CAST(NULL AS VARCHAR(255)), CAST(NULL AS VARCHAR(255)), CAST(NULL AS VARCHAR(255)), CAST(NULL AS VARCHAR(255)), CAST(NULL AS VARCHAR(255)), CAST('DEATH' as VARCHAR(255))), + (512, CAST('Distribution of time from death to last drug' as VARCHAR(255)), CAST(NULL AS VARCHAR(255)), CAST(NULL AS VARCHAR(255)), CAST(NULL AS VARCHAR(255)), CAST(NULL AS VARCHAR(255)), CAST(NULL AS VARCHAR(255)), CAST('DEATH' as VARCHAR(255))), + (513, CAST('Distribution of time from death to last visit' as VARCHAR(255)), CAST(NULL AS VARCHAR(255)), CAST(NULL AS VARCHAR(255)), CAST(NULL AS VARCHAR(255)), CAST(NULL AS VARCHAR(255)), CAST(NULL AS VARCHAR(255)), CAST('DEATH' as VARCHAR(255))), + (514, CAST('Distribution of time from death to last procedure' as VARCHAR(255)), CAST(NULL AS VARCHAR(255)), CAST(NULL AS VARCHAR(255)), CAST(NULL AS VARCHAR(255)), CAST(NULL AS VARCHAR(255)), CAST(NULL AS VARCHAR(255)), CAST('DEATH' as VARCHAR(255))), + (515, CAST('Distribution of time from death to last observation' as VARCHAR(255)), CAST(NULL AS VARCHAR(255)), CAST(NULL AS VARCHAR(255)), CAST(NULL AS VARCHAR(255)), CAST(NULL AS VARCHAR(255)), CAST(NULL AS VARCHAR(255)), CAST('DEATH' as VARCHAR(255))), + (600, CAST('Number of persons with at least one procedure occurrence, by procedure_concept_id' as VARCHAR(255)), CAST('procedure_concept_id' as VARCHAR(255)), CAST(NULL AS VARCHAR(255)), CAST(NULL AS VARCHAR(255)), CAST(NULL AS VARCHAR(255)), CAST(NULL AS VARCHAR(255)), CAST('PROCEDURE' as VARCHAR(255))), + (601, CAST('Number of procedure occurrence records, by procedure_concept_id' as VARCHAR(255)), CAST('procedure_concept_id' as VARCHAR(255)), CAST(NULL AS VARCHAR(255)), CAST(NULL AS VARCHAR(255)), CAST(NULL AS VARCHAR(255)), CAST(NULL AS VARCHAR(255)), CAST('PROCEDURE' as VARCHAR(255))), + (602, CAST('Number of persons by procedure occurrence start month, by procedure_concept_id' as VARCHAR(255)), CAST('procedure_concept_id' as VARCHAR(255)), CAST('calendar month' as VARCHAR(255)), CAST(NULL AS VARCHAR(255)), CAST(NULL AS VARCHAR(255)), CAST(NULL AS VARCHAR(255)), CAST('PROCEDURE' as VARCHAR(255))), + (603, CAST('Number of distinct procedure occurrence concepts per person' as VARCHAR(255)), CAST(NULL AS VARCHAR(255)), CAST(NULL AS VARCHAR(255)), CAST(NULL AS VARCHAR(255)), CAST(NULL AS VARCHAR(255)), CAST(NULL AS VARCHAR(255)), CAST('PROCEDURE' as VARCHAR(255))), + (604, CAST('Number of persons with at least one procedure occurrence, by procedure_concept_id by calendar year by gender by age decile' as VARCHAR(255)), CAST('procedure_concept_id' as VARCHAR(255)), CAST('calendar year' as VARCHAR(255)), CAST('gender_concept_id' as VARCHAR(255)), CAST('age decile' as VARCHAR(255)), CAST(NULL AS VARCHAR(255)), CAST('PROCEDURE' as VARCHAR(255))), + (605, CAST('Number of procedure occurrence records, by procedure_concept_id by procedure_type_concept_id' as VARCHAR(255)), CAST('procedure_concept_id' as VARCHAR(255)), CAST('procedure_type_concept_id' as VARCHAR(255)), CAST(NULL AS VARCHAR(255)), CAST(NULL AS VARCHAR(255)), CAST(NULL AS VARCHAR(255)), CAST('PROCEDURE' as VARCHAR(255))), + (606, CAST('Distribution of age by procedure_concept_id' as VARCHAR(255)), CAST('procedure_concept_id' as VARCHAR(255)), CAST('gender_concept_id' as VARCHAR(255)), CAST(NULL AS VARCHAR(255)), CAST(NULL AS VARCHAR(255)), CAST(NULL AS VARCHAR(255)), CAST('PROCEDURE' as VARCHAR(255))), + (609, CAST('Number of procedure occurrence records with invalid person_id' as VARCHAR(255)), CAST(NULL AS VARCHAR(255)), CAST(NULL AS VARCHAR(255)), CAST(NULL AS VARCHAR(255)), CAST(NULL AS VARCHAR(255)), CAST(NULL AS VARCHAR(255)), CAST('PROCEDURE' as VARCHAR(255))), + (610, CAST('Number of procedure occurrence records outside valid observation period' as VARCHAR(255)), CAST(NULL AS VARCHAR(255)), CAST(NULL AS VARCHAR(255)), CAST(NULL AS VARCHAR(255)), CAST(NULL AS VARCHAR(255)), CAST(NULL AS VARCHAR(255)), CAST('PROCEDURE' as VARCHAR(255))), + (612, CAST('Number of procedure occurrence records with invalid provider_id' as VARCHAR(255)), CAST(NULL AS VARCHAR(255)), CAST(NULL AS VARCHAR(255)), CAST(NULL AS VARCHAR(255)), CAST(NULL AS VARCHAR(255)), CAST(NULL AS VARCHAR(255)), CAST('PROCEDURE' as VARCHAR(255))), + (613, CAST('Number of procedure occurrence records with invalid visit_id' as VARCHAR(255)), CAST(NULL AS VARCHAR(255)), CAST(NULL AS VARCHAR(255)), CAST(NULL AS VARCHAR(255)), CAST(NULL AS VARCHAR(255)), CAST(NULL AS VARCHAR(255)), CAST('PROCEDURE' as VARCHAR(255))), + (620, CAST('Number of procedure occurrence records by procedure occurrence start month' as VARCHAR(255)), CAST('calendar month' as VARCHAR(255)), CAST(NULL AS VARCHAR(255)), CAST(NULL AS VARCHAR(255)), CAST(NULL AS VARCHAR(255)), CAST(NULL AS VARCHAR(255)), CAST('PROCEDURE' as VARCHAR(255))), + (700, CAST('Number of persons with at least one drug exposure, by drug_concept_id' as VARCHAR(255)), CAST('drug_concept_id' as VARCHAR(255)), CAST(NULL AS VARCHAR(255)), CAST(NULL AS VARCHAR(255)), CAST(NULL AS VARCHAR(255)), CAST(NULL AS VARCHAR(255)), CAST('DRUG' as VARCHAR(255))), + (701, CAST('Number of drug exposure records, by drug_concept_id' as VARCHAR(255)), CAST('drug_concept_id' as VARCHAR(255)), CAST(NULL AS VARCHAR(255)), CAST(NULL AS VARCHAR(255)), CAST(NULL AS VARCHAR(255)), CAST(NULL AS VARCHAR(255)), CAST('DRUG' as VARCHAR(255))), + (702, CAST('Number of persons by drug exposure start month, by drug_concept_id' as VARCHAR(255)), CAST('drug_concept_id' as VARCHAR(255)), CAST('calendar month' as VARCHAR(255)), CAST(NULL AS VARCHAR(255)), CAST(NULL AS VARCHAR(255)), CAST(NULL AS VARCHAR(255)), CAST('DRUG' as VARCHAR(255))), + (703, CAST('Number of distinct drug exposure concepts per person' as VARCHAR(255)), CAST(NULL AS VARCHAR(255)), CAST(NULL AS VARCHAR(255)), CAST(NULL AS VARCHAR(255)), CAST(NULL AS VARCHAR(255)), CAST(NULL AS VARCHAR(255)), CAST('DRUG' as VARCHAR(255))), + (704, CAST('Number of persons with at least one drug exposure, by drug_concept_id by calendar year by gender by age decile' as VARCHAR(255)), CAST('drug_concept_id' as VARCHAR(255)), CAST('calendar year' as VARCHAR(255)), CAST('gender_concept_id' as VARCHAR(255)), CAST('age decile' as VARCHAR(255)), CAST(NULL AS VARCHAR(255)), CAST('DRUG' as VARCHAR(255))), + (705, CAST('Number of drug exposure records, by drug_concept_id by drug_type_concept_id' as VARCHAR(255)), CAST('drug_concept_id' as VARCHAR(255)), CAST('drug_type_concept_id' as VARCHAR(255)), CAST(NULL AS VARCHAR(255)), CAST(NULL AS VARCHAR(255)), CAST(NULL AS VARCHAR(255)), CAST('DRUG' as VARCHAR(255))), + (706, CAST('Distribution of age by drug_concept_id' as VARCHAR(255)), CAST('drug_concept_id' as VARCHAR(255)), CAST('gender_concept_id' as VARCHAR(255)), CAST(NULL AS VARCHAR(255)), CAST(NULL AS VARCHAR(255)), CAST(NULL AS VARCHAR(255)), CAST('DRUG' as VARCHAR(255))), + (709, CAST('Number of drug exposure records with invalid person_id' as VARCHAR(255)), CAST(NULL AS VARCHAR(255)), CAST(NULL AS VARCHAR(255)), CAST(NULL AS VARCHAR(255)), CAST(NULL AS VARCHAR(255)), CAST(NULL AS VARCHAR(255)), CAST('DRUG' as VARCHAR(255))), + (710, CAST('Number of drug exposure records outside valid observation period' as VARCHAR(255)), CAST(NULL AS VARCHAR(255)), CAST(NULL AS VARCHAR(255)), CAST(NULL AS VARCHAR(255)), CAST(NULL AS VARCHAR(255)), CAST(NULL AS VARCHAR(255)), CAST('DRUG' as VARCHAR(255))), + (711, CAST('Number of drug exposure records with end date < start date' as VARCHAR(255)), CAST(NULL AS VARCHAR(255)), CAST(NULL AS VARCHAR(255)), CAST(NULL AS VARCHAR(255)), CAST(NULL AS VARCHAR(255)), CAST(NULL AS VARCHAR(255)), CAST('DRUG' as VARCHAR(255))), + (712, CAST('Number of drug exposure records with invalid provider_id' as VARCHAR(255)), CAST(NULL AS VARCHAR(255)), CAST(NULL AS VARCHAR(255)), CAST(NULL AS VARCHAR(255)), CAST(NULL AS VARCHAR(255)), CAST(NULL AS VARCHAR(255)), CAST('DRUG' as VARCHAR(255))), + (713, CAST('Number of drug exposure records with invalid visit_id' as VARCHAR(255)), CAST(NULL AS VARCHAR(255)), CAST(NULL AS VARCHAR(255)), CAST(NULL AS VARCHAR(255)), CAST(NULL AS VARCHAR(255)), CAST(NULL AS VARCHAR(255)), CAST('DRUG' as VARCHAR(255))), + (715, CAST('Distribution of days_supply by drug_concept_id' as VARCHAR(255)), CAST('drug_concept_id' as VARCHAR(255)), CAST(NULL AS VARCHAR(255)), CAST(NULL AS VARCHAR(255)), CAST(NULL AS VARCHAR(255)), CAST(NULL AS VARCHAR(255)), CAST('DRUG' as VARCHAR(255))), + (716, CAST('Distribution of refills by drug_concept_id' as VARCHAR(255)), CAST('drug_concept_id' as VARCHAR(255)), CAST(NULL AS VARCHAR(255)), CAST(NULL AS VARCHAR(255)), CAST(NULL AS VARCHAR(255)), CAST(NULL AS VARCHAR(255)), CAST('DRUG' as VARCHAR(255))), + (717, CAST('Distribution of quantity by drug_concept_id' as VARCHAR(255)), CAST('drug_concept_id' as VARCHAR(255)), CAST(NULL AS VARCHAR(255)), CAST(NULL AS VARCHAR(255)), CAST(NULL AS VARCHAR(255)), CAST(NULL AS VARCHAR(255)), CAST('DRUG' as VARCHAR(255))), + (720, CAST('Number of drug exposure records by drug exposure start month' as VARCHAR(255)), CAST('calendar month' as VARCHAR(255)), CAST(NULL AS VARCHAR(255)), CAST(NULL AS VARCHAR(255)), CAST(NULL AS VARCHAR(255)), CAST(NULL AS VARCHAR(255)), CAST('DRUG' as VARCHAR(255))), + (800, CAST('Number of persons with at least one observation occurrence, by observation_concept_id' as VARCHAR(255)), CAST('observation_concept_id' as VARCHAR(255)), CAST(NULL AS VARCHAR(255)), CAST(NULL AS VARCHAR(255)), CAST(NULL AS VARCHAR(255)), CAST(NULL AS VARCHAR(255)), CAST('OBSERVATION' as VARCHAR(255))), + (801, CAST('Number of observation occurrence records, by observation_concept_id' as VARCHAR(255)), CAST('observation_concept_id' as VARCHAR(255)), CAST(NULL AS VARCHAR(255)), CAST(NULL AS VARCHAR(255)), CAST(NULL AS VARCHAR(255)), CAST(NULL AS VARCHAR(255)), CAST('OBSERVATION' as VARCHAR(255))), + (802, CAST('Number of persons by observation occurrence start month, by observation_concept_id' as VARCHAR(255)), CAST('observation_concept_id' as VARCHAR(255)), CAST('calendar month' as VARCHAR(255)), CAST(NULL AS VARCHAR(255)), CAST(NULL AS VARCHAR(255)), CAST(NULL AS VARCHAR(255)), CAST('OBSERVATION' as VARCHAR(255))), + (803, CAST('Number of distinct observation occurrence concepts per person' as VARCHAR(255)), CAST(NULL AS VARCHAR(255)), CAST(NULL AS VARCHAR(255)), CAST(NULL AS VARCHAR(255)), CAST(NULL AS VARCHAR(255)), CAST(NULL AS VARCHAR(255)), CAST('OBSERVATION' as VARCHAR(255))), + (804, CAST('Number of persons with at least one observation occurrence, by observation_concept_id by calendar year by gender by age decile' as VARCHAR(255)), CAST('observation_concept_id' as VARCHAR(255)), CAST('calendar year' as VARCHAR(255)), CAST('gender_concept_id' as VARCHAR(255)), CAST('age decile' as VARCHAR(255)), CAST(NULL AS VARCHAR(255)), CAST('OBSERVATION' as VARCHAR(255))), + (805, CAST('Number of observation occurrence records, by observation_concept_id by observation_type_concept_id' as VARCHAR(255)), CAST('observation_concept_id' as VARCHAR(255)), CAST('observation_type_concept_id' as VARCHAR(255)), CAST(NULL AS VARCHAR(255)), CAST(NULL AS VARCHAR(255)), CAST(NULL AS VARCHAR(255)), CAST('OBSERVATION' as VARCHAR(255))), + (806, CAST('Distribution of age by observation_concept_id' as VARCHAR(255)), CAST('observation_concept_id' as VARCHAR(255)), CAST('gender_concept_id' as VARCHAR(255)), CAST(NULL AS VARCHAR(255)), CAST(NULL AS VARCHAR(255)), CAST(NULL AS VARCHAR(255)), CAST('OBSERVATION' as VARCHAR(255))), + (807, CAST('Number of observation occurrence records, by observation_concept_id and unit_concept_id' as VARCHAR(255)), CAST('observation_concept_id' as VARCHAR(255)), CAST('unit_concept_id' as VARCHAR(255)), CAST(NULL AS VARCHAR(255)), CAST(NULL AS VARCHAR(255)), CAST(NULL AS VARCHAR(255)), CAST('OBSERVATION' as VARCHAR(255))), + (809, CAST('Number of observation records with invalid person_id' as VARCHAR(255)), CAST(NULL AS VARCHAR(255)), CAST(NULL AS VARCHAR(255)), CAST(NULL AS VARCHAR(255)), CAST(NULL AS VARCHAR(255)), CAST(NULL AS VARCHAR(255)), CAST('OBSERVATION' as VARCHAR(255))), + (810, CAST('Number of observation records outside valid observation period' as VARCHAR(255)), CAST(NULL AS VARCHAR(255)), CAST(NULL AS VARCHAR(255)), CAST(NULL AS VARCHAR(255)), CAST(NULL AS VARCHAR(255)), CAST(NULL AS VARCHAR(255)), CAST('OBSERVATION' as VARCHAR(255))), + (812, CAST('Number of observation records with invalid provider_id' as VARCHAR(255)), CAST(NULL AS VARCHAR(255)), CAST(NULL AS VARCHAR(255)), CAST(NULL AS VARCHAR(255)), CAST(NULL AS VARCHAR(255)), CAST(NULL AS VARCHAR(255)), CAST('OBSERVATION' as VARCHAR(255))), + (813, CAST('Number of observation records with invalid visit_id' as VARCHAR(255)), CAST(NULL AS VARCHAR(255)), CAST(NULL AS VARCHAR(255)), CAST(NULL AS VARCHAR(255)), CAST(NULL AS VARCHAR(255)), CAST(NULL AS VARCHAR(255)), CAST('OBSERVATION' as VARCHAR(255))), + (814, CAST('Number of observation records with no value (numeric, string, or concept)' as VARCHAR(255)), CAST(NULL AS VARCHAR(255)), CAST(NULL AS VARCHAR(255)), CAST(NULL AS VARCHAR(255)), CAST(NULL AS VARCHAR(255)), CAST(NULL AS VARCHAR(255)), CAST('OBSERVATION' as VARCHAR(255))), + (815, CAST('Distribution of numeric values, by observation_concept_id and unit_concept_id' as VARCHAR(255)), CAST(NULL AS VARCHAR(255)), CAST(NULL AS VARCHAR(255)), CAST(NULL AS VARCHAR(255)), CAST(NULL AS VARCHAR(255)), CAST(NULL AS VARCHAR(255)), CAST('OBSERVATION' as VARCHAR(255))), + (816, CAST('Distribution of low range, by observation_concept_id and unit_concept_id' as VARCHAR(255)), CAST(NULL AS VARCHAR(255)), CAST(NULL AS VARCHAR(255)), CAST(NULL AS VARCHAR(255)), CAST(NULL AS VARCHAR(255)), CAST(NULL AS VARCHAR(255)), CAST('OBSERVATION' as VARCHAR(255))), + (817, CAST('Distribution of high range, by observation_concept_id and unit_concept_id' as VARCHAR(255)), CAST(NULL AS VARCHAR(255)), CAST(NULL AS VARCHAR(255)), CAST(NULL AS VARCHAR(255)), CAST(NULL AS VARCHAR(255)), CAST(NULL AS VARCHAR(255)), CAST('OBSERVATION' as VARCHAR(255))), + (818, CAST('Number of observation records below/within/above normal range, by observation_concept_id and unit_concept_id' as VARCHAR(255)), CAST(NULL AS VARCHAR(255)), CAST(NULL AS VARCHAR(255)), CAST(NULL AS VARCHAR(255)), CAST(NULL AS VARCHAR(255)), CAST(NULL AS VARCHAR(255)), CAST('OBSERVATION' as VARCHAR(255))), + (820, CAST('Number of observation records by observation start month' as VARCHAR(255)), CAST('calendar month' as VARCHAR(255)), CAST(NULL AS VARCHAR(255)), CAST(NULL AS VARCHAR(255)), CAST(NULL AS VARCHAR(255)), CAST(NULL AS VARCHAR(255)), CAST('OBSERVATION' as VARCHAR(255))), + (900, CAST('Number of persons with at least one drug era, by drug_concept_id' as VARCHAR(255)), CAST('drug_concept_id' as VARCHAR(255)), CAST(NULL AS VARCHAR(255)), CAST(NULL AS VARCHAR(255)), CAST(NULL AS VARCHAR(255)), CAST(NULL AS VARCHAR(255)), CAST('DRUG_ERA' as VARCHAR(255))), + (901, CAST('Number of drug era records, by drug_concept_id' as VARCHAR(255)), CAST('drug_concept_id' as VARCHAR(255)), CAST(NULL AS VARCHAR(255)), CAST(NULL AS VARCHAR(255)), CAST(NULL AS VARCHAR(255)), CAST(NULL AS VARCHAR(255)), CAST('DRUG_ERA' as VARCHAR(255))), + (902, CAST('Number of persons by drug era start month, by drug_concept_id' as VARCHAR(255)), CAST('drug_concept_id' as VARCHAR(255)), CAST('calendar month' as VARCHAR(255)), CAST(NULL AS VARCHAR(255)), CAST(NULL AS VARCHAR(255)), CAST(NULL AS VARCHAR(255)), CAST('DRUG_ERA' as VARCHAR(255))), + (903, CAST('Number of distinct drug era concepts per person' as VARCHAR(255)), CAST(NULL AS VARCHAR(255)), CAST(NULL AS VARCHAR(255)), CAST(NULL AS VARCHAR(255)), CAST(NULL AS VARCHAR(255)), CAST(NULL AS VARCHAR(255)), CAST('DRUG_ERA' as VARCHAR(255))), + (904, CAST('Number of persons with at least one drug era, by drug_concept_id by calendar year by gender by age decile' as VARCHAR(255)), CAST('drug_concept_id' as VARCHAR(255)), CAST('calendar year' as VARCHAR(255)), CAST('gender_concept_id' as VARCHAR(255)), CAST('age decile' as VARCHAR(255)), CAST(NULL AS VARCHAR(255)), CAST('DRUG_ERA' as VARCHAR(255))), + (906, CAST('Distribution of age by drug_concept_id' as VARCHAR(255)), CAST('drug_concept_id' as VARCHAR(255)), CAST('gender_concept_id' as VARCHAR(255)), CAST(NULL AS VARCHAR(255)), CAST(NULL AS VARCHAR(255)), CAST(NULL AS VARCHAR(255)), CAST('DRUG_ERA' as VARCHAR(255))), + (907, CAST('Distribution of drug era length, by drug_concept_id' as VARCHAR(255)), CAST('drug_concept_id' as VARCHAR(255)), CAST(NULL AS VARCHAR(255)), CAST(NULL AS VARCHAR(255)), CAST(NULL AS VARCHAR(255)), CAST(NULL AS VARCHAR(255)), CAST('DRUG_ERA' as VARCHAR(255))), + (908, CAST('Number of drug eras without valid person' as VARCHAR(255)), CAST(NULL AS VARCHAR(255)), CAST(NULL AS VARCHAR(255)), CAST(NULL AS VARCHAR(255)), CAST(NULL AS VARCHAR(255)), CAST(NULL AS VARCHAR(255)), CAST('DRUG_ERA' as VARCHAR(255))), + (909, CAST('Number of drug eras outside valid observation period' as VARCHAR(255)), CAST(NULL AS VARCHAR(255)), CAST(NULL AS VARCHAR(255)), CAST(NULL AS VARCHAR(255)), CAST(NULL AS VARCHAR(255)), CAST(NULL AS VARCHAR(255)), CAST('DRUG_ERA' as VARCHAR(255))), + (910, CAST('Number of drug eras with end date < start date' as VARCHAR(255)), CAST(NULL AS VARCHAR(255)), CAST(NULL AS VARCHAR(255)), CAST(NULL AS VARCHAR(255)), CAST(NULL AS VARCHAR(255)), CAST(NULL AS VARCHAR(255)), CAST('DRUG_ERA' as VARCHAR(255))), + (920, CAST('Number of drug era records by drug era start month' as VARCHAR(255)), CAST('calendar month' as VARCHAR(255)), CAST(NULL AS VARCHAR(255)), CAST(NULL AS VARCHAR(255)), CAST(NULL AS VARCHAR(255)), CAST(NULL AS VARCHAR(255)), CAST('DRUG_ERA' as VARCHAR(255))), + (1000, CAST('Number of persons with at least one condition era, by condition_concept_id' as VARCHAR(255)), CAST('condition_concept_id' as VARCHAR(255)), CAST(NULL AS VARCHAR(255)), CAST(NULL AS VARCHAR(255)), CAST(NULL AS VARCHAR(255)), CAST(NULL AS VARCHAR(255)), CAST('CONDITION_ERA' as VARCHAR(255))), + (1001, CAST('Number of condition era records, by condition_concept_id' as VARCHAR(255)), CAST('condition_concept_id' as VARCHAR(255)), CAST(NULL AS VARCHAR(255)), CAST(NULL AS VARCHAR(255)), CAST(NULL AS VARCHAR(255)), CAST(NULL AS VARCHAR(255)), CAST('CONDITION_ERA' as VARCHAR(255))), + (1002, CAST('Number of persons by condition era start month, by condition_concept_id' as VARCHAR(255)), CAST('condition_concept_id' as VARCHAR(255)), CAST('calendar month' as VARCHAR(255)), CAST(NULL AS VARCHAR(255)), CAST(NULL AS VARCHAR(255)), CAST(NULL AS VARCHAR(255)), CAST('CONDITION_ERA' as VARCHAR(255))), + (1003, CAST('Number of distinct condition era concepts per person' as VARCHAR(255)), CAST(NULL AS VARCHAR(255)), CAST(NULL AS VARCHAR(255)), CAST(NULL AS VARCHAR(255)), CAST(NULL AS VARCHAR(255)), CAST(NULL AS VARCHAR(255)), CAST('CONDITION_ERA' as VARCHAR(255))), + (1004, CAST('Number of persons with at least one condition era, by condition_concept_id by calendar year by gender by age decile' as VARCHAR(255)), CAST('condition_concept_id' as VARCHAR(255)), CAST('calendar year' as VARCHAR(255)), CAST('gender_concept_id' as VARCHAR(255)), CAST('age decile' as VARCHAR(255)), CAST(NULL AS VARCHAR(255)), CAST('CONDITION_ERA' as VARCHAR(255))), + (1006, CAST('Distribution of age by condition_concept_id' as VARCHAR(255)), CAST('condition_concept_id' as VARCHAR(255)), CAST('gender_concept_id' as VARCHAR(255)), CAST(NULL AS VARCHAR(255)), CAST(NULL AS VARCHAR(255)), CAST(NULL AS VARCHAR(255)), CAST('CONDITION_ERA' as VARCHAR(255))), + (1007, CAST('Distribution of condition era length, by condition_concept_id' as VARCHAR(255)), CAST('condition_concept_id' as VARCHAR(255)), CAST(NULL AS VARCHAR(255)), CAST(NULL AS VARCHAR(255)), CAST(NULL AS VARCHAR(255)), CAST(NULL AS VARCHAR(255)), CAST('CONDITION_ERA' as VARCHAR(255))), + (1008, CAST('Number of condition eras without valid person' as VARCHAR(255)), CAST(NULL AS VARCHAR(255)), CAST(NULL AS VARCHAR(255)), CAST(NULL AS VARCHAR(255)), CAST(NULL AS VARCHAR(255)), CAST(NULL AS VARCHAR(255)), CAST('CONDITION_ERA' as VARCHAR(255))), + (1009, CAST('Number of condition eras outside valid observation period' as VARCHAR(255)), CAST(NULL AS VARCHAR(255)), CAST(NULL AS VARCHAR(255)), CAST(NULL AS VARCHAR(255)), CAST(NULL AS VARCHAR(255)), CAST(NULL AS VARCHAR(255)), CAST('CONDITION_ERA' as VARCHAR(255))), + (1010, CAST('Number of condition eras with end date < start date' as VARCHAR(255)), CAST(NULL AS VARCHAR(255)), CAST(NULL AS VARCHAR(255)), CAST(NULL AS VARCHAR(255)), CAST(NULL AS VARCHAR(255)), CAST(NULL AS VARCHAR(255)), CAST('CONDITION_ERA' as VARCHAR(255))), + (1020, CAST('Number of condition era records by condition era start month' as VARCHAR(255)), CAST('calendar month' as VARCHAR(255)), CAST(NULL AS VARCHAR(255)), CAST(NULL AS VARCHAR(255)), CAST(NULL AS VARCHAR(255)), CAST(NULL AS VARCHAR(255)), CAST('CONDITION_ERA' as VARCHAR(255))), + (1100, CAST('Number of persons by location 3-digit zip' as VARCHAR(255)), CAST('3-digit zip' as VARCHAR(255)), CAST(NULL AS VARCHAR(255)), CAST(NULL AS VARCHAR(255)), CAST(NULL AS VARCHAR(255)), CAST(NULL AS VARCHAR(255)), CAST('LOCATION' as VARCHAR(255))), + (1101, CAST('Number of persons by location state' as VARCHAR(255)), CAST('state' as VARCHAR(255)), CAST(NULL AS VARCHAR(255)), CAST(NULL AS VARCHAR(255)), CAST(NULL AS VARCHAR(255)), CAST(NULL AS VARCHAR(255)), CAST('LOCATION' as VARCHAR(255))), + (1200, CAST('Number of persons by place of service' as VARCHAR(255)), CAST('place_of_service_concept_id' as VARCHAR(255)), CAST(NULL AS VARCHAR(255)), CAST(NULL AS VARCHAR(255)), CAST(NULL AS VARCHAR(255)), CAST(NULL AS VARCHAR(255)), CAST('CARE_SITE' as VARCHAR(255))), + (1201, CAST('Number of visits by place of service' as VARCHAR(255)), CAST('place_of_service_concept_id' as VARCHAR(255)), CAST(NULL AS VARCHAR(255)), CAST(NULL AS VARCHAR(255)), CAST(NULL AS VARCHAR(255)), CAST(NULL AS VARCHAR(255)), CAST('CARE_SITE' as VARCHAR(255))), + (1300, CAST('Number of persons with at least one measurement occurrence, by measurement_concept_id' as VARCHAR(255)), CAST('measurement_concept_id' as VARCHAR(255)), CAST(NULL AS VARCHAR(255)), CAST(NULL AS VARCHAR(255)), CAST(NULL AS VARCHAR(255)), CAST(NULL AS VARCHAR(255)), CAST('MEASUREMENT' as VARCHAR(255))), + (1301, CAST('Number of measurement occurrence records, by measurement_concept_id' as VARCHAR(255)), CAST('measurement_concept_id' as VARCHAR(255)), CAST(NULL AS VARCHAR(255)), CAST(NULL AS VARCHAR(255)), CAST(NULL AS VARCHAR(255)), CAST(NULL AS VARCHAR(255)), CAST('MEASUREMENT' as VARCHAR(255))), + (1302, CAST('Number of persons by measurement occurrence start month, by measurement_concept_id' as VARCHAR(255)), CAST('measurement_concept_id' as VARCHAR(255)), CAST('calendar month' as VARCHAR(255)), CAST(NULL AS VARCHAR(255)), CAST(NULL AS VARCHAR(255)), CAST(NULL AS VARCHAR(255)), CAST('MEASUREMENT' as VARCHAR(255))), + (1303, CAST('Number of distinct measurement occurrence concepts per person' as VARCHAR(255)), CAST(NULL AS VARCHAR(255)), CAST(NULL AS VARCHAR(255)), CAST(NULL AS VARCHAR(255)), CAST(NULL AS VARCHAR(255)), CAST(NULL AS VARCHAR(255)), CAST('MEASUREMENT' as VARCHAR(255))), + (1304, CAST('Number of persons with at least one measurement occurrence, by measurement_concept_id by calendar year by gender by age decile' as VARCHAR(255)), CAST('measurement_concept_id' as VARCHAR(255)), CAST('calendar year' as VARCHAR(255)), CAST('gender_concept_id' as VARCHAR(255)), CAST('age decile' as VARCHAR(255)), CAST(NULL AS VARCHAR(255)), CAST('MEASUREMENT' as VARCHAR(255))), + (1305, CAST('Number of measurement occurrence records, by measurement_concept_id by measurement_type_concept_id' as VARCHAR(255)), CAST('measurement_concept_id' as VARCHAR(255)), CAST('measurement_type_concept_id' as VARCHAR(255)), CAST(NULL AS VARCHAR(255)), CAST(NULL AS VARCHAR(255)), CAST(NULL AS VARCHAR(255)), CAST('MEASUREMENT' as VARCHAR(255))), + (1306, CAST('Distribution of age by measurement_concept_id' as VARCHAR(255)), CAST('measurement_concept_id' as VARCHAR(255)), CAST('gender_concept_id' as VARCHAR(255)), CAST(NULL AS VARCHAR(255)), CAST(NULL AS VARCHAR(255)), CAST(NULL AS VARCHAR(255)), CAST('MEASUREMENT' as VARCHAR(255))), + (1307, CAST('Number of measurement occurrence records, by measurement_concept_id and unit_concept_id' as VARCHAR(255)), CAST('measurement_concept_id' as VARCHAR(255)), CAST('unit_concept_id' as VARCHAR(255)), CAST(NULL AS VARCHAR(255)), CAST(NULL AS VARCHAR(255)), CAST(NULL AS VARCHAR(255)), CAST('MEASUREMENT' as VARCHAR(255))), + (1309, CAST('Number of measurement records with invalid person_id' as VARCHAR(255)), CAST(NULL AS VARCHAR(255)), CAST(NULL AS VARCHAR(255)), CAST(NULL AS VARCHAR(255)), CAST(NULL AS VARCHAR(255)), CAST(NULL AS VARCHAR(255)), CAST('MEASUREMENT' as VARCHAR(255))), + (1310, CAST('Number of measurement records outside valid measurement period' as VARCHAR(255)), CAST(NULL AS VARCHAR(255)), CAST(NULL AS VARCHAR(255)), CAST(NULL AS VARCHAR(255)), CAST(NULL AS VARCHAR(255)), CAST(NULL AS VARCHAR(255)), CAST('MEASUREMENT' as VARCHAR(255))), + (1312, CAST('Number of measurement records with invalid provider_id' as VARCHAR(255)), CAST(NULL AS VARCHAR(255)), CAST(NULL AS VARCHAR(255)), CAST(NULL AS VARCHAR(255)), CAST(NULL AS VARCHAR(255)), CAST(NULL AS VARCHAR(255)), CAST('MEASUREMENT' as VARCHAR(255))), + (1313, CAST('Number of measurement records with invalid visit_id' as VARCHAR(255)), CAST(NULL AS VARCHAR(255)), CAST(NULL AS VARCHAR(255)), CAST(NULL AS VARCHAR(255)), CAST(NULL AS VARCHAR(255)), CAST(NULL AS VARCHAR(255)), CAST('MEASUREMENT' as VARCHAR(255))), + (1314, CAST('Number of measurement records with no value (numeric, string, or concept)' as VARCHAR(255)), CAST(NULL AS VARCHAR(255)), CAST(NULL AS VARCHAR(255)), CAST(NULL AS VARCHAR(255)), CAST(NULL AS VARCHAR(255)), CAST(NULL AS VARCHAR(255)), CAST('MEASUREMENT' as VARCHAR(255))), + (1315, CAST('Distribution of numeric values, by measurement_concept_id and unit_concept_id' as VARCHAR(255)), CAST(NULL AS VARCHAR(255)), CAST(NULL AS VARCHAR(255)), CAST(NULL AS VARCHAR(255)), CAST(NULL AS VARCHAR(255)), CAST(NULL AS VARCHAR(255)), CAST('MEASUREMENT' as VARCHAR(255))), + (1316, CAST('Distribution of low range, by measurement_concept_id and unit_concept_id' as VARCHAR(255)), CAST(NULL AS VARCHAR(255)), CAST(NULL AS VARCHAR(255)), CAST(NULL AS VARCHAR(255)), CAST(NULL AS VARCHAR(255)), CAST(NULL AS VARCHAR(255)), CAST('MEASUREMENT' as VARCHAR(255))), + (1317, CAST('Distribution of high range, by measurement_concept_id and unit_concept_id' as VARCHAR(255)), CAST(NULL AS VARCHAR(255)), CAST(NULL AS VARCHAR(255)), CAST(NULL AS VARCHAR(255)), CAST(NULL AS VARCHAR(255)), CAST(NULL AS VARCHAR(255)), CAST('MEASUREMENT' as VARCHAR(255))), + (1318, CAST('Number of measurement records below/within/above normal range, by measurement_concept_id and unit_concept_id' as VARCHAR(255)), CAST(NULL AS VARCHAR(255)), CAST(NULL AS VARCHAR(255)), CAST(NULL AS VARCHAR(255)), CAST(NULL AS VARCHAR(255)), CAST(NULL AS VARCHAR(255)), CAST('MEASUREMENT' as VARCHAR(255))), + (1320, CAST('Number of measurement records by measurement start month' as VARCHAR(255)), CAST('calendar month' as VARCHAR(255)), CAST(NULL AS VARCHAR(255)), CAST(NULL AS VARCHAR(255)), CAST(NULL AS VARCHAR(255)), CAST(NULL AS VARCHAR(255)), CAST('MEASUREMENT' as VARCHAR(255))), + (1700, CAST('Number of records by cohort_definition_id' as VARCHAR(255)), CAST('cohort_definition_id' as VARCHAR(255)), CAST(NULL AS VARCHAR(255)), CAST(NULL AS VARCHAR(255)), CAST(NULL AS VARCHAR(255)), CAST(NULL AS VARCHAR(255)), CAST('COHORT' as VARCHAR(255))), + (1701, CAST('Number of records with cohort end date < cohort start date' as VARCHAR(255)), CAST(NULL AS VARCHAR(255)), CAST(NULL AS VARCHAR(255)), CAST(NULL AS VARCHAR(255)), CAST(NULL AS VARCHAR(255)), CAST(NULL AS VARCHAR(255)), CAST('COHORT' as VARCHAR(255))), + (1800, CAST('Number of persons by age, with age at cohort start' as VARCHAR(255)), CAST('age' as VARCHAR(255)), CAST(NULL AS VARCHAR(255)), CAST(NULL AS VARCHAR(255)), CAST(NULL AS VARCHAR(255)), CAST(NULL AS VARCHAR(255)), CAST('COHORT_SPECIFIC_ANALYSES' as VARCHAR(255))), + (1801, CAST('Distribution of age at cohort start' as VARCHAR(255)), CAST(NULL AS VARCHAR(255)), CAST(NULL AS VARCHAR(255)), CAST(NULL AS VARCHAR(255)), CAST(NULL AS VARCHAR(255)), CAST(NULL AS VARCHAR(255)), CAST('COHORT_SPECIFIC_ANALYSES' as VARCHAR(255))), + (1802, CAST('Distribution of age at cohort start by gender' as VARCHAR(255)), CAST('gender_concept_id' as VARCHAR(255)), CAST(NULL AS VARCHAR(255)), CAST(NULL AS VARCHAR(255)), CAST(NULL AS VARCHAR(255)), CAST(NULL AS VARCHAR(255)), CAST('COHORT_SPECIFIC_ANALYSES' as VARCHAR(255))), + (1803, CAST('Distribution of age at cohort start by cohort start year' as VARCHAR(255)), CAST('calendar year' as VARCHAR(255)), CAST(NULL AS VARCHAR(255)), CAST(NULL AS VARCHAR(255)), CAST(NULL AS VARCHAR(255)), CAST(NULL AS VARCHAR(255)), CAST('COHORT_SPECIFIC_ANALYSES' as VARCHAR(255))), + (1804, CAST('Number of persons by duration from cohort start to cohort end, in 30d increments' as VARCHAR(255)), CAST('Cohort period length 30d increments' as VARCHAR(255)), CAST(NULL AS VARCHAR(255)), CAST(NULL AS VARCHAR(255)), CAST(NULL AS VARCHAR(255)), CAST(NULL AS VARCHAR(255)), CAST('COHORT_SPECIFIC_ANALYSES' as VARCHAR(255))), + (1805, CAST('Number of persons by duration from observation start to cohort start, in 30d increments' as VARCHAR(255)), CAST('Baseline period length 30d increments' as VARCHAR(255)), CAST(NULL AS VARCHAR(255)), CAST(NULL AS VARCHAR(255)), CAST(NULL AS VARCHAR(255)), CAST(NULL AS VARCHAR(255)), CAST('COHORT_SPECIFIC_ANALYSES' as VARCHAR(255))), + (1806, CAST('Number of persons by duration from cohort start to observation end, in 30d increments' as VARCHAR(255)), CAST('Follow-up period length 30d increments' as VARCHAR(255)), CAST(NULL AS VARCHAR(255)), CAST(NULL AS VARCHAR(255)), CAST(NULL AS VARCHAR(255)), CAST(NULL AS VARCHAR(255)), CAST('COHORT_SPECIFIC_ANALYSES' as VARCHAR(255))), + (1807, CAST('Number of persons by duration from cohort end to observation end, in 30d increments' as VARCHAR(255)), CAST('Post-cohort period length 30d increments' as VARCHAR(255)), CAST(NULL AS VARCHAR(255)), CAST(NULL AS VARCHAR(255)), CAST(NULL AS VARCHAR(255)), CAST(NULL AS VARCHAR(255)), CAST('COHORT_SPECIFIC_ANALYSES' as VARCHAR(255))), + (1808, CAST('Distribution of duration (days) from cohort start to cohort end' as VARCHAR(255)), CAST(NULL AS VARCHAR(255)), CAST(NULL AS VARCHAR(255)), CAST(NULL AS VARCHAR(255)), CAST(NULL AS VARCHAR(255)), CAST(NULL AS VARCHAR(255)), CAST('COHORT_SPECIFIC_ANALYSES' as VARCHAR(255))), + (1809, CAST('Distribution of duration (days) from cohort start to cohort end, by gender' as VARCHAR(255)), CAST('gender_concept_id' as VARCHAR(255)), CAST(NULL AS VARCHAR(255)), CAST(NULL AS VARCHAR(255)), CAST(NULL AS VARCHAR(255)),CAST(NULL AS VARCHAR(255)), CAST('COHORT_SPECIFIC_ANALYSES' as VARCHAR(255))), + (1810, CAST('Distribution of duration (days) from cohort start to cohort end, by age decile' as VARCHAR(255)), CAST('age decile' as VARCHAR(255)), CAST(NULL AS VARCHAR(255)), CAST(NULL AS VARCHAR(255)), CAST(NULL AS VARCHAR(255)), CAST(NULL AS VARCHAR(255)), CAST('COHORT_SPECIFIC_ANALYSES' as VARCHAR(255))), + (1811, CAST('Distribution of duration (days) from observation start to cohort start' as VARCHAR(255)), CAST(NULL AS VARCHAR(255)), CAST(NULL AS VARCHAR(255)), CAST(NULL AS VARCHAR(255)), CAST(NULL AS VARCHAR(255)), CAST(NULL AS VARCHAR(255)), CAST('COHORT_SPECIFIC_ANALYSES' as VARCHAR(255))), + (1812, CAST('Distribution of duration (days) from cohort start to observation end' as VARCHAR(255)), CAST(NULL AS VARCHAR(255)), CAST(NULL AS VARCHAR(255)), CAST(NULL AS VARCHAR(255)), CAST(NULL AS VARCHAR(255)), CAST(NULL AS VARCHAR(255)), CAST('COHORT_SPECIFIC_ANALYSES' as VARCHAR(255))), + (1813, CAST('Distribution of duration (days) from cohort end to observation end' as VARCHAR(255)), CAST(NULL AS VARCHAR(255)), CAST(NULL AS VARCHAR(255)), CAST(NULL AS VARCHAR(255)), CAST(NULL AS VARCHAR(255)), CAST(NULL AS VARCHAR(255)), CAST('COHORT_SPECIFIC_ANALYSES' as VARCHAR(255))), + (1814, CAST('Number of persons by cohort start year by gender by age decile' as VARCHAR(255)), CAST('calendar year' as VARCHAR(255)), CAST('gender_concept_id' as VARCHAR(255)), CAST('age decile' as VARCHAR(255)), CAST(NULL AS VARCHAR(255)), CAST(NULL AS VARCHAR(255)), CAST('COHORT_SPECIFIC_ANALYSES' as VARCHAR(255))), + (1815, CAST('Number of persons by cohort start month' as VARCHAR(255)), CAST('calendar month' as VARCHAR(255)), CAST(NULL AS VARCHAR(255)), CAST(NULL AS VARCHAR(255)), CAST(NULL AS VARCHAR(255)), CAST(NULL AS VARCHAR(255)), CAST('COHORT_SPECIFIC_ANALYSES' as VARCHAR(255))), + (1816, CAST('Number of persons by number of cohort periods' as VARCHAR(255)), CAST('number of cohort periods' as VARCHAR(255)), CAST(NULL AS VARCHAR(255)), CAST(NULL AS VARCHAR(255)), CAST(NULL AS VARCHAR(255)), CAST(NULL AS VARCHAR(255)), CAST('COHORT_SPECIFIC_ANALYSES' as VARCHAR(255))), + (1820, CAST('Number of persons by duration from cohort start to first occurrence of condition occurrence, by condition_concept_id' as VARCHAR(255)), CAST('condition_concept_id' as VARCHAR(255)), CAST('time-to-event 30d increments' as VARCHAR(255)), CAST(NULL AS VARCHAR(255)), CAST(NULL AS VARCHAR(255)), CAST(NULL AS VARCHAR(255)), CAST('COHORT_SPECIFIC_ANALYSES' as VARCHAR(255))), + (1821, CAST('Number of events by duration from cohort start to all occurrences of condition occurrence, by condition_concept_id' as VARCHAR(255)), CAST('condition_concept_id' as VARCHAR(255)), CAST('time-to-event 30d increments' as VARCHAR(255)), CAST(NULL AS VARCHAR(255)), CAST(NULL AS VARCHAR(255)), CAST(NULL AS VARCHAR(255)), CAST('COHORT_SPECIFIC_ANALYSES' as VARCHAR(255))), + (1830, CAST('Number of persons by duration from cohort start to first occurrence of procedure occurrence, by procedure_concept_id' as VARCHAR(255)), CAST('procedure_concept_id' as VARCHAR(255)), CAST('time-to-event 30d increments' as VARCHAR(255)), CAST(NULL AS VARCHAR(255)), CAST(NULL AS VARCHAR(255)), CAST(NULL AS VARCHAR(255)), CAST('COHORT_SPECIFIC_ANALYSES' as VARCHAR(255))), + (1831, CAST('Number of events by duration from cohort start to all occurrences of procedure occurrence, by procedure_concept_id' as VARCHAR(255)), CAST('procedure_concept_id' as VARCHAR(255)), CAST('time-to-event 30d increments' as VARCHAR(255)), CAST(NULL AS VARCHAR(255)), CAST(NULL AS VARCHAR(255)), CAST(NULL AS VARCHAR(255)), CAST('COHORT_SPECIFIC_ANALYSES' as VARCHAR(255))), + (1840, CAST('Number of persons by duration from cohort start to first occurrence of drug exposure, by drug_concept_id' as VARCHAR(255)), CAST('drug_concept_id' as VARCHAR(255)), CAST('time-to-event 30d increments' as VARCHAR(255)), CAST(NULL AS VARCHAR(255)), CAST(NULL AS VARCHAR(255)), CAST(NULL AS VARCHAR(255)), CAST('COHORT_SPECIFIC_ANALYSES' as VARCHAR(255))), + (1841, CAST('Number of events by duration from cohort start to all occurrences of drug exposure, by drug_concept_id' as VARCHAR(255)), CAST('drug_concept_id' as VARCHAR(255)), CAST('time-to-event 30d increments' as VARCHAR(255)), CAST(NULL AS VARCHAR(255)), CAST(NULL AS VARCHAR(255)), CAST(NULL AS VARCHAR(255)), CAST('COHORT_SPECIFIC_ANALYSES' as VARCHAR(255))), + (1850, CAST('Number of persons by duration from cohort start to first occurrence of observation, by observation_concept_id' as VARCHAR(255)), CAST('observation_concept_id' as VARCHAR(255)), CAST('time-to-event 30d increments' as VARCHAR(255)), CAST(NULL AS VARCHAR(255)), CAST(NULL AS VARCHAR(255)), CAST(NULL AS VARCHAR(255)), CAST('COHORT_SPECIFIC_ANALYSES' as VARCHAR(255))), + (1851, CAST('Number of events by duration from cohort start to all occurrences of observation, by observation_concept_id' as VARCHAR(255)), CAST('observation_concept_id' as VARCHAR(255)), CAST('time-to-event 30d increments' as VARCHAR(255)), CAST(NULL AS VARCHAR(255)), CAST(NULL AS VARCHAR(255)), CAST(NULL AS VARCHAR(255)), CAST('COHORT_SPECIFIC_ANALYSES' as VARCHAR(255))), + (1860, CAST('Number of persons by duration from cohort start to first occurrence of condition era, by condition_concept_id' as VARCHAR(255)), CAST('condition_concept_id' as VARCHAR(255)), CAST('time-to-event 30d increments' as VARCHAR(255)), CAST(NULL AS VARCHAR(255)), CAST(NULL AS VARCHAR(255)), CAST(NULL AS VARCHAR(255)), CAST('COHORT_SPECIFIC_ANALYSES' as VARCHAR(255))), + (1861, CAST('Number of events by duration from cohort start to all occurrences of condition era, by condition_concept_id' as VARCHAR(255)), CAST('condition_concept_id' as VARCHAR(255)), CAST('time-to-event 30d increments' as VARCHAR(255)), CAST(NULL AS VARCHAR(255)), CAST(NULL AS VARCHAR(255)), CAST(NULL AS VARCHAR(255)), CAST('COHORT_SPECIFIC_ANALYSES' as VARCHAR(255))), + (1870, CAST('Number of persons by duration from cohort start to first occurrence of drug era, by drug_concept_id' as VARCHAR(255)), CAST('drug_concept_id' as VARCHAR(255)), CAST('time-to-event 30d increments' as VARCHAR(255)), CAST(NULL AS VARCHAR(255)), CAST(NULL AS VARCHAR(255)), CAST(NULL AS VARCHAR(255)), CAST('COHORT_SPECIFIC_ANALYSES' as VARCHAR(255))), + (1871, CAST('Number of events by duration from cohort start to all occurrences of drug era, by drug_concept_id' as VARCHAR(255)), CAST('drug_concept_id' as VARCHAR(255)), CAST('time-to-event 30d increments' as VARCHAR(255)), CAST(NULL AS VARCHAR(255)), CAST(NULL AS VARCHAR(255)), CAST(NULL AS VARCHAR(255)), CAST('COHORT_SPECIFIC_ANALYSES' as VARCHAR(255))), + (4000, CAST('Distribution of observation period days by period_id in the 365 days prior to first cohort_start_date' as VARCHAR(255)), NULL, NULL, NULL, NULL, NULL,CAST('HEALTHCARE_UTILIZATION' as VARCHAR(255))), + (4001, CAST('Number of subjects with visits by period_id, by visit_concept_id, by visit_type_concept_id in the 365d prior to first cohort start date' as VARCHAR(255)), NULL, NULL, NULL, NULL, NULL, CAST('HEALTHCARE_UTILIZATION' as VARCHAR(255))), + (4002, CAST('Distribution of number of visit occurrence records per subject by period_id, by visit_concept_id, by visit_type_concept_id in 365d prior to cohort start date' as VARCHAR(255)), NULL, NULL, NULL, NULL, NULL, CAST('HEALTHCARE_UTILIZATION' as VARCHAR(255))), + (4003, CAST('Distribution of number of visit dates per subject by period_id, by visit_concept_id, by visit_type_concept_id in 365d prior to first cohort start date' as VARCHAR(255)), NULL, NULL, NULL, NULL, NULL, CAST('HEALTHCARE_UTILIZATION' as VARCHAR(255))), + (4003, CAST('Distribution of number of visit dates per subject by period_id, by visit_concept_id, by visit_type_concept_id in 365d prior to first cohort start date' as VARCHAR(255)), NULL, NULL, NULL, NULL, NULL, CAST('HEALTHCARE_UTILIZATION' as VARCHAR(255))), + (4004, CAST('Distribution of number of care_site+visit dates per subject by period_id, by visit_concept_id, by visit_type_concept_id in 365d prior to first cohort start date' as VARCHAR(255)), NULL, NULL, NULL, NULL, NULL, CAST('HEALTHCARE_UTILIZATION' as VARCHAR(255))), + (4005, CAST('Distribution of length of stay for inpatient visits per subject by period_id, by visit_concept_id, by visit_type_concept_id in the 365 days prior to first cohort_start_date' as VARCHAR(255)), NULL, NULL, NULL, NULL, NULL, CAST('HEALTHCARE_UTILIZATION' as VARCHAR(255))), + (4006, CAST('Distribution of observation period days per subject, by period_id during cohort period' as VARCHAR(255)), NULL, NULL, NULL, NULL, NULL, CAST('HEALTHCARE_UTILIZATION' as VARCHAR(255))), + (4007, CAST('Number of subjects with visits by period_id, by visit_concept_id, by visit_type_concept_id during the cohort period' as VARCHAR(255)), NULL, NULL, NULL, NULL, NULL, CAST('HEALTHCARE_UTILIZATION' as VARCHAR(255))), + (4008, CAST('Distribution of number of visit occurrence records per subject by period_id, by visit_concept_id, by visit_type_concept_id during the cohort period' as VARCHAR(255)), NULL, NULL, NULL, NULL, NULL, CAST('HEALTHCARE_UTILIZATION' as VARCHAR(255))), + (4009, CAST('Distribution of number of visit dates per subject by period_id, by visit_concept_id, by visit_type_concept_id during the cohort period' as VARCHAR(255)), NULL, NULL, NULL, NULL, NULL, CAST('HEALTHCARE_UTILIZATION' as VARCHAR(255))), + (4010, CAST('Distribution of number of care_site+visit dates per subject by period_id, by visit_concept_id, by visit_type_concept_id during the cohort period' as VARCHAR(255)), NULL, NULL, NULL, NULL, NULL, CAST('HEALTHCARE_UTILIZATION' as VARCHAR(255))), + (4011, CAST('Distribution of length of stay for inpatient visits per subject by period_id, by visit_concept_id, by visit_type_concept_id during cohort period' as VARCHAR(255)), NULL, NULL, NULL, NULL, NULL, CAST('HEALTHCARE_UTILIZATION' as VARCHAR(255))), + (4012, CAST('Number of subjects with Drug Exposure by period_id, by drug_concept_id, by drug_type_concept_id in the 365d prior to first cohort start date' as VARCHAR(255)), NULL, NULL, NULL, NULL, NULL, CAST('HEALTHCARE_UTILIZATION' as VARCHAR(255))), + (4013, CAST('Distribution of number of Drug Exposure records per subject, by period_id, by drug_concept_id in 365d prior to first cohort start date' as VARCHAR(255)), NULL, NULL, NULL, NULL, NULL, CAST('HEALTHCARE_UTILIZATION' as VARCHAR(255))), + (4014, CAST('Distribution of greater than 0 drug day supply per subject by period_id, by drug_concept_id in the 365d prior to first cohort start date' as VARCHAR(255)), NULL, NULL, NULL, NULL, NULL, CAST('HEALTHCARE_UTILIZATION' as VARCHAR(255))), + (4015, CAST('Distribution of greater than 0 drug quantity per subject by period_id, by drug_concept_id in the 365d prior to first cohort start date' as VARCHAR(255)), NULL, NULL, NULL, NULL, NULL, CAST('HEALTHCARE_UTILIZATION' as VARCHAR(255))), + (4016, CAST('Number of subjects with Drug Exposure by period_id, by drug_concept_id, by drug_type_concept_id during the cohort period' as VARCHAR(255)), NULL, NULL, NULL, NULL, NULL, CAST('HEALTHCARE_UTILIZATION' as VARCHAR(255))), + (4017, CAST('Distribution of number of Drug Exposure records per subject, by period_id, by drug_concept_id during the cohort period' as VARCHAR(255)), NULL, NULL, NULL, NULL, NULL, CAST('HEALTHCARE_UTILIZATION' as VARCHAR(255))), + (4018, CAST('Distribution of greater than 0 drug day supply per subject by period_id, by drug_concept_id during the cohort period' as VARCHAR(255)), NULL, NULL, NULL, NULL, NULL, CAST('HEALTHCARE_UTILIZATION' as VARCHAR(255))), + (4019, CAST('Distribution of greater than 0 drug quantity per subject by period_id, by drug_concept_id during the cohort period' as VARCHAR(255)), NULL, NULL, NULL, NULL, NULL, CAST('HEALTHCARE_UTILIZATION' as VARCHAR(255))), + (4020, CAST('Distribution of greater than 0 US$ cost per subject by period_id, by visit_concept_id, by visit_type_concept_id, by cost_concept_id, by cost_type_concept_id in the 365d prior to first cohort start date' as VARCHAR(255)), NULL, NULL, NULL, NULL, NULL, CAST('HEALTHCARE_UTILIZATION' as VARCHAR(255))), + (4021, CAST('Distribution of greater than 0 US$ cost per subject by period_id, by visit_concept_id, by visit_type_concept_id, by cost_concept_id, by cost_type_concept_id during the cohort period' as VARCHAR(255)), NULL, NULL, NULL, NULL, NULL, CAST('HEALTHCARE_UTILIZATION' as VARCHAR(255))), + (4022, CAST('Distribution of greater than 0 US$ cost per subject by period_id, by drug_concept_id, by drug_type_concept_id, by cost_concept_id, by cost_type_concept_id in the 365d prior to first cohort start date' as VARCHAR(255)), NULL, NULL, NULL, NULL, NULL, CAST('HEALTHCARE_UTILIZATION' as VARCHAR(255))), + (4023, CAST('Distribution of greater than 0 US$ cost per subject by period_id, by drug_concept_id, by drug_type_concept_id, by cost_concept_id, by cost_type_concept_id, by cost_type_concept_id during the cohort period' as VARCHAR(255)), NULL, NULL, NULL, NULL, NULL, CAST('HEALTHCARE_UTILIZATION' as VARCHAR(255))) +; \ No newline at end of file diff --git a/src/main/resources/resources/pathway/runPathwayAnalysis.sql b/src/main/resources/resources/pathway/runPathwayAnalysis.sql index 04b4df6513..26b79a9ee4 100644 --- a/src/main/resources/resources/pathway/runPathwayAnalysis.sql +++ b/src/main/resources/resources/pathway/runPathwayAnalysis.sql @@ -196,3 +196,6 @@ DROP TABLE #date_replacements; TRUNCATE TABLE #raw_events; DROP TABLE #raw_events; + +{@isHive == 'true'}?{DROP TABLE #person_dates; DROP TABLE #marked_dates; DROP TABLE #grouped_dates; DROP TABLE #replacements; +DROP TABLE #cohort_dates; DROP TABLE #time_periods; DROP TABLE #events;} \ No newline at end of file diff --git a/src/test/java/org/ohdsi/webapi/util/DataSourceDTOParserTest.java b/src/test/java/org/ohdsi/webapi/util/DataSourceDTOParserTest.java index b78547e209..40fa1b3a70 100644 --- a/src/test/java/org/ohdsi/webapi/util/DataSourceDTOParserTest.java +++ b/src/test/java/org/ohdsi/webapi/util/DataSourceDTOParserTest.java @@ -28,6 +28,7 @@ public class DataSourceDTOParserTest { "OAuthPvtKeyPath=C:\\SecureFiles\\ServiceKeyFile.p12;"; public static final String ORACLE_WO_PWD_CONN_STR = "jdbc:oracle:thin:@myhost:1521:orcl"; public static final String ORACLE_WITH_PWD_CONN_STR = "jdbc:oracle:thin:scott/tiger@myhost:1521:orcl"; + public static final String HIVE_CONN_STR = "jdbc:hive2://sandbox-hdp.hortonworks.com:2181/synpuf_531_orc;serviceDiscoveryMode=zooKeeper;zooKeeperNamespace=hiveserver2"; @Test public void parseDTO() { @@ -103,6 +104,12 @@ public void parseDTO() { assertThat(dto.getConnectionString(), is(ORACLE_WITH_PWD_CONN_STR)); assertThat(dto.getUsername(), is("scott")); assertThat(dto.getPassword(), is("tiger")); + + dto = DataSourceDTOParser.parseDTO(getHiveSource()); + assertThat(dto.getType(), is(DBMSType.HIVE)); + assertThat(dto.getConnectionString(), is(HIVE_CONN_STR)); + assertThat(dto.getUsername(), is(nullValue())); + assertThat(dto.getPassword(), is(nullValue())); } private Source getPostgreSQLPasswordSource() { @@ -190,4 +197,11 @@ private Source getPostgreSQLSource() { source.setSourceConnection(PGSQL_CONN_STR); return source; } + + private Source getHiveSource() { + Source source = new Source(); + source.setSourceDialect("hive"); + source.setSourceConnection(HIVE_CONN_STR); + return source; + } } \ No newline at end of file From 9708af5d6cd8796586416e8615d26cc0904b66aa Mon Sep 17 00:00:00 2001 From: Anastasiia Klochkova Date: Thu, 26 Sep 2019 11:03:24 +0200 Subject: [PATCH 2/8] removed comments --- pom.xml | 4 ---- 1 file changed, 4 deletions(-) diff --git a/pom.xml b/pom.xml index 6730232738..adf71dc8ce 100644 --- a/pom.xml +++ b/pom.xml @@ -1204,10 +1204,6 @@ hive-jdbc ${hive-jdbc.version} - - - - org.eclipse.jetty * From 39a747a1a233675c5b85090044cfe432a6386f12 Mon Sep 17 00:00:00 2001 From: Anastasiia Klochkova Date: Mon, 30 Sep 2019 14:09:29 +0200 Subject: [PATCH 3/8] changed circe version --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index adf71dc8ce..bf9d640c4e 100644 --- a/pom.xml +++ b/pom.xml @@ -636,7 +636,7 @@ org.ohdsi circe - 1.8.2-SNAPSHOT + 1.8.1-SNAPSHOT org.ohdsi From 148792a346e2f713f613b3edd09c5cfce8e1fcb4 Mon Sep 17 00:00:00 2001 From: Anastasiia Klochkova Date: Fri, 18 Oct 2019 13:42:04 +0200 Subject: [PATCH 4/8] removed hive profile --- pom.xml | 32 +------------------------------- src/main/extras/hive/README.md | 6 ------ 2 files changed, 1 insertion(+), 37 deletions(-) delete mode 100644 src/main/extras/hive/README.md diff --git a/pom.xml b/pom.xml index bf9d640c4e..a2b0636b86 100644 --- a/pom.xml +++ b/pom.xml @@ -185,8 +185,6 @@ classpath:config/ehcache.xml - 1.6.3-SNAPSHOT - 3.1.0 WebAPI @@ -497,7 +495,7 @@ org.ohdsi.sql SqlRender - ${SqlRender.version} + 1.6.3-SNAPSHOT commons-dbutils @@ -1196,33 +1194,5 @@ - - webapi-hive - - - org.apache.hive - hive-jdbc - ${hive-jdbc.version} - - - org.eclipse.jetty - * - - - tomcat - jasper-compiler - - - tomcat - jasper-runtime - - - com.sun.jersey - * - - - - - diff --git a/src/main/extras/hive/README.md b/src/main/extras/hive/README.md deleted file mode 100644 index 864f491d48..0000000000 --- a/src/main/extras/hive/README.md +++ /dev/null @@ -1,6 +0,0 @@ -To build WebAPI with Apache Hive LLAP support do the following: -1. Add to your hosts line: " sandbox-hdp.hortonworks.com" -2. Download the JDBC driver from http://sandbox-hdp.hortonworks.com:10002/jdbcjar -3. Set the hive.classpath property in your settings.xml to the archive location (ie: C://downloads/hive) inside the webapi-hive profile -4. Build WebAPI with webapi-hive profile: - * mvn -Pwebapi-hive clean package \ No newline at end of file From f0eac2f4e5d058bf82f2a3c873bb82f4844aea63 Mon Sep 17 00:00:00 2001 From: Anastasiia Klochkova Date: Mon, 28 Oct 2019 13:58:08 +0100 Subject: [PATCH 5/8] fixed script for result schema --- src/main/resources/ddl/results/heracles_results.sql | 2 +- src/main/resources/ddl/results/heracles_results_dist.sql | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/main/resources/ddl/results/heracles_results.sql b/src/main/resources/ddl/results/heracles_results.sql index 8ae9e40eef..431b115aea 100644 --- a/src/main/resources/ddl/results/heracles_results.sql +++ b/src/main/resources/ddl/results/heracles_results.sql @@ -1,4 +1,4 @@ ---HINT PARTITION(cohort_definition_id) +--HINT PARTITION(cohort_definition_id int) --HINT BUCKET(analysis_id, 64) IF OBJECT_ID('@results_schema.heracles_results', 'U') IS NULL create table @results_schema.heracles_results diff --git a/src/main/resources/ddl/results/heracles_results_dist.sql b/src/main/resources/ddl/results/heracles_results_dist.sql index 8c84300d19..ae214b4083 100644 --- a/src/main/resources/ddl/results/heracles_results_dist.sql +++ b/src/main/resources/ddl/results/heracles_results_dist.sql @@ -1,4 +1,4 @@ ---HINT PARTITION(cohort_definition_id) +--HINT PARTITION(cohort_definition_id int) --HINT BUCKET(analysis_id, 64) IF OBJECT_ID('@results_schema.heracles_results_dist', 'U') IS NULL create table @results_schema.heracles_results_dist From b70434ce2823e5a8ec2b50f2df617843f398b37e Mon Sep 17 00:00:00 2001 From: Anastasiia Klochkova Date: Wed, 30 Oct 2019 12:09:19 +0100 Subject: [PATCH 6/8] updated commons version --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index a2b0636b86..1e7ea83815 100644 --- a/pom.xml +++ b/pom.xml @@ -140,7 +140,7 @@ - 1.14.1-alpha2 + 1.14.1-alpha3 2.25.1 600000 12 From 27f638551d00f6fa9a0fceb6185d9d1f8d6cc5a4 Mon Sep 17 00:00:00 2001 From: Anastasiia Klochkova Date: Tue, 17 Mar 2020 18:07:32 +0100 Subject: [PATCH 7/8] added fix for zip4j updated versions in pom --- pom.xml | 6 +++--- ...ysisResultFileContentSensitiveInfoServiceImpl.java | 11 +++++------ .../service/ScriptExecutionServiceImpl.java | 2 +- 3 files changed, 9 insertions(+), 10 deletions(-) diff --git a/pom.xml b/pom.xml index 1e7ea83815..6d12d7b28e 100644 --- a/pom.xml +++ b/pom.xml @@ -140,7 +140,7 @@ - 1.14.1-alpha3 + 1.16.0-SNAPSHOT 2.25.1 600000 12 @@ -521,7 +521,7 @@ org.apache.commons commons-lang3 - 3.3.2 + 3.6 org.flywaydb @@ -634,7 +634,7 @@ org.ohdsi circe - 1.8.1-SNAPSHOT + 1.9.0-SNAPSHOT org.ohdsi diff --git a/src/main/java/org/ohdsi/webapi/executionengine/service/AnalysisResultFileContentSensitiveInfoServiceImpl.java b/src/main/java/org/ohdsi/webapi/executionengine/service/AnalysisResultFileContentSensitiveInfoServiceImpl.java index 97a0d32894..653e79dabd 100644 --- a/src/main/java/org/ohdsi/webapi/executionengine/service/AnalysisResultFileContentSensitiveInfoServiceImpl.java +++ b/src/main/java/org/ohdsi/webapi/executionengine/service/AnalysisResultFileContentSensitiveInfoServiceImpl.java @@ -1,7 +1,7 @@ package org.ohdsi.webapi.executionengine.service; import com.odysseusinc.arachne.execution_engine_common.util.CommonFileUtils; -import net.lingala.zip4j.core.ZipFile; +import net.lingala.zip4j.ZipFile; import net.lingala.zip4j.exception.ZipException; import org.apache.commons.collections.map.HashedMap; import org.apache.commons.io.FileUtils; @@ -156,9 +156,8 @@ private void processArchive(Path zipPath, Map variables) { // Delete archive volumes ZipFile zipFile = new ZipFile(zipPath.toFile()); - List filenames = zipFile.getSplitZipFiles(); - filenames.forEach(filename -> { - File file = new File(filename); + List filenames = zipFile.getSplitZipFiles(); + filenames.forEach(file -> { file.delete(); }); @@ -170,10 +169,10 @@ private void processArchive(Path zipPath, Map variables) { } }); CommonFileUtils.compressAndSplit(temporaryDir, zipPath.toFile(), null); - } catch (IOException e) { - LOGGER.error("File writing error", e); } catch (ZipException e) { LOGGER.error("Error unzipping file", e); + } catch (IOException e) { + LOGGER.error("File writing error", e); } finally { FileUtils.deleteQuietly(temporaryDir); } diff --git a/src/main/java/org/ohdsi/webapi/executionengine/service/ScriptExecutionServiceImpl.java b/src/main/java/org/ohdsi/webapi/executionengine/service/ScriptExecutionServiceImpl.java index 6db048b2f5..4bfbb93fd2 100644 --- a/src/main/java/org/ohdsi/webapi/executionengine/service/ScriptExecutionServiceImpl.java +++ b/src/main/java/org/ohdsi/webapi/executionengine/service/ScriptExecutionServiceImpl.java @@ -145,7 +145,7 @@ public void runScript(Long executionId, Source source, List files, } finally { FileUtils.deleteQuietly(tempDir); } - }catch (ZipException | IOException e) { + }catch (IOException e) { log.error("Failed to compress request files", e); throw new InternalServerErrorException(e); } From 050853147667530fee9be6044f34cbb9d64d2d94 Mon Sep 17 00:00:00 2001 From: Anastasiia Klochkova Date: Wed, 18 Mar 2020 13:55:00 +0100 Subject: [PATCH 8/8] updated SqlRender version --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index 6d12d7b28e..20a7219057 100644 --- a/pom.xml +++ b/pom.xml @@ -495,7 +495,7 @@ org.ohdsi.sql SqlRender - 1.6.3-SNAPSHOT + 1.6.4-SNAPSHOT commons-dbutils