annotate Source/Data/Sql/SqlBinaryExpression.cs @ 4:f757da6161a1

!bug 100 + 2h fixed gregression
author cin
date Sun, 24 Aug 2014 17:57:42 +0400
parents f990fcb411a9
children
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
0
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1 using System;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
2 using System.Collections.Generic;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
3 using System.Diagnostics;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
4 using System.Text;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
5
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
6 namespace BLToolkit.Data.Sql
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
7 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
8 [Serializable, DebuggerDisplay("SQL = {SqlText}")]
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
9 public class SqlBinaryExpression : ISqlExpression
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
10 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
11 public SqlBinaryExpression(Type systemType, ISqlExpression expr1, string operation, ISqlExpression expr2, int precedence)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
12 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
13 if (expr1 == null) throw new ArgumentNullException("expr1");
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
14 if (operation == null) throw new ArgumentNullException("operation");
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
15 if (expr2 == null) throw new ArgumentNullException("expr2");
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
16
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
17 Expr1 = expr1;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
18 Operation = operation;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
19 Expr2 = expr2;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
20 SystemType = systemType;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
21 Precedence = precedence;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
22 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
23
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
24 public SqlBinaryExpression(Type systemType, ISqlExpression expr1, string operation, ISqlExpression expr2)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
25 : this(systemType, expr1, operation, expr2, Sql.Precedence.Unknown)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
26 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
27 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
28
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
29 public ISqlExpression Expr1 { get; internal set; }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
30 public string Operation { get; private set; }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
31 public ISqlExpression Expr2 { get; internal set; }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
32 public Type SystemType { get; private set; }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
33
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
34 public int Precedence { get; private set; }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
35
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
36 #region Overrides
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
37
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
38 public string SqlText { get { return ToString(); } }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
39
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
40 #if OVERRIDETOSTRING
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
41
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
42 public override string ToString()
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
43 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
44 return ((IQueryElement)this).ToString(new StringBuilder(), new Dictionary<IQueryElement,IQueryElement>()).ToString();
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
45 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
46
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
47 #endif
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
48
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
49 #endregion
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
50
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
51 #region ISqlExpressionWalkable Members
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
52
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
53 [Obsolete]
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
54 ISqlExpression ISqlExpressionWalkable.Walk(bool skipColumns, Func<ISqlExpression,ISqlExpression> func)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
55 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
56 Expr1 = Expr1.Walk(skipColumns, func);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
57 Expr2 = Expr2.Walk(skipColumns, func);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
58
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
59 return func(this);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
60 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
61
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
62 #endregion
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
63
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
64 #region IEquatable<ISqlExpression> Members
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
65
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
66 bool IEquatable<ISqlExpression>.Equals(ISqlExpression other)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
67 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
68 return Equals(other, SqlExpression.DefaultComparer);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
69 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
70
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
71 #endregion
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
72
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
73 #region ISqlExpression Members
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
74
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
75 public bool CanBeNull()
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
76 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
77 return Expr1.CanBeNull() || Expr2.CanBeNull();
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
78 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
79
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
80 public bool Equals(ISqlExpression other, Func<ISqlExpression,ISqlExpression,bool> comparer)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
81 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
82 if (this == other)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
83 return true;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
84
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
85 var expr = other as SqlBinaryExpression;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
86
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
87 return
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
88 expr != null &&
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
89 Operation == expr.Operation &&
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
90 SystemType == expr.SystemType &&
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
91 Expr1.Equals(expr.Expr1, comparer) &&
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
92 Expr2.Equals(expr.Expr2, comparer) &&
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
93 comparer(this, other);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
94 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
95
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
96 #endregion
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
97
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
98 #region ICloneableElement Members
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
99
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
100 public ICloneableElement Clone(Dictionary<ICloneableElement, ICloneableElement> objectTree, Predicate<ICloneableElement> doClone)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
101 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
102 if (!doClone(this))
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
103 return this;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
104
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
105 ICloneableElement clone;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
106
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
107 if (!objectTree.TryGetValue(this, out clone))
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
108 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
109 objectTree.Add(this, clone = new SqlBinaryExpression(
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
110 SystemType,
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
111 (ISqlExpression)Expr1.Clone(objectTree, doClone),
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
112 Operation,
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
113 (ISqlExpression)Expr2.Clone(objectTree, doClone),
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
114 Precedence));
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
115 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
116
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
117 return clone;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
118 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
119
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
120 #endregion
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
121
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
122 #region IQueryElement Members
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
123
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
124 public QueryElementType ElementType { get { return QueryElementType.SqlBinaryExpression; } }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
125
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
126 StringBuilder IQueryElement.ToString(StringBuilder sb, Dictionary<IQueryElement,IQueryElement> dic)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
127 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
128 Expr1
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
129 .ToString(sb, dic)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
130 .Append(' ')
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
131 .Append(Operation)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
132 .Append(' ');
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
133
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
134 return Expr2.ToString(sb, dic);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
135 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
136
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
137 #endregion
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
138 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
139 }