Mercurial > pub > bltoolkit
comparison Source/Data/Sql/SqlExpression.cs @ 0:f990fcb411a9
Копия текущей версии из github
| author | cin |
|---|---|
| date | Thu, 27 Mar 2014 21:46:09 +0400 |
| parents | |
| children |
comparison
equal
deleted
inserted
replaced
| -1:000000000000 | 0:f990fcb411a9 |
|---|---|
| 1 using System; | |
| 2 using System.Collections.Generic; | |
| 3 using System.Linq; | |
| 4 using System.Text; | |
| 5 | |
| 6 namespace BLToolkit.Data.Sql | |
| 7 { | |
| 8 public class SqlExpression : ISqlExpression | |
| 9 { | |
| 10 public SqlExpression(Type systemType, string expr, int precedence, params ISqlExpression[] parameters) | |
| 11 { | |
| 12 if (parameters == null) throw new ArgumentNullException("parameters"); | |
| 13 | |
| 14 foreach (var value in parameters) | |
| 15 if (value == null) throw new ArgumentNullException("parameters"); | |
| 16 | |
| 17 SystemType = systemType; | |
| 18 Expr = expr; | |
| 19 Precedence = precedence; | |
| 20 Parameters = parameters; | |
| 21 } | |
| 22 | |
| 23 public SqlExpression(string expr, int precedence, params ISqlExpression[] parameters) | |
| 24 : this(null, expr, precedence, parameters) | |
| 25 { | |
| 26 } | |
| 27 | |
| 28 public SqlExpression(Type systemType, string expr, params ISqlExpression[] parameters) | |
| 29 : this(systemType, expr, Sql.Precedence.Unknown, parameters) | |
| 30 { | |
| 31 } | |
| 32 | |
| 33 public SqlExpression(string expr, params ISqlExpression[] parameters) | |
| 34 : this(null, expr, Sql.Precedence.Unknown, parameters) | |
| 35 { | |
| 36 } | |
| 37 | |
| 38 public Type SystemType { get; private set; } | |
| 39 public string Expr { get; private set; } | |
| 40 | |
| 41 public int Precedence { get; private set; } | |
| 42 public ISqlExpression[] Parameters { get; private set; } | |
| 43 | |
| 44 #region Overrides | |
| 45 | |
| 46 #if OVERRIDETOSTRING | |
| 47 | |
| 48 public override string ToString() | |
| 49 { | |
| 50 return ((IQueryElement)this).ToString(new StringBuilder(), new Dictionary<IQueryElement,IQueryElement>()).ToString(); | |
| 51 } | |
| 52 | |
| 53 #endif | |
| 54 | |
| 55 #endregion | |
| 56 | |
| 57 #region ISqlExpressionWalkable Members | |
| 58 | |
| 59 [Obsolete] | |
| 60 ISqlExpression ISqlExpressionWalkable.Walk(bool skipColumns, Func<ISqlExpression,ISqlExpression> func) | |
| 61 { | |
| 62 for (var i = 0; i < Parameters.Length; i++) | |
| 63 Parameters[i] = Parameters[i].Walk(skipColumns, func); | |
| 64 | |
| 65 return func(this); | |
| 66 } | |
| 67 | |
| 68 #endregion | |
| 69 | |
| 70 #region IEquatable<ISqlExpression> Members | |
| 71 | |
| 72 bool IEquatable<ISqlExpression>.Equals(ISqlExpression other) | |
| 73 { | |
| 74 return Equals(other, DefaultComparer); | |
| 75 } | |
| 76 | |
| 77 #endregion | |
| 78 | |
| 79 #region ISqlExpression Members | |
| 80 | |
| 81 public bool CanBeNull() | |
| 82 { | |
| 83 foreach (var value in Parameters) | |
| 84 if (value.CanBeNull()) | |
| 85 return true; | |
| 86 | |
| 87 return false; | |
| 88 } | |
| 89 | |
| 90 public static Func<ISqlExpression,ISqlExpression,bool> DefaultComparer = (x, y) => true; | |
| 91 | |
| 92 public bool Equals(ISqlExpression other, Func<ISqlExpression,ISqlExpression,bool> comparer) | |
| 93 { | |
| 94 if (this == other) | |
| 95 return true; | |
| 96 | |
| 97 var expr = other as SqlExpression; | |
| 98 | |
| 99 if (expr == null || SystemType != expr.SystemType || Expr != expr.Expr || Parameters.Length != expr.Parameters.Length) | |
| 100 return false; | |
| 101 | |
| 102 for (var i = 0; i < Parameters.Length; i++) | |
| 103 if (!Parameters[i].Equals(expr.Parameters[i], comparer)) | |
| 104 return false; | |
| 105 | |
| 106 return comparer(this, other); | |
| 107 } | |
| 108 | |
| 109 #endregion | |
| 110 | |
| 111 #region ICloneableElement Members | |
| 112 | |
| 113 public ICloneableElement Clone(Dictionary<ICloneableElement, ICloneableElement> objectTree, Predicate<ICloneableElement> doClone) | |
| 114 { | |
| 115 if (!doClone(this)) | |
| 116 return this; | |
| 117 | |
| 118 ICloneableElement clone; | |
| 119 | |
| 120 if (!objectTree.TryGetValue(this, out clone)) | |
| 121 { | |
| 122 objectTree.Add(this, clone = new SqlExpression( | |
| 123 SystemType, | |
| 124 Expr, | |
| 125 Precedence, | |
| 126 Parameters.Select(e => (ISqlExpression)e.Clone(objectTree, doClone)).ToArray())); | |
| 127 } | |
| 128 | |
| 129 return clone; | |
| 130 } | |
| 131 | |
| 132 #endregion | |
| 133 | |
| 134 #region IQueryElement Members | |
| 135 | |
| 136 public QueryElementType ElementType { get { return QueryElementType.SqlExpression; } } | |
| 137 | |
| 138 StringBuilder IQueryElement.ToString(StringBuilder sb, Dictionary<IQueryElement,IQueryElement> dic) | |
| 139 { | |
| 140 var len = sb.Length; | |
| 141 var ss = Parameters.Select(p => | |
| 142 { | |
| 143 p.ToString(sb, dic); | |
| 144 var s = sb.ToString(len, sb.Length - len); | |
| 145 sb.Length = len; | |
| 146 return (object)s; | |
| 147 }); | |
| 148 | |
| 149 return sb.AppendFormat(Expr, ss.ToArray()); | |
| 150 } | |
| 151 | |
| 152 #endregion | |
| 153 | |
| 154 #region Public Static Members | |
| 155 | |
| 156 public static bool NeedsEqual(IQueryElement ex) | |
| 157 { | |
| 158 switch (ex.ElementType) | |
| 159 { | |
| 160 case QueryElementType.SqlParameter: | |
| 161 case QueryElementType.SqlField : | |
| 162 case QueryElementType.Column : return true; | |
| 163 case QueryElementType.SqlFunction : | |
| 164 | |
| 165 var f = (SqlFunction)ex; | |
| 166 | |
| 167 switch (f.Name) | |
| 168 { | |
| 169 case "EXISTS" : return false; | |
| 170 } | |
| 171 | |
| 172 return true; | |
| 173 } | |
| 174 | |
| 175 return false; | |
| 176 } | |
| 177 | |
| 178 #endregion | |
| 179 } | |
| 180 } |
