annotate Source/Data/Sql/SqlQuery.cs @ 3:1ef98bd70424

!bug 100 +3h Исправление проблемы BLToolkit + mono 3.4
author cin
date Fri, 22 Aug 2014 17:34:46 +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;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
3 using System.Collections.Generic;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
4 using System.Diagnostics;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
5 using System.IO;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
6 using System.Linq;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
7 using System.Text;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
8 using System.Threading;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
9
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
10 using JetBrains.Annotations;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
11
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
12 namespace BLToolkit.Data.Sql
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
13 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
14 using Reflection;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
15
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
16 using FJoin = SqlQuery.FromClause.Join;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
17
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
18 [DebuggerDisplay("SQL = {SqlText}")]
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
19 public class SqlQuery : ISqlTableSource
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
20 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
21 #region Init
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
22
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
23 static readonly Dictionary<string,object> _reservedWords = new Dictionary<string,object>();
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
24
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
25 static SqlQuery()
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
26 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
27 using (var stream = typeof(SqlQuery).Assembly.GetManifestResourceStream(typeof(SqlQuery), "ReservedWords.txt"))
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
28 using (var reader = new StreamReader(stream))
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
29 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
30 /*
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
31 var words = reader.ReadToEnd().Replace(' ', '\n').Replace('\t', '\n').Split('\n');
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
32 var q = from w in words where w.Length > 0 orderby w select w;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
33
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
34 var text = string.Join("\n", q.Distinct().ToArray());
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
35 */
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
36
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
37 string s;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
38 while ((s = reader.ReadLine()) != null)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
39 _reservedWords.Add(s, s);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
40 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
41 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
42
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
43 public SqlQuery()
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
44 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
45 SourceID = Interlocked.Increment(ref SourceIDCounter);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
46
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
47 _select = new SelectClause (this);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
48 _from = new FromClause (this);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
49 _where = new WhereClause (this);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
50 _groupBy = new GroupByClause(this);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
51 _having = new WhereClause (this);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
52 _orderBy = new OrderByClause(this);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
53 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
54
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
55 internal SqlQuery(int id)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
56 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
57 SourceID = id;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
58 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
59
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
60 internal void Init(
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
61 InsertClause insert,
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
62 UpdateClause update,
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
63 DeleteClause delete,
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
64 SelectClause select,
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
65 FromClause from,
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
66 WhereClause where,
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
67 GroupByClause groupBy,
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
68 WhereClause having,
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
69 OrderByClause orderBy,
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
70 List<Union> unions,
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
71 SqlQuery parentSql,
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
72 bool parameterDependent,
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
73 List<SqlParameter> parameters)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
74 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
75 _insert = insert;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
76 _update = update;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
77 _delete = delete;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
78 _select = select;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
79 _from = from;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
80 _where = where;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
81 _groupBy = groupBy;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
82 _having = having;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
83 _orderBy = orderBy;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
84 _unions = unions;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
85 ParentSql = parentSql;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
86 IsParameterDependent = parameterDependent;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
87 _parameters.AddRange(parameters);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
88
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
89 foreach (var col in select.Columns)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
90 col.Parent = this;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
91
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
92 _select. SetSqlQuery(this);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
93 _from. SetSqlQuery(this);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
94 _where. SetSqlQuery(this);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
95 _groupBy.SetSqlQuery(this);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
96 _having. SetSqlQuery(this);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
97 _orderBy.SetSqlQuery(this);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
98 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
99
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
100 readonly List<SqlParameter> _parameters = new List<SqlParameter>();
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
101 public List<SqlParameter> Parameters
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
102 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
103 get { return _parameters; }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
104 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
105
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
106 private List<object> _properties;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
107 public List<object> Properties
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
108 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
109 get { return _properties ?? (_properties = new List<object>()); }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
110 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
111
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
112 public bool IsParameterDependent { get; set; }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
113 public SqlQuery ParentSql { get; set; }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
114
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
115 public bool IsSimple
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
116 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
117 get { return !Select.HasModifier && Where.IsEmpty && GroupBy.IsEmpty && Having.IsEmpty && OrderBy.IsEmpty; }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
118 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
119
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
120 private QueryType _queryType = QueryType.Select;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
121 public QueryType QueryType
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
122 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
123 get { return _queryType; }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
124 set { _queryType = value; }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
125 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
126
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
127 public bool IsSelect { get { return _queryType == QueryType.Select; } }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
128 public bool IsDelete { get { return _queryType == QueryType.Delete; } }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
129 public bool IsInsertOrUpdate { get { return _queryType == QueryType.InsertOrUpdate; } }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
130 public bool IsInsert { get { return _queryType == QueryType.Insert || _queryType == QueryType.InsertOrUpdate; } }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
131 public bool IsUpdate { get { return _queryType == QueryType.Update || _queryType == QueryType.InsertOrUpdate; } }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
132
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
133 #endregion
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
134
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
135 #region Column
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
136
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
137 public class Column : IEquatable<Column>, ISqlExpression, IChild<SqlQuery>
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
138 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
139 public Column(SqlQuery parent, ISqlExpression expression, string alias)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
140 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
141 if (expression == null) throw new ArgumentNullException("expression");
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
142
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
143 Parent = parent;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
144 Expression = expression;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
145 _alias = alias;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
146
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
147 #if DEBUG
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
148 _columnNumber = ++_columnCounter;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
149 #endif
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
150 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
151
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
152 public Column(SqlQuery builder, ISqlExpression expression)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
153 : this(builder, expression, null)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
154 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
155 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
156
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
157 #if DEBUG
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
158 readonly int _columnNumber;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
159 static int _columnCounter;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
160 #endif
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
161
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
162 public ISqlExpression Expression { get; set; }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
163
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
164 internal string _alias;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
165 public string Alias
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
166 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
167 get
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
168 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
169 if (_alias == null)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
170 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
171 if (Expression is SqlField)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
172 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
173 var field = (SqlField)Expression;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
174 return field.Alias ?? field.PhysicalName;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
175 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
176
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
177 if (Expression is Column)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
178 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
179 var col = (Column)Expression;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
180 return col.Alias;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
181 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
182 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
183
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
184 return _alias;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
185 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
186 set { _alias = value; }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
187 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
188
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
189 public bool Equals(Column other)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
190 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
191 return Expression.Equals(other.Expression);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
192 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
193
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
194 #if OVERRIDETOSTRING
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
195
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
196 public override string ToString()
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
197 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
198 return ((IQueryElement)this).ToString(new StringBuilder(), new Dictionary<IQueryElement,IQueryElement>()).ToString();
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
199 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
200
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
201 #endif
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
202
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
203 #region ISqlExpression Members
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
204
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
205 public bool CanBeNull()
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
206 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
207 return Expression.CanBeNull();
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
208 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
209
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
210 public bool Equals(ISqlExpression other, Func<ISqlExpression,ISqlExpression,bool> comparer)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
211 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
212 if (this == other)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
213 return true;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
214
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
215 return
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
216 other is Column &&
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
217 Expression.Equals(((Column)other).Expression, comparer) &&
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
218 comparer(this, other);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
219 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
220
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
221 public int Precedence
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
222 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
223 get { return Sql.Precedence.Primary; }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
224 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
225
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
226 public Type SystemType
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
227 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
228 get { return Expression.SystemType; }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
229 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
230
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
231 public ICloneableElement Clone(Dictionary<ICloneableElement, ICloneableElement> objectTree, Predicate<ICloneableElement> doClone)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
232 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
233 if (!doClone(this))
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
234 return this;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
235
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
236 ICloneableElement clone;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
237
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
238 var parent = (SqlQuery)Parent.Clone(objectTree, doClone);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
239
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
240 if (!objectTree.TryGetValue(this, out clone))
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
241 objectTree.Add(this, clone = new Column(
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
242 parent,
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
243 (ISqlExpression)Expression.Clone(objectTree, doClone),
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
244 _alias));
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
245
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
246 return clone;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
247 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
248
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
249 #endregion
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
250
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
251 #region IEquatable<ISqlExpression> Members
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
252
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
253 bool IEquatable<ISqlExpression>.Equals(ISqlExpression other)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
254 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
255 if (this == other)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
256 return true;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
257
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
258 return other is Column && Equals((Column)other);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
259 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
260
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
261 #endregion
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
262
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
263 #region ISqlExpressionWalkable Members
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
264
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
265 [Obsolete]
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
266 public ISqlExpression Walk(bool skipColumns, Func<ISqlExpression,ISqlExpression> func)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
267 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
268 if (!(skipColumns && Expression is Column))
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
269 Expression = Expression.Walk(skipColumns, func);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
270
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
271 return func(this);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
272 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
273
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
274 #endregion
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
275
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
276 #region IChild<ISqlTableSource> Members
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
277
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
278 string IChild<SqlQuery>.Name
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
279 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
280 get { return Alias; }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
281 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
282
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
283 public SqlQuery Parent { get; set; }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
284
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
285 #endregion
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
286
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
287 #region IQueryElement Members
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
288
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
289 public QueryElementType ElementType { get { return QueryElementType.Column; } }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
290
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
291 StringBuilder IQueryElement.ToString(StringBuilder sb, Dictionary<IQueryElement,IQueryElement> dic)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
292 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
293 if (dic.ContainsKey(this))
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
294 return sb.Append("...");
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
295
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
296 dic.Add(this, this);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
297
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
298 sb
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
299 .Append('t')
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
300 .Append(Parent.SourceID)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
301 .Append(".");
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
302
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
303 #if DEBUG
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
304 sb.Append('[').Append(_columnNumber).Append(']');
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
305 #endif
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
306
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
307 if (Expression is SqlQuery)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
308 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
309 sb
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
310 .Append("(\n\t\t");
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
311 var len = sb.Length;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
312 Expression.ToString(sb, dic).Replace("\n", "\n\t\t", len, sb.Length - len);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
313 sb.Append("\n\t)");
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
314 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
315 /*else if (Expression is Column)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
316 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
317 var col = (Column)Expression;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
318 sb
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
319 .Append("t")
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
320 .Append(col.Parent.SourceID)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
321 .Append(".")
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
322 .Append(col.Alias ?? "c" + (col.Parent.Select.Columns.IndexOf(col) + 1));
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
323 }*/
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
324 else
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
325 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
326 Expression.ToString(sb, dic);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
327 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
328
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
329 dic.Remove(this);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
330
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
331 return sb;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
332 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
333
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
334 #endregion
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
335 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
336
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
337 #endregion
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
338
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
339 #region TableSource
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
340
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
341 public class TableSource : ISqlTableSource
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
342 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
343 public TableSource(ISqlTableSource source, string alias)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
344 : this(source, alias, null)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
345 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
346 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
347
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
348 public TableSource(ISqlTableSource source, string alias, params JoinedTable[] joins)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
349 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
350 if (source == null) throw new ArgumentNullException("source");
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
351
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
352 Source = source;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
353 _alias = alias;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
354
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
355 if (joins != null)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
356 _joins.AddRange(joins);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
357 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
358
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
359 public TableSource(ISqlTableSource source, string alias, IEnumerable<JoinedTable> joins)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
360 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
361 if (source == null) throw new ArgumentNullException("source");
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
362
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
363 Source = source;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
364 _alias = alias;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
365
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
366 if (joins != null)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
367 _joins.AddRange(joins);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
368 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
369
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
370 public ISqlTableSource Source { get; set; }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
371 public SqlTableType SqlTableType { get { return Source.SqlTableType; } }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
372
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
373 internal string _alias;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
374 public string Alias
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
375 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
376 get
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
377 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
378 if (string.IsNullOrEmpty(_alias))
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
379 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
380 if (Source is TableSource)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
381 return (Source as TableSource).Alias;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
382
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
383 if (Source is SqlTable)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
384 return ((SqlTable)Source).Alias;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
385 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
386
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
387 return _alias;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
388 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
389 set { _alias = value; }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
390 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
391
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
392 public TableSource this[ISqlTableSource table]
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
393 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
394 get { return this[table, null]; }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
395 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
396
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
397 public TableSource this[ISqlTableSource table, string alias]
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
398 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
399 get
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
400 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
401 foreach (var tj in Joins)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
402 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
403 var t = CheckTableSource(tj.Table, table, alias);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
404
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
405 if (t != null)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
406 return t;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
407 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
408
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
409 return null;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
410 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
411 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
412
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
413 readonly List<JoinedTable> _joins = new List<JoinedTable>();
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
414 public List<JoinedTable> Joins
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
415 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
416 get { return _joins; }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
417 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
418
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
419 public void ForEach(Action<TableSource> action, HashSet<SqlQuery> visitedQueries)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
420 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
421 action(this);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
422 foreach (var join in Joins)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
423 join.Table.ForEach(action, visitedQueries);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
424
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
425 if (Source is SqlQuery && visitedQueries.Contains((SqlQuery)Source))
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
426 ((SqlQuery)Source).ForEachTable(action, visitedQueries);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
427 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
428
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
429 public IEnumerable<ISqlTableSource> GetTables()
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
430 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
431 yield return Source;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
432
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
433 foreach (var join in Joins)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
434 foreach (var table in join.Table.GetTables())
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
435 yield return table;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
436 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
437
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
438 public int GetJoinNumber()
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
439 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
440 var n = Joins.Count;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
441
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
442 foreach (var join in Joins)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
443 n += join.Table.GetJoinNumber();
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
444
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
445 return n;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
446 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
447
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
448 #if OVERRIDETOSTRING
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
449
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
450 public override string ToString()
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
451 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
452 return ((IQueryElement)this).ToString(new StringBuilder(), new Dictionary<IQueryElement,IQueryElement>()).ToString();
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
453 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
454
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
455 #endif
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
456
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
457 #region IEquatable<ISqlExpression> Members
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
458
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
459 bool IEquatable<ISqlExpression>.Equals(ISqlExpression other)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
460 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
461 return this == other;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
462 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
463
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
464 #endregion
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
465
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
466 #region ISqlExpressionWalkable Members
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
467
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
468 [Obsolete]
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
469 public ISqlExpression Walk(bool skipColumns, Func<ISqlExpression,ISqlExpression> func)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
470 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
471 Source = (ISqlTableSource)Source.Walk(skipColumns, func);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
472
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
473 foreach (var t in Joins)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
474 ((ISqlExpressionWalkable)t).Walk(skipColumns, func);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
475
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
476 return this;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
477 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
478
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
479 #endregion
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
480
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
481 #region ISqlTableSource Members
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
482
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
483 public int SourceID { get { return Source.SourceID; } }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
484 public SqlField All { get { return Source.All; } }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
485
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
486 IList<ISqlExpression> ISqlTableSource.GetKeys(bool allIfEmpty)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
487 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
488 return Source.GetKeys(allIfEmpty);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
489 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
490
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
491 #endregion
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
492
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
493 #region ICloneableElement Members
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
494
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
495 public ICloneableElement Clone(Dictionary<ICloneableElement, ICloneableElement> objectTree, Predicate<ICloneableElement> doClone)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
496 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
497 if (!doClone(this))
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
498 return this;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
499
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
500 ICloneableElement clone;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
501
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
502 if (!objectTree.TryGetValue(this, out clone))
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
503 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
504 var ts = new TableSource((ISqlTableSource)Source.Clone(objectTree, doClone), _alias);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
505
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
506 objectTree.Add(this, clone = ts);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
507
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
508 ts._joins.AddRange(_joins.ConvertAll(jt => (JoinedTable)jt.Clone(objectTree, doClone)));
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
509 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
510
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
511 return clone;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
512 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
513
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
514 #endregion
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
515
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
516 #region IQueryElement Members
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
517
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
518 public QueryElementType ElementType { get { return QueryElementType.TableSource; } }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
519
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
520 StringBuilder IQueryElement.ToString(StringBuilder sb, Dictionary<IQueryElement,IQueryElement> dic)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
521 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
522 if (sb.Length > 500)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
523 return sb;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
524
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
525 if (dic.ContainsKey(this))
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
526 return sb.Append("...");
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
527
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
528 dic.Add(this, this);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
529
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
530 if (Source is SqlQuery)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
531 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
532 sb.Append("(\n\t");
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
533 var len = sb.Length;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
534 Source.ToString(sb, dic).Replace("\n", "\n\t", len, sb.Length - len);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
535 sb.Append("\n)");
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
536 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
537 else
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
538 Source.ToString(sb, dic);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
539
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
540 sb
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
541 .Append(" as t")
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
542 .Append(SourceID);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
543
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
544 foreach (IQueryElement join in Joins)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
545 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
546 sb.AppendLine().Append('\t');
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
547 var len = sb.Length;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
548 join.ToString(sb, dic).Replace("\n", "\n\t", len, sb.Length - len);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
549 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
550
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
551 dic.Remove(this);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
552
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
553 return sb;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
554 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
555
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
556 #endregion
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
557
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
558 #region ISqlExpression Members
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
559
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
560 public bool CanBeNull()
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
561 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
562 return Source.CanBeNull();
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
563 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
564
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
565 public bool Equals(ISqlExpression other, Func<ISqlExpression,ISqlExpression,bool> comparer)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
566 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
567 return this == other;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
568 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
569
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
570 public int Precedence { get { return Source.Precedence; } }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
571 public Type SystemType { get { return Source.SystemType; } }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
572
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
573 #endregion
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
574 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
575
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
576 #endregion
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
577
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
578 #region TableJoin
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
579
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
580 public enum JoinType
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
581 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
582 Auto,
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
583 Inner,
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
584 Left,
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
585 CrossApply,
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
586 OuterApply
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
587 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
588
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
589 public class JoinedTable : IQueryElement, ISqlExpressionWalkable, ICloneableElement
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
590 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
591 public JoinedTable(JoinType joinType, TableSource table, bool isWeak, SearchCondition searchCondition)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
592 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
593 JoinType = joinType;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
594 Table = table;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
595 IsWeak = isWeak;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
596 Condition = searchCondition;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
597 CanConvertApply = true;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
598 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
599
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
600 public JoinedTable(JoinType joinType, TableSource table, bool isWeak)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
601 : this(joinType, table, isWeak, new SearchCondition())
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
602 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
603 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
604
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
605 public JoinedTable(JoinType joinType, ISqlTableSource table, string alias, bool isWeak)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
606 : this(joinType, new TableSource(table, alias), isWeak)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
607 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
608 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
609
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
610 public JoinType JoinType { get; set; }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
611 public TableSource Table { get; set; }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
612 public SearchCondition Condition { get; private set; }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
613 public bool IsWeak { get; set; }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
614 public bool CanConvertApply { get; set; }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
615
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
616 public ICloneableElement Clone(Dictionary<ICloneableElement,ICloneableElement> objectTree, Predicate<ICloneableElement> doClone)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
617 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
618 if (!doClone(this))
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
619 return this;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
620
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
621 ICloneableElement clone;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
622
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
623 if (!objectTree.TryGetValue(this, out clone))
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
624 objectTree.Add(this, clone = new JoinedTable(
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
625 JoinType,
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
626 (TableSource)Table.Clone(objectTree, doClone),
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
627 IsWeak,
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
628 (SearchCondition)Condition.Clone(objectTree, doClone)));
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
629
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
630 return clone;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
631 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
632
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
633 #if OVERRIDETOSTRING
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
634
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
635 public override string ToString()
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
636 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
637 return ((IQueryElement)this).ToString(new StringBuilder(), new Dictionary<IQueryElement,IQueryElement>()).ToString();
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
638 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
639
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
640 #endif
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
641
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
642 #region ISqlExpressionWalkable Members
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
643
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
644 [Obsolete]
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
645 public ISqlExpression Walk(bool skipColumns, Func<ISqlExpression,ISqlExpression> action)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
646 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
647 Condition = (SearchCondition)((ISqlExpressionWalkable)Condition).Walk(skipColumns, action);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
648
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
649 #pragma warning disable 0618
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
650 Table.Walk(skipColumns, action);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
651 #pragma warning restore 0618
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
652
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
653 return null;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
654 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
655
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
656 #endregion
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
657
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
658 #region IQueryElement Members
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
659
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
660 public QueryElementType ElementType { get { return QueryElementType.JoinedTable; } }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
661
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
662 StringBuilder IQueryElement.ToString(StringBuilder sb, Dictionary<IQueryElement,IQueryElement> dic)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
663 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
664 if (dic.ContainsKey(this))
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
665 return sb.Append("...");
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
666
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
667 dic.Add(this, this);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
668
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
669 switch (JoinType)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
670 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
671 case JoinType.Inner : sb.Append("INNER JOIN "); break;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
672 case JoinType.Left : sb.Append("LEFT JOIN "); break;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
673 case JoinType.CrossApply : sb.Append("CROSS APPLY "); break;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
674 case JoinType.OuterApply : sb.Append("OUTER APPLY "); break;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
675 default : sb.Append("SOME JOIN "); break;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
676 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
677
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
678 ((IQueryElement)Table).ToString(sb, dic);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
679 sb.Append(" ON ");
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
680 ((IQueryElement)Condition).ToString(sb, dic);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
681
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
682 dic.Remove(this);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
683
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
684 return sb;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
685 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
686
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
687 #endregion
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
688 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
689
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
690 #endregion
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
691
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
692 #region Predicate
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
693
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
694 public abstract class Predicate : ISqlPredicate
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
695 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
696 public enum Operator
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
697 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
698 Equal, // = Is the operator used to test the equality between two expressions.
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
699 NotEqual, // <> != Is the operator used to test the condition of two expressions not being equal to each other.
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
700 Greater, // > Is the operator used to test the condition of one expression being greater than the other.
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
701 GreaterOrEqual, // >= Is the operator used to test the condition of one expression being greater than or equal to the other expression.
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
702 NotGreater, // !> Is the operator used to test the condition of one expression not being greater than the other expression.
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
703 Less, // < Is the operator used to test the condition of one expression being less than the other.
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
704 LessOrEqual, // <= Is the operator used to test the condition of one expression being less than or equal to the other expression.
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
705 NotLess // !< Is the operator used to test the condition of one expression not being less than the other expression.
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
706 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
707
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
708 public class Expr : Predicate
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
709 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
710 public Expr([NotNull] ISqlExpression exp1, int precedence)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
711 : base(precedence)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
712 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
713 if (exp1 == null) throw new ArgumentNullException("exp1");
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
714
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
715 Expr1 = exp1;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
716 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
717
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
718 public Expr([NotNull] ISqlExpression exp1)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
719 : base(exp1.Precedence)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
720 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
721 if (exp1 == null) throw new ArgumentNullException("exp1");
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
722
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
723 Expr1 = exp1;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
724 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
725
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
726 public ISqlExpression Expr1 { get; set; }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
727
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
728 [Obsolete]
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
729 protected override void Walk(bool skipColumns, Func<ISqlExpression,ISqlExpression> func)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
730 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
731 Expr1 = Expr1.Walk(skipColumns, func);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
732
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
733 if (Expr1 == null)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
734 throw new InvalidOperationException();
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
735 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
736
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
737 public override bool CanBeNull()
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
738 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
739 return Expr1.CanBeNull();
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
740 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
741
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
742 protected override ICloneableElement Clone(Dictionary<ICloneableElement,ICloneableElement> objectTree, Predicate<ICloneableElement> doClone)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
743 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
744 if (!doClone(this))
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
745 return this;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
746
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
747 ICloneableElement clone;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
748
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
749 if (!objectTree.TryGetValue(this, out clone))
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
750 objectTree.Add(this, clone = new Expr((ISqlExpression)Expr1.Clone(objectTree, doClone), Precedence));
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
751
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
752 return clone;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
753 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
754
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
755 public override QueryElementType ElementType
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
756 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
757 get { return QueryElementType.ExprPredicate; }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
758 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
759
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
760 protected override void ToString(StringBuilder sb, Dictionary<IQueryElement, IQueryElement> dic)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
761 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
762 Expr1.ToString(sb, dic);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
763 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
764 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
765
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
766 public class NotExpr : Expr
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
767 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
768 public NotExpr(ISqlExpression exp1, bool isNot, int precedence)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
769 : base(exp1, precedence)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
770 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
771 IsNot = isNot;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
772 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
773
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
774 public bool IsNot { get; set; }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
775
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
776 protected override ICloneableElement Clone(Dictionary<ICloneableElement,ICloneableElement> objectTree, Predicate<ICloneableElement> doClone)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
777 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
778 if (!doClone(this))
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
779 return this;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
780
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
781 ICloneableElement clone;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
782
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
783 if (!objectTree.TryGetValue(this, out clone))
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
784 objectTree.Add(this, clone = new NotExpr((ISqlExpression)Expr1.Clone(objectTree, doClone), IsNot, Precedence));
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
785
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
786 return clone;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
787 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
788
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
789 public override QueryElementType ElementType
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
790 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
791 get { return QueryElementType.NotExprPredicate; }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
792 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
793
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
794 protected override void ToString(StringBuilder sb, Dictionary<IQueryElement, IQueryElement> dic)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
795 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
796 if (IsNot) sb.Append("NOT (");
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
797 base.ToString(sb, dic);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
798 if (IsNot) sb.Append(")");
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
799 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
800 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
801
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
802 // { expression { = | <> | != | > | >= | ! > | < | <= | !< } expression
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
803 //
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
804 public class ExprExpr : Expr
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
805 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
806 public ExprExpr(ISqlExpression exp1, Operator op, ISqlExpression exp2)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
807 : base(exp1, Sql.Precedence.Comparison)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
808 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
809 this.Operator = op;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
810 Expr2 = exp2;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
811 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
812
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
813 public new Operator Operator { get; private set; }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
814 public ISqlExpression Expr2 { get; internal set; }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
815
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
816 [Obsolete]
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
817 protected override void Walk(bool skipColumns, Func<ISqlExpression,ISqlExpression> func)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
818 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
819 #pragma warning disable 0618
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
820 base.Walk(skipColumns, func);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
821 #pragma warning restore 0618
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
822 Expr2 = Expr2.Walk(skipColumns, func);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
823 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
824
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
825 public override bool CanBeNull()
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
826 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
827 return base.CanBeNull() || Expr2.CanBeNull();
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
828 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
829
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
830 protected override ICloneableElement Clone(Dictionary<ICloneableElement,ICloneableElement> objectTree, Predicate<ICloneableElement> doClone)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
831 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
832 if (!doClone(this))
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
833 return this;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
834
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
835 ICloneableElement clone;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
836
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
837 if (!objectTree.TryGetValue(this, out clone))
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
838 objectTree.Add(this, clone = new ExprExpr(
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
839 (ISqlExpression)Expr1.Clone(objectTree, doClone), this.Operator, (ISqlExpression)Expr2.Clone(objectTree, doClone)));
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
840
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
841 return clone;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
842 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
843
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
844 public override QueryElementType ElementType
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
845 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
846 get { return QueryElementType.ExprExprPredicate; }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
847 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
848
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
849 protected override void ToString(StringBuilder sb, Dictionary<IQueryElement, IQueryElement> dic)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
850 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
851 Expr1.ToString(sb, dic);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
852
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
853 string op;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
854
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
855 switch (this.Operator)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
856 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
857 case Operator.Equal : op = "="; break;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
858 case Operator.NotEqual : op = "<>"; break;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
859 case Operator.Greater : op = ">"; break;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
860 case Operator.GreaterOrEqual: op = ">="; break;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
861 case Operator.NotGreater : op = "!>"; break;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
862 case Operator.Less : op = "<"; break;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
863 case Operator.LessOrEqual : op = "<="; break;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
864 case Operator.NotLess : op = "!<"; break;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
865 default: throw new InvalidOperationException();
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
866 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
867
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
868 sb.Append(" ").Append(op).Append(" ");
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
869
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
870 Expr2.ToString(sb, dic);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
871 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
872 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
873
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
874 // string_expression [ NOT ] LIKE string_expression [ ESCAPE 'escape_character' ]
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
875 //
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
876 public class Like : NotExpr
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
877 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
878 public Like(ISqlExpression exp1, bool isNot, ISqlExpression exp2, ISqlExpression escape)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
879 : base(exp1, isNot, Sql.Precedence.Comparison)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
880 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
881 Expr2 = exp2;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
882 Escape = escape;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
883 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
884
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
885 public ISqlExpression Expr2 { get; internal set; }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
886 public ISqlExpression Escape { get; internal set; }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
887
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
888 [Obsolete]
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
889 protected override void Walk(bool skipColumns, Func<ISqlExpression,ISqlExpression> func)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
890 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
891 #pragma warning disable 0618
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
892 base.Walk(skipColumns, func);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
893 #pragma warning restore 0618
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
894 Expr2 = Expr2.Walk(skipColumns, func);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
895
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
896 if (Escape != null)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
897 Escape = Escape.Walk(skipColumns, func);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
898 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
899
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
900 protected override ICloneableElement Clone(Dictionary<ICloneableElement,ICloneableElement> objectTree, Predicate<ICloneableElement> doClone)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
901 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
902 if (!doClone(this))
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
903 return this;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
904
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
905 ICloneableElement clone;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
906
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
907 if (!objectTree.TryGetValue(this, out clone))
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
908 objectTree.Add(this, clone = new Like(
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
909 (ISqlExpression)Expr1.Clone(objectTree, doClone), IsNot, (ISqlExpression)Expr2.Clone(objectTree, doClone), Escape));
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
910
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
911 return clone;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
912 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
913
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
914 public override QueryElementType ElementType
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
915 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
916 get { return QueryElementType.LikePredicate; }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
917 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
918
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
919 protected override void ToString(StringBuilder sb, Dictionary<IQueryElement, IQueryElement> dic)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
920 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
921 Expr1.ToString(sb, dic);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
922
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
923 if (IsNot) sb.Append(" NOT");
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
924 sb.Append(" LIKE ");
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
925
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
926 Expr2.ToString(sb, dic);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
927
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
928 if (Escape != null)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
929 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
930 sb.Append(" ESCAPE ");
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
931 Escape.ToString(sb, dic);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
932 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
933 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
934 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
935
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
936 // expression [ NOT ] BETWEEN expression AND expression
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
937 //
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
938 public class Between : NotExpr
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
939 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
940 public Between(ISqlExpression exp1, bool isNot, ISqlExpression exp2, ISqlExpression exp3)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
941 : base(exp1, isNot, Sql.Precedence.Comparison)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
942 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
943 Expr2 = exp2;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
944 Expr3 = exp3;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
945 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
946
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
947 public ISqlExpression Expr2 { get; internal set; }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
948 public ISqlExpression Expr3 { get; internal set; }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
949
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
950 [Obsolete]
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
951 protected override void Walk(bool skipColumns, Func<ISqlExpression,ISqlExpression> func)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
952 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
953 #pragma warning disable 0618
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
954 base.Walk(skipColumns, func);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
955 #pragma warning restore 0618
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
956 Expr2 = Expr2.Walk(skipColumns, func);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
957 Expr3 = Expr3.Walk(skipColumns, func);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
958 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
959
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
960 protected override ICloneableElement Clone(Dictionary<ICloneableElement,ICloneableElement> objectTree, Predicate<ICloneableElement> doClone)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
961 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
962 if (!doClone(this))
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
963 return this;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
964
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
965 ICloneableElement clone;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
966
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
967 if (!objectTree.TryGetValue(this, out clone))
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
968 objectTree.Add(this, clone = new Between(
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
969 (ISqlExpression)Expr1.Clone(objectTree, doClone),
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
970 IsNot,
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
971 (ISqlExpression)Expr2.Clone(objectTree, doClone),
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
972 (ISqlExpression)Expr3.Clone(objectTree, doClone)));
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
973
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
974 return clone;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
975 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
976
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
977 public override QueryElementType ElementType
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
978 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
979 get { return QueryElementType.BetweenPredicate; }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
980 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
981
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
982 protected override void ToString(StringBuilder sb, Dictionary<IQueryElement, IQueryElement> dic)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
983 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
984 Expr1.ToString(sb, dic);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
985
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
986 if (IsNot) sb.Append(" NOT");
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
987 sb.Append(" BETWEEN ");
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
988
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
989 Expr2.ToString(sb, dic);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
990 sb.Append(" AND ");
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
991 Expr3.ToString(sb, dic);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
992 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
993 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
994
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
995 // expression IS [ NOT ] NULL
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
996 //
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
997 public class IsNull : NotExpr
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
998 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
999 public IsNull(ISqlExpression exp1, bool isNot)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1000 : base(exp1, isNot, Sql.Precedence.Comparison)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1001 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1002 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1003
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1004 protected override ICloneableElement Clone(Dictionary<ICloneableElement,ICloneableElement> objectTree, Predicate<ICloneableElement> doClone)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1005 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1006 if (!doClone(this))
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1007 return this;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1008
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1009 ICloneableElement clone;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1010
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1011 if (!objectTree.TryGetValue(this, out clone))
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1012 objectTree.Add(this, clone = new IsNull((ISqlExpression)Expr1.Clone(objectTree, doClone), IsNot));
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1013
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1014 return clone;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1015 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1016
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1017 protected override void ToString(StringBuilder sb, Dictionary<IQueryElement, IQueryElement> dic)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1018 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1019 Expr1.ToString(sb, dic);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1020 sb
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1021 .Append(" IS ")
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1022 .Append(IsNot ? "NOT " : "")
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1023 .Append("NULL");
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1024 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1025
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1026 public override QueryElementType ElementType
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1027 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1028 get { return QueryElementType.IsNullPredicate; }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1029 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1030 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1031
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1032 // expression [ NOT ] IN ( subquery | expression [ ,...n ] )
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1033 //
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1034 public class InSubQuery : NotExpr
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1035 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1036 public InSubQuery(ISqlExpression exp1, bool isNot, SqlQuery subQuery)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1037 : base(exp1, isNot, Sql.Precedence.Comparison)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1038 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1039 SubQuery = subQuery;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1040 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1041
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1042 public SqlQuery SubQuery { get; private set; }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1043
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1044 [Obsolete]
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1045 protected override void Walk(bool skipColumns, Func<ISqlExpression,ISqlExpression> func)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1046 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1047 #pragma warning disable 0618
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1048 base.Walk(skipColumns, func);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1049 #pragma warning restore 0618
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1050 SubQuery = (SqlQuery)((ISqlExpression)SubQuery).Walk(skipColumns, func);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1051 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1052
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1053 protected override ICloneableElement Clone(Dictionary<ICloneableElement,ICloneableElement> objectTree, Predicate<ICloneableElement> doClone)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1054 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1055 if (!doClone(this))
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1056 return this;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1057
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1058 ICloneableElement clone;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1059
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1060 if (!objectTree.TryGetValue(this, out clone))
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1061 objectTree.Add(this, clone = new InSubQuery(
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1062 (ISqlExpression)Expr1.Clone(objectTree, doClone),
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1063 IsNot,
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1064 (SqlQuery)SubQuery.Clone(objectTree, doClone)));
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1065
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1066 return clone;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1067 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1068
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1069 public override QueryElementType ElementType
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1070 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1071 get { return QueryElementType.InSubQueryPredicate; }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1072 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1073
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1074 protected override void ToString(StringBuilder sb, Dictionary<IQueryElement, IQueryElement> dic)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1075 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1076 Expr1.ToString(sb, dic);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1077
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1078 if (IsNot) sb.Append(" NOT");
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1079 sb.Append(" IN (");
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1080
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1081 ((IQueryElement)SubQuery).ToString(sb, dic);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1082 sb.Append(")");
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1083 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1084 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1085
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1086 public class InList : NotExpr
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1087 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1088 public InList(ISqlExpression exp1, bool isNot, params ISqlExpression[] values)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1089 : base(exp1, isNot, Sql.Precedence.Comparison)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1090 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1091 if (values != null && values.Length > 0)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1092 _values.AddRange(values);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1093 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1094
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1095 public InList(ISqlExpression exp1, bool isNot, IEnumerable<ISqlExpression> values)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1096 : base(exp1, isNot, Sql.Precedence.Comparison)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1097 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1098 if (values != null)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1099 _values.AddRange(values);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1100 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1101
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1102 readonly List<ISqlExpression> _values = new List<ISqlExpression>();
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1103 public List<ISqlExpression> Values { get { return _values; } }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1104
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1105 [Obsolete]
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1106 protected override void Walk(bool skipColumns, Func<ISqlExpression,ISqlExpression> action)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1107 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1108 #pragma warning disable 0618
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1109 base.Walk(skipColumns, action);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1110 #pragma warning restore 0618
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1111 for (var i = 0; i < _values.Count; i++)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1112 _values[i] = _values[i].Walk(skipColumns, action);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1113 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1114
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1115 protected override ICloneableElement Clone(Dictionary<ICloneableElement,ICloneableElement> objectTree, Predicate<ICloneableElement> doClone)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1116 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1117 if (!doClone(this))
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1118 return this;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1119
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1120 ICloneableElement clone;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1121
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1122 if (!objectTree.TryGetValue(this, out clone))
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1123 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1124 objectTree.Add(this, clone = new InList(
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1125 (ISqlExpression)Expr1.Clone(objectTree, doClone),
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1126 IsNot,
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1127 _values.ConvertAll(e => (ISqlExpression)e.Clone(objectTree, doClone)).ToArray()));
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1128 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1129
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1130 return clone;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1131 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1132
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1133 public override QueryElementType ElementType
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1134 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1135 get { return QueryElementType.InListPredicate; }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1136 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1137
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1138 protected override void ToString(StringBuilder sb, Dictionary<IQueryElement, IQueryElement> dic)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1139 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1140 Expr1.ToString(sb, dic);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1141
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1142 if (IsNot) sb.Append(" NOT");
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1143 sb.Append(" IN (");
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1144
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1145 foreach (var value in Values)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1146 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1147 value.ToString(sb, dic);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1148 sb.Append(',');
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1149 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1150
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1151 if (Values.Count > 0)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1152 sb.Length--;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1153
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1154 sb.Append(")");
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1155 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1156 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1157
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1158 // CONTAINS ( { column | * } , '< contains_search_condition >' )
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1159 // FREETEXT ( { column | * } , 'freetext_string' )
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1160 // expression { = | <> | != | > | >= | !> | < | <= | !< } { ALL | SOME | ANY } ( subquery )
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1161 // EXISTS ( subquery )
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1162
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1163 public class FuncLike : Predicate
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1164 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1165 public FuncLike(SqlFunction func)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1166 : base(func.Precedence)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1167 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1168 Function = func;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1169 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1170
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1171 public SqlFunction Function { get; private set; }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1172
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1173 [Obsolete]
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1174 protected override void Walk(bool skipColumns, Func<ISqlExpression,ISqlExpression> func)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1175 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1176 Function = (SqlFunction)((ISqlExpression)Function).Walk(skipColumns, func);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1177 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1178
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1179 public override bool CanBeNull()
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1180 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1181 return Function.CanBeNull();
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1182 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1183
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1184 protected override ICloneableElement Clone(Dictionary<ICloneableElement,ICloneableElement> objectTree, Predicate<ICloneableElement> doClone)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1185 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1186 if (!doClone(this))
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1187 return this;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1188
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1189 ICloneableElement clone;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1190
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1191 if (!objectTree.TryGetValue(this, out clone))
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1192 objectTree.Add(this, clone = new FuncLike((SqlFunction)Function.Clone(objectTree, doClone)));
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1193
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1194 return clone;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1195 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1196
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1197 public override QueryElementType ElementType
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1198 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1199 get { return QueryElementType.FuncLikePredicate; }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1200 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1201
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1202 protected override void ToString(StringBuilder sb, Dictionary<IQueryElement, IQueryElement> dic)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1203 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1204 ((IQueryElement)Function).ToString(sb, dic);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1205 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1206 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1207
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1208 #region Overrides
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1209
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1210 #if OVERRIDETOSTRING
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1211
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1212 public override string ToString()
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1213 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1214 return ((IQueryElement)this).ToString(new StringBuilder(), new Dictionary<IQueryElement,IQueryElement>()).ToString();
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1215 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1216
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1217 #endif
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1218
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1219 #endregion
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1220
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1221 protected Predicate(int precedence)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1222 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1223 Precedence = precedence;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1224 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1225
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1226 #region IPredicate Members
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1227
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1228 public int Precedence { get; private set; }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1229
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1230 public abstract bool CanBeNull();
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1231 protected abstract ICloneableElement Clone (Dictionary<ICloneableElement,ICloneableElement> objectTree, Predicate<ICloneableElement> doClone);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1232 [Obsolete]
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1233 protected abstract void Walk (bool skipColumns, Func<ISqlExpression,ISqlExpression> action);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1234
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1235 [Obsolete]
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1236 ISqlExpression ISqlExpressionWalkable.Walk(bool skipColumns, Func<ISqlExpression,ISqlExpression> func)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1237 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1238 Walk(skipColumns, func);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1239 return null;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1240 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1241
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1242 ICloneableElement ICloneableElement.Clone(Dictionary<ICloneableElement, ICloneableElement> objectTree, Predicate<ICloneableElement> doClone)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1243 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1244 if (!doClone(this))
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1245 return this;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1246
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1247 return Clone(objectTree, doClone);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1248 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1249
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1250 #endregion
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1251
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1252 #region IQueryElement Members
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1253
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1254 public abstract QueryElementType ElementType { get; }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1255
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1256 protected abstract void ToString(StringBuilder sb, Dictionary<IQueryElement, IQueryElement> dic);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1257
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1258 StringBuilder IQueryElement.ToString(StringBuilder sb, Dictionary<IQueryElement,IQueryElement> dic)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1259 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1260 if (dic.ContainsKey(this))
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1261 return sb.Append("...");
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1262
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1263 dic.Add(this, this);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1264 ToString(sb, dic);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1265 dic.Remove(this);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1266
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1267 return sb;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1268 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1269
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1270 #endregion
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1271 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1272
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1273 #endregion
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1274
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1275 #region Condition
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1276
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1277 public class Condition : IQueryElement, ICloneableElement
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1278 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1279 public Condition(bool isNot, ISqlPredicate predicate)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1280 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1281 IsNot = isNot;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1282 Predicate = predicate;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1283 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1284
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1285 public Condition(bool isNot, ISqlPredicate predicate, bool isOr)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1286 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1287 IsNot = isNot;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1288 Predicate = predicate;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1289 IsOr = isOr;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1290 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1291
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1292 public bool IsNot { get; set; }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1293 public ISqlPredicate Predicate { get; set; }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1294 public bool IsOr { get; set; }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1295
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1296 public int Precedence
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1297 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1298 get
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1299 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1300 return
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1301 IsNot ? Sql.Precedence.LogicalNegation :
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1302 IsOr ? Sql.Precedence.LogicalDisjunction :
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1303 Sql.Precedence.LogicalConjunction;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1304 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1305 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1306
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1307 public ICloneableElement Clone(Dictionary<ICloneableElement, ICloneableElement> objectTree, Predicate<ICloneableElement> doClone)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1308 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1309 if (!doClone(this))
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1310 return this;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1311
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1312 ICloneableElement clone;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1313
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1314 if (!objectTree.TryGetValue(this, out clone))
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1315 objectTree.Add(this, clone = new Condition(IsNot, (ISqlPredicate)Predicate.Clone(objectTree, doClone), IsOr));
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1316
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1317 return clone;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1318 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1319
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1320 public bool CanBeNull()
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1321 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1322 return Predicate.CanBeNull();
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1323 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1324
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1325 #if OVERRIDETOSTRING
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1326
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1327 public override string ToString()
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1328 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1329 return ((IQueryElement)this).ToString(new StringBuilder(), new Dictionary<IQueryElement,IQueryElement>()).ToString();
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1330 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1331
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1332 #endif
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1333
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1334 #region IQueryElement Members
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1335
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1336 public QueryElementType ElementType { get { return QueryElementType.Condition; } }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1337
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1338 StringBuilder IQueryElement.ToString(StringBuilder sb, Dictionary<IQueryElement,IQueryElement> dic)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1339 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1340 if (dic.ContainsKey(this))
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1341 return sb.Append("...");
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1342
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1343 dic.Add(this, this);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1344
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1345 sb.Append('(');
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1346
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1347 if (IsNot) sb.Append("NOT ");
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1348
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1349 Predicate.ToString(sb, dic);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1350 sb.Append(')').Append(IsOr ? " OR " : " AND ");
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1351
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1352 dic.Remove(this);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1353
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1354 return sb;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1355 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1356
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1357 #endregion
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1358 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1359
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1360 #endregion
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1361
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1362 #region SearchCondition
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1363
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1364 public class SearchCondition : ConditionBase<SearchCondition, SearchCondition.Next>, ISqlPredicate, ISqlExpression
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1365 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1366 public SearchCondition()
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1367 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1368 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1369
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1370 public SearchCondition(IEnumerable<Condition> list)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1371 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1372 _conditions.AddRange(list);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1373 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1374
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1375 public SearchCondition(params Condition[] list)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1376 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1377 _conditions.AddRange(list);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1378 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1379
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1380 public class Next
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1381 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1382 internal Next(SearchCondition parent)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1383 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1384 _parent = parent;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1385 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1386
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1387 readonly SearchCondition _parent;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1388
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1389 public SearchCondition Or { get { return _parent.SetOr(true); } }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1390 public SearchCondition And { get { return _parent.SetOr(false); } }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1391
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1392 public ISqlExpression ToExpr() { return _parent; }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1393 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1394
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1395 readonly List<Condition> _conditions = new List<Condition>();
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1396 public List<Condition> Conditions
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1397 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1398 get { return _conditions; }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1399 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1400
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1401 protected override SearchCondition Search
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1402 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1403 get { return this; }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1404 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1405
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1406 protected override Next GetNext()
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1407 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1408 return new Next(this);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1409 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1410
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1411 #region Overrides
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1412
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1413 #if OVERRIDETOSTRING
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1414
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1415 public override string ToString()
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1416 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1417 return ((IQueryElement)this).ToString(new StringBuilder(), new Dictionary<IQueryElement,IQueryElement>()).ToString();
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1418 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1419
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1420 #endif
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1421
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1422 #endregion
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1423
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1424 #region IPredicate Members
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1425
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1426 public int Precedence
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1427 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1428 get
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1429 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1430 if (_conditions.Count == 0) return Sql.Precedence.Unknown;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1431 if (_conditions.Count == 1) return _conditions[0].Precedence;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1432
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1433 return _conditions.Select(_ =>
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1434 _.IsNot ? Sql.Precedence.LogicalNegation :
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1435 _.IsOr ? Sql.Precedence.LogicalDisjunction :
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1436 Sql.Precedence.LogicalConjunction).Min();
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1437 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1438 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1439
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1440 public Type SystemType
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1441 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1442 get { return typeof(bool); }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1443 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1444
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1445 [Obsolete]
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1446 ISqlExpression ISqlExpressionWalkable.Walk(bool skipColumns, Func<ISqlExpression,ISqlExpression> func)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1447 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1448 foreach (var condition in Conditions)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1449 condition.Predicate.Walk(skipColumns, func);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1450
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1451 return func(this);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1452 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1453
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1454 #endregion
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1455
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1456 #region IEquatable<ISqlExpression> Members
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1457
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1458 bool IEquatable<ISqlExpression>.Equals(ISqlExpression other)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1459 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1460 return this == other;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1461 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1462
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1463 #endregion
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1464
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1465 #region ISqlExpression Members
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1466
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1467 public bool CanBeNull()
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1468 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1469 foreach (var c in Conditions)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1470 if (c.CanBeNull())
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1471 return true;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1472
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1473 return false;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1474 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1475
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1476 public bool Equals(ISqlExpression other, Func<ISqlExpression,ISqlExpression,bool> comparer)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1477 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1478 return this == other;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1479 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1480
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1481 #endregion
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1482
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1483 #region ICloneableElement Members
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1484
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1485 public ICloneableElement Clone(Dictionary<ICloneableElement, ICloneableElement> objectTree, Predicate<ICloneableElement> doClone)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1486 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1487 if (!doClone(this))
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1488 return this;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1489
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1490 ICloneableElement clone;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1491
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1492 if (!objectTree.TryGetValue(this, out clone))
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1493 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1494 var sc = new SearchCondition();
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1495
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1496 objectTree.Add(this, clone = sc);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1497
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1498 sc._conditions.AddRange(_conditions.ConvertAll(c => (Condition)c.Clone(objectTree, doClone)));
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1499 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1500
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1501 return clone;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1502 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1503
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1504 #endregion
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1505
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1506 #region IQueryElement Members
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1507
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1508 public QueryElementType ElementType { get { return QueryElementType.SearchCondition; } }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1509
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1510 StringBuilder IQueryElement.ToString(StringBuilder sb, Dictionary<IQueryElement,IQueryElement> dic)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1511 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1512 if (dic.ContainsKey(this))
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1513 return sb.Append("...");
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1514
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1515 dic.Add(this, this);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1516
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1517 foreach (IQueryElement c in Conditions)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1518 c.ToString(sb, dic);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1519
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1520 if (Conditions.Count > 0)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1521 sb.Length -= 4;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1522
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1523 dic.Remove(this);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1524
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1525 return sb;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1526 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1527
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1528 #endregion
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1529 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1530
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1531 #endregion
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1532
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1533 #region ConditionBase
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1534
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1535 interface IConditionExpr<T>
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1536 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1537 T Expr (ISqlExpression expr);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1538 T Field (SqlField field);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1539 T SubQuery(SqlQuery sqlQuery);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1540 T Value (object value);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1541 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1542
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1543 public abstract class ConditionBase<T1,T2> : IConditionExpr<ConditionBase<T1,T2>.Expr_>
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1544 where T1 : ConditionBase<T1,T2>
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1545 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1546 public class Expr_
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1547 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1548 internal Expr_(ConditionBase<T1,T2> condition, bool isNot, ISqlExpression expr)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1549 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1550 _condition = condition;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1551 _isNot = isNot;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1552 _expr = expr;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1553 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1554
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1555 readonly ConditionBase<T1,T2> _condition;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1556 readonly bool _isNot;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1557 readonly ISqlExpression _expr;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1558
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1559 T2 Add(ISqlPredicate predicate)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1560 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1561 _condition.Search.Conditions.Add(new Condition(_isNot, predicate));
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1562 return _condition.GetNext();
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1563 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1564
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1565 #region Predicate.ExprExpr
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1566
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1567 public class Op_ : IConditionExpr<T2>
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1568 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1569 internal Op_(Expr_ expr, Predicate.Operator op)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1570 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1571 _expr = expr;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1572 _op = op;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1573 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1574
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1575 readonly Expr_ _expr;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1576 readonly Predicate.Operator _op;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1577
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1578 public T2 Expr (ISqlExpression expr) { return _expr.Add(new Predicate.ExprExpr(_expr._expr, _op, expr)); }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1579 public T2 Field (SqlField field) { return Expr(field); }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1580 public T2 SubQuery(SqlQuery subQuery) { return Expr(subQuery); }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1581 public T2 Value (object value) { return Expr(new SqlValue(value)); }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1582
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1583 public T2 All (SqlQuery subQuery) { return Expr(SqlFunction.CreateAll (subQuery)); }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1584 public T2 Some (SqlQuery subQuery) { return Expr(SqlFunction.CreateSome(subQuery)); }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1585 public T2 Any (SqlQuery subQuery) { return Expr(SqlFunction.CreateAny (subQuery)); }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1586 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1587
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1588 public Op_ Equal { get { return new Op_(this, Predicate.Operator.Equal); } }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1589 public Op_ NotEqual { get { return new Op_(this, Predicate.Operator.NotEqual); } }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1590 public Op_ Greater { get { return new Op_(this, Predicate.Operator.Greater); } }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1591 public Op_ GreaterOrEqual { get { return new Op_(this, Predicate.Operator.GreaterOrEqual); } }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1592 public Op_ NotGreater { get { return new Op_(this, Predicate.Operator.NotGreater); } }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1593 public Op_ Less { get { return new Op_(this, Predicate.Operator.Less); } }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1594 public Op_ LessOrEqual { get { return new Op_(this, Predicate.Operator.LessOrEqual); } }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1595 public Op_ NotLess { get { return new Op_(this, Predicate.Operator.NotLess); } }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1596
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1597 #endregion
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1598
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1599 #region Predicate.Like
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1600
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1601 public T2 Like(ISqlExpression expression, SqlValue escape) { return Add(new Predicate.Like(_expr, false, expression, escape)); }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1602 public T2 Like(ISqlExpression expression) { return Like(expression, null); }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1603 public T2 Like(string expression, SqlValue escape) { return Like(new SqlValue(expression), escape); }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1604 public T2 Like(string expression) { return Like(new SqlValue(expression), null); }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1605
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1606 #endregion
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1607
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1608 #region Predicate.Between
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1609
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1610 public T2 Between (ISqlExpression expr1, ISqlExpression expr2) { return Add(new Predicate.Between(_expr, false, expr1, expr2)); }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1611 public T2 NotBetween(ISqlExpression expr1, ISqlExpression expr2) { return Add(new Predicate.Between(_expr, true, expr1, expr2)); }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1612
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1613 #endregion
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1614
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1615 #region Predicate.IsNull
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1616
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1617 public T2 IsNull { get { return Add(new Predicate.IsNull(_expr, false)); } }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1618 public T2 IsNotNull { get { return Add(new Predicate.IsNull(_expr, true)); } }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1619
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1620 #endregion
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1621
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1622 #region Predicate.In
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1623
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1624 public T2 In (SqlQuery subQuery) { return Add(new Predicate.InSubQuery(_expr, false, subQuery)); }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1625 public T2 NotIn(SqlQuery subQuery) { return Add(new Predicate.InSubQuery(_expr, true, subQuery)); }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1626
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1627 Predicate.InList CreateInList(bool isNot, object[] exprs)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1628 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1629 var list = new Predicate.InList(_expr, isNot, null);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1630
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1631 if (exprs != null && exprs.Length > 0)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1632 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1633 foreach (var item in exprs)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1634 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1635 if (item == null || item is SqlValue && ((SqlValue)item).Value == null)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1636 continue;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1637
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1638 if (item is ISqlExpression)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1639 list.Values.Add((ISqlExpression)item);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1640 else
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1641 list.Values.Add(new SqlValue(item));
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1642 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1643 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1644
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1645 return list;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1646 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1647
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1648 public T2 In (params object[] exprs) { return Add(CreateInList(false, exprs)); }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1649 public T2 NotIn(params object[] exprs) { return Add(CreateInList(true, exprs)); }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1650
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1651 #endregion
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1652 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1653
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1654 public class Not_ : IConditionExpr<Expr_>
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1655 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1656 internal Not_(ConditionBase<T1,T2> condition)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1657 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1658 _condition = condition;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1659 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1660
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1661 readonly ConditionBase<T1,T2> _condition;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1662
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1663 public Expr_ Expr (ISqlExpression expr) { return new Expr_(_condition, true, expr); }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1664 public Expr_ Field (SqlField field) { return Expr(field); }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1665 public Expr_ SubQuery(SqlQuery subQuery) { return Expr(subQuery); }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1666 public Expr_ Value (object value) { return Expr(new SqlValue(value)); }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1667
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1668 public T2 Exists(SqlQuery subQuery)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1669 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1670 _condition.Search.Conditions.Add(new Condition(true, new Predicate.FuncLike(SqlFunction.CreateExists(subQuery))));
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1671 return _condition.GetNext();
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1672 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1673 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1674
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1675 protected abstract SearchCondition Search { get; }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1676 protected abstract T2 GetNext();
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1677
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1678 protected T1 SetOr(bool value)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1679 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1680 Search.Conditions[Search.Conditions.Count - 1].IsOr = value;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1681 return (T1)this;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1682 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1683
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1684 public Not_ Not { get { return new Not_(this); } }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1685
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1686 public Expr_ Expr (ISqlExpression expr) { return new Expr_(this, false, expr); }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1687 public Expr_ Field (SqlField field) { return Expr(field); }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1688 public Expr_ SubQuery(SqlQuery subQuery) { return Expr(subQuery); }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1689 public Expr_ Value (object value) { return Expr(new SqlValue(value)); }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1690
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1691 public T2 Exists(SqlQuery subQuery)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1692 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1693 Search.Conditions.Add(new Condition(false, new Predicate.FuncLike(SqlFunction.CreateExists(subQuery))));
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1694 return GetNext();
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1695 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1696 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1697
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1698 #endregion
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1699
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1700 #region OrderByItem
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1701
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1702 public class OrderByItem : IQueryElement, ICloneableElement
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1703 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1704 public OrderByItem(ISqlExpression expression, bool isDescending)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1705 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1706 Expression = expression;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1707 IsDescending = isDescending;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1708 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1709
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1710 public ISqlExpression Expression { get; internal set; }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1711 public bool IsDescending { get; private set; }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1712
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1713 [Obsolete]
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1714 internal void Walk(bool skipColumns, Func<ISqlExpression,ISqlExpression> func)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1715 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1716 Expression = Expression.Walk(skipColumns, func);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1717 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1718
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1719 public ICloneableElement Clone(Dictionary<ICloneableElement, ICloneableElement> objectTree, Predicate<ICloneableElement> doClone)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1720 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1721 if (!doClone(this))
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1722 return this;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1723
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1724 ICloneableElement clone;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1725
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1726 if (!objectTree.TryGetValue(this, out clone))
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1727 objectTree.Add(this, clone = new OrderByItem((ISqlExpression)Expression.Clone(objectTree, doClone), IsDescending));
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1728
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1729 return clone;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1730 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1731
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1732 #region Overrides
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1733
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1734 #if OVERRIDETOSTRING
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1735
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1736 public override string ToString()
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1737 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1738 return ((IQueryElement)this).ToString(new StringBuilder(), new Dictionary<IQueryElement,IQueryElement>()).ToString();
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1739 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1740
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1741 #endif
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1742
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1743 #endregion
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1744
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1745 #region IQueryElement Members
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1746
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1747 public QueryElementType ElementType
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1748 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1749 get { return QueryElementType.OrderByItem; }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1750 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1751
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1752 StringBuilder IQueryElement.ToString(StringBuilder sb, Dictionary<IQueryElement,IQueryElement> dic)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1753 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1754 Expression.ToString(sb, dic);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1755
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1756 if (IsDescending)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1757 sb.Append(" DESC");
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1758
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1759 return sb;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1760 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1761
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1762 #endregion
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1763 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1764
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1765 #endregion
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1766
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1767 #region ClauseBase
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1768
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1769 public abstract class ClauseBase
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1770 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1771 protected ClauseBase(SqlQuery sqlQuery)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1772 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1773 SqlQuery = sqlQuery;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1774 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1775
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1776 public SelectClause Select { get { return SqlQuery.Select; } }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1777 public FromClause From { get { return SqlQuery.From; } }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1778 public WhereClause Where { get { return SqlQuery.Where; } }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1779 public GroupByClause GroupBy { get { return SqlQuery.GroupBy; } }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1780 public WhereClause Having { get { return SqlQuery.Having; } }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1781 public OrderByClause OrderBy { get { return SqlQuery.OrderBy; } }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1782 public SqlQuery End() { return SqlQuery; }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1783
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1784 protected internal SqlQuery SqlQuery { get; private set; }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1785
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1786 internal void SetSqlQuery(SqlQuery sqlQuery)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1787 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1788 SqlQuery = sqlQuery;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1789 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1790 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1791
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1792 public abstract class ClauseBase<T1, T2> : ConditionBase<T1, T2>
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1793 where T1 : ClauseBase<T1, T2>
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1794 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1795 protected ClauseBase(SqlQuery sqlQuery)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1796 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1797 SqlQuery = sqlQuery;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1798 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1799
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1800 public SelectClause Select { get { return SqlQuery.Select; } }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1801 public FromClause From { get { return SqlQuery.From; } }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1802 public GroupByClause GroupBy { get { return SqlQuery.GroupBy; } }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1803 public WhereClause Having { get { return SqlQuery.Having; } }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1804 public OrderByClause OrderBy { get { return SqlQuery.OrderBy; } }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1805 public SqlQuery End() { return SqlQuery; }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1806
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1807 protected internal SqlQuery SqlQuery { get; private set; }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1808
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1809 internal void SetSqlQuery(SqlQuery sqlQuery)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1810 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1811 SqlQuery = sqlQuery;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1812 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1813 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1814
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1815 #endregion
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1816
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1817 #region SelectClause
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1818
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1819 public class SelectClause : ClauseBase, IQueryElement, ISqlExpressionWalkable
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1820 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1821 #region Init
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1822
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1823 internal SelectClause(SqlQuery sqlQuery) : base(sqlQuery)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1824 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1825 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1826
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1827 internal SelectClause(
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1828 SqlQuery sqlQuery,
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1829 SelectClause clone,
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1830 Dictionary<ICloneableElement,ICloneableElement> objectTree,
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1831 Predicate<ICloneableElement> doClone)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1832 : base(sqlQuery)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1833 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1834 _columns.AddRange(clone._columns.ConvertAll(c => (Column)c.Clone(objectTree, doClone)));
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1835
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1836 IsDistinct = clone.IsDistinct;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1837 TakeValue = clone.TakeValue == null ? null : (ISqlExpression)clone.TakeValue.Clone(objectTree, doClone);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1838 SkipValue = clone.SkipValue == null ? null : (ISqlExpression)clone.SkipValue.Clone(objectTree, doClone);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1839 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1840
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1841 internal SelectClause(bool isDistinct, ISqlExpression takeValue, ISqlExpression skipValue, IEnumerable<Column> columns)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1842 : base(null)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1843 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1844 IsDistinct = isDistinct;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1845 TakeValue = takeValue;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1846 SkipValue = skipValue;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1847
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1848 _columns.AddRange(columns);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1849 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1850
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1851 #endregion
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1852
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1853 #region Columns
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1854
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1855 public SelectClause Field(SqlField field)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1856 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1857 AddOrGetColumn(new Column(SqlQuery, field));
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1858 return this;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1859 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1860
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1861 public SelectClause Field(SqlField field, string alias)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1862 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1863 AddOrGetColumn(new Column(SqlQuery, field, alias));
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1864 return this;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1865 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1866
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1867 public SelectClause SubQuery(SqlQuery subQuery)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1868 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1869 if (subQuery.ParentSql != null && subQuery.ParentSql != SqlQuery)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1870 throw new ArgumentException("SqlQuery already used as subquery");
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1871
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1872 subQuery.ParentSql = SqlQuery;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1873
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1874 AddOrGetColumn(new Column(SqlQuery, subQuery));
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1875 return this;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1876 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1877
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1878 public SelectClause SubQuery(SqlQuery sqlQuery, string alias)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1879 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1880 if (sqlQuery.ParentSql != null && sqlQuery.ParentSql != SqlQuery)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1881 throw new ArgumentException("SqlQuery already used as subquery");
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1882
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1883 sqlQuery.ParentSql = SqlQuery;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1884
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1885 AddOrGetColumn(new Column(SqlQuery, sqlQuery, alias));
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1886 return this;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1887 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1888
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1889 public SelectClause Expr(ISqlExpression expr)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1890 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1891 AddOrGetColumn(new Column(SqlQuery, expr));
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1892 return this;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1893 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1894
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1895 public SelectClause Expr(ISqlExpression expr, string alias)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1896 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1897 AddOrGetColumn(new Column(SqlQuery, expr, alias));
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1898 return this;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1899 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1900
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1901 public SelectClause Expr(string expr, params ISqlExpression[] values)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1902 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1903 AddOrGetColumn(new Column(SqlQuery, new SqlExpression(null, expr, values)));
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1904 return this;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1905 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1906
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1907 public SelectClause Expr(Type systemType, string expr, params ISqlExpression[] values)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1908 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1909 AddOrGetColumn(new Column(SqlQuery, new SqlExpression(systemType, expr, values)));
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1910 return this;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1911 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1912
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1913 public SelectClause Expr(string expr, int priority, params ISqlExpression[] values)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1914 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1915 AddOrGetColumn(new Column(SqlQuery, new SqlExpression(null, expr, priority, values)));
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1916 return this;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1917 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1918
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1919 public SelectClause Expr(Type systemType, string expr, int priority, params ISqlExpression[] values)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1920 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1921 AddOrGetColumn(new Column(SqlQuery, new SqlExpression(systemType, expr, priority, values)));
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1922 return this;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1923 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1924
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1925 public SelectClause Expr(string alias, string expr, int priority, params ISqlExpression[] values)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1926 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1927 AddOrGetColumn(new Column(SqlQuery, new SqlExpression(null, expr, priority, values)));
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1928 return this;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1929 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1930
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1931 public SelectClause Expr(Type systemType, string alias, string expr, int priority, params ISqlExpression[] values)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1932 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1933 AddOrGetColumn(new Column(SqlQuery, new SqlExpression(systemType, expr, priority, values)));
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1934 return this;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1935 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1936
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1937 public SelectClause Expr<T>(ISqlExpression expr1, string operation, ISqlExpression expr2)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1938 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1939 AddOrGetColumn(new Column(SqlQuery, new SqlBinaryExpression(typeof(T), expr1, operation, expr2)));
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1940 return this;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1941 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1942
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1943 public SelectClause Expr<T>(ISqlExpression expr1, string operation, ISqlExpression expr2, int priority)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1944 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1945 AddOrGetColumn(new Column(SqlQuery, new SqlBinaryExpression(typeof(T), expr1, operation, expr2, priority)));
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1946 return this;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1947 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1948
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1949 public SelectClause Expr<T>(string alias, ISqlExpression expr1, string operation, ISqlExpression expr2, int priority)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1950 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1951 AddOrGetColumn(new Column(SqlQuery, new SqlBinaryExpression(typeof(T), expr1, operation, expr2, priority), alias));
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1952 return this;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1953 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1954
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1955 public int Add(ISqlExpression expr)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1956 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1957 if (expr is Column && ((Column)expr).Parent == SqlQuery)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1958 throw new InvalidOperationException();
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1959
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1960 return Columns.IndexOf(AddOrGetColumn(new Column(SqlQuery, expr)));
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1961 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1962
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1963 public int Add(ISqlExpression expr, string alias)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1964 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1965 return Columns.IndexOf(AddOrGetColumn(new Column(SqlQuery, expr, alias)));
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1966 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1967
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1968 Column AddOrGetColumn(Column col)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1969 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1970 foreach (var c in Columns)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1971 if (c.Equals(col))
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1972 return col;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1973
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1974 #if DEBUG
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1975
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1976 switch (col.Expression.ElementType)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1977 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1978 case QueryElementType.SqlField :
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1979 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1980 var table = ((SqlField)col.Expression).Table;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1981
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1982 //if (SqlQuery.From.GetFromTables().Any(_ => _ == table))
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1983 // throw new InvalidOperationException("Wrong field usage.");
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1984
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1985 break;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1986 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1987
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1988 case QueryElementType.Column :
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1989 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1990 var query = ((Column)col.Expression).Parent;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1991
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1992 //if (!SqlQuery.From.GetFromQueries().Any(_ => _ == query))
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1993 // throw new InvalidOperationException("Wrong column usage.");
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1994
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1995 break;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1996 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1997
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1998 case QueryElementType.SqlQuery :
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1999 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
2000 if (col.Expression == SqlQuery)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
2001 throw new InvalidOperationException("Wrong query usage.");
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
2002 break;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
2003 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
2004 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
2005
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
2006 #endif
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
2007
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
2008 Columns.Add(col);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
2009
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
2010 return col;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
2011 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
2012
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
2013 readonly List<Column> _columns = new List<Column>();
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
2014 public List<Column> Columns
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
2015 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
2016 get { return _columns; }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
2017 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
2018
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
2019 #endregion
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
2020
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
2021 #region HasModifier
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
2022
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
2023 public bool HasModifier
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
2024 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
2025 get { return IsDistinct || SkipValue != null || TakeValue != null; }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
2026 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
2027
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
2028 #endregion
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
2029
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
2030 #region Distinct
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
2031
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
2032 public SelectClause Distinct
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
2033 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
2034 get { IsDistinct = true; return this; }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
2035 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
2036
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
2037 public bool IsDistinct { get; set; }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
2038
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
2039 #endregion
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
2040
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
2041 #region Take
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
2042
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
2043 public SelectClause Take(int value)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
2044 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
2045 TakeValue = new SqlValue(value);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
2046 return this;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
2047 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
2048
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
2049 public SelectClause Take(ISqlExpression value)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
2050 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
2051 TakeValue = value;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
2052 return this;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
2053 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
2054
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
2055 public ISqlExpression TakeValue { get; set; }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
2056
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
2057 #endregion
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
2058
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
2059 #region Skip
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
2060
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
2061 public SelectClause Skip(int value)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
2062 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
2063 SkipValue = new SqlValue(value);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
2064 return this;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
2065 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
2066
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
2067 public SelectClause Skip(ISqlExpression value)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
2068 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
2069 SkipValue = value;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
2070 return this;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
2071 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
2072
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
2073 public ISqlExpression SkipValue { get; set; }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
2074
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
2075 #endregion
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
2076
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
2077 #region Overrides
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
2078
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
2079 #if OVERRIDETOSTRING
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
2080
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
2081 public override string ToString()
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
2082 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
2083 return ((IQueryElement)this).ToString(new StringBuilder(), new Dictionary<IQueryElement,IQueryElement>()).ToString();
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
2084 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
2085
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
2086 #endif
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
2087
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
2088 #endregion
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
2089
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
2090 #region ISqlExpressionWalkable Members
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
2091
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
2092 [Obsolete]
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
2093 ISqlExpression ISqlExpressionWalkable.Walk(bool skipColumns, Func<ISqlExpression,ISqlExpression> func)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
2094 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
2095 for (var i = 0; i < Columns.Count; i++)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
2096 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
2097 var col = Columns[i];
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
2098 #pragma warning disable 0618
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
2099 var expr = col.Walk(skipColumns, func);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
2100 #pragma warning restore 0618
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
2101
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
2102 if (expr is Column)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
2103 Columns[i] = (Column)expr;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
2104 else
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
2105 Columns[i] = new Column(col.Parent, expr, col.Alias);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
2106 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
2107
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
2108 if (TakeValue != null) TakeValue = TakeValue.Walk(skipColumns, func);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
2109 if (SkipValue != null) SkipValue = SkipValue.Walk(skipColumns, func);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
2110
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
2111 return null;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
2112 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
2113
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
2114 #endregion
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
2115
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
2116 #region IQueryElement Members
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
2117
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
2118 public QueryElementType ElementType { get { return QueryElementType.SelectClause; } }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
2119
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
2120 StringBuilder IQueryElement.ToString(StringBuilder sb, Dictionary<IQueryElement,IQueryElement> dic)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
2121 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
2122 if (dic.ContainsKey(this))
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
2123 return sb.Append("...");
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
2124
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
2125 dic.Add(this, this);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
2126
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
2127 sb.Append("SELECT ");
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
2128
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
2129 if (IsDistinct) sb.Append("DISTINCT ");
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
2130
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
2131 if (SkipValue != null)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
2132 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
2133 sb.Append("SKIP ");
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
2134 SkipValue.ToString(sb, dic);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
2135 sb.Append(" ");
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
2136 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
2137
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
2138 if (TakeValue != null)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
2139 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
2140 sb.Append("TAKE ");
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
2141 TakeValue.ToString(sb, dic);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
2142 sb.Append(" ");
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
2143 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
2144
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
2145 sb.AppendLine();
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
2146
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
2147 if (Columns.Count == 0)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
2148 sb.Append("\t*, \n");
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
2149 else
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
2150 foreach (var c in Columns)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
2151 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
2152 sb.Append("\t");
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
2153 ((IQueryElement)c).ToString(sb, dic);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
2154 sb
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
2155 .Append(" as ")
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
2156 .Append(c.Alias ?? "c" + (Columns.IndexOf(c) + 1))
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
2157 .Append(", \n");
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
2158 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
2159
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
2160 sb.Length -= 3;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
2161
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
2162 dic.Remove(this);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
2163
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
2164 return sb;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
2165 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
2166
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
2167 #endregion
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
2168 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
2169
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
2170 private SelectClause _select;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
2171 public SelectClause Select
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
2172 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
2173 get { return _select; }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
2174 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
2175
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
2176 #endregion
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
2177
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
2178 #region InsertClause
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
2179
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
2180 public class SetExpression : IQueryElement, ISqlExpressionWalkable, ICloneableElement
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
2181 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
2182 public SetExpression(ISqlExpression column, ISqlExpression expression)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
2183 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
2184 Column = column;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
2185 Expression = expression;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
2186
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
2187 if (expression is SqlParameter)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
2188 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
2189 var p = (SqlParameter)expression;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
2190
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
2191 //if (type.IsEnum)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
2192 // p.SetEnumConverter(type, mappingSchema);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
2193
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
2194 if (column is SqlField)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
2195 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
2196 var field = (SqlField)column;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
2197
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
2198 if (field.MemberMapper != null)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
2199 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
2200 if (field.MemberMapper.MapMemberInfo.IsDbTypeSet)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
2201 p.DbType = field.MemberMapper.MapMemberInfo.DbType;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
2202
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
2203 if (field.MemberMapper.MapMemberInfo.IsDbSizeSet)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
2204 p.DbSize = field.MemberMapper.MapMemberInfo.DbSize;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
2205 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
2206 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
2207 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
2208 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
2209
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
2210 public ISqlExpression Column { get; set; }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
2211 public ISqlExpression Expression { get; set; }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
2212
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
2213 #region Overrides
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
2214
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
2215 #if OVERRIDETOSTRING
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
2216
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
2217 public override string ToString()
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
2218 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
2219 return ((IQueryElement)this).ToString(new StringBuilder(), new Dictionary<IQueryElement,IQueryElement>()).ToString();
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
2220 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
2221
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
2222 #endif
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
2223
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
2224 #endregion
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
2225
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
2226 #region ICloneableElement Members
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
2227
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
2228 public ICloneableElement Clone(Dictionary<ICloneableElement, ICloneableElement> objectTree, Predicate<ICloneableElement> doClone)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
2229 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
2230 if (!doClone(this))
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
2231 return this;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
2232
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
2233 ICloneableElement clone;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
2234
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
2235 if (!objectTree.TryGetValue(this, out clone))
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
2236 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
2237 objectTree.Add(this, clone = new SetExpression(
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
2238 (ISqlExpression)Column. Clone(objectTree, doClone),
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
2239 (ISqlExpression)Expression.Clone(objectTree, doClone)));
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
2240 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
2241
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
2242 return clone;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
2243 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
2244
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
2245 #endregion
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
2246
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
2247 #region ISqlExpressionWalkable Members
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
2248
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
2249 [Obsolete]
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
2250 ISqlExpression ISqlExpressionWalkable.Walk(bool skipColumns, Func<ISqlExpression,ISqlExpression> func)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
2251 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
2252 Column = Column. Walk(skipColumns, func);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
2253 Expression = Expression.Walk(skipColumns, func);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
2254 return null;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
2255 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
2256
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
2257 #endregion
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
2258
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
2259 #region IQueryElement Members
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
2260
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
2261 public QueryElementType ElementType { get { return QueryElementType.SetExpression; } }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
2262
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
2263 StringBuilder IQueryElement.ToString(StringBuilder sb, Dictionary<IQueryElement,IQueryElement> dic)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
2264 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
2265 Column.ToString(sb, dic);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
2266 sb.Append(" = ");
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
2267 Expression.ToString(sb, dic);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
2268
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
2269 return sb;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
2270 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
2271
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
2272 #endregion
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
2273 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
2274
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
2275 public class InsertClause : IQueryElement, ISqlExpressionWalkable, ICloneableElement
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
2276 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
2277 public InsertClause()
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
2278 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
2279 Items = new List<SetExpression>();
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
2280 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
2281
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
2282 public List<SetExpression> Items { get; private set; }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
2283 public SqlTable Into { get; set; }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
2284 public bool WithIdentity { get; set; }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
2285
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
2286 #region Overrides
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
2287
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
2288 #if OVERRIDETOSTRING
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
2289
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
2290 public override string ToString()
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
2291 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
2292 return ((IQueryElement)this).ToString(new StringBuilder(), new Dictionary<IQueryElement,IQueryElement>()).ToString();
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
2293 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
2294
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
2295 #endif
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
2296
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
2297 #endregion
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
2298
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
2299 #region ICloneableElement Members
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
2300
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
2301 public ICloneableElement Clone(Dictionary<ICloneableElement, ICloneableElement> objectTree, Predicate<ICloneableElement> doClone)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
2302 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
2303 if (!doClone(this))
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
2304 return this;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
2305
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
2306 var clone = new InsertClause { WithIdentity = WithIdentity };
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
2307
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
2308 if (Into != null)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
2309 clone.Into = (SqlTable)Into.Clone(objectTree, doClone);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
2310
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
2311 foreach (var item in Items)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
2312 clone.Items.Add((SetExpression)item.Clone(objectTree, doClone));
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
2313
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
2314 objectTree.Add(this, clone);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
2315
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
2316 return clone;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
2317 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
2318
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
2319 #endregion
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
2320
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
2321 #region ISqlExpressionWalkable Members
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
2322
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
2323 [Obsolete]
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
2324 ISqlExpression ISqlExpressionWalkable.Walk(bool skipColumns, Func<ISqlExpression,ISqlExpression> func)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
2325 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
2326 if (Into != null)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
2327 ((ISqlExpressionWalkable)Into).Walk(skipColumns, func);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
2328
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
2329 foreach (var t in Items)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
2330 ((ISqlExpressionWalkable)t).Walk(skipColumns, func);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
2331
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
2332 return null;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
2333 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
2334
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
2335 #endregion
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
2336
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
2337 #region IQueryElement Members
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
2338
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
2339 public QueryElementType ElementType { get { return QueryElementType.InsertClause; } }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
2340
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
2341 StringBuilder IQueryElement.ToString(StringBuilder sb, Dictionary<IQueryElement,IQueryElement> dic)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
2342 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
2343 sb.Append("VALUES ");
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
2344
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
2345 if (Into != null)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
2346 ((IQueryElement)Into).ToString(sb, dic);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
2347
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
2348 sb.AppendLine();
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
2349
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
2350 foreach (var e in Items)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
2351 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
2352 sb.Append("\t");
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
2353 ((IQueryElement)e).ToString(sb, dic);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
2354 sb.AppendLine();
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
2355 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
2356
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
2357 return sb;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
2358 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
2359
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
2360 #endregion
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
2361 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
2362
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
2363 private InsertClause _insert;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
2364 public InsertClause Insert
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
2365 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
2366 get { return _insert ?? (_insert = new InsertClause()); }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
2367 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
2368
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
2369 public void ClearInsert()
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
2370 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
2371 _insert = null;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
2372 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
2373
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
2374 #endregion
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
2375
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
2376 #region UpdateClause
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
2377
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
2378 public class UpdateClause : IQueryElement, ISqlExpressionWalkable, ICloneableElement
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
2379 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
2380 public UpdateClause()
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
2381 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
2382 Items = new List<SetExpression>();
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
2383 Keys = new List<SetExpression>();
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
2384 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
2385
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
2386 public List<SetExpression> Items { get; private set; }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
2387 public List<SetExpression> Keys { get; private set; }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
2388 public SqlTable Table { get; set; }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
2389
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
2390 #region Overrides
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
2391
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
2392 #if OVERRIDETOSTRING
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
2393
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
2394 public override string ToString()
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
2395 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
2396 return ((IQueryElement)this).ToString(new StringBuilder(), new Dictionary<IQueryElement,IQueryElement>()).ToString();
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
2397 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
2398
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
2399 #endif
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
2400
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
2401 #endregion
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
2402
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
2403 #region ICloneableElement Members
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
2404
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
2405 public ICloneableElement Clone(Dictionary<ICloneableElement, ICloneableElement> objectTree, Predicate<ICloneableElement> doClone)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
2406 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
2407 if (!doClone(this))
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
2408 return this;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
2409
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
2410 var clone = new UpdateClause();
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
2411
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
2412 if (Table != null)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
2413 clone.Table = (SqlTable)Table.Clone(objectTree, doClone);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
2414
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
2415 foreach (var item in Items)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
2416 clone.Items.Add((SetExpression)item.Clone(objectTree, doClone));
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
2417
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
2418 foreach (var item in Keys)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
2419 clone.Keys.Add((SetExpression)item.Clone(objectTree, doClone));
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
2420
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
2421 objectTree.Add(this, clone);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
2422
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
2423 return clone;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
2424 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
2425
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
2426 #endregion
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
2427
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
2428 #region ISqlExpressionWalkable Members
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
2429
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
2430 [Obsolete]
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
2431 ISqlExpression ISqlExpressionWalkable.Walk(bool skipColumns, Func<ISqlExpression,ISqlExpression> func)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
2432 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
2433 if (Table != null)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
2434 ((ISqlExpressionWalkable)Table).Walk(skipColumns, func);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
2435
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
2436 foreach (var t in Items)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
2437 ((ISqlExpressionWalkable)t).Walk(skipColumns, func);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
2438
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
2439 foreach (var t in Keys)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
2440 ((ISqlExpressionWalkable)t).Walk(skipColumns, func);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
2441
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
2442 return null;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
2443 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
2444
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
2445 #endregion
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
2446
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
2447 #region IQueryElement Members
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
2448
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
2449 public QueryElementType ElementType { get { return QueryElementType.UpdateClause; } }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
2450
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
2451 StringBuilder IQueryElement.ToString(StringBuilder sb, Dictionary<IQueryElement,IQueryElement> dic)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
2452 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
2453 sb.Append("SET ");
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
2454
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
2455 if (Table != null)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
2456 ((IQueryElement)Table).ToString(sb, dic);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
2457
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
2458 sb.AppendLine();
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
2459
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
2460 foreach (var e in Items)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
2461 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
2462 sb.Append("\t");
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
2463 ((IQueryElement)e).ToString(sb, dic);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
2464 sb.AppendLine();
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
2465 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
2466
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
2467 return sb;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
2468 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
2469
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
2470 #endregion
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
2471 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
2472
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
2473 private UpdateClause _update;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
2474 public UpdateClause Update
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
2475 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
2476 get { return _update ?? (_update = new UpdateClause()); }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
2477 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
2478
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
2479 public void ClearUpdate()
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
2480 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
2481 _update = null;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
2482 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
2483
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
2484 #endregion
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
2485
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
2486 #region DeleteClause
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
2487
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
2488 public class DeleteClause : IQueryElement, ISqlExpressionWalkable, ICloneableElement
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
2489 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
2490 public SqlTable Table { get; set; }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
2491
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
2492 #region Overrides
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
2493
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
2494 #if OVERRIDETOSTRING
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
2495
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
2496 public override string ToString()
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
2497 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
2498 return ((IQueryElement)this).ToString(new StringBuilder(), new Dictionary<IQueryElement,IQueryElement>()).ToString();
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
2499 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
2500
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
2501 #endif
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
2502
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
2503 #endregion
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
2504
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
2505 #region ICloneableElement Members
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
2506
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
2507 public ICloneableElement Clone(Dictionary<ICloneableElement, ICloneableElement> objectTree, Predicate<ICloneableElement> doClone)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
2508 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
2509 if (!doClone(this))
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
2510 return this;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
2511
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
2512 var clone = new DeleteClause();
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
2513
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
2514 if (Table != null)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
2515 clone.Table = (SqlTable)Table.Clone(objectTree, doClone);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
2516
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
2517 objectTree.Add(this, clone);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
2518
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
2519 return clone;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
2520 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
2521
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
2522 #endregion
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
2523
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
2524 #region ISqlExpressionWalkable Members
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
2525
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
2526 [Obsolete]
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
2527 ISqlExpression ISqlExpressionWalkable.Walk(bool skipColumns, Func<ISqlExpression,ISqlExpression> func)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
2528 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
2529 if (Table != null)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
2530 ((ISqlExpressionWalkable)Table).Walk(skipColumns, func);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
2531
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
2532 return null;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
2533 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
2534
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
2535 #endregion
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
2536
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
2537 #region IQueryElement Members
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
2538
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
2539 public QueryElementType ElementType { get { return QueryElementType.DeleteClause; } }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
2540
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
2541 StringBuilder IQueryElement.ToString(StringBuilder sb, Dictionary<IQueryElement,IQueryElement> dic)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
2542 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
2543 sb.Append("DELETE FROM ");
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
2544
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
2545 if (Table != null)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
2546 ((IQueryElement)Table).ToString(sb, dic);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
2547
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
2548 sb.AppendLine();
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
2549
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
2550 return sb;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
2551 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
2552
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
2553 #endregion
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
2554 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
2555
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
2556 private DeleteClause _delete;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
2557 public DeleteClause Delete
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
2558 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
2559 get { return _delete ?? (_delete = new DeleteClause()); }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
2560 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
2561
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
2562 public void ClearDelete()
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
2563 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
2564 _delete = null;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
2565 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
2566
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
2567 #endregion
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
2568
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
2569 #region FromClause
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
2570
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
2571 public class FromClause : ClauseBase, IQueryElement, ISqlExpressionWalkable
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
2572 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
2573 #region Join
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
2574
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
2575 public class Join : ConditionBase<Join,Join.Next>
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
2576 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
2577 public class Next
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
2578 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
2579 internal Next(Join parent)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
2580 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
2581 _parent = parent;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
2582 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
2583
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
2584 readonly Join _parent;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
2585
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
2586 public Join Or { get { return _parent.SetOr(true); } }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
2587 public Join And { get { return _parent.SetOr(false); } }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
2588
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
2589 public static implicit operator Join(Next next)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
2590 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
2591 return next._parent;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
2592 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
2593 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
2594
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
2595 protected override SearchCondition Search
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
2596 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
2597 get { return JoinedTable.Condition; }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
2598 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
2599
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
2600 protected override Next GetNext()
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
2601 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
2602 return new Next(this);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
2603 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
2604
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
2605 internal Join(JoinType joinType, ISqlTableSource table, string alias, bool isWeak, ICollection<Join> joins)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
2606 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
2607 JoinedTable = new JoinedTable(joinType, table, alias, isWeak);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
2608
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
2609 if (joins != null && joins.Count > 0)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
2610 foreach (var join in joins)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
2611 JoinedTable.Table.Joins.Add(join.JoinedTable);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
2612 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
2613
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
2614 public JoinedTable JoinedTable { get; private set; }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
2615 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
2616
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
2617 #endregion
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
2618
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
2619 internal FromClause(SqlQuery sqlQuery) : base(sqlQuery)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
2620 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
2621 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
2622
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
2623 internal FromClause(
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
2624 SqlQuery sqlQuery,
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
2625 FromClause clone,
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
2626 Dictionary<ICloneableElement,ICloneableElement> objectTree,
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
2627 Predicate<ICloneableElement> doClone)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
2628 : base(sqlQuery)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
2629 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
2630 _tables.AddRange(clone._tables.ConvertAll(ts => (TableSource)ts.Clone(objectTree, doClone)));
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
2631 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
2632
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
2633 internal FromClause(IEnumerable<TableSource> tables)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
2634 : base(null)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
2635 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
2636 _tables.AddRange(tables);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
2637 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
2638
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
2639 public FromClause Table(ISqlTableSource table, params FJoin[] joins)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
2640 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
2641 return Table(table, null, joins);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
2642 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
2643
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
2644 public FromClause Table(ISqlTableSource table, string alias, params FJoin[] joins)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
2645 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
2646 var ts = AddOrGetTable(table, alias);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
2647
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
2648 if (joins != null && joins.Length > 0)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
2649 foreach (var join in joins)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
2650 ts.Joins.Add(join.JoinedTable);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
2651
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
2652 return this;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
2653 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
2654
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
2655 TableSource GetTable(ISqlTableSource table, string alias)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
2656 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
2657 foreach (var ts in Tables)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
2658 if (ts.Source == table)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
2659 if (alias == null || ts.Alias == alias)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
2660 return ts;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
2661 else
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
2662 throw new ArgumentException("alias");
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
2663
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
2664 return null;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
2665 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
2666
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
2667 TableSource AddOrGetTable(ISqlTableSource table, string alias)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
2668 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
2669 var ts = GetTable(table, alias);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
2670
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
2671 if (ts != null)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
2672 return ts;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
2673
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
2674 var t = new TableSource(table, alias);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
2675
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
2676 Tables.Add(t);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
2677
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
2678 return t;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
2679 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
2680
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
2681 public TableSource this[ISqlTableSource table]
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
2682 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
2683 get { return this[table, null]; }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
2684 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
2685
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
2686 public TableSource this[ISqlTableSource table, string alias]
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
2687 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
2688 get
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
2689 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
2690 foreach (var ts in Tables)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
2691 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
2692 var t = CheckTableSource(ts, table, alias);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
2693
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
2694 if (t != null)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
2695 return t;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
2696 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
2697
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
2698 return null;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
2699 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
2700 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
2701
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
2702 public bool IsChild(ISqlTableSource table)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
2703 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
2704 foreach (var ts in Tables)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
2705 if (ts.Source == table || CheckChild(ts.Joins, table))
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
2706 return true;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
2707 return false;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
2708 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
2709
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
2710 static bool CheckChild(IEnumerable<JoinedTable> joins, ISqlTableSource table)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
2711 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
2712 foreach (var j in joins)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
2713 if (j.Table.Source == table || CheckChild(j.Table.Joins, table))
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
2714 return true;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
2715 return false;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
2716 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
2717
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
2718 readonly List<TableSource> _tables = new List<TableSource>();
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
2719 public List<TableSource> Tables
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
2720 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
2721 get { return _tables; }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
2722 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
2723
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
2724 static IEnumerable<ISqlTableSource> GetJoinTables(TableSource source, QueryElementType elementType)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
2725 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
2726 if (source.Source.ElementType == elementType)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
2727 yield return source.Source;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
2728
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
2729 foreach (var join in source.Joins)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
2730 foreach (var table in GetJoinTables(join.Table, elementType))
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
2731 yield return table;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
2732 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
2733
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
2734 internal IEnumerable<ISqlTableSource> GetFromTables()
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
2735 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
2736 return Tables.SelectMany(_ => GetJoinTables(_, QueryElementType.SqlTable));
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
2737 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
2738
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
2739 internal IEnumerable<ISqlTableSource> GetFromQueries()
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
2740 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
2741 return Tables.SelectMany(_ => GetJoinTables(_, QueryElementType.SqlQuery));
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
2742 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
2743
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
2744 static TableSource FindTableSource(TableSource source, SqlTable table)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
2745 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
2746 if (source.Source == table)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
2747 return source;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
2748
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
2749 foreach (var join in source.Joins)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
2750 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
2751 var ts = FindTableSource(join.Table, table);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
2752 if (ts != null)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
2753 return ts;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
2754 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
2755
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
2756 return null;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
2757 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
2758
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
2759 public ISqlTableSource FindTableSource(SqlTable table)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
2760 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
2761 foreach (var source in Tables)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
2762 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
2763 var ts = FindTableSource(source, table);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
2764 if (ts != null)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
2765 return ts;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
2766 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
2767
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
2768 return null;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
2769 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
2770
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
2771 #region Overrides
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
2772
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
2773 #if OVERRIDETOSTRING
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
2774
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
2775 public override string ToString()
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
2776 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
2777 return ((IQueryElement)this).ToString(new StringBuilder(), new Dictionary<IQueryElement,IQueryElement>()).ToString();
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
2778 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
2779
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
2780 #endif
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
2781
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
2782 #endregion
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
2783
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
2784 #region ISqlExpressionWalkable Members
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
2785
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
2786 [Obsolete]
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
2787 ISqlExpression ISqlExpressionWalkable.Walk(bool skipColumns, Func<ISqlExpression,ISqlExpression> func)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
2788 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
2789 for (var i = 0; i < Tables.Count; i++)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
2790 ((ISqlExpressionWalkable)Tables[i]).Walk(skipColumns, func);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
2791
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
2792 return null;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
2793 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
2794
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
2795 #endregion
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
2796
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
2797 #region IQueryElement Members
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
2798
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
2799 public QueryElementType ElementType { get { return QueryElementType.FromClause; } }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
2800
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
2801 StringBuilder IQueryElement.ToString(StringBuilder sb, Dictionary<IQueryElement,IQueryElement> dic)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
2802 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
2803 sb.Append(" \nFROM \n");
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
2804
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
2805 if (Tables.Count > 0)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
2806 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
2807 foreach (IQueryElement ts in Tables)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
2808 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
2809 sb.Append('\t');
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
2810 var len = sb.Length;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
2811 ts.ToString(sb, dic).Replace("\n", "\n\t", len, sb.Length - len);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
2812 sb.Append(", ");
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
2813 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
2814
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
2815 sb.Length -= 2;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
2816 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
2817
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
2818 return sb;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
2819 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
2820
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
2821 #endregion
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
2822 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
2823
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
2824 public static FJoin InnerJoin (ISqlTableSource table, params FJoin[] joins) { return new FJoin(JoinType.Inner, table, null, false, joins); }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
2825 public static FJoin InnerJoin (ISqlTableSource table, string alias, params FJoin[] joins) { return new FJoin(JoinType.Inner, table, alias, false, joins); }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
2826 public static FJoin LeftJoin (ISqlTableSource table, params FJoin[] joins) { return new FJoin(JoinType.Left, table, null, false, joins); }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
2827 public static FJoin LeftJoin (ISqlTableSource table, string alias, params FJoin[] joins) { return new FJoin(JoinType.Left, table, alias, false, joins); }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
2828 public static FJoin Join (ISqlTableSource table, params FJoin[] joins) { return new FJoin(JoinType.Auto, table, null, false, joins); }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
2829 public static FJoin Join (ISqlTableSource table, string alias, params FJoin[] joins) { return new FJoin(JoinType.Auto, table, alias, false, joins); }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
2830 public static FJoin CrossApply (ISqlTableSource table, params FJoin[] joins) { return new FJoin(JoinType.CrossApply, table, null, false, joins); }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
2831 public static FJoin CrossApply (ISqlTableSource table, string alias, params FJoin[] joins) { return new FJoin(JoinType.CrossApply, table, alias, false, joins); }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
2832 public static FJoin OuterApply (ISqlTableSource table, params FJoin[] joins) { return new FJoin(JoinType.OuterApply, table, null, false, joins); }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
2833 public static FJoin OuterApply (ISqlTableSource table, string alias, params FJoin[] joins) { return new FJoin(JoinType.OuterApply, table, alias, false, joins); }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
2834
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
2835 public static FJoin WeakInnerJoin(ISqlTableSource table, params FJoin[] joins) { return new FJoin(JoinType.Inner, table, null, true, joins); }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
2836 public static FJoin WeakInnerJoin(ISqlTableSource table, string alias, params FJoin[] joins) { return new FJoin(JoinType.Inner, table, alias, true, joins); }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
2837 public static FJoin WeakLeftJoin (ISqlTableSource table, params FJoin[] joins) { return new FJoin(JoinType.Left, table, null, true, joins); }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
2838 public static FJoin WeakLeftJoin (ISqlTableSource table, string alias, params FJoin[] joins) { return new FJoin(JoinType.Left, table, alias, true, joins); }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
2839 public static FJoin WeakJoin (ISqlTableSource table, params FJoin[] joins) { return new FJoin(JoinType.Auto, table, null, true, joins); }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
2840 public static FJoin WeakJoin (ISqlTableSource table, string alias, params FJoin[] joins) { return new FJoin(JoinType.Auto, table, alias, true, joins); }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
2841
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
2842 private FromClause _from;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
2843 public FromClause From
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
2844 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
2845 get { return _from; }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
2846 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
2847
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
2848 #endregion
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
2849
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
2850 #region WhereClause
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
2851
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
2852 public class WhereClause : ClauseBase<WhereClause,WhereClause.Next>, IQueryElement, ISqlExpressionWalkable
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
2853 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
2854 public class Next : ClauseBase
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
2855 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
2856 internal Next(WhereClause parent) : base(parent.SqlQuery)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
2857 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
2858 _parent = parent;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
2859 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
2860
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
2861 readonly WhereClause _parent;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
2862
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
2863 public WhereClause Or { get { return _parent.SetOr(true); } }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
2864 public WhereClause And { get { return _parent.SetOr(false); } }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
2865 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
2866
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
2867 internal WhereClause(SqlQuery sqlQuery) : base(sqlQuery)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
2868 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
2869 SearchCondition = new SearchCondition();
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
2870 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
2871
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
2872 internal WhereClause(
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
2873 SqlQuery sqlQuery,
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
2874 WhereClause clone,
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
2875 Dictionary<ICloneableElement,ICloneableElement> objectTree,
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
2876 Predicate<ICloneableElement> doClone)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
2877 : base(sqlQuery)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
2878 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
2879 SearchCondition = (SearchCondition)clone.SearchCondition.Clone(objectTree, doClone);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
2880 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
2881
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
2882 internal WhereClause(SearchCondition searchCondition) : base(null)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
2883 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
2884 SearchCondition = searchCondition;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
2885 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
2886
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
2887 public SearchCondition SearchCondition { get; private set; }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
2888
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
2889 public bool IsEmpty
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
2890 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
2891 get { return SearchCondition.Conditions.Count == 0; }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
2892 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
2893
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
2894 protected override SearchCondition Search
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
2895 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
2896 get { return SearchCondition; }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
2897 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
2898
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
2899 protected override Next GetNext()
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
2900 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
2901 return new Next(this);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
2902 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
2903
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
2904 #if OVERRIDETOSTRING
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
2905
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
2906 public override string ToString()
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
2907 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
2908 return ((IQueryElement)this).ToString(new StringBuilder(), new Dictionary<IQueryElement,IQueryElement>()).ToString();
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
2909 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
2910
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
2911 #endif
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
2912
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
2913 #region ISqlExpressionWalkable Members
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
2914
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
2915 [Obsolete]
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
2916 ISqlExpression ISqlExpressionWalkable.Walk(bool skipColumns, Func<ISqlExpression,ISqlExpression> action)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
2917 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
2918 SearchCondition = (SearchCondition)((ISqlExpressionWalkable)SearchCondition).Walk(skipColumns, action);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
2919 return null;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
2920 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
2921
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
2922 #endregion
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
2923
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
2924 #region IQueryElement Members
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
2925
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
2926 public QueryElementType ElementType
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
2927 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
2928 get { return QueryElementType.WhereClause; }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
2929 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
2930
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
2931 StringBuilder IQueryElement.ToString(StringBuilder sb, Dictionary<IQueryElement,IQueryElement> dic)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
2932 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
2933 if (Search.Conditions.Count == 0)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
2934 return sb;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
2935
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
2936 sb.Append("\nWHERE\n\t");
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
2937 return ((IQueryElement)Search).ToString(sb, dic);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
2938 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
2939
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
2940 #endregion
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
2941 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
2942
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
2943 private WhereClause _where;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
2944 public WhereClause Where
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
2945 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
2946 get { return _where; }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
2947 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
2948
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
2949 #endregion
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
2950
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
2951 #region GroupByClause
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
2952
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
2953 public class GroupByClause : ClauseBase, IQueryElement, ISqlExpressionWalkable
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
2954 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
2955 internal GroupByClause(SqlQuery sqlQuery) : base(sqlQuery)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
2956 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
2957 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
2958
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
2959 internal GroupByClause(
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
2960 SqlQuery sqlQuery,
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
2961 GroupByClause clone,
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
2962 Dictionary<ICloneableElement,ICloneableElement> objectTree,
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
2963 Predicate<ICloneableElement> doClone)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
2964 : base(sqlQuery)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
2965 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
2966 _items.AddRange(clone._items.ConvertAll(e => (ISqlExpression)e.Clone(objectTree, doClone)));
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
2967 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
2968
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
2969 internal GroupByClause(IEnumerable<ISqlExpression> items) : base(null)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
2970 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
2971 _items.AddRange(items);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
2972 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
2973
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
2974 public GroupByClause Expr(ISqlExpression expr)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
2975 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
2976 Add(expr);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
2977 return this;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
2978 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
2979
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
2980 public GroupByClause Field(SqlField field)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
2981 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
2982 return Expr(field);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
2983 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
2984
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
2985 void Add(ISqlExpression expr)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
2986 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
2987 foreach (var e in Items)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
2988 if (e.Equals(expr))
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
2989 return;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
2990
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
2991 Items.Add(expr);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
2992 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
2993
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
2994 readonly List<ISqlExpression> _items = new List<ISqlExpression>();
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
2995 public List<ISqlExpression> Items
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
2996 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
2997 get { return _items; }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
2998 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
2999
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
3000 public bool IsEmpty
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
3001 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
3002 get { return Items.Count == 0; }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
3003 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
3004
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
3005 #if OVERRIDETOSTRING
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
3006
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
3007 public override string ToString()
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
3008 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
3009 return ((IQueryElement)this).ToString(new StringBuilder(), new Dictionary<IQueryElement,IQueryElement>()).ToString();
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
3010 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
3011
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
3012 #endif
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
3013
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
3014 #region ISqlExpressionWalkable Members
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
3015
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
3016 [Obsolete]
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
3017 ISqlExpression ISqlExpressionWalkable.Walk(bool skipColumns, Func<ISqlExpression,ISqlExpression> func)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
3018 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
3019 for (var i = 0; i < Items.Count; i++)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
3020 Items[i] = Items[i].Walk(skipColumns, func);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
3021
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
3022 return null;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
3023 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
3024
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
3025 #endregion
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
3026
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
3027 #region IQueryElement Members
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
3028
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
3029 public QueryElementType ElementType { get { return QueryElementType.GroupByClause; } }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
3030
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
3031 StringBuilder IQueryElement.ToString(StringBuilder sb, Dictionary<IQueryElement,IQueryElement> dic)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
3032 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
3033 if (Items.Count == 0)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
3034 return sb;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
3035
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
3036 sb.Append(" \nGROUP BY \n");
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
3037
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
3038 foreach (var item in Items)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
3039 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
3040 sb.Append('\t');
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
3041 item.ToString(sb, dic);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
3042 sb.Append(",");
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
3043 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
3044
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
3045 sb.Length--;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
3046
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
3047 return sb;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
3048 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
3049
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
3050 #endregion
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
3051 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
3052
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
3053 private GroupByClause _groupBy;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
3054 public GroupByClause GroupBy
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
3055 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
3056 get { return _groupBy; }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
3057 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
3058
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
3059 #endregion
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
3060
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
3061 #region HavingClause
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
3062
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
3063 private WhereClause _having;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
3064 public WhereClause Having
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
3065 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
3066 get { return _having; }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
3067 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
3068
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
3069 #endregion
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
3070
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
3071 #region OrderByClause
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
3072
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
3073 public class OrderByClause : ClauseBase, IQueryElement, ISqlExpressionWalkable
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
3074 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
3075 internal OrderByClause(SqlQuery sqlQuery) : base(sqlQuery)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
3076 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
3077 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
3078
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
3079 internal OrderByClause(
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
3080 SqlQuery sqlQuery,
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
3081 OrderByClause clone,
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
3082 Dictionary<ICloneableElement,ICloneableElement> objectTree,
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
3083 Predicate<ICloneableElement> doClone)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
3084 : base(sqlQuery)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
3085 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
3086 _items.AddRange(clone._items.ConvertAll(item => (OrderByItem)item.Clone(objectTree, doClone)));
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
3087 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
3088
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
3089 internal OrderByClause(IEnumerable<OrderByItem> items) : base(null)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
3090 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
3091 _items.AddRange(items);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
3092 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
3093
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
3094 public OrderByClause Expr(ISqlExpression expr, bool isDescending)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
3095 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
3096 Add(expr, isDescending);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
3097 return this;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
3098 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
3099
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
3100 public OrderByClause Expr (ISqlExpression expr) { return Expr(expr, false); }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
3101 public OrderByClause ExprAsc (ISqlExpression expr) { return Expr(expr, false); }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
3102 public OrderByClause ExprDesc (ISqlExpression expr) { return Expr(expr, true); }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
3103 public OrderByClause Field (SqlField field, bool isDescending) { return Expr(field, isDescending); }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
3104 public OrderByClause Field (SqlField field) { return Expr(field, false); }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
3105 public OrderByClause FieldAsc (SqlField field) { return Expr(field, false); }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
3106 public OrderByClause FieldDesc(SqlField field) { return Expr(field, true); }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
3107
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
3108 void Add(ISqlExpression expr, bool isDescending)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
3109 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
3110 foreach (var item in Items)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
3111 if (item.Expression.Equals(expr, (x, y) =>
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
3112 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
3113 var col = x as Column;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
3114 return col == null || !col.Parent.HasUnion || x == y;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
3115 }))
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
3116 return;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
3117
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
3118 Items.Add(new OrderByItem(expr, isDescending));
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
3119 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
3120
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
3121 readonly List<OrderByItem> _items = new List<OrderByItem>();
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
3122 public List<OrderByItem> Items
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
3123 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
3124 get { return _items; }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
3125 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
3126
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
3127 public bool IsEmpty
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
3128 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
3129 get { return Items.Count == 0; }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
3130 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
3131
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
3132 #if OVERRIDETOSTRING
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
3133
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
3134 public override string ToString()
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
3135 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
3136 return ((IQueryElement)this).ToString(new StringBuilder(), new Dictionary<IQueryElement,IQueryElement>()).ToString();
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
3137 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
3138
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
3139 #endif
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
3140
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
3141 #region ISqlExpressionWalkable Members
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
3142
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
3143 [Obsolete]
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
3144 ISqlExpression ISqlExpressionWalkable.Walk(bool skipColumns, Func<ISqlExpression,ISqlExpression> func)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
3145 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
3146 #pragma warning disable 0618
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
3147 foreach (var t in Items)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
3148 t.Walk(skipColumns, func);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
3149 #pragma warning restore 0618
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
3150 return null;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
3151 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
3152
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
3153 #endregion
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
3154
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
3155 #region IQueryElement Members
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
3156
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
3157 public QueryElementType ElementType { get { return QueryElementType.OrderByClause; } }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
3158
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
3159 StringBuilder IQueryElement.ToString(StringBuilder sb, Dictionary<IQueryElement,IQueryElement> dic)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
3160 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
3161 if (Items.Count == 0)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
3162 return sb;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
3163
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
3164 sb.Append(" \nORDER BY \n");
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
3165
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
3166 foreach (IQueryElement item in Items)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
3167 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
3168 sb.Append('\t');
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
3169 item.ToString(sb, dic);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
3170 sb.Append(", ");
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
3171 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
3172
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
3173 sb.Length -= 2;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
3174
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
3175 return sb;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
3176 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
3177
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
3178 #endregion
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
3179 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
3180
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
3181 private OrderByClause _orderBy;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
3182 public OrderByClause OrderBy
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
3183 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
3184 get { return _orderBy; }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
3185 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
3186
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
3187 #endregion
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
3188
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
3189 #region Union
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
3190
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
3191 public class Union : IQueryElement
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
3192 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
3193 public Union()
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
3194 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
3195 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
3196
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
3197 public Union(SqlQuery sqlQuery, bool isAll)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
3198 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
3199 SqlQuery = sqlQuery;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
3200 IsAll = isAll;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
3201 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
3202
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
3203 public SqlQuery SqlQuery { get; private set; }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
3204 public bool IsAll { get; private set; }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
3205
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
3206 public QueryElementType ElementType
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
3207 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
3208 get { return QueryElementType.Union; }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
3209 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
3210
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
3211 #if OVERRIDETOSTRING
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
3212
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
3213 public override string ToString()
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
3214 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
3215 return ((IQueryElement)this).ToString(new StringBuilder(), new Dictionary<IQueryElement,IQueryElement>()).ToString();
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
3216 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
3217
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
3218 #endif
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
3219
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
3220 StringBuilder IQueryElement.ToString(StringBuilder sb, Dictionary<IQueryElement,IQueryElement> dic)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
3221 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
3222 sb.Append(" \nUNION").Append(IsAll ? " ALL" : "").Append(" \n");
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
3223 return ((IQueryElement)SqlQuery).ToString(sb, dic);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
3224 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
3225 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
3226
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
3227 private List<Union> _unions;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
3228 public List<Union> Unions
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
3229 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
3230 get { return _unions ?? (_unions = new List<Union>()); }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
3231 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
3232
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
3233 public bool HasUnion { get { return _unions != null && _unions.Count > 0; } }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
3234
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
3235 public void AddUnion(SqlQuery union, bool isAll)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
3236 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
3237 Unions.Add(new Union(union, isAll));
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
3238 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
3239
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
3240 #endregion
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
3241
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
3242 #region FinalizeAndValidate
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
3243
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
3244 public void FinalizeAndValidate(bool isApplySupported, bool optimizeColumns)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
3245 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
3246 #if DEBUG
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
3247 var sqlText = SqlText;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
3248
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
3249 var dic = new Dictionary<SqlQuery,SqlQuery>();
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
3250
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
3251 new QueryVisitor().VisitAll(this, e =>
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
3252 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
3253 var sql = e as SqlQuery;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
3254
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
3255 if (sql != null)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
3256 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
3257 if (dic.ContainsKey(sql))
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
3258 throw new InvalidOperationException("SqlQuery circle reference detected.");
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
3259
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
3260 dic.Add(sql, sql);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
3261 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
3262 });
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
3263 #endif
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
3264
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
3265 OptimizeUnions();
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
3266 FinalizeAndValidateInternal(isApplySupported, optimizeColumns, true, new List<ISqlTableSource>());
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
3267 ResolveFields();
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
3268 SetAliases();
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
3269
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
3270 #if DEBUG
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
3271 sqlText = SqlText;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
3272 #endif
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
3273 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
3274
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
3275 class QueryData
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
3276 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
3277 public SqlQuery Query;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
3278 public List<ISqlExpression> Fields = new List<ISqlExpression>();
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
3279 public List<QueryData> Queries = new List<QueryData>();
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
3280 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
3281
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
3282 void ResolveFields()
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
3283 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
3284 var root = GetQueryData();
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
3285
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
3286 ResolveFields(root);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
3287 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
3288
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
3289 QueryData GetQueryData()
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
3290 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
3291 var data = new QueryData { Query = this };
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
3292
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
3293 new QueryVisitor().VisitParentFirst(this, e =>
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
3294 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
3295 switch (e.ElementType)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
3296 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
3297 case QueryElementType.SqlField :
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
3298 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
3299 var field = (SqlField)e;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
3300
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
3301 if (field.Name.Length != 1 || field.Name[0] != '*')
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
3302 data.Fields.Add(field);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
3303
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
3304 break;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
3305 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
3306
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
3307 case QueryElementType.SqlQuery :
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
3308 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
3309 if (e != this)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
3310 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
3311 data.Queries.Add(((SqlQuery)e).GetQueryData());
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
3312 return false;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
3313 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
3314
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
3315 break;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
3316 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
3317
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
3318 case QueryElementType.Column :
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
3319 return ((Column)e).Parent == this;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
3320
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
3321 case QueryElementType.SqlTable :
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
3322 return false;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
3323 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
3324
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
3325 return true;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
3326 });
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
3327
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
3328 return data;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
3329 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
3330
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
3331 static TableSource FindField(SqlField field, TableSource table)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
3332 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
3333 if (field.Table == table.Source)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
3334 return table;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
3335
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
3336 foreach (var @join in table.Joins)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
3337 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
3338 var t = FindField(field, @join.Table);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
3339
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
3340 if (t != null)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
3341 return @join.Table;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
3342 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
3343
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
3344 return null;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
3345 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
3346
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
3347 static ISqlExpression GetColumn(QueryData data, SqlField field)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
3348 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
3349 foreach (var query in data.Queries)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
3350 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
3351 var q = query.Query;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
3352
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
3353 foreach (var table in q.From.Tables)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
3354 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
3355 var t = FindField(field, table);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
3356
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
3357 if (t != null)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
3358 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
3359 var n = q.Select.Columns.Count;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
3360 var idx = q.Select.Add(field);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
3361
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
3362 if (n != q.Select.Columns.Count)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
3363 if (!q.GroupBy.IsEmpty || q.Select.Columns.Exists(c => IsAggregationFunction(c.Expression)))
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
3364 q.GroupBy.Items.Add(field);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
3365
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
3366 return q.Select.Columns[idx];
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
3367 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
3368 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
3369 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
3370
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
3371 return null;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
3372 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
3373
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
3374 static void ResolveFields(QueryData data)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
3375 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
3376 if (data.Queries.Count == 0)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
3377 return;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
3378
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
3379 var dic = new Dictionary<ISqlExpression,ISqlExpression>();
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
3380
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
3381 foreach (SqlField field in data.Fields)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
3382 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
3383 if (dic.ContainsKey(field))
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
3384 continue;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
3385
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
3386 var found = false;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
3387
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
3388 foreach (var table in data.Query.From.Tables)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
3389 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
3390 found = FindField(field, table) != null;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
3391
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
3392 if (found)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
3393 break;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
3394 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
3395
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
3396 if (!found)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
3397 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
3398 var expr = GetColumn(data, field);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
3399
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
3400 if (expr != null)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
3401 dic.Add(field, expr);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
3402 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
3403 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
3404
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
3405 if (dic.Count > 0)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
3406 new QueryVisitor().VisitParentFirst(data.Query, e =>
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
3407 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
3408 ISqlExpression ex;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
3409
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
3410 switch (e.ElementType)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
3411 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
3412 case QueryElementType.SqlQuery :
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
3413 return e == data.Query;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
3414
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
3415 case QueryElementType.SqlFunction :
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
3416 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
3417 var parms = ((SqlFunction)e).Parameters;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
3418
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
3419 for (var i = 0; i < parms.Length; i++)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
3420 if (dic.TryGetValue(parms[i], out ex))
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
3421 parms[i] = ex;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
3422
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
3423 break;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
3424 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
3425
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
3426 case QueryElementType.SqlExpression :
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
3427 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
3428 var parms = ((SqlExpression)e).Parameters;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
3429
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
3430 for (var i = 0; i < parms.Length; i++)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
3431 if (dic.TryGetValue(parms[i], out ex))
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
3432 parms[i] = ex;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
3433
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
3434 break;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
3435 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
3436
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
3437 case QueryElementType.SqlBinaryExpression :
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
3438 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
3439 var expr = (SqlBinaryExpression)e;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
3440 if (dic.TryGetValue(expr.Expr1, out ex)) expr.Expr1 = ex;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
3441 if (dic.TryGetValue(expr.Expr2, out ex)) expr.Expr2 = ex;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
3442 break;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
3443 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
3444
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
3445 case QueryElementType.ExprPredicate :
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
3446 case QueryElementType.NotExprPredicate :
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
3447 case QueryElementType.IsNullPredicate :
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
3448 case QueryElementType.InSubQueryPredicate :
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
3449 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
3450 var expr = (Predicate.Expr)e;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
3451 if (dic.TryGetValue(expr.Expr1, out ex)) expr.Expr1 = ex;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
3452 break;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
3453 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
3454
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
3455 case QueryElementType.ExprExprPredicate :
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
3456 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
3457 var expr = (Predicate.ExprExpr)e;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
3458 if (dic.TryGetValue(expr.Expr1, out ex)) expr.Expr1 = ex;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
3459 if (dic.TryGetValue(expr.Expr2, out ex)) expr.Expr2 = ex;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
3460 break;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
3461 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
3462
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
3463 case QueryElementType.LikePredicate :
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
3464 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
3465 var expr = (Predicate.Like)e;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
3466 if (dic.TryGetValue(expr.Expr1, out ex)) expr.Expr1 = ex;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
3467 if (dic.TryGetValue(expr.Expr2, out ex)) expr.Expr2 = ex;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
3468 if (dic.TryGetValue(expr.Escape, out ex)) expr.Escape = ex;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
3469 break;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
3470 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
3471
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
3472 case QueryElementType.BetweenPredicate :
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
3473 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
3474 var expr = (Predicate.Between)e;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
3475 if (dic.TryGetValue(expr.Expr1, out ex)) expr.Expr1 = ex;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
3476 if (dic.TryGetValue(expr.Expr2, out ex)) expr.Expr2 = ex;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
3477 if (dic.TryGetValue(expr.Expr3, out ex)) expr.Expr3 = ex;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
3478 break;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
3479 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
3480
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
3481 case QueryElementType.InListPredicate :
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
3482 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
3483 var expr = (Predicate.InList)e;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
3484
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
3485 if (dic.TryGetValue(expr.Expr1, out ex)) expr.Expr1 = ex;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
3486
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
3487 for (var i = 0; i < expr.Values.Count; i++)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
3488 if (dic.TryGetValue(expr.Values[i], out ex))
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
3489 expr.Values[i] = ex;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
3490
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
3491 break;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
3492 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
3493
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
3494 case QueryElementType.Column :
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
3495 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
3496 var expr = (Column)e;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
3497
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
3498 if (expr.Parent != data.Query)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
3499 return false;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
3500
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
3501 if (dic.TryGetValue(expr.Expression, out ex)) expr.Expression = ex;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
3502
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
3503 break;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
3504 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
3505
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
3506 case QueryElementType.SetExpression :
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
3507 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
3508 var expr = (SetExpression)e;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
3509 if (dic.TryGetValue(expr.Expression, out ex)) expr.Expression = ex;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
3510 break;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
3511 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
3512
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
3513 case QueryElementType.GroupByClause :
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
3514 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
3515 var expr = (GroupByClause)e;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
3516
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
3517 for (var i = 0; i < expr.Items.Count; i++)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
3518 if (dic.TryGetValue(expr.Items[i], out ex))
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
3519 expr.Items[i] = ex;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
3520
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
3521 break;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
3522 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
3523
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
3524 case QueryElementType.OrderByItem :
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
3525 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
3526 var expr = (OrderByItem)e;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
3527 if (dic.TryGetValue(expr.Expression, out ex)) expr.Expression = ex;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
3528 break;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
3529 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
3530 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
3531
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
3532 return true;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
3533 });
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
3534
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
3535 foreach (var query in data.Queries)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
3536 if (query.Queries.Count > 0)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
3537 ResolveFields(query);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
3538 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
3539
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
3540 void OptimizeUnions()
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
3541 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
3542 var exprs = new Dictionary<ISqlExpression,ISqlExpression>();
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
3543
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
3544 new QueryVisitor().Visit(this, e =>
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
3545 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
3546 var sql = e as SqlQuery;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
3547
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
3548 if (sql == null || sql.From.Tables.Count != 1 || !sql.IsSimple || sql._insert != null || sql._update != null || sql._delete != null)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
3549 return;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
3550
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
3551 var table = sql.From.Tables[0];
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
3552
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
3553 if (table.Joins.Count != 0 || !(table.Source is SqlQuery))
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
3554 return;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
3555
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
3556 var union = (SqlQuery)table.Source;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
3557
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
3558 if (!union.HasUnion)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
3559 return;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
3560
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
3561 for (var i = 0; i < sql.Select.Columns.Count; i++)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
3562 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
3563 var scol = sql. Select.Columns[i];
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
3564 var ucol = union.Select.Columns[i];
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
3565
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
3566 if (scol.Expression != ucol)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
3567 return;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
3568 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
3569
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
3570 exprs.Add(union, sql);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
3571
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
3572 for (var i = 0; i < sql.Select.Columns.Count; i++)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
3573 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
3574 var scol = sql. Select.Columns[i];
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
3575 var ucol = union.Select.Columns[i];
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
3576
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
3577 scol.Expression = ucol.Expression;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
3578 scol._alias = ucol._alias;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
3579
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
3580 exprs.Add(ucol, scol);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
3581 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
3582
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
3583 for (var i = sql.Select.Columns.Count; i < union.Select.Columns.Count; i++)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
3584 sql.Select.Expr(union.Select.Columns[i].Expression);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
3585
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
3586 sql.From.Tables.Clear();
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
3587 sql.From.Tables.AddRange(union.From.Tables);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
3588
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
3589 sql.Where. SearchCondition.Conditions.AddRange(union.Where. SearchCondition.Conditions);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
3590 sql.Having. SearchCondition.Conditions.AddRange(union.Having.SearchCondition.Conditions);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
3591 sql.GroupBy.Items. AddRange(union.GroupBy.Items);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
3592 sql.OrderBy.Items. AddRange(union.OrderBy.Items);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
3593 sql.Unions.InsertRange(0, union.Unions);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
3594 });
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
3595
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
3596 ((ISqlExpressionWalkable)this).Walk(false, expr =>
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
3597 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
3598 ISqlExpression e;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
3599
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
3600 if (exprs.TryGetValue(expr, out e))
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
3601 return e;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
3602
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
3603 return expr;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
3604 });
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
3605 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
3606
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
3607 void FinalizeAndValidateInternal(bool isApplySupported, bool optimizeColumns, bool optimizeSearchCondition, List<ISqlTableSource> tables)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
3608 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
3609 OptimizeSearchCondition(Where. SearchCondition);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
3610 OptimizeSearchCondition(Having.SearchCondition);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
3611
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
3612 if (optimizeSearchCondition)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
3613 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
3614 ForEachTable(table =>
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
3615 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
3616 foreach (var join in table.Joins)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
3617 OptimizeSearchCondition(join.Condition);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
3618 }, new HashSet<SqlQuery>());
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
3619 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
3620
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
3621 new QueryVisitor().Visit(this, e =>
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
3622 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
3623 var sql = e as SqlQuery;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
3624
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
3625 if (sql != null && sql != this)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
3626 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
3627 sql.ParentSql = this;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
3628 sql.FinalizeAndValidateInternal(isApplySupported, optimizeColumns, false, tables);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
3629
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
3630 if (sql.IsParameterDependent)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
3631 IsParameterDependent = true;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
3632 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
3633 });
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
3634
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
3635 ResolveWeakJoins(tables);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
3636 OptimizeColumns();
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
3637 OptimizeApplies (isApplySupported, optimizeColumns);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
3638 OptimizeSubQueries(isApplySupported, optimizeColumns);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
3639 OptimizeApplies (isApplySupported, optimizeColumns);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
3640
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
3641 new QueryVisitor().Visit(this, e =>
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
3642 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
3643 var sql = e as SqlQuery;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
3644
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
3645 if (sql != null && sql != this)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
3646 sql.RemoveOrderBy();
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
3647 });
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
3648 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
3649
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
3650 internal static void OptimizeSearchCondition(SearchCondition searchCondition)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
3651 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
3652 // This 'if' could be replaced by one simple match:
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
3653 //
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
3654 // match (searchCondition.Conditions)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
3655 // {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
3656 // | [SearchCondition(true, _) sc] =>
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
3657 // searchCondition.Conditions = sc.Conditions;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
3658 // OptimizeSearchCondition(searchCodition)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
3659 //
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
3660 // | [SearchCondition(false, [SearchCondition(true, [ExprExpr]) sc])] => ...
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
3661 //
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
3662 // | [Expr(true, SqlValue(true))]
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
3663 // | [Expr(false, SqlValue(false))]
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
3664 // searchCondition.Conditions = []
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
3665 // }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
3666 //
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
3667 // One day I am going to rewrite all this crap in Nemerle.
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
3668 //
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
3669 if (searchCondition.Conditions.Count == 1)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
3670 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
3671 var cond = searchCondition.Conditions[0];
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
3672
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
3673 if (cond.Predicate is SearchCondition)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
3674 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
3675 var sc = (SearchCondition)cond.Predicate;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
3676
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
3677 if (!cond.IsNot)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
3678 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
3679 searchCondition.Conditions.Clear();
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
3680 searchCondition.Conditions.AddRange(sc.Conditions);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
3681
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
3682 OptimizeSearchCondition(searchCondition);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
3683 return;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
3684 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
3685
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
3686 if (sc.Conditions.Count == 1)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
3687 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
3688 var c1 = sc.Conditions[0];
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
3689
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
3690 if (!c1.IsNot && c1.Predicate is Predicate.ExprExpr)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
3691 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
3692 var ee = (Predicate.ExprExpr)c1.Predicate;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
3693 Predicate.Operator op;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
3694
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
3695 switch (ee.Operator)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
3696 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
3697 case Predicate.Operator.Equal : op = Predicate.Operator.NotEqual; break;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
3698 case Predicate.Operator.NotEqual : op = Predicate.Operator.Equal; break;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
3699 case Predicate.Operator.Greater : op = Predicate.Operator.LessOrEqual; break;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
3700 case Predicate.Operator.NotLess :
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
3701 case Predicate.Operator.GreaterOrEqual : op = Predicate.Operator.Less; break;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
3702 case Predicate.Operator.Less : op = Predicate.Operator.GreaterOrEqual; break;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
3703 case Predicate.Operator.NotGreater :
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
3704 case Predicate.Operator.LessOrEqual : op = Predicate.Operator.Greater; break;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
3705 default: throw new InvalidOperationException();
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
3706 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
3707
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
3708 c1.Predicate = new Predicate.ExprExpr(ee.Expr1, op, ee.Expr2);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
3709
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
3710 searchCondition.Conditions.Clear();
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
3711 searchCondition.Conditions.AddRange(sc.Conditions);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
3712
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
3713 OptimizeSearchCondition(searchCondition);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
3714 return;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
3715 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
3716 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
3717 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
3718
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
3719 if (cond.Predicate.ElementType == QueryElementType.ExprPredicate)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
3720 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
3721 var expr = (Predicate.Expr)cond.Predicate;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
3722
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
3723 if (expr.Expr1 is SqlValue)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
3724 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
3725 var value = (SqlValue)expr.Expr1;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
3726
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
3727 if (value.Value is bool)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
3728 if (cond.IsNot ? !(bool)value.Value : (bool)value.Value)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
3729 searchCondition.Conditions.Clear();
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
3730 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
3731 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
3732 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
3733
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
3734 for (var i = 0; i < searchCondition.Conditions.Count; i++)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
3735 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
3736 var cond = searchCondition.Conditions[i];
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
3737
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
3738 if (cond.Predicate is Predicate.Expr)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
3739 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
3740 var expr = (Predicate.Expr)cond.Predicate;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
3741
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
3742 if (expr.Expr1 is SqlValue)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
3743 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
3744 var value = (SqlValue)expr.Expr1;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
3745
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
3746 if (value.Value is bool)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
3747 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
3748 if (cond.IsNot ? !(bool)value.Value : (bool)value.Value)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
3749 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
3750 if (i > 0)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
3751 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
3752 if (searchCondition.Conditions[i-1].IsOr)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
3753 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
3754 searchCondition.Conditions.RemoveRange(0, i);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
3755 OptimizeSearchCondition(searchCondition);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
3756
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
3757 break;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
3758 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
3759 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
3760 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
3761 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
3762 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
3763 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
3764 else if (cond.Predicate is SearchCondition)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
3765 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
3766 var sc = (SearchCondition)cond.Predicate;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
3767 OptimizeSearchCondition(sc);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
3768 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
3769 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
3770 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
3771
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
3772 void ForEachTable(Action<TableSource> action, HashSet<SqlQuery> visitedQueries)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
3773 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
3774 if (!visitedQueries.Add(this))
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
3775 return;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
3776
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
3777 foreach (var table in From.Tables)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
3778 table.ForEach(action, visitedQueries);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
3779
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
3780 new QueryVisitor().Visit(this, e =>
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
3781 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
3782 if (e is SqlQuery && e != this)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
3783 ((SqlQuery)e).ForEachTable(action, visitedQueries);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
3784 });
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
3785 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
3786
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
3787 void RemoveOrderBy()
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
3788 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
3789 if (OrderBy.Items.Count > 0 && Select.SkipValue == null && Select.TakeValue == null)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
3790 OrderBy.Items.Clear();
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
3791 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
3792
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
3793 internal void ResolveWeakJoins(List<ISqlTableSource> tables)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
3794 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
3795 Func<TableSource,bool> findTable = null; findTable = table =>
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
3796 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
3797 if (tables.Contains(table.Source))
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
3798 return true;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
3799
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
3800 foreach (var join in table.Joins)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
3801 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
3802 if (findTable(join.Table))
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
3803 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
3804 join.IsWeak = false;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
3805 return true;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
3806 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
3807 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
3808
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
3809 if (table.Source is SqlQuery)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
3810 foreach (var t in ((SqlQuery)table.Source).From.Tables)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
3811 if (findTable(t))
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
3812 return true;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
3813
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
3814 return false;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
3815 };
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
3816
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
3817 var areTablesCollected = false;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
3818
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
3819 ForEachTable(table =>
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
3820 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
3821 for (var i = 0; i < table.Joins.Count; i++)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
3822 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
3823 var join = table.Joins[i];
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
3824
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
3825 if (join.IsWeak)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
3826 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
3827 if (!areTablesCollected)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
3828 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
3829 areTablesCollected = true;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
3830
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
3831 Action<IQueryElement> tableCollector = expr =>
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
3832 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
3833 var field = expr as SqlField;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
3834
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
3835 if (field != null && !tables.Contains(field.Table))
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
3836 tables.Add(field.Table);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
3837 };
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
3838
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
3839 var visitor = new QueryVisitor();
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
3840
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
3841 visitor.VisitAll(Select, tableCollector);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
3842 visitor.VisitAll(Where, tableCollector);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
3843 visitor.VisitAll(GroupBy, tableCollector);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
3844 visitor.VisitAll(Having, tableCollector);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
3845 visitor.VisitAll(OrderBy, tableCollector);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
3846
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
3847 if (_insert != null)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
3848 visitor.VisitAll(Insert, tableCollector);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
3849
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
3850 if (_update != null)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
3851 visitor.VisitAll(Update, tableCollector);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
3852
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
3853 if (_delete != null)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
3854 visitor.VisitAll(Delete, tableCollector);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
3855
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
3856 visitor.VisitAll(From, expr =>
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
3857 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
3858 var tbl = expr as SqlTable;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
3859
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
3860 if (tbl != null && tbl.TableArguments != null)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
3861 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
3862 var v = new QueryVisitor();
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
3863
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
3864 foreach (var arg in tbl.TableArguments)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
3865 v.VisitAll(arg, tableCollector);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
3866 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
3867 });
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
3868 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
3869
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
3870 if (findTable(join.Table))
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
3871 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
3872 join.IsWeak = false;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
3873 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
3874 else
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
3875 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
3876 table.Joins.RemoveAt(i);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
3877 i--;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
3878 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
3879 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
3880 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
3881 }, new HashSet<SqlQuery>());
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
3882 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
3883
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
3884 TableSource OptimizeSubQuery(
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
3885 TableSource source,
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
3886 bool optimizeWhere,
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
3887 bool allColumns,
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
3888 bool isApplySupported,
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
3889 bool optimizeValues,
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
3890 bool optimizeColumns)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
3891 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
3892 foreach (var jt in source.Joins)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
3893 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
3894 var table = OptimizeSubQuery(
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
3895 jt.Table,
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
3896 jt.JoinType == JoinType.Inner || jt.JoinType == JoinType.CrossApply,
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
3897 false,
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
3898 isApplySupported,
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
3899 jt.JoinType == JoinType.Inner || jt.JoinType == JoinType.CrossApply,
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
3900 optimizeColumns);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
3901
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
3902 if (table != jt.Table)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
3903 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
3904 var sql = jt.Table.Source as SqlQuery;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
3905
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
3906 if (sql != null && sql.OrderBy.Items.Count > 0)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
3907 foreach (var item in sql.OrderBy.Items)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
3908 OrderBy.Expr(item.Expression, item.IsDescending);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
3909
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
3910 jt.Table = table;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
3911 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
3912 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
3913
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
3914 return source.Source is SqlQuery ?
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
3915 RemoveSubQuery(source, optimizeWhere, allColumns && !isApplySupported, optimizeValues, optimizeColumns) :
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
3916 source;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
3917 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
3918
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
3919 static bool CheckColumn(Column column, ISqlExpression expr, SqlQuery query, bool optimizeValues, bool optimizeColumns)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
3920 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
3921 if (expr is SqlField || expr is Column)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
3922 return false;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
3923
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
3924 if (expr is SqlValue)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
3925 return !optimizeValues && 1.Equals(((SqlValue)expr).Value);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
3926
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
3927 if (expr is SqlBinaryExpression)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
3928 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
3929 var e = (SqlBinaryExpression)expr;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
3930
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
3931 if (e.Operation == "*" && e.Expr1 is SqlValue)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
3932 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
3933 var value = (SqlValue)e.Expr1;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
3934
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
3935 if (value.Value is int && (int)value.Value == -1)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
3936 return CheckColumn(column, e.Expr2, query, optimizeValues, optimizeColumns);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
3937 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
3938 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
3939
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
3940 var visitor = new QueryVisitor();
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
3941
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
3942 if (optimizeColumns &&
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
3943 visitor.Find(expr, e => e is SqlQuery || IsAggregationFunction(e)) == null)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
3944 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
3945 var n = 0;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
3946 var q = query.ParentSql ?? query;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
3947
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
3948 visitor.VisitAll(q, e => { if (e == column) n++; });
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
3949
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
3950 return n > 2;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
3951 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
3952
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
3953 return true;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
3954 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
3955
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
3956 TableSource RemoveSubQuery(
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
3957 TableSource childSource,
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
3958 bool concatWhere,
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
3959 bool allColumns,
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
3960 bool optimizeValues,
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
3961 bool optimizeColumns)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
3962 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
3963 var query = (SqlQuery)childSource.Source;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
3964
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
3965 var isQueryOK = query.From.Tables.Count == 1;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
3966
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
3967 isQueryOK = isQueryOK && (concatWhere || query.Where.IsEmpty && query.Having.IsEmpty);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
3968 isQueryOK = isQueryOK && !query.HasUnion && query.GroupBy.IsEmpty && !query.Select.HasModifier;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
3969
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
3970 if (!isQueryOK)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
3971 return childSource;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
3972
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
3973 var isColumnsOK =
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
3974 (allColumns && !query.Select.Columns.Exists(c => IsAggregationFunction(c.Expression))) ||
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
3975 !query.Select.Columns.Exists(c => CheckColumn(c, c.Expression, query, optimizeValues, optimizeColumns));
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
3976
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
3977 if (!isColumnsOK)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
3978 return childSource;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
3979
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
3980 var map = new Dictionary<ISqlExpression,ISqlExpression>(query.Select.Columns.Count);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
3981
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
3982 foreach (var c in query.Select.Columns)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
3983 map.Add(c, c.Expression);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
3984
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
3985 var top = this;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
3986
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
3987 while (top.ParentSql != null)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
3988 top = top.ParentSql;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
3989
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
3990 ((ISqlExpressionWalkable)top).Walk(false, expr =>
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
3991 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
3992 ISqlExpression fld;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
3993 return map.TryGetValue(expr, out fld) ? fld : expr;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
3994 });
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
3995
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
3996 new QueryVisitor().Visit(top, expr =>
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
3997 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
3998 if (expr.ElementType == QueryElementType.InListPredicate)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
3999 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
4000 var p = (Predicate.InList)expr;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
4001
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
4002 if (p.Expr1 == query)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
4003 p.Expr1 = query.From.Tables[0];
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
4004 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
4005 });
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
4006
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
4007 query.From.Tables[0].Joins.AddRange(childSource.Joins);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
4008
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
4009 if (query.From.Tables[0].Alias == null)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
4010 query.From.Tables[0].Alias = childSource.Alias;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
4011
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
4012 if (!query.Where. IsEmpty) ConcatSearchCondition(Where, query.Where);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
4013 if (!query.Having.IsEmpty) ConcatSearchCondition(Having, query.Having);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
4014
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
4015 ((ISqlExpressionWalkable)top).Walk(false, expr =>
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
4016 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
4017 if (expr is SqlQuery)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
4018 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
4019 var sql = (SqlQuery)expr;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
4020
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
4021 if (sql.ParentSql == query)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
4022 sql.ParentSql = query.ParentSql ?? this;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
4023 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
4024
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
4025 return expr;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
4026 });
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
4027
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
4028 return query.From.Tables[0];
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
4029 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
4030
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
4031 static bool IsAggregationFunction(IQueryElement expr)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
4032 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
4033 if (expr is SqlFunction)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
4034 switch (((SqlFunction)expr).Name)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
4035 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
4036 case "Count" :
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
4037 case "Average" :
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
4038 case "Min" :
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
4039 case "Max" :
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
4040 case "Sum" : return true;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
4041 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
4042
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
4043 return false;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
4044 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
4045
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
4046 void OptimizeApply(TableSource tableSource, JoinedTable joinTable, bool isApplySupported, bool optimizeColumns)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
4047 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
4048 var joinSource = joinTable.Table;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
4049
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
4050 foreach (var join in joinSource.Joins)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
4051 if (join.JoinType == JoinType.CrossApply || join.JoinType == JoinType.OuterApply)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
4052 OptimizeApply(joinSource, join, isApplySupported, optimizeColumns);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
4053
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
4054 if (isApplySupported && !joinTable.CanConvertApply)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
4055 return;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
4056
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
4057 if (joinSource.Source.ElementType == QueryElementType.SqlQuery)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
4058 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
4059 var sql = (SqlQuery)joinSource.Source;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
4060 var isAgg = sql.Select.Columns.Exists(c => IsAggregationFunction(c.Expression));
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
4061
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
4062 if (isApplySupported && (isAgg || sql.Select.TakeValue != null || sql.Select.SkipValue != null))
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
4063 return;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
4064
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
4065 var searchCondition = new List<Condition>(sql.Where.SearchCondition.Conditions);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
4066
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
4067 sql.Where.SearchCondition.Conditions.Clear();
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
4068
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
4069 if (!ContainsTable(tableSource.Source, sql))
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
4070 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
4071 joinTable.JoinType = joinTable.JoinType == JoinType.CrossApply ? JoinType.Inner : JoinType.Left;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
4072 joinTable.Condition.Conditions.AddRange(searchCondition);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
4073 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
4074 else
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
4075 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
4076 sql.Where.SearchCondition.Conditions.AddRange(searchCondition);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
4077
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
4078 var table = OptimizeSubQuery(
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
4079 joinTable.Table,
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
4080 joinTable.JoinType == JoinType.Inner || joinTable.JoinType == JoinType.CrossApply,
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
4081 joinTable.JoinType == JoinType.CrossApply,
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
4082 isApplySupported,
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
4083 joinTable.JoinType == JoinType.Inner || joinTable.JoinType == JoinType.CrossApply,
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
4084 optimizeColumns);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
4085
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
4086 if (table != joinTable.Table)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
4087 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
4088 var q = joinTable.Table.Source as SqlQuery;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
4089
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
4090 if (q != null && q.OrderBy.Items.Count > 0)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
4091 foreach (var item in q.OrderBy.Items)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
4092 OrderBy.Expr(item.Expression, item.IsDescending);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
4093
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
4094 joinTable.Table = table;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
4095
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
4096 OptimizeApply(tableSource, joinTable, isApplySupported, optimizeColumns);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
4097 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
4098 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
4099 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
4100 else
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
4101 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
4102 if (!ContainsTable(tableSource.Source, joinSource.Source))
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
4103 joinTable.JoinType = joinTable.JoinType == JoinType.CrossApply ? JoinType.Inner : JoinType.Left;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
4104 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
4105 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
4106
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
4107 static bool ContainsTable(ISqlTableSource table, IQueryElement sql)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
4108 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
4109 return null != new QueryVisitor().Find(sql, e =>
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
4110 e == table ||
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
4111 e.ElementType == QueryElementType.SqlField && table == ((SqlField)e).Table ||
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
4112 e.ElementType == QueryElementType.Column && table == ((Column) e).Parent);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
4113 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
4114
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
4115 static void ConcatSearchCondition(WhereClause where1, WhereClause where2)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
4116 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
4117 if (where1.IsEmpty)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
4118 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
4119 where1.SearchCondition.Conditions.AddRange(where2.SearchCondition.Conditions);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
4120 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
4121 else
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
4122 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
4123 if (where1.SearchCondition.Precedence < Sql.Precedence.LogicalConjunction)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
4124 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
4125 var sc1 = new SearchCondition();
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
4126
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
4127 sc1.Conditions.AddRange(where1.SearchCondition.Conditions);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
4128
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
4129 where1.SearchCondition.Conditions.Clear();
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
4130 where1.SearchCondition.Conditions.Add(new Condition(false, sc1));
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
4131 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
4132
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
4133 if (where2.SearchCondition.Precedence < Sql.Precedence.LogicalConjunction)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
4134 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
4135 var sc2 = new SearchCondition();
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
4136
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
4137 sc2.Conditions.AddRange(where2.SearchCondition.Conditions);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
4138
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
4139 where1.SearchCondition.Conditions.Add(new Condition(false, sc2));
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
4140 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
4141 else
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
4142 where1.SearchCondition.Conditions.AddRange(where2.SearchCondition.Conditions);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
4143 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
4144 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
4145
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
4146 void OptimizeSubQueries(bool isApplySupported, bool optimizeColumns)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
4147 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
4148 for (var i = 0; i < From.Tables.Count; i++)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
4149 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
4150 var table = OptimizeSubQuery(From.Tables[i], true, false, isApplySupported, true, optimizeColumns);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
4151
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
4152 if (table != From.Tables[i])
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
4153 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
4154 var sql = From.Tables[i].Source as SqlQuery;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
4155
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
4156 if (!Select.Columns.All(c => IsAggregationFunction(c.Expression)))
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
4157 if (sql != null && sql.OrderBy.Items.Count > 0)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
4158 foreach (var item in sql.OrderBy.Items)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
4159 OrderBy.Expr(item.Expression, item.IsDescending);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
4160
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
4161 From.Tables[i] = table;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
4162 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
4163 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
4164 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
4165
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
4166 void OptimizeApplies(bool isApplySupported, bool optimizeColumns)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
4167 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
4168 foreach (var table in From.Tables)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
4169 foreach (var join in table.Joins)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
4170 if (join.JoinType == JoinType.CrossApply || join.JoinType == JoinType.OuterApply)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
4171 OptimizeApply(table, join, isApplySupported, optimizeColumns);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
4172 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
4173
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
4174 void OptimizeColumns()
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
4175 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
4176 ((ISqlExpressionWalkable)Select).Walk(false, expr =>
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
4177 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
4178 var query = expr as SqlQuery;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
4179
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
4180 if (query != null && query.From.Tables.Count == 0 && query.Select.Columns.Count == 1)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
4181 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
4182 new QueryVisitor().Visit(query.Select.Columns[0].Expression, e =>
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
4183 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
4184 if (e.ElementType == QueryElementType.SqlQuery)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
4185 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
4186 var q = (SqlQuery)e;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
4187
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
4188 if (q.ParentSql == query)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
4189 q.ParentSql = query.ParentSql;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
4190 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
4191 });
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
4192
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
4193 return query.Select.Columns[0].Expression;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
4194 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
4195
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
4196 return expr;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
4197 });
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
4198 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
4199
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
4200 IDictionary<string,object> _aliases;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
4201
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
4202 public void RemoveAlias(string alias)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
4203 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
4204 if (_aliases != null)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
4205 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
4206 alias = alias.ToUpper();
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
4207 if (_aliases.ContainsKey(alias))
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
4208 _aliases.Remove(alias);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
4209 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
4210 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
4211
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
4212 public string GetAlias(string desiredAlias, string defaultAlias)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
4213 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
4214 if (_aliases == null)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
4215 _aliases = new Dictionary<string,object>();
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
4216
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
4217 var alias = desiredAlias;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
4218
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
4219 if (string.IsNullOrEmpty(desiredAlias) || desiredAlias.Length > 30)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
4220 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
4221 desiredAlias = defaultAlias;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
4222 alias = defaultAlias + "1";
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
4223 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
4224
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
4225 for (var i = 1; ; i++)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
4226 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
4227 var s = alias.ToUpper();
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
4228
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
4229 if (!_aliases.ContainsKey(s) && !_reservedWords.ContainsKey(s))
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
4230 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
4231 _aliases.Add(s, s);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
4232 break;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
4233 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
4234
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
4235 alias = desiredAlias + i;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
4236 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
4237
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
4238 return alias;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
4239 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
4240
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
4241 public string[] GetTempAliases(int n, string defaultAlias)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
4242 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
4243 var aliases = new string[n];
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
4244
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
4245 for (var i = 0; i < aliases.Length; i++)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
4246 aliases[i] = GetAlias(defaultAlias, defaultAlias);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
4247
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
4248 foreach (var t in aliases)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
4249 RemoveAlias(t);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
4250
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
4251 return aliases;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
4252 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
4253
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
4254 void SetAliases()
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
4255 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
4256 _aliases = null;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
4257
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
4258 var objs = new Dictionary<object,object>();
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
4259
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
4260 Parameters.Clear();
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
4261
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
4262 new QueryVisitor().VisitAll(this, expr =>
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
4263 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
4264 switch (expr.ElementType)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
4265 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
4266 case QueryElementType.SqlParameter:
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
4267 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
4268 var p = (SqlParameter)expr;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
4269
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
4270 if (p.IsQueryParameter)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
4271 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
4272 if (!objs.ContainsKey(expr))
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
4273 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
4274 objs.Add(expr, expr);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
4275 p.Name = GetAlias(p.Name, "p");
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
4276 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
4277
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
4278 Parameters.Add(p);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
4279 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
4280 else
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
4281 IsParameterDependent = true;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
4282 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
4283
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
4284 break;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
4285
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
4286 case QueryElementType.Column:
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
4287 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
4288 if (!objs.ContainsKey(expr))
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
4289 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
4290 objs.Add(expr, expr);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
4291
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
4292 var c = (Column)expr;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
4293
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
4294 if (c.Alias != "*")
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
4295 c.Alias = GetAlias(c.Alias, "c");
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
4296 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
4297 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
4298
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
4299 break;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
4300
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
4301 case QueryElementType.TableSource:
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
4302 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
4303 var table = (TableSource)expr;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
4304
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
4305 if (!objs.ContainsKey(table))
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
4306 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
4307 objs.Add(table, table);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
4308 table.Alias = GetAlias(table.Alias, "t");
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
4309 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
4310 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
4311
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
4312 break;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
4313
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
4314 case QueryElementType.SqlQuery:
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
4315 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
4316 var sql = (SqlQuery)expr;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
4317
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
4318 if (sql.HasUnion)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
4319 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
4320 for (var i = 0; i < sql.Select.Columns.Count; i++)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
4321 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
4322 var col = sql.Select.Columns[i];
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
4323
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
4324 foreach (var t in sql.Unions)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
4325 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
4326 var union = t.SqlQuery.Select;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
4327
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
4328 objs.Remove(union.Columns[i].Alias);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
4329
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
4330 union.Columns[i].Alias = col.Alias;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
4331 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
4332 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
4333 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
4334 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
4335
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
4336 break;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
4337 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
4338 });
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
4339 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
4340
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
4341 #endregion
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
4342
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
4343 #region ProcessParameters
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
4344
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
4345 public SqlQuery ProcessParameters()
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
4346 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
4347 if (IsParameterDependent)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
4348 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
4349 var query = new QueryVisitor().Convert(this, e =>
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
4350 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
4351 switch (e.ElementType)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
4352 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
4353 case QueryElementType.SqlParameter :
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
4354 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
4355 var p = (SqlParameter)e;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
4356
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
4357 if (p.Value == null)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
4358 return new SqlValue(null);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
4359 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
4360
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
4361 break;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
4362
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
4363 case QueryElementType.ExprExprPredicate :
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
4364 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
4365 var ee = (Predicate.ExprExpr)e;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
4366
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
4367 if (ee.Operator == Predicate.Operator.Equal || ee.Operator == Predicate.Operator.NotEqual)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
4368 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
4369 object value1;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
4370 object value2;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
4371
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
4372 if (ee.Expr1 is SqlValue)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
4373 value1 = ((SqlValue)ee.Expr1).Value;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
4374 else if (ee.Expr1 is SqlParameter)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
4375 value1 = ((SqlParameter)ee.Expr1).Value;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
4376 else
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
4377 break;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
4378
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
4379 if (ee.Expr2 is SqlValue)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
4380 value2 = ((SqlValue)ee.Expr2).Value;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
4381 else if (ee.Expr2 is SqlParameter)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
4382 value2 = ((SqlParameter)ee.Expr2).Value;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
4383 else
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
4384 break;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
4385
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
4386 var value = Equals(value1, value2);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
4387
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
4388 if (ee.Operator == Predicate.Operator.NotEqual)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
4389 value = !value;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
4390
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
4391 return new Predicate.Expr(new SqlValue(value), Sql.Precedence.Comparison);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
4392 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
4393 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
4394
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
4395 break;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
4396
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
4397 case QueryElementType.InListPredicate :
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
4398 return ConvertInListPredicate((Predicate.InList)e);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
4399 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
4400
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
4401 return null;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
4402 });
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
4403
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
4404 if (query != this)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
4405 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
4406 query.Parameters.Clear();
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
4407
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
4408 new QueryVisitor().VisitAll(query, expr =>
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
4409 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
4410 if (expr.ElementType == QueryElementType.SqlParameter)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
4411 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
4412 var p = (SqlParameter)expr;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
4413 if (p.IsQueryParameter)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
4414 query.Parameters.Add(p);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
4415 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
4416 });
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
4417 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
4418
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
4419 return query;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
4420 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
4421
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
4422 return this;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
4423 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
4424
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
4425 static Predicate ConvertInListPredicate(Predicate.InList p)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
4426 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
4427 if (p.Values == null || p.Values.Count == 0)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
4428 return new Predicate.Expr(new SqlValue(p.IsNot));
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
4429
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
4430 if (p.Values.Count == 1 && p.Values[0] is SqlParameter)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
4431 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
4432 var pr = (SqlParameter)p.Values[0];
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
4433
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
4434 if (pr.Value == null)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
4435 return new Predicate.Expr(new SqlValue(p.IsNot));
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
4436
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
4437 if (pr.Value is IEnumerable)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
4438 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
4439 if (p.Expr1 is ISqlTableSource)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
4440 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
4441 var items = (IEnumerable)pr.Value;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
4442 var table = (ISqlTableSource)p.Expr1;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
4443 var keys = table.GetKeys(true);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
4444
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
4445 if (keys == null || keys.Count == 0)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
4446 throw new SqlException("Cant create IN expression.");
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
4447
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
4448 if (keys.Count == 1)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
4449 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
4450 var values = new List<ISqlExpression>();
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
4451 var field = GetUnderlayingField(keys[0]);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
4452
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
4453 foreach (var item in items)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
4454 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
4455 var value = field.MemberMapper.GetValue(item);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
4456 values.Add(new SqlValue(value));
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
4457 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
4458
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
4459 if (values.Count == 0)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
4460 return new Predicate.Expr(new SqlValue(p.IsNot));
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
4461
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
4462 return new Predicate.InList(keys[0], p.IsNot, values);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
4463 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
4464
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
4465 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
4466 var sc = new SearchCondition();
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
4467
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
4468 foreach (var item in items)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
4469 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
4470 var itemCond = new SearchCondition();
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
4471
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
4472 foreach (var key in keys)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
4473 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
4474 var field = GetUnderlayingField(key);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
4475 var value = field.MemberMapper.GetValue(item);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
4476 var cond = value == null ?
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
4477 new Condition(false, new Predicate.IsNull (field, false)) :
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
4478 new Condition(false, new Predicate.ExprExpr(field, Predicate.Operator.Equal, new SqlValue(value)));
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
4479
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
4480 itemCond.Conditions.Add(cond);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
4481 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
4482
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
4483 sc.Conditions.Add(new Condition(false, new Predicate.Expr(itemCond), true));
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
4484 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
4485
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
4486 if (sc.Conditions.Count == 0)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
4487 return new Predicate.Expr(new SqlValue(p.IsNot));
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
4488
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
4489 if (p.IsNot)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
4490 return new Predicate.NotExpr(sc, true, Sql.Precedence.LogicalNegation);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
4491
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
4492 return new Predicate.Expr(sc, Sql.Precedence.LogicalDisjunction);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
4493 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
4494 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
4495
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
4496 if (p.Expr1 is SqlExpression)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
4497 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
4498 var expr = (SqlExpression)p.Expr1;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
4499
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
4500 if (expr.Expr.Length > 1 && expr.Expr[0] == '\x1')
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
4501 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
4502 var type = TypeHelper.GetListItemType(pr.Value);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
4503 var ta = TypeAccessor.GetAccessor(type);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
4504 var items = (IEnumerable)pr.Value;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
4505 var names = expr.Expr.Substring(1).Split(',');
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
4506
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
4507 if (expr.Parameters.Length == 1)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
4508 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
4509 var values = new List<ISqlExpression>();
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
4510
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
4511 foreach (var item in items)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
4512 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
4513 var value = ta[names[0]].GetValue(item);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
4514 values.Add(new SqlValue(value));
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
4515 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
4516
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
4517 if (values.Count == 0)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
4518 return new Predicate.Expr(new SqlValue(p.IsNot));
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
4519
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
4520 return new Predicate.InList(expr.Parameters[0], p.IsNot, values);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
4521 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
4522
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
4523 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
4524 var sc = new SearchCondition();
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
4525
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
4526 foreach (var item in items)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
4527 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
4528 var itemCond = new SearchCondition();
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
4529
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
4530 for (var i = 0; i < expr.Parameters.Length; i++)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
4531 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
4532 var sql = expr.Parameters[i];
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
4533 var value = ta[names[i]].GetValue(item);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
4534 var cond = value == null ?
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
4535 new Condition(false, new Predicate.IsNull (sql, false)) :
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
4536 new Condition(false, new Predicate.ExprExpr(sql, Predicate.Operator.Equal, new SqlValue(value)));
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
4537
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
4538 itemCond.Conditions.Add(cond);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
4539 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
4540
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
4541 sc.Conditions.Add(new Condition(false, new Predicate.Expr(itemCond), true));
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
4542 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
4543
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
4544 if (sc.Conditions.Count == 0)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
4545 return new Predicate.Expr(new SqlValue(p.IsNot));
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
4546
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
4547 if (p.IsNot)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
4548 return new Predicate.NotExpr(sc, true, Sql.Precedence.LogicalNegation);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
4549
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
4550 return new Predicate.Expr(sc, Sql.Precedence.LogicalDisjunction);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
4551 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
4552 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
4553 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
4554
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
4555 /*
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
4556 var itemType = items.GetType().GetItemType();
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
4557
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
4558 if (itemType == typeof(DateTime) || itemType == typeof(DateTimeOffset) ||
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
4559 itemType == typeof(DateTime?) || itemType == typeof(DateTimeOffset?))
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
4560 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
4561 var list = new List<SqlParameter>();
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
4562
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
4563 foreach (var item in items)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
4564 list.Add(new SqlParameter(itemType, "p", item, (MappingSchema)null));
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
4565
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
4566 return new Predicate.InList(p.Expr1, p.IsNot, list);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
4567 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
4568 */
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
4569 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
4570 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
4571
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
4572 return null;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
4573 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
4574
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
4575 static SqlField GetUnderlayingField(ISqlExpression expr)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
4576 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
4577 switch (expr.ElementType)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
4578 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
4579 case QueryElementType.SqlField: return (SqlField)expr;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
4580 case QueryElementType.Column : return GetUnderlayingField(((Column)expr).Expression);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
4581 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
4582
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
4583 throw new InvalidOperationException();
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
4584 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
4585
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
4586 #endregion
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
4587
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
4588 #region Clone
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
4589
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
4590 SqlQuery(SqlQuery clone, Dictionary<ICloneableElement,ICloneableElement> objectTree, Predicate<ICloneableElement> doClone)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
4591 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
4592 objectTree.Add(clone, this);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
4593 objectTree.Add(clone.All, All);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
4594
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
4595 SourceID = Interlocked.Increment(ref SourceIDCounter);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
4596
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
4597 _queryType = clone._queryType;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
4598
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
4599 if (IsInsert) _insert = (InsertClause)clone._insert.Clone(objectTree, doClone);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
4600 if (IsUpdate) _update = (UpdateClause)clone._update.Clone(objectTree, doClone);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
4601 if (IsDelete) _delete = (DeleteClause)clone._delete.Clone(objectTree, doClone);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
4602
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
4603 _select = new SelectClause (this, clone._select, objectTree, doClone);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
4604 _from = new FromClause (this, clone._from, objectTree, doClone);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
4605 _where = new WhereClause (this, clone._where, objectTree, doClone);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
4606 _groupBy = new GroupByClause(this, clone._groupBy, objectTree, doClone);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
4607 _having = new WhereClause (this, clone._having, objectTree, doClone);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
4608 _orderBy = new OrderByClause(this, clone._orderBy, objectTree, doClone);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
4609
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
4610 _parameters.AddRange(clone._parameters.ConvertAll(p => (SqlParameter)p.Clone(objectTree, doClone)));
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
4611 IsParameterDependent = clone.IsParameterDependent;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
4612
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
4613 new QueryVisitor().Visit(this, expr =>
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
4614 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
4615 var sb = expr as SqlQuery;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
4616
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
4617 if (sb != null && sb.ParentSql == clone)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
4618 sb.ParentSql = this;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
4619 });
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
4620 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
4621
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
4622 public SqlQuery Clone()
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
4623 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
4624 return (SqlQuery)Clone(new Dictionary<ICloneableElement,ICloneableElement>(), _ => true);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
4625 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
4626
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
4627 public SqlQuery Clone(Predicate<ICloneableElement> doClone)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
4628 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
4629 return (SqlQuery)Clone(new Dictionary<ICloneableElement,ICloneableElement>(), doClone);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
4630 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
4631
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
4632 #endregion
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
4633
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
4634 #region Helpers
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
4635
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
4636 public TableSource GetTableSource(ISqlTableSource table)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
4637 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
4638 var ts = From[table];
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
4639 return ts == null && ParentSql != null? ParentSql.GetTableSource(table) : ts;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
4640 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
4641
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
4642 static TableSource CheckTableSource(TableSource ts, ISqlTableSource table, string alias)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
4643 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
4644 if (ts.Source == table && (alias == null || ts.Alias == alias))
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
4645 return ts;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
4646
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
4647 var jt = ts[table, alias];
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
4648
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
4649 if (jt != null)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
4650 return jt;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
4651
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
4652 if (ts.Source is SqlQuery)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
4653 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
4654 var s = ((SqlQuery)ts.Source).From[table, alias];
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
4655
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
4656 if (s != null)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
4657 return s;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
4658 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
4659
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
4660 return null;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
4661 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
4662
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
4663 #endregion
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
4664
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
4665 #region Overrides
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
4666
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
4667 public string SqlText { get { return ToString(); } }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
4668
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
4669 #if OVERRIDETOSTRING
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
4670
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
4671 public override string ToString()
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
4672 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
4673 return ((IQueryElement)this).ToString(new StringBuilder(), new Dictionary<IQueryElement,IQueryElement>()).ToString();
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
4674 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
4675
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
4676 #endif
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
4677
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
4678 #endregion
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
4679
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
4680 #region ISqlExpression Members
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
4681
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
4682 public bool CanBeNull()
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
4683 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
4684 return true;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
4685 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
4686
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
4687 public bool Equals(ISqlExpression other, Func<ISqlExpression, ISqlExpression, bool> comparer)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
4688 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
4689 return this == other;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
4690 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
4691
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
4692 public int Precedence
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
4693 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
4694 get { return Sql.Precedence.Unknown; }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
4695 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
4696
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
4697 public Type SystemType
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
4698 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
4699 get
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
4700 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
4701 if (Select.Columns.Count == 1)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
4702 return Select.Columns[0].SystemType;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
4703
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
4704 if (From.Tables.Count == 1 && From.Tables[0].Joins.Count == 0)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
4705 return From.Tables[0].SystemType;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
4706
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
4707 return null;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
4708 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
4709 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
4710
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
4711 #endregion
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
4712
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
4713 #region ICloneableElement Members
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
4714
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
4715 public ICloneableElement Clone(Dictionary<ICloneableElement, ICloneableElement> objectTree, Predicate<ICloneableElement> doClone)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
4716 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
4717 if (!doClone(this))
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
4718 return this;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
4719
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
4720 ICloneableElement clone;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
4721
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
4722 if (!objectTree.TryGetValue(this, out clone))
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
4723 clone = new SqlQuery(this, objectTree, doClone);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
4724
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
4725 return clone;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
4726 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
4727
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
4728 #endregion
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
4729
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
4730 #region ISqlExpressionWalkable Members
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
4731
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
4732 [Obsolete]
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
4733 ISqlExpression ISqlExpressionWalkable.Walk(bool skipColumns, Func<ISqlExpression,ISqlExpression> func)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
4734 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
4735 if (_insert != null) ((ISqlExpressionWalkable)_insert).Walk(skipColumns, func);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
4736 if (_update != null) ((ISqlExpressionWalkable)_update).Walk(skipColumns, func);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
4737 if (_delete != null) ((ISqlExpressionWalkable)_delete).Walk(skipColumns, func);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
4738
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
4739 ((ISqlExpressionWalkable)Select) .Walk(skipColumns, func);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
4740 ((ISqlExpressionWalkable)From) .Walk(skipColumns, func);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
4741 ((ISqlExpressionWalkable)Where) .Walk(skipColumns, func);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
4742 ((ISqlExpressionWalkable)GroupBy).Walk(skipColumns, func);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
4743 ((ISqlExpressionWalkable)Having) .Walk(skipColumns, func);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
4744 ((ISqlExpressionWalkable)OrderBy).Walk(skipColumns, func);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
4745
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
4746 if (HasUnion)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
4747 foreach (var union in Unions)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
4748 ((ISqlExpressionWalkable)union.SqlQuery).Walk(skipColumns, func);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
4749
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
4750 return func(this);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
4751 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
4752
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
4753 #endregion
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
4754
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
4755 #region IEquatable<ISqlExpression> Members
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
4756
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
4757 bool IEquatable<ISqlExpression>.Equals(ISqlExpression other)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
4758 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
4759 return this == other;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
4760 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
4761
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
4762 #endregion
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
4763
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
4764 #region ISqlTableSource Members
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
4765
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
4766 public static int SourceIDCounter;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
4767
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
4768 public int SourceID { get; private set; }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
4769 public SqlTableType SqlTableType { get { return SqlTableType.Table; } }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
4770
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
4771 private SqlField _all;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
4772 public SqlField All
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
4773 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
4774 get
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
4775 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
4776 if (_all == null)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
4777 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
4778 _all = new SqlField(null, "*", "*", true, -1, null, null);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
4779 ((IChild<ISqlTableSource>)_all).Parent = this;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
4780 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
4781
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
4782 return _all;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
4783 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
4784
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
4785 internal set
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
4786 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
4787 _all = value;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
4788
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
4789 if (_all != null)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
4790 ((IChild<ISqlTableSource>)_all).Parent = this;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
4791 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
4792 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
4793
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
4794 List<ISqlExpression> _keys;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
4795
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
4796 public IList<ISqlExpression> GetKeys(bool allIfEmpty)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
4797 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
4798 if (_keys == null && From.Tables.Count == 1 && From.Tables[0].Joins.Count == 0)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
4799 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
4800 _keys = new List<ISqlExpression>();
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
4801
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
4802 var q =
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
4803 from key in ((ISqlTableSource)From.Tables[0]).GetKeys(allIfEmpty)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
4804 from col in Select.Columns
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
4805 where col.Expression == key
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
4806 select col as ISqlExpression;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
4807
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
4808 _keys = q.ToList();
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
4809 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
4810
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
4811 return _keys;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
4812 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
4813
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
4814 #endregion
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
4815
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
4816 #region IQueryElement Members
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
4817
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
4818 public QueryElementType ElementType { get { return QueryElementType.SqlQuery; } }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
4819
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
4820 StringBuilder IQueryElement.ToString(StringBuilder sb, Dictionary<IQueryElement,IQueryElement> dic)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
4821 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
4822 if (dic.ContainsKey(this))
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
4823 return sb.Append("...");
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
4824
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
4825 dic.Add(this, this);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
4826
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
4827 sb
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
4828 .Append("(")
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
4829 .Append(SourceID)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
4830 .Append(") ");
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
4831
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
4832 ((IQueryElement)Select). ToString(sb, dic);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
4833 ((IQueryElement)From). ToString(sb, dic);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
4834 ((IQueryElement)Where). ToString(sb, dic);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
4835 ((IQueryElement)GroupBy).ToString(sb, dic);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
4836 ((IQueryElement)Having). ToString(sb, dic);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
4837 ((IQueryElement)OrderBy).ToString(sb, dic);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
4838
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
4839 if (HasUnion)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
4840 foreach (IQueryElement u in Unions)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
4841 u.ToString(sb, dic);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
4842
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
4843 dic.Remove(this);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
4844
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
4845 return sb;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
4846 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
4847
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
4848 #endregion
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
4849 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
4850 }