예제 #1
0
        public object Translate(TranslationContext context, ASTNode node)
        {
            // As long as this is list containment, it can be translated using an Exists(Filter(Collection, Condition(Current = Element)));
            var collectionNode = node.Children.FirstOrDefault(c => c.Name == "collection");
            var elementNode    = node.Children.FirstOrDefault(c => c.Name == "element");

            if (elementNode.ResultType is ListType)
            {
                throw new NotSupportedException("In translation with an element of type list is not supported because there is no equivalent CREF representation.");
            }

            var filter = new CREFModel.FilterExpression();

            filter.Items.Add(context.TranslateNode(collectionNode));

            var condition = new CREFModel.BinaryExpression();

            condition.Operator          = CREFModel.BinaryOperator.opEqual;
            condition.OperatorSpecified = true;

            // Assumption: A property expression with no path specified is equivalent to a "current" reference
            var property = new CREFModel.PropertyExpression();

            condition.Items.Add(property);
            condition.Items.Add(context.TranslateNode(elementNode));

            var exists = new CREFModel.UnaryExpression();

            exists.Operator          = CREFModel.UnaryOperator.opExists;
            exists.OperatorSpecified = true;
            exists.Item = filter;

            return(exists);
        }
예제 #2
0
        public object Translate(TranslationContext context, ASTNode node)
        {
            // As long as this is list containment, it can be translated using an Exists(Filter(Source, Condition(Current = Value)));
            // TODO: Contains on a date interval could be translated as well
            var sourceNode  = node.Children.FirstOrDefault(c => c.Name == "source");
            var elementNode = node.Children.FirstOrDefault(c => c.Name == "element");

            if (sourceNode.ResultType is IntervalType)
            {
                throw new NotImplementedException("Contains translation with Interval source is not yet supported.");
            }

            var filter = new CREFModel.FilterExpression();

            filter.Items.Add(context.TranslateNode(sourceNode));

            var condition = new CREFModel.BinaryExpression();

            condition.Operator          = CREFModel.BinaryOperator.opEqual;
            condition.OperatorSpecified = true;

            // Assumption: A property expression with no path specified is equivalent to a "current" reference
            var property = new CREFModel.PropertyExpression();

            condition.Items.Add(property);
            condition.Items.Add(context.TranslateNode(elementNode));

            var exists = new CREFModel.UnaryExpression();

            exists.Operator          = CREFModel.UnaryOperator.opExists;
            exists.OperatorSpecified = true;
            exists.Item = filter;

            return(exists);
        }
예제 #3
0
        public object Translate(TranslationContext context, ASTNode node)
        {
            var result = new CREFModel.BinaryExpression();
            result.Operator = GetOperator();
            result.OperatorSpecified = true;

            foreach (var child in node.Children)
            {
                result.Items.Add(context.TranslateNode(child));
            }

            return result;
        }
예제 #4
0
        private object GetRelatedClinicalStatement(TranslationContext context, ASTNode node, string idPropertyName, CREFModel.PatientQueryType type)
        {
            var propertyNode = GetRelatedClinicalStatementPropertyNode(node);

            if (propertyNode == null)
            {
                throw new InvalidOperationException("Could not resolve related clinical statement property access node.");
            }

            var id     = new CREFModel.PropertyExpression();
            var source = propertyNode.Children.FirstOrDefault();

            if (source != null)
            {
                id.Item = context.TranslateNode(source);
            }
            id.Path = idPropertyName;

            var request = new CREFModel.RequestExpression();

            request.Cardinality          = CREFModel.RequestCardinality.Multiple;
            request.CardinalitySpecified = true;

            request.Type          = type;
            request.TypeSpecified = true;

            var filter = new CREFModel.FilterExpression();

            filter.Items.Add(request);

            var condition = new CREFModel.BinaryExpression();

            condition.Operator          = CREFModel.BinaryOperator.opEqual;
            condition.OperatorSpecified = true;

            var idReference = new CREFModel.PropertyExpression();

            idReference.Path = "ID";
            condition.Items.Add(idReference);
            condition.Items.Add(id);

            filter.Items.Add(condition);

            var first = new CREFModel.UnaryExpression();

            first.Item              = filter;
            first.Operator          = CREFModel.UnaryOperator.opFirst;
            first.OperatorSpecified = true;

            return(first);
        }
예제 #5
0
        public object Translate(TranslationContext context, ASTNode node)
        {
            var result = new CREFModel.BinaryExpression();

            result.Operator          = GetOperator();
            result.OperatorSpecified = true;

            foreach (var child in node.Children)
            {
                result.Items.Add(context.TranslateNode(child));
            }

            return(result);
        }
예제 #6
0
        public object Translate(TranslationContext context, ASTNode node)
        {
            // Ideally, this would be expressed as an InValueSet expression within CREF, but in the absence of such an operator, the translation
            // Can be supporting using: Exists(Filter(ValueSet(ValueSetId), Condition(Current = Operand)))
            var valueSetId        = node.GetAttribute <string>("id");
            var valueSetVersion   = node.GetAttribute <string>("version");
            var valueSetAuthority = node.GetAttribute <string>("authority"); // TODO: Authority resolution?

            var operand = node.Children.FirstOrDefault(c => c.Name == "operand");

            var valueSetExpression = new CREFModel.ValueSetExpression();

            valueSetExpression.ValueSetID = valueSetId;
            if (!String.IsNullOrEmpty(valueSetVersion))
            {
                valueSetExpression.Version          = Convert.ToInt32(valueSetVersion);
                valueSetExpression.VersionSpecified = true;
            }

            var filter = new CREFModel.FilterExpression();

            filter.Items.Add(valueSetExpression);

            var condition = new CREFModel.BinaryExpression();

            condition.Operator          = CREFModel.BinaryOperator.opEqual;
            condition.OperatorSpecified = true;

            // Assumption: A property expression with no path specified is equivalent to a "current" reference
            var property = new CREFModel.PropertyExpression();

            condition.Items.Add(property);
            condition.Items.Add(context.TranslateNode(operand));

            var exists = new CREFModel.UnaryExpression();

            exists.Operator          = CREFModel.UnaryOperator.opExists;
            exists.OperatorSpecified = true;
            exists.Item = filter;

            return(exists);
        }
		protected object GetCalculateAgeExpression(TranslationContext context, object result)
		{
			var calculateAge = new CREFModel.CalculateAge();

			calculateAge.Items.Add(result);

			var binaryExpression = new CREFModel.BinaryExpression();

			// Returns as years, so multiply by days/year to get consistent results with the physical quantity translator
			binaryExpression.Operator = CREFModel.BinaryOperator.opMultiply;
			binaryExpression.OperatorSpecified = true;
			binaryExpression.Items.Add(calculateAge);

			var multiplier = new CREFModel.ValueExpression();
			multiplier.Type = CREFModel.ValueType.Decimal;
			multiplier.TypeSpecified = true;
			multiplier.Value = Convert.ToString(365.25m);

			binaryExpression.Items.Add(multiplier);

			return binaryExpression;
		}
예제 #8
0
        protected object GetCalculateAgeExpression(TranslationContext context, object result)
        {
            var calculateAge = new CREFModel.CalculateAge();

            calculateAge.Items.Add(result);

            var binaryExpression = new CREFModel.BinaryExpression();

            // Returns as years, so multiply by days/year to get consistent results with the physical quantity translator
            binaryExpression.Operator          = CREFModel.BinaryOperator.opMultiply;
            binaryExpression.OperatorSpecified = true;
            binaryExpression.Items.Add(calculateAge);

            var multiplier = new CREFModel.ValueExpression();

            multiplier.Type          = CREFModel.ValueType.Decimal;
            multiplier.TypeSpecified = true;
            multiplier.Value         = Convert.ToString(365.25m);

            binaryExpression.Items.Add(multiplier);

            return(binaryExpression);
        }
예제 #9
0
        public object Translate(TranslationContext context, ASTNode node)
        {
            var result = new CREFModel.Choice();

            var comparand = node.Children.FirstOrDefault(n => n.Name == "comparand");

            foreach (var caseItem in ((Node)node).Children.Where(n => n.Name == "caseItem"))
            {
                var whenNode = caseItem.Children[0] as ASTNode;
                var thenNode = caseItem.Children[1] as ASTNode;

                var condition = new CREFModel.Condition();
                if (comparand == null)
                {
                    condition.Items.Add(context.TranslateNode(whenNode));
                }
                else
                {
                    var equal = new CREFModel.BinaryExpression();
                    equal.Operator          = CREFModel.BinaryOperator.opEqual;
                    equal.OperatorSpecified = true;
                    equal.Items.Add(context.TranslateNode(comparand));
                    equal.Items.Add(context.TranslateNode(whenNode));
                    condition.Items.Add(equal);
                }

                condition.Items.Add(context.TranslateNode(thenNode));

                result.Items.Add(condition);
            }

            var elseNode = node.Children.FirstOrDefault(n => n.Name == "else") as ASTNode;

            result.Items.Add(context.TranslateNode(elseNode));

            return(result);
        }
예제 #10
0
        public object Translate(TranslationContext context, ASTNode node)
        {
            // Ideally, this would be expressed as an InValueSet expression within CREF, but in the absence of such an operator, the translation
            // Can be supporting using: Exists(Filter(ValueSet(ValueSetId), Condition(Current = Operand)))
            var valueSetId = node.GetAttribute<string>("id");
            var valueSetVersion = node.GetAttribute<string>("version");
            var valueSetAuthority = node.GetAttribute<string>("authority"); // TODO: Authority resolution?

            var operand = node.Children.FirstOrDefault(c => c.Name == "operand");

            var valueSetExpression = new CREFModel.ValueSetExpression();
            valueSetExpression.ValueSetID = valueSetId;
            if (!String.IsNullOrEmpty(valueSetVersion))
            {
                valueSetExpression.Version = Convert.ToInt32(valueSetVersion);
                valueSetExpression.VersionSpecified = true;
            }

            var filter = new CREFModel.FilterExpression();

            filter.Items.Add(valueSetExpression);

            var condition = new CREFModel.BinaryExpression();
            condition.Operator = CREFModel.BinaryOperator.opEqual;
            condition.OperatorSpecified = true;

            // Assumption: A property expression with no path specified is equivalent to a "current" reference
            var property = new CREFModel.PropertyExpression();

            condition.Items.Add(property);
            condition.Items.Add(context.TranslateNode(operand));

            var exists = new CREFModel.UnaryExpression();
            exists.Operator = CREFModel.UnaryOperator.opExists;
            exists.OperatorSpecified = true;
            exists.Item = filter;

            return exists;
        }
예제 #11
0
        public object Translate(TranslationContext context, ASTNode node)
        {
            // As long as this is list containment, it can be translated using an Exists(Filter(Collection, Condition(Current = Element)));
            var collectionNode = node.Children.FirstOrDefault(c => c.Name == "collection");
            var elementNode = node.Children.FirstOrDefault(c => c.Name == "element");

            if (elementNode.ResultType is ListType)
            {
                throw new NotSupportedException("In translation with an element of type list is not supported because there is no equivalent CREF representation.");
            }

            var filter = new CREFModel.FilterExpression();

            filter.Items.Add(context.TranslateNode(collectionNode));

            var condition = new CREFModel.BinaryExpression();
            condition.Operator = CREFModel.BinaryOperator.opEqual;
            condition.OperatorSpecified = true;

            // Assumption: A property expression with no path specified is equivalent to a "current" reference
            var property = new CREFModel.PropertyExpression();

            condition.Items.Add(property);
            condition.Items.Add(context.TranslateNode(elementNode));

            var exists = new CREFModel.UnaryExpression();
            exists.Operator = CREFModel.UnaryOperator.opExists;
            exists.OperatorSpecified = true;
            exists.Item = filter;

            return exists;
        }
예제 #12
0
        public object Translate(TranslationContext context, ASTNode node)
        {
            // As long as this is list containment, it can be translated using an Exists(Filter(Source, Condition(Current = Value)));
            // TODO: Contains on a date interval could be translated as well
            var sourceNode = node.Children.FirstOrDefault(c => c.Name == "source");
            var elementNode = node.Children.FirstOrDefault(c => c.Name == "element");

            if (sourceNode.ResultType is IntervalType)
            {
                throw new NotImplementedException("Contains translation with Interval source is not yet supported.");
            }

            var filter = new CREFModel.FilterExpression();

            filter.Items.Add(context.TranslateNode(sourceNode));

            var condition = new CREFModel.BinaryExpression();
            condition.Operator = CREFModel.BinaryOperator.opEqual;
            condition.OperatorSpecified = true;

            // Assumption: A property expression with no path specified is equivalent to a "current" reference
            var property = new CREFModel.PropertyExpression();

            condition.Items.Add(property);
            condition.Items.Add(context.TranslateNode(elementNode));

            var exists = new CREFModel.UnaryExpression();
            exists.Operator = CREFModel.UnaryOperator.opExists;
            exists.OperatorSpecified = true;
            exists.Item = filter;

            return exists;
        }
예제 #13
0
        public object Translate(TranslationContext context, ASTNode node)
        {
            // Model mapping
            var result = new CREFModel.RequestExpression();

            if (node.ResultType == null)
            {
                throw new InvalidOperationException("Clinical request expression has no result type.");
            }

            var cardinality = (RequestCardinality)Enum.Parse(typeof(RequestCardinality), node.Attributes["cardinality"].ToString(), true);
            result.Cardinality = cardinality == RequestCardinality.Single ? CREFModel.RequestCardinality.Single : CREFModel.RequestCardinality.Multiple;
            result.CardinalitySpecified = true;

            var requestListType = node.ResultType as ListType;
            var requestType = (requestListType == null ? node.ResultType : requestListType.ElementType) as ObjectType;
            if (requestType == null)
            {
                throw new InvalidOperationException(String.Format("Unable to determine request type from source type: '{0}'.", node.ResultType.Name));
            }

            result.Type = GetQueryType(context.TransformModelType(requestType));
            result.TypeSpecified = true;

            // Translate Codes
            var codes = node.Children.Where(n => n.Name == "codes").FirstOrDefault();
            if (codes != null)
            {
                var codesResult = context.TranslateNode(codes);
                result.Items.Add(codesResult);
            }

            // Translate DateRange
            var dateRange = node.Children.Where(n => n.Name == "dateRange").FirstOrDefault();
            if (dateRange != null)
            {
                var dateRangeResult = context.TranslateNode(dateRange);
                result.Items.Add(dateRangeResult);
            }

            // Validate idProperty, dateProperty, and codeProperty
            ValidateIdProperty(requestType, node.GetAttribute<string>("idProperty"));
            ValidateDateProperty(requestType, node.GetAttribute<string>("dateProperty"));
            ValidateCodeProperty(requestType, node.GetAttribute<string>("codeProperty"));

            // Add status filters if necessary
            var filterValue = GetStatusFilterValue(requestType);
            if (!String.IsNullOrEmpty(filterValue))
            {
                var filter = new CREFModel.FilterExpression();

                filter.Items.Add(result);

                var condition = new CREFModel.BinaryExpression();
                condition.Operator = CREFModel.BinaryOperator.opEqual;
                condition.OperatorSpecified = true;

                condition.Items.Add(new CREFModel.PropertyExpression() { Path = "Status" });
                condition.Items.Add(new CREFModel.ValueExpression() { Type = CREFModel.ValueType.String, TypeSpecified = true, Value = filterValue });

                filter.Items.Add(condition);

                return filter;
            }

            return result;
        }
예제 #14
0
        public object Translate(TranslationContext context, ASTNode node)
        {
            var result = new CREFModel.Choice();

            var comparand = node.Children.FirstOrDefault(n => n.Name == "comparand");

            foreach (var caseItem in ((Node)node).Children.Where(n => n.Name == "caseItem"))
            {
                var whenNode = caseItem.Children[0] as ASTNode;
                var thenNode = caseItem.Children[1] as ASTNode;

                var condition = new CREFModel.Condition();
                if (comparand == null)
                {
                    condition.Items.Add(context.TranslateNode(whenNode));
                }
                else
                {
                    var equal = new CREFModel.BinaryExpression();
                    equal.Operator = CREFModel.BinaryOperator.opEqual;
                    equal.OperatorSpecified = true;
                    equal.Items.Add(context.TranslateNode(comparand));
                    equal.Items.Add(context.TranslateNode(whenNode));
                    condition.Items.Add(equal);
                }

                condition.Items.Add(context.TranslateNode(thenNode));

                result.Items.Add(condition);
            }

            var elseNode = node.Children.FirstOrDefault(n => n.Name == "else") as ASTNode;

            result.Items.Add(context.TranslateNode(elseNode));

            return result;
        }
예제 #15
0
        public object Translate(TranslationContext context, ASTNode node)
        {
            // Model mapping
            var result = new CREFModel.RequestExpression();

            if (node.ResultType == null)
            {
                throw new InvalidOperationException("Clinical request expression has no result type.");
            }

            var cardinality = (RequestCardinality)Enum.Parse(typeof(RequestCardinality), node.Attributes["cardinality"].ToString(), true);

            result.Cardinality          = cardinality == RequestCardinality.Single ? CREFModel.RequestCardinality.Single : CREFModel.RequestCardinality.Multiple;
            result.CardinalitySpecified = true;

            var requestListType = node.ResultType as ListType;
            var requestType     = (requestListType == null ? node.ResultType : requestListType.ElementType) as ObjectType;

            if (requestType == null)
            {
                throw new InvalidOperationException(String.Format("Unable to determine request type from source type: '{0}'.", node.ResultType.Name));
            }

            result.Type          = GetQueryType(context.TransformModelType(requestType));
            result.TypeSpecified = true;

            // Translate Codes
            var codes = node.Children.Where(n => n.Name == "codes").FirstOrDefault();

            if (codes != null)
            {
                var codesResult = context.TranslateNode(codes);
                result.Items.Add(codesResult);
            }

            // Translate DateRange
            var dateRange = node.Children.Where(n => n.Name == "dateRange").FirstOrDefault();

            if (dateRange != null)
            {
                var dateRangeResult = context.TranslateNode(dateRange);
                result.Items.Add(dateRangeResult);
            }

            // Validate idProperty, dateProperty, and codeProperty
            ValidateIdProperty(requestType, node.GetAttribute <string>("idProperty"));
            ValidateDateProperty(requestType, node.GetAttribute <string>("dateProperty"));
            ValidateCodeProperty(requestType, node.GetAttribute <string>("codeProperty"));

            // Add status filters if necessary
            var filterValue = GetStatusFilterValue(requestType);

            if (!String.IsNullOrEmpty(filterValue))
            {
                var filter = new CREFModel.FilterExpression();

                filter.Items.Add(result);

                var condition = new CREFModel.BinaryExpression();
                condition.Operator          = CREFModel.BinaryOperator.opEqual;
                condition.OperatorSpecified = true;

                condition.Items.Add(new CREFModel.PropertyExpression()
                {
                    Path = "Status"
                });
                condition.Items.Add(new CREFModel.ValueExpression()
                {
                    Type = CREFModel.ValueType.String, TypeSpecified = true, Value = filterValue
                });

                filter.Items.Add(condition);

                return(filter);
            }

            return(result);
        }
        private object GetRelatedClinicalStatement(TranslationContext context, ASTNode node, string idPropertyName, CREFModel.PatientQueryType type)
        {
            var propertyNode = GetRelatedClinicalStatementPropertyNode(node);
            if (propertyNode == null)
            {
                throw new InvalidOperationException("Could not resolve related clinical statement property access node.");
            }

            var id = new CREFModel.PropertyExpression();
            var source = propertyNode.Children.FirstOrDefault();
            if (source != null)
            {
                id.Item = context.TranslateNode(source);
            }
            id.Path = idPropertyName;

            var request = new CREFModel.RequestExpression();
            request.Cardinality = CREFModel.RequestCardinality.Multiple;
            request.CardinalitySpecified = true;

            request.Type = type;
            request.TypeSpecified = true;

            var filter = new CREFModel.FilterExpression();
            filter.Items.Add(request);
                    
            var condition = new CREFModel.BinaryExpression();
            condition.Operator = CREFModel.BinaryOperator.opEqual;
            condition.OperatorSpecified = true;

            var idReference = new CREFModel.PropertyExpression();
            idReference.Path = "ID";
            condition.Items.Add(idReference);
            condition.Items.Add(id);

            filter.Items.Add(condition);

            var first = new CREFModel.UnaryExpression();
            first.Item = filter;
            first.Operator = CREFModel.UnaryOperator.opFirst;
            first.OperatorSpecified = true;

            return first;
        }