From 9ef9f54f8f7dbe5a82530d59a8e9dcdf66956108 Mon Sep 17 00:00:00 2001 From: Bryn Rhodes Date: Sat, 27 Nov 2021 17:03:15 -0700 Subject: [PATCH] #684: Fixed an issue with data requirements not being reported correctly for dependencies --- Src/cql-lm/schema/elm/expression.xsd | 10 + .../cql/cql2elm/LibraryBuilder.java | 91 +- .../cqframework/cql/cql2elm/ModelManager.java | 11 + .../cql/cql2elm/ModelResolver.java | 7 + .../cqframework/cql/cql2elm/TypeBuilder.java | 136 +++ .../cql/cql2elm/model/Operator.java | 19 +- .../cql2elm/model/SystemLibraryHelper.java | 968 +++++++++--------- .../cql/cql2elm/model/TranslatedLibrary.java | 37 +- .../requirements/ElmRequirementsContext.java | 51 +- .../cql/elm/requirements/TypeResolver.java | 85 +- .../fhir/DataRequirementsProcessor.java | 70 +- .../fhir/DataRequirementsProcessorTest.java | 120 ++- 12 files changed, 1015 insertions(+), 590 deletions(-) create mode 100644 Src/java/cql-to-elm/src/main/java/org/cqframework/cql/cql2elm/ModelResolver.java create mode 100644 Src/java/cql-to-elm/src/main/java/org/cqframework/cql/cql2elm/TypeBuilder.java diff --git a/Src/cql-lm/schema/elm/expression.xsd b/Src/cql-lm/schema/elm/expression.xsd index d3cea217e..e62bf40a9 100644 --- a/Src/cql-lm/schema/elm/expression.xsd +++ b/Src/cql-lm/schema/elm/expression.xsd @@ -122,6 +122,16 @@ + + + A type which is generic class parameter such as T in MyGeneric<T extends SomeType>. + + + + + + + The Expression type defines the abstract base type for all expressions used in the ELM expression language. 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 52467ff52..d762b70df 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 @@ -1,6 +1,5 @@ package org.cqframework.cql.cql2elm; -import org.cqframework.cql.cql2elm.CqlTranslator; import org.cqframework.cql.cql2elm.model.*; import org.cqframework.cql.cql2elm.model.invocation.*; import org.cqframework.cql.elm.tracking.TrackBack; @@ -11,18 +10,16 @@ import org.hl7.cql_annotations.r1.ErrorSeverity; import org.hl7.cql_annotations.r1.ErrorType; import org.hl7.elm.r1.*; -import org.hl7.elm_modelinfo.r1.ModelInfo; import javax.xml.namespace.QName; import java.math.BigDecimal; -import java.text.DecimalFormat; import java.util.*; import java.util.List; /** * Created by Bryn on 12/29/2016. */ -public class LibraryBuilder { +public class LibraryBuilder implements ModelResolver { public static enum SignatureLevel { /* Indicates signatures will never be included in operator invocations @@ -61,6 +58,7 @@ public LibraryBuilder(NamespaceInfo namespaceInfo, ModelManager modelManager, Li this.namespaceInfo = namespaceInfo; // Note: allowed to be null, implies global namespace this.modelManager = modelManager; this.libraryManager = libraryManager; + this.typeBuilder = new TypeBuilder(of, this); this.library = of.createLibrary() .withSchemaIdentifier(of.createVersionedIdentifier() @@ -131,6 +129,7 @@ public ConversionMap getConversionMap() { private UcumService ucumService = null; private CqlTranslatorOptions options; private CqlToElmInfo cqlToElmInfo = null; + private TypeBuilder typeBuilder = null; public void enableListTraversal() { listTraversal = true; @@ -452,7 +451,7 @@ public Model getModel(UsingDef usingDef) { } private void loadSystemLibrary() { - TranslatedLibrary systemLibrary = SystemLibraryHelper.load(getSystemModel()); + TranslatedLibrary systemLibrary = SystemLibraryHelper.load(getSystemModel(), typeBuilder); libraries.put(systemLibrary.getIdentifier().getId(), systemLibrary); loadConversionMap(systemLibrary); } @@ -1839,91 +1838,15 @@ public Interval createInterval(Expression low, boolean lowClosed, Expression hig } public QName dataTypeToQName(DataType type) { - if (type instanceof NamedType) { - NamedType namedType = (NamedType)type; - ModelInfo modelInfo = getModel(namedType.getNamespace()).getModelInfo(); - return new QName(modelInfo.getTargetUrl() != null ? modelInfo.getTargetUrl() : modelInfo.getUrl(), - namedType.getTarget() != null ? namedType.getTarget() : namedType.getSimpleName()); - } - - // ERROR: - throw new IllegalArgumentException("A named type is required in this context."); + return typeBuilder.dataTypeToQName(type); } public Iterable dataTypesToTypeSpecifiers(Iterable types) { - ArrayList result = new ArrayList(); - for (DataType type : types) { - result.add(dataTypeToTypeSpecifier(type)); - } - return result; + return typeBuilder.dataTypesToTypeSpecifiers(types); } public TypeSpecifier dataTypeToTypeSpecifier(DataType type) { - // Convert the given type into an ELM TypeSpecifier representation. - if (type instanceof NamedType) { - return (TypeSpecifier)of.createNamedTypeSpecifier().withName(dataTypeToQName(type)).withResultType(type); - } - else if (type instanceof ListType) { - return listTypeToTypeSpecifier((ListType)type); - } - else if (type instanceof IntervalType) { - return intervalTypeToTypeSpecifier((IntervalType)type); - } - else if (type instanceof TupleType) { - return tupleTypeToTypeSpecifier((TupleType)type); - } - else if (type instanceof ChoiceType) { - return choiceTypeToTypeSpecifier((ChoiceType)type); - } - else { - throw new IllegalArgumentException(String.format("Could not convert type %s to a type specifier.", type)); - } - } - - private TypeSpecifier listTypeToTypeSpecifier(ListType type) { - return (TypeSpecifier)of.createListTypeSpecifier() - .withElementType(dataTypeToTypeSpecifier(type.getElementType())) - .withResultType(type); - } - - private TypeSpecifier intervalTypeToTypeSpecifier(IntervalType type) { - return (TypeSpecifier)of.createIntervalTypeSpecifier() - .withPointType(dataTypeToTypeSpecifier(type.getPointType())) - .withResultType(type); - } - - private TypeSpecifier tupleTypeToTypeSpecifier(TupleType type) { - return (TypeSpecifier)of.createTupleTypeSpecifier() - .withElement(tupleTypeElementsToTupleElementDefinitions(type.getElements())) - .withResultType(type); - } - - private TupleElementDefinition[] tupleTypeElementsToTupleElementDefinitions(Iterable elements) { - List definitions = new ArrayList<>(); - - for (TupleTypeElement element : elements) { - definitions.add(of.createTupleElementDefinition() - .withName(element.getName()) - .withElementType(dataTypeToTypeSpecifier(element.getType()))); - } - - return definitions.toArray(new TupleElementDefinition[definitions.size()]); - } - - private TypeSpecifier choiceTypeToTypeSpecifier(ChoiceType type) { - return (TypeSpecifier)of.createChoiceTypeSpecifier() - .withChoice(choiceTypeTypesToTypeSpecifiers(type)) - .withResultType(type); - } - - private TypeSpecifier[] choiceTypeTypesToTypeSpecifiers(ChoiceType choiceType) { - List specifiers = new ArrayList<>(); - - for (DataType type : choiceType.getTypes()) { - specifiers.add(dataTypeToTypeSpecifier(type)); - } - - return specifiers.toArray(new TypeSpecifier[specifiers.size()]); + return typeBuilder.dataTypeToTypeSpecifier(type); } public DataType resolvePath(DataType sourceType, String path) { diff --git a/Src/java/cql-to-elm/src/main/java/org/cqframework/cql/cql2elm/ModelManager.java b/Src/java/cql-to-elm/src/main/java/org/cqframework/cql/cql2elm/ModelManager.java index 00b105ace..f59ee99e6 100644 --- a/Src/java/cql-to-elm/src/main/java/org/cqframework/cql/cql2elm/ModelManager.java +++ b/Src/java/cql-to-elm/src/main/java/org/cqframework/cql/cql2elm/ModelManager.java @@ -18,6 +18,7 @@ public class ModelManager { private ModelInfoLoader modelInfoLoader; private final Map models = new HashMap<>(); private final Set loadingModels = new HashSet<>(); + private final Map modelsByUri = new HashMap<>(); public ModelManager() { namespaceManager = new NamespaceManager(); @@ -116,6 +117,7 @@ public Model resolveModel(VersionedIdentifier modelIdentifier) { if (model == null) { model = buildModel(modelIdentifier); models.put(modelPath, model); + modelsByUri.put(model.getModelInfo().getUrl(), model); } if (modelIdentifier.getVersion() != null && !modelIdentifier.getVersion().equals(model.getModelInfo().getVersion())) { @@ -125,4 +127,13 @@ public Model resolveModel(VersionedIdentifier modelIdentifier) { return model; } + + public Model resolveModelByUri(String namespaceUri) { + Model model = modelsByUri.get(namespaceUri); + if (model == null) { + throw new IllegalArgumentException(String.format("Could not resolve model with namespace %s", namespaceUri)); + } + + return model; + } } diff --git a/Src/java/cql-to-elm/src/main/java/org/cqframework/cql/cql2elm/ModelResolver.java b/Src/java/cql-to-elm/src/main/java/org/cqframework/cql/cql2elm/ModelResolver.java new file mode 100644 index 000000000..48863412d --- /dev/null +++ b/Src/java/cql-to-elm/src/main/java/org/cqframework/cql/cql2elm/ModelResolver.java @@ -0,0 +1,7 @@ +package org.cqframework.cql.cql2elm; + +import org.cqframework.cql.cql2elm.model.Model; + +public interface ModelResolver { + Model getModel(String modelName); +} diff --git a/Src/java/cql-to-elm/src/main/java/org/cqframework/cql/cql2elm/TypeBuilder.java b/Src/java/cql-to-elm/src/main/java/org/cqframework/cql/cql2elm/TypeBuilder.java new file mode 100644 index 000000000..7504c9290 --- /dev/null +++ b/Src/java/cql-to-elm/src/main/java/org/cqframework/cql/cql2elm/TypeBuilder.java @@ -0,0 +1,136 @@ +package org.cqframework.cql.cql2elm; + +import org.cqframework.cql.cql2elm.model.Model; +import org.hl7.cql.model.*; +import org.hl7.elm.r1.ObjectFactory; +import org.hl7.elm.r1.ParameterTypeSpecifier; +import org.hl7.elm.r1.TupleElementDefinition; +import org.hl7.elm.r1.TypeSpecifier; +import org.hl7.elm_modelinfo.r1.ModelInfo; + +import javax.xml.namespace.QName; +import java.util.ArrayList; +import java.util.List; + +public class TypeBuilder { + + private ObjectFactory of; + private ModelResolver mr; + + public class InternalModelResolver implements ModelResolver { + private ModelManager modelManager; + + public InternalModelResolver(ModelManager modelManager) { + this.modelManager = modelManager; + } + + public Model getModel(String modelName) { + return this.modelManager.resolveModel(modelName); + } + } + + public TypeBuilder(ObjectFactory of, ModelResolver mr) { + this.of = of; + this.mr = mr; + } + + public TypeBuilder(ModelManager modelManager) { + this.of = new ObjectFactory(); + this.mr = new InternalModelResolver(modelManager); + } + + public QName dataTypeToQName(DataType type) { + if (type instanceof NamedType) { + NamedType namedType = (NamedType)type; + ModelInfo modelInfo = mr.getModel(namedType.getNamespace()).getModelInfo(); + return new QName(modelInfo.getTargetUrl() != null ? modelInfo.getTargetUrl() : modelInfo.getUrl(), + namedType.getTarget() != null ? namedType.getTarget() : namedType.getSimpleName()); + } + + // ERROR: + throw new IllegalArgumentException("A named type is required in this context."); + } + + public Iterable dataTypesToTypeSpecifiers(Iterable types) { + ArrayList result = new ArrayList(); + for (DataType type : types) { + result.add(dataTypeToTypeSpecifier(type)); + } + return result; + } + + public TypeSpecifier dataTypeToTypeSpecifier(DataType type) { + // Convert the given type into an ELM TypeSpecifier representation. + if (type instanceof NamedType) { + return (TypeSpecifier)of.createNamedTypeSpecifier().withName(dataTypeToQName(type)).withResultType(type); + } + else if (type instanceof ListType) { + return listTypeToTypeSpecifier((ListType)type); + } + else if (type instanceof IntervalType) { + return intervalTypeToTypeSpecifier((IntervalType)type); + } + else if (type instanceof TupleType) { + return tupleTypeToTypeSpecifier((TupleType)type); + } + else if (type instanceof ChoiceType) { + return choiceTypeToTypeSpecifier((ChoiceType)type); + } + else if (type instanceof TypeParameter) { + return typeParameterToTypeSpecifier((TypeParameter)type); + } + else { + throw new IllegalArgumentException(String.format("Could not convert type %s to a type specifier.", type)); + } + } + + private TypeSpecifier listTypeToTypeSpecifier(ListType type) { + return (TypeSpecifier)of.createListTypeSpecifier() + .withElementType(dataTypeToTypeSpecifier(type.getElementType())) + .withResultType(type); + } + + private TypeSpecifier intervalTypeToTypeSpecifier(IntervalType type) { + return (TypeSpecifier)of.createIntervalTypeSpecifier() + .withPointType(dataTypeToTypeSpecifier(type.getPointType())) + .withResultType(type); + } + + private TypeSpecifier tupleTypeToTypeSpecifier(TupleType type) { + return (TypeSpecifier)of.createTupleTypeSpecifier() + .withElement(tupleTypeElementsToTupleElementDefinitions(type.getElements())) + .withResultType(type); + } + + private TupleElementDefinition[] tupleTypeElementsToTupleElementDefinitions(Iterable elements) { + List definitions = new ArrayList<>(); + + for (TupleTypeElement element : elements) { + definitions.add(of.createTupleElementDefinition() + .withName(element.getName()) + .withElementType(dataTypeToTypeSpecifier(element.getType()))); + } + + return definitions.toArray(new TupleElementDefinition[definitions.size()]); + } + + private TypeSpecifier choiceTypeToTypeSpecifier(ChoiceType type) { + return (TypeSpecifier)of.createChoiceTypeSpecifier() + .withChoice(choiceTypeTypesToTypeSpecifiers(type)) + .withResultType(type); + } + + private TypeSpecifier[] choiceTypeTypesToTypeSpecifiers(ChoiceType choiceType) { + List specifiers = new ArrayList<>(); + + for (DataType type : choiceType.getTypes()) { + specifiers.add(dataTypeToTypeSpecifier(type)); + } + + return specifiers.toArray(new TypeSpecifier[specifiers.size()]); + } + + private TypeSpecifier typeParameterToTypeSpecifier(TypeParameter type) { + return new ParameterTypeSpecifier().withParameterName(type.getIdentifier()); + } +} diff --git a/Src/java/cql-to-elm/src/main/java/org/cqframework/cql/cql2elm/model/Operator.java b/Src/java/cql-to-elm/src/main/java/org/cqframework/cql/cql2elm/model/Operator.java index 29ed9280e..3c2658b48 100644 --- a/Src/java/cql-to-elm/src/main/java/org/cqframework/cql/cql2elm/model/Operator.java +++ b/Src/java/cql-to-elm/src/main/java/org/cqframework/cql/cql2elm/model/Operator.java @@ -14,13 +14,17 @@ public static Operator fromFunctionDef(FunctionDef functionDef) { for (OperandDef operand : functionDef.getOperand()) { operandTypes.add(operand.getResultType()); } - return new Operator(functionDef.getName(), new Signature(operandTypes.toArray(new DataType[operandTypes.size()])), + return new Operator(functionDef, functionDef.getName(), new Signature(operandTypes.toArray(new DataType[operandTypes.size()])), functionDef.getResultType()).withAccessLevel(functionDef.getAccessLevel()) .withFluent(functionDef.isFluent() != null ? functionDef.isFluent() : false) .withExternal(functionDef.isExternal() != null ? functionDef.isExternal() : false); } public Operator(String name, Signature signature, DataType resultType) { + this(null, name, signature, resultType); + } + + public Operator(FunctionDef functionDef, String name, Signature signature, DataType resultType) { if (name == null || name.equals("")) { throw new IllegalArgumentException("name is null or empty"); } @@ -29,6 +33,7 @@ public Operator(String name, Signature signature, DataType resultType) { throw new IllegalArgumentException("signature is null"); } + this.functionDef = functionDef; this.name = name; this.signature = signature; this.resultType = resultType; @@ -84,6 +89,18 @@ public Operator withExternal(boolean isExternal) { return this; } + private FunctionDef functionDef; + public FunctionDef getFunctionDef() { + return this.functionDef; + } + public void setFunctionDef(FunctionDef functionDef) { + this.functionDef = functionDef; + } + public Operator withFunctionDef(FunctionDef functionDef) { + setFunctionDef(functionDef); + return this; + } + private String name; public String getName() { return this.name; diff --git a/Src/java/cql-to-elm/src/main/java/org/cqframework/cql/cql2elm/model/SystemLibraryHelper.java b/Src/java/cql-to-elm/src/main/java/org/cqframework/cql/cql2elm/model/SystemLibraryHelper.java index be9d00e51..f696b6432 100644 --- a/Src/java/cql-to-elm/src/main/java/org/cqframework/cql/cql2elm/model/SystemLibraryHelper.java +++ b/Src/java/cql-to-elm/src/main/java/org/cqframework/cql/cql2elm/model/SystemLibraryHelper.java @@ -1,33 +1,37 @@ package org.cqframework.cql.cql2elm.model; +import org.cqframework.cql.cql2elm.TypeBuilder; import org.hl7.cql.model.*; +import org.hl7.elm.r1.FunctionDef; +import org.hl7.elm.r1.OperandDef; +import org.hl7.elm.r1.TypeSpecifier; import org.hl7.elm.r1.VersionedIdentifier; public class SystemLibraryHelper { - public static TranslatedLibrary load(SystemModel systemModel) { + public static TranslatedLibrary load(SystemModel systemModel, TypeBuilder tb) { TranslatedLibrary system = new TranslatedLibrary(); system.setIdentifier(new VersionedIdentifier().withId("System").withVersion("1.0")); // Logical Operators - system.add(new Operator("And", new Signature(systemModel.getBoolean(), systemModel.getBoolean()), systemModel.getBoolean())); - system.add(new Operator("Or", new Signature(systemModel.getBoolean(), systemModel.getBoolean()), systemModel.getBoolean())); - system.add(new Operator("Xor", new Signature(systemModel.getBoolean(), systemModel.getBoolean()), systemModel.getBoolean())); - system.add(new Operator("Not", new Signature(systemModel.getBoolean()), systemModel.getBoolean())); + add(system, tb, new Operator("And", new Signature(systemModel.getBoolean(), systemModel.getBoolean()), systemModel.getBoolean())); + add(system, tb, new Operator("Or", new Signature(systemModel.getBoolean(), systemModel.getBoolean()), systemModel.getBoolean())); + add(system, tb, new Operator("Xor", new Signature(systemModel.getBoolean(), systemModel.getBoolean()), systemModel.getBoolean())); + add(system, tb, new Operator("Not", new Signature(systemModel.getBoolean()), systemModel.getBoolean())); // Nullological Operators - system.add(new Operator("IsNull", new Signature(systemModel.getAny()), systemModel.getBoolean())); - system.add(new Operator("IsTrue", new Signature(systemModel.getBoolean()), systemModel.getBoolean())); - system.add(new Operator("IsFalse", new Signature(systemModel.getBoolean()), systemModel.getBoolean())); + add(system, tb, new Operator("IsNull", new Signature(systemModel.getAny()), systemModel.getBoolean())); + add(system, tb, new Operator("IsTrue", new Signature(systemModel.getBoolean()), systemModel.getBoolean())); + add(system, tb, new Operator("IsFalse", new Signature(systemModel.getBoolean()), systemModel.getBoolean())); // Coalesce(list) // Coalesce(T, T) // Coalesce(T, T, T) // Coalesce(T, T, T, T) // Coalesce(T, T, T, T, T) - system.add(new GenericOperator("Coalesce", new Signature(new ListType(new TypeParameter("T"))), new TypeParameter("T"), new TypeParameter("T"))); - system.add(new GenericOperator("Coalesce", new Signature(new TypeParameter("T"), new TypeParameter("T")), new TypeParameter("T"), new TypeParameter("T"))); - system.add(new GenericOperator("Coalesce", new Signature(new TypeParameter("T"), new TypeParameter("T"), new TypeParameter("T")), new TypeParameter("T"), new TypeParameter("T"))); - system.add(new GenericOperator("Coalesce", new Signature(new TypeParameter("T"), new TypeParameter("T"), new TypeParameter("T"), new TypeParameter("T")), new TypeParameter("T"), new TypeParameter("T"))); - system.add(new GenericOperator("Coalesce", new Signature(new TypeParameter("T"), new TypeParameter("T"), new TypeParameter("T"), new TypeParameter("T"), new TypeParameter("T")), new TypeParameter("T"), new TypeParameter("T"))); + add(system, tb, new GenericOperator("Coalesce", new Signature(new ListType(new TypeParameter("T"))), new TypeParameter("T"), new TypeParameter("T"))); + add(system, tb, new GenericOperator("Coalesce", new Signature(new TypeParameter("T"), new TypeParameter("T")), new TypeParameter("T"), new TypeParameter("T"))); + add(system, tb, new GenericOperator("Coalesce", new Signature(new TypeParameter("T"), new TypeParameter("T"), new TypeParameter("T")), new TypeParameter("T"), new TypeParameter("T"))); + add(system, tb, new GenericOperator("Coalesce", new Signature(new TypeParameter("T"), new TypeParameter("T"), new TypeParameter("T"), new TypeParameter("T")), new TypeParameter("T"), new TypeParameter("T"))); + add(system, tb, new GenericOperator("Coalesce", new Signature(new TypeParameter("T"), new TypeParameter("T"), new TypeParameter("T"), new TypeParameter("T"), new TypeParameter("T")), new TypeParameter("T"), new TypeParameter("T"))); // Conversion Operators // ToString(Boolean) : String @@ -41,35 +45,35 @@ public static TranslatedLibrary load(SystemModel systemModel) { // ToString(Ratio) : String // ToString(String) : String Operator booleanToString = new Operator("ToString", new Signature(systemModel.getBoolean()), systemModel.getString()); - system.add(booleanToString); - system.add(new Conversion(booleanToString, false)); + add(system, tb, booleanToString); + add(system, tb, new Conversion(booleanToString, false)); Operator integerToString = new Operator("ToString", new Signature(systemModel.getInteger()), systemModel.getString()); - system.add(integerToString); - system.add(new Conversion(integerToString, false)); + add(system, tb, integerToString); + add(system, tb, new Conversion(integerToString, false)); Operator longToString = new Operator("ToString", new Signature(systemModel.getLong()), systemModel.getString()); - system.add(longToString); - system.add(new Conversion(longToString, false)); + add(system, tb, longToString); + add(system, tb, new Conversion(longToString, false)); Operator decimalToString = new Operator("ToString", new Signature(systemModel.getDecimal()), systemModel.getString()); - system.add(decimalToString); - system.add(new Conversion(decimalToString, false)); + add(system, tb, decimalToString); + add(system, tb, new Conversion(decimalToString, false)); Operator dateTimeToString = new Operator("ToString", new Signature(systemModel.getDateTime()), systemModel.getString()); - system.add(dateTimeToString); - system.add(new Conversion(dateTimeToString, false)); + add(system, tb, dateTimeToString); + add(system, tb, new Conversion(dateTimeToString, false)); Operator dateToString = new Operator("ToString", new Signature(systemModel.getDate()), systemModel.getString()); - system.add(dateToString); - system.add(new Conversion(dateToString, false)); + add(system, tb, dateToString); + add(system, tb, new Conversion(dateToString, false)); Operator timeToString = new Operator("ToString", new Signature(systemModel.getTime()), systemModel.getString()); - system.add(timeToString); - system.add(new Conversion(timeToString, false)); + add(system, tb, timeToString); + add(system, tb, new Conversion(timeToString, false)); Operator quantityToString = new Operator("ToString", new Signature(systemModel.getQuantity()), systemModel.getString()); - system.add(quantityToString); - system.add(new Conversion(quantityToString, false)); + add(system, tb, quantityToString); + add(system, tb, new Conversion(quantityToString, false)); Operator ratioToString = new Operator("ToString", new Signature(systemModel.getRatio()), systemModel.getString()); - system.add(ratioToString); - system.add(new Conversion(ratioToString, false)); + add(system, tb, ratioToString); + add(system, tb, new Conversion(ratioToString, false)); //Operator stringToString = new Operator("ToString", new Signature(systemModel.getString()), systemModel.getString()); - //system.add(stringToString); - //system.add(new Conversion(stringToString, false)); + //add(system, tb, stringToString); + //add(system, tb, new Conversion(stringToString, false)); // ToBoolean(Boolean) : Boolean // ToBoolean(Integer) : Boolean @@ -77,59 +81,59 @@ public static TranslatedLibrary load(SystemModel systemModel) { // ToBoolean(Long) : Boolean // ToBoolean(String) : Boolean Operator stringToBoolean = new Operator("ToBoolean", new Signature(systemModel.getString()), systemModel.getBoolean()); - system.add(stringToBoolean); - system.add(new Conversion(stringToBoolean, false)); + add(system, tb, stringToBoolean); + add(system, tb, new Conversion(stringToBoolean, false)); Operator integerToBoolean = new Operator("ToBoolean", new Signature(systemModel.getInteger()), systemModel.getBoolean()); - system.add(integerToBoolean); - system.add(new Conversion(integerToBoolean, false)); + add(system, tb, integerToBoolean); + add(system, tb, new Conversion(integerToBoolean, false)); Operator decimalToBoolean = new Operator("ToBoolean", new Signature(systemModel.getDecimal()), systemModel.getBoolean()); - system.add(decimalToBoolean); - system.add(new Conversion(decimalToBoolean, false)); + add(system, tb, decimalToBoolean); + add(system, tb, new Conversion(decimalToBoolean, false)); Operator longToBoolean = new Operator("ToBoolean", new Signature(systemModel.getLong()), systemModel.getBoolean()); - system.add(longToBoolean); - system.add(new Conversion(longToBoolean, false)); + add(system, tb, longToBoolean); + add(system, tb, new Conversion(longToBoolean, false)); //Operator booleanToBoolean = new Operator("ToBoolean", new Signature(systemModel.getBoolean()), systemModel.getBoolean()); - //system.add(booleanToBoolean); - //system.add(new Conversion(booleanToBoolean, false)); + //add(system, tb, booleanToBoolean); + //add(system, tb, new Conversion(booleanToBoolean, false)); // ToChars(String) : List(String) Operator toChars = new Operator("ToChars", new Signature(systemModel.getString()), new ListType(systemModel.getString())); - system.add(toChars); - system.add(new Conversion(toChars, false)); + add(system, tb, toChars); + add(system, tb, new Conversion(toChars, false)); // ToInteger(String) : Integer // ToInteger(Boolean) : Integer // ToInteger(Long) : Integer // ToInteger(Integer) : Integer Operator stringToInteger = new Operator("ToInteger", new Signature(systemModel.getString()), systemModel.getInteger()); - system.add(stringToInteger); - system.add(new Conversion(stringToInteger, false)); + add(system, tb, stringToInteger); + add(system, tb, new Conversion(stringToInteger, false)); Operator longToInteger = new Operator("ToInteger", new Signature(systemModel.getLong()), systemModel.getInteger()); - system.add(longToInteger); - system.add(new Conversion(longToInteger, false)); + add(system, tb, longToInteger); + add(system, tb, new Conversion(longToInteger, false)); Operator booleanToInteger = new Operator("ToInteger", new Signature(systemModel.getBoolean()), systemModel.getInteger()); - system.add(booleanToInteger); - system.add(new Conversion(booleanToInteger, false)); + add(system, tb, booleanToInteger); + add(system, tb, new Conversion(booleanToInteger, false)); //Operator integerToInteger = new Operator("ToInteger", new Signature(systemModel.getInteger()), systemModel.getInteger()); - //system.add(integerToInteger); - //system.add(new Conversion(integerToInteger, false)); + //add(system, tb, integerToInteger); + //add(system, tb, new Conversion(integerToInteger, false)); // ToLong(Boolean) : Long // ToLong(String) : Long // ToLong(Integer) : Long // ToLong(Long) : Long Operator stringToLong = new Operator("ToLong", new Signature(systemModel.getString()), systemModel.getLong()); - system.add(stringToLong); - system.add(new Conversion(stringToLong, false)); + add(system, tb, stringToLong); + add(system, tb, new Conversion(stringToLong, false)); Operator integerToLong = new Operator("ToLong", new Signature(systemModel.getInteger()), systemModel.getLong()); - system.add(integerToLong); - system.add(new Conversion(integerToLong, true)); + add(system, tb, integerToLong); + add(system, tb, new Conversion(integerToLong, true)); //Operator longToLong = new Operator("ToLong", new Signature(systemModel.getLong()), systemModel.getLong()); - //system.add(longToLong); - //system.add(new Conversion(longToLong, false)); + //add(system, tb, longToLong); + //add(system, tb, new Conversion(longToLong, false)); Operator booleanToLong = new Operator("ToLong", new Signature(systemModel.getBoolean()), systemModel.getLong()); - system.add(booleanToLong); - system.add(new Conversion(booleanToLong, false)); + add(system, tb, booleanToLong); + add(system, tb, new Conversion(booleanToLong, false)); // ToDecimal(Boolean) : Decimal // ToDecimal(String) : Decimal @@ -137,55 +141,55 @@ public static TranslatedLibrary load(SystemModel systemModel) { // ToDecimal(Long) : Decimal // ToDecimal(Decimal) : Decimal Operator stringToDecimal = new Operator("ToDecimal", new Signature(systemModel.getString()), systemModel.getDecimal()); - system.add(stringToDecimal); - system.add(new Conversion(stringToDecimal, false)); + add(system, tb, stringToDecimal); + add(system, tb, new Conversion(stringToDecimal, false)); Operator integerToDecimal = new Operator("ToDecimal", new Signature(systemModel.getInteger()), systemModel.getDecimal()); - system.add(integerToDecimal); - system.add(new Conversion(integerToDecimal, true)); + add(system, tb, integerToDecimal); + add(system, tb, new Conversion(integerToDecimal, true)); Operator longToDecimal = new Operator("ToDecimal", new Signature(systemModel.getLong()), systemModel.getDecimal()); - system.add(longToDecimal); - system.add(new Conversion(longToDecimal, true)); + add(system, tb, longToDecimal); + add(system, tb, new Conversion(longToDecimal, true)); //Operator decimalToDecimal = new Operator("ToDecimal", new Signature(systemModel.getDecimal()), systemModel.getDecimal()); - //system.add(decimalToDecimal); - //system.add(new Conversion(decimalToDecimal, false)); + //add(system, tb, decimalToDecimal); + //add(system, tb, new Conversion(decimalToDecimal, false)); Operator booleanToDecimal = new Operator("ToDecimal", new Signature(systemModel.getBoolean()), systemModel.getDecimal()); - system.add(booleanToDecimal); - system.add(new Conversion(booleanToDecimal, false)); + add(system, tb, booleanToDecimal); + add(system, tb, new Conversion(booleanToDecimal, false)); // ToDateTime(String) : DateTime // ToDateTime(Date) : DateTime // ToDateTime(DateTime) : DateTime Operator stringToDateTime = new Operator("ToDateTime", new Signature(systemModel.getString()), systemModel.getDateTime()); - system.add(stringToDateTime); - system.add(new Conversion(stringToDateTime, false)); + add(system, tb, stringToDateTime); + add(system, tb, new Conversion(stringToDateTime, false)); Operator dateToDateTime = new Operator("ToDateTime", new Signature(systemModel.getDate()), systemModel.getDateTime()); - system.add(dateToDateTime); - system.add(new Conversion(dateToDateTime, true)); + add(system, tb, dateToDateTime); + add(system, tb, new Conversion(dateToDateTime, true)); //Operator dateTimeToDateTime = new Operator("ToDateTime", new Signature(systemModel.getDateTime()), systemModel.getDateTime()); - //system.add(dateTimeToDateTime); - //system.add(new Conversion(dateTimeToDateTime, false)); + //add(system, tb, dateTimeToDateTime); + //add(system, tb, new Conversion(dateTimeToDateTime, false)); // ToDate(DateTime) : Date // ToDate(String) : Date // ToDate(Date) : Date Operator stringToDate = new Operator("ToDate", new Signature(systemModel.getString()), systemModel.getDate()); - system.add(stringToDate); - system.add(new Conversion(stringToDate, false)); + add(system, tb, stringToDate); + add(system, tb, new Conversion(stringToDate, false)); Operator dateTimeToDate = new Operator("ToDate", new Signature(systemModel.getDateTime()), systemModel.getDate()); - system.add(dateTimeToDate); - system.add(new Conversion(dateTimeToDate, false)); + add(system, tb, dateTimeToDate); + add(system, tb, new Conversion(dateTimeToDate, false)); //Operator dateToDate = new Operator("ToDate", new Signature(systemModel.getDate()), systemModel.getDate()); - //system.add(dateToDate); - //system.add(new Conversion(dateToDate, false)); + //add(system, tb, dateToDate); + //add(system, tb, new Conversion(dateToDate, false)); // ToTime(String) : Time // ToTime(Time) : Time Operator stringToTime = new Operator("ToTime", new Signature(systemModel.getString()), systemModel.getTime()); - system.add(stringToTime); - system.add(new Conversion(stringToTime, false)); + add(system, tb, stringToTime); + add(system, tb, new Conversion(stringToTime, false)); //Operator timeToTime = new Operator("ToTime", new Signature(systemModel.getTime()), systemModel.getTime()); - //system.add(timeToTime); - //system.add(new Conversion(timeToTime, false)); + //add(system, tb, timeToTime); + //add(system, tb, new Conversion(timeToTime, false)); // ToQuantity(String) : Quantity // ToQuantity(Integer) : Quantity @@ -193,564 +197,590 @@ public static TranslatedLibrary load(SystemModel systemModel) { // ToQuantity(Decimal) : Quantity // ToQuantity(Quantity) : Quantity Operator stringToQuantity = new Operator("ToQuantity", new Signature(systemModel.getString()), systemModel.getQuantity()); - system.add(stringToQuantity); - system.add(new Conversion(stringToQuantity, false)); + add(system, tb, stringToQuantity); + add(system, tb, new Conversion(stringToQuantity, false)); Operator ratioToQuantity = new Operator("ToQuantity", new Signature(systemModel.getRatio()), systemModel.getQuantity()); - system.add(ratioToQuantity); - system.add(new Conversion(ratioToQuantity, false)); + add(system, tb, ratioToQuantity); + add(system, tb, new Conversion(ratioToQuantity, false)); Operator integerToQuantity = new Operator("ToQuantity", new Signature(systemModel.getInteger()), systemModel.getQuantity()); - system.add(integerToQuantity); - system.add(new Conversion(integerToQuantity, true)); + add(system, tb, integerToQuantity); + add(system, tb, new Conversion(integerToQuantity, true)); Operator decimalToQuantity = new Operator("ToQuantity", new Signature(systemModel.getDecimal()), systemModel.getQuantity()); - system.add(decimalToQuantity); - system.add(new Conversion(decimalToQuantity, true)); + add(system, tb, decimalToQuantity); + add(system, tb, new Conversion(decimalToQuantity, true)); //Operator quantityToQuantity = new Operator("ToQuantity", new Signature(systemModel.getQuantity()), systemModel.getQuantity()); - //system.add(quantityToQuantity); - //system.add(new Conversion(quantityToQuantity, false)); + //add(system, tb, quantityToQuantity); + //add(system, tb, new Conversion(quantityToQuantity, false)); // ToRatio(String) : Ratio // ToRatio(Ratio) : Ratio Operator stringToRatio = new Operator("ToRatio", new Signature(systemModel.getString()), systemModel.getRatio()); - system.add(stringToRatio); - system.add(new Conversion(stringToRatio, false)); + add(system, tb, stringToRatio); + add(system, tb, new Conversion(stringToRatio, false)); //Operator ratioToRatio = new Operator("ToRatio", new Signature(systemModel.getRatio()), systemModel.getRatio()); - //system.add(ratioToRatio); - //system.add(new Conversion(ratioToRatio, false)); + //add(system, tb, ratioToRatio); + //add(system, tb, new Conversion(ratioToRatio, false)); // ConvertsToBoolean(Any): Boolean Operator convertsTo = new Operator("ConvertsToBoolean", new Signature(systemModel.getAny()), systemModel.getBoolean()); - system.add(convertsTo); + add(system, tb, convertsTo); // ConvertsToInteger(Any): Boolean convertsTo = new Operator("ConvertsToInteger", new Signature(systemModel.getAny()), systemModel.getBoolean()); - system.add(convertsTo); + add(system, tb, convertsTo); // ConvertsToLong(Any): Boolean convertsTo = new Operator("ConvertsToLong", new Signature(systemModel.getAny()), systemModel.getBoolean()); - system.add(convertsTo); + add(system, tb, convertsTo); // ConvertsToDecimal convertsTo = new Operator("ConvertsToDecimal", new Signature(systemModel.getAny()), systemModel.getBoolean()); - system.add(convertsTo); + add(system, tb, convertsTo); // ConvertsToDateTime convertsTo = new Operator("ConvertsToDateTime", new Signature(systemModel.getAny()), systemModel.getBoolean()); - system.add(convertsTo); + add(system, tb, convertsTo); // ConvertsToDate convertsTo = new Operator("ConvertsToDate", new Signature(systemModel.getAny()), systemModel.getBoolean()); - system.add(convertsTo); + add(system, tb, convertsTo); // ConvertsToTime convertsTo = new Operator("ConvertsToTime", new Signature(systemModel.getAny()), systemModel.getBoolean()); - system.add(convertsTo); + add(system, tb, convertsTo); // ConvertsToString convertsTo = new Operator("ConvertsToString", new Signature(systemModel.getAny()), systemModel.getBoolean()); - system.add(convertsTo); + add(system, tb, convertsTo); // ConvertsToQuantity convertsTo = new Operator("ConvertsToQuantity", new Signature(systemModel.getAny()), systemModel.getBoolean()); - system.add(convertsTo); + add(system, tb, convertsTo); // ConvertsToRatio convertsTo = new Operator("ConvertsToRatio", new Signature(systemModel.getAny()), systemModel.getBoolean()); - system.add(convertsTo); + add(system, tb, convertsTo); // CanConvertQuantity Operator canConvertToQuantity = new Operator("CanConvertQuantity", new Signature(systemModel.getQuantity(), systemModel.getString()), systemModel.getBoolean()); - system.add(canConvertToQuantity); + add(system, tb, canConvertToQuantity); // ConvertQuantity Operator convertToQuantity = new Operator("ConvertQuantity", new Signature(systemModel.getQuantity(), systemModel.getString()), systemModel.getQuantity()); - system.add(convertToQuantity); + add(system, tb, convertToQuantity); // Comparison Operators // Equal(T, T) : Boolean //TypeParameter T = new TypeParameter("T", TypeParameter.TypeParameterConstraint.VALUE, null); - //system.add(new GenericOperator("Equal", new Signature(T, T), systemModel.getBoolean(), T)); + //add(system, tb, new GenericOperator("Equal", new Signature(T, T), systemModel.getBoolean(), T)); // Equal(C, C) : Boolean TypeParameter C = new TypeParameter("C", TypeParameter.TypeParameterConstraint.CLASS, null); - system.add(new GenericOperator("Equal", new Signature(C, C), systemModel.getBoolean(), C)); + add(system, tb, new GenericOperator("Equal", new Signature(C, C), systemModel.getBoolean(), C)); // Equal(R, R) : Boolean TypeParameter R = new TypeParameter("R", TypeParameter.TypeParameterConstraint.TUPLE, null); - system.add(new GenericOperator("Equal", new Signature(R, R), systemModel.getBoolean(), R)); + add(system, tb, new GenericOperator("Equal", new Signature(R, R), systemModel.getBoolean(), R)); // Equal(H, H) : Boolean TypeParameter H = new TypeParameter("H", TypeParameter.TypeParameterConstraint.CHOICE, null); - system.add(new GenericOperator("Equal", new Signature(H, H), systemModel.getBoolean(), H)); + add(system, tb, new GenericOperator("Equal", new Signature(H, H), systemModel.getBoolean(), H)); // Equal(Any, Any) : Boolean - //system.add(new Operator("Equal", new Signature(systemModel.getAny(), systemModel.getAny()), systemModel.getBoolean())); + //add(system, tb, new Operator("Equal", new Signature(systemModel.getAny(), systemModel.getAny()), systemModel.getBoolean())); // Equivalent(T, T) : Boolean //T = new TypeParameter("T", TypeParameter.TypeParameterConstraint.VALUE, null); - //system.add(new GenericOperator("Equivalent", new Signature(T, T), systemModel.getBoolean(), T)); + //add(system, tb, new GenericOperator("Equivalent", new Signature(T, T), systemModel.getBoolean(), T)); // Equivalent(C, C) : Boolean C = new TypeParameter("C", TypeParameter.TypeParameterConstraint.CLASS, null); - system.add(new GenericOperator("Equivalent", new Signature(C, C), systemModel.getBoolean(), C)); + add(system, tb, new GenericOperator("Equivalent", new Signature(C, C), systemModel.getBoolean(), C)); // Equivalent(R, R) : Boolean R = new TypeParameter("R", TypeParameter.TypeParameterConstraint.TUPLE, null); - system.add(new GenericOperator("Equivalent", new Signature(R, R), systemModel.getBoolean(), R)); + add(system, tb, new GenericOperator("Equivalent", new Signature(R, R), systemModel.getBoolean(), R)); // Equivalent(H, H) : Boolean H = new TypeParameter("H", TypeParameter.TypeParameterConstraint.CHOICE, null); - system.add(new GenericOperator("Equivalent", new Signature(H, H), systemModel.getBoolean(), H)); + add(system, tb, new GenericOperator("Equivalent", new Signature(H, H), systemModel.getBoolean(), H)); // Equivalent(Any, Any) : Boolean - //system.add(new Operator("Equivalent", new Signature(systemModel.getAny(), systemModel.getAny()), systemModel.getBoolean())); - - system.add(new Operator("Equal", new Signature(systemModel.getBoolean(), systemModel.getBoolean()), systemModel.getBoolean())); - system.add(new Operator("Equivalent", new Signature(systemModel.getBoolean(), systemModel.getBoolean()), systemModel.getBoolean())); - system.add(new Operator("Equal", new Signature(systemModel.getInteger(), systemModel.getInteger()), systemModel.getBoolean())); - system.add(new Operator("Equivalent", new Signature(systemModel.getInteger(), systemModel.getInteger()), systemModel.getBoolean())); - system.add(new Operator("Less", new Signature(systemModel.getInteger(), systemModel.getInteger()), systemModel.getBoolean())); - system.add(new Operator("LessOrEqual", new Signature(systemModel.getInteger(), systemModel.getInteger()), systemModel.getBoolean())); - system.add(new Operator("Greater", new Signature(systemModel.getInteger(), systemModel.getInteger()), systemModel.getBoolean())); - system.add(new Operator("GreaterOrEqual", new Signature(systemModel.getInteger(), systemModel.getInteger()), systemModel.getBoolean())); - system.add(new Operator("Equal", new Signature(systemModel.getLong(), systemModel.getLong()), systemModel.getBoolean())); - system.add(new Operator("Equivalent", new Signature(systemModel.getLong(), systemModel.getLong()), systemModel.getBoolean())); - system.add(new Operator("Less", new Signature(systemModel.getLong(), systemModel.getLong()), systemModel.getBoolean())); - system.add(new Operator("LessOrEqual", new Signature(systemModel.getLong(), systemModel.getLong()), systemModel.getBoolean())); - system.add(new Operator("Greater", new Signature(systemModel.getLong(), systemModel.getLong()), systemModel.getBoolean())); - system.add(new Operator("GreaterOrEqual", new Signature(systemModel.getLong(), systemModel.getLong()), systemModel.getBoolean())); - system.add(new Operator("Equal", new Signature(systemModel.getDecimal(), systemModel.getDecimal()), systemModel.getBoolean())); - system.add(new Operator("Equivalent", new Signature(systemModel.getDecimal(), systemModel.getDecimal()), systemModel.getBoolean())); - system.add(new Operator("Less", new Signature(systemModel.getDecimal(), systemModel.getDecimal()), systemModel.getBoolean())); - system.add(new Operator("LessOrEqual", new Signature(systemModel.getDecimal(), systemModel.getDecimal()), systemModel.getBoolean())); - system.add(new Operator("Greater", new Signature(systemModel.getDecimal(), systemModel.getDecimal()), systemModel.getBoolean())); - system.add(new Operator("GreaterOrEqual", new Signature(systemModel.getDecimal(), systemModel.getDecimal()), systemModel.getBoolean())); - system.add(new Operator("Equal", new Signature(systemModel.getString(), systemModel.getString()), systemModel.getBoolean())); - system.add(new Operator("Equivalent", new Signature(systemModel.getString(), systemModel.getString()), systemModel.getBoolean())); - system.add(new Operator("Less", new Signature(systemModel.getString(), systemModel.getString()), systemModel.getBoolean())); - system.add(new Operator("LessOrEqual", new Signature(systemModel.getString(), systemModel.getString()), systemModel.getBoolean())); - system.add(new Operator("Greater", new Signature(systemModel.getString(), systemModel.getString()), systemModel.getBoolean())); - system.add(new Operator("GreaterOrEqual", new Signature(systemModel.getString(), systemModel.getString()), systemModel.getBoolean())); - system.add(new Operator("Equal", new Signature(systemModel.getDateTime(), systemModel.getDateTime()), systemModel.getBoolean())); - system.add(new Operator("Equivalent", new Signature(systemModel.getDateTime(), systemModel.getDateTime()), systemModel.getBoolean())); - system.add(new Operator("Less", new Signature(systemModel.getDateTime(), systemModel.getDateTime()), systemModel.getBoolean())); - system.add(new Operator("LessOrEqual", new Signature(systemModel.getDateTime(), systemModel.getDateTime()), systemModel.getBoolean())); - system.add(new Operator("Greater", new Signature(systemModel.getDateTime(), systemModel.getDateTime()), systemModel.getBoolean())); - system.add(new Operator("GreaterOrEqual", new Signature(systemModel.getDateTime(), systemModel.getDateTime()), systemModel.getBoolean())); - system.add(new Operator("Equal", new Signature(systemModel.getDate(), systemModel.getDate()), systemModel.getBoolean())); - system.add(new Operator("Equivalent", new Signature(systemModel.getDate(), systemModel.getDate()), systemModel.getBoolean())); - system.add(new Operator("Less", new Signature(systemModel.getDate(), systemModel.getDate()), systemModel.getBoolean())); - system.add(new Operator("LessOrEqual", new Signature(systemModel.getDate(), systemModel.getDate()), systemModel.getBoolean())); - system.add(new Operator("Greater", new Signature(systemModel.getDate(), systemModel.getDate()), systemModel.getBoolean())); - system.add(new Operator("GreaterOrEqual", new Signature(systemModel.getDate(), systemModel.getDate()), systemModel.getBoolean())); - system.add(new Operator("Equal", new Signature(systemModel.getTime(), systemModel.getTime()), systemModel.getBoolean())); - system.add(new Operator("Equivalent", new Signature(systemModel.getTime(), systemModel.getTime()), systemModel.getBoolean())); - system.add(new Operator("Less", new Signature(systemModel.getTime(), systemModel.getTime()), systemModel.getBoolean())); - system.add(new Operator("LessOrEqual", new Signature(systemModel.getTime(), systemModel.getTime()), systemModel.getBoolean())); - system.add(new Operator("Greater", new Signature(systemModel.getTime(), systemModel.getTime()), systemModel.getBoolean())); - system.add(new Operator("GreaterOrEqual", new Signature(systemModel.getTime(), systemModel.getTime()), systemModel.getBoolean())); - system.add(new Operator("Equal", new Signature(systemModel.getQuantity(), systemModel.getQuantity()), systemModel.getBoolean())); - system.add(new Operator("Equivalent", new Signature(systemModel.getQuantity(), systemModel.getQuantity()), systemModel.getBoolean())); - system.add(new Operator("Less", new Signature(systemModel.getQuantity(), systemModel.getQuantity()), systemModel.getBoolean())); - system.add(new Operator("LessOrEqual", new Signature(systemModel.getQuantity(), systemModel.getQuantity()), systemModel.getBoolean())); - system.add(new Operator("Greater", new Signature(systemModel.getQuantity(), systemModel.getQuantity()), systemModel.getBoolean())); - system.add(new Operator("GreaterOrEqual", new Signature(systemModel.getQuantity(), systemModel.getQuantity()), systemModel.getBoolean())); - system.add(new Operator("Equal", new Signature(systemModel.getRatio(), systemModel.getRatio()), systemModel.getBoolean())); - system.add(new Operator("Equivalent", new Signature(systemModel.getRatio(), systemModel.getRatio()), systemModel.getBoolean())); - system.add(new Operator("Equal", new Signature(systemModel.getCode(), systemModel.getCode()), systemModel.getBoolean())); - system.add(new Operator("Equivalent", new Signature(systemModel.getCode(), systemModel.getCode()), systemModel.getBoolean())); - system.add(new Operator("Equal", new Signature(systemModel.getConcept(), systemModel.getConcept()), systemModel.getBoolean())); - system.add(new Operator("Equivalent", new Signature(systemModel.getConcept(), systemModel.getConcept()), systemModel.getBoolean())); + //add(system, tb, new Operator("Equivalent", new Signature(systemModel.getAny(), systemModel.getAny()), systemModel.getBoolean())); + + add(system, tb, new Operator("Equal", new Signature(systemModel.getBoolean(), systemModel.getBoolean()), systemModel.getBoolean())); + add(system, tb, new Operator("Equivalent", new Signature(systemModel.getBoolean(), systemModel.getBoolean()), systemModel.getBoolean())); + add(system, tb, new Operator("Equal", new Signature(systemModel.getInteger(), systemModel.getInteger()), systemModel.getBoolean())); + add(system, tb, new Operator("Equivalent", new Signature(systemModel.getInteger(), systemModel.getInteger()), systemModel.getBoolean())); + add(system, tb, new Operator("Less", new Signature(systemModel.getInteger(), systemModel.getInteger()), systemModel.getBoolean())); + add(system, tb, new Operator("LessOrEqual", new Signature(systemModel.getInteger(), systemModel.getInteger()), systemModel.getBoolean())); + add(system, tb, new Operator("Greater", new Signature(systemModel.getInteger(), systemModel.getInteger()), systemModel.getBoolean())); + add(system, tb, new Operator("GreaterOrEqual", new Signature(systemModel.getInteger(), systemModel.getInteger()), systemModel.getBoolean())); + add(system, tb, new Operator("Equal", new Signature(systemModel.getLong(), systemModel.getLong()), systemModel.getBoolean())); + add(system, tb, new Operator("Equivalent", new Signature(systemModel.getLong(), systemModel.getLong()), systemModel.getBoolean())); + add(system, tb, new Operator("Less", new Signature(systemModel.getLong(), systemModel.getLong()), systemModel.getBoolean())); + add(system, tb, new Operator("LessOrEqual", new Signature(systemModel.getLong(), systemModel.getLong()), systemModel.getBoolean())); + add(system, tb, new Operator("Greater", new Signature(systemModel.getLong(), systemModel.getLong()), systemModel.getBoolean())); + add(system, tb, new Operator("GreaterOrEqual", new Signature(systemModel.getLong(), systemModel.getLong()), systemModel.getBoolean())); + add(system, tb, new Operator("Equal", new Signature(systemModel.getDecimal(), systemModel.getDecimal()), systemModel.getBoolean())); + add(system, tb, new Operator("Equivalent", new Signature(systemModel.getDecimal(), systemModel.getDecimal()), systemModel.getBoolean())); + add(system, tb, new Operator("Less", new Signature(systemModel.getDecimal(), systemModel.getDecimal()), systemModel.getBoolean())); + add(system, tb, new Operator("LessOrEqual", new Signature(systemModel.getDecimal(), systemModel.getDecimal()), systemModel.getBoolean())); + add(system, tb, new Operator("Greater", new Signature(systemModel.getDecimal(), systemModel.getDecimal()), systemModel.getBoolean())); + add(system, tb, new Operator("GreaterOrEqual", new Signature(systemModel.getDecimal(), systemModel.getDecimal()), systemModel.getBoolean())); + add(system, tb, new Operator("Equal", new Signature(systemModel.getString(), systemModel.getString()), systemModel.getBoolean())); + add(system, tb, new Operator("Equivalent", new Signature(systemModel.getString(), systemModel.getString()), systemModel.getBoolean())); + add(system, tb, new Operator("Less", new Signature(systemModel.getString(), systemModel.getString()), systemModel.getBoolean())); + add(system, tb, new Operator("LessOrEqual", new Signature(systemModel.getString(), systemModel.getString()), systemModel.getBoolean())); + add(system, tb, new Operator("Greater", new Signature(systemModel.getString(), systemModel.getString()), systemModel.getBoolean())); + add(system, tb, new Operator("GreaterOrEqual", new Signature(systemModel.getString(), systemModel.getString()), systemModel.getBoolean())); + add(system, tb, new Operator("Equal", new Signature(systemModel.getDateTime(), systemModel.getDateTime()), systemModel.getBoolean())); + add(system, tb, new Operator("Equivalent", new Signature(systemModel.getDateTime(), systemModel.getDateTime()), systemModel.getBoolean())); + add(system, tb, new Operator("Less", new Signature(systemModel.getDateTime(), systemModel.getDateTime()), systemModel.getBoolean())); + add(system, tb, new Operator("LessOrEqual", new Signature(systemModel.getDateTime(), systemModel.getDateTime()), systemModel.getBoolean())); + add(system, tb, new Operator("Greater", new Signature(systemModel.getDateTime(), systemModel.getDateTime()), systemModel.getBoolean())); + add(system, tb, new Operator("GreaterOrEqual", new Signature(systemModel.getDateTime(), systemModel.getDateTime()), systemModel.getBoolean())); + add(system, tb, new Operator("Equal", new Signature(systemModel.getDate(), systemModel.getDate()), systemModel.getBoolean())); + add(system, tb, new Operator("Equivalent", new Signature(systemModel.getDate(), systemModel.getDate()), systemModel.getBoolean())); + add(system, tb, new Operator("Less", new Signature(systemModel.getDate(), systemModel.getDate()), systemModel.getBoolean())); + add(system, tb, new Operator("LessOrEqual", new Signature(systemModel.getDate(), systemModel.getDate()), systemModel.getBoolean())); + add(system, tb, new Operator("Greater", new Signature(systemModel.getDate(), systemModel.getDate()), systemModel.getBoolean())); + add(system, tb, new Operator("GreaterOrEqual", new Signature(systemModel.getDate(), systemModel.getDate()), systemModel.getBoolean())); + add(system, tb, new Operator("Equal", new Signature(systemModel.getTime(), systemModel.getTime()), systemModel.getBoolean())); + add(system, tb, new Operator("Equivalent", new Signature(systemModel.getTime(), systemModel.getTime()), systemModel.getBoolean())); + add(system, tb, new Operator("Less", new Signature(systemModel.getTime(), systemModel.getTime()), systemModel.getBoolean())); + add(system, tb, new Operator("LessOrEqual", new Signature(systemModel.getTime(), systemModel.getTime()), systemModel.getBoolean())); + add(system, tb, new Operator("Greater", new Signature(systemModel.getTime(), systemModel.getTime()), systemModel.getBoolean())); + add(system, tb, new Operator("GreaterOrEqual", new Signature(systemModel.getTime(), systemModel.getTime()), systemModel.getBoolean())); + add(system, tb, new Operator("Equal", new Signature(systemModel.getQuantity(), systemModel.getQuantity()), systemModel.getBoolean())); + add(system, tb, new Operator("Equivalent", new Signature(systemModel.getQuantity(), systemModel.getQuantity()), systemModel.getBoolean())); + add(system, tb, new Operator("Less", new Signature(systemModel.getQuantity(), systemModel.getQuantity()), systemModel.getBoolean())); + add(system, tb, new Operator("LessOrEqual", new Signature(systemModel.getQuantity(), systemModel.getQuantity()), systemModel.getBoolean())); + add(system, tb, new Operator("Greater", new Signature(systemModel.getQuantity(), systemModel.getQuantity()), systemModel.getBoolean())); + add(system, tb, new Operator("GreaterOrEqual", new Signature(systemModel.getQuantity(), systemModel.getQuantity()), systemModel.getBoolean())); + add(system, tb, new Operator("Equal", new Signature(systemModel.getRatio(), systemModel.getRatio()), systemModel.getBoolean())); + add(system, tb, new Operator("Equivalent", new Signature(systemModel.getRatio(), systemModel.getRatio()), systemModel.getBoolean())); + add(system, tb, new Operator("Equal", new Signature(systemModel.getCode(), systemModel.getCode()), systemModel.getBoolean())); + add(system, tb, new Operator("Equivalent", new Signature(systemModel.getCode(), systemModel.getCode()), systemModel.getBoolean())); + add(system, tb, new Operator("Equal", new Signature(systemModel.getConcept(), systemModel.getConcept()), systemModel.getBoolean())); + add(system, tb, new Operator("Equivalent", new Signature(systemModel.getConcept(), systemModel.getConcept()), systemModel.getBoolean())); // Arithmetic Operators - system.add(new Operator("Abs", new Signature(systemModel.getInteger()), systemModel.getInteger())); - system.add(new Operator("Abs", new Signature(systemModel.getLong()), systemModel.getLong())); - system.add(new Operator("Abs", new Signature(systemModel.getDecimal()), systemModel.getDecimal())); - system.add(new Operator("Abs", new Signature(systemModel.getQuantity()), systemModel.getQuantity())); + add(system, tb, new Operator("Abs", new Signature(systemModel.getInteger()), systemModel.getInteger())); + add(system, tb, new Operator("Abs", new Signature(systemModel.getLong()), systemModel.getLong())); + add(system, tb, new Operator("Abs", new Signature(systemModel.getDecimal()), systemModel.getDecimal())); + add(system, tb, new Operator("Abs", new Signature(systemModel.getQuantity()), systemModel.getQuantity())); - system.add(new Operator("Add", new Signature(systemModel.getInteger(), systemModel.getInteger()), systemModel.getInteger())); - system.add(new Operator("Add", new Signature(systemModel.getLong(), systemModel.getLong()), systemModel.getLong())); - system.add(new Operator("Add", new Signature(systemModel.getDecimal(), systemModel.getDecimal()), systemModel.getDecimal())); - system.add(new Operator("Add", new Signature(systemModel.getQuantity(), systemModel.getQuantity()), systemModel.getQuantity())); + add(system, tb, new Operator("Add", new Signature(systemModel.getInteger(), systemModel.getInteger()), systemModel.getInteger())); + add(system, tb, new Operator("Add", new Signature(systemModel.getLong(), systemModel.getLong()), systemModel.getLong())); + add(system, tb, new Operator("Add", new Signature(systemModel.getDecimal(), systemModel.getDecimal()), systemModel.getDecimal())); + add(system, tb, new Operator("Add", new Signature(systemModel.getQuantity(), systemModel.getQuantity()), systemModel.getQuantity())); - system.add(new Operator("Ceiling", new Signature(systemModel.getDecimal()), systemModel.getInteger())); + add(system, tb, new Operator("Ceiling", new Signature(systemModel.getDecimal()), systemModel.getInteger())); - system.add(new Operator("Divide", new Signature(systemModel.getDecimal(), systemModel.getDecimal()), systemModel.getDecimal())); - //system.add(new Operator("Divide", new Signature(systemModel.getQuantity(), systemModel.getDecimal()), systemModel.getQuantity())); - system.add(new Operator("Divide", new Signature(systemModel.getQuantity(), systemModel.getQuantity()), systemModel.getQuantity())); + add(system, tb, new Operator("Divide", new Signature(systemModel.getDecimal(), systemModel.getDecimal()), systemModel.getDecimal())); + //add(system, tb, new Operator("Divide", new Signature(systemModel.getQuantity(), systemModel.getDecimal()), systemModel.getQuantity())); + add(system, tb, new Operator("Divide", new Signature(systemModel.getQuantity(), systemModel.getQuantity()), systemModel.getQuantity())); - system.add(new Operator("Exp", new Signature(systemModel.getDecimal()), systemModel.getDecimal())); + add(system, tb, new Operator("Exp", new Signature(systemModel.getDecimal()), systemModel.getDecimal())); - system.add(new Operator("Floor", new Signature(systemModel.getDecimal()), systemModel.getInteger())); + add(system, tb, new Operator("Floor", new Signature(systemModel.getDecimal()), systemModel.getInteger())); - system.add(new Operator("HighBoundary", new Signature(systemModel.getDecimal(), systemModel.getInteger()), systemModel.getDecimal())); - system.add(new Operator("HighBoundary", new Signature(systemModel.getDate(), systemModel.getInteger()), systemModel.getDate())); - system.add(new Operator("HighBoundary", new Signature(systemModel.getDateTime(), systemModel.getInteger()), systemModel.getDateTime())); - system.add(new Operator("HighBoundary", new Signature(systemModel.getTime(), systemModel.getInteger()), systemModel.getTime())); + add(system, tb, new Operator("HighBoundary", new Signature(systemModel.getDecimal(), systemModel.getInteger()), systemModel.getDecimal())); + add(system, tb, new Operator("HighBoundary", new Signature(systemModel.getDate(), systemModel.getInteger()), systemModel.getDate())); + add(system, tb, new Operator("HighBoundary", new Signature(systemModel.getDateTime(), systemModel.getInteger()), systemModel.getDateTime())); + add(system, tb, new Operator("HighBoundary", new Signature(systemModel.getTime(), systemModel.getInteger()), systemModel.getTime())); - system.add(new Operator("Log", new Signature(systemModel.getDecimal(), systemModel.getDecimal()), systemModel.getDecimal())); + add(system, tb, new Operator("Log", new Signature(systemModel.getDecimal(), systemModel.getDecimal()), systemModel.getDecimal())); - system.add(new Operator("LowBoundary", new Signature(systemModel.getDecimal(), systemModel.getInteger()), systemModel.getDecimal())); - system.add(new Operator("LowBoundary", new Signature(systemModel.getDate(), systemModel.getInteger()), systemModel.getDate())); - system.add(new Operator("LowBoundary", new Signature(systemModel.getDateTime(), systemModel.getInteger()), systemModel.getDateTime())); - system.add(new Operator("LowBoundary", new Signature(systemModel.getTime(), systemModel.getInteger()), systemModel.getTime())); + add(system, tb, new Operator("LowBoundary", new Signature(systemModel.getDecimal(), systemModel.getInteger()), systemModel.getDecimal())); + add(system, tb, new Operator("LowBoundary", new Signature(systemModel.getDate(), systemModel.getInteger()), systemModel.getDate())); + add(system, tb, new Operator("LowBoundary", new Signature(systemModel.getDateTime(), systemModel.getInteger()), systemModel.getDateTime())); + add(system, tb, new Operator("LowBoundary", new Signature(systemModel.getTime(), systemModel.getInteger()), systemModel.getTime())); - system.add(new Operator("Ln", new Signature(systemModel.getDecimal()), systemModel.getDecimal())); + add(system, tb, new Operator("Ln", new Signature(systemModel.getDecimal()), systemModel.getDecimal())); // MaxValue() : T // MinValue() : T - system.add(new Operator("Modulo", new Signature(systemModel.getInteger(), systemModel.getInteger()), systemModel.getInteger())); - system.add(new Operator("Modulo", new Signature(systemModel.getLong(), systemModel.getLong()), systemModel.getLong())); - system.add(new Operator("Modulo", new Signature(systemModel.getDecimal(), systemModel.getDecimal()), systemModel.getDecimal())); - system.add(new Operator("Modulo", new Signature(systemModel.getQuantity(), systemModel.getQuantity()), systemModel.getQuantity())); - - system.add(new Operator("Multiply", new Signature(systemModel.getInteger(), systemModel.getInteger()), systemModel.getInteger())); - system.add(new Operator("Multiply", new Signature(systemModel.getLong(), systemModel.getLong()), systemModel.getLong())); - system.add(new Operator("Multiply", new Signature(systemModel.getDecimal(), systemModel.getDecimal()), systemModel.getDecimal())); - system.add(new Operator("Multiply", new Signature(systemModel.getQuantity(), systemModel.getQuantity()), systemModel.getQuantity())); - - system.add(new Operator("Negate", new Signature(systemModel.getInteger()), systemModel.getInteger())); - system.add(new Operator("Negate", new Signature(systemModel.getLong()), systemModel.getLong())); - system.add(new Operator("Negate", new Signature(systemModel.getDecimal()), systemModel.getDecimal())); - system.add(new Operator("Negate", new Signature(systemModel.getQuantity()), systemModel.getQuantity())); - - system.add(new Operator("Precision", new Signature(systemModel.getDecimal()), systemModel.getInteger())); - system.add(new Operator("Precision", new Signature(systemModel.getDate()), systemModel.getInteger())); - system.add(new Operator("Precision", new Signature(systemModel.getDateTime()), systemModel.getInteger())); - system.add(new Operator("Precision", new Signature(systemModel.getTime()), systemModel.getInteger())); - - system.add(new Operator("Predecessor", new Signature(systemModel.getInteger()), systemModel.getInteger())); - system.add(new Operator("Predecessor", new Signature(systemModel.getLong()), systemModel.getLong())); - system.add(new Operator("Predecessor", new Signature(systemModel.getDecimal()), systemModel.getDecimal())); - system.add(new Operator("Predecessor", new Signature(systemModel.getDate()), systemModel.getDate())); - system.add(new Operator("Predecessor", new Signature(systemModel.getDateTime()), systemModel.getDateTime())); - system.add(new Operator("Predecessor", new Signature(systemModel.getTime()), systemModel.getTime())); - system.add(new Operator("Predecessor", new Signature(systemModel.getQuantity()), systemModel.getQuantity())); - - system.add(new Operator("Power", new Signature(systemModel.getInteger(), systemModel.getInteger()), systemModel.getInteger())); - system.add(new Operator("Power", new Signature(systemModel.getLong(), systemModel.getLong()), systemModel.getLong())); - system.add(new Operator("Power", new Signature(systemModel.getDecimal(), systemModel.getDecimal()), systemModel.getDecimal())); - - system.add(new Operator("Round", new Signature(systemModel.getDecimal()), systemModel.getDecimal())); - system.add(new Operator("Round", new Signature(systemModel.getDecimal(), systemModel.getInteger()), systemModel.getDecimal())); - - system.add(new Operator("Subtract", new Signature(systemModel.getInteger(), systemModel.getInteger()), systemModel.getInteger())); - system.add(new Operator("Subtract", new Signature(systemModel.getLong(), systemModel.getLong()), systemModel.getLong())); - system.add(new Operator("Subtract", new Signature(systemModel.getDecimal(), systemModel.getDecimal()), systemModel.getDecimal())); - system.add(new Operator("Subtract", new Signature(systemModel.getQuantity(), systemModel.getQuantity()), systemModel.getQuantity())); - - system.add(new Operator("Successor", new Signature(systemModel.getInteger()), systemModel.getInteger())); - system.add(new Operator("Successor", new Signature(systemModel.getLong()), systemModel.getLong())); - system.add(new Operator("Successor", new Signature(systemModel.getDecimal()), systemModel.getDecimal())); - system.add(new Operator("Successor", new Signature(systemModel.getDate()), systemModel.getDate())); - system.add(new Operator("Successor", new Signature(systemModel.getDateTime()), systemModel.getDateTime())); - system.add(new Operator("Successor", new Signature(systemModel.getTime()), systemModel.getTime())); - system.add(new Operator("Successor", new Signature(systemModel.getQuantity()), systemModel.getQuantity())); - - system.add(new Operator("Truncate", new Signature(systemModel.getDecimal()), systemModel.getInteger())); - - system.add(new Operator("TruncatedDivide", new Signature(systemModel.getInteger(), systemModel.getInteger()), systemModel.getInteger())); - system.add(new Operator("TruncatedDivide", new Signature(systemModel.getLong(), systemModel.getLong()), systemModel.getLong())); - system.add(new Operator("TruncatedDivide", new Signature(systemModel.getDecimal(), systemModel.getDecimal()), systemModel.getDecimal())); - system.add(new Operator("TruncatedDivide", new Signature(systemModel.getQuantity(), systemModel.getQuantity()), systemModel.getQuantity())); + add(system, tb, new Operator("Modulo", new Signature(systemModel.getInteger(), systemModel.getInteger()), systemModel.getInteger())); + add(system, tb, new Operator("Modulo", new Signature(systemModel.getLong(), systemModel.getLong()), systemModel.getLong())); + add(system, tb, new Operator("Modulo", new Signature(systemModel.getDecimal(), systemModel.getDecimal()), systemModel.getDecimal())); + add(system, tb, new Operator("Modulo", new Signature(systemModel.getQuantity(), systemModel.getQuantity()), systemModel.getQuantity())); + + add(system, tb, new Operator("Multiply", new Signature(systemModel.getInteger(), systemModel.getInteger()), systemModel.getInteger())); + add(system, tb, new Operator("Multiply", new Signature(systemModel.getLong(), systemModel.getLong()), systemModel.getLong())); + add(system, tb, new Operator("Multiply", new Signature(systemModel.getDecimal(), systemModel.getDecimal()), systemModel.getDecimal())); + add(system, tb, new Operator("Multiply", new Signature(systemModel.getQuantity(), systemModel.getQuantity()), systemModel.getQuantity())); + + add(system, tb, new Operator("Negate", new Signature(systemModel.getInteger()), systemModel.getInteger())); + add(system, tb, new Operator("Negate", new Signature(systemModel.getLong()), systemModel.getLong())); + add(system, tb, new Operator("Negate", new Signature(systemModel.getDecimal()), systemModel.getDecimal())); + add(system, tb, new Operator("Negate", new Signature(systemModel.getQuantity()), systemModel.getQuantity())); + + add(system, tb, new Operator("Precision", new Signature(systemModel.getDecimal()), systemModel.getInteger())); + add(system, tb, new Operator("Precision", new Signature(systemModel.getDate()), systemModel.getInteger())); + add(system, tb, new Operator("Precision", new Signature(systemModel.getDateTime()), systemModel.getInteger())); + add(system, tb, new Operator("Precision", new Signature(systemModel.getTime()), systemModel.getInteger())); + + add(system, tb, new Operator("Predecessor", new Signature(systemModel.getInteger()), systemModel.getInteger())); + add(system, tb, new Operator("Predecessor", new Signature(systemModel.getLong()), systemModel.getLong())); + add(system, tb, new Operator("Predecessor", new Signature(systemModel.getDecimal()), systemModel.getDecimal())); + add(system, tb, new Operator("Predecessor", new Signature(systemModel.getDate()), systemModel.getDate())); + add(system, tb, new Operator("Predecessor", new Signature(systemModel.getDateTime()), systemModel.getDateTime())); + add(system, tb, new Operator("Predecessor", new Signature(systemModel.getTime()), systemModel.getTime())); + add(system, tb, new Operator("Predecessor", new Signature(systemModel.getQuantity()), systemModel.getQuantity())); + + add(system, tb, new Operator("Power", new Signature(systemModel.getInteger(), systemModel.getInteger()), systemModel.getInteger())); + add(system, tb, new Operator("Power", new Signature(systemModel.getLong(), systemModel.getLong()), systemModel.getLong())); + add(system, tb, new Operator("Power", new Signature(systemModel.getDecimal(), systemModel.getDecimal()), systemModel.getDecimal())); + + add(system, tb, new Operator("Round", new Signature(systemModel.getDecimal()), systemModel.getDecimal())); + add(system, tb, new Operator("Round", new Signature(systemModel.getDecimal(), systemModel.getInteger()), systemModel.getDecimal())); + + add(system, tb, new Operator("Subtract", new Signature(systemModel.getInteger(), systemModel.getInteger()), systemModel.getInteger())); + add(system, tb, new Operator("Subtract", new Signature(systemModel.getLong(), systemModel.getLong()), systemModel.getLong())); + add(system, tb, new Operator("Subtract", new Signature(systemModel.getDecimal(), systemModel.getDecimal()), systemModel.getDecimal())); + add(system, tb, new Operator("Subtract", new Signature(systemModel.getQuantity(), systemModel.getQuantity()), systemModel.getQuantity())); + + add(system, tb, new Operator("Successor", new Signature(systemModel.getInteger()), systemModel.getInteger())); + add(system, tb, new Operator("Successor", new Signature(systemModel.getLong()), systemModel.getLong())); + add(system, tb, new Operator("Successor", new Signature(systemModel.getDecimal()), systemModel.getDecimal())); + add(system, tb, new Operator("Successor", new Signature(systemModel.getDate()), systemModel.getDate())); + add(system, tb, new Operator("Successor", new Signature(systemModel.getDateTime()), systemModel.getDateTime())); + add(system, tb, new Operator("Successor", new Signature(systemModel.getTime()), systemModel.getTime())); + add(system, tb, new Operator("Successor", new Signature(systemModel.getQuantity()), systemModel.getQuantity())); + + add(system, tb, new Operator("Truncate", new Signature(systemModel.getDecimal()), systemModel.getInteger())); + + add(system, tb, new Operator("TruncatedDivide", new Signature(systemModel.getInteger(), systemModel.getInteger()), systemModel.getInteger())); + add(system, tb, new Operator("TruncatedDivide", new Signature(systemModel.getLong(), systemModel.getLong()), systemModel.getLong())); + add(system, tb, new Operator("TruncatedDivide", new Signature(systemModel.getDecimal(), systemModel.getDecimal()), systemModel.getDecimal())); + add(system, tb, new Operator("TruncatedDivide", new Signature(systemModel.getQuantity(), systemModel.getQuantity()), systemModel.getQuantity())); // String operators - system.add(new Operator("Add", new Signature(systemModel.getString(), systemModel.getString()), systemModel.getString())); - system.add(new Operator("Combine", new Signature(new ListType(systemModel.getString())), systemModel.getString())); - system.add(new Operator("Combine", new Signature(new ListType(systemModel.getString()), systemModel.getString()), systemModel.getString())); - system.add(new Operator("Concatenate", new Signature(systemModel.getString(), systemModel.getString()), systemModel.getString())); - system.add(new Operator("EndsWith", new Signature(systemModel.getString(), systemModel.getString()), systemModel.getBoolean())); - system.add(new Operator("Indexer", new Signature(systemModel.getString(), systemModel.getInteger()), systemModel.getString())); - system.add(new Operator("LastPositionOf", new Signature(systemModel.getString(), systemModel.getString()), systemModel.getInteger())); - system.add(new Operator("Length", new Signature(systemModel.getString()), systemModel.getInteger())); - system.add(new Operator("Lower", new Signature(systemModel.getString()), systemModel.getString())); - system.add(new Operator("Matches", new Signature(systemModel.getString(), systemModel.getString()), systemModel.getBoolean())); - system.add(new Operator("PositionOf", new Signature(systemModel.getString(), systemModel.getString()), systemModel.getInteger())); - system.add(new Operator("ReplaceMatches", new Signature(systemModel.getString(), systemModel.getString(), systemModel.getString()), systemModel.getString())); - system.add(new Operator("Split", new Signature(systemModel.getString(), systemModel.getString()), new ListType(systemModel.getString()))); - system.add(new Operator("SplitOnMatches", new Signature(systemModel.getString(), systemModel.getString()), new ListType(systemModel.getString()))); - system.add(new Operator("StartsWith", new Signature(systemModel.getString(), systemModel.getString()), systemModel.getBoolean())); - system.add(new Operator("Substring", new Signature(systemModel.getString(), systemModel.getInteger()), systemModel.getString())); - system.add(new Operator("Substring", new Signature(systemModel.getString(), systemModel.getInteger(), systemModel.getInteger()), systemModel.getString())); - system.add(new Operator("Upper", new Signature(systemModel.getString()), systemModel.getString())); + add(system, tb, new Operator("Add", new Signature(systemModel.getString(), systemModel.getString()), systemModel.getString())); + add(system, tb, new Operator("Combine", new Signature(new ListType(systemModel.getString())), systemModel.getString())); + add(system, tb, new Operator("Combine", new Signature(new ListType(systemModel.getString()), systemModel.getString()), systemModel.getString())); + add(system, tb, new Operator("Concatenate", new Signature(systemModel.getString(), systemModel.getString()), systemModel.getString())); + add(system, tb, new Operator("EndsWith", new Signature(systemModel.getString(), systemModel.getString()), systemModel.getBoolean())); + add(system, tb, new Operator("Indexer", new Signature(systemModel.getString(), systemModel.getInteger()), systemModel.getString())); + add(system, tb, new Operator("LastPositionOf", new Signature(systemModel.getString(), systemModel.getString()), systemModel.getInteger())); + add(system, tb, new Operator("Length", new Signature(systemModel.getString()), systemModel.getInteger())); + add(system, tb, new Operator("Lower", new Signature(systemModel.getString()), systemModel.getString())); + add(system, tb, new Operator("Matches", new Signature(systemModel.getString(), systemModel.getString()), systemModel.getBoolean())); + add(system, tb, new Operator("PositionOf", new Signature(systemModel.getString(), systemModel.getString()), systemModel.getInteger())); + add(system, tb, new Operator("ReplaceMatches", new Signature(systemModel.getString(), systemModel.getString(), systemModel.getString()), systemModel.getString())); + add(system, tb, new Operator("Split", new Signature(systemModel.getString(), systemModel.getString()), new ListType(systemModel.getString()))); + add(system, tb, new Operator("SplitOnMatches", new Signature(systemModel.getString(), systemModel.getString()), new ListType(systemModel.getString()))); + add(system, tb, new Operator("StartsWith", new Signature(systemModel.getString(), systemModel.getString()), systemModel.getBoolean())); + add(system, tb, new Operator("Substring", new Signature(systemModel.getString(), systemModel.getInteger()), systemModel.getString())); + add(system, tb, new Operator("Substring", new Signature(systemModel.getString(), systemModel.getInteger(), systemModel.getInteger()), systemModel.getString())); + add(system, tb, new Operator("Upper", new Signature(systemModel.getString()), systemModel.getString())); // Date/Time Operators - system.add(new Operator("Add", new Signature(systemModel.getDateTime(), systemModel.getQuantity()), systemModel.getDateTime())); - system.add(new Operator("Add", new Signature(systemModel.getDate(), systemModel.getQuantity()), systemModel.getDate())); - system.add(new Operator("Add", new Signature(systemModel.getTime(), systemModel.getQuantity()), systemModel.getTime())); - system.add(new Operator("After", new Signature(systemModel.getDateTime(), systemModel.getDateTime()), systemModel.getBoolean())); - system.add(new Operator("After", new Signature(systemModel.getDate(), systemModel.getDate()), systemModel.getBoolean())); - system.add(new Operator("After", new Signature(systemModel.getTime(), systemModel.getTime()), systemModel.getBoolean())); - system.add(new Operator("Before", new Signature(systemModel.getDateTime(), systemModel.getDateTime()), systemModel.getBoolean())); - system.add(new Operator("Before", new Signature(systemModel.getDate(), systemModel.getDate()), systemModel.getBoolean())); - system.add(new Operator("Before", new Signature(systemModel.getTime(), systemModel.getTime()), systemModel.getBoolean())); - system.add(new Operator("DateTime", new Signature(systemModel.getInteger()), systemModel.getDateTime())); - system.add(new Operator("DateTime", new Signature(systemModel.getInteger(), systemModel.getInteger()), systemModel.getDateTime())); - system.add(new Operator("DateTime", new Signature(systemModel.getInteger(), systemModel.getInteger(), systemModel.getInteger()), systemModel.getDateTime())); - system.add(new Operator("DateTime", new Signature(systemModel.getInteger(), systemModel.getInteger(), systemModel.getInteger(), systemModel.getInteger()), systemModel.getDateTime())); - system.add(new Operator("DateTime", new Signature(systemModel.getInteger(), systemModel.getInteger(), systemModel.getInteger(), systemModel.getInteger(), systemModel.getInteger()), systemModel.getDateTime())); - system.add(new Operator("DateTime", new Signature(systemModel.getInteger(), systemModel.getInteger(), systemModel.getInteger(), systemModel.getInteger(), systemModel.getInteger(), systemModel.getInteger()), systemModel.getDateTime())); - system.add(new Operator("DateTime", new Signature(systemModel.getInteger(), systemModel.getInteger(), systemModel.getInteger(), systemModel.getInteger(), systemModel.getInteger(), systemModel.getInteger(), systemModel.getInteger()), systemModel.getDateTime())); - system.add(new Operator("DateTime", new Signature(systemModel.getInteger(), systemModel.getInteger(), systemModel.getInteger(), systemModel.getInteger(), systemModel.getInteger(), systemModel.getInteger(), systemModel.getInteger(), systemModel.getDecimal()), systemModel.getDateTime())); - system.add(new Operator("Date", new Signature(systemModel.getInteger()), systemModel.getDate())); - system.add(new Operator("Date", new Signature(systemModel.getInteger(), systemModel.getInteger()), systemModel.getDate())); - system.add(new Operator("Date", new Signature(systemModel.getInteger(), systemModel.getInteger(), systemModel.getInteger()), systemModel.getDate())); - system.add(new Operator("DateFrom", new Signature(systemModel.getDateTime()), systemModel.getDate())); - system.add(new Operator("TimeFrom", new Signature(systemModel.getDateTime()), systemModel.getTime())); - system.add(new Operator("TimezoneFrom", new Signature(systemModel.getDateTime()), systemModel.getDecimal())); - system.add(new Operator("TimezoneOffsetFrom", new Signature(systemModel.getDateTime()), systemModel.getDecimal())); - system.add(new Operator("DateTimeComponentFrom", new Signature(systemModel.getDateTime()), systemModel.getInteger())); - system.add(new Operator("DateTimeComponentFrom", new Signature(systemModel.getDate()), systemModel.getInteger())); - system.add(new Operator("DateTimeComponentFrom", new Signature(systemModel.getTime()), systemModel.getInteger())); - system.add(new Operator("DifferenceBetween", new Signature(systemModel.getDateTime(), systemModel.getDateTime()), systemModel.getInteger())); - system.add(new Operator("DifferenceBetween", new Signature(systemModel.getDate(), systemModel.getDate()), systemModel.getInteger())); - system.add(new Operator("DifferenceBetween", new Signature(systemModel.getTime(), systemModel.getTime()), systemModel.getInteger())); - system.add(new Operator("DurationBetween", new Signature(systemModel.getDateTime(), systemModel.getDateTime()), systemModel.getInteger())); - system.add(new Operator("DurationBetween", new Signature(systemModel.getDate(), systemModel.getDate()), systemModel.getInteger())); - system.add(new Operator("DurationBetween", new Signature(systemModel.getTime(), systemModel.getTime()), systemModel.getInteger())); - system.add(new Operator("Now", new Signature(), systemModel.getDateTime())); - system.add(new Operator("SameAs", new Signature(systemModel.getDateTime(), systemModel.getDateTime()), systemModel.getBoolean())); - system.add(new Operator("SameAs", new Signature(systemModel.getDate(), systemModel.getDate()), systemModel.getBoolean())); - system.add(new Operator("SameAs", new Signature(systemModel.getTime(), systemModel.getTime()), systemModel.getBoolean())); - system.add(new Operator("SameOrAfter", new Signature(systemModel.getDateTime(), systemModel.getDateTime()), systemModel.getBoolean())); - system.add(new Operator("SameOrAfter", new Signature(systemModel.getDate(), systemModel.getDate()), systemModel.getBoolean())); - system.add(new Operator("SameOrAfter", new Signature(systemModel.getTime(), systemModel.getTime()), systemModel.getBoolean())); - system.add(new Operator("SameOrBefore", new Signature(systemModel.getDateTime(), systemModel.getDateTime()), systemModel.getBoolean())); - system.add(new Operator("SameOrBefore", new Signature(systemModel.getDate(), systemModel.getDate()), systemModel.getBoolean())); - system.add(new Operator("SameOrBefore", new Signature(systemModel.getTime(), systemModel.getTime()), systemModel.getBoolean())); - system.add(new Operator("Subtract", new Signature(systemModel.getDateTime(), systemModel.getQuantity()), systemModel.getDateTime())); - system.add(new Operator("Subtract", new Signature(systemModel.getDate(), systemModel.getQuantity()), systemModel.getDate())); - system.add(new Operator("Subtract", new Signature(systemModel.getTime(), systemModel.getQuantity()), systemModel.getTime())); - system.add(new Operator("Today", new Signature(), systemModel.getDate())); - system.add(new Operator("Time", new Signature(systemModel.getInteger()), systemModel.getTime())); - system.add(new Operator("Time", new Signature(systemModel.getInteger(), systemModel.getInteger()), systemModel.getTime())); - system.add(new Operator("Time", new Signature(systemModel.getInteger(), systemModel.getInteger(), systemModel.getInteger()), systemModel.getTime())); - system.add(new Operator("Time", new Signature(systemModel.getInteger(), systemModel.getInteger(), systemModel.getInteger(), systemModel.getInteger()), systemModel.getTime())); - system.add(new Operator("TimeOfDay", new Signature(), systemModel.getTime())); + add(system, tb, new Operator("Add", new Signature(systemModel.getDateTime(), systemModel.getQuantity()), systemModel.getDateTime())); + add(system, tb, new Operator("Add", new Signature(systemModel.getDate(), systemModel.getQuantity()), systemModel.getDate())); + add(system, tb, new Operator("Add", new Signature(systemModel.getTime(), systemModel.getQuantity()), systemModel.getTime())); + add(system, tb, new Operator("After", new Signature(systemModel.getDateTime(), systemModel.getDateTime()), systemModel.getBoolean())); + add(system, tb, new Operator("After", new Signature(systemModel.getDate(), systemModel.getDate()), systemModel.getBoolean())); + add(system, tb, new Operator("After", new Signature(systemModel.getTime(), systemModel.getTime()), systemModel.getBoolean())); + add(system, tb, new Operator("Before", new Signature(systemModel.getDateTime(), systemModel.getDateTime()), systemModel.getBoolean())); + add(system, tb, new Operator("Before", new Signature(systemModel.getDate(), systemModel.getDate()), systemModel.getBoolean())); + add(system, tb, new Operator("Before", new Signature(systemModel.getTime(), systemModel.getTime()), systemModel.getBoolean())); + add(system, tb, new Operator("DateTime", new Signature(systemModel.getInteger()), systemModel.getDateTime())); + add(system, tb, new Operator("DateTime", new Signature(systemModel.getInteger(), systemModel.getInteger()), systemModel.getDateTime())); + add(system, tb, new Operator("DateTime", new Signature(systemModel.getInteger(), systemModel.getInteger(), systemModel.getInteger()), systemModel.getDateTime())); + add(system, tb, new Operator("DateTime", new Signature(systemModel.getInteger(), systemModel.getInteger(), systemModel.getInteger(), systemModel.getInteger()), systemModel.getDateTime())); + add(system, tb, new Operator("DateTime", new Signature(systemModel.getInteger(), systemModel.getInteger(), systemModel.getInteger(), systemModel.getInteger(), systemModel.getInteger()), systemModel.getDateTime())); + add(system, tb, new Operator("DateTime", new Signature(systemModel.getInteger(), systemModel.getInteger(), systemModel.getInteger(), systemModel.getInteger(), systemModel.getInteger(), systemModel.getInteger()), systemModel.getDateTime())); + add(system, tb, new Operator("DateTime", new Signature(systemModel.getInteger(), systemModel.getInteger(), systemModel.getInteger(), systemModel.getInteger(), systemModel.getInteger(), systemModel.getInteger(), systemModel.getInteger()), systemModel.getDateTime())); + add(system, tb, new Operator("DateTime", new Signature(systemModel.getInteger(), systemModel.getInteger(), systemModel.getInteger(), systemModel.getInteger(), systemModel.getInteger(), systemModel.getInteger(), systemModel.getInteger(), systemModel.getDecimal()), systemModel.getDateTime())); + add(system, tb, new Operator("Date", new Signature(systemModel.getInteger()), systemModel.getDate())); + add(system, tb, new Operator("Date", new Signature(systemModel.getInteger(), systemModel.getInteger()), systemModel.getDate())); + add(system, tb, new Operator("Date", new Signature(systemModel.getInteger(), systemModel.getInteger(), systemModel.getInteger()), systemModel.getDate())); + add(system, tb, new Operator("DateFrom", new Signature(systemModel.getDateTime()), systemModel.getDate())); + add(system, tb, new Operator("TimeFrom", new Signature(systemModel.getDateTime()), systemModel.getTime())); + add(system, tb, new Operator("TimezoneFrom", new Signature(systemModel.getDateTime()), systemModel.getDecimal())); + add(system, tb, new Operator("TimezoneOffsetFrom", new Signature(systemModel.getDateTime()), systemModel.getDecimal())); + add(system, tb, new Operator("DateTimeComponentFrom", new Signature(systemModel.getDateTime()), systemModel.getInteger())); + add(system, tb, new Operator("DateTimeComponentFrom", new Signature(systemModel.getDate()), systemModel.getInteger())); + add(system, tb, new Operator("DateTimeComponentFrom", new Signature(systemModel.getTime()), systemModel.getInteger())); + add(system, tb, new Operator("DifferenceBetween", new Signature(systemModel.getDateTime(), systemModel.getDateTime()), systemModel.getInteger())); + add(system, tb, new Operator("DifferenceBetween", new Signature(systemModel.getDate(), systemModel.getDate()), systemModel.getInteger())); + add(system, tb, new Operator("DifferenceBetween", new Signature(systemModel.getTime(), systemModel.getTime()), systemModel.getInteger())); + add(system, tb, new Operator("DurationBetween", new Signature(systemModel.getDateTime(), systemModel.getDateTime()), systemModel.getInteger())); + add(system, tb, new Operator("DurationBetween", new Signature(systemModel.getDate(), systemModel.getDate()), systemModel.getInteger())); + add(system, tb, new Operator("DurationBetween", new Signature(systemModel.getTime(), systemModel.getTime()), systemModel.getInteger())); + add(system, tb, new Operator("Now", new Signature(), systemModel.getDateTime())); + add(system, tb, new Operator("SameAs", new Signature(systemModel.getDateTime(), systemModel.getDateTime()), systemModel.getBoolean())); + add(system, tb, new Operator("SameAs", new Signature(systemModel.getDate(), systemModel.getDate()), systemModel.getBoolean())); + add(system, tb, new Operator("SameAs", new Signature(systemModel.getTime(), systemModel.getTime()), systemModel.getBoolean())); + add(system, tb, new Operator("SameOrAfter", new Signature(systemModel.getDateTime(), systemModel.getDateTime()), systemModel.getBoolean())); + add(system, tb, new Operator("SameOrAfter", new Signature(systemModel.getDate(), systemModel.getDate()), systemModel.getBoolean())); + add(system, tb, new Operator("SameOrAfter", new Signature(systemModel.getTime(), systemModel.getTime()), systemModel.getBoolean())); + add(system, tb, new Operator("SameOrBefore", new Signature(systemModel.getDateTime(), systemModel.getDateTime()), systemModel.getBoolean())); + add(system, tb, new Operator("SameOrBefore", new Signature(systemModel.getDate(), systemModel.getDate()), systemModel.getBoolean())); + add(system, tb, new Operator("SameOrBefore", new Signature(systemModel.getTime(), systemModel.getTime()), systemModel.getBoolean())); + add(system, tb, new Operator("Subtract", new Signature(systemModel.getDateTime(), systemModel.getQuantity()), systemModel.getDateTime())); + add(system, tb, new Operator("Subtract", new Signature(systemModel.getDate(), systemModel.getQuantity()), systemModel.getDate())); + add(system, tb, new Operator("Subtract", new Signature(systemModel.getTime(), systemModel.getQuantity()), systemModel.getTime())); + add(system, tb, new Operator("Today", new Signature(), systemModel.getDate())); + add(system, tb, new Operator("Time", new Signature(systemModel.getInteger()), systemModel.getTime())); + add(system, tb, new Operator("Time", new Signature(systemModel.getInteger(), systemModel.getInteger()), systemModel.getTime())); + add(system, tb, new Operator("Time", new Signature(systemModel.getInteger(), systemModel.getInteger(), systemModel.getInteger()), systemModel.getTime())); + add(system, tb, new Operator("Time", new Signature(systemModel.getInteger(), systemModel.getInteger(), systemModel.getInteger(), systemModel.getInteger()), systemModel.getTime())); + add(system, tb, new Operator("TimeOfDay", new Signature(), systemModel.getTime())); // Interval Operators // After(interval, interval) : Boolean - system.add(new GenericOperator("After", new Signature(new IntervalType(new TypeParameter("T")), new IntervalType(new TypeParameter("T"))), systemModel.getBoolean(), new TypeParameter("T"))); + add(system, tb, new GenericOperator("After", new Signature(new IntervalType(new TypeParameter("T")), new IntervalType(new TypeParameter("T"))), systemModel.getBoolean(), new TypeParameter("T"))); // Before(interval, interval) : Boolean - system.add(new GenericOperator("Before", new Signature(new IntervalType(new TypeParameter("T")), new IntervalType(new TypeParameter("T"))), systemModel.getBoolean(), new TypeParameter("T"))); + add(system, tb, new GenericOperator("Before", new Signature(new IntervalType(new TypeParameter("T")), new IntervalType(new TypeParameter("T"))), systemModel.getBoolean(), new TypeParameter("T"))); // Collapse(list>) : list> // Collapse(list>, Quantity) : list> - system.add(new GenericOperator("Collapse", new Signature(new ListType(new IntervalType(new TypeParameter("T"))), systemModel.getQuantity()), new ListType(new IntervalType(new TypeParameter("T"))), new TypeParameter("T"))); + add(system, tb, new GenericOperator("Collapse", new Signature(new ListType(new IntervalType(new TypeParameter("T"))), systemModel.getQuantity()), new ListType(new IntervalType(new TypeParameter("T"))), new TypeParameter("T"))); // Contains(interval, T) : Boolean - system.add(new GenericOperator("Contains", new Signature(new IntervalType(new TypeParameter("T")), new TypeParameter("T")), systemModel.getBoolean(), new TypeParameter("T"))); + add(system, tb, new GenericOperator("Contains", new Signature(new IntervalType(new TypeParameter("T")), new TypeParameter("T")), systemModel.getBoolean(), new TypeParameter("T"))); // End(interval) : T - system.add(new GenericOperator("End", new Signature(new IntervalType(new TypeParameter("T"))), new TypeParameter("T"), new TypeParameter("T"))); + add(system, tb, new GenericOperator("End", new Signature(new IntervalType(new TypeParameter("T"))), new TypeParameter("T"), new TypeParameter("T"))); // Ends(interval, interval) : Boolean - system.add(new GenericOperator("Ends", new Signature(new IntervalType(new TypeParameter("T")), new IntervalType(new TypeParameter("T"))), systemModel.getBoolean(), new TypeParameter("T"))); + add(system, tb, new GenericOperator("Ends", new Signature(new IntervalType(new TypeParameter("T")), new IntervalType(new TypeParameter("T"))), systemModel.getBoolean(), new TypeParameter("T"))); // Equal(interval, interval) : Boolean - system.add(new GenericOperator("Equal", new Signature(new IntervalType(new TypeParameter("T")), new IntervalType(new TypeParameter("T"))), systemModel.getBoolean(), new TypeParameter("T"))); + add(system, tb, new GenericOperator("Equal", new Signature(new IntervalType(new TypeParameter("T")), new IntervalType(new TypeParameter("T"))), systemModel.getBoolean(), new TypeParameter("T"))); // Equivalent(interval, interval) : Boolean - system.add(new GenericOperator("Equivalent", new Signature(new IntervalType(new TypeParameter("T")), new IntervalType(new TypeParameter("T"))), systemModel.getBoolean(), new TypeParameter("T"))); + add(system, tb, new GenericOperator("Equivalent", new Signature(new IntervalType(new TypeParameter("T")), new IntervalType(new TypeParameter("T"))), systemModel.getBoolean(), new TypeParameter("T"))); // Except(interval, interval) : interval - system.add(new GenericOperator("Except", new Signature(new IntervalType(new TypeParameter("T")), new IntervalType(new TypeParameter("T"))), new IntervalType(new TypeParameter("T")), new TypeParameter("T"))); + add(system, tb, new GenericOperator("Except", new Signature(new IntervalType(new TypeParameter("T")), new IntervalType(new TypeParameter("T"))), new IntervalType(new TypeParameter("T")), new TypeParameter("T"))); // Expand(list>) : list> // Expand(list>, Quantity) : list> // Expand(interval) : List // Expand(interval, Quantity) : list - system.add(new GenericOperator("Expand", new Signature(new ListType(new IntervalType(new TypeParameter("T"))), systemModel.getQuantity()), new ListType(new IntervalType(new TypeParameter("T"))), new TypeParameter("T"))); - system.add(new GenericOperator("Expand", new Signature(new IntervalType(new TypeParameter("T")), systemModel.getQuantity()), new ListType(new TypeParameter("T")), new TypeParameter("T"))); + add(system, tb, new GenericOperator("Expand", new Signature(new ListType(new IntervalType(new TypeParameter("T"))), systemModel.getQuantity()), new ListType(new IntervalType(new TypeParameter("T"))), new TypeParameter("T"))); + add(system, tb, new GenericOperator("Expand", new Signature(new IntervalType(new TypeParameter("T")), systemModel.getQuantity()), new ListType(new TypeParameter("T")), new TypeParameter("T"))); // In(T, interval) : Boolean - system.add(new GenericOperator("In", new Signature(new TypeParameter("T"), new IntervalType(new TypeParameter("T"))), systemModel.getBoolean(), new TypeParameter("T"))); + add(system, tb, new GenericOperator("In", new Signature(new TypeParameter("T"), new IntervalType(new TypeParameter("T"))), systemModel.getBoolean(), new TypeParameter("T"))); // Includes(interval, interval) : Boolean - system.add(new GenericOperator("Includes", new Signature(new IntervalType(new TypeParameter("T")), new IntervalType(new TypeParameter("T"))), systemModel.getBoolean(), new TypeParameter("T"))); + add(system, tb, new GenericOperator("Includes", new Signature(new IntervalType(new TypeParameter("T")), new IntervalType(new TypeParameter("T"))), systemModel.getBoolean(), new TypeParameter("T"))); // IncludedIn(interval, interval) : Boolean - system.add(new GenericOperator("IncludedIn", new Signature(new IntervalType(new TypeParameter("T")), new IntervalType(new TypeParameter("T"))), systemModel.getBoolean(), new TypeParameter("T"))); + add(system, tb, new GenericOperator("IncludedIn", new Signature(new IntervalType(new TypeParameter("T")), new IntervalType(new TypeParameter("T"))), systemModel.getBoolean(), new TypeParameter("T"))); // Intersect(interval, interval) : interval - system.add(new GenericOperator("Intersect", new Signature(new IntervalType(new TypeParameter("T")), new IntervalType(new TypeParameter("T"))), new IntervalType(new TypeParameter("T")), new TypeParameter("T"))); + add(system, tb, new GenericOperator("Intersect", new Signature(new IntervalType(new TypeParameter("T")), new IntervalType(new TypeParameter("T"))), new IntervalType(new TypeParameter("T")), new TypeParameter("T"))); // Meets(interval, interval) : Boolean - system.add(new GenericOperator("Meets", new Signature(new IntervalType(new TypeParameter("T")), new IntervalType(new TypeParameter("T"))), systemModel.getBoolean(), new TypeParameter("T"))); + add(system, tb, new GenericOperator("Meets", new Signature(new IntervalType(new TypeParameter("T")), new IntervalType(new TypeParameter("T"))), systemModel.getBoolean(), new TypeParameter("T"))); // MeetsBefore(interval, interval) : Boolean - system.add(new GenericOperator("MeetsBefore", new Signature(new IntervalType(new TypeParameter("T")), new IntervalType(new TypeParameter("T"))), systemModel.getBoolean(), new TypeParameter("T"))); + add(system, tb, new GenericOperator("MeetsBefore", new Signature(new IntervalType(new TypeParameter("T")), new IntervalType(new TypeParameter("T"))), systemModel.getBoolean(), new TypeParameter("T"))); // MeetsAfter(interval, interval) : Boolean - system.add(new GenericOperator("MeetsAfter", new Signature(new IntervalType(new TypeParameter("T")), new IntervalType(new TypeParameter("T"))), systemModel.getBoolean(), new TypeParameter("T"))); + add(system, tb, new GenericOperator("MeetsAfter", new Signature(new IntervalType(new TypeParameter("T")), new IntervalType(new TypeParameter("T"))), systemModel.getBoolean(), new TypeParameter("T"))); // Overlaps(interval, interval) : Boolean - system.add(new GenericOperator("Overlaps", new Signature(new IntervalType(new TypeParameter("T")), new IntervalType(new TypeParameter("T"))), systemModel.getBoolean(), new TypeParameter("T"))); + add(system, tb, new GenericOperator("Overlaps", new Signature(new IntervalType(new TypeParameter("T")), new IntervalType(new TypeParameter("T"))), systemModel.getBoolean(), new TypeParameter("T"))); // OverlapsBefore(interval, interval) : Boolean - system.add(new GenericOperator("OverlapsBefore", new Signature(new IntervalType(new TypeParameter("T")), new IntervalType(new TypeParameter("T"))), systemModel.getBoolean(), new TypeParameter("T"))); + add(system, tb, new GenericOperator("OverlapsBefore", new Signature(new IntervalType(new TypeParameter("T")), new IntervalType(new TypeParameter("T"))), systemModel.getBoolean(), new TypeParameter("T"))); // OverlapsAfter(interval, interval) : Boolean - system.add(new GenericOperator("OverlapsAfter", new Signature(new IntervalType(new TypeParameter("T")), new IntervalType(new TypeParameter("T"))), systemModel.getBoolean(), new TypeParameter("T"))); + add(system, tb, new GenericOperator("OverlapsAfter", new Signature(new IntervalType(new TypeParameter("T")), new IntervalType(new TypeParameter("T"))), systemModel.getBoolean(), new TypeParameter("T"))); // PointFrom(interval) : T GenericOperator pointFrom = new GenericOperator("PointFrom", new Signature(new IntervalType(new TypeParameter("T"))), new TypeParameter("T"), new TypeParameter("T")); - system.add(pointFrom); + add(system, tb, pointFrom); // ProperContains(interval, T) : Boolean - system.add(new GenericOperator("ProperContains", new Signature(new IntervalType(new TypeParameter("T")), new TypeParameter("T")), systemModel.getBoolean(), new TypeParameter("T"))); + add(system, tb, new GenericOperator("ProperContains", new Signature(new IntervalType(new TypeParameter("T")), new TypeParameter("T")), systemModel.getBoolean(), new TypeParameter("T"))); // ProperIn(T, interval) : Boolean - system.add(new GenericOperator("ProperIn", new Signature(new TypeParameter("T"), new IntervalType(new TypeParameter("T"))), systemModel.getBoolean(), new TypeParameter("T"))); + add(system, tb, new GenericOperator("ProperIn", new Signature(new TypeParameter("T"), new IntervalType(new TypeParameter("T"))), systemModel.getBoolean(), new TypeParameter("T"))); // ProperIncludes(interval, interval) : Boolean - system.add(new GenericOperator("ProperIncludes", new Signature(new IntervalType(new TypeParameter("T")), new IntervalType(new TypeParameter("T"))), systemModel.getBoolean(), new TypeParameter("T"))); + add(system, tb, new GenericOperator("ProperIncludes", new Signature(new IntervalType(new TypeParameter("T")), new IntervalType(new TypeParameter("T"))), systemModel.getBoolean(), new TypeParameter("T"))); // ProperIncludedIn(interval, interval) : Boolean - system.add(new GenericOperator("ProperIncludedIn", new Signature(new IntervalType(new TypeParameter("T")), new IntervalType(new TypeParameter("T"))), systemModel.getBoolean(), new TypeParameter("T"))); + add(system, tb, new GenericOperator("ProperIncludedIn", new Signature(new IntervalType(new TypeParameter("T")), new IntervalType(new TypeParameter("T"))), systemModel.getBoolean(), new TypeParameter("T"))); // SameAs(interval, interval) : Boolean - system.add(new GenericOperator("SameAs", new Signature(new IntervalType(new TypeParameter("T")), new IntervalType(new TypeParameter("T"))), systemModel.getBoolean(), new TypeParameter("T"))); + add(system, tb, new GenericOperator("SameAs", new Signature(new IntervalType(new TypeParameter("T")), new IntervalType(new TypeParameter("T"))), systemModel.getBoolean(), new TypeParameter("T"))); // SameOrAfter(interval, interval) : Boolean - system.add(new GenericOperator("SameOrAfter", new Signature(new IntervalType(new TypeParameter("T")), new IntervalType(new TypeParameter("T"))), systemModel.getBoolean(), new TypeParameter("T"))); + add(system, tb, new GenericOperator("SameOrAfter", new Signature(new IntervalType(new TypeParameter("T")), new IntervalType(new TypeParameter("T"))), systemModel.getBoolean(), new TypeParameter("T"))); // SameOrBefore(interval, interval) : Boolean - system.add(new GenericOperator("SameOrBefore", new Signature(new IntervalType(new TypeParameter("T")), new IntervalType(new TypeParameter("T"))), systemModel.getBoolean(), new TypeParameter("T"))); + add(system, tb, new GenericOperator("SameOrBefore", new Signature(new IntervalType(new TypeParameter("T")), new IntervalType(new TypeParameter("T"))), systemModel.getBoolean(), new TypeParameter("T"))); // Size(interval) : T - system.add(new GenericOperator("Size", new Signature(new IntervalType(new TypeParameter("T"))), new TypeParameter("T"), new TypeParameter("T"))); + add(system, tb, new GenericOperator("Size", new Signature(new IntervalType(new TypeParameter("T"))), new TypeParameter("T"), new TypeParameter("T"))); // Start(interval) : T - system.add(new GenericOperator("Start", new Signature(new IntervalType(new TypeParameter("T"))), new TypeParameter("T"), new TypeParameter("T"))); + add(system, tb, new GenericOperator("Start", new Signature(new IntervalType(new TypeParameter("T"))), new TypeParameter("T"), new TypeParameter("T"))); // Starts(interval, interval) : Boolean - system.add(new GenericOperator("Starts", new Signature(new IntervalType(new TypeParameter("T")), new IntervalType(new TypeParameter("T"))), systemModel.getBoolean(), new TypeParameter("T"))); + add(system, tb, new GenericOperator("Starts", new Signature(new IntervalType(new TypeParameter("T")), new IntervalType(new TypeParameter("T"))), systemModel.getBoolean(), new TypeParameter("T"))); // Union(interval, interval) : interval - system.add(new GenericOperator("Union", new Signature(new IntervalType(new TypeParameter("T")), new IntervalType(new TypeParameter("T"))), new IntervalType(new TypeParameter("T")), new TypeParameter("T"))); + add(system, tb, new GenericOperator("Union", new Signature(new IntervalType(new TypeParameter("T")), new IntervalType(new TypeParameter("T"))), new IntervalType(new TypeParameter("T")), new TypeParameter("T"))); // Width(interval) : T - system.add(new GenericOperator("Width", new Signature(new IntervalType(new TypeParameter("T"))), new TypeParameter("T"), new TypeParameter("T"))); + add(system, tb, new GenericOperator("Width", new Signature(new IntervalType(new TypeParameter("T"))), new TypeParameter("T"), new TypeParameter("T"))); // List Operators // Contains(list, T) : Boolean - system.add(new GenericOperator("Contains", new Signature(new ListType(new TypeParameter("T")), new TypeParameter("T")), systemModel.getBoolean(), new TypeParameter("T"))); + add(system, tb, new GenericOperator("Contains", new Signature(new ListType(new TypeParameter("T")), new TypeParameter("T")), systemModel.getBoolean(), new TypeParameter("T"))); // Distinct(list) : list - system.add(new GenericOperator("Distinct", new Signature(new ListType(new TypeParameter("T"))), new ListType(new TypeParameter("T")), new TypeParameter("T"))); + add(system, tb, new GenericOperator("Distinct", new Signature(new ListType(new TypeParameter("T"))), new ListType(new TypeParameter("T")), new TypeParameter("T"))); // Equal(list, list) : Boolean - system.add(new GenericOperator("Equal", new Signature(new ListType(new TypeParameter("T")), new ListType(new TypeParameter("T"))), systemModel.getBoolean(), new TypeParameter("T"))); + add(system, tb, new GenericOperator("Equal", new Signature(new ListType(new TypeParameter("T")), new ListType(new TypeParameter("T"))), systemModel.getBoolean(), new TypeParameter("T"))); // Equivalent(list, list) : Boolean - system.add(new GenericOperator("Equivalent", new Signature(new ListType(new TypeParameter("T")), new ListType(new TypeParameter("T"))), systemModel.getBoolean(), new TypeParameter("T"))); + add(system, tb, new GenericOperator("Equivalent", new Signature(new ListType(new TypeParameter("T")), new ListType(new TypeParameter("T"))), systemModel.getBoolean(), new TypeParameter("T"))); // Except(list, list) : list - system.add(new GenericOperator("Except", new Signature(new ListType(new TypeParameter("T")), new ListType(new TypeParameter("T"))), new ListType(new TypeParameter("T")), new TypeParameter("T"))); + add(system, tb, new GenericOperator("Except", new Signature(new ListType(new TypeParameter("T")), new ListType(new TypeParameter("T"))), new ListType(new TypeParameter("T")), new TypeParameter("T"))); // Exists(list) : Boolean - system.add(new GenericOperator("Exists", new Signature(new ListType(new TypeParameter("T"))), systemModel.getBoolean(), new TypeParameter("T"))); + add(system, tb, new GenericOperator("Exists", new Signature(new ListType(new TypeParameter("T"))), systemModel.getBoolean(), new TypeParameter("T"))); // Flatten(list>) : list - system.add(new GenericOperator("Flatten", new Signature(new ListType(new ListType(new TypeParameter("T")))), new ListType(new TypeParameter("T")), new TypeParameter("T"))); + add(system, tb, new GenericOperator("Flatten", new Signature(new ListType(new ListType(new TypeParameter("T")))), new ListType(new TypeParameter("T")), new TypeParameter("T"))); // First(list) : T - system.add(new GenericOperator("First", new Signature(new ListType(new TypeParameter("T"))), new TypeParameter("T"), new TypeParameter("T"))); + add(system, tb, new GenericOperator("First", new Signature(new ListType(new TypeParameter("T"))), new TypeParameter("T"), new TypeParameter("T"))); // In(T, list) : Boolean - system.add(new GenericOperator("In", new Signature(new TypeParameter("T"), new ListType(new TypeParameter("T"))), systemModel.getBoolean(), new TypeParameter("T"))); + add(system, tb, new GenericOperator("In", new Signature(new TypeParameter("T"), new ListType(new TypeParameter("T"))), systemModel.getBoolean(), new TypeParameter("T"))); // Includes(list, list) : Boolean - system.add(new GenericOperator("Includes", new Signature(new ListType(new TypeParameter("T")), new ListType(new TypeParameter("T"))), systemModel.getBoolean(), new TypeParameter("T"))); + add(system, tb, new GenericOperator("Includes", new Signature(new ListType(new TypeParameter("T")), new ListType(new TypeParameter("T"))), systemModel.getBoolean(), new TypeParameter("T"))); // IncludedIn(list, list) : Boolean - system.add(new GenericOperator("IncludedIn", new Signature(new ListType(new TypeParameter("T")), new ListType(new TypeParameter("T"))), systemModel.getBoolean(), new TypeParameter("T"))); + add(system, tb, new GenericOperator("IncludedIn", new Signature(new ListType(new TypeParameter("T")), new ListType(new TypeParameter("T"))), systemModel.getBoolean(), new TypeParameter("T"))); // Indexer(list, integer) : T - system.add(new GenericOperator("Indexer", new Signature(new ListType(new TypeParameter("T")), systemModel.getInteger()), new TypeParameter("T"), new TypeParameter("T"))); + add(system, tb, new GenericOperator("Indexer", new Signature(new ListType(new TypeParameter("T")), systemModel.getInteger()), new TypeParameter("T"), new TypeParameter("T"))); // IndexOf(list, T) : Integer - system.add(new GenericOperator("IndexOf", new Signature(new ListType(new TypeParameter("T")), new TypeParameter("T")), systemModel.getInteger(), new TypeParameter("T"))); + add(system, tb, new GenericOperator("IndexOf", new Signature(new ListType(new TypeParameter("T")), new TypeParameter("T")), systemModel.getInteger(), new TypeParameter("T"))); // Intersect(list, list) : list - system.add(new GenericOperator("Intersect", new Signature(new ListType(new TypeParameter("T")), new ListType(new TypeParameter("T"))), new ListType(new TypeParameter("T")), new TypeParameter("T"))); + add(system, tb, new GenericOperator("Intersect", new Signature(new ListType(new TypeParameter("T")), new ListType(new TypeParameter("T"))), new ListType(new TypeParameter("T")), new TypeParameter("T"))); // Last(list) : T - system.add(new GenericOperator("Last", new Signature(new ListType(new TypeParameter("T"))), new TypeParameter("T"), new TypeParameter("T"))); + add(system, tb, new GenericOperator("Last", new Signature(new ListType(new TypeParameter("T"))), new TypeParameter("T"), new TypeParameter("T"))); // Length(list) : Integer - system.add(new GenericOperator("Length", new Signature(new ListType(new TypeParameter("T"))), systemModel.getInteger(), new TypeParameter("T"))); + add(system, tb, new GenericOperator("Length", new Signature(new ListType(new TypeParameter("T"))), systemModel.getInteger(), new TypeParameter("T"))); // ProperContains(list, T) : Boolean - system.add(new GenericOperator("ProperContains", new Signature(new ListType(new TypeParameter("T")), new TypeParameter("T")), systemModel.getBoolean(), new TypeParameter("T"))); + add(system, tb, new GenericOperator("ProperContains", new Signature(new ListType(new TypeParameter("T")), new TypeParameter("T")), systemModel.getBoolean(), new TypeParameter("T"))); // ProperIn(T, list) : Boolean - system.add(new GenericOperator("ProperIn", new Signature(new TypeParameter("T"), new ListType(new TypeParameter("T"))), systemModel.getBoolean(), new TypeParameter("T"))); + add(system, tb, new GenericOperator("ProperIn", new Signature(new TypeParameter("T"), new ListType(new TypeParameter("T"))), systemModel.getBoolean(), new TypeParameter("T"))); // ProperIncludes(list, list) : Boolean - system.add(new GenericOperator("ProperIncludes", new Signature(new ListType(new TypeParameter("T")), new ListType(new TypeParameter("T"))), systemModel.getBoolean(), new TypeParameter("T"))); + add(system, tb, new GenericOperator("ProperIncludes", new Signature(new ListType(new TypeParameter("T")), new ListType(new TypeParameter("T"))), systemModel.getBoolean(), new TypeParameter("T"))); // ProperIncludedIn(list, list) : Boolean - system.add(new GenericOperator("ProperIncludedIn", new Signature(new ListType(new TypeParameter("T")), new ListType(new TypeParameter("T"))), systemModel.getBoolean(), new TypeParameter("T"))); + add(system, tb, new GenericOperator("ProperIncludedIn", new Signature(new ListType(new TypeParameter("T")), new ListType(new TypeParameter("T"))), systemModel.getBoolean(), new TypeParameter("T"))); // SingletonFrom(list) : T GenericOperator singletonFrom = new GenericOperator("SingletonFrom", new Signature(new ListType(new TypeParameter("T"))), new TypeParameter("T"), new TypeParameter("T")); - system.add(singletonFrom); + add(system, tb, singletonFrom); //// NOTE: FHIRPath Implicit List Demotion // Generic conversions turned out to be computationally expensive, so we added explicit list promotion/demotion in the conversion map directly instead. - //system.add(new Conversion(singletonFrom, true)); + //add(system, tb, new Conversion(singletonFrom, true)); // Skip(list, Integer): list - system.add(new GenericOperator("Skip", new Signature(new ListType(new TypeParameter("T")), systemModel.getInteger()), new ListType(new TypeParameter("T")), new TypeParameter("T"))); + add(system, tb, new GenericOperator("Skip", new Signature(new ListType(new TypeParameter("T")), systemModel.getInteger()), new ListType(new TypeParameter("T")), new TypeParameter("T"))); // Tail(list): list - system.add(new GenericOperator("Tail", new Signature(new ListType(new TypeParameter("T"))), new ListType(new TypeParameter("T")), new TypeParameter("T"))); + add(system, tb, new GenericOperator("Tail", new Signature(new ListType(new TypeParameter("T"))), new ListType(new TypeParameter("T")), new TypeParameter("T"))); // Take(list, Integer): list - system.add(new GenericOperator("Take", new Signature(new ListType(new TypeParameter("T")), systemModel.getInteger()), new ListType(new TypeParameter("T")), new TypeParameter("T"))); + add(system, tb, new GenericOperator("Take", new Signature(new ListType(new TypeParameter("T")), systemModel.getInteger()), new ListType(new TypeParameter("T")), new TypeParameter("T"))); // Union(list, list) : list - system.add(new GenericOperator("Union", new Signature(new ListType(new TypeParameter("T")), new ListType(new TypeParameter("T"))), new ListType(new TypeParameter("T")), new TypeParameter("T"))); + add(system, tb, new GenericOperator("Union", new Signature(new ListType(new TypeParameter("T")), new ListType(new TypeParameter("T"))), new ListType(new TypeParameter("T")), new TypeParameter("T"))); // NOTE: FHIRPath Implicit List Promotion operator //GenericOperator toList = new GenericOperator("List", new Signature(new TypeParameter("T")), new ListType(new TypeParameter("T")), new TypeParameter("T")); - //system.add(toList); - //system.add(new Conversion(toList, true)); + //add(system, tb, toList); + //add(system, tb, new Conversion(toList, true)); // Aggregate Operators - system.add(new Operator("AllTrue", new Signature(new ListType(systemModel.getBoolean())), systemModel.getBoolean())); - system.add(new Operator("AnyTrue", new Signature(new ListType(systemModel.getBoolean())), systemModel.getBoolean())); - system.add(new Operator("Avg", new Signature(new ListType(systemModel.getDecimal())), systemModel.getDecimal())); - system.add(new Operator("Avg", new Signature(new ListType(systemModel.getQuantity())), systemModel.getQuantity())); + add(system, tb, new Operator("AllTrue", new Signature(new ListType(systemModel.getBoolean())), systemModel.getBoolean())); + add(system, tb, new Operator("AnyTrue", new Signature(new ListType(systemModel.getBoolean())), systemModel.getBoolean())); + add(system, tb, new Operator("Avg", new Signature(new ListType(systemModel.getDecimal())), systemModel.getDecimal())); + add(system, tb, new Operator("Avg", new Signature(new ListType(systemModel.getQuantity())), systemModel.getQuantity())); // Count(list) : Integer - system.add(new GenericOperator("Count", new Signature(new ListType(new TypeParameter("T"))), systemModel.getInteger(), new TypeParameter("T"))); + add(system, tb, new GenericOperator("Count", new Signature(new ListType(new TypeParameter("T"))), systemModel.getInteger(), new TypeParameter("T"))); //// Count(list) : Integer - //system.add(new Operator("Count", new Signature(new ListType(systemModel.getAny())), systemModel.getInteger())); - system.add(new Operator("GeometricMean", new Signature(new ListType(systemModel.getDecimal())), systemModel.getDecimal())); - system.add(new Operator("Max", new Signature(new ListType(systemModel.getInteger())), systemModel.getInteger())); - system.add(new Operator("Max", new Signature(new ListType(systemModel.getLong())), systemModel.getLong())); - system.add(new Operator("Max", new Signature(new ListType(systemModel.getDecimal())), systemModel.getDecimal())); - system.add(new Operator("Max", new Signature(new ListType(systemModel.getQuantity())), systemModel.getQuantity())); - system.add(new Operator("Max", new Signature(new ListType(systemModel.getDateTime())), systemModel.getDateTime())); - system.add(new Operator("Max", new Signature(new ListType(systemModel.getDate())), systemModel.getDate())); - system.add(new Operator("Max", new Signature(new ListType(systemModel.getTime())), systemModel.getTime())); - system.add(new Operator("Max", new Signature(new ListType(systemModel.getString())), systemModel.getString())); - system.add(new Operator("Min", new Signature(new ListType(systemModel.getInteger())), systemModel.getInteger())); - system.add(new Operator("Min", new Signature(new ListType(systemModel.getLong())), systemModel.getLong())); - system.add(new Operator("Min", new Signature(new ListType(systemModel.getDecimal())), systemModel.getDecimal())); - system.add(new Operator("Min", new Signature(new ListType(systemModel.getQuantity())), systemModel.getQuantity())); - system.add(new Operator("Min", new Signature(new ListType(systemModel.getDateTime())), systemModel.getDateTime())); - system.add(new Operator("Min", new Signature(new ListType(systemModel.getDate())), systemModel.getDate())); - system.add(new Operator("Min", new Signature(new ListType(systemModel.getTime())), systemModel.getTime())); - system.add(new Operator("Min", new Signature(new ListType(systemModel.getString())), systemModel.getString())); - system.add(new Operator("Median", new Signature(new ListType(systemModel.getDecimal())), systemModel.getDecimal())); - system.add(new Operator("Median", new Signature(new ListType(systemModel.getQuantity())), systemModel.getQuantity())); + //add(system, tb, new Operator("Count", new Signature(new ListType(systemModel.getAny())), systemModel.getInteger())); + add(system, tb, new Operator("GeometricMean", new Signature(new ListType(systemModel.getDecimal())), systemModel.getDecimal())); + add(system, tb, new Operator("Max", new Signature(new ListType(systemModel.getInteger())), systemModel.getInteger())); + add(system, tb, new Operator("Max", new Signature(new ListType(systemModel.getLong())), systemModel.getLong())); + add(system, tb, new Operator("Max", new Signature(new ListType(systemModel.getDecimal())), systemModel.getDecimal())); + add(system, tb, new Operator("Max", new Signature(new ListType(systemModel.getQuantity())), systemModel.getQuantity())); + add(system, tb, new Operator("Max", new Signature(new ListType(systemModel.getDateTime())), systemModel.getDateTime())); + add(system, tb, new Operator("Max", new Signature(new ListType(systemModel.getDate())), systemModel.getDate())); + add(system, tb, new Operator("Max", new Signature(new ListType(systemModel.getTime())), systemModel.getTime())); + add(system, tb, new Operator("Max", new Signature(new ListType(systemModel.getString())), systemModel.getString())); + add(system, tb, new Operator("Min", new Signature(new ListType(systemModel.getInteger())), systemModel.getInteger())); + add(system, tb, new Operator("Min", new Signature(new ListType(systemModel.getLong())), systemModel.getLong())); + add(system, tb, new Operator("Min", new Signature(new ListType(systemModel.getDecimal())), systemModel.getDecimal())); + add(system, tb, new Operator("Min", new Signature(new ListType(systemModel.getQuantity())), systemModel.getQuantity())); + add(system, tb, new Operator("Min", new Signature(new ListType(systemModel.getDateTime())), systemModel.getDateTime())); + add(system, tb, new Operator("Min", new Signature(new ListType(systemModel.getDate())), systemModel.getDate())); + add(system, tb, new Operator("Min", new Signature(new ListType(systemModel.getTime())), systemModel.getTime())); + add(system, tb, new Operator("Min", new Signature(new ListType(systemModel.getString())), systemModel.getString())); + add(system, tb, new Operator("Median", new Signature(new ListType(systemModel.getDecimal())), systemModel.getDecimal())); + add(system, tb, new Operator("Median", new Signature(new ListType(systemModel.getQuantity())), systemModel.getQuantity())); // Mode(list) : T - system.add(new GenericOperator("Mode", new Signature(new ListType(new TypeParameter("T"))), new TypeParameter("T"), new TypeParameter("T"))); - system.add(new Operator("PopulationStdDev", new Signature(new ListType(systemModel.getDecimal())), systemModel.getDecimal())); - system.add(new Operator("PopulationStdDev", new Signature(new ListType(systemModel.getQuantity())), systemModel.getQuantity())); - system.add(new Operator("PopulationVariance", new Signature(new ListType(systemModel.getDecimal())), systemModel.getDecimal())); - system.add(new Operator("PopulationVariance", new Signature(new ListType(systemModel.getQuantity())), systemModel.getQuantity())); - system.add(new Operator("Product", new Signature(new ListType(systemModel.getInteger())), systemModel.getInteger())); - system.add(new Operator("Product", new Signature(new ListType(systemModel.getLong())), systemModel.getLong())); - system.add(new Operator("Product", new Signature(new ListType(systemModel.getDecimal())), systemModel.getDecimal())); - system.add(new Operator("Product", new Signature(new ListType(systemModel.getQuantity())), systemModel.getQuantity())); - system.add(new Operator("StdDev", new Signature(new ListType(systemModel.getDecimal())), systemModel.getDecimal())); - system.add(new Operator("StdDev", new Signature(new ListType(systemModel.getQuantity())), systemModel.getQuantity())); - system.add(new Operator("Sum", new Signature(new ListType(systemModel.getInteger())), systemModel.getInteger())); - system.add(new Operator("Sum", new Signature(new ListType(systemModel.getLong())), systemModel.getLong())); - system.add(new Operator("Sum", new Signature(new ListType(systemModel.getDecimal())), systemModel.getDecimal())); - system.add(new Operator("Sum", new Signature(new ListType(systemModel.getQuantity())), systemModel.getQuantity())); - system.add(new Operator("Variance", new Signature(new ListType(systemModel.getDecimal())), systemModel.getDecimal())); - system.add(new Operator("Variance", new Signature(new ListType(systemModel.getQuantity())), systemModel.getQuantity())); + add(system, tb, new GenericOperator("Mode", new Signature(new ListType(new TypeParameter("T"))), new TypeParameter("T"), new TypeParameter("T"))); + add(system, tb, new Operator("PopulationStdDev", new Signature(new ListType(systemModel.getDecimal())), systemModel.getDecimal())); + add(system, tb, new Operator("PopulationStdDev", new Signature(new ListType(systemModel.getQuantity())), systemModel.getQuantity())); + add(system, tb, new Operator("PopulationVariance", new Signature(new ListType(systemModel.getDecimal())), systemModel.getDecimal())); + add(system, tb, new Operator("PopulationVariance", new Signature(new ListType(systemModel.getQuantity())), systemModel.getQuantity())); + add(system, tb, new Operator("Product", new Signature(new ListType(systemModel.getInteger())), systemModel.getInteger())); + add(system, tb, new Operator("Product", new Signature(new ListType(systemModel.getLong())), systemModel.getLong())); + add(system, tb, new Operator("Product", new Signature(new ListType(systemModel.getDecimal())), systemModel.getDecimal())); + add(system, tb, new Operator("Product", new Signature(new ListType(systemModel.getQuantity())), systemModel.getQuantity())); + add(system, tb, new Operator("StdDev", new Signature(new ListType(systemModel.getDecimal())), systemModel.getDecimal())); + add(system, tb, new Operator("StdDev", new Signature(new ListType(systemModel.getQuantity())), systemModel.getQuantity())); + add(system, tb, new Operator("Sum", new Signature(new ListType(systemModel.getInteger())), systemModel.getInteger())); + add(system, tb, new Operator("Sum", new Signature(new ListType(systemModel.getLong())), systemModel.getLong())); + add(system, tb, new Operator("Sum", new Signature(new ListType(systemModel.getDecimal())), systemModel.getDecimal())); + add(system, tb, new Operator("Sum", new Signature(new ListType(systemModel.getQuantity())), systemModel.getQuantity())); + add(system, tb, new Operator("Variance", new Signature(new ListType(systemModel.getDecimal())), systemModel.getDecimal())); + add(system, tb, new Operator("Variance", new Signature(new ListType(systemModel.getQuantity())), systemModel.getQuantity())); // Clinical // ToConcept(Code) Operator codeToConcept = new Operator("ToConcept", new Signature(systemModel.getCode()), systemModel.getConcept()); - system.add(codeToConcept); - system.add(new Conversion(codeToConcept, true)); + add(system, tb, codeToConcept); + add(system, tb, new Conversion(codeToConcept, true)); // ToConcept(list) Operator codesToConcept = new Operator("ToConcept", new Signature(new ListType(systemModel.getCode())), systemModel.getConcept()); - system.add(codesToConcept); - system.add(new Conversion(codesToConcept, false)); + add(system, tb, codesToConcept); + add(system, tb, new Conversion(codesToConcept, false)); - system.add(new Operator("CalculateAge", new Signature(systemModel.getDateTime()), systemModel.getInteger())); - system.add(new Operator("CalculateAge", new Signature(systemModel.getDate()), systemModel.getInteger())); - system.add(new Operator("CalculateAgeAt", new Signature(systemModel.getDateTime(), systemModel.getDateTime()), systemModel.getInteger())); - system.add(new Operator("CalculateAgeAt", new Signature(systemModel.getDate(), systemModel.getDate()), systemModel.getInteger())); + add(system, tb, new Operator("CalculateAge", new Signature(systemModel.getDateTime()), systemModel.getInteger())); + add(system, tb, new Operator("CalculateAge", new Signature(systemModel.getDate()), systemModel.getInteger())); + add(system, tb, new Operator("CalculateAgeAt", new Signature(systemModel.getDateTime(), systemModel.getDateTime()), systemModel.getInteger())); + add(system, tb, new Operator("CalculateAgeAt", new Signature(systemModel.getDate(), systemModel.getDate()), systemModel.getInteger())); - system.add(new Operator("InValueSet", new Signature(systemModel.getString()), systemModel.getBoolean())); - system.add(new Operator("InValueSet", new Signature(systemModel.getCode()), systemModel.getBoolean())); - system.add(new Operator("InValueSet", new Signature(systemModel.getConcept()), systemModel.getBoolean())); + add(system, tb, new Operator("InValueSet", new Signature(systemModel.getString()), systemModel.getBoolean())); + add(system, tb, new Operator("InValueSet", new Signature(systemModel.getCode()), systemModel.getBoolean())); + add(system, tb, new Operator("InValueSet", new Signature(systemModel.getConcept()), systemModel.getBoolean())); - system.add(new Operator("InValueSet", new Signature(systemModel.getString(), systemModel.getValueSet()), systemModel.getBoolean())); - system.add(new Operator("InValueSet", new Signature(systemModel.getCode(), systemModel.getValueSet()), systemModel.getBoolean())); - system.add(new Operator("InValueSet", new Signature(systemModel.getConcept(), systemModel.getValueSet()), systemModel.getBoolean())); + add(system, tb, new Operator("InValueSet", new Signature(systemModel.getString(), systemModel.getValueSet()), systemModel.getBoolean())); + add(system, tb, new Operator("InValueSet", new Signature(systemModel.getCode(), systemModel.getValueSet()), systemModel.getBoolean())); + add(system, tb, new Operator("InValueSet", new Signature(systemModel.getConcept(), systemModel.getValueSet()), systemModel.getBoolean())); - system.add(new Operator("AnyInValueSet", new Signature(new ListType(systemModel.getString())), systemModel.getBoolean())); - system.add(new Operator("AnyInValueSet", new Signature(new ListType(systemModel.getCode())), systemModel.getBoolean())); - system.add(new Operator("AnyInValueSet", new Signature(new ListType(systemModel.getConcept())), systemModel.getBoolean())); + add(system, tb, new Operator("AnyInValueSet", new Signature(new ListType(systemModel.getString())), systemModel.getBoolean())); + add(system, tb, new Operator("AnyInValueSet", new Signature(new ListType(systemModel.getCode())), systemModel.getBoolean())); + add(system, tb, new Operator("AnyInValueSet", new Signature(new ListType(systemModel.getConcept())), systemModel.getBoolean())); - system.add(new Operator("AnyInValueSet", new Signature(new ListType(systemModel.getString()), systemModel.getValueSet()), systemModel.getBoolean())); - system.add(new Operator("AnyInValueSet", new Signature(new ListType(systemModel.getCode()), systemModel.getValueSet()), systemModel.getBoolean())); - system.add(new Operator("AnyInValueSet", new Signature(new ListType(systemModel.getConcept()), systemModel.getValueSet()), systemModel.getBoolean())); + add(system, tb, new Operator("AnyInValueSet", new Signature(new ListType(systemModel.getString()), systemModel.getValueSet()), systemModel.getBoolean())); + add(system, tb, new Operator("AnyInValueSet", new Signature(new ListType(systemModel.getCode()), systemModel.getValueSet()), systemModel.getBoolean())); + add(system, tb, new Operator("AnyInValueSet", new Signature(new ListType(systemModel.getConcept()), systemModel.getValueSet()), systemModel.getBoolean())); - system.add(new Operator("InCodeSystem", new Signature(systemModel.getString()), systemModel.getBoolean())); - system.add(new Operator("InCodeSystem", new Signature(systemModel.getCode()), systemModel.getBoolean())); - system.add(new Operator("InCodeSystem", new Signature(systemModel.getConcept()), systemModel.getBoolean())); + add(system, tb, new Operator("InCodeSystem", new Signature(systemModel.getString()), systemModel.getBoolean())); + add(system, tb, new Operator("InCodeSystem", new Signature(systemModel.getCode()), systemModel.getBoolean())); + add(system, tb, new Operator("InCodeSystem", new Signature(systemModel.getConcept()), systemModel.getBoolean())); - system.add(new Operator("InCodeSystem", new Signature(systemModel.getString(), systemModel.getCodeSystem()), systemModel.getBoolean())); - system.add(new Operator("InCodeSystem", new Signature(systemModel.getCode(), systemModel.getCodeSystem()), systemModel.getBoolean())); - system.add(new Operator("InCodeSystem", new Signature(systemModel.getConcept(), systemModel.getCodeSystem()), systemModel.getBoolean())); + add(system, tb, new Operator("InCodeSystem", new Signature(systemModel.getString(), systemModel.getCodeSystem()), systemModel.getBoolean())); + add(system, tb, new Operator("InCodeSystem", new Signature(systemModel.getCode(), systemModel.getCodeSystem()), systemModel.getBoolean())); + add(system, tb, new Operator("InCodeSystem", new Signature(systemModel.getConcept(), systemModel.getCodeSystem()), systemModel.getBoolean())); - system.add(new Operator("AnyInCodeSystem", new Signature(new ListType(systemModel.getString())), systemModel.getBoolean())); - system.add(new Operator("AnyInCodeSystem", new Signature(new ListType(systemModel.getCode())), systemModel.getBoolean())); - system.add(new Operator("AnyInCodeSystem", new Signature(new ListType(systemModel.getConcept())), systemModel.getBoolean())); + add(system, tb, new Operator("AnyInCodeSystem", new Signature(new ListType(systemModel.getString())), systemModel.getBoolean())); + add(system, tb, new Operator("AnyInCodeSystem", new Signature(new ListType(systemModel.getCode())), systemModel.getBoolean())); + add(system, tb, new Operator("AnyInCodeSystem", new Signature(new ListType(systemModel.getConcept())), systemModel.getBoolean())); - system.add(new Operator("AnyInCodeSystem", new Signature(new ListType(systemModel.getString()), systemModel.getCodeSystem()), systemModel.getBoolean())); - system.add(new Operator("AnyInCodeSystem", new Signature(new ListType(systemModel.getCode()), systemModel.getCodeSystem()), systemModel.getBoolean())); - system.add(new Operator("AnyInCodeSystem", new Signature(new ListType(systemModel.getConcept()), systemModel.getCodeSystem()), systemModel.getBoolean())); + add(system, tb, new Operator("AnyInCodeSystem", new Signature(new ListType(systemModel.getString()), systemModel.getCodeSystem()), systemModel.getBoolean())); + add(system, tb, new Operator("AnyInCodeSystem", new Signature(new ListType(systemModel.getCode()), systemModel.getCodeSystem()), systemModel.getBoolean())); + add(system, tb, new Operator("AnyInCodeSystem", new Signature(new ListType(systemModel.getConcept()), systemModel.getCodeSystem()), systemModel.getBoolean())); - system.add(new Operator("Subsumes", new Signature(systemModel.getCode(), systemModel.getCode()), systemModel.getBoolean())); - system.add(new Operator("Subsumes", new Signature(systemModel.getConcept(), systemModel.getConcept()), systemModel.getBoolean())); + add(system, tb, new Operator("Subsumes", new Signature(systemModel.getCode(), systemModel.getCode()), systemModel.getBoolean())); + add(system, tb, new Operator("Subsumes", new Signature(systemModel.getConcept(), systemModel.getConcept()), systemModel.getBoolean())); - system.add(new Operator("SubsumedBy", new Signature(systemModel.getCode(), systemModel.getCode()), systemModel.getBoolean())); - system.add(new Operator("SubsumedBy", new Signature(systemModel.getConcept(), systemModel.getConcept()), systemModel.getBoolean())); + add(system, tb, new Operator("SubsumedBy", new Signature(systemModel.getCode(), systemModel.getCode()), systemModel.getBoolean())); + add(system, tb, new Operator("SubsumedBy", new Signature(systemModel.getConcept(), systemModel.getConcept()), systemModel.getBoolean())); // Errors // Message(source T, condition Boolean, code String, severity String, message String) T - system.add(new GenericOperator("Message", new Signature(new TypeParameter("T"), systemModel.getBoolean(), + add(system, tb, new GenericOperator("Message", new Signature(new TypeParameter("T"), systemModel.getBoolean(), systemModel.getString(), systemModel.getString(), systemModel.getString()), new TypeParameter("T"), new TypeParameter("T"))); return system; } + + private static void add(TranslatedLibrary systemLibrary, TypeBuilder tb, Operator operator) { + // In the case that an operator is added directly, manufacture a FunctionDef so it can be referred to in ELM Analysis + FunctionDef fd = new FunctionDef(); + fd.setName(operator.getName()); + int n = 0; + for (DataType dataType : operator.getSignature().getOperandTypes()) { + n++; + OperandDef od = new OperandDef().withName(String.format("param%d", n)); + if (dataType instanceof NamedType) { + od.setOperandType(tb.dataTypeToQName(dataType)); + } + else { + od.setOperandTypeSpecifier(tb.dataTypeToTypeSpecifier(dataType)); + } + od.setResultType(dataType); + fd.getOperand().add(od); + } + operator.setFunctionDef(fd); + + systemLibrary.add(fd, operator); + } + + private static void add (TranslatedLibrary systemLibrary, TypeBuilder tb, Conversion conversion) { + systemLibrary.add(conversion); + } } diff --git a/Src/java/cql-to-elm/src/main/java/org/cqframework/cql/cql2elm/model/TranslatedLibrary.java b/Src/java/cql-to-elm/src/main/java/org/cqframework/cql/cql2elm/model/TranslatedLibrary.java index f7128f491..85c1ab5ff 100644 --- a/Src/java/cql-to-elm/src/main/java/org/cqframework/cql/cql2elm/model/TranslatedLibrary.java +++ b/Src/java/cql-to-elm/src/main/java/org/cqframework/cql/cql2elm/model/TranslatedLibrary.java @@ -7,12 +7,14 @@ import org.hl7.elm.r1.*; import java.util.*; +import java.util.List; public class TranslatedLibrary { private VersionedIdentifier identifier; private Library library; - private final HashMap namespace = new HashMap<>(); + private final Map namespace = new HashMap<>(); private final OperatorMap operators = new OperatorMap(); + private final Map functionDefs = new HashMap<>(); private final java.util.List conversions = new ArrayList<>(); public VersionedIdentifier getIdentifier() { @@ -74,7 +76,7 @@ public void add(ParameterDef parameter) { public void add(ExpressionDef expression) { if (expression instanceof FunctionDef) { // Register the operator signature - add(Operator.fromFunctionDef((FunctionDef)expression)); + add((FunctionDef)expression, Operator.fromFunctionDef((FunctionDef)expression)); } else { checkNamespace(expression.getName()); @@ -111,10 +113,11 @@ private void ensureResultType(Operator operator) { } } - public void add(Operator operator) { + public void add(FunctionDef functionDef, Operator operator) { ensureLibrary(operator); ensureResultType(operator); operators.addOperator(operator); + functionDefs.put(operator, functionDef); } public boolean contains(FunctionDef functionDef) { @@ -222,6 +225,34 @@ public ExpressionDef resolveExpressionRef(String identifier) { return null; } + public Iterable resolveFunctionRef(String identifier) { + List results = new ArrayList(); + for (ExpressionDef ed : getLibrary().getStatements().getDef()) { + if (ed instanceof FunctionDef) { + if (ed.getName().equals(identifier)) { + results.add((FunctionDef)ed); + } + } + } + + return results; + } + + public Iterable resolveFunctionRef(String identifier, List signature) { + if (signature == null) { + return resolveFunctionRef(identifier); + } + else { + CallContext cc = new CallContext(this.getIdentifier().getId(), identifier, false, false, false, signature.toArray(new DataType[signature.size()])); + OperatorResolution resolution = resolveCall(cc, null); + ArrayList results = new ArrayList(); + if (resolution != null) { + results.add(resolution.getOperator().getFunctionDef()); + } + return results; + } + } + public OperatorResolution resolveCall(CallContext callContext, ConversionMap conversionMap) { OperatorResolution resolution = operators.resolveOperator(callContext, conversionMap); 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 2fcb6998c..addaf1d73 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 @@ -1,15 +1,14 @@ package org.cqframework.cql.elm.requirements; -import org.cqframework.cql.cql2elm.CqlTranslatorException; -import org.cqframework.cql.cql2elm.CqlTranslatorOptions; -import org.cqframework.cql.cql2elm.LibraryManager; -import org.cqframework.cql.cql2elm.NamespaceManager; +import org.cqframework.cql.cql2elm.*; import org.cqframework.cql.cql2elm.model.LibraryRef; import org.cqframework.cql.cql2elm.model.TranslatedLibrary; +import org.hl7.cql.model.DataType; import org.hl7.elm.r1.*; import javax.xml.namespace.QName; import java.util.*; +import java.util.List; public class ElmRequirementsContext { @@ -20,6 +19,7 @@ public ElmRequirementsContext(LibraryManager libraryManager, CqlTranslatorOption this.libraryManager = libraryManager; this.options = options; this.typeResolver = new TypeResolver(libraryManager); + this.typeBuilder = new TypeBuilder(this.libraryManager.getModelManager()); if (visitor == null) { throw new IllegalArgumentException("visitor required"); @@ -46,6 +46,8 @@ public TypeResolver getTypeResolver() { return this.typeResolver; } + private TypeBuilder typeBuilder; + // Arbitrary starting point for generated local Ids. // If the input ELM does not have local Ids, some of the optimization // outputs require references to be established between ELM nodes, @@ -91,6 +93,9 @@ public boolean inExpressionDefContext() { the visit is complete */ private Map reportedRequirements = new HashMap(); + public Iterable getReportedRequirements() { + return reportedRequirements.values(); + } public ElmRequirements getReportedRequirements(ExpressionDef ed) { return reportedRequirements.get(ed); } @@ -100,6 +105,9 @@ public ElmRequirements getReportedRequirements(ExpressionDef ed) { These are calculated by the visit and reported to the context here after the visit is complete */ private Map inferredRequirements = new HashMap(); + public Iterable getInferredRequirements() { + return inferredRequirements.values(); + } public ElmRequirement getInferredRequirements(ExpressionDef ed) { return inferredRequirements.get(ed); } @@ -342,13 +350,36 @@ public ElmRequirement reportExpressionRef(ExpressionRef expressionRef) { public void reportFunctionRef(FunctionRef functionRef) { TranslatedLibrary targetLibrary = prepareLibraryVisit(getCurrentLibraryIdentifier(), functionRef.getLibraryName()); try { - // TODO: Needs full operator resolution to be able to distinguish overloads. - // For now, reports all overloads - for (ExpressionDef def : targetLibrary.getLibrary().getStatements().getDef()) { - if (def instanceof FunctionDef && def.getName().equals(functionRef.getName())) { - if (!visited.contains(def)) { - visitor.visitElement(def, this); + + List signature; + signature = new ArrayList(); + for (TypeSpecifier ts : functionRef.getSignature()) { + signature.add(typeResolver.resolveTypeSpecifier(ts)); + } + // Signature sizes will only be different in the case that the signature is not present in the ELM, so needs to be constructed + if (signature.size() != functionRef.getOperand().size()) { + for (Expression e : functionRef.getOperand()) { + if (e.getResultType() != null) { + signature.add(e.getResultType()); + } + else if (e.getResultTypeName() != null) { + signature.add(typeResolver.resolveTypeName(e.getResultTypeName())); } + else if (e.getResultTypeSpecifier() != null) { + signature.add(typeResolver.resolveTypeSpecifier(e.getResultTypeSpecifier())); + } + else { + // Signature could not be constructed, fall back to reporting all function defs + signature = null; + break; + } + } + } + + Iterable fds = targetLibrary.resolveFunctionRef(functionRef.getName(), signature); + for (FunctionDef fd : fds) { + if (!visited.contains(fd)) { + visitor.visitElement(fd, this); } } } diff --git a/Src/java/elm-fhir/src/main/java/org/cqframework/cql/elm/requirements/TypeResolver.java b/Src/java/elm-fhir/src/main/java/org/cqframework/cql/elm/requirements/TypeResolver.java index 0b63200a6..bc41bdf77 100644 --- a/Src/java/elm-fhir/src/main/java/org/cqframework/cql/elm/requirements/TypeResolver.java +++ b/Src/java/elm-fhir/src/main/java/org/cqframework/cql/elm/requirements/TypeResolver.java @@ -2,9 +2,11 @@ import org.cqframework.cql.cql2elm.LibraryManager; import org.cqframework.cql.cql2elm.model.Model; -import org.hl7.cql.model.DataType; -import org.hl7.cql.model.IntervalType; -import org.hl7.cql.model.ListType; +import org.hl7.cql.model.*; +import org.hl7.elm.r1.*; + +import javax.xml.namespace.QName; +import java.util.ArrayList; public class TypeResolver { public TypeResolver(LibraryManager libraryManager) { @@ -19,6 +21,83 @@ public LibraryManager getLibraryManager() { return libraryManager; } + public DataType resolveTypeName(QName typeName) { + if (typeName == null) { + throw new IllegalArgumentException("typeName is required"); + } + + // NOTE: This resolution path is ignoring prefix, namespace is required + if (typeName.getNamespaceURI() == null || typeName.getNamespaceURI().equals("")) { + throw new IllegalArgumentException("namespaceURI is required"); + } + + Model model = libraryManager.getModelManager().resolveModelByUri(typeName.getNamespaceURI()); + DataType result = model.resolveTypeName(typeName.getLocalPart()); + if (result == null) { + throw new IllegalArgumentException(String.format("Could not resolve type %s", typeName.toString())); + } + return result; + } + + public DataType resolveTypeSpecifier(TypeSpecifier typeSpecifier) { + if (typeSpecifier == null) { + throw new IllegalArgumentException("typeSpecifier is required"); + } + + // If the typeSpecifier already has a type, use it + if (typeSpecifier.getResultType() != null) { + return typeSpecifier.getResultType(); + } + + if (typeSpecifier instanceof NamedTypeSpecifier) { + return resolveNamedTypeSpecifier((NamedTypeSpecifier)typeSpecifier); + } + else if (typeSpecifier instanceof TupleTypeSpecifier) { + return resolveTupleTypeSpecifier((TupleTypeSpecifier)typeSpecifier); + } + else if (typeSpecifier instanceof IntervalTypeSpecifier) { + return resolveIntervalTypeSpecifier((IntervalTypeSpecifier)typeSpecifier); + } + else if (typeSpecifier instanceof ListTypeSpecifier) { + return resolveListTypeSpecifier((ListTypeSpecifier)typeSpecifier); + } + else if (typeSpecifier instanceof ChoiceTypeSpecifier) { + return resolveChoiceTypeSpecifier((ChoiceTypeSpecifier)typeSpecifier); + } + else { + throw new IllegalArgumentException(String.format("Unknown type specifier category: %s", typeSpecifier.getClass().getSimpleName())); + } + } + + private DataType resolveNamedTypeSpecifier(NamedTypeSpecifier typeSpecifier) { + return resolveTypeName(typeSpecifier.getName()); + } + + private DataType resolveTupleTypeSpecifier(TupleTypeSpecifier typeSpecifier) { + TupleType tupleType = new TupleType(); + for (TupleElementDefinition element : typeSpecifier.getElement()) { + TupleTypeElement tupleElement = new TupleTypeElement(element.getName(), resolveTypeSpecifier(element.getElementType())); + tupleType.addElement(tupleElement); + } + return tupleType; + } + + private DataType resolveIntervalTypeSpecifier(IntervalTypeSpecifier typeSpecifier) { + return new IntervalType(resolveTypeSpecifier(typeSpecifier.getPointType())); + } + + private DataType resolveListTypeSpecifier(ListTypeSpecifier typeSpecifier) { + return new ListType(resolveTypeSpecifier(typeSpecifier.getElementType())); + } + + private DataType resolveChoiceTypeSpecifier(ChoiceTypeSpecifier typeSpecifier) { + ArrayList choiceTypes = new ArrayList(); + for (TypeSpecifier choiceType : typeSpecifier.getChoice()) { + choiceTypes.add(resolveTypeSpecifier(choiceType)); + } + return new ChoiceType(choiceTypes); + } + public DataType resolveTypeName(String modelName, String typeName) { if (modelName == null || modelName.equals("")) { throw new IllegalArgumentException("Unqualified type name cannot be resolved"); 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 125a9438e..58d054ac2 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 @@ -37,6 +37,12 @@ public java.util.List getValidationMessages() { public Library gatherDataRequirements(LibraryManager libraryManager, TranslatedLibrary translatedLibrary, CqlTranslatorOptions options, Set expressions, boolean includeLogicDefinitions) { + return gatherDataRequirements(libraryManager, translatedLibrary, options, expressions, includeLogicDefinitions, true); + } + + public Library gatherDataRequirements(LibraryManager libraryManager, TranslatedLibrary translatedLibrary, + CqlTranslatorOptions options, Set expressions, + boolean includeLogicDefinitions, boolean recursive) { if (libraryManager == null) { throw new IllegalArgumentException("libraryManager required"); } @@ -59,15 +65,27 @@ public Library gatherDataRequirements(LibraryManager libraryManager, TranslatedL } } else { + if (expressionDefs == null) { + expressionDefs = new ArrayList(); + } + context.enterLibrary(translatedLibrary.getIdentifier()); try { for (String expression : expressions) { ExpressionDef ed = translatedLibrary.resolveExpressionRef(expression); - if (expressionDefs == null) { - expressionDefs = new ArrayList(); + if (ed != null) { + expressionDefs.add(ed); + visitor.visitElement(ed, context); + } + else { + // If the expression is the name of any functions, include those in the gather + // TODO: Provide a mechanism to specify a function def (need signature) + Iterable fds = translatedLibrary.resolveFunctionRef(expression); + for (FunctionDef fd : fds) { + expressionDefs.add(fd); + visitor.visitElement(fd, context); + } } - expressionDefs.add(ed); - visitor.visitElement(ed, context); } } finally { @@ -75,23 +93,43 @@ public Library gatherDataRequirements(LibraryManager libraryManager, TranslatedL } } - // TODO: Handle the non-recursive case... + // In the non-recursive case + // Collect top-level dependencies that have the same library identifier as the primary library + // Collect data requirements reported or inferred on expressions in the library + // In the recursive case + // Collect all top-level dependencies + // Collect all reported or inferred data requirements + ElmRequirements requirements = new ElmRequirements(translatedLibrary.getIdentifier(), translatedLibrary.getLibrary()); - // Collect all the dependencies - requirements.reportRequirement(context.getRequirements()); - // Collect reported data requirements from each expression - for (ExpressionDef ed : expressionDefs) { - // Just being defensive here, can happen when there are errors deserializing the measure - if (ed != null) { - // Collect both inferred and reported requirements here, since reported requirements will not include - // directly inferred requirements - ElmRequirements reportedRequirements = context.getReportedRequirements(ed); + if (recursive) { + // Collect all the dependencies + requirements.reportRequirement(context.getRequirements()); + // Collect reported data requirements from each expression + for (ElmRequirements reportedRequirements : context.getReportedRequirements()) { requirements.reportRequirement(reportedRequirements); - - ElmRequirement inferredRequirement = context.getInferredRequirements(ed); + } + for (ElmRequirement inferredRequirement : context.getInferredRequirements()) { requirements.reportRequirement(inferredRequirement); } } + else { + for (ElmRequirement requirement : context.getRequirements().getRequirements()) { + if (requirement.getLibraryIdentifier().equals(translatedLibrary.getIdentifier())) + requirements.reportRequirement(requirement); + } + for (ExpressionDef ed : expressionDefs) { + // Just being defensive here, can happen when there are errors deserializing the measure + if (ed != null) { + // Collect both inferred and reported requirements here, since reported requirements will not include + // directly inferred requirements + ElmRequirements reportedRequirements = context.getReportedRequirements(ed); + requirements.reportRequirement(reportedRequirements); + + ElmRequirement inferredRequirement = context.getInferredRequirements(ed); + requirements.reportRequirement(inferredRequirement); + } + } + } // Collapse the requirements if (options.getCollapseDataRequirements()) { 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 08a569f9e..44c0211a7 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 @@ -17,10 +17,8 @@ import java.io.File; import java.io.IOException; import java.nio.file.Paths; -import java.util.ArrayList; -import java.util.HashSet; +import java.util.*; import java.util.List; -import java.util.Set; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -542,6 +540,16 @@ private CqlTranslatorOptions getTranslatorOptions() { return cqlTranslatorOptions; } + private CqlTranslator setupDataRequirementsGather(String fileName, CqlTranslatorOptions 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; + } + private CqlTranslator setupDataRequirementsAnalysis(String fileName, CqlTranslatorOptions cqlTranslatorOptions) throws IOException { cqlTranslatorOptions.setCollapseDataRequirements(true); cqlTranslatorOptions.setAnalyzeDataRequirements(true); @@ -573,6 +581,108 @@ private void outputModuleDefinitionLibrary(org.hl7.fhir.r5.model.Library moduleD System.out.println(moduleDefString); } + private Iterable getDataRequirementsForType(Iterable dataRequirements, Enumerations.FHIRAllTypes type) { + List results = new ArrayList(); + for (DataRequirement dr : dataRequirements) { + if (dr.getType() == type) { + results.add(dr); + } + } + return results; + } + + @Test + public void TestFunctionDataRequirements() throws IOException { + CqlTranslatorOptions translatorOptions = getTranslatorOptions(); + CqlTranslator translator = setupDataRequirementsGather("CMS104/MATGlobalCommonFunctionsFHIR4.cql", translatorOptions); + org.hl7.fhir.r5.model.Library moduleDefinitionLibrary = getModuleDefinitionLibrary(translator, translatorOptions, Collections.singleton("PrincipalDiagnosis")); + + // DataRequirements of the PrinicipalDiagnosis function: + // [Condition] + Iterable expectedDataRequirements = getDataRequirementsForType(moduleDefinitionLibrary.getDataRequirement(), Enumerations.FHIRAllTypes.CONDITION); + assertTrue(expectedDataRequirements.iterator().hasNext()); + outputModuleDefinitionLibrary(moduleDefinitionLibrary); + } + + @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")); + + // DataRequirements of the Non Elective Inpatient Encounter expression: + // [Encounter: "Non-Elective Inpatient Encounter"] + Iterable actualDataRequirements = getDataRequirementsForType(moduleDefinitionLibrary.getDataRequirement(), Enumerations.FHIRAllTypes.ENCOUNTER); + assertTrue(actualDataRequirements.iterator().hasNext()); + DataRequirement dr = actualDataRequirements.iterator().next(); + DataRequirement.DataRequirementCodeFilterComponent actualDrcf = null; + for (DataRequirement.DataRequirementCodeFilterComponent drcf : dr.getCodeFilter()) { + if ("type".equals(drcf.getPath()) && "http://cts.nlm.nih.gov/fhir/ValueSet/2.16.840.1.113883.3.117.1.7.1.424".equals(drcf.getValueSet())) { + actualDrcf = drcf; + break; + } + } + assertTrue(actualDrcf != null); + outputModuleDefinitionLibrary(moduleDefinitionLibrary); + } + + @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")); + + // DataRequirements of the All Stroke Encounter expression: + // [Encounter: "Non-Elective Inpatient Encounter"] (from Non Elective Inpatient Encounter) + // [Condition] (from PrincipalDiagnosis) + Iterable encounterDataRequirements = getDataRequirementsForType(moduleDefinitionLibrary.getDataRequirement(), Enumerations.FHIRAllTypes.ENCOUNTER); + assertTrue(encounterDataRequirements.iterator().hasNext()); + DataRequirement dr = encounterDataRequirements.iterator().next(); + DataRequirement.DataRequirementCodeFilterComponent actualDrcf = null; + for (DataRequirement.DataRequirementCodeFilterComponent drcf : dr.getCodeFilter()) { + if ("type".equals(drcf.getPath()) && "http://cts.nlm.nih.gov/fhir/ValueSet/2.16.840.1.113883.3.117.1.7.1.424".equals(drcf.getValueSet())) { + actualDrcf = drcf; + break; + } + } + assertTrue(actualDrcf != null); + + Iterable conditionDataRequirements = getDataRequirementsForType(moduleDefinitionLibrary.getDataRequirement(), Enumerations.FHIRAllTypes.CONDITION); + assertTrue(conditionDataRequirements.iterator().hasNext()); + + outputModuleDefinitionLibrary(moduleDefinitionLibrary); + } + + @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, null); + + // DataRequirements of the All Stroke Encounter expression: + // [Encounter: "Non-Elective Inpatient Encounter"] (from Non Elective Inpatient Encounter) + // [Condition] (from PrincipalDiagnosis) + Iterable encounterDataRequirements = getDataRequirementsForType(moduleDefinitionLibrary.getDataRequirement(), Enumerations.FHIRAllTypes.ENCOUNTER); + DataRequirement.DataRequirementCodeFilterComponent actualDrcf = null; + for (DataRequirement dr : encounterDataRequirements) { + for (DataRequirement.DataRequirementCodeFilterComponent drcf : dr.getCodeFilter()) { + if ("type".equals(drcf.getPath()) && "http://cts.nlm.nih.gov/fhir/ValueSet/2.16.840.1.113883.3.117.1.7.1.424".equals(drcf.getValueSet())) { + actualDrcf = drcf; + break; + } + } + if (actualDrcf != null) { + break; + } + } + assertTrue(actualDrcf != null); + + Iterable conditionDataRequirements = getDataRequirementsForType(moduleDefinitionLibrary.getDataRequirement(), Enumerations.FHIRAllTypes.CONDITION); + assertTrue(conditionDataRequirements.iterator().hasNext()); + + outputModuleDefinitionLibrary(moduleDefinitionLibrary); + } + @Test public void TestDataRequirementsAnalysisCase1() throws IOException { CqlTranslatorOptions translatorOptions = getTranslatorOptions(); @@ -703,7 +813,8 @@ public void TestDataRequirementsAnalysisCase1c() throws IOException { // Validate the data requirement is reported correctly in the module definition library DataRequirement expectedDataRequirement = null; - assertEquals(moduleDefinitionLibrary.getDataRequirement().size(), 1); + // TODO: This really should be 1, but we're using the recursive gather, so it reports the [Medication] retrieve in the referenced expression as well + assertEquals(moduleDefinitionLibrary.getDataRequirement().size(), 2); for (DataRequirement dr : moduleDefinitionLibrary.getDataRequirement()) { if (dr.getType() == Enumerations.FHIRAllTypes.MEDICATION) { if (dr.getCodeFilter().size() == 1) { @@ -711,6 +822,7 @@ public void TestDataRequirementsAnalysisCase1c() throws IOException { if ("code".equals(cfc.getPath())) { if ("http://example.org/fhir/ValueSet/aspirin".equals(cfc.getValueSet())) { expectedDataRequirement = dr; + break; } } }