diff Source/Data/Sql/SqlFunction.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/SqlFunction.cs	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,192 @@
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+
+namespace BLToolkit.Data.Sql
+{
+	public class SqlFunction : ISqlExpression//ISqlTableSource
+	{
+		[Obsolete]
+		public SqlFunction(string name, params ISqlExpression[] parameters)
+			: this(null, name, Sql.Precedence.Primary, parameters)
+		{
+		}
+
+		[Obsolete]
+		public SqlFunction(string name, int precedence, params ISqlExpression[] parameters)
+			: this(null, name, precedence, parameters)
+		{
+		}
+
+		public SqlFunction(Type systemType, string name, params ISqlExpression[] parameters)
+			: this(systemType, name, Sql.Precedence.Primary, parameters)
+		{
+		}
+
+		public SqlFunction(Type systemType, string name, int precedence, params ISqlExpression[] parameters)
+		{
+			//_sourceID = Interlocked.Increment(ref SqlQuery.SourceIDCounter);
+
+			if (parameters == null) throw new ArgumentNullException("parameters");
+
+			foreach (var p in parameters)
+				if (p == null) throw new ArgumentNullException("parameters");
+
+			SystemType = systemType;
+			Name       = name;
+			Precedence = precedence;
+			Parameters = parameters;
+		}
+
+		public Type             SystemType { get; private set; }
+		public string           Name       { get; private set; }
+
+		public int              Precedence { get; private set; }
+		public ISqlExpression[] Parameters { get; private set; }
+
+		public static SqlFunction CreateCount (Type type, ISqlTableSource table) { return new SqlFunction(type, "Count",  table.All); }
+
+		public static SqlFunction CreateAll   (SqlQuery subQuery) { return new SqlFunction(typeof(bool), "ALL",    Sql.Precedence.Comparison, subQuery); }
+		public static SqlFunction CreateSome  (SqlQuery subQuery) { return new SqlFunction(typeof(bool), "SOME",   Sql.Precedence.Comparison, subQuery); }
+		public static SqlFunction CreateAny   (SqlQuery subQuery) { return new SqlFunction(typeof(bool), "ANY",    Sql.Precedence.Comparison, subQuery); }
+		public static SqlFunction CreateExists(SqlQuery subQuery) { return new SqlFunction(typeof(bool), "EXISTS", Sql.Precedence.Comparison, subQuery); }
+
+		#region Overrides
+
+#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> action)
+		{
+			for (var i = 0; i < Parameters.Length; i++)
+				Parameters[i] = Parameters[i].Walk(skipColumns, action);
+
+			return action(this);
+		}
+
+		#endregion
+
+		#region IEquatable<ISqlExpression> Members
+
+		bool IEquatable<ISqlExpression>.Equals(ISqlExpression other)
+		{
+			return Equals(other, SqlExpression.DefaultComparer);
+		}
+
+		#endregion
+
+		#region ISqlTableSource Members
+
+		/*
+		readonly int _sourceID;
+		public   int  SourceID { get { return _sourceID; } }
+
+		SqlField _all;
+		SqlField  ISqlTableSource.All
+		{
+			get
+			{
+				if (_all == null)
+				{
+					_all = new SqlField(null, "*", "*", true, -1, null, null);
+					((IChild<ISqlTableSource>)_all).Parent = this;
+				}
+
+				return _all;
+			}
+		}
+
+		IList<ISqlExpression> ISqlTableSource.GetKeys(bool allIfEmpty)
+		{
+			return null;
+		}
+		*/
+
+		#endregion
+
+		#region ISqlExpression Members
+
+		public bool CanBeNull()
+		{
+			return true;
+		}
+
+		public bool Equals(ISqlExpression other, Func<ISqlExpression,ISqlExpression,bool> comparer)
+		{
+			if (this == other)
+				return true;
+
+			var func = other as SqlFunction;
+
+			if (func == null || Name != func.Name || Parameters.Length != func.Parameters.Length && SystemType != func.SystemType)
+				return false;
+
+			for (var i = 0; i < Parameters.Length; i++)
+				if (!Parameters[i].Equals(func.Parameters[i], comparer))
+					return false;
+
+			return 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 SqlFunction(
+					SystemType,
+					Name,
+					Precedence,
+					Parameters.Select(e => (ISqlExpression)e.Clone(objectTree, doClone)).ToArray()));
+			}
+
+			return clone;
+		}
+
+		#endregion
+
+		#region IQueryElement Members
+
+		public QueryElementType ElementType { get { return QueryElementType.SqlFunction; } }
+
+		StringBuilder IQueryElement.ToString(StringBuilder sb, Dictionary<IQueryElement,IQueryElement> dic)
+		{
+			sb
+				.Append(Name)
+				.Append("(");
+
+			foreach (var p in Parameters)
+			{
+				p.ToString(sb, dic);
+				sb.Append(", ");
+			}
+
+			if (Parameters.Length > 0)
+				sb.Length -= 2;
+
+			return sb.Append(")");
+		}
+
+		#endregion
+	}
+}