private CREFModel.NamedExpression TranslateNamedExpression(TranslationContext context, ExpressionDef expression)
		{
			var result = new CREFModel.NamedExpression();

			result.Name = expression.Name;
			result.Item = context.TranslateNode(expression.Expression);

			return result;
		}
		private Model.Statement TranslateExpressionDef(SQLTranslationContext context, string artifactName, ExpressionDef expressionDef)
		{
			var result = new SQLModel.CreateViewStatement();
			result.ViewName = context.GetExpressionObjectName(String.Format("{0}.{1}", artifactName, expressionDef.Name));
			var translatedExpression = context.TranslateNode(expressionDef.Expression);
			if (DataTypes.Equal(expressionDef.Expression.ResultType, DataTypes.Boolean)) 
			{
				translatedExpression = SQLTranslationUtilities.PromoteBooleanValuedExpression(translatedExpression);
			}

			result.Expression = SQLTranslationUtilities.EnsureSelectExpression(translatedExpression);
			return result;
		}
			public void Push(ExpressionDef def)
			{
				if (def == null)
				{
					throw new ArgumentNullException("def");
				}

				if (_stack.Contains(def.Name))
				{
					throw new InvalidOperationException(String.Format("Reference to expression {0} is invalid because it results in a circular reference.", def.Name));
				}

				_stack.Push(def.Name);
			}