private void TranslateBaseClinicalAssertion(TranslationContext context, Node node, CREFModel.ClinicalAssertion assertion)
		{
			var actionIdNode = node.Children.FirstOrDefault(c => c.Name == "actionId");
			if (actionIdNode != null)
			{
				assertion.ID = actionIdNode.GetAttribute<string>("root") + ':' + actionIdNode.GetAttribute<string>("extension", "");
			}

			var textEquivalentNode = node.Children.FirstOrDefault(c => c.Name == "textEquivalent");
			if (textEquivalentNode != null)
			{
				assertion.Description = textEquivalentNode.GetAttribute<string>("value");
			}
		}
		private void TranslateActionSentence(TranslationContext context, Node node, CREFModel.MissingDataAssertion result)
		{
			// If we assert that the source artifact can only use specific types of expressions, and that the expressions must be literal (evaluable at compile-time)
			// then we can translate the basic aspects of the assertion, code, code system, and severity.
			var proposalExpression = node.Children.FirstOrDefault(c => c.Name == "actionSentence") as ASTNode;
			if (proposalExpression != null)
			{
				switch (proposalExpression.ResultType.Name)
				{
					case "SubstanceAdministrationProposal" :
					case "SubstanceAdministrationEvent" :
					{
						var substanceCode = ((Node)proposalExpression).Children.FirstOrDefault(c => c.Name == "property" && c.Attributes.ContainsKey("name") && c.GetAttribute<string>("name") == "substance.substanceCode");
						if (substanceCode != null)
						{
							var codeValue = substanceCode.Children.FirstOrDefault(c => c.Name == "value" && c.NodeType.GetLocalName() == "CodeLiteral");
							if (codeValue != null)
							{
								result.Code = codeValue.GetAttribute<string>("code");
								result.CodeSet = codeValue.GetAttribute<string>("codeSystem");
							}
						}
					}
					break;
				}
			}
		}
        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;
        }