diff --git a/Src/java/.vscode/settings.json b/Src/java/.vscode/settings.json index d4eff2345..6b969a7e5 100644 --- a/Src/java/.vscode/settings.json +++ b/Src/java/.vscode/settings.json @@ -1,5 +1,15 @@ { "java.configuration.updateBuildConfiguration": "automatic", "java.compile.nullAnalysis.mode": "automatic", - "java.jdt.ls.vmargs": "-noverify -Xmx4G -XX:+UseG1GC -XX:+UseStringDeduplication" + "java.jdt.ls.vmargs": "-noverify -Xmx4G -XX:+UseG1GC -XX:+UseStringDeduplication", + "cSpell.words": [ + "bools", + "datumedge", + "fhirpath", + "hamcrest", + "Inferencing", + "qicore", + "testng", + "trackback" + ] } \ No newline at end of file diff --git a/Src/java/cql-to-elm-cli/build.gradle b/Src/java/cql-to-elm-cli/build.gradle index 89caa5777..0f48e907c 100644 --- a/Src/java/cql-to-elm-cli/build.gradle +++ b/Src/java/cql-to-elm-cli/build.gradle @@ -4,7 +4,7 @@ plugins { } application { - mainClass = 'org.cqframework.cql.cql2elm.cli.CqlTranslator' + mainClass = 'org.cqframework.cql.cql2elm.cli.Main' } dependencies { diff --git a/Src/java/cql-to-elm-cli/src/main/java/org/cqframework/cql/cql2elm/cli/CqlTranslator.java b/Src/java/cql-to-elm-cli/src/main/java/org/cqframework/cql/cql2elm/cli/Main.java similarity index 91% rename from Src/java/cql-to-elm-cli/src/main/java/org/cqframework/cql/cql2elm/cli/CqlTranslator.java rename to Src/java/cql-to-elm-cli/src/main/java/org/cqframework/cql/cql2elm/cli/Main.java index 8e98aea55..771a9e3f3 100644 --- a/Src/java/cql-to-elm-cli/src/main/java/org/cqframework/cql/cql2elm/cli/CqlTranslator.java +++ b/Src/java/cql-to-elm-cli/src/main/java/org/cqframework/cql/cql2elm/cli/Main.java @@ -6,9 +6,6 @@ import org.cqframework.cql.cql2elm.*; import org.cqframework.cql.cql2elm.quick.FhirLibrarySourceProvider; import org.cqframework.cql.elm.tracking.TrackBack; -import org.fhir.ucum.UcumEssenceService; -import org.fhir.ucum.UcumException; -import org.fhir.ucum.UcumService; import org.hl7.cql.model.ModelIdentifier; import org.hl7.cql.model.ModelInfoProvider; import org.hl7.elm_modelinfo.r1.ModelInfo; @@ -28,11 +25,10 @@ import static java.nio.file.FileVisitResult.CONTINUE; import static org.cqframework.cql.cql2elm.CqlTranslator.fromFile; -public class CqlTranslator { +public class Main { public static ModelInfoProvider getModelInfoProvider(File modelInfoXML) { try { final ModelInfo modelInfo = ModelInfoReaderFactory.getReader("application/xml").read(modelInfoXML); - final ModelIdentifier modelId = new ModelIdentifier().withId(modelInfo.getName()).withVersion(modelInfo.getVersion()); return (ModelIdentifier modelIdentifier) -> modelInfo; } catch (IOException e) { System.err.printf("Could not load model-info XML: %s%n", modelInfoXML); @@ -51,13 +47,13 @@ private static void outputExceptions(Iterable exceptions) } } - private static void writeELM(Path inPath, Path outPath, org.cqframework.cql.cql2elm.CqlTranslator.Format format, ModelInfoProvider modelProvider, CqlTranslatorOptions options) throws IOException { + private static void writeELM(Path inPath, Path outPath, org.cqframework.cql.cql2elm.CqlTranslator.Format format, ModelInfoProvider modelProvider, CqlCompilerOptions options) throws IOException { System.err.println("================================================================================"); System.err.printf("TRANSLATE %s%n", inPath); ModelManager modelManager; - if(options.getOptions().contains(CqlTranslatorOptions.Options.DisableDefaultModelInfoLoad)) { + if(options.getOptions().contains(CqlCompilerOptions.Options.DisableDefaultModelInfoLoad)) { modelManager = new ModelManager(false); } else { modelManager = new ModelManager(); @@ -67,27 +63,18 @@ private static void writeELM(Path inPath, Path outPath, org.cqframework.cql.cql2 modelManager.getModelInfoLoader().registerModelInfoProvider(modelProvider); } - LibraryManager libraryManager = new LibraryManager(modelManager); - UcumService ucumService = null; - if (options.getValidateUnits()) { - try { - ucumService = new UcumEssenceService(UcumEssenceService.class.getResourceAsStream("/ucum-essence.xml")); - } catch (UcumException e) { - System.err.println("Could not create UCUM validation service:"); - e.printStackTrace(); - } - } + LibraryManager libraryManager = new LibraryManager(modelManager, options); modelManager.getModelInfoLoader().registerModelInfoProvider(new DefaultModelInfoProvider(inPath.getParent()), true); libraryManager.getLibrarySourceLoader().registerProvider(new DefaultLibrarySourceProvider(inPath.getParent())); libraryManager.getLibrarySourceLoader().registerProvider(new FhirLibrarySourceProvider()); - org.cqframework.cql.cql2elm.CqlTranslator translator = fromFile(inPath.toFile(), modelManager, libraryManager, ucumService, options); + org.cqframework.cql.cql2elm.CqlTranslator translator = fromFile(inPath.toFile(), libraryManager); libraryManager.getLibrarySourceLoader().clearProviders(); - if (translator.getErrors().size() > 0) { + if (!translator.getErrors().isEmpty()) { System.err.println("Translation failed due to errors:"); outputExceptions(translator.getExceptions()); } else if (!options.getVerifyOnly()) { - if (translator.getExceptions().size() == 0) { + if (translator.getExceptions().isEmpty()) { System.err.println("Translation completed successfully."); } else { @@ -214,7 +201,7 @@ public FileVisitResult visitFile(Path file, BasicFileAttributes attrs) throws IO modelProvider = getModelInfoProvider(modelFile); } - writeELM(in, out, outputFormat, modelProvider, new CqlTranslatorOptions(outputFormat, options.has(optimization), + writeELM(in, out, outputFormat, modelProvider, new CqlCompilerOptions(options.has(optimization), options.has(debug) || options.has(annotations), options.has(debug) || options.has(locators), options.has(debug) || options.has(resultTypes), diff --git a/Src/java/cql-to-elm/src/main/java/org/cqframework/cql/cql2elm/CompilerOptions.java b/Src/java/cql-to-elm/src/main/java/org/cqframework/cql/cql2elm/CompilerOptions.java new file mode 100644 index 000000000..2890acb78 --- /dev/null +++ b/Src/java/cql-to-elm/src/main/java/org/cqframework/cql/cql2elm/CompilerOptions.java @@ -0,0 +1,109 @@ +package org.cqframework.cql.cql2elm; + +import org.hl7.cql_annotations.r1.CqlToElmBase; +import org.hl7.cql_annotations.r1.CqlToElmInfo; +import org.hl7.elm.r1.Library; + +import java.util.EnumSet; +import java.util.List; +import java.util.Set; + +import static java.util.Objects.requireNonNull; + +/** + * This class provides functions for extracting and parsing CQL Compiler + * Options from + * a Library + */ +public class CompilerOptions { + + private CompilerOptions() { + // intentionally empty + } + + /** + * Gets the compiler options used to generate an elm Library. + * + * Returns null if the compiler options could not be determined. + * (for example, the Library was translated without annotations) + * + * @param library The library to extracts the options from. + * @return The set of options used to translate the library. + */ + public static Set getCompilerOptions(Library library) { + requireNonNull(library, "library can not be null"); + if (library.getAnnotation() == null || library.getAnnotation().isEmpty()) { + return null; + } + + String compilerOptions = getCompilerOptions(library.getAnnotation()); + return parseCompilerOptions(compilerOptions); + } + + private static String getCompilerOptions(List annotations) { + for (CqlToElmBase base : annotations) { + if (base instanceof CqlToElmInfo) { + if (((CqlToElmInfo) base).getTranslatorOptions() != null) { + return ((CqlToElmInfo) base).getTranslatorOptions(); + } + } + } + + return null; + } + + /** + * Parses a string representing CQL compiler Options into an EnumSet. The + * string is expected + * to be a comma delimited list of values from the CqlCompiler.Options + * enumeration. + * For example "EnableListPromotion, EnableListDemotion". + * + * @param compilerOptions the string to parse + * @return the set of options + */ + public static Set parseCompilerOptions(String compilerOptions) { + if (compilerOptions == null || compilerOptions.isEmpty()) { + return null; + } + + EnumSet optionSet = EnumSet.noneOf(CqlCompilerOptions.Options.class); + String[] options = compilerOptions.trim().split(","); + + for (String option : options) { + optionSet.add(CqlCompilerOptions.Options.valueOf(option)); + } + + return optionSet; + } + + /** + * Gets the compiler version used to generate an elm Library. + * + * Returns null if the compiled version could not be determined. (for example, + * the Library was + * compiled without annotations) + * + * @param library The library to extracts the compiler version from. + * @return The version of compiler used to compiler the library. + */ + public static String getCompilerVersion(Library library) { + requireNonNull(library, "library can not be null"); + if (library.getAnnotation() == null || library.getAnnotation().isEmpty()) { + return null; + } + + return getCompilerVersion(library.getAnnotation()); + } + + private static String getCompilerVersion(List annotations) { + for (CqlToElmBase o : annotations) { + if (o instanceof CqlToElmInfo) { + CqlToElmInfo c = (CqlToElmInfo) o; + return c.getTranslatorVersion(); + } + } + + return null; + } +} diff --git a/Src/java/cql-to-elm/src/main/java/org/cqframework/cql/cql2elm/Cql2ElmVisitor.java b/Src/java/cql-to-elm/src/main/java/org/cqframework/cql/cql2elm/Cql2ElmVisitor.java index 2fa93641a..a5200fb1b 100755 --- a/Src/java/cql-to-elm/src/main/java/org/cqframework/cql/cql2elm/Cql2ElmVisitor.java +++ b/Src/java/cql-to-elm/src/main/java/org/cqframework/cql/cql2elm/Cql2ElmVisitor.java @@ -149,26 +149,26 @@ public void disableFromKeywordRequired() { fromKeywordRequired = false; } - public void setTranslatorOptions(CqlTranslatorOptions options) { - if (options.getOptions().contains(CqlTranslatorOptions.Options.EnableDateRangeOptimization)) { + public void setTranslatorOptions(CqlCompilerOptions options) { + if (options.getOptions().contains(CqlCompilerOptions.Options.EnableDateRangeOptimization)) { this.enableDateRangeOptimization(); } - if (options.getOptions().contains(CqlTranslatorOptions.Options.EnableAnnotations)) { + if (options.getOptions().contains(CqlCompilerOptions.Options.EnableAnnotations)) { this.enableAnnotations(); } - if (options.getOptions().contains(CqlTranslatorOptions.Options.EnableLocators)) { + if (options.getOptions().contains(CqlCompilerOptions.Options.EnableLocators)) { this.enableLocators(); } - if (options.getOptions().contains(CqlTranslatorOptions.Options.EnableResultTypes)) { + if (options.getOptions().contains(CqlCompilerOptions.Options.EnableResultTypes)) { this.enableResultTypes(); } - if (options.getOptions().contains(CqlTranslatorOptions.Options.EnableDetailedErrors)) { + if (options.getOptions().contains(CqlCompilerOptions.Options.EnableDetailedErrors)) { this.enableDetailedErrors(); } - if (options.getOptions().contains(CqlTranslatorOptions.Options.DisableMethodInvocation)) { + if (options.getOptions().contains(CqlCompilerOptions.Options.DisableMethodInvocation)) { this.disableMethodInvocation(); } - if (options.getOptions().contains(CqlTranslatorOptions.Options.RequireFromKeyword)) { + if (options.getOptions().contains(CqlCompilerOptions.Options.RequireFromKeyword)) { this.enableFromKeywordRequired(); } libraryBuilder.setCompatibilityLevel(options.getCompatibilityLevel()); @@ -647,7 +647,7 @@ public Object visit(ParseTree tree) { // ERROR: try { o = super.visit(tree); - } catch (CqlTranslatorIncludeException e) { + } catch (CqlIncludeException e) { CqlCompilerException translatorException = new CqlCompilerException(e.getMessage(), getTrackBack(tree), e); if (translatorException.getLocator() == null) { throw translatorException; @@ -746,7 +746,7 @@ public VersionedIdentifier visitLibraryDefinition(cqlParser.LibraryDefinitionCon VersionedIdentifier vid = of.createVersionedIdentifier() .withId(identifiers.remove(identifiers.size() - 1)) .withVersion(parseString(ctx.versionSpecifier())); - if (identifiers.size() > 0) { + if (!identifiers.isEmpty()) { vid.setSystem(libraryBuilder.resolveNamespaceUri(String.join(".", identifiers), true)); } else if (libraryBuilder.getNamespaceInfo() != null) { @@ -762,7 +762,7 @@ else if (libraryBuilder.getNamespaceInfo() != null) { public UsingDef visitUsingDefinition(cqlParser.UsingDefinitionContext ctx) { List identifiers = (List)visit(ctx.qualifiedIdentifier()); String unqualifiedIdentifier = identifiers.remove(identifiers.size() - 1); - String namespaceName = identifiers.size() > 0 ? String.join(".", identifiers) : + String namespaceName = !identifiers.isEmpty() ? String.join(".", identifiers) : libraryBuilder.isWellKnownModelName(unqualifiedIdentifier) ? null : (libraryBuilder.getNamespaceInfo() != null ? libraryBuilder.getNamespaceInfo().getName() : null); @@ -824,7 +824,7 @@ private String getLibraryPath(String namespaceName, String unqualifiedIdentifier public Object visitIncludeDefinition(cqlParser.IncludeDefinitionContext ctx) { List identifiers = (List)visit(ctx.qualifiedIdentifier()); String unqualifiedIdentifier = identifiers.remove(identifiers.size() - 1); - String namespaceName = identifiers.size() > 0 ? String.join(".", identifiers) : + String namespaceName = !identifiers.isEmpty() ? String.join(".", identifiers) : (libraryBuilder.getNamespaceInfo() != null ? libraryBuilder.getNamespaceInfo().getName() : null); String path = getLibraryPath(namespaceName, unqualifiedIdentifier); IncludeDef library = of.createIncludeDef() diff --git a/Src/java/cql-to-elm/src/main/java/org/cqframework/cql/cql2elm/CqlCompiler.java b/Src/java/cql-to-elm/src/main/java/org/cqframework/cql/cql2elm/CqlCompiler.java index 9c061a451..bcc544296 100644 --- a/Src/java/cql-to-elm/src/main/java/org/cqframework/cql/cql2elm/CqlCompiler.java +++ b/Src/java/cql-to-elm/src/main/java/org/cqframework/cql/cql2elm/CqlCompiler.java @@ -7,13 +7,14 @@ import org.cqframework.cql.elm.tracking.TrackBack; import org.cqframework.cql.gen.cqlLexer; import org.cqframework.cql.gen.cqlParser; -import org.fhir.ucum.UcumService; import org.hl7.cql.model.NamespaceAware; import org.hl7.cql.model.NamespaceInfo; import org.hl7.elm.r1.Library; import org.hl7.elm.r1.Retrieve; import org.hl7.elm.r1.VersionedIdentifier; +import java.io.File; +import java.io.FileInputStream; import java.io.IOException; import java.io.InputStream; import java.util.ArrayList; @@ -30,49 +31,37 @@ public class CqlCompiler { private List errors = null; private List warnings = null; private List messages = null; - private VersionedIdentifier sourceInfo = null; - private NamespaceInfo namespaceInfo = null; - private ModelManager modelManager = null; - private LibraryManager libraryManager = null; - private UcumService ucumService = null; - - public CqlCompiler(ModelManager modelManager, LibraryManager libraryManager) { - this(null, null, modelManager, libraryManager, null); - } + private final VersionedIdentifier sourceInfo; + private final NamespaceInfo namespaceInfo; + private final LibraryManager libraryManager; - public CqlCompiler(NamespaceInfo namespaceInfo, ModelManager modelManager, LibraryManager libraryManager) { - this(namespaceInfo, null, modelManager, libraryManager, null); + public CqlCompiler(LibraryManager libraryManager) { + this(null, null, libraryManager); } - public CqlCompiler(NamespaceInfo namespaceInfo, ModelManager modelManager, - LibraryManager libraryManager, UcumService ucumService) { - this(namespaceInfo, null, modelManager, libraryManager, ucumService); + public CqlCompiler(NamespaceInfo namespaceInfo, LibraryManager libraryManager) { + this(namespaceInfo, null, libraryManager); } - public CqlCompiler(NamespaceInfo namespaceInfo, VersionedIdentifier sourceInfo, ModelManager modelManager, - LibraryManager libraryManager, UcumService ucumService) { - this.sourceInfo = sourceInfo; + public CqlCompiler(NamespaceInfo namespaceInfo, VersionedIdentifier sourceInfo, + LibraryManager libraryManager) { this.namespaceInfo = namespaceInfo; - this.modelManager = modelManager; this.libraryManager = libraryManager; - this.ucumService = ucumService; - if (this.sourceInfo == null) { + if (sourceInfo == null) { this.sourceInfo = new VersionedIdentifier().withId("Anonymous").withSystem("text/cql"); } + else { + this.sourceInfo = sourceInfo; + } if (this.namespaceInfo != null) { - modelManager.getNamespaceManager().ensureNamespaceRegistered(this.namespaceInfo); libraryManager.getNamespaceManager().ensureNamespaceRegistered(this.namespaceInfo); } if (libraryManager.getNamespaceManager().hasNamespaces() && libraryManager.getLibrarySourceLoader() instanceof NamespaceAware) { ((NamespaceAware)libraryManager.getLibrarySourceLoader()).setNamespaceManager(libraryManager.getNamespaceManager()); } - - if (libraryManager.getUcumService() == null) { - libraryManager.setUcumService(this.ucumService); - } } public Library getLibrary() { @@ -87,14 +76,14 @@ public Object toObject() { public List toRetrieves() { return retrieves; } - public Map getCompiledLibraries() { + public Map getCompiledLibraries() { return libraryManager.getCompiledLibraries(); } - public Map getLibraries() { - Map result = new HashMap(); - for (String libraryName : libraryManager.getCompiledLibraries().keySet()) { - result.put(libraryName, libraryManager.getCompiledLibraries().get(libraryName).getLibrary()); + public Map getLibraries() { + var result = new HashMap(); + for (var id : libraryManager.getCompiledLibraries().keySet()) { + result.put(id, libraryManager.getCompiledLibraries().get(id).getLibrary()); } return result; } @@ -159,74 +148,30 @@ public void syntaxError(Recognizer recognizer, Object offendingSymbol, int } } - public Library run(String cqlText, - CqlTranslatorOptions.Options... options) throws IOException { - return run(CharStreams.fromString(cqlText), new CqlTranslatorOptions(options)); - } - - public Library run(String cqlText, - CqlCompilerException.ErrorSeverity errorLevel, - CqlTranslatorOptions.Options... options) throws IOException { - return run(CharStreams.fromString(cqlText), new CqlTranslatorOptions(errorLevel, options)); - } - - public Library run(String cqlText, - CqlCompilerException.ErrorSeverity errorLevel, - LibraryBuilder.SignatureLevel signatureLevel, - CqlTranslatorOptions.Options... options) throws IOException { - return run(CharStreams.fromString(cqlText), new CqlTranslatorOptions(errorLevel, signatureLevel, options)); - } - - public Library run(InputStream is, - CqlTranslatorOptions.Options... options) throws IOException { - return run(CharStreams.fromStream(is), new CqlTranslatorOptions(options)); + public Library run(File cqlFile) throws IOException { + return run(CharStreams.fromStream(new FileInputStream(cqlFile))); } - public Library run(InputStream is, - CqlCompilerException.ErrorSeverity errorLevel, - CqlTranslatorOptions.Options... options) throws IOException { - return run(CharStreams.fromStream(is), new CqlTranslatorOptions(errorLevel, options)); + public Library run(String cqlText) { + return run(CharStreams.fromString(cqlText)); } - public Library run(InputStream is, - CqlCompilerException.ErrorSeverity errorLevel, - LibraryBuilder.SignatureLevel signatureLevel, - CqlTranslatorOptions.Options... options) throws IOException { - return run(CharStreams.fromStream(is), new CqlTranslatorOptions(errorLevel, signatureLevel, options)); - } - public Library run(CharStream is, - CqlTranslatorOptions.Options... options) { - return run(is, new CqlTranslatorOptions(options)); + public Library run(InputStream is) throws IOException { + return run(CharStreams.fromStream(is)); } - public Library run(CharStream is, - CqlCompilerException.ErrorSeverity errorLevel, - CqlTranslatorOptions.Options... options) { - return run(is, new CqlTranslatorOptions(errorLevel, LibraryBuilder.SignatureLevel.None, options)); - } - - public Library run(CharStream is, - CqlCompilerException.ErrorSeverity errorLevel, - LibraryBuilder.SignatureLevel signatureLevel, - CqlTranslatorOptions.Options... options) { - return run(is, new CqlTranslatorOptions(errorLevel, signatureLevel, options)); - } - - public Library run(InputStream is, CqlTranslatorOptions options) throws IOException { - return run(CharStreams.fromStream(is), options); - } - - public Library run(CharStream is, CqlTranslatorOptions options) { + public Library run(CharStream is) { exceptions = new ArrayList<>(); errors = new ArrayList<>(); warnings = new ArrayList<>(); messages = new ArrayList<>(); - LibraryBuilder builder = new LibraryBuilder(namespaceInfo, modelManager, libraryManager, ucumService); - builder.setTranslatorOptions(options); + + LibraryBuilder builder = new LibraryBuilder(namespaceInfo, libraryManager); + builder.setCompilerOptions(libraryManager.getCqlCompilerOptions()); Cql2ElmVisitor visitor = new Cql2ElmVisitor(builder); builder.setVisitor(visitor); - visitor.setTranslatorOptions(options); + visitor.setTranslatorOptions(libraryManager.getCqlCompilerOptions()); CqlCompiler.CqlErrorListener errorListener = new CqlCompiler.CqlErrorListener(builder, visitor.isDetailedErrorsEnabled()); diff --git a/Src/java/cql-to-elm/src/main/java/org/cqframework/cql/cql2elm/CqlCompilerException.java b/Src/java/cql-to-elm/src/main/java/org/cqframework/cql/cql2elm/CqlCompilerException.java index 7aa59458b..a9ac103e4 100644 --- a/Src/java/cql-to-elm/src/main/java/org/cqframework/cql/cql2elm/CqlCompilerException.java +++ b/Src/java/cql-to-elm/src/main/java/org/cqframework/cql/cql2elm/CqlCompilerException.java @@ -11,7 +11,7 @@ public enum ErrorSeverity { Error } - public static boolean HasErrors(List exceptions) { + public static boolean hasErrors(List exceptions) { for (CqlCompilerException exception : exceptions) { if (exception.getSeverity() == ErrorSeverity.Error) { return true; @@ -65,7 +65,7 @@ public CqlCompilerException(String message, ErrorSeverity severity, TrackBack lo this.locator = locator; } - private ErrorSeverity severity; + private final ErrorSeverity severity; public ErrorSeverity getSeverity() { return severity; diff --git a/Src/java/cql-to-elm/src/main/java/org/cqframework/cql/cql2elm/CqlCompilerOptions.java b/Src/java/cql-to-elm/src/main/java/org/cqframework/cql/cql2elm/CqlCompilerOptions.java new file mode 100644 index 000000000..d47d5ac86 --- /dev/null +++ b/Src/java/cql-to-elm/src/main/java/org/cqframework/cql/cql2elm/CqlCompilerOptions.java @@ -0,0 +1,405 @@ +package org.cqframework.cql.cql2elm; + + +import java.util.EnumSet; +import java.util.Set; + +/** + * translation options for Cql source files + */ +public class CqlCompilerOptions { + public enum Options { + EnableDateRangeOptimization, + EnableAnnotations, + EnableLocators, + EnableResultTypes, + EnableDetailedErrors, + DisableListTraversal, + DisableListDemotion, + DisableListPromotion, + EnableIntervalDemotion, + EnableIntervalPromotion, + DisableMethodInvocation, + RequireFromKeyword, + DisableDefaultModelInfoLoad + } + + private EnumSet options = EnumSet.noneOf(Options.class); + private boolean validateUnits = true; + private boolean verifyOnly = false; + private boolean enableCqlOnly = false; + private String compatibilityLevel = "1.5"; + private CqlCompilerException.ErrorSeverity errorLevel = CqlCompilerException.ErrorSeverity.Info; + private LibraryBuilder.SignatureLevel signatureLevel = LibraryBuilder.SignatureLevel.Overloads; + private boolean analyzeDataRequirements = false; + private boolean collapseDataRequirements = false; + + /** + * Returns default translator options: + * EnableAnnotations + * EnableLocators + * DisableListDemotion + * DisableListPromotion + * ErrorSeverity.Info + * SignatureLevel.None + * @return + */ + public static CqlCompilerOptions defaultOptions() { + // Default options based on recommended settings: http://build.fhir.org/ig/HL7/cqf-measures/using-cql.html#translation-to-elm + CqlCompilerOptions result = new CqlCompilerOptions(); + result.options.add(Options.EnableAnnotations); + result.options.add(Options.EnableLocators); + result.options.add(Options.DisableListDemotion); + result.options.add(Options.DisableListPromotion); + return result; + } + + public CqlCompilerOptions() { + } + + /** + * Constructor with arbitrary number of options utilizing default ErrorSeverity (Info) and SignatureLevel (None) + * @param options + */ + public CqlCompilerOptions(Options... options) { + this(CqlCompilerException.ErrorSeverity.Info, LibraryBuilder.SignatureLevel.Overloads, options); + } + + public CqlCompilerOptions(CqlCompilerException.ErrorSeverity errorLevel, Options... options) { + this(errorLevel, LibraryBuilder.SignatureLevel.Overloads, options); + } + + /** + * Constructor with defined ErrorSeverity, SignatureLevel, and arbitrary number of options. + * + * @param errorLevel + * @param signatureLevel + * @param options + */ + public CqlCompilerOptions(CqlCompilerException.ErrorSeverity errorLevel, LibraryBuilder.SignatureLevel signatureLevel, Options... options) { + this.setOptions(options); + this.errorLevel = errorLevel; + this.signatureLevel = signatureLevel; + } + + /** + * Constructor using defined SignatureLevel, and Compatibility Level, boolean set to true denotes addition of predefined option + * + * @param dateRangeOptimizations boolean + * @param annotations boolean + * @param locators boolean + * @param resultTypes boolean + * @param verifyOnly boolean + * @param detailedErrors boolean + * @param errorLevel boolean + * @param disableListTraversal boolean + * @param disableListDemotion boolean + * @param disableListPromotion boolean + * @param enableIntervalDemotion boolean + * @param enableIntervalPromotion boolean + * @param disableMethodInvocation boolean + * @param requireFromKeyword boolean + * @param validateUnits boolean + * @param signatureLevel LibraryBuilder.SignatureLevel + * @param compatibilityLevel String + */ + public CqlCompilerOptions(boolean dateRangeOptimizations, + boolean annotations, boolean locators, boolean resultTypes, boolean verifyOnly, + boolean detailedErrors, CqlCompilerException.ErrorSeverity errorLevel, + boolean disableListTraversal, boolean disableListDemotion, boolean disableListPromotion, + boolean enableIntervalDemotion, boolean enableIntervalPromotion, + boolean disableMethodInvocation, boolean requireFromKeyword, boolean validateUnits, + boolean disableDefaultModelInfoLoad, + LibraryBuilder.SignatureLevel signatureLevel, String compatibilityLevel) { + this.verifyOnly = verifyOnly; + this.errorLevel = errorLevel; + this.signatureLevel = signatureLevel; + this.validateUnits = validateUnits; + this.compatibilityLevel = compatibilityLevel; + + if (dateRangeOptimizations) { + options.add(Options.EnableDateRangeOptimization); + } + if (annotations) { + options.add(Options.EnableAnnotations); + } + if (locators) { + options.add(Options.EnableLocators); + } + if (resultTypes) { + options.add(Options.EnableResultTypes); + } + if (detailedErrors) { + options.add(Options.EnableDetailedErrors); + } + if (disableListTraversal) { + options.add(Options.DisableListTraversal); + } + if (disableListDemotion) { + options.add(Options.DisableListDemotion); + } + if (disableListPromotion) { + options.add(Options.DisableListPromotion); + } + if (enableIntervalDemotion) { + options.add(Options.EnableIntervalDemotion); + } + if (enableIntervalPromotion) { + options.add(Options.EnableIntervalPromotion); + } + if (disableMethodInvocation) { + options.add(Options.DisableMethodInvocation); + } + if (requireFromKeyword) { + options.add(Options.RequireFromKeyword); + } + if (disableDefaultModelInfoLoad) { + options.add(Options.DisableDefaultModelInfoLoad); + } + } + + /** + * Returns instance of CqlTranslatorOptions options + * @return + */ + + public Set getOptions() { + return this.options; + } + + /** + * Set arbitrary number of options + * @param options + */ + public void setOptions(Options... options) { + if (options != null) { + for (Options option : options) { + this.options.add(option); + } + } + } + + /** + * Return this instance of CqlTranslatorOptions using new collection of arbitrary number of options + * @param options + * @return + */ + public CqlCompilerOptions withOptions(Options... options) { + setOptions(options); + return this; + } + + /** + * Return instance of CqlTranslatorOptions compatibilityLevel + * @return + */ + public String getCompatibilityLevel() { + return this.compatibilityLevel; + } + + /** + * Set new compatibilityLevel + * @param compatibilityLevel + */ + public void setCompatibilityLevel(String compatibilityLevel) { + this.compatibilityLevel = compatibilityLevel; + } + + /** + * Return this instance of CqlTranslatorOptions with addition of newly assigned compatibilityLevel + * @param compatibilityLevel + * @return + */ + public CqlCompilerOptions withCompatibilityLevel(String compatibilityLevel) { + setCompatibilityLevel(compatibilityLevel); + return this; + } + + /** + * Return instance of CqlTranslatorOptions verifyOnly boolean + * @return + */ + public boolean getVerifyOnly() { + return this.verifyOnly; + } + + /** + * Set new verifyOnly boolean + * @param verifyOnly + */ + public void setVerifyOnly(boolean verifyOnly) { + this.verifyOnly = verifyOnly; + } + + /** + * Return this instance of CqlTranslatorOptions with addition of newly assigned verifyOnly boolean + * @param verifyOnly + * @return + */ + public CqlCompilerOptions withVerifyOnly(boolean verifyOnly) { + setVerifyOnly(verifyOnly); + return this; + } + + /** + * Return instance of CqlTranslatorOptions enableCqlOnly boolean + * @return + */ + public boolean getEnableCqlOnly() { + return this.enableCqlOnly; + } + + /** + * Set new enableCqlOnly boolean + * @param enableCqlOnly + */ + public void setEnableCqlOnly(boolean enableCqlOnly) { + this.enableCqlOnly = enableCqlOnly; + } + + /** + * Return instance of CqlTranslatorOptions validateUnits boolean + * @return + */ + public boolean getValidateUnits() { + return this.validateUnits; + } + + /** + * Set new validateUnits boolean + * @param validateUnits + */ + public void setValidateUnits(boolean validateUnits) { + this.validateUnits = validateUnits; + } + + /** + * Return this instance of CqlTranslatorOptions with addition of newly assigned validateUnits boolean + * @param validateUnits + * @return + */ + public CqlCompilerOptions withValidateUnits(boolean validateUnits) { + setValidateUnits(validateUnits); + return this; + } + + /** + * Return instance of CqlTranslatorOptions errorLevel (CqlTranslatorException.ErrorSeverity) + * @return + */ + public CqlCompilerException.ErrorSeverity getErrorLevel() { + return this.errorLevel; + } + + /** + * Set new errorLevel (CqlTranslatorException.ErrorSeverity) + * @param errorLevel + */ + public void setErrorLevel(CqlCompilerException.ErrorSeverity errorLevel) { + this.errorLevel = errorLevel; + } + + /** + * Return this instance of CqlTranslatorOptions with addition of newly assigned errorLevel (CqlTranslatorException.ErrorSeverity) + * @param errorLevel + * @return + */ + public CqlCompilerOptions withErrorLevel(CqlCompilerException.ErrorSeverity errorLevel) { + setErrorLevel(errorLevel); + return this; + } + + /** + * Return instance of CqlTranslatorOptions signatureLevel (LibraryBuilder.SignatureLevel) + * @return + */ + public LibraryBuilder.SignatureLevel getSignatureLevel() { + return this.signatureLevel; + } + + /** + * Set new signatureLevel (LibraryBuilder.SignatureLevel) + * @param signatureLevel + */ + public void setSignatureLevel(LibraryBuilder.SignatureLevel signatureLevel) { + this.signatureLevel = signatureLevel; + } + + /** + * Return this instance of CqlTranslatorOptions with addition of newly assigned signatureLevel (LibraryBuilder.SignatureLevel) + * @param signatureLevel + * @return + */ + public CqlCompilerOptions withSignatureLevel(LibraryBuilder.SignatureLevel signatureLevel) { + setSignatureLevel(signatureLevel); + return this; + } + + /** + * Return instance of CqlTranslatorOptions collapseDataRequirements boolean + * @return + */ + public boolean getCollapseDataRequirements() { + return this.collapseDataRequirements; + } + + /** + * Set new collapseDataRequirements boolean + * @param collapseDataRequirements + */ + public void setCollapseDataRequirements(boolean collapseDataRequirements) { + this.collapseDataRequirements = collapseDataRequirements; + } + + /** + * Return this instance of CqlTranslatorOptions with addition of newly assigned collapseDataRequirements boolean + * @param collapseDataRequirements + * @return + */ + public CqlCompilerOptions withCollapseDataRequirements(boolean collapseDataRequirements) { + setCollapseDataRequirements(collapseDataRequirements); + return this; + } + + /** + * Return instance of CqlTranslatorOptions analyzeDataRequirements boolean + * @return + */ + public boolean getAnalyzeDataRequirements() { + return this.analyzeDataRequirements; + } + + /** + * Set new analyzeDataRequirements boolean + * @param analyzeDataRequirements + */ + public void setAnalyzeDataRequirements(boolean analyzeDataRequirements) { + this.analyzeDataRequirements = analyzeDataRequirements; + } + + /**git + * Return this instance of CqlTranslatorOptions with addition of newly assigned analyzedDataRequirements boolean + * @param analyzeDataRequirements + * @return + */ + public CqlCompilerOptions withAnalyzeDataRequirements(boolean analyzeDataRequirements) { + setAnalyzeDataRequirements(analyzeDataRequirements); + return this; + } + + @Override + public String toString() { + if (this.getOptions() != null) { + StringBuilder translatorOptions = new StringBuilder(); + for (Options option : this.getOptions()) { + if (translatorOptions.length() > 0) { + translatorOptions.append(","); + } + translatorOptions.append(option.name()); + } + return translatorOptions.toString(); + } + return null; + } +} + diff --git a/Src/java/cql-to-elm/src/main/java/org/cqframework/cql/cql2elm/CqlTranslatorIncludeException.java b/Src/java/cql-to-elm/src/main/java/org/cqframework/cql/cql2elm/CqlIncludeException.java similarity index 66% rename from Src/java/cql-to-elm/src/main/java/org/cqframework/cql/cql2elm/CqlTranslatorIncludeException.java rename to Src/java/cql-to-elm/src/main/java/org/cqframework/cql/cql2elm/CqlIncludeException.java index 57694de1c..5c51044b4 100644 --- a/Src/java/cql-to-elm/src/main/java/org/cqframework/cql/cql2elm/CqlTranslatorIncludeException.java +++ b/Src/java/cql-to-elm/src/main/java/org/cqframework/cql/cql2elm/CqlIncludeException.java @@ -1,18 +1,18 @@ package org.cqframework.cql.cql2elm; -public class CqlTranslatorIncludeException extends RuntimeException { +public class CqlIncludeException extends RuntimeException { private String librarySystem; private String libraryId; private String versionId; - - public CqlTranslatorIncludeException(String message, String librarySystem, String libraryId, String versionId) { + + public CqlIncludeException(String message, String librarySystem, String libraryId, String versionId) { super(message); this.librarySystem = librarySystem; this.libraryId = libraryId; this.versionId = versionId; } - public CqlTranslatorIncludeException(String message, String librarySystem, String libraryId, String versionId, Throwable cause) { + public CqlIncludeException(String message, String librarySystem, String libraryId, String versionId, Throwable cause) { super(message, cause); this.librarySystem = librarySystem; this.libraryId = libraryId; @@ -22,7 +22,7 @@ public CqlTranslatorIncludeException(String message, String librarySystem, Strin public String getLibrarySystem() { return librarySystem; } - + public String getLibraryId() { return libraryId; } diff --git a/Src/java/cql-to-elm/src/main/java/org/cqframework/cql/cql2elm/CqlTranslator.java b/Src/java/cql-to-elm/src/main/java/org/cqframework/cql/cql2elm/CqlTranslator.java index 10e279e65..2dc694b57 100644 --- a/Src/java/cql-to-elm/src/main/java/org/cqframework/cql/cql2elm/CqlTranslator.java +++ b/Src/java/cql-to-elm/src/main/java/org/cqframework/cql/cql2elm/CqlTranslator.java @@ -3,7 +3,6 @@ import org.antlr.v4.runtime.*; import org.cqframework.cql.cql2elm.model.CompiledLibrary; import org.cqframework.cql.elm.serializing.ElmLibraryWriterFactory; -import org.fhir.ucum.UcumService; import org.hl7.cql.model.NamespaceInfo; import org.hl7.elm.r1.Library; import org.hl7.elm.r1.Retrieve; @@ -13,299 +12,61 @@ import java.util.*; public class CqlTranslator { - public static enum Format { XML, JSON, COFFEE } + public enum Format { XML, JSON, COFFEE } private CqlCompiler compiler; - public static CqlTranslator fromText(String cqlText, ModelManager modelManager, LibraryManager libraryManager, CqlTranslatorOptions.Options... options) { - return new CqlTranslator(null, CharStreams.fromString(cqlText), modelManager, libraryManager, null, CqlCompilerException.ErrorSeverity.Info, LibraryBuilder.SignatureLevel.None, options); + public static CqlTranslator fromText(String cqlText, LibraryManager libraryManager){ + return new CqlTranslator(null, null, CharStreams.fromString(cqlText), libraryManager); } - public static CqlTranslator fromText(NamespaceInfo namespaceInfo, String cqlText, ModelManager modelManager, LibraryManager libraryManager, CqlTranslatorOptions.Options... options) { - return new CqlTranslator(namespaceInfo, CharStreams.fromString(cqlText), modelManager, libraryManager, null, CqlCompilerException.ErrorSeverity.Info, LibraryBuilder.SignatureLevel.None, options); + public static CqlTranslator fromText(NamespaceInfo namespaceInfo, String cqlText, LibraryManager libraryManager) { + return new CqlTranslator(namespaceInfo, null, CharStreams.fromString(cqlText), libraryManager); } - public static CqlTranslator fromText(String cqlText, ModelManager modelManager, LibraryManager libraryManager, - CqlCompilerException.ErrorSeverity errorLevel, CqlTranslatorOptions.Options... options) { - return new CqlTranslator(null, CharStreams.fromString(cqlText), modelManager, libraryManager, null, errorLevel, LibraryBuilder.SignatureLevel.None, options); + public static CqlTranslator fromText(NamespaceInfo namespaceInfo, VersionedIdentifier sourceInfo, String cqlText, LibraryManager libraryManager) { + return new CqlTranslator(namespaceInfo, sourceInfo, CharStreams.fromString(cqlText), libraryManager); } - public static CqlTranslator fromText(NamespaceInfo namespaceInfo, String cqlText, ModelManager modelManager, LibraryManager libraryManager, - CqlCompilerException.ErrorSeverity errorLevel, CqlTranslatorOptions.Options... options) { - return new CqlTranslator(namespaceInfo, CharStreams.fromString(cqlText), modelManager, libraryManager, null, errorLevel, LibraryBuilder.SignatureLevel.None, options); - } - - public static CqlTranslator fromText(String cqlText, ModelManager modelManager, LibraryManager libraryManager, - CqlCompilerException.ErrorSeverity errorLevel, LibraryBuilder.SignatureLevel signatureLevel, CqlTranslatorOptions.Options... options) { - return new CqlTranslator(null, CharStreams.fromString(cqlText), modelManager, libraryManager, null, errorLevel, LibraryBuilder.SignatureLevel.None, options); - } - - public static CqlTranslator fromText(NamespaceInfo namespaceInfo, String cqlText, ModelManager modelManager, LibraryManager libraryManager, - CqlCompilerException.ErrorSeverity errorLevel, LibraryBuilder.SignatureLevel signatureLevel, CqlTranslatorOptions.Options... options) { - return new CqlTranslator(namespaceInfo, CharStreams.fromString(cqlText), modelManager, libraryManager, null, errorLevel, LibraryBuilder.SignatureLevel.None, options); - } - - public static CqlTranslator fromText(String cqlText, ModelManager modelManager, LibraryManager libraryManager, UcumService ucumService, CqlTranslatorOptions.Options... options) { - return new CqlTranslator(null, CharStreams.fromString(cqlText), modelManager, libraryManager, ucumService, CqlCompilerException.ErrorSeverity.Info, LibraryBuilder.SignatureLevel.None, options); - } - - public static CqlTranslator fromText(NamespaceInfo namespaceInfo, String cqlText, ModelManager modelManager, LibraryManager libraryManager, UcumService ucumService, CqlTranslatorOptions.Options... options) { - return new CqlTranslator(namespaceInfo, CharStreams.fromString(cqlText), modelManager, libraryManager, ucumService, CqlCompilerException.ErrorSeverity.Info, LibraryBuilder.SignatureLevel.None, options); - } - - public static CqlTranslator fromText(String cqlText, ModelManager modelManager, LibraryManager libraryManager, UcumService ucumService, - CqlCompilerException.ErrorSeverity errorLevel, CqlTranslatorOptions.Options... options) { - return new CqlTranslator(null, CharStreams.fromString(cqlText), modelManager, libraryManager, ucumService, errorLevel, LibraryBuilder.SignatureLevel.None, options); - } - - public static CqlTranslator fromText(NamespaceInfo namespaceInfo, String cqlText, ModelManager modelManager, LibraryManager libraryManager, UcumService ucumService, - CqlCompilerException.ErrorSeverity errorLevel, CqlTranslatorOptions.Options... options) { - return new CqlTranslator(namespaceInfo, CharStreams.fromString(cqlText), modelManager, libraryManager, ucumService, errorLevel, LibraryBuilder.SignatureLevel.None, options); - } - - public static CqlTranslator fromText(String cqlText, ModelManager modelManager, LibraryManager libraryManager, UcumService ucumService, - CqlCompilerException.ErrorSeverity errorLevel, LibraryBuilder.SignatureLevel signatureLevel, CqlTranslatorOptions.Options... options) { - return new CqlTranslator(null, CharStreams.fromString(cqlText), modelManager, libraryManager, ucumService, errorLevel, signatureLevel, options); - } - - public static CqlTranslator fromText(NamespaceInfo namespaceInfo, String cqlText, ModelManager modelManager, LibraryManager libraryManager, UcumService ucumService, - CqlCompilerException.ErrorSeverity errorLevel, LibraryBuilder.SignatureLevel signatureLevel, CqlTranslatorOptions.Options... options) { - return new CqlTranslator(namespaceInfo, CharStreams.fromString(cqlText), modelManager, libraryManager, ucumService, errorLevel, signatureLevel, options); - } - - public static CqlTranslator fromStream(InputStream cqlStream, ModelManager modelManager, LibraryManager libraryManager, CqlTranslatorOptions.Options... options) throws IOException { - - return new CqlTranslator(null, CharStreams.fromStream(cqlStream), modelManager, libraryManager, null, CqlCompilerException.ErrorSeverity.Info, LibraryBuilder.SignatureLevel.None, options); - } - - public static CqlTranslator fromStream(NamespaceInfo namespaceInfo, InputStream cqlStream, ModelManager modelManager, LibraryManager libraryManager, CqlTranslatorOptions.Options... options) throws IOException { - return new CqlTranslator(namespaceInfo, CharStreams.fromStream(cqlStream), modelManager, libraryManager, null, CqlCompilerException.ErrorSeverity.Info, LibraryBuilder.SignatureLevel.None, options); - } - - public static CqlTranslator fromStream(InputStream cqlStream, ModelManager modelManager, LibraryManager libraryManager, - CqlCompilerException.ErrorSeverity errorLevel, CqlTranslatorOptions.Options... options) throws IOException { - return new CqlTranslator(null, CharStreams.fromStream(cqlStream), modelManager, libraryManager, null, errorLevel, LibraryBuilder.SignatureLevel.None, options); - } - - public static CqlTranslator fromStream(NamespaceInfo namespaceInfo, InputStream cqlStream, ModelManager modelManager, LibraryManager libraryManager, - CqlCompilerException.ErrorSeverity errorLevel, CqlTranslatorOptions.Options... options) throws IOException { - return new CqlTranslator(namespaceInfo, CharStreams.fromStream(cqlStream), modelManager, libraryManager, null, errorLevel, LibraryBuilder.SignatureLevel.None, options); - } - - public static CqlTranslator fromStream(InputStream cqlStream, ModelManager modelManager, LibraryManager libraryManager, - CqlCompilerException.ErrorSeverity errorLevel, LibraryBuilder.SignatureLevel signatureLevel, CqlTranslatorOptions.Options... options) throws IOException { - return new CqlTranslator(null, CharStreams.fromStream(cqlStream), modelManager, libraryManager, null, errorLevel, signatureLevel, options); - } - - public static CqlTranslator fromStream(NamespaceInfo namespaceInfo, InputStream cqlStream, ModelManager modelManager, LibraryManager libraryManager, - CqlCompilerException.ErrorSeverity errorLevel, LibraryBuilder.SignatureLevel signatureLevel, CqlTranslatorOptions.Options... options) throws IOException { - return new CqlTranslator(namespaceInfo, CharStreams.fromStream(cqlStream), modelManager, libraryManager, null, errorLevel, signatureLevel, options); - } - - public static CqlTranslator fromStream(InputStream cqlStream, ModelManager modelManager, LibraryManager libraryManager, UcumService ucumService, CqlTranslatorOptions.Options... options) throws IOException { - return new CqlTranslator(null, CharStreams.fromStream(cqlStream), modelManager, libraryManager, ucumService, CqlCompilerException.ErrorSeverity.Info, LibraryBuilder.SignatureLevel.None, options); - } - - public static CqlTranslator fromStream(NamespaceInfo namespaceInfo, InputStream cqlStream, ModelManager modelManager, LibraryManager libraryManager, UcumService ucumService, CqlTranslatorOptions.Options... options) throws IOException { - return new CqlTranslator(namespaceInfo, CharStreams.fromStream(cqlStream), modelManager, libraryManager, ucumService, CqlCompilerException.ErrorSeverity.Info, LibraryBuilder.SignatureLevel.None, options); - } - - public static CqlTranslator fromStream(InputStream cqlStream, ModelManager modelManager, LibraryManager libraryManager, UcumService ucumService, - CqlCompilerException.ErrorSeverity errorLevel, CqlTranslatorOptions.Options... options) throws IOException { - return new CqlTranslator(null, CharStreams.fromStream(cqlStream), modelManager, libraryManager, ucumService, errorLevel, LibraryBuilder.SignatureLevel.None, options); - } - - public static CqlTranslator fromStream(NamespaceInfo namespaceInfo, InputStream cqlStream, ModelManager modelManager, LibraryManager libraryManager, UcumService ucumService, - CqlCompilerException.ErrorSeverity errorLevel, CqlTranslatorOptions.Options... options) throws IOException { - return new CqlTranslator(namespaceInfo, CharStreams.fromStream(cqlStream), modelManager, libraryManager, ucumService, errorLevel, LibraryBuilder.SignatureLevel.None, options); - } - - public static CqlTranslator fromStream(InputStream cqlStream, ModelManager modelManager, LibraryManager libraryManager, UcumService ucumService, - CqlCompilerException.ErrorSeverity errorLevel, LibraryBuilder.SignatureLevel signatureLevel, CqlTranslatorOptions.Options... options) throws IOException { - return new CqlTranslator(null, CharStreams.fromStream(cqlStream), modelManager, libraryManager, ucumService, errorLevel, signatureLevel, options); - } - - public static CqlTranslator fromStream(NamespaceInfo namespaceInfo, InputStream cqlStream, ModelManager modelManager, LibraryManager libraryManager, UcumService ucumService, - CqlCompilerException.ErrorSeverity errorLevel, LibraryBuilder.SignatureLevel signatureLevel, CqlTranslatorOptions.Options... options) throws IOException { - return new CqlTranslator(namespaceInfo, CharStreams.fromStream(cqlStream), modelManager, libraryManager, ucumService, errorLevel, signatureLevel, options); - } - - public static CqlTranslator fromFile(String cqlFileName, ModelManager modelManager, LibraryManager libraryManager, CqlTranslatorOptions.Options... options) throws IOException { - return new CqlTranslator(null, getSourceInfo(cqlFileName), CharStreams.fromStream(new FileInputStream(cqlFileName)), modelManager, libraryManager, null, CqlCompilerException.ErrorSeverity.Info, LibraryBuilder.SignatureLevel.None, options); - } - - public static CqlTranslator fromFile(NamespaceInfo namespaceInfo, String cqlFileName, ModelManager modelManager, LibraryManager libraryManager, CqlTranslatorOptions.Options... options) throws IOException { - return new CqlTranslator(namespaceInfo, getSourceInfo(cqlFileName), CharStreams.fromStream(new FileInputStream(cqlFileName)), modelManager, libraryManager, null, CqlCompilerException.ErrorSeverity.Info, LibraryBuilder.SignatureLevel.None, options); - } - - public static CqlTranslator fromFile(String cqlFileName, ModelManager modelManager, LibraryManager libraryManager, - CqlCompilerException.ErrorSeverity errorLevel, CqlTranslatorOptions.Options... options) throws IOException { - return new CqlTranslator(null, getSourceInfo(cqlFileName), CharStreams.fromStream(new FileInputStream(cqlFileName)), modelManager, libraryManager, null, errorLevel, LibraryBuilder.SignatureLevel.None, options); - } - - public static CqlTranslator fromFile(NamespaceInfo namespaceInfo, String cqlFileName, ModelManager modelManager, LibraryManager libraryManager, - CqlCompilerException.ErrorSeverity errorLevel, CqlTranslatorOptions.Options... options) throws IOException { - return new CqlTranslator(namespaceInfo, getSourceInfo(cqlFileName), CharStreams.fromStream(new FileInputStream(cqlFileName)), modelManager, libraryManager, null, errorLevel, LibraryBuilder.SignatureLevel.None, options); - } - - public static CqlTranslator fromFile(String cqlFileName, ModelManager modelManager, LibraryManager libraryManager, - CqlCompilerException.ErrorSeverity errorLevel, LibraryBuilder.SignatureLevel signatureLevel, CqlTranslatorOptions.Options... options) throws IOException { - return new CqlTranslator(null, getSourceInfo(cqlFileName), CharStreams.fromStream(new FileInputStream(cqlFileName)), modelManager, libraryManager, null, errorLevel, signatureLevel, options); - } - public static CqlTranslator fromFile(NamespaceInfo namespaceInfo, String cqlFileName, ModelManager modelManager, LibraryManager libraryManager, - CqlCompilerException.ErrorSeverity errorLevel, LibraryBuilder.SignatureLevel signatureLevel, CqlTranslatorOptions.Options... options) throws IOException { - return new CqlTranslator(namespaceInfo, getSourceInfo(cqlFileName), CharStreams.fromStream(new FileInputStream(cqlFileName)), modelManager, libraryManager, null, errorLevel, signatureLevel, options); + public static CqlTranslator fromStream(NamespaceInfo namespaceInfo, InputStream cqlStream, LibraryManager libraryManager) throws IOException { + return new CqlTranslator(namespaceInfo, null, CharStreams.fromStream(cqlStream), libraryManager); } - public static CqlTranslator fromFile(File cqlFile, ModelManager modelManager, LibraryManager libraryManager, CqlTranslatorOptions.Options... options) throws IOException { - return new CqlTranslator(null, getSourceInfo(cqlFile), CharStreams.fromStream(new FileInputStream(cqlFile)), modelManager, libraryManager, null, CqlCompilerException.ErrorSeverity.Info, LibraryBuilder.SignatureLevel.None, options); + public static CqlTranslator fromStream(InputStream cqlStream, LibraryManager libraryManager) throws IOException { + return new CqlTranslator(null, null, CharStreams.fromStream(cqlStream), libraryManager); } - public static CqlTranslator fromFile(NamespaceInfo namespaceInfo, File cqlFile, ModelManager modelManager, LibraryManager libraryManager, CqlTranslatorOptions.Options... options) throws IOException { - return new CqlTranslator(namespaceInfo, getSourceInfo(cqlFile), CharStreams.fromStream(new FileInputStream(cqlFile)), modelManager, libraryManager, null, CqlCompilerException.ErrorSeverity.Info, LibraryBuilder.SignatureLevel.None, options); + public static CqlTranslator fromStream(NamespaceInfo namespaceInfo, VersionedIdentifier sourceInfo, InputStream cqlStream, + LibraryManager libraryManager) throws IOException { + return new CqlTranslator(namespaceInfo, sourceInfo, CharStreams.fromStream(cqlStream), libraryManager); } - public static CqlTranslator fromFile(File cqlFile, ModelManager modelManager, LibraryManager libraryManager, - CqlCompilerException.ErrorSeverity errorLevel, CqlTranslatorOptions.Options... options) throws IOException { - return new CqlTranslator(null, getSourceInfo(cqlFile), CharStreams.fromStream(new FileInputStream(cqlFile)), modelManager, libraryManager, null, errorLevel, LibraryBuilder.SignatureLevel.None, options); + public static CqlTranslator fromFile(String cqlFileName, LibraryManager libraryManager) throws IOException { + return new CqlTranslator(null, getSourceInfo(cqlFileName), CharStreams.fromStream(new FileInputStream(cqlFileName)), libraryManager); } - public static CqlTranslator fromFile(NamespaceInfo namespaceInfo, File cqlFile, ModelManager modelManager, LibraryManager libraryManager, - CqlCompilerException.ErrorSeverity errorLevel, CqlTranslatorOptions.Options... options) throws IOException { - return new CqlTranslator(namespaceInfo, getSourceInfo(cqlFile), CharStreams.fromStream(new FileInputStream(cqlFile)), modelManager, libraryManager, null, errorLevel, LibraryBuilder.SignatureLevel.None, options); + public static CqlTranslator fromFile(NamespaceInfo namespaceInfo, String cqlFileName, LibraryManager libraryManager) throws IOException { + return new CqlTranslator(namespaceInfo, getSourceInfo(cqlFileName), CharStreams.fromStream(new FileInputStream(cqlFileName)), libraryManager); } - public static CqlTranslator fromFile(File cqlFile, ModelManager modelManager, LibraryManager libraryManager, - CqlCompilerException.ErrorSeverity errorLevel, LibraryBuilder.SignatureLevel signatureLevel, CqlTranslatorOptions.Options... options) throws IOException { - return new CqlTranslator(null, getSourceInfo(cqlFile), CharStreams.fromStream(new FileInputStream(cqlFile)), modelManager, libraryManager, null, errorLevel, signatureLevel, options); + public static CqlTranslator fromFile(File cqlFile, LibraryManager libraryManager) throws IOException { + return new CqlTranslator(null, getSourceInfo(cqlFile), CharStreams.fromStream(new FileInputStream(cqlFile)), libraryManager); } - public static CqlTranslator fromFile(NamespaceInfo namespaceInfo, File cqlFile, ModelManager modelManager, LibraryManager libraryManager, - CqlCompilerException.ErrorSeverity errorLevel, LibraryBuilder.SignatureLevel signatureLevel, CqlTranslatorOptions.Options... options) throws IOException { - return new CqlTranslator(namespaceInfo, getSourceInfo(cqlFile), CharStreams.fromStream(new FileInputStream(cqlFile)), modelManager, libraryManager, null, errorLevel, signatureLevel, options); + public static CqlTranslator fromFile(NamespaceInfo namespaceInfo, File cqlFile, LibraryManager libraryManager) throws IOException { + return new CqlTranslator(namespaceInfo, getSourceInfo(cqlFile), CharStreams.fromStream(new FileInputStream(cqlFile)), libraryManager); } - public static CqlTranslator fromFile(String cqlFileName, ModelManager modelManager, LibraryManager libraryManager, UcumService ucumService, CqlTranslatorOptions.Options... options) throws IOException { - return new CqlTranslator(null, getSourceInfo(cqlFileName), CharStreams.fromStream(new FileInputStream(cqlFileName)), modelManager, libraryManager, ucumService, CqlCompilerException.ErrorSeverity.Info, LibraryBuilder.SignatureLevel.None, options); + public static CqlTranslator fromFile(NamespaceInfo namespaceInfo, VersionedIdentifier sourceInfo, File cqlFile, + LibraryManager libraryManager) throws IOException { + return new CqlTranslator(namespaceInfo, sourceInfo, CharStreams.fromStream(new FileInputStream(cqlFile)), libraryManager); } - public static CqlTranslator fromFile(NamespaceInfo namespaceInfo, String cqlFileName, ModelManager modelManager, LibraryManager libraryManager, UcumService ucumService, CqlTranslatorOptions.Options... options) throws IOException { - return new CqlTranslator(namespaceInfo, getSourceInfo(cqlFileName), CharStreams.fromStream(new FileInputStream(cqlFileName)), modelManager, libraryManager, ucumService, CqlCompilerException.ErrorSeverity.Info, LibraryBuilder.SignatureLevel.None, options); - } - - public static CqlTranslator fromFile(String cqlFileName, ModelManager modelManager, LibraryManager libraryManager, UcumService ucumService, - CqlCompilerException.ErrorSeverity errorLevel, CqlTranslatorOptions.Options... options) throws IOException { - return new CqlTranslator(null, getSourceInfo(cqlFileName), CharStreams.fromStream(new FileInputStream(cqlFileName)), modelManager, libraryManager, ucumService, errorLevel, LibraryBuilder.SignatureLevel.None, options); - } - - public static CqlTranslator fromFile(NamespaceInfo namespaceInfo, String cqlFileName, ModelManager modelManager, LibraryManager libraryManager, UcumService ucumService, - CqlCompilerException.ErrorSeverity errorLevel, CqlTranslatorOptions.Options... options) throws IOException { - return new CqlTranslator(namespaceInfo, getSourceInfo(cqlFileName), CharStreams.fromStream(new FileInputStream(cqlFileName)), modelManager, libraryManager, ucumService, errorLevel, LibraryBuilder.SignatureLevel.None, options); - } - - public static CqlTranslator fromFile(String cqlFileName, ModelManager modelManager, LibraryManager libraryManager, UcumService ucumService, - CqlCompilerException.ErrorSeverity errorLevel, LibraryBuilder.SignatureLevel signatureLevel, CqlTranslatorOptions.Options... options) throws IOException { - return new CqlTranslator(null, getSourceInfo(cqlFileName), CharStreams.fromStream(new FileInputStream(cqlFileName)), modelManager, libraryManager, ucumService, errorLevel, signatureLevel, options); - } - - public static CqlTranslator fromFile(NamespaceInfo namespaceInfo, String cqlFileName, ModelManager modelManager, LibraryManager libraryManager, UcumService ucumService, - CqlCompilerException.ErrorSeverity errorLevel, LibraryBuilder.SignatureLevel signatureLevel, CqlTranslatorOptions.Options... options) throws IOException { - return new CqlTranslator(namespaceInfo, getSourceInfo(cqlFileName), CharStreams.fromStream(new FileInputStream(cqlFileName)), modelManager, libraryManager, ucumService, errorLevel, signatureLevel, options); - } - - public static CqlTranslator fromFile(File cqlFile, ModelManager modelManager, LibraryManager libraryManager, UcumService ucumService, CqlTranslatorOptions.Options... options) throws IOException { - return new CqlTranslator(null, getSourceInfo(cqlFile), CharStreams.fromStream(new FileInputStream(cqlFile)), modelManager, libraryManager, ucumService, CqlCompilerException.ErrorSeverity.Info, LibraryBuilder.SignatureLevel.None, options); - } - - public static CqlTranslator fromFile(NamespaceInfo namespaceInfo, File cqlFile, ModelManager modelManager, LibraryManager libraryManager, UcumService ucumService, CqlTranslatorOptions.Options... options) throws IOException { - return new CqlTranslator(namespaceInfo, getSourceInfo(cqlFile), CharStreams.fromStream(new FileInputStream(cqlFile)), modelManager, libraryManager, ucumService, CqlCompilerException.ErrorSeverity.Info, LibraryBuilder.SignatureLevel.None, options); - } - - public static CqlTranslator fromFile(File cqlFile, ModelManager modelManager, LibraryManager libraryManager, UcumService ucumService, - CqlCompilerException.ErrorSeverity errorLevel, CqlTranslatorOptions.Options... options) throws IOException { - return new CqlTranslator(null, getSourceInfo(cqlFile), CharStreams.fromStream(new FileInputStream(cqlFile)), modelManager, libraryManager, ucumService, errorLevel, LibraryBuilder.SignatureLevel.None, options); - } - - public static CqlTranslator fromFile(NamespaceInfo namespaceInfo, File cqlFile, ModelManager modelManager, LibraryManager libraryManager, UcumService ucumService, - CqlCompilerException.ErrorSeverity errorLevel, CqlTranslatorOptions.Options... options) throws IOException { - return new CqlTranslator(namespaceInfo, getSourceInfo(cqlFile), CharStreams.fromStream(new FileInputStream(cqlFile)), modelManager, libraryManager, ucumService, errorLevel, LibraryBuilder.SignatureLevel.None, options); - } - - public static CqlTranslator fromFile(File cqlFile, ModelManager modelManager, LibraryManager libraryManager, UcumService ucumService, - CqlCompilerException.ErrorSeverity errorLevel, LibraryBuilder.SignatureLevel signatureLevel, CqlTranslatorOptions.Options... options) throws IOException { - return new CqlTranslator(null, getSourceInfo(cqlFile), CharStreams.fromStream(new FileInputStream(cqlFile)), modelManager, libraryManager, ucumService, errorLevel, signatureLevel, options); - } - - public static CqlTranslator fromFile(NamespaceInfo namespaceInfo, File cqlFile, ModelManager modelManager, LibraryManager libraryManager, UcumService ucumService, - CqlCompilerException.ErrorSeverity errorLevel, LibraryBuilder.SignatureLevel signatureLevel, CqlTranslatorOptions.Options... options) throws IOException { - return new CqlTranslator(namespaceInfo, getSourceInfo(cqlFile), CharStreams.fromStream(new FileInputStream(cqlFile)), modelManager, libraryManager, ucumService, errorLevel, signatureLevel, options); - } - - public static CqlTranslator fromText(String cqlText, ModelManager modelManager, - LibraryManager libraryManager, UcumService ucumService, CqlTranslatorOptions options) { - return new CqlTranslator(null, CharStreams.fromString(cqlText), modelManager, libraryManager, ucumService, options); - } - - public static CqlTranslator fromText(NamespaceInfo namespaceInfo, String cqlText, ModelManager modelManager, - LibraryManager libraryManager, UcumService ucumService, CqlTranslatorOptions options) { - return new CqlTranslator(namespaceInfo, CharStreams.fromString(cqlText), modelManager, libraryManager, ucumService, options); - } - - public static CqlTranslator fromText(NamespaceInfo namespaceInfo, VersionedIdentifier sourceInfo, String cqlText, ModelManager modelManager, - LibraryManager libraryManager, UcumService ucumService, CqlTranslatorOptions options) { - return new CqlTranslator(namespaceInfo, sourceInfo, CharStreams.fromString(cqlText), modelManager, libraryManager, ucumService, options); - } - - public static CqlTranslator fromStream(InputStream cqlStream, ModelManager modelManager, - LibraryManager libraryManager, UcumService ucumService, CqlTranslatorOptions options) throws IOException { - return new CqlTranslator(null, CharStreams.fromStream(cqlStream), modelManager, libraryManager, ucumService, options); - } - - public static CqlTranslator fromStream(NamespaceInfo namespaceInfo, InputStream cqlStream, ModelManager modelManager, - LibraryManager libraryManager, UcumService ucumService, CqlTranslatorOptions options) throws IOException { - return new CqlTranslator(namespaceInfo, CharStreams.fromStream(cqlStream), modelManager, libraryManager, ucumService, options); - } - - public static CqlTranslator fromStream(NamespaceInfo namespaceInfo, VersionedIdentifier sourceInfo, InputStream cqlStream, ModelManager modelManager, - LibraryManager libraryManager, UcumService ucumService, CqlTranslatorOptions options) throws IOException { - return new CqlTranslator(namespaceInfo, sourceInfo, CharStreams.fromStream(cqlStream), modelManager, libraryManager, ucumService, options); - } - - public static CqlTranslator fromFile(File cqlFile, ModelManager modelManager, - LibraryManager libraryManager, UcumService ucumService, CqlTranslatorOptions options) throws IOException { - return new CqlTranslator(null, getSourceInfo(cqlFile), CharStreams.fromStream(new FileInputStream(cqlFile)), modelManager, libraryManager, ucumService, options); - } - - public static CqlTranslator fromFile(NamespaceInfo namespaceInfo, File cqlFile, ModelManager modelManager, - LibraryManager libraryManager, UcumService ucumService, CqlTranslatorOptions options) throws IOException { - return new CqlTranslator(namespaceInfo, getSourceInfo(cqlFile), CharStreams.fromStream(new FileInputStream(cqlFile)), modelManager, libraryManager, ucumService, options); - } - - public static CqlTranslator fromFile(NamespaceInfo namespaceInfo, VersionedIdentifier sourceInfo, File cqlFile, ModelManager modelManager, - LibraryManager libraryManager, UcumService ucumService, CqlTranslatorOptions options) throws IOException { - return new CqlTranslator(namespaceInfo, sourceInfo, CharStreams.fromStream(new FileInputStream(cqlFile)), modelManager, libraryManager, ucumService, options); - } - - private CqlTranslator(NamespaceInfo namespaceInfo, VersionedIdentifier sourceInfo, CharStream is, ModelManager modelManager, LibraryManager libraryManager, UcumService ucumService, - CqlCompilerException.ErrorSeverity errorLevel, LibraryBuilder.SignatureLevel signatureLevel, CqlTranslatorOptions.Options... options) { - this(namespaceInfo, sourceInfo, is, modelManager, libraryManager, ucumService, new CqlTranslatorOptions(errorLevel, signatureLevel, options)); - } - - private CqlTranslator(NamespaceInfo namespaceInfo, CharStream is, ModelManager modelManager, LibraryManager libraryManager, UcumService ucumService, - CqlCompilerException.ErrorSeverity errorLevel, LibraryBuilder.SignatureLevel signatureLevel, CqlTranslatorOptions.Options... options) { - this(namespaceInfo, is, modelManager, libraryManager, ucumService, new CqlTranslatorOptions(errorLevel, signatureLevel, options)); - } - - private CqlTranslator(NamespaceInfo namespaceInfo, CharStream is, ModelManager modelManager, - LibraryManager libraryManager, UcumService ucumService, CqlTranslatorOptions options) { - this(namespaceInfo, null, is, modelManager, libraryManager, ucumService, options); - } - - private CqlTranslator(NamespaceInfo namespaceInfo, VersionedIdentifier sourceInfo, CharStream is, ModelManager modelManager, - LibraryManager libraryManager, UcumService ucumService, CqlTranslatorOptions options) { - compiler = new CqlCompiler(namespaceInfo, sourceInfo, modelManager, libraryManager, ucumService); - compiler.run(is, options); + private CqlTranslator(NamespaceInfo namespaceInfo, VersionedIdentifier sourceInfo, CharStream is, + LibraryManager libraryManager) { + compiler = new CqlCompiler(namespaceInfo, sourceInfo, libraryManager); + compiler.run(is); } private static VersionedIdentifier getSourceInfo(String cqlFileName) { @@ -372,29 +133,29 @@ public List toRetrieves() { return compiler.toRetrieves(); } - public Map getLibraries() { + public Map getLibraries() { return compiler.getLibraries(); } - public Map getTranslatedLibraries() { + public Map getTranslatedLibraries() { return compiler.getCompiledLibraries(); } - public Map getLibrariesAsXML() { - Map result = new HashMap(); - for (Map.Entry entry : getTranslatedLibraries().entrySet()) { - result.put(entry.getKey(), toXml(entry.getValue().getLibrary())); - } - return result; - } - - public Map getLibrariesAsJSON() { - Map result = new HashMap(); - for (Map.Entry entry : getTranslatedLibraries().entrySet()) { - result.put(entry.getKey(), toJson(entry.getValue().getLibrary())); - } - return result; - } + // public Map getLibrariesAsXML() { + // var result = new HashMap(); + // for (Map.Entry entry : getTranslatedLibraries().entrySet()) { + // result.put(entry.getKey(), toXml(entry.getValue().getLibrary())); + // } + // return result; + // } + + // public Map getLibrariesAsJSON() { + // var result = new HashMap(); + // for (Map.Entry entry : getTranslatedLibraries().entrySet()) { + // result.put(entry.getKey(), toJson(entry.getValue().getLibrary())); + // } + // return result; + // } public List getExceptions() { return compiler.getExceptions(); } diff --git a/Src/java/cql-to-elm/src/main/java/org/cqframework/cql/cql2elm/CqlTranslatorOptions.java b/Src/java/cql-to-elm/src/main/java/org/cqframework/cql/cql2elm/CqlTranslatorOptions.java index 93782e735..1d39ce701 100644 --- a/Src/java/cql-to-elm/src/main/java/org/cqframework/cql/cql2elm/CqlTranslatorOptions.java +++ b/Src/java/cql-to-elm/src/main/java/org/cqframework/cql/cql2elm/CqlTranslatorOptions.java @@ -1,434 +1,47 @@ package org.cqframework.cql.cql2elm; - -import java.util.ArrayList; import java.util.EnumSet; -import java.util.List; +import java.util.Set; -/** - * translation options for Cql source files - */ -public class CqlTranslatorOptions { - public enum Options { - EnableDateRangeOptimization, - EnableAnnotations, - EnableLocators, - EnableResultTypes, - EnableDetailedErrors, - DisableListTraversal, - DisableListDemotion, - DisableListPromotion, - EnableIntervalDemotion, - EnableIntervalPromotion, - DisableMethodInvocation, - RequireFromKeyword, - DisableDefaultModelInfoLoad - } +import com.fasterxml.jackson.annotation.JsonUnwrapped; - private List formats = new ArrayList<>(); - private EnumSet options = EnumSet.noneOf(Options.class); - private boolean validateUnits = true; - private boolean verifyOnly = false; - private boolean enableCqlOnly = false; - private String compatibilityLevel = "1.5"; - private CqlCompilerException.ErrorSeverity errorLevel = CqlCompilerException.ErrorSeverity.Info; - private LibraryBuilder.SignatureLevel signatureLevel = LibraryBuilder.SignatureLevel.Overloads; - private boolean analyzeDataRequirements = false; - private boolean collapseDataRequirements = false; - - /** - * Returns default translator options: - * EnableAnnotations - * EnableLocators - * DisableListDemotion - * DisableListPromotion - * ErrorSeverity.Info - * SignatureLevel.None - * Format.XML - * @return - */ - public static CqlTranslatorOptions defaultOptions() { - // Default options based on recommended settings: http://build.fhir.org/ig/HL7/cqf-measures/using-cql.html#translation-to-elm - CqlTranslatorOptions result = new CqlTranslatorOptions(); - result.options.add(Options.EnableAnnotations); - result.options.add(Options.EnableLocators); - result.options.add(Options.DisableListDemotion); - result.options.add(Options.DisableListPromotion); - return result; -// private CqlTranslator.Options[] getDefaultOptions() { -// ArrayList options = new ArrayList<>(); -// return options.toArray(new CqlTranslator.Options[options.size()]); -// } - } - - public CqlTranslatorOptions() { - } - - /** - * Constructor with arbitrary number of options utilizing default ErrorSeverity (Info) and SignatureLevel (None) - * @param options - */ - public CqlTranslatorOptions(Options... options) { - this(CqlCompilerException.ErrorSeverity.Info, LibraryBuilder.SignatureLevel.Overloads, options); - } - - public CqlTranslatorOptions(CqlCompilerException.ErrorSeverity errorLevel, Options... options) { - this(errorLevel, LibraryBuilder.SignatureLevel.Overloads, options); - } +public class CqlTranslatorOptions { - /** - * Constructor with defined ErrorSeverity, SignatureLevel, and arbitrary number of options. - * - * @param errorLevel - * @param signatureLevel - * @param options - */ - public CqlTranslatorOptions(CqlCompilerException.ErrorSeverity errorLevel, LibraryBuilder.SignatureLevel signatureLevel, Options... options) { - this.setOptions(options); - this.errorLevel = errorLevel; - this.signatureLevel = signatureLevel; - } + public enum Format { XML, JSON, COFFEE } - /** - * Constructor using defined Format, SignatureLevel, and Compatibility Level, boolean set to true denotes addition of predefined option - * - * - * @param format CqlTranslator.Format - * @param dateRangeOptimizations boolean - * @param annotations boolean - * @param locators boolean - * @param resultTypes boolean - * @param verifyOnly boolean - * @param detailedErrors boolean - * @param errorLevel boolean - * @param disableListTraversal boolean - * @param disableListDemotion boolean - * @param disableListPromotion boolean - * @param enableIntervalDemotion boolean - * @param enableIntervalPromotion boolean - * @param disableMethodInvocation boolean - * @param requireFromKeyword boolean - * @param validateUnits boolean - * @param signatureLevel LibraryBuilder.SignatureLevel - * @param compatibilityLevel String - */ - public CqlTranslatorOptions(CqlTranslator.Format format, boolean dateRangeOptimizations, - boolean annotations, boolean locators, boolean resultTypes, boolean verifyOnly, - boolean detailedErrors, CqlCompilerException.ErrorSeverity errorLevel, - boolean disableListTraversal, boolean disableListDemotion, boolean disableListPromotion, - boolean enableIntervalDemotion, boolean enableIntervalPromotion, - boolean disableMethodInvocation, boolean requireFromKeyword, boolean validateUnits, - boolean disableDefaultModelInfoLoad, - LibraryBuilder.SignatureLevel signatureLevel, String compatibilityLevel) { - formats.add(format); - this.verifyOnly = verifyOnly; - this.errorLevel = errorLevel; - this.signatureLevel = signatureLevel; - this.validateUnits = validateUnits; - this.compatibilityLevel = compatibilityLevel; + @JsonUnwrapped + private CqlCompilerOptions cqlCompilerOptions; + private Set formats; - if (dateRangeOptimizations) { - options.add(Options.EnableDateRangeOptimization); - } - if (annotations) { - options.add(Options.EnableAnnotations); - } - if (locators) { - options.add(Options.EnableLocators); - } - if (resultTypes) { - options.add(Options.EnableResultTypes); - } - if (detailedErrors) { - options.add(Options.EnableDetailedErrors); - } - if (disableListTraversal) { - options.add(Options.DisableListTraversal); - } - if (disableListDemotion) { - options.add(Options.DisableListDemotion); - } - if (disableListPromotion) { - options.add(Options.DisableListPromotion); - } - if (enableIntervalDemotion) { - options.add(Options.EnableIntervalDemotion); - } - if (enableIntervalPromotion) { - options.add(Options.EnableIntervalPromotion); - } - if (disableMethodInvocation) { - options.add(Options.DisableMethodInvocation); - } - if (requireFromKeyword) { - options.add(Options.RequireFromKeyword); - } - if (disableDefaultModelInfoLoad) { - options.add(Options.DisableDefaultModelInfoLoad); - } + public static CqlTranslatorOptions defaultOptions() { + return new CqlTranslatorOptions() + .withCqlCompilerOptions(CqlCompilerOptions.defaultOptions()) + .withFormats(EnumSet.of(Format.XML)); } - /** - * Returns instance of CqlTranslatorOptions options - * @return - */ - - public EnumSet getOptions() { - return this.options; + public CqlCompilerOptions getCqlCompilerOptions() { + return this.cqlCompilerOptions; } - /** - * Set arbitrary number of options - * @param options - */ - public void setOptions(Options... options) { - if (options != null) { - for (Options option : options) { - this.options.add(option); - } - } + public void setCqlCompilerOptions(CqlCompilerOptions cqlCompilerOptions) { + this.cqlCompilerOptions = cqlCompilerOptions; } - /** - * Return this instance of CqlTranslatorOptions using new collection of arbitrary number of options - * @param options - * @return - */ - public CqlTranslatorOptions withOptions(Options... options) { - setOptions(options); + public CqlTranslatorOptions withCqlCompilerOptions(CqlCompilerOptions cqlCompilerOptions) { + this.setCqlCompilerOptions(cqlCompilerOptions); return this; } - /** - * Returns instance of CqlTranslatorOptions formats - * - * @return - */ - public List getFormats() { + public Set getFormats() { return this.formats; } - /** - * Return this instance of CqlTranslatorOptions with addition of newly assigned format - * @param format - * @return - */ - public CqlTranslatorOptions withFormat(CqlTranslator.Format format) { - formats.add(format); - return this; - } - - /** - * Return instance of CqlTranslatorOptions compatibilityLevel - * @return - */ - public String getCompatibilityLevel() { - return this.compatibilityLevel; - } - - /** - * Set new compatibilityLevel - * @param compatibilityLevel - */ - public void setCompatibilityLevel(String compatibilityLevel) { - this.compatibilityLevel = compatibilityLevel; - } - - /** - * Return this instance of CqlTranslatorOptions with addition of newly assigned compatibilityLevel - * @param compatibilityLevel - * @return - */ - public CqlTranslatorOptions withCompatibilityLevel(String compatibilityLevel) { - setCompatibilityLevel(compatibilityLevel); - return this; - } - - /** - * Return instance of CqlTranslatorOptions verifyOnly boolean - * @return - */ - public boolean getVerifyOnly() { - return this.verifyOnly; - } - - /** - * Set new verifyOnly boolean - * @param verifyOnly - */ - public void setVerifyOnly(boolean verifyOnly) { - this.verifyOnly = verifyOnly; - } - - /** - * Return this instance of CqlTranslatorOptions with addition of newly assigned verifyOnly boolean - * @param verifyOnly - * @return - */ - public CqlTranslatorOptions withVerifyOnly(boolean verifyOnly) { - setVerifyOnly(verifyOnly); - return this; - } - - /** - * Return instance of CqlTranslatorOptions enableCqlOnly boolean - * @return - */ - public boolean getEnableCqlOnly() { - return this.enableCqlOnly; - } - - /** - * Set new enableCqlOnly boolean - * @param enableCqlOnly - */ - public void setEnableCqlOnly(boolean enableCqlOnly) { - this.enableCqlOnly = enableCqlOnly; - } - - /** - * Return instance of CqlTranslatorOptions validateUnits boolean - * @return - */ - public boolean getValidateUnits() { - return this.validateUnits; - } - - /** - * Set new validateUnits boolean - * @param validateUnits - */ - public void setValidateUnits(boolean validateUnits) { - this.validateUnits = validateUnits; - } - - /** - * Return this instance of CqlTranslatorOptions with addition of newly assigned validateUnits boolean - * @param validateUnits - * @return - */ - public CqlTranslatorOptions withValidateUnits(boolean validateUnits) { - setValidateUnits(validateUnits); - return this; - } - - /** - * Return instance of CqlTranslatorOptions errorLevel (CqlTranslatorException.ErrorSeverity) - * @return - */ - public CqlCompilerException.ErrorSeverity getErrorLevel() { - return this.errorLevel; - } - - /** - * Set new errorLevel (CqlTranslatorException.ErrorSeverity) - * @param errorLevel - */ - public void setErrorLevel(CqlCompilerException.ErrorSeverity errorLevel) { - this.errorLevel = errorLevel; - } - - /** - * Return this instance of CqlTranslatorOptions with addition of newly assigned errorLevel (CqlTranslatorException.ErrorSeverity) - * @param errorLevel - * @return - */ - public CqlTranslatorOptions withErrorLevel(CqlCompilerException.ErrorSeverity errorLevel) { - setErrorLevel(errorLevel); - return this; - } - - /** - * Return instance of CqlTranslatorOptions signatureLevel (LibraryBuilder.SignatureLevel) - * @return - */ - public LibraryBuilder.SignatureLevel getSignatureLevel() { - return this.signatureLevel; - } - - /** - * Set new signatureLevel (LibraryBuilder.SignatureLevel) - * @param signatureLevel - */ - public void setSignatureLevel(LibraryBuilder.SignatureLevel signatureLevel) { - this.signatureLevel = signatureLevel; + public void setFormats(Set formats) { + this.formats = formats; } - /** - * Return this instance of CqlTranslatorOptions with addition of newly assigned signatureLevel (LibraryBuilder.SignatureLevel) - * @param signatureLevel - * @return - */ - public CqlTranslatorOptions withSignatureLevel(LibraryBuilder.SignatureLevel signatureLevel) { - setSignatureLevel(signatureLevel); + public CqlTranslatorOptions withFormats(Set formats) { + this.setFormats(formats); return this; } - - /** - * Return instance of CqlTranslatorOptions cllapseDataRequirements boolean - * @return - */ - public boolean getCollapseDataRequirements() { - return this.collapseDataRequirements; - } - - /** - * Set new collapseDataRequirements boolean - * @param collapseDataRequirements - */ - public void setCollapseDataRequirements(boolean collapseDataRequirements) { - this.collapseDataRequirements = collapseDataRequirements; - } - - /** - * Return this instance of CqlTranslatorOptions with addition of newly assigned collapseDataRequirements boolean - * @param collapseDataRequirements - * @return - */ - public CqlTranslatorOptions withCollapseDataRequirements(boolean collapseDataRequirements) { - setCollapseDataRequirements(collapseDataRequirements); - return this; - } - - /** - * Return instance of CqlTranslatorOptions analayzedDataRequirements boolean - * @return - */ - public boolean getAnalyzeDataRequirements() { - return this.analyzeDataRequirements; - } - - /** - * Set new analyzeDataRequirements boolean - * @param analyzeDataRequirements - */ - public void setAnalyzeDataRequirements(boolean analyzeDataRequirements) { - this.analyzeDataRequirements = analyzeDataRequirements; - } - - /**git - * Return this instance of CqlTranslatorOptions with addition of newly assigned analyzedDataRequirements boolean - * @param analyzeDataRequirements - * @return - */ - public CqlTranslatorOptions withAnalyzeDataRequirements(boolean analyzeDataRequirements) { - setAnalyzeDataRequirements(analyzeDataRequirements); - return this; - } - - @Override - public String toString() { - if (this.getOptions() != null) { - StringBuilder translatorOptions = new StringBuilder(); - for (Options option : this.getOptions()) { - if (translatorOptions.length() > 0) { - translatorOptions.append(","); - } - translatorOptions.append(option.name()); - } - return translatorOptions.toString(); - } - return null; - } } - diff --git a/Src/java/cql-to-elm/src/main/java/org/cqframework/cql/cql2elm/LibraryBuilder.java b/Src/java/cql-to-elm/src/main/java/org/cqframework/cql/cql2elm/LibraryBuilder.java index 9c916780d..cf5b29a89 100644 --- a/Src/java/cql-to-elm/src/main/java/org/cqframework/cql/cql2elm/LibraryBuilder.java +++ b/Src/java/cql-to-elm/src/main/java/org/cqframework/cql/cql2elm/LibraryBuilder.java @@ -41,21 +41,17 @@ public static enum SignatureLevel { All } - public LibraryBuilder(ModelManager modelManager, LibraryManager libraryManager, UcumService ucumService) { - this(null, modelManager, libraryManager, ucumService); + public LibraryBuilder(LibraryManager libraryManager) { + this(null, libraryManager); } - public LibraryBuilder(NamespaceInfo namespaceInfo, ModelManager modelManager, LibraryManager libraryManager, UcumService ucumService) { - if (modelManager == null) { - throw new IllegalArgumentException("modelManager is null"); - } - + public LibraryBuilder(NamespaceInfo namespaceInfo, LibraryManager libraryManager) { if (libraryManager == null) { throw new IllegalArgumentException("libraryManager is null"); } this.namespaceInfo = namespaceInfo; // Note: allowed to be null, implies global namespace - this.modelManager = modelManager; + this.modelManager = libraryManager.getModelManager(); this.libraryManager = libraryManager; this.typeBuilder = new TypeBuilder(of, this); @@ -70,8 +66,6 @@ public LibraryBuilder(NamespaceInfo namespaceInfo, ModelManager modelManager, Li compiledLibrary = new CompiledLibrary(); compiledLibrary.setLibrary(library); - - this.ucumService = ucumService; } // Only exceptions of severity Error @@ -125,8 +119,7 @@ public ConversionMap getConversionMap() { private final ObjectFactory of = new ObjectFactory(); private final org.hl7.cql_annotations.r1.ObjectFactory af = new org.hl7.cql_annotations.r1.ObjectFactory(); private boolean listTraversal = true; - private UcumService ucumService = null; - private CqlTranslatorOptions options; + private CqlCompilerOptions options; private CqlToElmInfo cqlToElmInfo = null; private TypeBuilder typeBuilder = null; private Cql2ElmVisitor visitor = null; @@ -135,25 +128,25 @@ public void enableListTraversal() { listTraversal = true; } - public void setTranslatorOptions(CqlTranslatorOptions options) { + public void setCompilerOptions(CqlCompilerOptions options) { if (options == null) { throw new IllegalArgumentException("Options cannot be null"); } this.options = options; - if (options.getOptions().contains(CqlTranslatorOptions.Options.DisableListTraversal)) { + if (options.getOptions().contains(CqlCompilerOptions.Options.DisableListTraversal)) { this.listTraversal = false; } - if (options.getOptions().contains(CqlTranslatorOptions.Options.DisableListDemotion)) { + if (options.getOptions().contains(CqlCompilerOptions.Options.DisableListDemotion)) { this.getConversionMap().disableListDemotion(); } - if (options.getOptions().contains(CqlTranslatorOptions.Options.DisableListPromotion)) { + if (options.getOptions().contains(CqlCompilerOptions.Options.DisableListPromotion)) { this.getConversionMap().disableListPromotion(); } - if (options.getOptions().contains(CqlTranslatorOptions.Options.EnableIntervalDemotion)) { + if (options.getOptions().contains(CqlCompilerOptions.Options.EnableIntervalDemotion)) { this.getConversionMap().enableIntervalDemotion(); } - if (options.getOptions().contains(CqlTranslatorOptions.Options.EnableIntervalPromotion)) { + if (options.getOptions().contains(CqlCompilerOptions.Options.EnableIntervalPromotion)) { this.getConversionMap().enableIntervalPromotion(); } setCompatibilityLevel(options.getCompatibilityLevel()); @@ -598,8 +591,8 @@ public void recordParsingException(CqlCompilerException e) { err.setEndChar(e.getLocator().getEndChar()); } - if (e.getCause() != null && e.getCause() instanceof CqlTranslatorIncludeException) { - CqlTranslatorIncludeException incEx = (CqlTranslatorIncludeException) e.getCause(); + if (e.getCause() != null && e.getCause() instanceof CqlIncludeException) { + CqlIncludeException incEx = (CqlIncludeException) e.getCause(); err.setTargetIncludeLibrarySystem(incEx.getLibrarySystem()); err.setTargetIncludeLibraryId(incEx.getLibraryId()); err.setTargetIncludeLibraryVersionId(incEx.getVersionId()); @@ -626,7 +619,7 @@ private String getLibraryName() { public void beginTranslation() { loadSystemLibrary(); - libraryManager.beginCompilation(getLibraryName()); + // libraryManager.beginCompilation(getLibraryName()); } public VersionedIdentifier getLibraryIdentifier() { @@ -640,7 +633,7 @@ public void setLibraryIdentifier(VersionedIdentifier vid) { public void endTranslation() { applyTargetModelMaps(); - libraryManager.endCompilation(getLibraryName()); + // libraryManager.endCompilation(getLibraryName()); } public boolean canResolveLibrary(IncludeDef includeDef) { @@ -669,7 +662,7 @@ public void addInclude(IncludeDef includeDef) { .withVersion(includeDef.getVersion()); ArrayList errors = new ArrayList(); - CompiledLibrary referencedLibrary = libraryManager.resolveLibrary(libraryIdentifier, this.options, errors); + CompiledLibrary referencedLibrary = libraryManager.resolveLibrary(libraryIdentifier, errors); for (CqlCompilerException error : errors) { this.recordParsingException(error); } @@ -1906,7 +1899,8 @@ public String ensureUcumUnit(String unit) { } private void validateUcumUnit(String unit) { - if (ucumService != null) { + if (libraryManager.getUcumService() != null) { + var ucumService = libraryManager.getUcumService(); String message = ucumService.validate(unit); if (message != null) { // ERROR: diff --git a/Src/java/cql-to-elm/src/main/java/org/cqframework/cql/cql2elm/LibraryManager.java b/Src/java/cql-to-elm/src/main/java/org/cqframework/cql/cql2elm/LibraryManager.java index a23c4333f..3b12af256 100644 --- a/Src/java/cql-to-elm/src/main/java/org/cqframework/cql/cql2elm/LibraryManager.java +++ b/Src/java/cql-to-elm/src/main/java/org/cqframework/cql/cql2elm/LibraryManager.java @@ -1,30 +1,39 @@ package org.cqframework.cql.cql2elm; +import org.apache.commons.lang3.StringUtils; +import org.apache.commons.text.diff.StringsComparator; import org.cqframework.cql.cql2elm.model.CompiledLibrary; import org.cqframework.cql.elm.serializing.ElmLibraryReaderFactory; +import org.fhir.ucum.UcumEssenceService; +import org.fhir.ucum.UcumException; import org.fhir.ucum.UcumService; import org.hl7.cql.model.NamespaceManager; import org.hl7.elm.r1.CodeDef; import org.hl7.elm.r1.CodeSystemDef; import org.hl7.elm.r1.ConceptDef; import org.hl7.elm.r1.ExpressionDef; +import org.hl7.elm.r1.FunctionDef; +import org.hl7.elm.r1.FunctionRef; import org.hl7.elm.r1.IncludeDef; import org.hl7.elm.r1.Library; import org.hl7.elm.r1.ParameterDef; import org.hl7.elm.r1.UsingDef; import org.hl7.elm.r1.ValueSetDef; import org.hl7.elm.r1.VersionedIdentifier; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; import java.io.IOException; import java.io.InputStream; import java.io.InputStreamReader; -import java.util.EnumSet; +import java.util.ArrayList; import java.util.HashMap; +import java.util.HashSet; import java.util.List; import java.util.Map; -import java.util.Stack; +import java.util.Set; -import static org.cqframework.cql.cql2elm.CqlCompilerException.HasErrors; +import static org.cqframework.cql.cql2elm.CqlCompilerException.hasErrors; /** * Manages a set of CQL libraries. As new library references are encountered @@ -32,35 +41,58 @@ * librarySourceLoader, compiled and cached for later use. */ public class LibraryManager { - private ModelManager modelManager; - private NamespaceManager namespaceManager; + public enum CacheMode { + NONE, READ_ONLY, READ_WRITE + } + + private static final Logger logger = LoggerFactory.getLogger(LibraryManager.class); + + private final ModelManager modelManager; + private final NamespaceManager namespaceManager; + private final CqlCompilerOptions cqlCompilerOptions; + private final Map compiledLibraries; + private final LibrarySourceLoader librarySourceLoader; + private UcumService ucumService; - private final Map compiledLibraries; - private Map libraries; - private final Stack compilationStack; - private LibrarySourceLoader librarySourceLoader; - private boolean enableCache; - private static final LibraryContentType[] supportedContentTypes = {LibraryContentType.JSON, LibraryContentType.XML, LibraryContentType.CQL}; + private static final LibraryContentType[] supportedContentTypes = { LibraryContentType.JSON, LibraryContentType.XML, + LibraryContentType.CQL }; public LibraryManager(ModelManager modelManager) { + this(modelManager, CqlCompilerOptions.defaultOptions(), null); + } + + public LibraryManager(ModelManager modelManager, CqlCompilerOptions cqlCompilerOptions) { + this(modelManager, cqlCompilerOptions, null); + } + + public LibraryManager(ModelManager modelManager, CqlCompilerOptions cqlCompilerOptions, + Map libraryCache) { if (modelManager == null) { throw new IllegalArgumentException("modelManager is null"); } this.modelManager = modelManager; + this.cqlCompilerOptions = cqlCompilerOptions; if (this.modelManager.getNamespaceManager() != null) { this.namespaceManager = modelManager.getNamespaceManager(); } else { this.namespaceManager = new NamespaceManager(); } - compiledLibraries = new HashMap<>(); - libraries = new HashMap<>(); - compilationStack = new Stack<>(); - this.enableCache = true; + + if (libraryCache != null) { + this.compiledLibraries = libraryCache; + } else { + this.compiledLibraries = new HashMap<>(); + } + this.librarySourceLoader = new PriorityLibrarySourceLoader(); } + public CqlCompilerOptions getCqlCompilerOptions() { + return this.cqlCompilerOptions; + } + public ModelManager getModelManager() { return this.modelManager; } @@ -69,50 +101,39 @@ public NamespaceManager getNamespaceManager() { return this.namespaceManager; } - public UcumService getUcumService() { - return this.ucumService; - } - - public void setUcumService(UcumService ucumService) { - this.ucumService = ucumService; - } - - public LibrarySourceLoader getLibrarySourceLoader() { - return librarySourceLoader; - } - - public void setLibrarySourceLoader(LibrarySourceLoader librarySourceLoader) { - this.librarySourceLoader = librarySourceLoader; + public Map getCompiledLibraries() { + return this.compiledLibraries; } - public void enableCache() { - this.enableCache = true; - } + public UcumService getUcumService() { + if (this.ucumService == null) { + this.ucumService = getDefaultUcumService(); + } - public LibraryManager withEnableCache() { - enableCache(); - return this; + return ucumService; } - public void disableCache() { - this.enableCache = false; - } + protected synchronized UcumService getDefaultUcumService() { + try { + return new UcumEssenceService(UcumEssenceService.class.getResourceAsStream("/ucum-essence.xml")); + } catch (UcumException e) { + logger.warn("Error creating shared UcumService", e); + } - public LibraryManager withDisableCache() { - disableCache(); - return this; + return null; } - public boolean isCacheEnabled() { - return enableCache; + public void setUcumService(UcumService ucumService) { + this.ucumService = ucumService; } - public Map getCompiledLibraries() { - return compiledLibraries; + public LibrarySourceLoader getLibrarySourceLoader() { + return librarySourceLoader; } /* - A "well-known" library name is one that is allowed to resolve without a namespace in a namespace-aware context + * A "well-known" library name is one that is allowed to resolve without a + * namespace in a namespace-aware context */ public boolean isWellKnownLibraryName(String unqualifiedIdentifier) { if (unqualifiedIdentifier == null) { @@ -127,60 +148,25 @@ public boolean isWellKnownLibraryName(String unqualifiedIdentifier) { } } - public void cacheLibrary(CompiledLibrary library) { - String libraryPath = NamespaceManager.getPath(library.getIdentifier().getSystem(), library.getIdentifier().getId()); - compiledLibraries.put(libraryPath, library); - libraries.put(library.getIdentifier(), library.getLibrary()); - } - - public void cacheLibrary(Library library) { - libraries.put(library.getIdentifier(), library); + public CompiledLibrary resolveLibrary(VersionedIdentifier libraryIdentifier, CacheMode cacheMode) { + return this.resolveLibrary(libraryIdentifier, new ArrayList<>(), cacheMode); } - public Library getCachedLibrary(VersionedIdentifier libraryIdentifier) { - if (enableCache) { - if (libraries.containsKey(libraryIdentifier)) { - return libraries.get(libraryIdentifier); - } else if (true) { - String libraryPath = NamespaceManager.getPath(libraryIdentifier.getSystem(), libraryIdentifier.getId()); - if(compiledLibraries.containsKey(libraryPath)) { - return compiledLibraries.get(libraryPath).getLibrary(); - } - } - } - return null; + public CompiledLibrary resolveLibrary(VersionedIdentifier libraryIdentifier) { + return this.resolveLibrary(libraryIdentifier, new ArrayList<>(), CacheMode.READ_WRITE); } public boolean canResolveLibrary(VersionedIdentifier libraryIdentifier) { - if (libraryIdentifier == null) { - throw new IllegalArgumentException("libraryIdentifier is null."); - } - - if (libraryIdentifier.getId() == null || libraryIdentifier.getId().equals("")) { - throw new IllegalArgumentException("libraryIdentifier Id is null"); - } - - String libraryPath = NamespaceManager.getPath(libraryIdentifier.getSystem(), libraryIdentifier.getId()); - if (enableCache) { - CompiledLibrary library = compiledLibraries.get(libraryPath); - if (library != null) { - return true; - } - else if(libraries.containsKey(libraryIdentifier)) { - return true; - } - } - - for (LibraryContentType type : supportedContentTypes) { - if (librarySourceLoader.isLibraryContentAvailable(libraryIdentifier, type)) { - return true; - } - } + var lib = this.resolveLibrary(libraryIdentifier); + return lib != null; + } - return false; + public CompiledLibrary resolveLibrary(VersionedIdentifier libraryIdentifier, List errors) { + return this.resolveLibrary(libraryIdentifier, errors, CacheMode.READ_WRITE); } - public CompiledLibrary resolveLibrary(VersionedIdentifier libraryIdentifier, CqlTranslatorOptions options, List errors) { + public CompiledLibrary resolveLibrary(VersionedIdentifier libraryIdentifier, List errors, + CacheMode cacheMode) { if (libraryIdentifier == null) { throw new IllegalArgumentException("libraryIdentifier is null."); } @@ -189,43 +175,29 @@ public CompiledLibrary resolveLibrary(VersionedIdentifier libraryIdentifier, Cql throw new IllegalArgumentException("libraryIdentifier Id is null"); } - String libraryPath = NamespaceManager.getPath(libraryIdentifier.getSystem(), libraryIdentifier.getId()); CompiledLibrary library = null; - if (enableCache) { - library = compiledLibraries.get(libraryPath); - if(library == null && libraries.containsKey(libraryIdentifier)) { - library = generateCompiledLibrary(libraries.get(libraryIdentifier)); + if (cacheMode != CacheMode.NONE) { + library = compiledLibraries.get(libraryIdentifier); + if (library != null) { + return library; } } - if (library != null - && libraryIdentifier.getVersion() != null - && !libraryIdentifier.getVersion().equals(library.getIdentifier().getVersion())) { - throw new CqlTranslatorIncludeException(String.format("Could not resolve reference to library %s, version %s because version %s is already loaded.", - libraryPath, libraryIdentifier.getVersion(), library.getIdentifier().getVersion()), libraryIdentifier.getSystem(), libraryIdentifier.getId(), libraryIdentifier.getVersion()); - } else if (library != null) { - if (libraryIdentifier.getSystem() == null && library.getIdentifier().getSystem() != null) { - libraryIdentifier.setSystem(library.getIdentifier().getSystem()); - } - return library; - } else { - library = compileLibrary(libraryIdentifier, options, errors); - if (!HasErrors(errors)) { - compiledLibraries.put(libraryPath, library); - libraries.put(libraryIdentifier, library.getLibrary()); - } + library = compileLibrary(libraryIdentifier, errors); + if (!hasErrors(errors) && cacheMode == CacheMode.READ_WRITE) { + compiledLibraries.put(libraryIdentifier, library); } - return library; } - private CompiledLibrary compileLibrary(VersionedIdentifier libraryIdentifier, CqlTranslatorOptions options, List errors) { + private CompiledLibrary compileLibrary(VersionedIdentifier libraryIdentifier, List errors) { CompiledLibrary result = null; - if(!options.getEnableCqlOnly()) { - result = tryCompiledLibraryElm(libraryIdentifier, options); + if (!this.cqlCompilerOptions.getEnableCqlOnly()) { + result = tryCompiledLibraryElm(libraryIdentifier, this.cqlCompilerOptions); if (result != null) { + sortStatements(result); return result; } } @@ -235,39 +207,53 @@ private CompiledLibrary compileLibrary(VersionedIdentifier libraryIdentifier, Cq try { InputStream cqlSource = librarySourceLoader.getLibrarySource(libraryIdentifier); if (cqlSource == null) { - throw new CqlTranslatorIncludeException(String.format("Could not load source for library %s, version %s.", - libraryIdentifier.getId(), libraryIdentifier.getVersion()), libraryIdentifier.getSystem(), libraryIdentifier.getId(), libraryIdentifier.getVersion()); + throw new CqlIncludeException(String.format("Could not load source for library %s, version %s.", + libraryIdentifier.getId(), libraryIdentifier.getVersion()), libraryIdentifier.getSystem(), + libraryIdentifier.getId(), libraryIdentifier.getVersion()); } CqlCompiler compiler = new CqlCompiler( namespaceManager.getNamespaceInfoFromUri(libraryIdentifier.getSystem()), - libraryIdentifier, modelManager, this, ucumService); - compiler.run(cqlSource, options); + libraryIdentifier, this); + compiler.run(cqlSource); if (errors != null) { errors.addAll(compiler.getExceptions()); } result = compiler.getCompiledLibrary(); - if (libraryIdentifier.getVersion() != null && !libraryIdentifier.getVersion().equals(result.getIdentifier().getVersion())) { - throw new CqlTranslatorIncludeException(String.format("Library %s was included as version %s, but version %s of the library was found.", - libraryPath, libraryIdentifier.getVersion(), result.getIdentifier().getVersion()), + if (libraryIdentifier.getVersion() != null + && !libraryIdentifier.getVersion().equals(result.getIdentifier().getVersion())) { + throw new CqlIncludeException( + String.format("Library %s was included as version %s, but version %s of the library was found.", + libraryPath, libraryIdentifier.getVersion(), result.getIdentifier().getVersion()), libraryIdentifier.getSystem(), libraryIdentifier.getId(), libraryIdentifier.getVersion()); } } catch (IOException e) { - throw new CqlTranslatorIncludeException(String.format("Errors occurred translating library %s, version %s.", - libraryPath, libraryIdentifier.getVersion()), libraryIdentifier.getSystem(), libraryIdentifier.getId(), libraryIdentifier.getVersion(), e); + throw new CqlIncludeException(String.format("Errors occurred translating library %s, version %s.", + libraryPath, libraryIdentifier.getVersion()), libraryIdentifier.getSystem(), + libraryIdentifier.getId(), libraryIdentifier.getVersion(), e); } if (result == null) { - throw new CqlTranslatorIncludeException(String.format("Could not load source for library %s, version %s.", - libraryPath, libraryIdentifier.getVersion()), libraryIdentifier.getSystem(), libraryIdentifier.getId(), libraryIdentifier.getVersion()); + throw new CqlIncludeException(String.format("Could not load source for library %s, version %s.", + libraryPath, libraryIdentifier.getVersion()), libraryIdentifier.getSystem(), + libraryIdentifier.getId(), libraryIdentifier.getVersion()); } else { + sortStatements(result); return result; } } - private CompiledLibrary tryCompiledLibraryElm(VersionedIdentifier libraryIdentifier, CqlTranslatorOptions options) { + private void sortStatements(CompiledLibrary compiledLibrary) { + if (compiledLibrary == null || compiledLibrary.getLibrary().getStatements() == null) { + return; + } + + compiledLibrary.getLibrary().getStatements().getDef().sort((a, b) -> a.getName().compareTo(b.getName())); + } + + private CompiledLibrary tryCompiledLibraryElm(VersionedIdentifier libraryIdentifier, CqlCompilerOptions options) { InputStream elm = null; for (LibraryContentType type : supportedContentTypes) { if (LibraryContentType.CQL == type) { @@ -285,8 +271,8 @@ private CompiledLibrary tryCompiledLibraryElm(VersionedIdentifier libraryIdentif return null; } - - private CompiledLibrary generateCompiledLibraryFromElm(VersionedIdentifier libraryIdentifier, InputStream librarySource, LibraryContentType type, CqlTranslatorOptions options) { + private CompiledLibrary generateCompiledLibraryFromElm(VersionedIdentifier libraryIdentifier, + InputStream librarySource, LibraryContentType type, CqlCompilerOptions options) { Library library = null; CompiledLibrary compiledLibrary = null; @@ -296,11 +282,8 @@ private CompiledLibrary generateCompiledLibraryFromElm(VersionedIdentifier libra e.printStackTrace(); } - if (library != null && translatorOptionsMatch(library, options)) { + if (library != null && checkBinaryCompatibility(library)) { compiledLibrary = generateCompiledLibrary(library); - if (compiledLibrary != null) { - this.cacheLibrary(compiledLibrary); - } } return compiledLibrary; @@ -358,7 +341,8 @@ private CompiledLibrary generateCompiledLibrary(Library library) { if (library.getStatements() != null && library.getStatements().getDef() != null) { for (ExpressionDef expressionDef : library.getStatements().getDef()) { - //to do implement an ElmTypeInferencingVisitor; make sure that the resultType is set for each node + // to do implement an ElmTypeInferencingVisitor; make sure that the resultType + // is set for each node if (expressionDef.getResultType() != null) { compiledLibrary.add(expressionDef); } else { @@ -379,34 +363,109 @@ private CompiledLibrary generateCompiledLibrary(Library library) { return null; } - protected Boolean translatorOptionsMatch(Library library, CqlTranslatorOptions options) { - EnumSet translatorOptions = TranslatorOptionsUtil.getTranslatorOptions(library); - if (translatorOptions == null) { + protected Boolean compilerOptionsMatch(Library library) { + Set compilerOptions = CompilerOptions.getCompilerOptions(library); + if (compilerOptions == null) { return false; } - return translatorOptions.equals(options.getOptions()); + return compilerOptions.equals(this.cqlCompilerOptions.getOptions()); } - public void beginCompilation(String libraryName) { - if (libraryName == null || libraryName.equals("")) { - throw new IllegalArgumentException("libraryName is null."); + private boolean checkBinaryCompatibility(Library library) { + if (library == null) { + return false; } - if (compilationStack.contains(libraryName)) { - throw new IllegalArgumentException(String.format("Circular library reference %s.", libraryName)); + return this.isSignatureCompatible(library) + && this.isVersionCompatible(library) + && this.compilerOptionsMatch(library); + } + + private boolean isSignatureCompatible(Library library) { + return !hasOverloadedFunctions(library) || hasSignature(library); + } + + private boolean hasOverloadedFunctions(Library library) { + if (library == null || library.getStatements() == null) { + return false; } - compilationStack.push(libraryName); + Set functionNames = new HashSet<>(); + for (ExpressionDef ed : library.getStatements().getDef()) { + if (ed instanceof FunctionDef) { + FunctionDef fd = (FunctionDef) ed; + var sig = new FunctionSig(fd.getName(), + fd.getOperand() == null ? 0 : fd.getOperand().size()); + if (functionNames.contains(sig)) { + return true; + } else { + functionNames.add(sig); + } + } + } + return false; } - public void endCompilation(String libraryName) { - if (libraryName == null || libraryName.equals("")) { - throw new IllegalArgumentException("libraryName is null."); + boolean hasSignature(Library library) { + if (library != null && library.getStatements() != null) { + // Just a quick top-level scan for signatures. To fully verify we'd have to + // recurse all + // the way down. At that point, let's just translate. + for (ExpressionDef ed : library.getStatements().getDef()) { + if (ed.getExpression() instanceof FunctionRef) { + FunctionRef fr = (FunctionRef) ed.getExpression(); + if (fr.getSignature() != null && !fr.getSignature().isEmpty()) { + return true; + } + } + } } + return false; + } - String currentLibraryName = compilationStack.pop(); - if (!libraryName.equals(currentLibraryName)) { - throw new IllegalArgumentException(String.format("Compilation stack imbalance for library %s.", libraryName)); + private boolean isVersionCompatible(Library library) { + if (!StringUtils.isEmpty(this.cqlCompilerOptions.getCompatibilityLevel())) { + if (library.getAnnotation() != null) { + String version = CompilerOptions.getCompilerVersion(library); + if (version != null) { + return version.equals(this.cqlCompilerOptions.getCompatibilityLevel()); + } + } } + + return false; } + + static class FunctionSig { + + private final String name; + private final int numArguments; + + public FunctionSig(String name, int numArguments) { + this.name = name; + this.numArguments = numArguments; + } + + @Override + public int hashCode() { + final int prime = 31; + int result = 1; + result = prime * result + name.hashCode(); + result = prime * result + numArguments; + return result; + } + + @Override + public boolean equals(Object obj) { + if (this == obj) + return true; + if (obj == null) + return false; + if (getClass() != obj.getClass()) + return false; + FunctionSig other = (FunctionSig) obj; + return other.name.equals(this.name) && other.numArguments == this.numArguments; + } + } + } diff --git a/Src/java/cql-to-elm/src/main/java/org/cqframework/cql/cql2elm/LibrarySourceProvider.java b/Src/java/cql-to-elm/src/main/java/org/cqframework/cql/cql2elm/LibrarySourceProvider.java index 268d0256f..19f4b7728 100644 --- a/Src/java/cql-to-elm/src/main/java/org/cqframework/cql/cql2elm/LibrarySourceProvider.java +++ b/Src/java/cql-to-elm/src/main/java/org/cqframework/cql/cql2elm/LibrarySourceProvider.java @@ -7,14 +7,6 @@ public interface LibrarySourceProvider { InputStream getLibrarySource(VersionedIdentifier libraryIdentifier); - default boolean isLibraryContentAvailable(VersionedIdentifier libraryIdentifier, LibraryContentType type) { - if (LibraryContentType.CQL != type) { - return false; - } - - return getLibrarySource(libraryIdentifier) != null; - } - default InputStream getLibraryContent(VersionedIdentifier libraryIdentifier, LibraryContentType type) { if (LibraryContentType.CQL == type) { return getLibrarySource(libraryIdentifier); diff --git a/Src/java/cql-to-elm/src/main/java/org/cqframework/cql/cql2elm/PriorityLibrarySourceLoader.java b/Src/java/cql-to-elm/src/main/java/org/cqframework/cql/cql2elm/PriorityLibrarySourceLoader.java index 6d5f04a59..7e7351c1e 100644 --- a/Src/java/cql-to-elm/src/main/java/org/cqframework/cql/cql2elm/PriorityLibrarySourceLoader.java +++ b/Src/java/cql-to-elm/src/main/java/org/cqframework/cql/cql2elm/PriorityLibrarySourceLoader.java @@ -88,19 +88,6 @@ public InputStream getLibraryContent(VersionedIdentifier libraryIdentifier, Libr return null; } - @Override - public boolean isLibraryContentAvailable(VersionedIdentifier libraryIdentifier, LibraryContentType type) { - validateInput(libraryIdentifier, type); - - for (LibrarySourceProvider provider : getProviders()) { - if (provider.isLibraryContentAvailable(libraryIdentifier, type)) { - return true; - } - } - - return false; - } - private NamespaceManager namespaceManager; @Override diff --git a/Src/java/cql-to-elm/src/main/java/org/cqframework/cql/cql2elm/TranslatorOptionsUtil.java b/Src/java/cql-to-elm/src/main/java/org/cqframework/cql/cql2elm/TranslatorOptionsUtil.java deleted file mode 100644 index c7146d26f..000000000 --- a/Src/java/cql-to-elm/src/main/java/org/cqframework/cql/cql2elm/TranslatorOptionsUtil.java +++ /dev/null @@ -1,70 +0,0 @@ -package org.cqframework.cql.cql2elm; - -import org.hl7.cql_annotations.r1.CqlToElmBase; -import org.hl7.cql_annotations.r1.CqlToElmInfo; -import org.hl7.elm.r1.Library; - -import java.util.EnumSet; -import java.util.LinkedHashMap; -import java.util.List; - -import static java.util.Objects.requireNonNull; - -/** - * This class provides functions for extracting and parsing CQL Translator Options from - * a Library - */ -public class TranslatorOptionsUtil { - - /** - * Gets the translator options used to generate an elm Library. - * - * Returns null if the translator options could not be determined. - * (for example, the Library was translated without annotations) - * @param library The library to extracts the options from. - * @return The set of options used to translate the library. - */ - public static EnumSet getTranslatorOptions(Library library) { - requireNonNull(library, "library can not be null"); - if (library.getAnnotation() == null || library.getAnnotation().isEmpty()) { - return null; - } - - String translatorOptions = getTranslatorOptions(library.getAnnotation()); - return parseTranslatorOptions(translatorOptions); - } - - private static String getTranslatorOptions(List annotations){ - for (CqlToElmBase base : annotations) { - if (base instanceof CqlToElmInfo) { - if (((CqlToElmInfo)base).getTranslatorOptions() != null) { - return ((CqlToElmInfo)base).getTranslatorOptions(); - } - } - } - - return null; - } - - /** - * Parses a string representing CQL Translator Options into an EnumSet. The string is expected - * to be a comma delimited list of values from the CqlTranslator.Options enumeration. - * For example "EnableListPromotion, EnableListDemotion". - * @param translatorOptions the string to parse - * @return the set of options - */ - public static EnumSet parseTranslatorOptions(String translatorOptions) { - if (translatorOptions == null || translatorOptions.isEmpty()) { - return null; - } - - EnumSet optionSet = EnumSet.noneOf(CqlTranslatorOptions.Options.class); - String[] options = translatorOptions.trim().split(","); - - for (String option : options) { - optionSet.add(CqlTranslatorOptions.Options.valueOf(option)); - } - - return optionSet; - } -} diff --git a/Src/java/cql-to-elm/src/main/java/org/cqframework/cql/cql2elm/model/InstantiationResult.java b/Src/java/cql-to-elm/src/main/java/org/cqframework/cql/cql2elm/model/InstantiationResult.java index 59764d442..6159f93c3 100644 --- a/Src/java/cql-to-elm/src/main/java/org/cqframework/cql/cql2elm/model/InstantiationResult.java +++ b/Src/java/cql-to-elm/src/main/java/org/cqframework/cql/cql2elm/model/InstantiationResult.java @@ -1,7 +1,5 @@ package org.cqframework.cql.cql2elm.model; -import java.util.ArrayList; -import java.util.List; /** * Created by Bryn on 12/22/2016. diff --git a/Src/java/cql-to-elm/src/test/java/org/cqframework/cql/cql2elm/CMS146ElmTest.java b/Src/java/cql-to-elm/src/test/java/org/cqframework/cql/cql2elm/CMS146ElmTest.java index c5a37b46c..1d8dee703 100644 --- a/Src/java/cql-to-elm/src/test/java/org/cqframework/cql/cql2elm/CMS146ElmTest.java +++ b/Src/java/cql-to-elm/src/test/java/org/cqframework/cql/cql2elm/CMS146ElmTest.java @@ -1,5 +1,7 @@ package org.cqframework.cql.cql2elm; +import org.cqframework.cql.cql2elm.CqlCompilerException.ErrorSeverity; +import org.cqframework.cql.cql2elm.LibraryBuilder.SignatureLevel; import org.cqframework.cql.elm.tracking.TrackBack; import org.hl7.elm.r1.*; import org.testng.annotations.BeforeTest; @@ -25,7 +27,7 @@ public class CMS146ElmTest { @BeforeTest public void setup() throws IOException { ModelManager modelManager = new ModelManager(); - translator = CqlTranslator.fromStream(CMS146ElmTest.class.getResourceAsStream("CMS146v2_Test_CQM.cql"), modelManager, new LibraryManager(modelManager)); + translator = CqlTranslator.fromStream(CMS146ElmTest.class.getResourceAsStream("CMS146v2_Test_CQM.cql"), new LibraryManager(modelManager, new CqlCompilerOptions(ErrorSeverity.Warning, SignatureLevel.None))); assertThat(translator.getErrors().size(), is(0)); library = translator.toELM(); of = new ObjectFactory(); diff --git a/Src/java/cql-to-elm/src/test/java/org/cqframework/cql/cql2elm/CMS146JsonTest.java b/Src/java/cql-to-elm/src/test/java/org/cqframework/cql/cql2elm/CMS146JsonTest.java index b8fcb613e..803da8981 100644 --- a/Src/java/cql-to-elm/src/test/java/org/cqframework/cql/cql2elm/CMS146JsonTest.java +++ b/Src/java/cql-to-elm/src/test/java/org/cqframework/cql/cql2elm/CMS146JsonTest.java @@ -1,5 +1,7 @@ package org.cqframework.cql.cql2elm; +import org.cqframework.cql.cql2elm.CqlCompilerException.ErrorSeverity; +import org.cqframework.cql.cql2elm.LibraryBuilder.SignatureLevel; import org.testng.annotations.Test; import java.io.File; @@ -19,7 +21,7 @@ public void testCms146() throws IOException { File cms146 = new File(URLDecoder.decode(CMS146JsonTest.class.getResource("CMS146v2_Test_CQM.cql").getFile(), "UTF-8")); ModelManager modelManager = new ModelManager(); - CqlTranslator translator = CqlTranslator.fromFile(cms146, modelManager, new LibraryManager(modelManager)); + CqlTranslator translator = CqlTranslator.fromFile(cms146, new LibraryManager(modelManager, new CqlCompilerOptions(ErrorSeverity.Warning, SignatureLevel.None))); String actualJson = translator.toJson(); assertThat(actualJson, sameJSONAs(expectedJson)); } diff --git a/Src/java/cql-to-elm/src/test/java/org/cqframework/cql/cql2elm/CommentTests.java b/Src/java/cql-to-elm/src/test/java/org/cqframework/cql/cql2elm/CommentTests.java index 344c3e3b2..033caa6ca 100644 --- a/Src/java/cql-to-elm/src/test/java/org/cqframework/cql/cql2elm/CommentTests.java +++ b/Src/java/cql-to-elm/src/test/java/org/cqframework/cql/cql2elm/CommentTests.java @@ -20,15 +20,11 @@ import static org.junit.Assert.assertTrue; public class CommentTests { - @BeforeClass - public void Setup() { - // Reset test utils to clear any models loaded by other tests - TestUtils.reset(); - } + @Test public void testComments() throws IOException { - CqlTranslator translator = TestUtils.runSemanticTest("TestComments.cql", 0, CqlTranslatorOptions.Options.EnableAnnotations); + CqlTranslator translator = TestUtils.runSemanticTest("TestComments.cql", 0, CqlCompilerOptions.Options.EnableAnnotations); CompiledLibrary library = translator.getTranslatedLibrary(); assertThat(library.getLibrary().getAnnotation(), notNullValue()); diff --git a/Src/java/cql-to-elm/src/test/java/org/cqframework/cql/cql2elm/Cql2ElmVisitorTest.java b/Src/java/cql-to-elm/src/test/java/org/cqframework/cql/cql2elm/Cql2ElmVisitorTest.java index 29aaee668..4ddbbb96a 100644 --- a/Src/java/cql-to-elm/src/test/java/org/cqframework/cql/cql2elm/Cql2ElmVisitorTest.java +++ b/Src/java/cql-to-elm/src/test/java/org/cqframework/cql/cql2elm/Cql2ElmVisitorTest.java @@ -3,7 +3,6 @@ import org.cqframework.cql.cql2elm.model.CompiledLibrary; import org.cqframework.cql.elm.tracking.Trackable; import org.hl7.elm.r1.*; -import org.testng.annotations.BeforeClass; import org.testng.annotations.Test; import java.io.IOException; @@ -21,12 +20,6 @@ import static org.testng.Assert.assertTrue; public class Cql2ElmVisitorTest { - @BeforeClass - public void Setup() { - // Reset test utils to clear any models loaded by other tests - reset(); - } - @Test public void testLet(){ ExpressionDef def = (ExpressionDef) visitData("define b : true"); diff --git a/Src/java/cql-to-elm/src/test/java/org/cqframework/cql/cql2elm/ElmSupportTest.java b/Src/java/cql-to-elm/src/test/java/org/cqframework/cql/cql2elm/ElmSupportTest.java index 4c50f640a..d7fde9ce7 100644 --- a/Src/java/cql-to-elm/src/test/java/org/cqframework/cql/cql2elm/ElmSupportTest.java +++ b/Src/java/cql-to-elm/src/test/java/org/cqframework/cql/cql2elm/ElmSupportTest.java @@ -28,17 +28,16 @@ public void tearDown() { @Test public void testIncludedLibraryWithJsonElm() { - CqlTranslator translator = null; - libraryManager = new LibraryManager(modelManager); + CqlCompilerOptions options = new CqlCompilerOptions( CqlCompilerException.ErrorSeverity.Info, + SignatureLevel.All); + libraryManager = new LibraryManager(modelManager, options); + libraryManager.getLibrarySourceLoader().registerProvider(new TestLibrarySourceProvider()); try { - CqlTranslatorOptions options = createOptions(); - translator = CqlTranslator.fromStream(LibraryTests.class.getResourceAsStream("LibraryTests/ReferencingLibraryJsonElm.cql"), - modelManager, - libraryManager, - CqlCompilerException.ErrorSeverity.Info, - SignatureLevel.All, - options.getOptions().toArray(new CqlTranslatorOptions.Options[0])); + + var translator = CqlTranslator.fromStream(LibraryTests.class.getResourceAsStream("LibraryTests/ReferencingLibraryJsonElm.cql"), + libraryManager + ); assertTrue(translator.getErrors().size() > 0); @@ -49,17 +48,15 @@ public void testIncludedLibraryWithJsonElm() { @Test public void testIncludedLibraryWithXmlElm() { - CqlTranslator translator = null; - libraryManager = new LibraryManager(modelManager); + CqlCompilerOptions options = new CqlCompilerOptions( CqlCompilerException.ErrorSeverity.Info, + SignatureLevel.All); + libraryManager = new LibraryManager(modelManager, options); libraryManager.getLibrarySourceLoader().registerProvider(new TestLibrarySourceProvider()); - CqlTranslatorOptions options = createOptions(); + try { - translator = CqlTranslator.fromStream(LibraryTests.class.getResourceAsStream("LibraryTests/ReferencingLibraryXmlElm.cql"), - modelManager, - libraryManager, - CqlCompilerException.ErrorSeverity.Info, - SignatureLevel.All, options.getOptions().toArray(new CqlTranslatorOptions.Options[0])); + var translator = CqlTranslator.fromStream(LibraryTests.class.getResourceAsStream("LibraryTests/ReferencingLibraryXmlElm.cql"), + libraryManager); assertTrue(translator.getErrors().size() > 0); @@ -70,17 +67,13 @@ public void testIncludedLibraryWithXmlElm() { @Test public void testIncludedLibraryWithJsonWithNullTypeSpecifierElm() { - CqlTranslator translator = null; - libraryManager = new LibraryManager(modelManager); + CqlCompilerOptions options = new CqlCompilerOptions( CqlCompilerException.ErrorSeverity.Info, + SignatureLevel.All); + libraryManager = new LibraryManager(modelManager, options); libraryManager.getLibrarySourceLoader().registerProvider(new TestLibrarySourceProvider()); try { - CqlTranslatorOptions options = createOptions(); - translator = CqlTranslator.fromStream(LibraryTests.class.getResourceAsStream("LibraryTests/ReferencingLibraryWithNullTypeSpecifierJsonElm.cql"), - modelManager, - libraryManager, - CqlCompilerException.ErrorSeverity.Info, - SignatureLevel.All, - options.getOptions().toArray(new CqlTranslatorOptions.Options[0])); + var translator = CqlTranslator.fromStream(LibraryTests.class.getResourceAsStream("LibraryTests/ReferencingLibraryWithNullTypeSpecifierJsonElm.cql"), + libraryManager); assertTrue(translator.getErrors().size() > 0); @@ -89,15 +82,15 @@ public void testIncludedLibraryWithJsonWithNullTypeSpecifierElm() { } } - private CqlTranslatorOptions createOptions() { - CqlTranslatorOptions result = new CqlTranslatorOptions(); - result.setOptions(CqlTranslatorOptions.Options.EnableDateRangeOptimization, - CqlTranslatorOptions.Options.EnableAnnotations, - CqlTranslatorOptions.Options.EnableLocators, - CqlTranslatorOptions.Options.EnableResultTypes, - CqlTranslatorOptions.Options.DisableListDemotion, - CqlTranslatorOptions.Options.DisableListPromotion, - CqlTranslatorOptions.Options.DisableMethodInvocation); + private CqlCompilerOptions createOptions() { + CqlCompilerOptions result = new CqlCompilerOptions(); + result.setOptions(CqlCompilerOptions.Options.EnableDateRangeOptimization, + CqlCompilerOptions.Options.EnableAnnotations, + CqlCompilerOptions.Options.EnableLocators, + CqlCompilerOptions.Options.EnableResultTypes, + CqlCompilerOptions.Options.DisableListDemotion, + CqlCompilerOptions.Options.DisableListPromotion, + CqlCompilerOptions.Options.DisableMethodInvocation); return result; } diff --git a/Src/java/cql-to-elm/src/test/java/org/cqframework/cql/cql2elm/EscapeSequenceTests.java b/Src/java/cql-to-elm/src/test/java/org/cqframework/cql/cql2elm/EscapeSequenceTests.java index dcbc22241..29a58c398 100644 --- a/Src/java/cql-to-elm/src/test/java/org/cqframework/cql/cql2elm/EscapeSequenceTests.java +++ b/Src/java/cql-to-elm/src/test/java/org/cqframework/cql/cql2elm/EscapeSequenceTests.java @@ -25,7 +25,7 @@ public class EscapeSequenceTests { public void setup() throws IOException { ModelManager modelManager = new ModelManager(); LibraryManager libraryManager = new LibraryManager(modelManager); - CqlTranslator translator = CqlTranslator.fromStream(org.cqframework.cql.cql2elm.EscapeSequenceTests.class.getResourceAsStream("EscapeSequenceTests.cql"), modelManager, libraryManager); + CqlTranslator translator = CqlTranslator.fromStream(org.cqframework.cql.cql2elm.EscapeSequenceTests.class.getResourceAsStream("EscapeSequenceTests.cql"), libraryManager); assertThat(translator.getErrors().size(), is(0)); Library library = translator.toELM(); defs = new HashMap<>(); diff --git a/Src/java/cql-to-elm/src/test/java/org/cqframework/cql/cql2elm/EscapeSequenceWithBacktickTests.java b/Src/java/cql-to-elm/src/test/java/org/cqframework/cql/cql2elm/EscapeSequenceWithBacktickTests.java index 58ac27e9b..7eba853a8 100644 --- a/Src/java/cql-to-elm/src/test/java/org/cqframework/cql/cql2elm/EscapeSequenceWithBacktickTests.java +++ b/Src/java/cql-to-elm/src/test/java/org/cqframework/cql/cql2elm/EscapeSequenceWithBacktickTests.java @@ -25,7 +25,7 @@ public class EscapeSequenceWithBacktickTests { public void setup() throws IOException { ModelManager modelManager = new ModelManager(); LibraryManager libraryManager = new LibraryManager(modelManager); - CqlTranslator translator = CqlTranslator.fromStream(org.cqframework.cql.cql2elm.EscapeSequenceTests.class.getResourceAsStream("EscapeSequenceWithBacktickTests.cql"), modelManager, libraryManager); + CqlTranslator translator = CqlTranslator.fromStream(org.cqframework.cql.cql2elm.EscapeSequenceTests.class.getResourceAsStream("EscapeSequenceWithBacktickTests.cql"), libraryManager); assertThat(translator.getErrors().size(), is(0)); Library library = translator.toELM(); defs = new HashMap<>(); diff --git a/Src/java/cql-to-elm/src/test/java/org/cqframework/cql/cql2elm/IncludedSignatureOutputTests.java b/Src/java/cql-to-elm/src/test/java/org/cqframework/cql/cql2elm/IncludedSignatureOutputTests.java index fb6966de1..338cdc7b0 100644 --- a/Src/java/cql-to-elm/src/test/java/org/cqframework/cql/cql2elm/IncludedSignatureOutputTests.java +++ b/Src/java/cql-to-elm/src/test/java/org/cqframework/cql/cql2elm/IncludedSignatureOutputTests.java @@ -22,9 +22,11 @@ public class IncludedSignatureOutputTests { private Library getLibrary(LibraryBuilder.SignatureLevel signatureLevel) throws IOException { File testFile = new File(URLDecoder.decode(Cql2ElmVisitorTest.class.getResource("SignatureTests/IncludedSignatureOutputTests.cql").getFile(), "UTF-8")); ModelManager modelManager = new ModelManager(); - LibraryManager libraryManager = new LibraryManager(modelManager); + + var compilerOptions = new CqlCompilerOptions(CqlCompilerException.ErrorSeverity.Info, signatureLevel); + LibraryManager libraryManager = new LibraryManager(modelManager, compilerOptions); libraryManager.getLibrarySourceLoader().registerProvider(new TestLibrarySourceProvider("SignatureTests")); - CqlTranslator translator = CqlTranslator.fromFile(testFile, modelManager, libraryManager, CqlCompilerException.ErrorSeverity.Info, signatureLevel); + CqlTranslator translator = CqlTranslator.fromFile(testFile, libraryManager); for (CqlCompilerException error : translator.getErrors()) { System.err.println(String.format("(%d,%d): %s", error.getLocator().getStartLine(), error.getLocator().getStartChar(), error.getMessage())); diff --git a/Src/java/cql-to-elm/src/test/java/org/cqframework/cql/cql2elm/IncludedSignatureWithAliasOutputTests.java b/Src/java/cql-to-elm/src/test/java/org/cqframework/cql/cql2elm/IncludedSignatureWithAliasOutputTests.java index bd1f439f1..0175907de 100644 --- a/Src/java/cql-to-elm/src/test/java/org/cqframework/cql/cql2elm/IncludedSignatureWithAliasOutputTests.java +++ b/Src/java/cql-to-elm/src/test/java/org/cqframework/cql/cql2elm/IncludedSignatureWithAliasOutputTests.java @@ -19,9 +19,10 @@ public class IncludedSignatureWithAliasOutputTests { private Library getLibrary(LibraryBuilder.SignatureLevel signatureLevel) throws IOException { File testFile = new File(URLDecoder.decode(Cql2ElmVisitorTest.class.getResource("SignatureTests/IncludedSignatureWithAliasOutputTests.cql").getFile(), "UTF-8")); ModelManager modelManager = new ModelManager(); - LibraryManager libraryManager = new LibraryManager(modelManager); + var options = new CqlCompilerOptions(CqlCompilerException.ErrorSeverity.Info, signatureLevel); + LibraryManager libraryManager = new LibraryManager(modelManager, options); libraryManager.getLibrarySourceLoader().registerProvider(new TestLibrarySourceProvider("SignatureTests")); - CqlTranslator translator = CqlTranslator.fromFile(testFile, modelManager, libraryManager, CqlCompilerException.ErrorSeverity.Info, signatureLevel); + CqlTranslator translator = CqlTranslator.fromFile(testFile, libraryManager); for (CqlCompilerException error : translator.getErrors()) { System.err.println(String.format("(%d,%d): %s", error.getLocator().getStartLine(), error.getLocator().getStartChar(), error.getMessage())); diff --git a/Src/java/cql-to-elm/src/test/java/org/cqframework/cql/cql2elm/LibraryTests.java b/Src/java/cql-to-elm/src/test/java/org/cqframework/cql/cql2elm/LibraryTests.java index 2ae9cdaf6..a9af6ba87 100644 --- a/Src/java/cql-to-elm/src/test/java/org/cqframework/cql/cql2elm/LibraryTests.java +++ b/Src/java/cql-to-elm/src/test/java/org/cqframework/cql/cql2elm/LibraryTests.java @@ -11,6 +11,7 @@ import java.util.HashMap; import java.util.Map; import org.cqframework.cql.cql2elm.LibraryBuilder.SignatureLevel; +import org.cqframework.cql.gen.cqlBaseListener; import org.hl7.cql_annotations.r1.CqlToElmError; import org.hl7.elm.r1.*; import org.testng.annotations.AfterClass; @@ -38,39 +39,38 @@ public void tearDown() { public void testLibraryReferences() { CqlTranslator translator = null; try { - translator = CqlTranslator.fromStream(LibraryTests.class.getResourceAsStream("LibraryTests/ReferencingLibrary.cql"), modelManager, libraryManager); + translator = CqlTranslator.fromStream(LibraryTests.class.getResourceAsStream("LibraryTests/ReferencingLibrary.cql"), libraryManager); assertThat(translator.getErrors().size(), is(0)); } catch (IOException e) { e.printStackTrace(); } } - @Test - public void testLibraryReferencesWithCacheDisabled() { - CqlTranslator translator = null; - try { - translator = CqlTranslator.fromStream(LibraryTests.class.getResourceAsStream("LibraryTests/ReferencingLibrary.cql"), modelManager, libraryManager.withDisableCache()); - assertThat(translator.getErrors().size(), is(0)); - } catch (IOException e) { - e.printStackTrace(); - } - } + // @Test + // public void testLibraryReferencesWithCacheDisabled() { + // CqlTranslator translator = null; + // try { + // translator = CqlTranslator.fromStream(LibraryTests.class.getResourceAsStream("LibraryTests/ReferencingLibrary.cql"), modelManager, libraryManager.withDisableCache()); + // assertThat(translator.getErrors().size(), is(0)); + // } catch (IOException e) { + // e.printStackTrace(); + // } + // } @Test public void testIncludedLibraryWithSignatures() { - CqlCompiler compiler = null; - libraryManager = new LibraryManager(modelManager); + var compilerOptions = new CqlCompilerOptions(CqlCompilerException.ErrorSeverity.Info, + SignatureLevel.All); + libraryManager = new LibraryManager(modelManager, compilerOptions); libraryManager.getLibrarySourceLoader().registerProvider(new TestLibrarySourceProvider()); try { - compiler = new CqlCompiler(modelManager, libraryManager); - compiler.run(LibraryTests.class.getResourceAsStream("LibraryTests/ReferencingLibrary.cql"), - CqlCompilerException.ErrorSeverity.Info, - SignatureLevel.All); + var compiler = new CqlCompiler(libraryManager); + compiler.run(LibraryTests.class.getResourceAsStream("LibraryTests/ReferencingLibrary.cql")); assertThat(compiler.getErrors().size(), is(0)); Map includedLibDefs = new HashMap<>(); - Map includedLibraries = compiler.getLibraries(); + var includedLibraries = compiler.getLibraries(); includedLibraries.values().stream().forEach(includedLibrary -> { if (includedLibrary.getStatements() != null) { for (ExpressionDef def : includedLibrary.getStatements().getDef()) { @@ -91,7 +91,10 @@ public void testIncludedLibraryWithSignatures() { public void testAlphanumericVersionIssue641() { // the issue identified with using DefaultLibrarySourceLoader only; thus creating a fresh set below ModelManager modelManager = new ModelManager(); - LibraryManager libraryManager = new LibraryManager(modelManager); + + var compilerOptions = new CqlCompilerOptions(CqlCompilerException.ErrorSeverity.Info, + SignatureLevel.All); + LibraryManager libraryManager = new LibraryManager(modelManager, compilerOptions); InputStream translationTestFile = LibraryTests.class.getResourceAsStream("LibraryTests/Issue641.cql"); libraryManager.getLibrarySourceLoader().registerProvider( @@ -100,15 +103,13 @@ public void testAlphanumericVersionIssue641() { ))); try { - CqlCompiler compiler = new CqlCompiler(modelManager, libraryManager); - compiler.run(translationTestFile, - CqlCompilerException.ErrorSeverity.Info, - SignatureLevel.All); + CqlCompiler compiler = new CqlCompiler(libraryManager); + compiler.run(translationTestFile); System.out.println(compiler.getErrors()); Map includedLibDefs = new HashMap<>(); - Map includedLibraries = compiler.getLibraries(); + var includedLibraries = compiler.getLibraries(); includedLibraries.values().stream().forEach(includedLibrary -> { if (includedLibrary.getStatements() != null) { for (ExpressionDef def : includedLibrary.getStatements().getDef()) { @@ -129,7 +130,7 @@ public void testAlphanumericVersionIssue641() { public void testInvalidLibraryReferences() { CqlTranslator translator = null; try { - translator = CqlTranslator.fromStream(LibraryTests.class.getResourceAsStream("LibraryTests/InvalidReferencingLibrary.cql"), modelManager, libraryManager); + translator = CqlTranslator.fromStream(LibraryTests.class.getResourceAsStream("LibraryTests/InvalidReferencingLibrary.cql"), libraryManager); assertThat(translator.getErrors().size(), is(not(0))); } catch (IOException e) { e.printStackTrace(); @@ -140,7 +141,7 @@ public void testInvalidLibraryReferences() { public void testInvalidLibraryReference() { CqlTranslator translator = null; try { - translator = CqlTranslator.fromStream(LibraryTests.class.getResourceAsStream("LibraryTests/InvalidLibraryReference.cql"), modelManager, libraryManager); + translator = CqlTranslator.fromStream(LibraryTests.class.getResourceAsStream("LibraryTests/InvalidLibraryReference.cql"), libraryManager); assertThat(translator.getErrors().size(), is(not(0))); } catch (IOException e) { e.printStackTrace(); @@ -151,7 +152,7 @@ public void testInvalidLibraryReference() { public void testDuplicateExpressionLibrary() { CqlTranslator translator = null; try { - translator = CqlTranslator.fromStream(LibraryTests.class.getResourceAsStream("LibraryTests/DuplicateExpressionLibrary.cql"), modelManager, libraryManager); + translator = CqlTranslator.fromStream(LibraryTests.class.getResourceAsStream("LibraryTests/DuplicateExpressionLibrary.cql"), libraryManager); assertThat(translator.getErrors().size(), is(1)); } catch (IOException e) { e.printStackTrace(); @@ -162,10 +163,10 @@ public void testDuplicateExpressionLibrary() { public void testMissingLibrary() { CqlTranslator translator = null; try { - translator = CqlTranslator.fromStream(LibraryTests.class.getResourceAsStream("LibraryTests/MissingLibrary.cql"), modelManager, libraryManager); + translator = CqlTranslator.fromStream(LibraryTests.class.getResourceAsStream("LibraryTests/MissingLibrary.cql"), libraryManager); assertThat(translator.getErrors().size(), is(1)); assertThat(translator.getErrors().get(0), instanceOf(CqlCompilerException.class)); - assertThat(translator.getErrors().get(0).getCause(), instanceOf(CqlTranslatorIncludeException.class)); + assertThat(translator.getErrors().get(0).getCause(), instanceOf(CqlIncludeException.class)); } catch (IOException e) { e.printStackTrace(); } @@ -175,7 +176,7 @@ public void testMissingLibrary() { public void testInvalidBaseLibrary() { CqlTranslator translator = null; try { - translator = CqlTranslator.fromStream(LibraryTests.class.getResourceAsStream("LibraryTests/ReferencingInvalidBaseLibrary.cql"), modelManager, libraryManager); + translator = CqlTranslator.fromStream(LibraryTests.class.getResourceAsStream("LibraryTests/ReferencingInvalidBaseLibrary.cql"), libraryManager); assertThat(translator.getErrors().size(), is(1)); assertThat(translator.getErrors().get(0), instanceOf(CqlCompilerException.class)); assertThat(translator.getErrors().get(0).getLocator(), notNullValue()); @@ -205,7 +206,7 @@ public void testInvalidBaseLibrary() { public void testMixedVersionModelReferences() { CqlTranslator translator = null; try { - translator = CqlTranslator.fromStream(LibraryTests.class.getResourceAsStream("LibraryTests/TestMeasure.cql"), modelManager, libraryManager); + translator = CqlTranslator.fromStream(LibraryTests.class.getResourceAsStream("LibraryTests/TestMeasure.cql"), libraryManager); assertThat(translator.getErrors().size(), is(3)); for (CqlCompilerException error : translator.getErrors()) { @@ -221,17 +222,16 @@ public void testMixedVersionModelReferences() { public void testTranslatorOptionsFlowDownWithAnnotations() { try { // Test Annotations are created for both libraries - CqlCompiler compiler = null; - libraryManager = new LibraryManager(modelManager); - libraryManager.getLibrarySourceLoader().registerProvider(new TestLibrarySourceProvider()); - compiler = new CqlCompiler(modelManager, libraryManager); - compiler.run(LibraryTests.class.getResourceAsStream("LibraryTests/ReferencingLibrary.cql"), - CqlCompilerException.ErrorSeverity.Info, + var options = new CqlCompilerOptions(CqlCompilerException.ErrorSeverity.Info, SignatureLevel.All, - CqlTranslatorOptions.Options.EnableAnnotations); + CqlCompilerOptions.Options.EnableAnnotations); + libraryManager = new LibraryManager(modelManager, options); + libraryManager.getLibrarySourceLoader().registerProvider(new TestLibrarySourceProvider()); + var compiler = new CqlCompiler(libraryManager); + compiler.run(LibraryTests.class.getResourceAsStream("LibraryTests/ReferencingLibrary.cql")); assertThat(compiler.getErrors().size(), is(0)); - Map includedLibraries = compiler.getLibraries(); + var includedLibraries = compiler.getLibraries(); includedLibraries.values().stream().forEach(includedLibrary -> { // Ensure that some annotations are present. assertTrue(includedLibrary.getStatements().getDef().stream().filter(x -> x.getAnnotation().size() > 0).count() > 0); @@ -246,16 +246,14 @@ public void testTranslatorOptionsFlowDownWithoutAnnotations() { try { // Test Annotations are created for both libraries CqlCompiler compiler = null; - libraryManager = new LibraryManager(modelManager); + libraryManager = new LibraryManager(modelManager, new CqlCompilerOptions()); libraryManager.getLibrarySourceLoader().registerProvider(new TestLibrarySourceProvider()); - compiler = new CqlCompiler(modelManager, libraryManager); - compiler.run(LibraryTests.class.getResourceAsStream("LibraryTests/ReferencingLibrary.cql"), - CqlCompilerException.ErrorSeverity.Info, - SignatureLevel.All); + compiler = new CqlCompiler(libraryManager); + compiler.run(LibraryTests.class.getResourceAsStream("LibraryTests/ReferencingLibrary.cql")); assertThat(compiler.getErrors().size(), is(0)); - Map includedLibraries = compiler.getLibraries(); + var includedLibraries = compiler.getLibraries(); includedLibraries.values().stream().forEach(includedLibrary -> { // Ensure that no annotations are present. assertTrue(includedLibrary.getStatements().getDef().stream().filter(x -> x.getAnnotation().size() > 0).count() == 0); @@ -267,7 +265,7 @@ public void testTranslatorOptionsFlowDownWithoutAnnotations() { } @Test - public void testSynaxErrorWithNoLibrary() throws IOException { + public void testSyntaxErrorWithNoLibrary() throws IOException { // Syntax errors in anonymous libraries are reported with the name of the source file as the library identifier CqlTranslator translator = TestUtils.createTranslator("LibraryTests/SyntaxErrorWithNoLibrary.cql"); assertThat(translator.getErrors().size(), greaterThanOrEqualTo(1)); @@ -275,7 +273,7 @@ public void testSynaxErrorWithNoLibrary() throws IOException { } @Test - public void testSynaxErrorWithNoLibraryFromStream() throws IOException { + public void testSyntaxErrorWithNoLibraryFromStream() throws IOException { // Syntax errors in anonymous libraries are reported with the name of the source file as the library identifier CqlTranslator translator = TestUtils.createTranslatorFromStream("LibraryTests/SyntaxErrorWithNoLibrary.cql"); assertThat(translator.getErrors().size(), greaterThanOrEqualTo(1)); diff --git a/Src/java/cql-to-elm/src/test/java/org/cqframework/cql/cql2elm/ModelTests.java b/Src/java/cql-to-elm/src/test/java/org/cqframework/cql/cql2elm/ModelTests.java index 134e32581..c462ee13e 100644 --- a/Src/java/cql-to-elm/src/test/java/org/cqframework/cql/cql2elm/ModelTests.java +++ b/Src/java/cql-to-elm/src/test/java/org/cqframework/cql/cql2elm/ModelTests.java @@ -31,7 +31,7 @@ public void tearDown() { public void testModelInfo() { CqlTranslator translator = null; try { - translator = CqlTranslator.fromStream(ModelTests.class.getResourceAsStream("ModelTests/ModelTest.cql"), modelManager, new LibraryManager(modelManager)); + translator = CqlTranslator.fromStream(ModelTests.class.getResourceAsStream("ModelTests/ModelTest.cql"), new LibraryManager(modelManager)); Library library = translator.toELM(); assertThat(translator.getErrors().size(), is(0)); } catch (IOException e) { diff --git a/Src/java/cql-to-elm/src/test/java/org/cqframework/cql/cql2elm/ModelWithoutDefaultLoadersTests.java b/Src/java/cql-to-elm/src/test/java/org/cqframework/cql/cql2elm/ModelWithoutDefaultLoadersTests.java index 509ac9796..68e19409a 100644 --- a/Src/java/cql-to-elm/src/test/java/org/cqframework/cql/cql2elm/ModelWithoutDefaultLoadersTests.java +++ b/Src/java/cql-to-elm/src/test/java/org/cqframework/cql/cql2elm/ModelWithoutDefaultLoadersTests.java @@ -32,7 +32,7 @@ public void tearDown() { public void testModelInfo() { CqlTranslator translator = null; try { - translator = CqlTranslator.fromStream(ModelWithoutDefaultLoadersTests.class.getResourceAsStream("ModelTests/ModelTest.cql"), modelManager, new LibraryManager(modelManager)); + translator = CqlTranslator.fromStream(ModelWithoutDefaultLoadersTests.class.getResourceAsStream("ModelTests/ModelTest.cql"), new LibraryManager(modelManager)); Library library = translator.toELM(); assertThat(translator.getErrors().size(), is(0)); } catch (IOException e) { diff --git a/Src/java/cql-to-elm/src/test/java/org/cqframework/cql/cql2elm/NamespaceTests.java b/Src/java/cql-to-elm/src/test/java/org/cqframework/cql/cql2elm/NamespaceTests.java index 2fd25ea2e..9e4b7bc79 100644 --- a/Src/java/cql-to-elm/src/test/java/org/cqframework/cql/cql2elm/NamespaceTests.java +++ b/Src/java/cql-to-elm/src/test/java/org/cqframework/cql/cql2elm/NamespaceTests.java @@ -80,7 +80,7 @@ public void testNamespaceUriPart() { public void testLibraryReferences() { CqlTranslator translator = null; try { - translator = CqlTranslator.fromStream(defaultNamespaceInfo, NamespaceTests.class.getResourceAsStream("NamespaceTests/ReferencingLibrary.cql"), modelManager, libraryManager); + translator = CqlTranslator.fromStream(defaultNamespaceInfo, NamespaceTests.class.getResourceAsStream("NamespaceTests/ReferencingLibrary.cql"), libraryManager); assertThat(translator.getErrors().size(), is(0)); assertThat(translator.toELM().getIdentifier().getSystem(), is(defaultNamespaceInfo.getUri())); } catch (IOException e) { @@ -92,7 +92,7 @@ public void testLibraryReferences() { public void testInvalidLibraryReferences() { CqlTranslator translator = null; try { - translator = CqlTranslator.fromStream(defaultNamespaceInfo, NamespaceTests.class.getResourceAsStream("NamespaceTests/InvalidReferencingLibrary.cql"), modelManager, libraryManager); + translator = CqlTranslator.fromStream(defaultNamespaceInfo, NamespaceTests.class.getResourceAsStream("NamespaceTests/InvalidReferencingLibrary.cql"), libraryManager); assertThat(translator.getErrors().size(), is(not(0))); } catch (IOException e) { e.printStackTrace(); @@ -103,7 +103,7 @@ public void testInvalidLibraryReferences() { public void testInvalidLibraryReference() { CqlTranslator translator = null; try { - translator = CqlTranslator.fromStream(defaultNamespaceInfo, NamespaceTests.class.getResourceAsStream("NamespaceTests/InvalidLibraryReference.cql"), modelManager, libraryManager); + translator = CqlTranslator.fromStream(defaultNamespaceInfo, NamespaceTests.class.getResourceAsStream("NamespaceTests/InvalidLibraryReference.cql"), libraryManager); assertThat(translator.getErrors().size(), is(not(0))); } catch (IOException e) { e.printStackTrace(); @@ -114,7 +114,7 @@ public void testInvalidLibraryReference() { public void testInvalidBaseLibrary() { CqlTranslator translator = null; try { - translator = CqlTranslator.fromStream(defaultNamespaceInfo, NamespaceTests.class.getResourceAsStream("NamespaceTests/ReferencingInvalidBaseLibrary.cql"), modelManager, libraryManager); + translator = CqlTranslator.fromStream(defaultNamespaceInfo, NamespaceTests.class.getResourceAsStream("NamespaceTests/ReferencingInvalidBaseLibrary.cql"), libraryManager); assertThat(translator.getErrors().size(), is(1)); assertThat(translator.getErrors().get(0), instanceOf(CqlCompilerException.class)); assertThat(translator.getErrors().get(0).getLocator(), notNullValue()); @@ -144,7 +144,7 @@ public void testInvalidBaseLibrary() { @Test public void testMain() { try { - CqlTranslator translator = CqlTranslator.fromStream(defaultNamespaceInfo, NamespaceTests.class.getResourceAsStream("NamespaceTests/Main.cql"), modelManager, libraryManager); + CqlTranslator translator = CqlTranslator.fromStream(defaultNamespaceInfo, NamespaceTests.class.getResourceAsStream("NamespaceTests/Main.cql"), libraryManager); assertThat(translator.getErrors().size(), is(0)); assertThat(translator.toELM().getIdentifier().getId(), is("Main")); assertThat(translator.toELM().getIdentifier().getSystem(), is(defaultNamespaceInfo.getUri())); @@ -157,7 +157,7 @@ public void testMain() { @Test public void testReferencingMain() { try { - CqlTranslator translator = CqlTranslator.fromStream(defaultNamespaceInfo, NamespaceTests.class.getResourceAsStream("NamespaceTests/ReferencingMain.cql"), modelManager, libraryManager); + CqlTranslator translator = CqlTranslator.fromStream(defaultNamespaceInfo, NamespaceTests.class.getResourceAsStream("NamespaceTests/ReferencingMain.cql"), libraryManager); assertThat(translator.getErrors().size(), is(0)); assertThat(translator.toELM().getIdentifier().getId(), is("ReferencingMain")); assertThat(translator.toELM().getIdentifier().getSystem(), is(defaultNamespaceInfo.getUri())); @@ -176,7 +176,7 @@ public void testReferencingMain() { @Test public void testCoreMain() { try { - CqlTranslator translator = CqlTranslator.fromStream(coreNamespaceInfo, NamespaceTests.class.getResourceAsStream("NamespaceTests/Core/Main.cql"), modelManager, libraryManager); + CqlTranslator translator = CqlTranslator.fromStream(coreNamespaceInfo, NamespaceTests.class.getResourceAsStream("NamespaceTests/Core/Main.cql"), libraryManager); assertThat(translator.getErrors().size(), is(0)); assertThat(translator.toELM().getIdentifier().getId(), is("Main")); assertThat(translator.toELM().getIdentifier().getSystem(), is(coreNamespaceInfo.getUri())); @@ -189,7 +189,7 @@ public void testCoreMain() { @Test public void testCoreReferencingMain() { try { - CqlTranslator translator = CqlTranslator.fromStream(coreNamespaceInfo, NamespaceTests.class.getResourceAsStream("NamespaceTests/Core/ReferencingMain.cql"), modelManager, libraryManager); + CqlTranslator translator = CqlTranslator.fromStream(coreNamespaceInfo, NamespaceTests.class.getResourceAsStream("NamespaceTests/Core/ReferencingMain.cql"), libraryManager); assertThat(translator.getErrors().size(), is(0)); assertThat(translator.toELM().getIdentifier().getId(), is("ReferencingMain")); assertThat(translator.toELM().getIdentifier().getSystem(), is(coreNamespaceInfo.getUri())); @@ -208,7 +208,7 @@ public void testCoreReferencingMain() { @Test public void testSharedMain() { try { - CqlTranslator translator = CqlTranslator.fromStream(sharedNamespaceInfo, NamespaceTests.class.getResourceAsStream("NamespaceTests/Shared/Main.cql"), modelManager, libraryManager); + CqlTranslator translator = CqlTranslator.fromStream(sharedNamespaceInfo, NamespaceTests.class.getResourceAsStream("NamespaceTests/Shared/Main.cql"), libraryManager); assertThat(translator.getErrors().size(), is(0)); assertThat(translator.toELM().getIdentifier().getId(), is("Main")); assertThat(translator.toELM().getIdentifier().getSystem(), is(sharedNamespaceInfo.getUri())); @@ -228,7 +228,7 @@ public void testSharedMain() { @Test public void testSharedReferencingMain() { try { - CqlTranslator translator = CqlTranslator.fromStream(sharedNamespaceInfo, NamespaceTests.class.getResourceAsStream("NamespaceTests/Shared/ReferencingMain.cql"), modelManager, libraryManager); + CqlTranslator translator = CqlTranslator.fromStream(sharedNamespaceInfo, NamespaceTests.class.getResourceAsStream("NamespaceTests/Shared/ReferencingMain.cql"), libraryManager); assertThat(translator.getErrors().size(), is(0)); assertThat(translator.toELM().getIdentifier().getId(), is("ReferencingMain")); assertThat(translator.toELM().getIdentifier().getSystem(), is(sharedNamespaceInfo.getUri())); @@ -247,7 +247,7 @@ public void testSharedReferencingMain() { @Test public void testContentMain() { try { - CqlTranslator translator = CqlTranslator.fromStream(contentNamespaceInfo, NamespaceTests.class.getResourceAsStream("NamespaceTests/Content/Main.cql"), modelManager, libraryManager); + CqlTranslator translator = CqlTranslator.fromStream(contentNamespaceInfo, NamespaceTests.class.getResourceAsStream("NamespaceTests/Content/Main.cql"), libraryManager); assertThat(translator.getErrors().size(), is(0)); assertThat(translator.toELM().getIdentifier().getId(), is("Main")); assertThat(translator.toELM().getIdentifier().getSystem(), is(contentNamespaceInfo.getUri())); @@ -271,7 +271,7 @@ public void testContentMain() { @Test public void testContentReferencingMain() { try { - CqlTranslator translator = CqlTranslator.fromStream(contentNamespaceInfo, NamespaceTests.class.getResourceAsStream("NamespaceTests/Content/ReferencingMain.cql"), modelManager, libraryManager); + CqlTranslator translator = CqlTranslator.fromStream(contentNamespaceInfo, NamespaceTests.class.getResourceAsStream("NamespaceTests/Content/ReferencingMain.cql"), libraryManager); assertThat(translator.getErrors().size(), is(0)); assertThat(translator.toELM().getIdentifier().getId(), is("ReferencingMain")); assertThat(translator.toELM().getIdentifier().getSystem(), is(contentNamespaceInfo.getUri())); diff --git a/Src/java/cql-to-elm/src/test/java/org/cqframework/cql/cql2elm/OptionsTests.java b/Src/java/cql-to-elm/src/test/java/org/cqframework/cql/cql2elm/OptionsTests.java index ae20b6346..0e5ba3f64 100644 --- a/Src/java/cql-to-elm/src/test/java/org/cqframework/cql/cql2elm/OptionsTests.java +++ b/Src/java/cql-to-elm/src/test/java/org/cqframework/cql/cql2elm/OptionsTests.java @@ -12,7 +12,7 @@ public class OptionsTests { @Test public void testTranslatorOptions() throws IOException { - CqlTranslatorOptions options = CqlTranslatorOptions.defaultOptions(); + var options = CqlTranslatorOptions.defaultOptions(); StringWriter sw = new StringWriter(); CqlTranslatorOptionsMapper.toWriter(sw, options); String result = sw.toString(); diff --git a/Src/java/cql-to-elm/src/test/java/org/cqframework/cql/cql2elm/SemanticTests.java b/Src/java/cql-to-elm/src/test/java/org/cqframework/cql/cql2elm/SemanticTests.java index fe7693c42..d537eee66 100644 --- a/Src/java/cql-to-elm/src/test/java/org/cqframework/cql/cql2elm/SemanticTests.java +++ b/Src/java/cql-to-elm/src/test/java/org/cqframework/cql/cql2elm/SemanticTests.java @@ -276,12 +276,12 @@ public void shouldFail() throws IOException { @Test public void testCompatibilityLevel3() throws IOException { runSemanticTest("TestCompatibilityLevel3.cql", 1); - runSemanticTest("TestCompatibilityLevel3.cql", 0, new CqlTranslatorOptions().withCompatibilityLevel("1.3")); + runSemanticTest("TestCompatibilityLevel3.cql", 0, new CqlCompilerOptions().withCompatibilityLevel("1.3")); } @Test public void invalidEquality() throws IOException { - runSemanticTest("InvalidEquality.cql", 1, CqlTranslatorOptions.Options.DisableListPromotion); + runSemanticTest("InvalidEquality.cql", 1, CqlCompilerOptions.Options.DisableListPromotion); } @Test @@ -349,7 +349,7 @@ public void testIssue581() throws IOException { @Test public void testIssue405() throws IOException { - CqlTranslator translator = TestUtils.runSemanticTest("Issue405.cql", 0, CqlTranslatorOptions.Options.EnableAnnotations); + CqlTranslator translator = TestUtils.runSemanticTest("Issue405.cql", 0, CqlCompilerOptions.Options.EnableAnnotations); Library library = translator.toELM(); assertThat(library.getStatements().getDef().size(), equalTo(6)); assertThat(library.getStatements().getDef().get(3), instanceOf(ExpressionDef.class)); @@ -360,7 +360,7 @@ public void testIssue405() throws IOException { @Test public void testIssue395() throws IOException { - CqlTranslator translator = TestUtils.runSemanticTest("Issue395.cql", 0, CqlTranslatorOptions.Options.EnableAnnotations); + CqlTranslator translator = TestUtils.runSemanticTest("Issue395.cql", 0, CqlCompilerOptions.Options.EnableAnnotations); Library library = translator.toELM(); ExpressionDef expressionDef = (ExpressionDef) library.getStatements().getDef().get(2); assertThat(expressionDef.getExpression().getLocalId(), notNullValue()); @@ -377,7 +377,7 @@ public void testIssue587() throws IOException { @Test public void testIssue592() throws IOException { - TestUtils.runSemanticTest("Issue592.cql", 0, new CqlTranslatorOptions().withCompatibilityLevel("1.3")); + TestUtils.runSemanticTest("Issue592.cql", 0, new CqlCompilerOptions().withCompatibilityLevel("1.3")); } @Test @@ -501,7 +501,7 @@ define function EncountersWithServiceType(encounters List, valueSet S @Test public void testIssueEmptySourceInterval() throws IOException { - CqlTranslator translator = TestUtils.runSemanticTest("IssueEmptySourceInterval.cql", 1, CqlTranslatorOptions.Options.EnableAnnotations); + CqlTranslator translator = TestUtils.runSemanticTest("IssueEmptySourceInterval.cql", 1, CqlCompilerOptions.Options.EnableAnnotations); java.util.List exceptions = translator.getExceptions(); @@ -510,8 +510,8 @@ public void testIssueEmptySourceInterval() throws IOException { @Test public void TestVSCastFunction14() throws IOException { - CqlTranslatorOptions options = new CqlTranslatorOptions() - .withOptions(CqlTranslatorOptions.Options.EnableAnnotations, CqlTranslatorOptions.Options.DisableListDemotion, CqlTranslatorOptions.Options.DisableListPromotion, CqlTranslatorOptions.Options.DisableMethodInvocation) + CqlCompilerOptions options = new CqlCompilerOptions() + .withOptions(CqlCompilerOptions.Options.EnableAnnotations, CqlCompilerOptions.Options.DisableListDemotion, CqlCompilerOptions.Options.DisableListPromotion, CqlCompilerOptions.Options.DisableMethodInvocation) .withCompatibilityLevel("1.4"); CqlTranslator translator = TestUtils.runSemanticTest("TestVSCastFunction.cql", 0, options); ExpressionDef ed = translator.getTranslatedLibrary().resolveExpressionRef("TestConditionsViaFunction"); @@ -568,8 +568,8 @@ public void TestVSCastFunction14() throws IOException { @Test public void TestVSCastFunction15() throws IOException { // TODO: This test needs to pass, most likely by implicitly converting a ValueSet to a ValueSetRef? Or maybe a new explicit ELM operation? - CqlTranslatorOptions options = new CqlTranslatorOptions() - .withOptions(CqlTranslatorOptions.Options.DisableListDemotion, CqlTranslatorOptions.Options.DisableListPromotion, CqlTranslatorOptions.Options.DisableMethodInvocation); + CqlCompilerOptions options = new CqlCompilerOptions() + .withOptions(CqlCompilerOptions.Options.DisableListDemotion, CqlCompilerOptions.Options.DisableListPromotion, CqlCompilerOptions.Options.DisableMethodInvocation); CqlTranslator translator = TestUtils.runSemanticTest("TestVSCastFunction.cql", 0, options); ExpressionDef ed = translator.getTranslatedLibrary().resolveExpressionRef("TestConditionsViaFunction"); @@ -643,11 +643,11 @@ private CqlTranslator runSemanticTest(String testFileName, int expectedErrors) t return TestUtils.runSemanticTest(testFileName, expectedErrors); } - private CqlTranslator runSemanticTest(String testFileName, int expectedErrors, CqlTranslatorOptions.Options... options) throws IOException { + private CqlTranslator runSemanticTest(String testFileName, int expectedErrors, CqlCompilerOptions.Options... options) throws IOException { return TestUtils.runSemanticTest(testFileName, expectedErrors, options); } - private CqlTranslator runSemanticTest(String testFileName, int expectedErrors, CqlTranslatorOptions options) throws IOException { + private CqlTranslator runSemanticTest(String testFileName, int expectedErrors, CqlCompilerOptions options) throws IOException { return TestUtils.runSemanticTest(testFileName, expectedErrors, options); } } diff --git a/Src/java/cql-to-elm/src/test/java/org/cqframework/cql/cql2elm/SignatureOutputTests.java b/Src/java/cql-to-elm/src/test/java/org/cqframework/cql/cql2elm/SignatureOutputTests.java index 4a3e323ad..c2664aaea 100644 --- a/Src/java/cql-to-elm/src/test/java/org/cqframework/cql/cql2elm/SignatureOutputTests.java +++ b/Src/java/cql-to-elm/src/test/java/org/cqframework/cql/cql2elm/SignatureOutputTests.java @@ -22,7 +22,8 @@ public class SignatureOutputTests { private Library getLibrary(LibraryBuilder.SignatureLevel signatureLevel) throws IOException { File testFile = new File(URLDecoder.decode(Cql2ElmVisitorTest.class.getResource("SignatureTests/SignatureOutputTests.cql").getFile(), "UTF-8")); ModelManager modelManager = new ModelManager(); - CqlTranslator translator = CqlTranslator.fromFile(testFile, modelManager, new LibraryManager(modelManager), CqlCompilerException.ErrorSeverity.Info, signatureLevel); + var compilerOptions = new CqlCompilerOptions(CqlCompilerException.ErrorSeverity.Info, signatureLevel); + CqlTranslator translator = CqlTranslator.fromFile(testFile, new LibraryManager(modelManager, compilerOptions)); for (CqlCompilerException error : translator.getErrors()) { System.err.println(String.format("(%d,%d): %s", error.getLocator().getStartLine(), error.getLocator().getStartChar(), error.getMessage())); diff --git a/Src/java/cql-to-elm/src/test/java/org/cqframework/cql/cql2elm/TestLibrarySourceProvider.java b/Src/java/cql-to-elm/src/test/java/org/cqframework/cql/cql2elm/TestLibrarySourceProvider.java index 20ecd9cc8..cf37b4c6d 100644 --- a/Src/java/cql-to-elm/src/test/java/org/cqframework/cql/cql2elm/TestLibrarySourceProvider.java +++ b/Src/java/cql-to-elm/src/test/java/org/cqframework/cql/cql2elm/TestLibrarySourceProvider.java @@ -21,12 +21,6 @@ public InputStream getLibrarySource(VersionedIdentifier libraryIdentifier) { return getLibraryContent(libraryIdentifier, LibraryContentType.CQL); } - @Override - public boolean isLibraryContentAvailable(VersionedIdentifier libraryIdentifier, LibraryContentType type) { - return TestLibrarySourceProvider.class.getResource(getFileName(libraryIdentifier, type)) != null; - } - - @Override public InputStream getLibraryContent(VersionedIdentifier libraryIdentifier, LibraryContentType type) { return TestLibrarySourceProvider.class.getResourceAsStream(getFileName(libraryIdentifier, type)); diff --git a/Src/java/cql-to-elm/src/test/java/org/cqframework/cql/cql2elm/TestUtils.java b/Src/java/cql-to-elm/src/test/java/org/cqframework/cql/cql2elm/TestUtils.java index db9c3f900..184a61355 100644 --- a/Src/java/cql-to-elm/src/test/java/org/cqframework/cql/cql2elm/TestUtils.java +++ b/Src/java/cql-to-elm/src/test/java/org/cqframework/cql/cql2elm/TestUtils.java @@ -5,13 +5,12 @@ import org.antlr.v4.runtime.CommonTokenStream; import org.antlr.v4.runtime.TokenStream; import org.antlr.v4.runtime.tree.ParseTree; +import org.cqframework.cql.cql2elm.CqlCompilerException.ErrorSeverity; +import org.cqframework.cql.cql2elm.LibraryBuilder.SignatureLevel; import org.cqframework.cql.cql2elm.model.CompiledLibrary; import org.cqframework.cql.gen.cqlLexer; import org.cqframework.cql.gen.cqlParser; import org.cqframework.cql.cql2elm.preprocessor.CqlPreprocessorVisitor; -import org.fhir.ucum.UcumEssenceService; -import org.fhir.ucum.UcumException; -import org.fhir.ucum.UcumService; import org.hl7.cql.model.NamespaceInfo; import org.hl7.elm.r1.Library; @@ -28,54 +27,20 @@ public class TestUtils { - private static ModelManager modelManager; - private static LibraryManager libraryManager; - private static UcumService ucumService; - - private static void setup() { - modelManager = new ModelManager(); - libraryManager = new LibraryManager(modelManager); - libraryManager.getLibrarySourceLoader().registerProvider(new TestLibrarySourceProvider()); - try { - ucumService = new UcumEssenceService(UcumEssenceService.class.getResourceAsStream("/ucum-essence.xml")); - } - catch (UcumException e) { - e.printStackTrace(); - } - } - - private static void tearDown() { - ucumService = null; - libraryManager = null; - modelManager = null; - } - - public static void reset() { - tearDown(); - } - private static ModelManager getModelManager() { - if (modelManager == null) { - setup(); - } - - return modelManager; + return new ModelManager(); } private static LibraryManager getLibraryManager() { - if (libraryManager == null) { - setup(); - } + return getLibraryManager(new CqlCompilerOptions(ErrorSeverity.Warning, SignatureLevel.None)); - return libraryManager; } - private static UcumService getUcumService() { - if (ucumService == null) { - setup(); - } + private static LibraryManager getLibraryManager(CqlCompilerOptions options) { + var libraryManager = new LibraryManager(getModelManager(), options); + libraryManager.getLibrarySourceLoader().registerProvider(new TestLibrarySourceProvider()); - return ucumService; + return libraryManager; } public static Cql2ElmVisitor visitFile(String fileName, boolean inClassPath) throws IOException { @@ -89,40 +54,40 @@ public static Cql2ElmVisitor visitFile(String fileName, boolean inClassPath) thr public static Object visitFile(String fileName) throws IOException { File file = new File(URLDecoder.decode(TestUtils.class.getResource(fileName).getFile(), "UTF-8")); - CqlTranslator translator = CqlTranslator.fromFile(file, getModelManager(), getLibraryManager(), getUcumService()); + CqlTranslator translator = CqlTranslator.fromFile(file, getLibraryManager()); ensureValid(translator); return translator.toObject(); } public static CompiledLibrary visitFileLibrary(String fileName) throws IOException { File file = new File(URLDecoder.decode(TestUtils.class.getResource(fileName).getFile(), "UTF-8")); - CqlTranslator translator = CqlTranslator.fromFile(file, getModelManager(), getLibraryManager(), getUcumService()); + CqlTranslator translator = CqlTranslator.fromFile(file, getLibraryManager()); ensureValid(translator); return translator.getTranslatedLibrary(); } public static Object visitData(String cqlData) { - CqlTranslator translator = CqlTranslator.fromText(cqlData, getModelManager(), getLibraryManager(), getUcumService()); + CqlTranslator translator = CqlTranslator.fromText(cqlData, getLibraryManager()); ensureValid(translator); return translator.toObject(); } public static Library visitLibrary(String cqlLibrary) { - CqlTranslator translator = CqlTranslator.fromText(cqlLibrary, getModelManager(), getLibraryManager(), getUcumService()); + CqlTranslator translator = CqlTranslator.fromText(cqlLibrary, getLibraryManager()); ensureValid(translator); return translator.toELM(); } public static Object visitData(String cqlData, boolean enableAnnotations, boolean enableDateRangeOptimization) { - List options = new ArrayList<>(); + var compilerOptions = new CqlCompilerOptions(); if (enableAnnotations) { - options.add(CqlTranslatorOptions.Options.EnableAnnotations); + compilerOptions.getOptions().add(CqlCompilerOptions.Options.EnableAnnotations); } if (enableDateRangeOptimization) { - options.add(CqlTranslatorOptions.Options.EnableDateRangeOptimization); + compilerOptions.getOptions().add(CqlCompilerOptions.Options.EnableDateRangeOptimization); } - CqlTranslator translator = CqlTranslator.fromText(cqlData, getModelManager(), getLibraryManager(), getUcumService(), - options.toArray(new CqlTranslatorOptions.Options[options.size()])); + + CqlTranslator translator = CqlTranslator.fromText(cqlData,getLibraryManager(compilerOptions)); ensureValid(translator); return translator.toObject(); } @@ -142,7 +107,7 @@ private static Cql2ElmVisitor createElmTranslatorVisitor(TokenStream tokens, Par preprocessor.visit(tree); ModelManager modelManager = new ModelManager(); LibraryManager libraryManager = new LibraryManager(modelManager); - LibraryBuilder libraryBuilder = new LibraryBuilder(modelManager, libraryManager, ucumService); + LibraryBuilder libraryBuilder = new LibraryBuilder(libraryManager); Cql2ElmVisitor visitor = new Cql2ElmVisitor(libraryBuilder); visitor.setTokenStream(tokens); visitor.setLibraryInfo(preprocessor.getLibraryInfo()); @@ -160,19 +125,19 @@ private static TokenStream parseCharStream(CharStream is) { return new CommonTokenStream(lexer); } - public static CqlTranslator runSemanticTest(String testFileName, int expectedErrors, CqlTranslatorOptions.Options... options) throws IOException { + public static CqlTranslator runSemanticTest(String testFileName, int expectedErrors, CqlCompilerOptions.Options... options) throws IOException { return runSemanticTest(null, testFileName, expectedErrors, options); } - public static CqlTranslator runSemanticTest(String testFileName, int expectedErrors, CqlTranslatorOptions options) throws IOException { + public static CqlTranslator runSemanticTest(String testFileName, int expectedErrors, CqlCompilerOptions options) throws IOException { return runSemanticTest(null, testFileName, expectedErrors, options); } - public static CqlTranslator runSemanticTest(NamespaceInfo namespaceInfo, String testFileName, int expectedErrors, CqlTranslatorOptions.Options... options) throws IOException { - return runSemanticTest(namespaceInfo, testFileName, expectedErrors, new CqlTranslatorOptions(options)); + public static CqlTranslator runSemanticTest(NamespaceInfo namespaceInfo, String testFileName, int expectedErrors, CqlCompilerOptions.Options... options) throws IOException { + return runSemanticTest(namespaceInfo, testFileName, expectedErrors, new CqlCompilerOptions(options)); } - public static CqlTranslator runSemanticTest(NamespaceInfo namespaceInfo, String testFileName, int expectedErrors, CqlTranslatorOptions options) throws IOException { + public static CqlTranslator runSemanticTest(NamespaceInfo namespaceInfo, String testFileName, int expectedErrors, CqlCompilerOptions options) throws IOException { CqlTranslator translator = TestUtils.createTranslator(namespaceInfo, testFileName, options); for (CqlCompilerException error : translator.getErrors()) { System.err.println(String.format("(%d,%d): %s", @@ -182,47 +147,49 @@ public static CqlTranslator runSemanticTest(NamespaceInfo namespaceInfo, String return translator; } - public static CqlTranslator createTranslatorFromText(String cqlText, CqlTranslatorOptions.Options... options) { + public static CqlTranslator createTranslatorFromText(String cqlText, CqlCompilerOptions.Options... options) { ModelManager modelManager = new ModelManager(); - LibraryManager libraryManager = new LibraryManager(modelManager); - CqlTranslator translator = CqlTranslator.fromText(cqlText, modelManager, libraryManager, getUcumService(), options); + var compilerOptions = new CqlCompilerOptions(options); + LibraryManager libraryManager = new LibraryManager(modelManager, compilerOptions); + CqlTranslator translator = CqlTranslator.fromText(cqlText, libraryManager); return translator; } - public static CqlTranslator createTranslatorFromStream(String testFileName, CqlTranslatorOptions.Options... options) throws IOException { + public static CqlTranslator createTranslatorFromStream(String testFileName, CqlCompilerOptions.Options... options) throws IOException { return createTranslatorFromStream(null, testFileName, options); } - public static CqlTranslator createTranslatorFromStream(NamespaceInfo namespaceInfo, String testFileName, CqlTranslatorOptions.Options... options) throws IOException { + public static CqlTranslator createTranslatorFromStream(NamespaceInfo namespaceInfo, String testFileName, CqlCompilerOptions.Options... options) throws IOException { InputStream inputStream = Cql2ElmVisitorTest.class.getResourceAsStream(testFileName); return createTranslatorFromStream(null, inputStream, options); } - public static CqlTranslator createTranslatorFromStream(InputStream inputStream, CqlTranslatorOptions.Options... options) throws IOException { + public static CqlTranslator createTranslatorFromStream(InputStream inputStream, CqlCompilerOptions.Options... options) throws IOException { return createTranslatorFromStream(null, inputStream, options); } - public static CqlTranslator createTranslatorFromStream(NamespaceInfo namespaceInfo, InputStream inputStream, CqlTranslatorOptions.Options... options) throws IOException { + public static CqlTranslator createTranslatorFromStream(NamespaceInfo namespaceInfo, InputStream inputStream, CqlCompilerOptions.Options... options) throws IOException { ModelManager modelManager = new ModelManager(); - LibraryManager libraryManager = new LibraryManager(modelManager); + var compilerOptions = new CqlCompilerOptions(options); + LibraryManager libraryManager = new LibraryManager(modelManager, compilerOptions); libraryManager.getLibrarySourceLoader().registerProvider(new TestLibrarySourceProvider()); - CqlTranslator translator = CqlTranslator.fromStream(namespaceInfo, inputStream, modelManager, libraryManager, getUcumService(), options); + CqlTranslator translator = CqlTranslator.fromStream(namespaceInfo, inputStream, libraryManager); return translator; } - public static CqlTranslator createTranslator(String testFileName, CqlTranslatorOptions.Options... options) throws IOException { - return createTranslator(null, testFileName, new CqlTranslatorOptions(options)); + public static CqlTranslator createTranslator(String testFileName, CqlCompilerOptions.Options... options) throws IOException { + return createTranslator(null, testFileName, new CqlCompilerOptions(options)); } - public static CqlTranslator createTranslator(String testFileName, CqlTranslatorOptions options) throws IOException { + public static CqlTranslator createTranslator(String testFileName, CqlCompilerOptions options) throws IOException { return createTranslator(null, testFileName, options); } - public static CqlTranslator createTranslator(NamespaceInfo namespaceInfo, String testFileName, CqlTranslatorOptions.Options... options) throws IOException { - return createTranslator(namespaceInfo, testFileName, new CqlTranslatorOptions(options)); + public static CqlTranslator createTranslator(NamespaceInfo namespaceInfo, String testFileName, CqlCompilerOptions.Options... options) throws IOException { + return createTranslator(namespaceInfo, testFileName, new CqlCompilerOptions(options)); } - public static CqlTranslator createTranslator(NamespaceInfo namespaceInfo, String testFileName, CqlTranslatorOptions options) throws IOException { + public static CqlTranslator createTranslator(NamespaceInfo namespaceInfo, String testFileName, CqlCompilerOptions options) throws IOException { String[] segments = testFileName.split("/"); String path = null; if (segments.length > 1) { @@ -239,9 +206,9 @@ public static CqlTranslator createTranslator(NamespaceInfo namespaceInfo, String File translationTestFile = new File(URLDecoder.decode(Cql2ElmVisitorTest.class.getResource(testFileName).getFile(), "UTF-8")); ModelManager modelManager = new ModelManager(); - LibraryManager libraryManager = new LibraryManager(modelManager); + LibraryManager libraryManager = new LibraryManager(modelManager, options); libraryManager.getLibrarySourceLoader().registerProvider(path == null ? new TestLibrarySourceProvider() : new TestLibrarySourceProvider(path)); - CqlTranslator translator = CqlTranslator.fromFile(namespaceInfo, translationTestFile, modelManager, libraryManager, getUcumService(), options); + CqlTranslator translator = CqlTranslator.fromFile(namespaceInfo, translationTestFile, libraryManager); return translator; } } \ No newline at end of file diff --git a/Src/java/cql-to-elm/src/test/java/org/cqframework/cql/cql2elm/TranslationTests.java b/Src/java/cql-to-elm/src/test/java/org/cqframework/cql/cql2elm/TranslationTests.java index 5d6997720..39231ad02 100644 --- a/Src/java/cql-to-elm/src/test/java/org/cqframework/cql/cql2elm/TranslationTests.java +++ b/Src/java/cql-to-elm/src/test/java/org/cqframework/cql/cql2elm/TranslationTests.java @@ -17,7 +17,6 @@ import static org.hamcrest.Matchers.*; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertNotNull; -import static org.junit.Assert.assertNull; import static org.junit.Assert.assertTrue; public class TranslationTests { @@ -29,7 +28,7 @@ public void testPatientPropertyAccess() throws IOException, JAXBException { File propertyTestFile = new File(Cql2ElmVisitorTest.class.getResource("PropertyTest.cql").getFile()); ModelManager modelManager = new ModelManager(); - String actualXml = CqlTranslator.fromFile(propertyTestFile, modelManager, new LibraryManager(modelManager)).toXml(); + String actualXml = CqlTranslator.fromFile(propertyTestFile, new LibraryManager(modelManager)).toXml(); assertThat(actualXml, is(expectedXml)); } @@ -37,15 +36,17 @@ public void testPatientPropertyAccess() throws IOException, JAXBException { public void testForPrintElm() throws IOException, JAXBException{ File propertyTestFile = new File(TranslationTests.class.getResource("LibraryTests/SupplementalDataElements_FHIR4-2.0.0.cql").getFile()); ModelManager modelManager = new ModelManager(); - CqlTranslator translator = CqlTranslator.fromFile(propertyTestFile, modelManager, new LibraryManager(modelManager), - CqlCompilerException.ErrorSeverity.Info, - LibraryBuilder.SignatureLevel.All, CqlTranslatorOptions.Options.EnableDateRangeOptimization, - CqlTranslatorOptions.Options.EnableAnnotations, - CqlTranslatorOptions.Options.EnableLocators, - CqlTranslatorOptions.Options.EnableResultTypes, - CqlTranslatorOptions.Options.DisableListDemotion, - CqlTranslatorOptions.Options.DisableListPromotion, - CqlTranslatorOptions.Options.DisableMethodInvocation); + + var compilerOptions = new CqlCompilerOptions(CqlCompilerException.ErrorSeverity.Info, + LibraryBuilder.SignatureLevel.All, CqlCompilerOptions.Options.EnableDateRangeOptimization, + CqlCompilerOptions.Options.EnableAnnotations, + CqlCompilerOptions.Options.EnableLocators, + CqlCompilerOptions.Options.EnableResultTypes, + CqlCompilerOptions.Options.DisableListDemotion, + CqlCompilerOptions.Options.DisableListPromotion, + CqlCompilerOptions.Options.DisableMethodInvocation); + + CqlTranslator translator = CqlTranslator.fromFile(propertyTestFile, new LibraryManager(modelManager, compilerOptions)); System.out.println(translator.toJson()); } @@ -54,7 +55,7 @@ public void testCMS146v2XML() throws IOException { String expectedXml = ""; File cqlFile = new File(Cql2ElmVisitorTest.class.getResource("CMS146v2_Test_CQM.cql").getFile()); ModelManager modelManager = new ModelManager(); - String actualXml = CqlTranslator.fromFile(cqlFile, modelManager, new LibraryManager(modelManager)).toXml(); + String actualXml = CqlTranslator.fromFile(cqlFile, new LibraryManager(modelManager)).toXml(); assertThat(actualXml, is(expectedXml)); } @@ -75,7 +76,7 @@ public void testIdentifierLocation() throws IOException { @Test public void testAnnotationsPresent() throws IOException { - CqlTranslator translator = TestUtils.createTranslator("CMS146v2_Test_CQM.cql", CqlTranslatorOptions.Options.EnableAnnotations); + CqlTranslator translator = TestUtils.createTranslator("CMS146v2_Test_CQM.cql", CqlCompilerOptions.Options.EnableAnnotations); assertEquals(0, translator.getErrors().size()); List defs = translator.getTranslatedLibrary().getLibrary().getStatements().getDef(); assertNotNull(defs.get(1).getAnnotation()); @@ -92,7 +93,7 @@ public void testAnnotationsAbsent() throws IOException { @Test public void testTranslatorOptionsPresent() throws IOException { - CqlTranslator translator = TestUtils.createTranslator("CMS146v2_Test_CQM.cql", CqlTranslatorOptions.Options.EnableAnnotations); + CqlTranslator translator = TestUtils.createTranslator("CMS146v2_Test_CQM.cql", CqlCompilerOptions.Options.EnableAnnotations); assertEquals(0, translator.getErrors().size()); Library library = translator.getTranslatedLibrary().getLibrary(); assertNotNull(library.getAnnotation()); diff --git a/Src/java/cql-to-elm/src/test/java/org/cqframework/cql/cql2elm/fhir/dstu2/BaseTest.java b/Src/java/cql-to-elm/src/test/java/org/cqframework/cql/cql2elm/fhir/dstu2/BaseTest.java index e7fded04c..7193350e2 100644 --- a/Src/java/cql-to-elm/src/test/java/org/cqframework/cql/cql2elm/fhir/dstu2/BaseTest.java +++ b/Src/java/cql-to-elm/src/test/java/org/cqframework/cql/cql2elm/fhir/dstu2/BaseTest.java @@ -1,6 +1,6 @@ package org.cqframework.cql.cql2elm.fhir.dstu2; -import org.cqframework.cql.cql2elm.CqlTranslatorOptions; +import org.cqframework.cql.cql2elm.CqlCompilerOptions; import org.cqframework.cql.cql2elm.CqlTranslator; import org.hl7.cql.model.NamespaceInfo; import org.cqframework.cql.cql2elm.TestUtils; @@ -13,19 +13,11 @@ import java.util.HashMap; import java.util.Map; -import static org.cqframework.cql.cql2elm.TestUtils.visitFile; import static org.cqframework.cql.cql2elm.TestUtils.visitFileLibrary; -import static org.cqframework.cql.cql2elm.matchers.QuickDataType.quickDataType; import static org.hamcrest.MatcherAssert.assertThat; import static org.hamcrest.Matchers.*; public class BaseTest { - @BeforeClass - public void Setup() { - // Reset test utils to clear any models loaded by other tests - TestUtils.reset(); - } - @Test public void testEqualityWithConversions() throws IOException { CompiledLibrary library = visitFileLibrary("fhir/dstu2/EqualityWithConversions.cql"); @@ -59,7 +51,7 @@ public void testDoubleListPromotion() throws IOException { @Test public void testChoiceDateRangeOptimization() throws IOException { - CqlTranslator translator = TestUtils.runSemanticTest("fhir/dstu2/TestChoiceDateRangeOptimization.cql", 0, CqlTranslatorOptions.Options.EnableDateRangeOptimization); + CqlTranslator translator = TestUtils.runSemanticTest("fhir/dstu2/TestChoiceDateRangeOptimization.cql", 0, CqlCompilerOptions.Options.EnableDateRangeOptimization); Library library = translator.toELM(); Map defs = new HashMap<>(); diff --git a/Src/java/cql-to-elm/src/test/java/org/cqframework/cql/cql2elm/fhir/r4/BaseTest.java b/Src/java/cql-to-elm/src/test/java/org/cqframework/cql/cql2elm/fhir/r4/BaseTest.java index fc6829a35..8ffccc3a4 100644 --- a/Src/java/cql-to-elm/src/test/java/org/cqframework/cql/cql2elm/fhir/r4/BaseTest.java +++ b/Src/java/cql-to-elm/src/test/java/org/cqframework/cql/cql2elm/fhir/r4/BaseTest.java @@ -1,11 +1,10 @@ package org.cqframework.cql.cql2elm.fhir.r4; -import org.cqframework.cql.cql2elm.CqlTranslatorOptions; +import org.cqframework.cql.cql2elm.CqlCompilerOptions; import org.cqframework.cql.cql2elm.CqlTranslator; import org.cqframework.cql.cql2elm.TestUtils; import org.cqframework.cql.cql2elm.model.CompiledLibrary; import org.hl7.elm.r1.*; -import org.testng.annotations.BeforeClass; import org.testng.annotations.Test; import java.io.IOException; @@ -19,11 +18,6 @@ import static org.hamcrest.Matchers.*; public class BaseTest { - @BeforeClass - public void Setup() { - // Reset test utils to clear any models loaded by other tests - TestUtils.reset(); - } @Test public void testChoiceWithAlternativeConversion() throws IOException { @@ -123,7 +117,7 @@ public void testDoubleListPromotion() throws IOException { @Test public void testChoiceDateRangeOptimization() throws IOException { - CqlTranslator translator = TestUtils.runSemanticTest("fhir/r4/TestChoiceDateRangeOptimization.cql", 0, CqlTranslatorOptions.Options.EnableDateRangeOptimization); + CqlTranslator translator = TestUtils.runSemanticTest("fhir/r4/TestChoiceDateRangeOptimization.cql", 0, CqlCompilerOptions.Options.EnableDateRangeOptimization); Library library = translator.toELM(); Map defs = new HashMap<>(); diff --git a/Src/java/cql-to-elm/src/test/java/org/cqframework/cql/cql2elm/fhir/r401/BaseTest.java b/Src/java/cql-to-elm/src/test/java/org/cqframework/cql/cql2elm/fhir/r401/BaseTest.java index 31a5d644f..cdaecdb88 100644 --- a/Src/java/cql-to-elm/src/test/java/org/cqframework/cql/cql2elm/fhir/r401/BaseTest.java +++ b/Src/java/cql-to-elm/src/test/java/org/cqframework/cql/cql2elm/fhir/r401/BaseTest.java @@ -1,6 +1,6 @@ package org.cqframework.cql.cql2elm.fhir.r401; -import org.cqframework.cql.cql2elm.CqlTranslatorOptions; +import org.cqframework.cql.cql2elm.CqlCompilerOptions; import org.cqframework.cql.cql2elm.CqlTranslator; import org.hl7.cql.model.NamespaceInfo; import org.cqframework.cql.cql2elm.TestUtils; @@ -9,7 +9,6 @@ import org.hl7.cql.model.ClassType; import org.hl7.cql.model.DataType; import org.hl7.elm.r1.*; -import org.testng.annotations.BeforeClass; import org.testng.annotations.Test; import java.io.IOException; @@ -23,12 +22,6 @@ import static org.hamcrest.Matchers.*; public class BaseTest { - @BeforeClass - public void Setup() { - // Reset test utils to clear any models loaded by other tests - TestUtils.reset(); - } - @Test public void testChoiceWithAlternativeConversion() throws IOException { ExpressionDef def = (ExpressionDef) visitFile("fhir/r401/TestChoiceTypes.cql"); @@ -127,7 +120,7 @@ public void testDoubleListPromotion() throws IOException { @Test public void testChoiceDateRangeOptimization() throws IOException { - CqlTranslator translator = TestUtils.runSemanticTest("fhir/r401/TestChoiceDateRangeOptimization.cql", 0, CqlTranslatorOptions.Options.EnableDateRangeOptimization); + CqlTranslator translator = TestUtils.runSemanticTest("fhir/r401/TestChoiceDateRangeOptimization.cql", 0, CqlCompilerOptions.Options.EnableDateRangeOptimization); Library library = translator.toELM(); Map defs = new HashMap<>(); diff --git a/Src/java/cql-to-elm/src/test/java/org/cqframework/cql/cql2elm/fhir/stu3/BaseTest.java b/Src/java/cql-to-elm/src/test/java/org/cqframework/cql/cql2elm/fhir/stu3/BaseTest.java index ff4314ee1..34df38566 100644 --- a/Src/java/cql-to-elm/src/test/java/org/cqframework/cql/cql2elm/fhir/stu3/BaseTest.java +++ b/Src/java/cql-to-elm/src/test/java/org/cqframework/cql/cql2elm/fhir/stu3/BaseTest.java @@ -1,11 +1,10 @@ package org.cqframework.cql.cql2elm.fhir.stu3; -import org.cqframework.cql.cql2elm.CqlTranslatorOptions; +import org.cqframework.cql.cql2elm.CqlCompilerOptions; import org.cqframework.cql.cql2elm.CqlTranslator; import org.cqframework.cql.cql2elm.TestUtils; import org.cqframework.cql.cql2elm.model.CompiledLibrary; import org.hl7.elm.r1.*; -import org.testng.annotations.BeforeClass; import org.testng.annotations.Test; import java.io.IOException; @@ -13,21 +12,11 @@ import java.util.Map; import static org.cqframework.cql.cql2elm.TestUtils.*; -import static org.cqframework.cql.cql2elm.matchers.LiteralFor.literalFor; -import static org.cqframework.cql.cql2elm.matchers.QdmDataType.qdmDataType; import static org.cqframework.cql.cql2elm.matchers.QuickDataType.quickDataType; import static org.hamcrest.MatcherAssert.assertThat; import static org.hamcrest.Matchers.*; -import static org.testng.Assert.assertFalse; -import static org.testng.Assert.assertTrue; public class BaseTest { - @BeforeClass - public void Setup() { - // Reset test utils to clear any models loaded by other tests - TestUtils.reset(); - } - @Test public void testChoiceWithAlternativeConversion() throws IOException { ExpressionDef def = (ExpressionDef) visitFile("fhir/stu3/TestChoiceTypes.cql"); @@ -126,7 +115,7 @@ public void testDoubleListPromotion() throws IOException { @Test public void testChoiceDateRangeOptimization() throws IOException { - CqlTranslator translator = TestUtils.runSemanticTest("fhir/stu3/TestChoiceDateRangeOptimization.cql", 0, CqlTranslatorOptions.Options.EnableDateRangeOptimization); + CqlTranslator translator = TestUtils.runSemanticTest("fhir/stu3/TestChoiceDateRangeOptimization.cql", 0, CqlCompilerOptions.Options.EnableDateRangeOptimization); Library library = translator.toELM(); Map defs = new HashMap<>(); diff --git a/Src/java/cql-to-elm/src/test/java/org/cqframework/cql/cql2elm/fhir/stu301/BaseTest.java b/Src/java/cql-to-elm/src/test/java/org/cqframework/cql/cql2elm/fhir/stu301/BaseTest.java index 023d05b30..be3382ff6 100644 --- a/Src/java/cql-to-elm/src/test/java/org/cqframework/cql/cql2elm/fhir/stu301/BaseTest.java +++ b/Src/java/cql-to-elm/src/test/java/org/cqframework/cql/cql2elm/fhir/stu301/BaseTest.java @@ -1,12 +1,11 @@ package org.cqframework.cql.cql2elm.fhir.stu301; -import org.cqframework.cql.cql2elm.CqlTranslatorOptions; +import org.cqframework.cql.cql2elm.CqlCompilerOptions; import org.cqframework.cql.cql2elm.CqlTranslator; import org.hl7.cql.model.NamespaceInfo; import org.cqframework.cql.cql2elm.TestUtils; import org.cqframework.cql.cql2elm.model.CompiledLibrary; import org.hl7.elm.r1.*; -import org.testng.annotations.BeforeClass; import org.testng.annotations.Test; import java.io.IOException; @@ -20,12 +19,6 @@ import static org.hamcrest.Matchers.*; public class BaseTest { - @BeforeClass - public void Setup() { - // Reset test utils to clear any models loaded by other tests - TestUtils.reset(); - } - @Test public void testChoiceWithAlternativeConversion() throws IOException { ExpressionDef def = (ExpressionDef) visitFile("fhir/stu301/TestChoiceTypes.cql"); @@ -124,7 +117,7 @@ public void testDoubleListPromotion() throws IOException { @Test public void testChoiceDateRangeOptimization() throws IOException { - CqlTranslator translator = TestUtils.runSemanticTest("fhir/stu301/TestChoiceDateRangeOptimization.cql", 0, CqlTranslatorOptions.Options.EnableDateRangeOptimization); + CqlTranslator translator = TestUtils.runSemanticTest("fhir/stu301/TestChoiceDateRangeOptimization.cql", 0, CqlCompilerOptions.Options.EnableDateRangeOptimization); Library library = translator.toELM(); Map defs = new HashMap<>(); diff --git a/Src/java/cql-to-elm/src/test/java/org/cqframework/cql/cql2elm/fhir/v14/BaseTest.java b/Src/java/cql-to-elm/src/test/java/org/cqframework/cql/cql2elm/fhir/v14/BaseTest.java index 5a0d416c7..913d6fedc 100644 --- a/Src/java/cql-to-elm/src/test/java/org/cqframework/cql/cql2elm/fhir/v14/BaseTest.java +++ b/Src/java/cql-to-elm/src/test/java/org/cqframework/cql/cql2elm/fhir/v14/BaseTest.java @@ -1,22 +1,11 @@ package org.cqframework.cql.cql2elm.fhir.v14; import org.cqframework.cql.cql2elm.TestUtils; -import org.testng.annotations.BeforeClass; import org.testng.annotations.Test; import java.io.IOException; -import static org.cqframework.cql.cql2elm.TestUtils.visitFile; -import static org.cqframework.cql.cql2elm.matchers.QuickDataType.quickDataType; -import static org.hamcrest.MatcherAssert.assertThat; - public class BaseTest { - @BeforeClass - public void Setup() { - // Reset test utils to clear any models loaded by other tests - TestUtils.reset(); - } - @Test public void testFHIR() throws IOException { TestUtils.runSemanticTest("fhir/v14/TestFHIR.cql", 0); diff --git a/Src/java/cql-to-elm/src/test/java/org/cqframework/cql/cql2elm/fhir/v16/BaseTest.java b/Src/java/cql-to-elm/src/test/java/org/cqframework/cql/cql2elm/fhir/v16/BaseTest.java index 78adff6d5..006c34335 100644 --- a/Src/java/cql-to-elm/src/test/java/org/cqframework/cql/cql2elm/fhir/v16/BaseTest.java +++ b/Src/java/cql-to-elm/src/test/java/org/cqframework/cql/cql2elm/fhir/v16/BaseTest.java @@ -1,22 +1,11 @@ package org.cqframework.cql.cql2elm.fhir.v16; import org.cqframework.cql.cql2elm.TestUtils; -import org.testng.annotations.BeforeClass; import org.testng.annotations.Test; import java.io.IOException; -import static org.cqframework.cql.cql2elm.TestUtils.visitFile; -import static org.cqframework.cql.cql2elm.matchers.QuickDataType.quickDataType; -import static org.hamcrest.MatcherAssert.assertThat; - public class BaseTest { - @BeforeClass - public void Setup() { - // Reset test utils to clear any models loaded by other tests - TestUtils.reset(); - } - @Test public void testFHIRHelpers() throws IOException { TestUtils.runSemanticTest("fhir/v16/TestFHIRHelpers.cql", 0); diff --git a/Src/java/cql-to-elm/src/test/java/org/cqframework/cql/cql2elm/fhir/v18/BaseTest.java b/Src/java/cql-to-elm/src/test/java/org/cqframework/cql/cql2elm/fhir/v18/BaseTest.java index 3f90a0eba..62573f3ca 100644 --- a/Src/java/cql-to-elm/src/test/java/org/cqframework/cql/cql2elm/fhir/v18/BaseTest.java +++ b/Src/java/cql-to-elm/src/test/java/org/cqframework/cql/cql2elm/fhir/v18/BaseTest.java @@ -1,22 +1,11 @@ package org.cqframework.cql.cql2elm.fhir.v18; import org.cqframework.cql.cql2elm.TestUtils; -import org.testng.annotations.BeforeClass; import org.testng.annotations.Test; import java.io.IOException; -import static org.cqframework.cql.cql2elm.TestUtils.visitFile; -import static org.cqframework.cql.cql2elm.matchers.QuickDataType.quickDataType; -import static org.hamcrest.MatcherAssert.assertThat; - public class BaseTest { - @BeforeClass - public void Setup() { - // Reset test utils to clear any models loaded by other tests - TestUtils.reset(); - } - @Test public void testFHIRHelpers() throws IOException { TestUtils.runSemanticTest("fhir/v18/TestFHIRHelpers.cql", 0); diff --git a/Src/java/cql-to-elm/src/test/java/org/cqframework/cql/cql2elm/fhir/v18/PathTests.java b/Src/java/cql-to-elm/src/test/java/org/cqframework/cql/cql2elm/fhir/v18/PathTests.java index 520c282cb..52d75304c 100644 --- a/Src/java/cql-to-elm/src/test/java/org/cqframework/cql/cql2elm/fhir/v18/PathTests.java +++ b/Src/java/cql-to-elm/src/test/java/org/cqframework/cql/cql2elm/fhir/v18/PathTests.java @@ -42,7 +42,7 @@ public void tearDown() { public void testPaths() { CqlTranslator translator = null; try { - translator = CqlTranslator.fromStream(PathTests.class.getResourceAsStream("PathTests.cql"), modelManager, libraryManager); + translator = CqlTranslator.fromStream(PathTests.class.getResourceAsStream("PathTests.cql"), libraryManager); Library library = translator.toELM(); assertThat(translator.getErrors().size(), is(0)); } catch (IOException e) { diff --git a/Src/java/cql-to-elm/src/test/java/org/cqframework/cql/cql2elm/fhir/v32/BaseTest.java b/Src/java/cql-to-elm/src/test/java/org/cqframework/cql/cql2elm/fhir/v32/BaseTest.java index 65b29d746..a10efcdd6 100644 --- a/Src/java/cql-to-elm/src/test/java/org/cqframework/cql/cql2elm/fhir/v32/BaseTest.java +++ b/Src/java/cql-to-elm/src/test/java/org/cqframework/cql/cql2elm/fhir/v32/BaseTest.java @@ -1,22 +1,11 @@ package org.cqframework.cql.cql2elm.fhir.v32; import org.cqframework.cql.cql2elm.TestUtils; -import org.testng.annotations.BeforeClass; import org.testng.annotations.Test; import java.io.IOException; -import static org.cqframework.cql.cql2elm.TestUtils.visitFile; -import static org.cqframework.cql.cql2elm.matchers.QuickDataType.quickDataType; -import static org.hamcrest.MatcherAssert.assertThat; - public class BaseTest { - @BeforeClass - public void Setup() { - // Reset test utils to clear any models loaded by other tests - TestUtils.reset(); - } - @Test public void testFHIRHelpers() throws IOException { TestUtils.runSemanticTest("fhir/v32/TestFHIRHelpers.cql", 0); diff --git a/Src/java/cql-to-elm/src/test/java/org/cqframework/cql/cql2elm/json/CqlTranslatorOptionsToJsonSchema.java b/Src/java/cql-to-elm/src/test/java/org/cqframework/cql/cql2elm/json/CqlTranslatorOptionsToJsonSchema.java index 3fcaf1e8c..d0d9b81ce 100644 --- a/Src/java/cql-to-elm/src/test/java/org/cqframework/cql/cql2elm/json/CqlTranslatorOptionsToJsonSchema.java +++ b/Src/java/cql-to-elm/src/test/java/org/cqframework/cql/cql2elm/json/CqlTranslatorOptionsToJsonSchema.java @@ -4,7 +4,7 @@ import com.fasterxml.jackson.databind.JsonNode; import com.github.reinert.jjschema.v1.JsonSchemaFactory; import com.github.reinert.jjschema.v1.JsonSchemaV4Factory; -import org.cqframework.cql.cql2elm.CqlTranslatorOptions; +import org.cqframework.cql.cql2elm.CqlCompilerOptions; import org.testng.Assert; import org.testng.annotations.Test; @@ -34,7 +34,7 @@ public void BuildJsonSchemaFromCqlTranslatorOptions() { JsonSchemaFactory schemaFactory = new JsonSchemaV4Factory(); schemaFactory.setAutoPutDollarSchema(true); BufferedWriter writer = new BufferedWriter(new FileWriter(JSON_LOC)); - JsonNode jNode = schemaFactory.createSchema(CqlTranslatorOptions.class); + JsonNode jNode = schemaFactory.createSchema(CqlCompilerOptions.class); writer.write(jNode.toPrettyString()); writer.close(); } catch (Exception e) { diff --git a/Src/java/cql-to-elm/src/test/java/org/cqframework/cql/cql2elm/model/ModelImporterTest.java b/Src/java/cql-to-elm/src/test/java/org/cqframework/cql/cql2elm/model/ModelImporterTest.java index b7382d28e..908ee588e 100644 --- a/Src/java/cql-to-elm/src/test/java/org/cqframework/cql/cql2elm/model/ModelImporterTest.java +++ b/Src/java/cql-to-elm/src/test/java/org/cqframework/cql/cql2elm/model/ModelImporterTest.java @@ -1,23 +1,8 @@ package org.cqframework.cql.cql2elm.model; -import org.cqframework.cql.cql2elm.ModelInfoLoader; -import org.cqframework.cql.cql2elm.ModelManager; -import org.hl7.cql.model.*; -import org.hl7.elm.r1.VersionedIdentifier; -import org.hl7.elm_modelinfo.r1.ClassInfo; -import org.hl7.elm_modelinfo.r1.ModelInfo; import org.testng.SkipException; import org.testng.annotations.Test; -import java.util.Collections; -import java.util.Map; - -import static org.hamcrest.MatcherAssert.assertThat; -import static org.hamcrest.Matchers.is; -import static org.testng.Assert.assertNull; -import static org.testng.Assert.fail; -import static org.testng.AssertJUnit.assertNotNull; - public class ModelImporterTest { @Test diff --git a/Src/java/cql-to-elm/src/test/java/org/cqframework/cql/cql2elm/operators/AgeOperatorsTest.java b/Src/java/cql-to-elm/src/test/java/org/cqframework/cql/cql2elm/operators/AgeOperatorsTest.java index 1eaecab38..d14bfb515 100644 --- a/Src/java/cql-to-elm/src/test/java/org/cqframework/cql/cql2elm/operators/AgeOperatorsTest.java +++ b/Src/java/cql-to-elm/src/test/java/org/cqframework/cql/cql2elm/operators/AgeOperatorsTest.java @@ -25,7 +25,7 @@ public class AgeOperatorsTest { @BeforeTest public void setup() throws IOException { var modelManager = new ModelManager(); - var translator = CqlTranslator.fromStream(AgeOperatorsTest.class.getResourceAsStream("../OperatorTests/AgeOperators.cql"), modelManager, new LibraryManager(modelManager)); + var translator = CqlTranslator.fromStream(AgeOperatorsTest.class.getResourceAsStream("../OperatorTests/AgeOperators.cql"), new LibraryManager(modelManager)); assertThat(translator.getErrors().size(), is(0)); var library = translator.toELM(); defs = new HashMap<>(); diff --git a/Src/java/cql-to-elm/src/test/java/org/cqframework/cql/cql2elm/operators/AggregateOperatorsTest.java b/Src/java/cql-to-elm/src/test/java/org/cqframework/cql/cql2elm/operators/AggregateOperatorsTest.java index 1692875fc..1a3d10d85 100644 --- a/Src/java/cql-to-elm/src/test/java/org/cqframework/cql/cql2elm/operators/AggregateOperatorsTest.java +++ b/Src/java/cql-to-elm/src/test/java/org/cqframework/cql/cql2elm/operators/AggregateOperatorsTest.java @@ -1,7 +1,10 @@ package org.cqframework.cql.cql2elm.operators; +import org.cqframework.cql.cql2elm.CqlCompilerOptions; import org.cqframework.cql.cql2elm.CqlTranslator; import org.cqframework.cql.cql2elm.ModelManager; +import org.cqframework.cql.cql2elm.CqlCompilerException.ErrorSeverity; +import org.cqframework.cql.cql2elm.LibraryBuilder.SignatureLevel; import org.hl7.elm.r1.*; import org.testng.annotations.BeforeTest; import org.testng.annotations.Test; @@ -26,7 +29,7 @@ public class AggregateOperatorsTest { @BeforeTest public void setup() throws IOException { ModelManager modelManager = new ModelManager(); - CqlTranslator translator = CqlTranslator.fromStream(AggregateOperatorsTest.class.getResourceAsStream("../OperatorTests/AggregateOperators.cql"), modelManager, new LibraryManager(modelManager)); + CqlTranslator translator = CqlTranslator.fromStream(AggregateOperatorsTest.class.getResourceAsStream("../OperatorTests/AggregateOperators.cql"), new LibraryManager(modelManager, new CqlCompilerOptions(ErrorSeverity.Warning, SignatureLevel.None))); assertThat(translator.getErrors().size(), is(0)); Library library = translator.toELM(); defs = new HashMap<>(); diff --git a/Src/java/cql-to-elm/src/test/java/org/cqframework/cql/cql2elm/operators/ArithmeticOperatorsTest.java b/Src/java/cql-to-elm/src/test/java/org/cqframework/cql/cql2elm/operators/ArithmeticOperatorsTest.java index c6c470c17..11a0ba074 100644 --- a/Src/java/cql-to-elm/src/test/java/org/cqframework/cql/cql2elm/operators/ArithmeticOperatorsTest.java +++ b/Src/java/cql-to-elm/src/test/java/org/cqframework/cql/cql2elm/operators/ArithmeticOperatorsTest.java @@ -1,7 +1,10 @@ package org.cqframework.cql.cql2elm.operators; +import org.cqframework.cql.cql2elm.CqlCompilerOptions; import org.cqframework.cql.cql2elm.CqlTranslator; import org.cqframework.cql.cql2elm.ModelManager; +import org.cqframework.cql.cql2elm.CqlCompilerException.ErrorSeverity; +import org.cqframework.cql.cql2elm.LibraryBuilder.SignatureLevel; import org.hl7.elm.r1.*; import org.testng.annotations.BeforeTest; import org.testng.annotations.Test; @@ -25,7 +28,7 @@ public class ArithmeticOperatorsTest { @BeforeTest public void setup() throws IOException { ModelManager modelManager = new ModelManager(); - CqlTranslator translator = CqlTranslator.fromStream(ArithmeticOperatorsTest.class.getResourceAsStream("../OperatorTests/ArithmeticOperators.cql"), modelManager, new LibraryManager(modelManager)); + CqlTranslator translator = CqlTranslator.fromStream(ArithmeticOperatorsTest.class.getResourceAsStream("../OperatorTests/ArithmeticOperators.cql"), new LibraryManager(modelManager, new CqlCompilerOptions(ErrorSeverity.Warning, SignatureLevel.None))); assertThat(translator.getErrors().size(), is(0)); Library library = translator.toELM(); defs = new HashMap<>(); @@ -229,10 +232,10 @@ public void testLowBoundary() { def = defs.get("DateLowBoundary"); assertThat(def, hasTypeAndResult(LowBoundary.class, "System.Date")); - + def = defs.get("DateTimeLowBoundary"); assertThat(def, hasTypeAndResult(LowBoundary.class, "System.DateTime")); - + def = defs.get("TimeLowBoundary"); assertThat(def, hasTypeAndResult(LowBoundary.class, "System.Time")); } diff --git a/Src/java/cql-to-elm/src/test/java/org/cqframework/cql/cql2elm/operators/CqlComparisonOperatorsTest.java b/Src/java/cql-to-elm/src/test/java/org/cqframework/cql/cql2elm/operators/CqlComparisonOperatorsTest.java index 4cd7419f9..8a287be6e 100644 --- a/Src/java/cql-to-elm/src/test/java/org/cqframework/cql/cql2elm/operators/CqlComparisonOperatorsTest.java +++ b/Src/java/cql-to-elm/src/test/java/org/cqframework/cql/cql2elm/operators/CqlComparisonOperatorsTest.java @@ -29,7 +29,7 @@ public class CqlComparisonOperatorsTest { @BeforeTest public void setup() throws IOException { ModelManager modelManager = new ModelManager(); - CqlTranslator translator = CqlTranslator.fromStream(CqlComparisonOperatorsTest.class.getResourceAsStream("../OperatorTests/CqlComparisonOperators.cql"), modelManager, new LibraryManager(modelManager)); + CqlTranslator translator = CqlTranslator.fromStream(CqlComparisonOperatorsTest.class.getResourceAsStream("../OperatorTests/CqlComparisonOperators.cql"), new LibraryManager(modelManager)); assertThat(translator.getErrors().size(), is(0)); Library library = translator.toELM(); defs = new HashMap<>(); diff --git a/Src/java/cql-to-elm/src/test/java/org/cqframework/cql/cql2elm/operators/CqlIntervalOperatorsTest.java b/Src/java/cql-to-elm/src/test/java/org/cqframework/cql/cql2elm/operators/CqlIntervalOperatorsTest.java index 9bdd33941..b7c236fd9 100644 --- a/Src/java/cql-to-elm/src/test/java/org/cqframework/cql/cql2elm/operators/CqlIntervalOperatorsTest.java +++ b/Src/java/cql-to-elm/src/test/java/org/cqframework/cql/cql2elm/operators/CqlIntervalOperatorsTest.java @@ -29,7 +29,7 @@ public class CqlIntervalOperatorsTest { @BeforeTest public void setup() throws IOException { ModelManager modelManager = new ModelManager(); - CqlTranslator translator = CqlTranslator.fromStream(CqlIntervalOperatorsTest.class.getResourceAsStream("../OperatorTests/CqlIntervalOperators.cql"), modelManager, new LibraryManager(modelManager)); + CqlTranslator translator = CqlTranslator.fromStream(CqlIntervalOperatorsTest.class.getResourceAsStream("../OperatorTests/CqlIntervalOperators.cql"), new LibraryManager(modelManager)); assertThat(translator.getErrors().size(), is(0)); Library library = translator.toELM(); defs = new HashMap<>(); diff --git a/Src/java/cql-to-elm/src/test/java/org/cqframework/cql/cql2elm/operators/CqlListOperatorsTest.java b/Src/java/cql-to-elm/src/test/java/org/cqframework/cql/cql2elm/operators/CqlListOperatorsTest.java index 1c40cd214..bbc6085e2 100644 --- a/Src/java/cql-to-elm/src/test/java/org/cqframework/cql/cql2elm/operators/CqlListOperatorsTest.java +++ b/Src/java/cql-to-elm/src/test/java/org/cqframework/cql/cql2elm/operators/CqlListOperatorsTest.java @@ -26,7 +26,7 @@ public class CqlListOperatorsTest { @BeforeTest public void setup() throws IOException { ModelManager modelManager = new ModelManager(); - CqlTranslator translator = CqlTranslator.fromStream(CqlListOperatorsTest.class.getResourceAsStream("../OperatorTests/CqlListOperators.cql"), modelManager, new LibraryManager(modelManager)); + CqlTranslator translator = CqlTranslator.fromStream(CqlListOperatorsTest.class.getResourceAsStream("../OperatorTests/CqlListOperators.cql"), new LibraryManager(modelManager)); assertThat(translator.getErrors().size(), is(0)); Library library = translator.toELM(); defs = new HashMap<>(); diff --git a/Src/java/cql-to-elm/src/test/java/org/cqframework/cql/cql2elm/operators/DateTimeOperatorsTest.java b/Src/java/cql-to-elm/src/test/java/org/cqframework/cql/cql2elm/operators/DateTimeOperatorsTest.java index 7f46db28b..6a91285a9 100644 --- a/Src/java/cql-to-elm/src/test/java/org/cqframework/cql/cql2elm/operators/DateTimeOperatorsTest.java +++ b/Src/java/cql-to-elm/src/test/java/org/cqframework/cql/cql2elm/operators/DateTimeOperatorsTest.java @@ -1,7 +1,10 @@ package org.cqframework.cql.cql2elm.operators; +import org.cqframework.cql.cql2elm.CqlCompilerOptions; import org.cqframework.cql.cql2elm.CqlTranslator; import org.cqframework.cql.cql2elm.ModelManager; +import org.cqframework.cql.cql2elm.CqlCompilerException.ErrorSeverity; +import org.cqframework.cql.cql2elm.LibraryBuilder.SignatureLevel; import org.hl7.elm.r1.*; import org.testng.annotations.BeforeTest; import org.testng.annotations.Test; @@ -23,7 +26,7 @@ public class DateTimeOperatorsTest { @BeforeTest public void setup() throws IOException { ModelManager modelManager = new ModelManager(); - CqlTranslator translator = CqlTranslator.fromStream(DateTimeOperatorsTest.class.getResourceAsStream("../OperatorTests/DateTimeOperators.cql"), modelManager, new LibraryManager(modelManager)); + CqlTranslator translator = CqlTranslator.fromStream(DateTimeOperatorsTest.class.getResourceAsStream("../OperatorTests/DateTimeOperators.cql"), new LibraryManager(modelManager, new CqlCompilerOptions(ErrorSeverity.Warning, SignatureLevel.None))); assertThat(translator.getErrors().size(), is(0)); Library library = translator.toELM(); defs = new HashMap<>(); diff --git a/Src/java/cql-to-elm/src/test/java/org/cqframework/cql/cql2elm/operators/ListOperatorsTest.java b/Src/java/cql-to-elm/src/test/java/org/cqframework/cql/cql2elm/operators/ListOperatorsTest.java index d5eae66ba..71170f688 100644 --- a/Src/java/cql-to-elm/src/test/java/org/cqframework/cql/cql2elm/operators/ListOperatorsTest.java +++ b/Src/java/cql-to-elm/src/test/java/org/cqframework/cql/cql2elm/operators/ListOperatorsTest.java @@ -1,5 +1,6 @@ package org.cqframework.cql.cql2elm.operators; +import org.cqframework.cql.cql2elm.CqlCompilerOptions; import org.cqframework.cql.cql2elm.CqlTranslator; import org.cqframework.cql.cql2elm.ModelManager; import org.hl7.elm.r1.*; @@ -25,7 +26,7 @@ public class ListOperatorsTest { @BeforeTest public void setup() throws IOException { ModelManager modelManager = new ModelManager(); - CqlTranslator translator = CqlTranslator.fromStream(ListOperatorsTest.class.getResourceAsStream("../OperatorTests/ListOperators.cql"), modelManager, new LibraryManager(modelManager)); + CqlTranslator translator = CqlTranslator.fromStream(ListOperatorsTest.class.getResourceAsStream("../OperatorTests/ListOperators.cql"), new LibraryManager(modelManager, new CqlCompilerOptions())); assertThat(translator.getErrors().size(), is(0)); Library library = translator.toELM(); defs = new HashMap<>(); diff --git a/Src/java/cql-to-elm/src/test/java/org/cqframework/cql/cql2elm/operators/NullologicalOperatorsTest.java b/Src/java/cql-to-elm/src/test/java/org/cqframework/cql/cql2elm/operators/NullologicalOperatorsTest.java index 920e99d4a..7e5b88da8 100644 --- a/Src/java/cql-to-elm/src/test/java/org/cqframework/cql/cql2elm/operators/NullologicalOperatorsTest.java +++ b/Src/java/cql-to-elm/src/test/java/org/cqframework/cql/cql2elm/operators/NullologicalOperatorsTest.java @@ -29,7 +29,7 @@ public class NullologicalOperatorsTest { @BeforeTest public void setup() throws IOException { ModelManager modelManager = new ModelManager(); - CqlTranslator translator = CqlTranslator.fromStream(NullologicalOperatorsTest.class.getResourceAsStream("../OperatorTests/NullologicalOperators.cql"), modelManager, new LibraryManager(modelManager)); + CqlTranslator translator = CqlTranslator.fromStream(NullologicalOperatorsTest.class.getResourceAsStream("../OperatorTests/NullologicalOperators.cql"), new LibraryManager(modelManager)); assertThat(translator.getErrors().size(), is(0)); Library library = translator.toELM(); defs = new HashMap<>(); diff --git a/Src/java/cql-to-elm/src/test/java/org/cqframework/cql/cql2elm/operators/QueryTest.java b/Src/java/cql-to-elm/src/test/java/org/cqframework/cql/cql2elm/operators/QueryTest.java index 0a5b6baa5..1d0efffa9 100644 --- a/Src/java/cql-to-elm/src/test/java/org/cqframework/cql/cql2elm/operators/QueryTest.java +++ b/Src/java/cql-to-elm/src/test/java/org/cqframework/cql/cql2elm/operators/QueryTest.java @@ -24,7 +24,7 @@ public class QueryTest { @BeforeTest public void setup() throws IOException { ModelManager modelManager = new ModelManager(); - CqlTranslator translator = CqlTranslator.fromStream(QueryTest.class.getResourceAsStream("../OperatorTests/Query.cql"), modelManager, new LibraryManager(modelManager)); + CqlTranslator translator = CqlTranslator.fromStream(QueryTest.class.getResourceAsStream("../OperatorTests/Query.cql"), new LibraryManager(modelManager)); assertThat(translator.getErrors().size(), is(0)); Library library = translator.toELM(); defs = new HashMap<>(); diff --git a/Src/java/cql-to-elm/src/test/java/org/cqframework/cql/cql2elm/operators/SortingTest.java b/Src/java/cql-to-elm/src/test/java/org/cqframework/cql/cql2elm/operators/SortingTest.java index 6f8219b0f..f80ae667e 100644 --- a/Src/java/cql-to-elm/src/test/java/org/cqframework/cql/cql2elm/operators/SortingTest.java +++ b/Src/java/cql-to-elm/src/test/java/org/cqframework/cql/cql2elm/operators/SortingTest.java @@ -25,8 +25,8 @@ public class SortingTest { @BeforeTest public void setup() throws IOException { ModelManager modelManager = new ModelManager(); - CqlTranslator translator = CqlTranslator.fromStream(QueryTest.class.getResourceAsStream("../OperatorTests/Sorting.cql"), modelManager, new LibraryManager(modelManager)); - + CqlTranslator translator = CqlTranslator.fromStream(QueryTest.class.getResourceAsStream("../OperatorTests/Sorting.cql"), new LibraryManager(modelManager)); + // The alias test creates an error assertThat(translator.getErrors().size(), is(1)); diff --git a/Src/java/cql-to-elm/src/test/java/org/cqframework/cql/cql2elm/operators/StringOperatorsTest.java b/Src/java/cql-to-elm/src/test/java/org/cqframework/cql/cql2elm/operators/StringOperatorsTest.java index a1596b021..4f10817b7 100644 --- a/Src/java/cql-to-elm/src/test/java/org/cqframework/cql/cql2elm/operators/StringOperatorsTest.java +++ b/Src/java/cql-to-elm/src/test/java/org/cqframework/cql/cql2elm/operators/StringOperatorsTest.java @@ -1,7 +1,10 @@ package org.cqframework.cql.cql2elm.operators; +import org.cqframework.cql.cql2elm.CqlCompilerOptions; import org.cqframework.cql.cql2elm.CqlTranslator; import org.cqframework.cql.cql2elm.ModelManager; +import org.cqframework.cql.cql2elm.CqlCompilerException.ErrorSeverity; +import org.cqframework.cql.cql2elm.LibraryBuilder.SignatureLevel; import org.hl7.elm.r1.*; import org.testng.annotations.BeforeTest; import org.testng.annotations.Test; @@ -25,7 +28,7 @@ public class StringOperatorsTest { @BeforeTest public void setup() throws IOException { ModelManager modelManager = new ModelManager(); - CqlTranslator translator = CqlTranslator.fromStream(StringOperatorsTest.class.getResourceAsStream("../OperatorTests/StringOperators.cql"), modelManager, new LibraryManager(modelManager)); + CqlTranslator translator = CqlTranslator.fromStream(StringOperatorsTest.class.getResourceAsStream("../OperatorTests/StringOperators.cql"), new LibraryManager(modelManager, new CqlCompilerOptions(ErrorSeverity.Warning, SignatureLevel.None))); assertThat(translator.getErrors().size(), is(0)); Library library = translator.toELM(); defs = new HashMap<>(); diff --git a/Src/java/cql-to-elm/src/test/java/org/cqframework/cql/cql2elm/operators/TimeOperatorsTest.java b/Src/java/cql-to-elm/src/test/java/org/cqframework/cql/cql2elm/operators/TimeOperatorsTest.java index 2546ea947..dd5226726 100644 --- a/Src/java/cql-to-elm/src/test/java/org/cqframework/cql/cql2elm/operators/TimeOperatorsTest.java +++ b/Src/java/cql-to-elm/src/test/java/org/cqframework/cql/cql2elm/operators/TimeOperatorsTest.java @@ -23,7 +23,7 @@ public class TimeOperatorsTest { @BeforeTest public void setup() throws IOException { ModelManager modelManager = new ModelManager(); - CqlTranslator translator = CqlTranslator.fromStream(TimeOperatorsTest.class.getResourceAsStream("../OperatorTests/TimeOperators.cql"), modelManager, new LibraryManager(modelManager)); + CqlTranslator translator = CqlTranslator.fromStream(TimeOperatorsTest.class.getResourceAsStream("../OperatorTests/TimeOperators.cql"), new LibraryManager(modelManager)); assertThat(translator.getErrors().size(), is(0)); Library library = translator.toELM(); defs = new HashMap<>(); diff --git a/Src/java/cql-to-elm/src/test/java/org/cqframework/cql/cql2elm/operators/TypeOperatorsTest.java b/Src/java/cql-to-elm/src/test/java/org/cqframework/cql/cql2elm/operators/TypeOperatorsTest.java index 2c8daedc7..8a152d2c2 100644 --- a/Src/java/cql-to-elm/src/test/java/org/cqframework/cql/cql2elm/operators/TypeOperatorsTest.java +++ b/Src/java/cql-to-elm/src/test/java/org/cqframework/cql/cql2elm/operators/TypeOperatorsTest.java @@ -27,7 +27,7 @@ public class TypeOperatorsTest { @BeforeTest public void setup() throws IOException { ModelManager modelManager = new ModelManager(); - CqlTranslator translator = CqlTranslator.fromStream(TypeOperatorsTest.class.getResourceAsStream("../OperatorTests/TypeOperators.cql"), modelManager, new LibraryManager(modelManager)); + CqlTranslator translator = CqlTranslator.fromStream(TypeOperatorsTest.class.getResourceAsStream("../OperatorTests/TypeOperators.cql"), new LibraryManager(modelManager)); assertThat(translator.getErrors().size(), is(0)); Library library = translator.toELM(); defs = new HashMap<>(); @@ -74,7 +74,7 @@ public void testIs() { assertThat(spec.getResultType().toString(), is("System.Boolean")); //assertThat(is.getIsType(), is(new QName("urn:hl7-org:elm-types:r1", "Boolean"))); } - + private static void validateTyping(Convert convert, QName typeName) { assertThat(convert.getToType(), is(typeName)); assertTrue(convert.getToTypeSpecifier() != null); diff --git a/Src/java/cql-to-elm/src/test/java/org/cqframework/cql/cql2elm/qdm/v54/BaseTest.java b/Src/java/cql-to-elm/src/test/java/org/cqframework/cql/cql2elm/qdm/v54/BaseTest.java index f0b23a8af..115971188 100644 --- a/Src/java/cql-to-elm/src/test/java/org/cqframework/cql/cql2elm/qdm/v54/BaseTest.java +++ b/Src/java/cql-to-elm/src/test/java/org/cqframework/cql/cql2elm/qdm/v54/BaseTest.java @@ -3,25 +3,16 @@ import org.cqframework.cql.cql2elm.CqlTranslator; import org.cqframework.cql.cql2elm.TestUtils; import org.hl7.elm.r1.*; -import org.testng.annotations.BeforeClass; import org.testng.annotations.Test; import java.io.IOException; import java.util.HashMap; import java.util.Map; -import static org.cqframework.cql.cql2elm.TestUtils.visitFile; -import static org.cqframework.cql.cql2elm.matchers.QuickDataType.quickDataType; import static org.hamcrest.MatcherAssert.assertThat; import static org.hamcrest.Matchers.*; public class BaseTest { - @BeforeClass - public void Setup() { - // Reset test utils to clear any models loaded by other tests - TestUtils.reset(); - } - @Test public void testChoiceTypes() throws IOException { CqlTranslator translator = TestUtils.runSemanticTest("qdm/v54/TestChoiceTypes.cql", 0); diff --git a/Src/java/cql-to-elm/src/test/java/org/cqframework/cql/cql2elm/qdm/v55/BaseTest.java b/Src/java/cql-to-elm/src/test/java/org/cqframework/cql/cql2elm/qdm/v55/BaseTest.java index 1c65b2523..b4e6790dd 100644 --- a/Src/java/cql-to-elm/src/test/java/org/cqframework/cql/cql2elm/qdm/v55/BaseTest.java +++ b/Src/java/cql-to-elm/src/test/java/org/cqframework/cql/cql2elm/qdm/v55/BaseTest.java @@ -3,7 +3,6 @@ import org.cqframework.cql.cql2elm.CqlTranslator; import org.cqframework.cql.cql2elm.TestUtils; import org.hl7.elm.r1.*; -import org.testng.annotations.BeforeClass; import org.testng.annotations.Test; import java.io.IOException; @@ -15,12 +14,6 @@ import static org.hamcrest.Matchers.is; public class BaseTest { - @BeforeClass - public void Setup() { - // Reset test utils to clear any models loaded by other tests - TestUtils.reset(); - } - @Test public void testChoiceTypes() throws IOException { CqlTranslator translator = TestUtils.runSemanticTest("qdm/v55/TestChoiceTypes.cql", 0); diff --git a/Src/java/cql-to-elm/src/test/java/org/cqframework/cql/cql2elm/qdm/v56/BaseTest.java b/Src/java/cql-to-elm/src/test/java/org/cqframework/cql/cql2elm/qdm/v56/BaseTest.java index 2bb4eeca9..ded061394 100644 --- a/Src/java/cql-to-elm/src/test/java/org/cqframework/cql/cql2elm/qdm/v56/BaseTest.java +++ b/Src/java/cql-to-elm/src/test/java/org/cqframework/cql/cql2elm/qdm/v56/BaseTest.java @@ -3,7 +3,6 @@ import org.cqframework.cql.cql2elm.CqlTranslator; import org.cqframework.cql.cql2elm.TestUtils; import org.hl7.elm.r1.*; -import org.testng.annotations.BeforeClass; import org.testng.annotations.Test; import java.io.IOException; @@ -15,12 +14,6 @@ import static org.hamcrest.Matchers.is; public class BaseTest { - @BeforeClass - public void Setup() { - // Reset test utils to clear any models loaded by other tests - TestUtils.reset(); - } - @Test public void testEntities() throws IOException { TestUtils.runSemanticTest("qdm/v56/TestEntities.cql", 0); diff --git a/Src/java/cql-to-elm/src/test/java/org/cqframework/cql/cql2elm/qicore/v410/BaseTest.java b/Src/java/cql-to-elm/src/test/java/org/cqframework/cql/cql2elm/qicore/v410/BaseTest.java index d15c9a150..59b677939 100644 --- a/Src/java/cql-to-elm/src/test/java/org/cqframework/cql/cql2elm/qicore/v410/BaseTest.java +++ b/Src/java/cql-to-elm/src/test/java/org/cqframework/cql/cql2elm/qicore/v410/BaseTest.java @@ -5,7 +5,6 @@ import org.hl7.elm.r1.ExpressionDef; import org.hl7.elm.r1.Library; import org.hl7.elm.r1.Retrieve; -import org.testng.annotations.BeforeClass; import org.testng.annotations.Test; import java.io.IOException; @@ -17,12 +16,6 @@ import static org.hamcrest.Matchers.is; public class BaseTest { - @BeforeClass - public void Setup() { - // Reset test utils to clear any models loaded by other tests - TestUtils.reset(); - } - @Test public void testQICore() throws IOException { CqlTranslator translator = TestUtils.runSemanticTest("qicore/v410/TestQICore.cql", 0); diff --git a/Src/java/cql-to-elm/src/test/java/org/cqframework/cql/cql2elm/qicore/v411/BaseTest.java b/Src/java/cql-to-elm/src/test/java/org/cqframework/cql/cql2elm/qicore/v411/BaseTest.java index dda2b9040..253b7b04f 100644 --- a/Src/java/cql-to-elm/src/test/java/org/cqframework/cql/cql2elm/qicore/v411/BaseTest.java +++ b/Src/java/cql-to-elm/src/test/java/org/cqframework/cql/cql2elm/qicore/v411/BaseTest.java @@ -3,7 +3,6 @@ import org.cqframework.cql.cql2elm.CqlTranslator; import org.cqframework.cql.cql2elm.TestUtils; import org.hl7.elm.r1.*; -import org.testng.annotations.BeforeClass; import org.testng.annotations.Test; import java.io.IOException; @@ -18,12 +17,6 @@ import static org.junit.Assert.assertNotNull; public class BaseTest { - @BeforeClass - public void Setup() { - // Reset test utils to clear any models loaded by other tests - TestUtils.reset(); - } - @Test public void testAuthoringPatterns() throws IOException { CqlTranslator translator = TestUtils.runSemanticTest("qicore/v411/AuthoringPatterns.cql", 0); diff --git a/Src/java/cql-to-elm/src/test/java/org/cqframework/cql/cql2elm/qicore/v500/BaseTest.java b/Src/java/cql-to-elm/src/test/java/org/cqframework/cql/cql2elm/qicore/v500/BaseTest.java index d97efa815..ae68f4b97 100644 --- a/Src/java/cql-to-elm/src/test/java/org/cqframework/cql/cql2elm/qicore/v500/BaseTest.java +++ b/Src/java/cql-to-elm/src/test/java/org/cqframework/cql/cql2elm/qicore/v500/BaseTest.java @@ -3,7 +3,6 @@ import org.cqframework.cql.cql2elm.CqlTranslator; import org.cqframework.cql.cql2elm.TestUtils; import org.hl7.elm.r1.*; -import org.testng.annotations.BeforeClass; import org.testng.annotations.Test; import java.io.IOException; @@ -17,12 +16,6 @@ import static org.hamcrest.Matchers.is; public class BaseTest { - @BeforeClass - public void Setup() { - // Reset test utils to clear any models loaded by other tests - TestUtils.reset(); - } - @Test public void testQICoreCommon() throws IOException { CqlTranslator translator = TestUtils.runSemanticTest("qicore/v500/QICoreCommon-2.0.000.cql", 0); diff --git a/Src/java/cql-to-elm/src/test/java/org/cqframework/cql/cql2elm/quick/v330/BaseTest.java b/Src/java/cql-to-elm/src/test/java/org/cqframework/cql/cql2elm/quick/v330/BaseTest.java index b2edab551..5ae93a0a2 100644 --- a/Src/java/cql-to-elm/src/test/java/org/cqframework/cql/cql2elm/quick/v330/BaseTest.java +++ b/Src/java/cql-to-elm/src/test/java/org/cqframework/cql/cql2elm/quick/v330/BaseTest.java @@ -4,7 +4,6 @@ import org.cqframework.cql.cql2elm.TestUtils; import org.cqframework.cql.cql2elm.model.CompiledLibrary; import org.hl7.elm.r1.*; -import org.testng.annotations.BeforeClass; import org.testng.annotations.Test; import java.io.IOException; @@ -18,11 +17,6 @@ import static org.hamcrest.Matchers.*; public class BaseTest { - @BeforeClass - public void Setup() { - // Reset test utils to clear any models loaded by other tests - TestUtils.reset(); - } //@Test // BTR -> The types in QUICK are collapsed so this doesn't result in a choice between equally viable alternatives diff --git a/Src/java/cql-to-elm/src/test/java/org/cqframework/cql/cql2elm/uscore/v310/BaseTest.java b/Src/java/cql-to-elm/src/test/java/org/cqframework/cql/cql2elm/uscore/v310/BaseTest.java index afd5e11b8..be1fa7e96 100644 --- a/Src/java/cql-to-elm/src/test/java/org/cqframework/cql/cql2elm/uscore/v310/BaseTest.java +++ b/Src/java/cql-to-elm/src/test/java/org/cqframework/cql/cql2elm/uscore/v310/BaseTest.java @@ -16,11 +16,7 @@ import static org.hamcrest.Matchers.*; public class BaseTest { - @BeforeClass - public void Setup() { - // Reset test utils to clear any models loaded by other tests - TestUtils.reset(); - } + @Test public void testUSCore() throws IOException { diff --git a/Src/java/cql-to-elm/src/test/java/org/cqframework/cql/cql2elm/uscore/v311/BaseTest.java b/Src/java/cql-to-elm/src/test/java/org/cqframework/cql/cql2elm/uscore/v311/BaseTest.java index 7159dc59e..e3932d1f6 100644 --- a/Src/java/cql-to-elm/src/test/java/org/cqframework/cql/cql2elm/uscore/v311/BaseTest.java +++ b/Src/java/cql-to-elm/src/test/java/org/cqframework/cql/cql2elm/uscore/v311/BaseTest.java @@ -16,11 +16,7 @@ import static org.hamcrest.Matchers.*; public class BaseTest { - @BeforeClass - public void Setup() { - // Reset test utils to clear any models loaded by other tests - TestUtils.reset(); - } + @Test public void testUSCore() throws IOException { diff --git a/Src/java/cql-to-elm/src/test/java/org/cqframework/cql/cql2elm/who/BaseTest.java b/Src/java/cql-to-elm/src/test/java/org/cqframework/cql/cql2elm/who/BaseTest.java index a8431d733..ad45d74dd 100644 --- a/Src/java/cql-to-elm/src/test/java/org/cqframework/cql/cql2elm/who/BaseTest.java +++ b/Src/java/cql-to-elm/src/test/java/org/cqframework/cql/cql2elm/who/BaseTest.java @@ -1,31 +1,19 @@ package org.cqframework.cql.cql2elm.who; import org.cqframework.cql.cql2elm.CqlTranslator; -import org.cqframework.cql.cql2elm.CqlTranslatorOptions; +import org.cqframework.cql.cql2elm.CqlCompilerOptions; import org.cqframework.cql.cql2elm.TestUtils; import org.hl7.elm.r1.*; -import org.testng.annotations.BeforeClass; import org.testng.annotations.Test; import java.io.IOException; import java.util.HashMap; import java.util.Map; -import static org.cqframework.cql.cql2elm.TestUtils.visitFile; -import static org.cqframework.cql.cql2elm.matchers.Quick2DataType.quick2DataType; -import static org.hamcrest.MatcherAssert.assertThat; -import static org.hamcrest.Matchers.*; - public class BaseTest { - @BeforeClass - public void Setup() { - // Reset test utils to clear any models loaded by other tests - TestUtils.reset(); - } - @Test public void testWho() throws IOException { - var options = CqlTranslatorOptions.defaultOptions(); + var options = CqlCompilerOptions.defaultOptions(); CqlTranslator translator = TestUtils.runSemanticTest("who/TestSignature.cql", 0, options); Library library = translator.toELM(); Map defs = new HashMap<>(); diff --git a/Src/java/cql-to-elm/src/test/resources/org/cqframework/cql/cql2elm/json/CqlTranslatorOptions.json b/Src/java/cql-to-elm/src/test/resources/org/cqframework/cql/cql2elm/json/CqlTranslatorOptions.json index e6ba2d700..13b251117 100644 --- a/Src/java/cql-to-elm/src/test/resources/org/cqframework/cql/cql2elm/json/CqlTranslatorOptions.json +++ b/Src/java/cql-to-elm/src/test/resources/org/cqframework/cql/cql2elm/json/CqlTranslatorOptions.json @@ -17,13 +17,6 @@ "enum" : [ "Info", "Warning", "Error" ], "type" : "string" }, - "formats" : { - "type" : "array", - "items" : { - "enum" : [ "XML", "JSON", "COFFEE" ], - "type" : "string" - } - }, "options" : { "type" : "array", "items" : { diff --git a/Src/java/cql-to-elm/src/test/resources/org/cqframework/cql/cql2elm/options.json b/Src/java/cql-to-elm/src/test/resources/org/cqframework/cql/cql2elm/options.json index e286c3f19..83c1d815a 100644 --- a/Src/java/cql-to-elm/src/test/resources/org/cqframework/cql/cql2elm/options.json +++ b/Src/java/cql-to-elm/src/test/resources/org/cqframework/cql/cql2elm/options.json @@ -1 +1 @@ -{"options":["EnableAnnotations","EnableLocators","DisableListDemotion","DisableListPromotion"],"formats":[],"validateUnits":true,"verifyOnly":false,"errorLevel":"Info","signatureLevel":"Overloads"} \ No newline at end of file +{"options":["EnableAnnotations","EnableLocators","DisableListDemotion","DisableListPromotion"],"formats":[ "XML"],"validateUnits":true,"verifyOnly":false,"errorLevel":"Info","signatureLevel":"Overloads"} \ No newline at end of file diff --git a/Src/java/elm-fhir/src/main/java/org/cqframework/cql/elm/evaluation/ElmEvaluationHelper.java b/Src/java/elm-fhir/src/main/java/org/cqframework/cql/elm/evaluation/ElmEvaluationHelper.java index 2bcc2c1c5..c5b58f37a 100644 --- a/Src/java/elm-fhir/src/main/java/org/cqframework/cql/elm/evaluation/ElmEvaluationHelper.java +++ b/Src/java/elm-fhir/src/main/java/org/cqframework/cql/elm/evaluation/ElmEvaluationHelper.java @@ -2,29 +2,20 @@ import org.cqframework.cql.cql2elm.LibraryManager; import org.cqframework.cql.cql2elm.ModelManager; -import org.cqframework.cql.elm.execution.IncludeDef; import org.hl7.elm.r1.Library; import org.hl7.elm.r1.Expression; import org.hl7.elm.r1.VersionedIdentifier; import org.opencds.cqf.cql.engine.execution.*; import java.time.ZonedDateTime; -import java.util.HashMap; import java.util.Map; -import java.util.Set; public class ElmEvaluationHelper { - // TODO: Improved library loader support... - private static LibraryLoader libraryLoader = new DefaultLibraryLoader(); - public static Object evaluate(Library library, Expression value, Map parameters, ZonedDateTime evaluationDateTime) { // TODO: Cache for libraries? - Map map = new HashMap<>(); - map.put(library.getIdentifier(), library); CqlEngine engine = getEngine(library, parameters, evaluationDateTime); - engine.init(library.getIdentifier(), map,null, null, null, evaluationDateTime); return engine.visitExpression(value, engine.getState()); } @@ -47,6 +38,4 @@ protected static LibraryManager getLibraryManager() { protected static ModelManager getModelManager() { return new ModelManager(); } - - } diff --git a/Src/java/elm-fhir/src/main/java/org/cqframework/cql/elm/requirements/ElmRequirementsContext.java b/Src/java/elm-fhir/src/main/java/org/cqframework/cql/elm/requirements/ElmRequirementsContext.java index b4da63aed..ca9cff0d9 100644 --- a/Src/java/elm-fhir/src/main/java/org/cqframework/cql/elm/requirements/ElmRequirementsContext.java +++ b/Src/java/elm-fhir/src/main/java/org/cqframework/cql/elm/requirements/ElmRequirementsContext.java @@ -14,7 +14,7 @@ public class ElmRequirementsContext { - public ElmRequirementsContext(LibraryManager libraryManager, CqlTranslatorOptions options, ElmRequirementsVisitor visitor, Map parameters, ZonedDateTime evaluationDateTime) { + public ElmRequirementsContext(LibraryManager libraryManager, CqlCompilerOptions options, ElmRequirementsVisitor visitor, Map parameters, ZonedDateTime evaluationDateTime) { if (libraryManager == null) { throw new IllegalArgumentException("Library Manager required"); } @@ -32,11 +32,11 @@ public ElmRequirementsContext(LibraryManager libraryManager, CqlTranslatorOption this.evaluationDateTime = evaluationDateTime; } - private CqlTranslatorOptions options; - public CqlTranslatorOptions getOptions() { + private CqlCompilerOptions options; + public CqlCompilerOptions getOptions() { return options; } - public void setOptions(CqlTranslatorOptions options) { + public void setOptions(CqlCompilerOptions options) { this.options = options; } @@ -658,8 +658,7 @@ public CompiledLibrary resolveLibraryFromIncludeDef(IncludeDef includeDef) { public CompiledLibrary resolveLibrary(VersionedIdentifier libraryIdentifier) { // TODO: Need to support loading from ELM so we don't need options. - ArrayList errors = new ArrayList(); - CompiledLibrary referencedLibrary = libraryManager.resolveLibrary(libraryIdentifier, options, errors); + CompiledLibrary referencedLibrary = libraryManager.resolveLibrary(libraryIdentifier); // TODO: Report translation errors here... //for (CqlTranslatorException error : errors) { // this.recordParsingException(error); diff --git a/Src/java/elm-fhir/src/main/java/org/cqframework/cql/elm/requirements/fhir/DataRequirementsProcessor.java b/Src/java/elm-fhir/src/main/java/org/cqframework/cql/elm/requirements/fhir/DataRequirementsProcessor.java index 7983e6bc8..2691dee38 100644 --- a/Src/java/elm-fhir/src/main/java/org/cqframework/cql/elm/requirements/fhir/DataRequirementsProcessor.java +++ b/Src/java/elm-fhir/src/main/java/org/cqframework/cql/elm/requirements/fhir/DataRequirementsProcessor.java @@ -1,7 +1,7 @@ package org.cqframework.cql.elm.requirements.fhir; import ca.uhn.fhir.context.FhirVersionEnum; -import org.cqframework.cql.cql2elm.CqlTranslatorOptions; +import org.cqframework.cql.cql2elm.CqlCompilerOptions; import org.cqframework.cql.cql2elm.LibraryManager; import org.cqframework.cql.elm.evaluation.ElmAnalysisHelper; import org.cqframework.cql.elm.evaluation.ElmEvaluationHelper; @@ -46,19 +46,19 @@ public java.util.List getValidationMessages() { } public Library gatherDataRequirements(LibraryManager libraryManager, CompiledLibrary translatedLibrary, - CqlTranslatorOptions options, Set expressions, + CqlCompilerOptions options, Set expressions, boolean includeLogicDefinitions) { return gatherDataRequirements(libraryManager, translatedLibrary, options, expressions, includeLogicDefinitions, true); } public Library gatherDataRequirements(LibraryManager libraryManager, CompiledLibrary translatedLibrary, - CqlTranslatorOptions options, Set expressions, + CqlCompilerOptions options, Set expressions, boolean includeLogicDefinitions, boolean recursive) { return gatherDataRequirements(libraryManager, translatedLibrary, options, expressions, null, null, includeLogicDefinitions, recursive); } public Library gatherDataRequirements(LibraryManager libraryManager, CompiledLibrary translatedLibrary, - CqlTranslatorOptions options, Set expressions, + CqlCompilerOptions options, Set expressions, Map parameters, boolean includeLogicDefinitions, boolean recursive) { return gatherDataRequirements(libraryManager, translatedLibrary, options, expressions, parameters, null, includeLogicDefinitions, recursive); @@ -82,7 +82,7 @@ public Library gatherDataRequirements(LibraryManager libraryManager, CompiledLib * @return */ public Library gatherDataRequirements(LibraryManager libraryManager, CompiledLibrary translatedLibrary, - CqlTranslatorOptions options, Set expressions, + CqlCompilerOptions options, Set expressions, Map parameters, ZonedDateTime evaluationDateTime, boolean includeLogicDefinitions, boolean recursive) { if (libraryManager == null) { diff --git a/Src/java/elm-fhir/src/test/java/org/cqframework/cql/elm/requirements/fhir/DataRequirementsProcessorTest.java b/Src/java/elm-fhir/src/test/java/org/cqframework/cql/elm/requirements/fhir/DataRequirementsProcessorTest.java index 412875539..f042bf5b4 100644 --- a/Src/java/elm-fhir/src/test/java/org/cqframework/cql/elm/requirements/fhir/DataRequirementsProcessorTest.java +++ b/Src/java/elm-fhir/src/test/java/org/cqframework/cql/elm/requirements/fhir/DataRequirementsProcessorTest.java @@ -2,10 +2,8 @@ import ca.uhn.fhir.context.FhirContext; import org.cqframework.cql.cql2elm.*; +import org.cqframework.cql.cql2elm.model.CompiledLibrary; import org.cqframework.cql.cql2elm.quick.FhirLibrarySourceProvider; -import org.fhir.ucum.UcumEssenceService; -import org.fhir.ucum.UcumException; -import org.fhir.ucum.UcumService; import org.hl7.cql.model.NamespaceInfo; import org.hl7.elm.r1.*; import ca.uhn.fhir.parser.IParser; @@ -33,19 +31,14 @@ public class DataRequirementsProcessorTest { private static Logger logger = LoggerFactory.getLogger(DataRequirementsProcessorTest.class); - private static ModelManager modelManager; - private static LibraryManager libraryManager; - private static UcumService ucumService; - private static FhirContext fhirContext; private static FhirContext getFhirContext() { return FhirContext.forR5Cached(); } @Test public void TestDataRequirementsProcessor() { - CqlTranslatorOptions cqlTranslatorOptions = new CqlTranslatorOptions(); - cqlTranslatorOptions.getFormats().add(CqlTranslator.Format.JSON); - cqlTranslatorOptions.getOptions().add(CqlTranslatorOptions.Options.EnableAnnotations); + CqlCompilerOptions cqlTranslatorOptions = new CqlCompilerOptions(); + cqlTranslatorOptions.getOptions().add(CqlCompilerOptions.Options.EnableAnnotations); try { /* OpioidCDSCommon.cql @@ -68,13 +61,12 @@ public void TestDataRequirementsProcessor() { TSCComponent-v0-0-001-FHIR-4-0-1.xml PreventiveCareandWellness-v0-0-001-FHIR-4-0-1.xml */ - CqlTranslator translator = createTranslator("CompositeMeasures/cql/EXM124-9.0.000.cql", cqlTranslatorOptions);//"OpioidCDS/cql/OpioidCDSCommon.cql", cqlTranslatorOptions); - translator.toELM(); - assertTrue(translator.getErrors().isEmpty()); - libraryManager.cacheLibrary(translator.getTranslatedLibrary()); + var setup = setup("CompositeMeasures/cql/EXM124-9.0.000.cql", cqlTranslatorOptions);//"OpioidCDS/cql/OpioidCDSCommon.cql", cqlTranslatorOptions); + + DataRequirementsProcessor dqReqTrans = new DataRequirementsProcessor(); - org.hl7.fhir.r5.model.Library moduleDefinitionLibrary = dqReqTrans.gatherDataRequirements(libraryManager, translator.getTranslatedLibrary(), cqlTranslatorOptions, null, false); + org.hl7.fhir.r5.model.Library moduleDefinitionLibrary = dqReqTrans.gatherDataRequirements(setup.manager(), setup.library(), cqlTranslatorOptions, null, false); assertTrue(moduleDefinitionLibrary.getType().getCode("http://terminology.hl7.org/CodeSystem/library-type").equalsIgnoreCase("module-definition")); FhirContext context = getFhirContext(); @@ -109,21 +101,17 @@ private ParameterDefinition getParameter(org.hl7.fhir.r5.model.Library moduleDef @Test public void TestDataRequirementsProcessorOpioidIssueExpression() { - CqlTranslatorOptions cqlTranslatorOptions = new CqlTranslatorOptions(); - cqlTranslatorOptions.getFormats().add(CqlTranslator.Format.JSON); + CqlCompilerOptions cqlTranslatorOptions = new CqlCompilerOptions(); cqlTranslatorOptions.setCollapseDataRequirements(true); cqlTranslatorOptions.setAnalyzeDataRequirements(true); try { NamespaceInfo ni = new NamespaceInfo("fhir.cdc.opioid-cds", "http://fhir.org/guides/cdc/opioid-cds"); - CqlTranslator translator = createTranslator(ni, "OpioidCDSSTU3/cql/OpioidCDSREC10_bug_repo.cql", cqlTranslatorOptions); - translator.toELM(); - assertTrue(translator.getErrors().isEmpty()); - libraryManager.cacheLibrary(translator.getTranslatedLibrary()); + var setup = setup(ni, "OpioidCDSSTU3/cql/OpioidCDSREC10.cql", cqlTranslatorOptions); + DataRequirementsProcessor dqReqTrans = new DataRequirementsProcessor(); Set expressions = new HashSet(); expressions.add("Negative PCP Screenings Count Since Last POS"); - org.hl7.fhir.r5.model.Library moduleDefinitionLibrary = dqReqTrans.gatherDataRequirements(libraryManager, - translator.getTranslatedLibrary(), cqlTranslatorOptions, expressions, false); + org.hl7.fhir.r5.model.Library moduleDefinitionLibrary = dqReqTrans.gatherDataRequirements(setup.manager(), setup.library(), cqlTranslatorOptions, expressions, false); assertNotNull(moduleDefinitionLibrary); RelatedArtifact ra = null; @@ -192,19 +180,14 @@ public void TestDataRequirementsProcessorOpioidIssueExpression() { @Test public void TestDataRequirementsProcessorOpioidIssueLibrary() { - CqlTranslatorOptions cqlTranslatorOptions = new CqlTranslatorOptions(); - cqlTranslatorOptions.getFormats().add(CqlTranslator.Format.JSON); + CqlCompilerOptions cqlTranslatorOptions = new CqlCompilerOptions(); cqlTranslatorOptions.setCollapseDataRequirements(true); cqlTranslatorOptions.setAnalyzeDataRequirements(true); try { NamespaceInfo ni = new NamespaceInfo("fhir.cdc.opioid-cds", "http://fhir.org/guides/cdc/opioid-cds"); - CqlTranslator translator = createTranslator(ni, "OpioidCDSSTU3/cql/OpioidCDSREC10_bug_repo.cql", cqlTranslatorOptions); - translator.toELM(); - assertTrue(translator.getErrors().isEmpty()); - libraryManager.cacheLibrary(translator.getTranslatedLibrary()); + var setup = setup(ni, "OpioidCDSSTU3/cql/OpioidCDSREC10.cql", cqlTranslatorOptions); DataRequirementsProcessor dqReqTrans = new DataRequirementsProcessor(); - org.hl7.fhir.r5.model.Library moduleDefinitionLibrary = dqReqTrans.gatherDataRequirements(libraryManager, - translator.getTranslatedLibrary(), cqlTranslatorOptions, null, false); + org.hl7.fhir.r5.model.Library moduleDefinitionLibrary = dqReqTrans.gatherDataRequirements(setup.manager(), setup.library(), cqlTranslatorOptions, null, false); assertNotNull(moduleDefinitionLibrary); RelatedArtifact ra = null; @@ -353,18 +336,16 @@ public void TestDataRequirementsProcessorOpioidIssueLibrary() { @Test public void TestDataRequirementsProcessorWithExpressions() { - CqlTranslatorOptions cqlTranslatorOptions = new CqlTranslatorOptions(); - cqlTranslatorOptions.getFormats().add(CqlTranslator.Format.JSON); + CqlCompilerOptions cqlTranslatorOptions = new CqlCompilerOptions(); try { Set expressions = new HashSet<>(); // TODO - add expressions to expressions expressions.add("Conditions Indicating End of Life or With Limited Life Expectancy");//Active Ambulatory Opioid Rx"); - CqlTranslator translator = createTranslator("OpioidCDS/cql/OpioidCDSCommon.cql", cqlTranslatorOptions); - translator.toELM(); - assertTrue(translator.getErrors().isEmpty()); - libraryManager.cacheLibrary(translator.getTranslatedLibrary()); + var setup = setup("OpioidCDS/cql/OpioidCDSCommon.cql", cqlTranslatorOptions); + + DataRequirementsProcessor dqReqTrans = new DataRequirementsProcessor(); - org.hl7.fhir.r5.model.Library moduleDefinitionLibrary = dqReqTrans.gatherDataRequirements(libraryManager, translator.getTranslatedLibrary(), cqlTranslatorOptions, expressions, false); + org.hl7.fhir.r5.model.Library moduleDefinitionLibrary = dqReqTrans.gatherDataRequirements(setup.manager(), setup.library(), cqlTranslatorOptions, expressions, false); assertTrue(moduleDefinitionLibrary.getType().getCode("http://terminology.hl7.org/CodeSystem/library-type").equalsIgnoreCase("module-definition")); List directReferenceCodes = moduleDefinitionLibrary.getExtensionsByUrl("http://hl7.org/fhir/us/cqfmeasures/StructureDefinition/cqfm-directReferenceCode"); @@ -423,16 +404,14 @@ public void TestDataRequirementsProcessorWithExpressions() { @Test public void TestLibraryDataRequirements() { - CqlTranslatorOptions cqlTranslatorOptions = new CqlTranslatorOptions(); - cqlTranslatorOptions.getFormats().add(CqlTranslator.Format.JSON); + CqlCompilerOptions cqlTranslatorOptions = new CqlCompilerOptions(); + try { // CqlTranslator translator = createTranslator("/ecqm/resources/library-EXM506-2.2.000.json", cqlTranslatorOptions); - CqlTranslator translator = createTranslator("CompositeMeasures/cql/BCSComponent.cql", cqlTranslatorOptions); - translator.toELM(); - assertTrue(translator.getErrors().isEmpty()); - libraryManager.cacheLibrary(translator.getTranslatedLibrary()); + var setup = setup("CompositeMeasures/cql/BCSComponent.cql", cqlTranslatorOptions); + DataRequirementsProcessor dqReqTrans = new DataRequirementsProcessor(); - org.hl7.fhir.r5.model.Library moduleDefinitionLibrary = dqReqTrans.gatherDataRequirements(libraryManager, translator.getTranslatedLibrary(), cqlTranslatorOptions, null, false); + org.hl7.fhir.r5.model.Library moduleDefinitionLibrary = dqReqTrans.gatherDataRequirements(setup.manager(), setup.library(), cqlTranslatorOptions, null, false); assertTrue(moduleDefinitionLibrary.getType().getCode("http://terminology.hl7.org/CodeSystem/library-type").equalsIgnoreCase("module-definition")); List directReferenceCodes = moduleDefinitionLibrary.getExtensionsByUrl("http://hl7.org/fhir/us/cqfmeasures/StructureDefinition/cqfm-directReferenceCode"); @@ -490,17 +469,14 @@ public void TestLibraryDataRequirements() { @Test public void TestLibraryDataRequirementsRecursive() { - CqlTranslatorOptions cqlTranslatorOptions = new CqlTranslatorOptions(); - cqlTranslatorOptions.getFormats().add(CqlTranslator.Format.JSON); + CqlCompilerOptions cqlTranslatorOptions = new CqlCompilerOptions(); cqlTranslatorOptions.setCollapseDataRequirements(true); try { - CqlTranslator translator = createTranslator("DataRequirements/DataRequirementsLibraryTest.cql", cqlTranslatorOptions); - translator.toELM(); - assertTrue(translator.getErrors().isEmpty()); - libraryManager.cacheLibrary(translator.getTranslatedLibrary()); + var setup = setup("DataRequirements/DataRequirementsLibraryTest.cql", cqlTranslatorOptions); + DataRequirementsProcessor dqReqTrans = new DataRequirementsProcessor(); - org.hl7.fhir.r5.model.Library moduleDefinitionLibrary = dqReqTrans.gatherDataRequirements(libraryManager, translator.getTranslatedLibrary(), cqlTranslatorOptions, null, false); + org.hl7.fhir.r5.model.Library moduleDefinitionLibrary = dqReqTrans.gatherDataRequirements(setup.manager(), setup.library(), cqlTranslatorOptions, null, false); assertTrue(moduleDefinitionLibrary.getType().getCode("http://terminology.hl7.org/CodeSystem/library-type").equalsIgnoreCase("module-definition")); DataRequirement encounterRequirement = null; for (DataRequirement dr : moduleDefinitionLibrary.getDataRequirement()) { @@ -522,15 +498,14 @@ public void TestLibraryDataRequirementsRecursive() { @Test public void TestDataRequirementsFHIRReferences() { - CqlTranslatorOptions cqlTranslatorOptions = new CqlTranslatorOptions(); - cqlTranslatorOptions.getFormats().add(CqlTranslator.Format.JSON); + CqlCompilerOptions cqlTranslatorOptions = new CqlCompilerOptions(); + try { - CqlTranslator translator = createTranslator("FHIRReferencesRevisited.cql", cqlTranslatorOptions); - translator.toELM(); - assertTrue(translator.getErrors().isEmpty()); - libraryManager.cacheLibrary(translator.getTranslatedLibrary()); + var setup = setup("FHIRReferencesRevisited.cql", cqlTranslatorOptions); + + DataRequirementsProcessor dqReqTrans = new DataRequirementsProcessor(); - org.hl7.fhir.r5.model.Library moduleDefinitionLibrary = dqReqTrans.gatherDataRequirements(libraryManager, translator.getTranslatedLibrary(), cqlTranslatorOptions, null, false); + org.hl7.fhir.r5.model.Library moduleDefinitionLibrary = dqReqTrans.gatherDataRequirements(setup.manager(), setup.library(), cqlTranslatorOptions, null, false); FhirContext context = getFhirContext(); IParser parser = context.newJsonParser(); @@ -542,56 +517,47 @@ public void TestDataRequirementsFHIRReferences() { } } - private CqlTranslatorOptions getTranslatorOptions() { - CqlTranslatorOptions cqlTranslatorOptions = new CqlTranslatorOptions(); - cqlTranslatorOptions.getFormats().add(CqlTranslator.Format.JSON); - return cqlTranslatorOptions; + private CqlCompilerOptions getCompilerOptions() { + return new CqlCompilerOptions(); } - private CqlTranslator setupDataRequirementsGather(String fileName, CqlTranslatorOptions cqlTranslatorOptions) throws IOException { + private Setup setupDataRequirementsGather(String fileName, CqlCompilerOptions cqlTranslatorOptions) throws IOException { cqlTranslatorOptions.setCollapseDataRequirements(true); cqlTranslatorOptions.setAnalyzeDataRequirements(false); - CqlTranslator translator = createTranslator(fileName, cqlTranslatorOptions); - translator.toELM(); - assertTrue(translator.getErrors().isEmpty()); - libraryManager.cacheLibrary(translator.getTranslatedLibrary()); - return translator; + return setup(fileName, cqlTranslatorOptions); + } - private CqlTranslator setupDataRequirementsAnalysis(String fileName, CqlTranslatorOptions cqlTranslatorOptions) throws IOException { + private Setup setupDataRequirementsAnalysis(String fileName, CqlCompilerOptions cqlTranslatorOptions) throws IOException { cqlTranslatorOptions.setCollapseDataRequirements(true); cqlTranslatorOptions.setAnalyzeDataRequirements(true); - CqlTranslator translator = createTranslator(fileName, cqlTranslatorOptions); - translator.toELM(); - assertTrue(translator.getErrors().isEmpty()); - libraryManager.cacheLibrary(translator.getTranslatedLibrary()); - return translator; + return setup(fileName, cqlTranslatorOptions); } - private org.hl7.fhir.r5.model.Library getModuleDefinitionLibrary(CqlTranslator translator, CqlTranslatorOptions cqlTranslatorOptions, Map parameters) { + private org.hl7.fhir.r5.model.Library getModuleDefinitionLibrary(Setup setup, CqlCompilerOptions cqlTranslatorOptions, Map parameters) { DataRequirementsProcessor dqReqTrans = new DataRequirementsProcessor(); - org.hl7.fhir.r5.model.Library moduleDefinitionLibrary = dqReqTrans.gatherDataRequirements(libraryManager, translator.getTranslatedLibrary(), cqlTranslatorOptions, null, parameters, false,false); + org.hl7.fhir.r5.model.Library moduleDefinitionLibrary = dqReqTrans.gatherDataRequirements(setup.manager(), setup.library(), cqlTranslatorOptions, null, parameters, false,false); assertTrue(moduleDefinitionLibrary.getType().getCode("http://terminology.hl7.org/CodeSystem/library-type").equalsIgnoreCase("module-definition")); return moduleDefinitionLibrary; } - private org.hl7.fhir.r5.model.Library getModuleDefinitionLibrary(CqlTranslator translator, CqlTranslatorOptions cqlTranslatorOptions, Map parameters, ZonedDateTime evaluationDateTime) { + private org.hl7.fhir.r5.model.Library getModuleDefinitionLibrary(Setup setup, CqlCompilerOptions cqlTranslatorOptions, Map parameters, ZonedDateTime evaluationDateTime) { DataRequirementsProcessor dqReqTrans = new DataRequirementsProcessor(); - org.hl7.fhir.r5.model.Library moduleDefinitionLibrary = dqReqTrans.gatherDataRequirements(libraryManager, translator.getTranslatedLibrary(), cqlTranslatorOptions, null, parameters, evaluationDateTime, false,false); + org.hl7.fhir.r5.model.Library moduleDefinitionLibrary = dqReqTrans.gatherDataRequirements(setup.manager(), setup.library(), cqlTranslatorOptions, null, parameters, evaluationDateTime, false,false); assertTrue(moduleDefinitionLibrary.getType().getCode("http://terminology.hl7.org/CodeSystem/library-type").equalsIgnoreCase("module-definition")); return moduleDefinitionLibrary; } - private org.hl7.fhir.r5.model.Library getModuleDefinitionLibrary(CqlTranslator translator, CqlTranslatorOptions cqlTranslatorOptions) { + private org.hl7.fhir.r5.model.Library getModuleDefinitionLibrary(Setup setup, CqlCompilerOptions cqlTranslatorOptions) { DataRequirementsProcessor dqReqTrans = new DataRequirementsProcessor(); - org.hl7.fhir.r5.model.Library moduleDefinitionLibrary = dqReqTrans.gatherDataRequirements(libraryManager, translator.getTranslatedLibrary(), cqlTranslatorOptions, null, false); + org.hl7.fhir.r5.model.Library moduleDefinitionLibrary = dqReqTrans.gatherDataRequirements(setup.manager(), setup.library(), cqlTranslatorOptions, null, false); assertTrue(moduleDefinitionLibrary.getType().getCode("http://terminology.hl7.org/CodeSystem/library-type").equalsIgnoreCase("module-definition")); return moduleDefinitionLibrary; } - private org.hl7.fhir.r5.model.Library getModuleDefinitionLibrary(CqlTranslator translator, CqlTranslatorOptions cqlTranslatorOptions, Set expressions) { + private org.hl7.fhir.r5.model.Library getModuleDefinitionLibrary(Setup setup, CqlCompilerOptions cqlTranslatorOptions, Set expressions) { DataRequirementsProcessor dqReqTrans = new DataRequirementsProcessor(); - org.hl7.fhir.r5.model.Library moduleDefinitionLibrary = dqReqTrans.gatherDataRequirements(libraryManager, translator.getTranslatedLibrary(), cqlTranslatorOptions, expressions, false); + org.hl7.fhir.r5.model.Library moduleDefinitionLibrary = dqReqTrans.gatherDataRequirements(setup.manager(), setup.library(), cqlTranslatorOptions, expressions, false); assertTrue(moduleDefinitionLibrary.getType().getCode("http://terminology.hl7.org/CodeSystem/library-type").equalsIgnoreCase("module-definition")); return moduleDefinitionLibrary; } @@ -615,11 +581,11 @@ private Iterable getDataRequirementsForType(Iterable expectedDataRequirements = getDataRequirementsForType(moduleDefinitionLibrary.getDataRequirement(), Enumerations.FHIRTypes.CONDITION); assertTrue(expectedDataRequirements.iterator().hasNext()); @@ -628,9 +594,9 @@ public void TestFunctionDataRequirements() throws IOException { @Test public void TestNonElectiveInpatientEncounterDataRequirements() throws IOException { - CqlTranslatorOptions translatorOptions = getTranslatorOptions(); - CqlTranslator translator = setupDataRequirementsGather("CMS104/TJCOverallFHIR.cql", translatorOptions); - org.hl7.fhir.r5.model.Library moduleDefinitionLibrary = getModuleDefinitionLibrary(translator, translatorOptions, Collections.singleton("Non Elective Inpatient Encounter")); + CqlCompilerOptions compilerOptions = getCompilerOptions(); + var manager = setupDataRequirementsGather("CMS104/TJCOverallFHIR.cql", compilerOptions); + org.hl7.fhir.r5.model.Library moduleDefinitionLibrary = getModuleDefinitionLibrary(manager, compilerOptions, Collections.singleton("Non Elective Inpatient Encounter")); // DataRequirements of the Non Elective Inpatient Encounter expression: // [Encounter: "Non-Elective Inpatient Encounter"] @@ -650,9 +616,9 @@ public void TestNonElectiveInpatientEncounterDataRequirements() throws IOExcepti @Test public void TestAllStrokeEncounterDataRequirements() throws IOException { - CqlTranslatorOptions translatorOptions = getTranslatorOptions(); - CqlTranslator translator = setupDataRequirementsGather("CMS104/TJCOverallFHIR.cql", translatorOptions); - org.hl7.fhir.r5.model.Library moduleDefinitionLibrary = getModuleDefinitionLibrary(translator, translatorOptions, Collections.singleton("All Stroke Encounter")); + CqlCompilerOptions compilerOptions = getCompilerOptions(); + var manager = setupDataRequirementsGather("CMS104/TJCOverallFHIR.cql", compilerOptions); + org.hl7.fhir.r5.model.Library moduleDefinitionLibrary = getModuleDefinitionLibrary(manager, compilerOptions, Collections.singleton("All Stroke Encounter")); // DataRequirements of the All Stroke Encounter expression: // [Encounter: "Non-Elective Inpatient Encounter"] (from Non Elective Inpatient Encounter) @@ -677,9 +643,9 @@ public void TestAllStrokeEncounterDataRequirements() throws IOException { @Test public void TestCMS104DataRequirements() throws IOException { - CqlTranslatorOptions translatorOptions = getTranslatorOptions(); - CqlTranslator translator = setupDataRequirementsGather("CMS104/DischargedonAntithromboticTherapyFHIR.cql", translatorOptions); - org.hl7.fhir.r5.model.Library moduleDefinitionLibrary = getModuleDefinitionLibrary(translator, translatorOptions); + CqlCompilerOptions compilerOptions = getCompilerOptions(); + var manager = setupDataRequirementsGather("CMS104/DischargedonAntithromboticTherapyFHIR.cql", compilerOptions); + org.hl7.fhir.r5.model.Library moduleDefinitionLibrary = getModuleDefinitionLibrary(manager, compilerOptions); // DataRequirements of the All Stroke Encounter expression: // [Encounter: "Non-Elective Inpatient Encounter"] (from Non Elective Inpatient Encounter) @@ -707,9 +673,9 @@ public void TestCMS104DataRequirements() throws IOException { @Test public void TestDataRequirementsAnalysisCase1() throws IOException { - CqlTranslatorOptions translatorOptions = getTranslatorOptions(); - CqlTranslator translator = setupDataRequirementsAnalysis("TestCases/TestCase1.cql", translatorOptions); - org.hl7.fhir.r5.model.Library moduleDefinitionLibrary = getModuleDefinitionLibrary(translator, translatorOptions); + CqlCompilerOptions compilerOptions = getCompilerOptions(); + var manager = setupDataRequirementsAnalysis("TestCases/TestCase1.cql", compilerOptions); + org.hl7.fhir.r5.model.Library moduleDefinitionLibrary = getModuleDefinitionLibrary(manager, compilerOptions); /* 1. @@ -719,7 +685,7 @@ public void TestDataRequirementsAnalysisCase1() throws IOException { */ // Validate the ELM is correct - ExpressionDef ed = translator.getTranslatedLibrary().resolveExpressionRef("ESRD Observations"); + ExpressionDef ed = manager.library().resolveExpressionRef("ESRD Observations"); assertTrue(ed.getExpression() instanceof Retrieve); Retrieve r = (Retrieve)ed.getExpression(); assertEquals(r.getCodeProperty(), "code"); @@ -747,9 +713,9 @@ public void TestDataRequirementsAnalysisCase1() throws IOException { @Test public void TestDataRequirementsAnalysisCase1b() throws IOException { - CqlTranslatorOptions translatorOptions = getTranslatorOptions(); - CqlTranslator translator = setupDataRequirementsAnalysis("TestCases/TestCase1b.cql", translatorOptions); - org.hl7.fhir.r5.model.Library moduleDefinitionLibrary = getModuleDefinitionLibrary(translator, translatorOptions); + CqlCompilerOptions compilerOptions = getCompilerOptions(); + var manager = setupDataRequirementsAnalysis("TestCases/TestCase1b.cql", compilerOptions); + org.hl7.fhir.r5.model.Library moduleDefinitionLibrary = getModuleDefinitionLibrary(manager, compilerOptions); /* 1b. Similar to 1, but not on a primary code path and with a constant @@ -759,7 +725,7 @@ public void TestDataRequirementsAnalysisCase1b() throws IOException { */ // Validate the ELM is correct - ExpressionDef ed = translator.getTranslatedLibrary().resolveExpressionRef("Observations"); + ExpressionDef ed = manager.library().resolveExpressionRef("Observations"); assertTrue(ed.getExpression() instanceof Query); Query q = (Query)ed.getExpression(); assertTrue(q.getSource() != null && q.getSource().size() == 1); @@ -800,11 +766,11 @@ public void TestDataRequirementsAnalysisCase1b() throws IOException { @Test public void TestDataRequirementsAnalysisCase1c() throws IOException { - CqlTranslatorOptions translatorOptions = getTranslatorOptions(); - CqlTranslator translator = setupDataRequirementsAnalysis("TestCases/TestCase1c.cql", translatorOptions); + CqlCompilerOptions compilerOptions = getCompilerOptions(); + var manager = setupDataRequirementsAnalysis("TestCases/TestCase1c.cql", compilerOptions); Set expressions = new HashSet<>(); expressions.add("TestReferencedDataRequirement"); - org.hl7.fhir.r5.model.Library moduleDefinitionLibrary = getModuleDefinitionLibrary(translator, translatorOptions, expressions); + org.hl7.fhir.r5.model.Library moduleDefinitionLibrary = getModuleDefinitionLibrary(manager, compilerOptions, expressions); /* 1c: Referenced data requirement @@ -857,9 +823,9 @@ public void TestDataRequirementsAnalysisCase1c() throws IOException { @Test public void TestDataRequirementsAnalysisCase2a() throws IOException { - CqlTranslatorOptions translatorOptions = getTranslatorOptions(); - CqlTranslator translator = setupDataRequirementsAnalysis("TestCases/TestCase2a.cql", translatorOptions); - org.hl7.fhir.r5.model.Library moduleDefinitionLibrary = getModuleDefinitionLibrary(translator, translatorOptions); + CqlCompilerOptions compilerOptions = getCompilerOptions(); + var manager = setupDataRequirementsAnalysis("TestCases/TestCase2a.cql", compilerOptions); + org.hl7.fhir.r5.model.Library moduleDefinitionLibrary = getModuleDefinitionLibrary(manager, compilerOptions); /* 2a @@ -874,7 +840,7 @@ public void TestDataRequirementsAnalysisCase2a() throws IOException { */ // Validate the ELM is correct - ExpressionDef ed = translator.getTranslatedLibrary().resolveExpressionRef("HospiceEncounterClaimsA"); + ExpressionDef ed = manager.library().resolveExpressionRef("HospiceEncounterClaimsA"); assertTrue(ed.getExpression() instanceof Query); Query q = (Query)ed.getExpression(); assertTrue(q.getSource() != null && q.getSource().size() == 1); @@ -912,9 +878,9 @@ public void TestDataRequirementsAnalysisCase2a() throws IOException { @Test public void TestDataRequirementsAnalysisCase2b() throws IOException { - CqlTranslatorOptions translatorOptions = getTranslatorOptions(); - CqlTranslator translator = setupDataRequirementsAnalysis("TestCases/TestCase2b.cql", translatorOptions); - org.hl7.fhir.r5.model.Library moduleDefinitionLibrary = getModuleDefinitionLibrary(translator, translatorOptions); + CqlCompilerOptions compilerOptions = getCompilerOptions(); + var manager = setupDataRequirementsAnalysis("TestCases/TestCase2b.cql", compilerOptions); + org.hl7.fhir.r5.model.Library moduleDefinitionLibrary = getModuleDefinitionLibrary(manager, compilerOptions); /* 2b - Bound Measurement Period @@ -930,7 +896,7 @@ public void TestDataRequirementsAnalysisCase2b() throws IOException { */ // Validate the ELM is correct - ExpressionDef ed = translator.getTranslatedLibrary().resolveExpressionRef("HospiceEncounterClaimsBBoundDate"); + ExpressionDef ed = manager.library().resolveExpressionRef("HospiceEncounterClaimsBBoundDate"); assertTrue(ed.getExpression() instanceof Query); Query q = (Query)ed.getExpression(); assertTrue(q.getSource() != null && q.getSource().size() == 1); @@ -970,11 +936,11 @@ public void TestDataRequirementsAnalysisCase2b() throws IOException { @Test public void TestDataRequirementsAnalysisCase2e() throws IOException { - CqlTranslatorOptions translatorOptions = getTranslatorOptions(); - CqlTranslator translator = setupDataRequirementsAnalysis("TestCases/TestCase2e.cql", translatorOptions); + CqlCompilerOptions compilerOptions = getCompilerOptions(); + var manager = setupDataRequirementsAnalysis("TestCases/TestCase2e.cql", compilerOptions); // Evaluate this test as of 12/31/2022 ZonedDateTime evaluationDateTime = ZonedDateTime.of(2022, 12, 31, 0, 0, 0, 0, ZoneId.systemDefault()); - org.hl7.fhir.r5.model.Library moduleDefinitionLibrary = getModuleDefinitionLibrary(translator, translatorOptions, new HashMap(), evaluationDateTime); + org.hl7.fhir.r5.model.Library moduleDefinitionLibrary = getModuleDefinitionLibrary(manager, compilerOptions, new HashMap(), evaluationDateTime); /* 2e - Timing phrase 90 days or less before @@ -987,7 +953,7 @@ public void TestDataRequirementsAnalysisCase2e() throws IOException { where onset as Period starts 90 days or less before Today() */ - ExpressionDef ed = translator.getTranslatedLibrary().resolveExpressionRef("Date Filter Expression"); + ExpressionDef ed = manager.library().resolveExpressionRef("Date Filter Expression"); assertTrue(ed.getExpression() instanceof Query); Query q = (Query)ed.getExpression(); assertTrue(q.getSource() != null && q.getSource().size() == 1); @@ -1030,9 +996,9 @@ public void TestDataRequirementsAnalysisCase2e() throws IOException { @Test public void TestDataRequirementsAnalysisCase2g() throws IOException { - CqlTranslatorOptions translatorOptions = getTranslatorOptions(); - CqlTranslator translator = setupDataRequirementsAnalysis("TestCases/TestCase2g.cql", translatorOptions); - org.hl7.fhir.r5.model.Library moduleDefinitionLibrary = getModuleDefinitionLibrary(translator, translatorOptions, new HashMap()); + CqlCompilerOptions compilerOptions = getCompilerOptions(); + var manager = setupDataRequirementsAnalysis("TestCases/TestCase2g.cql", compilerOptions); + org.hl7.fhir.r5.model.Library moduleDefinitionLibrary = getModuleDefinitionLibrary(manager, compilerOptions, new HashMap()); /* 2g - Equal to a compile-time literal function @@ -1045,7 +1011,7 @@ public void TestDataRequirementsAnalysisCase2g() throws IOException { where C.onset as dateTime = Today() */ - ExpressionDef ed = translator.getTranslatedLibrary().resolveExpressionRef("DateTimeEqualToFunction"); + ExpressionDef ed = manager.library().resolveExpressionRef("DateTimeEqualToFunction"); assertTrue(ed.getExpression() instanceof Query); Query q = (Query)ed.getExpression(); assertTrue(q.getSource() != null && q.getSource().size() == 1); @@ -1077,9 +1043,9 @@ public void TestDataRequirementsAnalysisCase2g() throws IOException { @Test public void TestDataRequirementsAnalysisCase2i() throws IOException { - CqlTranslatorOptions translatorOptions = getTranslatorOptions(); - CqlTranslator translator = setupDataRequirementsAnalysis("TestCases/TestCase2i.cql", translatorOptions); - org.hl7.fhir.r5.model.Library moduleDefinitionLibrary = getModuleDefinitionLibrary(translator, translatorOptions, new HashMap()); + CqlCompilerOptions compilerOptions = getCompilerOptions(); + var manager = setupDataRequirementsAnalysis("TestCases/TestCase2i.cql", compilerOptions); + org.hl7.fhir.r5.model.Library moduleDefinitionLibrary = getModuleDefinitionLibrary(manager, compilerOptions, new HashMap()); /* 2i - In a compile-time literal interval @@ -1094,7 +1060,7 @@ public void TestDataRequirementsAnalysisCase2i() throws IOException { ZonedDateTime evaluationDateTime = ZonedDateTime.of(2022, 12, 31, 0, 0, 0, 0, ZoneId.systemDefault()); OffsetDateTime expectedPeriodStart = evaluationDateTime.toOffsetDateTime().minusDays(90); - ExpressionDef ed = translator.getTranslatedLibrary().resolveExpressionRef("Date Filter Expression"); + ExpressionDef ed = manager.library().resolveExpressionRef("Date Filter Expression"); assertTrue(ed.getExpression() instanceof Query); Query q = (Query)ed.getExpression(); assertTrue(q.getSource() != null && q.getSource().size() == 1); @@ -1127,9 +1093,9 @@ public void TestDataRequirementsAnalysisCase2i() throws IOException { @Test public void TestDataRequirementsAnalysisCase2j() throws IOException { - CqlTranslatorOptions translatorOptions = getTranslatorOptions(); - CqlTranslator translator = setupDataRequirementsAnalysis("TestCases/TestCase2j.cql", translatorOptions); - org.hl7.fhir.r5.model.Library moduleDefinitionLibrary = getModuleDefinitionLibrary(translator, translatorOptions, new HashMap()); + CqlCompilerOptions compilerOptions = getCompilerOptions(); + var manager = setupDataRequirementsAnalysis("TestCases/TestCase2j.cql", compilerOptions); + org.hl7.fhir.r5.model.Library moduleDefinitionLibrary = getModuleDefinitionLibrary(manager, compilerOptions, new HashMap()); /* 2j - Before and after @@ -1148,7 +1114,7 @@ public void TestDataRequirementsAnalysisCase2j() throws IOException { OffsetDateTime expectedPeriodEnd1 = ZonedDateTime.of(9999, 12, 31, 23, 59, 59, 999000000, ZoneId.of("UTC")).toOffsetDateTime(); OffsetDateTime expectedPeriodStart2 = ZonedDateTime.of(1, 1, 1, 0, 0, 0, 0, ZoneId.of("UTC")).toOffsetDateTime(); OffsetDateTime expectedPeriodEnd2 = evaluationDateTime.toOffsetDateTime(); - ExpressionDef ed = translator.getTranslatedLibrary().resolveExpressionRef("Date Filter Expression"); + ExpressionDef ed = manager.library().resolveExpressionRef("Date Filter Expression"); assertTrue(ed.getExpression() instanceof Query); Query q = (Query)ed.getExpression(); assertTrue(q.getSource() != null && q.getSource().size() == 1); @@ -1205,9 +1171,9 @@ else if (((Period)dfc.getValue()).hasEnd() @Test public void TestDataRequirementsAnalysisCase9a() throws IOException { - CqlTranslatorOptions translatorOptions = getTranslatorOptions(); - CqlTranslator translator = setupDataRequirementsAnalysis("TestCases/TestCase9a.cql", translatorOptions); - org.hl7.fhir.r5.model.Library moduleDefinitionLibrary = getModuleDefinitionLibrary(translator, translatorOptions); + CqlCompilerOptions compilerOptions = getCompilerOptions(); + var manager = setupDataRequirementsAnalysis("TestCases/TestCase9a.cql", compilerOptions); + org.hl7.fhir.r5.model.Library moduleDefinitionLibrary = getModuleDefinitionLibrary(manager, compilerOptions); /* Singleton element that is a reference @@ -1221,7 +1187,7 @@ public void TestDataRequirementsAnalysisCase9a() throws IOException { */ // Validate the ELM is correct - ExpressionDef ed = translator.getTranslatedLibrary().resolveExpressionRef("MedicationRequestWithEncounter"); + ExpressionDef ed = manager.library().resolveExpressionRef("MedicationRequestWithEncounter"); assertTrue(ed.getExpression() instanceof Query); Query q = (Query)ed.getExpression(); assertTrue(q.getSource() != null && q.getSource().size() == 1); @@ -1273,9 +1239,9 @@ public void TestDataRequirementsAnalysisCase9a() throws IOException { //@Test // TODO: Enable include when the reference is in a let public void TestDataRequirementsAnalysisCase9d() throws IOException { - CqlTranslatorOptions translatorOptions = getTranslatorOptions(); - CqlTranslator translator = setupDataRequirementsAnalysis("TestCases/TestCase9d.cql", translatorOptions); - org.hl7.fhir.r5.model.Library moduleDefinitionLibrary = getModuleDefinitionLibrary(translator, translatorOptions); + CqlCompilerOptions compilerOptions = getCompilerOptions(); + var manager = setupDataRequirementsAnalysis("TestCases/TestCase9d.cql", compilerOptions); + org.hl7.fhir.r5.model.Library moduleDefinitionLibrary = getModuleDefinitionLibrary(manager, compilerOptions); /* Element that is a choice, one of which is a reference, included in a let with the relationship in a where @@ -1293,7 +1259,7 @@ public void TestDataRequirementsAnalysisCase9d() throws IOException { */ // Validate the ELM is correct - ExpressionDef ed = translator.getTranslatedLibrary().resolveExpressionRef("MedicationRequestWithAspirinInLet"); + ExpressionDef ed = manager.library().resolveExpressionRef("MedicationRequestWithAspirinInLet"); assertTrue(ed.getExpression() instanceof Query); Query q = (Query)ed.getExpression(); assertTrue(q.getSource() != null && q.getSource().size() == 1); @@ -1357,9 +1323,9 @@ public void TestDataRequirementsAnalysisCase9d() throws IOException { @Test public void TestDataRequirementsAnalysisCase9e() throws IOException { - CqlTranslatorOptions translatorOptions = getTranslatorOptions(); - CqlTranslator translator = setupDataRequirementsAnalysis("TestCases/TestCase9e.cql", translatorOptions); - org.hl7.fhir.r5.model.Library moduleDefinitionLibrary = getModuleDefinitionLibrary(translator, translatorOptions); + CqlCompilerOptions compilerOptions = getCompilerOptions(); + var manager = setupDataRequirementsAnalysis("TestCases/TestCase9e.cql", compilerOptions); + org.hl7.fhir.r5.model.Library moduleDefinitionLibrary = getModuleDefinitionLibrary(manager, compilerOptions); /* Element that is a choice, one of which is a reference, included in a nested query in a where clause @@ -1377,7 +1343,7 @@ where exists ( */ // Validate the ELM is correct - ExpressionDef ed = translator.getTranslatedLibrary().resolveExpressionRef("MedicationRequestWithAspirinInWhere"); + ExpressionDef ed = manager.library().resolveExpressionRef("MedicationRequestWithAspirinInWhere"); assertTrue(ed.getExpression() instanceof Query); Query q = (Query)ed.getExpression(); assertTrue(q.getSource() != null && q.getSource().size() == 1); @@ -1437,9 +1403,9 @@ where exists ( @Test public void TestDataRequirementsAnalysisCase9f() throws IOException { - CqlTranslatorOptions translatorOptions = getTranslatorOptions(); - CqlTranslator translator = setupDataRequirementsAnalysis("TestCases/TestCase9f.cql", translatorOptions); - org.hl7.fhir.r5.model.Library moduleDefinitionLibrary = getModuleDefinitionLibrary(translator, translatorOptions); + CqlCompilerOptions compilerOptions = getCompilerOptions(); + var manager = setupDataRequirementsAnalysis("TestCases/TestCase9f.cql", compilerOptions); + org.hl7.fhir.r5.model.Library moduleDefinitionLibrary = getModuleDefinitionLibrary(manager, compilerOptions); /* Element that is a choice, one of which is a reference, joined in a where clause in a multi-source query @@ -1456,7 +1422,7 @@ public void TestDataRequirementsAnalysisCase9f() throws IOException { */ // Validate the ELM is correct - ExpressionDef ed = translator.getTranslatedLibrary().resolveExpressionRef("MedicationRequestWithAspirinInFrom"); + ExpressionDef ed = manager.library().resolveExpressionRef("MedicationRequestWithAspirinInFrom"); assertTrue(ed.getExpression() instanceof Query); Query q = (Query)ed.getExpression(); assertTrue(q.getSource() != null && q.getSource().size() == 2); @@ -1510,9 +1476,9 @@ public void TestDataRequirementsAnalysisCase9f() throws IOException { @Test public void TestDataRequirementsAnalysisCase10a() throws IOException { - CqlTranslatorOptions translatorOptions = getTranslatorOptions(); - CqlTranslator translator = setupDataRequirementsAnalysis("TestCases/TestCase10a.cql", translatorOptions); - org.hl7.fhir.r5.model.Library moduleDefinitionLibrary = getModuleDefinitionLibrary(translator, translatorOptions); + CqlCompilerOptions compilerOptions = getCompilerOptions(); + var manager = setupDataRequirementsAnalysis("TestCases/TestCase10a.cql", compilerOptions); + org.hl7.fhir.r5.model.Library moduleDefinitionLibrary = getModuleDefinitionLibrary(manager, compilerOptions); /* Element that is a dateTime, referenced in a date comparison @@ -1538,7 +1504,7 @@ public void TestDataRequirementsAnalysisCase10a() throws IOException { */ // Validate the ELM is correct - ExpressionDef ed = translator.getTranslatedLibrary().resolveExpressionRef("ESRD Observations"); + ExpressionDef ed = manager.library().resolveExpressionRef("ESRD Observations"); assertTrue(ed.getExpression() instanceof Query); Query q = (Query)ed.getExpression(); assertTrue(q.getSource() != null && q.getSource().size() == 1); @@ -1576,9 +1542,9 @@ public void TestDataRequirementsAnalysisCase10a() throws IOException { @Test public void TestDataRequirementsAnalysisCase10b() throws IOException { - CqlTranslatorOptions translatorOptions = getTranslatorOptions(); - CqlTranslator translator = setupDataRequirementsAnalysis("TestCases/TestCase10b.cql", translatorOptions); - org.hl7.fhir.r5.model.Library moduleDefinitionLibrary = getModuleDefinitionLibrary(translator, translatorOptions); + CqlCompilerOptions compilerOptions = getCompilerOptions(); + var manager = setupDataRequirementsAnalysis("TestCases/TestCase10b.cql", compilerOptions); + org.hl7.fhir.r5.model.Library moduleDefinitionLibrary = getModuleDefinitionLibrary(manager, compilerOptions); /* Multiple date elements referenced in a Coalesce @@ -1589,7 +1555,7 @@ where Coalesce(O.effective, O.issued) same day or after @2022-02-15 */ // Validate the ELM is correct - ExpressionDef ed = translator.getTranslatedLibrary().resolveExpressionRef("ESRD Observations"); + ExpressionDef ed = manager.library().resolveExpressionRef("ESRD Observations"); assertTrue(ed.getExpression() instanceof Query); Query q = (Query)ed.getExpression(); assertTrue(q.getSource() != null && q.getSource().size() == 1); @@ -1613,9 +1579,9 @@ where Coalesce(O.effective, O.issued) same day or after @2022-02-15 @Test public void TestDataRequirementsAnalysisCase10c() throws IOException { // TODO: Complete this test case - CqlTranslatorOptions translatorOptions = getTranslatorOptions(); - CqlTranslator translator = setupDataRequirementsAnalysis("TestCases/TestCase10c.cql", translatorOptions); - org.hl7.fhir.r5.model.Library moduleDefinitionLibrary = getModuleDefinitionLibrary(translator, translatorOptions); + CqlCompilerOptions compilerOptions = getCompilerOptions(); + var manager = setupDataRequirementsAnalysis("TestCases/TestCase10c.cql", compilerOptions); + org.hl7.fhir.r5.model.Library moduleDefinitionLibrary = getModuleDefinitionLibrary(manager, compilerOptions); /* Element that is a choice, two of which are date-valued, referenced in a comparison @@ -1626,7 +1592,7 @@ public void TestDataRequirementsAnalysisCase10c() throws IOException { */ // Validate the ELM is correct - ExpressionDef ed = translator.getTranslatedLibrary().resolveExpressionRef("ESRD Observations"); + ExpressionDef ed = manager.library().resolveExpressionRef("ESRD Observations"); assertTrue(ed.getExpression() instanceof Query); Query q = (Query)ed.getExpression(); assertTrue(q.getSource() != null && q.getSource().size() == 1); @@ -1649,10 +1615,10 @@ public void TestDataRequirementsAnalysisCase10c() throws IOException { @Test public void TestHEDISBCSE() throws IOException { - CqlTranslatorOptions translatorOptions = getTranslatorOptions(); - translatorOptions.setCompatibilityLevel("1.4"); - CqlTranslator translator = setupDataRequirementsAnalysis("BCSE/BCSE_HEDIS_MY2022.cql", translatorOptions); - org.hl7.fhir.r5.model.Library moduleDefinitionLibrary = getModuleDefinitionLibrary(translator, translatorOptions); + CqlCompilerOptions compilerOptions = getCompilerOptions(); + compilerOptions.setCompatibilityLevel("1.4"); + var manager = setupDataRequirementsAnalysis("BCSE/BCSE_HEDIS_MY2022.cql", compilerOptions); + org.hl7.fhir.r5.model.Library moduleDefinitionLibrary = getModuleDefinitionLibrary(manager, compilerOptions); assertNotNull(moduleDefinitionLibrary); } @@ -1669,10 +1635,10 @@ private void assertEqualToExpectedModuleDefinitionLibrary(org.hl7.fhir.r5.model. @Test public void TestEXMLogic() throws IOException { - CqlTranslatorOptions translatorOptions = getTranslatorOptions(); - translatorOptions.setAnalyzeDataRequirements(false); - CqlTranslator translator = setupDataRequirementsAnalysis("EXMLogic/EXMLogic.cql", translatorOptions); - org.hl7.fhir.r5.model.Library moduleDefinitionLibrary = getModuleDefinitionLibrary(translator, translatorOptions); + CqlCompilerOptions compilerOptions = getCompilerOptions(); + compilerOptions.setAnalyzeDataRequirements(false); + var manager = setupDataRequirementsAnalysis("EXMLogic/EXMLogic.cql", compilerOptions); + org.hl7.fhir.r5.model.Library moduleDefinitionLibrary = getModuleDefinitionLibrary(manager, compilerOptions); assertNotNull(moduleDefinitionLibrary); assertEqualToExpectedModuleDefinitionLibrary(moduleDefinitionLibrary, "EXMLogic/Library-EXMLogic-data-requirements.json"); @@ -1681,10 +1647,10 @@ public void TestEXMLogic() throws IOException { @Test public void TestWithDependencies() throws IOException { - CqlTranslatorOptions translatorOptions = getTranslatorOptions(); - translatorOptions.setAnalyzeDataRequirements(false); - CqlTranslator translator = setupDataRequirementsAnalysis("WithDependencies/BSElements.cql", translatorOptions); - org.hl7.fhir.r5.model.Library moduleDefinitionLibrary = getModuleDefinitionLibrary(translator, translatorOptions, new HashMap(), ZonedDateTime.of(2023, 1, 16, 0, 0, 0, 0, ZoneId.of("UTC"))); + CqlCompilerOptions compilerOptions = getCompilerOptions(); + compilerOptions.setAnalyzeDataRequirements(false); + var manager = setupDataRequirementsAnalysis("WithDependencies/BSElements.cql", compilerOptions); + org.hl7.fhir.r5.model.Library moduleDefinitionLibrary = getModuleDefinitionLibrary(manager, compilerOptions, new HashMap(), ZonedDateTime.of(2023, 1, 16, 0, 0, 0, 0, ZoneId.of("UTC"))); assertNotNull(moduleDefinitionLibrary); assertEqualToExpectedModuleDefinitionLibrary(moduleDefinitionLibrary, "WithDependencies/Library-BSElements-data-requirements.json"); @@ -1693,10 +1659,10 @@ public void TestWithDependencies() throws IOException { @Test public void TestCMS645() throws IOException { - CqlTranslatorOptions translatorOptions = getTranslatorOptions(); - translatorOptions.setAnalyzeDataRequirements(false); - CqlTranslator translator = setupDataRequirementsAnalysis("CMS645/CMS645Test.cql", translatorOptions); - org.hl7.fhir.r5.model.Library moduleDefinitionLibrary = getModuleDefinitionLibrary(translator, translatorOptions, new HashMap(), ZonedDateTime.of(2023, 1, 16, 0, 0, 0, 0, ZoneId.of("UTC"))); + CqlCompilerOptions compilerOptions = getCompilerOptions(); + compilerOptions.setAnalyzeDataRequirements(false); + var manager = setupDataRequirementsAnalysis("CMS645/CMS645Test.cql", compilerOptions); + org.hl7.fhir.r5.model.Library moduleDefinitionLibrary = getModuleDefinitionLibrary(manager, compilerOptions, new HashMap(), ZonedDateTime.of(2023, 1, 16, 0, 0, 0, 0, ZoneId.of("UTC"))); assertNotNull(moduleDefinitionLibrary); assertEqualToExpectedModuleDefinitionLibrary(moduleDefinitionLibrary, "CMS645/CMS645-ModuleDefinitionLibrary.json"); @@ -1705,10 +1671,10 @@ public void TestCMS645() throws IOException { @Test public void TestCMS143() throws IOException { - CqlTranslatorOptions translatorOptions = getTranslatorOptions(); - translatorOptions.setAnalyzeDataRequirements(false); - CqlTranslator translator = setupDataRequirementsAnalysis("CMS143/cql/POAGOpticNerveEvaluationFHIR-0.0.003.cql", translatorOptions); - org.hl7.fhir.r5.model.Library moduleDefinitionLibrary = getModuleDefinitionLibrary(translator, translatorOptions, new HashMap(), ZonedDateTime.of(2023, 1, 16, 0, 0, 0, 0, ZoneId.of("UTC"))); + CqlCompilerOptions compilerOptions = getCompilerOptions(); + compilerOptions.setAnalyzeDataRequirements(false); + var manager = setupDataRequirementsAnalysis("CMS143/cql/POAGOpticNerveEvaluationFHIR-0.0.003.cql", compilerOptions); + org.hl7.fhir.r5.model.Library moduleDefinitionLibrary = getModuleDefinitionLibrary(manager, compilerOptions, new HashMap(), ZonedDateTime.of(2023, 1, 16, 0, 0, 0, 0, ZoneId.of("UTC"))); assertNotNull(moduleDefinitionLibrary); assertEqualToExpectedModuleDefinitionLibrary(moduleDefinitionLibrary, "CMS143/resources/Library-EffectiveDataRequirements.json"); @@ -1717,10 +1683,10 @@ public void TestCMS143() throws IOException { @Test public void TestCMS149() throws IOException { - CqlTranslatorOptions translatorOptions = getTranslatorOptions(); - translatorOptions.setAnalyzeDataRequirements(false); - CqlTranslator translator = setupDataRequirementsAnalysis("CMS149/cql/DementiaCognitiveAssessmentFHIR-0.0.003.cql", translatorOptions); - org.hl7.fhir.r5.model.Library moduleDefinitionLibrary = getModuleDefinitionLibrary(translator, translatorOptions, new HashMap(), ZonedDateTime.of(2023, 1, 16, 0, 0, 0, 0, ZoneId.of("UTC"))); + CqlCompilerOptions compilerOptions = getCompilerOptions(); + compilerOptions.setAnalyzeDataRequirements(false); + var manager = setupDataRequirementsAnalysis("CMS149/cql/DementiaCognitiveAssessmentFHIR-0.0.003.cql", compilerOptions); + org.hl7.fhir.r5.model.Library moduleDefinitionLibrary = getModuleDefinitionLibrary(manager, compilerOptions, new HashMap(), ZonedDateTime.of(2023, 1, 16, 0, 0, 0, 0, ZoneId.of("UTC"))); assertNotNull(moduleDefinitionLibrary); assertEqualToExpectedModuleDefinitionLibrary(moduleDefinitionLibrary, "CMS149/resources/Library-EffectiveDataRequirements.json"); @@ -1729,17 +1695,16 @@ public void TestCMS149() throws IOException { @Test public void TestDataRequirementsProcessorWithPertinence() { - CqlTranslatorOptions cqlTranslatorOptions = new CqlTranslatorOptions(); - cqlTranslatorOptions.getFormats().add(CqlTranslator.Format.JSON); - cqlTranslatorOptions.getOptions().add(CqlTranslatorOptions.Options.EnableAnnotations); + CqlCompilerOptions cqlTranslatorOptions = new CqlCompilerOptions(); + + cqlTranslatorOptions.getOptions().add(CqlCompilerOptions.Options.EnableAnnotations); try { - CqlTranslator translator = createTranslator("CompositeMeasures/cql/pertinence-tag.cql", cqlTranslatorOptions);//"OpioidCDS/cql/OpioidCDSCommon.cql", cqlTranslatorOptions); - translator.toELM(); - assertTrue(translator.getErrors().isEmpty()); - libraryManager.cacheLibrary(translator.getTranslatedLibrary()); + var setup = setup("CompositeMeasures/cql/pertinence-tag.cql", cqlTranslatorOptions);//"OpioidCDS/cql/OpioidCDSCommon.cql", cqlTranslatorOptions); + + DataRequirementsProcessor dqReqTrans = new DataRequirementsProcessor(); - org.hl7.fhir.r5.model.Library moduleDefinitionLibrary = dqReqTrans.gatherDataRequirements(libraryManager, translator.getTranslatedLibrary(), cqlTranslatorOptions, null, false); + org.hl7.fhir.r5.model.Library moduleDefinitionLibrary = dqReqTrans.gatherDataRequirements(setup.manager(), setup.library(), cqlTranslatorOptions, null, false); assertTrue(moduleDefinitionLibrary.getDataRequirement().size() == 3); DataRequirement dr = moduleDefinitionLibrary.getDataRequirement().get(1); @@ -1759,18 +1724,16 @@ public void TestDataRequirementsProcessorWithPertinence() { @Test public void TestDataRequirementsProcessorWithPertinenceAgain() { - CqlTranslatorOptions cqlTranslatorOptions = new CqlTranslatorOptions(); - cqlTranslatorOptions.getFormats().add(CqlTranslator.Format.JSON); - cqlTranslatorOptions.getOptions().add(CqlTranslatorOptions.Options.EnableAnnotations); + CqlCompilerOptions cqlTranslatorOptions = new CqlCompilerOptions(); + + cqlTranslatorOptions.getOptions().add(CqlCompilerOptions.Options.EnableAnnotations); try { - CqlTranslator translator = createTranslator("CompositeMeasures/cql/pertinence-tag-AdvancedIllnessandFrailtyExclusion_FHIR4-5.0.000.cql", cqlTranslatorOptions);//"OpioidCDS/cql/OpioidCDSCommon.cql", cqlTranslatorOptions); - translator.toELM(); - System.out.println(translator.getErrors()); - assertTrue(translator.getErrors().isEmpty()); - libraryManager.cacheLibrary(translator.getTranslatedLibrary()); + var setup = setup("CompositeMeasures/cql/pertinence-tag-AdvancedIllnessandFrailtyExclusion_FHIR4-5.0.000.cql", cqlTranslatorOptions);//"OpioidCDS/cql/OpioidCDSCommon.cql", cqlTranslatorOptions); + + DataRequirementsProcessor dqReqTrans = new DataRequirementsProcessor(); - org.hl7.fhir.r5.model.Library moduleDefinitionLibrary = dqReqTrans.gatherDataRequirements(libraryManager, translator.getTranslatedLibrary(), cqlTranslatorOptions, null, false); + org.hl7.fhir.r5.model.Library moduleDefinitionLibrary = dqReqTrans.gatherDataRequirements(setup.manager(), setup.library(), cqlTranslatorOptions, null, false); DataRequirement dr = moduleDefinitionLibrary.getDataRequirement().get(1); assertEquals(dr.getType(), Enumerations.FHIRTypes.CONDITION); @@ -1796,70 +1759,53 @@ public void TestDataRequirementsProcessorWithPertinenceAgain() { } } - private static void setup(String relativePath) { - modelManager = new ModelManager(); - libraryManager = new LibraryManager(modelManager); - libraryManager.getLibrarySourceLoader().registerProvider(new DefaultLibrarySourceProvider(Paths.get(relativePath))); - libraryManager.getLibrarySourceLoader().registerProvider(new FhirLibrarySourceProvider()); - try { - ucumService = new UcumEssenceService(UcumEssenceService.class.getResourceAsStream("/ucum-essence.xml")); - } - catch (UcumException e) { - e.printStackTrace(); - } - } - - private static void tearDown() { - ucumService = null; - libraryManager = null; - modelManager = null; - } + public static class Setup { + private final LibraryManager manager; + private final CompiledLibrary library; - public static void reset() { - tearDown(); - } + public Setup(LibraryManager manager, CompiledLibrary library) { + this.manager = manager; + this.library = library; + } - private static ModelManager getModelManager() { - if (modelManager == null) { - setup(null); + public LibraryManager manager() { + return this.manager; } - return modelManager; + public CompiledLibrary library() { + return this.library; + } } - private static LibraryManager getLibraryManager() { - if (libraryManager == null) { - setup(null); - } + private static LibraryManager setup(CqlCompilerOptions options, String relativePath) { + var modelManager = new ModelManager(); + var libraryManager = new LibraryManager(modelManager, options); + libraryManager.getLibrarySourceLoader().registerProvider(new DefaultLibrarySourceProvider(Paths.get(relativePath))); + libraryManager.getLibrarySourceLoader().registerProvider(new FhirLibrarySourceProvider()); return libraryManager; } - private static UcumService getUcumService() { - if (ucumService == null) { - setup(null); + public static Setup setup(String testFileName, CqlCompilerOptions options) throws IOException { + return setup(null, testFileName, options); + } + + public static Setup setup(NamespaceInfo namespaceInfo, String testFileName, CqlCompilerOptions options) throws IOException { + File translationTestFile = new File(DataRequirementsProcessorTest.class.getResource(testFileName).getFile()); + var manager = setup(options, translationTestFile.getParent()); + + if (namespaceInfo != null) { + manager.getNamespaceManager().addNamespace(namespaceInfo); } - return ucumService; - } + var compiler = new CqlCompiler(namespaceInfo, manager); - public static CqlTranslator createTranslator(String testFileName, CqlTranslatorOptions.Options... options) throws IOException { - return createTranslator(null, testFileName, new CqlTranslatorOptions(options)); - } + var lib = compiler.run(translationTestFile); - public static CqlTranslator createTranslator(String testFileName, CqlTranslatorOptions options) throws IOException { - return createTranslator(null, testFileName, options); - } + assertTrue(compiler.getErrors().isEmpty()); - public static CqlTranslator createTranslator(NamespaceInfo namespaceInfo, String testFileName, CqlTranslatorOptions.Options... options) throws IOException { - return createTranslator(namespaceInfo, testFileName, new CqlTranslatorOptions(options)); - } + manager.getCompiledLibraries().put(lib.getIdentifier(), compiler.getCompiledLibrary()); - public static CqlTranslator createTranslator(NamespaceInfo namespaceInfo, String testFileName, CqlTranslatorOptions options) throws IOException { - File translationTestFile = new File(DataRequirementsProcessorTest.class.getResource(testFileName).getFile()); - reset(); - setup(translationTestFile.getParent()); - CqlTranslator translator = CqlTranslator.fromFile(namespaceInfo, translationTestFile, getModelManager(), getLibraryManager(), getUcumService(), options); - return translator; + return new Setup(manager, compiler.getCompiledLibrary()); } -} +} \ No newline at end of file diff --git a/Src/java/elm-fhir/src/test/resources/org/cqframework/cql/elm/requirements/fhir/OpioidCDSSTU3/cql/OpioidCDSREC10_bug_repo.cql b/Src/java/elm-fhir/src/test/resources/org/cqframework/cql/elm/requirements/fhir/OpioidCDSSTU3/cql/OpioidCDSREC10.cql similarity index 100% rename from Src/java/elm-fhir/src/test/resources/org/cqframework/cql/elm/requirements/fhir/OpioidCDSSTU3/cql/OpioidCDSREC10_bug_repo.cql rename to Src/java/elm-fhir/src/test/resources/org/cqframework/cql/elm/requirements/fhir/OpioidCDSSTU3/cql/OpioidCDSREC10.cql diff --git a/Src/java/elm-test/src/test/java/org/cqframework/cql/elm/ElmDeserializeTests.java b/Src/java/elm-test/src/test/java/org/cqframework/cql/elm/ElmDeserializeTests.java index 5736e80bf..8a12881ba 100644 --- a/Src/java/elm-test/src/test/java/org/cqframework/cql/elm/ElmDeserializeTests.java +++ b/Src/java/elm-test/src/test/java/org/cqframework/cql/elm/ElmDeserializeTests.java @@ -8,8 +8,8 @@ import javax.xml.bind.JAXBException; import org.cqframework.cql.cql2elm.CqlTranslator; -import org.cqframework.cql.cql2elm.CqlTranslatorOptions; -import org.cqframework.cql.cql2elm.TranslatorOptionsUtil; +import org.cqframework.cql.cql2elm.CqlCompilerOptions; +import org.cqframework.cql.cql2elm.CompilerOptions; import org.hl7.elm.r1.*; import org.testng.Assert; import org.testng.annotations.Test; @@ -33,17 +33,17 @@ public void testJsonANCFHIRDummyLibraryLoad() { Library library = new org.cqframework.cql.elm.serializing.jaxb.ElmJsonLibraryReader().read(new InputStreamReader(ElmDeserializeTests.class.getResourceAsStream("ElmDeserialize/ANCFHIRDummy.json"))); Assert.assertTrue(library != null); - EnumSet translatorOptions = EnumSet.of( - CqlTranslatorOptions.Options.EnableDateRangeOptimization, - CqlTranslatorOptions.Options.EnableAnnotations, - CqlTranslatorOptions.Options.EnableLocators, - CqlTranslatorOptions.Options.EnableResultTypes, - CqlTranslatorOptions.Options.DisableListDemotion, - CqlTranslatorOptions.Options.DisableListPromotion, - CqlTranslatorOptions.Options.DisableMethodInvocation + EnumSet translatorOptions = EnumSet.of( + CqlCompilerOptions.Options.EnableDateRangeOptimization, + CqlCompilerOptions.Options.EnableAnnotations, + CqlCompilerOptions.Options.EnableLocators, + CqlCompilerOptions.Options.EnableResultTypes, + CqlCompilerOptions.Options.DisableListDemotion, + CqlCompilerOptions.Options.DisableListPromotion, + CqlCompilerOptions.Options.DisableMethodInvocation ); - Assert.assertEquals(TranslatorOptionsUtil.getTranslatorOptions(library), translatorOptions); + Assert.assertEquals(CompilerOptions.getCompilerOptions(library), translatorOptions); Assert.assertTrue(library.getStatements() != null); Assert.assertTrue(library.getStatements().getDef() != null); @@ -64,10 +64,10 @@ public void testJsonAdultOutpatientEncounters_FHIR4LibraryLoad() { Library library = new org.cqframework.cql.elm.serializing.jaxb.ElmJsonLibraryReader().read(new InputStreamReader(ElmDeserializeTests.class.getResourceAsStream("ElmDeserialize/fhir/AdultOutpatientEncounters_FHIR4-2.0.000.json"))); Assert.assertTrue(library != null); - EnumSet translatorOptions = EnumSet.of( - CqlTranslatorOptions.Options.EnableAnnotations + EnumSet translatorOptions = EnumSet.of( + CqlCompilerOptions.Options.EnableAnnotations ); - Assert.assertEquals(TranslatorOptionsUtil.getTranslatorOptions(library), translatorOptions); + Assert.assertEquals(CompilerOptions.getCompilerOptions(library), translatorOptions); Assert.assertEquals(library.getIdentifier().getId(), "AdultOutpatientEncounters_FHIR4"); Assert.assertEquals(library.getIdentifier().getVersion(), "2.0.000"); Assert.assertTrue(library.getUsings() != null); @@ -94,16 +94,16 @@ public void testXmlLibraryLoad() { Assert.assertEquals(library.getIdentifier().getId(), "AdultOutpatientEncounters_FHIR4"); Assert.assertEquals(library.getIdentifier().getVersion(), "2.0.000"); - EnumSet translatorOptions = EnumSet.of( - CqlTranslatorOptions.Options.EnableDateRangeOptimization, - CqlTranslatorOptions.Options.EnableAnnotations, - CqlTranslatorOptions.Options.EnableLocators, - CqlTranslatorOptions.Options.EnableResultTypes, - CqlTranslatorOptions.Options.DisableListDemotion, - CqlTranslatorOptions.Options.DisableListPromotion, - CqlTranslatorOptions.Options.DisableMethodInvocation + EnumSet translatorOptions = EnumSet.of( + CqlCompilerOptions.Options.EnableDateRangeOptimization, + CqlCompilerOptions.Options.EnableAnnotations, + CqlCompilerOptions.Options.EnableLocators, + CqlCompilerOptions.Options.EnableResultTypes, + CqlCompilerOptions.Options.DisableListDemotion, + CqlCompilerOptions.Options.DisableListPromotion, + CqlCompilerOptions.Options.DisableMethodInvocation ); - Assert.assertEquals(TranslatorOptionsUtil.getTranslatorOptions(library), translatorOptions); + Assert.assertEquals(CompilerOptions.getCompilerOptions(library), translatorOptions); Assert.assertTrue(library.getUsings() != null); Assert.assertTrue(library.getUsings().getDef() != null); diff --git a/Src/java/elm-test/src/test/java/org/cqframework/cql/elm/TestLibrarySourceProvider.java b/Src/java/elm-test/src/test/java/org/cqframework/cql/elm/TestLibrarySourceProvider.java index 15464e072..8c7d5e0eb 100644 --- a/Src/java/elm-test/src/test/java/org/cqframework/cql/elm/TestLibrarySourceProvider.java +++ b/Src/java/elm-test/src/test/java/org/cqframework/cql/elm/TestLibrarySourceProvider.java @@ -23,12 +23,6 @@ public InputStream getLibrarySource(VersionedIdentifier libraryIdentifier) { return getLibraryContent(libraryIdentifier, LibraryContentType.CQL); } - @Override - public boolean isLibraryContentAvailable(VersionedIdentifier libraryIdentifier, LibraryContentType type) { - return TestLibrarySourceProvider.class.getResource(getFileName(libraryIdentifier, type)) != null; - } - - @Override public InputStream getLibraryContent(VersionedIdentifier libraryIdentifier, LibraryContentType type) { return TestLibrarySourceProvider.class.getResourceAsStream(getFileName(libraryIdentifier, type)); diff --git a/Src/java/elm-test/src/test/java/org/cqframework/cql/elm/TestUtils.java b/Src/java/elm-test/src/test/java/org/cqframework/cql/elm/TestUtils.java index 3f9800cb5..4a6c37e59 100644 --- a/Src/java/elm-test/src/test/java/org/cqframework/cql/elm/TestUtils.java +++ b/Src/java/elm-test/src/test/java/org/cqframework/cql/elm/TestUtils.java @@ -4,41 +4,31 @@ import java.io.InputStream; import org.cqframework.cql.cql2elm.CqlTranslator; -import org.cqframework.cql.cql2elm.CqlTranslatorOptions; +import org.cqframework.cql.cql2elm.CqlCompilerOptions; import org.cqframework.cql.cql2elm.LibraryManager; import org.cqframework.cql.cql2elm.ModelManager; -import org.fhir.ucum.UcumEssenceService; import org.hl7.cql.model.NamespaceInfo; public class TestUtils { - - private static UcumEssenceService getUcumEssenceService() { - try { - return new UcumEssenceService(UcumEssenceService.class.getResourceAsStream("/ucum-essence.xml")); - } - catch(Exception e) { - return null; - } - } - - public static CqlTranslator createTranslatorFromStream(String testFileName, CqlTranslatorOptions.Options... options) throws IOException { + public static CqlTranslator createTranslatorFromStream(String testFileName, CqlCompilerOptions.Options... options) throws IOException { return createTranslatorFromStream(null, testFileName, options); } - public static CqlTranslator createTranslatorFromStream(NamespaceInfo namespaceInfo, String testFileName, CqlTranslatorOptions.Options... options) throws IOException { + public static CqlTranslator createTranslatorFromStream(NamespaceInfo namespaceInfo, String testFileName, CqlCompilerOptions.Options... options) throws IOException { InputStream inputStream = TestUtils.class.getResourceAsStream(testFileName); return createTranslatorFromStream(null, inputStream, options); } - public static CqlTranslator createTranslatorFromStream(InputStream inputStream, CqlTranslatorOptions.Options... options) throws IOException { + public static CqlTranslator createTranslatorFromStream(InputStream inputStream, CqlCompilerOptions.Options... options) throws IOException { return createTranslatorFromStream(null, inputStream, options); } - public static CqlTranslator createTranslatorFromStream(NamespaceInfo namespaceInfo, InputStream inputStream, CqlTranslatorOptions.Options... options) throws IOException { + public static CqlTranslator createTranslatorFromStream(NamespaceInfo namespaceInfo, InputStream inputStream, CqlCompilerOptions.Options... options) throws IOException { ModelManager modelManager = new ModelManager(); - LibraryManager libraryManager = new LibraryManager(modelManager); + var compilerOptions = new CqlCompilerOptions(options); + LibraryManager libraryManager = new LibraryManager(modelManager, compilerOptions); libraryManager.getLibrarySourceLoader().registerProvider(new TestLibrarySourceProvider()); - CqlTranslator translator = CqlTranslator.fromStream(namespaceInfo, inputStream, modelManager, libraryManager, getUcumEssenceService(), options); + CqlTranslator translator = CqlTranslator.fromStream(namespaceInfo, inputStream, libraryManager); return translator; } } \ No newline at end of file diff --git a/Src/java/engine-fhir/src/test/java/org/hl7/fhirpath/CQLOperationsR4Test.java b/Src/java/engine-fhir/src/test/java/org/hl7/fhirpath/CQLOperationsR4Test.java index a1125a07c..094fa33b3 100644 --- a/Src/java/engine-fhir/src/test/java/org/hl7/fhirpath/CQLOperationsR4Test.java +++ b/Src/java/engine-fhir/src/test/java/org/hl7/fhirpath/CQLOperationsR4Test.java @@ -346,6 +346,7 @@ public String getTestName() { @Test public void test() throws UcumException { + if (SKIP.contains(getTestName())) { throw new SkipException("Skipping " + getTestName()); } diff --git a/Src/java/engine-fhir/src/test/java/org/hl7/fhirpath/FhirHelpersDstu2Test.java b/Src/java/engine-fhir/src/test/java/org/hl7/fhirpath/FhirHelpersDstu2Test.java index e293e545e..3a10a83ce 100644 --- a/Src/java/engine-fhir/src/test/java/org/hl7/fhirpath/FhirHelpersDstu2Test.java +++ b/Src/java/engine-fhir/src/test/java/org/hl7/fhirpath/FhirHelpersDstu2Test.java @@ -19,7 +19,6 @@ import org.opencds.cqf.cql.engine.fhir.retrieve.RestFhirRetrieveProvider; public class FhirHelpersDstu2Test { - private TranslatorHelper translator = new TranslatorHelper(); private String getStringFromResourceStream(String resourceName) { java.io.InputStream input = TestFhirPath.class.getResourceAsStream(resourceName); @@ -41,12 +40,11 @@ private String getStringFromResourceStream(String resourceName) { // @Test public void testFhirHelpersDstu2() throws UcumException { String cql = getStringFromResourceStream("Dstu2/TestFHIRHelpersDstu2.cql"); - Library library = translator.translate(cql); - CqlEngine engineVisitor = TranslatorHelper.getEngineVisitor(); + var env = TranslatorHelper.getEnvironment(); + Library library = TranslatorHelper.translate(cql, env.getLibraryManager()); + CqlEngine engineVisitor = TranslatorHelper.getEngine(env); VersionedIdentifier libraryId = TranslatorHelper.toElmIdentifier("TestFHIRHelpersDstu2", "0.1.0"); - Map map = new HashMap<>(); - map.put(libraryId, library); Dstu2FhirModelResolver modelResolver = new Dstu2FhirModelResolver(); RestFhirRetrieveProvider retrieveProvider = new RestFhirRetrieveProvider( @@ -54,8 +52,8 @@ public void testFhirHelpersDstu2() throws UcumException { modelResolver, FhirContext.forCached(FhirVersionEnum.DSTU2).newRestfulGenericClient("")); CompositeDataProvider provider = new CompositeDataProvider(modelResolver, retrieveProvider); //BaseFhirDataProvider provider = new FhirDataProviderDstu2(); - engineVisitor.getState().registerDataProvider("http://hl7.org/fhir", provider); - EvaluationResult evaluationResult = engineVisitor.evaluate(libraryId, map, + engineVisitor.getState().getEnvironment().registerDataProvider("http://hl7.org/fhir", provider); + EvaluationResult evaluationResult = engineVisitor.evaluate(libraryId, null, null, null, null, null); // TODO - millis shouldn't be populated - issue with DateTime.fromJavaDate(Date date) @@ -73,7 +71,7 @@ public void testFhirHelpersDstu2() throws UcumException { result = evaluationResult.expressionResults.get("TestToInteger").value(); result = evaluationResult.expressionResults.get("TestToDecimal").value(); result = evaluationResult.expressionResults.get("TestToBoolean").value(); - + } } diff --git a/Src/java/engine-fhir/src/test/java/org/hl7/fhirpath/FhirHelpersDstu3Test.java b/Src/java/engine-fhir/src/test/java/org/hl7/fhirpath/FhirHelpersDstu3Test.java index cf0178a8b..8d4698b0b 100644 --- a/Src/java/engine-fhir/src/test/java/org/hl7/fhirpath/FhirHelpersDstu3Test.java +++ b/Src/java/engine-fhir/src/test/java/org/hl7/fhirpath/FhirHelpersDstu3Test.java @@ -14,12 +14,8 @@ import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; -import java.util.HashMap; -import java.util.Map; public class FhirHelpersDstu3Test { - private TranslatorHelper translator = new TranslatorHelper(); - private String getStringFromResourceStream(String resourceName) { java.io.InputStream input = TestFhirPath.class.getResourceAsStream(resourceName); try (BufferedReader stringReader = new BufferedReader(new InputStreamReader(input))) { @@ -43,13 +39,12 @@ private String getStringFromResourceStream(String resourceName) { //@Test public void testFhirHelpersStu3() throws UcumException { String cql = getStringFromResourceStream("stu3/TestFHIRHelpers.cql"); - Library library = translator.translate(cql); + var env = TranslatorHelper.getEnvironment(); + Library library = TranslatorHelper.translate(cql, env.getLibraryManager()); - CqlEngine engineVisitor = TranslatorHelper.getEngineVisitor(); + CqlEngine engineVisitor = TranslatorHelper.getEngine(env); VersionedIdentifier libraryId = TranslatorHelper.toElmIdentifier("TestFHIRHelpers", "0.1.0"); - Map map = new HashMap<>(); - map.put(libraryId, library); Dstu3FhirModelResolver modelResolver = new Dstu3FhirModelResolver(); FhirContext fhirContext = modelResolver.getFhirContext(); @@ -58,8 +53,8 @@ public void testFhirHelpersStu3() throws UcumException { CompositeDataProvider provider = new CompositeDataProvider(modelResolver, retrieveProvider); // BaseFhirDataProvider provider = new // FhirDataProviderStu3().setEndpoint("http://fhirtest.uhn.ca/baseDstu3"); - engineVisitor.getState().registerDataProvider("http://hl7.org/fhir", provider); - EvaluationResult evaluationResult = engineVisitor.evaluate(libraryId, map, + engineVisitor.getState().getEnvironment().registerDataProvider("http://hl7.org/fhir", provider); + EvaluationResult evaluationResult = engineVisitor.evaluate(libraryId, null, null, null, null, null); // TODO - fix diff --git a/Src/java/engine-fhir/src/test/java/org/hl7/fhirpath/TestFhirPath.java b/Src/java/engine-fhir/src/test/java/org/hl7/fhirpath/TestFhirPath.java index acc986ee3..1c4ca3e74 100644 --- a/Src/java/engine-fhir/src/test/java/org/hl7/fhirpath/TestFhirPath.java +++ b/Src/java/engine-fhir/src/test/java/org/hl7/fhirpath/TestFhirPath.java @@ -142,6 +142,8 @@ protected void runTest(org.hl7.fhirpath.tests.Test test, String basePathInput, F } Library library = null; + var env = TranslatorHelper.getEnvironment(); + env.getLibraryManager().getCompiledLibraries().clear(); // If the test expression is invalid, expect an error during translation and // fail if we don't get one InvalidType invalidType = test.getExpression().getInvalid(); @@ -149,12 +151,10 @@ protected void runTest(org.hl7.fhirpath.tests.Test test, String basePathInput, F invalidType = InvalidType.FALSE; } - TranslatorHelper translator = new TranslatorHelper(); - if (invalidType.equals(InvalidType.SEMANTIC)) { boolean testPassed = false; try { - library = translator.translate(cql); + library = TranslatorHelper.translate(cql, env.getLibraryManager()); } catch (Exception e) { testPassed = true; } @@ -164,19 +164,20 @@ protected void runTest(org.hl7.fhirpath.tests.Test test, String basePathInput, F } } else { try { - library = translator.translate(cql); + library = TranslatorHelper.translate(cql, env.getLibraryManager()); } catch (IllegalArgumentException e) { // if it crashes and didn't have an expected output, assume the test was supposed to fail. if (test.getOutput() == null || test.getOutput().isEmpty()) { return; } else { e.printStackTrace(); - throw new RuntimeException(String.format("Couldn't translate library and was expencting a result. %s.", test.getName())); + throw new RuntimeException(String.format("Couldn't translate library and was expecting a result. %s.", test.getName())); } } - CqlEngine engineVisitor = TranslatorHelper.getEngineVisitor(); - engineVisitor.getState().registerDataProvider("http://hl7.org/fhir", provider); + CqlEngine engineVisitor = TranslatorHelper.getEngine(env); + engineVisitor.getCache().setExpressionCaching(false); + engineVisitor.getState().getEnvironment().registerDataProvider("http://hl7.org/fhir", provider); if (resource != null) { engineVisitor.getState().setParameter(null, resource.fhirType(), resource); } @@ -188,7 +189,7 @@ protected void runTest(org.hl7.fhirpath.tests.Test test, String basePathInput, F VersionedIdentifier libraryId = TranslatorHelper.toElmIdentifier("TestFHIRPath"); Map map = new HashMap<>(); map.put(libraryId, library); - EvaluationResult evaluationResult = engineVisitor.evaluate(libraryId, map, + EvaluationResult evaluationResult = engineVisitor.evaluate(libraryId, Set.of("Test"), null, null, null, null); result = evaluationResult.expressionResults.get("Test").value(); diff --git a/Src/java/engine-fhir/src/test/java/org/hl7/fhirpath/TestLibraryLoader.java b/Src/java/engine-fhir/src/test/java/org/hl7/fhirpath/TestLibraryLoader.java deleted file mode 100644 index 4510a1f39..000000000 --- a/Src/java/engine-fhir/src/test/java/org/hl7/fhirpath/TestLibraryLoader.java +++ /dev/null @@ -1,88 +0,0 @@ -package org.hl7.fhirpath; - -import java.io.IOException; -import java.io.StringReader; -import java.io.StringWriter; -import java.util.ArrayList; -import java.util.HashMap; -import java.util.List; -import java.util.Map; - -import org.cqframework.cql.cql2elm.CqlCompilerException; -import org.cqframework.cql.cql2elm.CqlTranslatorOptions; -import org.cqframework.cql.cql2elm.LibraryManager; -import org.cqframework.cql.cql2elm.model.CompiledLibrary; -import org.hl7.elm.r1.Library; -import org.hl7.elm.r1.VersionedIdentifier; -import org.cqframework.cql.elm.serializing.ElmLibraryWriterFactory; -import org.cqframework.cql.elm.serializing.jackson.ElmJsonLibraryReader; -import org.opencds.cqf.cql.engine.execution.LibraryLoader; - -public class TestLibraryLoader implements LibraryLoader { - - public TestLibraryLoader(LibraryManager libraryManager) { - if (libraryManager == null) { - throw new IllegalArgumentException("libraryManager is null"); - } - - this.libraryManager = libraryManager; - } - - private LibraryManager libraryManager; - - private Map libraries = new HashMap<>(); - - private Library resolveLibrary(VersionedIdentifier libraryIdentifier) { - if (libraryIdentifier == null) { - throw new IllegalArgumentException("Library identifier is null."); - } - - if (libraryIdentifier.getId() == null) { - throw new IllegalArgumentException("Library identifier id is null."); - } - - Library library = libraries.get(libraryIdentifier.getId()); - if (library != null && libraryIdentifier.getVersion() != null && !libraryIdentifier.getVersion().equals(library.getIdentifier().getVersion())) { - throw new IllegalArgumentException(String.format("Could not load library %s, version %s because version %s is already loaded.", - libraryIdentifier.getId(), libraryIdentifier.getVersion(), library.getIdentifier().getVersion())); - } - else { - library = loadLibrary(libraryIdentifier); - libraries.put(libraryIdentifier.getId(), library); - } - - return library; - } - - private Library loadLibrary(VersionedIdentifier libraryIdentifier) { - List errors = new ArrayList<>(); - org.hl7.elm.r1.VersionedIdentifier identifier = new org.hl7.elm.r1.VersionedIdentifier() - .withId(libraryIdentifier.getId()) - .withSystem(libraryIdentifier.getSystem()) - .withVersion(libraryIdentifier.getVersion()); - - CompiledLibrary compiledLibrary = libraryManager.resolveLibrary(identifier, CqlTranslatorOptions.defaultOptions(), errors); - String json; - try { - StringWriter writer = new StringWriter(); - ElmLibraryWriterFactory.getWriter("application/elm+json").write(compiledLibrary.getLibrary(), writer); - json = writer.getBuffer().toString(); - } catch (IOException e) { - throw new RuntimeException(String.format("Errors encountered while loading library %s: %s", libraryIdentifier.getId(), e.getMessage())); - } - - Library library = null; - try { - library = new ElmJsonLibraryReader().read(new StringReader(json)); - } catch (IOException e) { - throw new RuntimeException(String.format("Errors encountered while loading library %s: %s", libraryIdentifier.getId(), e.getMessage())); - } - - return library; - } - - @Override - public Library load(VersionedIdentifier libraryIdentifier) { - return resolveLibrary(libraryIdentifier); - } -} diff --git a/Src/java/engine-fhir/src/test/java/org/hl7/fhirpath/TranslatorHelper.java b/Src/java/engine-fhir/src/test/java/org/hl7/fhirpath/TranslatorHelper.java index db2b3331a..c79aae7e3 100644 --- a/Src/java/engine-fhir/src/test/java/org/hl7/fhirpath/TranslatorHelper.java +++ b/Src/java/engine-fhir/src/test/java/org/hl7/fhirpath/TranslatorHelper.java @@ -1,46 +1,56 @@ package org.hl7.fhirpath; import org.cqframework.cql.cql2elm.*; +import org.cqframework.cql.cql2elm.CqlCompilerOptions.Options; import org.cqframework.cql.cql2elm.quick.FhirLibrarySourceProvider; import org.hl7.elm.r1.Library; import org.cqframework.cql.elm.tracking.TrackBack; -import org.fhir.ucum.UcumEssenceService; import org.fhir.ucum.UcumException; -import org.fhir.ucum.UcumService; import org.opencds.cqf.cql.engine.execution.CqlEngine; import org.opencds.cqf.cql.engine.execution.Environment; -import org.opencds.cqf.cql.engine.execution.LibraryLoader; +import org.opencds.cqf.cql.engine.terminology.TerminologyProvider; + import java.util.ArrayList; public class TranslatorHelper { + + private TranslatorHelper() { + // intentionally empty + } + private static ModelManager modelManager = new ModelManager(); private static LibraryManager libraryManager; private static LibraryManager getLibraryManager() { - if (libraryManager == null) { - libraryManager = new LibraryManager(modelManager); - libraryManager.getLibrarySourceLoader().clearProviders(); - libraryManager.getLibrarySourceLoader().registerProvider(new TestLibrarySourceProvider()); - libraryManager.getLibrarySourceLoader().registerProvider(new FhirLibrarySourceProvider()); - } + var options = CqlCompilerOptions.defaultOptions(); + options.getOptions().remove(Options.DisableListDemotion); + options.getOptions().remove(Options.DisableListPromotion); + options.getOptions().add(Options.EnableDateRangeOptimization); + return getLibraryManager(options); + } + + private static LibraryManager getLibraryManager(CqlCompilerOptions cqlCompilerOptions) { + libraryManager = new LibraryManager(modelManager, cqlCompilerOptions); + libraryManager.getLibrarySourceLoader().clearProviders(); + libraryManager.getLibrarySourceLoader().registerProvider(new TestLibrarySourceProvider()); + libraryManager.getLibrarySourceLoader().registerProvider(new FhirLibrarySourceProvider()); return libraryManager; } public static Environment getEnvironment() { - return new Environment(getLibraryManager()); + return getEnvironment(null); } - public static CqlEngine getEngineVisitor() { - return new CqlEngine(getEnvironment()); + public static Environment getEnvironment(TerminologyProvider terminologyProvider) { + return new Environment(getLibraryManager(), null, terminologyProvider); } - private LibraryLoader libraryLoader; + public static CqlEngine getEngineVisitor(TerminologyProvider terminologyProvider) { + return getEngine(getEnvironment(terminologyProvider)); + } - public LibraryLoader getLibraryLoader() { - if (libraryLoader == null) { - libraryLoader = new TestLibraryLoader(getLibraryManager()); - } - return libraryLoader; + public static CqlEngine getEngine(Environment environment) { + return new CqlEngine(environment); } public static org.hl7.elm.r1.VersionedIdentifier toElmIdentifier(String name) { @@ -51,17 +61,15 @@ public static org.hl7.elm.r1.VersionedIdentifier toElmIdentifier(String name, St return new org.hl7.elm.r1.VersionedIdentifier().withId(name).withVersion(version); } - public Library translate(String cql) throws UcumException { - ArrayList options = new ArrayList<>(); - options.add(CqlTranslatorOptions.Options.EnableDateRangeOptimization); - UcumService ucumService = new UcumEssenceService( - UcumEssenceService.class.getResourceAsStream("/ucum-essence.xml")); + public static Library translate(String cql, LibraryManager libraryManager) throws UcumException { + CqlCompiler compiler = new CqlCompiler(libraryManager); + Library lib = compiler.run(cql); + + libraryManager.getCompiledLibraries().put(lib.getIdentifier(), compiler.getCompiledLibrary()); - CqlTranslator translator = CqlTranslator.fromText(cql, modelManager, getLibraryManager(), ucumService, - CqlCompilerException.ErrorSeverity.Info, LibraryBuilder.SignatureLevel.All, options.toArray(new CqlTranslatorOptions.Options[options.size()])); - if (translator.getErrors().size() > 0) { + if (!compiler.getErrors().isEmpty()) { ArrayList errors = new ArrayList<>(); - for (CqlCompilerException error : translator.getErrors()) { + for (CqlCompilerException error : compiler.getErrors()) { TrackBack tb = error.getLocator(); String lines = tb == null ? "[n/a]" : String.format("[%d:%d, %d:%d]", tb.getStartLine(), tb.getStartChar(), tb.getEndLine(), @@ -71,6 +79,6 @@ public Library translate(String cql) throws UcumException { throw new IllegalArgumentException(errors.toString()); } - return translator.toELM(); + return lib; } } diff --git a/Src/java/engine-fhir/src/test/java/org/opencds/cqf/cql/engine/fhir/data/EvaluatedResourcesTest.java b/Src/java/engine-fhir/src/test/java/org/opencds/cqf/cql/engine/fhir/data/EvaluatedResourcesTest.java index 10946fb23..eb5791f92 100644 --- a/Src/java/engine-fhir/src/test/java/org/opencds/cqf/cql/engine/fhir/data/EvaluatedResourcesTest.java +++ b/Src/java/engine-fhir/src/test/java/org/opencds/cqf/cql/engine/fhir/data/EvaluatedResourcesTest.java @@ -11,7 +11,6 @@ import org.hl7.fhir.r4.model.Condition; import org.hl7.fhir.r4.model.Encounter; import org.hl7.fhir.r4.model.Patient; -import org.hl7.fhirpath.TranslatorHelper; import org.opencds.cqf.cql.engine.data.CompositeDataProvider; import org.opencds.cqf.cql.engine.execution.CqlEngine; import org.opencds.cqf.cql.engine.execution.EvaluationResult; @@ -43,10 +42,10 @@ public Iterable retrieve(String context, String contextPath, Object cont @Test public void testWithCache() { - CqlEngine engineVisitor = TranslatorHelper.getEngineVisitor(); - engineVisitor.getState().registerDataProvider("http://hl7.org/fhir", new CompositeDataProvider(r4ModelResolver, rp)); + CqlEngine engineVisitor = getEngine(); + engineVisitor.getState().getEnvironment().registerDataProvider("http://hl7.org/fhir", new CompositeDataProvider(r4ModelResolver, rp)); engineVisitor.getCache().setExpressionCaching(true); - EvaluationResult evaluationResult = engineVisitor.evaluate(library.getIdentifier(), getLibraryMap(), + EvaluationResult evaluationResult = engineVisitor.evaluate(library.getIdentifier(), Set.of("Union"), null, null, null, null); @@ -56,7 +55,7 @@ public void testWithCache() { engineVisitor.getState().clearEvaluatedResources(); - evaluationResult = engineVisitor.evaluate(library.getIdentifier(), getLibraryMap(), + evaluationResult = engineVisitor.evaluate(library.getIdentifier(), Set.of("Encounter"), null, null, null, null); result = evaluationResult.expressionResults.get("Encounter").value(); assertThat(result, instanceOf(List.class)); @@ -64,7 +63,7 @@ public void testWithCache() { engineVisitor.getState().clearEvaluatedResources(); - evaluationResult = engineVisitor.evaluate(library.getIdentifier(), getLibraryMap(), + evaluationResult = engineVisitor.evaluate(library.getIdentifier(), Set.of("Condition"), null, null, null, null); result = evaluationResult.expressionResults.get("Condition").value(); assertThat(result, instanceOf(List.class)); @@ -74,9 +73,9 @@ public void testWithCache() { @Test public void testWithoutCache() { - CqlEngine engineVisitor = TranslatorHelper.getEngineVisitor(); - engineVisitor.getState().registerDataProvider("http://hl7.org/fhir", new CompositeDataProvider(r4ModelResolver, rp)); - EvaluationResult evaluationResult = engineVisitor.evaluate(library.getIdentifier(), getLibraryMap(), + CqlEngine engineVisitor = getEngine(); + engineVisitor.getState().getEnvironment().registerDataProvider("http://hl7.org/fhir", new CompositeDataProvider(r4ModelResolver, rp)); + EvaluationResult evaluationResult = engineVisitor.evaluate(library.getIdentifier(), Set.of("Union"), null, null, null, null); Object result = evaluationResult.expressionResults.get("Union").value(); @@ -85,7 +84,7 @@ public void testWithoutCache() { engineVisitor.getState().clearEvaluatedResources(); - evaluationResult = engineVisitor.evaluate(library.getIdentifier(), getLibraryMap(), + evaluationResult = engineVisitor.evaluate(library.getIdentifier(), Set.of("Encounter"), null, null, null, null); result = evaluationResult.expressionResults.get("Encounter").value(); assertThat(result, instanceOf(List.class)); @@ -93,13 +92,13 @@ public void testWithoutCache() { engineVisitor.getState().clearEvaluatedResources(); - evaluationResult = engineVisitor.evaluate(library.getIdentifier(), getLibraryMap(), + evaluationResult = engineVisitor.evaluate(library.getIdentifier(), Set.of("Condition"), null, null, null, null); result = evaluationResult.expressionResults.get("Condition").value(); assertThat(result, instanceOf(List.class)); assertThat(evaluationResult.expressionResults.get("Condition").evaluatedResources().size(), is(1)); - evaluationResult = engineVisitor.evaluate(library.getIdentifier(), getLibraryMap(), + evaluationResult = engineVisitor.evaluate(library.getIdentifier(), Set.of("Union"), null, null, null, null); result = evaluationResult.expressionResults.get("Union").value(); assertThat(result, instanceOf(List.class)); diff --git a/Src/java/engine-fhir/src/test/java/org/opencds/cqf/cql/engine/fhir/data/FhirExecutionTestBase.java b/Src/java/engine-fhir/src/test/java/org/opencds/cqf/cql/engine/fhir/data/FhirExecutionTestBase.java index 1e90e4574..9fc7bcd8a 100644 --- a/Src/java/engine-fhir/src/test/java/org/opencds/cqf/cql/engine/fhir/data/FhirExecutionTestBase.java +++ b/Src/java/engine-fhir/src/test/java/org/opencds/cqf/cql/engine/fhir/data/FhirExecutionTestBase.java @@ -6,10 +6,7 @@ import org.cqframework.cql.cql2elm.quick.FhirLibrarySourceProvider; import org.hl7.elm.r1.Library; import org.cqframework.cql.elm.tracking.TrackBack; -import org.fhir.ucum.UcumEssenceService; import org.fhir.ucum.UcumException; -import org.fhir.ucum.UcumService; -import org.hl7.elm.r1.VersionedIdentifier; import org.opencds.cqf.cql.engine.data.CompositeDataProvider; import org.opencds.cqf.cql.engine.execution.CqlEngine; import org.opencds.cqf.cql.engine.execution.Environment; @@ -24,37 +21,26 @@ import java.io.IOException; import java.net.URLDecoder; import java.util.ArrayList; -import java.util.HashMap; -import java.util.Map; - -import static org.hamcrest.MatcherAssert.assertThat; -import static org.hamcrest.Matchers.is; public abstract class FhirExecutionTestBase { - static Map libraries = new HashMap<>(); - - private LibraryManager getLibraryManager() { - ModelManager modelManager = new ModelManager(); - - LibraryManager libraryManager = new LibraryManager(modelManager); - libraryManager.getLibrarySourceLoader().clearProviders(); - libraryManager.getLibrarySourceLoader().registerProvider(new FhirLibrarySourceProvider()); + public LibraryManager getLibraryManager() { + return this.libraryManager; + } - return libraryManager; + public ModelManager getModelManager() { + return this.modelManager; } public Environment getEnvironment() { return new Environment(getLibraryManager()); } - public CqlEngine getEngineVisitor() { + public CqlEngine getEngine() { return new CqlEngine(getEnvironment()); } - public Map getLibraryMap() { - return libraries; - } - + private LibraryManager libraryManager; + private ModelManager modelManager; protected Dstu2FhirModelResolver dstu2ModelResolver; protected RestFhirRetrieveProvider dstu2RetrieveProvider; @@ -91,32 +77,29 @@ public void setup() { r4Context.newRestfulGenericClient("http://measure.eval.kanvix.com/cqf-ruler/baseDstu4")); r4Provider = new CompositeDataProvider(r4ModelResolver, r4RetrieveProvider); + this.modelManager = new ModelManager(); + var compilerOptions = new CqlCompilerOptions(CqlCompilerException.ErrorSeverity.Info, LibraryBuilder.SignatureLevel.All, CqlCompilerOptions.Options.EnableDateRangeOptimization); + this.libraryManager = new LibraryManager(modelManager, compilerOptions); + libraryManager.getLibrarySourceLoader().clearProviders(); + libraryManager.getLibrarySourceLoader().registerProvider(new FhirLibrarySourceProvider()); + libraryManager.getLibrarySourceLoader().registerProvider(new TestLibrarySourceProvider()); } @BeforeMethod public void beforeEachTestMethod() throws JAXBException, IOException, UcumException { String fileName = this.getClass().getSimpleName(); - library = libraries.get(fileName); if (library == null) { - UcumService ucumService = new UcumEssenceService(UcumEssenceService.class.getResourceAsStream("/ucum-essence.xml")); try { - File cqlFile = new File(URLDecoder.decode(this.getClass().getResource("fhir/" + fileName + ".cql").getFile(), "UTF-8")); + File cqlFile = new File(URLDecoder.decode(this.getClass().getResource(fileName + ".cql").getFile(), "UTF-8")); - ArrayList options = new ArrayList<>(); - options.add(CqlTranslatorOptions.Options.EnableDateRangeOptimization); - ModelManager modelManager = new ModelManager(); + CqlCompiler compiler = new CqlCompiler(getLibraryManager()); - LibraryManager libraryManager = new LibraryManager(modelManager); - libraryManager.getLibrarySourceLoader().clearProviders(); - libraryManager.getLibrarySourceLoader().registerProvider(new FhirLibrarySourceProvider()); + var library = compiler.run(cqlFile); - CqlTranslator translator = CqlTranslator.fromFile(cqlFile, modelManager, libraryManager, ucumService, - CqlCompilerException.ErrorSeverity.Info, LibraryBuilder.SignatureLevel.All, options.toArray(new CqlTranslatorOptions.Options[options.size()])); - - if (translator.getErrors().size() > 0) { + if (!compiler.getErrors().isEmpty()) { System.err.println("Translation failed due to errors:"); ArrayList errors = new ArrayList<>(); - for (CqlCompilerException error : translator.getErrors()) { + for (CqlCompilerException error : compiler.getErrors()) { TrackBack tb = error.getLocator(); String lines = tb == null ? "[n/a]" : String.format("[%d:%d, %d:%d]", tb.getStartLine(), tb.getStartChar(), tb.getEndLine(), tb.getEndChar()); @@ -126,9 +109,7 @@ public void beforeEachTestMethod() throws JAXBException, IOException, UcumExcept throw new IllegalArgumentException(errors.toString()); } - assertThat(translator.getErrors().size(), is(0)); - library = translator.toELM(); - libraries.put(library.getIdentifier(), library); + this.library = library; } catch (IOException e) { e.printStackTrace(); @@ -136,11 +117,6 @@ public void beforeEachTestMethod() throws JAXBException, IOException, UcumExcept } } - public Library toLibrary(String text, ModelManager modelManager, LibraryManager libraryManager) { - CqlTranslator translator = CqlTranslator.fromText(text, modelManager, libraryManager); - return translator.toELM(); - } - public static org.hl7.elm.r1.VersionedIdentifier toElmIdentifier(String name) { return new org.hl7.elm.r1.VersionedIdentifier().withId(name); } diff --git a/Src/java/engine-fhir/src/test/java/org/opencds/cqf/cql/engine/fhir/data/TestCodeRef.java b/Src/java/engine-fhir/src/test/java/org/opencds/cqf/cql/engine/fhir/data/TestCodeRef.java index 9edde8b06..526c278f3 100644 --- a/Src/java/engine-fhir/src/test/java/org/opencds/cqf/cql/engine/fhir/data/TestCodeRef.java +++ b/Src/java/engine-fhir/src/test/java/org/opencds/cqf/cql/engine/fhir/data/TestCodeRef.java @@ -2,7 +2,6 @@ import static org.testng.AssertJUnit.assertTrue; -import org.hl7.fhirpath.TranslatorHelper; import org.opencds.cqf.cql.engine.execution.CqlEngine; import org.opencds.cqf.cql.engine.execution.EvaluationResult; import org.opencds.cqf.cql.engine.fhir.terminology.Dstu3FhirTerminologyProvider; @@ -21,10 +20,9 @@ public class TestCodeRef extends FhirExecutionTestBase { // @Test public void CodeRefTest1() { - CqlEngine engineVisitor = TranslatorHelper.getEngineVisitor(); - engineVisitor.getEnvironment().setTerminologyProvider(terminologyProvider); + CqlEngine engineVisitor = getEngine(); - EvaluationResult evaluationResult = engineVisitor.evaluate(library.getIdentifier(), getLibraryMap(), + EvaluationResult evaluationResult = engineVisitor.evaluate(library.getIdentifier(), Set.of("CodeRef1"), null, null, null, null); assertTrue(evaluationResult.expressionResults.get("CodeRef1").value() != null); @@ -32,10 +30,9 @@ public void CodeRefTest1() { // @Test public void CodeRefTest2() { - CqlEngine engineVisitor = TranslatorHelper.getEngineVisitor(); - engineVisitor.getEnvironment().setTerminologyProvider(terminologyProvider); + CqlEngine engineVisitor = getEngine(); - EvaluationResult evaluationResult = engineVisitor.evaluate(library.getIdentifier(), getLibraryMap(), + EvaluationResult evaluationResult = engineVisitor.evaluate(library.getIdentifier(), Set.of("CodeRef2"), null, null, null, null); assertTrue(evaluationResult.expressionResults.get("CodeRef2").value() != null); diff --git a/Src/java/engine-fhir/src/test/java/org/opencds/cqf/cql/engine/fhir/data/TestFHIR2Helpers.java b/Src/java/engine-fhir/src/test/java/org/opencds/cqf/cql/engine/fhir/data/TestFHIR2Helpers.java index 8f9fc72fd..9c270ba0f 100644 --- a/Src/java/engine-fhir/src/test/java/org/opencds/cqf/cql/engine/fhir/data/TestFHIR2Helpers.java +++ b/Src/java/engine-fhir/src/test/java/org/opencds/cqf/cql/engine/fhir/data/TestFHIR2Helpers.java @@ -1,6 +1,5 @@ package org.opencds.cqf.cql.engine.fhir.data; -import org.hl7.fhirpath.TranslatorHelper; import org.opencds.cqf.cql.engine.execution.CqlEngine; import org.opencds.cqf.cql.engine.execution.EvaluationResult; @@ -13,9 +12,9 @@ public class TestFHIR2Helpers extends FhirExecutionTestBase { // BTR-> Getting very strange behavior in the FHIR2 tests that I can't explain :( // Backing out of the updates to FHIR Model Info for DSTU2, would require another week I don't have right now public void test() { - CqlEngine engineVisitor = TranslatorHelper.getEngineVisitor(); - engineVisitor.getState().registerDataProvider("http://hl7.org/fhir", dstu2Provider); - EvaluationResult evaluationResult = engineVisitor.evaluate(library.getIdentifier(), getLibraryMap(), + CqlEngine engineVisitor = getEngine(); + engineVisitor.getState().getEnvironment().registerDataProvider("http://hl7.org/fhir", dstu2Provider); + EvaluationResult evaluationResult = engineVisitor.evaluate(library.getIdentifier(), null, null, null, null, null); Object result; diff --git a/Src/java/engine-fhir/src/test/java/org/opencds/cqf/cql/engine/fhir/data/TestFHIR3Helpers.java b/Src/java/engine-fhir/src/test/java/org/opencds/cqf/cql/engine/fhir/data/TestFHIR3Helpers.java index 96bbad49f..767a15b40 100644 --- a/Src/java/engine-fhir/src/test/java/org/opencds/cqf/cql/engine/fhir/data/TestFHIR3Helpers.java +++ b/Src/java/engine-fhir/src/test/java/org/opencds/cqf/cql/engine/fhir/data/TestFHIR3Helpers.java @@ -1,6 +1,5 @@ package org.opencds.cqf.cql.engine.fhir.data; -import org.hl7.fhirpath.TranslatorHelper; import org.opencds.cqf.cql.engine.execution.CqlEngine; import org.opencds.cqf.cql.engine.execution.EvaluationResult; @@ -13,9 +12,9 @@ public class TestFHIR3Helpers extends FhirExecutionTestBase { // BTR-> Getting very strange behavior in the FHIR3 tests that I can't explain :( // Backing out of the updates to FHIR Model Info for STU3, would require another week I don't have right now public void test() { - CqlEngine engineVisitor = TranslatorHelper.getEngineVisitor(); - engineVisitor.getState().registerDataProvider("http://hl7.org/fhir", dstu3Provider); - EvaluationResult evaluationResult = engineVisitor.evaluate(library.getIdentifier(), getLibraryMap(), + CqlEngine engineVisitor = getEngine(); + engineVisitor.getState().getEnvironment().registerDataProvider("http://hl7.org/fhir", dstu3Provider); + EvaluationResult evaluationResult = engineVisitor.evaluate(library.getIdentifier(), null, null, null, null, null); Object result; diff --git a/Src/java/engine-fhir/src/test/java/org/opencds/cqf/cql/engine/fhir/data/TestFHIRHelpers.java b/Src/java/engine-fhir/src/test/java/org/opencds/cqf/cql/engine/fhir/data/TestFHIRHelpers.java index fae0225ac..f81b5711d 100644 --- a/Src/java/engine-fhir/src/test/java/org/opencds/cqf/cql/engine/fhir/data/TestFHIRHelpers.java +++ b/Src/java/engine-fhir/src/test/java/org/opencds/cqf/cql/engine/fhir/data/TestFHIRHelpers.java @@ -1,6 +1,5 @@ package org.opencds.cqf.cql.engine.fhir.data; -import org.hl7.fhirpath.TranslatorHelper; import org.opencds.cqf.cql.engine.execution.CqlEngine; import org.opencds.cqf.cql.engine.execution.EvaluationResult; import org.testng.annotations.Test; @@ -10,15 +9,15 @@ import static org.hamcrest.MatcherAssert.assertThat; public class TestFHIRHelpers extends FhirExecutionTestBase { - + @Test public void test() { - CqlEngine engineVisitor = TranslatorHelper.getEngineVisitor(); - engineVisitor.getState().registerDataProvider("http://hl7.org/fhir", r4Provider); - EvaluationResult evaluationResult = engineVisitor.evaluate(library.getIdentifier(), getLibraryMap(), + CqlEngine engineVisitor = getEngine(); + engineVisitor.getState().getEnvironment().registerDataProvider("http://hl7.org/fhir", r4Provider); + EvaluationResult evaluationResult = engineVisitor.evaluate(library.getIdentifier(), null, null, null, null, null); - + Object result; // Primitives diff --git a/Src/java/engine-fhir/src/test/java/org/opencds/cqf/cql/engine/fhir/data/TestFhirDataProviderDstu2.java b/Src/java/engine-fhir/src/test/java/org/opencds/cqf/cql/engine/fhir/data/TestFhirDataProviderDstu2.java index bd2515a48..b6b9b92e3 100644 --- a/Src/java/engine-fhir/src/test/java/org/opencds/cqf/cql/engine/fhir/data/TestFhirDataProviderDstu2.java +++ b/Src/java/engine-fhir/src/test/java/org/opencds/cqf/cql/engine/fhir/data/TestFhirDataProviderDstu2.java @@ -3,7 +3,6 @@ import static org.testng.Assert.assertTrue; import org.hl7.fhir.dstu2.model.Encounter; -import org.hl7.fhirpath.TranslatorHelper; import org.opencds.cqf.cql.engine.execution.CqlEngine; import org.opencds.cqf.cql.engine.execution.EvaluationResult; import org.opencds.cqf.cql.engine.fhir.retrieve.FhirBundleCursor; @@ -16,9 +15,9 @@ public class TestFhirDataProviderDstu2 extends FhirExecutionTestBase { @BeforeMethod public void before() { - CqlEngine engineVisitor = TranslatorHelper.getEngineVisitor(); - engineVisitor.getState().registerDataProvider("http://hl7.org/fhir", dstu2Provider); - evaluationResult = engineVisitor.evaluate(library.getIdentifier(), getLibraryMap(), + CqlEngine engineVisitor = getEngine(); + engineVisitor.getState().getEnvironment().registerDataProvider("http://hl7.org/fhir", dstu2Provider); + evaluationResult = engineVisitor.evaluate(library.getIdentifier(), null, null, null, null, null); //BaseFhirDataProvider provider = new FhirDataProviderDstu2().setEndpoint("http://fhirtest.uhn.ca/baseDstu2"); // FhirDataProviderDstu2 primitiveProvider = new FhirDataProviderDstu2().withEndpoint("http://fhirtest.uhn.ca/baseDstu2").withPackageName("ca.uhn.fhir.model.primitive"); diff --git a/Src/java/engine-fhir/src/test/java/org/opencds/cqf/cql/engine/fhir/data/TestFhirDataProviderDstu3.java b/Src/java/engine-fhir/src/test/java/org/opencds/cqf/cql/engine/fhir/data/TestFhirDataProviderDstu3.java index 423514de3..6e4939ae9 100644 --- a/Src/java/engine-fhir/src/test/java/org/opencds/cqf/cql/engine/fhir/data/TestFhirDataProviderDstu3.java +++ b/Src/java/engine-fhir/src/test/java/org/opencds/cqf/cql/engine/fhir/data/TestFhirDataProviderDstu3.java @@ -9,7 +9,6 @@ import org.hl7.fhir.dstu3.model.Bundle; import org.hl7.fhir.dstu3.model.ListResource; import org.hl7.fhir.dstu3.model.Patient; -import org.hl7.fhirpath.TranslatorHelper; import org.opencds.cqf.cql.engine.data.CompositeDataProvider; import org.opencds.cqf.cql.engine.execution.CqlEngine; import org.opencds.cqf.cql.engine.execution.EvaluationResult; @@ -79,9 +78,9 @@ public void testPatientRetrieve() { // @Test public void testChoiceTypes() { - CqlEngine engineVisitor = TranslatorHelper.getEngineVisitor(); - engineVisitor.getState().registerDataProvider("http://hl7.org/fhir", r4Provider); - EvaluationResult evaluationResult = engineVisitor.evaluate(library.getIdentifier(), getLibraryMap(), + CqlEngine engineVisitor = getEngine(); + engineVisitor.getState().getEnvironment().registerDataProvider("http://hl7.org/fhir", r4Provider); + EvaluationResult evaluationResult = engineVisitor.evaluate(library.getIdentifier(), Set.of("testChoiceTypes"), null, null, null, null); Object result = evaluationResult.expressionResults.get("testChoiceTypes").value(); @@ -90,10 +89,10 @@ public void testChoiceTypes() { // @Test public void testDateType() { - CqlEngine engineVisitor = TranslatorHelper.getEngineVisitor(); - engineVisitor.getState().registerDataProvider("http://hl7.org/fhir", r4Provider); + CqlEngine engineVisitor = getEngine(); + engineVisitor.getState().getEnvironment().registerDataProvider("http://hl7.org/fhir", r4Provider); engineVisitor.getState().setContextValue("Patient", "Patient-12214"); - EvaluationResult evaluationResult = engineVisitor.evaluate(library.getIdentifier(), getLibraryMap(), + EvaluationResult evaluationResult = engineVisitor.evaluate(library.getIdentifier(), Set.of("testDateType"), null, null, null, null); Object result = evaluationResult.expressionResults.get("testDateType").value(); @@ -101,22 +100,20 @@ public void testDateType() { } @Test - public void testFhirObjectEqual() - { - CqlEngine engineVisitor = TranslatorHelper.getEngineVisitor(); - engineVisitor.getState().registerDataProvider("http://hl7.org/fhir", r4Provider); - EvaluationResult evaluationResult = engineVisitor.evaluate(library.getIdentifier(), getLibraryMap(), + public void testFhirObjectEqual() { + CqlEngine engineVisitor = getEngine(); + engineVisitor.getState().getEnvironment().registerDataProvider("http://hl7.org/fhir", r4Provider); + EvaluationResult evaluationResult = engineVisitor.evaluate(library.getIdentifier(), Set.of("testFhirObjectEqual"), null, null, null, null); Object result = evaluationResult.expressionResults.get("testFhirObjectEqual").value(); Assert.assertTrue((Boolean) result); } @Test - public void testFhirObjectEquivalent() - { - CqlEngine engineVisitor = TranslatorHelper.getEngineVisitor(); - engineVisitor.getState().registerDataProvider("http://hl7.org/fhir", r4Provider); - EvaluationResult evaluationResult = engineVisitor.evaluate(library.getIdentifier(), getLibraryMap(), + public void testFhirObjectEquivalent() { + CqlEngine engineVisitor = getEngine(); + engineVisitor.getState().getEnvironment().registerDataProvider("http://hl7.org/fhir", r4Provider); + EvaluationResult evaluationResult = engineVisitor.evaluate(library.getIdentifier(), Set.of("testFhirObjectEquivalent"), null, null, null, null); Object result = evaluationResult.expressionResults.get("testFhirObjectEquivalent").value(); Assert.assertTrue((Boolean) result); @@ -240,12 +237,12 @@ public void testContained() dstu3RetrieveProvider.setTerminologyProvider(new Dstu3FhirTerminologyProvider(fhirClient)); //dstu3Provider.setTerminologyProvider(new FhirTerminologyProvider().setEndpoint("http://measure.eval.kanvix.com/cqf-ruler/baseDstu3", false)); - CqlEngine engineVisitor = TranslatorHelper.getEngineVisitor(); - engineVisitor.getState().registerDataProvider("http://hl7.org/fhir", dstu3Provider); + CqlEngine engineVisitor = getEngine(); + engineVisitor.getState().getEnvironment().registerDataProvider("http://hl7.org/fhir", dstu3Provider); engineVisitor.getState().enterContext("Patient"); engineVisitor.getState().setContextValue("Patient", "81ee6581-02b9-44de-b026-7401bf36643a"); - EvaluationResult evaluationResult = engineVisitor.evaluate(library.getIdentifier(), getLibraryMap(), + EvaluationResult evaluationResult = engineVisitor.evaluate(library.getIdentifier(), Set.of("GetProvenance"), null, null, null, null); Object result = evaluationResult.expressionResults.get("GetProvenance").value(); Assert.assertTrue(result instanceof List && ((List) result).size() == 1); diff --git a/Src/java/engine-fhir/src/test/java/org/opencds/cqf/cql/engine/fhir/data/TestFhirExecution.java b/Src/java/engine-fhir/src/test/java/org/opencds/cqf/cql/engine/fhir/data/TestFhirExecution.java index 7097dccbb..7c1b29bbc 100644 --- a/Src/java/engine-fhir/src/test/java/org/opencds/cqf/cql/engine/fhir/data/TestFhirExecution.java +++ b/Src/java/engine-fhir/src/test/java/org/opencds/cqf/cql/engine/fhir/data/TestFhirExecution.java @@ -3,8 +3,6 @@ import java.util.List; import java.util.Set; - -import org.hl7.fhirpath.TranslatorHelper; import org.opencds.cqf.cql.engine.execution.CqlEngine; import org.opencds.cqf.cql.engine.execution.EvaluationResult; import org.testng.Assert; @@ -14,21 +12,21 @@ public class TestFhirExecution extends FhirExecutionTestBase { // TODO: fix this... I think it requires a resource to be loaded - put in init bundle //@Test public void testCoalesce() { - CqlEngine engineVisitor = TranslatorHelper.getEngineVisitor(); - engineVisitor.getState().registerDataProvider("http://hl7.org/fhir", dstu3Provider); - EvaluationResult evaluationResult = engineVisitor.evaluate(library.getIdentifier(), getLibraryMap(), + CqlEngine engineVisitor = getEngine(); + engineVisitor.getState().getEnvironment().registerDataProvider("http://hl7.org/fhir", dstu3Provider); + EvaluationResult evaluationResult = engineVisitor.evaluate(library.getIdentifier(), Set.of("testCoalesce"), null, null, null, null); - + Object result = evaluationResult.expressionResults.get("testCoalesce").value(); Assert.assertTrue((Integer)((List) result).get(0) == 72); } // @Test public void testMonthFrom() { - CqlEngine engineVisitor = TranslatorHelper.getEngineVisitor(); - engineVisitor.getState().registerDataProvider("http://hl7.org/fhir", dstu3Provider); + CqlEngine engineVisitor = getEngine(); + engineVisitor.getState().getEnvironment().registerDataProvider("http://hl7.org/fhir", dstu3Provider); engineVisitor.getState().setParameter(null, "MAXYEAR", 2014); - EvaluationResult evaluationResult = engineVisitor.evaluate(library.getIdentifier(), getLibraryMap(), + EvaluationResult evaluationResult = engineVisitor.evaluate(library.getIdentifier(), Set.of("testMonthFrom"), null, null, null, null); Object result = evaluationResult.expressionResults.get("testMonthFrom").value(); Assert.assertTrue(result != null); @@ -36,9 +34,9 @@ public void testMonthFrom() { // @Test public void testMultisourceQueryCreatingDatePeriod() { - CqlEngine engineVisitor = TranslatorHelper.getEngineVisitor(); - engineVisitor.getState().registerDataProvider("http://hl7.org/fhir", dstu3Provider); - EvaluationResult evaluationResult = engineVisitor.evaluate(library.getIdentifier(), getLibraryMap(), + CqlEngine engineVisitor = getEngine(); + engineVisitor.getState().getEnvironment().registerDataProvider("http://hl7.org/fhir", dstu3Provider); + EvaluationResult evaluationResult = engineVisitor.evaluate(library.getIdentifier(), Set.of("Immunizations in range"), null, null, null, null); Object result = evaluationResult.expressionResults.get("Immunizations in range").value(); Assert.assertTrue(result != null); @@ -46,9 +44,9 @@ public void testMultisourceQueryCreatingDatePeriod() { // @Test public void testIdResolution() { - CqlEngine engineVisitor = TranslatorHelper.getEngineVisitor(); - engineVisitor.getState().registerDataProvider("http://hl7.org/fhir", dstu3Provider); - EvaluationResult evaluationResult = engineVisitor.evaluate(library.getIdentifier(), getLibraryMap(), + CqlEngine engineVisitor = getEngine(); + engineVisitor.getState().getEnvironment().registerDataProvider("http://hl7.org/fhir", dstu3Provider); + EvaluationResult evaluationResult = engineVisitor.evaluate(library.getIdentifier(), Set.of("Resource Id"), null, null, null, null); Object result = evaluationResult.expressionResults.get("Resource Id").value(); Assert.assertTrue(result != null); diff --git a/Src/java/engine-fhir/src/test/java/org/opencds/cqf/cql/engine/fhir/data/TestLibraryLoader.java b/Src/java/engine-fhir/src/test/java/org/opencds/cqf/cql/engine/fhir/data/TestLibraryLoader.java deleted file mode 100644 index 590117e1a..000000000 --- a/Src/java/engine-fhir/src/test/java/org/opencds/cqf/cql/engine/fhir/data/TestLibraryLoader.java +++ /dev/null @@ -1,25 +0,0 @@ -package org.opencds.cqf.cql.engine.fhir.data; - -import java.util.Map; - -import org.hl7.elm.r1.Library; -import org.hl7.elm.r1.VersionedIdentifier; -import org.opencds.cqf.cql.engine.execution.LibraryLoader; - -public class TestLibraryLoader implements LibraryLoader { - private Map libraries; - - public TestLibraryLoader(Map libraries) { - this.libraries = libraries; - } - - @Override - public Library load(VersionedIdentifier libraryIdentifier) { - Library result = libraries.get(libraryIdentifier.getId()); - if (result == null) { - throw new IllegalArgumentException(String.format("Could not load ELM for library %s", libraryIdentifier.getId())); - } - - return result; - } -} diff --git a/Src/java/engine-fhir/src/test/java/org/opencds/cqf/cql/engine/fhir/data/TestPrimitiveProfiles.java b/Src/java/engine-fhir/src/test/java/org/opencds/cqf/cql/engine/fhir/data/TestPrimitiveProfiles.java index 3f0ae724e..0814d3202 100644 --- a/Src/java/engine-fhir/src/test/java/org/opencds/cqf/cql/engine/fhir/data/TestPrimitiveProfiles.java +++ b/Src/java/engine-fhir/src/test/java/org/opencds/cqf/cql/engine/fhir/data/TestPrimitiveProfiles.java @@ -1,7 +1,5 @@ package org.opencds.cqf.cql.engine.fhir.data; - -import org.hl7.fhirpath.TranslatorHelper; import org.opencds.cqf.cql.engine.execution.CqlEngine; import org.opencds.cqf.cql.engine.execution.EvaluationResult; import org.testng.annotations.Test; @@ -18,11 +16,11 @@ public class TestPrimitiveProfiles extends FhirExecutionTestBase { @Test public void testProfileCast() { - CqlEngine engineVisitor = TranslatorHelper.getEngineVisitor(); - engineVisitor.getState().registerDataProvider("http://hl7.org/fhir", r4Provider); - EvaluationResult evaluationResult = engineVisitor.evaluate(library.getIdentifier(), getLibraryMap(), + CqlEngine engineVisitor = getEngine(); + engineVisitor.getState().getEnvironment().registerDataProvider("http://hl7.org/fhir", r4Provider); + EvaluationResult evaluationResult = engineVisitor.evaluate(library.getIdentifier(), null, null, null, null, null); - + Object result; /* diff --git a/Src/java/engine-fhir/src/test/resources/org/opencds/cqf/cql/engine/fhir/data/fhir/CMS9v4_CQM.cql b/Src/java/engine-fhir/src/test/resources/org/opencds/cqf/cql/engine/fhir/data/CMS9v4_CQM.cql similarity index 100% rename from Src/java/engine-fhir/src/test/resources/org/opencds/cqf/cql/engine/fhir/data/fhir/CMS9v4_CQM.cql rename to Src/java/engine-fhir/src/test/resources/org/opencds/cqf/cql/engine/fhir/data/CMS9v4_CQM.cql diff --git a/Src/java/engine-fhir/src/test/resources/org/opencds/cqf/cql/engine/fhir/data/fhir/CMS9v4_CQM.xml b/Src/java/engine-fhir/src/test/resources/org/opencds/cqf/cql/engine/fhir/data/CMS9v4_CQM.xml similarity index 100% rename from Src/java/engine-fhir/src/test/resources/org/opencds/cqf/cql/engine/fhir/data/fhir/CMS9v4_CQM.xml rename to Src/java/engine-fhir/src/test/resources/org/opencds/cqf/cql/engine/fhir/data/CMS9v4_CQM.xml diff --git a/Src/java/engine-fhir/src/test/resources/org/opencds/cqf/cql/engine/fhir/data/fhir/ComplexCrossResourceSearch.cql b/Src/java/engine-fhir/src/test/resources/org/opencds/cqf/cql/engine/fhir/data/ComplexCrossResourceSearch.cql similarity index 100% rename from Src/java/engine-fhir/src/test/resources/org/opencds/cqf/cql/engine/fhir/data/fhir/ComplexCrossResourceSearch.cql rename to Src/java/engine-fhir/src/test/resources/org/opencds/cqf/cql/engine/fhir/data/ComplexCrossResourceSearch.cql diff --git a/Src/java/engine-fhir/src/test/resources/org/opencds/cqf/cql/engine/fhir/data/fhir/EvaluatedResourcesTest.cql b/Src/java/engine-fhir/src/test/resources/org/opencds/cqf/cql/engine/fhir/data/EvaluatedResourcesTest.cql similarity index 100% rename from Src/java/engine-fhir/src/test/resources/org/opencds/cqf/cql/engine/fhir/data/fhir/EvaluatedResourcesTest.cql rename to Src/java/engine-fhir/src/test/resources/org/opencds/cqf/cql/engine/fhir/data/EvaluatedResourcesTest.cql diff --git a/Src/java/engine-fhir/src/test/resources/org/opencds/cqf/cql/engine/fhir/data/fhir/FHIRHelpers.cql b/Src/java/engine-fhir/src/test/resources/org/opencds/cqf/cql/engine/fhir/data/FHIRHelpers.cql similarity index 100% rename from Src/java/engine-fhir/src/test/resources/org/opencds/cqf/cql/engine/fhir/data/fhir/FHIRHelpers.cql rename to Src/java/engine-fhir/src/test/resources/org/opencds/cqf/cql/engine/fhir/data/FHIRHelpers.cql diff --git a/Src/java/engine-fhir/src/test/resources/org/opencds/cqf/cql/engine/fhir/data/fhir/TestCodeRef.cql b/Src/java/engine-fhir/src/test/resources/org/opencds/cqf/cql/engine/fhir/data/TestCodeRef.cql similarity index 100% rename from Src/java/engine-fhir/src/test/resources/org/opencds/cqf/cql/engine/fhir/data/fhir/TestCodeRef.cql rename to Src/java/engine-fhir/src/test/resources/org/opencds/cqf/cql/engine/fhir/data/TestCodeRef.cql diff --git a/Src/java/engine-fhir/src/test/resources/org/opencds/cqf/cql/engine/fhir/data/fhir/TestFHIR2Helpers.cql b/Src/java/engine-fhir/src/test/resources/org/opencds/cqf/cql/engine/fhir/data/TestFHIR2Helpers.cql similarity index 100% rename from Src/java/engine-fhir/src/test/resources/org/opencds/cqf/cql/engine/fhir/data/fhir/TestFHIR2Helpers.cql rename to Src/java/engine-fhir/src/test/resources/org/opencds/cqf/cql/engine/fhir/data/TestFHIR2Helpers.cql diff --git a/Src/java/engine-fhir/src/test/resources/org/opencds/cqf/cql/engine/fhir/data/fhir/TestFHIR3Helpers.cql b/Src/java/engine-fhir/src/test/resources/org/opencds/cqf/cql/engine/fhir/data/TestFHIR3Helpers.cql similarity index 100% rename from Src/java/engine-fhir/src/test/resources/org/opencds/cqf/cql/engine/fhir/data/fhir/TestFHIR3Helpers.cql rename to Src/java/engine-fhir/src/test/resources/org/opencds/cqf/cql/engine/fhir/data/TestFHIR3Helpers.cql diff --git a/Src/java/engine-fhir/src/test/resources/org/opencds/cqf/cql/engine/fhir/data/fhir/TestFHIRHelpers.cql b/Src/java/engine-fhir/src/test/resources/org/opencds/cqf/cql/engine/fhir/data/TestFHIRHelpers.cql similarity index 100% rename from Src/java/engine-fhir/src/test/resources/org/opencds/cqf/cql/engine/fhir/data/fhir/TestFHIRHelpers.cql rename to Src/java/engine-fhir/src/test/resources/org/opencds/cqf/cql/engine/fhir/data/TestFHIRHelpers.cql diff --git a/Src/java/engine-fhir/src/test/resources/org/opencds/cqf/cql/engine/fhir/data/fhir/TestFhirDataProviderDstu2.cql b/Src/java/engine-fhir/src/test/resources/org/opencds/cqf/cql/engine/fhir/data/TestFhirDataProviderDstu2.cql similarity index 100% rename from Src/java/engine-fhir/src/test/resources/org/opencds/cqf/cql/engine/fhir/data/fhir/TestFhirDataProviderDstu2.cql rename to Src/java/engine-fhir/src/test/resources/org/opencds/cqf/cql/engine/fhir/data/TestFhirDataProviderDstu2.cql diff --git a/Src/java/engine-fhir/src/test/resources/org/opencds/cqf/cql/engine/fhir/data/fhir/TestFhirDataProviderDstu3.cql b/Src/java/engine-fhir/src/test/resources/org/opencds/cqf/cql/engine/fhir/data/TestFhirDataProviderDstu3.cql similarity index 100% rename from Src/java/engine-fhir/src/test/resources/org/opencds/cqf/cql/engine/fhir/data/fhir/TestFhirDataProviderDstu3.cql rename to Src/java/engine-fhir/src/test/resources/org/opencds/cqf/cql/engine/fhir/data/TestFhirDataProviderDstu3.cql diff --git a/Src/java/engine-fhir/src/test/resources/org/opencds/cqf/cql/engine/fhir/data/fhir/TestFhirDataProviderHL7.cql b/Src/java/engine-fhir/src/test/resources/org/opencds/cqf/cql/engine/fhir/data/TestFhirDataProviderHL7.cql similarity index 100% rename from Src/java/engine-fhir/src/test/resources/org/opencds/cqf/cql/engine/fhir/data/fhir/TestFhirDataProviderHL7.cql rename to Src/java/engine-fhir/src/test/resources/org/opencds/cqf/cql/engine/fhir/data/TestFhirDataProviderHL7.cql diff --git a/Src/java/engine-fhir/src/test/resources/org/opencds/cqf/cql/engine/fhir/data/fhir/TestFhirExecution.cql b/Src/java/engine-fhir/src/test/resources/org/opencds/cqf/cql/engine/fhir/data/TestFhirExecution.cql similarity index 100% rename from Src/java/engine-fhir/src/test/resources/org/opencds/cqf/cql/engine/fhir/data/fhir/TestFhirExecution.cql rename to Src/java/engine-fhir/src/test/resources/org/opencds/cqf/cql/engine/fhir/data/TestFhirExecution.cql diff --git a/Src/java/engine-fhir/src/test/resources/org/opencds/cqf/cql/engine/fhir/data/fhir/TestPrimitiveProfiles.cql b/Src/java/engine-fhir/src/test/resources/org/opencds/cqf/cql/engine/fhir/data/TestPrimitiveProfiles.cql similarity index 100% rename from Src/java/engine-fhir/src/test/resources/org/opencds/cqf/cql/engine/fhir/data/fhir/TestPrimitiveProfiles.cql rename to Src/java/engine-fhir/src/test/resources/org/opencds/cqf/cql/engine/fhir/data/TestPrimitiveProfiles.cql diff --git a/Src/java/engine-fhir/src/test/resources/org/opencds/cqf/cql/engine/fhir/data/fhir/library-bcs.cql b/Src/java/engine-fhir/src/test/resources/org/opencds/cqf/cql/engine/fhir/data/library-bcs.cql similarity index 100% rename from Src/java/engine-fhir/src/test/resources/org/opencds/cqf/cql/engine/fhir/data/fhir/library-bcs.cql rename to Src/java/engine-fhir/src/test/resources/org/opencds/cqf/cql/engine/fhir/data/library-bcs.cql diff --git a/Src/java/engine-fhir/src/test/resources/org/opencds/cqf/cql/engine/fhir/data/fhir/library-bcs.elm.xml b/Src/java/engine-fhir/src/test/resources/org/opencds/cqf/cql/engine/fhir/data/library-bcs.elm.xml similarity index 100% rename from Src/java/engine-fhir/src/test/resources/org/opencds/cqf/cql/engine/fhir/data/fhir/library-bcs.elm.xml rename to Src/java/engine-fhir/src/test/resources/org/opencds/cqf/cql/engine/fhir/data/library-bcs.elm.xml diff --git a/Src/java/engine-fhir/src/test/resources/org/opencds/cqf/cql/engine/fhir/data/fhir/library-cbp.cql b/Src/java/engine-fhir/src/test/resources/org/opencds/cqf/cql/engine/fhir/data/library-cbp.cql similarity index 100% rename from Src/java/engine-fhir/src/test/resources/org/opencds/cqf/cql/engine/fhir/data/fhir/library-cbp.cql rename to Src/java/engine-fhir/src/test/resources/org/opencds/cqf/cql/engine/fhir/data/library-cbp.cql diff --git a/Src/java/engine-fhir/src/test/resources/org/opencds/cqf/cql/engine/fhir/data/fhir/library-cbp.elm.xml b/Src/java/engine-fhir/src/test/resources/org/opencds/cqf/cql/engine/fhir/data/library-cbp.elm.xml similarity index 100% rename from Src/java/engine-fhir/src/test/resources/org/opencds/cqf/cql/engine/fhir/data/fhir/library-cbp.elm.xml rename to Src/java/engine-fhir/src/test/resources/org/opencds/cqf/cql/engine/fhir/data/library-cbp.elm.xml diff --git a/Src/java/engine-fhir/src/test/resources/org/opencds/cqf/cql/engine/fhir/data/fhir/library-ccs.cql b/Src/java/engine-fhir/src/test/resources/org/opencds/cqf/cql/engine/fhir/data/library-ccs.cql similarity index 100% rename from Src/java/engine-fhir/src/test/resources/org/opencds/cqf/cql/engine/fhir/data/fhir/library-ccs.cql rename to Src/java/engine-fhir/src/test/resources/org/opencds/cqf/cql/engine/fhir/data/library-ccs.cql diff --git a/Src/java/engine-fhir/src/test/resources/org/opencds/cqf/cql/engine/fhir/data/fhir/library-ccs.elm.xml b/Src/java/engine-fhir/src/test/resources/org/opencds/cqf/cql/engine/fhir/data/library-ccs.elm.xml similarity index 100% rename from Src/java/engine-fhir/src/test/resources/org/opencds/cqf/cql/engine/fhir/data/fhir/library-ccs.elm.xml rename to Src/java/engine-fhir/src/test/resources/org/opencds/cqf/cql/engine/fhir/data/library-ccs.elm.xml diff --git a/Src/java/engine-fhir/src/test/resources/org/opencds/cqf/cql/engine/fhir/data/fhir/library-cdc.cql b/Src/java/engine-fhir/src/test/resources/org/opencds/cqf/cql/engine/fhir/data/library-cdc.cql similarity index 100% rename from Src/java/engine-fhir/src/test/resources/org/opencds/cqf/cql/engine/fhir/data/fhir/library-cdc.cql rename to Src/java/engine-fhir/src/test/resources/org/opencds/cqf/cql/engine/fhir/data/library-cdc.cql diff --git a/Src/java/engine-fhir/src/test/resources/org/opencds/cqf/cql/engine/fhir/data/fhir/library-cdc.elm.xml b/Src/java/engine-fhir/src/test/resources/org/opencds/cqf/cql/engine/fhir/data/library-cdc.elm.xml similarity index 100% rename from Src/java/engine-fhir/src/test/resources/org/opencds/cqf/cql/engine/fhir/data/fhir/library-cdc.elm.xml rename to Src/java/engine-fhir/src/test/resources/org/opencds/cqf/cql/engine/fhir/data/library-cdc.elm.xml diff --git a/Src/java/engine-fhir/src/test/resources/org/opencds/cqf/cql/engine/fhir/data/fhir/library-col.cql b/Src/java/engine-fhir/src/test/resources/org/opencds/cqf/cql/engine/fhir/data/library-col.cql similarity index 100% rename from Src/java/engine-fhir/src/test/resources/org/opencds/cqf/cql/engine/fhir/data/fhir/library-col.cql rename to Src/java/engine-fhir/src/test/resources/org/opencds/cqf/cql/engine/fhir/data/library-col.cql diff --git a/Src/java/engine-fhir/src/test/resources/org/opencds/cqf/cql/engine/fhir/data/fhir/library-col.elm.xml b/Src/java/engine-fhir/src/test/resources/org/opencds/cqf/cql/engine/fhir/data/library-col.elm.xml similarity index 100% rename from Src/java/engine-fhir/src/test/resources/org/opencds/cqf/cql/engine/fhir/data/fhir/library-col.elm.xml rename to Src/java/engine-fhir/src/test/resources/org/opencds/cqf/cql/engine/fhir/data/library-col.elm.xml diff --git a/Src/java/engine-fhir/src/test/resources/org/opencds/cqf/cql/engine/fhir/data/fhir/library-test.cql b/Src/java/engine-fhir/src/test/resources/org/opencds/cqf/cql/engine/fhir/data/library-test.cql similarity index 100% rename from Src/java/engine-fhir/src/test/resources/org/opencds/cqf/cql/engine/fhir/data/fhir/library-test.cql rename to Src/java/engine-fhir/src/test/resources/org/opencds/cqf/cql/engine/fhir/data/library-test.cql diff --git a/Src/java/engine-fhir/src/test/resources/org/opencds/cqf/cql/engine/fhir/data/fhir/library-test.xml b/Src/java/engine-fhir/src/test/resources/org/opencds/cqf/cql/engine/fhir/data/library-test.xml similarity index 100% rename from Src/java/engine-fhir/src/test/resources/org/opencds/cqf/cql/engine/fhir/data/fhir/library-test.xml rename to Src/java/engine-fhir/src/test/resources/org/opencds/cqf/cql/engine/fhir/data/library-test.xml diff --git a/Src/java/engine-fhir/src/test/resources/org/opencds/cqf/cql/engine/fhir/data/fhir/library-wcc-aba.cql b/Src/java/engine-fhir/src/test/resources/org/opencds/cqf/cql/engine/fhir/data/library-wcc-aba.cql similarity index 100% rename from Src/java/engine-fhir/src/test/resources/org/opencds/cqf/cql/engine/fhir/data/fhir/library-wcc-aba.cql rename to Src/java/engine-fhir/src/test/resources/org/opencds/cqf/cql/engine/fhir/data/library-wcc-aba.cql diff --git a/Src/java/engine-fhir/src/test/resources/org/opencds/cqf/cql/engine/fhir/data/fhir/library-wcc-aba.elm.xml b/Src/java/engine-fhir/src/test/resources/org/opencds/cqf/cql/engine/fhir/data/library-wcc-aba.elm.xml similarity index 100% rename from Src/java/engine-fhir/src/test/resources/org/opencds/cqf/cql/engine/fhir/data/fhir/library-wcc-aba.elm.xml rename to Src/java/engine-fhir/src/test/resources/org/opencds/cqf/cql/engine/fhir/data/library-wcc-aba.elm.xml diff --git a/Src/java/engine-fhir/src/test/resources/org/opencds/cqf/cql/engine/fhir/data/fhir/measure-cbp.xml b/Src/java/engine-fhir/src/test/resources/org/opencds/cqf/cql/engine/fhir/data/measure-cbp.xml similarity index 100% rename from Src/java/engine-fhir/src/test/resources/org/opencds/cqf/cql/engine/fhir/data/fhir/measure-cbp.xml rename to Src/java/engine-fhir/src/test/resources/org/opencds/cqf/cql/engine/fhir/data/measure-cbp.xml diff --git a/Src/java/engine-fhir/src/test/resources/org/opencds/cqf/cql/engine/fhir/data/fhir/measure-col.xml b/Src/java/engine-fhir/src/test/resources/org/opencds/cqf/cql/engine/fhir/data/measure-col.xml similarity index 100% rename from Src/java/engine-fhir/src/test/resources/org/opencds/cqf/cql/engine/fhir/data/fhir/measure-col.xml rename to Src/java/engine-fhir/src/test/resources/org/opencds/cqf/cql/engine/fhir/data/measure-col.xml diff --git a/Src/java/engine-fhir/src/test/resources/org/opencds/cqf/cql/engine/fhir/data/fhir/measure-test.xml b/Src/java/engine-fhir/src/test/resources/org/opencds/cqf/cql/engine/fhir/data/measure-test.xml similarity index 100% rename from Src/java/engine-fhir/src/test/resources/org/opencds/cqf/cql/engine/fhir/data/fhir/measure-test.xml rename to Src/java/engine-fhir/src/test/resources/org/opencds/cqf/cql/engine/fhir/data/measure-test.xml diff --git a/Src/java/engine/build.gradle b/Src/java/engine/build.gradle index 52d01d2ee..349bfff38 100644 --- a/Src/java/engine/build.gradle +++ b/Src/java/engine/build.gradle @@ -1,6 +1,5 @@ plugins { id 'cql.library-conventions' - id 'cql.xjc-conventions' } dependencies { @@ -15,14 +14,3 @@ dependencies { testImplementation project(':model-jackson') testImplementation project(':elm-jackson') } - -generateSources { - inputs.dir "${projectDir}/src/main/cql-lm/schema/elm" - - doLast { - ant.xjc(destdir: xjc.destDir, schema: "${projectDir}/src/main/cql-lm/schema/elm/library.xsd") { - arg(line: "${xjc.args} -npa " + - "-p org.cqframework.cql.elm.execution") - } - } -} \ No newline at end of file diff --git a/Src/java/engine/src/main/java/org/opencds/cqf/cql/engine/elm/executing/AsEvaluator.java b/Src/java/engine/src/main/java/org/opencds/cqf/cql/engine/elm/executing/AsEvaluator.java index 4e5c20f36..e9d3565be 100644 --- a/Src/java/engine/src/main/java/org/opencds/cqf/cql/engine/elm/executing/AsEvaluator.java +++ b/Src/java/engine/src/main/java/org/opencds/cqf/cql/engine/elm/executing/AsEvaluator.java @@ -27,14 +27,14 @@ public class AsEvaluator { private static Class resolveType(As as, State state) { if (as.getAsTypeSpecifier() != null) { - return state.resolveType(as.getAsTypeSpecifier()); + return state.getEnvironment().resolveType(as.getAsTypeSpecifier()); } - return state.resolveType(as.getAsType()); + return state.getEnvironment().resolveType(as.getAsType()); } public static Object internalEvaluate(Object operand, As as, boolean isStrict, State state) { Class clazz = resolveType(as, state); - return state.as(operand, clazz, isStrict); + return state.getEnvironment().as(operand, clazz, isStrict); } } diff --git a/Src/java/engine/src/main/java/org/opencds/cqf/cql/engine/elm/executing/CodeEvaluator.java b/Src/java/engine/src/main/java/org/opencds/cqf/cql/engine/elm/executing/CodeEvaluator.java index f47a18dbd..960f0c212 100644 --- a/Src/java/engine/src/main/java/org/opencds/cqf/cql/engine/elm/executing/CodeEvaluator.java +++ b/Src/java/engine/src/main/java/org/opencds/cqf/cql/engine/elm/executing/CodeEvaluator.java @@ -1,10 +1,8 @@ package org.opencds.cqf.cql.engine.elm.executing; -import org.hl7.elm.r1.CodeSystemDef; import org.hl7.elm.r1.CodeSystemRef; +import org.opencds.cqf.cql.engine.execution.Libraries; import org.opencds.cqf.cql.engine.execution.State; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; /* structured type Code @@ -19,14 +17,12 @@ */ public class CodeEvaluator { - private static Logger logger = LoggerFactory.getLogger(CodeEvaluator.class); - public static Object internalEvaluate(CodeSystemRef codeSystemRef, String c, String display, State state) { org.opencds.cqf.cql.engine.runtime.Code code = new org.opencds.cqf.cql.engine.runtime.Code().withCode(c).withDisplay(display); if (codeSystemRef != null) { boolean enteredLibrary = state.enterLibrary(codeSystemRef.getLibraryName()); try { - CodeSystemDef codeSystemDef = state.resolveCodeSystemRef(codeSystemRef.getName()); + var codeSystemDef = Libraries.resolveCodeSystemRef(codeSystemRef.getName(), state.getCurrentLibrary()); code.setSystem(codeSystemDef.getId()); code.setVersion(codeSystemDef.getVersion()); } finally { diff --git a/Src/java/engine/src/main/java/org/opencds/cqf/cql/engine/elm/executing/CodeRefEvaluator.java b/Src/java/engine/src/main/java/org/opencds/cqf/cql/engine/elm/executing/CodeRefEvaluator.java index 84a4090c1..a8a6f1774 100644 --- a/Src/java/engine/src/main/java/org/opencds/cqf/cql/engine/elm/executing/CodeRefEvaluator.java +++ b/Src/java/engine/src/main/java/org/opencds/cqf/cql/engine/elm/executing/CodeRefEvaluator.java @@ -2,18 +2,26 @@ import org.hl7.elm.r1.CodeDef; import org.hl7.elm.r1.CodeRef; +import org.opencds.cqf.cql.engine.execution.Libraries; import org.opencds.cqf.cql.engine.execution.State; import org.opencds.cqf.cql.engine.runtime.Code; import org.opencds.cqf.cql.engine.runtime.CodeSystem; public class CodeRefEvaluator { - public static Code toCode(CodeRef cr, CodeSystem cs, State state) { - boolean enteredLibrary = state.enterLibrary(cr.getLibraryName()); + public static Code toCode(CodeDef cd, CodeSystem cs) { + return new Code().withCode(cd.getId()).withSystem(cs.getId()).withDisplay(cd.getDisplay()).withVersion(cs.getVersion()); + } + + public static Code toCode(CodeRef cr, State state) { + var enteredLibrary = state.enterLibrary(cr.getLibraryName()); try { - CodeDef cd = state.resolveCodeRef(cr.getName()); - return new Code().withCode(cd.getId()).withSystem(cs.getId()).withDisplay(cd.getDisplay()).withVersion(cs.getVersion()); - } finally { + + CodeDef cd = Libraries.resolveCodeRef(cr.getName(), state.getCurrentLibrary()); + CodeSystem cs = CodeSystemRefEvaluator.toCodeSystem(cd.getCodeSystem(), state); + return toCode(cd, cs); + } + finally { state.exitLibrary(enteredLibrary); } } diff --git a/Src/java/engine/src/main/java/org/opencds/cqf/cql/engine/elm/executing/CodeSystemRefEvaluator.java b/Src/java/engine/src/main/java/org/opencds/cqf/cql/engine/elm/executing/CodeSystemRefEvaluator.java index df8d26cc4..16c844cbf 100644 --- a/Src/java/engine/src/main/java/org/opencds/cqf/cql/engine/elm/executing/CodeSystemRefEvaluator.java +++ b/Src/java/engine/src/main/java/org/opencds/cqf/cql/engine/elm/executing/CodeSystemRefEvaluator.java @@ -2,6 +2,7 @@ import org.hl7.elm.r1.CodeSystemDef; import org.hl7.elm.r1.CodeSystemRef; +import org.opencds.cqf.cql.engine.execution.Libraries; import org.opencds.cqf.cql.engine.execution.State; import org.opencds.cqf.cql.engine.runtime.CodeSystem; @@ -12,7 +13,7 @@ public class CodeSystemRefEvaluator { public static CodeSystem toCodeSystem(CodeSystemRef csr, State state) { boolean enteredLibrary = state.enterLibrary(csr.getLibraryName()); try { - CodeSystemDef csd = state.resolveCodeSystemRef(csr.getName()); + CodeSystemDef csd = Libraries.resolveCodeSystemRef(csr.getName(), state.getCurrentLibrary()); return new CodeSystem().withId(csd.getId()).withVersion(csd.getVersion()).withName(csd.getName()); } finally { state.exitLibrary(enteredLibrary); diff --git a/Src/java/engine/src/main/java/org/opencds/cqf/cql/engine/elm/executing/ConceptRefEvaluator.java b/Src/java/engine/src/main/java/org/opencds/cqf/cql/engine/elm/executing/ConceptRefEvaluator.java index 6fe18bf87..ad45691a7 100644 --- a/Src/java/engine/src/main/java/org/opencds/cqf/cql/engine/elm/executing/ConceptRefEvaluator.java +++ b/Src/java/engine/src/main/java/org/opencds/cqf/cql/engine/elm/executing/ConceptRefEvaluator.java @@ -4,6 +4,7 @@ import org.hl7.elm.r1.CodeRef; import org.hl7.elm.r1.ConceptDef; import org.hl7.elm.r1.ConceptRef; +import org.opencds.cqf.cql.engine.execution.Libraries; import org.opencds.cqf.cql.engine.execution.State; import org.opencds.cqf.cql.engine.runtime.Code; import org.opencds.cqf.cql.engine.runtime.CodeSystem; @@ -17,13 +18,13 @@ public class ConceptRefEvaluator { public static Concept toConcept(ConceptRef cr, State state) { boolean enteredLibrary = state.enterLibrary(cr.getLibraryName()); try { - ConceptDef cd = state.resolveConceptRef(cr.getName()); + ConceptDef cd = Libraries.resolveConceptRef(cr.getName(), state.getCurrentLibrary()); - List codeList = new ArrayList(); + var codeList = new ArrayList(); for (CodeRef r : cd.getCode()) { - CodeDef codeDef = state.resolveCodeRef(r.getName()); + CodeDef codeDef = Libraries.resolveCodeRef(r.getName(), state.getCurrentLibrary()); CodeSystem cs = CodeSystemRefEvaluator.toCodeSystem(codeDef.getCodeSystem(), state); - Code c = CodeRefEvaluator.toCode(r, cs, state); + Code c = CodeRefEvaluator.toCode(codeDef, cs); codeList.add(c); } diff --git a/Src/java/engine/src/main/java/org/opencds/cqf/cql/engine/elm/executing/ConvertEvaluator.java b/Src/java/engine/src/main/java/org/opencds/cqf/cql/engine/elm/executing/ConvertEvaluator.java index b63014b25..2e584aa6c 100644 --- a/Src/java/engine/src/main/java/org/opencds/cqf/cql/engine/elm/executing/ConvertEvaluator.java +++ b/Src/java/engine/src/main/java/org/opencds/cqf/cql/engine/elm/executing/ConvertEvaluator.java @@ -44,9 +44,9 @@ public class ConvertEvaluator { private static Class resolveType(QName toType, TypeSpecifier typeSpecifier,State state) { if (typeSpecifier != null) { - return state.resolveType(typeSpecifier); + return state.getEnvironment().resolveType(typeSpecifier); } - return state.resolveType(toType); + return state.getEnvironment().resolveType(toType); } private static Object convert(Object operand, Class type) { diff --git a/Src/java/engine/src/main/java/org/opencds/cqf/cql/engine/elm/executing/EqualEvaluator.java b/Src/java/engine/src/main/java/org/opencds/cqf/cql/engine/elm/executing/EqualEvaluator.java index 0000cb15e..876585199 100644 --- a/Src/java/engine/src/main/java/org/opencds/cqf/cql/engine/elm/executing/EqualEvaluator.java +++ b/Src/java/engine/src/main/java/org/opencds/cqf/cql/engine/elm/executing/EqualEvaluator.java @@ -68,7 +68,7 @@ else if (left instanceof CqlType && right instanceof CqlType) { } if (state != null) { - return state.objectEqual(left, right); + return state.getEnvironment().objectEqual(left, right); } throw new InvalidOperatorArgument(String.format("Equal(%s, %s) requires Context and state was null", left.getClass().getName(), right.getClass().getName())); diff --git a/Src/java/engine/src/main/java/org/opencds/cqf/cql/engine/elm/executing/EquivalentEvaluator.java b/Src/java/engine/src/main/java/org/opencds/cqf/cql/engine/elm/executing/EquivalentEvaluator.java index 6439b37a3..21d0b1518 100644 --- a/Src/java/engine/src/main/java/org/opencds/cqf/cql/engine/elm/executing/EquivalentEvaluator.java +++ b/Src/java/engine/src/main/java/org/opencds/cqf/cql/engine/elm/executing/EquivalentEvaluator.java @@ -94,7 +94,7 @@ else if (left instanceof String && right instanceof String) { } if (state != null) { - return state.objectEquivalent(left, right); + return state.getEnvironment().objectEquivalent(left, right); } throw new InvalidOperatorArgument(String.format("Equivalent(%s, %s) requires Context and context was null", left.getClass().getName(), right.getClass().getName())); diff --git a/Src/java/engine/src/main/java/org/opencds/cqf/cql/engine/elm/executing/ExpandValueSetEvaluator.java b/Src/java/engine/src/main/java/org/opencds/cqf/cql/engine/elm/executing/ExpandValueSetEvaluator.java index b6c1f9108..da5678ca5 100644 --- a/Src/java/engine/src/main/java/org/opencds/cqf/cql/engine/elm/executing/ExpandValueSetEvaluator.java +++ b/Src/java/engine/src/main/java/org/opencds/cqf/cql/engine/elm/executing/ExpandValueSetEvaluator.java @@ -20,7 +20,7 @@ public static Object expand(Object valueset, State state) { } if (valueset instanceof ValueSet) { - TerminologyProvider tp = state.resolveTerminologyProvider(); + TerminologyProvider tp = state.getEnvironment().getTerminologyProvider(); return tp.expand(ValueSetInfo.fromValueSet((ValueSet)valueset)); } diff --git a/Src/java/engine/src/main/java/org/opencds/cqf/cql/engine/elm/executing/ExpressionRefEvaluator.java b/Src/java/engine/src/main/java/org/opencds/cqf/cql/engine/elm/executing/ExpressionRefEvaluator.java index 2fe6d5948..bb0d42b35 100644 --- a/Src/java/engine/src/main/java/org/opencds/cqf/cql/engine/elm/executing/ExpressionRefEvaluator.java +++ b/Src/java/engine/src/main/java/org/opencds/cqf/cql/engine/elm/executing/ExpressionRefEvaluator.java @@ -2,13 +2,14 @@ import org.hl7.elm.r1.ExpressionRef; import org.opencds.cqf.cql.engine.execution.CqlEngine; +import org.opencds.cqf.cql.engine.execution.Libraries; import org.opencds.cqf.cql.engine.execution.State; public class ExpressionRefEvaluator{ public static Object internalEvaluate(ExpressionRef expressionRef, State state, CqlEngine visitor) { boolean enteredLibrary = state.enterLibrary(expressionRef.getLibraryName()); try { - var def = state.resolveExpressionRef(expressionRef.getName()); + var def = Libraries.resolveExpressionRef(expressionRef.getName(), state.getCurrentLibrary()); return visitor.visitExpressionDef(def, state); } finally { diff --git a/Src/java/engine/src/main/java/org/opencds/cqf/cql/engine/elm/executing/ForEachEvaluator.java b/Src/java/engine/src/main/java/org/opencds/cqf/cql/engine/elm/executing/ForEachEvaluator.java index 8810d6ac5..ad76a4893 100644 --- a/Src/java/engine/src/main/java/org/opencds/cqf/cql/engine/elm/executing/ForEachEvaluator.java +++ b/Src/java/engine/src/main/java/org/opencds/cqf/cql/engine/elm/executing/ForEachEvaluator.java @@ -14,7 +14,7 @@ public static Object forEach(Object source, Object element, State state) { List retVal = new ArrayList<>(); for (Object o : (Iterable) source) { - retVal.add(state.resolvePath(o, element.toString())); + retVal.add(state.getEnvironment().resolvePath(o, element.toString())); } return retVal; } diff --git a/Src/java/engine/src/main/java/org/opencds/cqf/cql/engine/elm/executing/FunctionRefEvaluator.java b/Src/java/engine/src/main/java/org/opencds/cqf/cql/engine/elm/executing/FunctionRefEvaluator.java index abb04aad7..af4d6bd3a 100644 --- a/Src/java/engine/src/main/java/org/opencds/cqf/cql/engine/elm/executing/FunctionRefEvaluator.java +++ b/Src/java/engine/src/main/java/org/opencds/cqf/cql/engine/elm/executing/FunctionRefEvaluator.java @@ -3,14 +3,23 @@ import org.hl7.elm.r1.Expression; import org.hl7.elm.r1.FunctionDef; import org.hl7.elm.r1.FunctionRef; +import org.hl7.elm.r1.TypeSpecifier; +import org.opencds.cqf.cql.engine.exception.CqlException; import org.opencds.cqf.cql.engine.execution.CqlEngine; +import org.opencds.cqf.cql.engine.execution.Libraries; import org.opencds.cqf.cql.engine.execution.State; import org.opencds.cqf.cql.engine.execution.Variable; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; import java.util.ArrayList; +import java.util.List; +import java.util.stream.Collectors; public class FunctionRefEvaluator { + private static final Logger logger =LoggerFactory.getLogger(FunctionRefEvaluator.class); + public static Object internalEvaluate(FunctionRef functionRef, State state, CqlEngine visitor) { ArrayList arguments = new ArrayList<>(functionRef.getOperand().size()); for (Expression operand : functionRef.getOperand()) { @@ -22,7 +31,7 @@ public static Object internalEvaluate(FunctionRef functionRef, State state, CqlE FunctionDef functionDef = resolveOrCacheFunctionDef(state, functionRef, arguments); if (Boolean.TRUE.equals(functionDef.isExternal())) { - return state.getExternalFunctionProvider().evaluate(functionDef.getName(), arguments); + return state.getEnvironment().getExternalFunctionProvider(state.getCurrentLibrary().getIdentifier()).evaluate(functionDef.getName(), arguments); } else { state.pushWindow(); try { @@ -53,13 +62,62 @@ protected static FunctionDef resolveOrCacheFunctionDef(State state, FunctionRef FunctionDef functionDef = resolveFunctionDef(state, functionRef, arguments); - if (eligibleForCaching && functionDef != null) { + if (eligibleForCaching) { state.getCache().getFunctionCache().put(functionRef, functionDef); } + return functionDef; } protected static FunctionDef resolveFunctionDef(State state, FunctionRef functionRef, ArrayList arguments) { - return state.resolveFunctionRef(functionRef.getLibraryName(), functionRef.getName(), arguments, functionRef.getSignature()); + return resolveFunctionRef(state, functionRef.getName(), arguments, functionRef.getSignature()); + } + + public static FunctionDef resolveFunctionRef(State state, final String name, final List arguments, + final List signature) { + FunctionDef ret; + + final List types = signature.isEmpty() ? arguments : signature; + + ret = getResolvedFunctionDef(state, name, types, !signature.isEmpty()); + + if (ret != null) { + return ret; + } + + throw new CqlException(String.format("Could not resolve call to operator '%s(%s)' in library '%s'.", + name, getUnresolvedMessage(state, types, name), state.getCurrentLibrary().getIdentifier().getId())); + } + + private static FunctionDef getResolvedFunctionDef(State state, final String name, + final List types, final boolean hasSignature) { + var namedDefs = Libraries.getFunctionDefs(name, state.getCurrentLibrary()); + + var candidateDefs = namedDefs + .stream() + .filter(x -> x.getOperand().size() == types.size()) + .collect(Collectors.toList()); + + if (candidateDefs.size() == 1) { + return candidateDefs.get(0); + } + + if (candidateDefs.size() > 1 && !hasSignature) { + logger.debug( + "Using runtime function resolution for '{}'. It's recommended to always include signatures in ELM", + name); + } + + return candidateDefs.stream().filter(x -> state.getEnvironment().matchesTypes(x, types)).findFirst().orElse(null); + } + + + private static String getUnresolvedMessage(State state, List arguments, String name) { + StringBuilder argStr = new StringBuilder(); + if (arguments != null) { + arguments.forEach(a -> argStr.append((argStr.length() > 0) ? ", " : "").append(state.getEnvironment().resolveType(a).getName())); + } + + return argStr.toString(); } } diff --git a/Src/java/engine/src/main/java/org/opencds/cqf/cql/engine/elm/executing/InCodeSystemEvaluator.java b/Src/java/engine/src/main/java/org/opencds/cqf/cql/engine/elm/executing/InCodeSystemEvaluator.java index 513a41c33..b14fad032 100644 --- a/Src/java/engine/src/main/java/org/opencds/cqf/cql/engine/elm/executing/InCodeSystemEvaluator.java +++ b/Src/java/engine/src/main/java/org/opencds/cqf/cql/engine/elm/executing/InCodeSystemEvaluator.java @@ -30,7 +30,7 @@ public static Object inCodeSystem( Object code, Object codeSystem, State state) if (codeSystem instanceof CodeSystem) { CodeSystemInfo csi = CodeSystemInfo.fromCodeSystem((CodeSystem)codeSystem); - TerminologyProvider provider = state.resolveTerminologyProvider(); + TerminologyProvider provider = state.getEnvironment().getTerminologyProvider(); if (code instanceof String) { return provider.lookup(new Code().withCode((String) code), csi) != null; diff --git a/Src/java/engine/src/main/java/org/opencds/cqf/cql/engine/elm/executing/InValueSetEvaluator.java b/Src/java/engine/src/main/java/org/opencds/cqf/cql/engine/elm/executing/InValueSetEvaluator.java index e788017ab..2fe3c2586 100644 --- a/Src/java/engine/src/main/java/org/opencds/cqf/cql/engine/elm/executing/InValueSetEvaluator.java +++ b/Src/java/engine/src/main/java/org/opencds/cqf/cql/engine/elm/executing/InValueSetEvaluator.java @@ -29,7 +29,7 @@ public static Object inValueSet(Object code, Object valueset, State state) { if (valueset instanceof ValueSet) { ValueSetInfo vsi = ValueSetInfo.fromValueSet((ValueSet)valueset); - TerminologyProvider provider = state.resolveTerminologyProvider(); + TerminologyProvider provider = state.getEnvironment().getTerminologyProvider(); // perform operation if (code instanceof String) { diff --git a/Src/java/engine/src/main/java/org/opencds/cqf/cql/engine/elm/executing/InstanceEvaluator.java b/Src/java/engine/src/main/java/org/opencds/cqf/cql/engine/elm/executing/InstanceEvaluator.java index f892f4a37..8f03bc602 100644 --- a/Src/java/engine/src/main/java/org/opencds/cqf/cql/engine/elm/executing/InstanceEvaluator.java +++ b/Src/java/engine/src/main/java/org/opencds/cqf/cql/engine/elm/executing/InstanceEvaluator.java @@ -3,18 +3,13 @@ import org.hl7.elm.r1.Instance; import org.opencds.cqf.cql.engine.execution.CqlEngine; import org.opencds.cqf.cql.engine.execution.State; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - public class InstanceEvaluator { - private static Logger logger = LoggerFactory.getLogger(InstanceEvaluator.class); - public static Object internalEvaluate(Instance instance, State state, CqlEngine visitor) { - Object object = state.createInstance(instance.getClassType()); + Object object = state.getEnvironment().createInstance(instance.getClassType()); for (org.hl7.elm.r1.InstanceElement element : instance.getElement()) { Object value = visitor.visitExpression(element.getValue(), state); - state.setValue(object, element.getName(), value); + state.getEnvironment().setValue(object, element.getName(), value); } return object; diff --git a/Src/java/engine/src/main/java/org/opencds/cqf/cql/engine/elm/executing/IsEvaluator.java b/Src/java/engine/src/main/java/org/opencds/cqf/cql/engine/elm/executing/IsEvaluator.java index 52efac2b9..d371cfc71 100644 --- a/Src/java/engine/src/main/java/org/opencds/cqf/cql/engine/elm/executing/IsEvaluator.java +++ b/Src/java/engine/src/main/java/org/opencds/cqf/cql/engine/elm/executing/IsEvaluator.java @@ -14,15 +14,15 @@ public class IsEvaluator { private static Class resolveType(Is is, State state) { if (is.getIsTypeSpecifier() != null) { - return state.resolveType(is.getIsTypeSpecifier()); + return state.getEnvironment().resolveType(is.getIsTypeSpecifier()); } - return state.resolveType(is.getIsType()); + return state.getEnvironment().resolveType(is.getIsType()); } public static Object internalEvaluate(Is is, Object operand, State state) { Class type = resolveType(is, state); - return state.is(operand, type); + return state.getEnvironment().is(operand, type); } } diff --git a/Src/java/engine/src/main/java/org/opencds/cqf/cql/engine/elm/executing/LiteralEvaluator.java b/Src/java/engine/src/main/java/org/opencds/cqf/cql/engine/elm/executing/LiteralEvaluator.java index 24afbe3b2..8904e2404 100644 --- a/Src/java/engine/src/main/java/org/opencds/cqf/cql/engine/elm/executing/LiteralEvaluator.java +++ b/Src/java/engine/src/main/java/org/opencds/cqf/cql/engine/elm/executing/LiteralEvaluator.java @@ -3,16 +3,13 @@ import org.opencds.cqf.cql.engine.exception.CqlException; import org.opencds.cqf.cql.engine.exception.InvalidLiteral; import org.opencds.cqf.cql.engine.execution.State; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; import javax.xml.namespace.QName; import java.math.BigDecimal; public class LiteralEvaluator { - private static Logger logger = LoggerFactory.getLogger(LiteralEvaluator.class); public static Object internalEvaluate(QName valueT, String value, State state) { - QName valueType = state.fixupQName(valueT); + QName valueType = state.getEnvironment().fixupQName(valueT); switch (valueType.getLocalPart()) { case "Boolean": return Boolean.parseBoolean(value); case "Integer": diff --git a/Src/java/engine/src/main/java/org/opencds/cqf/cql/engine/elm/executing/MaxValueEvaluator.java b/Src/java/engine/src/main/java/org/opencds/cqf/cql/engine/elm/executing/MaxValueEvaluator.java index 1b7e74327..06e509cc6 100644 --- a/Src/java/engine/src/main/java/org/opencds/cqf/cql/engine/elm/executing/MaxValueEvaluator.java +++ b/Src/java/engine/src/main/java/org/opencds/cqf/cql/engine/elm/executing/MaxValueEvaluator.java @@ -54,7 +54,7 @@ public static Object maxValue(String type) { } public static Object internalEvaluate(QName typeName, State state) { - QName valueType = state.fixupQName(typeName); + QName valueType = state.getEnvironment().fixupQName(typeName); String type = valueType.getLocalPart(); return maxValue(type); } diff --git a/Src/java/engine/src/main/java/org/opencds/cqf/cql/engine/elm/executing/MessageEvaluator.java b/Src/java/engine/src/main/java/org/opencds/cqf/cql/engine/elm/executing/MessageEvaluator.java index 84e19fa83..5731351a1 100644 --- a/Src/java/engine/src/main/java/org/opencds/cqf/cql/engine/elm/executing/MessageEvaluator.java +++ b/Src/java/engine/src/main/java/org/opencds/cqf/cql/engine/elm/executing/MessageEvaluator.java @@ -58,7 +58,7 @@ private static String stripPHI(State state, Object source) { return null; } - Optional dataProvider = Optional.ofNullable(state.resolveDataProvider(source.getClass().getPackage().getName(), false)); + Optional dataProvider = Optional.ofNullable(state.getEnvironment().resolveDataProvider(source.getClass().getPackage().getName(), false)); return dataProvider.map(DataProvider::phiObfuscationSupplier).map(Supplier::get) .map(obfuscator -> obfuscator.obfuscate(source)) diff --git a/Src/java/engine/src/main/java/org/opencds/cqf/cql/engine/elm/executing/MinValueEvaluator.java b/Src/java/engine/src/main/java/org/opencds/cqf/cql/engine/elm/executing/MinValueEvaluator.java index 5c28a2185..474f5b55e 100644 --- a/Src/java/engine/src/main/java/org/opencds/cqf/cql/engine/elm/executing/MinValueEvaluator.java +++ b/Src/java/engine/src/main/java/org/opencds/cqf/cql/engine/elm/executing/MinValueEvaluator.java @@ -55,7 +55,7 @@ public static Object minValue(String type) { public static Object internalEvaluate(QName vtype, State state) { - QName valueType = state.fixupQName(vtype); + QName valueType = state.getEnvironment().fixupQName(vtype); String type = valueType.getLocalPart(); return minValue(type); } diff --git a/Src/java/engine/src/main/java/org/opencds/cqf/cql/engine/elm/executing/ParameterRefEvaluator.java b/Src/java/engine/src/main/java/org/opencds/cqf/cql/engine/elm/executing/ParameterRefEvaluator.java index 3493df1ec..2a80fe585 100644 --- a/Src/java/engine/src/main/java/org/opencds/cqf/cql/engine/elm/executing/ParameterRefEvaluator.java +++ b/Src/java/engine/src/main/java/org/opencds/cqf/cql/engine/elm/executing/ParameterRefEvaluator.java @@ -1,11 +1,30 @@ package org.opencds.cqf.cql.engine.elm.executing; +import org.hl7.elm.r1.ParameterDef; import org.hl7.elm.r1.ParameterRef; import org.opencds.cqf.cql.engine.execution.CqlEngine; +import org.opencds.cqf.cql.engine.execution.Libraries; import org.opencds.cqf.cql.engine.execution.State; public class ParameterRefEvaluator { public static Object internalEvaluate(ParameterRef parameterRef, State state, CqlEngine visitor) { - return state.resolveParameterRef(parameterRef.getLibraryName(), parameterRef.getName(), visitor); + boolean enteredLibrary = state.enterLibrary(parameterRef.getLibraryName()); + try { + var name = parameterRef.getName(); + String fullName = parameterRef.getLibraryName() != null ? String.format("%s.%s", state.getCurrentLibrary().getIdentifier().getId(), name) : name; + + if (state.getParameters().containsKey(fullName)) { + return state.getParameters().get(fullName); + } + + ParameterDef parameterDef = Libraries.resolveParameterRef(name, state.getCurrentLibrary()); + Object result = parameterDef.getDefault() != null ? visitor.visitExpression(parameterDef.getDefault(), state) : null; + + state.getParameters().put(fullName, result); + return result; + } + finally { + state.exitLibrary(enteredLibrary); + } } } diff --git a/Src/java/engine/src/main/java/org/opencds/cqf/cql/engine/elm/executing/PropertyEvaluator.java b/Src/java/engine/src/main/java/org/opencds/cqf/cql/engine/elm/executing/PropertyEvaluator.java index ac69f744c..c662bbef9 100644 --- a/Src/java/engine/src/main/java/org/opencds/cqf/cql/engine/elm/executing/PropertyEvaluator.java +++ b/Src/java/engine/src/main/java/org/opencds/cqf/cql/engine/elm/executing/PropertyEvaluator.java @@ -30,6 +30,6 @@ else if (elm.getScope() != null) { } - return state.resolvePath(target, elm.getPath()); + return state.getEnvironment().resolvePath(target, elm.getPath()); } } diff --git a/Src/java/engine/src/main/java/org/opencds/cqf/cql/engine/elm/executing/RetrieveEvaluator.java b/Src/java/engine/src/main/java/org/opencds/cqf/cql/engine/elm/executing/RetrieveEvaluator.java index f3e02f174..ebe569d10 100644 --- a/Src/java/engine/src/main/java/org/opencds/cqf/cql/engine/elm/executing/RetrieveEvaluator.java +++ b/Src/java/engine/src/main/java/org/opencds/cqf/cql/engine/elm/executing/RetrieveEvaluator.java @@ -18,8 +18,8 @@ public class RetrieveEvaluator { @SuppressWarnings("unchecked") public static Object internalEvaluate(Retrieve elm, State state, CqlEngine visitor) { - QName dataType = state.fixupQName(elm.getDataType()); - DataProvider dataProvider = state.resolveDataProvider(dataType); + QName dataType = state.getEnvironment().fixupQName(elm.getDataType()); + DataProvider dataProvider = state.getEnvironment().resolveDataProvider(dataType); Iterable codes = null; String valueSet = null; if (elm.getCodes() != null) { diff --git a/Src/java/engine/src/main/java/org/opencds/cqf/cql/engine/elm/executing/ToDateTimeEvaluator.java b/Src/java/engine/src/main/java/org/opencds/cqf/cql/engine/elm/executing/ToDateTimeEvaluator.java index e3d0fc62a..2b6d594cb 100644 --- a/Src/java/engine/src/main/java/org/opencds/cqf/cql/engine/elm/executing/ToDateTimeEvaluator.java +++ b/Src/java/engine/src/main/java/org/opencds/cqf/cql/engine/elm/executing/ToDateTimeEvaluator.java @@ -59,7 +59,7 @@ public static Object ToDateTime(Object operand, State state) { } if (operand instanceof Date) { - return new DateTime(TemporalHelper.zoneToOffset(state.getEvaluationOffsetDateTime().getOffset()), + return new DateTime(TemporalHelper.zoneToOffset(state.getEvaluationZonedDateTime().getOffset()), ((Date) operand).getDate().getYear(), ((Date) operand).getDate().getMonthValue(), ((Date) operand).getDate().getDayOfMonth(), diff --git a/Src/java/engine/src/main/java/org/opencds/cqf/cql/engine/elm/executing/ValueSetRefEvaluator.java b/Src/java/engine/src/main/java/org/opencds/cqf/cql/engine/elm/executing/ValueSetRefEvaluator.java index ad70813f0..a34b6ff83 100644 --- a/Src/java/engine/src/main/java/org/opencds/cqf/cql/engine/elm/executing/ValueSetRefEvaluator.java +++ b/Src/java/engine/src/main/java/org/opencds/cqf/cql/engine/elm/executing/ValueSetRefEvaluator.java @@ -3,6 +3,7 @@ import org.hl7.elm.r1.CodeSystemRef; import org.hl7.elm.r1.ValueSetDef; import org.hl7.elm.r1.ValueSetRef; +import org.opencds.cqf.cql.engine.execution.Libraries; import org.opencds.cqf.cql.engine.execution.State; import org.opencds.cqf.cql.engine.runtime.CodeSystem; import org.opencds.cqf.cql.engine.runtime.ValueSet; @@ -14,7 +15,7 @@ public class ValueSetRefEvaluator { public static ValueSet toValueSet(State state, ValueSetRef vsr) { boolean enteredLibrary = state.enterLibrary(vsr.getLibraryName()); try { - ValueSetDef vsd = state.resolveValueSetRef(vsr.getName()); + ValueSetDef vsd = Libraries.resolveValueSetRef(vsr.getName(), state.getCurrentLibrary()); ValueSet vs = new ValueSet().withId(vsd.getId()).withVersion(vsd.getVersion()); for (CodeSystemRef csr : vsd.getCodeSystem()) { CodeSystem cs = CodeSystemRefEvaluator.toCodeSystem(csr, state); @@ -34,7 +35,7 @@ public static Object internalEvaluate(State state, ValueSetRef vsr) { return vs; } else { - TerminologyProvider tp = state.resolveTerminologyProvider(); + TerminologyProvider tp = state.getEnvironment().getTerminologyProvider(); return tp.expand(ValueSetInfo.fromValueSet(vs)); } } diff --git a/Src/java/engine/src/main/java/org/opencds/cqf/cql/engine/execution/Cache.java b/Src/java/engine/src/main/java/org/opencds/cqf/cql/engine/execution/Cache.java index 85c5fbc04..fea66c804 100644 --- a/Src/java/engine/src/main/java/org/opencds/cqf/cql/engine/execution/Cache.java +++ b/Src/java/engine/src/main/java/org/opencds/cqf/cql/engine/execution/Cache.java @@ -3,30 +3,32 @@ import org.hl7.elm.r1.FunctionDef; import org.hl7.elm.r1.FunctionRef; import org.hl7.elm.r1.VersionedIdentifier; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; import java.util.HashMap; import java.util.LinkedHashMap; import java.util.Map; +/** + * There are at least two types of data that need to be cached, some that is context dependent, like expression results + * (and thus can be invalidated during the course of evaluation) and some that is not, like Function resolutions (and thus + * can be cache for the entire duration of the evaluation). + */ public class Cache { - private static Logger logger = LoggerFactory.getLogger(Cache.class); - - private Map functionCache = new HashMap<>(); private boolean enableExpressionCache = false; + private Map functionCache = new HashMap<>(); + @SuppressWarnings("serial") - private LinkedHashMap> expressions = new LinkedHashMap>(10, 0.9f, true) { + private Map> expressions = new LinkedHashMap>(10, 0.9f, true) { @Override - protected boolean removeEldestEntry(Map.Entry> eldestEntry) { + protected boolean removeEldestEntry(Map.Entry> eldestEntry) { return size() > 10; } }; @SuppressWarnings("serial") - protected LinkedHashMap constructLibraryExpressionHashMap() { + protected Map constructLibraryExpressionHashMap() { return new LinkedHashMap(15, 0.9f, true) { @Override protected boolean removeEldestEntry(Map.Entry eldestEntry) { @@ -35,33 +37,21 @@ protected boolean removeEldestEntry(Map.Entry eldestEn }; } - public Map getFunctionCache() { - return functionCache; - } - - public void setFunctionCache(Map functionCache) { - this.functionCache = functionCache; - } - - public LinkedHashMap> getExpressions() { + public Map> getExpressions() { return expressions; } - public void setExpressions(LinkedHashMap> expressions) { - this.expressions = expressions; - } - public void setExpressionCaching(boolean yayOrNay) { this.enableExpressionCache = yayOrNay; } - protected Map getCacheForLibrary(VersionedIdentifier libraryId) { + protected Map getExpressionCache(VersionedIdentifier libraryId) { return getExpressions() .computeIfAbsent(libraryId, k-> constructLibraryExpressionHashMap()); } public boolean isExpressionCached(VersionedIdentifier libraryId, String name) { - return getCacheForLibrary(libraryId).containsKey(name); + return getExpressionCache(libraryId).containsKey(name); } public boolean isExpressionCachingEnabled() { @@ -69,10 +59,22 @@ public boolean isExpressionCachingEnabled() { } public void cacheExpression(VersionedIdentifier libraryId, String name, ExpressionResult er) { - getCacheForLibrary(libraryId).put(name, er); + getExpressionCache(libraryId).put(name, er); } public ExpressionResult getCachedExpression(VersionedIdentifier libraryId, String name) { - return getCacheForLibrary(libraryId).get(name); + return getExpressionCache(libraryId).get(name); + } + + public Map getFunctionCache() { + return functionCache; + } + + public void cacheFunctionDef(FunctionRef functionRef, FunctionDef functionDef) { + this.functionCache.put(functionRef, functionDef); + } + + public FunctionDef getCachedFunctionDef(FunctionRef functionRef) { + return this.getCachedFunctionDef(functionRef); } } diff --git a/Src/java/engine/src/main/java/org/opencds/cqf/cql/engine/execution/CqlEngine.java b/Src/java/engine/src/main/java/org/opencds/cqf/cql/engine/execution/CqlEngine.java index 7abedd05a..0895ccb92 100644 --- a/Src/java/engine/src/main/java/org/opencds/cqf/cql/engine/execution/CqlEngine.java +++ b/Src/java/engine/src/main/java/org/opencds/cqf/cql/engine/execution/CqlEngine.java @@ -1,27 +1,19 @@ package org.opencds.cqf.cql.engine.execution; import org.apache.commons.lang3.tuple.Pair; -import org.cqframework.cql.cql2elm.CqlCompilerException; -import org.cqframework.cql.cql2elm.CqlTranslatorOptions; import org.cqframework.cql.elm.visiting.ElmBaseLibraryVisitor; +import org.hl7.cql.model.NamespaceManager; import org.hl7.elm.r1.*; import org.hl7.elm.r1.Date; -import org.opencds.cqf.cql.engine.data.DataProvider; -import org.opencds.cqf.cql.engine.data.SystemDataProvider; import org.opencds.cqf.cql.engine.debug.DebugMap; import org.opencds.cqf.cql.engine.elm.executing.*; import org.opencds.cqf.cql.engine.exception.CqlException; -import org.opencds.cqf.cql.engine.runtime.CodeSystem; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; import java.math.BigDecimal; import java.time.ZonedDateTime; import java.util.*; import java.util.List; -import static org.opencds.cqf.cql.engine.execution.NamespaceHelper.getNamePart; -import static org.opencds.cqf.cql.engine.execution.NamespaceHelper.getUriPart; /** * NOTE: We have updated CqlEngine to adopt a visitor pattern approach to traversing the ELM tree for execution: @@ -31,66 +23,37 @@ */ public class CqlEngine extends ElmBaseLibraryVisitor { - - private static Logger logger = LoggerFactory.getLogger(CqlEngine.class); - public enum Options { EnableExpressionCaching, EnableValidation } private Environment environment; private State state; - private Cache cache; private Set engineOptions; - private CqlTranslatorOptions translatorOptions; public CqlEngine(Environment environment) { - this(environment, null, null, null, null); - } - - public CqlEngine(Environment environment, Set engineOptions, CqlTranslatorOptions translatorOptions) { - this(environment, null, null, engineOptions, translatorOptions); + this(environment, null); } - public CqlEngine(Environment environment, State state, Cache cache, Set engineOptions, CqlTranslatorOptions translatorOptions) { - + public CqlEngine(Environment environment, Set engineOptions) { if (environment.getLibraryManager() == null) { - throw new IllegalArgumentException("libraryLoader can not be null."); - } - - if (engineOptions == null) { - engineOptions = EnumSet.of(CqlEngine.Options.EnableExpressionCaching); - } - - if (translatorOptions == null) { - this.translatorOptions = CqlTranslatorOptions.defaultOptions(); - } else { - this.translatorOptions = translatorOptions; + throw new IllegalArgumentException("Environment LibraryManager can not be null."); } this.environment = environment; - if (state != null) { - this.state = state; - } else { - this.state = new State(); - } - - this.state.setEnvironment(this.environment); + this.state = new State(environment); - if (cache != null) { - this.cache = cache; - } else { - this.cache = new Cache(); + if (engineOptions == null) { + this.engineOptions = EnumSet.of(CqlEngine.Options.EnableExpressionCaching); } - - this.state.setCache(this.cache); - - this.state.setVisitor(this); - - if (engineOptions != null) { + else { this.engineOptions = engineOptions; } + + if (this.engineOptions.contains(CqlEngine.Options.EnableExpressionCaching)) { + this.getCache().setExpressionCaching(true); + } } public Environment getEnvironment() { @@ -102,7 +65,7 @@ public State getState() { } public Cache getCache() { - return cache; + return this.state.getCache(); } // TODO: Add debugging info as a parameter. @@ -146,10 +109,6 @@ public EvaluationResult evaluate(VersionedIdentifier libraryIdentifier, ZonedDat return this.evaluate(libraryIdentifier, null, null, null, null, evaluationDateTime); } - public EvaluationResult evaluate(VersionedIdentifier libraryIdentifier, Map libraryCache, Set expressions) { - return this.evaluate(libraryIdentifier, libraryCache, expressions, null, null, null, null); - } - public EvaluationResult evaluate(VersionedIdentifier libraryIdentifier, Set expressions) { return this.evaluate(libraryIdentifier, expressions, null, null, null); } @@ -179,14 +138,11 @@ public EvaluationResult evaluate(VersionedIdentifier libraryIdentifier, Set expressions, Pair contextParameter, Map parameters, DebugMap debugMap, ZonedDateTime evaluationDateTime) { - // TODO: Figure out way to validate / invalidate library cache - Map libraryCache = new HashMap<>(); - if (libraryIdentifier == null) { throw new IllegalArgumentException("libraryIdentifier can not be null."); } - Library library = this.loadAndValidate(libraryCache, libraryIdentifier); + Library library = this.loadAndValidate(libraryIdentifier); if (expressions == null) { expressions = this.getExpressionSet(library); @@ -199,36 +155,6 @@ public EvaluationResult evaluate(VersionedIdentifier libraryIdentifier, Set libraryCache, Set expressions, Pair contextParameter, Map parameters, DebugMap debugMap, ZonedDateTime evaluationDateTime) { - // TODO: Figure out way to validate / invalidate library cache - - if (libraryIdentifier == null) { - throw new IllegalArgumentException("libraryIdentifier can not be null."); - } - - Library library = this.loadAndValidate(libraryCache, libraryIdentifier); - - if (expressions == null) { - expressions = this.getExpressionSet(library); - } - - // TODO: Some testing to see if it's more performant to reset a context rather than create a new one. - this.initializeState(library, debugMap, evaluationDateTime); - this.setParametersForContext(library, contextParameter, parameters); - - return this.evaluateExpressions(expressions); - } - - public void init(VersionedIdentifier libraryIdentifier, Map libraryCache, Pair contextParameter, Map parameters, DebugMap debugMap, ZonedDateTime evaluationDateTime) { - if (libraryIdentifier == null) { - throw new IllegalArgumentException("libraryIdentifier can not be null."); - } - Library library = this.loadAndValidate(libraryCache, libraryIdentifier); - - this.initializeState(library, debugMap, evaluationDateTime); - this.setParametersForContext(library, contextParameter, parameters); - } - private void initializeState(Library library, DebugMap debugMap, ZonedDateTime evaluationDateTime) { if (evaluationDateTime != null) { this.state.setEvaluationDateTime(evaluationDateTime); @@ -236,22 +162,7 @@ private void initializeState(Library library, DebugMap debugMap, ZonedDateTime e this.state.setEvaluationDateTime(ZonedDateTime.now()); } - this.state.init(library, new SystemDataProvider(), this.environment.getUcumService()); - - this.state.setLibraryManager(this.environment.getLibraryManager()); - this.state.setTranslatorOptions(this.translatorOptions); - - if (this.engineOptions.contains(Options.EnableExpressionCaching)) { - this.state.getCache().setExpressionCaching(true); - } - - - if (this.environment.getDataProviders() != null) { - for (Map.Entry pair : this.environment.getDataProviders().entrySet()) { - this.state.registerDataProvider(pair.getKey(), pair.getValue()); - } - } - + this.state.init(library); this.state.setDebugMap(debugMap); } @@ -259,7 +170,7 @@ private EvaluationResult evaluateExpressions(Set expressions) { EvaluationResult result = new EvaluationResult(); for (String expression : expressions) { - ExpressionDef def = state.resolveExpressionRef(expression); + ExpressionDef def = Libraries.resolveExpressionRef(expression, state.getCurrentLibrary()); if (def == null) { throw new CqlException(String.format("Unable to resolve expression \"%s.\"", expression)); @@ -274,7 +185,6 @@ private EvaluationResult evaluateExpressions(Set expressions) { } result.setDebugResult(this.state.getDebugResult()); - this.state.clearExpressions(); return result; } @@ -287,17 +197,9 @@ private void setParametersForContext(Library library, Pair conte state.setParameters(library, parameters); } - private Library loadAndValidate(Map libraryCache, VersionedIdentifier libraryIdentifier) { - Library library; - if (libraryCache.containsKey(libraryIdentifier)) { - return libraryCache.get(libraryIdentifier); - } + private Library loadAndValidate(VersionedIdentifier libraryIdentifier) { - library = this.environment.getLibraryManager().getCachedLibrary(libraryIdentifier); - if(library == null) { - ArrayList errors = new ArrayList(); - library = this.environment.getLibraryManager().resolveLibrary(libraryIdentifier, translatorOptions, errors).getLibrary(); - } + var library = this.environment.getLibraryManager().resolveLibrary(libraryIdentifier).getLibrary(); if (library == null) { throw new IllegalArgumentException(String.format("Unable to load library %s", libraryIdentifier.getId() + (libraryIdentifier.getVersion() != null ? "-" + libraryIdentifier.getVersion() : ""))); @@ -311,11 +213,10 @@ private Library loadAndValidate(Map libraryCache, if (library.getIncludes() != null && library.getIncludes().getDef() != null) { for (IncludeDef include : library.getIncludes().getDef()) { - this.loadAndValidate(libraryCache, new VersionedIdentifier().withSystem(getUriPart(include.getPath())).withId(getNamePart(include.getPath())).withVersion(include.getVersion())); + this.loadAndValidate(new VersionedIdentifier().withSystem(NamespaceManager.getUriPart(include.getPath())).withId(NamespaceManager.getNamePart(include.getPath())).withVersion(include.getVersion())); } } - libraryCache.put(libraryIdentifier, library); return library; } @@ -949,17 +850,7 @@ public Object visitCode(Code elm, State state) { @Override public Object visitCodeRef(CodeRef elm, State state) { - boolean enteredLibrary = false; - if (elm.getLibraryName() != null ) { - state.enterLibrary(elm.getLibraryName()); - enteredLibrary = true; - } - CodeDef cd = state.resolveCodeRef(elm.getName()); - CodeSystem cs = CodeSystemRefEvaluator.toCodeSystem(cd.getCodeSystem(), state); - if (enteredLibrary) { - state.exitLibrary(true); - } - return CodeRefEvaluator.toCode(elm, cs, state); + return CodeRefEvaluator.toCode(elm, state); } @Override @@ -1023,7 +914,7 @@ public Object visitConvert(Convert elm, State state) { public Object visitConvertQuantity(ConvertQuantity elm, State state) { Object argument = visitExpression(elm.getOperand().get(0), state); Object unit = visitExpression(elm.getOperand().get(1), state); - return ConvertQuantityEvaluator.convertQuantity(argument, unit, state.getUcumService()); + return ConvertQuantityEvaluator.convertQuantity(argument, unit, environment.getLibraryManager().getUcumService()); } @Override diff --git a/Src/java/engine/src/main/java/org/opencds/cqf/cql/engine/execution/DefaultLibraryLoader.java b/Src/java/engine/src/main/java/org/opencds/cqf/cql/engine/execution/DefaultLibraryLoader.java deleted file mode 100644 index 88f7ec8de..000000000 --- a/Src/java/engine/src/main/java/org/opencds/cqf/cql/engine/execution/DefaultLibraryLoader.java +++ /dev/null @@ -1,12 +0,0 @@ -package org.opencds.cqf.cql.engine.execution; - -import org.hl7.elm.r1.Library; -import org.hl7.elm.r1.VersionedIdentifier; -import org.opencds.cqf.cql.engine.exception.CqlException; - -public class DefaultLibraryLoader implements LibraryLoader { - @Override - public Library load(VersionedIdentifier libraryIdentifier) { - throw new CqlException("Library loader is not implemented."); - } -} diff --git a/Src/java/engine/src/main/java/org/opencds/cqf/cql/engine/execution/Environment.java b/Src/java/engine/src/main/java/org/opencds/cqf/cql/engine/execution/Environment.java index a8c701d8c..8edafe288 100644 --- a/Src/java/engine/src/main/java/org/opencds/cqf/cql/engine/execution/Environment.java +++ b/Src/java/engine/src/main/java/org/opencds/cqf/cql/engine/execution/Environment.java @@ -1,66 +1,339 @@ package org.opencds.cqf.cql.engine.execution; import org.cqframework.cql.cql2elm.LibraryManager; -import org.fhir.ucum.UcumService; +import org.hl7.elm.r1.ChoiceTypeSpecifier; +import org.hl7.elm.r1.FunctionDef; +import org.hl7.elm.r1.IntervalTypeSpecifier; +import org.hl7.elm.r1.Library; +import org.hl7.elm.r1.ListTypeSpecifier; +import org.hl7.elm.r1.NamedTypeSpecifier; +import org.hl7.elm.r1.OperandDef; +import org.hl7.elm.r1.TypeSpecifier; +import org.hl7.elm.r1.VersionedIdentifier; import org.opencds.cqf.cql.engine.data.DataProvider; +import org.opencds.cqf.cql.engine.data.ExternalFunctionProvider; +import org.opencds.cqf.cql.engine.data.SystemDataProvider; +import org.opencds.cqf.cql.engine.exception.CqlException; +import org.opencds.cqf.cql.engine.runtime.Tuple; import org.opencds.cqf.cql.engine.terminology.TerminologyProvider; import org.slf4j.Logger; import org.slf4j.LoggerFactory; +import java.util.HashMap; +import java.util.List; import java.util.Map; +import javax.xml.namespace.QName; + +/** + * The Environment class represents the current CQL execution environment. + * Meaning, things that are set up outside + * of the CQL engine + */ public class Environment { - private static Logger logger = LoggerFactory.getLogger(Environment.class); - private LibraryManager libraryManager; + private final LibraryManager libraryManager; + + private final Map dataProviders = new HashMap<>(); + private final TerminologyProvider terminologyProvider; - private Map dataProviders; - private TerminologyProvider terminologyProvider; - private UcumService ucumService; + private Map packageMap = new HashMap<>(); - //External function provider + // External function provider public Environment(LibraryManager libraryManager) { - this.libraryManager = libraryManager; + this(libraryManager, null, null); } - public Environment(LibraryManager libraryManager, Map dataProviders, TerminologyProvider terminologyProvider) { + + public Environment(LibraryManager libraryManager, Map dataProviders, + TerminologyProvider terminologyProvider) { this.libraryManager = libraryManager; - this.dataProviders = dataProviders; this.terminologyProvider = terminologyProvider; - } - public static Environment newInstance(LibraryManager libraryManager, Map dataProviders, TerminologyProvider terminologyProvider) { - return new Environment(libraryManager, dataProviders, terminologyProvider); + if (dataProviders != null) { + for (var dp : dataProviders.entrySet()) { + this.registerDataProvider(dp.getKey(), dp.getValue()); + } + } + + if (!this.dataProviders.containsKey("urn:hl7-org:elm-types:r1")) { + this.registerDataProvider("urn:hl7-org:elm-types:r1", new SystemDataProvider()); + } } + public LibraryManager getLibraryManager() { return libraryManager; } - public void setLibraryManager(LibraryManager libraryManager) { - this.libraryManager = libraryManager; - } - public Map getDataProviders() { return dataProviders; } - public void setDataProviders(Map dataProviders) { - this.dataProviders = dataProviders; - } - public TerminologyProvider getTerminologyProvider() { return terminologyProvider; } - public void setTerminologyProvider(TerminologyProvider terminologyProvider) { - this.terminologyProvider = terminologyProvider; + // -- ExternalFunctionProviders -- TODO the registration of these... Should be + // part of the LibraryManager? + // + + private Map externalFunctionProviders = new HashMap<>(); + + public void registerExternalFunctionProvider(VersionedIdentifier identifier, ExternalFunctionProvider provider) { + externalFunctionProviders.put(identifier, provider); } - public UcumService getUcumService() { - return ucumService; + public ExternalFunctionProvider getExternalFunctionProvider(VersionedIdentifier identifier) { + ExternalFunctionProvider provider = externalFunctionProviders.get(identifier); + if (provider == null) { + throw new CqlException(String.format( + "Could not resolve external function provider for library '%s'.", identifier)); + } + return provider; } - public void setUcumService(UcumService ucumService) { - this.ucumService = ucumService; + // -- DataProvider "Helpers" + + public Object resolvePath(Object target, String path) { + + if (target == null) { + return null; + } + + // TODO: Path may include .'s and []'s. + // For now, assume no qualifiers or indexers... + Class clazz = target.getClass(); + + if (clazz.getPackage().getName().startsWith("java.lang")) { + throw new CqlException( + String.format("Invalid path: %s for type: %s - this is likely an issue with the data model.", path, + clazz.getName())); + } + + DataProvider dataProvider = resolveDataProvider(clazz.getPackage().getName()); + return dataProvider.resolvePath(target, path); } + public Object as(Object operand, Class type, boolean isStrict) { + if (operand == null) { + return null; + } + + if (type.isAssignableFrom(operand.getClass())) { + return operand; + } + + DataProvider provider = resolveDataProvider(type.getPackage().getName(), false); + if (provider != null) { + return provider.as(operand, type, isStrict); + } + + return null; + } + + public Boolean objectEqual(Object left, Object right) { + if (left == null) { + return null; + } + + Class clazz = left.getClass(); + + DataProvider dataProvider = resolveDataProvider(clazz.getPackage().getName()); + return dataProvider.objectEqual(left, right); + } + + public Boolean objectEquivalent(Object left, Object right) { + if ((left == null) && (right == null)) { + return true; + } + + if (left == null) { + return false; + } + + Class clazz = left.getClass(); + + DataProvider dataProvider = resolveDataProvider(clazz.getPackage().getName()); + return dataProvider.objectEquivalent(left, right); + } + + public Object createInstance(QName typeName) { + typeName = fixupQName(typeName); + DataProvider dataProvider = resolveDataProvider(typeName); + return dataProvider.createInstance(typeName.getLocalPart()); + } + + public void setValue(Object target, String path, Object value) { + if (target == null) { + return; + } + + Class clazz = target.getClass(); + + DataProvider dataProvider = resolveDataProvider(clazz.getPackage().getName()); + dataProvider.setValue(target, path, value); + } + + public Boolean is(Object operand, Class type) { + if (operand == null) { + return null; + } + + if (type.isAssignableFrom(operand.getClass())) { + return true; + } + + DataProvider provider = resolveDataProvider(type.getPackage().getName(), false); + if (provider != null) { + return provider.is(operand, type); + } + + return false; + } + + // -- DataProvider resolution + + public void registerDataProvider(String modelUri, DataProvider dataProvider) { + dataProviders.put(modelUri, dataProvider); + dataProvider.getPackageNames().forEach(pn -> packageMap.put(pn, dataProvider)); + } + + public DataProvider resolveDataProvider(QName dataType) { + dataType = fixupQName(dataType); + DataProvider dataProvider = dataProviders.get(dataType.getNamespaceURI()); + if (dataProvider == null) { + throw new CqlException( + String.format("Could not resolve data provider for model '%s'.", dataType.getNamespaceURI())); + } + + return dataProvider; + } + + public DataProvider resolveDataProviderByModelUri(String modelUri) { + DataProvider dataProvider = dataProviders.get(modelUri); + if (dataProvider == null) { + throw new CqlException(String.format("Could not resolve data provider for model '%s'.", modelUri)); + } + + return dataProvider; + } + + public DataProvider resolveDataProvider(String packageName) { + return resolveDataProvider(packageName, true); + } + + public DataProvider resolveDataProvider(String packageName, boolean mustResolve) { + DataProvider dataProvider = packageMap.get(packageName); + if (dataProvider == null && mustResolve) { + throw new CqlException(String.format("Could not resolve data provider for package '%s'.", packageName)); + } + + return dataProvider; + } + + public Class resolveType(QName typeName) { + typeName = fixupQName(typeName); + DataProvider dataProvider = resolveDataProvider(typeName); + return dataProvider.resolveType(typeName.getLocalPart()); + } + + public Class resolveType(TypeSpecifier typeSpecifier) { + if (typeSpecifier instanceof NamedTypeSpecifier) { + return resolveType(((NamedTypeSpecifier) typeSpecifier).getName()); + } else if (typeSpecifier instanceof ListTypeSpecifier) { + // TODO: This doesn't allow for list-distinguished overloads... + return List.class; + // return resolveType(((ListTypeSpecifier)typeSpecifier).getElementType()); + } else if (typeSpecifier instanceof IntervalTypeSpecifier) { + return org.opencds.cqf.cql.engine.runtime.Interval.class; + } else if (typeSpecifier instanceof ChoiceTypeSpecifier) { + // TODO: This doesn't allow for choice-distinguished overloads... + return Object.class; + } else { + // TODO: This doesn't allow for tuple-distinguished overloads.... + return org.opencds.cqf.cql.engine.runtime.Tuple.class; + } + } + + public Class resolveType(Object value) { + if (value == null) { + return null; + } + + if (value instanceof TypeSpecifier) { + return resolveType((TypeSpecifier) value); + } + + String packageName = value.getClass().getPackage().getName(); + + // May not be necessary, idea is to sync with the use of List.class for + // ListTypeSpecifiers in the resolveType above + if (value instanceof Iterable) { + return List.class; + } + + if (value instanceof Tuple) { + return org.opencds.cqf.cql.engine.runtime.Tuple.class; + } + + // Primitives should just use the type + // BTR: Well, we should probably be explicit about all and only the types we + // expect + if (packageName.startsWith("java")) { + return value.getClass(); + } + + DataProvider dataProvider = resolveDataProvider(value.getClass().getPackage().getName()); + return dataProvider.resolveType(value); + } + + public Class resolveOperandType(OperandDef operandDef) { + if (operandDef.getOperandTypeSpecifier() != null) { + return resolveType(operandDef.getOperandTypeSpecifier()); + } else { + return resolveType(operandDef.getOperandType()); + } + } + + public boolean isType(Class argumentType, Class operandType) { + return argumentType == null || operandType.isAssignableFrom(argumentType); + } + + public boolean matchesTypes(FunctionDef functionDef, List arguments) { + boolean isMatch = true; + + var operands = functionDef.getOperand(); + + // if argument length is mismatched, don't compare + if (arguments.size() != operands.size()) { + return false; + } + + for (var i = 0; i < arguments.size(); i++) { + isMatch = isType(resolveType(arguments.get(i)), this.resolveOperandType(operands.get(i))); + if (!isMatch) { + break; + } + } + + return isMatch; + } + + public QName fixupQName(QName typeName) { + // When a Json library is deserialized on Android + if (typeName.getNamespaceURI() == null || typeName.getNamespaceURI().isEmpty()) { + if (typeName.getLocalPart() != null && typeName.getLocalPart().startsWith("{")) { + int closeIndex = typeName.getLocalPart().indexOf('}'); + if (closeIndex > 0 && typeName.getLocalPart().length() > closeIndex) { + return new QName(typeName.getLocalPart().substring(1, closeIndex), + typeName.getLocalPart().substring(closeIndex + 1)); + } + } + } + + return typeName; + } + + public Library resolveLibrary(VersionedIdentifier identifier) { + return this.libraryManager.resolveLibrary(identifier).getLibrary(); + } } diff --git a/Src/java/engine/src/main/java/org/opencds/cqf/cql/engine/execution/InMemoryLibraryLoader.java b/Src/java/engine/src/main/java/org/opencds/cqf/cql/engine/execution/InMemoryLibraryLoader.java deleted file mode 100644 index d8b18aa8f..000000000 --- a/Src/java/engine/src/main/java/org/opencds/cqf/cql/engine/execution/InMemoryLibraryLoader.java +++ /dev/null @@ -1,34 +0,0 @@ -package org.opencds.cqf.cql.engine.execution; - -import java.util.Collection; -import java.util.HashMap; -import java.util.Map; - -import org.hl7.elm.r1.Library; -import org.hl7.elm.r1.VersionedIdentifier; - -public class InMemoryLibraryLoader implements LibraryLoader { - - private Map libraries = new HashMap<>(); - - public InMemoryLibraryLoader(Collection libraries) { - - for (Library library : libraries) { - String id = library.getIdentifier().getId(); - if (this.libraries.containsKey(id)) { - throw new IllegalArgumentException(String.format("Found multiple versions / instances of library %s.", id)); - } - - this.libraries.put(library.getIdentifier().getId(), library); - } - } - - public Library load(VersionedIdentifier libraryIdentifier) { - Library library = this.libraries.get(libraryIdentifier.getId()); - if (library == null) { - throw new IllegalArgumentException(String.format("Library %s not found.", libraryIdentifier.getId())); - } - - return library; - } -} \ No newline at end of file diff --git a/Src/java/engine/src/main/java/org/opencds/cqf/cql/engine/execution/Libraries.java b/Src/java/engine/src/main/java/org/opencds/cqf/cql/engine/execution/Libraries.java new file mode 100644 index 000000000..9df3d84e8 --- /dev/null +++ b/Src/java/engine/src/main/java/org/opencds/cqf/cql/engine/execution/Libraries.java @@ -0,0 +1,143 @@ +package org.opencds.cqf.cql.engine.execution; + +import java.util.ArrayList; +import java.util.Collections; +import java.util.List; +import java.util.stream.Collectors; + +import org.hl7.cql.model.NamespaceManager; +import org.hl7.elm.r1.CodeDef; +import org.hl7.elm.r1.CodeSystemDef; +import org.hl7.elm.r1.ConceptDef; +import org.hl7.elm.r1.ExpressionDef; +import org.hl7.elm.r1.FunctionDef; +import org.hl7.elm.r1.IncludeDef; +import org.hl7.elm.r1.Library; +import org.hl7.elm.r1.ParameterDef; +import org.hl7.elm.r1.ValueSetDef; +import org.hl7.elm.r1.VersionedIdentifier; +import org.opencds.cqf.cql.engine.exception.CqlException; + +/** + * This class provides static utility methods for resolving ELM elements from a ELM library. + */ +public class Libraries { + + private Libraries() { + // intentionally empty + } + + public static IncludeDef resolveLibraryRef(final String libraryName, final Library relativeTo) { + for (IncludeDef includeDef : relativeTo.getIncludes().getDef()) { + if (includeDef.getLocalIdentifier().equals(libraryName)) { + return includeDef; + } + } + + throw new CqlException(String.format("Could not resolve library reference '%s'.", libraryName)); + } + + public static List resolveAllExpressionRef(final String name, final Library relativeTo) { + // Assumption: List of defs is sorted. + var defs = relativeTo.getStatements().getDef(); + int index = Collections.binarySearch(defs, name, (x, k) -> ((ExpressionDef)x).getName().compareTo((String)k)); + + if (index == -1) { + return Collections.emptyList(); + } + + int first = index; + int last = index + 1; + + while (first > 0 && defs.get(first - 1).getName().equals(name)) { + first--; + } + + while (last < defs.size() && defs.get(last).getName().equals(name)) { + last++; + } + + return defs.subList(first, last); + } + + public static ExpressionDef resolveExpressionRef(final String name, final Library relativeTo) { + // Assumption: List of defs is sorted. + var result = Collections.binarySearch(relativeTo.getStatements().getDef(), name, (x, k) -> ((ExpressionDef)x).getName().compareTo((String)k)); + if (result >= 0) { + return relativeTo.getStatements().getDef().get(result); + } + + throw new CqlException(String.format("Could not resolve expression reference '%s' in library '%s'.", + name, relativeTo.getIdentifier().getId())); + } + + public static CodeSystemDef resolveCodeSystemRef(final String name, final Library relativeTo) { + for (CodeSystemDef codeSystemDef : relativeTo.getCodeSystems().getDef()) { + if (codeSystemDef.getName().equals(name)) { + return codeSystemDef; + } + } + + throw new CqlException(String.format("Could not resolve code system reference '%s' in library '%s'.", + name, relativeTo.getIdentifier().getId())); + } + + public static ValueSetDef resolveValueSetRef(final String name, final Library relativeTo) { + for (ValueSetDef valueSetDef : relativeTo.getValueSets().getDef()) { + if (valueSetDef.getName().equals(name)) { + return valueSetDef; + } + } + + throw new CqlException(String.format("Could not resolve value set reference '%s' in library '%s'.", + name, relativeTo.getIdentifier().getId())); + } + + public static CodeDef resolveCodeRef(final String name, final Library relativeTo) { + for (CodeDef codeDef : relativeTo.getCodes().getDef()) { + if (codeDef.getName().equals(name)) { + return codeDef; + } + } + + throw new CqlException(String.format("Could not resolve code reference '%s' in library '%s'.", + name, relativeTo.getIdentifier().getId())); + } + + public static ParameterDef resolveParameterRef(final String name, final Library relativeTo) { + for (ParameterDef parameterDef : relativeTo.getParameters().getDef()) { + if (parameterDef.getName().equals(name)) { + return parameterDef; + } + } + + throw new CqlException(String.format("Could not resolve parameter reference '%s' in library '%s'.", + name, relativeTo.getIdentifier().getId())); + } + + public static ConceptDef resolveConceptRef(final String name, final Library relativeTo) { + for (ConceptDef conceptDef : relativeTo.getConcepts().getDef()) { + if (conceptDef.getName().equals(name)) { + return conceptDef; + } + } + + throw new CqlException(String.format("Could not resolve concept reference '%s'.", name)); + } + + public static List getFunctionDefs(final String name, final Library relativeTo) { + var defs = resolveAllExpressionRef(name, relativeTo); + + return defs.stream() + .filter(FunctionDef.class::isInstance) + .map(FunctionDef.class::cast) + .collect(Collectors.toList()); + } + + public static VersionedIdentifier toVersionedIdentifier(IncludeDef includeDef) { + return new VersionedIdentifier() + .withSystem(NamespaceManager.getUriPart(includeDef.getPath())) + .withId(NamespaceManager.getNamePart(includeDef.getPath())) + .withVersion(includeDef.getVersion()); + } +} diff --git a/Src/java/engine/src/main/java/org/opencds/cqf/cql/engine/execution/LibraryLoader.java b/Src/java/engine/src/main/java/org/opencds/cqf/cql/engine/execution/LibraryLoader.java deleted file mode 100644 index 5e78a5140..000000000 --- a/Src/java/engine/src/main/java/org/opencds/cqf/cql/engine/execution/LibraryLoader.java +++ /dev/null @@ -1,8 +0,0 @@ -package org.opencds.cqf.cql.engine.execution; - -import org.hl7.elm.r1.Library; -import org.hl7.elm.r1.VersionedIdentifier; - -public interface LibraryLoader { - Library load(VersionedIdentifier libraryIdentifier); -} diff --git a/Src/java/engine/src/main/java/org/opencds/cqf/cql/engine/execution/NamespaceHelper.java b/Src/java/engine/src/main/java/org/opencds/cqf/cql/engine/execution/NamespaceHelper.java deleted file mode 100644 index 4d597db24..000000000 --- a/Src/java/engine/src/main/java/org/opencds/cqf/cql/engine/execution/NamespaceHelper.java +++ /dev/null @@ -1,45 +0,0 @@ -package org.opencds.cqf.cql.engine.execution; - -public class NamespaceHelper { - - /** - * Gets the the namespace part of a fully qualified name. - * - * Returns null if namspaceQualifiedName is not qualified by namespace. - * Returns null if namspaceQualifiedName is null - * @param namespaceQualifiedName The fully qualified name - * @return the namespace part - */ - public static String getUriPart(String namespaceQualifiedName) { - if (namespaceQualifiedName == null) { - return null; - } - - int i = namespaceQualifiedName.lastIndexOf('/'); - if (i > 0) { - return namespaceQualifiedName.substring(0, i); - } - - return null; - } - - /** - * Gets the the name part of a fully qualified name. - * - * Returns null if namspaceQualifiedName is null - * @param namespaceQualifiedName The fully qualified name - * @return the name part - */ - public static String getNamePart(String namespaceQualifiedName) { - if (namespaceQualifiedName == null) { - return null; - } - - int i = namespaceQualifiedName.lastIndexOf("/"); - if (i > 0) { - return namespaceQualifiedName.substring(i + 1); - } - - return namespaceQualifiedName; - } -} diff --git a/Src/java/engine/src/main/java/org/opencds/cqf/cql/engine/execution/State.java b/Src/java/engine/src/main/java/org/opencds/cqf/cql/engine/execution/State.java index 32f519b9b..9e039d2cc 100644 --- a/Src/java/engine/src/main/java/org/opencds/cqf/cql/engine/execution/State.java +++ b/Src/java/engine/src/main/java/org/opencds/cqf/cql/engine/execution/State.java @@ -1,14 +1,6 @@ package org.opencds.cqf.cql.engine.execution; -import org.cqframework.cql.cql2elm.CqlCompilerException; -import org.cqframework.cql.cql2elm.CqlTranslatorOptions; -import org.cqframework.cql.cql2elm.LibraryManager; import org.hl7.elm.r1.*; -import org.fhir.ucum.UcumEssenceService; -import org.fhir.ucum.UcumException; -import org.fhir.ucum.UcumService; -import org.opencds.cqf.cql.engine.data.DataProvider; -import org.opencds.cqf.cql.engine.data.ExternalFunctionProvider; import org.opencds.cqf.cql.engine.debug.DebugAction; import org.opencds.cqf.cql.engine.debug.DebugMap; import org.opencds.cqf.cql.engine.debug.DebugResult; @@ -16,87 +8,56 @@ import org.opencds.cqf.cql.engine.exception.CqlException; import org.opencds.cqf.cql.engine.exception.Severity; import org.opencds.cqf.cql.engine.runtime.DateTime; -import org.opencds.cqf.cql.engine.runtime.Tuple; -import org.opencds.cqf.cql.engine.terminology.TerminologyProvider; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; -import javax.xml.namespace.QName; -import java.time.OffsetDateTime; import java.time.ZonedDateTime; import java.util.*; -import java.util.List; -import java.util.stream.Collectors; +/** + * State represents the internal state of the CqlEngine. + */ +public class State { -import static org.opencds.cqf.cql.engine.execution.NamespaceHelper.getNamePart; -import static org.opencds.cqf.cql.engine.execution.NamespaceHelper.getUriPart; + public State(Environment environment) { + this.environment = environment; + this.setEvaluationDateTime(ZonedDateTime.now()); -public class State { - private static Logger logger = LoggerFactory.getLogger(State.class); + } + + private final Cache cache = new Cache(); + + private final Environment environment; - private CqlEngine visitor; - private Map parameters = new HashMap<>(); private Stack currentContext = new Stack<>(); - private Map contextValues = new HashMap<>(); + private Stack > windows = new Stack<>(); - private Map libraries = new HashMap<>(); private Stack currentLibrary = new Stack<>(); private Stack> evaluatedResourceStack = new Stack<>(); + private Map parameters = new HashMap<>(); + private Map contextValues = new HashMap<>(); + private ZonedDateTime evaluationZonedDateTime; - private OffsetDateTime evaluationOffsetDateTime; private DateTime evaluationDateTime; - private LibraryManager libraryManager; - private Environment environment; - - private Cache cache; - - private CqlTranslatorOptions translatorOptions; - - private UcumService ucumService; - - private static UcumService sharedUcumService; - - - private Map dataProviders = new HashMap<>(); - private Map packageMap = new HashMap<>(); private DebugMap debugMap; - public CqlEngine getVisitor() { - return visitor; - } - - public void setVisitor(CqlEngine visitor) { - this.visitor = visitor; + public Cache getCache() { + return this.cache; } - public void registerDataProvider(String modelUri, DataProvider dataProvider) { - dataProviders.put(modelUri, dataProvider); - dataProvider.getPackageNames().forEach( pn -> packageMap.put( pn, dataProvider ) ); - } - - - public void setCurrentContext(Stack currentContext) { - this.currentContext = currentContext; + public Environment getEnvironment() { + return environment; } - public Library getCurrentLibrary() { return currentLibrary.peek(); } - public void setCurrentLibrary(Stack currentLibrary) { - this.currentLibrary = currentLibrary; - } - public Map getParameters() { return parameters; } - public void setParameters(Library library, Map parameters) { if (parameters != null) { for (Map.Entry parameterValue : parameters.entrySet()) { @@ -118,8 +79,9 @@ public void setParameter(String libraryName, String name, Object value) { public boolean enterLibrary(String libraryName) { if (libraryName != null) { - IncludeDef includeDef = resolveLibraryRef(libraryName); - Library library = resolveIncludeDef(includeDef); + IncludeDef includeDef = Libraries.resolveLibraryRef(libraryName, getCurrentLibrary()); + var identifier = Libraries.toVersionedIdentifier(includeDef); + Library library = this.getEnvironment().resolveLibrary(identifier); currentLibrary.push(library); return true; @@ -134,37 +96,6 @@ public void exitLibrary(boolean enteredLibrary) { } } - private IncludeDef resolveLibraryRef(String libraryName) { - for (IncludeDef includeDef : getCurrentLibrary().getIncludes().getDef()) { - if (includeDef.getLocalIdentifier().equals(libraryName)) { - return includeDef; - } - } - - throw new CqlException(String.format("Could not resolve library reference '%s'.", libraryName)); - } - - private Library resolveIncludeDef(IncludeDef includeDef) { - VersionedIdentifier libraryIdentifier = new VersionedIdentifier() - .withSystem(getUriPart(includeDef.getPath())) - .withId(getNamePart(includeDef.getPath())) - .withVersion(includeDef.getVersion()); - - Library library = libraries.get(libraryIdentifier.getId()); - if (library == null) { - ArrayList errors = new ArrayList(); - library = libraryManager.resolveLibrary(libraryIdentifier, translatorOptions, errors).getLibrary(); - libraries.put(libraryIdentifier.getId(), library); - } - - if (libraryIdentifier.getVersion() != null && !libraryIdentifier.getVersion().equals(library.getIdentifier().getVersion())) { - throw new CqlException(String.format("Could not load library '%s' version '%s' because version '%s' is already loaded.", - libraryIdentifier.getId(), libraryIdentifier.getVersion(), library.getIdentifier().getVersion())); - } - - return library; - } - public Map getContextValues() { return contextValues; } @@ -181,25 +112,6 @@ public void setWindows(Stack> windows) { this.windows = windows; } - public Map getLibraries() { - return libraries; - } - - public void setLibraries(Map libraries) { - this.libraries = libraries; - } - - - - - public LibraryManager getLibraryManager() { - return libraryManager; - } - - public void setLibraryManager(LibraryManager libraryManager) { - this.libraryManager = libraryManager; - } - public DebugMap getDebugMap() { return this.debugMap; } @@ -236,45 +148,24 @@ private void ensureDebugResult() { } } - public Cache getCache() { return cache; } - - public void setCache(Cache cache) { this.cache = cache; } - public void setEvaluationDateTime(ZonedDateTime evaluationZonedDateTime) { this.evaluationZonedDateTime = evaluationZonedDateTime; - this.evaluationOffsetDateTime = evaluationZonedDateTime.toOffsetDateTime(); - this.evaluationDateTime = new DateTime(evaluationOffsetDateTime); + this.evaluationDateTime = new DateTime(evaluationZonedDateTime.toOffsetDateTime()); } public ZonedDateTime getEvaluationZonedDateTime() { return this.evaluationZonedDateTime; } - public OffsetDateTime getEvaluationOffsetDateTime() { - return this.evaluationOffsetDateTime; - } - public DateTime getEvaluationDateTime() { return this.evaluationDateTime; } - public void init(Library library, DataProvider systemDataProvider, UcumService ucumService) { + public void init(Library library) { pushWindow(); - registerDataProvider("urn:hl7-org:elm-types:r1", systemDataProvider); - - if (library.getIdentifier() != null) { - libraries.put(library.getIdentifier().getId(), library); - } currentLibrary.push(library); - if (ucumService != null) { - this.ucumService = ucumService; - } - else { - this.ucumService = getSharedUcumService(); - } - this.pushEvaluatedResourceStack(); } @@ -321,14 +212,7 @@ private Stack getStack() { } public void setContextValue(String context, Object contextValue) { - if (hasContextValueChanged(context, contextValue)) { - clearExpressions(); - } - contextValues.put(context, contextValue); - } - - public void clearExpressions() { this.cache.getExpressions().clear(); } @@ -348,13 +232,6 @@ public String getCurrentContext() { return currentContext.peek(); } - private boolean hasContextValueChanged(String context, Object contextValue) { - if (contextValues.containsKey(context)) { - return !contextValues.get(context).equals(contextValue); - } - return true; - } - public Object getCurrentContextValue() { String context = getCurrentContext(); if (context != null && this.contextValues.containsKey(context)) { @@ -364,27 +241,6 @@ public Object getCurrentContextValue() { return null; } - public UcumService getUcumService() { - return ucumService; - } - - public void setUcumService(UcumService ucumService) { - this.ucumService = ucumService; - } - - protected synchronized UcumService getSharedUcumService() { - if (sharedUcumService == null) { - try { - sharedUcumService = new UcumEssenceService(UcumEssenceService.class.getResourceAsStream("/ucum-essence.xml")); - } - catch (UcumException e) { - logger.warn("Error creating shared UcumService", e); - } - } - - return sharedUcumService; - } - public Set getEvaluatedResources() { if (evaluatedResourceStack.empty()) { throw new IllegalStateException("Attempted to get the evaluatedResource stack when it's empty"); @@ -417,49 +273,6 @@ public void popEvaluatedResourceStack() { set.addAll(objects); } - - public CqlTranslatorOptions getTranslatorOptions() { - return translatorOptions; - } - - public void setTranslatorOptions(CqlTranslatorOptions translatorOptions) { - this.translatorOptions = translatorOptions; - } - - public Environment getEnvironment() { - return environment; - } - - public void setEnvironment(Environment environment) { - this.environment = environment; - } - - public QName fixupQName(QName typeName) { - // When a Json library is deserialized on Android - if (typeName.getNamespaceURI() == null || typeName.getNamespaceURI().isEmpty()) { - if (typeName.getLocalPart() != null && typeName.getLocalPart().startsWith("{")) { - int closeIndex = typeName.getLocalPart().indexOf('}'); - if (closeIndex > 0 && typeName.getLocalPart().length() > closeIndex) { - return new QName(typeName.getLocalPart().substring(1, closeIndex), typeName.getLocalPart().substring(closeIndex + 1)); - } - } - } - - return typeName; - } - - public ExpressionDef resolveExpressionRef(String name) { - - for (ExpressionDef expressionDef : getCurrentLibrary().getStatements().getDef()) { - if (expressionDef.getName().equals(name)) { - return expressionDef; - } - } - - throw new CqlException(String.format("Could not resolve expression reference '%s' in library '%s'.", - name, getCurrentLibrary().getIdentifier().getId())); - } - public Object resolveAlias(String name) { // This method needs to account for multiple variables on the stack with the same name ArrayList ret = new ArrayList<>(); @@ -474,367 +287,6 @@ public Object resolveAlias(String name) { return isList ? ret : ret.get(ret.size() - 1); } - public CodeSystemDef resolveCodeSystemRef(String name) { - for (CodeSystemDef codeSystemDef : getCurrentLibrary().getCodeSystems().getDef()) { - if (codeSystemDef.getName().equals(name)) { - return codeSystemDef; - } - } - - throw new CqlException(String.format("Could not resolve code system reference '%s' in library '%s'.", - name, getCurrentLibrary().getIdentifier().getId())); - } - - public void registerTerminologyProvider(TerminologyProvider tp) { - this.environment.setTerminologyProvider(tp); - } - public TerminologyProvider resolveTerminologyProvider() { - return this.environment.getTerminologyProvider(); - } - - public ValueSetDef resolveValueSetRef(String name) { - for (ValueSetDef valueSetDef : getCurrentLibrary().getValueSets().getDef()) { - if (valueSetDef.getName().equals(name)) { - return valueSetDef; - } - } - - throw new CqlException(String.format("Could not resolve value set reference '%s' in library '%s'.", - name, getCurrentLibrary().getIdentifier().getId())); - } - - public Object resolvePath(Object target, String path) { - - if (target == null) { - return null; - } - - // TODO: Path may include .'s and []'s. - // For now, assume no qualifiers or indexers... - Class clazz = target.getClass(); - - if (clazz.getPackage().getName().startsWith("java.lang")) { - throw new CqlException(String.format("Invalid path: %s for type: %s - this is likely an issue with the data model.", path, clazz.getName())); - } - - DataProvider dataProvider = resolveDataProvider(clazz.getPackage().getName()); - return dataProvider.resolvePath(target, path); - } - - public Object as(Object operand, Class type, boolean isStrict) { - if (operand == null) { - return null; - } - - if (type.isAssignableFrom(operand.getClass())) { - return operand; - } - - DataProvider provider = resolveDataProvider(type.getPackage().getName(), false); - if (provider != null) { - return provider.as(operand, type, isStrict); - } - - return null; - } - - public Boolean objectEqual(Object left, Object right) { - if (left == null) { - return null; - } - - Class clazz = left.getClass(); - - DataProvider dataProvider = resolveDataProvider(clazz.getPackage().getName()); - return dataProvider.objectEqual(left, right); - } - - public Boolean objectEquivalent(Object left, Object right) { - if ((left == null) && (right == null)) { - return true; - } - - if (left == null) { - return false; - } - - Class clazz = left.getClass(); - - DataProvider dataProvider = resolveDataProvider(clazz.getPackage().getName()); - return dataProvider.objectEquivalent(left, right); - } - - public DataProvider resolveDataProvider(QName dataType) { - dataType = fixupQName(dataType); - DataProvider dataProvider = dataProviders.get(dataType.getNamespaceURI()); - if (dataProvider == null) { - throw new CqlException(String.format("Could not resolve data provider for model '%s'.", dataType.getNamespaceURI())); - } - - return dataProvider; - } - - public DataProvider resolveDataProviderByModelUri(String modelUri) { - DataProvider dataProvider = dataProviders.get(modelUri); - if (dataProvider == null) { - throw new CqlException(String.format("Could not resolve data provider for model '%s'.", modelUri)); - } - - return dataProvider; - } - - public DataProvider resolveDataProvider(String packageName) { - return resolveDataProvider(packageName, true); - } - - public DataProvider resolveDataProvider(String packageName, boolean mustResolve) { - DataProvider dataProvider = packageMap.get(packageName); - if (dataProvider == null && mustResolve) { - throw new CqlException(String.format("Could not resolve data provider for package '%s'.", packageName)); - } - - return dataProvider; - } - - public Class resolveType(QName typeName) { - typeName = fixupQName(typeName); - DataProvider dataProvider = resolveDataProvider(typeName); - return dataProvider.resolveType(typeName.getLocalPart()); - } - - public Class resolveType(TypeSpecifier typeSpecifier) { - if (typeSpecifier instanceof NamedTypeSpecifier) { - return resolveType(((NamedTypeSpecifier)typeSpecifier).getName()); - } - else if (typeSpecifier instanceof ListTypeSpecifier) { - // TODO: This doesn't allow for list-distinguished overloads... - return List.class; - //return resolveType(((ListTypeSpecifier)typeSpecifier).getElementType()); - } - else if (typeSpecifier instanceof IntervalTypeSpecifier) { - return org.opencds.cqf.cql.engine.runtime.Interval.class; - } - else if (typeSpecifier instanceof ChoiceTypeSpecifier) { - // TODO: This doesn't allow for choice-distinguished overloads... - return Object.class; - } - else { - // TODO: This doesn't allow for tuple-distinguished overloads.... - return org.opencds.cqf.cql.engine.runtime.Tuple.class; - } - } - - public Class resolveType(Object value) { - if (value == null) { - return null; - } - - if (value instanceof TypeSpecifier) { - return resolveType((TypeSpecifier) value); - } - - String packageName = value.getClass().getPackage().getName(); - - // May not be necessary, idea is to sync with the use of List.class for ListTypeSpecifiers in the resolveType above - if (value instanceof Iterable) { - return List.class; - } - - if (value instanceof Tuple) { - return org.opencds.cqf.cql.engine.runtime.Tuple.class; - } - - // Primitives should just use the type - // BTR: Well, we should probably be explicit about all and only the types we expect - if (packageName.startsWith("java")) { - return value.getClass(); - } - - DataProvider dataProvider = resolveDataProvider(value.getClass().getPackage().getName()); - return dataProvider.resolveType(value); - } - - public CodeDef resolveCodeRef(String name) { - for (CodeDef codeDef : getCurrentLibrary().getCodes().getDef()) { - if (codeDef.getName().equals(name)) { - return codeDef; - } - } - - throw new CqlException(String.format("Could not resolve code reference '%s'.", name)); - } - - public CodeDef resolveCodeRef(String libraryName, String name) { - boolean enteredLibrary = enterLibrary(libraryName); - try { - return resolveCodeRef(name); - } - finally { - exitLibrary(enteredLibrary); - } - } - - public ConceptDef resolveConceptRef(String name) { - for (ConceptDef conceptDef : getCurrentLibrary().getConcepts().getDef()) { - if (conceptDef.getName().equals(name)) { - return conceptDef; - } - } - - throw new CqlException(String.format("Could not resolve concept reference '%s'.", name)); - } - - public ConceptDef resolveConceptRef(String libraryName, String name) { - boolean enteredLibrary = enterLibrary(libraryName); - try { - return resolveConceptRef(name); - } - finally { - exitLibrary(enteredLibrary); - } - } - - private String getMangledFunctionName(String libraryName, String name) { - return (libraryName == null ? getCurrentLibrary().getIdentifier().getId() : libraryName) + "." + name; - } - - private Map> functionDefsByMangledName = new HashMap<>(); - - public FunctionDef resolveFunctionRef(final String libraryName, final String name, final List arguments, final List signature) { - FunctionDef ret; - - final List types = signature.isEmpty() ? arguments : signature; - - ret = getResolvedFunctionDef(libraryName, name, types, !signature.isEmpty()); - - if (ret != null) { - return ret; - } - - throw new CqlException(String.format("Could not resolve call to operator '%s(%s)' in library '%s'.", - name, getUnresolvedMessage(types, name), getCurrentLibrary().getIdentifier().getId())); - } - - private FunctionDef getResolvedFunctionDef(final String libraryName, final String name, final List types, final boolean hasSignature) { - String mangledFunctionName = getMangledFunctionName(libraryName, name); - List namedDefs = this.functionDefsByMangledName - .computeIfAbsent(mangledFunctionName, x -> this.getFunctionDefs(name)); - - var candidateDefs = namedDefs - .stream() - .filter(x -> x.getOperand().size() == types.size()) - .collect(Collectors.toList()); - - if (candidateDefs.size() == 1) { - return candidateDefs.get(0); - } - - if (candidateDefs.size() > 1 && !hasSignature) { - logger.debug("Using runtime function resolution for '{}'. It's recommended to always include signatures in ELM", mangledFunctionName); - } - - return candidateDefs.stream().filter(x -> matchesTypes(x, types)).findFirst().orElse(null); - } - - private List getFunctionDefs(final String name) { - final var statements = getCurrentLibrary().getStatements(); - if (statements == null) { - return Collections.emptyList(); - } - - return statements.getDef().stream() - .filter(x -> x.getName().equals(name)) - .filter(FunctionDef.class::isInstance) - .map(FunctionDef.class::cast) - .collect(Collectors.toList()); - } - - private String getUnresolvedMessage(List arguments, String name) { - StringBuilder argStr = new StringBuilder(); - if (arguments != null) { - arguments.forEach(a -> argStr.append((argStr.length() > 0) ? ", " : "").append(resolveType(a).getName())); - } - - return argStr.toString(); - } - - private boolean isType(Class argumentType, Class operandType) { - return argumentType == null || operandType.isAssignableFrom(argumentType); - } - - private boolean matchesTypes(FunctionDef functionDef, List arguments) { - boolean isMatch = true; - - var operands = functionDef.getOperand(); - - // if argument length is mismatched, don't compare - if (arguments.size() != operands.size()) { - return false; - } - - for (var i = 0; i < arguments.size(); i++) { - isMatch = isType(resolveType(arguments.get(i)), this.resolveOperandType(operands.get(i))); - if (!isMatch) { - break; - } - } - - return isMatch; - } - - static class FunctionDesc { - public FunctionDesc(FunctionDef functionDef, List> operandTypes) { - this.functionDef = functionDef; - this.operandTypes = operandTypes; - } - - private FunctionDef functionDef; - private List> operandTypes; - - public FunctionDef functionDef() { - return this.functionDef; - } - - public List> operandTypes() { - return this.operandTypes; - } - } - - private FunctionDesc createFunctionDesc(FunctionDef functionDef) { - var operandTypes = new ArrayList>(functionDef.getOperand().size()); - for (var op : functionDef.getOperand()) { - operandTypes.add(this.resolveOperandType(op)); - } - - return new FunctionDesc(functionDef, operandTypes); - } - - private Class resolveOperandType(OperandDef operandDef) { - if (operandDef.getOperandTypeSpecifier() != null) { - return resolveType(operandDef.getOperandTypeSpecifier()); - } - else { - return resolveType(operandDef.getOperandType()); - } - } - - private Map externalFunctionProviders = new HashMap<>(); - - public void registerExternalFunctionProvider(VersionedIdentifier identifier, ExternalFunctionProvider provider) { - externalFunctionProviders.put(identifier, provider); - } - - public ExternalFunctionProvider getExternalFunctionProvider() { - Library currentLibrary = getCurrentLibrary(); - VersionedIdentifier identifier = currentLibrary.getIdentifier(); - ExternalFunctionProvider provider = externalFunctionProviders.get(identifier); - if (provider == null) { - throw new CqlException(String.format( - "Could not resolve external function provider for library '%s'.", identifier)); - } - return provider; - } - public Object resolveIdentifierRef(String name) { for (int i = windows.size() - 1; i >= 0; i--) { for (int j = 0; j < windows.get(i).size(); j++) { @@ -847,7 +299,7 @@ public Object resolveIdentifierRef(String name) { } } try { - return resolvePath(value, name); + return environment.resolvePath(value, name); } catch (Exception ignored) { } @@ -857,40 +309,6 @@ public Object resolveIdentifierRef(String name) { throw new CqlException("Cannot resolve identifier " + name); } - public Object createInstance(QName typeName) { - typeName = fixupQName(typeName); - DataProvider dataProvider = resolveDataProvider(typeName); - return dataProvider.createInstance(typeName.getLocalPart()); - } - - public void setValue(Object target, String path, Object value) { - if (target == null) { - return; - } - - Class clazz = target.getClass(); - - DataProvider dataProvider = resolveDataProvider(clazz.getPackage().getName()); - dataProvider.setValue(target, path, value); - } - - public Boolean is(Object operand, Class type) { - if (operand == null) { - return null; - } - - if (type.isAssignableFrom(operand.getClass())) { - return true; - } - - DataProvider provider = resolveDataProvider(type.getPackage().getName(), false); - if (provider != null) { - return provider.is(operand, type); - } - - return false; - } - public void logDebugResult(Element node, Object result, DebugAction action) { ensureDebugResult(); debugResult.logDebugResult(node, this.getCurrentLibrary(), result, action); @@ -915,34 +333,4 @@ public void logDebugError(CqlException e) { ensureDebugResult(); debugResult.logDebugError(e); } - - public ParameterDef resolveParameterRef(String name) { - for (ParameterDef parameterDef : getCurrentLibrary().getParameters().getDef()) { - if (parameterDef.getName().equals(name)) { - return parameterDef; - } - } - - throw new CqlException(String.format("Could not resolve parameter reference '%s' in library '%s'.", - name, getCurrentLibrary().getIdentifier().getId())); - } - - public Object resolveParameterRef(String libraryName, String name, CqlEngine visitor) { - boolean enteredLibrary = enterLibrary(libraryName); - try { - String fullName = libraryName != null ? String.format("%s.%s", getCurrentLibrary().getIdentifier().getId(), name) : name; - if (parameters.containsKey(fullName)) { - return parameters.get(fullName); - } - - ParameterDef parameterDef = resolveParameterRef(name); - Object result = parameterDef.getDefault() != null ? visitor.visitExpression(parameterDef.getDefault(),this) : null; - parameters.put(fullName, result); - return result; - } - finally { - exitLibrary(enteredLibrary); - } - } - } diff --git a/Src/java/engine/src/main/java/org/opencds/cqf/cql/engine/runtime/CqlList.java b/Src/java/engine/src/main/java/org/opencds/cqf/cql/engine/runtime/CqlList.java index d5cf6d45d..e307b49b3 100644 --- a/Src/java/engine/src/main/java/org/opencds/cqf/cql/engine/runtime/CqlList.java +++ b/Src/java/engine/src/main/java/org/opencds/cqf/cql/engine/runtime/CqlList.java @@ -61,8 +61,8 @@ public int compare(Object left, Object right) { public Comparator columnSort = new Comparator() { public int compare(Object left, Object right) { - Object leftCol = state.resolvePath(left, path); - Object rightCol = state.resolvePath(right, path); + Object leftCol = state.getEnvironment().resolvePath(left, path); + Object rightCol = state.getEnvironment().resolvePath(right, path); return compareTo(leftCol, rightCol); } diff --git a/Src/java/engine/src/main/java/org/opencds/cqf/cql/engine/serializing/CqlLibraryReader.java b/Src/java/engine/src/main/java/org/opencds/cqf/cql/engine/serializing/CqlLibraryReader.java deleted file mode 100644 index 7a3e4e789..000000000 --- a/Src/java/engine/src/main/java/org/opencds/cqf/cql/engine/serializing/CqlLibraryReader.java +++ /dev/null @@ -1,25 +0,0 @@ -package org.opencds.cqf.cql.engine.serializing; - -import java.io.File; -import java.io.IOException; -import java.io.InputStream; -import java.io.Reader; -import java.net.URI; -import java.net.URL; - -import org.hl7.elm.r1.Library; - -public interface CqlLibraryReader { - - public Library read(File file) throws IOException; - - public Library read(URL url) throws IOException; - - public Library read(URI uri) throws IOException; - - public Library read(String string) throws IOException; - - public Library read(InputStream inputStream) throws IOException; - - public Library read(Reader reader) throws IOException; -} diff --git a/Src/java/engine/src/main/java/org/opencds/cqf/cql/engine/serializing/CqlLibraryReaderFactory.java b/Src/java/engine/src/main/java/org/opencds/cqf/cql/engine/serializing/CqlLibraryReaderFactory.java deleted file mode 100644 index 7a0f49091..000000000 --- a/Src/java/engine/src/main/java/org/opencds/cqf/cql/engine/serializing/CqlLibraryReaderFactory.java +++ /dev/null @@ -1,39 +0,0 @@ -package org.opencds.cqf.cql.engine.serializing; - -import java.util.Iterator; -import java.util.ServiceLoader; - -public class CqlLibraryReaderFactory { - - private CqlLibraryReaderFactory() { - } - - public static Iterator providers(boolean refresh) { - var loader = ServiceLoader - .load(CqlLibraryReaderProvider.class); - if (refresh) { - loader.reload(); - } - - return loader.iterator(); - } - - public static CqlLibraryReader getReader(String contentType) { - var providers = providers(false); - if (providers.hasNext()) { - CqlLibraryReaderProvider p = providers.next(); - if (providers.hasNext()) { - throw new RuntimeException(String.join(" ", - "Multiple CqlLibraryReaderProviders found on the classpath.", - "You need to remove a reference to either the 'engine.jackson' or the 'engine.jaxb' package")); - } - - return p.create(contentType); - } - - throw new RuntimeException(String.join(" ", - "No CqlLibraryReaderProviders found on the classpath.", - "You need to add a reference to one of the 'engine.jackson' or 'engine.jaxb' packages,", - "or provide your own implementation.")); - } -} diff --git a/Src/java/engine/src/main/java/org/opencds/cqf/cql/engine/serializing/CqlLibraryReaderProvider.java b/Src/java/engine/src/main/java/org/opencds/cqf/cql/engine/serializing/CqlLibraryReaderProvider.java deleted file mode 100644 index 6d0d31c92..000000000 --- a/Src/java/engine/src/main/java/org/opencds/cqf/cql/engine/serializing/CqlLibraryReaderProvider.java +++ /dev/null @@ -1,5 +0,0 @@ -package org.opencds.cqf.cql.engine.serializing; - -public interface CqlLibraryReaderProvider { - CqlLibraryReader create(String contentType); -} diff --git a/Src/java/engine/src/main/java/org/opencds/cqf/cql/engine/serializing/LibraryWrapper.java b/Src/java/engine/src/main/java/org/opencds/cqf/cql/engine/serializing/LibraryWrapper.java deleted file mode 100644 index 640fd2046..000000000 --- a/Src/java/engine/src/main/java/org/opencds/cqf/cql/engine/serializing/LibraryWrapper.java +++ /dev/null @@ -1,14 +0,0 @@ -package org.opencds.cqf.cql.engine.serializing; - -import org.cqframework.cql.elm.execution.Library; - -public class LibraryWrapper { - private Library library; - public Library getLibrary() { - return library; - } - - public void setLibrary(Library library) { - this.library = library; - } -} diff --git a/Src/java/engine/src/test/java/org/opencds/cqf/cql/engine/execution/CqlConceptTest.java b/Src/java/engine/src/test/java/org/opencds/cqf/cql/engine/execution/CqlConceptTest.java index d4127d6c6..f82268339 100644 --- a/Src/java/engine/src/test/java/org/opencds/cqf/cql/engine/execution/CqlConceptTest.java +++ b/Src/java/engine/src/test/java/org/opencds/cqf/cql/engine/execution/CqlConceptTest.java @@ -11,7 +11,7 @@ public class CqlConceptTest extends CqlTestBase { public void test_all_cql_concept_tests() throws IOException { Environment environment = new Environment(getLibraryManager()); - CqlEngine engineVisitor = new CqlEngine(environment, null, null, null, createOptionsMin()); + CqlEngine engineVisitor = new CqlEngine(environment); Set set = new HashSet<>(); diff --git a/Src/java/engine/src/test/java/org/opencds/cqf/cql/engine/execution/CqlErrorsAndMessagingOperatorsTest.java b/Src/java/engine/src/test/java/org/opencds/cqf/cql/engine/execution/CqlErrorsAndMessagingOperatorsTest.java index 65ce1f581..f5b54317f 100644 --- a/Src/java/engine/src/test/java/org/opencds/cqf/cql/engine/execution/CqlErrorsAndMessagingOperatorsTest.java +++ b/Src/java/engine/src/test/java/org/opencds/cqf/cql/engine/execution/CqlErrorsAndMessagingOperatorsTest.java @@ -84,10 +84,9 @@ public void test_all_errors_and_messaging_operators() throws IOException { public void TestObfuscation() { Map dataProviders = new HashMap<>(); dataProviders.put("urn:hl7-org:elm-types:r1", new CustomSystemDataProvider()); - Environment environment = new Environment(getLibraryManager()); - environment.setDataProviders(dataProviders); + Environment environment = new Environment(getLibraryManager(), dataProviders, null); - CqlEngine visitor = new CqlEngine(environment, null, null, null, createOptionsMin()); + CqlEngine visitor = new CqlEngine(environment); try { diff --git a/Src/java/engine/src/test/java/org/opencds/cqf/cql/engine/execution/CqlExternalFunctionsTest.java b/Src/java/engine/src/test/java/org/opencds/cqf/cql/engine/execution/CqlExternalFunctionsTest.java index bf1ca5593..a9b56d7ee 100644 --- a/Src/java/engine/src/test/java/org/opencds/cqf/cql/engine/execution/CqlExternalFunctionsTest.java +++ b/Src/java/engine/src/test/java/org/opencds/cqf/cql/engine/execution/CqlExternalFunctionsTest.java @@ -16,7 +16,7 @@ public class CqlExternalFunctionsTest extends CqlTestBase { public void testExternalFunctions() { VersionedIdentifier identifier = toElmIdentifier("CqlExternalFunctionsTest"); - engineVisitor.getState().registerExternalFunctionProvider( + engineVisitor.getState().getEnvironment().registerExternalFunctionProvider( identifier, new SystemExternalFunctionProvider(Arrays.asList(MyMath.class.getDeclaredMethods())) ); diff --git a/Src/java/engine/src/test/java/org/opencds/cqf/cql/engine/execution/CqlExternalFunctionsTest2.java b/Src/java/engine/src/test/java/org/opencds/cqf/cql/engine/execution/CqlExternalFunctionsTest2.java index ffef07e0f..083f36282 100644 --- a/Src/java/engine/src/test/java/org/opencds/cqf/cql/engine/execution/CqlExternalFunctionsTest2.java +++ b/Src/java/engine/src/test/java/org/opencds/cqf/cql/engine/execution/CqlExternalFunctionsTest2.java @@ -16,7 +16,7 @@ public class CqlExternalFunctionsTest2 extends CqlTestBase { public void testExternalFunctions() { VersionedIdentifier identifier = toElmIdentifier("CqlExternalFunctionsTest2"); - engineVisitor.getState().registerExternalFunctionProvider( + engineVisitor.getState().getEnvironment().registerExternalFunctionProvider( identifier, new SystemExternalFunctionProvider(Arrays.asList(MyMath2.class.getDeclaredMethods())) ); diff --git a/Src/java/engine/src/test/java/org/opencds/cqf/cql/engine/execution/CqlPerformanceIT.java b/Src/java/engine/src/test/java/org/opencds/cqf/cql/engine/execution/CqlPerformanceIT.java index 5b558c589..5b1df6e38 100644 --- a/Src/java/engine/src/test/java/org/opencds/cqf/cql/engine/execution/CqlPerformanceIT.java +++ b/Src/java/engine/src/test/java/org/opencds/cqf/cql/engine/execution/CqlPerformanceIT.java @@ -26,20 +26,16 @@ public class CqlPerformanceIT extends CqlTestBase { // This test is a basically empty library that tests how long the engine initialization takes. @Test public void testEngineInit() throws IOException, UcumException { - Map map = new HashMap<>(); VersionedIdentifier libraryId = toElmIdentifier("Test"); - map.put(libraryId, toLibrary("Engine init")); - runPerformanceTest(libraryId, map, 0.2, null); + runPerformanceTest(libraryId, 0.2, null); } // This test is for the various CQL operators @Test public void testMainSuite() throws IOException, UcumException { - Map map = new HashMap<>(); - VersionedIdentifier libraryId = toElmIdentifier("CqlTestSuite"); - map.put(libraryId, getLibrary(libraryId)); + VersionedIdentifier libraryId = toElmIdentifier("CqlPerformanceTest", "1"); ZonedDateTime date = ZonedDateTime.of(2018, 1, 1, 7, 0, 0, 0, TimeZone.getDefault().toZoneId()); - runPerformanceTest(libraryId, map, 350.0, date); + runPerformanceTest(libraryId, 350.0, date); } // This test is for the runtime errors @@ -55,32 +51,25 @@ public void testErrorSuite() throws IOException, UcumException { // This test is to check the validity of the internal representation of the CQL types (OPTIONAL) @Test public void testInternalTypeRepresentationSuite() throws IOException, UcumException { - Map map = new HashMap<>(); - VersionedIdentifier libraryId = toElmIdentifier("CqlInternalTypeRepresentationSuite"); - map.put(libraryId, getLibrary(libraryId)); - - runPerformanceTest(libraryId, map, 3.0, null); - } - - private void runPerformanceTest(VersionedIdentifier libraryId, Map map, String libraryName, Double maxPerIterationMs) { - runPerformanceTest(libraryId, map, maxPerIterationMs, null); + VersionedIdentifier libraryId = toElmIdentifier("CqlInternalTypeRepresentationSuite", "1"); + runPerformanceTest(libraryId, 3.0, null); } - private void runPerformanceTest(VersionedIdentifier libraryId, Map map, Double maxPerIterationMs, ZonedDateTime evaluationZonedDateTime) { + private void runPerformanceTest(VersionedIdentifier libraryId, Double maxPerIterationMs, ZonedDateTime evaluationZonedDateTime) { // A new CqlEngine is created for each loop because it resets and rebuilds the context completely. + Environment environment = new Environment(getLibraryManager()); + // Warm up the JVM for (int i = 0; i < ITERATIONS; i++) { - Environment environment = new Environment(getLibraryManager()); - CqlEngine engineVisitor = new CqlEngine(environment, null, null, null, createOptionsMin()); - EvaluationResult evaluationResult = engineVisitor.evaluate(libraryId, map, null, null, null, null, evaluationZonedDateTime); + CqlEngine engineVisitor = new CqlEngine(environment); + EvaluationResult evaluationResult = engineVisitor.evaluate(libraryId, null, null, null, null, evaluationZonedDateTime); } Instant start = Instant.now(); for (int i = 0; i < ITERATIONS; i++) { - Environment environment = new Environment(getLibraryManager()); - CqlEngine engineVisitor = new CqlEngine(environment, null, null, null, createOptionsMin()); - EvaluationResult evaluationResult = engineVisitor.evaluate(libraryId, map,null, null, null, null, evaluationZonedDateTime); + CqlEngine engineVisitor = new CqlEngine(environment); + EvaluationResult evaluationResult = engineVisitor.evaluate(libraryId, null ,null, null, null, evaluationZonedDateTime); } Instant finish = Instant.now(); diff --git a/Src/java/engine/src/test/java/org/opencds/cqf/cql/engine/execution/CqlTestBase.java b/Src/java/engine/src/test/java/org/opencds/cqf/cql/engine/execution/CqlTestBase.java index c3ae0db8b..35a814c67 100644 --- a/Src/java/engine/src/test/java/org/opencds/cqf/cql/engine/execution/CqlTestBase.java +++ b/Src/java/engine/src/test/java/org/opencds/cqf/cql/engine/execution/CqlTestBase.java @@ -4,8 +4,6 @@ import org.hl7.elm.r1.Library; import org.testng.annotations.BeforeMethod; -import java.util.ArrayList; - public class CqlTestBase { private static ModelManager modelManager; @@ -20,7 +18,7 @@ protected static ModelManager getModelManager() { private static LibraryManager libraryManager; protected static LibraryManager getLibraryManager() { if (libraryManager == null) { - libraryManager = new LibraryManager(getModelManager()); + libraryManager = new LibraryManager(getModelManager(), createOptionsMin()); libraryManager.getLibrarySourceLoader().registerProvider(new TestLibrarySourceProvider()); } @@ -28,16 +26,15 @@ protected static LibraryManager getLibraryManager() { } public Library getLibrary(org.hl7.elm.r1.VersionedIdentifier libraryId) { - ArrayList errors = new ArrayList(); - return environment.getLibraryManager().resolveLibrary(libraryId, createOptionsMin(), errors).getLibrary(); + return environment.getLibraryManager().resolveLibrary(libraryId).getLibrary(); } public Library toLibrary(String text) { - return toLibrary(text,getModelManager(), getLibraryManager()); + return toLibrary(text, getLibraryManager()); } - public Library toLibrary(String text, ModelManager modelManager, LibraryManager libraryManager) { - CqlTranslator translator = CqlTranslator.fromText(text, modelManager, libraryManager); + public Library toLibrary(String text, LibraryManager libraryManager) { + CqlTranslator translator = CqlTranslator.fromText(text, libraryManager); return translator.toELM(); } @@ -54,17 +51,17 @@ public static org.hl7.elm.r1.VersionedIdentifier toElmIdentifier(String name, St @BeforeMethod protected void beforeEachMethod(){ environment = new Environment(getLibraryManager()); - engineVisitor = new CqlEngine(environment, null, null, null, createOptionsMin()); + engineVisitor = new CqlEngine(environment); } - public static CqlTranslatorOptions createOptionsMin() { - CqlTranslatorOptions result = new CqlTranslatorOptions(); - result.setOptions(CqlTranslatorOptions.Options.EnableDateRangeOptimization, - CqlTranslatorOptions.Options.EnableLocators, - CqlTranslatorOptions.Options.EnableResultTypes, - CqlTranslatorOptions.Options.DisableListDemotion, - CqlTranslatorOptions.Options.DisableListPromotion, - CqlTranslatorOptions.Options.DisableMethodInvocation); + public static CqlCompilerOptions createOptionsMin() { + CqlCompilerOptions result = new CqlCompilerOptions(); + result.setOptions(CqlCompilerOptions.Options.EnableDateRangeOptimization, + CqlCompilerOptions.Options.EnableLocators, + CqlCompilerOptions.Options.EnableResultTypes, + CqlCompilerOptions.Options.DisableListDemotion, + CqlCompilerOptions.Options.DisableListPromotion, + CqlCompilerOptions.Options.DisableMethodInvocation); return result; } diff --git a/Src/java/engine/src/test/java/org/opencds/cqf/cql/engine/execution/EngineFailedTests.java b/Src/java/engine/src/test/java/org/opencds/cqf/cql/engine/execution/EngineFailedTests.java index 6b7253049..c388b11b3 100644 --- a/Src/java/engine/src/test/java/org/opencds/cqf/cql/engine/execution/EngineFailedTests.java +++ b/Src/java/engine/src/test/java/org/opencds/cqf/cql/engine/execution/EngineFailedTests.java @@ -17,7 +17,7 @@ public class EngineFailedTests extends CqlTestBase { public void test_all_failed_tests() throws Exception { Environment environment = new Environment(getLibraryManager()); - CqlEngine engineVisitor = new CqlEngine(environment, null, null, null, createOptionsMin()); + CqlEngine engineVisitor = new CqlEngine(environment); EvaluationResult evaluationResult; diff --git a/Src/java/engine/src/test/java/org/opencds/cqf/cql/engine/execution/ExpandValueSetTest.java b/Src/java/engine/src/test/java/org/opencds/cqf/cql/engine/execution/ExpandValueSetTest.java index 946814011..4a1e6a6ec 100644 --- a/Src/java/engine/src/test/java/org/opencds/cqf/cql/engine/execution/ExpandValueSetTest.java +++ b/Src/java/engine/src/test/java/org/opencds/cqf/cql/engine/execution/ExpandValueSetTest.java @@ -41,7 +41,7 @@ public Code lookup(Code code, CodeSystemInfo codeSystem) { Environment environment = new Environment(libraryManager, null, terminologyProvider); - CqlEngine engineVisitor = new CqlEngine(environment, null, null, null, CqlTestBase.createOptionsMin()); + CqlEngine engineVisitor = new CqlEngine(environment); diff --git a/Src/java/engine/src/test/java/org/opencds/cqf/cql/engine/execution/ExpressionCacheTest.java b/Src/java/engine/src/test/java/org/opencds/cqf/cql/engine/execution/ExpressionCacheTest.java index c1e7b54a7..3abd74836 100644 --- a/Src/java/engine/src/test/java/org/opencds/cqf/cql/engine/execution/ExpressionCacheTest.java +++ b/Src/java/engine/src/test/java/org/opencds/cqf/cql/engine/execution/ExpressionCacheTest.java @@ -32,7 +32,7 @@ public void test_expression_cache() { Boolean enteredLibrary = engineVisitor.getState().enterLibrary("Common"); VersionedIdentifier commonId = engineVisitor.getState().getCurrentLibrary().getIdentifier(); - result = engineVisitor.visitExpressionDef(engineVisitor.getState().resolveExpressionRef("Expression"), engineVisitor.getState()); + result = engineVisitor.visitExpressionDef(Libraries.resolveExpressionRef("Expression", engineVisitor.getState().getCurrentLibrary()), engineVisitor.getState()); assertNotNull(result); assertThat(result, is(3)); diff --git a/Src/java/engine/src/test/java/org/opencds/cqf/cql/engine/execution/IncludedValueSetRefTest.java b/Src/java/engine/src/test/java/org/opencds/cqf/cql/engine/execution/IncludedValueSetRefTest.java index f3c74342b..e7b343e4e 100644 --- a/Src/java/engine/src/test/java/org/opencds/cqf/cql/engine/execution/IncludedValueSetRefTest.java +++ b/Src/java/engine/src/test/java/org/opencds/cqf/cql/engine/execution/IncludedValueSetRefTest.java @@ -41,7 +41,7 @@ public Code lookup(Code code, CodeSystemInfo codeSystem) { Environment environment = new Environment(libraryManager, null, terminologyProvider); - CqlEngine engineVisitor = new CqlEngine(environment, null, null, null, CqlTestBase.createOptionsMin()); + CqlEngine engineVisitor = new CqlEngine(environment); diff --git a/Src/java/engine/src/test/java/org/opencds/cqf/cql/engine/execution/ListOperatorsTest.java b/Src/java/engine/src/test/java/org/opencds/cqf/cql/engine/execution/ListOperatorsTest.java index 886f14227..f4d3eb00b 100644 --- a/Src/java/engine/src/test/java/org/opencds/cqf/cql/engine/execution/ListOperatorsTest.java +++ b/Src/java/engine/src/test/java/org/opencds/cqf/cql/engine/execution/ListOperatorsTest.java @@ -5,17 +5,19 @@ import org.testng.Assert; import org.testng.annotations.Test; -import java.util.*; - import static org.hamcrest.MatcherAssert.assertThat; import static org.hamcrest.Matchers.*; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.Collections; +import java.util.List; + public class ListOperatorsTest extends CqlTestBase { @Test public void test_all_interval_operators() { - Set set = new HashSet<>(); EvaluationResult evaluationResult; evaluationResult = engineVisitor.evaluate(toElmIdentifier("CqlListOperatorsTest")); @@ -28,7 +30,6 @@ public void test_all_interval_operators() { result = evaluationResult.expressionResults.get("simpleSortAsc").value(); assertThat(result, is(Arrays.asList(1, 1, 2, 4, 5, 6))); - result = evaluationResult.expressionResults.get("simpleSortDesc").value(); assertThat(result, is(Arrays.asList(6, 5, 4, 2, 1, 1))); @@ -39,16 +40,16 @@ public void test_all_interval_operators() { assertThat(result, is(Arrays.asList("zebra", "iguana", "back", "alligator", "aardvark", "Wolf", "Armadillo"))); result = evaluationResult.expressionResults.get("SortDatesAsc").value(); - Assert.assertTrue(EquivalentEvaluator.equivalent(((List) result).get(0), new DateTime(null, 2012, 1, 1))); - Assert.assertTrue(EquivalentEvaluator.equivalent(((List) result).get(1), new DateTime(null, 2012, 1, 1, 12))); - Assert.assertTrue(EquivalentEvaluator.equivalent(((List) result).get(2), new DateTime(null, 2012, 10, 5))); - Assert.assertTrue(EquivalentEvaluator.equivalent(((List) result).get(3), new DateTime(null, 2012, 10, 5, 10))); + Assert.assertTrue(EquivalentEvaluator.equivalent(((List) result).get(0), new DateTime(null, 2012, 1, 1))); + Assert.assertTrue(EquivalentEvaluator.equivalent(((List) result).get(1), new DateTime(null, 2012, 1, 1, 12))); + Assert.assertTrue(EquivalentEvaluator.equivalent(((List) result).get(2), new DateTime(null, 2012, 10, 5))); + Assert.assertTrue(EquivalentEvaluator.equivalent(((List) result).get(3), new DateTime(null, 2012, 10, 5, 10))); result = evaluationResult.expressionResults.get("SortDatesDesc").value(); - Assert.assertTrue(EquivalentEvaluator.equivalent(((List) result).get(0), new DateTime(null, 2012, 10, 5, 10))); - Assert.assertTrue(EquivalentEvaluator.equivalent(((List) result).get(1), new DateTime(null, 2012, 10, 5))); - Assert.assertTrue(EquivalentEvaluator.equivalent(((List) result).get(2), new DateTime(null, 2012, 1, 1, 12))); - Assert.assertTrue(EquivalentEvaluator.equivalent(((List) result).get(3), new DateTime(null, 2012, 1, 1))); + Assert.assertTrue(EquivalentEvaluator.equivalent(((List) result).get(0), new DateTime(null, 2012, 10, 5, 10))); + Assert.assertTrue(EquivalentEvaluator.equivalent(((List) result).get(1), new DateTime(null, 2012, 10, 5))); + Assert.assertTrue(EquivalentEvaluator.equivalent(((List) result).get(2), new DateTime(null, 2012, 1, 1, 12))); + Assert.assertTrue(EquivalentEvaluator.equivalent(((List) result).get(3), new DateTime(null, 2012, 1, 1))); result = evaluationResult.expressionResults.get("SortIntWithNullAsc1").value(); assertThat(result, is(Arrays.asList(null, 1, 2, 3))); @@ -134,14 +135,14 @@ public void test_all_interval_operators() { assertThat(result, is(Arrays.asList("a", "b", "c"))); result = evaluationResult.expressionResults.get("DistinctDateTime").value(); - Assert.assertTrue(EquivalentEvaluator.equivalent(((List)result).get(0), new DateTime(null, 2012, 10, 5))); - Assert.assertTrue(EquivalentEvaluator.equivalent(((List)result).get(1), new DateTime(null, 2012, 1, 1))); - assertThat(((List)result).size(), is(2)); + Assert.assertTrue(EquivalentEvaluator.equivalent(((List)result).get(0), new DateTime(null, 2012, 10, 5))); + Assert.assertTrue(EquivalentEvaluator.equivalent(((List)result).get(1), new DateTime(null, 2012, 1, 1))); + assertThat(((List)result).size(), is(2)); result = evaluationResult.expressionResults.get("DistinctTime").value(); - Assert.assertTrue(EquivalentEvaluator.equivalent(((List)result).get(0), new Time(15, 59, 59, 999))); - Assert.assertTrue(EquivalentEvaluator.equivalent(((List)result).get(1), new Time(20, 59, 59, 999))); - assertThat(((List)result).size(), is(2)); + Assert.assertTrue(EquivalentEvaluator.equivalent(((List)result).get(0), new Time(15, 59, 59, 999))); + Assert.assertTrue(EquivalentEvaluator.equivalent(((List)result).get(1), new Time(20, 59, 59, 999))); + assertThat(((List)result).size(), is(2)); result = evaluationResult.expressionResults.get("EqualNullNull").value(); assertThat(result, is(nullValue())); @@ -186,12 +187,12 @@ public void test_all_interval_operators() { assertThat(result, is(Collections.emptyList())); result = evaluationResult.expressionResults.get("ExceptDateTimeList").value(); - Assert.assertTrue(EquivalentEvaluator.equivalent(((List)result).get(0), new DateTime(null, 2012, 5, 10))); - assertThat(((List)result).size(), is(1)); + Assert.assertTrue(EquivalentEvaluator.equivalent(((List)result).get(0), new DateTime(null, 2012, 5, 10))); + assertThat(((List)result).size(), is(1)); result = evaluationResult.expressionResults.get("ExceptTimeList").value(); - Assert.assertTrue(EquivalentEvaluator.equivalent(((List)result).get(0), new Time(15, 59, 59, 999))); - assertThat(((List)result).size(), is(1)); + Assert.assertTrue(EquivalentEvaluator.equivalent(((List)result).get(0), new Time(15, 59, 59, 999))); + assertThat(((List)result).size(), is(1)); result = evaluationResult.expressionResults.get("ExceptNullRight").value(); assertThat(result, is(Arrays.asList(1, 4))); @@ -230,14 +231,14 @@ public void test_all_interval_operators() { assertThat(result, is(Arrays.asList(1, 2, 3, 4))); result = evaluationResult.expressionResults.get("FlattenDateTime").value(); - Assert.assertTrue(EquivalentEvaluator.equivalent(((List)result).get(0), new DateTime(null, 2012, 5, 10))); - Assert.assertTrue(EquivalentEvaluator.equivalent(((List)result).get(1), new DateTime(null, 2014, 12, 10))); - assertThat(((List)result).size(), is(2)); + Assert.assertTrue(EquivalentEvaluator.equivalent(((List)result).get(0), new DateTime(null, 2012, 5, 10))); + Assert.assertTrue(EquivalentEvaluator.equivalent(((List)result).get(1), new DateTime(null, 2014, 12, 10))); + assertThat(((List)result).size(), is(2)); result = evaluationResult.expressionResults.get("FlattenTime").value(); - Assert.assertTrue(EquivalentEvaluator.equivalent(((List)result).get(0), new Time(15, 59, 59, 999))); - Assert.assertTrue(EquivalentEvaluator.equivalent(((List)result).get(1), new Time(20, 59, 59, 999))); - assertThat(((List)result).size(), is(2)); + Assert.assertTrue(EquivalentEvaluator.equivalent(((List)result).get(0), new Time(15, 59, 59, 999))); + Assert.assertTrue(EquivalentEvaluator.equivalent(((List)result).get(1), new Time(20, 59, 59, 999))); + assertThat(((List)result).size(), is(2)); result = evaluationResult.expressionResults.get("FirstEmpty").value(); assertThat(result, is(nullValue())); @@ -407,14 +408,14 @@ public void test_all_interval_operators() { assertThat(result, is(Arrays.asList(2, 3))); result = evaluationResult.expressionResults.get("IntersectDateTime").value(); - Assert.assertTrue(EquivalentEvaluator.equivalent(((List)result).get(0), new DateTime(null, 2012, 5, 10))); - Assert.assertTrue(EquivalentEvaluator.equivalent(((List)result).get(1), new DateTime(null, 2014, 12, 10))); - assertThat(((ArrayList)result).size(), is(2)); + Assert.assertTrue(EquivalentEvaluator.equivalent(((List)result).get(0), new DateTime(null, 2012, 5, 10))); + Assert.assertTrue(EquivalentEvaluator.equivalent(((List)result).get(1), new DateTime(null, 2014, 12, 10))); + assertThat(((List)result).size(), is(2)); result = evaluationResult.expressionResults.get("IntersectTime").value(); - Assert.assertTrue(EquivalentEvaluator.equivalent(((List)result).get(0), new Time(15, 59, 59, 999))); - Assert.assertTrue(EquivalentEvaluator.equivalent(((List)result).get(1), new Time(20, 59, 59, 999))); - assertThat(((ArrayList)result).size(), is(2)); + Assert.assertTrue(EquivalentEvaluator.equivalent(((List)result).get(0), new Time(15, 59, 59, 999))); + Assert.assertTrue(EquivalentEvaluator.equivalent(((List)result).get(1), new Time(20, 59, 59, 999))); + assertThat(((List)result).size(), is(2)); result = evaluationResult.expressionResults.get("LastEmpty").value(); assertThat(result, is(nullValue())); @@ -690,17 +691,17 @@ public void test_all_interval_operators() { assertThat(result, is(Arrays.asList(1, 2, 3, 4))); result = evaluationResult.expressionResults.get("UnionDateTime").value(); - Assert.assertTrue(EquivalentEvaluator.equivalent(((List)result).get(0), new DateTime(null, 2001, 9, 11))); - Assert.assertTrue(EquivalentEvaluator.equivalent(((List)result).get(1), new DateTime(null, 2012, 5, 10))); - Assert.assertTrue(EquivalentEvaluator.equivalent(((List)result).get(2), new DateTime(null, 2014, 12, 10))); - assertThat(((List)result).size(), is(3)); + Assert.assertTrue(EquivalentEvaluator.equivalent(((List)result).get(0), new DateTime(null, 2001, 9, 11))); + Assert.assertTrue(EquivalentEvaluator.equivalent(((List)result).get(1), new DateTime(null, 2012, 5, 10))); + Assert.assertTrue(EquivalentEvaluator.equivalent(((List)result).get(2), new DateTime(null, 2014, 12, 10))); + assertThat(((List)result).size(), is(3)); result = evaluationResult.expressionResults.get("UnionTime").value(); - Assert.assertTrue(EquivalentEvaluator.equivalent(((List)result).get(0), new Time(15, 59, 59, 999))); - Assert.assertTrue(EquivalentEvaluator.equivalent(((List)result).get(1), new Time(20, 59, 59, 999))); - Assert.assertTrue(EquivalentEvaluator.equivalent(((List)result).get(2), new Time(12, 59, 59, 999))); - Assert.assertTrue(EquivalentEvaluator.equivalent(((List)result).get(3), new Time(10, 59, 59, 999))); - assertThat(((List)result).size(), is(4)); + Assert.assertTrue(EquivalentEvaluator.equivalent(((List)result).get(0), new Time(15, 59, 59, 999))); + Assert.assertTrue(EquivalentEvaluator.equivalent(((List)result).get(1), new Time(20, 59, 59, 999))); + Assert.assertTrue(EquivalentEvaluator.equivalent(((List)result).get(2), new Time(12, 59, 59, 999))); + Assert.assertTrue(EquivalentEvaluator.equivalent(((List)result).get(3), new Time(10, 59, 59, 999))); + assertThat(((List)result).size(), is(4)); } diff --git a/Src/java/engine/src/test/java/org/opencds/cqf/cql/engine/execution/NamespaceHelperTests.java b/Src/java/engine/src/test/java/org/opencds/cqf/cql/engine/execution/NamespaceHelperTests.java deleted file mode 100644 index 0d1d253fd..000000000 --- a/Src/java/engine/src/test/java/org/opencds/cqf/cql/engine/execution/NamespaceHelperTests.java +++ /dev/null @@ -1,33 +0,0 @@ -package org.opencds.cqf.cql.engine.execution; - -import static org.testng.Assert.assertEquals; -import static org.testng.Assert.assertNull; - -import org.testng.annotations.Test; - -public class NamespaceHelperTests { - - @Test - public void TestNamespaceUriParsing() { - String actual = NamespaceHelper.getUriPart(null); - assertNull(null); - - actual = NamespaceHelper.getUriPart("http://cql-engine.test/Library/TestUri"); - assertEquals("http://cql-engine.test/Library", actual); - - actual = NamespaceHelper.getUriPart("TestUri"); - assertNull(actual); - } - - @Test - public void TestNamespaceNameParsing() { - String actual = NamespaceHelper.getNamePart(null); - assertNull(actual); - - actual = NamespaceHelper.getNamePart("http://cql-engine.test/Library/TestUri"); - assertEquals("TestUri", actual); - - actual = NamespaceHelper.getNamePart("TestUri"); - assertEquals("TestUri", actual); - } -} diff --git a/Src/java/engine/src/test/java/org/opencds/cqf/cql/engine/execution/TestLibrarySourceProvider.java b/Src/java/engine/src/test/java/org/opencds/cqf/cql/engine/execution/TestLibrarySourceProvider.java index d692aab86..78e616fea 100644 --- a/Src/java/engine/src/test/java/org/opencds/cqf/cql/engine/execution/TestLibrarySourceProvider.java +++ b/Src/java/engine/src/test/java/org/opencds/cqf/cql/engine/execution/TestLibrarySourceProvider.java @@ -9,7 +9,7 @@ public class TestLibrarySourceProvider implements LibrarySourceProvider { @Override public InputStream getLibrarySource(VersionedIdentifier libraryIdentifier) { String libraryFileName = String.format("%s%s.cql", - libraryIdentifier.getId(), libraryIdentifier.getVersion() != null ? ("-" + libraryIdentifier.getVersion()) : ""); + libraryIdentifier.getId(), ""); return TestLibrarySourceProvider.class.getResourceAsStream(libraryFileName); } } \ No newline at end of file diff --git a/Src/java/engine/src/test/resources/org/opencds/cqf/cql/engine/execution/CqlPerformanceTest.cql b/Src/java/engine/src/test/resources/org/opencds/cqf/cql/engine/execution/CqlPerformanceTest.cql new file mode 100644 index 000000000..dca440b07 --- /dev/null +++ b/Src/java/engine/src/test/resources/org/opencds/cqf/cql/engine/execution/CqlPerformanceTest.cql @@ -0,0 +1,5220 @@ +library CqlPerformanceTest version '1' + +codesystem "SNOMED-CT": 'http://snomed.info/sct' + +/* + NOTES: + This test suite is meant to serve as a comprehensive, portable test suite for Any implementation of a CQL execution engine. + + There are 3 components of this suite (of which this file is one): + 1. Optional Internal Type/value tests + 2. Valid operator tests (this file) + 3. Invalid operator tests (All these tests result in a runtime error) + + This suite is an extension of the Bonnie tests, which can be found here: + https://github.com/cqframework/cql-execution/tree/master/test/elm +*/ + +define function TestMessage(condition Boolean, testName String, expected String, result String): + if condition + then testName + ' TEST PASSED' + else Message('TEST SUITE FAILED', true, 'Test ' + testName + ' failed', 'Warning', 'Expected ' + expected + ' Found ' + result) + +define function toString(value Boolean): + if value is null + then 'null' + else ToString(value) + +define function toString(value Decimal): + if value is null + then 'null' + else ToString(value) + +define function toString(value Integer): + if value is null + then 'null' + else ToString(value) + +define function toString(value DateTime): + if value is null + then 'null' + else ToString(value) + +define function toString(value Date): + if value is null + then 'null' + else ToString(value) + +define function toString(value Time): + if value is null + then 'null' + else ToString(value) + +define function toString(value Quantity): + if value is null + then 'null' + else ToString(value) + +define function toString(value Code): + if value is null + then 'null' + else 'Code { code: ' + value.code + ' system: ' + value.system + ' version: ' + value.version + ' display: ' + value.display + ' }' + +define function toString(value Tuple{a Integer}): + if value is null + then 'null' + else 'Tuple{ a: ' + ToString(value.a) + ' }' + +define function toString(value Tuple{hello String}): + if value is null + then 'null' + else 'Tuple{ hello: ' + value.hello + ' }' + +define function toString(value Tuple{a Integer, b String}): + if value is null + then 'null' + else 'Tuple{ a: ' + ToString(value.a) + ', b: ' + value.b + ' }' + +define function toString(value Tuple{a Integer, b Integer, c Integer}): + if value is null + then 'null' + else 'Tuple{ a: ' + ToString(value.a) + ', b: ' + ToString(value.b) + ', c: ' + ToString(value.c) + ' }' + +define function toString(value List): + if value is null + then 'null' + else Combine((value V return toString(V)), ', ') + +define function toString(value Interval): + if value is null + then 'null' + else '[' + toString(start of value) + ', ' + toString(end of value) + ']' + +define function toString(value Interval): + if value is null + then 'null' + else '[' + toString(start of value) + ', ' + toString(end of value) + ']' + +define function toString(value Interval): + if value is null + then 'null' + else '[' + toString(start of value) + ', ' + toString(end of value) + ']' + +define function toString(value Interval): + if value is null + then 'null' + else '[' + toString(start of value) + ', ' + toString(end of value) + ']' + +define function toString(value Interval): + if value is null + then 'null' + else '[' + toString(start of value) + ', ' + toString(end of value) + ']' + +define function toString(value Interval