From 300a21fcb4d23aabaece19deadc61deca01d06f2 Mon Sep 17 00:00:00 2001 From: "justin.mckelvy" Date: Fri, 16 Jun 2023 09:15:54 -0600 Subject: [PATCH] add cqlconfigbeans --- .../uhn/fhir/jpa/starter/AppProperties.java | 4 +- .../common/FhirServerConfigCommon.java | 3 ++ .../jpa/starter/cr/StarterCrDstu3Config.java | 37 +++++++++++++---- .../jpa/starter/cr/StarterCrR4Config.java | 40 +++++++++++++++---- 4 files changed, 66 insertions(+), 18 deletions(-) diff --git a/src/main/java/ca/uhn/fhir/jpa/starter/AppProperties.java b/src/main/java/ca/uhn/fhir/jpa/starter/AppProperties.java index 1d2804a..87958fb 100644 --- a/src/main/java/ca/uhn/fhir/jpa/starter/AppProperties.java +++ b/src/main/java/ca/uhn/fhir/jpa/starter/AppProperties.java @@ -427,7 +427,7 @@ public class AppProperties { getCqlCompilerSignatureLevel(), getCqlCompilerCompatibilityLevel() ); - public CqlTranslatorOptions getCqlTranslator() { + public CqlTranslatorOptions getCqlTranslatorOptions() { return this.cqlTranslatorOptions; } @@ -446,7 +446,7 @@ public class AppProperties { CqlOptions cqlOptions = new CqlOptions(); cqlOptions.setUseEmbeddedLibraries(this.cql_use_embedded_libraries); cqlOptions.setCqlEngineOptions(this.getCqlEngineOptions()); - cqlOptions.setCqlTranslatorOptions(this.getCqlTranslator()); + cqlOptions.setCqlTranslatorOptions(this.getCqlTranslatorOptions()); return cqlOptions; } diff --git a/src/main/java/ca/uhn/fhir/jpa/starter/common/FhirServerConfigCommon.java b/src/main/java/ca/uhn/fhir/jpa/starter/common/FhirServerConfigCommon.java index 6352ba8..b9473f9 100644 --- a/src/main/java/ca/uhn/fhir/jpa/starter/common/FhirServerConfigCommon.java +++ b/src/main/java/ca/uhn/fhir/jpa/starter/common/FhirServerConfigCommon.java @@ -17,6 +17,7 @@ import ca.uhn.fhir.rest.server.mail.MailSvc; import ca.uhn.fhir.rest.server.provider.ResourceProviderFactory; import com.google.common.base.Strings; +import org.cqframework.cql.cql2elm.CqlTranslatorOptions; import org.hl7.fhir.r4.model.Bundle.BundleType; import org.springframework.beans.factory.FactoryBean; import org.springframework.boot.env.YamlPropertySourceLoader; @@ -255,4 +256,6 @@ public class FhirServerConfigCommon { return null; } + + } diff --git a/src/main/java/ca/uhn/fhir/jpa/starter/cr/StarterCrDstu3Config.java b/src/main/java/ca/uhn/fhir/jpa/starter/cr/StarterCrDstu3Config.java index 1a15f07..d9e5cbd 100644 --- a/src/main/java/ca/uhn/fhir/jpa/starter/cr/StarterCrDstu3Config.java +++ b/src/main/java/ca/uhn/fhir/jpa/starter/cr/StarterCrDstu3Config.java @@ -1,7 +1,7 @@ package ca.uhn.fhir.jpa.starter.cr; import ca.uhn.fhir.context.FhirContext; -import ca.uhn.fhir.cr.common.IRepositoryFactory; +import ca.uhn.fhir.context.FhirVersionEnum; import ca.uhn.fhir.cr.config.CrDstu3Config; import ca.uhn.fhir.cr.dstu3.IActivityDefinitionProcessorFactory; import ca.uhn.fhir.cr.dstu3.IPlanDefinitionProcessorFactory; @@ -11,26 +11,26 @@ import ca.uhn.fhir.cr.dstu3.activitydefinition.ActivityDefinitionOperationsProvi import ca.uhn.fhir.cr.dstu3.plandefinition.PlanDefinitionOperationsProvider; import ca.uhn.fhir.cr.dstu3.questionnaire.QuestionnaireOperationsProvider; import ca.uhn.fhir.cr.dstu3.questionnaireresponse.QuestionnaireResponseOperationsProvider; -import ca.uhn.fhir.cr.repo.HapiFhirRepository; -import ca.uhn.fhir.jpa.api.dao.DaoRegistry; +import ca.uhn.fhir.jpa.starter.AppProperties; import ca.uhn.fhir.jpa.starter.annotations.OnDSTU3Condition; import ca.uhn.fhir.rest.server.RestfulServer; import ca.uhn.fhir.rest.server.provider.ResourceProviderFactory; +import org.cqframework.cql.cql2elm.CqlTranslatorOptions; +import org.opencds.cqf.cql.evaluator.CqlOptions; import org.opencds.cqf.cql.evaluator.activitydefinition.dstu3.ActivityDefinitionProcessor; import org.opencds.cqf.cql.evaluator.library.EvaluationSettings; import org.opencds.cqf.cql.evaluator.plandefinition.dstu3.PlanDefinitionProcessor; import org.opencds.cqf.cql.evaluator.questionnaire.dstu3.QuestionnaireProcessor; import org.opencds.cqf.cql.evaluator.questionnaireresponse.dstu3.QuestionnaireResponseProcessor; -import org.springframework.context.annotation.Bean; -import org.springframework.context.annotation.Conditional; -import org.springframework.context.annotation.Configuration; -import org.springframework.context.annotation.Import; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.context.annotation.*; @Configuration @Conditional({ OnDSTU3Condition.class, CrConfigCondition.class }) @Import({ CrDstu3Config.class }) public class StarterCrDstu3Config { - + private static final Logger ourLogger = LoggerFactory.getLogger(StarterCrDstu3Config.class); @Bean public PostInitProviderRegisterer postInitProviderRegisterer(RestfulServer theRestfulServer, ResourceProviderFactory theResourceProviderFactory) { @@ -93,4 +93,25 @@ public class StarterCrDstu3Config { EvaluationSettings theEvaluationSettings) { return r -> new PlanDefinitionProcessor(r, theEvaluationSettings); } + @Primary + @Bean + public CqlOptions cqlOptions(AppProperties theAppProperties) { + return theAppProperties.getCqlOptions(); + } + + @Primary + @Bean + public CqlTranslatorOptions cqlTranslatorOptions(FhirContext theFhirContext, AppProperties theAppProperties) { + CqlTranslatorOptions options = theAppProperties.getCqlTranslatorOptions(); + + if (theFhirContext.getVersion().getVersion().isOlderThan(FhirVersionEnum.R4) + && (options.getCompatibilityLevel().equals("1.5") || options.getCompatibilityLevel().equals("1.4"))) { + ourLogger.warn("{} {} {}", + "This server is configured to use CQL version > 1.4 and FHIR version <= DSTU3.", + "Most available CQL content for DSTU3 and below is for CQL versions 1.3.", + "If your CQL content causes translation errors, try setting the CQL compatibility level to 1.3"); + } + + return options; + } } diff --git a/src/main/java/ca/uhn/fhir/jpa/starter/cr/StarterCrR4Config.java b/src/main/java/ca/uhn/fhir/jpa/starter/cr/StarterCrR4Config.java index 8bcb42f..20c4079 100644 --- a/src/main/java/ca/uhn/fhir/jpa/starter/cr/StarterCrR4Config.java +++ b/src/main/java/ca/uhn/fhir/jpa/starter/cr/StarterCrR4Config.java @@ -2,7 +2,8 @@ package ca.uhn.fhir.jpa.starter.cr; import ca.uhn.fhir.IHapiBootOrder; import ca.uhn.fhir.context.FhirContext; -import ca.uhn.fhir.cr.common.IRepositoryFactory; +import ca.uhn.fhir.context.FhirVersionEnum; + import ca.uhn.fhir.cr.config.CrR4Config; import ca.uhn.fhir.cr.r4.IActivityDefinitionProcessorFactory; import ca.uhn.fhir.cr.r4.IPlanDefinitionProcessorFactory; @@ -12,26 +13,26 @@ import ca.uhn.fhir.cr.r4.activitydefinition.ActivityDefinitionOperationsProvider import ca.uhn.fhir.cr.r4.plandefinition.PlanDefinitionOperationsProvider; import ca.uhn.fhir.cr.r4.questionnaire.QuestionnaireOperationsProvider; import ca.uhn.fhir.cr.r4.questionnaireresponse.QuestionnaireResponseOperationsProvider; -import ca.uhn.fhir.cr.repo.HapiFhirRepository; -import ca.uhn.fhir.jpa.api.dao.DaoRegistry; +import ca.uhn.fhir.jpa.starter.AppProperties; import ca.uhn.fhir.jpa.starter.annotations.OnR4Condition; import ca.uhn.fhir.rest.server.RestfulServer; import ca.uhn.fhir.rest.server.provider.ResourceProviderFactory; +import org.cqframework.cql.cql2elm.CqlTranslatorOptions; +import org.opencds.cqf.cql.evaluator.CqlOptions; import org.opencds.cqf.cql.evaluator.activitydefinition.r4.ActivityDefinitionProcessor; import org.opencds.cqf.cql.evaluator.library.EvaluationSettings; import org.opencds.cqf.cql.evaluator.plandefinition.r4.PlanDefinitionProcessor; import org.opencds.cqf.cql.evaluator.questionnaire.r4.QuestionnaireProcessor; import org.opencds.cqf.cql.evaluator.questionnaireresponse.r4.QuestionnaireResponseProcessor; -import org.springframework.context.annotation.Bean; -import org.springframework.context.annotation.Conditional; -import org.springframework.context.annotation.Configuration; -import org.springframework.context.annotation.Import; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.context.annotation.*; @Configuration @Conditional({ OnR4Condition.class, CrConfigCondition.class }) @Import({ CrR4Config.class }) public class StarterCrR4Config { - + private static final Logger ourLogger = LoggerFactory.getLogger(StarterCrR4Config.class); @Bean public PostInitProviderRegisterer postInitProviderRegisterer(RestfulServer theRestfulServer, ResourceProviderFactory theResourceProviderFactory) { @@ -94,4 +95,27 @@ public class StarterCrR4Config { EvaluationSettings theEvaluationSettings) { return r -> new PlanDefinitionProcessor(r, theEvaluationSettings); } + + @Primary + @Bean + public CqlOptions cqlOptions(AppProperties theAppProperties) { + return theAppProperties.getCqlOptions(); + } + + @Primary + @Bean + public CqlTranslatorOptions cqlTranslatorOptions(FhirContext theFhirContext, AppProperties theAppProperties) { + CqlTranslatorOptions options = theAppProperties.getCqlTranslatorOptions(); + + if (theFhirContext.getVersion().getVersion().isOlderThan(FhirVersionEnum.R4) + && (options.getCompatibilityLevel().equals("1.5") || options.getCompatibilityLevel().equals("1.4"))) { + ourLogger.warn("{} {} {}", + "This server is configured to use CQL version > 1.4 and FHIR version <= DSTU3.", + "Most available CQL content for DSTU3 and below is for CQL versions 1.3.", + "If your CQL content causes translation errors, try setting the CQL compatibility level to 1.3"); + } + + return options; + } + }