diff Source/Data/Sql/SqlBinaryExpression.cs @ 0:f990fcb411a9

Копия текущей версии из github
author cin
date Thu, 27 Mar 2014 21:46:09 +0400
parents
children
line wrap: on
line diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Source/Data/Sql/SqlBinaryExpression.cs	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,139 @@
+using System;
+using System.Collections.Generic;
+using System.Diagnostics;
+using System.Text;
+
+namespace BLToolkit.Data.Sql
+{
+	[Serializable, DebuggerDisplay("SQL = {SqlText}")]
+	public class SqlBinaryExpression : ISqlExpression
+	{
+		public SqlBinaryExpression(Type systemType, ISqlExpression expr1, string operation, ISqlExpression expr2, int precedence)
+		{
+			if (expr1     == null) throw new ArgumentNullException("expr1");
+			if (operation == null) throw new ArgumentNullException("operation");
+			if (expr2     == null) throw new ArgumentNullException("expr2");
+
+			Expr1      = expr1;
+			Operation  = operation;
+			Expr2      = expr2;
+			SystemType = systemType;
+			Precedence = precedence;
+		}
+
+		public SqlBinaryExpression(Type systemType, ISqlExpression expr1, string operation, ISqlExpression expr2)
+			: this(systemType, expr1, operation, expr2, Sql.Precedence.Unknown)
+		{
+		}
+
+		public ISqlExpression Expr1      { get; internal set; }
+		public string         Operation  { get; private set;  }
+		public ISqlExpression Expr2      { get; internal set; }
+		public Type           SystemType { get; private set;  }
+
+		public int            Precedence { get; private set; }
+
+		#region Overrides
+
+		public string SqlText { get { return ToString(); } }
+
+#if OVERRIDETOSTRING
+
+		public override string ToString()
+		{
+			return ((IQueryElement)this).ToString(new StringBuilder(), new Dictionary<IQueryElement,IQueryElement>()).ToString();
+		}
+
+#endif
+
+		#endregion
+
+		#region ISqlExpressionWalkable Members
+
+		[Obsolete]
+		ISqlExpression ISqlExpressionWalkable.Walk(bool skipColumns, Func<ISqlExpression,ISqlExpression> func)
+		{
+			Expr1 = Expr1.Walk(skipColumns, func);
+			Expr2 = Expr2.Walk(skipColumns, func);
+
+			return func(this);
+		}
+
+		#endregion
+
+		#region IEquatable<ISqlExpression> Members
+
+		bool IEquatable<ISqlExpression>.Equals(ISqlExpression other)
+		{
+			return Equals(other, SqlExpression.DefaultComparer);
+		}
+
+		#endregion
+
+		#region ISqlExpression Members
+
+		public bool CanBeNull()
+		{
+			return Expr1.CanBeNull() || Expr2.CanBeNull();
+		}
+
+		public bool Equals(ISqlExpression other, Func<ISqlExpression,ISqlExpression,bool> comparer)
+		{
+			if (this == other)
+				return true;
+
+			var expr = other as SqlBinaryExpression;
+
+			return
+				expr        != null                &&
+				Operation  == expr.Operation       &&
+				SystemType == expr.SystemType      &&
+				Expr1.Equals(expr.Expr1, comparer) &&
+				Expr2.Equals(expr.Expr2, comparer) &&
+				comparer(this, other);
+		}
+
+		#endregion
+
+		#region ICloneableElement Members
+
+		public ICloneableElement Clone(Dictionary<ICloneableElement, ICloneableElement> objectTree, Predicate<ICloneableElement> doClone)
+		{
+			if (!doClone(this))
+				return this;
+
+			ICloneableElement clone;
+
+			if (!objectTree.TryGetValue(this, out clone))
+			{
+				objectTree.Add(this, clone = new SqlBinaryExpression(
+					SystemType,
+					(ISqlExpression)Expr1.Clone(objectTree, doClone),
+					Operation,
+					(ISqlExpression)Expr2.Clone(objectTree, doClone),
+					Precedence));
+			}
+
+			return clone;
+		}
+
+		#endregion
+
+		#region IQueryElement Members
+
+		public QueryElementType ElementType { get { return QueryElementType.SqlBinaryExpression; } }
+
+		StringBuilder IQueryElement.ToString(StringBuilder sb, Dictionary<IQueryElement,IQueryElement> dic)
+		{
+			Expr1
+				.ToString(sb, dic)
+				.Append(' ')
+				.Append(Operation)
+				.Append(' ');
+
+			return Expr2.ToString(sb, dic);
+		}
+
+		#endregion
+	}
+}