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); }
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); }
public object Translate(TranslationContext context, ASTNode node) { var unaryExpression = new CREFModel.UnaryExpression(); unaryExpression.Operator = CREFModel.UnaryOperator.opExists; unaryExpression.OperatorSpecified = true; unaryExpression.Item = context.TranslateNode(node.Children[0]); return(unaryExpression); }
protected object GetFirstExpression(TranslationContext context, object source) { var first = new CREFModel.UnaryExpression(); first.Item = source; first.Operator = CREFModel.UnaryOperator.opFirst; first.OperatorSpecified = true; return first; }
protected object GetFirstExpression(TranslationContext context, object source) { var first = new CREFModel.UnaryExpression(); first.Item = source; first.Operator = CREFModel.UnaryOperator.opFirst; first.OperatorSpecified = true; return(first); }
public object Translate(TranslationContext context, ASTNode node) { var result = new CREFModel.UnaryExpression(); result.Operator = GetOperator(); result.OperatorSpecified = true; result.Item = context.TranslateNode(node.Children[0]); 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); }
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); }
public object Translate(TranslationContext context, ASTNode node) { var unaryExpression = new CREFModel.UnaryExpression(); unaryExpression.Operator = CREFModel.UnaryOperator.opExists; unaryExpression.OperatorSpecified = true; unaryExpression.Item = context.TranslateNode(node.Children[0]); return unaryExpression; }
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; }
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; }
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; }
public object Translate(TranslationContext context, ASTNode node) { var result = new CREFModel.UnaryExpression(); result.Operator = GetOperator(); result.OperatorSpecified = true; result.Item = context.TranslateNode(node.Children[0]); 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; }