From 493d1525e8bb34e46bd2dd8e530015180fcf0456 Mon Sep 17 00:00:00 2001 From: Benjamin Amor Date: Thu, 4 Jun 2020 18:06:28 -0400 Subject: [PATCH 01/14] getting testing class set up --- .vscode/settings.json | 9 + CIRCE.srctrlbm | Bin 0 -> 9216 bytes CIRCE.srctrldb | Bin 0 -> 20480 bytes CIRCE.srctrlprj | 19 + pom.xml | 2 +- .../maven/effective-pom.xml | 384 ++++++++++++++++++ src/main/java/org/ohdsi/circe/TestClass.java | 57 +++ 7 files changed, 470 insertions(+), 1 deletion(-) create mode 100644 .vscode/settings.json create mode 100644 CIRCE.srctrlbm create mode 100644 CIRCE.srctrldb create mode 100644 CIRCE.srctrlprj create mode 100644 sourcetrail_dependencies/a0dfeb2e-8887-4025-8a71-60058de86a5f/maven/effective-pom.xml create mode 100644 src/main/java/org/ohdsi/circe/TestClass.java diff --git a/.vscode/settings.json b/.vscode/settings.json new file mode 100644 index 00000000..4badee0b --- /dev/null +++ b/.vscode/settings.json @@ -0,0 +1,9 @@ +{ + "java.configuration.updateBuildConfiguration": "interactive", + "files.exclude": { + "**/.classpath": true, + "**/.project": true, + "**/.settings": true, + "**/.factorypath": true + } +} \ No newline at end of file diff --git a/CIRCE.srctrlbm b/CIRCE.srctrlbm new file mode 100644 index 0000000000000000000000000000000000000000..4ed30e15d1998cb133eea19346b87a58ad110a90 GIT binary patch literal 9216 zcmeHNL2ueH6t+nq?WAd!p=gInzEm25sq6LwRz}?ljfOR3Qqc~P3m%FfqzWz)J4}N1 z2kfxFu)ns${z5NvP(qz7XgzE@z_W1hb6%ePea=%3-|L*WJi*DQAoQ6auaS;0Mn{Ao zgbdktWlvg34)ny3|5zEX8ye`vk4MGGS-XpTcC|a)N8ixbbq}CY(U_kV4YOLsi*vy) zNBlAfhCU02yzh>Ke%35CY+83Haq4edlw^FLdwtTh9C}J^VznJ&eQ336WWqy_jl9os zKzGc1P8@pS)W}KOrp;4}yrW(DY=zkLgxb_<(2g3KkGRjrV(HPg$T4kExr0W%)2JWQ z8hLLw&+2wJ2~wF~=!SWCh!-ETc;Z0HuH%{FI#l;d=KxFMxVf-ZY>H-%6E7IQit<18Ro__r01Oxa z2C@u5{%08h8yMIg1|a{p=d1xKFpy;c@;}Q6*ucQ{FaY_#J!cI_fq^UoQU2>vlGDCx z`-M0EOPkB?B5i~ICqVxL{qJ5t{x|wxq<&VS{4W%CkoHnuplvM!i~Z8F=HeEoG;UcU z!TSTX<{~nUl=7U&-?6VELg&|9OoHpM$CtGnYUzbil_6L-;NmxrXlYl>u6R=VAWJ!v VSga?!sd7)Pcldj?92-`f@(Uri{f__u literal 0 HcmV?d00001 diff --git a/CIRCE.srctrldb b/CIRCE.srctrldb new file mode 100644 index 0000000000000000000000000000000000000000..df4e65636ed7e57c150280d7881176cb60b49c96 GIT binary patch literal 20480 zcmeHPPfz1U6!*kQys(7rpGEF!Rdpyr!Xk(w)I+tGrr<^CLZBfl!O8VH1GUz%Y2u*L zo*de5(Q6Mq^fT<<`!Oo@UTIZT+Dm5~JDxEPBAczMgcr%q_|44Ad%y8`tlxW+!>@L2 zpWqX(-7^dJ`&~L<*hZRfG+MlxpS}V(cu{QVR*Ye-} z;;=6No4k-$dL*x?3k&F{HQ#*Z5YjvikHS`6uQYVrsC==jV!{c2pdu)Nlp=ThS%9}+=c9D#KEm6-(BGM;gj!}451`DCK7V%AXD|5Eu&qSpUa@4>|(^6O91O|A`(xFdh&X3xN`PA?2h%LjOns zdLe&;UZGcGDIB$P@6nv1E-s=UDnk5nKm*qc|>wKde+3vnClSTsz_BArh9 z`aJ=;bnOcJ?IBx2v$vA+v5Kg3>c)(vH;l2s`akLe3)%w$(}Mu;f73IT;0YiwDgv8Ne2$!;%c+6Z&^sPE7A{1Z*n9n5*&IrrUA)+-;X;@V-G>_O)!RHf>bi LW~r!-%mx1oG;;SD literal 0 HcmV?d00001 diff --git a/CIRCE.srctrlprj b/CIRCE.srctrlprj new file mode 100644 index 00000000..3824d6ae --- /dev/null +++ b/CIRCE.srctrlprj @@ -0,0 +1,19 @@ + + + + + 12 + + pom.xml + 0 + + Java Source Group from Maven + + .java + + enabled + Java Source Group from Maven + + + 8 + diff --git a/pom.xml b/pom.xml index 10d26987..14d996e3 100644 --- a/pom.xml +++ b/pom.xml @@ -138,7 +138,7 @@ org.ohdsi.sql SqlRender 1.6.3 - test + compile com.opentable.components diff --git a/sourcetrail_dependencies/a0dfeb2e-8887-4025-8a71-60058de86a5f/maven/effective-pom.xml b/sourcetrail_dependencies/a0dfeb2e-8887-4025-8a71-60058de86a5f/maven/effective-pom.xml new file mode 100644 index 00000000..498f323e --- /dev/null +++ b/sourcetrail_dependencies/a0dfeb2e-8887-4025-8a71-60058de86a5f/maven/effective-pom.xml @@ -0,0 +1,384 @@ + + + + + + + + + + + + + + 4.0.0 + org.ohdsi + circe + 1.9.0-SNAPSHOT + + 1.8 + 1.8 + + + + com.fasterxml.jackson.core + jackson-annotations + 2.9.9 + compile + + + com.fasterxml.jackson.core + jackson-databind + 2.9.10.4 + compile + + + org.apache.commons + commons-lang3 + 3.6 + compile + + + commons-io + commons-io + 2.5 + compile + + + junit + junit + 4.12 + test + + + org.hamcrest + java-hamcrest + 2.0.0.0 + test + + + org.ohdsi + standardized-analysis-utils + 1.2.0-SNAPSHOT + compile + + + org.ohdsi.sql + SqlRender + 1.6.3 + test + + + com.opentable.components + otj-pg-embedded + 0.13.3 + test + + + org.springframework.boot + spring-boot-starter-test + 1.5.20.RELEASE + test + + + org.springframework.boot + spring-boot-starter-jdbc + 1.5.20.RELEASE + test + + + org.dbunit + dbunit + 2.6.0 + test + + + com.github.mjeanroy + dbunit-plus + 2.0.1 + test + + + + + ohdsi + repo.ohdsi.org + http://repo.ohdsi.org:8085/nexus/content/repositories/releases + + + ohdsi.thirdparty + repo.ohdsi.org + http://repo.ohdsi.org:8085/nexus/content/repositories/thirdparty + + + + false + + + true + + ohdsi.snapshots + repo.ohdsi.org-snapshots + http://repo.ohdsi.org:8085/nexus/content/repositories/snapshots + + + + false + + central + Central Repository + https://repo.maven.apache.org/maven2 + + + + + + never + + + false + + central + Central Repository + https://repo.maven.apache.org/maven2 + + + + /Volumes/git/repositories/circe-be/src/main/java + /Volumes/git/repositories/circe-be/src/main/scripts + /Volumes/git/repositories/circe-be/src/test/java + /Volumes/git/repositories/circe-be/target/classes + /Volumes/git/repositories/circe-be/target/test-classes + + + /Volumes/git/repositories/circe-be/src/main/resources + + + + + /Volumes/git/repositories/circe-be/src/test/resources + + + /Volumes/git/repositories/circe-be/target + circe-1.9.0-SNAPSHOT + + + + maven-antrun-plugin + 1.3 + + + maven-assembly-plugin + 2.2-beta-5 + + + maven-dependency-plugin + 2.8 + + + maven-release-plugin + 2.5.3 + + + + + + org.jacoco + jacoco-maven-plugin + 0.8.5 + + + pre-unit-test + + prepare-agent + + + /Volumes/git/repositories/circe-be/target/coverage-reports/jacoco-ut.exec + surefireArgLine + + + + post-unit-test + test + + report + + + /Volumes/git/repositories/circe-be/target/coverage-reports/jacoco-ut.exec + /Volumes/git/repositories/circe-be/target/site/jacoco-ut + + + + + + maven-surefire-plugin + 2.15 + + + default-test + test + + test + + + ${surefireArgLine} + ${skip.unit.tests} + + **/IT*.java + + + + + + ${surefireArgLine} + ${skip.unit.tests} + + **/IT*.java + + + + + maven-clean-plugin + 2.5 + + + default-clean + clean + + clean + + + + + + maven-resources-plugin + 2.6 + + + default-testResources + process-test-resources + + testResources + + + + default-resources + process-resources + + resources + + + + + + maven-jar-plugin + 2.4 + + + default-jar + package + + jar + + + + + + maven-compiler-plugin + 3.1 + + + default-compile + compile + + compile + + + + default-testCompile + test-compile + + testCompile + + + + + + maven-install-plugin + 2.4 + + + default-install + install + + install + + + + + + maven-deploy-plugin + 2.7 + + + default-deploy + deploy + + deploy + + + + + + maven-site-plugin + 3.3 + + + default-site + site + + site + + + /Volumes/git/repositories/circe-be/target/site + + + org.apache.maven.plugins + maven-project-info-reports-plugin + + + + + + default-deploy + site-deploy + + deploy + + + /Volumes/git/repositories/circe-be/target/site + + + org.apache.maven.plugins + maven-project-info-reports-plugin + + + + + + + /Volumes/git/repositories/circe-be/target/site + + + org.apache.maven.plugins + maven-project-info-reports-plugin + + + + + + + + /Volumes/git/repositories/circe-be/target/site + + diff --git a/src/main/java/org/ohdsi/circe/TestClass.java b/src/main/java/org/ohdsi/circe/TestClass.java new file mode 100644 index 00000000..1d3bf848 --- /dev/null +++ b/src/main/java/org/ohdsi/circe/TestClass.java @@ -0,0 +1,57 @@ +package org.ohdsi.circe; + +import java.io.*; +import java.nio.charset.*; +import org.apache.commons.io.*; + +import org.ohdsi.circe.cohortdefinition.CohortExpression; +import org.ohdsi.circe.cohortdefinition.CohortExpressionQueryBuilder; +import org.ohdsi.circe.helper.ResourceHelper; +import org.ohdsi.sql.SqlRender; +import org.ohdsi.sql.SqlSplit; +import org.ohdsi.sql.SqlTranslate; + +public class TestClass { + + private static CohortExpressionQueryBuilder.BuildExpressionQueryOptions buildExpressionQueryOptions( + final int cohortId, final String resultsSchema) { + final CohortExpressionQueryBuilder.BuildExpressionQueryOptions options = new CohortExpressionQueryBuilder.BuildExpressionQueryOptions(); + options.cdmSchema = "cdm"; + options.cohortId = cohortId; + options.generateStats = true; + options.resultSchema = resultsSchema; + options.targetTable = resultsSchema + ".cohort"; + + return options; + } + + private static String buildExpressionSql(final CohortExpression expression, + final CohortExpressionQueryBuilder.BuildExpressionQueryOptions options) { + // build SQL + final CohortExpressionQueryBuilder builder = new CohortExpressionQueryBuilder(); + String cohortSql = builder.buildExpressionQuery(expression, options); + + // translate to PG + cohortSql = SqlRender.renderSql(SqlTranslate.translateSql(cohortSql, "postgresql"), null, null); + return cohortSql; + } + + private static String readFile(String path) throws IOException{ + File file = new File(path); + return FileUtils.readFileToString(file, StandardCharsets.UTF_8); + } + public static void main(String[] args) throws IOException { + System.out.println("Hello"); + final CohortExpressionQueryBuilder.BuildExpressionQueryOptions options = buildExpressionQueryOptions(1,"allCriteriaTest"); + + // load 'all' criteria json + final CohortExpression expression = CohortExpression + .fromJson(readFile("/Volumes/git/repositories/circe-be/src/test/resources/cohortgeneration/allCriteria/allCriteriaExpression.json")); + + // build Sql + final String cohortSql = buildExpressionSql(expression, options); + + System.out.println(cohortSql); + } + +} \ No newline at end of file From 74e445df4a280bce58f2ae4232e113001a3072e2 Mon Sep 17 00:00:00 2001 From: Benjamin Amor Date: Fri, 5 Jun 2020 10:13:18 -0400 Subject: [PATCH 02/14] first working version --- src/main/java/org/ohdsi/circe/TestClass.java | 18 +- .../CohortExpressionQueryBuilder.java | 64 +- .../resources/cohortdefinition/.DS_Store | Bin 0 -> 6148 bytes .../sql/additionalCriteria.sql | 2 +- .../cohortdefinition/sql/censoringInsert.sql | 2 +- .../cohortdefinition/sql/conditionEra.sql | 4 +- .../sql/conditionOccurrence.sql | 6 +- .../sql/dateOffsetStrategy.sql | 9 +- .../resources/cohortdefinition/sql/death.sql | 4 +- .../sql/demographicCriteria.sql | 4 +- .../cohortdefinition/sql/deviceExposure.sql | 2 +- .../cohortdefinition/sql/doseEra.sql | 2 +- .../cohortdefinition/sql/drugEra.sql | 2 +- .../cohortdefinition/sql/drugExposure.sql | 4 +- .../cohortdefinition/sql/eraConstructor.sql | 37 +- .../sql/eventTableExpression.sql | 6 +- .../cohortdefinition/sql/generateCohort.sql | 108 +- .../cohortdefinition/sql/inclusionrule.sql | 18 +- .../cohortdefinition/sql/locationRegion.sql | 4 +- .../cohortdefinition/sql/measurement.sql | 4 +- .../cohortdefinition/sql/observation.sql | 4 +- .../sql/observationPeriod.sql | 2 +- .../sql/primaryEventsQuery.sql | 4 +- .../sql/procedureOccurrence.sql | 4 +- .../cohortdefinition/sql/specimen.sql | 4 +- .../cohortdefinition/sql/visitOccurrence.sql | 2 +- .../cohortdefinition/sql/windowedCriteria.sql | 2 +- .../sql_old/additionalCriteria.sql | 5 + .../sql_old/censoringInsert.sql | 7 + .../cohortdefinition/sql_old/codesetQuery.sql | 7 + .../sql_old/cohortCensoredStats.sql | 7 + .../sql_old/cohortInclusionAnalysis.sql | 44 + .../cohortdefinition/sql_old/conditionEra.sql | 13 + .../sql_old/conditionOccurrence.sql | 13 + .../sql_old/customEraStrategy.sql | 65 + .../sql_old/dateOffsetStrategy.sql | 6 + .../cohortdefinition/sql_old/death.sql | 14 + .../sql_old/demographicCriteria.sql | 7 + .../sql_old/deviceExposure.sql | 13 + .../cohortdefinition/sql_old/doseEra.sql | 13 + .../cohortdefinition/sql_old/drugEra.sql | 13 + .../cohortdefinition/sql_old/drugExposure.sql | 14 + .../sql_old/eraConstructor.sql | 73 + .../sql_old/eventTableExpression.sql | 4 + .../sql_old/generateCohort.sql | 181 ++ .../cohortdefinition/sql_old/groupQuery.sql | 14 + .../sql_old/inclusionrule.sql | 9 + .../sql_old/locationRegion.sql | 18 + .../cohortdefinition/sql_old/measurement.sql | 13 + .../cohortdefinition/sql_old/observation.sql | 13 + .../sql_old/observationPeriod.sql | 13 + .../sql_old/payerPlanPeriod.sql | 13 + .../sql_old/primaryEventsQuery.sql | 16 + .../sql_old/procedureOccurrence.sql | 13 + .../cohortdefinition/sql_old/specimen.sql | 13 + .../sql_old/visitOccurrence.sql | 13 + .../sql_old/windowedCriteria.sql | 6 + .../active_projects/circe-be/cohort_sql.sql | 2620 +++++++++++++++++ ~/cohort_sql.sql | 2620 +++++++++++++++++ 59 files changed, 6047 insertions(+), 168 deletions(-) create mode 100644 src/main/resources/resources/cohortdefinition/.DS_Store create mode 100644 src/main/resources/resources/cohortdefinition/sql_old/additionalCriteria.sql create mode 100644 src/main/resources/resources/cohortdefinition/sql_old/censoringInsert.sql create mode 100644 src/main/resources/resources/cohortdefinition/sql_old/codesetQuery.sql create mode 100644 src/main/resources/resources/cohortdefinition/sql_old/cohortCensoredStats.sql create mode 100644 src/main/resources/resources/cohortdefinition/sql_old/cohortInclusionAnalysis.sql create mode 100644 src/main/resources/resources/cohortdefinition/sql_old/conditionEra.sql create mode 100644 src/main/resources/resources/cohortdefinition/sql_old/conditionOccurrence.sql create mode 100644 src/main/resources/resources/cohortdefinition/sql_old/customEraStrategy.sql create mode 100644 src/main/resources/resources/cohortdefinition/sql_old/dateOffsetStrategy.sql create mode 100644 src/main/resources/resources/cohortdefinition/sql_old/death.sql create mode 100644 src/main/resources/resources/cohortdefinition/sql_old/demographicCriteria.sql create mode 100644 src/main/resources/resources/cohortdefinition/sql_old/deviceExposure.sql create mode 100644 src/main/resources/resources/cohortdefinition/sql_old/doseEra.sql create mode 100644 src/main/resources/resources/cohortdefinition/sql_old/drugEra.sql create mode 100644 src/main/resources/resources/cohortdefinition/sql_old/drugExposure.sql create mode 100644 src/main/resources/resources/cohortdefinition/sql_old/eraConstructor.sql create mode 100644 src/main/resources/resources/cohortdefinition/sql_old/eventTableExpression.sql create mode 100644 src/main/resources/resources/cohortdefinition/sql_old/generateCohort.sql create mode 100644 src/main/resources/resources/cohortdefinition/sql_old/groupQuery.sql create mode 100644 src/main/resources/resources/cohortdefinition/sql_old/inclusionrule.sql create mode 100644 src/main/resources/resources/cohortdefinition/sql_old/locationRegion.sql create mode 100644 src/main/resources/resources/cohortdefinition/sql_old/measurement.sql create mode 100644 src/main/resources/resources/cohortdefinition/sql_old/observation.sql create mode 100644 src/main/resources/resources/cohortdefinition/sql_old/observationPeriod.sql create mode 100644 src/main/resources/resources/cohortdefinition/sql_old/payerPlanPeriod.sql create mode 100644 src/main/resources/resources/cohortdefinition/sql_old/primaryEventsQuery.sql create mode 100644 src/main/resources/resources/cohortdefinition/sql_old/procedureOccurrence.sql create mode 100644 src/main/resources/resources/cohortdefinition/sql_old/specimen.sql create mode 100644 src/main/resources/resources/cohortdefinition/sql_old/visitOccurrence.sql create mode 100644 src/main/resources/resources/cohortdefinition/sql_old/windowedCriteria.sql create mode 100644 ~/Documents/active_projects/circe-be/cohort_sql.sql create mode 100644 ~/cohort_sql.sql diff --git a/src/main/java/org/ohdsi/circe/TestClass.java b/src/main/java/org/ohdsi/circe/TestClass.java index 1d3bf848..32d4303f 100644 --- a/src/main/java/org/ohdsi/circe/TestClass.java +++ b/src/main/java/org/ohdsi/circe/TestClass.java @@ -16,12 +16,12 @@ public class TestClass { private static CohortExpressionQueryBuilder.BuildExpressionQueryOptions buildExpressionQueryOptions( final int cohortId, final String resultsSchema) { final CohortExpressionQueryBuilder.BuildExpressionQueryOptions options = new CohortExpressionQueryBuilder.BuildExpressionQueryOptions(); - options.cdmSchema = "cdm"; + options.cdmSchema = "/UNITE/Safe Harbor - TUFTS/transform"; options.cohortId = cohortId; - options.generateStats = true; + options.generateStats = false; options.resultSchema = resultsSchema; - options.targetTable = resultsSchema + ".cohort"; - + options.targetTable = "/UNITE/Palantir/OMOP FeatureExtraction/covid_serious_outcomes_plp/cohort"; + options.codelistDataset = "`/UNITE/Palantir/OMOP FeatureExtraction/code_lists/serious_covid_outcomes/mappedConcepts`"; return options; } @@ -32,7 +32,7 @@ private static String buildExpressionSql(final CohortExpression expression, String cohortSql = builder.buildExpressionQuery(expression, options); // translate to PG - cohortSql = SqlRender.renderSql(SqlTranslate.translateSql(cohortSql, "postgresql"), null, null); + //cohortSql = SqlRender.renderSql(SqlTranslate.translateSql(cohortSql, "postgresql"), null, null); return cohortSql; } @@ -46,12 +46,12 @@ public static void main(String[] args) throws IOException { // load 'all' criteria json final CohortExpression expression = CohortExpression - .fromJson(readFile("/Volumes/git/repositories/circe-be/src/test/resources/cohortgeneration/allCriteria/allCriteriaExpression.json")); + .fromJson(readFile("/Users/bamor/Documents/active_projects/circe-be/cohort_O.json")); // build Sql - final String cohortSql = buildExpressionSql(expression, options); - - System.out.println(cohortSql); + String cohortSql = buildExpressionSql(expression, options); + cohortSql = SqlRender.renderSql(cohortSql, null, null); + FileUtils.writeStringToFile(new File("/Users/bamor/Documents/active_projects/circe-be/cohort_O.sql"), cohortSql, StandardCharsets.UTF_8); } } \ No newline at end of file diff --git a/src/main/java/org/ohdsi/circe/cohortdefinition/CohortExpressionQueryBuilder.java b/src/main/java/org/ohdsi/circe/cohortdefinition/CohortExpressionQueryBuilder.java index dfcf24b6..b780f74c 100644 --- a/src/main/java/org/ohdsi/circe/cohortdefinition/CohortExpressionQueryBuilder.java +++ b/src/main/java/org/ohdsi/circe/cohortdefinition/CohortExpressionQueryBuilder.java @@ -80,7 +80,7 @@ public class CohortExpressionQueryBuilder implements IGetCriteriaSqlDispatcher, private final static String DATE_OFFSET_STRATEGY_TEMPLATE = ResourceHelper.GetResourceAsString("/resources/cohortdefinition/sql/dateOffsetStrategy.sql"); private final static String CUSTOM_ERA_STRATEGY_TEMPLATE = ResourceHelper.GetResourceAsString("/resources/cohortdefinition/sql/customEraStrategy.sql"); - private final static String DEFAULT_DRUG_EXPOSURE_END_DATE_EXPRESSION = "COALESCE(DRUG_EXPOSURE_END_DATE, DATEADD(day,DAYS_SUPPLY,DRUG_EXPOSURE_START_DATE), DATEADD(day,1,DRUG_EXPOSURE_START_DATE))"; + private final static String DEFAULT_DRUG_EXPOSURE_END_DATE_EXPRESSION = "COALESCE(drug_exposure_end_date, date_add(drug_exposure_start_date, days_supply), date_add(drug_exposure_start_date, 1))"; // Builders private final static ConditionOccurrenceSqlBuilder conditionOccurrenceSqlBuilder = new ConditionOccurrenceSqlBuilder<>(); @@ -125,6 +125,9 @@ public static class BuildExpressionQueryOptions { @JsonProperty("generateStats") public boolean generateStats; + @JsonProperty("codelistDataset") + public String codelistDataset; + public static CohortExpressionQueryBuilder.BuildExpressionQueryOptions fromJson(String json) { try { CohortExpressionQueryBuilder.BuildExpressionQueryOptions options @@ -208,7 +211,7 @@ public String getPrimaryEventsQuery(PrimaryCriteria primaryCriteria) { ArrayList primaryEventsFilters = new ArrayList<>(); primaryEventsFilters.add(String.format( - "DATEADD(day,%d,OP.OBSERVATION_PERIOD_START_DATE) <= E.START_DATE AND DATEADD(day,%d,E.START_DATE) <= OP.OBSERVATION_PERIOD_END_DATE", + "date_add(op.observation_period_start_date, %d) <= E.start_date AND date_add(E.start_date, %d) <= op.observation_period_end_date", primaryCriteria.observationWindow.priorDays, primaryCriteria.observationWindow.postDays ) @@ -225,7 +228,7 @@ public String getPrimaryEventsQuery(PrimaryCriteria primaryCriteria) { public String getFinalCohortQuery(Period censorWindow) { String query = "select @target_cohort_id as @cohort_id_field_name, person_id, @start_date, @end_date \n" - + "FROM #final_cohort CO"; + + "FROM final_cohort"; String startDate = "start_date"; String endDate = "end_date"; @@ -291,19 +294,14 @@ public String buildExpressionQuery(CohortExpression expression, BuildExpressionQ String inclusionRuleInsert = getInclusionRuleQuery(cg); inclusionRuleInsert = StringUtils.replace(inclusionRuleInsert, "@inclusion_rule_id", "" + i); inclusionRuleInserts.add(inclusionRuleInsert); - inclusionRuleTempTables.add(String.format("#Inclusion_%d", i)); + inclusionRuleTempTables.add(String.format("Inclusion_%d", i)); } - String irTempUnion = inclusionRuleTempTables.stream() .map(d -> String.format("select inclusion_rule_id, person_id, event_id from %s", d)) .collect(Collectors.joining("\nUNION ALL\n")); - inclusionRuleInserts.add(String.format("SELECT inclusion_rule_id, person_id, event_id\nINTO #inclusion_events\nFROM (%s) I;", irTempUnion)); - - inclusionRuleInserts.addAll(inclusionRuleTempTables.stream() - .map(d -> String.format("TRUNCATE TABLE %s;\nDROP TABLE %s;\n", d, d)) - .collect(Collectors.toList()) - ); + inclusionRuleInserts.add(String.format("inclusion_events AS (\nSELECT inclusion_rule_id, person_id, event_id\nFROM (%s) ), \n", irTempUnion)); + System.out.println(StringUtils.join(inclusionRuleInserts, "\n")); resultSql = StringUtils.replace(resultSql, "@inclusionCohortInserts", StringUtils.join(inclusionRuleInserts, "\n")); } else { resultSql = StringUtils.replace(resultSql, "@inclusionCohortInserts", "create table #inclusion_events (inclusion_rule_id bigint,\n\tperson_id bigint,\n\tevent_id bigint\n);"); @@ -322,14 +320,13 @@ public String buildExpressionQuery(CohortExpression expression, BuildExpressionQ ArrayList endDateSelects = new ArrayList<>(); if (!(expression.endStrategy instanceof DateOffsetStrategy)) { - endDateSelects.add("-- By default, cohort exit at the event's op end date\nselect event_id, person_id, op_end_date as end_date from #included_events"); + endDateSelects.add("-- By default, cohort exit at the event's op end date\nselect event_id, person_id, op_end_date as end_date from included_events"); } if (expression.endStrategy != null) { // replace @strategy_ends placeholders with temp table creation and cleanup scripts. - resultSql = StringUtils.replace(resultSql, "@strategy_ends_temp_tables", expression.endStrategy.accept(this, "#included_events")); - resultSql = StringUtils.replace(resultSql, "@strategy_ends_cleanup", "TRUNCATE TABLE #strategy_ends;\nDROP TABLE #strategy_ends;\n"); - endDateSelects.add(String.format("-- End Date Strategy\n%s\n", "SELECT event_id, person_id, end_date from #strategy_ends")); + resultSql = StringUtils.replace(resultSql, "@strategy_ends_temp_tables", expression.endStrategy.accept(this, "included_events")); + endDateSelects.add(String.format("-- End Date Strategy\n%s\n", "SELECT event_id, person_id, end_date from strategy_ends")); } else { // replace @trategy_ends placeholders with empty string resultSql = StringUtils.replace(resultSql, "@strategy_ends_temp_tables", ""); @@ -346,8 +343,8 @@ public String buildExpressionQuery(CohortExpression expression, BuildExpressionQ resultSql = StringUtils.replace(resultSql, "@eraconstructorpad", Integer.toString(expression.collapseSettings.eraPad)); - resultSql = StringUtils.replace(resultSql, "@inclusionImpactAnalysisByEventQuery", getInclusionAnalysisQuery("#qualified_events", 0)); - resultSql = StringUtils.replace(resultSql, "@inclusionImpactAnalysisByPersonQuery", getInclusionAnalysisQuery("#best_events", 1)); + resultSql = StringUtils.replace(resultSql, "@inclusionImpactAnalysisByEventQuery", getInclusionAnalysisQuery("qualified_events", 0)); + resultSql = StringUtils.replace(resultSql, "@inclusionImpactAnalysisByPersonQuery", getInclusionAnalysisQuery("best_events", 1)); resultSql = StringUtils.replace(resultSql, "@cohortCensoredStatsQuery", (expression.censorWindow != null && (!StringUtils.isEmpty(expression.censorWindow.startDate) || !StringUtils.isEmpty(expression.censorWindow.endDate))) @@ -373,6 +370,9 @@ public String buildExpressionQuery(CohortExpression expression, BuildExpressionQ if (options.cohortId != null) { resultSql = StringUtils.replace(resultSql, "@target_cohort_id", options.cohortId.toString()); } + if (options.codelistDataset != null) { + resultSql = StringUtils.replace(resultSql, "#Codesets", options.codelistDataset.toString()); + } resultSql = StringUtils.replace(resultSql, "@generateStats", options.generateStats ? "1" : "0"); @@ -456,7 +456,7 @@ public String getCriteriaGroupQuery(CriteriaGroup group, String eventTable) { private String getInclusionRuleQuery(CriteriaGroup inclusionRule) { String resultSql = INCLUSION_RULE_QUERY_TEMPLATE; - String additionalCriteriaQuery = "\nJOIN (\n" + getCriteriaGroupQuery(inclusionRule, "#qualified_events") + ") AC on AC.person_id = pe.person_id AND AC.event_id = pe.event_id"; + String additionalCriteriaQuery = "\nJOIN (\n" + getCriteriaGroupQuery(inclusionRule, "qualified_events") + ") AC on AC.person_id = pe.person_id AND AC.event_id = pe.event_id"; additionalCriteriaQuery = StringUtils.replace(additionalCriteriaQuery, "@indexId", "" + 0); resultSql = StringUtils.replace(resultSql, "@additionalCriteriaQuery", additionalCriteriaQuery); return resultSql; @@ -526,17 +526,17 @@ public String getWindowedCriteriaQuery(String sqlTemplate, WindowedCriteria crit String endExpression; List clauses = new ArrayList<>(); if (checkObservationPeriod) { - clauses.add("A.START_DATE >= P.OP_START_DATE AND A.START_DATE <= P.OP_END_DATE"); + clauses.add("A.start_date >= P.op_start_date AND A.start_date <= P.op_end_date"); } // StartWindow Window startWindow = criteria.startWindow; - String startIndexDateExpression = (startWindow.useIndexEnd != null && startWindow.useIndexEnd) ? "P.END_DATE" : "P.START_DATE"; - String startEventDateExpression = (startWindow.useEventEnd != null && startWindow.useEventEnd) ? "A.END_DATE" : "A.START_DATE"; + String startIndexDateExpression = (startWindow.useIndexEnd != null && startWindow.useIndexEnd) ? "P.end_date" : "P.start_date"; + String startEventDateExpression = (startWindow.useEventEnd != null && startWindow.useEventEnd) ? "A.end_date" : "A.start_date"; if (startWindow.start.days != null) { - startExpression = String.format("DATEADD(day,%d,%s)", startWindow.start.coeff * startWindow.start.days, startIndexDateExpression); + startExpression = String.format("date_add(%s, %d)", startIndexDateExpression, startWindow.start.coeff * startWindow.start.days); } else { - startExpression = checkObservationPeriod ? (startWindow.start.coeff == -1 ? "P.OP_START_DATE" : "P.OP_END_DATE") : null; + startExpression = checkObservationPeriod ? (startWindow.start.coeff == -1 ? "P.op_start_date" : "P.op_end_date") : null; } if (startExpression != null) { @@ -544,9 +544,9 @@ public String getWindowedCriteriaQuery(String sqlTemplate, WindowedCriteria crit } if (startWindow.end.days != null) { - endExpression = String.format("DATEADD(day,%d,%s)", startWindow.end.coeff * startWindow.end.days, startIndexDateExpression); + endExpression = String.format("date_add(%s, %d)", startIndexDateExpression, startWindow.end.coeff * startWindow.end.days); } else { - endExpression = checkObservationPeriod ? (startWindow.end.coeff == -1 ? "P.OP_START_DATE" : "P.OP_END_DATE") : null; + endExpression = checkObservationPeriod ? (startWindow.end.coeff == -1 ? "P.op_start_date" : "P.op_end_date") : null; } if (endExpression != null) { @@ -557,13 +557,13 @@ public String getWindowedCriteriaQuery(String sqlTemplate, WindowedCriteria crit Window endWindow = criteria.endWindow; if (endWindow != null) { - String endIndexDateExpression = (endWindow.useIndexEnd != null && endWindow.useIndexEnd) ? "P.END_DATE" : "P.START_DATE"; + String endIndexDateExpression = (endWindow.useIndexEnd != null && endWindow.useIndexEnd) ? "P.end_date" : "P.start_date"; // for backwards compatability, having a null endWindow.useIndexEnd means they SHOULD use the index end date. - String endEventDateExpression = (endWindow.useEventEnd == null || endWindow.useEventEnd) ? "A.END_DATE" : "A.START_DATE"; + String endEventDateExpression = (endWindow.useEventEnd == null || endWindow.useEventEnd) ? "A.end_date" : "A.start_date"; if (endWindow.start.days != null) { - startExpression = String.format("DATEADD(day,%d,%s)", endWindow.start.coeff * endWindow.start.days, endIndexDateExpression); + startExpression = String.format("date_add(%s, %d)", endIndexDateExpression, endWindow.start.coeff * endWindow.start.days); } else { - startExpression = checkObservationPeriod ? (endWindow.start.coeff == -1 ? "P.OP_START_DATE" : "P.OP_END_DATE") : null; + startExpression = checkObservationPeriod ? (endWindow.start.coeff == -1 ? "P.op_start_date" : "P.op_end_date") : null; } if (startExpression != null) { @@ -571,9 +571,9 @@ public String getWindowedCriteriaQuery(String sqlTemplate, WindowedCriteria crit } if (endWindow.end.days != null) { - endExpression = String.format("DATEADD(day,%d,%s)", endWindow.end.coeff * endWindow.end.days, endIndexDateExpression); + endExpression = String.format("date_add(%s, %d)", endIndexDateExpression, endWindow.end.coeff * endWindow.end.days); } else { - endExpression = checkObservationPeriod ? (endWindow.end.coeff == -1 ? "P.OP_START_DATE" : "P.OP_END_DATE") : null; + endExpression = checkObservationPeriod ? (endWindow.end.coeff == -1 ? "P.op_start_date" : "P.op_end_date") : null; } if (endExpression != null) { @@ -739,7 +739,7 @@ public String getStrategySql(CustomEraStrategy strat, String eventTable) { String drugExposureEndDateExpression = DEFAULT_DRUG_EXPOSURE_END_DATE_EXPRESSION; if (strat.daysSupplyOverride != null) { - drugExposureEndDateExpression = String.format("DATEADD(day,%d,DRUG_EXPOSURE_START_DATE)", strat.daysSupplyOverride); + drugExposureEndDateExpression = String.format("date_add(drug_exposure_start_date, %d)", strat.daysSupplyOverride); } String strategySql = StringUtils.replace(CUSTOM_ERA_STRATEGY_TEMPLATE, "@eventTable", eventTable); strategySql = StringUtils.replace(strategySql, "@drugCodesetId", strat.drugCodesetId.toString()); diff --git a/src/main/resources/resources/cohortdefinition/.DS_Store b/src/main/resources/resources/cohortdefinition/.DS_Store new file mode 100644 index 0000000000000000000000000000000000000000..3df1b694e3c659b621e64071d7b073d6a9e5e653 GIT binary patch literal 6148 zcmeHKJ5B>Z47Ev$m1t6?oGau8Lo}Qq7eGlQD0a0$h<>`W|1jo6YR zvL*ZN_%pNnit(C=c>TIx5iN+Qg9_47Oe+!>ZREy1b0EtetIcj44o%*aLuzOALeJFq zk4?QthOv}wKW>rRy?xgAukvyCQ#XwJiRj^}*>&oDA{Gn;1HnKr5DZ*91L)Zz-K}BR zU?3O>2F?t~{g9x7*|8ex)d8a;08oD8Rq(8{1TcvMm>sJjJP@{0pp~+Z7;NS6C(p}{ z)zHd`^X6zlZ)Y|6dlxDi{a`u8IMkmrYsY zlf1V!A1A#wK_8$eL9V95Xe$P4E5<@v@$y$*l4r!TV>Q%r__Z7uKLWx_NHFjp415C; Cl_&!M literal 0 HcmV?d00001 diff --git a/src/main/resources/resources/cohortdefinition/sql/additionalCriteria.sql b/src/main/resources/resources/cohortdefinition/sql/additionalCriteria.sql index b0853083..db01d00c 100644 --- a/src/main/resources/resources/cohortdefinition/sql/additionalCriteria.sql +++ b/src/main/resources/resources/cohortdefinition/sql/additionalCriteria.sql @@ -1,5 +1,5 @@ -- Begin Correlated Criteria @windowedCriteria -GROUP BY p.person_id, p.event_id +GROUP BY P.person_id, P.event_id @occurrenceCriteria -- End Correlated Criteria diff --git a/src/main/resources/resources/cohortdefinition/sql/censoringInsert.sql b/src/main/resources/resources/cohortdefinition/sql/censoringInsert.sql index f65b42f9..02bc0e13 100644 --- a/src/main/resources/resources/cohortdefinition/sql/censoringInsert.sql +++ b/src/main/resources/resources/cohortdefinition/sql/censoringInsert.sql @@ -1,5 +1,5 @@ select i.event_id, i.person_id, MIN(c.start_date) as end_date -FROM #included_events i +FROM included_events i JOIN ( @criteriaQuery diff --git a/src/main/resources/resources/cohortdefinition/sql/conditionEra.sql b/src/main/resources/resources/cohortdefinition/sql/conditionEra.sql index edafa175..fb99a3e6 100644 --- a/src/main/resources/resources/cohortdefinition/sql/conditionEra.sql +++ b/src/main/resources/resources/cohortdefinition/sql/conditionEra.sql @@ -1,11 +1,11 @@ -- Begin Condition Era Criteria select C.person_id, C.condition_era_id as event_id, C.condition_era_start_date as start_date, - C.condition_era_end_date as end_date, C.CONDITION_CONCEPT_ID as TARGET_CONCEPT_ID, CAST(NULL as bigint) as visit_occurrence_id, + C.condition_era_end_date as end_date, C.condition_concept_id as TARGET_CONCEPT_ID, CAST(NULL as bigint) as visit_occurrence_id, C.condition_era_start_date as sort_date from ( select ce.* @ordinalExpression - FROM @cdm_database_schema.CONDITION_ERA ce + FROM `@cdm_database_schema/condition_era` ce @codesetClause ) C @joinClause diff --git a/src/main/resources/resources/cohortdefinition/sql/conditionOccurrence.sql b/src/main/resources/resources/cohortdefinition/sql/conditionOccurrence.sql index 7fd81a19..bb57faf3 100644 --- a/src/main/resources/resources/cohortdefinition/sql/conditionOccurrence.sql +++ b/src/main/resources/resources/cohortdefinition/sql/conditionOccurrence.sql @@ -1,11 +1,11 @@ -- Begin Condition Occurrence Criteria -SELECT C.person_id, C.condition_occurrence_id as event_id, C.condition_start_date as start_date, COALESCE(C.condition_end_date, DATEADD(day,1,C.condition_start_date)) as end_date, - C.CONDITION_CONCEPT_ID as TARGET_CONCEPT_ID, C.visit_occurrence_id, +SELECT C.person_id, C.condition_occurrence_id as event_id, C.condition_start_date as start_date, COALESCE(C.condition_end_date, date_add(C.condition_start_date, 1)) as end_date, + C.condition_concept_id as TARGET_CONCEPT_ID, C.visit_occurrence_id, C.condition_start_date as sort_date FROM ( SELECT co.* @ordinalExpression - FROM @cdm_database_schema.CONDITION_OCCURRENCE co + FROM `@cdm_database_schema/condition_occurrence` co @codesetClause ) C @joinClause diff --git a/src/main/resources/resources/cohortdefinition/sql/dateOffsetStrategy.sql b/src/main/resources/resources/cohortdefinition/sql/dateOffsetStrategy.sql index c9fb71d3..7e043822 100644 --- a/src/main/resources/resources/cohortdefinition/sql/dateOffsetStrategy.sql +++ b/src/main/resources/resources/cohortdefinition/sql/dateOffsetStrategy.sql @@ -1,6 +1,7 @@ -- date offset strategy -select event_id, person_id, - case when DATEADD(day,@offset,@dateField) > start_date then DATEADD(day,@offset,@dateField) else start_date end as end_date -INTO #strategy_ends -from @eventTable; +strategy_ends AS ( + select event_id, person_id, + case when date_add(@dateField, @offset) > start_date then date_add(@dateField, @offset) else start_date end as end_date + from @eventTable +), \ No newline at end of file diff --git a/src/main/resources/resources/cohortdefinition/sql/death.sql b/src/main/resources/resources/cohortdefinition/sql/death.sql index 073c3496..32ab8b57 100644 --- a/src/main/resources/resources/cohortdefinition/sql/death.sql +++ b/src/main/resources/resources/cohortdefinition/sql/death.sql @@ -1,11 +1,11 @@ -- Begin Death Criteria -select C.person_id, C.person_id as event_id, C.death_date as start_date, DATEADD(d,1,C.death_date) as end_date, +select C.person_id, C.person_id as event_id, C.death_date as start_date, date_add(C.death_date, 1) as end_date, coalesce(C.cause_concept_id,0) as TARGET_CONCEPT_ID, CAST(NULL as bigint) as visit_occurrence_id, C.death_date as sort_date from ( select d.* - FROM @cdm_database_schema.DEATH d + FROM `@cdm_database_schema/death` d @codesetClause ) C @joinClause diff --git a/src/main/resources/resources/cohortdefinition/sql/demographicCriteria.sql b/src/main/resources/resources/cohortdefinition/sql/demographicCriteria.sql index 465255c0..3387220a 100644 --- a/src/main/resources/resources/cohortdefinition/sql/demographicCriteria.sql +++ b/src/main/resources/resources/cohortdefinition/sql/demographicCriteria.sql @@ -1,7 +1,7 @@ -- Begin Demographic Criteria SELECT @indexId as index_id, e.person_id, e.event_id -FROM @eventTable E -JOIN @cdm_database_schema.PERSON P ON P.PERSON_ID = E.PERSON_ID +FROM @eventTable e +JOIN `@cdm_database_schema/person` P ON P.person_id = e.person_id @whereClause GROUP BY e.person_id, e.event_id -- End Demographic Criteria diff --git a/src/main/resources/resources/cohortdefinition/sql/deviceExposure.sql b/src/main/resources/resources/cohortdefinition/sql/deviceExposure.sql index a93e50d5..d0d25986 100644 --- a/src/main/resources/resources/cohortdefinition/sql/deviceExposure.sql +++ b/src/main/resources/resources/cohortdefinition/sql/deviceExposure.sql @@ -5,7 +5,7 @@ select C.person_id, C.device_exposure_id as event_id, C.device_exposure_start_da from ( select de.* @ordinalExpression - FROM @cdm_database_schema.DEVICE_EXPOSURE de + FROM `@cdm_database_schema/device_exposure` de @codesetClause ) C @joinClause diff --git a/src/main/resources/resources/cohortdefinition/sql/doseEra.sql b/src/main/resources/resources/cohortdefinition/sql/doseEra.sql index 3e4e6a2f..b1a61841 100644 --- a/src/main/resources/resources/cohortdefinition/sql/doseEra.sql +++ b/src/main/resources/resources/cohortdefinition/sql/doseEra.sql @@ -5,7 +5,7 @@ select C.person_id, C.dose_era_id as event_id, C.dose_era_start_date as start_da from ( select de.* @ordinalExpression - FROM @cdm_database_schema.DOSE_ERA de + FROM `@cdm_database_schema/dose_era` de @codesetClause ) C @joinClause diff --git a/src/main/resources/resources/cohortdefinition/sql/drugEra.sql b/src/main/resources/resources/cohortdefinition/sql/drugEra.sql index 1ad137ea..7af9d0ce 100644 --- a/src/main/resources/resources/cohortdefinition/sql/drugEra.sql +++ b/src/main/resources/resources/cohortdefinition/sql/drugEra.sql @@ -5,7 +5,7 @@ select C.person_id, C.drug_era_id as event_id, C.drug_era_start_date as start_da from ( select de.* @ordinalExpression - FROM @cdm_database_schema.DRUG_ERA de + FROM `@cdm_database_schema/drug_era` de @codesetClause ) C @joinClause diff --git a/src/main/resources/resources/cohortdefinition/sql/drugExposure.sql b/src/main/resources/resources/cohortdefinition/sql/drugExposure.sql index dd2d8620..d0cb3bfc 100644 --- a/src/main/resources/resources/cohortdefinition/sql/drugExposure.sql +++ b/src/main/resources/resources/cohortdefinition/sql/drugExposure.sql @@ -1,12 +1,12 @@ -- Begin Drug Exposure Criteria select C.person_id, C.drug_exposure_id as event_id, C.drug_exposure_start_date as start_date, - COALESCE(C.DRUG_EXPOSURE_END_DATE, DATEADD(day,C.DAYS_SUPPLY,DRUG_EXPOSURE_START_DATE), DATEADD(day,1,C.DRUG_EXPOSURE_START_DATE)) as end_date, + COALESCE(C.drug_exposure_end_date, date_add(C.drug_exposure_start_date, C.DAYS_SUPPLY), date_add(C.drug_exposure_start_date, 1)) as end_date, C.drug_concept_id as TARGET_CONCEPT_ID, C.visit_occurrence_id, C.drug_exposure_start_date as sort_date from ( select de.* @ordinalExpression - FROM @cdm_database_schema.DRUG_EXPOSURE de + FROM `@cdm_database_schema/drug_exposure` de @codesetClause ) C @joinClause diff --git a/src/main/resources/resources/cohortdefinition/sql/eraConstructor.sql b/src/main/resources/resources/cohortdefinition/sql/eraConstructor.sql index 1d039bf7..99620248 100644 --- a/src/main/resources/resources/cohortdefinition/sql/eraConstructor.sql +++ b/src/main/resources/resources/cohortdefinition/sql/eraConstructor.sql @@ -1,20 +1,20 @@ -- era constructor -WITH cteSource (@eraGroup, start_date, end_date, groupid) AS +WITH cteSource AS ( SELECT @eraGroup , start_date , end_date , dense_rank() over(order by @eraGroup) as groupid - FROM #collapse_input so + FROM collapse_input so ) , -------------------------------------------------------------------------------------------------------------- -cteEndDates (groupid, end_date) AS -- the magic +cteEndDates AS -- the magic ( SELECT groupid - , DATEADD(day,-1 * @eraconstructorpad, event_date) as end_date + , date_add(event_date, -1 * @eraconstructorpad) as end_date FROM ( SELECT @@ -38,7 +38,7 @@ cteEndDates (groupid, end_date) AS -- the magic SELECT groupid - , DATEADD(day,@eraconstructorpad,end_date) as end_date + , date_add(end_date, @eraconstructorpad) as end_date , 1 AS event_type , NULL FROM cteSource @@ -47,7 +47,7 @@ cteEndDates (groupid, end_date) AS -- the magic WHERE (2 * e.start_ordinal) - e.overall_ord = 0 ), -------------------------------------------------------------------------------------------------------------- -cteEnds (groupid, start_date, end_date) AS +cteEnds AS ( SELECT c.groupid @@ -58,16 +58,17 @@ cteEnds (groupid, start_date, end_date) AS GROUP BY c.groupid , c.start_date -) -select @eraGroup, start_date, end_date -into #collapse_output -from +), +collapse_output AS ( - select @eraGroup , min(b.start_date) as start_date, b.end_date - from ( - select distinct @eraGroup, groupid from cteSource - ) a - inner join cteEnds b on a.groupid = b.groupid - group by @eraGroup, end_date -) q -; + select @eraGroup, start_date, end_date + from + ( + select @eraGroup , min(b.start_date) as start_date, b.end_date + from ( + select distinct @eraGroup, groupid from cteSource + ) a + inner join cteEnds b on a.groupid = b.groupid + group by @eraGroup, end_date + ) q +), \ No newline at end of file diff --git a/src/main/resources/resources/cohortdefinition/sql/eventTableExpression.sql b/src/main/resources/resources/cohortdefinition/sql/eventTableExpression.sql index 2a0ce739..30c43065 100644 --- a/src/main/resources/resources/cohortdefinition/sql/eventTableExpression.sql +++ b/src/main/resources/resources/cohortdefinition/sql/eventTableExpression.sql @@ -1,4 +1,4 @@ -SELECT Q.person_id, Q.event_id, Q.start_date, Q.end_date, Q.visit_occurrence_id, OP.observation_period_start_date as op_start_date, OP.observation_period_end_date as op_end_date +SELECT Q.person_id, Q.event_id, Q.start_date, Q.end_date, Q.visit_occurrence_id, op.observation_period_start_date as op_start_date, op.observation_period_end_date as op_end_date FROM (@eventQuery) Q -JOIN @cdm_database_schema.OBSERVATION_PERIOD OP on Q.person_id = OP.person_id - and OP.observation_period_start_date <= Q.start_date and OP.observation_period_end_date >= Q.start_date +JOIN `@cdm_database_schema/observation_period` op on Q.person_id = op.person_id + and op.observation_period_start_date <= Q.start_date and op.observation_period_end_date >= Q.start_date diff --git a/src/main/resources/resources/cohortdefinition/sql/generateCohort.sql b/src/main/resources/resources/cohortdefinition/sql/generateCohort.sql index 33454cff..fba760a0 100644 --- a/src/main/resources/resources/cohortdefinition/sql/generateCohort.sql +++ b/src/main/resources/resources/cohortdefinition/sql/generateCohort.sql @@ -1,72 +1,76 @@ -@codesetQuery +CREATE TABLE `@target_database_schema.@target_cohort_table` AS -with primary_events (event_id, person_id, start_date, end_date, op_start_date, op_end_date, visit_occurrence_id) as +with primary_events as ( @primaryEventsQuery -) -SELECT event_id, person_id, start_date, end_date, op_start_date, op_end_date, visit_occurrence_id -INTO #qualified_events -FROM -( - select pe.event_id, pe.person_id, pe.start_date, pe.end_date, pe.op_start_date, pe.op_end_date, row_number() over (partition by pe.person_id order by pe.start_date @QualifiedEventSort) as ordinal, cast(pe.visit_occurrence_id as bigint) as visit_occurrence_id - FROM primary_events pe - @additionalCriteriaQuery -) QE -@QualifiedLimitFilter -; +), +qualified_events AS ( + SELECT event_id, person_id, start_date, end_date, op_start_date, op_end_date, visit_occurrence_id + FROM + ( + select pe.event_id, pe.person_id, pe.start_date, pe.end_date, pe.op_start_date, pe.op_end_date, row_number() over (partition by pe.person_id order by pe.start_date @QualifiedEventSort) as ordinal, cast(pe.visit_occurrence_id as bigint) as visit_occurrence_id + FROM primary_events pe + @additionalCriteriaQuery + ) QE + @QualifiedLimitFilter +), --- Inclusion Rule Inserts @inclusionCohortInserts -with cteIncludedEvents(event_id, person_id, start_date, end_date, op_start_date, op_end_date, ordinal) as +cteIncludedEvents as ( SELECT event_id, person_id, start_date, end_date, op_start_date, op_end_date, row_number() over (partition by person_id order by start_date @IncludedEventSort) as ordinal from ( select Q.event_id, Q.person_id, Q.start_date, Q.end_date, Q.op_start_date, Q.op_end_date, SUM(coalesce(POWER(cast(2 as bigint), I.inclusion_rule_id), 0)) as inclusion_rule_mask - from #qualified_events Q - LEFT JOIN #inclusion_events I on I.person_id = Q.person_id and I.event_id = Q.event_id + from qualified_events Q + LEFT JOIN inclusion_events I on I.person_id = Q.person_id and I.event_id = Q.event_id GROUP BY Q.event_id, Q.person_id, Q.start_date, Q.end_date, Q.op_start_date, Q.op_end_date ) MG -- matching groups {@ruleTotal != 0}?{ -- the matching group with all bits set ( POWER(2,# of inclusion rules) - 1 = inclusion_rule_mask WHERE (MG.inclusion_rule_mask = POWER(cast(2 as bigint),@ruleTotal)-1) } -) -select event_id, person_id, start_date, end_date, op_start_date, op_end_date -into #included_events -FROM cteIncludedEvents Results -@ResultLimitFilter -; +), + +included_events AS ( + select event_id, person_id, start_date, end_date, op_start_date, op_end_date + FROM cteIncludedEvents Results + @ResultLimitFilter +), @strategy_ends_temp_tables -- generate cohort periods into #final_cohort -with cohort_ends (event_id, person_id, end_date) as +cohort_ends as ( -- cohort exit dates @cohort_end_unions ), -first_ends (person_id, start_date, end_date) as + +first_ends as ( select F.person_id, F.start_date, F.end_date FROM ( select I.event_id, I.person_id, I.start_date, E.end_date, row_number() over (partition by I.person_id, I.event_id order by E.end_date) as ordinal - from #included_events I + from included_events I join cohort_ends E on I.event_id = E.event_id and I.person_id = E.person_id and E.end_date >= I.start_date ) F WHERE F.ordinal = 1 -) -select person_id, start_date, end_date -INTO #cohort_rows -from first_ends; +), -with cteEndDates (person_id, end_date) AS -- the magic +cohort_rows AS ( + select person_id, start_date, end_date + from first_ends +), + +cteEndDates AS -- the magic ( SELECT person_id - , DATEADD(day,-1 * @eraconstructorpad, event_date) as end_date + , date_add(event_date, -1 * @eraconstructorpad) as end_date FROM ( SELECT @@ -82,41 +86,39 @@ with cteEndDates (person_id, end_date) AS -- the magic , start_date AS event_date , -1 AS event_type , ROW_NUMBER() OVER (PARTITION BY person_id ORDER BY start_date) AS start_ordinal - FROM #cohort_rows + FROM cohort_rows UNION ALL SELECT person_id - , DATEADD(day,@eraconstructorpad,end_date) as end_date + , date_add(end_date, @eraconstructorpad) as end_date , 1 AS event_type , NULL - FROM #cohort_rows + FROM cohort_rows ) RAWDATA ) e WHERE (2 * e.start_ordinal) - e.overall_ord = 0 ), -cteEnds (person_id, start_date, end_date) AS +cteEnds AS ( SELECT c.person_id , c.start_date , MIN(e.end_date) AS end_date - FROM #cohort_rows c + FROM cohort_rows c JOIN cteEndDates e ON c.person_id = e.person_id AND e.end_date >= c.start_date GROUP BY c.person_id, c.start_date +), +final_cohort AS ( + select person_id, min(start_date) as start_date, end_date + from cteEnds + group by person_id, end_date ) -select person_id, min(start_date) as start_date, end_date -into #final_cohort -from cteEnds -group by person_id, end_date -; -DELETE FROM @target_database_schema.@target_cohort_table where @cohort_id_field_name = @target_cohort_id; -INSERT INTO @target_database_schema.@target_cohort_table (@cohort_id_field_name, subject_id, cohort_start_date, cohort_end_date) @finalCohortQuery -; + {@generateStats != 0}?{ -- Find the event that is the 'best match' per person. @@ -160,22 +162,4 @@ DROP TABLE #best_events; } -@strategy_ends_cleanup - -TRUNCATE TABLE #cohort_rows; -DROP TABLE #cohort_rows; - -TRUNCATE TABLE #final_cohort; -DROP TABLE #final_cohort; - -TRUNCATE TABLE #inclusion_events; -DROP TABLE #inclusion_events; - -TRUNCATE TABLE #qualified_events; -DROP TABLE #qualified_events; - -TRUNCATE TABLE #included_events; -DROP TABLE #included_events; -TRUNCATE TABLE #Codesets; -DROP TABLE #Codesets; diff --git a/src/main/resources/resources/cohortdefinition/sql/inclusionrule.sql b/src/main/resources/resources/cohortdefinition/sql/inclusionrule.sql index bee0cb9b..aca73475 100644 --- a/src/main/resources/resources/cohortdefinition/sql/inclusionrule.sql +++ b/src/main/resources/resources/cohortdefinition/sql/inclusionrule.sql @@ -1,9 +1,9 @@ -select @inclusion_rule_id as inclusion_rule_id, person_id, event_id -INTO #Inclusion_@inclusion_rule_id -FROM -( - select pe.person_id, pe.event_id - FROM #qualified_events pe - @additionalCriteriaQuery -) Results -; +Inclusion_@inclusion_rule_id AS ( + select @inclusion_rule_id as inclusion_rule_id, person_id, event_id + FROM + ( + select pe.person_id, pe.event_id + FROM qualified_events pe + @additionalCriteriaQuery + ) Results +), \ No newline at end of file diff --git a/src/main/resources/resources/cohortdefinition/sql/locationRegion.sql b/src/main/resources/resources/cohortdefinition/sql/locationRegion.sql index edcfa718..193796db 100644 --- a/src/main/resources/resources/cohortdefinition/sql/locationRegion.sql +++ b/src/main/resources/resources/cohortdefinition/sql/locationRegion.sql @@ -10,8 +10,8 @@ select from ( select l.*, lh.* - FROM @cdm_database_schema.LOCATION l - JOIN @cdm_database_schema.LOCATION_HISTORY lh ON l.location_id = lh.location_id + FROM `@cdm_database_schema/location` l + JOIN `@cdm_database_schema.location_history` lh ON l.location_id = lh.location_id @codesetClause WHERE lh.domain_id = 'PERSON' ) C diff --git a/src/main/resources/resources/cohortdefinition/sql/measurement.sql b/src/main/resources/resources/cohortdefinition/sql/measurement.sql index 06368e14..07205cb9 100644 --- a/src/main/resources/resources/cohortdefinition/sql/measurement.sql +++ b/src/main/resources/resources/cohortdefinition/sql/measurement.sql @@ -1,11 +1,11 @@ -- Begin Measurement Criteria -select C.person_id, C.measurement_id as event_id, C.measurement_date as start_date, DATEADD(d,1,C.measurement_date) as END_DATE, +select C.person_id, C.measurement_id as event_id, C.measurement_date as start_date, date_add(C.measurement_date, 1) as end_date, C.measurement_concept_id as TARGET_CONCEPT_ID, C.visit_occurrence_id, C.measurement_date as sort_date from ( select m.* @ordinalExpression - FROM @cdm_database_schema.MEASUREMENT m + FROM `@cdm_database_schema/measurement` m @codesetClause ) C @joinClause diff --git a/src/main/resources/resources/cohortdefinition/sql/observation.sql b/src/main/resources/resources/cohortdefinition/sql/observation.sql index ff45bce4..80cce34f 100644 --- a/src/main/resources/resources/cohortdefinition/sql/observation.sql +++ b/src/main/resources/resources/cohortdefinition/sql/observation.sql @@ -1,11 +1,11 @@ -- Begin Observation Criteria -select C.person_id, C.observation_id as event_id, C.observation_date as start_date, DATEADD(d,1,C.observation_date) as END_DATE, +select C.person_id, C.observation_id as event_id, C.observation_date as start_date, date_add(C.observation_date, 1) as end_date, C.observation_concept_id as TARGET_CONCEPT_ID, C.visit_occurrence_id, C.observation_date as sort_date from ( select o.* @ordinalExpression - FROM @cdm_database_schema.OBSERVATION o + FROM `@cdm_database_schema/observation` o @codesetClause ) C @joinClause diff --git a/src/main/resources/resources/cohortdefinition/sql/observationPeriod.sql b/src/main/resources/resources/cohortdefinition/sql/observationPeriod.sql index 15f3a192..11686f9f 100644 --- a/src/main/resources/resources/cohortdefinition/sql/observationPeriod.sql +++ b/src/main/resources/resources/cohortdefinition/sql/observationPeriod.sql @@ -6,7 +6,7 @@ select C.person_id, C.observation_period_id as event_id, @startDateExpression as from ( select op.*, row_number() over (PARTITION BY op.person_id ORDER BY op.observation_period_start_date) as ordinal - FROM @cdm_database_schema.OBSERVATION_PERIOD op + FROM `@cdm_database_schema/observation_period` op ) C @joinClause @whereClause diff --git a/src/main/resources/resources/cohortdefinition/sql/primaryEventsQuery.sql b/src/main/resources/resources/cohortdefinition/sql/primaryEventsQuery.sql index 534f24f5..1fb79eff 100644 --- a/src/main/resources/resources/cohortdefinition/sql/primaryEventsQuery.sql +++ b/src/main/resources/resources/cohortdefinition/sql/primaryEventsQuery.sql @@ -4,12 +4,12 @@ FROM ( select E.person_id, E.start_date, E.end_date, row_number() OVER (PARTITION BY E.person_id ORDER BY E.sort_date @EventSort) ordinal, - OP.observation_period_start_date as op_start_date, OP.observation_period_end_date as op_end_date, cast(E.visit_occurrence_id as bigint) as visit_occurrence_id + op.observation_period_start_date as op_start_date, op.observation_period_end_date as op_end_date, cast(E.visit_occurrence_id as bigint) as visit_occurrence_id FROM ( @criteriaQueries ) E - JOIN @cdm_database_schema.observation_period OP on E.person_id = OP.person_id and E.start_date >= OP.observation_period_start_date and E.start_date <= op.observation_period_end_date + JOIN `@cdm_database_schema/observation_period` op on E.person_id = op.person_id and E.start_date >= op.observation_period_start_date and E.start_date <= op.observation_period_end_date WHERE @primaryEventsFilter ) P @primaryEventLimit diff --git a/src/main/resources/resources/cohortdefinition/sql/procedureOccurrence.sql b/src/main/resources/resources/cohortdefinition/sql/procedureOccurrence.sql index cd377d01..60cbff8d 100644 --- a/src/main/resources/resources/cohortdefinition/sql/procedureOccurrence.sql +++ b/src/main/resources/resources/cohortdefinition/sql/procedureOccurrence.sql @@ -1,11 +1,11 @@ -- Begin Procedure Occurrence Criteria -select C.person_id, C.procedure_occurrence_id as event_id, C.procedure_date as start_date, DATEADD(d,1,C.procedure_date) as END_DATE, +select C.person_id, C.procedure_occurrence_id as event_id, C.procedure_date as start_date, date_add(C.procedure_date, 1) as end_date, C.procedure_concept_id as TARGET_CONCEPT_ID, C.visit_occurrence_id, C.procedure_date as sort_date from ( select po.* @ordinalExpression - FROM @cdm_database_schema.PROCEDURE_OCCURRENCE po + FROM `@cdm_database_schema/procedure_occurrence` po @codesetClause ) C @joinClause diff --git a/src/main/resources/resources/cohortdefinition/sql/specimen.sql b/src/main/resources/resources/cohortdefinition/sql/specimen.sql index 1f1eefbb..60ff1d03 100644 --- a/src/main/resources/resources/cohortdefinition/sql/specimen.sql +++ b/src/main/resources/resources/cohortdefinition/sql/specimen.sql @@ -1,11 +1,11 @@ -- Begin Specimen Criteria -select C.person_id, C.specimen_id as event_id, C.specimen_date as start_date, DATEADD(d,1,C.specimen_date) as end_date, +select C.person_id, C.specimen_id as event_id, C.specimen_date as start_date, date_add(C.specimen_date, 1) as end_date, C.specimen_concept_id as TARGET_CONCEPT_ID, CAST(NULL as bigint) as visit_occurrence_id, C.specimen_date as sort_date from ( select s.* @ordinalExpression - FROM @cdm_database_schema.SPECIMEN s + FROM `@cdm_database_schema/specimen` s @codesetClause ) C @joinClause diff --git a/src/main/resources/resources/cohortdefinition/sql/visitOccurrence.sql b/src/main/resources/resources/cohortdefinition/sql/visitOccurrence.sql index 8a242681..248715c7 100644 --- a/src/main/resources/resources/cohortdefinition/sql/visitOccurrence.sql +++ b/src/main/resources/resources/cohortdefinition/sql/visitOccurrence.sql @@ -5,7 +5,7 @@ select C.person_id, C.visit_occurrence_id as event_id, C.visit_start_date as sta from ( select vo.* @ordinalExpression - FROM @cdm_database_schema.VISIT_OCCURRENCE vo + FROM `@cdm_database_schema/visit_occurrence` vo @codesetClause ) C @joinClause diff --git a/src/main/resources/resources/cohortdefinition/sql/windowedCriteria.sql b/src/main/resources/resources/cohortdefinition/sql/windowedCriteria.sql index a61e55d6..e8284aff 100644 --- a/src/main/resources/resources/cohortdefinition/sql/windowedCriteria.sql +++ b/src/main/resources/resources/cohortdefinition/sql/windowedCriteria.sql @@ -1,4 +1,4 @@ -SELECT @indexId as index_id, p.person_id, p.event_id +SELECT @indexId as index_id, P.person_id, P.event_id FROM @eventTable P @joinType JOIN ( diff --git a/src/main/resources/resources/cohortdefinition/sql_old/additionalCriteria.sql b/src/main/resources/resources/cohortdefinition/sql_old/additionalCriteria.sql new file mode 100644 index 00000000..b0853083 --- /dev/null +++ b/src/main/resources/resources/cohortdefinition/sql_old/additionalCriteria.sql @@ -0,0 +1,5 @@ +-- Begin Correlated Criteria +@windowedCriteria +GROUP BY p.person_id, p.event_id +@occurrenceCriteria +-- End Correlated Criteria diff --git a/src/main/resources/resources/cohortdefinition/sql_old/censoringInsert.sql b/src/main/resources/resources/cohortdefinition/sql_old/censoringInsert.sql new file mode 100644 index 00000000..f65b42f9 --- /dev/null +++ b/src/main/resources/resources/cohortdefinition/sql_old/censoringInsert.sql @@ -0,0 +1,7 @@ +select i.event_id, i.person_id, MIN(c.start_date) as end_date +FROM #included_events i +JOIN +( +@criteriaQuery +) C on C.person_id = I.person_id and C.start_date >= I.start_date and C.START_DATE <= I.op_end_date +GROUP BY i.event_id, i.person_id diff --git a/src/main/resources/resources/cohortdefinition/sql_old/codesetQuery.sql b/src/main/resources/resources/cohortdefinition/sql_old/codesetQuery.sql new file mode 100644 index 00000000..ebc1008d --- /dev/null +++ b/src/main/resources/resources/cohortdefinition/sql_old/codesetQuery.sql @@ -0,0 +1,7 @@ +CREATE TABLE #Codesets ( + codeset_id int NOT NULL, + concept_id bigint NOT NULL +) +; + +@codesetInserts diff --git a/src/main/resources/resources/cohortdefinition/sql_old/cohortCensoredStats.sql b/src/main/resources/resources/cohortdefinition/sql_old/cohortCensoredStats.sql new file mode 100644 index 00000000..8d9f9710 --- /dev/null +++ b/src/main/resources/resources/cohortdefinition/sql_old/cohortCensoredStats.sql @@ -0,0 +1,7 @@ +-- calculate censored +delete from @results_database_schema.cohort_censor_stats where @cohort_id_field_name = @target_cohort_id; +insert into @results_database_schema.cohort_censor_stats (@cohort_id_field_name, lost_count) + select @target_cohort_id as @cohort_id_field_name, coalesce(FCC.total_people - TC.total, 0) as lost_count + FROM + (select count_big(distinct person_id) as total_people from #final_cohort) FCC, + (select count_big(distinct subject_id) as total from @target_database_schema.@target_cohort_table t where t.@cohort_id_field_name = @target_cohort_id) TC; \ No newline at end of file diff --git a/src/main/resources/resources/cohortdefinition/sql_old/cohortInclusionAnalysis.sql b/src/main/resources/resources/cohortdefinition/sql_old/cohortInclusionAnalysis.sql new file mode 100644 index 00000000..85a1d081 --- /dev/null +++ b/src/main/resources/resources/cohortdefinition/sql_old/cohortInclusionAnalysis.sql @@ -0,0 +1,44 @@ +-- calculte matching group counts +delete from @results_database_schema.cohort_inclusion_result where @cohort_id_field_name = @target_cohort_id and mode_id = @inclusionImpactMode; +insert into @results_database_schema.cohort_inclusion_result (@cohort_id_field_name, inclusion_rule_mask, person_count, mode_id) +select @target_cohort_id as @cohort_id_field_name, inclusion_rule_mask, count_big(*) as person_count, @inclusionImpactMode as mode_id +from +( + select Q.person_id, Q.event_id, CAST(SUM(coalesce(POWER(cast(2 as bigint), I.inclusion_rule_id), 0)) AS bigint) as inclusion_rule_mask + from @eventTable Q + LEFT JOIN #inclusion_events I on q.person_id = i.person_id and q.event_id = i.event_id + GROUP BY Q.person_id, Q.event_id +) MG -- matching groups +group by inclusion_rule_mask +; + +-- calculate gain counts +delete from @results_database_schema.cohort_inclusion_stats where @cohort_id_field_name = @target_cohort_id and mode_id = @inclusionImpactMode; +insert into @results_database_schema.cohort_inclusion_stats (@cohort_id_field_name, rule_sequence, person_count, gain_count, person_total, mode_id) +select ir.@cohort_id_field_name, ir.rule_sequence, coalesce(T.person_count, 0) as person_count, coalesce(SR.person_count, 0) gain_count, EventTotal.total, @inclusionImpactMode as mode_id +from @results_database_schema.cohort_inclusion ir +left join +( + select i.inclusion_rule_id, count_big(i.event_id) as person_count + from @eventTable Q + JOIN #inclusion_events i on Q.person_id = I.person_id and Q.event_id = i.event_id + group by i.inclusion_rule_id +) T on ir.rule_sequence = T.inclusion_rule_id +CROSS JOIN (select count(*) as total_rules from @results_database_schema.cohort_inclusion where @cohort_id_field_name = @target_cohort_id) RuleTotal +CROSS JOIN (select count_big(event_id) as total from @eventTable) EventTotal +LEFT JOIN @results_database_schema.cohort_inclusion_result SR on SR.mode_id = @inclusionImpactMode AND SR.@cohort_id_field_name = @target_cohort_id AND (POWER(cast(2 as bigint),RuleTotal.total_rules) - POWER(cast(2 as bigint),ir.rule_sequence) - 1) = SR.inclusion_rule_mask -- POWER(2,rule count) - POWER(2,rule sequence) - 1 is the mask for 'all except this rule' +WHERE ir.@cohort_id_field_name = @target_cohort_id +; + +-- calculate totals +delete from @results_database_schema.cohort_summary_stats where @cohort_id_field_name = @target_cohort_id and mode_id = @inclusionImpactMode; +insert into @results_database_schema.cohort_summary_stats (@cohort_id_field_name, base_count, final_count, mode_id) +select @target_cohort_id as @cohort_id_field_name, PC.total as person_count, coalesce(FC.total, 0) as final_count, @inclusionImpactMode as mode_id +FROM +(select count_big(event_id) as total from @eventTable) PC, +(select sum(sr.person_count) as total + from @results_database_schema.cohort_inclusion_result sr + CROSS JOIN (select count(*) as total_rules from @results_database_schema.cohort_inclusion where @cohort_id_field_name = @target_cohort_id) RuleTotal + where sr.mode_id = @inclusionImpactMode and sr.@cohort_id_field_name = @target_cohort_id and sr.inclusion_rule_mask = POWER(cast(2 as bigint),RuleTotal.total_rules)-1 +) FC +; diff --git a/src/main/resources/resources/cohortdefinition/sql_old/conditionEra.sql b/src/main/resources/resources/cohortdefinition/sql_old/conditionEra.sql new file mode 100644 index 00000000..edafa175 --- /dev/null +++ b/src/main/resources/resources/cohortdefinition/sql_old/conditionEra.sql @@ -0,0 +1,13 @@ +-- Begin Condition Era Criteria +select C.person_id, C.condition_era_id as event_id, C.condition_era_start_date as start_date, + C.condition_era_end_date as end_date, C.CONDITION_CONCEPT_ID as TARGET_CONCEPT_ID, CAST(NULL as bigint) as visit_occurrence_id, + C.condition_era_start_date as sort_date +from +( + select ce.* @ordinalExpression + FROM @cdm_database_schema.CONDITION_ERA ce +@codesetClause +) C +@joinClause +@whereClause +-- End Condition Era Criteria diff --git a/src/main/resources/resources/cohortdefinition/sql_old/conditionOccurrence.sql b/src/main/resources/resources/cohortdefinition/sql_old/conditionOccurrence.sql new file mode 100644 index 00000000..7fd81a19 --- /dev/null +++ b/src/main/resources/resources/cohortdefinition/sql_old/conditionOccurrence.sql @@ -0,0 +1,13 @@ +-- Begin Condition Occurrence Criteria +SELECT C.person_id, C.condition_occurrence_id as event_id, C.condition_start_date as start_date, COALESCE(C.condition_end_date, DATEADD(day,1,C.condition_start_date)) as end_date, + C.CONDITION_CONCEPT_ID as TARGET_CONCEPT_ID, C.visit_occurrence_id, + C.condition_start_date as sort_date +FROM +( + SELECT co.* @ordinalExpression + FROM @cdm_database_schema.CONDITION_OCCURRENCE co + @codesetClause +) C +@joinClause +@whereClause +-- End Condition Occurrence Criteria diff --git a/src/main/resources/resources/cohortdefinition/sql_old/customEraStrategy.sql b/src/main/resources/resources/cohortdefinition/sql_old/customEraStrategy.sql new file mode 100644 index 00000000..513ebaa3 --- /dev/null +++ b/src/main/resources/resources/cohortdefinition/sql_old/customEraStrategy.sql @@ -0,0 +1,65 @@ +-- custom era strategy + +with ctePersons(person_id) as ( + select distinct person_id from @eventTable +) + +select person_id, drug_exposure_start_date, drug_exposure_end_date +INTO #drugTarget +FROM ( + select de.PERSON_ID, DRUG_EXPOSURE_START_DATE, @drugExposureEndDateExpression as DRUG_EXPOSURE_END_DATE + FROM @cdm_database_schema.DRUG_EXPOSURE de + JOIN ctePersons p on de.person_id = p.person_id + JOIN #Codesets cs on cs.codeset_id = @drugCodesetId AND de.drug_concept_id = cs.concept_id + + UNION ALL + + select de.PERSON_ID, DRUG_EXPOSURE_START_DATE, @drugExposureEndDateExpression as DRUG_EXPOSURE_END_DATE + FROM @cdm_database_schema.DRUG_EXPOSURE de + JOIN ctePersons p on de.person_id = p.person_id + JOIN #Codesets cs on cs.codeset_id = @drugCodesetId AND de.drug_source_concept_id = cs.concept_id +) E +; + +select et.event_id, et.person_id, ERAS.era_end_date as end_date +INTO #strategy_ends +from @eventTable et +JOIN +( + select ENDS.person_id, min(drug_exposure_start_date) as era_start_date, DATEADD(day,@offset, ENDS.era_end_date) as era_end_date + from + ( + select de.person_id, de.drug_exposure_start_date, MIN(e.END_DATE) as era_end_date + FROM #drugTarget DE + JOIN + ( + --cteEndDates + select PERSON_ID, DATEADD(day,-1 * @gapDays,EVENT_DATE) as END_DATE -- unpad the end date by @gapDays + FROM + ( + select PERSON_ID, EVENT_DATE, EVENT_TYPE, + MAX(START_ORDINAL) OVER (PARTITION BY PERSON_ID ORDER BY event_date, event_type ROWS UNBOUNDED PRECEDING) AS start_ordinal, + ROW_NUMBER() OVER (PARTITION BY PERSON_ID ORDER BY EVENT_DATE, EVENT_TYPE) AS OVERALL_ORD -- this re-numbers the inner UNION so all rows are numbered ordered by the event date + from + ( + -- select the start dates, assigning a row number to each + Select PERSON_ID, DRUG_EXPOSURE_START_DATE AS EVENT_DATE, 0 as EVENT_TYPE, ROW_NUMBER() OVER (PARTITION BY PERSON_ID ORDER BY DRUG_EXPOSURE_START_DATE) as START_ORDINAL + from #drugTarget D + + UNION ALL + + -- add the end dates with NULL as the row number, padding the end dates by @gapDays to allow a grace period for overlapping ranges. + select PERSON_ID, DATEADD(day,@gapDays,DRUG_EXPOSURE_END_DATE), 1 as EVENT_TYPE, NULL + FROM #drugTarget D + ) RAWDATA + ) E + WHERE 2 * E.START_ORDINAL - E.OVERALL_ORD = 0 + ) E on DE.PERSON_ID = E.PERSON_ID and E.END_DATE >= DE.DRUG_EXPOSURE_START_DATE + GROUP BY de.person_id, de.drug_exposure_start_date + ) ENDS + GROUP BY ENDS.person_id, ENDS.era_end_date +) ERAS on ERAS.person_id = et.person_id +WHERE et.start_date between ERAS.era_start_date and ERAS.era_end_date; + +TRUNCATE TABLE #drugTarget; +DROP TABLE #drugTarget; diff --git a/src/main/resources/resources/cohortdefinition/sql_old/dateOffsetStrategy.sql b/src/main/resources/resources/cohortdefinition/sql_old/dateOffsetStrategy.sql new file mode 100644 index 00000000..c9fb71d3 --- /dev/null +++ b/src/main/resources/resources/cohortdefinition/sql_old/dateOffsetStrategy.sql @@ -0,0 +1,6 @@ +-- date offset strategy + +select event_id, person_id, + case when DATEADD(day,@offset,@dateField) > start_date then DATEADD(day,@offset,@dateField) else start_date end as end_date +INTO #strategy_ends +from @eventTable; diff --git a/src/main/resources/resources/cohortdefinition/sql_old/death.sql b/src/main/resources/resources/cohortdefinition/sql_old/death.sql new file mode 100644 index 00000000..073c3496 --- /dev/null +++ b/src/main/resources/resources/cohortdefinition/sql_old/death.sql @@ -0,0 +1,14 @@ +-- Begin Death Criteria +select C.person_id, C.person_id as event_id, C.death_date as start_date, DATEADD(d,1,C.death_date) as end_date, + coalesce(C.cause_concept_id,0) as TARGET_CONCEPT_ID, CAST(NULL as bigint) as visit_occurrence_id, + C.death_date as sort_date +from +( + select d.* + FROM @cdm_database_schema.DEATH d +@codesetClause +) C +@joinClause +@whereClause +-- End Death Criteria + diff --git a/src/main/resources/resources/cohortdefinition/sql_old/demographicCriteria.sql b/src/main/resources/resources/cohortdefinition/sql_old/demographicCriteria.sql new file mode 100644 index 00000000..465255c0 --- /dev/null +++ b/src/main/resources/resources/cohortdefinition/sql_old/demographicCriteria.sql @@ -0,0 +1,7 @@ +-- Begin Demographic Criteria +SELECT @indexId as index_id, e.person_id, e.event_id +FROM @eventTable E +JOIN @cdm_database_schema.PERSON P ON P.PERSON_ID = E.PERSON_ID +@whereClause +GROUP BY e.person_id, e.event_id +-- End Demographic Criteria diff --git a/src/main/resources/resources/cohortdefinition/sql_old/deviceExposure.sql b/src/main/resources/resources/cohortdefinition/sql_old/deviceExposure.sql new file mode 100644 index 00000000..a93e50d5 --- /dev/null +++ b/src/main/resources/resources/cohortdefinition/sql_old/deviceExposure.sql @@ -0,0 +1,13 @@ +-- Begin Device Exposure Criteria +select C.person_id, C.device_exposure_id as event_id, C.device_exposure_start_date as start_date, C.device_exposure_end_date as end_date, + C.device_concept_id as TARGET_CONCEPT_ID, C.visit_occurrence_id, + C.device_exposure_start_date as sort_date +from +( + select de.* @ordinalExpression + FROM @cdm_database_schema.DEVICE_EXPOSURE de +@codesetClause +) C +@joinClause +@whereClause +-- End Device Exposure Criteria diff --git a/src/main/resources/resources/cohortdefinition/sql_old/doseEra.sql b/src/main/resources/resources/cohortdefinition/sql_old/doseEra.sql new file mode 100644 index 00000000..3e4e6a2f --- /dev/null +++ b/src/main/resources/resources/cohortdefinition/sql_old/doseEra.sql @@ -0,0 +1,13 @@ +-- Begin Dose Era Criteria +select C.person_id, C.dose_era_id as event_id, C.dose_era_start_date as start_date, C.dose_era_end_date as end_date, + C.drug_concept_id as TARGET_CONCEPT_ID, CAST(NULL as bigint) as visit_occurrence_id, + C.dose_era_start_date as sort_date +from +( + select de.* @ordinalExpression + FROM @cdm_database_schema.DOSE_ERA de +@codesetClause +) C +@joinClause +@whereClause +-- End Dose Era Criteria diff --git a/src/main/resources/resources/cohortdefinition/sql_old/drugEra.sql b/src/main/resources/resources/cohortdefinition/sql_old/drugEra.sql new file mode 100644 index 00000000..1ad137ea --- /dev/null +++ b/src/main/resources/resources/cohortdefinition/sql_old/drugEra.sql @@ -0,0 +1,13 @@ +-- Begin Drug Era Criteria +select C.person_id, C.drug_era_id as event_id, C.drug_era_start_date as start_date, C.drug_era_end_date as end_date, + C.drug_concept_id as TARGET_CONCEPT_ID, CAST(NULL as bigint) as visit_occurrence_id, + C.drug_era_start_date as sort_date +from +( + select de.* @ordinalExpression + FROM @cdm_database_schema.DRUG_ERA de +@codesetClause +) C +@joinClause +@whereClause +-- End Drug Era Criteria diff --git a/src/main/resources/resources/cohortdefinition/sql_old/drugExposure.sql b/src/main/resources/resources/cohortdefinition/sql_old/drugExposure.sql new file mode 100644 index 00000000..dd2d8620 --- /dev/null +++ b/src/main/resources/resources/cohortdefinition/sql_old/drugExposure.sql @@ -0,0 +1,14 @@ +-- Begin Drug Exposure Criteria +select C.person_id, C.drug_exposure_id as event_id, C.drug_exposure_start_date as start_date, + COALESCE(C.DRUG_EXPOSURE_END_DATE, DATEADD(day,C.DAYS_SUPPLY,DRUG_EXPOSURE_START_DATE), DATEADD(day,1,C.DRUG_EXPOSURE_START_DATE)) as end_date, + C.drug_concept_id as TARGET_CONCEPT_ID, C.visit_occurrence_id, + C.drug_exposure_start_date as sort_date +from +( + select de.* @ordinalExpression + FROM @cdm_database_schema.DRUG_EXPOSURE de +@codesetClause +) C +@joinClause +@whereClause +-- End Drug Exposure Criteria diff --git a/src/main/resources/resources/cohortdefinition/sql_old/eraConstructor.sql b/src/main/resources/resources/cohortdefinition/sql_old/eraConstructor.sql new file mode 100644 index 00000000..1d039bf7 --- /dev/null +++ b/src/main/resources/resources/cohortdefinition/sql_old/eraConstructor.sql @@ -0,0 +1,73 @@ +-- era constructor +WITH cteSource (@eraGroup, start_date, end_date, groupid) AS +( + SELECT + @eraGroup + , start_date + , end_date + , dense_rank() over(order by @eraGroup) as groupid + FROM #collapse_input so +) +, +-------------------------------------------------------------------------------------------------------------- +cteEndDates (groupid, end_date) AS -- the magic +( + SELECT + groupid + , DATEADD(day,-1 * @eraconstructorpad, event_date) as end_date + FROM + ( + SELECT + groupid + , event_date + , event_type + , MAX(start_ordinal) OVER (PARTITION BY groupid ORDER BY event_date, event_type ROWS UNBOUNDED PRECEDING) AS start_ordinal + , ROW_NUMBER() OVER (PARTITION BY groupid ORDER BY event_date, event_type) AS overall_ord + FROM + ( + + SELECT + groupid + , start_date AS event_date + , -1 AS event_type + , ROW_NUMBER() OVER (PARTITION BY groupid ORDER BY start_date) AS start_ordinal + FROM cteSource + + UNION ALL + + + SELECT + groupid + , DATEADD(day,@eraconstructorpad,end_date) as end_date + , 1 AS event_type + , NULL + FROM cteSource + ) RAWDATA + ) e + WHERE (2 * e.start_ordinal) - e.overall_ord = 0 +), +-------------------------------------------------------------------------------------------------------------- +cteEnds (groupid, start_date, end_date) AS +( + SELECT + c.groupid + , c.start_date + , MIN(e.end_date) AS era_end_date + FROM cteSource c + JOIN cteEndDates e ON c.groupid = e.groupid AND e.end_date >= c.start_date + GROUP BY + c.groupid + , c.start_date +) +select @eraGroup, start_date, end_date +into #collapse_output +from +( + select @eraGroup , min(b.start_date) as start_date, b.end_date + from ( + select distinct @eraGroup, groupid from cteSource + ) a + inner join cteEnds b on a.groupid = b.groupid + group by @eraGroup, end_date +) q +; diff --git a/src/main/resources/resources/cohortdefinition/sql_old/eventTableExpression.sql b/src/main/resources/resources/cohortdefinition/sql_old/eventTableExpression.sql new file mode 100644 index 00000000..2a0ce739 --- /dev/null +++ b/src/main/resources/resources/cohortdefinition/sql_old/eventTableExpression.sql @@ -0,0 +1,4 @@ +SELECT Q.person_id, Q.event_id, Q.start_date, Q.end_date, Q.visit_occurrence_id, OP.observation_period_start_date as op_start_date, OP.observation_period_end_date as op_end_date +FROM (@eventQuery) Q +JOIN @cdm_database_schema.OBSERVATION_PERIOD OP on Q.person_id = OP.person_id + and OP.observation_period_start_date <= Q.start_date and OP.observation_period_end_date >= Q.start_date diff --git a/src/main/resources/resources/cohortdefinition/sql_old/generateCohort.sql b/src/main/resources/resources/cohortdefinition/sql_old/generateCohort.sql new file mode 100644 index 00000000..33454cff --- /dev/null +++ b/src/main/resources/resources/cohortdefinition/sql_old/generateCohort.sql @@ -0,0 +1,181 @@ +@codesetQuery + +with primary_events (event_id, person_id, start_date, end_date, op_start_date, op_end_date, visit_occurrence_id) as +( +@primaryEventsQuery +) +SELECT event_id, person_id, start_date, end_date, op_start_date, op_end_date, visit_occurrence_id +INTO #qualified_events +FROM +( + select pe.event_id, pe.person_id, pe.start_date, pe.end_date, pe.op_start_date, pe.op_end_date, row_number() over (partition by pe.person_id order by pe.start_date @QualifiedEventSort) as ordinal, cast(pe.visit_occurrence_id as bigint) as visit_occurrence_id + FROM primary_events pe + @additionalCriteriaQuery +) QE +@QualifiedLimitFilter +; + +--- Inclusion Rule Inserts + +@inclusionCohortInserts + +with cteIncludedEvents(event_id, person_id, start_date, end_date, op_start_date, op_end_date, ordinal) as +( + SELECT event_id, person_id, start_date, end_date, op_start_date, op_end_date, row_number() over (partition by person_id order by start_date @IncludedEventSort) as ordinal + from + ( + select Q.event_id, Q.person_id, Q.start_date, Q.end_date, Q.op_start_date, Q.op_end_date, SUM(coalesce(POWER(cast(2 as bigint), I.inclusion_rule_id), 0)) as inclusion_rule_mask + from #qualified_events Q + LEFT JOIN #inclusion_events I on I.person_id = Q.person_id and I.event_id = Q.event_id + GROUP BY Q.event_id, Q.person_id, Q.start_date, Q.end_date, Q.op_start_date, Q.op_end_date + ) MG -- matching groups +{@ruleTotal != 0}?{ + -- the matching group with all bits set ( POWER(2,# of inclusion rules) - 1 = inclusion_rule_mask + WHERE (MG.inclusion_rule_mask = POWER(cast(2 as bigint),@ruleTotal)-1) +} +) +select event_id, person_id, start_date, end_date, op_start_date, op_end_date +into #included_events +FROM cteIncludedEvents Results +@ResultLimitFilter +; + +@strategy_ends_temp_tables + +-- generate cohort periods into #final_cohort +with cohort_ends (event_id, person_id, end_date) as +( + -- cohort exit dates + @cohort_end_unions +), +first_ends (person_id, start_date, end_date) as +( + select F.person_id, F.start_date, F.end_date + FROM ( + select I.event_id, I.person_id, I.start_date, E.end_date, row_number() over (partition by I.person_id, I.event_id order by E.end_date) as ordinal + from #included_events I + join cohort_ends E on I.event_id = E.event_id and I.person_id = E.person_id and E.end_date >= I.start_date + ) F + WHERE F.ordinal = 1 +) +select person_id, start_date, end_date +INTO #cohort_rows +from first_ends; + +with cteEndDates (person_id, end_date) AS -- the magic +( + SELECT + person_id + , DATEADD(day,-1 * @eraconstructorpad, event_date) as end_date + FROM + ( + SELECT + person_id + , event_date + , event_type + , MAX(start_ordinal) OVER (PARTITION BY person_id ORDER BY event_date, event_type ROWS UNBOUNDED PRECEDING) AS start_ordinal + , ROW_NUMBER() OVER (PARTITION BY person_id ORDER BY event_date, event_type) AS overall_ord + FROM + ( + SELECT + person_id + , start_date AS event_date + , -1 AS event_type + , ROW_NUMBER() OVER (PARTITION BY person_id ORDER BY start_date) AS start_ordinal + FROM #cohort_rows + + UNION ALL + + + SELECT + person_id + , DATEADD(day,@eraconstructorpad,end_date) as end_date + , 1 AS event_type + , NULL + FROM #cohort_rows + ) RAWDATA + ) e + WHERE (2 * e.start_ordinal) - e.overall_ord = 0 +), +cteEnds (person_id, start_date, end_date) AS +( + SELECT + c.person_id + , c.start_date + , MIN(e.end_date) AS end_date + FROM #cohort_rows c + JOIN cteEndDates e ON c.person_id = e.person_id AND e.end_date >= c.start_date + GROUP BY c.person_id, c.start_date +) +select person_id, min(start_date) as start_date, end_date +into #final_cohort +from cteEnds +group by person_id, end_date +; + +DELETE FROM @target_database_schema.@target_cohort_table where @cohort_id_field_name = @target_cohort_id; +INSERT INTO @target_database_schema.@target_cohort_table (@cohort_id_field_name, subject_id, cohort_start_date, cohort_end_date) +@finalCohortQuery +; + +{@generateStats != 0}?{ +-- Find the event that is the 'best match' per person. +-- the 'best match' is defined as the event that satisfies the most inclusion rules. +-- ties are solved by choosing the event that matches the earliest inclusion rule, and then earliest. + +select q.person_id, q.event_id +into #best_events +from #qualified_events Q +join ( + SELECT R.person_id, R.event_id, ROW_NUMBER() OVER (PARTITION BY R.person_id ORDER BY R.rule_count DESC,R.min_rule_id ASC, R.start_date ASC) AS rank_value + FROM ( + SELECT Q.person_id, Q.event_id, COALESCE(COUNT(DISTINCT I.inclusion_rule_id), 0) AS rule_count, COALESCE(MIN(I.inclusion_rule_id), 0) AS min_rule_id, Q.start_date + FROM #qualified_events Q + LEFT JOIN #inclusion_events I ON q.person_id = i.person_id AND q.event_id = i.event_id + GROUP BY Q.person_id, Q.event_id, Q.start_date + ) R +) ranked on Q.person_id = ranked.person_id and Q.event_id = ranked.event_id +WHERE ranked.rank_value = 1 +; + +-- modes of generation: (the same tables store the results for the different modes, identified by the mode_id column) +-- 0: all events +-- 1: best event + + +-- BEGIN: Inclusion Impact Analysis - event +@inclusionImpactAnalysisByEventQuery +-- END: Inclusion Impact Analysis - event + +-- BEGIN: Inclusion Impact Analysis - person +@inclusionImpactAnalysisByPersonQuery +-- END: Inclusion Impact Analysis - person + +-- BEGIN: Censored Stats +@cohortCensoredStatsQuery +-- END: Censored Stats + +TRUNCATE TABLE #best_events; +DROP TABLE #best_events; + +} + +@strategy_ends_cleanup + +TRUNCATE TABLE #cohort_rows; +DROP TABLE #cohort_rows; + +TRUNCATE TABLE #final_cohort; +DROP TABLE #final_cohort; + +TRUNCATE TABLE #inclusion_events; +DROP TABLE #inclusion_events; + +TRUNCATE TABLE #qualified_events; +DROP TABLE #qualified_events; + +TRUNCATE TABLE #included_events; +DROP TABLE #included_events; + +TRUNCATE TABLE #Codesets; +DROP TABLE #Codesets; diff --git a/src/main/resources/resources/cohortdefinition/sql_old/groupQuery.sql b/src/main/resources/resources/cohortdefinition/sql_old/groupQuery.sql new file mode 100644 index 00000000..01252e94 --- /dev/null +++ b/src/main/resources/resources/cohortdefinition/sql_old/groupQuery.sql @@ -0,0 +1,14 @@ +-- Begin Criteria Group +select @indexId as index_id, person_id, event_id +FROM +( + select E.person_id, E.event_id + FROM @eventTable E + @joinType JOIN + ( + @criteriaQueries + ) CQ on E.person_id = CQ.person_id and E.event_id = CQ.event_id + GROUP BY E.person_id, E.event_id + @occurrenceCountClause +) G +-- End Criteria Group diff --git a/src/main/resources/resources/cohortdefinition/sql_old/inclusionrule.sql b/src/main/resources/resources/cohortdefinition/sql_old/inclusionrule.sql new file mode 100644 index 00000000..bee0cb9b --- /dev/null +++ b/src/main/resources/resources/cohortdefinition/sql_old/inclusionrule.sql @@ -0,0 +1,9 @@ +select @inclusion_rule_id as inclusion_rule_id, person_id, event_id +INTO #Inclusion_@inclusion_rule_id +FROM +( + select pe.person_id, pe.event_id + FROM #qualified_events pe + @additionalCriteriaQuery +) Results +; diff --git a/src/main/resources/resources/cohortdefinition/sql_old/locationRegion.sql b/src/main/resources/resources/cohortdefinition/sql_old/locationRegion.sql new file mode 100644 index 00000000..edcfa718 --- /dev/null +++ b/src/main/resources/resources/cohortdefinition/sql_old/locationRegion.sql @@ -0,0 +1,18 @@ +-- Begin Location region Criteria +select + C.entity_id AS person_id, + C.location_history_id as event_id, + C.start_date as start_date, + ISNULL(C.end_date, DATEFROMPARTS(2099,12,31)) as end_date, + C.region_concept_id as TARGET_CONCEPT_ID, + CAST(NULL as bigint) as visit_occurrence_id, + C.start_date as sort_date +from +( + select l.*, lh.* + FROM @cdm_database_schema.LOCATION l + JOIN @cdm_database_schema.LOCATION_HISTORY lh ON l.location_id = lh.location_id +@codesetClause + WHERE lh.domain_id = 'PERSON' +) C +-- End Location region Criteria diff --git a/src/main/resources/resources/cohortdefinition/sql_old/measurement.sql b/src/main/resources/resources/cohortdefinition/sql_old/measurement.sql new file mode 100644 index 00000000..06368e14 --- /dev/null +++ b/src/main/resources/resources/cohortdefinition/sql_old/measurement.sql @@ -0,0 +1,13 @@ +-- Begin Measurement Criteria +select C.person_id, C.measurement_id as event_id, C.measurement_date as start_date, DATEADD(d,1,C.measurement_date) as END_DATE, + C.measurement_concept_id as TARGET_CONCEPT_ID, C.visit_occurrence_id, + C.measurement_date as sort_date +from +( + select m.* @ordinalExpression + FROM @cdm_database_schema.MEASUREMENT m +@codesetClause +) C +@joinClause +@whereClause +-- End Measurement Criteria diff --git a/src/main/resources/resources/cohortdefinition/sql_old/observation.sql b/src/main/resources/resources/cohortdefinition/sql_old/observation.sql new file mode 100644 index 00000000..ff45bce4 --- /dev/null +++ b/src/main/resources/resources/cohortdefinition/sql_old/observation.sql @@ -0,0 +1,13 @@ +-- Begin Observation Criteria +select C.person_id, C.observation_id as event_id, C.observation_date as start_date, DATEADD(d,1,C.observation_date) as END_DATE, + C.observation_concept_id as TARGET_CONCEPT_ID, C.visit_occurrence_id, + C.observation_date as sort_date +from +( + select o.* @ordinalExpression + FROM @cdm_database_schema.OBSERVATION o +@codesetClause +) C +@joinClause +@whereClause +-- End Observation Criteria diff --git a/src/main/resources/resources/cohortdefinition/sql_old/observationPeriod.sql b/src/main/resources/resources/cohortdefinition/sql_old/observationPeriod.sql new file mode 100644 index 00000000..15f3a192 --- /dev/null +++ b/src/main/resources/resources/cohortdefinition/sql_old/observationPeriod.sql @@ -0,0 +1,13 @@ +-- Begin Observation Period Criteria +select C.person_id, C.observation_period_id as event_id, @startDateExpression as start_date, @endDateExpression as end_date, + C.period_type_concept_id as TARGET_CONCEPT_ID, CAST(NULL as bigint) as visit_occurrence_id, + C.observation_period_start_date as sort_date + +from +( + select op.*, row_number() over (PARTITION BY op.person_id ORDER BY op.observation_period_start_date) as ordinal + FROM @cdm_database_schema.OBSERVATION_PERIOD op +) C +@joinClause +@whereClause +-- End Observation Period Criteria diff --git a/src/main/resources/resources/cohortdefinition/sql_old/payerPlanPeriod.sql b/src/main/resources/resources/cohortdefinition/sql_old/payerPlanPeriod.sql new file mode 100644 index 00000000..d6b06403 --- /dev/null +++ b/src/main/resources/resources/cohortdefinition/sql_old/payerPlanPeriod.sql @@ -0,0 +1,13 @@ +-- Begin Payer Plan Period Criteria +select C.person_id, C.payer_plan_period_id as event_id, @startDateExpression as start_date, @endDateExpression as end_date, + C.payer_concept_id as TARGET_CONCEPT_ID, CAST(NULL as bigint) as visit_occurrence_id, + C.payer_plan_period_start_date as sort_date + +from +( + select ppp.*, row_number() over (PARTITION BY ppp.person_id ORDER BY ppp.payer_plan_period_start_date) as ordinal + FROM @cdm_database_schema.PAYER_PLAN_PERIOD ppp +) C +@joinClause +@whereClause +-- End Payer Plan Period Criteria diff --git a/src/main/resources/resources/cohortdefinition/sql_old/primaryEventsQuery.sql b/src/main/resources/resources/cohortdefinition/sql_old/primaryEventsQuery.sql new file mode 100644 index 00000000..534f24f5 --- /dev/null +++ b/src/main/resources/resources/cohortdefinition/sql_old/primaryEventsQuery.sql @@ -0,0 +1,16 @@ +-- Begin Primary Events +select P.ordinal as event_id, P.person_id, P.start_date, P.end_date, op_start_date, op_end_date, cast(P.visit_occurrence_id as bigint) as visit_occurrence_id +FROM +( + select E.person_id, E.start_date, E.end_date, + row_number() OVER (PARTITION BY E.person_id ORDER BY E.sort_date @EventSort) ordinal, + OP.observation_period_start_date as op_start_date, OP.observation_period_end_date as op_end_date, cast(E.visit_occurrence_id as bigint) as visit_occurrence_id + FROM + ( + @criteriaQueries + ) E + JOIN @cdm_database_schema.observation_period OP on E.person_id = OP.person_id and E.start_date >= OP.observation_period_start_date and E.start_date <= op.observation_period_end_date + WHERE @primaryEventsFilter +) P +@primaryEventLimit +-- End Primary Events diff --git a/src/main/resources/resources/cohortdefinition/sql_old/procedureOccurrence.sql b/src/main/resources/resources/cohortdefinition/sql_old/procedureOccurrence.sql new file mode 100644 index 00000000..cd377d01 --- /dev/null +++ b/src/main/resources/resources/cohortdefinition/sql_old/procedureOccurrence.sql @@ -0,0 +1,13 @@ +-- Begin Procedure Occurrence Criteria +select C.person_id, C.procedure_occurrence_id as event_id, C.procedure_date as start_date, DATEADD(d,1,C.procedure_date) as END_DATE, + C.procedure_concept_id as TARGET_CONCEPT_ID, C.visit_occurrence_id, + C.procedure_date as sort_date +from +( + select po.* @ordinalExpression + FROM @cdm_database_schema.PROCEDURE_OCCURRENCE po +@codesetClause +) C +@joinClause +@whereClause +-- End Procedure Occurrence Criteria diff --git a/src/main/resources/resources/cohortdefinition/sql_old/specimen.sql b/src/main/resources/resources/cohortdefinition/sql_old/specimen.sql new file mode 100644 index 00000000..1f1eefbb --- /dev/null +++ b/src/main/resources/resources/cohortdefinition/sql_old/specimen.sql @@ -0,0 +1,13 @@ +-- Begin Specimen Criteria +select C.person_id, C.specimen_id as event_id, C.specimen_date as start_date, DATEADD(d,1,C.specimen_date) as end_date, + C.specimen_concept_id as TARGET_CONCEPT_ID, CAST(NULL as bigint) as visit_occurrence_id, + C.specimen_date as sort_date +from +( + select s.* @ordinalExpression + FROM @cdm_database_schema.SPECIMEN s +@codesetClause +) C +@joinClause +@whereClause +-- End Specimen Criteria diff --git a/src/main/resources/resources/cohortdefinition/sql_old/visitOccurrence.sql b/src/main/resources/resources/cohortdefinition/sql_old/visitOccurrence.sql new file mode 100644 index 00000000..8a242681 --- /dev/null +++ b/src/main/resources/resources/cohortdefinition/sql_old/visitOccurrence.sql @@ -0,0 +1,13 @@ +-- Begin Visit Occurrence Criteria +select C.person_id, C.visit_occurrence_id as event_id, C.visit_start_date as start_date, C.visit_end_date as end_date, + C.visit_concept_id as TARGET_CONCEPT_ID, C.visit_occurrence_id, + C.visit_start_date as sort_date +from +( + select vo.* @ordinalExpression + FROM @cdm_database_schema.VISIT_OCCURRENCE vo +@codesetClause +) C +@joinClause +@whereClause +-- End Visit Occurrence Criteria diff --git a/src/main/resources/resources/cohortdefinition/sql_old/windowedCriteria.sql b/src/main/resources/resources/cohortdefinition/sql_old/windowedCriteria.sql new file mode 100644 index 00000000..a61e55d6 --- /dev/null +++ b/src/main/resources/resources/cohortdefinition/sql_old/windowedCriteria.sql @@ -0,0 +1,6 @@ +SELECT @indexId as index_id, p.person_id, p.event_id +FROM @eventTable P +@joinType JOIN +( + @criteriaQuery +) A on A.person_id = P.person_id @windowCriteria \ No newline at end of file diff --git a/~/Documents/active_projects/circe-be/cohort_sql.sql b/~/Documents/active_projects/circe-be/cohort_sql.sql new file mode 100644 index 00000000..a5dd3819 --- /dev/null +++ b/~/Documents/active_projects/circe-be/cohort_sql.sql @@ -0,0 +1,2620 @@ +CREATE TEMP TABLE Codesets (codeset_id int NOT NULL, + concept_id bigint NOT NULL +) +; + +INSERT INTO Codesets (codeset_id, concept_id) +SELECT 0 as codeset_id, c.concept_id FROM (select distinct I.concept_id FROM +( + select concept_id from cdm.CONCEPT where 0=1 +) I +) C +; + +CREATE TEMP TABLE qualified_events + +AS +WITH primary_events (event_id, person_id, start_date, end_date, op_start_date, op_end_date, visit_occurrence_id) AS ( +-- Begin Primary Events +select P.ordinal as event_id, P.person_id, P.start_date, P.end_date, op_start_date, op_end_date, cast(P.visit_occurrence_id as bigint) as visit_occurrence_id +FROM +( + select E.person_id, E.start_date, E.end_date, + row_number() OVER (PARTITION BY E.person_id ORDER BY E.sort_date ASC) ordinal, + OP.observation_period_start_date as op_start_date, OP.observation_period_end_date as op_end_date, cast(E.visit_occurrence_id as bigint) as visit_occurrence_id + FROM + ( + select PE.person_id, PE.event_id, PE.start_date, PE.end_date, PE.target_concept_id, PE.visit_occurrence_id, PE.sort_date FROM ( +-- Begin Observation Period Criteria +select C.person_id, C.observation_period_id as event_id, TO_DATE(TO_CHAR(1900,'0000')||'-'||TO_CHAR(1,'00')||'-'||TO_CHAR(1,'00'), 'YYYY-MM-DD') as start_date, TO_DATE(TO_CHAR(2060,'0000')||'-'||TO_CHAR(1,'00')||'-'||TO_CHAR(1,'00'), 'YYYY-MM-DD') as end_date, + C.period_type_concept_id as TARGET_CONCEPT_ID, CAST(NULL as bigint) as visit_occurrence_id, + C.observation_period_start_date as sort_date + +from +( + select op.*, row_number() over (PARTITION BY op.person_id ORDER BY op.observation_period_start_date) as ordinal + FROM cdm.OBSERVATION_PERIOD op +) C +JOIN cdm.PERSON P on C.person_id = P.person_id +WHERE C.ordinal = 1 +AND C.OBSERVATION_PERIOD_START_DATE <= TO_DATE(TO_CHAR(1900,'0000')||'-'||TO_CHAR(1,'00')||'-'||TO_CHAR(1,'00'), 'YYYY-MM-DD') and C.OBSERVATION_PERIOD_END_DATE >= TO_DATE(TO_CHAR(1900,'0000')||'-'||TO_CHAR(1,'00')||'-'||TO_CHAR(1,'00'), 'YYYY-MM-DD') +AND C.OBSERVATION_PERIOD_START_DATE <= TO_DATE(TO_CHAR(2060,'0000')||'-'||TO_CHAR(1,'00')||'-'||TO_CHAR(1,'00'), 'YYYY-MM-DD') and C.OBSERVATION_PERIOD_END_DATE >= TO_DATE(TO_CHAR(2060,'0000')||'-'||TO_CHAR(1,'00')||'-'||TO_CHAR(1,'00'), 'YYYY-MM-DD') +AND (C.observation_period_end_date >= TO_DATE(TO_CHAR(2099,'0000')||'-'||TO_CHAR(1,'00')||'-'||TO_CHAR(1,'00'), 'YYYY-MM-DD') and C.observation_period_end_date <= TO_DATE(TO_CHAR(2999,'0000')||'-'||TO_CHAR(1,'00')||'-'||TO_CHAR(1,'00'), 'YYYY-MM-DD')) +AND C.period_type_concept_id in (44814725,44787739) +AND ((CAST(C.observation_period_end_date AS DATE) - CAST(C.observation_period_start_date AS DATE)) >= 0 and (CAST(C.observation_period_end_date AS DATE) - CAST(C.observation_period_start_date AS DATE)) <= 999) +AND (EXTRACT(YEAR FROM C.observation_period_start_date) - P.year_of_birth >= 0 and EXTRACT(YEAR FROM C.observation_period_start_date) - P.year_of_birth <= 99) +AND (EXTRACT(YEAR FROM C.observation_period_end_date) - P.year_of_birth >= 0 and EXTRACT(YEAR FROM C.observation_period_end_date) - P.year_of_birth <= 99) +-- End Observation Period Criteria + +) PE +JOIN ( +-- Begin Criteria Group +select 0 as index_id, person_id, event_id +FROM +( + select E.person_id, E.event_id + FROM (SELECT Q.person_id, Q.event_id, Q.start_date, Q.end_date, Q.visit_occurrence_id, OP.observation_period_start_date as op_start_date, OP.observation_period_end_date as op_end_date +FROM (-- Begin Observation Period Criteria +select C.person_id, C.observation_period_id as event_id, TO_DATE(TO_CHAR(1900,'0000')||'-'||TO_CHAR(1,'00')||'-'||TO_CHAR(1,'00'), 'YYYY-MM-DD') as start_date, TO_DATE(TO_CHAR(2060,'0000')||'-'||TO_CHAR(1,'00')||'-'||TO_CHAR(1,'00'), 'YYYY-MM-DD') as end_date, + C.period_type_concept_id as TARGET_CONCEPT_ID, CAST(NULL as bigint) as visit_occurrence_id, + C.observation_period_start_date as sort_date + +from +( + select op.*, row_number() over (PARTITION BY op.person_id ORDER BY op.observation_period_start_date) as ordinal + FROM cdm.OBSERVATION_PERIOD op +) C +JOIN cdm.PERSON P on C.person_id = P.person_id +WHERE C.ordinal = 1 +AND C.OBSERVATION_PERIOD_START_DATE <= TO_DATE(TO_CHAR(1900,'0000')||'-'||TO_CHAR(1,'00')||'-'||TO_CHAR(1,'00'), 'YYYY-MM-DD') and C.OBSERVATION_PERIOD_END_DATE >= TO_DATE(TO_CHAR(1900,'0000')||'-'||TO_CHAR(1,'00')||'-'||TO_CHAR(1,'00'), 'YYYY-MM-DD') +AND C.OBSERVATION_PERIOD_START_DATE <= TO_DATE(TO_CHAR(2060,'0000')||'-'||TO_CHAR(1,'00')||'-'||TO_CHAR(1,'00'), 'YYYY-MM-DD') and C.OBSERVATION_PERIOD_END_DATE >= TO_DATE(TO_CHAR(2060,'0000')||'-'||TO_CHAR(1,'00')||'-'||TO_CHAR(1,'00'), 'YYYY-MM-DD') +AND (C.observation_period_end_date >= TO_DATE(TO_CHAR(2099,'0000')||'-'||TO_CHAR(1,'00')||'-'||TO_CHAR(1,'00'), 'YYYY-MM-DD') and C.observation_period_end_date <= TO_DATE(TO_CHAR(2999,'0000')||'-'||TO_CHAR(1,'00')||'-'||TO_CHAR(1,'00'), 'YYYY-MM-DD')) +AND C.period_type_concept_id in (44814725,44787739) +AND ((CAST(C.observation_period_end_date AS DATE) - CAST(C.observation_period_start_date AS DATE)) >= 0 and (CAST(C.observation_period_end_date AS DATE) - CAST(C.observation_period_start_date AS DATE)) <= 999) +AND (EXTRACT(YEAR FROM C.observation_period_start_date) - P.year_of_birth >= 0 and EXTRACT(YEAR FROM C.observation_period_start_date) - P.year_of_birth <= 99) +AND (EXTRACT(YEAR FROM C.observation_period_end_date) - P.year_of_birth >= 0 and EXTRACT(YEAR FROM C.observation_period_end_date) - P.year_of_birth <= 99) +-- End Observation Period Criteria +) Q +JOIN cdm.OBSERVATION_PERIOD OP on Q.person_id = OP.person_id + and OP.observation_period_start_date <= Q.start_date and OP.observation_period_end_date >= Q.start_date +) E + INNER JOIN + ( + -- Begin Correlated Criteria +SELECT 0 as index_id, p.person_id, p.event_id +FROM (SELECT Q.person_id, Q.event_id, Q.start_date, Q.end_date, Q.visit_occurrence_id, OP.observation_period_start_date as op_start_date, OP.observation_period_end_date as op_end_date +FROM (-- Begin Observation Period Criteria +select C.person_id, C.observation_period_id as event_id, TO_DATE(TO_CHAR(1900,'0000')||'-'||TO_CHAR(1,'00')||'-'||TO_CHAR(1,'00'), 'YYYY-MM-DD') as start_date, TO_DATE(TO_CHAR(2060,'0000')||'-'||TO_CHAR(1,'00')||'-'||TO_CHAR(1,'00'), 'YYYY-MM-DD') as end_date, + C.period_type_concept_id as TARGET_CONCEPT_ID, CAST(NULL as bigint) as visit_occurrence_id, + C.observation_period_start_date as sort_date + +from +( + select op.*, row_number() over (PARTITION BY op.person_id ORDER BY op.observation_period_start_date) as ordinal + FROM cdm.OBSERVATION_PERIOD op +) C +JOIN cdm.PERSON P on C.person_id = P.person_id +WHERE C.ordinal = 1 +AND C.OBSERVATION_PERIOD_START_DATE <= TO_DATE(TO_CHAR(1900,'0000')||'-'||TO_CHAR(1,'00')||'-'||TO_CHAR(1,'00'), 'YYYY-MM-DD') and C.OBSERVATION_PERIOD_END_DATE >= TO_DATE(TO_CHAR(1900,'0000')||'-'||TO_CHAR(1,'00')||'-'||TO_CHAR(1,'00'), 'YYYY-MM-DD') +AND C.OBSERVATION_PERIOD_START_DATE <= TO_DATE(TO_CHAR(2060,'0000')||'-'||TO_CHAR(1,'00')||'-'||TO_CHAR(1,'00'), 'YYYY-MM-DD') and C.OBSERVATION_PERIOD_END_DATE >= TO_DATE(TO_CHAR(2060,'0000')||'-'||TO_CHAR(1,'00')||'-'||TO_CHAR(1,'00'), 'YYYY-MM-DD') +AND (C.observation_period_end_date >= TO_DATE(TO_CHAR(2099,'0000')||'-'||TO_CHAR(1,'00')||'-'||TO_CHAR(1,'00'), 'YYYY-MM-DD') and C.observation_period_end_date <= TO_DATE(TO_CHAR(2999,'0000')||'-'||TO_CHAR(1,'00')||'-'||TO_CHAR(1,'00'), 'YYYY-MM-DD')) +AND C.period_type_concept_id in (44814725,44787739) +AND ((CAST(C.observation_period_end_date AS DATE) - CAST(C.observation_period_start_date AS DATE)) >= 0 and (CAST(C.observation_period_end_date AS DATE) - CAST(C.observation_period_start_date AS DATE)) <= 999) +AND (EXTRACT(YEAR FROM C.observation_period_start_date) - P.year_of_birth >= 0 and EXTRACT(YEAR FROM C.observation_period_start_date) - P.year_of_birth <= 99) +AND (EXTRACT(YEAR FROM C.observation_period_end_date) - P.year_of_birth >= 0 and EXTRACT(YEAR FROM C.observation_period_end_date) - P.year_of_birth <= 99) +-- End Observation Period Criteria +) Q +JOIN cdm.OBSERVATION_PERIOD OP on Q.person_id = OP.person_id + and OP.observation_period_start_date <= Q.start_date and OP.observation_period_end_date >= Q.start_date +) P +INNER JOIN +( + -- Begin Condition Occurrence Criteria +SELECT C.person_id, C.condition_occurrence_id as event_id, C.condition_start_date as start_date, COALESCE(C.condition_end_date, (C.condition_start_date + 1*INTERVAL'1 day')) as end_date, + C.CONDITION_CONCEPT_ID as TARGET_CONCEPT_ID, C.visit_occurrence_id, + C.condition_start_date as sort_date +FROM +( + SELECT co.* + FROM cdm.CONDITION_OCCURRENCE co + +) C + + +-- End Condition Occurrence Criteria + +) A on A.person_id = P.person_id AND A.visit_occurrence_id = P.visit_occurrence_id +GROUP BY p.person_id, p.event_id +HAVING COUNT(A.TARGET_CONCEPT_ID) >= 1 +-- End Correlated Criteria + + ) CQ on E.person_id = CQ.person_id and E.event_id = CQ.event_id + GROUP BY E.person_id, E.event_id + HAVING COUNT(index_id) = 1 +) G +-- End Criteria Group +) AC on AC.person_id = pe.person_id and AC.event_id = pe.event_id + + ) E + JOIN cdm.observation_period OP on E.person_id = OP.person_id and E.start_date >= OP.observation_period_start_date and E.start_date <= op.observation_period_end_date + WHERE (OP.OBSERVATION_PERIOD_START_DATE + 0*INTERVAL'1 day') <= E.START_DATE AND (E.START_DATE + 0*INTERVAL'1 day') <= OP.OBSERVATION_PERIOD_END_DATE +) P +WHERE P.ordinal = 1 +-- End Primary Events + +) + SELECT +event_id, person_id, start_date, end_date, op_start_date, op_end_date, visit_occurrence_id + +FROM +( + select pe.event_id, pe.person_id, pe.start_date, pe.end_date, pe.op_start_date, pe.op_end_date, row_number() over (partition by pe.person_id order by pe.start_date ASC) as ordinal, cast(pe.visit_occurrence_id as bigint) as visit_occurrence_id + FROM primary_events pe + +) QE + +; +ANALYZE qualified_events +; + +--- Inclusion Rule Inserts + +CREATE TEMP TABLE Inclusion_0 + +AS +SELECT +0 as inclusion_rule_id, person_id, event_id + +FROM +( + select pe.person_id, pe.event_id + FROM qualified_events pe + +JOIN ( +-- Begin Criteria Group +select 0 as index_id, person_id, event_id +FROM +( + select E.person_id, E.event_id + FROM qualified_events E + INNER JOIN + ( + -- Begin Demographic Criteria +SELECT 0 as index_id, e.person_id, e.event_id +FROM qualified_events E +JOIN cdm.PERSON P ON P.PERSON_ID = E.PERSON_ID +WHERE (EXTRACT(YEAR FROM E.start_date) - P.year_of_birth >= 0 and EXTRACT(YEAR FROM E.start_date) - P.year_of_birth <= 99) AND P.gender_concept_id in (8507) AND P.race_concept_id in (8515,38003578) AND P.race_concept_id in (8515,38003578) AND P.ethnicity_concept_id in (38003564) AND (E.start_date >= TO_DATE(TO_CHAR(1900,'0000')||'-'||TO_CHAR(1,'00')||'-'||TO_CHAR(1,'00'), 'YYYY-MM-DD') and E.start_date <= TO_DATE(TO_CHAR(2099,'0000')||'-'||TO_CHAR(1,'00')||'-'||TO_CHAR(1,'00'), 'YYYY-MM-DD')) AND (E.end_date >= TO_DATE(TO_CHAR(1900,'0000')||'-'||TO_CHAR(1,'00')||'-'||TO_CHAR(1,'00'), 'YYYY-MM-DD') and E.end_date <= TO_DATE(TO_CHAR(2099,'0000')||'-'||TO_CHAR(1,'00')||'-'||TO_CHAR(1,'00'), 'YYYY-MM-DD')) +GROUP BY e.person_id, e.event_id +-- End Demographic Criteria + + ) CQ on E.person_id = CQ.person_id and E.event_id = CQ.event_id + GROUP BY E.person_id, E.event_id + HAVING COUNT(index_id) = 1 +) G +-- End Criteria Group +) AC on AC.person_id = pe.person_id AND AC.event_id = pe.event_id +) Results +; +ANALYZE Inclusion_0 +; + +CREATE TEMP TABLE Inclusion_1 + +AS +SELECT +1 as inclusion_rule_id, person_id, event_id + +FROM +( + select pe.person_id, pe.event_id + FROM qualified_events pe + +JOIN ( +-- Begin Criteria Group +select 0 as index_id, person_id, event_id +FROM +( + select E.person_id, E.event_id + FROM qualified_events E + INNER JOIN + ( + -- Begin Correlated Criteria +SELECT 0 as index_id, p.person_id, p.event_id +FROM qualified_events P +INNER JOIN +( + select PE.person_id, PE.event_id, PE.start_date, PE.end_date, PE.target_concept_id, PE.visit_occurrence_id, PE.sort_date FROM ( +-- Begin Condition Occurrence Criteria +SELECT C.person_id, C.condition_occurrence_id as event_id, C.condition_start_date as start_date, COALESCE(C.condition_end_date, (C.condition_start_date + 1*INTERVAL'1 day')) as end_date, + C.CONDITION_CONCEPT_ID as TARGET_CONCEPT_ID, C.visit_occurrence_id, + C.condition_start_date as sort_date +FROM +( + SELECT co.* , row_number() over (PARTITION BY co.person_id ORDER BY co.condition_start_date, co.condition_occurrence_id) as ordinal + FROM cdm.CONDITION_OCCURRENCE co + JOIN Codesets codesets on ((co.condition_concept_id = codesets.concept_id and codesets.codeset_id = 0) AND (co.condition_source_concept_id = codesets.concept_id and codesets.codeset_id = 0)) +) C +JOIN cdm.PERSON P on C.person_id = P.person_id +JOIN cdm.VISIT_OCCURRENCE V on C.visit_occurrence_id = V.visit_occurrence_id and C.person_id = V.person_id +LEFT JOIN cdm.PROVIDER PR on C.provider_id = PR.provider_id +WHERE (C.condition_start_date >= TO_DATE(TO_CHAR(1900,'0000')||'-'||TO_CHAR(1,'00')||'-'||TO_CHAR(1,'00'), 'YYYY-MM-DD') and C.condition_start_date <= TO_DATE(TO_CHAR(2099,'0000')||'-'||TO_CHAR(1,'00')||'-'||TO_CHAR(1,'00'), 'YYYY-MM-DD')) +AND (C.condition_end_date >= TO_DATE(TO_CHAR(1900,'0000')||'-'||TO_CHAR(1,'00')||'-'||TO_CHAR(1,'00'), 'YYYY-MM-DD') and C.condition_end_date <= TO_DATE(TO_CHAR(2099,'0000')||'-'||TO_CHAR(1,'00')||'-'||TO_CHAR(1,'00'), 'YYYY-MM-DD')) +AND C.condition_type_concept_id in (38000199) +AND C.stop_reason like '%this is some test text%' +AND (EXTRACT(YEAR FROM C.condition_start_date) - P.year_of_birth >= 0 and EXTRACT(YEAR FROM C.condition_start_date) - P.year_of_birth <= 99) +AND P.gender_concept_id in (8507) +AND PR.specialty_concept_id in (45444755,45418395) +AND V.visit_concept_id in (9201) +AND C.ordinal = 1 +-- End Condition Occurrence Criteria + +) PE +JOIN ( +-- Begin Criteria Group +select 0 as index_id, person_id, event_id +FROM +( + select E.person_id, E.event_id + FROM (SELECT Q.person_id, Q.event_id, Q.start_date, Q.end_date, Q.visit_occurrence_id, OP.observation_period_start_date as op_start_date, OP.observation_period_end_date as op_end_date +FROM (-- Begin Condition Occurrence Criteria +SELECT C.person_id, C.condition_occurrence_id as event_id, C.condition_start_date as start_date, COALESCE(C.condition_end_date, (C.condition_start_date + 1*INTERVAL'1 day')) as end_date, + C.CONDITION_CONCEPT_ID as TARGET_CONCEPT_ID, C.visit_occurrence_id, + C.condition_start_date as sort_date +FROM +( + SELECT co.* , row_number() over (PARTITION BY co.person_id ORDER BY co.condition_start_date, co.condition_occurrence_id) as ordinal + FROM cdm.CONDITION_OCCURRENCE co + JOIN Codesets codesets on ((co.condition_concept_id = codesets.concept_id and codesets.codeset_id = 0) AND (co.condition_source_concept_id = codesets.concept_id and codesets.codeset_id = 0)) +) C +JOIN cdm.PERSON P on C.person_id = P.person_id +JOIN cdm.VISIT_OCCURRENCE V on C.visit_occurrence_id = V.visit_occurrence_id and C.person_id = V.person_id +LEFT JOIN cdm.PROVIDER PR on C.provider_id = PR.provider_id +WHERE (C.condition_start_date >= TO_DATE(TO_CHAR(1900,'0000')||'-'||TO_CHAR(1,'00')||'-'||TO_CHAR(1,'00'), 'YYYY-MM-DD') and C.condition_start_date <= TO_DATE(TO_CHAR(2099,'0000')||'-'||TO_CHAR(1,'00')||'-'||TO_CHAR(1,'00'), 'YYYY-MM-DD')) +AND (C.condition_end_date >= TO_DATE(TO_CHAR(1900,'0000')||'-'||TO_CHAR(1,'00')||'-'||TO_CHAR(1,'00'), 'YYYY-MM-DD') and C.condition_end_date <= TO_DATE(TO_CHAR(2099,'0000')||'-'||TO_CHAR(1,'00')||'-'||TO_CHAR(1,'00'), 'YYYY-MM-DD')) +AND C.condition_type_concept_id in (38000199) +AND C.stop_reason like '%this is some test text%' +AND (EXTRACT(YEAR FROM C.condition_start_date) - P.year_of_birth >= 0 and EXTRACT(YEAR FROM C.condition_start_date) - P.year_of_birth <= 99) +AND P.gender_concept_id in (8507) +AND PR.specialty_concept_id in (45444755,45418395) +AND V.visit_concept_id in (9201) +AND C.ordinal = 1 +-- End Condition Occurrence Criteria +) Q +JOIN cdm.OBSERVATION_PERIOD OP on Q.person_id = OP.person_id + and OP.observation_period_start_date <= Q.start_date and OP.observation_period_end_date >= Q.start_date +) E + INNER JOIN + ( + -- Begin Correlated Criteria +SELECT 0 as index_id, p.person_id, p.event_id +FROM (SELECT Q.person_id, Q.event_id, Q.start_date, Q.end_date, Q.visit_occurrence_id, OP.observation_period_start_date as op_start_date, OP.observation_period_end_date as op_end_date +FROM (-- Begin Condition Occurrence Criteria +SELECT C.person_id, C.condition_occurrence_id as event_id, C.condition_start_date as start_date, COALESCE(C.condition_end_date, (C.condition_start_date + 1*INTERVAL'1 day')) as end_date, + C.CONDITION_CONCEPT_ID as TARGET_CONCEPT_ID, C.visit_occurrence_id, + C.condition_start_date as sort_date +FROM +( + SELECT co.* , row_number() over (PARTITION BY co.person_id ORDER BY co.condition_start_date, co.condition_occurrence_id) as ordinal + FROM cdm.CONDITION_OCCURRENCE co + JOIN Codesets codesets on ((co.condition_concept_id = codesets.concept_id and codesets.codeset_id = 0) AND (co.condition_source_concept_id = codesets.concept_id and codesets.codeset_id = 0)) +) C +JOIN cdm.PERSON P on C.person_id = P.person_id +JOIN cdm.VISIT_OCCURRENCE V on C.visit_occurrence_id = V.visit_occurrence_id and C.person_id = V.person_id +LEFT JOIN cdm.PROVIDER PR on C.provider_id = PR.provider_id +WHERE (C.condition_start_date >= TO_DATE(TO_CHAR(1900,'0000')||'-'||TO_CHAR(1,'00')||'-'||TO_CHAR(1,'00'), 'YYYY-MM-DD') and C.condition_start_date <= TO_DATE(TO_CHAR(2099,'0000')||'-'||TO_CHAR(1,'00')||'-'||TO_CHAR(1,'00'), 'YYYY-MM-DD')) +AND (C.condition_end_date >= TO_DATE(TO_CHAR(1900,'0000')||'-'||TO_CHAR(1,'00')||'-'||TO_CHAR(1,'00'), 'YYYY-MM-DD') and C.condition_end_date <= TO_DATE(TO_CHAR(2099,'0000')||'-'||TO_CHAR(1,'00')||'-'||TO_CHAR(1,'00'), 'YYYY-MM-DD')) +AND C.condition_type_concept_id in (38000199) +AND C.stop_reason like '%this is some test text%' +AND (EXTRACT(YEAR FROM C.condition_start_date) - P.year_of_birth >= 0 and EXTRACT(YEAR FROM C.condition_start_date) - P.year_of_birth <= 99) +AND P.gender_concept_id in (8507) +AND PR.specialty_concept_id in (45444755,45418395) +AND V.visit_concept_id in (9201) +AND C.ordinal = 1 +-- End Condition Occurrence Criteria +) Q +JOIN cdm.OBSERVATION_PERIOD OP on Q.person_id = OP.person_id + and OP.observation_period_start_date <= Q.start_date and OP.observation_period_end_date >= Q.start_date +) P +INNER JOIN +( + -- Begin Condition Occurrence Criteria +SELECT C.person_id, C.condition_occurrence_id as event_id, C.condition_start_date as start_date, COALESCE(C.condition_end_date, (C.condition_start_date + 1*INTERVAL'1 day')) as end_date, + C.CONDITION_CONCEPT_ID as TARGET_CONCEPT_ID, C.visit_occurrence_id, + C.condition_start_date as sort_date +FROM +( + SELECT co.* + FROM cdm.CONDITION_OCCURRENCE co + +) C + + +-- End Condition Occurrence Criteria + +) A on A.person_id = P.person_id AND A.visit_occurrence_id = P.visit_occurrence_id +GROUP BY p.person_id, p.event_id +HAVING COUNT(A.TARGET_CONCEPT_ID) >= 1 +-- End Correlated Criteria + + ) CQ on E.person_id = CQ.person_id and E.event_id = CQ.event_id + GROUP BY E.person_id, E.event_id + HAVING COUNT(index_id) = 1 +) G +-- End Criteria Group +) AC on AC.person_id = pe.person_id and AC.event_id = pe.event_id + +) A on A.person_id = P.person_id AND A.START_DATE >= P.OP_START_DATE AND A.START_DATE <= P.OP_END_DATE AND A.START_DATE >= (P.START_DATE + -30*INTERVAL'1 day') AND A.START_DATE <= (P.START_DATE + 30*INTERVAL'1 day') +GROUP BY p.person_id, p.event_id +HAVING COUNT(A.TARGET_CONCEPT_ID) >= 1 +-- End Correlated Criteria + + ) CQ on E.person_id = CQ.person_id and E.event_id = CQ.event_id + GROUP BY E.person_id, E.event_id + HAVING COUNT(index_id) = 1 +) G +-- End Criteria Group +) AC on AC.person_id = pe.person_id AND AC.event_id = pe.event_id +) Results +; +ANALYZE Inclusion_1 +; + +CREATE TEMP TABLE Inclusion_2 + +AS +SELECT +2 as inclusion_rule_id, person_id, event_id + +FROM +( + select pe.person_id, pe.event_id + FROM qualified_events pe + +JOIN ( +-- Begin Criteria Group +select 0 as index_id, person_id, event_id +FROM +( + select E.person_id, E.event_id + FROM qualified_events E + INNER JOIN + ( + -- Begin Correlated Criteria +SELECT 0 as index_id, p.person_id, p.event_id +FROM qualified_events P +INNER JOIN +( + select PE.person_id, PE.event_id, PE.start_date, PE.end_date, PE.target_concept_id, PE.visit_occurrence_id, PE.sort_date FROM ( +-- Begin Condition Era Criteria +select C.person_id, C.condition_era_id as event_id, C.condition_era_start_date as start_date, + C.condition_era_end_date as end_date, C.CONDITION_CONCEPT_ID as TARGET_CONCEPT_ID, CAST(NULL as bigint) as visit_occurrence_id, + C.condition_era_start_date as sort_date +from +( + select ce.* , row_number() over (PARTITION BY ce.person_id ORDER BY ce.condition_era_start_date, ce.condition_era_id) as ordinal + FROM cdm.CONDITION_ERA ce +where ce.condition_concept_id in (SELECT concept_id from Codesets where codeset_id = 0) +) C +JOIN cdm.PERSON P on C.person_id = P.person_id +WHERE (C.condition_era_start_date >= TO_DATE(TO_CHAR(1900,'0000')||'-'||TO_CHAR(1,'00')||'-'||TO_CHAR(1,'00'), 'YYYY-MM-DD') and C.condition_era_start_date <= TO_DATE(TO_CHAR(2099,'0000')||'-'||TO_CHAR(1,'00')||'-'||TO_CHAR(1,'00'), 'YYYY-MM-DD')) +AND (C.condition_era_end_date >= TO_DATE(TO_CHAR(1900,'0000')||'-'||TO_CHAR(1,'00')||'-'||TO_CHAR(1,'00'), 'YYYY-MM-DD') and C.condition_era_end_date <= TO_DATE(TO_CHAR(2099,'0000')||'-'||TO_CHAR(1,'00')||'-'||TO_CHAR(1,'00'), 'YYYY-MM-DD')) +AND (C.condition_occurrence_count >= 0 and C.condition_occurrence_count <= 99) +AND ((CAST(C.condition_era_end_date AS DATE) - CAST(C.condition_era_start_date AS DATE)) >= 0 and (CAST(C.condition_era_end_date AS DATE) - CAST(C.condition_era_start_date AS DATE)) <= 99) +AND (EXTRACT(YEAR FROM C.condition_era_start_date) - P.year_of_birth >= 0 and EXTRACT(YEAR FROM C.condition_era_start_date) - P.year_of_birth <= 99) +AND (EXTRACT(YEAR FROM C.condition_era_end_date) - P.year_of_birth >= 0 and EXTRACT(YEAR FROM C.condition_era_end_date) - P.year_of_birth <= 99) +AND P.gender_concept_id in (8507) +AND C.ordinal = 1 +-- End Condition Era Criteria + +) PE +JOIN ( +-- Begin Criteria Group +select 0 as index_id, person_id, event_id +FROM +( + select E.person_id, E.event_id + FROM (SELECT Q.person_id, Q.event_id, Q.start_date, Q.end_date, Q.visit_occurrence_id, OP.observation_period_start_date as op_start_date, OP.observation_period_end_date as op_end_date +FROM (-- Begin Condition Era Criteria +select C.person_id, C.condition_era_id as event_id, C.condition_era_start_date as start_date, + C.condition_era_end_date as end_date, C.CONDITION_CONCEPT_ID as TARGET_CONCEPT_ID, CAST(NULL as bigint) as visit_occurrence_id, + C.condition_era_start_date as sort_date +from +( + select ce.* , row_number() over (PARTITION BY ce.person_id ORDER BY ce.condition_era_start_date, ce.condition_era_id) as ordinal + FROM cdm.CONDITION_ERA ce +where ce.condition_concept_id in (SELECT concept_id from Codesets where codeset_id = 0) +) C +JOIN cdm.PERSON P on C.person_id = P.person_id +WHERE (C.condition_era_start_date >= TO_DATE(TO_CHAR(1900,'0000')||'-'||TO_CHAR(1,'00')||'-'||TO_CHAR(1,'00'), 'YYYY-MM-DD') and C.condition_era_start_date <= TO_DATE(TO_CHAR(2099,'0000')||'-'||TO_CHAR(1,'00')||'-'||TO_CHAR(1,'00'), 'YYYY-MM-DD')) +AND (C.condition_era_end_date >= TO_DATE(TO_CHAR(1900,'0000')||'-'||TO_CHAR(1,'00')||'-'||TO_CHAR(1,'00'), 'YYYY-MM-DD') and C.condition_era_end_date <= TO_DATE(TO_CHAR(2099,'0000')||'-'||TO_CHAR(1,'00')||'-'||TO_CHAR(1,'00'), 'YYYY-MM-DD')) +AND (C.condition_occurrence_count >= 0 and C.condition_occurrence_count <= 99) +AND ((CAST(C.condition_era_end_date AS DATE) - CAST(C.condition_era_start_date AS DATE)) >= 0 and (CAST(C.condition_era_end_date AS DATE) - CAST(C.condition_era_start_date AS DATE)) <= 99) +AND (EXTRACT(YEAR FROM C.condition_era_start_date) - P.year_of_birth >= 0 and EXTRACT(YEAR FROM C.condition_era_start_date) - P.year_of_birth <= 99) +AND (EXTRACT(YEAR FROM C.condition_era_end_date) - P.year_of_birth >= 0 and EXTRACT(YEAR FROM C.condition_era_end_date) - P.year_of_birth <= 99) +AND P.gender_concept_id in (8507) +AND C.ordinal = 1 +-- End Condition Era Criteria +) Q +JOIN cdm.OBSERVATION_PERIOD OP on Q.person_id = OP.person_id + and OP.observation_period_start_date <= Q.start_date and OP.observation_period_end_date >= Q.start_date +) E + INNER JOIN + ( + -- Begin Correlated Criteria +SELECT 0 as index_id, p.person_id, p.event_id +FROM (SELECT Q.person_id, Q.event_id, Q.start_date, Q.end_date, Q.visit_occurrence_id, OP.observation_period_start_date as op_start_date, OP.observation_period_end_date as op_end_date +FROM (-- Begin Condition Era Criteria +select C.person_id, C.condition_era_id as event_id, C.condition_era_start_date as start_date, + C.condition_era_end_date as end_date, C.CONDITION_CONCEPT_ID as TARGET_CONCEPT_ID, CAST(NULL as bigint) as visit_occurrence_id, + C.condition_era_start_date as sort_date +from +( + select ce.* , row_number() over (PARTITION BY ce.person_id ORDER BY ce.condition_era_start_date, ce.condition_era_id) as ordinal + FROM cdm.CONDITION_ERA ce +where ce.condition_concept_id in (SELECT concept_id from Codesets where codeset_id = 0) +) C +JOIN cdm.PERSON P on C.person_id = P.person_id +WHERE (C.condition_era_start_date >= TO_DATE(TO_CHAR(1900,'0000')||'-'||TO_CHAR(1,'00')||'-'||TO_CHAR(1,'00'), 'YYYY-MM-DD') and C.condition_era_start_date <= TO_DATE(TO_CHAR(2099,'0000')||'-'||TO_CHAR(1,'00')||'-'||TO_CHAR(1,'00'), 'YYYY-MM-DD')) +AND (C.condition_era_end_date >= TO_DATE(TO_CHAR(1900,'0000')||'-'||TO_CHAR(1,'00')||'-'||TO_CHAR(1,'00'), 'YYYY-MM-DD') and C.condition_era_end_date <= TO_DATE(TO_CHAR(2099,'0000')||'-'||TO_CHAR(1,'00')||'-'||TO_CHAR(1,'00'), 'YYYY-MM-DD')) +AND (C.condition_occurrence_count >= 0 and C.condition_occurrence_count <= 99) +AND ((CAST(C.condition_era_end_date AS DATE) - CAST(C.condition_era_start_date AS DATE)) >= 0 and (CAST(C.condition_era_end_date AS DATE) - CAST(C.condition_era_start_date AS DATE)) <= 99) +AND (EXTRACT(YEAR FROM C.condition_era_start_date) - P.year_of_birth >= 0 and EXTRACT(YEAR FROM C.condition_era_start_date) - P.year_of_birth <= 99) +AND (EXTRACT(YEAR FROM C.condition_era_end_date) - P.year_of_birth >= 0 and EXTRACT(YEAR FROM C.condition_era_end_date) - P.year_of_birth <= 99) +AND P.gender_concept_id in (8507) +AND C.ordinal = 1 +-- End Condition Era Criteria +) Q +JOIN cdm.OBSERVATION_PERIOD OP on Q.person_id = OP.person_id + and OP.observation_period_start_date <= Q.start_date and OP.observation_period_end_date >= Q.start_date +) P +INNER JOIN +( + -- Begin Condition Era Criteria +select C.person_id, C.condition_era_id as event_id, C.condition_era_start_date as start_date, + C.condition_era_end_date as end_date, C.CONDITION_CONCEPT_ID as TARGET_CONCEPT_ID, CAST(NULL as bigint) as visit_occurrence_id, + C.condition_era_start_date as sort_date +from +( + select ce.* + FROM cdm.CONDITION_ERA ce + +) C + + +-- End Condition Era Criteria + +) A on A.person_id = P.person_id +GROUP BY p.person_id, p.event_id +HAVING COUNT(A.TARGET_CONCEPT_ID) >= 1 +-- End Correlated Criteria + + ) CQ on E.person_id = CQ.person_id and E.event_id = CQ.event_id + GROUP BY E.person_id, E.event_id + HAVING COUNT(index_id) = 1 +) G +-- End Criteria Group +) AC on AC.person_id = pe.person_id and AC.event_id = pe.event_id + +) A on A.person_id = P.person_id AND A.START_DATE >= P.OP_START_DATE AND A.START_DATE <= P.OP_END_DATE AND A.START_DATE >= (P.START_DATE + -30*INTERVAL'1 day') AND A.START_DATE <= (P.START_DATE + 30*INTERVAL'1 day') +GROUP BY p.person_id, p.event_id +HAVING COUNT(A.TARGET_CONCEPT_ID) >= 1 +-- End Correlated Criteria + + ) CQ on E.person_id = CQ.person_id and E.event_id = CQ.event_id + GROUP BY E.person_id, E.event_id + HAVING COUNT(index_id) = 1 +) G +-- End Criteria Group +) AC on AC.person_id = pe.person_id AND AC.event_id = pe.event_id +) Results +; +ANALYZE Inclusion_2 +; + +CREATE TEMP TABLE Inclusion_3 + +AS +SELECT +3 as inclusion_rule_id, person_id, event_id + +FROM +( + select pe.person_id, pe.event_id + FROM qualified_events pe + +JOIN ( +-- Begin Criteria Group +select 0 as index_id, person_id, event_id +FROM +( + select E.person_id, E.event_id + FROM qualified_events E + INNER JOIN + ( + -- Begin Correlated Criteria +SELECT 0 as index_id, p.person_id, p.event_id +FROM qualified_events P +INNER JOIN +( + select PE.person_id, PE.event_id, PE.start_date, PE.end_date, PE.target_concept_id, PE.visit_occurrence_id, PE.sort_date FROM ( +-- Begin Death Criteria +select C.person_id, C.person_id as event_id, C.death_date as start_date, (C.death_date + 1*INTERVAL'1 day') as end_date, + coalesce(C.cause_concept_id,0) as TARGET_CONCEPT_ID, CAST(NULL as bigint) as visit_occurrence_id, + C.death_date as sort_date +from +( + select d.* + FROM cdm.DEATH d +JOIN Codesets codesets on ((d.cause_concept_id = codesets.concept_id and codesets.codeset_id = 0)) +) C +JOIN cdm.PERSON P on C.person_id = P.person_id +WHERE (C.death_date >= TO_DATE(TO_CHAR(1900,'0000')||'-'||TO_CHAR(1,'00')||'-'||TO_CHAR(1,'00'), 'YYYY-MM-DD') and C.death_date <= TO_DATE(TO_CHAR(2099,'0000')||'-'||TO_CHAR(1,'00')||'-'||TO_CHAR(1,'00'), 'YYYY-MM-DD')) +AND C.death_type_concept_id in (256,255,254) +AND (EXTRACT(YEAR FROM C.death_date) - P.year_of_birth >= 0 and EXTRACT(YEAR FROM C.death_date) - P.year_of_birth <= 99) +AND P.gender_concept_id in (8532,8507) +-- End Death Criteria + + +) PE +JOIN ( +-- Begin Criteria Group +select 0 as index_id, person_id, event_id +FROM +( + select E.person_id, E.event_id + FROM (SELECT Q.person_id, Q.event_id, Q.start_date, Q.end_date, Q.visit_occurrence_id, OP.observation_period_start_date as op_start_date, OP.observation_period_end_date as op_end_date +FROM (-- Begin Death Criteria +select C.person_id, C.person_id as event_id, C.death_date as start_date, (C.death_date + 1*INTERVAL'1 day') as end_date, + coalesce(C.cause_concept_id,0) as TARGET_CONCEPT_ID, CAST(NULL as bigint) as visit_occurrence_id, + C.death_date as sort_date +from +( + select d.* + FROM cdm.DEATH d +JOIN Codesets codesets on ((d.cause_concept_id = codesets.concept_id and codesets.codeset_id = 0)) +) C +JOIN cdm.PERSON P on C.person_id = P.person_id +WHERE (C.death_date >= TO_DATE(TO_CHAR(1900,'0000')||'-'||TO_CHAR(1,'00')||'-'||TO_CHAR(1,'00'), 'YYYY-MM-DD') and C.death_date <= TO_DATE(TO_CHAR(2099,'0000')||'-'||TO_CHAR(1,'00')||'-'||TO_CHAR(1,'00'), 'YYYY-MM-DD')) +AND C.death_type_concept_id in (256,255,254) +AND (EXTRACT(YEAR FROM C.death_date) - P.year_of_birth >= 0 and EXTRACT(YEAR FROM C.death_date) - P.year_of_birth <= 99) +AND P.gender_concept_id in (8532,8507) +-- End Death Criteria + +) Q +JOIN cdm.OBSERVATION_PERIOD OP on Q.person_id = OP.person_id + and OP.observation_period_start_date <= Q.start_date and OP.observation_period_end_date >= Q.start_date +) E + INNER JOIN + ( + -- Begin Correlated Criteria +SELECT 0 as index_id, p.person_id, p.event_id +FROM (SELECT Q.person_id, Q.event_id, Q.start_date, Q.end_date, Q.visit_occurrence_id, OP.observation_period_start_date as op_start_date, OP.observation_period_end_date as op_end_date +FROM (-- Begin Death Criteria +select C.person_id, C.person_id as event_id, C.death_date as start_date, (C.death_date + 1*INTERVAL'1 day') as end_date, + coalesce(C.cause_concept_id,0) as TARGET_CONCEPT_ID, CAST(NULL as bigint) as visit_occurrence_id, + C.death_date as sort_date +from +( + select d.* + FROM cdm.DEATH d +JOIN Codesets codesets on ((d.cause_concept_id = codesets.concept_id and codesets.codeset_id = 0)) +) C +JOIN cdm.PERSON P on C.person_id = P.person_id +WHERE (C.death_date >= TO_DATE(TO_CHAR(1900,'0000')||'-'||TO_CHAR(1,'00')||'-'||TO_CHAR(1,'00'), 'YYYY-MM-DD') and C.death_date <= TO_DATE(TO_CHAR(2099,'0000')||'-'||TO_CHAR(1,'00')||'-'||TO_CHAR(1,'00'), 'YYYY-MM-DD')) +AND C.death_type_concept_id in (256,255,254) +AND (EXTRACT(YEAR FROM C.death_date) - P.year_of_birth >= 0 and EXTRACT(YEAR FROM C.death_date) - P.year_of_birth <= 99) +AND P.gender_concept_id in (8532,8507) +-- End Death Criteria + +) Q +JOIN cdm.OBSERVATION_PERIOD OP on Q.person_id = OP.person_id + and OP.observation_period_start_date <= Q.start_date and OP.observation_period_end_date >= Q.start_date +) P +INNER JOIN +( + -- Begin Death Criteria +select C.person_id, C.person_id as event_id, C.death_date as start_date, (C.death_date + 1*INTERVAL'1 day') as end_date, + coalesce(C.cause_concept_id,0) as TARGET_CONCEPT_ID, CAST(NULL as bigint) as visit_occurrence_id, + C.death_date as sort_date +from +( + select d.* + FROM cdm.DEATH d +JOIN Codesets codesets on ((d.cause_concept_id = codesets.concept_id and codesets.codeset_id = 0)) +) C + + +-- End Death Criteria + + +) A on A.person_id = P.person_id +GROUP BY p.person_id, p.event_id +HAVING COUNT(A.TARGET_CONCEPT_ID) >= 1 +-- End Correlated Criteria + + ) CQ on E.person_id = CQ.person_id and E.event_id = CQ.event_id + GROUP BY E.person_id, E.event_id + HAVING COUNT(index_id) = 1 +) G +-- End Criteria Group +) AC on AC.person_id = pe.person_id and AC.event_id = pe.event_id + +) A on A.person_id = P.person_id AND A.START_DATE >= P.OP_START_DATE AND A.START_DATE <= P.OP_END_DATE AND A.START_DATE >= (P.START_DATE + -30*INTERVAL'1 day') AND A.START_DATE <= (P.START_DATE + 30*INTERVAL'1 day') +GROUP BY p.person_id, p.event_id +HAVING COUNT(A.TARGET_CONCEPT_ID) >= 1 +-- End Correlated Criteria + + ) CQ on E.person_id = CQ.person_id and E.event_id = CQ.event_id + GROUP BY E.person_id, E.event_id + HAVING COUNT(index_id) = 1 +) G +-- End Criteria Group +) AC on AC.person_id = pe.person_id AND AC.event_id = pe.event_id +) Results +; +ANALYZE Inclusion_3 +; + +CREATE TEMP TABLE Inclusion_4 + +AS +SELECT +4 as inclusion_rule_id, person_id, event_id + +FROM +( + select pe.person_id, pe.event_id + FROM qualified_events pe + +JOIN ( +-- Begin Criteria Group +select 0 as index_id, person_id, event_id +FROM +( + select E.person_id, E.event_id + FROM qualified_events E + INNER JOIN + ( + -- Begin Correlated Criteria +SELECT 0 as index_id, p.person_id, p.event_id +FROM qualified_events P +INNER JOIN +( + select PE.person_id, PE.event_id, PE.start_date, PE.end_date, PE.target_concept_id, PE.visit_occurrence_id, PE.sort_date FROM ( +-- Begin Device Exposure Criteria +select C.person_id, C.device_exposure_id as event_id, C.device_exposure_start_date as start_date, C.device_exposure_end_date as end_date, + C.device_concept_id as TARGET_CONCEPT_ID, C.visit_occurrence_id, + C.device_exposure_start_date as sort_date +from +( + select de.* , row_number() over (PARTITION BY de.person_id ORDER BY de.device_exposure_start_date, de.device_exposure_id) as ordinal + FROM cdm.DEVICE_EXPOSURE de +JOIN Codesets codesets on ((de.device_concept_id = codesets.concept_id and codesets.codeset_id = 0) AND (de.device_source_concept_id = codesets.concept_id and codesets.codeset_id = 0)) +) C +JOIN cdm.PERSON P on C.person_id = P.person_id +JOIN cdm.VISIT_OCCURRENCE V on C.visit_occurrence_id = V.visit_occurrence_id and C.person_id = V.person_id +LEFT JOIN cdm.PROVIDER PR on C.provider_id = PR.provider_id +WHERE (C.device_exposure_start_date >= TO_DATE(TO_CHAR(1900,'0000')||'-'||TO_CHAR(1,'00')||'-'||TO_CHAR(1,'00'), 'YYYY-MM-DD') and C.device_exposure_start_date <= TO_DATE(TO_CHAR(2099,'0000')||'-'||TO_CHAR(1,'00')||'-'||TO_CHAR(1,'00'), 'YYYY-MM-DD')) +AND (C.device_exposure_end_date >= TO_DATE(TO_CHAR(1900,'0000')||'-'||TO_CHAR(1,'00')||'-'||TO_CHAR(1,'00'), 'YYYY-MM-DD') and C.device_exposure_end_date <= TO_DATE(TO_CHAR(2099,'0000')||'-'||TO_CHAR(1,'00')||'-'||TO_CHAR(1,'00'), 'YYYY-MM-DD')) +AND C.device_type_concept_id in (32465,44818706) +AND C.unique_device_id like '%null%' +AND (C.quantity >= 0 and C.quantity <= 99) +AND (EXTRACT(YEAR FROM C.device_exposure_start_date) - P.year_of_birth >= 0 and EXTRACT(YEAR FROM C.device_exposure_start_date) - P.year_of_birth <= 99) +AND P.gender_concept_id in (8532,8507) +AND PR.specialty_concept_id in (38004455,38003625,38003626) +AND V.visit_concept_id in (8717,8756) +AND C.ordinal = 1 +-- End Device Exposure Criteria + +) PE +JOIN ( +-- Begin Criteria Group +select 0 as index_id, person_id, event_id +FROM +( + select E.person_id, E.event_id + FROM (SELECT Q.person_id, Q.event_id, Q.start_date, Q.end_date, Q.visit_occurrence_id, OP.observation_period_start_date as op_start_date, OP.observation_period_end_date as op_end_date +FROM (-- Begin Device Exposure Criteria +select C.person_id, C.device_exposure_id as event_id, C.device_exposure_start_date as start_date, C.device_exposure_end_date as end_date, + C.device_concept_id as TARGET_CONCEPT_ID, C.visit_occurrence_id, + C.device_exposure_start_date as sort_date +from +( + select de.* , row_number() over (PARTITION BY de.person_id ORDER BY de.device_exposure_start_date, de.device_exposure_id) as ordinal + FROM cdm.DEVICE_EXPOSURE de +JOIN Codesets codesets on ((de.device_concept_id = codesets.concept_id and codesets.codeset_id = 0) AND (de.device_source_concept_id = codesets.concept_id and codesets.codeset_id = 0)) +) C +JOIN cdm.PERSON P on C.person_id = P.person_id +JOIN cdm.VISIT_OCCURRENCE V on C.visit_occurrence_id = V.visit_occurrence_id and C.person_id = V.person_id +LEFT JOIN cdm.PROVIDER PR on C.provider_id = PR.provider_id +WHERE (C.device_exposure_start_date >= TO_DATE(TO_CHAR(1900,'0000')||'-'||TO_CHAR(1,'00')||'-'||TO_CHAR(1,'00'), 'YYYY-MM-DD') and C.device_exposure_start_date <= TO_DATE(TO_CHAR(2099,'0000')||'-'||TO_CHAR(1,'00')||'-'||TO_CHAR(1,'00'), 'YYYY-MM-DD')) +AND (C.device_exposure_end_date >= TO_DATE(TO_CHAR(1900,'0000')||'-'||TO_CHAR(1,'00')||'-'||TO_CHAR(1,'00'), 'YYYY-MM-DD') and C.device_exposure_end_date <= TO_DATE(TO_CHAR(2099,'0000')||'-'||TO_CHAR(1,'00')||'-'||TO_CHAR(1,'00'), 'YYYY-MM-DD')) +AND C.device_type_concept_id in (32465,44818706) +AND C.unique_device_id like '%null%' +AND (C.quantity >= 0 and C.quantity <= 99) +AND (EXTRACT(YEAR FROM C.device_exposure_start_date) - P.year_of_birth >= 0 and EXTRACT(YEAR FROM C.device_exposure_start_date) - P.year_of_birth <= 99) +AND P.gender_concept_id in (8532,8507) +AND PR.specialty_concept_id in (38004455,38003625,38003626) +AND V.visit_concept_id in (8717,8756) +AND C.ordinal = 1 +-- End Device Exposure Criteria +) Q +JOIN cdm.OBSERVATION_PERIOD OP on Q.person_id = OP.person_id + and OP.observation_period_start_date <= Q.start_date and OP.observation_period_end_date >= Q.start_date +) E + INNER JOIN + ( + -- Begin Correlated Criteria +SELECT 0 as index_id, p.person_id, p.event_id +FROM (SELECT Q.person_id, Q.event_id, Q.start_date, Q.end_date, Q.visit_occurrence_id, OP.observation_period_start_date as op_start_date, OP.observation_period_end_date as op_end_date +FROM (-- Begin Device Exposure Criteria +select C.person_id, C.device_exposure_id as event_id, C.device_exposure_start_date as start_date, C.device_exposure_end_date as end_date, + C.device_concept_id as TARGET_CONCEPT_ID, C.visit_occurrence_id, + C.device_exposure_start_date as sort_date +from +( + select de.* , row_number() over (PARTITION BY de.person_id ORDER BY de.device_exposure_start_date, de.device_exposure_id) as ordinal + FROM cdm.DEVICE_EXPOSURE de +JOIN Codesets codesets on ((de.device_concept_id = codesets.concept_id and codesets.codeset_id = 0) AND (de.device_source_concept_id = codesets.concept_id and codesets.codeset_id = 0)) +) C +JOIN cdm.PERSON P on C.person_id = P.person_id +JOIN cdm.VISIT_OCCURRENCE V on C.visit_occurrence_id = V.visit_occurrence_id and C.person_id = V.person_id +LEFT JOIN cdm.PROVIDER PR on C.provider_id = PR.provider_id +WHERE (C.device_exposure_start_date >= TO_DATE(TO_CHAR(1900,'0000')||'-'||TO_CHAR(1,'00')||'-'||TO_CHAR(1,'00'), 'YYYY-MM-DD') and C.device_exposure_start_date <= TO_DATE(TO_CHAR(2099,'0000')||'-'||TO_CHAR(1,'00')||'-'||TO_CHAR(1,'00'), 'YYYY-MM-DD')) +AND (C.device_exposure_end_date >= TO_DATE(TO_CHAR(1900,'0000')||'-'||TO_CHAR(1,'00')||'-'||TO_CHAR(1,'00'), 'YYYY-MM-DD') and C.device_exposure_end_date <= TO_DATE(TO_CHAR(2099,'0000')||'-'||TO_CHAR(1,'00')||'-'||TO_CHAR(1,'00'), 'YYYY-MM-DD')) +AND C.device_type_concept_id in (32465,44818706) +AND C.unique_device_id like '%null%' +AND (C.quantity >= 0 and C.quantity <= 99) +AND (EXTRACT(YEAR FROM C.device_exposure_start_date) - P.year_of_birth >= 0 and EXTRACT(YEAR FROM C.device_exposure_start_date) - P.year_of_birth <= 99) +AND P.gender_concept_id in (8532,8507) +AND PR.specialty_concept_id in (38004455,38003625,38003626) +AND V.visit_concept_id in (8717,8756) +AND C.ordinal = 1 +-- End Device Exposure Criteria +) Q +JOIN cdm.OBSERVATION_PERIOD OP on Q.person_id = OP.person_id + and OP.observation_period_start_date <= Q.start_date and OP.observation_period_end_date >= Q.start_date +) P +INNER JOIN +( + -- Begin Device Exposure Criteria +select C.person_id, C.device_exposure_id as event_id, C.device_exposure_start_date as start_date, C.device_exposure_end_date as end_date, + C.device_concept_id as TARGET_CONCEPT_ID, C.visit_occurrence_id, + C.device_exposure_start_date as sort_date +from +( + select de.* + FROM cdm.DEVICE_EXPOSURE de +JOIN Codesets codesets on ((de.device_concept_id = codesets.concept_id and codesets.codeset_id = 0)) +) C + + +-- End Device Exposure Criteria + +) A on A.person_id = P.person_id AND A.visit_occurrence_id = P.visit_occurrence_id +GROUP BY p.person_id, p.event_id +HAVING COUNT(A.TARGET_CONCEPT_ID) >= 1 +-- End Correlated Criteria + + ) CQ on E.person_id = CQ.person_id and E.event_id = CQ.event_id + GROUP BY E.person_id, E.event_id + HAVING COUNT(index_id) = 1 +) G +-- End Criteria Group +) AC on AC.person_id = pe.person_id and AC.event_id = pe.event_id + +) A on A.person_id = P.person_id AND A.START_DATE >= P.OP_START_DATE AND A.START_DATE <= P.OP_END_DATE AND A.START_DATE >= (P.START_DATE + -30*INTERVAL'1 day') AND A.START_DATE <= (P.START_DATE + 30*INTERVAL'1 day') +GROUP BY p.person_id, p.event_id +HAVING COUNT(A.TARGET_CONCEPT_ID) >= 1 +-- End Correlated Criteria + + ) CQ on E.person_id = CQ.person_id and E.event_id = CQ.event_id + GROUP BY E.person_id, E.event_id + HAVING COUNT(index_id) = 1 +) G +-- End Criteria Group +) AC on AC.person_id = pe.person_id AND AC.event_id = pe.event_id +) Results +; +ANALYZE Inclusion_4 +; + +CREATE TEMP TABLE Inclusion_5 + +AS +SELECT +5 as inclusion_rule_id, person_id, event_id + +FROM +( + select pe.person_id, pe.event_id + FROM qualified_events pe + +JOIN ( +-- Begin Criteria Group +select 0 as index_id, person_id, event_id +FROM +( + select E.person_id, E.event_id + FROM qualified_events E + INNER JOIN + ( + -- Begin Correlated Criteria +SELECT 0 as index_id, p.person_id, p.event_id +FROM qualified_events P +INNER JOIN +( + select PE.person_id, PE.event_id, PE.start_date, PE.end_date, PE.target_concept_id, PE.visit_occurrence_id, PE.sort_date FROM ( +-- Begin Drug Era Criteria +select C.person_id, C.drug_era_id as event_id, C.drug_era_start_date as start_date, C.drug_era_end_date as end_date, + C.drug_concept_id as TARGET_CONCEPT_ID, CAST(NULL as bigint) as visit_occurrence_id, + C.drug_era_start_date as sort_date +from +( + select de.* , row_number() over (PARTITION BY de.person_id ORDER BY de.drug_era_start_date, de.drug_era_id) as ordinal + FROM cdm.DRUG_ERA de + +) C +JOIN cdm.PERSON P on C.person_id = P.person_id +WHERE (C.drug_era_start_date >= TO_DATE(TO_CHAR(1900,'0000')||'-'||TO_CHAR(1,'00')||'-'||TO_CHAR(1,'00'), 'YYYY-MM-DD') and C.drug_era_start_date <= TO_DATE(TO_CHAR(2099,'0000')||'-'||TO_CHAR(1,'00')||'-'||TO_CHAR(1,'00'), 'YYYY-MM-DD')) +AND (C.drug_era_end_date >= TO_DATE(TO_CHAR(1900,'0000')||'-'||TO_CHAR(1,'00')||'-'||TO_CHAR(1,'00'), 'YYYY-MM-DD') and C.drug_era_end_date <= TO_DATE(TO_CHAR(2099,'0000')||'-'||TO_CHAR(1,'00')||'-'||TO_CHAR(1,'00'), 'YYYY-MM-DD')) +AND (C.drug_exposure_count >= 0 and C.drug_exposure_count <= 99) +AND ((CAST(C.drug_era_end_date AS DATE) - CAST(C.drug_era_start_date AS DATE)) >= 0 and (CAST(C.drug_era_end_date AS DATE) - CAST(C.drug_era_start_date AS DATE)) <= 99) +AND (EXTRACT(YEAR FROM C.drug_era_start_date) - P.year_of_birth >= 0 and EXTRACT(YEAR FROM C.drug_era_start_date) - P.year_of_birth <= 99) +AND (EXTRACT(YEAR FROM C.drug_era_end_date) - P.year_of_birth >= 0 and EXTRACT(YEAR FROM C.drug_era_end_date) - P.year_of_birth <= 99) +AND P.gender_concept_id in (8532,8507) +AND C.ordinal = 1 +-- End Drug Era Criteria + +) PE +JOIN ( +-- Begin Criteria Group +select 0 as index_id, person_id, event_id +FROM +( + select E.person_id, E.event_id + FROM (SELECT Q.person_id, Q.event_id, Q.start_date, Q.end_date, Q.visit_occurrence_id, OP.observation_period_start_date as op_start_date, OP.observation_period_end_date as op_end_date +FROM (-- Begin Drug Era Criteria +select C.person_id, C.drug_era_id as event_id, C.drug_era_start_date as start_date, C.drug_era_end_date as end_date, + C.drug_concept_id as TARGET_CONCEPT_ID, CAST(NULL as bigint) as visit_occurrence_id, + C.drug_era_start_date as sort_date +from +( + select de.* , row_number() over (PARTITION BY de.person_id ORDER BY de.drug_era_start_date, de.drug_era_id) as ordinal + FROM cdm.DRUG_ERA de + +) C +JOIN cdm.PERSON P on C.person_id = P.person_id +WHERE (C.drug_era_start_date >= TO_DATE(TO_CHAR(1900,'0000')||'-'||TO_CHAR(1,'00')||'-'||TO_CHAR(1,'00'), 'YYYY-MM-DD') and C.drug_era_start_date <= TO_DATE(TO_CHAR(2099,'0000')||'-'||TO_CHAR(1,'00')||'-'||TO_CHAR(1,'00'), 'YYYY-MM-DD')) +AND (C.drug_era_end_date >= TO_DATE(TO_CHAR(1900,'0000')||'-'||TO_CHAR(1,'00')||'-'||TO_CHAR(1,'00'), 'YYYY-MM-DD') and C.drug_era_end_date <= TO_DATE(TO_CHAR(2099,'0000')||'-'||TO_CHAR(1,'00')||'-'||TO_CHAR(1,'00'), 'YYYY-MM-DD')) +AND (C.drug_exposure_count >= 0 and C.drug_exposure_count <= 99) +AND ((CAST(C.drug_era_end_date AS DATE) - CAST(C.drug_era_start_date AS DATE)) >= 0 and (CAST(C.drug_era_end_date AS DATE) - CAST(C.drug_era_start_date AS DATE)) <= 99) +AND (EXTRACT(YEAR FROM C.drug_era_start_date) - P.year_of_birth >= 0 and EXTRACT(YEAR FROM C.drug_era_start_date) - P.year_of_birth <= 99) +AND (EXTRACT(YEAR FROM C.drug_era_end_date) - P.year_of_birth >= 0 and EXTRACT(YEAR FROM C.drug_era_end_date) - P.year_of_birth <= 99) +AND P.gender_concept_id in (8532,8507) +AND C.ordinal = 1 +-- End Drug Era Criteria +) Q +JOIN cdm.OBSERVATION_PERIOD OP on Q.person_id = OP.person_id + and OP.observation_period_start_date <= Q.start_date and OP.observation_period_end_date >= Q.start_date +) E + INNER JOIN + ( + -- Begin Correlated Criteria +SELECT 0 as index_id, p.person_id, p.event_id +FROM (SELECT Q.person_id, Q.event_id, Q.start_date, Q.end_date, Q.visit_occurrence_id, OP.observation_period_start_date as op_start_date, OP.observation_period_end_date as op_end_date +FROM (-- Begin Drug Era Criteria +select C.person_id, C.drug_era_id as event_id, C.drug_era_start_date as start_date, C.drug_era_end_date as end_date, + C.drug_concept_id as TARGET_CONCEPT_ID, CAST(NULL as bigint) as visit_occurrence_id, + C.drug_era_start_date as sort_date +from +( + select de.* , row_number() over (PARTITION BY de.person_id ORDER BY de.drug_era_start_date, de.drug_era_id) as ordinal + FROM cdm.DRUG_ERA de + +) C +JOIN cdm.PERSON P on C.person_id = P.person_id +WHERE (C.drug_era_start_date >= TO_DATE(TO_CHAR(1900,'0000')||'-'||TO_CHAR(1,'00')||'-'||TO_CHAR(1,'00'), 'YYYY-MM-DD') and C.drug_era_start_date <= TO_DATE(TO_CHAR(2099,'0000')||'-'||TO_CHAR(1,'00')||'-'||TO_CHAR(1,'00'), 'YYYY-MM-DD')) +AND (C.drug_era_end_date >= TO_DATE(TO_CHAR(1900,'0000')||'-'||TO_CHAR(1,'00')||'-'||TO_CHAR(1,'00'), 'YYYY-MM-DD') and C.drug_era_end_date <= TO_DATE(TO_CHAR(2099,'0000')||'-'||TO_CHAR(1,'00')||'-'||TO_CHAR(1,'00'), 'YYYY-MM-DD')) +AND (C.drug_exposure_count >= 0 and C.drug_exposure_count <= 99) +AND ((CAST(C.drug_era_end_date AS DATE) - CAST(C.drug_era_start_date AS DATE)) >= 0 and (CAST(C.drug_era_end_date AS DATE) - CAST(C.drug_era_start_date AS DATE)) <= 99) +AND (EXTRACT(YEAR FROM C.drug_era_start_date) - P.year_of_birth >= 0 and EXTRACT(YEAR FROM C.drug_era_start_date) - P.year_of_birth <= 99) +AND (EXTRACT(YEAR FROM C.drug_era_end_date) - P.year_of_birth >= 0 and EXTRACT(YEAR FROM C.drug_era_end_date) - P.year_of_birth <= 99) +AND P.gender_concept_id in (8532,8507) +AND C.ordinal = 1 +-- End Drug Era Criteria +) Q +JOIN cdm.OBSERVATION_PERIOD OP on Q.person_id = OP.person_id + and OP.observation_period_start_date <= Q.start_date and OP.observation_period_end_date >= Q.start_date +) P +INNER JOIN +( + -- Begin Drug Era Criteria +select C.person_id, C.drug_era_id as event_id, C.drug_era_start_date as start_date, C.drug_era_end_date as end_date, + C.drug_concept_id as TARGET_CONCEPT_ID, CAST(NULL as bigint) as visit_occurrence_id, + C.drug_era_start_date as sort_date +from +( + select de.* + FROM cdm.DRUG_ERA de +where de.drug_concept_id in (SELECT concept_id from Codesets where codeset_id = 0) +) C + + +-- End Drug Era Criteria + +) A on A.person_id = P.person_id +GROUP BY p.person_id, p.event_id +HAVING COUNT(A.TARGET_CONCEPT_ID) >= 1 +-- End Correlated Criteria + + ) CQ on E.person_id = CQ.person_id and E.event_id = CQ.event_id + GROUP BY E.person_id, E.event_id + HAVING COUNT(index_id) = 1 +) G +-- End Criteria Group +) AC on AC.person_id = pe.person_id and AC.event_id = pe.event_id + +) A on A.person_id = P.person_id AND A.START_DATE >= P.OP_START_DATE AND A.START_DATE <= P.OP_END_DATE AND A.START_DATE >= (P.START_DATE + -30*INTERVAL'1 day') AND A.START_DATE <= (P.START_DATE + 30*INTERVAL'1 day') +GROUP BY p.person_id, p.event_id +HAVING COUNT(A.TARGET_CONCEPT_ID) >= 1 +-- End Correlated Criteria + + ) CQ on E.person_id = CQ.person_id and E.event_id = CQ.event_id + GROUP BY E.person_id, E.event_id + HAVING COUNT(index_id) = 1 +) G +-- End Criteria Group +) AC on AC.person_id = pe.person_id AND AC.event_id = pe.event_id +) Results +; +ANALYZE Inclusion_5 +; + +CREATE TEMP TABLE Inclusion_6 + +AS +SELECT +6 as inclusion_rule_id, person_id, event_id + +FROM +( + select pe.person_id, pe.event_id + FROM qualified_events pe + +JOIN ( +-- Begin Criteria Group +select 0 as index_id, person_id, event_id +FROM +( + select E.person_id, E.event_id + FROM qualified_events E + INNER JOIN + ( + -- Begin Correlated Criteria +SELECT 0 as index_id, p.person_id, p.event_id +FROM qualified_events P +INNER JOIN +( + select PE.person_id, PE.event_id, PE.start_date, PE.end_date, PE.target_concept_id, PE.visit_occurrence_id, PE.sort_date FROM ( +-- Begin Drug Exposure Criteria +select C.person_id, C.drug_exposure_id as event_id, C.drug_exposure_start_date as start_date, + COALESCE(C.DRUG_EXPOSURE_END_DATE, (DRUG_EXPOSURE_START_DATE + C.DAYS_SUPPLY*INTERVAL'1 day'), (C.DRUG_EXPOSURE_START_DATE + 1*INTERVAL'1 day')) as end_date, + C.drug_concept_id as TARGET_CONCEPT_ID, C.visit_occurrence_id, + C.drug_exposure_start_date as sort_date +from +( + select de.* , row_number() over (PARTITION BY de.person_id ORDER BY de.drug_exposure_start_date, de.drug_exposure_id) as ordinal + FROM cdm.DRUG_EXPOSURE de +JOIN Codesets codesets on ((de.drug_concept_id = codesets.concept_id and codesets.codeset_id = 0) AND (de.drug_source_concept_id = codesets.concept_id and codesets.codeset_id = 0)) +) C +JOIN cdm.PERSON P on C.person_id = P.person_id +JOIN cdm.VISIT_OCCURRENCE V on C.visit_occurrence_id = V.visit_occurrence_id and C.person_id = V.person_id +LEFT JOIN cdm.PROVIDER PR on C.provider_id = PR.provider_id +WHERE (C.drug_exposure_start_date >= TO_DATE(TO_CHAR(1900,'0000')||'-'||TO_CHAR(1,'00')||'-'||TO_CHAR(1,'00'), 'YYYY-MM-DD') and C.drug_exposure_start_date <= TO_DATE(TO_CHAR(2099,'0000')||'-'||TO_CHAR(1,'00')||'-'||TO_CHAR(1,'00'), 'YYYY-MM-DD')) +AND (C.drug_exposure_end_date >= TO_DATE(TO_CHAR(1900,'0000')||'-'||TO_CHAR(1,'00')||'-'||TO_CHAR(1,'00'), 'YYYY-MM-DD') and C.drug_exposure_end_date <= TO_DATE(TO_CHAR(2099,'0000')||'-'||TO_CHAR(1,'00')||'-'||TO_CHAR(1,'00'), 'YYYY-MM-DD')) +AND C.drug_type_concept_id in (38000175,38000176) +AND C.stop_reason like '%stop reason%' +AND (C.refills >= 0 and C.refills <= 99) +AND (C.quantity >= 0.0000 and C.quantity <= 99.0000) +AND (C.days_supply >= 0 and C.days_supply <= 99) +AND C.route_concept_id in (4263689,4023156,4006860) +AND (C.effective_drug_dose >= 0.0000 and C.effective_drug_dose <= 99.0000) +AND C.dose_unit_concept_id in (8554,8849,9214) +AND C.lot_number like '%lot number%' +AND (EXTRACT(YEAR FROM C.drug_exposure_start_date) - P.year_of_birth >= 0 and EXTRACT(YEAR FROM C.drug_exposure_start_date) - P.year_of_birth <= 99) +AND P.gender_concept_id in (8532,8507) +AND PR.specialty_concept_id in (38004446,38003625) +AND V.visit_concept_id in (262,9201) +AND C.ordinal = 1 +-- End Drug Exposure Criteria + +) PE +JOIN ( +-- Begin Criteria Group +select 0 as index_id, person_id, event_id +FROM +( + select E.person_id, E.event_id + FROM (SELECT Q.person_id, Q.event_id, Q.start_date, Q.end_date, Q.visit_occurrence_id, OP.observation_period_start_date as op_start_date, OP.observation_period_end_date as op_end_date +FROM (-- Begin Drug Exposure Criteria +select C.person_id, C.drug_exposure_id as event_id, C.drug_exposure_start_date as start_date, + COALESCE(C.DRUG_EXPOSURE_END_DATE, (DRUG_EXPOSURE_START_DATE + C.DAYS_SUPPLY*INTERVAL'1 day'), (C.DRUG_EXPOSURE_START_DATE + 1*INTERVAL'1 day')) as end_date, + C.drug_concept_id as TARGET_CONCEPT_ID, C.visit_occurrence_id, + C.drug_exposure_start_date as sort_date +from +( + select de.* , row_number() over (PARTITION BY de.person_id ORDER BY de.drug_exposure_start_date, de.drug_exposure_id) as ordinal + FROM cdm.DRUG_EXPOSURE de +JOIN Codesets codesets on ((de.drug_concept_id = codesets.concept_id and codesets.codeset_id = 0) AND (de.drug_source_concept_id = codesets.concept_id and codesets.codeset_id = 0)) +) C +JOIN cdm.PERSON P on C.person_id = P.person_id +JOIN cdm.VISIT_OCCURRENCE V on C.visit_occurrence_id = V.visit_occurrence_id and C.person_id = V.person_id +LEFT JOIN cdm.PROVIDER PR on C.provider_id = PR.provider_id +WHERE (C.drug_exposure_start_date >= TO_DATE(TO_CHAR(1900,'0000')||'-'||TO_CHAR(1,'00')||'-'||TO_CHAR(1,'00'), 'YYYY-MM-DD') and C.drug_exposure_start_date <= TO_DATE(TO_CHAR(2099,'0000')||'-'||TO_CHAR(1,'00')||'-'||TO_CHAR(1,'00'), 'YYYY-MM-DD')) +AND (C.drug_exposure_end_date >= TO_DATE(TO_CHAR(1900,'0000')||'-'||TO_CHAR(1,'00')||'-'||TO_CHAR(1,'00'), 'YYYY-MM-DD') and C.drug_exposure_end_date <= TO_DATE(TO_CHAR(2099,'0000')||'-'||TO_CHAR(1,'00')||'-'||TO_CHAR(1,'00'), 'YYYY-MM-DD')) +AND C.drug_type_concept_id in (38000175,38000176) +AND C.stop_reason like '%stop reason%' +AND (C.refills >= 0 and C.refills <= 99) +AND (C.quantity >= 0.0000 and C.quantity <= 99.0000) +AND (C.days_supply >= 0 and C.days_supply <= 99) +AND C.route_concept_id in (4263689,4023156,4006860) +AND (C.effective_drug_dose >= 0.0000 and C.effective_drug_dose <= 99.0000) +AND C.dose_unit_concept_id in (8554,8849,9214) +AND C.lot_number like '%lot number%' +AND (EXTRACT(YEAR FROM C.drug_exposure_start_date) - P.year_of_birth >= 0 and EXTRACT(YEAR FROM C.drug_exposure_start_date) - P.year_of_birth <= 99) +AND P.gender_concept_id in (8532,8507) +AND PR.specialty_concept_id in (38004446,38003625) +AND V.visit_concept_id in (262,9201) +AND C.ordinal = 1 +-- End Drug Exposure Criteria +) Q +JOIN cdm.OBSERVATION_PERIOD OP on Q.person_id = OP.person_id + and OP.observation_period_start_date <= Q.start_date and OP.observation_period_end_date >= Q.start_date +) E + INNER JOIN + ( + -- Begin Correlated Criteria +SELECT 0 as index_id, p.person_id, p.event_id +FROM (SELECT Q.person_id, Q.event_id, Q.start_date, Q.end_date, Q.visit_occurrence_id, OP.observation_period_start_date as op_start_date, OP.observation_period_end_date as op_end_date +FROM (-- Begin Drug Exposure Criteria +select C.person_id, C.drug_exposure_id as event_id, C.drug_exposure_start_date as start_date, + COALESCE(C.DRUG_EXPOSURE_END_DATE, (DRUG_EXPOSURE_START_DATE + C.DAYS_SUPPLY*INTERVAL'1 day'), (C.DRUG_EXPOSURE_START_DATE + 1*INTERVAL'1 day')) as end_date, + C.drug_concept_id as TARGET_CONCEPT_ID, C.visit_occurrence_id, + C.drug_exposure_start_date as sort_date +from +( + select de.* , row_number() over (PARTITION BY de.person_id ORDER BY de.drug_exposure_start_date, de.drug_exposure_id) as ordinal + FROM cdm.DRUG_EXPOSURE de +JOIN Codesets codesets on ((de.drug_concept_id = codesets.concept_id and codesets.codeset_id = 0) AND (de.drug_source_concept_id = codesets.concept_id and codesets.codeset_id = 0)) +) C +JOIN cdm.PERSON P on C.person_id = P.person_id +JOIN cdm.VISIT_OCCURRENCE V on C.visit_occurrence_id = V.visit_occurrence_id and C.person_id = V.person_id +LEFT JOIN cdm.PROVIDER PR on C.provider_id = PR.provider_id +WHERE (C.drug_exposure_start_date >= TO_DATE(TO_CHAR(1900,'0000')||'-'||TO_CHAR(1,'00')||'-'||TO_CHAR(1,'00'), 'YYYY-MM-DD') and C.drug_exposure_start_date <= TO_DATE(TO_CHAR(2099,'0000')||'-'||TO_CHAR(1,'00')||'-'||TO_CHAR(1,'00'), 'YYYY-MM-DD')) +AND (C.drug_exposure_end_date >= TO_DATE(TO_CHAR(1900,'0000')||'-'||TO_CHAR(1,'00')||'-'||TO_CHAR(1,'00'), 'YYYY-MM-DD') and C.drug_exposure_end_date <= TO_DATE(TO_CHAR(2099,'0000')||'-'||TO_CHAR(1,'00')||'-'||TO_CHAR(1,'00'), 'YYYY-MM-DD')) +AND C.drug_type_concept_id in (38000175,38000176) +AND C.stop_reason like '%stop reason%' +AND (C.refills >= 0 and C.refills <= 99) +AND (C.quantity >= 0.0000 and C.quantity <= 99.0000) +AND (C.days_supply >= 0 and C.days_supply <= 99) +AND C.route_concept_id in (4263689,4023156,4006860) +AND (C.effective_drug_dose >= 0.0000 and C.effective_drug_dose <= 99.0000) +AND C.dose_unit_concept_id in (8554,8849,9214) +AND C.lot_number like '%lot number%' +AND (EXTRACT(YEAR FROM C.drug_exposure_start_date) - P.year_of_birth >= 0 and EXTRACT(YEAR FROM C.drug_exposure_start_date) - P.year_of_birth <= 99) +AND P.gender_concept_id in (8532,8507) +AND PR.specialty_concept_id in (38004446,38003625) +AND V.visit_concept_id in (262,9201) +AND C.ordinal = 1 +-- End Drug Exposure Criteria +) Q +JOIN cdm.OBSERVATION_PERIOD OP on Q.person_id = OP.person_id + and OP.observation_period_start_date <= Q.start_date and OP.observation_period_end_date >= Q.start_date +) P +INNER JOIN +( + -- Begin Drug Exposure Criteria +select C.person_id, C.drug_exposure_id as event_id, C.drug_exposure_start_date as start_date, + COALESCE(C.DRUG_EXPOSURE_END_DATE, (DRUG_EXPOSURE_START_DATE + C.DAYS_SUPPLY*INTERVAL'1 day'), (C.DRUG_EXPOSURE_START_DATE + 1*INTERVAL'1 day')) as end_date, + C.drug_concept_id as TARGET_CONCEPT_ID, C.visit_occurrence_id, + C.drug_exposure_start_date as sort_date +from +( + select de.* + FROM cdm.DRUG_EXPOSURE de + +) C + + +-- End Drug Exposure Criteria + +) A on A.person_id = P.person_id AND A.visit_occurrence_id = P.visit_occurrence_id +GROUP BY p.person_id, p.event_id +HAVING COUNT(A.TARGET_CONCEPT_ID) >= 1 +-- End Correlated Criteria + + ) CQ on E.person_id = CQ.person_id and E.event_id = CQ.event_id + GROUP BY E.person_id, E.event_id + HAVING COUNT(index_id) = 1 +) G +-- End Criteria Group +) AC on AC.person_id = pe.person_id and AC.event_id = pe.event_id + +) A on A.person_id = P.person_id AND A.START_DATE >= P.OP_START_DATE AND A.START_DATE <= P.OP_END_DATE AND A.START_DATE >= (P.START_DATE + -30*INTERVAL'1 day') AND A.START_DATE <= (P.START_DATE + 30*INTERVAL'1 day') +GROUP BY p.person_id, p.event_id +HAVING COUNT(A.TARGET_CONCEPT_ID) >= 1 +-- End Correlated Criteria + + ) CQ on E.person_id = CQ.person_id and E.event_id = CQ.event_id + GROUP BY E.person_id, E.event_id + HAVING COUNT(index_id) = 1 +) G +-- End Criteria Group +) AC on AC.person_id = pe.person_id AND AC.event_id = pe.event_id +) Results +; +ANALYZE Inclusion_6 +; + +CREATE TEMP TABLE Inclusion_7 + +AS +SELECT +7 as inclusion_rule_id, person_id, event_id + +FROM +( + select pe.person_id, pe.event_id + FROM qualified_events pe + +JOIN ( +-- Begin Criteria Group +select 0 as index_id, person_id, event_id +FROM +( + select E.person_id, E.event_id + FROM qualified_events E + INNER JOIN + ( + -- Begin Correlated Criteria +SELECT 0 as index_id, p.person_id, p.event_id +FROM qualified_events P +INNER JOIN +( + select PE.person_id, PE.event_id, PE.start_date, PE.end_date, PE.target_concept_id, PE.visit_occurrence_id, PE.sort_date FROM ( +-- Begin Measurement Criteria +select C.person_id, C.measurement_id as event_id, C.measurement_date as start_date, (C.measurement_date + 1*INTERVAL'1 day') as END_DATE, + C.measurement_concept_id as TARGET_CONCEPT_ID, C.visit_occurrence_id, + C.measurement_date as sort_date +from +( + select m.* , row_number() over (PARTITION BY m.person_id ORDER BY m.measurement_date, m.measurement_id) as ordinal + FROM cdm.MEASUREMENT m +JOIN Codesets codesets on ((m.measurement_source_concept_id = codesets.concept_id and codesets.codeset_id = 0)) +) C +JOIN cdm.PERSON P on C.person_id = P.person_id +JOIN cdm.VISIT_OCCURRENCE V on C.visit_occurrence_id = V.visit_occurrence_id and C.person_id = V.person_id +LEFT JOIN cdm.PROVIDER PR on C.provider_id = PR.provider_id +WHERE (C.measurement_date >= TO_DATE(TO_CHAR(1900,'0000')||'-'||TO_CHAR(1,'00')||'-'||TO_CHAR(1,'00'), 'YYYY-MM-DD') and C.measurement_date <= TO_DATE(TO_CHAR(2099,'0000')||'-'||TO_CHAR(1,'00')||'-'||TO_CHAR(1,'00'), 'YYYY-MM-DD')) +AND C.measurement_type_concept_id in (38000183,38000199) +AND C.operator_concept_id in (4172704) +AND (C.value_as_number >= 0.0000 and C.value_as_number <= 99.0000) +AND C.value_as_concept_id in (9191) +AND C.unit_concept_id in (9256) +AND (C.range_low >= 0.0000 and C.range_low <= 99.0000) +AND (C.range_high >= 0.0000 and C.range_high <= 99.0000) +AND ((C.value_as_number / NULLIF(C.range_low, 0)) >= 0.0000 and (C.value_as_number / NULLIF(C.range_low, 0)) <= 99.0000) +AND ((C.value_as_number / NULLIF(C.range_high, 0)) >= 0.0000 and (C.value_as_number / NULLIF(C.range_high, 0)) <= 99.0000) +AND (C.value_as_number < C.range_low or C.value_as_number > C.range_high or C.value_as_concept_id in (4155142, 4155143)) +AND (EXTRACT(YEAR FROM C.measurement_date) - P.year_of_birth >= 0 and EXTRACT(YEAR FROM C.measurement_date) - P.year_of_birth <= 99) +AND P.gender_concept_id in (8532,8507) +AND PR.specialty_concept_id in (38004446,38003626,38003627) +AND V.visit_concept_id in (262,9201) +AND C.ordinal = 1 +-- End Measurement Criteria + +) PE +JOIN ( +-- Begin Criteria Group +select 0 as index_id, person_id, event_id +FROM +( + select E.person_id, E.event_id + FROM (SELECT Q.person_id, Q.event_id, Q.start_date, Q.end_date, Q.visit_occurrence_id, OP.observation_period_start_date as op_start_date, OP.observation_period_end_date as op_end_date +FROM (-- Begin Measurement Criteria +select C.person_id, C.measurement_id as event_id, C.measurement_date as start_date, (C.measurement_date + 1*INTERVAL'1 day') as END_DATE, + C.measurement_concept_id as TARGET_CONCEPT_ID, C.visit_occurrence_id, + C.measurement_date as sort_date +from +( + select m.* , row_number() over (PARTITION BY m.person_id ORDER BY m.measurement_date, m.measurement_id) as ordinal + FROM cdm.MEASUREMENT m +JOIN Codesets codesets on ((m.measurement_source_concept_id = codesets.concept_id and codesets.codeset_id = 0)) +) C +JOIN cdm.PERSON P on C.person_id = P.person_id +JOIN cdm.VISIT_OCCURRENCE V on C.visit_occurrence_id = V.visit_occurrence_id and C.person_id = V.person_id +LEFT JOIN cdm.PROVIDER PR on C.provider_id = PR.provider_id +WHERE (C.measurement_date >= TO_DATE(TO_CHAR(1900,'0000')||'-'||TO_CHAR(1,'00')||'-'||TO_CHAR(1,'00'), 'YYYY-MM-DD') and C.measurement_date <= TO_DATE(TO_CHAR(2099,'0000')||'-'||TO_CHAR(1,'00')||'-'||TO_CHAR(1,'00'), 'YYYY-MM-DD')) +AND C.measurement_type_concept_id in (38000183,38000199) +AND C.operator_concept_id in (4172704) +AND (C.value_as_number >= 0.0000 and C.value_as_number <= 99.0000) +AND C.value_as_concept_id in (9191) +AND C.unit_concept_id in (9256) +AND (C.range_low >= 0.0000 and C.range_low <= 99.0000) +AND (C.range_high >= 0.0000 and C.range_high <= 99.0000) +AND ((C.value_as_number / NULLIF(C.range_low, 0)) >= 0.0000 and (C.value_as_number / NULLIF(C.range_low, 0)) <= 99.0000) +AND ((C.value_as_number / NULLIF(C.range_high, 0)) >= 0.0000 and (C.value_as_number / NULLIF(C.range_high, 0)) <= 99.0000) +AND (C.value_as_number < C.range_low or C.value_as_number > C.range_high or C.value_as_concept_id in (4155142, 4155143)) +AND (EXTRACT(YEAR FROM C.measurement_date) - P.year_of_birth >= 0 and EXTRACT(YEAR FROM C.measurement_date) - P.year_of_birth <= 99) +AND P.gender_concept_id in (8532,8507) +AND PR.specialty_concept_id in (38004446,38003626,38003627) +AND V.visit_concept_id in (262,9201) +AND C.ordinal = 1 +-- End Measurement Criteria +) Q +JOIN cdm.OBSERVATION_PERIOD OP on Q.person_id = OP.person_id + and OP.observation_period_start_date <= Q.start_date and OP.observation_period_end_date >= Q.start_date +) E + INNER JOIN + ( + -- Begin Correlated Criteria +SELECT 0 as index_id, p.person_id, p.event_id +FROM (SELECT Q.person_id, Q.event_id, Q.start_date, Q.end_date, Q.visit_occurrence_id, OP.observation_period_start_date as op_start_date, OP.observation_period_end_date as op_end_date +FROM (-- Begin Measurement Criteria +select C.person_id, C.measurement_id as event_id, C.measurement_date as start_date, (C.measurement_date + 1*INTERVAL'1 day') as END_DATE, + C.measurement_concept_id as TARGET_CONCEPT_ID, C.visit_occurrence_id, + C.measurement_date as sort_date +from +( + select m.* , row_number() over (PARTITION BY m.person_id ORDER BY m.measurement_date, m.measurement_id) as ordinal + FROM cdm.MEASUREMENT m +JOIN Codesets codesets on ((m.measurement_source_concept_id = codesets.concept_id and codesets.codeset_id = 0)) +) C +JOIN cdm.PERSON P on C.person_id = P.person_id +JOIN cdm.VISIT_OCCURRENCE V on C.visit_occurrence_id = V.visit_occurrence_id and C.person_id = V.person_id +LEFT JOIN cdm.PROVIDER PR on C.provider_id = PR.provider_id +WHERE (C.measurement_date >= TO_DATE(TO_CHAR(1900,'0000')||'-'||TO_CHAR(1,'00')||'-'||TO_CHAR(1,'00'), 'YYYY-MM-DD') and C.measurement_date <= TO_DATE(TO_CHAR(2099,'0000')||'-'||TO_CHAR(1,'00')||'-'||TO_CHAR(1,'00'), 'YYYY-MM-DD')) +AND C.measurement_type_concept_id in (38000183,38000199) +AND C.operator_concept_id in (4172704) +AND (C.value_as_number >= 0.0000 and C.value_as_number <= 99.0000) +AND C.value_as_concept_id in (9191) +AND C.unit_concept_id in (9256) +AND (C.range_low >= 0.0000 and C.range_low <= 99.0000) +AND (C.range_high >= 0.0000 and C.range_high <= 99.0000) +AND ((C.value_as_number / NULLIF(C.range_low, 0)) >= 0.0000 and (C.value_as_number / NULLIF(C.range_low, 0)) <= 99.0000) +AND ((C.value_as_number / NULLIF(C.range_high, 0)) >= 0.0000 and (C.value_as_number / NULLIF(C.range_high, 0)) <= 99.0000) +AND (C.value_as_number < C.range_low or C.value_as_number > C.range_high or C.value_as_concept_id in (4155142, 4155143)) +AND (EXTRACT(YEAR FROM C.measurement_date) - P.year_of_birth >= 0 and EXTRACT(YEAR FROM C.measurement_date) - P.year_of_birth <= 99) +AND P.gender_concept_id in (8532,8507) +AND PR.specialty_concept_id in (38004446,38003626,38003627) +AND V.visit_concept_id in (262,9201) +AND C.ordinal = 1 +-- End Measurement Criteria +) Q +JOIN cdm.OBSERVATION_PERIOD OP on Q.person_id = OP.person_id + and OP.observation_period_start_date <= Q.start_date and OP.observation_period_end_date >= Q.start_date +) P +INNER JOIN +( + -- Begin Measurement Criteria +select C.person_id, C.measurement_id as event_id, C.measurement_date as start_date, (C.measurement_date + 1*INTERVAL'1 day') as END_DATE, + C.measurement_concept_id as TARGET_CONCEPT_ID, C.visit_occurrence_id, + C.measurement_date as sort_date +from +( + select m.* + FROM cdm.MEASUREMENT m +JOIN Codesets codesets on ((m.measurement_concept_id = codesets.concept_id and codesets.codeset_id = 0)) +) C + + +-- End Measurement Criteria + +) A on A.person_id = P.person_id AND A.visit_occurrence_id = P.visit_occurrence_id +GROUP BY p.person_id, p.event_id +HAVING COUNT(A.TARGET_CONCEPT_ID) >= 1 +-- End Correlated Criteria + + ) CQ on E.person_id = CQ.person_id and E.event_id = CQ.event_id + GROUP BY E.person_id, E.event_id + HAVING COUNT(index_id) = 1 +) G +-- End Criteria Group +) AC on AC.person_id = pe.person_id and AC.event_id = pe.event_id + +) A on A.person_id = P.person_id AND A.START_DATE >= P.OP_START_DATE AND A.START_DATE <= P.OP_END_DATE AND A.START_DATE >= (P.START_DATE + -30*INTERVAL'1 day') AND A.START_DATE <= (P.START_DATE + 30*INTERVAL'1 day') +GROUP BY p.person_id, p.event_id +HAVING COUNT(A.TARGET_CONCEPT_ID) >= 1 +-- End Correlated Criteria + + ) CQ on E.person_id = CQ.person_id and E.event_id = CQ.event_id + GROUP BY E.person_id, E.event_id + HAVING COUNT(index_id) = 1 +) G +-- End Criteria Group +) AC on AC.person_id = pe.person_id AND AC.event_id = pe.event_id +) Results +; +ANALYZE Inclusion_7 +; + +CREATE TEMP TABLE Inclusion_8 + +AS +SELECT +8 as inclusion_rule_id, person_id, event_id + +FROM +( + select pe.person_id, pe.event_id + FROM qualified_events pe + +JOIN ( +-- Begin Criteria Group +select 0 as index_id, person_id, event_id +FROM +( + select E.person_id, E.event_id + FROM qualified_events E + INNER JOIN + ( + -- Begin Correlated Criteria +SELECT 0 as index_id, p.person_id, p.event_id +FROM qualified_events P +INNER JOIN +( + select PE.person_id, PE.event_id, PE.start_date, PE.end_date, PE.target_concept_id, PE.visit_occurrence_id, PE.sort_date FROM ( +-- Begin Observation Criteria +select C.person_id, C.observation_id as event_id, C.observation_date as start_date, (C.observation_date + 1*INTERVAL'1 day') as END_DATE, + C.observation_concept_id as TARGET_CONCEPT_ID, C.visit_occurrence_id, + C.observation_date as sort_date +from +( + select o.* , row_number() over (PARTITION BY o.person_id ORDER BY o.observation_date, o.observation_id) as ordinal + FROM cdm.OBSERVATION o +JOIN Codesets codesets on ((o.observation_concept_id = codesets.concept_id and codesets.codeset_id = 0) AND (o.observation_source_concept_id = codesets.concept_id and codesets.codeset_id = 0)) +) C +JOIN cdm.PERSON P on C.person_id = P.person_id +JOIN cdm.VISIT_OCCURRENCE V on C.visit_occurrence_id = V.visit_occurrence_id and C.person_id = V.person_id +LEFT JOIN cdm.PROVIDER PR on C.provider_id = PR.provider_id +WHERE (C.observation_date >= TO_DATE(TO_CHAR(1900,'0000')||'-'||TO_CHAR(1,'00')||'-'||TO_CHAR(1,'00'), 'YYYY-MM-DD') and C.observation_date <= TO_DATE(TO_CHAR(2099,'0000')||'-'||TO_CHAR(1,'00')||'-'||TO_CHAR(1,'00'), 'YYYY-MM-DD')) +AND C.observation_type_concept_id in (38000183,38000199) +AND (C.value_as_number >= 0.0000 and C.value_as_number <= 99.0000) +AND C.value_as_string like '%some value%' +AND C.value_as_concept_id in (36312355) +AND C.qualifier_concept_id in (4172703,4171754) +AND C.unit_concept_id in (8554) +AND (EXTRACT(YEAR FROM C.observation_date) - P.year_of_birth >= 0 and EXTRACT(YEAR FROM C.observation_date) - P.year_of_birth <= 99) +AND P.gender_concept_id in (8532,8507) +AND PR.specialty_concept_id in (38004446,38003627) +AND V.visit_concept_id in (262,9201) +AND C.ordinal = 1 +-- End Observation Criteria + +) PE +JOIN ( +-- Begin Criteria Group +select 0 as index_id, person_id, event_id +FROM +( + select E.person_id, E.event_id + FROM (SELECT Q.person_id, Q.event_id, Q.start_date, Q.end_date, Q.visit_occurrence_id, OP.observation_period_start_date as op_start_date, OP.observation_period_end_date as op_end_date +FROM (-- Begin Observation Criteria +select C.person_id, C.observation_id as event_id, C.observation_date as start_date, (C.observation_date + 1*INTERVAL'1 day') as END_DATE, + C.observation_concept_id as TARGET_CONCEPT_ID, C.visit_occurrence_id, + C.observation_date as sort_date +from +( + select o.* , row_number() over (PARTITION BY o.person_id ORDER BY o.observation_date, o.observation_id) as ordinal + FROM cdm.OBSERVATION o +JOIN Codesets codesets on ((o.observation_concept_id = codesets.concept_id and codesets.codeset_id = 0) AND (o.observation_source_concept_id = codesets.concept_id and codesets.codeset_id = 0)) +) C +JOIN cdm.PERSON P on C.person_id = P.person_id +JOIN cdm.VISIT_OCCURRENCE V on C.visit_occurrence_id = V.visit_occurrence_id and C.person_id = V.person_id +LEFT JOIN cdm.PROVIDER PR on C.provider_id = PR.provider_id +WHERE (C.observation_date >= TO_DATE(TO_CHAR(1900,'0000')||'-'||TO_CHAR(1,'00')||'-'||TO_CHAR(1,'00'), 'YYYY-MM-DD') and C.observation_date <= TO_DATE(TO_CHAR(2099,'0000')||'-'||TO_CHAR(1,'00')||'-'||TO_CHAR(1,'00'), 'YYYY-MM-DD')) +AND C.observation_type_concept_id in (38000183,38000199) +AND (C.value_as_number >= 0.0000 and C.value_as_number <= 99.0000) +AND C.value_as_string like '%some value%' +AND C.value_as_concept_id in (36312355) +AND C.qualifier_concept_id in (4172703,4171754) +AND C.unit_concept_id in (8554) +AND (EXTRACT(YEAR FROM C.observation_date) - P.year_of_birth >= 0 and EXTRACT(YEAR FROM C.observation_date) - P.year_of_birth <= 99) +AND P.gender_concept_id in (8532,8507) +AND PR.specialty_concept_id in (38004446,38003627) +AND V.visit_concept_id in (262,9201) +AND C.ordinal = 1 +-- End Observation Criteria +) Q +JOIN cdm.OBSERVATION_PERIOD OP on Q.person_id = OP.person_id + and OP.observation_period_start_date <= Q.start_date and OP.observation_period_end_date >= Q.start_date +) E + INNER JOIN + ( + -- Begin Correlated Criteria +SELECT 0 as index_id, p.person_id, p.event_id +FROM (SELECT Q.person_id, Q.event_id, Q.start_date, Q.end_date, Q.visit_occurrence_id, OP.observation_period_start_date as op_start_date, OP.observation_period_end_date as op_end_date +FROM (-- Begin Observation Criteria +select C.person_id, C.observation_id as event_id, C.observation_date as start_date, (C.observation_date + 1*INTERVAL'1 day') as END_DATE, + C.observation_concept_id as TARGET_CONCEPT_ID, C.visit_occurrence_id, + C.observation_date as sort_date +from +( + select o.* , row_number() over (PARTITION BY o.person_id ORDER BY o.observation_date, o.observation_id) as ordinal + FROM cdm.OBSERVATION o +JOIN Codesets codesets on ((o.observation_concept_id = codesets.concept_id and codesets.codeset_id = 0) AND (o.observation_source_concept_id = codesets.concept_id and codesets.codeset_id = 0)) +) C +JOIN cdm.PERSON P on C.person_id = P.person_id +JOIN cdm.VISIT_OCCURRENCE V on C.visit_occurrence_id = V.visit_occurrence_id and C.person_id = V.person_id +LEFT JOIN cdm.PROVIDER PR on C.provider_id = PR.provider_id +WHERE (C.observation_date >= TO_DATE(TO_CHAR(1900,'0000')||'-'||TO_CHAR(1,'00')||'-'||TO_CHAR(1,'00'), 'YYYY-MM-DD') and C.observation_date <= TO_DATE(TO_CHAR(2099,'0000')||'-'||TO_CHAR(1,'00')||'-'||TO_CHAR(1,'00'), 'YYYY-MM-DD')) +AND C.observation_type_concept_id in (38000183,38000199) +AND (C.value_as_number >= 0.0000 and C.value_as_number <= 99.0000) +AND C.value_as_string like '%some value%' +AND C.value_as_concept_id in (36312355) +AND C.qualifier_concept_id in (4172703,4171754) +AND C.unit_concept_id in (8554) +AND (EXTRACT(YEAR FROM C.observation_date) - P.year_of_birth >= 0 and EXTRACT(YEAR FROM C.observation_date) - P.year_of_birth <= 99) +AND P.gender_concept_id in (8532,8507) +AND PR.specialty_concept_id in (38004446,38003627) +AND V.visit_concept_id in (262,9201) +AND C.ordinal = 1 +-- End Observation Criteria +) Q +JOIN cdm.OBSERVATION_PERIOD OP on Q.person_id = OP.person_id + and OP.observation_period_start_date <= Q.start_date and OP.observation_period_end_date >= Q.start_date +) P +INNER JOIN +( + -- Begin Observation Criteria +select C.person_id, C.observation_id as event_id, C.observation_date as start_date, (C.observation_date + 1*INTERVAL'1 day') as END_DATE, + C.observation_concept_id as TARGET_CONCEPT_ID, C.visit_occurrence_id, + C.observation_date as sort_date +from +( + select o.* + FROM cdm.OBSERVATION o +JOIN Codesets codesets on ((o.observation_concept_id = codesets.concept_id and codesets.codeset_id = 0)) +) C + + +-- End Observation Criteria + +) A on A.person_id = P.person_id AND A.START_DATE >= P.OP_START_DATE AND A.START_DATE <= P.OP_END_DATE AND A.START_DATE >= P.OP_START_DATE AND A.START_DATE <= P.OP_END_DATE AND A.visit_occurrence_id = P.visit_occurrence_id +GROUP BY p.person_id, p.event_id +HAVING COUNT(A.TARGET_CONCEPT_ID) >= 1 +-- End Correlated Criteria + + ) CQ on E.person_id = CQ.person_id and E.event_id = CQ.event_id + GROUP BY E.person_id, E.event_id + HAVING COUNT(index_id) = 1 +) G +-- End Criteria Group +) AC on AC.person_id = pe.person_id and AC.event_id = pe.event_id + +) A on A.person_id = P.person_id AND A.START_DATE >= P.OP_START_DATE AND A.START_DATE <= P.OP_END_DATE AND A.START_DATE >= (P.START_DATE + -30*INTERVAL'1 day') AND A.START_DATE <= (P.START_DATE + 30*INTERVAL'1 day') +GROUP BY p.person_id, p.event_id +HAVING COUNT(A.TARGET_CONCEPT_ID) >= 1 +-- End Correlated Criteria + + ) CQ on E.person_id = CQ.person_id and E.event_id = CQ.event_id + GROUP BY E.person_id, E.event_id + HAVING COUNT(index_id) = 1 +) G +-- End Criteria Group +) AC on AC.person_id = pe.person_id AND AC.event_id = pe.event_id +) Results +; +ANALYZE Inclusion_8 +; + +CREATE TEMP TABLE Inclusion_9 + +AS +SELECT +9 as inclusion_rule_id, person_id, event_id + +FROM +( + select pe.person_id, pe.event_id + FROM qualified_events pe + +JOIN ( +-- Begin Criteria Group +select 0 as index_id, person_id, event_id +FROM +( + select E.person_id, E.event_id + FROM qualified_events E + INNER JOIN + ( + -- Begin Correlated Criteria +SELECT 0 as index_id, p.person_id, p.event_id +FROM qualified_events P +INNER JOIN +( + select PE.person_id, PE.event_id, PE.start_date, PE.end_date, PE.target_concept_id, PE.visit_occurrence_id, PE.sort_date FROM ( +-- Begin Observation Period Criteria +select C.person_id, C.observation_period_id as event_id, TO_DATE(TO_CHAR(1900,'0000')||'-'||TO_CHAR(1,'00')||'-'||TO_CHAR(1,'00'), 'YYYY-MM-DD') as start_date, TO_DATE(TO_CHAR(2099,'0000')||'-'||TO_CHAR(1,'00')||'-'||TO_CHAR(1,'00'), 'YYYY-MM-DD') as end_date, + C.period_type_concept_id as TARGET_CONCEPT_ID, CAST(NULL as bigint) as visit_occurrence_id, + C.observation_period_start_date as sort_date + +from +( + select op.*, row_number() over (PARTITION BY op.person_id ORDER BY op.observation_period_start_date) as ordinal + FROM cdm.OBSERVATION_PERIOD op +) C +JOIN cdm.PERSON P on C.person_id = P.person_id +WHERE C.ordinal = 1 +AND C.OBSERVATION_PERIOD_START_DATE <= TO_DATE(TO_CHAR(1900,'0000')||'-'||TO_CHAR(1,'00')||'-'||TO_CHAR(1,'00'), 'YYYY-MM-DD') and C.OBSERVATION_PERIOD_END_DATE >= TO_DATE(TO_CHAR(1900,'0000')||'-'||TO_CHAR(1,'00')||'-'||TO_CHAR(1,'00'), 'YYYY-MM-DD') +AND C.OBSERVATION_PERIOD_START_DATE <= TO_DATE(TO_CHAR(2099,'0000')||'-'||TO_CHAR(1,'00')||'-'||TO_CHAR(1,'00'), 'YYYY-MM-DD') and C.OBSERVATION_PERIOD_END_DATE >= TO_DATE(TO_CHAR(2099,'0000')||'-'||TO_CHAR(1,'00')||'-'||TO_CHAR(1,'00'), 'YYYY-MM-DD') +AND (C.observation_period_start_date >= TO_DATE(TO_CHAR(1900,'0000')||'-'||TO_CHAR(1,'00')||'-'||TO_CHAR(1,'00'), 'YYYY-MM-DD') and C.observation_period_start_date <= TO_DATE(TO_CHAR(2099,'0000')||'-'||TO_CHAR(1,'00')||'-'||TO_CHAR(1,'00'), 'YYYY-MM-DD')) +AND (C.observation_period_end_date >= TO_DATE(TO_CHAR(1900,'0000')||'-'||TO_CHAR(1,'00')||'-'||TO_CHAR(1,'00'), 'YYYY-MM-DD') and C.observation_period_end_date <= TO_DATE(TO_CHAR(2099,'0000')||'-'||TO_CHAR(1,'00')||'-'||TO_CHAR(1,'00'), 'YYYY-MM-DD')) +AND C.period_type_concept_id in (38000183,38000199) +AND ((CAST(C.observation_period_end_date AS DATE) - CAST(C.observation_period_start_date AS DATE)) >= 0 and (CAST(C.observation_period_end_date AS DATE) - CAST(C.observation_period_start_date AS DATE)) <= 99) +AND (EXTRACT(YEAR FROM C.observation_period_start_date) - P.year_of_birth >= 0 and EXTRACT(YEAR FROM C.observation_period_start_date) - P.year_of_birth <= 99) +AND (EXTRACT(YEAR FROM C.observation_period_end_date) - P.year_of_birth >= 0 and EXTRACT(YEAR FROM C.observation_period_end_date) - P.year_of_birth <= 99) +-- End Observation Period Criteria + +) PE +JOIN ( +-- Begin Criteria Group +select 0 as index_id, person_id, event_id +FROM +( + select E.person_id, E.event_id + FROM (SELECT Q.person_id, Q.event_id, Q.start_date, Q.end_date, Q.visit_occurrence_id, OP.observation_period_start_date as op_start_date, OP.observation_period_end_date as op_end_date +FROM (-- Begin Observation Period Criteria +select C.person_id, C.observation_period_id as event_id, TO_DATE(TO_CHAR(1900,'0000')||'-'||TO_CHAR(1,'00')||'-'||TO_CHAR(1,'00'), 'YYYY-MM-DD') as start_date, TO_DATE(TO_CHAR(2099,'0000')||'-'||TO_CHAR(1,'00')||'-'||TO_CHAR(1,'00'), 'YYYY-MM-DD') as end_date, + C.period_type_concept_id as TARGET_CONCEPT_ID, CAST(NULL as bigint) as visit_occurrence_id, + C.observation_period_start_date as sort_date + +from +( + select op.*, row_number() over (PARTITION BY op.person_id ORDER BY op.observation_period_start_date) as ordinal + FROM cdm.OBSERVATION_PERIOD op +) C +JOIN cdm.PERSON P on C.person_id = P.person_id +WHERE C.ordinal = 1 +AND C.OBSERVATION_PERIOD_START_DATE <= TO_DATE(TO_CHAR(1900,'0000')||'-'||TO_CHAR(1,'00')||'-'||TO_CHAR(1,'00'), 'YYYY-MM-DD') and C.OBSERVATION_PERIOD_END_DATE >= TO_DATE(TO_CHAR(1900,'0000')||'-'||TO_CHAR(1,'00')||'-'||TO_CHAR(1,'00'), 'YYYY-MM-DD') +AND C.OBSERVATION_PERIOD_START_DATE <= TO_DATE(TO_CHAR(2099,'0000')||'-'||TO_CHAR(1,'00')||'-'||TO_CHAR(1,'00'), 'YYYY-MM-DD') and C.OBSERVATION_PERIOD_END_DATE >= TO_DATE(TO_CHAR(2099,'0000')||'-'||TO_CHAR(1,'00')||'-'||TO_CHAR(1,'00'), 'YYYY-MM-DD') +AND (C.observation_period_start_date >= TO_DATE(TO_CHAR(1900,'0000')||'-'||TO_CHAR(1,'00')||'-'||TO_CHAR(1,'00'), 'YYYY-MM-DD') and C.observation_period_start_date <= TO_DATE(TO_CHAR(2099,'0000')||'-'||TO_CHAR(1,'00')||'-'||TO_CHAR(1,'00'), 'YYYY-MM-DD')) +AND (C.observation_period_end_date >= TO_DATE(TO_CHAR(1900,'0000')||'-'||TO_CHAR(1,'00')||'-'||TO_CHAR(1,'00'), 'YYYY-MM-DD') and C.observation_period_end_date <= TO_DATE(TO_CHAR(2099,'0000')||'-'||TO_CHAR(1,'00')||'-'||TO_CHAR(1,'00'), 'YYYY-MM-DD')) +AND C.period_type_concept_id in (38000183,38000199) +AND ((CAST(C.observation_period_end_date AS DATE) - CAST(C.observation_period_start_date AS DATE)) >= 0 and (CAST(C.observation_period_end_date AS DATE) - CAST(C.observation_period_start_date AS DATE)) <= 99) +AND (EXTRACT(YEAR FROM C.observation_period_start_date) - P.year_of_birth >= 0 and EXTRACT(YEAR FROM C.observation_period_start_date) - P.year_of_birth <= 99) +AND (EXTRACT(YEAR FROM C.observation_period_end_date) - P.year_of_birth >= 0 and EXTRACT(YEAR FROM C.observation_period_end_date) - P.year_of_birth <= 99) +-- End Observation Period Criteria +) Q +JOIN cdm.OBSERVATION_PERIOD OP on Q.person_id = OP.person_id + and OP.observation_period_start_date <= Q.start_date and OP.observation_period_end_date >= Q.start_date +) E + INNER JOIN + ( + -- Begin Correlated Criteria +SELECT 0 as index_id, p.person_id, p.event_id +FROM (SELECT Q.person_id, Q.event_id, Q.start_date, Q.end_date, Q.visit_occurrence_id, OP.observation_period_start_date as op_start_date, OP.observation_period_end_date as op_end_date +FROM (-- Begin Observation Period Criteria +select C.person_id, C.observation_period_id as event_id, TO_DATE(TO_CHAR(1900,'0000')||'-'||TO_CHAR(1,'00')||'-'||TO_CHAR(1,'00'), 'YYYY-MM-DD') as start_date, TO_DATE(TO_CHAR(2099,'0000')||'-'||TO_CHAR(1,'00')||'-'||TO_CHAR(1,'00'), 'YYYY-MM-DD') as end_date, + C.period_type_concept_id as TARGET_CONCEPT_ID, CAST(NULL as bigint) as visit_occurrence_id, + C.observation_period_start_date as sort_date + +from +( + select op.*, row_number() over (PARTITION BY op.person_id ORDER BY op.observation_period_start_date) as ordinal + FROM cdm.OBSERVATION_PERIOD op +) C +JOIN cdm.PERSON P on C.person_id = P.person_id +WHERE C.ordinal = 1 +AND C.OBSERVATION_PERIOD_START_DATE <= TO_DATE(TO_CHAR(1900,'0000')||'-'||TO_CHAR(1,'00')||'-'||TO_CHAR(1,'00'), 'YYYY-MM-DD') and C.OBSERVATION_PERIOD_END_DATE >= TO_DATE(TO_CHAR(1900,'0000')||'-'||TO_CHAR(1,'00')||'-'||TO_CHAR(1,'00'), 'YYYY-MM-DD') +AND C.OBSERVATION_PERIOD_START_DATE <= TO_DATE(TO_CHAR(2099,'0000')||'-'||TO_CHAR(1,'00')||'-'||TO_CHAR(1,'00'), 'YYYY-MM-DD') and C.OBSERVATION_PERIOD_END_DATE >= TO_DATE(TO_CHAR(2099,'0000')||'-'||TO_CHAR(1,'00')||'-'||TO_CHAR(1,'00'), 'YYYY-MM-DD') +AND (C.observation_period_start_date >= TO_DATE(TO_CHAR(1900,'0000')||'-'||TO_CHAR(1,'00')||'-'||TO_CHAR(1,'00'), 'YYYY-MM-DD') and C.observation_period_start_date <= TO_DATE(TO_CHAR(2099,'0000')||'-'||TO_CHAR(1,'00')||'-'||TO_CHAR(1,'00'), 'YYYY-MM-DD')) +AND (C.observation_period_end_date >= TO_DATE(TO_CHAR(1900,'0000')||'-'||TO_CHAR(1,'00')||'-'||TO_CHAR(1,'00'), 'YYYY-MM-DD') and C.observation_period_end_date <= TO_DATE(TO_CHAR(2099,'0000')||'-'||TO_CHAR(1,'00')||'-'||TO_CHAR(1,'00'), 'YYYY-MM-DD')) +AND C.period_type_concept_id in (38000183,38000199) +AND ((CAST(C.observation_period_end_date AS DATE) - CAST(C.observation_period_start_date AS DATE)) >= 0 and (CAST(C.observation_period_end_date AS DATE) - CAST(C.observation_period_start_date AS DATE)) <= 99) +AND (EXTRACT(YEAR FROM C.observation_period_start_date) - P.year_of_birth >= 0 and EXTRACT(YEAR FROM C.observation_period_start_date) - P.year_of_birth <= 99) +AND (EXTRACT(YEAR FROM C.observation_period_end_date) - P.year_of_birth >= 0 and EXTRACT(YEAR FROM C.observation_period_end_date) - P.year_of_birth <= 99) +-- End Observation Period Criteria +) Q +JOIN cdm.OBSERVATION_PERIOD OP on Q.person_id = OP.person_id + and OP.observation_period_start_date <= Q.start_date and OP.observation_period_end_date >= Q.start_date +) P +INNER JOIN +( + -- Begin Observation Period Criteria +select C.person_id, C.observation_period_id as event_id, C.observation_period_start_date as start_date, C.observation_period_end_date as end_date, + C.period_type_concept_id as TARGET_CONCEPT_ID, CAST(NULL as bigint) as visit_occurrence_id, + C.observation_period_start_date as sort_date + +from +( + select op.*, row_number() over (PARTITION BY op.person_id ORDER BY op.observation_period_start_date) as ordinal + FROM cdm.OBSERVATION_PERIOD op +) C + + +-- End Observation Period Criteria + +) A on A.person_id = P.person_id +GROUP BY p.person_id, p.event_id +HAVING COUNT(A.TARGET_CONCEPT_ID) >= 1 +-- End Correlated Criteria + + ) CQ on E.person_id = CQ.person_id and E.event_id = CQ.event_id + GROUP BY E.person_id, E.event_id + HAVING COUNT(index_id) = 1 +) G +-- End Criteria Group +) AC on AC.person_id = pe.person_id and AC.event_id = pe.event_id + +) A on A.person_id = P.person_id AND A.START_DATE >= P.OP_START_DATE AND A.START_DATE <= P.OP_END_DATE AND A.START_DATE >= (P.START_DATE + -30*INTERVAL'1 day') AND A.START_DATE <= (P.START_DATE + 30*INTERVAL'1 day') +GROUP BY p.person_id, p.event_id +HAVING COUNT(A.TARGET_CONCEPT_ID) >= 1 +-- End Correlated Criteria + + ) CQ on E.person_id = CQ.person_id and E.event_id = CQ.event_id + GROUP BY E.person_id, E.event_id + HAVING COUNT(index_id) = 1 +) G +-- End Criteria Group +) AC on AC.person_id = pe.person_id AND AC.event_id = pe.event_id +) Results +; +ANALYZE Inclusion_9 +; + +CREATE TEMP TABLE Inclusion_10 + +AS +SELECT +10 as inclusion_rule_id, person_id, event_id + +FROM +( + select pe.person_id, pe.event_id + FROM qualified_events pe + +JOIN ( +-- Begin Criteria Group +select 0 as index_id, person_id, event_id +FROM +( + select E.person_id, E.event_id + FROM qualified_events E + INNER JOIN + ( + -- Begin Correlated Criteria +SELECT 0 as index_id, p.person_id, p.event_id +FROM qualified_events P +INNER JOIN +( + select PE.person_id, PE.event_id, PE.start_date, PE.end_date, PE.target_concept_id, PE.visit_occurrence_id, PE.sort_date FROM ( +-- Begin Procedure Occurrence Criteria +select C.person_id, C.procedure_occurrence_id as event_id, C.procedure_date as start_date, (C.procedure_date + 1*INTERVAL'1 day') as END_DATE, + C.procedure_concept_id as TARGET_CONCEPT_ID, C.visit_occurrence_id, + C.procedure_date as sort_date +from +( + select po.* , row_number() over (PARTITION BY po.person_id ORDER BY po.procedure_date, po.procedure_occurrence_id) as ordinal + FROM cdm.PROCEDURE_OCCURRENCE po +JOIN Codesets codesets on ((po.procedure_concept_id = codesets.concept_id and codesets.codeset_id = 0)) +) C +JOIN cdm.PERSON P on C.person_id = P.person_id +JOIN cdm.VISIT_OCCURRENCE V on C.visit_occurrence_id = V.visit_occurrence_id and C.person_id = V.person_id +LEFT JOIN cdm.PROVIDER PR on C.provider_id = PR.provider_id +WHERE (C.procedure_date >= TO_DATE(TO_CHAR(1900,'0000')||'-'||TO_CHAR(1,'00')||'-'||TO_CHAR(1,'00'), 'YYYY-MM-DD') and C.procedure_date <= TO_DATE(TO_CHAR(2099,'0000')||'-'||TO_CHAR(1,'00')||'-'||TO_CHAR(1,'00'), 'YYYY-MM-DD')) +AND C.procedure_type_concept_id in (38000183,38000199) +AND C.modifier_concept_id in (4000804,4001771) +AND (C.quantity >= 0 and C.quantity <= 99) +AND (EXTRACT(YEAR FROM C.procedure_date) - P.year_of_birth >= 0 and EXTRACT(YEAR FROM C.procedure_date) - P.year_of_birth <= 99) +AND P.gender_concept_id in (8532,8507) +AND PR.specialty_concept_id in (38004446,38003627) +AND V.visit_concept_id in (262,9201) +AND C.ordinal = 1 +-- End Procedure Occurrence Criteria + +) PE +JOIN ( +-- Begin Criteria Group +select 0 as index_id, person_id, event_id +FROM +( + select E.person_id, E.event_id + FROM (SELECT Q.person_id, Q.event_id, Q.start_date, Q.end_date, Q.visit_occurrence_id, OP.observation_period_start_date as op_start_date, OP.observation_period_end_date as op_end_date +FROM (-- Begin Procedure Occurrence Criteria +select C.person_id, C.procedure_occurrence_id as event_id, C.procedure_date as start_date, (C.procedure_date + 1*INTERVAL'1 day') as END_DATE, + C.procedure_concept_id as TARGET_CONCEPT_ID, C.visit_occurrence_id, + C.procedure_date as sort_date +from +( + select po.* , row_number() over (PARTITION BY po.person_id ORDER BY po.procedure_date, po.procedure_occurrence_id) as ordinal + FROM cdm.PROCEDURE_OCCURRENCE po +JOIN Codesets codesets on ((po.procedure_concept_id = codesets.concept_id and codesets.codeset_id = 0)) +) C +JOIN cdm.PERSON P on C.person_id = P.person_id +JOIN cdm.VISIT_OCCURRENCE V on C.visit_occurrence_id = V.visit_occurrence_id and C.person_id = V.person_id +LEFT JOIN cdm.PROVIDER PR on C.provider_id = PR.provider_id +WHERE (C.procedure_date >= TO_DATE(TO_CHAR(1900,'0000')||'-'||TO_CHAR(1,'00')||'-'||TO_CHAR(1,'00'), 'YYYY-MM-DD') and C.procedure_date <= TO_DATE(TO_CHAR(2099,'0000')||'-'||TO_CHAR(1,'00')||'-'||TO_CHAR(1,'00'), 'YYYY-MM-DD')) +AND C.procedure_type_concept_id in (38000183,38000199) +AND C.modifier_concept_id in (4000804,4001771) +AND (C.quantity >= 0 and C.quantity <= 99) +AND (EXTRACT(YEAR FROM C.procedure_date) - P.year_of_birth >= 0 and EXTRACT(YEAR FROM C.procedure_date) - P.year_of_birth <= 99) +AND P.gender_concept_id in (8532,8507) +AND PR.specialty_concept_id in (38004446,38003627) +AND V.visit_concept_id in (262,9201) +AND C.ordinal = 1 +-- End Procedure Occurrence Criteria +) Q +JOIN cdm.OBSERVATION_PERIOD OP on Q.person_id = OP.person_id + and OP.observation_period_start_date <= Q.start_date and OP.observation_period_end_date >= Q.start_date +) E + INNER JOIN + ( + -- Begin Correlated Criteria +SELECT 0 as index_id, p.person_id, p.event_id +FROM (SELECT Q.person_id, Q.event_id, Q.start_date, Q.end_date, Q.visit_occurrence_id, OP.observation_period_start_date as op_start_date, OP.observation_period_end_date as op_end_date +FROM (-- Begin Procedure Occurrence Criteria +select C.person_id, C.procedure_occurrence_id as event_id, C.procedure_date as start_date, (C.procedure_date + 1*INTERVAL'1 day') as END_DATE, + C.procedure_concept_id as TARGET_CONCEPT_ID, C.visit_occurrence_id, + C.procedure_date as sort_date +from +( + select po.* , row_number() over (PARTITION BY po.person_id ORDER BY po.procedure_date, po.procedure_occurrence_id) as ordinal + FROM cdm.PROCEDURE_OCCURRENCE po +JOIN Codesets codesets on ((po.procedure_concept_id = codesets.concept_id and codesets.codeset_id = 0)) +) C +JOIN cdm.PERSON P on C.person_id = P.person_id +JOIN cdm.VISIT_OCCURRENCE V on C.visit_occurrence_id = V.visit_occurrence_id and C.person_id = V.person_id +LEFT JOIN cdm.PROVIDER PR on C.provider_id = PR.provider_id +WHERE (C.procedure_date >= TO_DATE(TO_CHAR(1900,'0000')||'-'||TO_CHAR(1,'00')||'-'||TO_CHAR(1,'00'), 'YYYY-MM-DD') and C.procedure_date <= TO_DATE(TO_CHAR(2099,'0000')||'-'||TO_CHAR(1,'00')||'-'||TO_CHAR(1,'00'), 'YYYY-MM-DD')) +AND C.procedure_type_concept_id in (38000183,38000199) +AND C.modifier_concept_id in (4000804,4001771) +AND (C.quantity >= 0 and C.quantity <= 99) +AND (EXTRACT(YEAR FROM C.procedure_date) - P.year_of_birth >= 0 and EXTRACT(YEAR FROM C.procedure_date) - P.year_of_birth <= 99) +AND P.gender_concept_id in (8532,8507) +AND PR.specialty_concept_id in (38004446,38003627) +AND V.visit_concept_id in (262,9201) +AND C.ordinal = 1 +-- End Procedure Occurrence Criteria +) Q +JOIN cdm.OBSERVATION_PERIOD OP on Q.person_id = OP.person_id + and OP.observation_period_start_date <= Q.start_date and OP.observation_period_end_date >= Q.start_date +) P +INNER JOIN +( + -- Begin Procedure Occurrence Criteria +select C.person_id, C.procedure_occurrence_id as event_id, C.procedure_date as start_date, (C.procedure_date + 1*INTERVAL'1 day') as END_DATE, + C.procedure_concept_id as TARGET_CONCEPT_ID, C.visit_occurrence_id, + C.procedure_date as sort_date +from +( + select po.* + FROM cdm.PROCEDURE_OCCURRENCE po +JOIN Codesets codesets on ((po.procedure_concept_id = codesets.concept_id and codesets.codeset_id = 0)) +) C + + +-- End Procedure Occurrence Criteria + +) A on A.person_id = P.person_id AND A.visit_occurrence_id = P.visit_occurrence_id +GROUP BY p.person_id, p.event_id +HAVING COUNT(A.TARGET_CONCEPT_ID) >= 1 +-- End Correlated Criteria + + ) CQ on E.person_id = CQ.person_id and E.event_id = CQ.event_id + GROUP BY E.person_id, E.event_id + HAVING COUNT(index_id) = 1 +) G +-- End Criteria Group +) AC on AC.person_id = pe.person_id and AC.event_id = pe.event_id + +) A on A.person_id = P.person_id AND A.START_DATE >= P.OP_START_DATE AND A.START_DATE <= P.OP_END_DATE AND A.START_DATE >= (P.START_DATE + -30*INTERVAL'1 day') AND A.START_DATE <= (P.START_DATE + 30*INTERVAL'1 day') +GROUP BY p.person_id, p.event_id +HAVING COUNT(A.TARGET_CONCEPT_ID) >= 1 +-- End Correlated Criteria + + ) CQ on E.person_id = CQ.person_id and E.event_id = CQ.event_id + GROUP BY E.person_id, E.event_id + HAVING COUNT(index_id) = 1 +) G +-- End Criteria Group +) AC on AC.person_id = pe.person_id AND AC.event_id = pe.event_id +) Results +; +ANALYZE Inclusion_10 +; + +CREATE TEMP TABLE Inclusion_11 + +AS +SELECT +11 as inclusion_rule_id, person_id, event_id + +FROM +( + select pe.person_id, pe.event_id + FROM qualified_events pe + +JOIN ( +-- Begin Criteria Group +select 0 as index_id, person_id, event_id +FROM +( + select E.person_id, E.event_id + FROM qualified_events E + INNER JOIN + ( + -- Begin Correlated Criteria +SELECT 0 as index_id, p.person_id, p.event_id +FROM qualified_events P +INNER JOIN +( + select PE.person_id, PE.event_id, PE.start_date, PE.end_date, PE.target_concept_id, PE.visit_occurrence_id, PE.sort_date FROM ( +-- Begin Specimen Criteria +select C.person_id, C.specimen_id as event_id, C.specimen_date as start_date, (C.specimen_date + 1*INTERVAL'1 day') as end_date, + C.specimen_concept_id as TARGET_CONCEPT_ID, CAST(NULL as bigint) as visit_occurrence_id, + C.specimen_date as sort_date +from +( + select s.* , row_number() over (PARTITION BY s.person_id ORDER BY s.specimen_date, s.specimen_id) as ordinal + FROM cdm.SPECIMEN s +where s.specimen_concept_id in (SELECT concept_id from Codesets where codeset_id = 0) +) C +JOIN cdm.PERSON P on C.person_id = P.person_id +WHERE (C.specimen_date >= TO_DATE(TO_CHAR(1900,'0000')||'-'||TO_CHAR(1,'00')||'-'||TO_CHAR(1,'00'), 'YYYY-MM-DD') and C.specimen_date <= TO_DATE(TO_CHAR(2099,'0000')||'-'||TO_CHAR(1,'00')||'-'||TO_CHAR(1,'00'), 'YYYY-MM-DD')) +AND C.specimen_type_concept_id in (38000183,38000199) +AND (C.quantity >= 0.0000 and C.quantity <= 99.0000) +AND C.unit_concept_id in (8688,9218) +AND C.anatomic_site_concept_id in (4002601,4001422,4001433) +AND C.disease_status_concept_id in (4066212) +AND C.specimen_source_id like '%some sourceID%' +AND (EXTRACT(YEAR FROM C.specimen_date) - P.year_of_birth >= 0 and EXTRACT(YEAR FROM C.specimen_date) - P.year_of_birth <= 99) +AND P.gender_concept_id in (8532,8507) +AND C.ordinal = 1 +-- End Specimen Criteria + +) PE +JOIN ( +-- Begin Criteria Group +select 0 as index_id, person_id, event_id +FROM +( + select E.person_id, E.event_id + FROM (SELECT Q.person_id, Q.event_id, Q.start_date, Q.end_date, Q.visit_occurrence_id, OP.observation_period_start_date as op_start_date, OP.observation_period_end_date as op_end_date +FROM (-- Begin Specimen Criteria +select C.person_id, C.specimen_id as event_id, C.specimen_date as start_date, (C.specimen_date + 1*INTERVAL'1 day') as end_date, + C.specimen_concept_id as TARGET_CONCEPT_ID, CAST(NULL as bigint) as visit_occurrence_id, + C.specimen_date as sort_date +from +( + select s.* , row_number() over (PARTITION BY s.person_id ORDER BY s.specimen_date, s.specimen_id) as ordinal + FROM cdm.SPECIMEN s +where s.specimen_concept_id in (SELECT concept_id from Codesets where codeset_id = 0) +) C +JOIN cdm.PERSON P on C.person_id = P.person_id +WHERE (C.specimen_date >= TO_DATE(TO_CHAR(1900,'0000')||'-'||TO_CHAR(1,'00')||'-'||TO_CHAR(1,'00'), 'YYYY-MM-DD') and C.specimen_date <= TO_DATE(TO_CHAR(2099,'0000')||'-'||TO_CHAR(1,'00')||'-'||TO_CHAR(1,'00'), 'YYYY-MM-DD')) +AND C.specimen_type_concept_id in (38000183,38000199) +AND (C.quantity >= 0.0000 and C.quantity <= 99.0000) +AND C.unit_concept_id in (8688,9218) +AND C.anatomic_site_concept_id in (4002601,4001422,4001433) +AND C.disease_status_concept_id in (4066212) +AND C.specimen_source_id like '%some sourceID%' +AND (EXTRACT(YEAR FROM C.specimen_date) - P.year_of_birth >= 0 and EXTRACT(YEAR FROM C.specimen_date) - P.year_of_birth <= 99) +AND P.gender_concept_id in (8532,8507) +AND C.ordinal = 1 +-- End Specimen Criteria +) Q +JOIN cdm.OBSERVATION_PERIOD OP on Q.person_id = OP.person_id + and OP.observation_period_start_date <= Q.start_date and OP.observation_period_end_date >= Q.start_date +) E + INNER JOIN + ( + -- Begin Correlated Criteria +SELECT 0 as index_id, p.person_id, p.event_id +FROM (SELECT Q.person_id, Q.event_id, Q.start_date, Q.end_date, Q.visit_occurrence_id, OP.observation_period_start_date as op_start_date, OP.observation_period_end_date as op_end_date +FROM (-- Begin Specimen Criteria +select C.person_id, C.specimen_id as event_id, C.specimen_date as start_date, (C.specimen_date + 1*INTERVAL'1 day') as end_date, + C.specimen_concept_id as TARGET_CONCEPT_ID, CAST(NULL as bigint) as visit_occurrence_id, + C.specimen_date as sort_date +from +( + select s.* , row_number() over (PARTITION BY s.person_id ORDER BY s.specimen_date, s.specimen_id) as ordinal + FROM cdm.SPECIMEN s +where s.specimen_concept_id in (SELECT concept_id from Codesets where codeset_id = 0) +) C +JOIN cdm.PERSON P on C.person_id = P.person_id +WHERE (C.specimen_date >= TO_DATE(TO_CHAR(1900,'0000')||'-'||TO_CHAR(1,'00')||'-'||TO_CHAR(1,'00'), 'YYYY-MM-DD') and C.specimen_date <= TO_DATE(TO_CHAR(2099,'0000')||'-'||TO_CHAR(1,'00')||'-'||TO_CHAR(1,'00'), 'YYYY-MM-DD')) +AND C.specimen_type_concept_id in (38000183,38000199) +AND (C.quantity >= 0.0000 and C.quantity <= 99.0000) +AND C.unit_concept_id in (8688,9218) +AND C.anatomic_site_concept_id in (4002601,4001422,4001433) +AND C.disease_status_concept_id in (4066212) +AND C.specimen_source_id like '%some sourceID%' +AND (EXTRACT(YEAR FROM C.specimen_date) - P.year_of_birth >= 0 and EXTRACT(YEAR FROM C.specimen_date) - P.year_of_birth <= 99) +AND P.gender_concept_id in (8532,8507) +AND C.ordinal = 1 +-- End Specimen Criteria +) Q +JOIN cdm.OBSERVATION_PERIOD OP on Q.person_id = OP.person_id + and OP.observation_period_start_date <= Q.start_date and OP.observation_period_end_date >= Q.start_date +) P +INNER JOIN +( + -- Begin Specimen Criteria +select C.person_id, C.specimen_id as event_id, C.specimen_date as start_date, (C.specimen_date + 1*INTERVAL'1 day') as end_date, + C.specimen_concept_id as TARGET_CONCEPT_ID, CAST(NULL as bigint) as visit_occurrence_id, + C.specimen_date as sort_date +from +( + select s.* + FROM cdm.SPECIMEN s +where s.specimen_concept_id in (SELECT concept_id from Codesets where codeset_id = 0) +) C + + +-- End Specimen Criteria + +) A on A.person_id = P.person_id +GROUP BY p.person_id, p.event_id +HAVING COUNT(A.TARGET_CONCEPT_ID) >= 1 +-- End Correlated Criteria + + ) CQ on E.person_id = CQ.person_id and E.event_id = CQ.event_id + GROUP BY E.person_id, E.event_id + HAVING COUNT(index_id) = 1 +) G +-- End Criteria Group +) AC on AC.person_id = pe.person_id and AC.event_id = pe.event_id + +) A on A.person_id = P.person_id AND A.START_DATE >= P.OP_START_DATE AND A.START_DATE <= P.OP_END_DATE AND A.START_DATE >= (P.START_DATE + -30*INTERVAL'1 day') AND A.START_DATE <= (P.START_DATE + 30*INTERVAL'1 day') +GROUP BY p.person_id, p.event_id +HAVING COUNT(A.TARGET_CONCEPT_ID) >= 1 +-- End Correlated Criteria + + ) CQ on E.person_id = CQ.person_id and E.event_id = CQ.event_id + GROUP BY E.person_id, E.event_id + HAVING COUNT(index_id) = 1 +) G +-- End Criteria Group +) AC on AC.person_id = pe.person_id AND AC.event_id = pe.event_id +) Results +; +ANALYZE Inclusion_11 +; + +CREATE TEMP TABLE Inclusion_12 + +AS +SELECT +12 as inclusion_rule_id, person_id, event_id + +FROM +( + select pe.person_id, pe.event_id + FROM qualified_events pe + +JOIN ( +-- Begin Criteria Group +select 0 as index_id, person_id, event_id +FROM +( + select E.person_id, E.event_id + FROM qualified_events E + INNER JOIN + ( + -- Begin Correlated Criteria +SELECT 0 as index_id, p.person_id, p.event_id +FROM qualified_events P +INNER JOIN +( + select PE.person_id, PE.event_id, PE.start_date, PE.end_date, PE.target_concept_id, PE.visit_occurrence_id, PE.sort_date FROM ( +-- Begin Visit Occurrence Criteria +select C.person_id, C.visit_occurrence_id as event_id, C.visit_start_date as start_date, C.visit_end_date as end_date, + C.visit_concept_id as TARGET_CONCEPT_ID, C.visit_occurrence_id, + C.visit_start_date as sort_date +from +( + select vo.* , row_number() over (PARTITION BY vo.person_id ORDER BY vo.visit_start_date, vo.visit_occurrence_id) as ordinal + FROM cdm.VISIT_OCCURRENCE vo +JOIN Codesets codesets on ((vo.visit_concept_id = codesets.concept_id and codesets.codeset_id = 0) AND (vo.visit_source_concept_id = codesets.concept_id and codesets.codeset_id = 0)) +) C +JOIN cdm.PERSON P on C.person_id = P.person_id +JOIN cdm.CARE_SITE CS on C.care_site_id = CS.care_site_id +LEFT JOIN cdm.PROVIDER PR on C.provider_id = PR.provider_id +WHERE (C.visit_start_date >= TO_DATE(TO_CHAR(1900,'0000')||'-'||TO_CHAR(1,'00')||'-'||TO_CHAR(1,'00'), 'YYYY-MM-DD') and C.visit_start_date <= TO_DATE(TO_CHAR(2099,'0000')||'-'||TO_CHAR(1,'00')||'-'||TO_CHAR(1,'00'), 'YYYY-MM-DD')) +AND (C.visit_end_date >= TO_DATE(TO_CHAR(1900,'0000')||'-'||TO_CHAR(1,'00')||'-'||TO_CHAR(1,'00'), 'YYYY-MM-DD') and C.visit_end_date <= TO_DATE(TO_CHAR(2099,'0000')||'-'||TO_CHAR(1,'00')||'-'||TO_CHAR(1,'00'), 'YYYY-MM-DD')) +AND C.visit_type_concept_id in (38000183,38000199) +AND ((CAST(C.visit_end_date AS DATE) - CAST(C.visit_start_date AS DATE)) >= 0 and (CAST(C.visit_end_date AS DATE) - CAST(C.visit_start_date AS DATE)) <= 99) +AND (EXTRACT(YEAR FROM C.visit_start_date) - P.year_of_birth >= 0 and EXTRACT(YEAR FROM C.visit_start_date) - P.year_of_birth <= 99) +AND P.gender_concept_id in (8532,8507) +AND PR.specialty_concept_id in (38004446,38003627) +AND CS.place_of_service_concept_id in (42628591,42628592) +AND C.ordinal = 1 +-- End Visit Occurrence Criteria + +) PE +JOIN ( +-- Begin Criteria Group +select 0 as index_id, person_id, event_id +FROM +( + select E.person_id, E.event_id + FROM (SELECT Q.person_id, Q.event_id, Q.start_date, Q.end_date, Q.visit_occurrence_id, OP.observation_period_start_date as op_start_date, OP.observation_period_end_date as op_end_date +FROM (-- Begin Visit Occurrence Criteria +select C.person_id, C.visit_occurrence_id as event_id, C.visit_start_date as start_date, C.visit_end_date as end_date, + C.visit_concept_id as TARGET_CONCEPT_ID, C.visit_occurrence_id, + C.visit_start_date as sort_date +from +( + select vo.* , row_number() over (PARTITION BY vo.person_id ORDER BY vo.visit_start_date, vo.visit_occurrence_id) as ordinal + FROM cdm.VISIT_OCCURRENCE vo +JOIN Codesets codesets on ((vo.visit_concept_id = codesets.concept_id and codesets.codeset_id = 0) AND (vo.visit_source_concept_id = codesets.concept_id and codesets.codeset_id = 0)) +) C +JOIN cdm.PERSON P on C.person_id = P.person_id +JOIN cdm.CARE_SITE CS on C.care_site_id = CS.care_site_id +LEFT JOIN cdm.PROVIDER PR on C.provider_id = PR.provider_id +WHERE (C.visit_start_date >= TO_DATE(TO_CHAR(1900,'0000')||'-'||TO_CHAR(1,'00')||'-'||TO_CHAR(1,'00'), 'YYYY-MM-DD') and C.visit_start_date <= TO_DATE(TO_CHAR(2099,'0000')||'-'||TO_CHAR(1,'00')||'-'||TO_CHAR(1,'00'), 'YYYY-MM-DD')) +AND (C.visit_end_date >= TO_DATE(TO_CHAR(1900,'0000')||'-'||TO_CHAR(1,'00')||'-'||TO_CHAR(1,'00'), 'YYYY-MM-DD') and C.visit_end_date <= TO_DATE(TO_CHAR(2099,'0000')||'-'||TO_CHAR(1,'00')||'-'||TO_CHAR(1,'00'), 'YYYY-MM-DD')) +AND C.visit_type_concept_id in (38000183,38000199) +AND ((CAST(C.visit_end_date AS DATE) - CAST(C.visit_start_date AS DATE)) >= 0 and (CAST(C.visit_end_date AS DATE) - CAST(C.visit_start_date AS DATE)) <= 99) +AND (EXTRACT(YEAR FROM C.visit_start_date) - P.year_of_birth >= 0 and EXTRACT(YEAR FROM C.visit_start_date) - P.year_of_birth <= 99) +AND P.gender_concept_id in (8532,8507) +AND PR.specialty_concept_id in (38004446,38003627) +AND CS.place_of_service_concept_id in (42628591,42628592) +AND C.ordinal = 1 +-- End Visit Occurrence Criteria +) Q +JOIN cdm.OBSERVATION_PERIOD OP on Q.person_id = OP.person_id + and OP.observation_period_start_date <= Q.start_date and OP.observation_period_end_date >= Q.start_date +) E + INNER JOIN + ( + -- Begin Correlated Criteria +SELECT 0 as index_id, p.person_id, p.event_id +FROM (SELECT Q.person_id, Q.event_id, Q.start_date, Q.end_date, Q.visit_occurrence_id, OP.observation_period_start_date as op_start_date, OP.observation_period_end_date as op_end_date +FROM (-- Begin Visit Occurrence Criteria +select C.person_id, C.visit_occurrence_id as event_id, C.visit_start_date as start_date, C.visit_end_date as end_date, + C.visit_concept_id as TARGET_CONCEPT_ID, C.visit_occurrence_id, + C.visit_start_date as sort_date +from +( + select vo.* , row_number() over (PARTITION BY vo.person_id ORDER BY vo.visit_start_date, vo.visit_occurrence_id) as ordinal + FROM cdm.VISIT_OCCURRENCE vo +JOIN Codesets codesets on ((vo.visit_concept_id = codesets.concept_id and codesets.codeset_id = 0) AND (vo.visit_source_concept_id = codesets.concept_id and codesets.codeset_id = 0)) +) C +JOIN cdm.PERSON P on C.person_id = P.person_id +JOIN cdm.CARE_SITE CS on C.care_site_id = CS.care_site_id +LEFT JOIN cdm.PROVIDER PR on C.provider_id = PR.provider_id +WHERE (C.visit_start_date >= TO_DATE(TO_CHAR(1900,'0000')||'-'||TO_CHAR(1,'00')||'-'||TO_CHAR(1,'00'), 'YYYY-MM-DD') and C.visit_start_date <= TO_DATE(TO_CHAR(2099,'0000')||'-'||TO_CHAR(1,'00')||'-'||TO_CHAR(1,'00'), 'YYYY-MM-DD')) +AND (C.visit_end_date >= TO_DATE(TO_CHAR(1900,'0000')||'-'||TO_CHAR(1,'00')||'-'||TO_CHAR(1,'00'), 'YYYY-MM-DD') and C.visit_end_date <= TO_DATE(TO_CHAR(2099,'0000')||'-'||TO_CHAR(1,'00')||'-'||TO_CHAR(1,'00'), 'YYYY-MM-DD')) +AND C.visit_type_concept_id in (38000183,38000199) +AND ((CAST(C.visit_end_date AS DATE) - CAST(C.visit_start_date AS DATE)) >= 0 and (CAST(C.visit_end_date AS DATE) - CAST(C.visit_start_date AS DATE)) <= 99) +AND (EXTRACT(YEAR FROM C.visit_start_date) - P.year_of_birth >= 0 and EXTRACT(YEAR FROM C.visit_start_date) - P.year_of_birth <= 99) +AND P.gender_concept_id in (8532,8507) +AND PR.specialty_concept_id in (38004446,38003627) +AND CS.place_of_service_concept_id in (42628591,42628592) +AND C.ordinal = 1 +-- End Visit Occurrence Criteria +) Q +JOIN cdm.OBSERVATION_PERIOD OP on Q.person_id = OP.person_id + and OP.observation_period_start_date <= Q.start_date and OP.observation_period_end_date >= Q.start_date +) P +INNER JOIN +( + -- Begin Visit Occurrence Criteria +select C.person_id, C.visit_occurrence_id as event_id, C.visit_start_date as start_date, C.visit_end_date as end_date, + C.visit_concept_id as TARGET_CONCEPT_ID, C.visit_occurrence_id, + C.visit_start_date as sort_date +from +( + select vo.* + FROM cdm.VISIT_OCCURRENCE vo + +) C + + +-- End Visit Occurrence Criteria + +) A on A.person_id = P.person_id AND A.visit_occurrence_id = P.visit_occurrence_id +GROUP BY p.person_id, p.event_id +HAVING COUNT(A.TARGET_CONCEPT_ID) >= 1 +-- End Correlated Criteria + + ) CQ on E.person_id = CQ.person_id and E.event_id = CQ.event_id + GROUP BY E.person_id, E.event_id + HAVING COUNT(index_id) = 1 +) G +-- End Criteria Group +) AC on AC.person_id = pe.person_id and AC.event_id = pe.event_id + +) A on A.person_id = P.person_id AND A.START_DATE >= P.OP_START_DATE AND A.START_DATE <= P.OP_END_DATE AND A.START_DATE >= (P.START_DATE + -30*INTERVAL'1 day') AND A.START_DATE <= (P.START_DATE + 30*INTERVAL'1 day') +GROUP BY p.person_id, p.event_id +HAVING COUNT(A.TARGET_CONCEPT_ID) >= 1 +-- End Correlated Criteria + + ) CQ on E.person_id = CQ.person_id and E.event_id = CQ.event_id + GROUP BY E.person_id, E.event_id + HAVING COUNT(index_id) = 1 +) G +-- End Criteria Group +) AC on AC.person_id = pe.person_id AND AC.event_id = pe.event_id +) Results +; +ANALYZE Inclusion_12 +; + +CREATE TEMP TABLE Inclusion_13 + +AS +SELECT +13 as inclusion_rule_id, person_id, event_id + +FROM +( + select pe.person_id, pe.event_id + FROM qualified_events pe + +JOIN ( +-- Begin Criteria Group +select 0 as index_id, person_id, event_id +FROM +( + select E.person_id, E.event_id + FROM qualified_events E + INNER JOIN + ( + -- Begin Correlated Criteria +SELECT 0 as index_id, p.person_id, p.event_id +FROM qualified_events P +INNER JOIN +( + -- Begin Condition Occurrence Criteria +SELECT C.person_id, C.condition_occurrence_id as event_id, C.condition_start_date as start_date, COALESCE(C.condition_end_date, (C.condition_start_date + 1*INTERVAL'1 day')) as end_date, + C.CONDITION_CONCEPT_ID as TARGET_CONCEPT_ID, C.visit_occurrence_id, + C.condition_start_date as sort_date +FROM +( + SELECT co.* + FROM cdm.CONDITION_OCCURRENCE co + JOIN Codesets codesets on ((co.condition_concept_id = codesets.concept_id and codesets.codeset_id = 0)) +) C + + +-- End Condition Occurrence Criteria + +) A on A.person_id = P.person_id AND A.START_DATE >= P.OP_START_DATE AND A.START_DATE <= P.OP_END_DATE AND A.START_DATE >= (P.START_DATE + -100*INTERVAL'1 day') AND A.START_DATE <= (P.START_DATE + 100*INTERVAL'1 day') +GROUP BY p.person_id, p.event_id +HAVING COUNT(A.TARGET_CONCEPT_ID) >= 1 +-- End Correlated Criteria + +UNION ALL +-- Begin Criteria Group +select 1 as index_id, person_id, event_id +FROM +( + select E.person_id, E.event_id + FROM qualified_events E + INNER JOIN + ( + -- Begin Correlated Criteria +SELECT 0 as index_id, p.person_id, p.event_id +FROM qualified_events P +INNER JOIN +( + -- Begin Procedure Occurrence Criteria +select C.person_id, C.procedure_occurrence_id as event_id, C.procedure_date as start_date, (C.procedure_date + 1*INTERVAL'1 day') as END_DATE, + C.procedure_concept_id as TARGET_CONCEPT_ID, C.visit_occurrence_id, + C.procedure_date as sort_date +from +( + select po.* + FROM cdm.PROCEDURE_OCCURRENCE po +JOIN Codesets codesets on ((po.procedure_concept_id = codesets.concept_id and codesets.codeset_id = 0)) +) C + + +-- End Procedure Occurrence Criteria + +) A on A.person_id = P.person_id AND A.START_DATE >= P.OP_START_DATE AND A.START_DATE <= P.OP_END_DATE AND A.START_DATE >= (P.START_DATE + -60*INTERVAL'1 day') AND A.START_DATE <= (P.START_DATE + 60*INTERVAL'1 day') +GROUP BY p.person_id, p.event_id +HAVING COUNT(A.TARGET_CONCEPT_ID) >= 1 +-- End Correlated Criteria + +UNION ALL +-- Begin Correlated Criteria +SELECT 1 as index_id, p.person_id, p.event_id +FROM qualified_events P +INNER JOIN +( + -- Begin Drug Exposure Criteria +select C.person_id, C.drug_exposure_id as event_id, C.drug_exposure_start_date as start_date, + COALESCE(C.DRUG_EXPOSURE_END_DATE, (DRUG_EXPOSURE_START_DATE + C.DAYS_SUPPLY*INTERVAL'1 day'), (C.DRUG_EXPOSURE_START_DATE + 1*INTERVAL'1 day')) as end_date, + C.drug_concept_id as TARGET_CONCEPT_ID, C.visit_occurrence_id, + C.drug_exposure_start_date as sort_date +from +( + select de.* + FROM cdm.DRUG_EXPOSURE de +JOIN Codesets codesets on ((de.drug_concept_id = codesets.concept_id and codesets.codeset_id = 0)) +) C + + +-- End Drug Exposure Criteria + +) A on A.person_id = P.person_id AND A.START_DATE >= P.OP_START_DATE AND A.START_DATE <= P.OP_END_DATE AND A.START_DATE >= (P.START_DATE + -30*INTERVAL'1 day') AND A.START_DATE <= (P.START_DATE + 30*INTERVAL'1 day') +GROUP BY p.person_id, p.event_id +HAVING COUNT(A.TARGET_CONCEPT_ID) >= 1 +-- End Correlated Criteria + + ) CQ on E.person_id = CQ.person_id and E.event_id = CQ.event_id + GROUP BY E.person_id, E.event_id + HAVING COUNT(index_id) > 0 +) G +-- End Criteria Group + + ) CQ on E.person_id = CQ.person_id and E.event_id = CQ.event_id + GROUP BY E.person_id, E.event_id + HAVING COUNT(index_id) = 2 +) G +-- End Criteria Group +) AC on AC.person_id = pe.person_id AND AC.event_id = pe.event_id +) Results +; +ANALYZE Inclusion_13 +; + +CREATE TEMP TABLE inclusion_events + +AS +SELECT +inclusion_rule_id, person_id, event_id + +FROM +(select inclusion_rule_id, person_id, event_id from Inclusion_0 +UNION ALL +select inclusion_rule_id, person_id, event_id from Inclusion_1 +UNION ALL +select inclusion_rule_id, person_id, event_id from Inclusion_2 +UNION ALL +select inclusion_rule_id, person_id, event_id from Inclusion_3 +UNION ALL +select inclusion_rule_id, person_id, event_id from Inclusion_4 +UNION ALL +select inclusion_rule_id, person_id, event_id from Inclusion_5 +UNION ALL +select inclusion_rule_id, person_id, event_id from Inclusion_6 +UNION ALL +select inclusion_rule_id, person_id, event_id from Inclusion_7 +UNION ALL +select inclusion_rule_id, person_id, event_id from Inclusion_8 +UNION ALL +select inclusion_rule_id, person_id, event_id from Inclusion_9 +UNION ALL +select inclusion_rule_id, person_id, event_id from Inclusion_10 +UNION ALL +select inclusion_rule_id, person_id, event_id from Inclusion_11 +UNION ALL +select inclusion_rule_id, person_id, event_id from Inclusion_12 +UNION ALL +select inclusion_rule_id, person_id, event_id from Inclusion_13) I; +ANALYZE inclusion_events +; +TRUNCATE TABLE Inclusion_0; +DROP TABLE Inclusion_0; + +TRUNCATE TABLE Inclusion_1; +DROP TABLE Inclusion_1; + +TRUNCATE TABLE Inclusion_2; +DROP TABLE Inclusion_2; + +TRUNCATE TABLE Inclusion_3; +DROP TABLE Inclusion_3; + +TRUNCATE TABLE Inclusion_4; +DROP TABLE Inclusion_4; + +TRUNCATE TABLE Inclusion_5; +DROP TABLE Inclusion_5; + +TRUNCATE TABLE Inclusion_6; +DROP TABLE Inclusion_6; + +TRUNCATE TABLE Inclusion_7; +DROP TABLE Inclusion_7; + +TRUNCATE TABLE Inclusion_8; +DROP TABLE Inclusion_8; + +TRUNCATE TABLE Inclusion_9; +DROP TABLE Inclusion_9; + +TRUNCATE TABLE Inclusion_10; +DROP TABLE Inclusion_10; + +TRUNCATE TABLE Inclusion_11; +DROP TABLE Inclusion_11; + +TRUNCATE TABLE Inclusion_12; +DROP TABLE Inclusion_12; + +TRUNCATE TABLE Inclusion_13; +DROP TABLE Inclusion_13; + + +CREATE TEMP TABLE included_events + +AS +WITH cteIncludedEvents(event_id, person_id, start_date, end_date, op_start_date, op_end_date, ordinal) AS ( + SELECT event_id, person_id, start_date, end_date, op_start_date, op_end_date, row_number() over (partition by person_id order by start_date ASC) as ordinal + from + ( + select Q.event_id, Q.person_id, Q.start_date, Q.end_date, Q.op_start_date, Q.op_end_date, SUM(coalesce(POWER(cast(2 as bigint), I.inclusion_rule_id), 0)) as inclusion_rule_mask + from qualified_events Q + LEFT JOIN inclusion_events I on I.person_id = Q.person_id and I.event_id = Q.event_id + GROUP BY Q.event_id, Q.person_id, Q.start_date, Q.end_date, Q.op_start_date, Q.op_end_date + ) MG -- matching groups + + -- the matching group with all bits set ( POWER(2,# of inclusion rules) - 1 = inclusion_rule_mask + WHERE (MG.inclusion_rule_mask = POWER(cast(2 as bigint),14)-1) + +) + SELECT +event_id, person_id, start_date, end_date, op_start_date, op_end_date + +FROM +cteIncludedEvents Results +WHERE Results.ordinal = 1 +; +ANALYZE included_events +; + + + +-- generate cohort periods into #final_cohort +CREATE TEMP TABLE cohort_rows + +AS +WITH cohort_ends (event_id, person_id, end_date) AS ( + -- cohort exit dates + -- By default, cohort exit at the event's op end date +select event_id, person_id, op_end_date as end_date from included_events +), +first_ends (person_id, start_date, end_date) as +( + select F.person_id, F.start_date, F.end_date + FROM ( + select I.event_id, I.person_id, I.start_date, E.end_date, row_number() over (partition by I.person_id, I.event_id order by E.end_date) as ordinal + from included_events I + join cohort_ends E on I.event_id = E.event_id and I.person_id = E.person_id and E.end_date >= I.start_date + ) F + WHERE F.ordinal = 1 +) + SELECT +person_id, start_date, end_date + +FROM +first_ends; +ANALYZE cohort_rows +; + +CREATE TEMP TABLE final_cohort + +AS +WITH cteEndDates (person_id, end_date) AS ( + SELECT + person_id + , (event_date + -1 * 0*INTERVAL'1 day') as end_date + FROM + ( + SELECT + person_id + , event_date + , event_type + , MAX(start_ordinal) OVER (PARTITION BY person_id ORDER BY event_date, event_type ROWS UNBOUNDED PRECEDING) AS start_ordinal + , ROW_NUMBER() OVER (PARTITION BY person_id ORDER BY event_date, event_type) AS overall_ord + FROM + ( + SELECT + person_id + , start_date AS event_date + , -1 AS event_type + , ROW_NUMBER() OVER (PARTITION BY person_id ORDER BY start_date) AS start_ordinal + FROM cohort_rows + + UNION ALL + + + SELECT + person_id + , (end_date + 0*INTERVAL'1 day') as end_date + , 1 AS event_type + , NULL + FROM cohort_rows + ) RAWDATA + ) e + WHERE (2 * e.start_ordinal) - e.overall_ord = 0 +), +cteEnds (person_id, start_date, end_date) AS +( + SELECT + c.person_id + , c.start_date + , MIN(e.end_date) AS end_date + FROM cohort_rows c + JOIN cteEndDates e ON c.person_id = e.person_id AND e.end_date >= c.start_date + GROUP BY c.person_id, c.start_date +) + SELECT +person_id, min(start_date) as start_date, end_date + +FROM +cteEnds +group by person_id, end_date +; +ANALYZE final_cohort +; + +DELETE FROM allCriteriaTest.cohort where cohort_definition_id = 1; +INSERT INTO allCriteriaTest.cohort (cohort_definition_id, subject_id, cohort_start_date, cohort_end_date) +select 1 as cohort_definition_id, person_id, start_date, end_date +FROM final_cohort CO +; + + +-- Find the event that is the 'best match' per person. +-- the 'best match' is defined as the event that satisfies the most inclusion rules. +-- ties are solved by choosing the event that matches the earliest inclusion rule, and then earliest. + +CREATE TEMP TABLE best_events + +AS +SELECT +q.person_id, q.event_id + +FROM +qualified_events Q +join ( + SELECT R.person_id, R.event_id, ROW_NUMBER() OVER (PARTITION BY R.person_id ORDER BY R.rule_count DESC,R.min_rule_id ASC, R.start_date ASC) AS rank_value + FROM ( + SELECT Q.person_id, Q.event_id, COALESCE(COUNT(DISTINCT I.inclusion_rule_id), 0) AS rule_count, COALESCE(MIN(I.inclusion_rule_id), 0) AS min_rule_id, Q.start_date + FROM qualified_events Q + LEFT JOIN inclusion_events I ON q.person_id = i.person_id AND q.event_id = i.event_id + GROUP BY Q.person_id, Q.event_id, Q.start_date + ) R +) ranked on Q.person_id = ranked.person_id and Q.event_id = ranked.event_id +WHERE ranked.rank_value = 1 +; +ANALYZE best_events +; + +-- modes of generation: (the same tables store the results for the different modes, identified by the mode_id column) +-- 0: all events +-- 1: best event + + +-- BEGIN: Inclusion Impact Analysis - event +-- calculte matching group counts +delete from allCriteriaTest.cohort_inclusion_result where cohort_definition_id = 1 and mode_id = 0; +insert into allCriteriaTest.cohort_inclusion_result (cohort_definition_id, inclusion_rule_mask, person_count, mode_id) +select 1 as cohort_definition_id, inclusion_rule_mask, COUNT(*) as person_count, 0 as mode_id +from +( + select Q.person_id, Q.event_id, CAST(SUM(coalesce(POWER(cast(2 as bigint), I.inclusion_rule_id), 0)) AS bigint) as inclusion_rule_mask + from qualified_events Q + LEFT JOIN inclusion_events I on q.person_id = i.person_id and q.event_id = i.event_id + GROUP BY Q.person_id, Q.event_id +) MG -- matching groups +group by inclusion_rule_mask +; + +-- calculate gain counts +delete from allCriteriaTest.cohort_inclusion_stats where cohort_definition_id = 1 and mode_id = 0; +insert into allCriteriaTest.cohort_inclusion_stats (cohort_definition_id, rule_sequence, person_count, gain_count, person_total, mode_id) +select ir.cohort_definition_id, ir.rule_sequence, coalesce(T.person_count, 0) as person_count, coalesce(SR.person_count, 0) gain_count, EventTotal.total, 0 as mode_id +from allCriteriaTest.cohort_inclusion ir +left join +( + select i.inclusion_rule_id, COUNT(i.event_id) as person_count + from qualified_events Q + JOIN inclusion_events i on Q.person_id = I.person_id and Q.event_id = i.event_id + group by i.inclusion_rule_id +) T on ir.rule_sequence = T.inclusion_rule_id +CROSS JOIN (select count(*) as total_rules from allCriteriaTest.cohort_inclusion where cohort_definition_id = 1) RuleTotal +CROSS JOIN (select COUNT(event_id) as total from qualified_events) EventTotal +LEFT JOIN allCriteriaTest.cohort_inclusion_result SR on SR.mode_id = 0 AND SR.cohort_definition_id = 1 AND (POWER(cast(2 as bigint),RuleTotal.total_rules) - POWER(cast(2 as bigint),ir.rule_sequence) - 1) = SR.inclusion_rule_mask -- POWER(2,rule count) - POWER(2,rule sequence) - 1 is the mask for 'all except this rule' +WHERE ir.cohort_definition_id = 1 +; + +-- calculate totals +delete from allCriteriaTest.cohort_summary_stats where cohort_definition_id = 1 and mode_id = 0; +insert into allCriteriaTest.cohort_summary_stats (cohort_definition_id, base_count, final_count, mode_id) +select 1 as cohort_definition_id, PC.total as person_count, coalesce(FC.total, 0) as final_count, 0 as mode_id +FROM +(select COUNT(event_id) as total from qualified_events) PC, +(select sum(sr.person_count) as total + from allCriteriaTest.cohort_inclusion_result sr + CROSS JOIN (select count(*) as total_rules from allCriteriaTest.cohort_inclusion where cohort_definition_id = 1) RuleTotal + where sr.mode_id = 0 and sr.cohort_definition_id = 1 and sr.inclusion_rule_mask = POWER(cast(2 as bigint),RuleTotal.total_rules)-1 +) FC +; + +-- END: Inclusion Impact Analysis - event + +-- BEGIN: Inclusion Impact Analysis - person +-- calculte matching group counts +delete from allCriteriaTest.cohort_inclusion_result where cohort_definition_id = 1 and mode_id = 1; +insert into allCriteriaTest.cohort_inclusion_result (cohort_definition_id, inclusion_rule_mask, person_count, mode_id) +select 1 as cohort_definition_id, inclusion_rule_mask, COUNT(*) as person_count, 1 as mode_id +from +( + select Q.person_id, Q.event_id, CAST(SUM(coalesce(POWER(cast(2 as bigint), I.inclusion_rule_id), 0)) AS bigint) as inclusion_rule_mask + from best_events Q + LEFT JOIN inclusion_events I on q.person_id = i.person_id and q.event_id = i.event_id + GROUP BY Q.person_id, Q.event_id +) MG -- matching groups +group by inclusion_rule_mask +; + +-- calculate gain counts +delete from allCriteriaTest.cohort_inclusion_stats where cohort_definition_id = 1 and mode_id = 1; +insert into allCriteriaTest.cohort_inclusion_stats (cohort_definition_id, rule_sequence, person_count, gain_count, person_total, mode_id) +select ir.cohort_definition_id, ir.rule_sequence, coalesce(T.person_count, 0) as person_count, coalesce(SR.person_count, 0) gain_count, EventTotal.total, 1 as mode_id +from allCriteriaTest.cohort_inclusion ir +left join +( + select i.inclusion_rule_id, COUNT(i.event_id) as person_count + from best_events Q + JOIN inclusion_events i on Q.person_id = I.person_id and Q.event_id = i.event_id + group by i.inclusion_rule_id +) T on ir.rule_sequence = T.inclusion_rule_id +CROSS JOIN (select count(*) as total_rules from allCriteriaTest.cohort_inclusion where cohort_definition_id = 1) RuleTotal +CROSS JOIN (select COUNT(event_id) as total from best_events) EventTotal +LEFT JOIN allCriteriaTest.cohort_inclusion_result SR on SR.mode_id = 1 AND SR.cohort_definition_id = 1 AND (POWER(cast(2 as bigint),RuleTotal.total_rules) - POWER(cast(2 as bigint),ir.rule_sequence) - 1) = SR.inclusion_rule_mask -- POWER(2,rule count) - POWER(2,rule sequence) - 1 is the mask for 'all except this rule' +WHERE ir.cohort_definition_id = 1 +; + +-- calculate totals +delete from allCriteriaTest.cohort_summary_stats where cohort_definition_id = 1 and mode_id = 1; +insert into allCriteriaTest.cohort_summary_stats (cohort_definition_id, base_count, final_count, mode_id) +select 1 as cohort_definition_id, PC.total as person_count, coalesce(FC.total, 0) as final_count, 1 as mode_id +FROM +(select COUNT(event_id) as total from best_events) PC, +(select sum(sr.person_count) as total + from allCriteriaTest.cohort_inclusion_result sr + CROSS JOIN (select count(*) as total_rules from allCriteriaTest.cohort_inclusion where cohort_definition_id = 1) RuleTotal + where sr.mode_id = 1 and sr.cohort_definition_id = 1 and sr.inclusion_rule_mask = POWER(cast(2 as bigint),RuleTotal.total_rules)-1 +) FC +; + +-- END: Inclusion Impact Analysis - person + +-- BEGIN: Censored Stats + +-- END: Censored Stats + +TRUNCATE TABLE best_events; +DROP TABLE best_events; + + + + + +TRUNCATE TABLE cohort_rows; +DROP TABLE cohort_rows; + +TRUNCATE TABLE final_cohort; +DROP TABLE final_cohort; + +TRUNCATE TABLE inclusion_events; +DROP TABLE inclusion_events; + +TRUNCATE TABLE qualified_events; +DROP TABLE qualified_events; + +TRUNCATE TABLE included_events; +DROP TABLE included_events; + +TRUNCATE TABLE Codesets; +DROP TABLE Codesets; diff --git a/~/cohort_sql.sql b/~/cohort_sql.sql new file mode 100644 index 00000000..a5dd3819 --- /dev/null +++ b/~/cohort_sql.sql @@ -0,0 +1,2620 @@ +CREATE TEMP TABLE Codesets (codeset_id int NOT NULL, + concept_id bigint NOT NULL +) +; + +INSERT INTO Codesets (codeset_id, concept_id) +SELECT 0 as codeset_id, c.concept_id FROM (select distinct I.concept_id FROM +( + select concept_id from cdm.CONCEPT where 0=1 +) I +) C +; + +CREATE TEMP TABLE qualified_events + +AS +WITH primary_events (event_id, person_id, start_date, end_date, op_start_date, op_end_date, visit_occurrence_id) AS ( +-- Begin Primary Events +select P.ordinal as event_id, P.person_id, P.start_date, P.end_date, op_start_date, op_end_date, cast(P.visit_occurrence_id as bigint) as visit_occurrence_id +FROM +( + select E.person_id, E.start_date, E.end_date, + row_number() OVER (PARTITION BY E.person_id ORDER BY E.sort_date ASC) ordinal, + OP.observation_period_start_date as op_start_date, OP.observation_period_end_date as op_end_date, cast(E.visit_occurrence_id as bigint) as visit_occurrence_id + FROM + ( + select PE.person_id, PE.event_id, PE.start_date, PE.end_date, PE.target_concept_id, PE.visit_occurrence_id, PE.sort_date FROM ( +-- Begin Observation Period Criteria +select C.person_id, C.observation_period_id as event_id, TO_DATE(TO_CHAR(1900,'0000')||'-'||TO_CHAR(1,'00')||'-'||TO_CHAR(1,'00'), 'YYYY-MM-DD') as start_date, TO_DATE(TO_CHAR(2060,'0000')||'-'||TO_CHAR(1,'00')||'-'||TO_CHAR(1,'00'), 'YYYY-MM-DD') as end_date, + C.period_type_concept_id as TARGET_CONCEPT_ID, CAST(NULL as bigint) as visit_occurrence_id, + C.observation_period_start_date as sort_date + +from +( + select op.*, row_number() over (PARTITION BY op.person_id ORDER BY op.observation_period_start_date) as ordinal + FROM cdm.OBSERVATION_PERIOD op +) C +JOIN cdm.PERSON P on C.person_id = P.person_id +WHERE C.ordinal = 1 +AND C.OBSERVATION_PERIOD_START_DATE <= TO_DATE(TO_CHAR(1900,'0000')||'-'||TO_CHAR(1,'00')||'-'||TO_CHAR(1,'00'), 'YYYY-MM-DD') and C.OBSERVATION_PERIOD_END_DATE >= TO_DATE(TO_CHAR(1900,'0000')||'-'||TO_CHAR(1,'00')||'-'||TO_CHAR(1,'00'), 'YYYY-MM-DD') +AND C.OBSERVATION_PERIOD_START_DATE <= TO_DATE(TO_CHAR(2060,'0000')||'-'||TO_CHAR(1,'00')||'-'||TO_CHAR(1,'00'), 'YYYY-MM-DD') and C.OBSERVATION_PERIOD_END_DATE >= TO_DATE(TO_CHAR(2060,'0000')||'-'||TO_CHAR(1,'00')||'-'||TO_CHAR(1,'00'), 'YYYY-MM-DD') +AND (C.observation_period_end_date >= TO_DATE(TO_CHAR(2099,'0000')||'-'||TO_CHAR(1,'00')||'-'||TO_CHAR(1,'00'), 'YYYY-MM-DD') and C.observation_period_end_date <= TO_DATE(TO_CHAR(2999,'0000')||'-'||TO_CHAR(1,'00')||'-'||TO_CHAR(1,'00'), 'YYYY-MM-DD')) +AND C.period_type_concept_id in (44814725,44787739) +AND ((CAST(C.observation_period_end_date AS DATE) - CAST(C.observation_period_start_date AS DATE)) >= 0 and (CAST(C.observation_period_end_date AS DATE) - CAST(C.observation_period_start_date AS DATE)) <= 999) +AND (EXTRACT(YEAR FROM C.observation_period_start_date) - P.year_of_birth >= 0 and EXTRACT(YEAR FROM C.observation_period_start_date) - P.year_of_birth <= 99) +AND (EXTRACT(YEAR FROM C.observation_period_end_date) - P.year_of_birth >= 0 and EXTRACT(YEAR FROM C.observation_period_end_date) - P.year_of_birth <= 99) +-- End Observation Period Criteria + +) PE +JOIN ( +-- Begin Criteria Group +select 0 as index_id, person_id, event_id +FROM +( + select E.person_id, E.event_id + FROM (SELECT Q.person_id, Q.event_id, Q.start_date, Q.end_date, Q.visit_occurrence_id, OP.observation_period_start_date as op_start_date, OP.observation_period_end_date as op_end_date +FROM (-- Begin Observation Period Criteria +select C.person_id, C.observation_period_id as event_id, TO_DATE(TO_CHAR(1900,'0000')||'-'||TO_CHAR(1,'00')||'-'||TO_CHAR(1,'00'), 'YYYY-MM-DD') as start_date, TO_DATE(TO_CHAR(2060,'0000')||'-'||TO_CHAR(1,'00')||'-'||TO_CHAR(1,'00'), 'YYYY-MM-DD') as end_date, + C.period_type_concept_id as TARGET_CONCEPT_ID, CAST(NULL as bigint) as visit_occurrence_id, + C.observation_period_start_date as sort_date + +from +( + select op.*, row_number() over (PARTITION BY op.person_id ORDER BY op.observation_period_start_date) as ordinal + FROM cdm.OBSERVATION_PERIOD op +) C +JOIN cdm.PERSON P on C.person_id = P.person_id +WHERE C.ordinal = 1 +AND C.OBSERVATION_PERIOD_START_DATE <= TO_DATE(TO_CHAR(1900,'0000')||'-'||TO_CHAR(1,'00')||'-'||TO_CHAR(1,'00'), 'YYYY-MM-DD') and C.OBSERVATION_PERIOD_END_DATE >= TO_DATE(TO_CHAR(1900,'0000')||'-'||TO_CHAR(1,'00')||'-'||TO_CHAR(1,'00'), 'YYYY-MM-DD') +AND C.OBSERVATION_PERIOD_START_DATE <= TO_DATE(TO_CHAR(2060,'0000')||'-'||TO_CHAR(1,'00')||'-'||TO_CHAR(1,'00'), 'YYYY-MM-DD') and C.OBSERVATION_PERIOD_END_DATE >= TO_DATE(TO_CHAR(2060,'0000')||'-'||TO_CHAR(1,'00')||'-'||TO_CHAR(1,'00'), 'YYYY-MM-DD') +AND (C.observation_period_end_date >= TO_DATE(TO_CHAR(2099,'0000')||'-'||TO_CHAR(1,'00')||'-'||TO_CHAR(1,'00'), 'YYYY-MM-DD') and C.observation_period_end_date <= TO_DATE(TO_CHAR(2999,'0000')||'-'||TO_CHAR(1,'00')||'-'||TO_CHAR(1,'00'), 'YYYY-MM-DD')) +AND C.period_type_concept_id in (44814725,44787739) +AND ((CAST(C.observation_period_end_date AS DATE) - CAST(C.observation_period_start_date AS DATE)) >= 0 and (CAST(C.observation_period_end_date AS DATE) - CAST(C.observation_period_start_date AS DATE)) <= 999) +AND (EXTRACT(YEAR FROM C.observation_period_start_date) - P.year_of_birth >= 0 and EXTRACT(YEAR FROM C.observation_period_start_date) - P.year_of_birth <= 99) +AND (EXTRACT(YEAR FROM C.observation_period_end_date) - P.year_of_birth >= 0 and EXTRACT(YEAR FROM C.observation_period_end_date) - P.year_of_birth <= 99) +-- End Observation Period Criteria +) Q +JOIN cdm.OBSERVATION_PERIOD OP on Q.person_id = OP.person_id + and OP.observation_period_start_date <= Q.start_date and OP.observation_period_end_date >= Q.start_date +) E + INNER JOIN + ( + -- Begin Correlated Criteria +SELECT 0 as index_id, p.person_id, p.event_id +FROM (SELECT Q.person_id, Q.event_id, Q.start_date, Q.end_date, Q.visit_occurrence_id, OP.observation_period_start_date as op_start_date, OP.observation_period_end_date as op_end_date +FROM (-- Begin Observation Period Criteria +select C.person_id, C.observation_period_id as event_id, TO_DATE(TO_CHAR(1900,'0000')||'-'||TO_CHAR(1,'00')||'-'||TO_CHAR(1,'00'), 'YYYY-MM-DD') as start_date, TO_DATE(TO_CHAR(2060,'0000')||'-'||TO_CHAR(1,'00')||'-'||TO_CHAR(1,'00'), 'YYYY-MM-DD') as end_date, + C.period_type_concept_id as TARGET_CONCEPT_ID, CAST(NULL as bigint) as visit_occurrence_id, + C.observation_period_start_date as sort_date + +from +( + select op.*, row_number() over (PARTITION BY op.person_id ORDER BY op.observation_period_start_date) as ordinal + FROM cdm.OBSERVATION_PERIOD op +) C +JOIN cdm.PERSON P on C.person_id = P.person_id +WHERE C.ordinal = 1 +AND C.OBSERVATION_PERIOD_START_DATE <= TO_DATE(TO_CHAR(1900,'0000')||'-'||TO_CHAR(1,'00')||'-'||TO_CHAR(1,'00'), 'YYYY-MM-DD') and C.OBSERVATION_PERIOD_END_DATE >= TO_DATE(TO_CHAR(1900,'0000')||'-'||TO_CHAR(1,'00')||'-'||TO_CHAR(1,'00'), 'YYYY-MM-DD') +AND C.OBSERVATION_PERIOD_START_DATE <= TO_DATE(TO_CHAR(2060,'0000')||'-'||TO_CHAR(1,'00')||'-'||TO_CHAR(1,'00'), 'YYYY-MM-DD') and C.OBSERVATION_PERIOD_END_DATE >= TO_DATE(TO_CHAR(2060,'0000')||'-'||TO_CHAR(1,'00')||'-'||TO_CHAR(1,'00'), 'YYYY-MM-DD') +AND (C.observation_period_end_date >= TO_DATE(TO_CHAR(2099,'0000')||'-'||TO_CHAR(1,'00')||'-'||TO_CHAR(1,'00'), 'YYYY-MM-DD') and C.observation_period_end_date <= TO_DATE(TO_CHAR(2999,'0000')||'-'||TO_CHAR(1,'00')||'-'||TO_CHAR(1,'00'), 'YYYY-MM-DD')) +AND C.period_type_concept_id in (44814725,44787739) +AND ((CAST(C.observation_period_end_date AS DATE) - CAST(C.observation_period_start_date AS DATE)) >= 0 and (CAST(C.observation_period_end_date AS DATE) - CAST(C.observation_period_start_date AS DATE)) <= 999) +AND (EXTRACT(YEAR FROM C.observation_period_start_date) - P.year_of_birth >= 0 and EXTRACT(YEAR FROM C.observation_period_start_date) - P.year_of_birth <= 99) +AND (EXTRACT(YEAR FROM C.observation_period_end_date) - P.year_of_birth >= 0 and EXTRACT(YEAR FROM C.observation_period_end_date) - P.year_of_birth <= 99) +-- End Observation Period Criteria +) Q +JOIN cdm.OBSERVATION_PERIOD OP on Q.person_id = OP.person_id + and OP.observation_period_start_date <= Q.start_date and OP.observation_period_end_date >= Q.start_date +) P +INNER JOIN +( + -- Begin Condition Occurrence Criteria +SELECT C.person_id, C.condition_occurrence_id as event_id, C.condition_start_date as start_date, COALESCE(C.condition_end_date, (C.condition_start_date + 1*INTERVAL'1 day')) as end_date, + C.CONDITION_CONCEPT_ID as TARGET_CONCEPT_ID, C.visit_occurrence_id, + C.condition_start_date as sort_date +FROM +( + SELECT co.* + FROM cdm.CONDITION_OCCURRENCE co + +) C + + +-- End Condition Occurrence Criteria + +) A on A.person_id = P.person_id AND A.visit_occurrence_id = P.visit_occurrence_id +GROUP BY p.person_id, p.event_id +HAVING COUNT(A.TARGET_CONCEPT_ID) >= 1 +-- End Correlated Criteria + + ) CQ on E.person_id = CQ.person_id and E.event_id = CQ.event_id + GROUP BY E.person_id, E.event_id + HAVING COUNT(index_id) = 1 +) G +-- End Criteria Group +) AC on AC.person_id = pe.person_id and AC.event_id = pe.event_id + + ) E + JOIN cdm.observation_period OP on E.person_id = OP.person_id and E.start_date >= OP.observation_period_start_date and E.start_date <= op.observation_period_end_date + WHERE (OP.OBSERVATION_PERIOD_START_DATE + 0*INTERVAL'1 day') <= E.START_DATE AND (E.START_DATE + 0*INTERVAL'1 day') <= OP.OBSERVATION_PERIOD_END_DATE +) P +WHERE P.ordinal = 1 +-- End Primary Events + +) + SELECT +event_id, person_id, start_date, end_date, op_start_date, op_end_date, visit_occurrence_id + +FROM +( + select pe.event_id, pe.person_id, pe.start_date, pe.end_date, pe.op_start_date, pe.op_end_date, row_number() over (partition by pe.person_id order by pe.start_date ASC) as ordinal, cast(pe.visit_occurrence_id as bigint) as visit_occurrence_id + FROM primary_events pe + +) QE + +; +ANALYZE qualified_events +; + +--- Inclusion Rule Inserts + +CREATE TEMP TABLE Inclusion_0 + +AS +SELECT +0 as inclusion_rule_id, person_id, event_id + +FROM +( + select pe.person_id, pe.event_id + FROM qualified_events pe + +JOIN ( +-- Begin Criteria Group +select 0 as index_id, person_id, event_id +FROM +( + select E.person_id, E.event_id + FROM qualified_events E + INNER JOIN + ( + -- Begin Demographic Criteria +SELECT 0 as index_id, e.person_id, e.event_id +FROM qualified_events E +JOIN cdm.PERSON P ON P.PERSON_ID = E.PERSON_ID +WHERE (EXTRACT(YEAR FROM E.start_date) - P.year_of_birth >= 0 and EXTRACT(YEAR FROM E.start_date) - P.year_of_birth <= 99) AND P.gender_concept_id in (8507) AND P.race_concept_id in (8515,38003578) AND P.race_concept_id in (8515,38003578) AND P.ethnicity_concept_id in (38003564) AND (E.start_date >= TO_DATE(TO_CHAR(1900,'0000')||'-'||TO_CHAR(1,'00')||'-'||TO_CHAR(1,'00'), 'YYYY-MM-DD') and E.start_date <= TO_DATE(TO_CHAR(2099,'0000')||'-'||TO_CHAR(1,'00')||'-'||TO_CHAR(1,'00'), 'YYYY-MM-DD')) AND (E.end_date >= TO_DATE(TO_CHAR(1900,'0000')||'-'||TO_CHAR(1,'00')||'-'||TO_CHAR(1,'00'), 'YYYY-MM-DD') and E.end_date <= TO_DATE(TO_CHAR(2099,'0000')||'-'||TO_CHAR(1,'00')||'-'||TO_CHAR(1,'00'), 'YYYY-MM-DD')) +GROUP BY e.person_id, e.event_id +-- End Demographic Criteria + + ) CQ on E.person_id = CQ.person_id and E.event_id = CQ.event_id + GROUP BY E.person_id, E.event_id + HAVING COUNT(index_id) = 1 +) G +-- End Criteria Group +) AC on AC.person_id = pe.person_id AND AC.event_id = pe.event_id +) Results +; +ANALYZE Inclusion_0 +; + +CREATE TEMP TABLE Inclusion_1 + +AS +SELECT +1 as inclusion_rule_id, person_id, event_id + +FROM +( + select pe.person_id, pe.event_id + FROM qualified_events pe + +JOIN ( +-- Begin Criteria Group +select 0 as index_id, person_id, event_id +FROM +( + select E.person_id, E.event_id + FROM qualified_events E + INNER JOIN + ( + -- Begin Correlated Criteria +SELECT 0 as index_id, p.person_id, p.event_id +FROM qualified_events P +INNER JOIN +( + select PE.person_id, PE.event_id, PE.start_date, PE.end_date, PE.target_concept_id, PE.visit_occurrence_id, PE.sort_date FROM ( +-- Begin Condition Occurrence Criteria +SELECT C.person_id, C.condition_occurrence_id as event_id, C.condition_start_date as start_date, COALESCE(C.condition_end_date, (C.condition_start_date + 1*INTERVAL'1 day')) as end_date, + C.CONDITION_CONCEPT_ID as TARGET_CONCEPT_ID, C.visit_occurrence_id, + C.condition_start_date as sort_date +FROM +( + SELECT co.* , row_number() over (PARTITION BY co.person_id ORDER BY co.condition_start_date, co.condition_occurrence_id) as ordinal + FROM cdm.CONDITION_OCCURRENCE co + JOIN Codesets codesets on ((co.condition_concept_id = codesets.concept_id and codesets.codeset_id = 0) AND (co.condition_source_concept_id = codesets.concept_id and codesets.codeset_id = 0)) +) C +JOIN cdm.PERSON P on C.person_id = P.person_id +JOIN cdm.VISIT_OCCURRENCE V on C.visit_occurrence_id = V.visit_occurrence_id and C.person_id = V.person_id +LEFT JOIN cdm.PROVIDER PR on C.provider_id = PR.provider_id +WHERE (C.condition_start_date >= TO_DATE(TO_CHAR(1900,'0000')||'-'||TO_CHAR(1,'00')||'-'||TO_CHAR(1,'00'), 'YYYY-MM-DD') and C.condition_start_date <= TO_DATE(TO_CHAR(2099,'0000')||'-'||TO_CHAR(1,'00')||'-'||TO_CHAR(1,'00'), 'YYYY-MM-DD')) +AND (C.condition_end_date >= TO_DATE(TO_CHAR(1900,'0000')||'-'||TO_CHAR(1,'00')||'-'||TO_CHAR(1,'00'), 'YYYY-MM-DD') and C.condition_end_date <= TO_DATE(TO_CHAR(2099,'0000')||'-'||TO_CHAR(1,'00')||'-'||TO_CHAR(1,'00'), 'YYYY-MM-DD')) +AND C.condition_type_concept_id in (38000199) +AND C.stop_reason like '%this is some test text%' +AND (EXTRACT(YEAR FROM C.condition_start_date) - P.year_of_birth >= 0 and EXTRACT(YEAR FROM C.condition_start_date) - P.year_of_birth <= 99) +AND P.gender_concept_id in (8507) +AND PR.specialty_concept_id in (45444755,45418395) +AND V.visit_concept_id in (9201) +AND C.ordinal = 1 +-- End Condition Occurrence Criteria + +) PE +JOIN ( +-- Begin Criteria Group +select 0 as index_id, person_id, event_id +FROM +( + select E.person_id, E.event_id + FROM (SELECT Q.person_id, Q.event_id, Q.start_date, Q.end_date, Q.visit_occurrence_id, OP.observation_period_start_date as op_start_date, OP.observation_period_end_date as op_end_date +FROM (-- Begin Condition Occurrence Criteria +SELECT C.person_id, C.condition_occurrence_id as event_id, C.condition_start_date as start_date, COALESCE(C.condition_end_date, (C.condition_start_date + 1*INTERVAL'1 day')) as end_date, + C.CONDITION_CONCEPT_ID as TARGET_CONCEPT_ID, C.visit_occurrence_id, + C.condition_start_date as sort_date +FROM +( + SELECT co.* , row_number() over (PARTITION BY co.person_id ORDER BY co.condition_start_date, co.condition_occurrence_id) as ordinal + FROM cdm.CONDITION_OCCURRENCE co + JOIN Codesets codesets on ((co.condition_concept_id = codesets.concept_id and codesets.codeset_id = 0) AND (co.condition_source_concept_id = codesets.concept_id and codesets.codeset_id = 0)) +) C +JOIN cdm.PERSON P on C.person_id = P.person_id +JOIN cdm.VISIT_OCCURRENCE V on C.visit_occurrence_id = V.visit_occurrence_id and C.person_id = V.person_id +LEFT JOIN cdm.PROVIDER PR on C.provider_id = PR.provider_id +WHERE (C.condition_start_date >= TO_DATE(TO_CHAR(1900,'0000')||'-'||TO_CHAR(1,'00')||'-'||TO_CHAR(1,'00'), 'YYYY-MM-DD') and C.condition_start_date <= TO_DATE(TO_CHAR(2099,'0000')||'-'||TO_CHAR(1,'00')||'-'||TO_CHAR(1,'00'), 'YYYY-MM-DD')) +AND (C.condition_end_date >= TO_DATE(TO_CHAR(1900,'0000')||'-'||TO_CHAR(1,'00')||'-'||TO_CHAR(1,'00'), 'YYYY-MM-DD') and C.condition_end_date <= TO_DATE(TO_CHAR(2099,'0000')||'-'||TO_CHAR(1,'00')||'-'||TO_CHAR(1,'00'), 'YYYY-MM-DD')) +AND C.condition_type_concept_id in (38000199) +AND C.stop_reason like '%this is some test text%' +AND (EXTRACT(YEAR FROM C.condition_start_date) - P.year_of_birth >= 0 and EXTRACT(YEAR FROM C.condition_start_date) - P.year_of_birth <= 99) +AND P.gender_concept_id in (8507) +AND PR.specialty_concept_id in (45444755,45418395) +AND V.visit_concept_id in (9201) +AND C.ordinal = 1 +-- End Condition Occurrence Criteria +) Q +JOIN cdm.OBSERVATION_PERIOD OP on Q.person_id = OP.person_id + and OP.observation_period_start_date <= Q.start_date and OP.observation_period_end_date >= Q.start_date +) E + INNER JOIN + ( + -- Begin Correlated Criteria +SELECT 0 as index_id, p.person_id, p.event_id +FROM (SELECT Q.person_id, Q.event_id, Q.start_date, Q.end_date, Q.visit_occurrence_id, OP.observation_period_start_date as op_start_date, OP.observation_period_end_date as op_end_date +FROM (-- Begin Condition Occurrence Criteria +SELECT C.person_id, C.condition_occurrence_id as event_id, C.condition_start_date as start_date, COALESCE(C.condition_end_date, (C.condition_start_date + 1*INTERVAL'1 day')) as end_date, + C.CONDITION_CONCEPT_ID as TARGET_CONCEPT_ID, C.visit_occurrence_id, + C.condition_start_date as sort_date +FROM +( + SELECT co.* , row_number() over (PARTITION BY co.person_id ORDER BY co.condition_start_date, co.condition_occurrence_id) as ordinal + FROM cdm.CONDITION_OCCURRENCE co + JOIN Codesets codesets on ((co.condition_concept_id = codesets.concept_id and codesets.codeset_id = 0) AND (co.condition_source_concept_id = codesets.concept_id and codesets.codeset_id = 0)) +) C +JOIN cdm.PERSON P on C.person_id = P.person_id +JOIN cdm.VISIT_OCCURRENCE V on C.visit_occurrence_id = V.visit_occurrence_id and C.person_id = V.person_id +LEFT JOIN cdm.PROVIDER PR on C.provider_id = PR.provider_id +WHERE (C.condition_start_date >= TO_DATE(TO_CHAR(1900,'0000')||'-'||TO_CHAR(1,'00')||'-'||TO_CHAR(1,'00'), 'YYYY-MM-DD') and C.condition_start_date <= TO_DATE(TO_CHAR(2099,'0000')||'-'||TO_CHAR(1,'00')||'-'||TO_CHAR(1,'00'), 'YYYY-MM-DD')) +AND (C.condition_end_date >= TO_DATE(TO_CHAR(1900,'0000')||'-'||TO_CHAR(1,'00')||'-'||TO_CHAR(1,'00'), 'YYYY-MM-DD') and C.condition_end_date <= TO_DATE(TO_CHAR(2099,'0000')||'-'||TO_CHAR(1,'00')||'-'||TO_CHAR(1,'00'), 'YYYY-MM-DD')) +AND C.condition_type_concept_id in (38000199) +AND C.stop_reason like '%this is some test text%' +AND (EXTRACT(YEAR FROM C.condition_start_date) - P.year_of_birth >= 0 and EXTRACT(YEAR FROM C.condition_start_date) - P.year_of_birth <= 99) +AND P.gender_concept_id in (8507) +AND PR.specialty_concept_id in (45444755,45418395) +AND V.visit_concept_id in (9201) +AND C.ordinal = 1 +-- End Condition Occurrence Criteria +) Q +JOIN cdm.OBSERVATION_PERIOD OP on Q.person_id = OP.person_id + and OP.observation_period_start_date <= Q.start_date and OP.observation_period_end_date >= Q.start_date +) P +INNER JOIN +( + -- Begin Condition Occurrence Criteria +SELECT C.person_id, C.condition_occurrence_id as event_id, C.condition_start_date as start_date, COALESCE(C.condition_end_date, (C.condition_start_date + 1*INTERVAL'1 day')) as end_date, + C.CONDITION_CONCEPT_ID as TARGET_CONCEPT_ID, C.visit_occurrence_id, + C.condition_start_date as sort_date +FROM +( + SELECT co.* + FROM cdm.CONDITION_OCCURRENCE co + +) C + + +-- End Condition Occurrence Criteria + +) A on A.person_id = P.person_id AND A.visit_occurrence_id = P.visit_occurrence_id +GROUP BY p.person_id, p.event_id +HAVING COUNT(A.TARGET_CONCEPT_ID) >= 1 +-- End Correlated Criteria + + ) CQ on E.person_id = CQ.person_id and E.event_id = CQ.event_id + GROUP BY E.person_id, E.event_id + HAVING COUNT(index_id) = 1 +) G +-- End Criteria Group +) AC on AC.person_id = pe.person_id and AC.event_id = pe.event_id + +) A on A.person_id = P.person_id AND A.START_DATE >= P.OP_START_DATE AND A.START_DATE <= P.OP_END_DATE AND A.START_DATE >= (P.START_DATE + -30*INTERVAL'1 day') AND A.START_DATE <= (P.START_DATE + 30*INTERVAL'1 day') +GROUP BY p.person_id, p.event_id +HAVING COUNT(A.TARGET_CONCEPT_ID) >= 1 +-- End Correlated Criteria + + ) CQ on E.person_id = CQ.person_id and E.event_id = CQ.event_id + GROUP BY E.person_id, E.event_id + HAVING COUNT(index_id) = 1 +) G +-- End Criteria Group +) AC on AC.person_id = pe.person_id AND AC.event_id = pe.event_id +) Results +; +ANALYZE Inclusion_1 +; + +CREATE TEMP TABLE Inclusion_2 + +AS +SELECT +2 as inclusion_rule_id, person_id, event_id + +FROM +( + select pe.person_id, pe.event_id + FROM qualified_events pe + +JOIN ( +-- Begin Criteria Group +select 0 as index_id, person_id, event_id +FROM +( + select E.person_id, E.event_id + FROM qualified_events E + INNER JOIN + ( + -- Begin Correlated Criteria +SELECT 0 as index_id, p.person_id, p.event_id +FROM qualified_events P +INNER JOIN +( + select PE.person_id, PE.event_id, PE.start_date, PE.end_date, PE.target_concept_id, PE.visit_occurrence_id, PE.sort_date FROM ( +-- Begin Condition Era Criteria +select C.person_id, C.condition_era_id as event_id, C.condition_era_start_date as start_date, + C.condition_era_end_date as end_date, C.CONDITION_CONCEPT_ID as TARGET_CONCEPT_ID, CAST(NULL as bigint) as visit_occurrence_id, + C.condition_era_start_date as sort_date +from +( + select ce.* , row_number() over (PARTITION BY ce.person_id ORDER BY ce.condition_era_start_date, ce.condition_era_id) as ordinal + FROM cdm.CONDITION_ERA ce +where ce.condition_concept_id in (SELECT concept_id from Codesets where codeset_id = 0) +) C +JOIN cdm.PERSON P on C.person_id = P.person_id +WHERE (C.condition_era_start_date >= TO_DATE(TO_CHAR(1900,'0000')||'-'||TO_CHAR(1,'00')||'-'||TO_CHAR(1,'00'), 'YYYY-MM-DD') and C.condition_era_start_date <= TO_DATE(TO_CHAR(2099,'0000')||'-'||TO_CHAR(1,'00')||'-'||TO_CHAR(1,'00'), 'YYYY-MM-DD')) +AND (C.condition_era_end_date >= TO_DATE(TO_CHAR(1900,'0000')||'-'||TO_CHAR(1,'00')||'-'||TO_CHAR(1,'00'), 'YYYY-MM-DD') and C.condition_era_end_date <= TO_DATE(TO_CHAR(2099,'0000')||'-'||TO_CHAR(1,'00')||'-'||TO_CHAR(1,'00'), 'YYYY-MM-DD')) +AND (C.condition_occurrence_count >= 0 and C.condition_occurrence_count <= 99) +AND ((CAST(C.condition_era_end_date AS DATE) - CAST(C.condition_era_start_date AS DATE)) >= 0 and (CAST(C.condition_era_end_date AS DATE) - CAST(C.condition_era_start_date AS DATE)) <= 99) +AND (EXTRACT(YEAR FROM C.condition_era_start_date) - P.year_of_birth >= 0 and EXTRACT(YEAR FROM C.condition_era_start_date) - P.year_of_birth <= 99) +AND (EXTRACT(YEAR FROM C.condition_era_end_date) - P.year_of_birth >= 0 and EXTRACT(YEAR FROM C.condition_era_end_date) - P.year_of_birth <= 99) +AND P.gender_concept_id in (8507) +AND C.ordinal = 1 +-- End Condition Era Criteria + +) PE +JOIN ( +-- Begin Criteria Group +select 0 as index_id, person_id, event_id +FROM +( + select E.person_id, E.event_id + FROM (SELECT Q.person_id, Q.event_id, Q.start_date, Q.end_date, Q.visit_occurrence_id, OP.observation_period_start_date as op_start_date, OP.observation_period_end_date as op_end_date +FROM (-- Begin Condition Era Criteria +select C.person_id, C.condition_era_id as event_id, C.condition_era_start_date as start_date, + C.condition_era_end_date as end_date, C.CONDITION_CONCEPT_ID as TARGET_CONCEPT_ID, CAST(NULL as bigint) as visit_occurrence_id, + C.condition_era_start_date as sort_date +from +( + select ce.* , row_number() over (PARTITION BY ce.person_id ORDER BY ce.condition_era_start_date, ce.condition_era_id) as ordinal + FROM cdm.CONDITION_ERA ce +where ce.condition_concept_id in (SELECT concept_id from Codesets where codeset_id = 0) +) C +JOIN cdm.PERSON P on C.person_id = P.person_id +WHERE (C.condition_era_start_date >= TO_DATE(TO_CHAR(1900,'0000')||'-'||TO_CHAR(1,'00')||'-'||TO_CHAR(1,'00'), 'YYYY-MM-DD') and C.condition_era_start_date <= TO_DATE(TO_CHAR(2099,'0000')||'-'||TO_CHAR(1,'00')||'-'||TO_CHAR(1,'00'), 'YYYY-MM-DD')) +AND (C.condition_era_end_date >= TO_DATE(TO_CHAR(1900,'0000')||'-'||TO_CHAR(1,'00')||'-'||TO_CHAR(1,'00'), 'YYYY-MM-DD') and C.condition_era_end_date <= TO_DATE(TO_CHAR(2099,'0000')||'-'||TO_CHAR(1,'00')||'-'||TO_CHAR(1,'00'), 'YYYY-MM-DD')) +AND (C.condition_occurrence_count >= 0 and C.condition_occurrence_count <= 99) +AND ((CAST(C.condition_era_end_date AS DATE) - CAST(C.condition_era_start_date AS DATE)) >= 0 and (CAST(C.condition_era_end_date AS DATE) - CAST(C.condition_era_start_date AS DATE)) <= 99) +AND (EXTRACT(YEAR FROM C.condition_era_start_date) - P.year_of_birth >= 0 and EXTRACT(YEAR FROM C.condition_era_start_date) - P.year_of_birth <= 99) +AND (EXTRACT(YEAR FROM C.condition_era_end_date) - P.year_of_birth >= 0 and EXTRACT(YEAR FROM C.condition_era_end_date) - P.year_of_birth <= 99) +AND P.gender_concept_id in (8507) +AND C.ordinal = 1 +-- End Condition Era Criteria +) Q +JOIN cdm.OBSERVATION_PERIOD OP on Q.person_id = OP.person_id + and OP.observation_period_start_date <= Q.start_date and OP.observation_period_end_date >= Q.start_date +) E + INNER JOIN + ( + -- Begin Correlated Criteria +SELECT 0 as index_id, p.person_id, p.event_id +FROM (SELECT Q.person_id, Q.event_id, Q.start_date, Q.end_date, Q.visit_occurrence_id, OP.observation_period_start_date as op_start_date, OP.observation_period_end_date as op_end_date +FROM (-- Begin Condition Era Criteria +select C.person_id, C.condition_era_id as event_id, C.condition_era_start_date as start_date, + C.condition_era_end_date as end_date, C.CONDITION_CONCEPT_ID as TARGET_CONCEPT_ID, CAST(NULL as bigint) as visit_occurrence_id, + C.condition_era_start_date as sort_date +from +( + select ce.* , row_number() over (PARTITION BY ce.person_id ORDER BY ce.condition_era_start_date, ce.condition_era_id) as ordinal + FROM cdm.CONDITION_ERA ce +where ce.condition_concept_id in (SELECT concept_id from Codesets where codeset_id = 0) +) C +JOIN cdm.PERSON P on C.person_id = P.person_id +WHERE (C.condition_era_start_date >= TO_DATE(TO_CHAR(1900,'0000')||'-'||TO_CHAR(1,'00')||'-'||TO_CHAR(1,'00'), 'YYYY-MM-DD') and C.condition_era_start_date <= TO_DATE(TO_CHAR(2099,'0000')||'-'||TO_CHAR(1,'00')||'-'||TO_CHAR(1,'00'), 'YYYY-MM-DD')) +AND (C.condition_era_end_date >= TO_DATE(TO_CHAR(1900,'0000')||'-'||TO_CHAR(1,'00')||'-'||TO_CHAR(1,'00'), 'YYYY-MM-DD') and C.condition_era_end_date <= TO_DATE(TO_CHAR(2099,'0000')||'-'||TO_CHAR(1,'00')||'-'||TO_CHAR(1,'00'), 'YYYY-MM-DD')) +AND (C.condition_occurrence_count >= 0 and C.condition_occurrence_count <= 99) +AND ((CAST(C.condition_era_end_date AS DATE) - CAST(C.condition_era_start_date AS DATE)) >= 0 and (CAST(C.condition_era_end_date AS DATE) - CAST(C.condition_era_start_date AS DATE)) <= 99) +AND (EXTRACT(YEAR FROM C.condition_era_start_date) - P.year_of_birth >= 0 and EXTRACT(YEAR FROM C.condition_era_start_date) - P.year_of_birth <= 99) +AND (EXTRACT(YEAR FROM C.condition_era_end_date) - P.year_of_birth >= 0 and EXTRACT(YEAR FROM C.condition_era_end_date) - P.year_of_birth <= 99) +AND P.gender_concept_id in (8507) +AND C.ordinal = 1 +-- End Condition Era Criteria +) Q +JOIN cdm.OBSERVATION_PERIOD OP on Q.person_id = OP.person_id + and OP.observation_period_start_date <= Q.start_date and OP.observation_period_end_date >= Q.start_date +) P +INNER JOIN +( + -- Begin Condition Era Criteria +select C.person_id, C.condition_era_id as event_id, C.condition_era_start_date as start_date, + C.condition_era_end_date as end_date, C.CONDITION_CONCEPT_ID as TARGET_CONCEPT_ID, CAST(NULL as bigint) as visit_occurrence_id, + C.condition_era_start_date as sort_date +from +( + select ce.* + FROM cdm.CONDITION_ERA ce + +) C + + +-- End Condition Era Criteria + +) A on A.person_id = P.person_id +GROUP BY p.person_id, p.event_id +HAVING COUNT(A.TARGET_CONCEPT_ID) >= 1 +-- End Correlated Criteria + + ) CQ on E.person_id = CQ.person_id and E.event_id = CQ.event_id + GROUP BY E.person_id, E.event_id + HAVING COUNT(index_id) = 1 +) G +-- End Criteria Group +) AC on AC.person_id = pe.person_id and AC.event_id = pe.event_id + +) A on A.person_id = P.person_id AND A.START_DATE >= P.OP_START_DATE AND A.START_DATE <= P.OP_END_DATE AND A.START_DATE >= (P.START_DATE + -30*INTERVAL'1 day') AND A.START_DATE <= (P.START_DATE + 30*INTERVAL'1 day') +GROUP BY p.person_id, p.event_id +HAVING COUNT(A.TARGET_CONCEPT_ID) >= 1 +-- End Correlated Criteria + + ) CQ on E.person_id = CQ.person_id and E.event_id = CQ.event_id + GROUP BY E.person_id, E.event_id + HAVING COUNT(index_id) = 1 +) G +-- End Criteria Group +) AC on AC.person_id = pe.person_id AND AC.event_id = pe.event_id +) Results +; +ANALYZE Inclusion_2 +; + +CREATE TEMP TABLE Inclusion_3 + +AS +SELECT +3 as inclusion_rule_id, person_id, event_id + +FROM +( + select pe.person_id, pe.event_id + FROM qualified_events pe + +JOIN ( +-- Begin Criteria Group +select 0 as index_id, person_id, event_id +FROM +( + select E.person_id, E.event_id + FROM qualified_events E + INNER JOIN + ( + -- Begin Correlated Criteria +SELECT 0 as index_id, p.person_id, p.event_id +FROM qualified_events P +INNER JOIN +( + select PE.person_id, PE.event_id, PE.start_date, PE.end_date, PE.target_concept_id, PE.visit_occurrence_id, PE.sort_date FROM ( +-- Begin Death Criteria +select C.person_id, C.person_id as event_id, C.death_date as start_date, (C.death_date + 1*INTERVAL'1 day') as end_date, + coalesce(C.cause_concept_id,0) as TARGET_CONCEPT_ID, CAST(NULL as bigint) as visit_occurrence_id, + C.death_date as sort_date +from +( + select d.* + FROM cdm.DEATH d +JOIN Codesets codesets on ((d.cause_concept_id = codesets.concept_id and codesets.codeset_id = 0)) +) C +JOIN cdm.PERSON P on C.person_id = P.person_id +WHERE (C.death_date >= TO_DATE(TO_CHAR(1900,'0000')||'-'||TO_CHAR(1,'00')||'-'||TO_CHAR(1,'00'), 'YYYY-MM-DD') and C.death_date <= TO_DATE(TO_CHAR(2099,'0000')||'-'||TO_CHAR(1,'00')||'-'||TO_CHAR(1,'00'), 'YYYY-MM-DD')) +AND C.death_type_concept_id in (256,255,254) +AND (EXTRACT(YEAR FROM C.death_date) - P.year_of_birth >= 0 and EXTRACT(YEAR FROM C.death_date) - P.year_of_birth <= 99) +AND P.gender_concept_id in (8532,8507) +-- End Death Criteria + + +) PE +JOIN ( +-- Begin Criteria Group +select 0 as index_id, person_id, event_id +FROM +( + select E.person_id, E.event_id + FROM (SELECT Q.person_id, Q.event_id, Q.start_date, Q.end_date, Q.visit_occurrence_id, OP.observation_period_start_date as op_start_date, OP.observation_period_end_date as op_end_date +FROM (-- Begin Death Criteria +select C.person_id, C.person_id as event_id, C.death_date as start_date, (C.death_date + 1*INTERVAL'1 day') as end_date, + coalesce(C.cause_concept_id,0) as TARGET_CONCEPT_ID, CAST(NULL as bigint) as visit_occurrence_id, + C.death_date as sort_date +from +( + select d.* + FROM cdm.DEATH d +JOIN Codesets codesets on ((d.cause_concept_id = codesets.concept_id and codesets.codeset_id = 0)) +) C +JOIN cdm.PERSON P on C.person_id = P.person_id +WHERE (C.death_date >= TO_DATE(TO_CHAR(1900,'0000')||'-'||TO_CHAR(1,'00')||'-'||TO_CHAR(1,'00'), 'YYYY-MM-DD') and C.death_date <= TO_DATE(TO_CHAR(2099,'0000')||'-'||TO_CHAR(1,'00')||'-'||TO_CHAR(1,'00'), 'YYYY-MM-DD')) +AND C.death_type_concept_id in (256,255,254) +AND (EXTRACT(YEAR FROM C.death_date) - P.year_of_birth >= 0 and EXTRACT(YEAR FROM C.death_date) - P.year_of_birth <= 99) +AND P.gender_concept_id in (8532,8507) +-- End Death Criteria + +) Q +JOIN cdm.OBSERVATION_PERIOD OP on Q.person_id = OP.person_id + and OP.observation_period_start_date <= Q.start_date and OP.observation_period_end_date >= Q.start_date +) E + INNER JOIN + ( + -- Begin Correlated Criteria +SELECT 0 as index_id, p.person_id, p.event_id +FROM (SELECT Q.person_id, Q.event_id, Q.start_date, Q.end_date, Q.visit_occurrence_id, OP.observation_period_start_date as op_start_date, OP.observation_period_end_date as op_end_date +FROM (-- Begin Death Criteria +select C.person_id, C.person_id as event_id, C.death_date as start_date, (C.death_date + 1*INTERVAL'1 day') as end_date, + coalesce(C.cause_concept_id,0) as TARGET_CONCEPT_ID, CAST(NULL as bigint) as visit_occurrence_id, + C.death_date as sort_date +from +( + select d.* + FROM cdm.DEATH d +JOIN Codesets codesets on ((d.cause_concept_id = codesets.concept_id and codesets.codeset_id = 0)) +) C +JOIN cdm.PERSON P on C.person_id = P.person_id +WHERE (C.death_date >= TO_DATE(TO_CHAR(1900,'0000')||'-'||TO_CHAR(1,'00')||'-'||TO_CHAR(1,'00'), 'YYYY-MM-DD') and C.death_date <= TO_DATE(TO_CHAR(2099,'0000')||'-'||TO_CHAR(1,'00')||'-'||TO_CHAR(1,'00'), 'YYYY-MM-DD')) +AND C.death_type_concept_id in (256,255,254) +AND (EXTRACT(YEAR FROM C.death_date) - P.year_of_birth >= 0 and EXTRACT(YEAR FROM C.death_date) - P.year_of_birth <= 99) +AND P.gender_concept_id in (8532,8507) +-- End Death Criteria + +) Q +JOIN cdm.OBSERVATION_PERIOD OP on Q.person_id = OP.person_id + and OP.observation_period_start_date <= Q.start_date and OP.observation_period_end_date >= Q.start_date +) P +INNER JOIN +( + -- Begin Death Criteria +select C.person_id, C.person_id as event_id, C.death_date as start_date, (C.death_date + 1*INTERVAL'1 day') as end_date, + coalesce(C.cause_concept_id,0) as TARGET_CONCEPT_ID, CAST(NULL as bigint) as visit_occurrence_id, + C.death_date as sort_date +from +( + select d.* + FROM cdm.DEATH d +JOIN Codesets codesets on ((d.cause_concept_id = codesets.concept_id and codesets.codeset_id = 0)) +) C + + +-- End Death Criteria + + +) A on A.person_id = P.person_id +GROUP BY p.person_id, p.event_id +HAVING COUNT(A.TARGET_CONCEPT_ID) >= 1 +-- End Correlated Criteria + + ) CQ on E.person_id = CQ.person_id and E.event_id = CQ.event_id + GROUP BY E.person_id, E.event_id + HAVING COUNT(index_id) = 1 +) G +-- End Criteria Group +) AC on AC.person_id = pe.person_id and AC.event_id = pe.event_id + +) A on A.person_id = P.person_id AND A.START_DATE >= P.OP_START_DATE AND A.START_DATE <= P.OP_END_DATE AND A.START_DATE >= (P.START_DATE + -30*INTERVAL'1 day') AND A.START_DATE <= (P.START_DATE + 30*INTERVAL'1 day') +GROUP BY p.person_id, p.event_id +HAVING COUNT(A.TARGET_CONCEPT_ID) >= 1 +-- End Correlated Criteria + + ) CQ on E.person_id = CQ.person_id and E.event_id = CQ.event_id + GROUP BY E.person_id, E.event_id + HAVING COUNT(index_id) = 1 +) G +-- End Criteria Group +) AC on AC.person_id = pe.person_id AND AC.event_id = pe.event_id +) Results +; +ANALYZE Inclusion_3 +; + +CREATE TEMP TABLE Inclusion_4 + +AS +SELECT +4 as inclusion_rule_id, person_id, event_id + +FROM +( + select pe.person_id, pe.event_id + FROM qualified_events pe + +JOIN ( +-- Begin Criteria Group +select 0 as index_id, person_id, event_id +FROM +( + select E.person_id, E.event_id + FROM qualified_events E + INNER JOIN + ( + -- Begin Correlated Criteria +SELECT 0 as index_id, p.person_id, p.event_id +FROM qualified_events P +INNER JOIN +( + select PE.person_id, PE.event_id, PE.start_date, PE.end_date, PE.target_concept_id, PE.visit_occurrence_id, PE.sort_date FROM ( +-- Begin Device Exposure Criteria +select C.person_id, C.device_exposure_id as event_id, C.device_exposure_start_date as start_date, C.device_exposure_end_date as end_date, + C.device_concept_id as TARGET_CONCEPT_ID, C.visit_occurrence_id, + C.device_exposure_start_date as sort_date +from +( + select de.* , row_number() over (PARTITION BY de.person_id ORDER BY de.device_exposure_start_date, de.device_exposure_id) as ordinal + FROM cdm.DEVICE_EXPOSURE de +JOIN Codesets codesets on ((de.device_concept_id = codesets.concept_id and codesets.codeset_id = 0) AND (de.device_source_concept_id = codesets.concept_id and codesets.codeset_id = 0)) +) C +JOIN cdm.PERSON P on C.person_id = P.person_id +JOIN cdm.VISIT_OCCURRENCE V on C.visit_occurrence_id = V.visit_occurrence_id and C.person_id = V.person_id +LEFT JOIN cdm.PROVIDER PR on C.provider_id = PR.provider_id +WHERE (C.device_exposure_start_date >= TO_DATE(TO_CHAR(1900,'0000')||'-'||TO_CHAR(1,'00')||'-'||TO_CHAR(1,'00'), 'YYYY-MM-DD') and C.device_exposure_start_date <= TO_DATE(TO_CHAR(2099,'0000')||'-'||TO_CHAR(1,'00')||'-'||TO_CHAR(1,'00'), 'YYYY-MM-DD')) +AND (C.device_exposure_end_date >= TO_DATE(TO_CHAR(1900,'0000')||'-'||TO_CHAR(1,'00')||'-'||TO_CHAR(1,'00'), 'YYYY-MM-DD') and C.device_exposure_end_date <= TO_DATE(TO_CHAR(2099,'0000')||'-'||TO_CHAR(1,'00')||'-'||TO_CHAR(1,'00'), 'YYYY-MM-DD')) +AND C.device_type_concept_id in (32465,44818706) +AND C.unique_device_id like '%null%' +AND (C.quantity >= 0 and C.quantity <= 99) +AND (EXTRACT(YEAR FROM C.device_exposure_start_date) - P.year_of_birth >= 0 and EXTRACT(YEAR FROM C.device_exposure_start_date) - P.year_of_birth <= 99) +AND P.gender_concept_id in (8532,8507) +AND PR.specialty_concept_id in (38004455,38003625,38003626) +AND V.visit_concept_id in (8717,8756) +AND C.ordinal = 1 +-- End Device Exposure Criteria + +) PE +JOIN ( +-- Begin Criteria Group +select 0 as index_id, person_id, event_id +FROM +( + select E.person_id, E.event_id + FROM (SELECT Q.person_id, Q.event_id, Q.start_date, Q.end_date, Q.visit_occurrence_id, OP.observation_period_start_date as op_start_date, OP.observation_period_end_date as op_end_date +FROM (-- Begin Device Exposure Criteria +select C.person_id, C.device_exposure_id as event_id, C.device_exposure_start_date as start_date, C.device_exposure_end_date as end_date, + C.device_concept_id as TARGET_CONCEPT_ID, C.visit_occurrence_id, + C.device_exposure_start_date as sort_date +from +( + select de.* , row_number() over (PARTITION BY de.person_id ORDER BY de.device_exposure_start_date, de.device_exposure_id) as ordinal + FROM cdm.DEVICE_EXPOSURE de +JOIN Codesets codesets on ((de.device_concept_id = codesets.concept_id and codesets.codeset_id = 0) AND (de.device_source_concept_id = codesets.concept_id and codesets.codeset_id = 0)) +) C +JOIN cdm.PERSON P on C.person_id = P.person_id +JOIN cdm.VISIT_OCCURRENCE V on C.visit_occurrence_id = V.visit_occurrence_id and C.person_id = V.person_id +LEFT JOIN cdm.PROVIDER PR on C.provider_id = PR.provider_id +WHERE (C.device_exposure_start_date >= TO_DATE(TO_CHAR(1900,'0000')||'-'||TO_CHAR(1,'00')||'-'||TO_CHAR(1,'00'), 'YYYY-MM-DD') and C.device_exposure_start_date <= TO_DATE(TO_CHAR(2099,'0000')||'-'||TO_CHAR(1,'00')||'-'||TO_CHAR(1,'00'), 'YYYY-MM-DD')) +AND (C.device_exposure_end_date >= TO_DATE(TO_CHAR(1900,'0000')||'-'||TO_CHAR(1,'00')||'-'||TO_CHAR(1,'00'), 'YYYY-MM-DD') and C.device_exposure_end_date <= TO_DATE(TO_CHAR(2099,'0000')||'-'||TO_CHAR(1,'00')||'-'||TO_CHAR(1,'00'), 'YYYY-MM-DD')) +AND C.device_type_concept_id in (32465,44818706) +AND C.unique_device_id like '%null%' +AND (C.quantity >= 0 and C.quantity <= 99) +AND (EXTRACT(YEAR FROM C.device_exposure_start_date) - P.year_of_birth >= 0 and EXTRACT(YEAR FROM C.device_exposure_start_date) - P.year_of_birth <= 99) +AND P.gender_concept_id in (8532,8507) +AND PR.specialty_concept_id in (38004455,38003625,38003626) +AND V.visit_concept_id in (8717,8756) +AND C.ordinal = 1 +-- End Device Exposure Criteria +) Q +JOIN cdm.OBSERVATION_PERIOD OP on Q.person_id = OP.person_id + and OP.observation_period_start_date <= Q.start_date and OP.observation_period_end_date >= Q.start_date +) E + INNER JOIN + ( + -- Begin Correlated Criteria +SELECT 0 as index_id, p.person_id, p.event_id +FROM (SELECT Q.person_id, Q.event_id, Q.start_date, Q.end_date, Q.visit_occurrence_id, OP.observation_period_start_date as op_start_date, OP.observation_period_end_date as op_end_date +FROM (-- Begin Device Exposure Criteria +select C.person_id, C.device_exposure_id as event_id, C.device_exposure_start_date as start_date, C.device_exposure_end_date as end_date, + C.device_concept_id as TARGET_CONCEPT_ID, C.visit_occurrence_id, + C.device_exposure_start_date as sort_date +from +( + select de.* , row_number() over (PARTITION BY de.person_id ORDER BY de.device_exposure_start_date, de.device_exposure_id) as ordinal + FROM cdm.DEVICE_EXPOSURE de +JOIN Codesets codesets on ((de.device_concept_id = codesets.concept_id and codesets.codeset_id = 0) AND (de.device_source_concept_id = codesets.concept_id and codesets.codeset_id = 0)) +) C +JOIN cdm.PERSON P on C.person_id = P.person_id +JOIN cdm.VISIT_OCCURRENCE V on C.visit_occurrence_id = V.visit_occurrence_id and C.person_id = V.person_id +LEFT JOIN cdm.PROVIDER PR on C.provider_id = PR.provider_id +WHERE (C.device_exposure_start_date >= TO_DATE(TO_CHAR(1900,'0000')||'-'||TO_CHAR(1,'00')||'-'||TO_CHAR(1,'00'), 'YYYY-MM-DD') and C.device_exposure_start_date <= TO_DATE(TO_CHAR(2099,'0000')||'-'||TO_CHAR(1,'00')||'-'||TO_CHAR(1,'00'), 'YYYY-MM-DD')) +AND (C.device_exposure_end_date >= TO_DATE(TO_CHAR(1900,'0000')||'-'||TO_CHAR(1,'00')||'-'||TO_CHAR(1,'00'), 'YYYY-MM-DD') and C.device_exposure_end_date <= TO_DATE(TO_CHAR(2099,'0000')||'-'||TO_CHAR(1,'00')||'-'||TO_CHAR(1,'00'), 'YYYY-MM-DD')) +AND C.device_type_concept_id in (32465,44818706) +AND C.unique_device_id like '%null%' +AND (C.quantity >= 0 and C.quantity <= 99) +AND (EXTRACT(YEAR FROM C.device_exposure_start_date) - P.year_of_birth >= 0 and EXTRACT(YEAR FROM C.device_exposure_start_date) - P.year_of_birth <= 99) +AND P.gender_concept_id in (8532,8507) +AND PR.specialty_concept_id in (38004455,38003625,38003626) +AND V.visit_concept_id in (8717,8756) +AND C.ordinal = 1 +-- End Device Exposure Criteria +) Q +JOIN cdm.OBSERVATION_PERIOD OP on Q.person_id = OP.person_id + and OP.observation_period_start_date <= Q.start_date and OP.observation_period_end_date >= Q.start_date +) P +INNER JOIN +( + -- Begin Device Exposure Criteria +select C.person_id, C.device_exposure_id as event_id, C.device_exposure_start_date as start_date, C.device_exposure_end_date as end_date, + C.device_concept_id as TARGET_CONCEPT_ID, C.visit_occurrence_id, + C.device_exposure_start_date as sort_date +from +( + select de.* + FROM cdm.DEVICE_EXPOSURE de +JOIN Codesets codesets on ((de.device_concept_id = codesets.concept_id and codesets.codeset_id = 0)) +) C + + +-- End Device Exposure Criteria + +) A on A.person_id = P.person_id AND A.visit_occurrence_id = P.visit_occurrence_id +GROUP BY p.person_id, p.event_id +HAVING COUNT(A.TARGET_CONCEPT_ID) >= 1 +-- End Correlated Criteria + + ) CQ on E.person_id = CQ.person_id and E.event_id = CQ.event_id + GROUP BY E.person_id, E.event_id + HAVING COUNT(index_id) = 1 +) G +-- End Criteria Group +) AC on AC.person_id = pe.person_id and AC.event_id = pe.event_id + +) A on A.person_id = P.person_id AND A.START_DATE >= P.OP_START_DATE AND A.START_DATE <= P.OP_END_DATE AND A.START_DATE >= (P.START_DATE + -30*INTERVAL'1 day') AND A.START_DATE <= (P.START_DATE + 30*INTERVAL'1 day') +GROUP BY p.person_id, p.event_id +HAVING COUNT(A.TARGET_CONCEPT_ID) >= 1 +-- End Correlated Criteria + + ) CQ on E.person_id = CQ.person_id and E.event_id = CQ.event_id + GROUP BY E.person_id, E.event_id + HAVING COUNT(index_id) = 1 +) G +-- End Criteria Group +) AC on AC.person_id = pe.person_id AND AC.event_id = pe.event_id +) Results +; +ANALYZE Inclusion_4 +; + +CREATE TEMP TABLE Inclusion_5 + +AS +SELECT +5 as inclusion_rule_id, person_id, event_id + +FROM +( + select pe.person_id, pe.event_id + FROM qualified_events pe + +JOIN ( +-- Begin Criteria Group +select 0 as index_id, person_id, event_id +FROM +( + select E.person_id, E.event_id + FROM qualified_events E + INNER JOIN + ( + -- Begin Correlated Criteria +SELECT 0 as index_id, p.person_id, p.event_id +FROM qualified_events P +INNER JOIN +( + select PE.person_id, PE.event_id, PE.start_date, PE.end_date, PE.target_concept_id, PE.visit_occurrence_id, PE.sort_date FROM ( +-- Begin Drug Era Criteria +select C.person_id, C.drug_era_id as event_id, C.drug_era_start_date as start_date, C.drug_era_end_date as end_date, + C.drug_concept_id as TARGET_CONCEPT_ID, CAST(NULL as bigint) as visit_occurrence_id, + C.drug_era_start_date as sort_date +from +( + select de.* , row_number() over (PARTITION BY de.person_id ORDER BY de.drug_era_start_date, de.drug_era_id) as ordinal + FROM cdm.DRUG_ERA de + +) C +JOIN cdm.PERSON P on C.person_id = P.person_id +WHERE (C.drug_era_start_date >= TO_DATE(TO_CHAR(1900,'0000')||'-'||TO_CHAR(1,'00')||'-'||TO_CHAR(1,'00'), 'YYYY-MM-DD') and C.drug_era_start_date <= TO_DATE(TO_CHAR(2099,'0000')||'-'||TO_CHAR(1,'00')||'-'||TO_CHAR(1,'00'), 'YYYY-MM-DD')) +AND (C.drug_era_end_date >= TO_DATE(TO_CHAR(1900,'0000')||'-'||TO_CHAR(1,'00')||'-'||TO_CHAR(1,'00'), 'YYYY-MM-DD') and C.drug_era_end_date <= TO_DATE(TO_CHAR(2099,'0000')||'-'||TO_CHAR(1,'00')||'-'||TO_CHAR(1,'00'), 'YYYY-MM-DD')) +AND (C.drug_exposure_count >= 0 and C.drug_exposure_count <= 99) +AND ((CAST(C.drug_era_end_date AS DATE) - CAST(C.drug_era_start_date AS DATE)) >= 0 and (CAST(C.drug_era_end_date AS DATE) - CAST(C.drug_era_start_date AS DATE)) <= 99) +AND (EXTRACT(YEAR FROM C.drug_era_start_date) - P.year_of_birth >= 0 and EXTRACT(YEAR FROM C.drug_era_start_date) - P.year_of_birth <= 99) +AND (EXTRACT(YEAR FROM C.drug_era_end_date) - P.year_of_birth >= 0 and EXTRACT(YEAR FROM C.drug_era_end_date) - P.year_of_birth <= 99) +AND P.gender_concept_id in (8532,8507) +AND C.ordinal = 1 +-- End Drug Era Criteria + +) PE +JOIN ( +-- Begin Criteria Group +select 0 as index_id, person_id, event_id +FROM +( + select E.person_id, E.event_id + FROM (SELECT Q.person_id, Q.event_id, Q.start_date, Q.end_date, Q.visit_occurrence_id, OP.observation_period_start_date as op_start_date, OP.observation_period_end_date as op_end_date +FROM (-- Begin Drug Era Criteria +select C.person_id, C.drug_era_id as event_id, C.drug_era_start_date as start_date, C.drug_era_end_date as end_date, + C.drug_concept_id as TARGET_CONCEPT_ID, CAST(NULL as bigint) as visit_occurrence_id, + C.drug_era_start_date as sort_date +from +( + select de.* , row_number() over (PARTITION BY de.person_id ORDER BY de.drug_era_start_date, de.drug_era_id) as ordinal + FROM cdm.DRUG_ERA de + +) C +JOIN cdm.PERSON P on C.person_id = P.person_id +WHERE (C.drug_era_start_date >= TO_DATE(TO_CHAR(1900,'0000')||'-'||TO_CHAR(1,'00')||'-'||TO_CHAR(1,'00'), 'YYYY-MM-DD') and C.drug_era_start_date <= TO_DATE(TO_CHAR(2099,'0000')||'-'||TO_CHAR(1,'00')||'-'||TO_CHAR(1,'00'), 'YYYY-MM-DD')) +AND (C.drug_era_end_date >= TO_DATE(TO_CHAR(1900,'0000')||'-'||TO_CHAR(1,'00')||'-'||TO_CHAR(1,'00'), 'YYYY-MM-DD') and C.drug_era_end_date <= TO_DATE(TO_CHAR(2099,'0000')||'-'||TO_CHAR(1,'00')||'-'||TO_CHAR(1,'00'), 'YYYY-MM-DD')) +AND (C.drug_exposure_count >= 0 and C.drug_exposure_count <= 99) +AND ((CAST(C.drug_era_end_date AS DATE) - CAST(C.drug_era_start_date AS DATE)) >= 0 and (CAST(C.drug_era_end_date AS DATE) - CAST(C.drug_era_start_date AS DATE)) <= 99) +AND (EXTRACT(YEAR FROM C.drug_era_start_date) - P.year_of_birth >= 0 and EXTRACT(YEAR FROM C.drug_era_start_date) - P.year_of_birth <= 99) +AND (EXTRACT(YEAR FROM C.drug_era_end_date) - P.year_of_birth >= 0 and EXTRACT(YEAR FROM C.drug_era_end_date) - P.year_of_birth <= 99) +AND P.gender_concept_id in (8532,8507) +AND C.ordinal = 1 +-- End Drug Era Criteria +) Q +JOIN cdm.OBSERVATION_PERIOD OP on Q.person_id = OP.person_id + and OP.observation_period_start_date <= Q.start_date and OP.observation_period_end_date >= Q.start_date +) E + INNER JOIN + ( + -- Begin Correlated Criteria +SELECT 0 as index_id, p.person_id, p.event_id +FROM (SELECT Q.person_id, Q.event_id, Q.start_date, Q.end_date, Q.visit_occurrence_id, OP.observation_period_start_date as op_start_date, OP.observation_period_end_date as op_end_date +FROM (-- Begin Drug Era Criteria +select C.person_id, C.drug_era_id as event_id, C.drug_era_start_date as start_date, C.drug_era_end_date as end_date, + C.drug_concept_id as TARGET_CONCEPT_ID, CAST(NULL as bigint) as visit_occurrence_id, + C.drug_era_start_date as sort_date +from +( + select de.* , row_number() over (PARTITION BY de.person_id ORDER BY de.drug_era_start_date, de.drug_era_id) as ordinal + FROM cdm.DRUG_ERA de + +) C +JOIN cdm.PERSON P on C.person_id = P.person_id +WHERE (C.drug_era_start_date >= TO_DATE(TO_CHAR(1900,'0000')||'-'||TO_CHAR(1,'00')||'-'||TO_CHAR(1,'00'), 'YYYY-MM-DD') and C.drug_era_start_date <= TO_DATE(TO_CHAR(2099,'0000')||'-'||TO_CHAR(1,'00')||'-'||TO_CHAR(1,'00'), 'YYYY-MM-DD')) +AND (C.drug_era_end_date >= TO_DATE(TO_CHAR(1900,'0000')||'-'||TO_CHAR(1,'00')||'-'||TO_CHAR(1,'00'), 'YYYY-MM-DD') and C.drug_era_end_date <= TO_DATE(TO_CHAR(2099,'0000')||'-'||TO_CHAR(1,'00')||'-'||TO_CHAR(1,'00'), 'YYYY-MM-DD')) +AND (C.drug_exposure_count >= 0 and C.drug_exposure_count <= 99) +AND ((CAST(C.drug_era_end_date AS DATE) - CAST(C.drug_era_start_date AS DATE)) >= 0 and (CAST(C.drug_era_end_date AS DATE) - CAST(C.drug_era_start_date AS DATE)) <= 99) +AND (EXTRACT(YEAR FROM C.drug_era_start_date) - P.year_of_birth >= 0 and EXTRACT(YEAR FROM C.drug_era_start_date) - P.year_of_birth <= 99) +AND (EXTRACT(YEAR FROM C.drug_era_end_date) - P.year_of_birth >= 0 and EXTRACT(YEAR FROM C.drug_era_end_date) - P.year_of_birth <= 99) +AND P.gender_concept_id in (8532,8507) +AND C.ordinal = 1 +-- End Drug Era Criteria +) Q +JOIN cdm.OBSERVATION_PERIOD OP on Q.person_id = OP.person_id + and OP.observation_period_start_date <= Q.start_date and OP.observation_period_end_date >= Q.start_date +) P +INNER JOIN +( + -- Begin Drug Era Criteria +select C.person_id, C.drug_era_id as event_id, C.drug_era_start_date as start_date, C.drug_era_end_date as end_date, + C.drug_concept_id as TARGET_CONCEPT_ID, CAST(NULL as bigint) as visit_occurrence_id, + C.drug_era_start_date as sort_date +from +( + select de.* + FROM cdm.DRUG_ERA de +where de.drug_concept_id in (SELECT concept_id from Codesets where codeset_id = 0) +) C + + +-- End Drug Era Criteria + +) A on A.person_id = P.person_id +GROUP BY p.person_id, p.event_id +HAVING COUNT(A.TARGET_CONCEPT_ID) >= 1 +-- End Correlated Criteria + + ) CQ on E.person_id = CQ.person_id and E.event_id = CQ.event_id + GROUP BY E.person_id, E.event_id + HAVING COUNT(index_id) = 1 +) G +-- End Criteria Group +) AC on AC.person_id = pe.person_id and AC.event_id = pe.event_id + +) A on A.person_id = P.person_id AND A.START_DATE >= P.OP_START_DATE AND A.START_DATE <= P.OP_END_DATE AND A.START_DATE >= (P.START_DATE + -30*INTERVAL'1 day') AND A.START_DATE <= (P.START_DATE + 30*INTERVAL'1 day') +GROUP BY p.person_id, p.event_id +HAVING COUNT(A.TARGET_CONCEPT_ID) >= 1 +-- End Correlated Criteria + + ) CQ on E.person_id = CQ.person_id and E.event_id = CQ.event_id + GROUP BY E.person_id, E.event_id + HAVING COUNT(index_id) = 1 +) G +-- End Criteria Group +) AC on AC.person_id = pe.person_id AND AC.event_id = pe.event_id +) Results +; +ANALYZE Inclusion_5 +; + +CREATE TEMP TABLE Inclusion_6 + +AS +SELECT +6 as inclusion_rule_id, person_id, event_id + +FROM +( + select pe.person_id, pe.event_id + FROM qualified_events pe + +JOIN ( +-- Begin Criteria Group +select 0 as index_id, person_id, event_id +FROM +( + select E.person_id, E.event_id + FROM qualified_events E + INNER JOIN + ( + -- Begin Correlated Criteria +SELECT 0 as index_id, p.person_id, p.event_id +FROM qualified_events P +INNER JOIN +( + select PE.person_id, PE.event_id, PE.start_date, PE.end_date, PE.target_concept_id, PE.visit_occurrence_id, PE.sort_date FROM ( +-- Begin Drug Exposure Criteria +select C.person_id, C.drug_exposure_id as event_id, C.drug_exposure_start_date as start_date, + COALESCE(C.DRUG_EXPOSURE_END_DATE, (DRUG_EXPOSURE_START_DATE + C.DAYS_SUPPLY*INTERVAL'1 day'), (C.DRUG_EXPOSURE_START_DATE + 1*INTERVAL'1 day')) as end_date, + C.drug_concept_id as TARGET_CONCEPT_ID, C.visit_occurrence_id, + C.drug_exposure_start_date as sort_date +from +( + select de.* , row_number() over (PARTITION BY de.person_id ORDER BY de.drug_exposure_start_date, de.drug_exposure_id) as ordinal + FROM cdm.DRUG_EXPOSURE de +JOIN Codesets codesets on ((de.drug_concept_id = codesets.concept_id and codesets.codeset_id = 0) AND (de.drug_source_concept_id = codesets.concept_id and codesets.codeset_id = 0)) +) C +JOIN cdm.PERSON P on C.person_id = P.person_id +JOIN cdm.VISIT_OCCURRENCE V on C.visit_occurrence_id = V.visit_occurrence_id and C.person_id = V.person_id +LEFT JOIN cdm.PROVIDER PR on C.provider_id = PR.provider_id +WHERE (C.drug_exposure_start_date >= TO_DATE(TO_CHAR(1900,'0000')||'-'||TO_CHAR(1,'00')||'-'||TO_CHAR(1,'00'), 'YYYY-MM-DD') and C.drug_exposure_start_date <= TO_DATE(TO_CHAR(2099,'0000')||'-'||TO_CHAR(1,'00')||'-'||TO_CHAR(1,'00'), 'YYYY-MM-DD')) +AND (C.drug_exposure_end_date >= TO_DATE(TO_CHAR(1900,'0000')||'-'||TO_CHAR(1,'00')||'-'||TO_CHAR(1,'00'), 'YYYY-MM-DD') and C.drug_exposure_end_date <= TO_DATE(TO_CHAR(2099,'0000')||'-'||TO_CHAR(1,'00')||'-'||TO_CHAR(1,'00'), 'YYYY-MM-DD')) +AND C.drug_type_concept_id in (38000175,38000176) +AND C.stop_reason like '%stop reason%' +AND (C.refills >= 0 and C.refills <= 99) +AND (C.quantity >= 0.0000 and C.quantity <= 99.0000) +AND (C.days_supply >= 0 and C.days_supply <= 99) +AND C.route_concept_id in (4263689,4023156,4006860) +AND (C.effective_drug_dose >= 0.0000 and C.effective_drug_dose <= 99.0000) +AND C.dose_unit_concept_id in (8554,8849,9214) +AND C.lot_number like '%lot number%' +AND (EXTRACT(YEAR FROM C.drug_exposure_start_date) - P.year_of_birth >= 0 and EXTRACT(YEAR FROM C.drug_exposure_start_date) - P.year_of_birth <= 99) +AND P.gender_concept_id in (8532,8507) +AND PR.specialty_concept_id in (38004446,38003625) +AND V.visit_concept_id in (262,9201) +AND C.ordinal = 1 +-- End Drug Exposure Criteria + +) PE +JOIN ( +-- Begin Criteria Group +select 0 as index_id, person_id, event_id +FROM +( + select E.person_id, E.event_id + FROM (SELECT Q.person_id, Q.event_id, Q.start_date, Q.end_date, Q.visit_occurrence_id, OP.observation_period_start_date as op_start_date, OP.observation_period_end_date as op_end_date +FROM (-- Begin Drug Exposure Criteria +select C.person_id, C.drug_exposure_id as event_id, C.drug_exposure_start_date as start_date, + COALESCE(C.DRUG_EXPOSURE_END_DATE, (DRUG_EXPOSURE_START_DATE + C.DAYS_SUPPLY*INTERVAL'1 day'), (C.DRUG_EXPOSURE_START_DATE + 1*INTERVAL'1 day')) as end_date, + C.drug_concept_id as TARGET_CONCEPT_ID, C.visit_occurrence_id, + C.drug_exposure_start_date as sort_date +from +( + select de.* , row_number() over (PARTITION BY de.person_id ORDER BY de.drug_exposure_start_date, de.drug_exposure_id) as ordinal + FROM cdm.DRUG_EXPOSURE de +JOIN Codesets codesets on ((de.drug_concept_id = codesets.concept_id and codesets.codeset_id = 0) AND (de.drug_source_concept_id = codesets.concept_id and codesets.codeset_id = 0)) +) C +JOIN cdm.PERSON P on C.person_id = P.person_id +JOIN cdm.VISIT_OCCURRENCE V on C.visit_occurrence_id = V.visit_occurrence_id and C.person_id = V.person_id +LEFT JOIN cdm.PROVIDER PR on C.provider_id = PR.provider_id +WHERE (C.drug_exposure_start_date >= TO_DATE(TO_CHAR(1900,'0000')||'-'||TO_CHAR(1,'00')||'-'||TO_CHAR(1,'00'), 'YYYY-MM-DD') and C.drug_exposure_start_date <= TO_DATE(TO_CHAR(2099,'0000')||'-'||TO_CHAR(1,'00')||'-'||TO_CHAR(1,'00'), 'YYYY-MM-DD')) +AND (C.drug_exposure_end_date >= TO_DATE(TO_CHAR(1900,'0000')||'-'||TO_CHAR(1,'00')||'-'||TO_CHAR(1,'00'), 'YYYY-MM-DD') and C.drug_exposure_end_date <= TO_DATE(TO_CHAR(2099,'0000')||'-'||TO_CHAR(1,'00')||'-'||TO_CHAR(1,'00'), 'YYYY-MM-DD')) +AND C.drug_type_concept_id in (38000175,38000176) +AND C.stop_reason like '%stop reason%' +AND (C.refills >= 0 and C.refills <= 99) +AND (C.quantity >= 0.0000 and C.quantity <= 99.0000) +AND (C.days_supply >= 0 and C.days_supply <= 99) +AND C.route_concept_id in (4263689,4023156,4006860) +AND (C.effective_drug_dose >= 0.0000 and C.effective_drug_dose <= 99.0000) +AND C.dose_unit_concept_id in (8554,8849,9214) +AND C.lot_number like '%lot number%' +AND (EXTRACT(YEAR FROM C.drug_exposure_start_date) - P.year_of_birth >= 0 and EXTRACT(YEAR FROM C.drug_exposure_start_date) - P.year_of_birth <= 99) +AND P.gender_concept_id in (8532,8507) +AND PR.specialty_concept_id in (38004446,38003625) +AND V.visit_concept_id in (262,9201) +AND C.ordinal = 1 +-- End Drug Exposure Criteria +) Q +JOIN cdm.OBSERVATION_PERIOD OP on Q.person_id = OP.person_id + and OP.observation_period_start_date <= Q.start_date and OP.observation_period_end_date >= Q.start_date +) E + INNER JOIN + ( + -- Begin Correlated Criteria +SELECT 0 as index_id, p.person_id, p.event_id +FROM (SELECT Q.person_id, Q.event_id, Q.start_date, Q.end_date, Q.visit_occurrence_id, OP.observation_period_start_date as op_start_date, OP.observation_period_end_date as op_end_date +FROM (-- Begin Drug Exposure Criteria +select C.person_id, C.drug_exposure_id as event_id, C.drug_exposure_start_date as start_date, + COALESCE(C.DRUG_EXPOSURE_END_DATE, (DRUG_EXPOSURE_START_DATE + C.DAYS_SUPPLY*INTERVAL'1 day'), (C.DRUG_EXPOSURE_START_DATE + 1*INTERVAL'1 day')) as end_date, + C.drug_concept_id as TARGET_CONCEPT_ID, C.visit_occurrence_id, + C.drug_exposure_start_date as sort_date +from +( + select de.* , row_number() over (PARTITION BY de.person_id ORDER BY de.drug_exposure_start_date, de.drug_exposure_id) as ordinal + FROM cdm.DRUG_EXPOSURE de +JOIN Codesets codesets on ((de.drug_concept_id = codesets.concept_id and codesets.codeset_id = 0) AND (de.drug_source_concept_id = codesets.concept_id and codesets.codeset_id = 0)) +) C +JOIN cdm.PERSON P on C.person_id = P.person_id +JOIN cdm.VISIT_OCCURRENCE V on C.visit_occurrence_id = V.visit_occurrence_id and C.person_id = V.person_id +LEFT JOIN cdm.PROVIDER PR on C.provider_id = PR.provider_id +WHERE (C.drug_exposure_start_date >= TO_DATE(TO_CHAR(1900,'0000')||'-'||TO_CHAR(1,'00')||'-'||TO_CHAR(1,'00'), 'YYYY-MM-DD') and C.drug_exposure_start_date <= TO_DATE(TO_CHAR(2099,'0000')||'-'||TO_CHAR(1,'00')||'-'||TO_CHAR(1,'00'), 'YYYY-MM-DD')) +AND (C.drug_exposure_end_date >= TO_DATE(TO_CHAR(1900,'0000')||'-'||TO_CHAR(1,'00')||'-'||TO_CHAR(1,'00'), 'YYYY-MM-DD') and C.drug_exposure_end_date <= TO_DATE(TO_CHAR(2099,'0000')||'-'||TO_CHAR(1,'00')||'-'||TO_CHAR(1,'00'), 'YYYY-MM-DD')) +AND C.drug_type_concept_id in (38000175,38000176) +AND C.stop_reason like '%stop reason%' +AND (C.refills >= 0 and C.refills <= 99) +AND (C.quantity >= 0.0000 and C.quantity <= 99.0000) +AND (C.days_supply >= 0 and C.days_supply <= 99) +AND C.route_concept_id in (4263689,4023156,4006860) +AND (C.effective_drug_dose >= 0.0000 and C.effective_drug_dose <= 99.0000) +AND C.dose_unit_concept_id in (8554,8849,9214) +AND C.lot_number like '%lot number%' +AND (EXTRACT(YEAR FROM C.drug_exposure_start_date) - P.year_of_birth >= 0 and EXTRACT(YEAR FROM C.drug_exposure_start_date) - P.year_of_birth <= 99) +AND P.gender_concept_id in (8532,8507) +AND PR.specialty_concept_id in (38004446,38003625) +AND V.visit_concept_id in (262,9201) +AND C.ordinal = 1 +-- End Drug Exposure Criteria +) Q +JOIN cdm.OBSERVATION_PERIOD OP on Q.person_id = OP.person_id + and OP.observation_period_start_date <= Q.start_date and OP.observation_period_end_date >= Q.start_date +) P +INNER JOIN +( + -- Begin Drug Exposure Criteria +select C.person_id, C.drug_exposure_id as event_id, C.drug_exposure_start_date as start_date, + COALESCE(C.DRUG_EXPOSURE_END_DATE, (DRUG_EXPOSURE_START_DATE + C.DAYS_SUPPLY*INTERVAL'1 day'), (C.DRUG_EXPOSURE_START_DATE + 1*INTERVAL'1 day')) as end_date, + C.drug_concept_id as TARGET_CONCEPT_ID, C.visit_occurrence_id, + C.drug_exposure_start_date as sort_date +from +( + select de.* + FROM cdm.DRUG_EXPOSURE de + +) C + + +-- End Drug Exposure Criteria + +) A on A.person_id = P.person_id AND A.visit_occurrence_id = P.visit_occurrence_id +GROUP BY p.person_id, p.event_id +HAVING COUNT(A.TARGET_CONCEPT_ID) >= 1 +-- End Correlated Criteria + + ) CQ on E.person_id = CQ.person_id and E.event_id = CQ.event_id + GROUP BY E.person_id, E.event_id + HAVING COUNT(index_id) = 1 +) G +-- End Criteria Group +) AC on AC.person_id = pe.person_id and AC.event_id = pe.event_id + +) A on A.person_id = P.person_id AND A.START_DATE >= P.OP_START_DATE AND A.START_DATE <= P.OP_END_DATE AND A.START_DATE >= (P.START_DATE + -30*INTERVAL'1 day') AND A.START_DATE <= (P.START_DATE + 30*INTERVAL'1 day') +GROUP BY p.person_id, p.event_id +HAVING COUNT(A.TARGET_CONCEPT_ID) >= 1 +-- End Correlated Criteria + + ) CQ on E.person_id = CQ.person_id and E.event_id = CQ.event_id + GROUP BY E.person_id, E.event_id + HAVING COUNT(index_id) = 1 +) G +-- End Criteria Group +) AC on AC.person_id = pe.person_id AND AC.event_id = pe.event_id +) Results +; +ANALYZE Inclusion_6 +; + +CREATE TEMP TABLE Inclusion_7 + +AS +SELECT +7 as inclusion_rule_id, person_id, event_id + +FROM +( + select pe.person_id, pe.event_id + FROM qualified_events pe + +JOIN ( +-- Begin Criteria Group +select 0 as index_id, person_id, event_id +FROM +( + select E.person_id, E.event_id + FROM qualified_events E + INNER JOIN + ( + -- Begin Correlated Criteria +SELECT 0 as index_id, p.person_id, p.event_id +FROM qualified_events P +INNER JOIN +( + select PE.person_id, PE.event_id, PE.start_date, PE.end_date, PE.target_concept_id, PE.visit_occurrence_id, PE.sort_date FROM ( +-- Begin Measurement Criteria +select C.person_id, C.measurement_id as event_id, C.measurement_date as start_date, (C.measurement_date + 1*INTERVAL'1 day') as END_DATE, + C.measurement_concept_id as TARGET_CONCEPT_ID, C.visit_occurrence_id, + C.measurement_date as sort_date +from +( + select m.* , row_number() over (PARTITION BY m.person_id ORDER BY m.measurement_date, m.measurement_id) as ordinal + FROM cdm.MEASUREMENT m +JOIN Codesets codesets on ((m.measurement_source_concept_id = codesets.concept_id and codesets.codeset_id = 0)) +) C +JOIN cdm.PERSON P on C.person_id = P.person_id +JOIN cdm.VISIT_OCCURRENCE V on C.visit_occurrence_id = V.visit_occurrence_id and C.person_id = V.person_id +LEFT JOIN cdm.PROVIDER PR on C.provider_id = PR.provider_id +WHERE (C.measurement_date >= TO_DATE(TO_CHAR(1900,'0000')||'-'||TO_CHAR(1,'00')||'-'||TO_CHAR(1,'00'), 'YYYY-MM-DD') and C.measurement_date <= TO_DATE(TO_CHAR(2099,'0000')||'-'||TO_CHAR(1,'00')||'-'||TO_CHAR(1,'00'), 'YYYY-MM-DD')) +AND C.measurement_type_concept_id in (38000183,38000199) +AND C.operator_concept_id in (4172704) +AND (C.value_as_number >= 0.0000 and C.value_as_number <= 99.0000) +AND C.value_as_concept_id in (9191) +AND C.unit_concept_id in (9256) +AND (C.range_low >= 0.0000 and C.range_low <= 99.0000) +AND (C.range_high >= 0.0000 and C.range_high <= 99.0000) +AND ((C.value_as_number / NULLIF(C.range_low, 0)) >= 0.0000 and (C.value_as_number / NULLIF(C.range_low, 0)) <= 99.0000) +AND ((C.value_as_number / NULLIF(C.range_high, 0)) >= 0.0000 and (C.value_as_number / NULLIF(C.range_high, 0)) <= 99.0000) +AND (C.value_as_number < C.range_low or C.value_as_number > C.range_high or C.value_as_concept_id in (4155142, 4155143)) +AND (EXTRACT(YEAR FROM C.measurement_date) - P.year_of_birth >= 0 and EXTRACT(YEAR FROM C.measurement_date) - P.year_of_birth <= 99) +AND P.gender_concept_id in (8532,8507) +AND PR.specialty_concept_id in (38004446,38003626,38003627) +AND V.visit_concept_id in (262,9201) +AND C.ordinal = 1 +-- End Measurement Criteria + +) PE +JOIN ( +-- Begin Criteria Group +select 0 as index_id, person_id, event_id +FROM +( + select E.person_id, E.event_id + FROM (SELECT Q.person_id, Q.event_id, Q.start_date, Q.end_date, Q.visit_occurrence_id, OP.observation_period_start_date as op_start_date, OP.observation_period_end_date as op_end_date +FROM (-- Begin Measurement Criteria +select C.person_id, C.measurement_id as event_id, C.measurement_date as start_date, (C.measurement_date + 1*INTERVAL'1 day') as END_DATE, + C.measurement_concept_id as TARGET_CONCEPT_ID, C.visit_occurrence_id, + C.measurement_date as sort_date +from +( + select m.* , row_number() over (PARTITION BY m.person_id ORDER BY m.measurement_date, m.measurement_id) as ordinal + FROM cdm.MEASUREMENT m +JOIN Codesets codesets on ((m.measurement_source_concept_id = codesets.concept_id and codesets.codeset_id = 0)) +) C +JOIN cdm.PERSON P on C.person_id = P.person_id +JOIN cdm.VISIT_OCCURRENCE V on C.visit_occurrence_id = V.visit_occurrence_id and C.person_id = V.person_id +LEFT JOIN cdm.PROVIDER PR on C.provider_id = PR.provider_id +WHERE (C.measurement_date >= TO_DATE(TO_CHAR(1900,'0000')||'-'||TO_CHAR(1,'00')||'-'||TO_CHAR(1,'00'), 'YYYY-MM-DD') and C.measurement_date <= TO_DATE(TO_CHAR(2099,'0000')||'-'||TO_CHAR(1,'00')||'-'||TO_CHAR(1,'00'), 'YYYY-MM-DD')) +AND C.measurement_type_concept_id in (38000183,38000199) +AND C.operator_concept_id in (4172704) +AND (C.value_as_number >= 0.0000 and C.value_as_number <= 99.0000) +AND C.value_as_concept_id in (9191) +AND C.unit_concept_id in (9256) +AND (C.range_low >= 0.0000 and C.range_low <= 99.0000) +AND (C.range_high >= 0.0000 and C.range_high <= 99.0000) +AND ((C.value_as_number / NULLIF(C.range_low, 0)) >= 0.0000 and (C.value_as_number / NULLIF(C.range_low, 0)) <= 99.0000) +AND ((C.value_as_number / NULLIF(C.range_high, 0)) >= 0.0000 and (C.value_as_number / NULLIF(C.range_high, 0)) <= 99.0000) +AND (C.value_as_number < C.range_low or C.value_as_number > C.range_high or C.value_as_concept_id in (4155142, 4155143)) +AND (EXTRACT(YEAR FROM C.measurement_date) - P.year_of_birth >= 0 and EXTRACT(YEAR FROM C.measurement_date) - P.year_of_birth <= 99) +AND P.gender_concept_id in (8532,8507) +AND PR.specialty_concept_id in (38004446,38003626,38003627) +AND V.visit_concept_id in (262,9201) +AND C.ordinal = 1 +-- End Measurement Criteria +) Q +JOIN cdm.OBSERVATION_PERIOD OP on Q.person_id = OP.person_id + and OP.observation_period_start_date <= Q.start_date and OP.observation_period_end_date >= Q.start_date +) E + INNER JOIN + ( + -- Begin Correlated Criteria +SELECT 0 as index_id, p.person_id, p.event_id +FROM (SELECT Q.person_id, Q.event_id, Q.start_date, Q.end_date, Q.visit_occurrence_id, OP.observation_period_start_date as op_start_date, OP.observation_period_end_date as op_end_date +FROM (-- Begin Measurement Criteria +select C.person_id, C.measurement_id as event_id, C.measurement_date as start_date, (C.measurement_date + 1*INTERVAL'1 day') as END_DATE, + C.measurement_concept_id as TARGET_CONCEPT_ID, C.visit_occurrence_id, + C.measurement_date as sort_date +from +( + select m.* , row_number() over (PARTITION BY m.person_id ORDER BY m.measurement_date, m.measurement_id) as ordinal + FROM cdm.MEASUREMENT m +JOIN Codesets codesets on ((m.measurement_source_concept_id = codesets.concept_id and codesets.codeset_id = 0)) +) C +JOIN cdm.PERSON P on C.person_id = P.person_id +JOIN cdm.VISIT_OCCURRENCE V on C.visit_occurrence_id = V.visit_occurrence_id and C.person_id = V.person_id +LEFT JOIN cdm.PROVIDER PR on C.provider_id = PR.provider_id +WHERE (C.measurement_date >= TO_DATE(TO_CHAR(1900,'0000')||'-'||TO_CHAR(1,'00')||'-'||TO_CHAR(1,'00'), 'YYYY-MM-DD') and C.measurement_date <= TO_DATE(TO_CHAR(2099,'0000')||'-'||TO_CHAR(1,'00')||'-'||TO_CHAR(1,'00'), 'YYYY-MM-DD')) +AND C.measurement_type_concept_id in (38000183,38000199) +AND C.operator_concept_id in (4172704) +AND (C.value_as_number >= 0.0000 and C.value_as_number <= 99.0000) +AND C.value_as_concept_id in (9191) +AND C.unit_concept_id in (9256) +AND (C.range_low >= 0.0000 and C.range_low <= 99.0000) +AND (C.range_high >= 0.0000 and C.range_high <= 99.0000) +AND ((C.value_as_number / NULLIF(C.range_low, 0)) >= 0.0000 and (C.value_as_number / NULLIF(C.range_low, 0)) <= 99.0000) +AND ((C.value_as_number / NULLIF(C.range_high, 0)) >= 0.0000 and (C.value_as_number / NULLIF(C.range_high, 0)) <= 99.0000) +AND (C.value_as_number < C.range_low or C.value_as_number > C.range_high or C.value_as_concept_id in (4155142, 4155143)) +AND (EXTRACT(YEAR FROM C.measurement_date) - P.year_of_birth >= 0 and EXTRACT(YEAR FROM C.measurement_date) - P.year_of_birth <= 99) +AND P.gender_concept_id in (8532,8507) +AND PR.specialty_concept_id in (38004446,38003626,38003627) +AND V.visit_concept_id in (262,9201) +AND C.ordinal = 1 +-- End Measurement Criteria +) Q +JOIN cdm.OBSERVATION_PERIOD OP on Q.person_id = OP.person_id + and OP.observation_period_start_date <= Q.start_date and OP.observation_period_end_date >= Q.start_date +) P +INNER JOIN +( + -- Begin Measurement Criteria +select C.person_id, C.measurement_id as event_id, C.measurement_date as start_date, (C.measurement_date + 1*INTERVAL'1 day') as END_DATE, + C.measurement_concept_id as TARGET_CONCEPT_ID, C.visit_occurrence_id, + C.measurement_date as sort_date +from +( + select m.* + FROM cdm.MEASUREMENT m +JOIN Codesets codesets on ((m.measurement_concept_id = codesets.concept_id and codesets.codeset_id = 0)) +) C + + +-- End Measurement Criteria + +) A on A.person_id = P.person_id AND A.visit_occurrence_id = P.visit_occurrence_id +GROUP BY p.person_id, p.event_id +HAVING COUNT(A.TARGET_CONCEPT_ID) >= 1 +-- End Correlated Criteria + + ) CQ on E.person_id = CQ.person_id and E.event_id = CQ.event_id + GROUP BY E.person_id, E.event_id + HAVING COUNT(index_id) = 1 +) G +-- End Criteria Group +) AC on AC.person_id = pe.person_id and AC.event_id = pe.event_id + +) A on A.person_id = P.person_id AND A.START_DATE >= P.OP_START_DATE AND A.START_DATE <= P.OP_END_DATE AND A.START_DATE >= (P.START_DATE + -30*INTERVAL'1 day') AND A.START_DATE <= (P.START_DATE + 30*INTERVAL'1 day') +GROUP BY p.person_id, p.event_id +HAVING COUNT(A.TARGET_CONCEPT_ID) >= 1 +-- End Correlated Criteria + + ) CQ on E.person_id = CQ.person_id and E.event_id = CQ.event_id + GROUP BY E.person_id, E.event_id + HAVING COUNT(index_id) = 1 +) G +-- End Criteria Group +) AC on AC.person_id = pe.person_id AND AC.event_id = pe.event_id +) Results +; +ANALYZE Inclusion_7 +; + +CREATE TEMP TABLE Inclusion_8 + +AS +SELECT +8 as inclusion_rule_id, person_id, event_id + +FROM +( + select pe.person_id, pe.event_id + FROM qualified_events pe + +JOIN ( +-- Begin Criteria Group +select 0 as index_id, person_id, event_id +FROM +( + select E.person_id, E.event_id + FROM qualified_events E + INNER JOIN + ( + -- Begin Correlated Criteria +SELECT 0 as index_id, p.person_id, p.event_id +FROM qualified_events P +INNER JOIN +( + select PE.person_id, PE.event_id, PE.start_date, PE.end_date, PE.target_concept_id, PE.visit_occurrence_id, PE.sort_date FROM ( +-- Begin Observation Criteria +select C.person_id, C.observation_id as event_id, C.observation_date as start_date, (C.observation_date + 1*INTERVAL'1 day') as END_DATE, + C.observation_concept_id as TARGET_CONCEPT_ID, C.visit_occurrence_id, + C.observation_date as sort_date +from +( + select o.* , row_number() over (PARTITION BY o.person_id ORDER BY o.observation_date, o.observation_id) as ordinal + FROM cdm.OBSERVATION o +JOIN Codesets codesets on ((o.observation_concept_id = codesets.concept_id and codesets.codeset_id = 0) AND (o.observation_source_concept_id = codesets.concept_id and codesets.codeset_id = 0)) +) C +JOIN cdm.PERSON P on C.person_id = P.person_id +JOIN cdm.VISIT_OCCURRENCE V on C.visit_occurrence_id = V.visit_occurrence_id and C.person_id = V.person_id +LEFT JOIN cdm.PROVIDER PR on C.provider_id = PR.provider_id +WHERE (C.observation_date >= TO_DATE(TO_CHAR(1900,'0000')||'-'||TO_CHAR(1,'00')||'-'||TO_CHAR(1,'00'), 'YYYY-MM-DD') and C.observation_date <= TO_DATE(TO_CHAR(2099,'0000')||'-'||TO_CHAR(1,'00')||'-'||TO_CHAR(1,'00'), 'YYYY-MM-DD')) +AND C.observation_type_concept_id in (38000183,38000199) +AND (C.value_as_number >= 0.0000 and C.value_as_number <= 99.0000) +AND C.value_as_string like '%some value%' +AND C.value_as_concept_id in (36312355) +AND C.qualifier_concept_id in (4172703,4171754) +AND C.unit_concept_id in (8554) +AND (EXTRACT(YEAR FROM C.observation_date) - P.year_of_birth >= 0 and EXTRACT(YEAR FROM C.observation_date) - P.year_of_birth <= 99) +AND P.gender_concept_id in (8532,8507) +AND PR.specialty_concept_id in (38004446,38003627) +AND V.visit_concept_id in (262,9201) +AND C.ordinal = 1 +-- End Observation Criteria + +) PE +JOIN ( +-- Begin Criteria Group +select 0 as index_id, person_id, event_id +FROM +( + select E.person_id, E.event_id + FROM (SELECT Q.person_id, Q.event_id, Q.start_date, Q.end_date, Q.visit_occurrence_id, OP.observation_period_start_date as op_start_date, OP.observation_period_end_date as op_end_date +FROM (-- Begin Observation Criteria +select C.person_id, C.observation_id as event_id, C.observation_date as start_date, (C.observation_date + 1*INTERVAL'1 day') as END_DATE, + C.observation_concept_id as TARGET_CONCEPT_ID, C.visit_occurrence_id, + C.observation_date as sort_date +from +( + select o.* , row_number() over (PARTITION BY o.person_id ORDER BY o.observation_date, o.observation_id) as ordinal + FROM cdm.OBSERVATION o +JOIN Codesets codesets on ((o.observation_concept_id = codesets.concept_id and codesets.codeset_id = 0) AND (o.observation_source_concept_id = codesets.concept_id and codesets.codeset_id = 0)) +) C +JOIN cdm.PERSON P on C.person_id = P.person_id +JOIN cdm.VISIT_OCCURRENCE V on C.visit_occurrence_id = V.visit_occurrence_id and C.person_id = V.person_id +LEFT JOIN cdm.PROVIDER PR on C.provider_id = PR.provider_id +WHERE (C.observation_date >= TO_DATE(TO_CHAR(1900,'0000')||'-'||TO_CHAR(1,'00')||'-'||TO_CHAR(1,'00'), 'YYYY-MM-DD') and C.observation_date <= TO_DATE(TO_CHAR(2099,'0000')||'-'||TO_CHAR(1,'00')||'-'||TO_CHAR(1,'00'), 'YYYY-MM-DD')) +AND C.observation_type_concept_id in (38000183,38000199) +AND (C.value_as_number >= 0.0000 and C.value_as_number <= 99.0000) +AND C.value_as_string like '%some value%' +AND C.value_as_concept_id in (36312355) +AND C.qualifier_concept_id in (4172703,4171754) +AND C.unit_concept_id in (8554) +AND (EXTRACT(YEAR FROM C.observation_date) - P.year_of_birth >= 0 and EXTRACT(YEAR FROM C.observation_date) - P.year_of_birth <= 99) +AND P.gender_concept_id in (8532,8507) +AND PR.specialty_concept_id in (38004446,38003627) +AND V.visit_concept_id in (262,9201) +AND C.ordinal = 1 +-- End Observation Criteria +) Q +JOIN cdm.OBSERVATION_PERIOD OP on Q.person_id = OP.person_id + and OP.observation_period_start_date <= Q.start_date and OP.observation_period_end_date >= Q.start_date +) E + INNER JOIN + ( + -- Begin Correlated Criteria +SELECT 0 as index_id, p.person_id, p.event_id +FROM (SELECT Q.person_id, Q.event_id, Q.start_date, Q.end_date, Q.visit_occurrence_id, OP.observation_period_start_date as op_start_date, OP.observation_period_end_date as op_end_date +FROM (-- Begin Observation Criteria +select C.person_id, C.observation_id as event_id, C.observation_date as start_date, (C.observation_date + 1*INTERVAL'1 day') as END_DATE, + C.observation_concept_id as TARGET_CONCEPT_ID, C.visit_occurrence_id, + C.observation_date as sort_date +from +( + select o.* , row_number() over (PARTITION BY o.person_id ORDER BY o.observation_date, o.observation_id) as ordinal + FROM cdm.OBSERVATION o +JOIN Codesets codesets on ((o.observation_concept_id = codesets.concept_id and codesets.codeset_id = 0) AND (o.observation_source_concept_id = codesets.concept_id and codesets.codeset_id = 0)) +) C +JOIN cdm.PERSON P on C.person_id = P.person_id +JOIN cdm.VISIT_OCCURRENCE V on C.visit_occurrence_id = V.visit_occurrence_id and C.person_id = V.person_id +LEFT JOIN cdm.PROVIDER PR on C.provider_id = PR.provider_id +WHERE (C.observation_date >= TO_DATE(TO_CHAR(1900,'0000')||'-'||TO_CHAR(1,'00')||'-'||TO_CHAR(1,'00'), 'YYYY-MM-DD') and C.observation_date <= TO_DATE(TO_CHAR(2099,'0000')||'-'||TO_CHAR(1,'00')||'-'||TO_CHAR(1,'00'), 'YYYY-MM-DD')) +AND C.observation_type_concept_id in (38000183,38000199) +AND (C.value_as_number >= 0.0000 and C.value_as_number <= 99.0000) +AND C.value_as_string like '%some value%' +AND C.value_as_concept_id in (36312355) +AND C.qualifier_concept_id in (4172703,4171754) +AND C.unit_concept_id in (8554) +AND (EXTRACT(YEAR FROM C.observation_date) - P.year_of_birth >= 0 and EXTRACT(YEAR FROM C.observation_date) - P.year_of_birth <= 99) +AND P.gender_concept_id in (8532,8507) +AND PR.specialty_concept_id in (38004446,38003627) +AND V.visit_concept_id in (262,9201) +AND C.ordinal = 1 +-- End Observation Criteria +) Q +JOIN cdm.OBSERVATION_PERIOD OP on Q.person_id = OP.person_id + and OP.observation_period_start_date <= Q.start_date and OP.observation_period_end_date >= Q.start_date +) P +INNER JOIN +( + -- Begin Observation Criteria +select C.person_id, C.observation_id as event_id, C.observation_date as start_date, (C.observation_date + 1*INTERVAL'1 day') as END_DATE, + C.observation_concept_id as TARGET_CONCEPT_ID, C.visit_occurrence_id, + C.observation_date as sort_date +from +( + select o.* + FROM cdm.OBSERVATION o +JOIN Codesets codesets on ((o.observation_concept_id = codesets.concept_id and codesets.codeset_id = 0)) +) C + + +-- End Observation Criteria + +) A on A.person_id = P.person_id AND A.START_DATE >= P.OP_START_DATE AND A.START_DATE <= P.OP_END_DATE AND A.START_DATE >= P.OP_START_DATE AND A.START_DATE <= P.OP_END_DATE AND A.visit_occurrence_id = P.visit_occurrence_id +GROUP BY p.person_id, p.event_id +HAVING COUNT(A.TARGET_CONCEPT_ID) >= 1 +-- End Correlated Criteria + + ) CQ on E.person_id = CQ.person_id and E.event_id = CQ.event_id + GROUP BY E.person_id, E.event_id + HAVING COUNT(index_id) = 1 +) G +-- End Criteria Group +) AC on AC.person_id = pe.person_id and AC.event_id = pe.event_id + +) A on A.person_id = P.person_id AND A.START_DATE >= P.OP_START_DATE AND A.START_DATE <= P.OP_END_DATE AND A.START_DATE >= (P.START_DATE + -30*INTERVAL'1 day') AND A.START_DATE <= (P.START_DATE + 30*INTERVAL'1 day') +GROUP BY p.person_id, p.event_id +HAVING COUNT(A.TARGET_CONCEPT_ID) >= 1 +-- End Correlated Criteria + + ) CQ on E.person_id = CQ.person_id and E.event_id = CQ.event_id + GROUP BY E.person_id, E.event_id + HAVING COUNT(index_id) = 1 +) G +-- End Criteria Group +) AC on AC.person_id = pe.person_id AND AC.event_id = pe.event_id +) Results +; +ANALYZE Inclusion_8 +; + +CREATE TEMP TABLE Inclusion_9 + +AS +SELECT +9 as inclusion_rule_id, person_id, event_id + +FROM +( + select pe.person_id, pe.event_id + FROM qualified_events pe + +JOIN ( +-- Begin Criteria Group +select 0 as index_id, person_id, event_id +FROM +( + select E.person_id, E.event_id + FROM qualified_events E + INNER JOIN + ( + -- Begin Correlated Criteria +SELECT 0 as index_id, p.person_id, p.event_id +FROM qualified_events P +INNER JOIN +( + select PE.person_id, PE.event_id, PE.start_date, PE.end_date, PE.target_concept_id, PE.visit_occurrence_id, PE.sort_date FROM ( +-- Begin Observation Period Criteria +select C.person_id, C.observation_period_id as event_id, TO_DATE(TO_CHAR(1900,'0000')||'-'||TO_CHAR(1,'00')||'-'||TO_CHAR(1,'00'), 'YYYY-MM-DD') as start_date, TO_DATE(TO_CHAR(2099,'0000')||'-'||TO_CHAR(1,'00')||'-'||TO_CHAR(1,'00'), 'YYYY-MM-DD') as end_date, + C.period_type_concept_id as TARGET_CONCEPT_ID, CAST(NULL as bigint) as visit_occurrence_id, + C.observation_period_start_date as sort_date + +from +( + select op.*, row_number() over (PARTITION BY op.person_id ORDER BY op.observation_period_start_date) as ordinal + FROM cdm.OBSERVATION_PERIOD op +) C +JOIN cdm.PERSON P on C.person_id = P.person_id +WHERE C.ordinal = 1 +AND C.OBSERVATION_PERIOD_START_DATE <= TO_DATE(TO_CHAR(1900,'0000')||'-'||TO_CHAR(1,'00')||'-'||TO_CHAR(1,'00'), 'YYYY-MM-DD') and C.OBSERVATION_PERIOD_END_DATE >= TO_DATE(TO_CHAR(1900,'0000')||'-'||TO_CHAR(1,'00')||'-'||TO_CHAR(1,'00'), 'YYYY-MM-DD') +AND C.OBSERVATION_PERIOD_START_DATE <= TO_DATE(TO_CHAR(2099,'0000')||'-'||TO_CHAR(1,'00')||'-'||TO_CHAR(1,'00'), 'YYYY-MM-DD') and C.OBSERVATION_PERIOD_END_DATE >= TO_DATE(TO_CHAR(2099,'0000')||'-'||TO_CHAR(1,'00')||'-'||TO_CHAR(1,'00'), 'YYYY-MM-DD') +AND (C.observation_period_start_date >= TO_DATE(TO_CHAR(1900,'0000')||'-'||TO_CHAR(1,'00')||'-'||TO_CHAR(1,'00'), 'YYYY-MM-DD') and C.observation_period_start_date <= TO_DATE(TO_CHAR(2099,'0000')||'-'||TO_CHAR(1,'00')||'-'||TO_CHAR(1,'00'), 'YYYY-MM-DD')) +AND (C.observation_period_end_date >= TO_DATE(TO_CHAR(1900,'0000')||'-'||TO_CHAR(1,'00')||'-'||TO_CHAR(1,'00'), 'YYYY-MM-DD') and C.observation_period_end_date <= TO_DATE(TO_CHAR(2099,'0000')||'-'||TO_CHAR(1,'00')||'-'||TO_CHAR(1,'00'), 'YYYY-MM-DD')) +AND C.period_type_concept_id in (38000183,38000199) +AND ((CAST(C.observation_period_end_date AS DATE) - CAST(C.observation_period_start_date AS DATE)) >= 0 and (CAST(C.observation_period_end_date AS DATE) - CAST(C.observation_period_start_date AS DATE)) <= 99) +AND (EXTRACT(YEAR FROM C.observation_period_start_date) - P.year_of_birth >= 0 and EXTRACT(YEAR FROM C.observation_period_start_date) - P.year_of_birth <= 99) +AND (EXTRACT(YEAR FROM C.observation_period_end_date) - P.year_of_birth >= 0 and EXTRACT(YEAR FROM C.observation_period_end_date) - P.year_of_birth <= 99) +-- End Observation Period Criteria + +) PE +JOIN ( +-- Begin Criteria Group +select 0 as index_id, person_id, event_id +FROM +( + select E.person_id, E.event_id + FROM (SELECT Q.person_id, Q.event_id, Q.start_date, Q.end_date, Q.visit_occurrence_id, OP.observation_period_start_date as op_start_date, OP.observation_period_end_date as op_end_date +FROM (-- Begin Observation Period Criteria +select C.person_id, C.observation_period_id as event_id, TO_DATE(TO_CHAR(1900,'0000')||'-'||TO_CHAR(1,'00')||'-'||TO_CHAR(1,'00'), 'YYYY-MM-DD') as start_date, TO_DATE(TO_CHAR(2099,'0000')||'-'||TO_CHAR(1,'00')||'-'||TO_CHAR(1,'00'), 'YYYY-MM-DD') as end_date, + C.period_type_concept_id as TARGET_CONCEPT_ID, CAST(NULL as bigint) as visit_occurrence_id, + C.observation_period_start_date as sort_date + +from +( + select op.*, row_number() over (PARTITION BY op.person_id ORDER BY op.observation_period_start_date) as ordinal + FROM cdm.OBSERVATION_PERIOD op +) C +JOIN cdm.PERSON P on C.person_id = P.person_id +WHERE C.ordinal = 1 +AND C.OBSERVATION_PERIOD_START_DATE <= TO_DATE(TO_CHAR(1900,'0000')||'-'||TO_CHAR(1,'00')||'-'||TO_CHAR(1,'00'), 'YYYY-MM-DD') and C.OBSERVATION_PERIOD_END_DATE >= TO_DATE(TO_CHAR(1900,'0000')||'-'||TO_CHAR(1,'00')||'-'||TO_CHAR(1,'00'), 'YYYY-MM-DD') +AND C.OBSERVATION_PERIOD_START_DATE <= TO_DATE(TO_CHAR(2099,'0000')||'-'||TO_CHAR(1,'00')||'-'||TO_CHAR(1,'00'), 'YYYY-MM-DD') and C.OBSERVATION_PERIOD_END_DATE >= TO_DATE(TO_CHAR(2099,'0000')||'-'||TO_CHAR(1,'00')||'-'||TO_CHAR(1,'00'), 'YYYY-MM-DD') +AND (C.observation_period_start_date >= TO_DATE(TO_CHAR(1900,'0000')||'-'||TO_CHAR(1,'00')||'-'||TO_CHAR(1,'00'), 'YYYY-MM-DD') and C.observation_period_start_date <= TO_DATE(TO_CHAR(2099,'0000')||'-'||TO_CHAR(1,'00')||'-'||TO_CHAR(1,'00'), 'YYYY-MM-DD')) +AND (C.observation_period_end_date >= TO_DATE(TO_CHAR(1900,'0000')||'-'||TO_CHAR(1,'00')||'-'||TO_CHAR(1,'00'), 'YYYY-MM-DD') and C.observation_period_end_date <= TO_DATE(TO_CHAR(2099,'0000')||'-'||TO_CHAR(1,'00')||'-'||TO_CHAR(1,'00'), 'YYYY-MM-DD')) +AND C.period_type_concept_id in (38000183,38000199) +AND ((CAST(C.observation_period_end_date AS DATE) - CAST(C.observation_period_start_date AS DATE)) >= 0 and (CAST(C.observation_period_end_date AS DATE) - CAST(C.observation_period_start_date AS DATE)) <= 99) +AND (EXTRACT(YEAR FROM C.observation_period_start_date) - P.year_of_birth >= 0 and EXTRACT(YEAR FROM C.observation_period_start_date) - P.year_of_birth <= 99) +AND (EXTRACT(YEAR FROM C.observation_period_end_date) - P.year_of_birth >= 0 and EXTRACT(YEAR FROM C.observation_period_end_date) - P.year_of_birth <= 99) +-- End Observation Period Criteria +) Q +JOIN cdm.OBSERVATION_PERIOD OP on Q.person_id = OP.person_id + and OP.observation_period_start_date <= Q.start_date and OP.observation_period_end_date >= Q.start_date +) E + INNER JOIN + ( + -- Begin Correlated Criteria +SELECT 0 as index_id, p.person_id, p.event_id +FROM (SELECT Q.person_id, Q.event_id, Q.start_date, Q.end_date, Q.visit_occurrence_id, OP.observation_period_start_date as op_start_date, OP.observation_period_end_date as op_end_date +FROM (-- Begin Observation Period Criteria +select C.person_id, C.observation_period_id as event_id, TO_DATE(TO_CHAR(1900,'0000')||'-'||TO_CHAR(1,'00')||'-'||TO_CHAR(1,'00'), 'YYYY-MM-DD') as start_date, TO_DATE(TO_CHAR(2099,'0000')||'-'||TO_CHAR(1,'00')||'-'||TO_CHAR(1,'00'), 'YYYY-MM-DD') as end_date, + C.period_type_concept_id as TARGET_CONCEPT_ID, CAST(NULL as bigint) as visit_occurrence_id, + C.observation_period_start_date as sort_date + +from +( + select op.*, row_number() over (PARTITION BY op.person_id ORDER BY op.observation_period_start_date) as ordinal + FROM cdm.OBSERVATION_PERIOD op +) C +JOIN cdm.PERSON P on C.person_id = P.person_id +WHERE C.ordinal = 1 +AND C.OBSERVATION_PERIOD_START_DATE <= TO_DATE(TO_CHAR(1900,'0000')||'-'||TO_CHAR(1,'00')||'-'||TO_CHAR(1,'00'), 'YYYY-MM-DD') and C.OBSERVATION_PERIOD_END_DATE >= TO_DATE(TO_CHAR(1900,'0000')||'-'||TO_CHAR(1,'00')||'-'||TO_CHAR(1,'00'), 'YYYY-MM-DD') +AND C.OBSERVATION_PERIOD_START_DATE <= TO_DATE(TO_CHAR(2099,'0000')||'-'||TO_CHAR(1,'00')||'-'||TO_CHAR(1,'00'), 'YYYY-MM-DD') and C.OBSERVATION_PERIOD_END_DATE >= TO_DATE(TO_CHAR(2099,'0000')||'-'||TO_CHAR(1,'00')||'-'||TO_CHAR(1,'00'), 'YYYY-MM-DD') +AND (C.observation_period_start_date >= TO_DATE(TO_CHAR(1900,'0000')||'-'||TO_CHAR(1,'00')||'-'||TO_CHAR(1,'00'), 'YYYY-MM-DD') and C.observation_period_start_date <= TO_DATE(TO_CHAR(2099,'0000')||'-'||TO_CHAR(1,'00')||'-'||TO_CHAR(1,'00'), 'YYYY-MM-DD')) +AND (C.observation_period_end_date >= TO_DATE(TO_CHAR(1900,'0000')||'-'||TO_CHAR(1,'00')||'-'||TO_CHAR(1,'00'), 'YYYY-MM-DD') and C.observation_period_end_date <= TO_DATE(TO_CHAR(2099,'0000')||'-'||TO_CHAR(1,'00')||'-'||TO_CHAR(1,'00'), 'YYYY-MM-DD')) +AND C.period_type_concept_id in (38000183,38000199) +AND ((CAST(C.observation_period_end_date AS DATE) - CAST(C.observation_period_start_date AS DATE)) >= 0 and (CAST(C.observation_period_end_date AS DATE) - CAST(C.observation_period_start_date AS DATE)) <= 99) +AND (EXTRACT(YEAR FROM C.observation_period_start_date) - P.year_of_birth >= 0 and EXTRACT(YEAR FROM C.observation_period_start_date) - P.year_of_birth <= 99) +AND (EXTRACT(YEAR FROM C.observation_period_end_date) - P.year_of_birth >= 0 and EXTRACT(YEAR FROM C.observation_period_end_date) - P.year_of_birth <= 99) +-- End Observation Period Criteria +) Q +JOIN cdm.OBSERVATION_PERIOD OP on Q.person_id = OP.person_id + and OP.observation_period_start_date <= Q.start_date and OP.observation_period_end_date >= Q.start_date +) P +INNER JOIN +( + -- Begin Observation Period Criteria +select C.person_id, C.observation_period_id as event_id, C.observation_period_start_date as start_date, C.observation_period_end_date as end_date, + C.period_type_concept_id as TARGET_CONCEPT_ID, CAST(NULL as bigint) as visit_occurrence_id, + C.observation_period_start_date as sort_date + +from +( + select op.*, row_number() over (PARTITION BY op.person_id ORDER BY op.observation_period_start_date) as ordinal + FROM cdm.OBSERVATION_PERIOD op +) C + + +-- End Observation Period Criteria + +) A on A.person_id = P.person_id +GROUP BY p.person_id, p.event_id +HAVING COUNT(A.TARGET_CONCEPT_ID) >= 1 +-- End Correlated Criteria + + ) CQ on E.person_id = CQ.person_id and E.event_id = CQ.event_id + GROUP BY E.person_id, E.event_id + HAVING COUNT(index_id) = 1 +) G +-- End Criteria Group +) AC on AC.person_id = pe.person_id and AC.event_id = pe.event_id + +) A on A.person_id = P.person_id AND A.START_DATE >= P.OP_START_DATE AND A.START_DATE <= P.OP_END_DATE AND A.START_DATE >= (P.START_DATE + -30*INTERVAL'1 day') AND A.START_DATE <= (P.START_DATE + 30*INTERVAL'1 day') +GROUP BY p.person_id, p.event_id +HAVING COUNT(A.TARGET_CONCEPT_ID) >= 1 +-- End Correlated Criteria + + ) CQ on E.person_id = CQ.person_id and E.event_id = CQ.event_id + GROUP BY E.person_id, E.event_id + HAVING COUNT(index_id) = 1 +) G +-- End Criteria Group +) AC on AC.person_id = pe.person_id AND AC.event_id = pe.event_id +) Results +; +ANALYZE Inclusion_9 +; + +CREATE TEMP TABLE Inclusion_10 + +AS +SELECT +10 as inclusion_rule_id, person_id, event_id + +FROM +( + select pe.person_id, pe.event_id + FROM qualified_events pe + +JOIN ( +-- Begin Criteria Group +select 0 as index_id, person_id, event_id +FROM +( + select E.person_id, E.event_id + FROM qualified_events E + INNER JOIN + ( + -- Begin Correlated Criteria +SELECT 0 as index_id, p.person_id, p.event_id +FROM qualified_events P +INNER JOIN +( + select PE.person_id, PE.event_id, PE.start_date, PE.end_date, PE.target_concept_id, PE.visit_occurrence_id, PE.sort_date FROM ( +-- Begin Procedure Occurrence Criteria +select C.person_id, C.procedure_occurrence_id as event_id, C.procedure_date as start_date, (C.procedure_date + 1*INTERVAL'1 day') as END_DATE, + C.procedure_concept_id as TARGET_CONCEPT_ID, C.visit_occurrence_id, + C.procedure_date as sort_date +from +( + select po.* , row_number() over (PARTITION BY po.person_id ORDER BY po.procedure_date, po.procedure_occurrence_id) as ordinal + FROM cdm.PROCEDURE_OCCURRENCE po +JOIN Codesets codesets on ((po.procedure_concept_id = codesets.concept_id and codesets.codeset_id = 0)) +) C +JOIN cdm.PERSON P on C.person_id = P.person_id +JOIN cdm.VISIT_OCCURRENCE V on C.visit_occurrence_id = V.visit_occurrence_id and C.person_id = V.person_id +LEFT JOIN cdm.PROVIDER PR on C.provider_id = PR.provider_id +WHERE (C.procedure_date >= TO_DATE(TO_CHAR(1900,'0000')||'-'||TO_CHAR(1,'00')||'-'||TO_CHAR(1,'00'), 'YYYY-MM-DD') and C.procedure_date <= TO_DATE(TO_CHAR(2099,'0000')||'-'||TO_CHAR(1,'00')||'-'||TO_CHAR(1,'00'), 'YYYY-MM-DD')) +AND C.procedure_type_concept_id in (38000183,38000199) +AND C.modifier_concept_id in (4000804,4001771) +AND (C.quantity >= 0 and C.quantity <= 99) +AND (EXTRACT(YEAR FROM C.procedure_date) - P.year_of_birth >= 0 and EXTRACT(YEAR FROM C.procedure_date) - P.year_of_birth <= 99) +AND P.gender_concept_id in (8532,8507) +AND PR.specialty_concept_id in (38004446,38003627) +AND V.visit_concept_id in (262,9201) +AND C.ordinal = 1 +-- End Procedure Occurrence Criteria + +) PE +JOIN ( +-- Begin Criteria Group +select 0 as index_id, person_id, event_id +FROM +( + select E.person_id, E.event_id + FROM (SELECT Q.person_id, Q.event_id, Q.start_date, Q.end_date, Q.visit_occurrence_id, OP.observation_period_start_date as op_start_date, OP.observation_period_end_date as op_end_date +FROM (-- Begin Procedure Occurrence Criteria +select C.person_id, C.procedure_occurrence_id as event_id, C.procedure_date as start_date, (C.procedure_date + 1*INTERVAL'1 day') as END_DATE, + C.procedure_concept_id as TARGET_CONCEPT_ID, C.visit_occurrence_id, + C.procedure_date as sort_date +from +( + select po.* , row_number() over (PARTITION BY po.person_id ORDER BY po.procedure_date, po.procedure_occurrence_id) as ordinal + FROM cdm.PROCEDURE_OCCURRENCE po +JOIN Codesets codesets on ((po.procedure_concept_id = codesets.concept_id and codesets.codeset_id = 0)) +) C +JOIN cdm.PERSON P on C.person_id = P.person_id +JOIN cdm.VISIT_OCCURRENCE V on C.visit_occurrence_id = V.visit_occurrence_id and C.person_id = V.person_id +LEFT JOIN cdm.PROVIDER PR on C.provider_id = PR.provider_id +WHERE (C.procedure_date >= TO_DATE(TO_CHAR(1900,'0000')||'-'||TO_CHAR(1,'00')||'-'||TO_CHAR(1,'00'), 'YYYY-MM-DD') and C.procedure_date <= TO_DATE(TO_CHAR(2099,'0000')||'-'||TO_CHAR(1,'00')||'-'||TO_CHAR(1,'00'), 'YYYY-MM-DD')) +AND C.procedure_type_concept_id in (38000183,38000199) +AND C.modifier_concept_id in (4000804,4001771) +AND (C.quantity >= 0 and C.quantity <= 99) +AND (EXTRACT(YEAR FROM C.procedure_date) - P.year_of_birth >= 0 and EXTRACT(YEAR FROM C.procedure_date) - P.year_of_birth <= 99) +AND P.gender_concept_id in (8532,8507) +AND PR.specialty_concept_id in (38004446,38003627) +AND V.visit_concept_id in (262,9201) +AND C.ordinal = 1 +-- End Procedure Occurrence Criteria +) Q +JOIN cdm.OBSERVATION_PERIOD OP on Q.person_id = OP.person_id + and OP.observation_period_start_date <= Q.start_date and OP.observation_period_end_date >= Q.start_date +) E + INNER JOIN + ( + -- Begin Correlated Criteria +SELECT 0 as index_id, p.person_id, p.event_id +FROM (SELECT Q.person_id, Q.event_id, Q.start_date, Q.end_date, Q.visit_occurrence_id, OP.observation_period_start_date as op_start_date, OP.observation_period_end_date as op_end_date +FROM (-- Begin Procedure Occurrence Criteria +select C.person_id, C.procedure_occurrence_id as event_id, C.procedure_date as start_date, (C.procedure_date + 1*INTERVAL'1 day') as END_DATE, + C.procedure_concept_id as TARGET_CONCEPT_ID, C.visit_occurrence_id, + C.procedure_date as sort_date +from +( + select po.* , row_number() over (PARTITION BY po.person_id ORDER BY po.procedure_date, po.procedure_occurrence_id) as ordinal + FROM cdm.PROCEDURE_OCCURRENCE po +JOIN Codesets codesets on ((po.procedure_concept_id = codesets.concept_id and codesets.codeset_id = 0)) +) C +JOIN cdm.PERSON P on C.person_id = P.person_id +JOIN cdm.VISIT_OCCURRENCE V on C.visit_occurrence_id = V.visit_occurrence_id and C.person_id = V.person_id +LEFT JOIN cdm.PROVIDER PR on C.provider_id = PR.provider_id +WHERE (C.procedure_date >= TO_DATE(TO_CHAR(1900,'0000')||'-'||TO_CHAR(1,'00')||'-'||TO_CHAR(1,'00'), 'YYYY-MM-DD') and C.procedure_date <= TO_DATE(TO_CHAR(2099,'0000')||'-'||TO_CHAR(1,'00')||'-'||TO_CHAR(1,'00'), 'YYYY-MM-DD')) +AND C.procedure_type_concept_id in (38000183,38000199) +AND C.modifier_concept_id in (4000804,4001771) +AND (C.quantity >= 0 and C.quantity <= 99) +AND (EXTRACT(YEAR FROM C.procedure_date) - P.year_of_birth >= 0 and EXTRACT(YEAR FROM C.procedure_date) - P.year_of_birth <= 99) +AND P.gender_concept_id in (8532,8507) +AND PR.specialty_concept_id in (38004446,38003627) +AND V.visit_concept_id in (262,9201) +AND C.ordinal = 1 +-- End Procedure Occurrence Criteria +) Q +JOIN cdm.OBSERVATION_PERIOD OP on Q.person_id = OP.person_id + and OP.observation_period_start_date <= Q.start_date and OP.observation_period_end_date >= Q.start_date +) P +INNER JOIN +( + -- Begin Procedure Occurrence Criteria +select C.person_id, C.procedure_occurrence_id as event_id, C.procedure_date as start_date, (C.procedure_date + 1*INTERVAL'1 day') as END_DATE, + C.procedure_concept_id as TARGET_CONCEPT_ID, C.visit_occurrence_id, + C.procedure_date as sort_date +from +( + select po.* + FROM cdm.PROCEDURE_OCCURRENCE po +JOIN Codesets codesets on ((po.procedure_concept_id = codesets.concept_id and codesets.codeset_id = 0)) +) C + + +-- End Procedure Occurrence Criteria + +) A on A.person_id = P.person_id AND A.visit_occurrence_id = P.visit_occurrence_id +GROUP BY p.person_id, p.event_id +HAVING COUNT(A.TARGET_CONCEPT_ID) >= 1 +-- End Correlated Criteria + + ) CQ on E.person_id = CQ.person_id and E.event_id = CQ.event_id + GROUP BY E.person_id, E.event_id + HAVING COUNT(index_id) = 1 +) G +-- End Criteria Group +) AC on AC.person_id = pe.person_id and AC.event_id = pe.event_id + +) A on A.person_id = P.person_id AND A.START_DATE >= P.OP_START_DATE AND A.START_DATE <= P.OP_END_DATE AND A.START_DATE >= (P.START_DATE + -30*INTERVAL'1 day') AND A.START_DATE <= (P.START_DATE + 30*INTERVAL'1 day') +GROUP BY p.person_id, p.event_id +HAVING COUNT(A.TARGET_CONCEPT_ID) >= 1 +-- End Correlated Criteria + + ) CQ on E.person_id = CQ.person_id and E.event_id = CQ.event_id + GROUP BY E.person_id, E.event_id + HAVING COUNT(index_id) = 1 +) G +-- End Criteria Group +) AC on AC.person_id = pe.person_id AND AC.event_id = pe.event_id +) Results +; +ANALYZE Inclusion_10 +; + +CREATE TEMP TABLE Inclusion_11 + +AS +SELECT +11 as inclusion_rule_id, person_id, event_id + +FROM +( + select pe.person_id, pe.event_id + FROM qualified_events pe + +JOIN ( +-- Begin Criteria Group +select 0 as index_id, person_id, event_id +FROM +( + select E.person_id, E.event_id + FROM qualified_events E + INNER JOIN + ( + -- Begin Correlated Criteria +SELECT 0 as index_id, p.person_id, p.event_id +FROM qualified_events P +INNER JOIN +( + select PE.person_id, PE.event_id, PE.start_date, PE.end_date, PE.target_concept_id, PE.visit_occurrence_id, PE.sort_date FROM ( +-- Begin Specimen Criteria +select C.person_id, C.specimen_id as event_id, C.specimen_date as start_date, (C.specimen_date + 1*INTERVAL'1 day') as end_date, + C.specimen_concept_id as TARGET_CONCEPT_ID, CAST(NULL as bigint) as visit_occurrence_id, + C.specimen_date as sort_date +from +( + select s.* , row_number() over (PARTITION BY s.person_id ORDER BY s.specimen_date, s.specimen_id) as ordinal + FROM cdm.SPECIMEN s +where s.specimen_concept_id in (SELECT concept_id from Codesets where codeset_id = 0) +) C +JOIN cdm.PERSON P on C.person_id = P.person_id +WHERE (C.specimen_date >= TO_DATE(TO_CHAR(1900,'0000')||'-'||TO_CHAR(1,'00')||'-'||TO_CHAR(1,'00'), 'YYYY-MM-DD') and C.specimen_date <= TO_DATE(TO_CHAR(2099,'0000')||'-'||TO_CHAR(1,'00')||'-'||TO_CHAR(1,'00'), 'YYYY-MM-DD')) +AND C.specimen_type_concept_id in (38000183,38000199) +AND (C.quantity >= 0.0000 and C.quantity <= 99.0000) +AND C.unit_concept_id in (8688,9218) +AND C.anatomic_site_concept_id in (4002601,4001422,4001433) +AND C.disease_status_concept_id in (4066212) +AND C.specimen_source_id like '%some sourceID%' +AND (EXTRACT(YEAR FROM C.specimen_date) - P.year_of_birth >= 0 and EXTRACT(YEAR FROM C.specimen_date) - P.year_of_birth <= 99) +AND P.gender_concept_id in (8532,8507) +AND C.ordinal = 1 +-- End Specimen Criteria + +) PE +JOIN ( +-- Begin Criteria Group +select 0 as index_id, person_id, event_id +FROM +( + select E.person_id, E.event_id + FROM (SELECT Q.person_id, Q.event_id, Q.start_date, Q.end_date, Q.visit_occurrence_id, OP.observation_period_start_date as op_start_date, OP.observation_period_end_date as op_end_date +FROM (-- Begin Specimen Criteria +select C.person_id, C.specimen_id as event_id, C.specimen_date as start_date, (C.specimen_date + 1*INTERVAL'1 day') as end_date, + C.specimen_concept_id as TARGET_CONCEPT_ID, CAST(NULL as bigint) as visit_occurrence_id, + C.specimen_date as sort_date +from +( + select s.* , row_number() over (PARTITION BY s.person_id ORDER BY s.specimen_date, s.specimen_id) as ordinal + FROM cdm.SPECIMEN s +where s.specimen_concept_id in (SELECT concept_id from Codesets where codeset_id = 0) +) C +JOIN cdm.PERSON P on C.person_id = P.person_id +WHERE (C.specimen_date >= TO_DATE(TO_CHAR(1900,'0000')||'-'||TO_CHAR(1,'00')||'-'||TO_CHAR(1,'00'), 'YYYY-MM-DD') and C.specimen_date <= TO_DATE(TO_CHAR(2099,'0000')||'-'||TO_CHAR(1,'00')||'-'||TO_CHAR(1,'00'), 'YYYY-MM-DD')) +AND C.specimen_type_concept_id in (38000183,38000199) +AND (C.quantity >= 0.0000 and C.quantity <= 99.0000) +AND C.unit_concept_id in (8688,9218) +AND C.anatomic_site_concept_id in (4002601,4001422,4001433) +AND C.disease_status_concept_id in (4066212) +AND C.specimen_source_id like '%some sourceID%' +AND (EXTRACT(YEAR FROM C.specimen_date) - P.year_of_birth >= 0 and EXTRACT(YEAR FROM C.specimen_date) - P.year_of_birth <= 99) +AND P.gender_concept_id in (8532,8507) +AND C.ordinal = 1 +-- End Specimen Criteria +) Q +JOIN cdm.OBSERVATION_PERIOD OP on Q.person_id = OP.person_id + and OP.observation_period_start_date <= Q.start_date and OP.observation_period_end_date >= Q.start_date +) E + INNER JOIN + ( + -- Begin Correlated Criteria +SELECT 0 as index_id, p.person_id, p.event_id +FROM (SELECT Q.person_id, Q.event_id, Q.start_date, Q.end_date, Q.visit_occurrence_id, OP.observation_period_start_date as op_start_date, OP.observation_period_end_date as op_end_date +FROM (-- Begin Specimen Criteria +select C.person_id, C.specimen_id as event_id, C.specimen_date as start_date, (C.specimen_date + 1*INTERVAL'1 day') as end_date, + C.specimen_concept_id as TARGET_CONCEPT_ID, CAST(NULL as bigint) as visit_occurrence_id, + C.specimen_date as sort_date +from +( + select s.* , row_number() over (PARTITION BY s.person_id ORDER BY s.specimen_date, s.specimen_id) as ordinal + FROM cdm.SPECIMEN s +where s.specimen_concept_id in (SELECT concept_id from Codesets where codeset_id = 0) +) C +JOIN cdm.PERSON P on C.person_id = P.person_id +WHERE (C.specimen_date >= TO_DATE(TO_CHAR(1900,'0000')||'-'||TO_CHAR(1,'00')||'-'||TO_CHAR(1,'00'), 'YYYY-MM-DD') and C.specimen_date <= TO_DATE(TO_CHAR(2099,'0000')||'-'||TO_CHAR(1,'00')||'-'||TO_CHAR(1,'00'), 'YYYY-MM-DD')) +AND C.specimen_type_concept_id in (38000183,38000199) +AND (C.quantity >= 0.0000 and C.quantity <= 99.0000) +AND C.unit_concept_id in (8688,9218) +AND C.anatomic_site_concept_id in (4002601,4001422,4001433) +AND C.disease_status_concept_id in (4066212) +AND C.specimen_source_id like '%some sourceID%' +AND (EXTRACT(YEAR FROM C.specimen_date) - P.year_of_birth >= 0 and EXTRACT(YEAR FROM C.specimen_date) - P.year_of_birth <= 99) +AND P.gender_concept_id in (8532,8507) +AND C.ordinal = 1 +-- End Specimen Criteria +) Q +JOIN cdm.OBSERVATION_PERIOD OP on Q.person_id = OP.person_id + and OP.observation_period_start_date <= Q.start_date and OP.observation_period_end_date >= Q.start_date +) P +INNER JOIN +( + -- Begin Specimen Criteria +select C.person_id, C.specimen_id as event_id, C.specimen_date as start_date, (C.specimen_date + 1*INTERVAL'1 day') as end_date, + C.specimen_concept_id as TARGET_CONCEPT_ID, CAST(NULL as bigint) as visit_occurrence_id, + C.specimen_date as sort_date +from +( + select s.* + FROM cdm.SPECIMEN s +where s.specimen_concept_id in (SELECT concept_id from Codesets where codeset_id = 0) +) C + + +-- End Specimen Criteria + +) A on A.person_id = P.person_id +GROUP BY p.person_id, p.event_id +HAVING COUNT(A.TARGET_CONCEPT_ID) >= 1 +-- End Correlated Criteria + + ) CQ on E.person_id = CQ.person_id and E.event_id = CQ.event_id + GROUP BY E.person_id, E.event_id + HAVING COUNT(index_id) = 1 +) G +-- End Criteria Group +) AC on AC.person_id = pe.person_id and AC.event_id = pe.event_id + +) A on A.person_id = P.person_id AND A.START_DATE >= P.OP_START_DATE AND A.START_DATE <= P.OP_END_DATE AND A.START_DATE >= (P.START_DATE + -30*INTERVAL'1 day') AND A.START_DATE <= (P.START_DATE + 30*INTERVAL'1 day') +GROUP BY p.person_id, p.event_id +HAVING COUNT(A.TARGET_CONCEPT_ID) >= 1 +-- End Correlated Criteria + + ) CQ on E.person_id = CQ.person_id and E.event_id = CQ.event_id + GROUP BY E.person_id, E.event_id + HAVING COUNT(index_id) = 1 +) G +-- End Criteria Group +) AC on AC.person_id = pe.person_id AND AC.event_id = pe.event_id +) Results +; +ANALYZE Inclusion_11 +; + +CREATE TEMP TABLE Inclusion_12 + +AS +SELECT +12 as inclusion_rule_id, person_id, event_id + +FROM +( + select pe.person_id, pe.event_id + FROM qualified_events pe + +JOIN ( +-- Begin Criteria Group +select 0 as index_id, person_id, event_id +FROM +( + select E.person_id, E.event_id + FROM qualified_events E + INNER JOIN + ( + -- Begin Correlated Criteria +SELECT 0 as index_id, p.person_id, p.event_id +FROM qualified_events P +INNER JOIN +( + select PE.person_id, PE.event_id, PE.start_date, PE.end_date, PE.target_concept_id, PE.visit_occurrence_id, PE.sort_date FROM ( +-- Begin Visit Occurrence Criteria +select C.person_id, C.visit_occurrence_id as event_id, C.visit_start_date as start_date, C.visit_end_date as end_date, + C.visit_concept_id as TARGET_CONCEPT_ID, C.visit_occurrence_id, + C.visit_start_date as sort_date +from +( + select vo.* , row_number() over (PARTITION BY vo.person_id ORDER BY vo.visit_start_date, vo.visit_occurrence_id) as ordinal + FROM cdm.VISIT_OCCURRENCE vo +JOIN Codesets codesets on ((vo.visit_concept_id = codesets.concept_id and codesets.codeset_id = 0) AND (vo.visit_source_concept_id = codesets.concept_id and codesets.codeset_id = 0)) +) C +JOIN cdm.PERSON P on C.person_id = P.person_id +JOIN cdm.CARE_SITE CS on C.care_site_id = CS.care_site_id +LEFT JOIN cdm.PROVIDER PR on C.provider_id = PR.provider_id +WHERE (C.visit_start_date >= TO_DATE(TO_CHAR(1900,'0000')||'-'||TO_CHAR(1,'00')||'-'||TO_CHAR(1,'00'), 'YYYY-MM-DD') and C.visit_start_date <= TO_DATE(TO_CHAR(2099,'0000')||'-'||TO_CHAR(1,'00')||'-'||TO_CHAR(1,'00'), 'YYYY-MM-DD')) +AND (C.visit_end_date >= TO_DATE(TO_CHAR(1900,'0000')||'-'||TO_CHAR(1,'00')||'-'||TO_CHAR(1,'00'), 'YYYY-MM-DD') and C.visit_end_date <= TO_DATE(TO_CHAR(2099,'0000')||'-'||TO_CHAR(1,'00')||'-'||TO_CHAR(1,'00'), 'YYYY-MM-DD')) +AND C.visit_type_concept_id in (38000183,38000199) +AND ((CAST(C.visit_end_date AS DATE) - CAST(C.visit_start_date AS DATE)) >= 0 and (CAST(C.visit_end_date AS DATE) - CAST(C.visit_start_date AS DATE)) <= 99) +AND (EXTRACT(YEAR FROM C.visit_start_date) - P.year_of_birth >= 0 and EXTRACT(YEAR FROM C.visit_start_date) - P.year_of_birth <= 99) +AND P.gender_concept_id in (8532,8507) +AND PR.specialty_concept_id in (38004446,38003627) +AND CS.place_of_service_concept_id in (42628591,42628592) +AND C.ordinal = 1 +-- End Visit Occurrence Criteria + +) PE +JOIN ( +-- Begin Criteria Group +select 0 as index_id, person_id, event_id +FROM +( + select E.person_id, E.event_id + FROM (SELECT Q.person_id, Q.event_id, Q.start_date, Q.end_date, Q.visit_occurrence_id, OP.observation_period_start_date as op_start_date, OP.observation_period_end_date as op_end_date +FROM (-- Begin Visit Occurrence Criteria +select C.person_id, C.visit_occurrence_id as event_id, C.visit_start_date as start_date, C.visit_end_date as end_date, + C.visit_concept_id as TARGET_CONCEPT_ID, C.visit_occurrence_id, + C.visit_start_date as sort_date +from +( + select vo.* , row_number() over (PARTITION BY vo.person_id ORDER BY vo.visit_start_date, vo.visit_occurrence_id) as ordinal + FROM cdm.VISIT_OCCURRENCE vo +JOIN Codesets codesets on ((vo.visit_concept_id = codesets.concept_id and codesets.codeset_id = 0) AND (vo.visit_source_concept_id = codesets.concept_id and codesets.codeset_id = 0)) +) C +JOIN cdm.PERSON P on C.person_id = P.person_id +JOIN cdm.CARE_SITE CS on C.care_site_id = CS.care_site_id +LEFT JOIN cdm.PROVIDER PR on C.provider_id = PR.provider_id +WHERE (C.visit_start_date >= TO_DATE(TO_CHAR(1900,'0000')||'-'||TO_CHAR(1,'00')||'-'||TO_CHAR(1,'00'), 'YYYY-MM-DD') and C.visit_start_date <= TO_DATE(TO_CHAR(2099,'0000')||'-'||TO_CHAR(1,'00')||'-'||TO_CHAR(1,'00'), 'YYYY-MM-DD')) +AND (C.visit_end_date >= TO_DATE(TO_CHAR(1900,'0000')||'-'||TO_CHAR(1,'00')||'-'||TO_CHAR(1,'00'), 'YYYY-MM-DD') and C.visit_end_date <= TO_DATE(TO_CHAR(2099,'0000')||'-'||TO_CHAR(1,'00')||'-'||TO_CHAR(1,'00'), 'YYYY-MM-DD')) +AND C.visit_type_concept_id in (38000183,38000199) +AND ((CAST(C.visit_end_date AS DATE) - CAST(C.visit_start_date AS DATE)) >= 0 and (CAST(C.visit_end_date AS DATE) - CAST(C.visit_start_date AS DATE)) <= 99) +AND (EXTRACT(YEAR FROM C.visit_start_date) - P.year_of_birth >= 0 and EXTRACT(YEAR FROM C.visit_start_date) - P.year_of_birth <= 99) +AND P.gender_concept_id in (8532,8507) +AND PR.specialty_concept_id in (38004446,38003627) +AND CS.place_of_service_concept_id in (42628591,42628592) +AND C.ordinal = 1 +-- End Visit Occurrence Criteria +) Q +JOIN cdm.OBSERVATION_PERIOD OP on Q.person_id = OP.person_id + and OP.observation_period_start_date <= Q.start_date and OP.observation_period_end_date >= Q.start_date +) E + INNER JOIN + ( + -- Begin Correlated Criteria +SELECT 0 as index_id, p.person_id, p.event_id +FROM (SELECT Q.person_id, Q.event_id, Q.start_date, Q.end_date, Q.visit_occurrence_id, OP.observation_period_start_date as op_start_date, OP.observation_period_end_date as op_end_date +FROM (-- Begin Visit Occurrence Criteria +select C.person_id, C.visit_occurrence_id as event_id, C.visit_start_date as start_date, C.visit_end_date as end_date, + C.visit_concept_id as TARGET_CONCEPT_ID, C.visit_occurrence_id, + C.visit_start_date as sort_date +from +( + select vo.* , row_number() over (PARTITION BY vo.person_id ORDER BY vo.visit_start_date, vo.visit_occurrence_id) as ordinal + FROM cdm.VISIT_OCCURRENCE vo +JOIN Codesets codesets on ((vo.visit_concept_id = codesets.concept_id and codesets.codeset_id = 0) AND (vo.visit_source_concept_id = codesets.concept_id and codesets.codeset_id = 0)) +) C +JOIN cdm.PERSON P on C.person_id = P.person_id +JOIN cdm.CARE_SITE CS on C.care_site_id = CS.care_site_id +LEFT JOIN cdm.PROVIDER PR on C.provider_id = PR.provider_id +WHERE (C.visit_start_date >= TO_DATE(TO_CHAR(1900,'0000')||'-'||TO_CHAR(1,'00')||'-'||TO_CHAR(1,'00'), 'YYYY-MM-DD') and C.visit_start_date <= TO_DATE(TO_CHAR(2099,'0000')||'-'||TO_CHAR(1,'00')||'-'||TO_CHAR(1,'00'), 'YYYY-MM-DD')) +AND (C.visit_end_date >= TO_DATE(TO_CHAR(1900,'0000')||'-'||TO_CHAR(1,'00')||'-'||TO_CHAR(1,'00'), 'YYYY-MM-DD') and C.visit_end_date <= TO_DATE(TO_CHAR(2099,'0000')||'-'||TO_CHAR(1,'00')||'-'||TO_CHAR(1,'00'), 'YYYY-MM-DD')) +AND C.visit_type_concept_id in (38000183,38000199) +AND ((CAST(C.visit_end_date AS DATE) - CAST(C.visit_start_date AS DATE)) >= 0 and (CAST(C.visit_end_date AS DATE) - CAST(C.visit_start_date AS DATE)) <= 99) +AND (EXTRACT(YEAR FROM C.visit_start_date) - P.year_of_birth >= 0 and EXTRACT(YEAR FROM C.visit_start_date) - P.year_of_birth <= 99) +AND P.gender_concept_id in (8532,8507) +AND PR.specialty_concept_id in (38004446,38003627) +AND CS.place_of_service_concept_id in (42628591,42628592) +AND C.ordinal = 1 +-- End Visit Occurrence Criteria +) Q +JOIN cdm.OBSERVATION_PERIOD OP on Q.person_id = OP.person_id + and OP.observation_period_start_date <= Q.start_date and OP.observation_period_end_date >= Q.start_date +) P +INNER JOIN +( + -- Begin Visit Occurrence Criteria +select C.person_id, C.visit_occurrence_id as event_id, C.visit_start_date as start_date, C.visit_end_date as end_date, + C.visit_concept_id as TARGET_CONCEPT_ID, C.visit_occurrence_id, + C.visit_start_date as sort_date +from +( + select vo.* + FROM cdm.VISIT_OCCURRENCE vo + +) C + + +-- End Visit Occurrence Criteria + +) A on A.person_id = P.person_id AND A.visit_occurrence_id = P.visit_occurrence_id +GROUP BY p.person_id, p.event_id +HAVING COUNT(A.TARGET_CONCEPT_ID) >= 1 +-- End Correlated Criteria + + ) CQ on E.person_id = CQ.person_id and E.event_id = CQ.event_id + GROUP BY E.person_id, E.event_id + HAVING COUNT(index_id) = 1 +) G +-- End Criteria Group +) AC on AC.person_id = pe.person_id and AC.event_id = pe.event_id + +) A on A.person_id = P.person_id AND A.START_DATE >= P.OP_START_DATE AND A.START_DATE <= P.OP_END_DATE AND A.START_DATE >= (P.START_DATE + -30*INTERVAL'1 day') AND A.START_DATE <= (P.START_DATE + 30*INTERVAL'1 day') +GROUP BY p.person_id, p.event_id +HAVING COUNT(A.TARGET_CONCEPT_ID) >= 1 +-- End Correlated Criteria + + ) CQ on E.person_id = CQ.person_id and E.event_id = CQ.event_id + GROUP BY E.person_id, E.event_id + HAVING COUNT(index_id) = 1 +) G +-- End Criteria Group +) AC on AC.person_id = pe.person_id AND AC.event_id = pe.event_id +) Results +; +ANALYZE Inclusion_12 +; + +CREATE TEMP TABLE Inclusion_13 + +AS +SELECT +13 as inclusion_rule_id, person_id, event_id + +FROM +( + select pe.person_id, pe.event_id + FROM qualified_events pe + +JOIN ( +-- Begin Criteria Group +select 0 as index_id, person_id, event_id +FROM +( + select E.person_id, E.event_id + FROM qualified_events E + INNER JOIN + ( + -- Begin Correlated Criteria +SELECT 0 as index_id, p.person_id, p.event_id +FROM qualified_events P +INNER JOIN +( + -- Begin Condition Occurrence Criteria +SELECT C.person_id, C.condition_occurrence_id as event_id, C.condition_start_date as start_date, COALESCE(C.condition_end_date, (C.condition_start_date + 1*INTERVAL'1 day')) as end_date, + C.CONDITION_CONCEPT_ID as TARGET_CONCEPT_ID, C.visit_occurrence_id, + C.condition_start_date as sort_date +FROM +( + SELECT co.* + FROM cdm.CONDITION_OCCURRENCE co + JOIN Codesets codesets on ((co.condition_concept_id = codesets.concept_id and codesets.codeset_id = 0)) +) C + + +-- End Condition Occurrence Criteria + +) A on A.person_id = P.person_id AND A.START_DATE >= P.OP_START_DATE AND A.START_DATE <= P.OP_END_DATE AND A.START_DATE >= (P.START_DATE + -100*INTERVAL'1 day') AND A.START_DATE <= (P.START_DATE + 100*INTERVAL'1 day') +GROUP BY p.person_id, p.event_id +HAVING COUNT(A.TARGET_CONCEPT_ID) >= 1 +-- End Correlated Criteria + +UNION ALL +-- Begin Criteria Group +select 1 as index_id, person_id, event_id +FROM +( + select E.person_id, E.event_id + FROM qualified_events E + INNER JOIN + ( + -- Begin Correlated Criteria +SELECT 0 as index_id, p.person_id, p.event_id +FROM qualified_events P +INNER JOIN +( + -- Begin Procedure Occurrence Criteria +select C.person_id, C.procedure_occurrence_id as event_id, C.procedure_date as start_date, (C.procedure_date + 1*INTERVAL'1 day') as END_DATE, + C.procedure_concept_id as TARGET_CONCEPT_ID, C.visit_occurrence_id, + C.procedure_date as sort_date +from +( + select po.* + FROM cdm.PROCEDURE_OCCURRENCE po +JOIN Codesets codesets on ((po.procedure_concept_id = codesets.concept_id and codesets.codeset_id = 0)) +) C + + +-- End Procedure Occurrence Criteria + +) A on A.person_id = P.person_id AND A.START_DATE >= P.OP_START_DATE AND A.START_DATE <= P.OP_END_DATE AND A.START_DATE >= (P.START_DATE + -60*INTERVAL'1 day') AND A.START_DATE <= (P.START_DATE + 60*INTERVAL'1 day') +GROUP BY p.person_id, p.event_id +HAVING COUNT(A.TARGET_CONCEPT_ID) >= 1 +-- End Correlated Criteria + +UNION ALL +-- Begin Correlated Criteria +SELECT 1 as index_id, p.person_id, p.event_id +FROM qualified_events P +INNER JOIN +( + -- Begin Drug Exposure Criteria +select C.person_id, C.drug_exposure_id as event_id, C.drug_exposure_start_date as start_date, + COALESCE(C.DRUG_EXPOSURE_END_DATE, (DRUG_EXPOSURE_START_DATE + C.DAYS_SUPPLY*INTERVAL'1 day'), (C.DRUG_EXPOSURE_START_DATE + 1*INTERVAL'1 day')) as end_date, + C.drug_concept_id as TARGET_CONCEPT_ID, C.visit_occurrence_id, + C.drug_exposure_start_date as sort_date +from +( + select de.* + FROM cdm.DRUG_EXPOSURE de +JOIN Codesets codesets on ((de.drug_concept_id = codesets.concept_id and codesets.codeset_id = 0)) +) C + + +-- End Drug Exposure Criteria + +) A on A.person_id = P.person_id AND A.START_DATE >= P.OP_START_DATE AND A.START_DATE <= P.OP_END_DATE AND A.START_DATE >= (P.START_DATE + -30*INTERVAL'1 day') AND A.START_DATE <= (P.START_DATE + 30*INTERVAL'1 day') +GROUP BY p.person_id, p.event_id +HAVING COUNT(A.TARGET_CONCEPT_ID) >= 1 +-- End Correlated Criteria + + ) CQ on E.person_id = CQ.person_id and E.event_id = CQ.event_id + GROUP BY E.person_id, E.event_id + HAVING COUNT(index_id) > 0 +) G +-- End Criteria Group + + ) CQ on E.person_id = CQ.person_id and E.event_id = CQ.event_id + GROUP BY E.person_id, E.event_id + HAVING COUNT(index_id) = 2 +) G +-- End Criteria Group +) AC on AC.person_id = pe.person_id AND AC.event_id = pe.event_id +) Results +; +ANALYZE Inclusion_13 +; + +CREATE TEMP TABLE inclusion_events + +AS +SELECT +inclusion_rule_id, person_id, event_id + +FROM +(select inclusion_rule_id, person_id, event_id from Inclusion_0 +UNION ALL +select inclusion_rule_id, person_id, event_id from Inclusion_1 +UNION ALL +select inclusion_rule_id, person_id, event_id from Inclusion_2 +UNION ALL +select inclusion_rule_id, person_id, event_id from Inclusion_3 +UNION ALL +select inclusion_rule_id, person_id, event_id from Inclusion_4 +UNION ALL +select inclusion_rule_id, person_id, event_id from Inclusion_5 +UNION ALL +select inclusion_rule_id, person_id, event_id from Inclusion_6 +UNION ALL +select inclusion_rule_id, person_id, event_id from Inclusion_7 +UNION ALL +select inclusion_rule_id, person_id, event_id from Inclusion_8 +UNION ALL +select inclusion_rule_id, person_id, event_id from Inclusion_9 +UNION ALL +select inclusion_rule_id, person_id, event_id from Inclusion_10 +UNION ALL +select inclusion_rule_id, person_id, event_id from Inclusion_11 +UNION ALL +select inclusion_rule_id, person_id, event_id from Inclusion_12 +UNION ALL +select inclusion_rule_id, person_id, event_id from Inclusion_13) I; +ANALYZE inclusion_events +; +TRUNCATE TABLE Inclusion_0; +DROP TABLE Inclusion_0; + +TRUNCATE TABLE Inclusion_1; +DROP TABLE Inclusion_1; + +TRUNCATE TABLE Inclusion_2; +DROP TABLE Inclusion_2; + +TRUNCATE TABLE Inclusion_3; +DROP TABLE Inclusion_3; + +TRUNCATE TABLE Inclusion_4; +DROP TABLE Inclusion_4; + +TRUNCATE TABLE Inclusion_5; +DROP TABLE Inclusion_5; + +TRUNCATE TABLE Inclusion_6; +DROP TABLE Inclusion_6; + +TRUNCATE TABLE Inclusion_7; +DROP TABLE Inclusion_7; + +TRUNCATE TABLE Inclusion_8; +DROP TABLE Inclusion_8; + +TRUNCATE TABLE Inclusion_9; +DROP TABLE Inclusion_9; + +TRUNCATE TABLE Inclusion_10; +DROP TABLE Inclusion_10; + +TRUNCATE TABLE Inclusion_11; +DROP TABLE Inclusion_11; + +TRUNCATE TABLE Inclusion_12; +DROP TABLE Inclusion_12; + +TRUNCATE TABLE Inclusion_13; +DROP TABLE Inclusion_13; + + +CREATE TEMP TABLE included_events + +AS +WITH cteIncludedEvents(event_id, person_id, start_date, end_date, op_start_date, op_end_date, ordinal) AS ( + SELECT event_id, person_id, start_date, end_date, op_start_date, op_end_date, row_number() over (partition by person_id order by start_date ASC) as ordinal + from + ( + select Q.event_id, Q.person_id, Q.start_date, Q.end_date, Q.op_start_date, Q.op_end_date, SUM(coalesce(POWER(cast(2 as bigint), I.inclusion_rule_id), 0)) as inclusion_rule_mask + from qualified_events Q + LEFT JOIN inclusion_events I on I.person_id = Q.person_id and I.event_id = Q.event_id + GROUP BY Q.event_id, Q.person_id, Q.start_date, Q.end_date, Q.op_start_date, Q.op_end_date + ) MG -- matching groups + + -- the matching group with all bits set ( POWER(2,# of inclusion rules) - 1 = inclusion_rule_mask + WHERE (MG.inclusion_rule_mask = POWER(cast(2 as bigint),14)-1) + +) + SELECT +event_id, person_id, start_date, end_date, op_start_date, op_end_date + +FROM +cteIncludedEvents Results +WHERE Results.ordinal = 1 +; +ANALYZE included_events +; + + + +-- generate cohort periods into #final_cohort +CREATE TEMP TABLE cohort_rows + +AS +WITH cohort_ends (event_id, person_id, end_date) AS ( + -- cohort exit dates + -- By default, cohort exit at the event's op end date +select event_id, person_id, op_end_date as end_date from included_events +), +first_ends (person_id, start_date, end_date) as +( + select F.person_id, F.start_date, F.end_date + FROM ( + select I.event_id, I.person_id, I.start_date, E.end_date, row_number() over (partition by I.person_id, I.event_id order by E.end_date) as ordinal + from included_events I + join cohort_ends E on I.event_id = E.event_id and I.person_id = E.person_id and E.end_date >= I.start_date + ) F + WHERE F.ordinal = 1 +) + SELECT +person_id, start_date, end_date + +FROM +first_ends; +ANALYZE cohort_rows +; + +CREATE TEMP TABLE final_cohort + +AS +WITH cteEndDates (person_id, end_date) AS ( + SELECT + person_id + , (event_date + -1 * 0*INTERVAL'1 day') as end_date + FROM + ( + SELECT + person_id + , event_date + , event_type + , MAX(start_ordinal) OVER (PARTITION BY person_id ORDER BY event_date, event_type ROWS UNBOUNDED PRECEDING) AS start_ordinal + , ROW_NUMBER() OVER (PARTITION BY person_id ORDER BY event_date, event_type) AS overall_ord + FROM + ( + SELECT + person_id + , start_date AS event_date + , -1 AS event_type + , ROW_NUMBER() OVER (PARTITION BY person_id ORDER BY start_date) AS start_ordinal + FROM cohort_rows + + UNION ALL + + + SELECT + person_id + , (end_date + 0*INTERVAL'1 day') as end_date + , 1 AS event_type + , NULL + FROM cohort_rows + ) RAWDATA + ) e + WHERE (2 * e.start_ordinal) - e.overall_ord = 0 +), +cteEnds (person_id, start_date, end_date) AS +( + SELECT + c.person_id + , c.start_date + , MIN(e.end_date) AS end_date + FROM cohort_rows c + JOIN cteEndDates e ON c.person_id = e.person_id AND e.end_date >= c.start_date + GROUP BY c.person_id, c.start_date +) + SELECT +person_id, min(start_date) as start_date, end_date + +FROM +cteEnds +group by person_id, end_date +; +ANALYZE final_cohort +; + +DELETE FROM allCriteriaTest.cohort where cohort_definition_id = 1; +INSERT INTO allCriteriaTest.cohort (cohort_definition_id, subject_id, cohort_start_date, cohort_end_date) +select 1 as cohort_definition_id, person_id, start_date, end_date +FROM final_cohort CO +; + + +-- Find the event that is the 'best match' per person. +-- the 'best match' is defined as the event that satisfies the most inclusion rules. +-- ties are solved by choosing the event that matches the earliest inclusion rule, and then earliest. + +CREATE TEMP TABLE best_events + +AS +SELECT +q.person_id, q.event_id + +FROM +qualified_events Q +join ( + SELECT R.person_id, R.event_id, ROW_NUMBER() OVER (PARTITION BY R.person_id ORDER BY R.rule_count DESC,R.min_rule_id ASC, R.start_date ASC) AS rank_value + FROM ( + SELECT Q.person_id, Q.event_id, COALESCE(COUNT(DISTINCT I.inclusion_rule_id), 0) AS rule_count, COALESCE(MIN(I.inclusion_rule_id), 0) AS min_rule_id, Q.start_date + FROM qualified_events Q + LEFT JOIN inclusion_events I ON q.person_id = i.person_id AND q.event_id = i.event_id + GROUP BY Q.person_id, Q.event_id, Q.start_date + ) R +) ranked on Q.person_id = ranked.person_id and Q.event_id = ranked.event_id +WHERE ranked.rank_value = 1 +; +ANALYZE best_events +; + +-- modes of generation: (the same tables store the results for the different modes, identified by the mode_id column) +-- 0: all events +-- 1: best event + + +-- BEGIN: Inclusion Impact Analysis - event +-- calculte matching group counts +delete from allCriteriaTest.cohort_inclusion_result where cohort_definition_id = 1 and mode_id = 0; +insert into allCriteriaTest.cohort_inclusion_result (cohort_definition_id, inclusion_rule_mask, person_count, mode_id) +select 1 as cohort_definition_id, inclusion_rule_mask, COUNT(*) as person_count, 0 as mode_id +from +( + select Q.person_id, Q.event_id, CAST(SUM(coalesce(POWER(cast(2 as bigint), I.inclusion_rule_id), 0)) AS bigint) as inclusion_rule_mask + from qualified_events Q + LEFT JOIN inclusion_events I on q.person_id = i.person_id and q.event_id = i.event_id + GROUP BY Q.person_id, Q.event_id +) MG -- matching groups +group by inclusion_rule_mask +; + +-- calculate gain counts +delete from allCriteriaTest.cohort_inclusion_stats where cohort_definition_id = 1 and mode_id = 0; +insert into allCriteriaTest.cohort_inclusion_stats (cohort_definition_id, rule_sequence, person_count, gain_count, person_total, mode_id) +select ir.cohort_definition_id, ir.rule_sequence, coalesce(T.person_count, 0) as person_count, coalesce(SR.person_count, 0) gain_count, EventTotal.total, 0 as mode_id +from allCriteriaTest.cohort_inclusion ir +left join +( + select i.inclusion_rule_id, COUNT(i.event_id) as person_count + from qualified_events Q + JOIN inclusion_events i on Q.person_id = I.person_id and Q.event_id = i.event_id + group by i.inclusion_rule_id +) T on ir.rule_sequence = T.inclusion_rule_id +CROSS JOIN (select count(*) as total_rules from allCriteriaTest.cohort_inclusion where cohort_definition_id = 1) RuleTotal +CROSS JOIN (select COUNT(event_id) as total from qualified_events) EventTotal +LEFT JOIN allCriteriaTest.cohort_inclusion_result SR on SR.mode_id = 0 AND SR.cohort_definition_id = 1 AND (POWER(cast(2 as bigint),RuleTotal.total_rules) - POWER(cast(2 as bigint),ir.rule_sequence) - 1) = SR.inclusion_rule_mask -- POWER(2,rule count) - POWER(2,rule sequence) - 1 is the mask for 'all except this rule' +WHERE ir.cohort_definition_id = 1 +; + +-- calculate totals +delete from allCriteriaTest.cohort_summary_stats where cohort_definition_id = 1 and mode_id = 0; +insert into allCriteriaTest.cohort_summary_stats (cohort_definition_id, base_count, final_count, mode_id) +select 1 as cohort_definition_id, PC.total as person_count, coalesce(FC.total, 0) as final_count, 0 as mode_id +FROM +(select COUNT(event_id) as total from qualified_events) PC, +(select sum(sr.person_count) as total + from allCriteriaTest.cohort_inclusion_result sr + CROSS JOIN (select count(*) as total_rules from allCriteriaTest.cohort_inclusion where cohort_definition_id = 1) RuleTotal + where sr.mode_id = 0 and sr.cohort_definition_id = 1 and sr.inclusion_rule_mask = POWER(cast(2 as bigint),RuleTotal.total_rules)-1 +) FC +; + +-- END: Inclusion Impact Analysis - event + +-- BEGIN: Inclusion Impact Analysis - person +-- calculte matching group counts +delete from allCriteriaTest.cohort_inclusion_result where cohort_definition_id = 1 and mode_id = 1; +insert into allCriteriaTest.cohort_inclusion_result (cohort_definition_id, inclusion_rule_mask, person_count, mode_id) +select 1 as cohort_definition_id, inclusion_rule_mask, COUNT(*) as person_count, 1 as mode_id +from +( + select Q.person_id, Q.event_id, CAST(SUM(coalesce(POWER(cast(2 as bigint), I.inclusion_rule_id), 0)) AS bigint) as inclusion_rule_mask + from best_events Q + LEFT JOIN inclusion_events I on q.person_id = i.person_id and q.event_id = i.event_id + GROUP BY Q.person_id, Q.event_id +) MG -- matching groups +group by inclusion_rule_mask +; + +-- calculate gain counts +delete from allCriteriaTest.cohort_inclusion_stats where cohort_definition_id = 1 and mode_id = 1; +insert into allCriteriaTest.cohort_inclusion_stats (cohort_definition_id, rule_sequence, person_count, gain_count, person_total, mode_id) +select ir.cohort_definition_id, ir.rule_sequence, coalesce(T.person_count, 0) as person_count, coalesce(SR.person_count, 0) gain_count, EventTotal.total, 1 as mode_id +from allCriteriaTest.cohort_inclusion ir +left join +( + select i.inclusion_rule_id, COUNT(i.event_id) as person_count + from best_events Q + JOIN inclusion_events i on Q.person_id = I.person_id and Q.event_id = i.event_id + group by i.inclusion_rule_id +) T on ir.rule_sequence = T.inclusion_rule_id +CROSS JOIN (select count(*) as total_rules from allCriteriaTest.cohort_inclusion where cohort_definition_id = 1) RuleTotal +CROSS JOIN (select COUNT(event_id) as total from best_events) EventTotal +LEFT JOIN allCriteriaTest.cohort_inclusion_result SR on SR.mode_id = 1 AND SR.cohort_definition_id = 1 AND (POWER(cast(2 as bigint),RuleTotal.total_rules) - POWER(cast(2 as bigint),ir.rule_sequence) - 1) = SR.inclusion_rule_mask -- POWER(2,rule count) - POWER(2,rule sequence) - 1 is the mask for 'all except this rule' +WHERE ir.cohort_definition_id = 1 +; + +-- calculate totals +delete from allCriteriaTest.cohort_summary_stats where cohort_definition_id = 1 and mode_id = 1; +insert into allCriteriaTest.cohort_summary_stats (cohort_definition_id, base_count, final_count, mode_id) +select 1 as cohort_definition_id, PC.total as person_count, coalesce(FC.total, 0) as final_count, 1 as mode_id +FROM +(select COUNT(event_id) as total from best_events) PC, +(select sum(sr.person_count) as total + from allCriteriaTest.cohort_inclusion_result sr + CROSS JOIN (select count(*) as total_rules from allCriteriaTest.cohort_inclusion where cohort_definition_id = 1) RuleTotal + where sr.mode_id = 1 and sr.cohort_definition_id = 1 and sr.inclusion_rule_mask = POWER(cast(2 as bigint),RuleTotal.total_rules)-1 +) FC +; + +-- END: Inclusion Impact Analysis - person + +-- BEGIN: Censored Stats + +-- END: Censored Stats + +TRUNCATE TABLE best_events; +DROP TABLE best_events; + + + + + +TRUNCATE TABLE cohort_rows; +DROP TABLE cohort_rows; + +TRUNCATE TABLE final_cohort; +DROP TABLE final_cohort; + +TRUNCATE TABLE inclusion_events; +DROP TABLE inclusion_events; + +TRUNCATE TABLE qualified_events; +DROP TABLE qualified_events; + +TRUNCATE TABLE included_events; +DROP TABLE included_events; + +TRUNCATE TABLE Codesets; +DROP TABLE Codesets; From bb1903448dd716e03b34c03c1337a7079438acce Mon Sep 17 00:00:00 2001 From: Benjamin Amor Date: Wed, 17 Jun 2020 18:15:46 -0400 Subject: [PATCH 03/14] minor changes to test class --- src/main/java/org/ohdsi/circe/TestClass.java | 44 ++++++++++++------- .../CohortExpressionQueryBuilder.java | 7 +-- .../builders/BuilderUtils.java | 5 ++- 3 files changed, 36 insertions(+), 20 deletions(-) diff --git a/src/main/java/org/ohdsi/circe/TestClass.java b/src/main/java/org/ohdsi/circe/TestClass.java index 32d4303f..4936a84e 100644 --- a/src/main/java/org/ohdsi/circe/TestClass.java +++ b/src/main/java/org/ohdsi/circe/TestClass.java @@ -6,22 +6,20 @@ import org.ohdsi.circe.cohortdefinition.CohortExpression; import org.ohdsi.circe.cohortdefinition.CohortExpressionQueryBuilder; -import org.ohdsi.circe.helper.ResourceHelper; import org.ohdsi.sql.SqlRender; -import org.ohdsi.sql.SqlSplit; -import org.ohdsi.sql.SqlTranslate; public class TestClass { private static CohortExpressionQueryBuilder.BuildExpressionQueryOptions buildExpressionQueryOptions( - final int cohortId, final String resultsSchema) { + final int cohortId, final String cdmSchema, final String resultSchema, final String targetTable, final String codelistDataset + ) { final CohortExpressionQueryBuilder.BuildExpressionQueryOptions options = new CohortExpressionQueryBuilder.BuildExpressionQueryOptions(); - options.cdmSchema = "/UNITE/Safe Harbor - TUFTS/transform"; + options.cdmSchema = cdmSchema; options.cohortId = cohortId; options.generateStats = false; - options.resultSchema = resultsSchema; - options.targetTable = "/UNITE/Palantir/OMOP FeatureExtraction/covid_serious_outcomes_plp/cohort"; - options.codelistDataset = "`/UNITE/Palantir/OMOP FeatureExtraction/code_lists/serious_covid_outcomes/mappedConcepts`"; + options.resultSchema = resultSchema; + options.targetTable = targetTable; + options.codelistDataset = codelistDataset; return options; } @@ -30,9 +28,6 @@ private static String buildExpressionSql(final CohortExpression expression, // build SQL final CohortExpressionQueryBuilder builder = new CohortExpressionQueryBuilder(); String cohortSql = builder.buildExpressionQuery(expression, options); - - // translate to PG - //cohortSql = SqlRender.renderSql(SqlTranslate.translateSql(cohortSql, "postgresql"), null, null); return cohortSql; } @@ -42,16 +37,35 @@ private static String readFile(String path) throws IOException{ } public static void main(String[] args) throws IOException { System.out.println("Hello"); - final CohortExpressionQueryBuilder.BuildExpressionQueryOptions options = buildExpressionQueryOptions(1,"allCriteriaTest"); + + final int cohortId = 1; + final String cdmSchema = "/UNITE/Safe Harbor - TUFTS/transform"; + final String resultSchema = ""; + final String targetTable = "/UNITE/Palantir/OMOP FeatureExtraction/N3C_phenotype/N3C_phenotype_tufts"; + final String codelistDataset = "`/UNITE/Palantir/Demo/model development/N3C Phenotype/workbook-output/[Safe Harbor] N3C Phenotype/concept_sets`"; + + final String jsonFilePath = "/Users/bamor/Documents/active_projects/circe-be/N3C_phenotype.json"; + final String outputSqlFilePath = "/Users/bamor/Documents/active_projects/circe-be/N3C_phenotype.sql"; + + final CohortExpressionQueryBuilder.BuildExpressionQueryOptions options = buildExpressionQueryOptions( + cohortId, + cdmSchema, + resultSchema, + targetTable, + codelistDataset + ); - // load 'all' criteria json + + // load cohort json final CohortExpression expression = CohortExpression - .fromJson(readFile("/Users/bamor/Documents/active_projects/circe-be/cohort_O.json")); + .fromJson(readFile(jsonFilePath)); // build Sql String cohortSql = buildExpressionSql(expression, options); cohortSql = SqlRender.renderSql(cohortSql, null, null); - FileUtils.writeStringToFile(new File("/Users/bamor/Documents/active_projects/circe-be/cohort_O.sql"), cohortSql, StandardCharsets.UTF_8); + + // Write to sql file + FileUtils.writeStringToFile(new File(outputSqlFilePath), cohortSql, StandardCharsets.UTF_8); } } \ No newline at end of file diff --git a/src/main/java/org/ohdsi/circe/cohortdefinition/CohortExpressionQueryBuilder.java b/src/main/java/org/ohdsi/circe/cohortdefinition/CohortExpressionQueryBuilder.java index b780f74c..fcdf08ff 100644 --- a/src/main/java/org/ohdsi/circe/cohortdefinition/CohortExpressionQueryBuilder.java +++ b/src/main/java/org/ohdsi/circe/cohortdefinition/CohortExpressionQueryBuilder.java @@ -160,7 +160,7 @@ private String wrapCriteriaQuery(String query, CriteriaGroup group) { String groupQuery = this.getCriteriaGroupQuery(group, String.format("(%s)", eventQuery)); groupQuery = StringUtils.replace(groupQuery, "@indexId", "" + 0); String wrappedQuery = String.format( - "select PE.person_id, PE.event_id, PE.start_date, PE.end_date, PE.target_concept_id, PE.visit_occurrence_id, PE.sort_date FROM (\n%s\n) PE\nJOIN (\n%s) AC on AC.person_id = pe.person_id and AC.event_id = pe.event_id\n", + "select pe.person_id, pe.event_id, pe.start_date, pe.end_date, pe.TARGET_CONCEPT_ID, pe.visit_occurrence_id, pe.sort_date FROM (\n%s\n) pe\nJOIN (\n%s) AC on AC.person_id = pe.person_id and AC.event_id = pe.event_id\n", query, groupQuery); return wrappedQuery; } @@ -227,7 +227,7 @@ public String getPrimaryEventsQuery(PrimaryCriteria primaryCriteria) { public String getFinalCohortQuery(Period censorWindow) { - String query = "select @target_cohort_id as @cohort_id_field_name, person_id, @start_date, @end_date \n" + String query = "select @target_cohort_id as @cohort_id_field_name, person_id as subject_id, @start_date, @end_date \n" + "FROM final_cohort"; String startDate = "start_date"; @@ -304,7 +304,8 @@ public String buildExpressionQuery(CohortExpression expression, BuildExpressionQ System.out.println(StringUtils.join(inclusionRuleInserts, "\n")); resultSql = StringUtils.replace(resultSql, "@inclusionCohortInserts", StringUtils.join(inclusionRuleInserts, "\n")); } else { - resultSql = StringUtils.replace(resultSql, "@inclusionCohortInserts", "create table #inclusion_events (inclusion_rule_id bigint,\n\tperson_id bigint,\n\tevent_id bigint\n);"); + //resultSql = StringUtils.replace(resultSql, "@inclusionCohortInserts", "create table #inclusion_events (inclusion_rule_id bigint,\n\tperson_id bigint,\n\tevent_id bigint\n);"); + resultSql = StringUtils.replace(resultSql, "@inclusionCohortInserts", "inclusion_events AS (\nSELECT null as inclusion_rule_id, null as person_id, null as event_id\n),"); } resultSql = StringUtils.replace(resultSql, "@IncludedEventSort", (expression.expressionLimit.type != null && expression.expressionLimit.type.equalsIgnoreCase("LAST")) ? "DESC" : "ASC"); diff --git a/src/main/java/org/ohdsi/circe/cohortdefinition/builders/BuilderUtils.java b/src/main/java/org/ohdsi/circe/cohortdefinition/builders/BuilderUtils.java index cedbb439..d7e891b1 100644 --- a/src/main/java/org/ohdsi/circe/cohortdefinition/builders/BuilderUtils.java +++ b/src/main/java/org/ohdsi/circe/cohortdefinition/builders/BuilderUtils.java @@ -67,8 +67,9 @@ public static String getOperator(DateRange range) { public static String dateStringToSql(String date) { - String[] dateParts = StringUtils.split(date, '-'); - return String.format("DATEFROMPARTS(%s, %s, %s)", Integer.valueOf(dateParts[0]), Integer.valueOf(dateParts[1]), Integer.valueOf(dateParts[2])); + //String[] dateParts = StringUtils.split(date, '-'); + //return String.format("date(%s, %s, %s)", Integer.valueOf(dateParts[0]), Integer.valueOf(dateParts[1]), Integer.valueOf(dateParts[2])); + return String.format("date('%s')", date); } public static String buildDateRangeClause(String sqlExpression, DateRange range) { From d8174804181729c651d67f30f0a14d5ba9794eb4 Mon Sep 17 00:00:00 2001 From: Benjamin Amor Date: Tue, 23 Jun 2020 15:46:56 -0400 Subject: [PATCH 04/14] initial commit of foundry compatibility --- .DS_Store | Bin 0 -> 6148 bytes LICENSE | 201 --------------- dependency-reduced-pom.xml | 244 ++++++++++++++++++ pom.xml | 17 ++ src/main/java/org/ohdsi/circe/TestClass.java | 38 +-- .../cohortdefinition/sql/conditionEra.sql | 2 +- .../sql/conditionOccurrence.sql | 2 +- .../resources/cohortdefinition/sql/death.sql | 2 +- .../sql/demographicCriteria.sql | 2 +- .../cohortdefinition/sql/deviceExposure.sql | 2 +- .../cohortdefinition/sql/doseEra.sql | 2 +- .../cohortdefinition/sql/drugEra.sql | 2 +- .../cohortdefinition/sql/drugExposure.sql | 2 +- .../sql/eventTableExpression.sql | 2 +- .../cohortdefinition/sql/generateCohort.sql | 2 - .../cohortdefinition/sql/locationRegion.sql | 4 +- .../cohortdefinition/sql/measurement.sql | 2 +- .../cohortdefinition/sql/observation.sql | 2 +- .../sql/observationPeriod.sql | 2 +- .../cohortdefinition/sql/payerPlanPeriod.sql | 2 +- .../sql/primaryEventsQuery.sql | 2 +- .../sql/procedureOccurrence.sql | 2 +- .../cohortdefinition/sql/specimen.sql | 2 +- .../cohortdefinition/sql/visitOccurrence.sql | 2 +- .../additionalCriteria.sql | 0 .../censoringInsert.sql | 0 .../{sql_old => sql_server}/codesetQuery.sql | 0 .../cohortCensoredStats.sql | 0 .../cohortInclusionAnalysis.sql | 0 .../{sql_old => sql_server}/conditionEra.sql | 0 .../conditionOccurrence.sql | 0 .../customEraStrategy.sql | 0 .../dateOffsetStrategy.sql | 0 .../{sql_old => sql_server}/death.sql | 0 .../demographicCriteria.sql | 0 .../deviceExposure.sql | 0 .../{sql_old => sql_server}/doseEra.sql | 0 .../{sql_old => sql_server}/drugEra.sql | 0 .../{sql_old => sql_server}/drugExposure.sql | 0 .../eraConstructor.sql | 0 .../eventTableExpression.sql | 0 .../generateCohort.sql | 0 .../{sql_old => sql_server}/groupQuery.sql | 0 .../{sql_old => sql_server}/inclusionrule.sql | 0 .../locationRegion.sql | 0 .../{sql_old => sql_server}/measurement.sql | 0 .../{sql_old => sql_server}/observation.sql | 0 .../observationPeriod.sql | 0 .../payerPlanPeriod.sql | 0 .../primaryEventsQuery.sql | 0 .../procedureOccurrence.sql | 0 .../{sql_old => sql_server}/specimen.sql | 0 .../visitOccurrence.sql | 0 .../windowedCriteria.sql | 0 .../sql_transforms/additionalCriteria.sql | 5 + .../sql_transforms/censoringInsert.sql | 7 + .../sql_transforms/codesetQuery.sql | 7 + .../sql_transforms/cohortCensoredStats.sql | 7 + .../cohortInclusionAnalysis.sql | 44 ++++ .../sql_transforms/conditionEra.sql | 13 + .../sql_transforms/conditionOccurrence.sql | 13 + .../sql_transforms/customEraStrategy.sql | 65 +++++ .../sql_transforms/dateOffsetStrategy.sql | 7 + .../cohortdefinition/sql_transforms/death.sql | 14 + .../sql_transforms/demographicCriteria.sql | 7 + .../sql_transforms/deviceExposure.sql | 13 + .../sql_transforms/doseEra.sql | 13 + .../sql_transforms/drugEra.sql | 13 + .../sql_transforms/drugExposure.sql | 14 + .../sql_transforms/eraConstructor.sql | 74 ++++++ .../sql_transforms/eventTableExpression.sql | 4 + .../sql_transforms/generateCohort.sql | 165 ++++++++++++ .../sql_transforms/groupQuery.sql | 14 + .../sql_transforms/inclusionrule.sql | 9 + .../sql_transforms/locationRegion.sql | 18 ++ .../sql_transforms/measurement.sql | 13 + .../sql_transforms/observation.sql | 13 + .../sql_transforms/observationPeriod.sql | 13 + .../sql_transforms/payerPlanPeriod.sql | 13 + .../sql_transforms/primaryEventsQuery.sql | 16 ++ .../sql_transforms/procedureOccurrence.sql | 13 + .../sql_transforms/specimen.sql | 13 + .../sql_transforms/visitOccurrence.sql | 13 + .../sql_transforms/windowedCriteria.sql | 6 + 84 files changed, 942 insertions(+), 237 deletions(-) create mode 100644 .DS_Store delete mode 100644 LICENSE create mode 100644 dependency-reduced-pom.xml rename src/main/resources/resources/cohortdefinition/{sql_old => sql_server}/additionalCriteria.sql (100%) rename src/main/resources/resources/cohortdefinition/{sql_old => sql_server}/censoringInsert.sql (100%) rename src/main/resources/resources/cohortdefinition/{sql_old => sql_server}/codesetQuery.sql (100%) rename src/main/resources/resources/cohortdefinition/{sql_old => sql_server}/cohortCensoredStats.sql (100%) rename src/main/resources/resources/cohortdefinition/{sql_old => sql_server}/cohortInclusionAnalysis.sql (100%) rename src/main/resources/resources/cohortdefinition/{sql_old => sql_server}/conditionEra.sql (100%) rename src/main/resources/resources/cohortdefinition/{sql_old => sql_server}/conditionOccurrence.sql (100%) rename src/main/resources/resources/cohortdefinition/{sql_old => sql_server}/customEraStrategy.sql (100%) rename src/main/resources/resources/cohortdefinition/{sql_old => sql_server}/dateOffsetStrategy.sql (100%) rename src/main/resources/resources/cohortdefinition/{sql_old => sql_server}/death.sql (100%) rename src/main/resources/resources/cohortdefinition/{sql_old => sql_server}/demographicCriteria.sql (100%) rename src/main/resources/resources/cohortdefinition/{sql_old => sql_server}/deviceExposure.sql (100%) rename src/main/resources/resources/cohortdefinition/{sql_old => sql_server}/doseEra.sql (100%) rename src/main/resources/resources/cohortdefinition/{sql_old => sql_server}/drugEra.sql (100%) rename src/main/resources/resources/cohortdefinition/{sql_old => sql_server}/drugExposure.sql (100%) rename src/main/resources/resources/cohortdefinition/{sql_old => sql_server}/eraConstructor.sql (100%) rename src/main/resources/resources/cohortdefinition/{sql_old => sql_server}/eventTableExpression.sql (100%) rename src/main/resources/resources/cohortdefinition/{sql_old => sql_server}/generateCohort.sql (100%) rename src/main/resources/resources/cohortdefinition/{sql_old => sql_server}/groupQuery.sql (100%) rename src/main/resources/resources/cohortdefinition/{sql_old => sql_server}/inclusionrule.sql (100%) rename src/main/resources/resources/cohortdefinition/{sql_old => sql_server}/locationRegion.sql (100%) rename src/main/resources/resources/cohortdefinition/{sql_old => sql_server}/measurement.sql (100%) rename src/main/resources/resources/cohortdefinition/{sql_old => sql_server}/observation.sql (100%) rename src/main/resources/resources/cohortdefinition/{sql_old => sql_server}/observationPeriod.sql (100%) rename src/main/resources/resources/cohortdefinition/{sql_old => sql_server}/payerPlanPeriod.sql (100%) rename src/main/resources/resources/cohortdefinition/{sql_old => sql_server}/primaryEventsQuery.sql (100%) rename src/main/resources/resources/cohortdefinition/{sql_old => sql_server}/procedureOccurrence.sql (100%) rename src/main/resources/resources/cohortdefinition/{sql_old => sql_server}/specimen.sql (100%) rename src/main/resources/resources/cohortdefinition/{sql_old => sql_server}/visitOccurrence.sql (100%) rename src/main/resources/resources/cohortdefinition/{sql_old => sql_server}/windowedCriteria.sql (100%) create mode 100644 src/main/resources/resources/cohortdefinition/sql_transforms/additionalCriteria.sql create mode 100644 src/main/resources/resources/cohortdefinition/sql_transforms/censoringInsert.sql create mode 100644 src/main/resources/resources/cohortdefinition/sql_transforms/codesetQuery.sql create mode 100644 src/main/resources/resources/cohortdefinition/sql_transforms/cohortCensoredStats.sql create mode 100644 src/main/resources/resources/cohortdefinition/sql_transforms/cohortInclusionAnalysis.sql create mode 100644 src/main/resources/resources/cohortdefinition/sql_transforms/conditionEra.sql create mode 100644 src/main/resources/resources/cohortdefinition/sql_transforms/conditionOccurrence.sql create mode 100644 src/main/resources/resources/cohortdefinition/sql_transforms/customEraStrategy.sql create mode 100644 src/main/resources/resources/cohortdefinition/sql_transforms/dateOffsetStrategy.sql create mode 100644 src/main/resources/resources/cohortdefinition/sql_transforms/death.sql create mode 100644 src/main/resources/resources/cohortdefinition/sql_transforms/demographicCriteria.sql create mode 100644 src/main/resources/resources/cohortdefinition/sql_transforms/deviceExposure.sql create mode 100644 src/main/resources/resources/cohortdefinition/sql_transforms/doseEra.sql create mode 100644 src/main/resources/resources/cohortdefinition/sql_transforms/drugEra.sql create mode 100644 src/main/resources/resources/cohortdefinition/sql_transforms/drugExposure.sql create mode 100644 src/main/resources/resources/cohortdefinition/sql_transforms/eraConstructor.sql create mode 100644 src/main/resources/resources/cohortdefinition/sql_transforms/eventTableExpression.sql create mode 100644 src/main/resources/resources/cohortdefinition/sql_transforms/generateCohort.sql create mode 100644 src/main/resources/resources/cohortdefinition/sql_transforms/groupQuery.sql create mode 100644 src/main/resources/resources/cohortdefinition/sql_transforms/inclusionrule.sql create mode 100644 src/main/resources/resources/cohortdefinition/sql_transforms/locationRegion.sql create mode 100644 src/main/resources/resources/cohortdefinition/sql_transforms/measurement.sql create mode 100644 src/main/resources/resources/cohortdefinition/sql_transforms/observation.sql create mode 100644 src/main/resources/resources/cohortdefinition/sql_transforms/observationPeriod.sql create mode 100644 src/main/resources/resources/cohortdefinition/sql_transforms/payerPlanPeriod.sql create mode 100644 src/main/resources/resources/cohortdefinition/sql_transforms/primaryEventsQuery.sql create mode 100644 src/main/resources/resources/cohortdefinition/sql_transforms/procedureOccurrence.sql create mode 100644 src/main/resources/resources/cohortdefinition/sql_transforms/specimen.sql create mode 100644 src/main/resources/resources/cohortdefinition/sql_transforms/visitOccurrence.sql create mode 100644 src/main/resources/resources/cohortdefinition/sql_transforms/windowedCriteria.sql diff --git a/.DS_Store b/.DS_Store new file mode 100644 index 0000000000000000000000000000000000000000..5008ddfcf53c02e82d7eee2e57c38e5672ef89f6 GIT binary patch literal 6148 zcmeH~Jr2S!425mzP>H1@V-^m;4Wg<&0T*E43hX&L&p$$qDprKhvt+--jT7}7np#A3 zem<@ulZcFPQ@L2!n>{z**++&mCkOWA81W14cNZlEfg7;MkzE(HCqgga^y>{tEnwC%0;vJ&^%eQ zLs35+`xjp>T0 + + 4.0.0 + org.ohdsi + circe + 1.9.0-SNAPSHOT + + + + maven-shade-plugin + 3.2.4 + + + package + + shade + + + + + + + + + org.jacoco + jacoco-maven-plugin + 0.8.5 + + + pre-unit-test + + prepare-agent + + + ${project.build.directory}/coverage-reports/jacoco-ut.exec + surefireArgLine + + + + post-unit-test + test + + report + + + ${project.build.directory}/coverage-reports/jacoco-ut.exec + ${project.reporting.outputDirectory}/jacoco-ut + + + + + + maven-surefire-plugin + 2.15 + + ${surefireArgLine} + ${skip.unit.tests} + + **/IT*.java + + + + + + + + ohdsi + repo.ohdsi.org + http://repo.ohdsi.org:8085/nexus/content/repositories/releases + + + ohdsi.thirdparty + repo.ohdsi.org + http://repo.ohdsi.org:8085/nexus/content/repositories/thirdparty + + + + false + + + ohdsi.snapshots + repo.ohdsi.org-snapshots + http://repo.ohdsi.org:8085/nexus/content/repositories/snapshots + + + + + junit + junit + 4.12 + test + + + hamcrest-core + org.hamcrest + + + + + org.hamcrest + java-hamcrest + 2.0.0.0 + test + + + com.opentable.components + otj-pg-embedded + 0.13.3 + test + + + slf4j-api + org.slf4j + + + commons-compress + org.apache.commons + + + xz + org.tukaani + + + commons-codec + commons-codec + + + postgresql + org.postgresql + + + spotbugs-annotations + com.github.spotbugs + + + jcl-over-slf4j + org.slf4j + + + + + org.springframework.boot + spring-boot-starter-test + 1.5.20.RELEASE + test + + + spring-boot-test + org.springframework.boot + + + spring-boot-test-autoconfigure + org.springframework.boot + + + json-path + com.jayway.jsonpath + + + assertj-core + org.assertj + + + mockito-core + org.mockito + + + hamcrest-library + org.hamcrest + + + jsonassert + org.skyscreamer + + + spring-core + org.springframework + + + spring-test + org.springframework + + + hamcrest-core + org.hamcrest + + + + + org.springframework.boot + spring-boot-starter-jdbc + 1.5.20.RELEASE + test + + + spring-boot-starter + org.springframework.boot + + + tomcat-jdbc + org.apache.tomcat + + + spring-jdbc + org.springframework + + + + + org.dbunit + dbunit + 2.6.0 + test + + + commons-collections + commons-collections + + + poi-ooxml + org.apache.poi + + + postgresql + postgresql + + + slf4j-api + org.slf4j + + + + + com.github.mjeanroy + dbunit-plus + 2.0.1 + test + + + + 1.8 + 1.8 + + diff --git a/pom.xml b/pom.xml index 14d996e3..2cce86d7 100644 --- a/pom.xml +++ b/pom.xml @@ -13,6 +13,23 @@ + + org.apache.maven.plugins + maven-shade-plugin + 3.2.4 + + + package + + shade + + + + + + + + org.jacoco jacoco-maven-plugin diff --git a/src/main/java/org/ohdsi/circe/TestClass.java b/src/main/java/org/ohdsi/circe/TestClass.java index 4936a84e..2ba1b1a8 100644 --- a/src/main/java/org/ohdsi/circe/TestClass.java +++ b/src/main/java/org/ohdsi/circe/TestClass.java @@ -35,17 +35,13 @@ private static String readFile(String path) throws IOException{ File file = new File(path); return FileUtils.readFileToString(file, StandardCharsets.UTF_8); } - public static void main(String[] args) throws IOException { - System.out.println("Hello"); - final int cohortId = 1; - final String cdmSchema = "/UNITE/Safe Harbor - TUFTS/transform"; - final String resultSchema = ""; - final String targetTable = "/UNITE/Palantir/OMOP FeatureExtraction/N3C_phenotype/N3C_phenotype_tufts"; - final String codelistDataset = "`/UNITE/Palantir/Demo/model development/N3C Phenotype/workbook-output/[Safe Harbor] N3C Phenotype/concept_sets`"; + public static String createSql( + int cohortId, String cdmSchema, String resultSchema, + String targetTable, String codelistDataset, String jsonString + ) throws IOException { - final String jsonFilePath = "/Users/bamor/Documents/active_projects/circe-be/N3C_phenotype.json"; - final String outputSqlFilePath = "/Users/bamor/Documents/active_projects/circe-be/N3C_phenotype.sql"; + System.out.println("Parsing Json to SQL"); final CohortExpressionQueryBuilder.BuildExpressionQueryOptions options = buildExpressionQueryOptions( cohortId, @@ -55,16 +51,28 @@ public static void main(String[] args) throws IOException { codelistDataset ); - - // load cohort json - final CohortExpression expression = CohortExpression - .fromJson(readFile(jsonFilePath)); + final CohortExpression expression = CohortExpression.fromJson(jsonString); - // build Sql String cohortSql = buildExpressionSql(expression, options); cohortSql = SqlRender.renderSql(cohortSql, null, null); - // Write to sql file + return(cohortSql); + } + + public static void main(String [] args) throws IOException { + + final int cohortId = 1; + final String cdmSchema = "/UNITE/Safe Harbor - TUFTS/transform"; + final String resultSchema = ""; + final String targetTable = "/UNITE/Palantir/OMOP FeatureExtraction/N3C_phenotype/N3C_phenotype_tufts"; + final String codelistDataset = "`/UNITE/Palantir/Demo/model development/N3C Phenotype/workbook-output/[Safe Harbor] N3C Phenotype/concept_sets`"; + + final String jsonFilePath = "/Users/bamor/Documents/active_projects/circe-be/N3C_phenotype.json"; + final String outputSqlFilePath = "/Users/bamor/Documents/active_projects/circe-be/N3C_phenotype.sql"; + + final String jsonString = readFile(jsonFilePath); + + final String cohortSql = createSql(cohortId, cdmSchema, resultSchema, targetTable, codelistDataset, jsonString); FileUtils.writeStringToFile(new File(outputSqlFilePath), cohortSql, StandardCharsets.UTF_8); } diff --git a/src/main/resources/resources/cohortdefinition/sql/conditionEra.sql b/src/main/resources/resources/cohortdefinition/sql/conditionEra.sql index fb99a3e6..05ed7c5b 100644 --- a/src/main/resources/resources/cohortdefinition/sql/conditionEra.sql +++ b/src/main/resources/resources/cohortdefinition/sql/conditionEra.sql @@ -5,7 +5,7 @@ select C.person_id, C.condition_era_id as event_id, C.condition_era_start_date a from ( select ce.* @ordinalExpression - FROM `@cdm_database_schema/condition_era` ce + FROM global_temp.condition_era ce @codesetClause ) C @joinClause diff --git a/src/main/resources/resources/cohortdefinition/sql/conditionOccurrence.sql b/src/main/resources/resources/cohortdefinition/sql/conditionOccurrence.sql index bb57faf3..add9cccd 100644 --- a/src/main/resources/resources/cohortdefinition/sql/conditionOccurrence.sql +++ b/src/main/resources/resources/cohortdefinition/sql/conditionOccurrence.sql @@ -5,7 +5,7 @@ SELECT C.person_id, C.condition_occurrence_id as event_id, C.condition_start_dat FROM ( SELECT co.* @ordinalExpression - FROM `@cdm_database_schema/condition_occurrence` co + FROM global_temp.condition_occurrence co @codesetClause ) C @joinClause diff --git a/src/main/resources/resources/cohortdefinition/sql/death.sql b/src/main/resources/resources/cohortdefinition/sql/death.sql index 32ab8b57..ff7d2951 100644 --- a/src/main/resources/resources/cohortdefinition/sql/death.sql +++ b/src/main/resources/resources/cohortdefinition/sql/death.sql @@ -5,7 +5,7 @@ select C.person_id, C.person_id as event_id, C.death_date as start_date, date_ad from ( select d.* - FROM `@cdm_database_schema/death` d + FROM global_temp.death d @codesetClause ) C @joinClause diff --git a/src/main/resources/resources/cohortdefinition/sql/demographicCriteria.sql b/src/main/resources/resources/cohortdefinition/sql/demographicCriteria.sql index 3387220a..96c16817 100644 --- a/src/main/resources/resources/cohortdefinition/sql/demographicCriteria.sql +++ b/src/main/resources/resources/cohortdefinition/sql/demographicCriteria.sql @@ -1,7 +1,7 @@ -- Begin Demographic Criteria SELECT @indexId as index_id, e.person_id, e.event_id FROM @eventTable e -JOIN `@cdm_database_schema/person` P ON P.person_id = e.person_id +JOIN global_temp.person P ON P.person_id = e.person_id @whereClause GROUP BY e.person_id, e.event_id -- End Demographic Criteria diff --git a/src/main/resources/resources/cohortdefinition/sql/deviceExposure.sql b/src/main/resources/resources/cohortdefinition/sql/deviceExposure.sql index d0d25986..1073af24 100644 --- a/src/main/resources/resources/cohortdefinition/sql/deviceExposure.sql +++ b/src/main/resources/resources/cohortdefinition/sql/deviceExposure.sql @@ -5,7 +5,7 @@ select C.person_id, C.device_exposure_id as event_id, C.device_exposure_start_da from ( select de.* @ordinalExpression - FROM `@cdm_database_schema/device_exposure` de + FROM global_temp.device_exposure de @codesetClause ) C @joinClause diff --git a/src/main/resources/resources/cohortdefinition/sql/doseEra.sql b/src/main/resources/resources/cohortdefinition/sql/doseEra.sql index b1a61841..2d2649b0 100644 --- a/src/main/resources/resources/cohortdefinition/sql/doseEra.sql +++ b/src/main/resources/resources/cohortdefinition/sql/doseEra.sql @@ -5,7 +5,7 @@ select C.person_id, C.dose_era_id as event_id, C.dose_era_start_date as start_da from ( select de.* @ordinalExpression - FROM `@cdm_database_schema/dose_era` de + FROM global_temp.dose_era de @codesetClause ) C @joinClause diff --git a/src/main/resources/resources/cohortdefinition/sql/drugEra.sql b/src/main/resources/resources/cohortdefinition/sql/drugEra.sql index 7af9d0ce..0935ecf8 100644 --- a/src/main/resources/resources/cohortdefinition/sql/drugEra.sql +++ b/src/main/resources/resources/cohortdefinition/sql/drugEra.sql @@ -5,7 +5,7 @@ select C.person_id, C.drug_era_id as event_id, C.drug_era_start_date as start_da from ( select de.* @ordinalExpression - FROM `@cdm_database_schema/drug_era` de + FROM global_temp.drug_era de @codesetClause ) C @joinClause diff --git a/src/main/resources/resources/cohortdefinition/sql/drugExposure.sql b/src/main/resources/resources/cohortdefinition/sql/drugExposure.sql index d0cb3bfc..0745482f 100644 --- a/src/main/resources/resources/cohortdefinition/sql/drugExposure.sql +++ b/src/main/resources/resources/cohortdefinition/sql/drugExposure.sql @@ -6,7 +6,7 @@ select C.person_id, C.drug_exposure_id as event_id, C.drug_exposure_start_date a from ( select de.* @ordinalExpression - FROM `@cdm_database_schema/drug_exposure` de + FROM global_temp.drug_exposure de @codesetClause ) C @joinClause diff --git a/src/main/resources/resources/cohortdefinition/sql/eventTableExpression.sql b/src/main/resources/resources/cohortdefinition/sql/eventTableExpression.sql index 30c43065..c059b467 100644 --- a/src/main/resources/resources/cohortdefinition/sql/eventTableExpression.sql +++ b/src/main/resources/resources/cohortdefinition/sql/eventTableExpression.sql @@ -1,4 +1,4 @@ SELECT Q.person_id, Q.event_id, Q.start_date, Q.end_date, Q.visit_occurrence_id, op.observation_period_start_date as op_start_date, op.observation_period_end_date as op_end_date FROM (@eventQuery) Q -JOIN `@cdm_database_schema/observation_period` op on Q.person_id = op.person_id +JOIN global_temp.observation_period op on Q.person_id = op.person_id and op.observation_period_start_date <= Q.start_date and op.observation_period_end_date >= Q.start_date diff --git a/src/main/resources/resources/cohortdefinition/sql/generateCohort.sql b/src/main/resources/resources/cohortdefinition/sql/generateCohort.sql index fba760a0..c0d7132e 100644 --- a/src/main/resources/resources/cohortdefinition/sql/generateCohort.sql +++ b/src/main/resources/resources/cohortdefinition/sql/generateCohort.sql @@ -1,5 +1,3 @@ -CREATE TABLE `@target_database_schema.@target_cohort_table` AS - with primary_events as ( @primaryEventsQuery diff --git a/src/main/resources/resources/cohortdefinition/sql/locationRegion.sql b/src/main/resources/resources/cohortdefinition/sql/locationRegion.sql index 193796db..6d4f8eea 100644 --- a/src/main/resources/resources/cohortdefinition/sql/locationRegion.sql +++ b/src/main/resources/resources/cohortdefinition/sql/locationRegion.sql @@ -10,8 +10,8 @@ select from ( select l.*, lh.* - FROM `@cdm_database_schema/location` l - JOIN `@cdm_database_schema.location_history` lh ON l.location_id = lh.location_id + FROM global_temp.location l + JOIN global_temp.location_history lh ON l.location_id = lh.location_id @codesetClause WHERE lh.domain_id = 'PERSON' ) C diff --git a/src/main/resources/resources/cohortdefinition/sql/measurement.sql b/src/main/resources/resources/cohortdefinition/sql/measurement.sql index 07205cb9..dbfeedb1 100644 --- a/src/main/resources/resources/cohortdefinition/sql/measurement.sql +++ b/src/main/resources/resources/cohortdefinition/sql/measurement.sql @@ -5,7 +5,7 @@ select C.person_id, C.measurement_id as event_id, C.measurement_date as start_da from ( select m.* @ordinalExpression - FROM `@cdm_database_schema/measurement` m + FROM global_temp.measurement m @codesetClause ) C @joinClause diff --git a/src/main/resources/resources/cohortdefinition/sql/observation.sql b/src/main/resources/resources/cohortdefinition/sql/observation.sql index 80cce34f..06de2b3b 100644 --- a/src/main/resources/resources/cohortdefinition/sql/observation.sql +++ b/src/main/resources/resources/cohortdefinition/sql/observation.sql @@ -5,7 +5,7 @@ select C.person_id, C.observation_id as event_id, C.observation_date as start_da from ( select o.* @ordinalExpression - FROM `@cdm_database_schema/observation` o + FROM global_temp.observation o @codesetClause ) C @joinClause diff --git a/src/main/resources/resources/cohortdefinition/sql/observationPeriod.sql b/src/main/resources/resources/cohortdefinition/sql/observationPeriod.sql index 11686f9f..e147eb53 100644 --- a/src/main/resources/resources/cohortdefinition/sql/observationPeriod.sql +++ b/src/main/resources/resources/cohortdefinition/sql/observationPeriod.sql @@ -6,7 +6,7 @@ select C.person_id, C.observation_period_id as event_id, @startDateExpression as from ( select op.*, row_number() over (PARTITION BY op.person_id ORDER BY op.observation_period_start_date) as ordinal - FROM `@cdm_database_schema/observation_period` op + FROM global_temp.observation_period op ) C @joinClause @whereClause diff --git a/src/main/resources/resources/cohortdefinition/sql/payerPlanPeriod.sql b/src/main/resources/resources/cohortdefinition/sql/payerPlanPeriod.sql index d6b06403..880d99e4 100644 --- a/src/main/resources/resources/cohortdefinition/sql/payerPlanPeriod.sql +++ b/src/main/resources/resources/cohortdefinition/sql/payerPlanPeriod.sql @@ -6,7 +6,7 @@ select C.person_id, C.payer_plan_period_id as event_id, @startDateExpression as from ( select ppp.*, row_number() over (PARTITION BY ppp.person_id ORDER BY ppp.payer_plan_period_start_date) as ordinal - FROM @cdm_database_schema.PAYER_PLAN_PERIOD ppp + FROM global_temp.payer_plan_period ppp ) C @joinClause @whereClause diff --git a/src/main/resources/resources/cohortdefinition/sql/primaryEventsQuery.sql b/src/main/resources/resources/cohortdefinition/sql/primaryEventsQuery.sql index 1fb79eff..3c3439bb 100644 --- a/src/main/resources/resources/cohortdefinition/sql/primaryEventsQuery.sql +++ b/src/main/resources/resources/cohortdefinition/sql/primaryEventsQuery.sql @@ -9,7 +9,7 @@ FROM ( @criteriaQueries ) E - JOIN `@cdm_database_schema/observation_period` op on E.person_id = op.person_id and E.start_date >= op.observation_period_start_date and E.start_date <= op.observation_period_end_date + JOIN global_temp.observation_period op on E.person_id = op.person_id and E.start_date >= op.observation_period_start_date and E.start_date <= op.observation_period_end_date WHERE @primaryEventsFilter ) P @primaryEventLimit diff --git a/src/main/resources/resources/cohortdefinition/sql/procedureOccurrence.sql b/src/main/resources/resources/cohortdefinition/sql/procedureOccurrence.sql index 60cbff8d..86710530 100644 --- a/src/main/resources/resources/cohortdefinition/sql/procedureOccurrence.sql +++ b/src/main/resources/resources/cohortdefinition/sql/procedureOccurrence.sql @@ -5,7 +5,7 @@ select C.person_id, C.procedure_occurrence_id as event_id, C.procedure_date as s from ( select po.* @ordinalExpression - FROM `@cdm_database_schema/procedure_occurrence` po + FROM global_temp.procedure_occurrence po @codesetClause ) C @joinClause diff --git a/src/main/resources/resources/cohortdefinition/sql/specimen.sql b/src/main/resources/resources/cohortdefinition/sql/specimen.sql index 60ff1d03..61c1dc96 100644 --- a/src/main/resources/resources/cohortdefinition/sql/specimen.sql +++ b/src/main/resources/resources/cohortdefinition/sql/specimen.sql @@ -5,7 +5,7 @@ select C.person_id, C.specimen_id as event_id, C.specimen_date as start_date, da from ( select s.* @ordinalExpression - FROM `@cdm_database_schema/specimen` s + FROM global_temp.specimen s @codesetClause ) C @joinClause diff --git a/src/main/resources/resources/cohortdefinition/sql/visitOccurrence.sql b/src/main/resources/resources/cohortdefinition/sql/visitOccurrence.sql index 248715c7..4c89a08f 100644 --- a/src/main/resources/resources/cohortdefinition/sql/visitOccurrence.sql +++ b/src/main/resources/resources/cohortdefinition/sql/visitOccurrence.sql @@ -5,7 +5,7 @@ select C.person_id, C.visit_occurrence_id as event_id, C.visit_start_date as sta from ( select vo.* @ordinalExpression - FROM `@cdm_database_schema/visit_occurrence` vo + FROM global_temp.visit_occurrence vo @codesetClause ) C @joinClause diff --git a/src/main/resources/resources/cohortdefinition/sql_old/additionalCriteria.sql b/src/main/resources/resources/cohortdefinition/sql_server/additionalCriteria.sql similarity index 100% rename from src/main/resources/resources/cohortdefinition/sql_old/additionalCriteria.sql rename to src/main/resources/resources/cohortdefinition/sql_server/additionalCriteria.sql diff --git a/src/main/resources/resources/cohortdefinition/sql_old/censoringInsert.sql b/src/main/resources/resources/cohortdefinition/sql_server/censoringInsert.sql similarity index 100% rename from src/main/resources/resources/cohortdefinition/sql_old/censoringInsert.sql rename to src/main/resources/resources/cohortdefinition/sql_server/censoringInsert.sql diff --git a/src/main/resources/resources/cohortdefinition/sql_old/codesetQuery.sql b/src/main/resources/resources/cohortdefinition/sql_server/codesetQuery.sql similarity index 100% rename from src/main/resources/resources/cohortdefinition/sql_old/codesetQuery.sql rename to src/main/resources/resources/cohortdefinition/sql_server/codesetQuery.sql diff --git a/src/main/resources/resources/cohortdefinition/sql_old/cohortCensoredStats.sql b/src/main/resources/resources/cohortdefinition/sql_server/cohortCensoredStats.sql similarity index 100% rename from src/main/resources/resources/cohortdefinition/sql_old/cohortCensoredStats.sql rename to src/main/resources/resources/cohortdefinition/sql_server/cohortCensoredStats.sql diff --git a/src/main/resources/resources/cohortdefinition/sql_old/cohortInclusionAnalysis.sql b/src/main/resources/resources/cohortdefinition/sql_server/cohortInclusionAnalysis.sql similarity index 100% rename from src/main/resources/resources/cohortdefinition/sql_old/cohortInclusionAnalysis.sql rename to src/main/resources/resources/cohortdefinition/sql_server/cohortInclusionAnalysis.sql diff --git a/src/main/resources/resources/cohortdefinition/sql_old/conditionEra.sql b/src/main/resources/resources/cohortdefinition/sql_server/conditionEra.sql similarity index 100% rename from src/main/resources/resources/cohortdefinition/sql_old/conditionEra.sql rename to src/main/resources/resources/cohortdefinition/sql_server/conditionEra.sql diff --git a/src/main/resources/resources/cohortdefinition/sql_old/conditionOccurrence.sql b/src/main/resources/resources/cohortdefinition/sql_server/conditionOccurrence.sql similarity index 100% rename from src/main/resources/resources/cohortdefinition/sql_old/conditionOccurrence.sql rename to src/main/resources/resources/cohortdefinition/sql_server/conditionOccurrence.sql diff --git a/src/main/resources/resources/cohortdefinition/sql_old/customEraStrategy.sql b/src/main/resources/resources/cohortdefinition/sql_server/customEraStrategy.sql similarity index 100% rename from src/main/resources/resources/cohortdefinition/sql_old/customEraStrategy.sql rename to src/main/resources/resources/cohortdefinition/sql_server/customEraStrategy.sql diff --git a/src/main/resources/resources/cohortdefinition/sql_old/dateOffsetStrategy.sql b/src/main/resources/resources/cohortdefinition/sql_server/dateOffsetStrategy.sql similarity index 100% rename from src/main/resources/resources/cohortdefinition/sql_old/dateOffsetStrategy.sql rename to src/main/resources/resources/cohortdefinition/sql_server/dateOffsetStrategy.sql diff --git a/src/main/resources/resources/cohortdefinition/sql_old/death.sql b/src/main/resources/resources/cohortdefinition/sql_server/death.sql similarity index 100% rename from src/main/resources/resources/cohortdefinition/sql_old/death.sql rename to src/main/resources/resources/cohortdefinition/sql_server/death.sql diff --git a/src/main/resources/resources/cohortdefinition/sql_old/demographicCriteria.sql b/src/main/resources/resources/cohortdefinition/sql_server/demographicCriteria.sql similarity index 100% rename from src/main/resources/resources/cohortdefinition/sql_old/demographicCriteria.sql rename to src/main/resources/resources/cohortdefinition/sql_server/demographicCriteria.sql diff --git a/src/main/resources/resources/cohortdefinition/sql_old/deviceExposure.sql b/src/main/resources/resources/cohortdefinition/sql_server/deviceExposure.sql similarity index 100% rename from src/main/resources/resources/cohortdefinition/sql_old/deviceExposure.sql rename to src/main/resources/resources/cohortdefinition/sql_server/deviceExposure.sql diff --git a/src/main/resources/resources/cohortdefinition/sql_old/doseEra.sql b/src/main/resources/resources/cohortdefinition/sql_server/doseEra.sql similarity index 100% rename from src/main/resources/resources/cohortdefinition/sql_old/doseEra.sql rename to src/main/resources/resources/cohortdefinition/sql_server/doseEra.sql diff --git a/src/main/resources/resources/cohortdefinition/sql_old/drugEra.sql b/src/main/resources/resources/cohortdefinition/sql_server/drugEra.sql similarity index 100% rename from src/main/resources/resources/cohortdefinition/sql_old/drugEra.sql rename to src/main/resources/resources/cohortdefinition/sql_server/drugEra.sql diff --git a/src/main/resources/resources/cohortdefinition/sql_old/drugExposure.sql b/src/main/resources/resources/cohortdefinition/sql_server/drugExposure.sql similarity index 100% rename from src/main/resources/resources/cohortdefinition/sql_old/drugExposure.sql rename to src/main/resources/resources/cohortdefinition/sql_server/drugExposure.sql diff --git a/src/main/resources/resources/cohortdefinition/sql_old/eraConstructor.sql b/src/main/resources/resources/cohortdefinition/sql_server/eraConstructor.sql similarity index 100% rename from src/main/resources/resources/cohortdefinition/sql_old/eraConstructor.sql rename to src/main/resources/resources/cohortdefinition/sql_server/eraConstructor.sql diff --git a/src/main/resources/resources/cohortdefinition/sql_old/eventTableExpression.sql b/src/main/resources/resources/cohortdefinition/sql_server/eventTableExpression.sql similarity index 100% rename from src/main/resources/resources/cohortdefinition/sql_old/eventTableExpression.sql rename to src/main/resources/resources/cohortdefinition/sql_server/eventTableExpression.sql diff --git a/src/main/resources/resources/cohortdefinition/sql_old/generateCohort.sql b/src/main/resources/resources/cohortdefinition/sql_server/generateCohort.sql similarity index 100% rename from src/main/resources/resources/cohortdefinition/sql_old/generateCohort.sql rename to src/main/resources/resources/cohortdefinition/sql_server/generateCohort.sql diff --git a/src/main/resources/resources/cohortdefinition/sql_old/groupQuery.sql b/src/main/resources/resources/cohortdefinition/sql_server/groupQuery.sql similarity index 100% rename from src/main/resources/resources/cohortdefinition/sql_old/groupQuery.sql rename to src/main/resources/resources/cohortdefinition/sql_server/groupQuery.sql diff --git a/src/main/resources/resources/cohortdefinition/sql_old/inclusionrule.sql b/src/main/resources/resources/cohortdefinition/sql_server/inclusionrule.sql similarity index 100% rename from src/main/resources/resources/cohortdefinition/sql_old/inclusionrule.sql rename to src/main/resources/resources/cohortdefinition/sql_server/inclusionrule.sql diff --git a/src/main/resources/resources/cohortdefinition/sql_old/locationRegion.sql b/src/main/resources/resources/cohortdefinition/sql_server/locationRegion.sql similarity index 100% rename from src/main/resources/resources/cohortdefinition/sql_old/locationRegion.sql rename to src/main/resources/resources/cohortdefinition/sql_server/locationRegion.sql diff --git a/src/main/resources/resources/cohortdefinition/sql_old/measurement.sql b/src/main/resources/resources/cohortdefinition/sql_server/measurement.sql similarity index 100% rename from src/main/resources/resources/cohortdefinition/sql_old/measurement.sql rename to src/main/resources/resources/cohortdefinition/sql_server/measurement.sql diff --git a/src/main/resources/resources/cohortdefinition/sql_old/observation.sql b/src/main/resources/resources/cohortdefinition/sql_server/observation.sql similarity index 100% rename from src/main/resources/resources/cohortdefinition/sql_old/observation.sql rename to src/main/resources/resources/cohortdefinition/sql_server/observation.sql diff --git a/src/main/resources/resources/cohortdefinition/sql_old/observationPeriod.sql b/src/main/resources/resources/cohortdefinition/sql_server/observationPeriod.sql similarity index 100% rename from src/main/resources/resources/cohortdefinition/sql_old/observationPeriod.sql rename to src/main/resources/resources/cohortdefinition/sql_server/observationPeriod.sql diff --git a/src/main/resources/resources/cohortdefinition/sql_old/payerPlanPeriod.sql b/src/main/resources/resources/cohortdefinition/sql_server/payerPlanPeriod.sql similarity index 100% rename from src/main/resources/resources/cohortdefinition/sql_old/payerPlanPeriod.sql rename to src/main/resources/resources/cohortdefinition/sql_server/payerPlanPeriod.sql diff --git a/src/main/resources/resources/cohortdefinition/sql_old/primaryEventsQuery.sql b/src/main/resources/resources/cohortdefinition/sql_server/primaryEventsQuery.sql similarity index 100% rename from src/main/resources/resources/cohortdefinition/sql_old/primaryEventsQuery.sql rename to src/main/resources/resources/cohortdefinition/sql_server/primaryEventsQuery.sql diff --git a/src/main/resources/resources/cohortdefinition/sql_old/procedureOccurrence.sql b/src/main/resources/resources/cohortdefinition/sql_server/procedureOccurrence.sql similarity index 100% rename from src/main/resources/resources/cohortdefinition/sql_old/procedureOccurrence.sql rename to src/main/resources/resources/cohortdefinition/sql_server/procedureOccurrence.sql diff --git a/src/main/resources/resources/cohortdefinition/sql_old/specimen.sql b/src/main/resources/resources/cohortdefinition/sql_server/specimen.sql similarity index 100% rename from src/main/resources/resources/cohortdefinition/sql_old/specimen.sql rename to src/main/resources/resources/cohortdefinition/sql_server/specimen.sql diff --git a/src/main/resources/resources/cohortdefinition/sql_old/visitOccurrence.sql b/src/main/resources/resources/cohortdefinition/sql_server/visitOccurrence.sql similarity index 100% rename from src/main/resources/resources/cohortdefinition/sql_old/visitOccurrence.sql rename to src/main/resources/resources/cohortdefinition/sql_server/visitOccurrence.sql diff --git a/src/main/resources/resources/cohortdefinition/sql_old/windowedCriteria.sql b/src/main/resources/resources/cohortdefinition/sql_server/windowedCriteria.sql similarity index 100% rename from src/main/resources/resources/cohortdefinition/sql_old/windowedCriteria.sql rename to src/main/resources/resources/cohortdefinition/sql_server/windowedCriteria.sql diff --git a/src/main/resources/resources/cohortdefinition/sql_transforms/additionalCriteria.sql b/src/main/resources/resources/cohortdefinition/sql_transforms/additionalCriteria.sql new file mode 100644 index 00000000..db01d00c --- /dev/null +++ b/src/main/resources/resources/cohortdefinition/sql_transforms/additionalCriteria.sql @@ -0,0 +1,5 @@ +-- Begin Correlated Criteria +@windowedCriteria +GROUP BY P.person_id, P.event_id +@occurrenceCriteria +-- End Correlated Criteria diff --git a/src/main/resources/resources/cohortdefinition/sql_transforms/censoringInsert.sql b/src/main/resources/resources/cohortdefinition/sql_transforms/censoringInsert.sql new file mode 100644 index 00000000..02bc0e13 --- /dev/null +++ b/src/main/resources/resources/cohortdefinition/sql_transforms/censoringInsert.sql @@ -0,0 +1,7 @@ +select i.event_id, i.person_id, MIN(c.start_date) as end_date +FROM included_events i +JOIN +( +@criteriaQuery +) C on C.person_id = I.person_id and C.start_date >= I.start_date and C.START_DATE <= I.op_end_date +GROUP BY i.event_id, i.person_id diff --git a/src/main/resources/resources/cohortdefinition/sql_transforms/codesetQuery.sql b/src/main/resources/resources/cohortdefinition/sql_transforms/codesetQuery.sql new file mode 100644 index 00000000..ebc1008d --- /dev/null +++ b/src/main/resources/resources/cohortdefinition/sql_transforms/codesetQuery.sql @@ -0,0 +1,7 @@ +CREATE TABLE #Codesets ( + codeset_id int NOT NULL, + concept_id bigint NOT NULL +) +; + +@codesetInserts diff --git a/src/main/resources/resources/cohortdefinition/sql_transforms/cohortCensoredStats.sql b/src/main/resources/resources/cohortdefinition/sql_transforms/cohortCensoredStats.sql new file mode 100644 index 00000000..8d9f9710 --- /dev/null +++ b/src/main/resources/resources/cohortdefinition/sql_transforms/cohortCensoredStats.sql @@ -0,0 +1,7 @@ +-- calculate censored +delete from @results_database_schema.cohort_censor_stats where @cohort_id_field_name = @target_cohort_id; +insert into @results_database_schema.cohort_censor_stats (@cohort_id_field_name, lost_count) + select @target_cohort_id as @cohort_id_field_name, coalesce(FCC.total_people - TC.total, 0) as lost_count + FROM + (select count_big(distinct person_id) as total_people from #final_cohort) FCC, + (select count_big(distinct subject_id) as total from @target_database_schema.@target_cohort_table t where t.@cohort_id_field_name = @target_cohort_id) TC; \ No newline at end of file diff --git a/src/main/resources/resources/cohortdefinition/sql_transforms/cohortInclusionAnalysis.sql b/src/main/resources/resources/cohortdefinition/sql_transforms/cohortInclusionAnalysis.sql new file mode 100644 index 00000000..85a1d081 --- /dev/null +++ b/src/main/resources/resources/cohortdefinition/sql_transforms/cohortInclusionAnalysis.sql @@ -0,0 +1,44 @@ +-- calculte matching group counts +delete from @results_database_schema.cohort_inclusion_result where @cohort_id_field_name = @target_cohort_id and mode_id = @inclusionImpactMode; +insert into @results_database_schema.cohort_inclusion_result (@cohort_id_field_name, inclusion_rule_mask, person_count, mode_id) +select @target_cohort_id as @cohort_id_field_name, inclusion_rule_mask, count_big(*) as person_count, @inclusionImpactMode as mode_id +from +( + select Q.person_id, Q.event_id, CAST(SUM(coalesce(POWER(cast(2 as bigint), I.inclusion_rule_id), 0)) AS bigint) as inclusion_rule_mask + from @eventTable Q + LEFT JOIN #inclusion_events I on q.person_id = i.person_id and q.event_id = i.event_id + GROUP BY Q.person_id, Q.event_id +) MG -- matching groups +group by inclusion_rule_mask +; + +-- calculate gain counts +delete from @results_database_schema.cohort_inclusion_stats where @cohort_id_field_name = @target_cohort_id and mode_id = @inclusionImpactMode; +insert into @results_database_schema.cohort_inclusion_stats (@cohort_id_field_name, rule_sequence, person_count, gain_count, person_total, mode_id) +select ir.@cohort_id_field_name, ir.rule_sequence, coalesce(T.person_count, 0) as person_count, coalesce(SR.person_count, 0) gain_count, EventTotal.total, @inclusionImpactMode as mode_id +from @results_database_schema.cohort_inclusion ir +left join +( + select i.inclusion_rule_id, count_big(i.event_id) as person_count + from @eventTable Q + JOIN #inclusion_events i on Q.person_id = I.person_id and Q.event_id = i.event_id + group by i.inclusion_rule_id +) T on ir.rule_sequence = T.inclusion_rule_id +CROSS JOIN (select count(*) as total_rules from @results_database_schema.cohort_inclusion where @cohort_id_field_name = @target_cohort_id) RuleTotal +CROSS JOIN (select count_big(event_id) as total from @eventTable) EventTotal +LEFT JOIN @results_database_schema.cohort_inclusion_result SR on SR.mode_id = @inclusionImpactMode AND SR.@cohort_id_field_name = @target_cohort_id AND (POWER(cast(2 as bigint),RuleTotal.total_rules) - POWER(cast(2 as bigint),ir.rule_sequence) - 1) = SR.inclusion_rule_mask -- POWER(2,rule count) - POWER(2,rule sequence) - 1 is the mask for 'all except this rule' +WHERE ir.@cohort_id_field_name = @target_cohort_id +; + +-- calculate totals +delete from @results_database_schema.cohort_summary_stats where @cohort_id_field_name = @target_cohort_id and mode_id = @inclusionImpactMode; +insert into @results_database_schema.cohort_summary_stats (@cohort_id_field_name, base_count, final_count, mode_id) +select @target_cohort_id as @cohort_id_field_name, PC.total as person_count, coalesce(FC.total, 0) as final_count, @inclusionImpactMode as mode_id +FROM +(select count_big(event_id) as total from @eventTable) PC, +(select sum(sr.person_count) as total + from @results_database_schema.cohort_inclusion_result sr + CROSS JOIN (select count(*) as total_rules from @results_database_schema.cohort_inclusion where @cohort_id_field_name = @target_cohort_id) RuleTotal + where sr.mode_id = @inclusionImpactMode and sr.@cohort_id_field_name = @target_cohort_id and sr.inclusion_rule_mask = POWER(cast(2 as bigint),RuleTotal.total_rules)-1 +) FC +; diff --git a/src/main/resources/resources/cohortdefinition/sql_transforms/conditionEra.sql b/src/main/resources/resources/cohortdefinition/sql_transforms/conditionEra.sql new file mode 100644 index 00000000..fb99a3e6 --- /dev/null +++ b/src/main/resources/resources/cohortdefinition/sql_transforms/conditionEra.sql @@ -0,0 +1,13 @@ +-- Begin Condition Era Criteria +select C.person_id, C.condition_era_id as event_id, C.condition_era_start_date as start_date, + C.condition_era_end_date as end_date, C.condition_concept_id as TARGET_CONCEPT_ID, CAST(NULL as bigint) as visit_occurrence_id, + C.condition_era_start_date as sort_date +from +( + select ce.* @ordinalExpression + FROM `@cdm_database_schema/condition_era` ce +@codesetClause +) C +@joinClause +@whereClause +-- End Condition Era Criteria diff --git a/src/main/resources/resources/cohortdefinition/sql_transforms/conditionOccurrence.sql b/src/main/resources/resources/cohortdefinition/sql_transforms/conditionOccurrence.sql new file mode 100644 index 00000000..bb57faf3 --- /dev/null +++ b/src/main/resources/resources/cohortdefinition/sql_transforms/conditionOccurrence.sql @@ -0,0 +1,13 @@ +-- Begin Condition Occurrence Criteria +SELECT C.person_id, C.condition_occurrence_id as event_id, C.condition_start_date as start_date, COALESCE(C.condition_end_date, date_add(C.condition_start_date, 1)) as end_date, + C.condition_concept_id as TARGET_CONCEPT_ID, C.visit_occurrence_id, + C.condition_start_date as sort_date +FROM +( + SELECT co.* @ordinalExpression + FROM `@cdm_database_schema/condition_occurrence` co + @codesetClause +) C +@joinClause +@whereClause +-- End Condition Occurrence Criteria diff --git a/src/main/resources/resources/cohortdefinition/sql_transforms/customEraStrategy.sql b/src/main/resources/resources/cohortdefinition/sql_transforms/customEraStrategy.sql new file mode 100644 index 00000000..513ebaa3 --- /dev/null +++ b/src/main/resources/resources/cohortdefinition/sql_transforms/customEraStrategy.sql @@ -0,0 +1,65 @@ +-- custom era strategy + +with ctePersons(person_id) as ( + select distinct person_id from @eventTable +) + +select person_id, drug_exposure_start_date, drug_exposure_end_date +INTO #drugTarget +FROM ( + select de.PERSON_ID, DRUG_EXPOSURE_START_DATE, @drugExposureEndDateExpression as DRUG_EXPOSURE_END_DATE + FROM @cdm_database_schema.DRUG_EXPOSURE de + JOIN ctePersons p on de.person_id = p.person_id + JOIN #Codesets cs on cs.codeset_id = @drugCodesetId AND de.drug_concept_id = cs.concept_id + + UNION ALL + + select de.PERSON_ID, DRUG_EXPOSURE_START_DATE, @drugExposureEndDateExpression as DRUG_EXPOSURE_END_DATE + FROM @cdm_database_schema.DRUG_EXPOSURE de + JOIN ctePersons p on de.person_id = p.person_id + JOIN #Codesets cs on cs.codeset_id = @drugCodesetId AND de.drug_source_concept_id = cs.concept_id +) E +; + +select et.event_id, et.person_id, ERAS.era_end_date as end_date +INTO #strategy_ends +from @eventTable et +JOIN +( + select ENDS.person_id, min(drug_exposure_start_date) as era_start_date, DATEADD(day,@offset, ENDS.era_end_date) as era_end_date + from + ( + select de.person_id, de.drug_exposure_start_date, MIN(e.END_DATE) as era_end_date + FROM #drugTarget DE + JOIN + ( + --cteEndDates + select PERSON_ID, DATEADD(day,-1 * @gapDays,EVENT_DATE) as END_DATE -- unpad the end date by @gapDays + FROM + ( + select PERSON_ID, EVENT_DATE, EVENT_TYPE, + MAX(START_ORDINAL) OVER (PARTITION BY PERSON_ID ORDER BY event_date, event_type ROWS UNBOUNDED PRECEDING) AS start_ordinal, + ROW_NUMBER() OVER (PARTITION BY PERSON_ID ORDER BY EVENT_DATE, EVENT_TYPE) AS OVERALL_ORD -- this re-numbers the inner UNION so all rows are numbered ordered by the event date + from + ( + -- select the start dates, assigning a row number to each + Select PERSON_ID, DRUG_EXPOSURE_START_DATE AS EVENT_DATE, 0 as EVENT_TYPE, ROW_NUMBER() OVER (PARTITION BY PERSON_ID ORDER BY DRUG_EXPOSURE_START_DATE) as START_ORDINAL + from #drugTarget D + + UNION ALL + + -- add the end dates with NULL as the row number, padding the end dates by @gapDays to allow a grace period for overlapping ranges. + select PERSON_ID, DATEADD(day,@gapDays,DRUG_EXPOSURE_END_DATE), 1 as EVENT_TYPE, NULL + FROM #drugTarget D + ) RAWDATA + ) E + WHERE 2 * E.START_ORDINAL - E.OVERALL_ORD = 0 + ) E on DE.PERSON_ID = E.PERSON_ID and E.END_DATE >= DE.DRUG_EXPOSURE_START_DATE + GROUP BY de.person_id, de.drug_exposure_start_date + ) ENDS + GROUP BY ENDS.person_id, ENDS.era_end_date +) ERAS on ERAS.person_id = et.person_id +WHERE et.start_date between ERAS.era_start_date and ERAS.era_end_date; + +TRUNCATE TABLE #drugTarget; +DROP TABLE #drugTarget; diff --git a/src/main/resources/resources/cohortdefinition/sql_transforms/dateOffsetStrategy.sql b/src/main/resources/resources/cohortdefinition/sql_transforms/dateOffsetStrategy.sql new file mode 100644 index 00000000..7e043822 --- /dev/null +++ b/src/main/resources/resources/cohortdefinition/sql_transforms/dateOffsetStrategy.sql @@ -0,0 +1,7 @@ +-- date offset strategy + +strategy_ends AS ( + select event_id, person_id, + case when date_add(@dateField, @offset) > start_date then date_add(@dateField, @offset) else start_date end as end_date + from @eventTable +), \ No newline at end of file diff --git a/src/main/resources/resources/cohortdefinition/sql_transforms/death.sql b/src/main/resources/resources/cohortdefinition/sql_transforms/death.sql new file mode 100644 index 00000000..32ab8b57 --- /dev/null +++ b/src/main/resources/resources/cohortdefinition/sql_transforms/death.sql @@ -0,0 +1,14 @@ +-- Begin Death Criteria +select C.person_id, C.person_id as event_id, C.death_date as start_date, date_add(C.death_date, 1) as end_date, + coalesce(C.cause_concept_id,0) as TARGET_CONCEPT_ID, CAST(NULL as bigint) as visit_occurrence_id, + C.death_date as sort_date +from +( + select d.* + FROM `@cdm_database_schema/death` d +@codesetClause +) C +@joinClause +@whereClause +-- End Death Criteria + diff --git a/src/main/resources/resources/cohortdefinition/sql_transforms/demographicCriteria.sql b/src/main/resources/resources/cohortdefinition/sql_transforms/demographicCriteria.sql new file mode 100644 index 00000000..3387220a --- /dev/null +++ b/src/main/resources/resources/cohortdefinition/sql_transforms/demographicCriteria.sql @@ -0,0 +1,7 @@ +-- Begin Demographic Criteria +SELECT @indexId as index_id, e.person_id, e.event_id +FROM @eventTable e +JOIN `@cdm_database_schema/person` P ON P.person_id = e.person_id +@whereClause +GROUP BY e.person_id, e.event_id +-- End Demographic Criteria diff --git a/src/main/resources/resources/cohortdefinition/sql_transforms/deviceExposure.sql b/src/main/resources/resources/cohortdefinition/sql_transforms/deviceExposure.sql new file mode 100644 index 00000000..d0d25986 --- /dev/null +++ b/src/main/resources/resources/cohortdefinition/sql_transforms/deviceExposure.sql @@ -0,0 +1,13 @@ +-- Begin Device Exposure Criteria +select C.person_id, C.device_exposure_id as event_id, C.device_exposure_start_date as start_date, C.device_exposure_end_date as end_date, + C.device_concept_id as TARGET_CONCEPT_ID, C.visit_occurrence_id, + C.device_exposure_start_date as sort_date +from +( + select de.* @ordinalExpression + FROM `@cdm_database_schema/device_exposure` de +@codesetClause +) C +@joinClause +@whereClause +-- End Device Exposure Criteria diff --git a/src/main/resources/resources/cohortdefinition/sql_transforms/doseEra.sql b/src/main/resources/resources/cohortdefinition/sql_transforms/doseEra.sql new file mode 100644 index 00000000..b1a61841 --- /dev/null +++ b/src/main/resources/resources/cohortdefinition/sql_transforms/doseEra.sql @@ -0,0 +1,13 @@ +-- Begin Dose Era Criteria +select C.person_id, C.dose_era_id as event_id, C.dose_era_start_date as start_date, C.dose_era_end_date as end_date, + C.drug_concept_id as TARGET_CONCEPT_ID, CAST(NULL as bigint) as visit_occurrence_id, + C.dose_era_start_date as sort_date +from +( + select de.* @ordinalExpression + FROM `@cdm_database_schema/dose_era` de +@codesetClause +) C +@joinClause +@whereClause +-- End Dose Era Criteria diff --git a/src/main/resources/resources/cohortdefinition/sql_transforms/drugEra.sql b/src/main/resources/resources/cohortdefinition/sql_transforms/drugEra.sql new file mode 100644 index 00000000..7af9d0ce --- /dev/null +++ b/src/main/resources/resources/cohortdefinition/sql_transforms/drugEra.sql @@ -0,0 +1,13 @@ +-- Begin Drug Era Criteria +select C.person_id, C.drug_era_id as event_id, C.drug_era_start_date as start_date, C.drug_era_end_date as end_date, + C.drug_concept_id as TARGET_CONCEPT_ID, CAST(NULL as bigint) as visit_occurrence_id, + C.drug_era_start_date as sort_date +from +( + select de.* @ordinalExpression + FROM `@cdm_database_schema/drug_era` de +@codesetClause +) C +@joinClause +@whereClause +-- End Drug Era Criteria diff --git a/src/main/resources/resources/cohortdefinition/sql_transforms/drugExposure.sql b/src/main/resources/resources/cohortdefinition/sql_transforms/drugExposure.sql new file mode 100644 index 00000000..d0cb3bfc --- /dev/null +++ b/src/main/resources/resources/cohortdefinition/sql_transforms/drugExposure.sql @@ -0,0 +1,14 @@ +-- Begin Drug Exposure Criteria +select C.person_id, C.drug_exposure_id as event_id, C.drug_exposure_start_date as start_date, + COALESCE(C.drug_exposure_end_date, date_add(C.drug_exposure_start_date, C.DAYS_SUPPLY), date_add(C.drug_exposure_start_date, 1)) as end_date, + C.drug_concept_id as TARGET_CONCEPT_ID, C.visit_occurrence_id, + C.drug_exposure_start_date as sort_date +from +( + select de.* @ordinalExpression + FROM `@cdm_database_schema/drug_exposure` de +@codesetClause +) C +@joinClause +@whereClause +-- End Drug Exposure Criteria diff --git a/src/main/resources/resources/cohortdefinition/sql_transforms/eraConstructor.sql b/src/main/resources/resources/cohortdefinition/sql_transforms/eraConstructor.sql new file mode 100644 index 00000000..99620248 --- /dev/null +++ b/src/main/resources/resources/cohortdefinition/sql_transforms/eraConstructor.sql @@ -0,0 +1,74 @@ +-- era constructor +WITH cteSource AS +( + SELECT + @eraGroup + , start_date + , end_date + , dense_rank() over(order by @eraGroup) as groupid + FROM collapse_input so +) +, +-------------------------------------------------------------------------------------------------------------- +cteEndDates AS -- the magic +( + SELECT + groupid + , date_add(event_date, -1 * @eraconstructorpad) as end_date + FROM + ( + SELECT + groupid + , event_date + , event_type + , MAX(start_ordinal) OVER (PARTITION BY groupid ORDER BY event_date, event_type ROWS UNBOUNDED PRECEDING) AS start_ordinal + , ROW_NUMBER() OVER (PARTITION BY groupid ORDER BY event_date, event_type) AS overall_ord + FROM + ( + + SELECT + groupid + , start_date AS event_date + , -1 AS event_type + , ROW_NUMBER() OVER (PARTITION BY groupid ORDER BY start_date) AS start_ordinal + FROM cteSource + + UNION ALL + + + SELECT + groupid + , date_add(end_date, @eraconstructorpad) as end_date + , 1 AS event_type + , NULL + FROM cteSource + ) RAWDATA + ) e + WHERE (2 * e.start_ordinal) - e.overall_ord = 0 +), +-------------------------------------------------------------------------------------------------------------- +cteEnds AS +( + SELECT + c.groupid + , c.start_date + , MIN(e.end_date) AS era_end_date + FROM cteSource c + JOIN cteEndDates e ON c.groupid = e.groupid AND e.end_date >= c.start_date + GROUP BY + c.groupid + , c.start_date +), +collapse_output AS +( + select @eraGroup, start_date, end_date + from + ( + select @eraGroup , min(b.start_date) as start_date, b.end_date + from ( + select distinct @eraGroup, groupid from cteSource + ) a + inner join cteEnds b on a.groupid = b.groupid + group by @eraGroup, end_date + ) q +), \ No newline at end of file diff --git a/src/main/resources/resources/cohortdefinition/sql_transforms/eventTableExpression.sql b/src/main/resources/resources/cohortdefinition/sql_transforms/eventTableExpression.sql new file mode 100644 index 00000000..30c43065 --- /dev/null +++ b/src/main/resources/resources/cohortdefinition/sql_transforms/eventTableExpression.sql @@ -0,0 +1,4 @@ +SELECT Q.person_id, Q.event_id, Q.start_date, Q.end_date, Q.visit_occurrence_id, op.observation_period_start_date as op_start_date, op.observation_period_end_date as op_end_date +FROM (@eventQuery) Q +JOIN `@cdm_database_schema/observation_period` op on Q.person_id = op.person_id + and op.observation_period_start_date <= Q.start_date and op.observation_period_end_date >= Q.start_date diff --git a/src/main/resources/resources/cohortdefinition/sql_transforms/generateCohort.sql b/src/main/resources/resources/cohortdefinition/sql_transforms/generateCohort.sql new file mode 100644 index 00000000..fba760a0 --- /dev/null +++ b/src/main/resources/resources/cohortdefinition/sql_transforms/generateCohort.sql @@ -0,0 +1,165 @@ +CREATE TABLE `@target_database_schema.@target_cohort_table` AS + +with primary_events as +( +@primaryEventsQuery +), +qualified_events AS ( + SELECT event_id, person_id, start_date, end_date, op_start_date, op_end_date, visit_occurrence_id + FROM + ( + select pe.event_id, pe.person_id, pe.start_date, pe.end_date, pe.op_start_date, pe.op_end_date, row_number() over (partition by pe.person_id order by pe.start_date @QualifiedEventSort) as ordinal, cast(pe.visit_occurrence_id as bigint) as visit_occurrence_id + FROM primary_events pe + @additionalCriteriaQuery + ) QE + @QualifiedLimitFilter +), + +--- Inclusion Rule Inserts + +@inclusionCohortInserts + +cteIncludedEvents as +( + SELECT event_id, person_id, start_date, end_date, op_start_date, op_end_date, row_number() over (partition by person_id order by start_date @IncludedEventSort) as ordinal + from + ( + select Q.event_id, Q.person_id, Q.start_date, Q.end_date, Q.op_start_date, Q.op_end_date, SUM(coalesce(POWER(cast(2 as bigint), I.inclusion_rule_id), 0)) as inclusion_rule_mask + from qualified_events Q + LEFT JOIN inclusion_events I on I.person_id = Q.person_id and I.event_id = Q.event_id + GROUP BY Q.event_id, Q.person_id, Q.start_date, Q.end_date, Q.op_start_date, Q.op_end_date + ) MG -- matching groups +{@ruleTotal != 0}?{ + -- the matching group with all bits set ( POWER(2,# of inclusion rules) - 1 = inclusion_rule_mask + WHERE (MG.inclusion_rule_mask = POWER(cast(2 as bigint),@ruleTotal)-1) +} +), + +included_events AS ( + select event_id, person_id, start_date, end_date, op_start_date, op_end_date + FROM cteIncludedEvents Results + @ResultLimitFilter +), + +@strategy_ends_temp_tables + +-- generate cohort periods into #final_cohort +cohort_ends as +( + -- cohort exit dates + @cohort_end_unions +), + +first_ends as +( + select F.person_id, F.start_date, F.end_date + FROM ( + select I.event_id, I.person_id, I.start_date, E.end_date, row_number() over (partition by I.person_id, I.event_id order by E.end_date) as ordinal + from included_events I + join cohort_ends E on I.event_id = E.event_id and I.person_id = E.person_id and E.end_date >= I.start_date + ) F + WHERE F.ordinal = 1 +), + +cohort_rows AS ( + select person_id, start_date, end_date + from first_ends +), + +cteEndDates AS -- the magic +( + SELECT + person_id + , date_add(event_date, -1 * @eraconstructorpad) as end_date + FROM + ( + SELECT + person_id + , event_date + , event_type + , MAX(start_ordinal) OVER (PARTITION BY person_id ORDER BY event_date, event_type ROWS UNBOUNDED PRECEDING) AS start_ordinal + , ROW_NUMBER() OVER (PARTITION BY person_id ORDER BY event_date, event_type) AS overall_ord + FROM + ( + SELECT + person_id + , start_date AS event_date + , -1 AS event_type + , ROW_NUMBER() OVER (PARTITION BY person_id ORDER BY start_date) AS start_ordinal + FROM cohort_rows + + UNION ALL + + + SELECT + person_id + , date_add(end_date, @eraconstructorpad) as end_date + , 1 AS event_type + , NULL + FROM cohort_rows + ) RAWDATA + ) e + WHERE (2 * e.start_ordinal) - e.overall_ord = 0 +), +cteEnds AS +( + SELECT + c.person_id + , c.start_date + , MIN(e.end_date) AS end_date + FROM cohort_rows c + JOIN cteEndDates e ON c.person_id = e.person_id AND e.end_date >= c.start_date + GROUP BY c.person_id, c.start_date +), +final_cohort AS ( + select person_id, min(start_date) as start_date, end_date + from cteEnds + group by person_id, end_date +) + +@finalCohortQuery + + +{@generateStats != 0}?{ +-- Find the event that is the 'best match' per person. +-- the 'best match' is defined as the event that satisfies the most inclusion rules. +-- ties are solved by choosing the event that matches the earliest inclusion rule, and then earliest. + +select q.person_id, q.event_id +into #best_events +from #qualified_events Q +join ( + SELECT R.person_id, R.event_id, ROW_NUMBER() OVER (PARTITION BY R.person_id ORDER BY R.rule_count DESC,R.min_rule_id ASC, R.start_date ASC) AS rank_value + FROM ( + SELECT Q.person_id, Q.event_id, COALESCE(COUNT(DISTINCT I.inclusion_rule_id), 0) AS rule_count, COALESCE(MIN(I.inclusion_rule_id), 0) AS min_rule_id, Q.start_date + FROM #qualified_events Q + LEFT JOIN #inclusion_events I ON q.person_id = i.person_id AND q.event_id = i.event_id + GROUP BY Q.person_id, Q.event_id, Q.start_date + ) R +) ranked on Q.person_id = ranked.person_id and Q.event_id = ranked.event_id +WHERE ranked.rank_value = 1 +; + +-- modes of generation: (the same tables store the results for the different modes, identified by the mode_id column) +-- 0: all events +-- 1: best event + + +-- BEGIN: Inclusion Impact Analysis - event +@inclusionImpactAnalysisByEventQuery +-- END: Inclusion Impact Analysis - event + +-- BEGIN: Inclusion Impact Analysis - person +@inclusionImpactAnalysisByPersonQuery +-- END: Inclusion Impact Analysis - person + +-- BEGIN: Censored Stats +@cohortCensoredStatsQuery +-- END: Censored Stats + +TRUNCATE TABLE #best_events; +DROP TABLE #best_events; + +} + + diff --git a/src/main/resources/resources/cohortdefinition/sql_transforms/groupQuery.sql b/src/main/resources/resources/cohortdefinition/sql_transforms/groupQuery.sql new file mode 100644 index 00000000..01252e94 --- /dev/null +++ b/src/main/resources/resources/cohortdefinition/sql_transforms/groupQuery.sql @@ -0,0 +1,14 @@ +-- Begin Criteria Group +select @indexId as index_id, person_id, event_id +FROM +( + select E.person_id, E.event_id + FROM @eventTable E + @joinType JOIN + ( + @criteriaQueries + ) CQ on E.person_id = CQ.person_id and E.event_id = CQ.event_id + GROUP BY E.person_id, E.event_id + @occurrenceCountClause +) G +-- End Criteria Group diff --git a/src/main/resources/resources/cohortdefinition/sql_transforms/inclusionrule.sql b/src/main/resources/resources/cohortdefinition/sql_transforms/inclusionrule.sql new file mode 100644 index 00000000..aca73475 --- /dev/null +++ b/src/main/resources/resources/cohortdefinition/sql_transforms/inclusionrule.sql @@ -0,0 +1,9 @@ +Inclusion_@inclusion_rule_id AS ( + select @inclusion_rule_id as inclusion_rule_id, person_id, event_id + FROM + ( + select pe.person_id, pe.event_id + FROM qualified_events pe + @additionalCriteriaQuery + ) Results +), \ No newline at end of file diff --git a/src/main/resources/resources/cohortdefinition/sql_transforms/locationRegion.sql b/src/main/resources/resources/cohortdefinition/sql_transforms/locationRegion.sql new file mode 100644 index 00000000..193796db --- /dev/null +++ b/src/main/resources/resources/cohortdefinition/sql_transforms/locationRegion.sql @@ -0,0 +1,18 @@ +-- Begin Location region Criteria +select + C.entity_id AS person_id, + C.location_history_id as event_id, + C.start_date as start_date, + ISNULL(C.end_date, DATEFROMPARTS(2099,12,31)) as end_date, + C.region_concept_id as TARGET_CONCEPT_ID, + CAST(NULL as bigint) as visit_occurrence_id, + C.start_date as sort_date +from +( + select l.*, lh.* + FROM `@cdm_database_schema/location` l + JOIN `@cdm_database_schema.location_history` lh ON l.location_id = lh.location_id +@codesetClause + WHERE lh.domain_id = 'PERSON' +) C +-- End Location region Criteria diff --git a/src/main/resources/resources/cohortdefinition/sql_transforms/measurement.sql b/src/main/resources/resources/cohortdefinition/sql_transforms/measurement.sql new file mode 100644 index 00000000..07205cb9 --- /dev/null +++ b/src/main/resources/resources/cohortdefinition/sql_transforms/measurement.sql @@ -0,0 +1,13 @@ +-- Begin Measurement Criteria +select C.person_id, C.measurement_id as event_id, C.measurement_date as start_date, date_add(C.measurement_date, 1) as end_date, + C.measurement_concept_id as TARGET_CONCEPT_ID, C.visit_occurrence_id, + C.measurement_date as sort_date +from +( + select m.* @ordinalExpression + FROM `@cdm_database_schema/measurement` m +@codesetClause +) C +@joinClause +@whereClause +-- End Measurement Criteria diff --git a/src/main/resources/resources/cohortdefinition/sql_transforms/observation.sql b/src/main/resources/resources/cohortdefinition/sql_transforms/observation.sql new file mode 100644 index 00000000..80cce34f --- /dev/null +++ b/src/main/resources/resources/cohortdefinition/sql_transforms/observation.sql @@ -0,0 +1,13 @@ +-- Begin Observation Criteria +select C.person_id, C.observation_id as event_id, C.observation_date as start_date, date_add(C.observation_date, 1) as end_date, + C.observation_concept_id as TARGET_CONCEPT_ID, C.visit_occurrence_id, + C.observation_date as sort_date +from +( + select o.* @ordinalExpression + FROM `@cdm_database_schema/observation` o +@codesetClause +) C +@joinClause +@whereClause +-- End Observation Criteria diff --git a/src/main/resources/resources/cohortdefinition/sql_transforms/observationPeriod.sql b/src/main/resources/resources/cohortdefinition/sql_transforms/observationPeriod.sql new file mode 100644 index 00000000..11686f9f --- /dev/null +++ b/src/main/resources/resources/cohortdefinition/sql_transforms/observationPeriod.sql @@ -0,0 +1,13 @@ +-- Begin Observation Period Criteria +select C.person_id, C.observation_period_id as event_id, @startDateExpression as start_date, @endDateExpression as end_date, + C.period_type_concept_id as TARGET_CONCEPT_ID, CAST(NULL as bigint) as visit_occurrence_id, + C.observation_period_start_date as sort_date + +from +( + select op.*, row_number() over (PARTITION BY op.person_id ORDER BY op.observation_period_start_date) as ordinal + FROM `@cdm_database_schema/observation_period` op +) C +@joinClause +@whereClause +-- End Observation Period Criteria diff --git a/src/main/resources/resources/cohortdefinition/sql_transforms/payerPlanPeriod.sql b/src/main/resources/resources/cohortdefinition/sql_transforms/payerPlanPeriod.sql new file mode 100644 index 00000000..d6b06403 --- /dev/null +++ b/src/main/resources/resources/cohortdefinition/sql_transforms/payerPlanPeriod.sql @@ -0,0 +1,13 @@ +-- Begin Payer Plan Period Criteria +select C.person_id, C.payer_plan_period_id as event_id, @startDateExpression as start_date, @endDateExpression as end_date, + C.payer_concept_id as TARGET_CONCEPT_ID, CAST(NULL as bigint) as visit_occurrence_id, + C.payer_plan_period_start_date as sort_date + +from +( + select ppp.*, row_number() over (PARTITION BY ppp.person_id ORDER BY ppp.payer_plan_period_start_date) as ordinal + FROM @cdm_database_schema.PAYER_PLAN_PERIOD ppp +) C +@joinClause +@whereClause +-- End Payer Plan Period Criteria diff --git a/src/main/resources/resources/cohortdefinition/sql_transforms/primaryEventsQuery.sql b/src/main/resources/resources/cohortdefinition/sql_transforms/primaryEventsQuery.sql new file mode 100644 index 00000000..1fb79eff --- /dev/null +++ b/src/main/resources/resources/cohortdefinition/sql_transforms/primaryEventsQuery.sql @@ -0,0 +1,16 @@ +-- Begin Primary Events +select P.ordinal as event_id, P.person_id, P.start_date, P.end_date, op_start_date, op_end_date, cast(P.visit_occurrence_id as bigint) as visit_occurrence_id +FROM +( + select E.person_id, E.start_date, E.end_date, + row_number() OVER (PARTITION BY E.person_id ORDER BY E.sort_date @EventSort) ordinal, + op.observation_period_start_date as op_start_date, op.observation_period_end_date as op_end_date, cast(E.visit_occurrence_id as bigint) as visit_occurrence_id + FROM + ( + @criteriaQueries + ) E + JOIN `@cdm_database_schema/observation_period` op on E.person_id = op.person_id and E.start_date >= op.observation_period_start_date and E.start_date <= op.observation_period_end_date + WHERE @primaryEventsFilter +) P +@primaryEventLimit +-- End Primary Events diff --git a/src/main/resources/resources/cohortdefinition/sql_transforms/procedureOccurrence.sql b/src/main/resources/resources/cohortdefinition/sql_transforms/procedureOccurrence.sql new file mode 100644 index 00000000..60cbff8d --- /dev/null +++ b/src/main/resources/resources/cohortdefinition/sql_transforms/procedureOccurrence.sql @@ -0,0 +1,13 @@ +-- Begin Procedure Occurrence Criteria +select C.person_id, C.procedure_occurrence_id as event_id, C.procedure_date as start_date, date_add(C.procedure_date, 1) as end_date, + C.procedure_concept_id as TARGET_CONCEPT_ID, C.visit_occurrence_id, + C.procedure_date as sort_date +from +( + select po.* @ordinalExpression + FROM `@cdm_database_schema/procedure_occurrence` po +@codesetClause +) C +@joinClause +@whereClause +-- End Procedure Occurrence Criteria diff --git a/src/main/resources/resources/cohortdefinition/sql_transforms/specimen.sql b/src/main/resources/resources/cohortdefinition/sql_transforms/specimen.sql new file mode 100644 index 00000000..60ff1d03 --- /dev/null +++ b/src/main/resources/resources/cohortdefinition/sql_transforms/specimen.sql @@ -0,0 +1,13 @@ +-- Begin Specimen Criteria +select C.person_id, C.specimen_id as event_id, C.specimen_date as start_date, date_add(C.specimen_date, 1) as end_date, + C.specimen_concept_id as TARGET_CONCEPT_ID, CAST(NULL as bigint) as visit_occurrence_id, + C.specimen_date as sort_date +from +( + select s.* @ordinalExpression + FROM `@cdm_database_schema/specimen` s +@codesetClause +) C +@joinClause +@whereClause +-- End Specimen Criteria diff --git a/src/main/resources/resources/cohortdefinition/sql_transforms/visitOccurrence.sql b/src/main/resources/resources/cohortdefinition/sql_transforms/visitOccurrence.sql new file mode 100644 index 00000000..248715c7 --- /dev/null +++ b/src/main/resources/resources/cohortdefinition/sql_transforms/visitOccurrence.sql @@ -0,0 +1,13 @@ +-- Begin Visit Occurrence Criteria +select C.person_id, C.visit_occurrence_id as event_id, C.visit_start_date as start_date, C.visit_end_date as end_date, + C.visit_concept_id as TARGET_CONCEPT_ID, C.visit_occurrence_id, + C.visit_start_date as sort_date +from +( + select vo.* @ordinalExpression + FROM `@cdm_database_schema/visit_occurrence` vo +@codesetClause +) C +@joinClause +@whereClause +-- End Visit Occurrence Criteria diff --git a/src/main/resources/resources/cohortdefinition/sql_transforms/windowedCriteria.sql b/src/main/resources/resources/cohortdefinition/sql_transforms/windowedCriteria.sql new file mode 100644 index 00000000..e8284aff --- /dev/null +++ b/src/main/resources/resources/cohortdefinition/sql_transforms/windowedCriteria.sql @@ -0,0 +1,6 @@ +SELECT @indexId as index_id, P.person_id, P.event_id +FROM @eventTable P +@joinType JOIN +( + @criteriaQuery +) A on A.person_id = P.person_id @windowCriteria \ No newline at end of file From 30af3b6b2b192819b0e912a26377c7043dd3dcc4 Mon Sep 17 00:00:00 2001 From: Benjamin Amor Date: Tue, 30 Jun 2020 14:37:36 -0700 Subject: [PATCH 05/14] lowercasing days supply --- src/main/java/org/ohdsi/circe/TestClass.java | 4 ++-- .../resources/resources/cohortdefinition/sql/drugExposure.sql | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/src/main/java/org/ohdsi/circe/TestClass.java b/src/main/java/org/ohdsi/circe/TestClass.java index 2ba1b1a8..5583f093 100644 --- a/src/main/java/org/ohdsi/circe/TestClass.java +++ b/src/main/java/org/ohdsi/circe/TestClass.java @@ -67,8 +67,8 @@ public static void main(String [] args) throws IOException { final String targetTable = "/UNITE/Palantir/OMOP FeatureExtraction/N3C_phenotype/N3C_phenotype_tufts"; final String codelistDataset = "`/UNITE/Palantir/Demo/model development/N3C Phenotype/workbook-output/[Safe Harbor] N3C Phenotype/concept_sets`"; - final String jsonFilePath = "/Users/bamor/Documents/active_projects/circe-be/N3C_phenotype.json"; - final String outputSqlFilePath = "/Users/bamor/Documents/active_projects/circe-be/N3C_phenotype.sql"; + final String jsonFilePath = "/Users/bamor/Documents/active_projects/circe-be/N3C_phenotype_parsed.json"; + final String outputSqlFilePath = "/Users/bamor/Documents/active_projects/circe-be/N3C_phenotype_parsed.sql"; final String jsonString = readFile(jsonFilePath); diff --git a/src/main/resources/resources/cohortdefinition/sql/drugExposure.sql b/src/main/resources/resources/cohortdefinition/sql/drugExposure.sql index 0745482f..cd8331e3 100644 --- a/src/main/resources/resources/cohortdefinition/sql/drugExposure.sql +++ b/src/main/resources/resources/cohortdefinition/sql/drugExposure.sql @@ -1,6 +1,6 @@ -- Begin Drug Exposure Criteria select C.person_id, C.drug_exposure_id as event_id, C.drug_exposure_start_date as start_date, - COALESCE(C.drug_exposure_end_date, date_add(C.drug_exposure_start_date, C.DAYS_SUPPLY), date_add(C.drug_exposure_start_date, 1)) as end_date, + COALESCE(C.drug_exposure_end_date, date_add(C.drug_exposure_start_date, C.days_supply), date_add(C.drug_exposure_start_date, 1)) as end_date, C.drug_concept_id as TARGET_CONCEPT_ID, C.visit_occurrence_id, C.drug_exposure_start_date as sort_date from From 9922c915be37ac5b88aebff3f52bf17525281902 Mon Sep 17 00:00:00 2001 From: Benjamin Amor Date: Tue, 30 Jun 2020 15:40:24 -0700 Subject: [PATCH 06/14] updating inconsistent capitalization --- .../resources/cohortdefinition/sql/censoringInsert.sql | 2 +- .../resources/cohortdefinition/sql/cohortInclusionAnalysis.sql | 2 +- .../cohortdefinition/sql_transforms/censoringInsert.sql | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/src/main/resources/resources/cohortdefinition/sql/censoringInsert.sql b/src/main/resources/resources/cohortdefinition/sql/censoringInsert.sql index 02bc0e13..b127a21a 100644 --- a/src/main/resources/resources/cohortdefinition/sql/censoringInsert.sql +++ b/src/main/resources/resources/cohortdefinition/sql/censoringInsert.sql @@ -3,5 +3,5 @@ FROM included_events i JOIN ( @criteriaQuery -) C on C.person_id = I.person_id and C.start_date >= I.start_date and C.START_DATE <= I.op_end_date +) C on C.person_id = i.person_id and C.start_date >= i.start_date and C.START_DATE <= i.op_end_date GROUP BY i.event_id, i.person_id diff --git a/src/main/resources/resources/cohortdefinition/sql/cohortInclusionAnalysis.sql b/src/main/resources/resources/cohortdefinition/sql/cohortInclusionAnalysis.sql index 85a1d081..2c9dafcc 100644 --- a/src/main/resources/resources/cohortdefinition/sql/cohortInclusionAnalysis.sql +++ b/src/main/resources/resources/cohortdefinition/sql/cohortInclusionAnalysis.sql @@ -21,7 +21,7 @@ left join ( select i.inclusion_rule_id, count_big(i.event_id) as person_count from @eventTable Q - JOIN #inclusion_events i on Q.person_id = I.person_id and Q.event_id = i.event_id + JOIN #inclusion_events i on Q.person_id = i.person_id and Q.event_id = i.event_id group by i.inclusion_rule_id ) T on ir.rule_sequence = T.inclusion_rule_id CROSS JOIN (select count(*) as total_rules from @results_database_schema.cohort_inclusion where @cohort_id_field_name = @target_cohort_id) RuleTotal diff --git a/src/main/resources/resources/cohortdefinition/sql_transforms/censoringInsert.sql b/src/main/resources/resources/cohortdefinition/sql_transforms/censoringInsert.sql index 02bc0e13..b127a21a 100644 --- a/src/main/resources/resources/cohortdefinition/sql_transforms/censoringInsert.sql +++ b/src/main/resources/resources/cohortdefinition/sql_transforms/censoringInsert.sql @@ -3,5 +3,5 @@ FROM included_events i JOIN ( @criteriaQuery -) C on C.person_id = I.person_id and C.start_date >= I.start_date and C.START_DATE <= I.op_end_date +) C on C.person_id = i.person_id and C.start_date >= i.start_date and C.START_DATE <= i.op_end_date GROUP BY i.event_id, i.person_id From 0e675b0deb85ebf3970e1fbc80cdfbd22a5f1c45 Mon Sep 17 00:00:00 2001 From: Benjamin Amor Date: Tue, 30 Jun 2020 16:13:10 -0700 Subject: [PATCH 07/14] fixing capitalization again --- .../resources/cohortdefinition/sql/censoringInsert.sql | 2 +- .../cohortdefinition/sql_transforms/censoringInsert.sql | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/main/resources/resources/cohortdefinition/sql/censoringInsert.sql b/src/main/resources/resources/cohortdefinition/sql/censoringInsert.sql index b127a21a..18f2c120 100644 --- a/src/main/resources/resources/cohortdefinition/sql/censoringInsert.sql +++ b/src/main/resources/resources/cohortdefinition/sql/censoringInsert.sql @@ -3,5 +3,5 @@ FROM included_events i JOIN ( @criteriaQuery -) C on C.person_id = i.person_id and C.start_date >= i.start_date and C.START_DATE <= i.op_end_date +) C on C.person_id = i.person_id and C.start_date >= i.start_date and C.start_date <= i.op_end_date GROUP BY i.event_id, i.person_id diff --git a/src/main/resources/resources/cohortdefinition/sql_transforms/censoringInsert.sql b/src/main/resources/resources/cohortdefinition/sql_transforms/censoringInsert.sql index b127a21a..18f2c120 100644 --- a/src/main/resources/resources/cohortdefinition/sql_transforms/censoringInsert.sql +++ b/src/main/resources/resources/cohortdefinition/sql_transforms/censoringInsert.sql @@ -3,5 +3,5 @@ FROM included_events i JOIN ( @criteriaQuery -) C on C.person_id = i.person_id and C.start_date >= i.start_date and C.START_DATE <= i.op_end_date +) C on C.person_id = i.person_id and C.start_date >= i.start_date and C.start_date <= i.op_end_date GROUP BY i.event_id, i.person_id From db06b88d4afb3dc3d3dbda7dc4037dc0218de0d8 Mon Sep 17 00:00:00 2001 From: Benjamin Amor Date: Fri, 10 Jul 2020 19:45:51 -0700 Subject: [PATCH 08/14] changing start and end date to cohort_start_date and cohort_end_date --- .../circe/cohortdefinition/CohortExpressionQueryBuilder.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/org/ohdsi/circe/cohortdefinition/CohortExpressionQueryBuilder.java b/src/main/java/org/ohdsi/circe/cohortdefinition/CohortExpressionQueryBuilder.java index fcdf08ff..b5ee458c 100644 --- a/src/main/java/org/ohdsi/circe/cohortdefinition/CohortExpressionQueryBuilder.java +++ b/src/main/java/org/ohdsi/circe/cohortdefinition/CohortExpressionQueryBuilder.java @@ -227,7 +227,7 @@ public String getPrimaryEventsQuery(PrimaryCriteria primaryCriteria) { public String getFinalCohortQuery(Period censorWindow) { - String query = "select @target_cohort_id as @cohort_id_field_name, person_id as subject_id, @start_date, @end_date \n" + String query = "select @target_cohort_id as @cohort_id_field_name, person_id as subject_id, @start_date as cohort_start_date, @end_date as cohort_end_date\n" + "FROM final_cohort"; String startDate = "start_date"; From b4e8a2818841c03a1776c716e3003539e0964eba Mon Sep 17 00:00:00 2001 From: Benjamin Amor Date: Fri, 17 Jul 2020 18:14:03 -0700 Subject: [PATCH 09/14] fixing more capitalized issues --- .../resources/cohortdefinition/sql/censoringInsert.sql | 2 +- .../cohortdefinition/sql/demographicCriteria.sql | 8 ++++---- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/src/main/resources/resources/cohortdefinition/sql/censoringInsert.sql b/src/main/resources/resources/cohortdefinition/sql/censoringInsert.sql index 18f2c120..224993ba 100644 --- a/src/main/resources/resources/cohortdefinition/sql/censoringInsert.sql +++ b/src/main/resources/resources/cohortdefinition/sql/censoringInsert.sql @@ -1,4 +1,4 @@ -select i.event_id, i.person_id, MIN(c.start_date) as end_date +select i.event_id, i.person_id, MIN(C.start_date) as end_date FROM included_events i JOIN ( diff --git a/src/main/resources/resources/cohortdefinition/sql/demographicCriteria.sql b/src/main/resources/resources/cohortdefinition/sql/demographicCriteria.sql index 96c16817..721ec74c 100644 --- a/src/main/resources/resources/cohortdefinition/sql/demographicCriteria.sql +++ b/src/main/resources/resources/cohortdefinition/sql/demographicCriteria.sql @@ -1,7 +1,7 @@ -- Begin Demographic Criteria -SELECT @indexId as index_id, e.person_id, e.event_id -FROM @eventTable e -JOIN global_temp.person P ON P.person_id = e.person_id +SELECT @indexId as index_id, E.person_id, e.event_id +FROM @eventTable E +JOIN global_temp.person P ON P.person_id = E.person_id @whereClause -GROUP BY e.person_id, e.event_id +GROUP BY E.person_id, E.event_id -- End Demographic Criteria From 750938a86d9b1fec1e96ee27848caa2e57a8270e Mon Sep 17 00:00:00 2001 From: Benjamin Amor Date: Sat, 18 Jul 2020 06:51:40 -0700 Subject: [PATCH 10/14] another capitalization issue --- .../resources/cohortdefinition/sql/demographicCriteria.sql | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/resources/resources/cohortdefinition/sql/demographicCriteria.sql b/src/main/resources/resources/cohortdefinition/sql/demographicCriteria.sql index 721ec74c..092463b6 100644 --- a/src/main/resources/resources/cohortdefinition/sql/demographicCriteria.sql +++ b/src/main/resources/resources/cohortdefinition/sql/demographicCriteria.sql @@ -1,5 +1,5 @@ -- Begin Demographic Criteria -SELECT @indexId as index_id, E.person_id, e.event_id +SELECT @indexId as index_id, E.person_id, E.event_id FROM @eventTable E JOIN global_temp.person P ON P.person_id = E.person_id @whereClause From 9aa4447c3e9141a95afb67e4662add149c4d2723 Mon Sep 17 00:00:00 2001 From: Benjamin Amor Date: Mon, 20 Jul 2020 15:01:11 -0700 Subject: [PATCH 11/14] renaming event_id column to overcome spark self join bug --- .../CohortExpressionQueryBuilder.java | 4 +- .../cohortdefinition/sql/censoringInsert.sql | 2 +- .../sql/customEraStrategy.sql | 122 +++++++++--------- 3 files changed, 63 insertions(+), 65 deletions(-) diff --git a/src/main/java/org/ohdsi/circe/cohortdefinition/CohortExpressionQueryBuilder.java b/src/main/java/org/ohdsi/circe/cohortdefinition/CohortExpressionQueryBuilder.java index b5ee458c..694e1920 100644 --- a/src/main/java/org/ohdsi/circe/cohortdefinition/CohortExpressionQueryBuilder.java +++ b/src/main/java/org/ohdsi/circe/cohortdefinition/CohortExpressionQueryBuilder.java @@ -321,13 +321,13 @@ public String buildExpressionQuery(CohortExpression expression, BuildExpressionQ ArrayList endDateSelects = new ArrayList<>(); if (!(expression.endStrategy instanceof DateOffsetStrategy)) { - endDateSelects.add("-- By default, cohort exit at the event's op end date\nselect event_id, person_id, op_end_date as end_date from included_events"); + endDateSelects.add("-- By default, cohort exit at the event's op end date\nselect event_id as event_id1, person_id, op_end_date as end_date from included_events"); } if (expression.endStrategy != null) { // replace @strategy_ends placeholders with temp table creation and cleanup scripts. resultSql = StringUtils.replace(resultSql, "@strategy_ends_temp_tables", expression.endStrategy.accept(this, "included_events")); - endDateSelects.add(String.format("-- End Date Strategy\n%s\n", "SELECT event_id, person_id, end_date from strategy_ends")); + endDateSelects.add(String.format("-- End Date Strategy\n%s\n", "SELECT event_id as event_id1, person_id, end_date from strategy_ends")); } else { // replace @trategy_ends placeholders with empty string resultSql = StringUtils.replace(resultSql, "@strategy_ends_temp_tables", ""); diff --git a/src/main/resources/resources/cohortdefinition/sql/censoringInsert.sql b/src/main/resources/resources/cohortdefinition/sql/censoringInsert.sql index 224993ba..5bdc4596 100644 --- a/src/main/resources/resources/cohortdefinition/sql/censoringInsert.sql +++ b/src/main/resources/resources/cohortdefinition/sql/censoringInsert.sql @@ -1,4 +1,4 @@ -select i.event_id, i.person_id, MIN(C.start_date) as end_date +select i.event_id as event_id1, i.person_id, MIN(C.start_date) as end_date FROM included_events i JOIN ( diff --git a/src/main/resources/resources/cohortdefinition/sql/customEraStrategy.sql b/src/main/resources/resources/cohortdefinition/sql/customEraStrategy.sql index 513ebaa3..85e0bb36 100644 --- a/src/main/resources/resources/cohortdefinition/sql/customEraStrategy.sql +++ b/src/main/resources/resources/cohortdefinition/sql/customEraStrategy.sql @@ -1,65 +1,63 @@ -- custom era strategy -with ctePersons(person_id) as ( +ctePersons as ( select distinct person_id from @eventTable -) - -select person_id, drug_exposure_start_date, drug_exposure_end_date -INTO #drugTarget -FROM ( - select de.PERSON_ID, DRUG_EXPOSURE_START_DATE, @drugExposureEndDateExpression as DRUG_EXPOSURE_END_DATE - FROM @cdm_database_schema.DRUG_EXPOSURE de - JOIN ctePersons p on de.person_id = p.person_id - JOIN #Codesets cs on cs.codeset_id = @drugCodesetId AND de.drug_concept_id = cs.concept_id - - UNION ALL - - select de.PERSON_ID, DRUG_EXPOSURE_START_DATE, @drugExposureEndDateExpression as DRUG_EXPOSURE_END_DATE - FROM @cdm_database_schema.DRUG_EXPOSURE de - JOIN ctePersons p on de.person_id = p.person_id - JOIN #Codesets cs on cs.codeset_id = @drugCodesetId AND de.drug_source_concept_id = cs.concept_id -) E -; - -select et.event_id, et.person_id, ERAS.era_end_date as end_date -INTO #strategy_ends -from @eventTable et -JOIN -( - select ENDS.person_id, min(drug_exposure_start_date) as era_start_date, DATEADD(day,@offset, ENDS.era_end_date) as era_end_date - from - ( - select de.person_id, de.drug_exposure_start_date, MIN(e.END_DATE) as era_end_date - FROM #drugTarget DE - JOIN - ( - --cteEndDates - select PERSON_ID, DATEADD(day,-1 * @gapDays,EVENT_DATE) as END_DATE -- unpad the end date by @gapDays - FROM - ( - select PERSON_ID, EVENT_DATE, EVENT_TYPE, - MAX(START_ORDINAL) OVER (PARTITION BY PERSON_ID ORDER BY event_date, event_type ROWS UNBOUNDED PRECEDING) AS start_ordinal, - ROW_NUMBER() OVER (PARTITION BY PERSON_ID ORDER BY EVENT_DATE, EVENT_TYPE) AS OVERALL_ORD -- this re-numbers the inner UNION so all rows are numbered ordered by the event date - from - ( - -- select the start dates, assigning a row number to each - Select PERSON_ID, DRUG_EXPOSURE_START_DATE AS EVENT_DATE, 0 as EVENT_TYPE, ROW_NUMBER() OVER (PARTITION BY PERSON_ID ORDER BY DRUG_EXPOSURE_START_DATE) as START_ORDINAL - from #drugTarget D - - UNION ALL - - -- add the end dates with NULL as the row number, padding the end dates by @gapDays to allow a grace period for overlapping ranges. - select PERSON_ID, DATEADD(day,@gapDays,DRUG_EXPOSURE_END_DATE), 1 as EVENT_TYPE, NULL - FROM #drugTarget D - ) RAWDATA - ) E - WHERE 2 * E.START_ORDINAL - E.OVERALL_ORD = 0 - ) E on DE.PERSON_ID = E.PERSON_ID and E.END_DATE >= DE.DRUG_EXPOSURE_START_DATE - GROUP BY de.person_id, de.drug_exposure_start_date - ) ENDS - GROUP BY ENDS.person_id, ENDS.era_end_date -) ERAS on ERAS.person_id = et.person_id -WHERE et.start_date between ERAS.era_start_date and ERAS.era_end_date; - -TRUNCATE TABLE #drugTarget; -DROP TABLE #drugTarget; +), + +drug_target as ( + select person_id, drug_exposure_start_date, drug_exposure_end_date + FROM ( + select de.person_id, drug_exposure_start_date, @drugExposureEndDateExpression as drug_exposure_end_date + FROM global_temp.drug_exposure de + JOIN ctePersons p on de.person_id = p.person_id + JOIN global_temp.codesets cs on cs.codeset_id = @drugCodesetId AND de.drug_concept_id = cs.concept_id + + UNION ALL + + select de.person_id, drug_exposure_start_date, @drugExposureEndDateExpression as drug_exposure_end_date + FROM global_temp.drug_exposure de + JOIN ctePersons p on de.person_id = p.person_id + JOIN global_temp.codesets cs on cs.codeset_id = @drugCodesetId AND de.drug_source_concept_id = cs.concept_id + ) E +), + +strategy_ends as ( + select et.event_id, et.person_id, ERAS.era_end_date as end_date + from @eventTable et + JOIN + ( + select ENDS.person_id, min(drug_exposure_start_date) as era_start_date, date_add(ENDS.era_end_date, @offset) as era_end_date + from + ( + select DE.person_id, DE.drug_exposure_start_date, MIN(E.end_date) as era_end_date + FROM drug_target DE + JOIN + ( + --cteEndDates + select person_id, date_add(event_date, -1 * @gapDays) as end_date -- unpad the end date by @gapDays + FROM + ( + select person_id, event_date, event_type, + MAX(start_ordinal) OVER (PARTITION BY person_id ORDER BY event_date, event_type ROWS UNBOUNDED PRECEDING) AS start_ordinal, + ROW_NUMBER() OVER (PARTITION BY person_id ORDER BY event_date, event_type) AS overall_ord -- this re-numbers the inner UNION so all rows are numbered ordered by the event date + from + ( + -- select the start dates, assigning a row number to each + Select person_id, drug_exposure_start_date AS event_date, 0 as event_type, ROW_NUMBER() OVER (PARTITION BY person_id ORDER BY drug_exposure_start_date) as start_ordinal + from drug_target D + + UNION ALL + + -- add the end dates with NULL as the row number, padding the end dates by @gapDays to allow a grace period for overlapping ranges. + select person_id, date_add(drug_exposure_end_date, @gapDays), 1 as event_type, NULL + FROM drug_target D + ) RAWDATA + ) E + WHERE 2 * E.start_ordinal - E.overall_ord = 0 + ) E on DE.person_id = E.person_id and E.end_date >= DE.drug_exposure_start_date + GROUP BY DE.person_id, DE.drug_exposure_start_date + ) ENDS + GROUP BY ENDS.person_id, ENDS.era_end_date + ) ERAS on ERAS.person_id = et.person_id + WHERE et.start_date between ERAS.era_start_date and ERAS.era_end_date +), From 4fe8823a32910fd13dee6ff09310e67193f070e4 Mon Sep 17 00:00:00 2001 From: Benjamin Amor Date: Wed, 9 Sep 2020 17:28:06 -0400 Subject: [PATCH 12/14] making join happen on event_id1 --- .../resources/resources/cohortdefinition/sql/generateCohort.sql | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/resources/resources/cohortdefinition/sql/generateCohort.sql b/src/main/resources/resources/cohortdefinition/sql/generateCohort.sql index c0d7132e..f267b074 100644 --- a/src/main/resources/resources/cohortdefinition/sql/generateCohort.sql +++ b/src/main/resources/resources/cohortdefinition/sql/generateCohort.sql @@ -54,7 +54,7 @@ first_ends as FROM ( select I.event_id, I.person_id, I.start_date, E.end_date, row_number() over (partition by I.person_id, I.event_id order by E.end_date) as ordinal from included_events I - join cohort_ends E on I.event_id = E.event_id and I.person_id = E.person_id and E.end_date >= I.start_date + join cohort_ends E on I.event_id = E.event_id1 and I.person_id = E.person_id and E.end_date >= I.start_date ) F WHERE F.ordinal = 1 ), From 2d5b9a21ff22020130c981aa31b9ae135f85c847 Mon Sep 17 00:00:00 2001 From: Benjamin Amor Date: Fri, 11 Sep 2020 09:03:06 -0400 Subject: [PATCH 13/14] updating builder sql --- src/main/java/org/ohdsi/circe/TestClass.java | 10 +++++----- .../builders/ConditionEraSqlBuilder.java | 4 ++-- .../builders/DeviceExposureSqlBuilder.java | 6 +++--- .../builders/DrugEraSqlBuilder.java | 4 ++-- .../builders/DrugExposureSqlBuilder.java | 6 +++--- .../builders/ObservationPeriodSqlBuilder.java | 8 ++++---- .../builders/ObservationSqlBuilder.java | 6 +++--- .../builders/PayerPlanPeriodSqlBuilder.java | 8 ++++---- .../builders/ProcedureOccurrenceSqlBuilder.java | 6 +++--- .../builders/SpecimenSqlBuilder.java | 2 +- .../builders/VisitOccurrenceSqlBuilder.java | 14 +++++++------- .../sql_transforms/censoringInsert.sql | 2 +- .../sql_transforms/drugExposure.sql | 2 +- 13 files changed, 39 insertions(+), 39 deletions(-) diff --git a/src/main/java/org/ohdsi/circe/TestClass.java b/src/main/java/org/ohdsi/circe/TestClass.java index 5583f093..3d7cde8e 100644 --- a/src/main/java/org/ohdsi/circe/TestClass.java +++ b/src/main/java/org/ohdsi/circe/TestClass.java @@ -62,13 +62,13 @@ public static String createSql( public static void main(String [] args) throws IOException { final int cohortId = 1; - final String cdmSchema = "/UNITE/Safe Harbor - TUFTS/transform"; + final String cdmSchema = "/UNITE/Safe Harbor/transform"; final String resultSchema = ""; - final String targetTable = "/UNITE/Palantir/OMOP FeatureExtraction/N3C_phenotype/N3C_phenotype_tufts"; - final String codelistDataset = "`/UNITE/Palantir/Demo/model development/N3C Phenotype/workbook-output/[Safe Harbor] N3C Phenotype/concept_sets`"; + final String targetTable = "/UNITE/Palantir/OHDSI/testing"; + final String codelistDataset = "`/UNITE/Palantir/Applications/Development/Code Set Builder/hubble_base/concept_set_to_concept_id_edited`"; - final String jsonFilePath = "/Users/bamor/Documents/active_projects/circe-be/N3C_phenotype_parsed.json"; - final String outputSqlFilePath = "/Users/bamor/Documents/active_projects/circe-be/N3C_phenotype_parsed.sql"; + final String jsonFilePath = "/Users/bamor/Documents/active_projects/circe-be/test.json"; + final String outputSqlFilePath = "/Users/bamor/Documents/active_projects/circe-be/test.sql"; final String jsonString = readFile(jsonFilePath); diff --git a/src/main/java/org/ohdsi/circe/cohortdefinition/builders/ConditionEraSqlBuilder.java b/src/main/java/org/ohdsi/circe/cohortdefinition/builders/ConditionEraSqlBuilder.java index 61bf781b..9394dbb2 100644 --- a/src/main/java/org/ohdsi/circe/cohortdefinition/builders/ConditionEraSqlBuilder.java +++ b/src/main/java/org/ohdsi/circe/cohortdefinition/builders/ConditionEraSqlBuilder.java @@ -52,7 +52,7 @@ protected List resolveJoinClauses(T criteria) { // join to PERSON if (criteria.ageAtStart != null || criteria.ageAtEnd != null || (criteria.gender != null && criteria.gender.length > 0)) { - joinClauses.add("JOIN @cdm_database_schema.PERSON P on C.person_id = P.person_id"); + joinClauses.add("JOIN global_temp.person P on C.person_id = P.person_id"); } return joinClauses; @@ -80,7 +80,7 @@ protected List resolveWhereClauses(T criteria, Map addit // eraLength if (criteria.eraLength != null) { - whereClauses.add(buildNumericRangeClause("DATEDIFF(d,C.condition_era_start_date, C.condition_era_end_date)", criteria.eraLength)); + whereClauses.add(buildNumericRangeClause("DATEDIFF(C.condition_era_end_date, C.condition_era_start_date)", criteria.eraLength)); } // ageAtStart diff --git a/src/main/java/org/ohdsi/circe/cohortdefinition/builders/DeviceExposureSqlBuilder.java b/src/main/java/org/ohdsi/circe/cohortdefinition/builders/DeviceExposureSqlBuilder.java index 6e5f5466..196fd395 100644 --- a/src/main/java/org/ohdsi/circe/cohortdefinition/builders/DeviceExposureSqlBuilder.java +++ b/src/main/java/org/ohdsi/circe/cohortdefinition/builders/DeviceExposureSqlBuilder.java @@ -55,13 +55,13 @@ protected List resolveJoinClauses(T criteria) { // join to PERSON if (criteria.age != null || (criteria.gender != null && criteria.gender.length > 0)) { - joinClauses.add("JOIN @cdm_database_schema.PERSON P on C.person_id = P.person_id"); + joinClauses.add("JOIN @cdm_database_schema.person P on C.person_id = P.person_id"); } if (criteria.visitType != null && criteria.visitType.length > 0) { - joinClauses.add("JOIN @cdm_database_schema.VISIT_OCCURRENCE V on C.visit_occurrence_id = V.visit_occurrence_id and C.person_id = V.person_id"); + joinClauses.add("JOIN @cdm_database_schema.visit_occurrence V on C.visit_occurrence_id = V.visit_occurrence_id and C.person_id = V.person_id"); } if (criteria.providerSpecialty != null && criteria.providerSpecialty.length > 0) { - joinClauses.add("LEFT JOIN @cdm_database_schema.PROVIDER PR on C.provider_id = PR.provider_id"); + joinClauses.add("LEFT JOIN @cdm_database_schema.provider PR on C.provider_id = PR.provider_id"); } return joinClauses; diff --git a/src/main/java/org/ohdsi/circe/cohortdefinition/builders/DrugEraSqlBuilder.java b/src/main/java/org/ohdsi/circe/cohortdefinition/builders/DrugEraSqlBuilder.java index 8fe86850..1b1e39eb 100644 --- a/src/main/java/org/ohdsi/circe/cohortdefinition/builders/DrugEraSqlBuilder.java +++ b/src/main/java/org/ohdsi/circe/cohortdefinition/builders/DrugEraSqlBuilder.java @@ -52,7 +52,7 @@ protected List resolveJoinClauses(T criteria) { // join to PERSON if (criteria.ageAtStart != null || criteria.ageAtEnd != null || (criteria.gender != null && criteria.gender.length > 0)) { - joinClauses.add("JOIN @cdm_database_schema.PERSON P on C.person_id = P.person_id"); + joinClauses.add("JOIN @cdm_database_schema.person P on C.person_id = P.person_id"); } return joinClauses; @@ -80,7 +80,7 @@ protected List resolveWhereClauses(T criteria, Map addit // eraLength if (criteria.eraLength != null) { - whereClauses.add(buildNumericRangeClause("DATEDIFF(d,C.drug_era_start_date, C.drug_era_end_date)", criteria.eraLength)); + whereClauses.add(buildNumericRangeClause("DATEDIFF(C.drug_era_end_date, C.drug_era_start_date)", criteria.eraLength)); } // gapDays diff --git a/src/main/java/org/ohdsi/circe/cohortdefinition/builders/DrugExposureSqlBuilder.java b/src/main/java/org/ohdsi/circe/cohortdefinition/builders/DrugExposureSqlBuilder.java index 7f13daaa..f63dcaa8 100644 --- a/src/main/java/org/ohdsi/circe/cohortdefinition/builders/DrugExposureSqlBuilder.java +++ b/src/main/java/org/ohdsi/circe/cohortdefinition/builders/DrugExposureSqlBuilder.java @@ -56,13 +56,13 @@ protected List resolveJoinClauses(T criteria) { // join to PERSON if (criteria.age != null || (criteria.gender != null && criteria.gender.length > 0)) { - joinClauses.add("JOIN @cdm_database_schema.PERSON P on C.person_id = P.person_id"); + joinClauses.add("JOIN @cdm_database_schema.person P on C.person_id = P.person_id"); } if (criteria.visitType != null && criteria.visitType.length > 0) { - joinClauses.add("JOIN @cdm_database_schema.VISIT_OCCURRENCE V on C.visit_occurrence_id = V.visit_occurrence_id and C.person_id = V.person_id"); + joinClauses.add("JOIN @cdm_database_schema.visit_occurrence V on C.visit_occurrence_id = V.visit_occurrence_id and C.person_id = V.person_id"); } if (criteria.providerSpecialty != null && criteria.providerSpecialty.length > 0) { - joinClauses.add("LEFT JOIN @cdm_database_schema.PROVIDER PR on C.provider_id = PR.provider_id"); + joinClauses.add("LEFT JOIN @cdm_database_schema.provider PR on C.provider_id = PR.provider_id"); } return joinClauses; diff --git a/src/main/java/org/ohdsi/circe/cohortdefinition/builders/ObservationPeriodSqlBuilder.java b/src/main/java/org/ohdsi/circe/cohortdefinition/builders/ObservationPeriodSqlBuilder.java index 6cc0f1fb..898b0c81 100644 --- a/src/main/java/org/ohdsi/circe/cohortdefinition/builders/ObservationPeriodSqlBuilder.java +++ b/src/main/java/org/ohdsi/circe/cohortdefinition/builders/ObservationPeriodSqlBuilder.java @@ -42,7 +42,7 @@ protected List resolveJoinClauses(T criteria) { // join to PERSON if (criteria.ageAtStart != null || criteria.ageAtEnd != null) { - joinClauses.add("JOIN @cdm_database_schema.PERSON P on C.person_id = P.person_id"); + joinClauses.add("JOIN @cdm_database_schema.person P on C.person_id = P.person_id"); } return joinClauses; @@ -65,12 +65,12 @@ protected List resolveWhereClauses(T criteria, Map addit if (userDefinedPeriod.startDate != null) { startDateExpression = BuilderUtils.dateStringToSql(userDefinedPeriod.startDate); - whereClauses.add(String.format("C.OBSERVATION_PERIOD_START_DATE <= %s and C.OBSERVATION_PERIOD_END_DATE >= %s", startDateExpression, startDateExpression)); + whereClauses.add(String.format("C.observation_period_start_date <= %s and C.observation_period_end_date >= %s", startDateExpression, startDateExpression)); } if (userDefinedPeriod.endDate != null) { endDateExpression = BuilderUtils.dateStringToSql(userDefinedPeriod.endDate); - whereClauses.add(String.format("C.OBSERVATION_PERIOD_START_DATE <= %s and C.OBSERVATION_PERIOD_END_DATE >= %s", endDateExpression, endDateExpression)); + whereClauses.add(String.format("C.observation_period_start_date <= %s and C.observation_period_end_date >= %s", endDateExpression, endDateExpression)); } } @@ -95,7 +95,7 @@ protected List resolveWhereClauses(T criteria, Map addit // periodLength if (criteria.periodLength != null) { - whereClauses.add(buildNumericRangeClause("DATEDIFF(d,C.observation_period_start_date, C.observation_period_end_date)", criteria.periodLength)); + whereClauses.add(buildNumericRangeClause("DATEDIFF(C.observation_period_end_date, C.observation_period_start_date)", criteria.periodLength)); } // ageAtStart diff --git a/src/main/java/org/ohdsi/circe/cohortdefinition/builders/ObservationSqlBuilder.java b/src/main/java/org/ohdsi/circe/cohortdefinition/builders/ObservationSqlBuilder.java index 3437410b..33ede84b 100644 --- a/src/main/java/org/ohdsi/circe/cohortdefinition/builders/ObservationSqlBuilder.java +++ b/src/main/java/org/ohdsi/circe/cohortdefinition/builders/ObservationSqlBuilder.java @@ -56,13 +56,13 @@ protected List resolveJoinClauses(T criteria) { // join to PERSON if (criteria.age != null || (criteria.gender != null && criteria.gender.length > 0)) { - joinClauses.add("JOIN @cdm_database_schema.PERSON P on C.person_id = P.person_id"); + joinClauses.add("JOIN @cdm_database_schema.person P on C.person_id = P.person_id"); } if (criteria.visitType != null && criteria.visitType.length > 0) { - joinClauses.add("JOIN @cdm_database_schema.VISIT_OCCURRENCE V on C.visit_occurrence_id = V.visit_occurrence_id and C.person_id = V.person_id"); + joinClauses.add("JOIN @cdm_database_schema.visit_occurrence V on C.visit_occurrence_id = V.visit_occurrence_id and C.person_id = V.person_id"); } if (criteria.providerSpecialty != null && criteria.providerSpecialty.length > 0) { - joinClauses.add("LEFT JOIN @cdm_database_schema.PROVIDER PR on C.provider_id = PR.provider_id"); + joinClauses.add("LEFT JOIN @cdm_database_schema.provider PR on C.provider_id = PR.provider_id"); } return joinClauses; diff --git a/src/main/java/org/ohdsi/circe/cohortdefinition/builders/PayerPlanPeriodSqlBuilder.java b/src/main/java/org/ohdsi/circe/cohortdefinition/builders/PayerPlanPeriodSqlBuilder.java index 6ff06fed..5f04f858 100644 --- a/src/main/java/org/ohdsi/circe/cohortdefinition/builders/PayerPlanPeriodSqlBuilder.java +++ b/src/main/java/org/ohdsi/circe/cohortdefinition/builders/PayerPlanPeriodSqlBuilder.java @@ -41,7 +41,7 @@ protected List resolveJoinClauses(T criteria) { List joinClauses = new ArrayList<>(); if (criteria.ageAtStart != null || criteria.ageAtEnd != null || (criteria.gender != null && criteria.gender.length > 0)) { - joinClauses.add("JOIN @cdm_database_schema.PERSON P on C.person_id = P.person_id"); + joinClauses.add("JOIN @cdm_database_schema.person P on C.person_id = P.person_id"); } return joinClauses; @@ -66,12 +66,12 @@ protected List resolveWhereClauses(T criteria, Map addit if (userDefinedPeriod.startDate != null) { startDateExpression = BuilderUtils.dateStringToSql(userDefinedPeriod.startDate); - whereClauses.add(String.format("C.PAYER_PLAN_PERIOD_START_DATE <= %s and C.PAYER_PLAN_PERIOD_END_DATE >= %s", startDateExpression, startDateExpression)); + whereClauses.add(String.format("C.payer_plan_period_start_date <= %s and C.payer_plan_period_end_date >= %s", startDateExpression, startDateExpression)); } if (userDefinedPeriod.endDate != null) { endDateExpression = BuilderUtils.dateStringToSql(userDefinedPeriod.endDate); - whereClauses.add(String.format("C.PAYER_PLAN_PERIOD_START_DATE <= %s and C.PAYER_PLAN_PERIOD_END_DATE >= %s", endDateExpression, endDateExpression)); + whereClauses.add(String.format("C.payer_plan_period_start_date <= %s and C.payer_plan_period_end_date >= %s", endDateExpression, endDateExpression)); } } @@ -90,7 +90,7 @@ protected List resolveWhereClauses(T criteria, Map addit //periodLength if (criteria.periodLength != null) { - whereClauses.add(buildNumericRangeClause("DATEDIFF(d,C.payer_plan_period_start_date, C.payer_plan_period_end_date)", criteria.periodLength)); + whereClauses.add(buildNumericRangeClause("DATEDIFF(C.payer_plan_period_end_date, C.payer_plan_period_start_date)", criteria.periodLength)); } //ageAtStart diff --git a/src/main/java/org/ohdsi/circe/cohortdefinition/builders/ProcedureOccurrenceSqlBuilder.java b/src/main/java/org/ohdsi/circe/cohortdefinition/builders/ProcedureOccurrenceSqlBuilder.java index 89cf29a8..cea0b921 100644 --- a/src/main/java/org/ohdsi/circe/cohortdefinition/builders/ProcedureOccurrenceSqlBuilder.java +++ b/src/main/java/org/ohdsi/circe/cohortdefinition/builders/ProcedureOccurrenceSqlBuilder.java @@ -54,13 +54,13 @@ protected List resolveJoinClauses(T criteria) { // join to PERSON if (criteria.age != null || (criteria.gender != null && criteria.gender.length > 0)) { - joinClauses.add("JOIN @cdm_database_schema.PERSON P on C.person_id = P.person_id"); + joinClauses.add("JOIN @cdm_database_schema.person P on C.person_id = P.person_id"); } if (criteria.visitType != null && criteria.visitType.length > 0) { - joinClauses.add("JOIN @cdm_database_schema.VISIT_OCCURRENCE V on C.visit_occurrence_id = V.visit_occurrence_id and C.person_id = V.person_id"); + joinClauses.add("JOIN @cdm_database_schema.visit_occurrence V on C.visit_occurrence_id = V.visit_occurrence_id and C.person_id = V.person_id"); } if (criteria.providerSpecialty != null && criteria.providerSpecialty.length > 0) { - joinClauses.add("LEFT JOIN @cdm_database_schema.PROVIDER PR on C.provider_id = PR.provider_id"); + joinClauses.add("LEFT JOIN @cdm_database_schema.provider PR on C.provider_id = PR.provider_id"); } return joinClauses; diff --git a/src/main/java/org/ohdsi/circe/cohortdefinition/builders/SpecimenSqlBuilder.java b/src/main/java/org/ohdsi/circe/cohortdefinition/builders/SpecimenSqlBuilder.java index a158b2f1..e8212e64 100644 --- a/src/main/java/org/ohdsi/circe/cohortdefinition/builders/SpecimenSqlBuilder.java +++ b/src/main/java/org/ohdsi/circe/cohortdefinition/builders/SpecimenSqlBuilder.java @@ -52,7 +52,7 @@ protected List resolveJoinClauses(T criteria) { ArrayList joinClauses = new ArrayList<>(); // join to PERSON if (criteria.age != null || (criteria.gender != null && criteria.gender.length > 0)) { - joinClauses.add("JOIN @cdm_database_schema.PERSON P on C.person_id = P.person_id"); + joinClauses.add("JOIN @cdm_database_schema.person P on C.person_id = P.person_id"); } return joinClauses; } diff --git a/src/main/java/org/ohdsi/circe/cohortdefinition/builders/VisitOccurrenceSqlBuilder.java b/src/main/java/org/ohdsi/circe/cohortdefinition/builders/VisitOccurrenceSqlBuilder.java index a366c0d5..2c733316 100644 --- a/src/main/java/org/ohdsi/circe/cohortdefinition/builders/VisitOccurrenceSqlBuilder.java +++ b/src/main/java/org/ohdsi/circe/cohortdefinition/builders/VisitOccurrenceSqlBuilder.java @@ -46,11 +46,11 @@ protected List resolveJoinClauses(T criteria) { List joinClauses = new ArrayList<>(); if (criteria.age != null || (criteria.gender != null && criteria.gender.length > 0)) // join to PERSON - joinClauses.add("JOIN @cdm_database_schema.PERSON P on C.person_id = P.person_id"); + joinClauses.add("JOIN @cdm_database_schema.person P on C.person_id = P.person_id"); if ((criteria.placeOfService != null && criteria.placeOfService.length > 0) || criteria.placeOfServiceLocation != null) - joinClauses.add("JOIN @cdm_database_schema.CARE_SITE CS on C.care_site_id = CS.care_site_id"); + joinClauses.add("JOIN @cdm_database_schema.care_site CS on C.care_site_id = CS.care_site_id"); if (criteria.providerSpecialty != null && criteria.providerSpecialty.length > 0) - joinClauses.add("LEFT JOIN @cdm_database_schema.PROVIDER PR on C.provider_id = PR.provider_id"); + joinClauses.add("LEFT JOIN @cdm_database_schema.provider PR on C.provider_id = PR.provider_id"); if (criteria.placeOfServiceLocation != null) { addFilteringByCareSiteLocationRegion(joinClauses, criteria.placeOfServiceLocation); @@ -82,7 +82,7 @@ protected List resolveWhereClauses(T criteria, Map addit // visitLength if (criteria.visitLength != null) { - whereClauses.add(BuilderUtils.buildNumericRangeClause("DATEDIFF(d,C.visit_start_date, C.visit_end_date)", criteria.visitLength)); + whereClauses.add(BuilderUtils.buildNumericRangeClause("DATEDIFF(C.visit_end_date, C.visit_start_date)", criteria.visitLength)); } // age @@ -110,8 +110,8 @@ protected List resolveWhereClauses(T criteria, Map addit protected void addFilteringByCareSiteLocationRegion(List joinClauses, Integer codesetId) { - joinClauses.add(getLocationHistoryJoin("LH", "CARE_SITE", "C.care_site_id")); - joinClauses.add("JOIN @cdm_database_schema.LOCATION LOC on LOC.location_id = LH.location_id"); + joinClauses.add(getLocationHistoryJoin("LH", "care_site", "C.care_site_id")); + joinClauses.add("JOIN @cdm_database_schema.location LOC on LOC.location_id = LH.location_id"); joinClauses.add( BuilderUtils.getCodesetJoinExpression( codesetId, @@ -124,7 +124,7 @@ protected void addFilteringByCareSiteLocationRegion(List joinClauses, In protected String getLocationHistoryJoin(String alias, String domain, String entityIdField) { - return "JOIN @cdm_database_schema.LOCATION_HISTORY " + alias + " " + + return "JOIN @cdm_database_schema.location_history " + alias + " " + "on " + alias + ".entity_id = " + entityIdField + " " + "AND " + alias + ".domain_id = '" + domain + "' " + "AND C.visit_start_date >= " + alias + ".start_date " + diff --git a/src/main/resources/resources/cohortdefinition/sql_transforms/censoringInsert.sql b/src/main/resources/resources/cohortdefinition/sql_transforms/censoringInsert.sql index 18f2c120..224993ba 100644 --- a/src/main/resources/resources/cohortdefinition/sql_transforms/censoringInsert.sql +++ b/src/main/resources/resources/cohortdefinition/sql_transforms/censoringInsert.sql @@ -1,4 +1,4 @@ -select i.event_id, i.person_id, MIN(c.start_date) as end_date +select i.event_id, i.person_id, MIN(C.start_date) as end_date FROM included_events i JOIN ( diff --git a/src/main/resources/resources/cohortdefinition/sql_transforms/drugExposure.sql b/src/main/resources/resources/cohortdefinition/sql_transforms/drugExposure.sql index d0cb3bfc..a7c9b09e 100644 --- a/src/main/resources/resources/cohortdefinition/sql_transforms/drugExposure.sql +++ b/src/main/resources/resources/cohortdefinition/sql_transforms/drugExposure.sql @@ -1,6 +1,6 @@ -- Begin Drug Exposure Criteria select C.person_id, C.drug_exposure_id as event_id, C.drug_exposure_start_date as start_date, - COALESCE(C.drug_exposure_end_date, date_add(C.drug_exposure_start_date, C.DAYS_SUPPLY), date_add(C.drug_exposure_start_date, 1)) as end_date, + COALESCE(C.drug_exposure_end_date, date_add(C.drug_exposure_start_date, C.days_supply), date_add(C.drug_exposure_start_date, 1)) as end_date, C.drug_concept_id as TARGET_CONCEPT_ID, C.visit_occurrence_id, C.drug_exposure_start_date as sort_date from From ec12b407bfa9eadd5ef12f662d129166db64925e Mon Sep 17 00:00:00 2001 From: Benjamin Amor Date: Fri, 11 Sep 2020 09:34:24 -0400 Subject: [PATCH 14/14] additional builder fixes --- .../builders/ConditionOccurrenceSqlBuilder.java | 6 +++--- .../circe/cohortdefinition/builders/DeathSqlBuilder.java | 2 +- .../circe/cohortdefinition/builders/DoseEraSqlBuilder.java | 4 ++-- .../cohortdefinition/builders/MeasurementSqlBuilder.java | 6 +++--- 4 files changed, 9 insertions(+), 9 deletions(-) diff --git a/src/main/java/org/ohdsi/circe/cohortdefinition/builders/ConditionOccurrenceSqlBuilder.java b/src/main/java/org/ohdsi/circe/cohortdefinition/builders/ConditionOccurrenceSqlBuilder.java index 2885a278..b521de5c 100644 --- a/src/main/java/org/ohdsi/circe/cohortdefinition/builders/ConditionOccurrenceSqlBuilder.java +++ b/src/main/java/org/ohdsi/circe/cohortdefinition/builders/ConditionOccurrenceSqlBuilder.java @@ -56,13 +56,13 @@ protected List resolveJoinClauses(T criteria) { // join to PERSON if (criteria.age != null || (criteria.gender != null && criteria.gender.length > 0)) { - joinClauses.add("JOIN @cdm_database_schema.PERSON P on C.person_id = P.person_id"); + joinClauses.add("JOIN @cdm_database_schema.person P on C.person_id = P.person_id"); } if (criteria.visitType != null && criteria.visitType.length > 0) { - joinClauses.add("JOIN @cdm_database_schema.VISIT_OCCURRENCE V on C.visit_occurrence_id = V.visit_occurrence_id and C.person_id = V.person_id"); + joinClauses.add("JOIN @cdm_database_schema.visit_occurrence V on C.visit_occurrence_id = V.visit_occurrence_id and C.person_id = V.person_id"); } if (criteria.providerSpecialty != null && criteria.providerSpecialty.length > 0) { - joinClauses.add("LEFT JOIN @cdm_database_schema.PROVIDER PR on C.provider_id = PR.provider_id"); + joinClauses.add("LEFT JOIN @cdm_database_schema.provider PR on C.provider_id = PR.provider_id"); } return joinClauses; diff --git a/src/main/java/org/ohdsi/circe/cohortdefinition/builders/DeathSqlBuilder.java b/src/main/java/org/ohdsi/circe/cohortdefinition/builders/DeathSqlBuilder.java index 7088a63c..b0704012 100644 --- a/src/main/java/org/ohdsi/circe/cohortdefinition/builders/DeathSqlBuilder.java +++ b/src/main/java/org/ohdsi/circe/cohortdefinition/builders/DeathSqlBuilder.java @@ -47,7 +47,7 @@ protected List resolveJoinClauses(T criteria) { // join to PERSON if (criteria.age != null || (criteria.gender != null && criteria.gender.length > 0)) { - joinClauses.add("JOIN @cdm_database_schema.PERSON P on C.person_id = P.person_id"); + joinClauses.add("JOIN @cdm_database_schema.person P on C.person_id = P.person_id"); } return joinClauses; diff --git a/src/main/java/org/ohdsi/circe/cohortdefinition/builders/DoseEraSqlBuilder.java b/src/main/java/org/ohdsi/circe/cohortdefinition/builders/DoseEraSqlBuilder.java index 7a00f9a0..918b0f02 100644 --- a/src/main/java/org/ohdsi/circe/cohortdefinition/builders/DoseEraSqlBuilder.java +++ b/src/main/java/org/ohdsi/circe/cohortdefinition/builders/DoseEraSqlBuilder.java @@ -53,7 +53,7 @@ protected List resolveJoinClauses(T criteria) { // join to PERSON if (criteria.ageAtStart != null || criteria.ageAtEnd != null || (criteria.gender != null && criteria.gender.length > 0)) { - joinClauses.add("JOIN @cdm_database_schema.PERSON P on C.person_id = P.person_id"); + joinClauses.add("JOIN @cdm_database_schema.person P on C.person_id = P.person_id"); } return joinClauses; @@ -86,7 +86,7 @@ protected List resolveWhereClauses(T criteria, Map addit // eraLength if (criteria.eraLength != null) { - whereClauses.add(buildNumericRangeClause("DATEDIFF(d,C.dose_era_start_date, C.dose_era_end_date)", criteria.eraLength)); + whereClauses.add(buildNumericRangeClause("DATEDIFF(C.dose_era_end_date, C.dose_era_start_date)", criteria.eraLength)); } // ageAtStart diff --git a/src/main/java/org/ohdsi/circe/cohortdefinition/builders/MeasurementSqlBuilder.java b/src/main/java/org/ohdsi/circe/cohortdefinition/builders/MeasurementSqlBuilder.java index de3f87f9..3ad9d042 100644 --- a/src/main/java/org/ohdsi/circe/cohortdefinition/builders/MeasurementSqlBuilder.java +++ b/src/main/java/org/ohdsi/circe/cohortdefinition/builders/MeasurementSqlBuilder.java @@ -55,13 +55,13 @@ protected List resolveJoinClauses(T criteria) { // join to PERSON if (criteria.age != null || (criteria.gender != null && criteria.gender.length > 0)) { - joinClauses.add("JOIN @cdm_database_schema.PERSON P on C.person_id = P.person_id"); + joinClauses.add("JOIN @cdm_database_schema.person P on C.person_id = P.person_id"); } if (criteria.visitType != null && criteria.visitType.length > 0) { - joinClauses.add("JOIN @cdm_database_schema.VISIT_OCCURRENCE V on C.visit_occurrence_id = V.visit_occurrence_id and C.person_id = V.person_id"); + joinClauses.add("JOIN @cdm_database_schema.visit_occurrence V on C.visit_occurrence_id = V.visit_occurrence_id and C.person_id = V.person_id"); } if (criteria.providerSpecialty != null && criteria.providerSpecialty.length > 0) { - joinClauses.add("LEFT JOIN @cdm_database_schema.PROVIDER PR on C.provider_id = PR.provider_id"); + joinClauses.add("LEFT JOIN @cdm_database_schema.provider PR on C.provider_id = PR.provider_id"); } return joinClauses;