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

!bug 100 + 2h fixed gregression
author cin
date Sun, 24 Aug 2014 17:57:42 +0400
parents f990fcb411a9
children
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
0
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1 using System;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
2 using System.Collections.Generic;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
3 using System.Linq;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
4 using System.Text;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
5 using System.Threading;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
6
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
7 namespace BLToolkit.Data.Sql
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
8 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
9 using DataAccess;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
10 using Mapping;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
11 using Reflection.Extension;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
12 using SqlProvider;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
13
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
14 public class SqlTable : ISqlTableSource
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
15 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
16 #region Init
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
17
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
18 public SqlTable()
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
19 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
20 _sourceID = Interlocked.Increment(ref SqlQuery.SourceIDCounter);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
21 _fields = new ChildContainer<ISqlTableSource,SqlField>(this);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
22 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
23
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
24 internal SqlTable(
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
25 int id, string name, string alias, string database, string owner, string physicalName, Type objectType,
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
26 SequenceNameAttribute[] sequenceAttributes,
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
27 SqlField[] fields,
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
28 SqlTableType sqlTableType, ISqlExpression[] tableArguments)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
29 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
30 _sourceID = id;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
31 Name = name;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
32 Alias = alias;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
33 Database = database;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
34 Owner = owner;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
35 PhysicalName = physicalName;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
36 ObjectType = objectType;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
37 _sequenceAttributes = sequenceAttributes;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
38
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
39 _fields = new ChildContainer<ISqlTableSource,SqlField>(this);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
40 _fields.AddRange(fields);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
41
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
42 foreach (var field in fields)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
43 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
44 if (field.Name == "*")
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
45 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
46 _all = field;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
47 _fields.Remove("*");
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
48 ((IChild<ISqlTableSource>)_all).Parent = this;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
49 break;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
50 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
51 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
52
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
53 SqlTableType = sqlTableType;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
54 TableArguments = tableArguments;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
55 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
56
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
57 #endregion
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
58
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
59 #region Init from type
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
60
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
61 public SqlTable([JetBrains.Annotations.NotNull] MappingSchema mappingSchema, Type objectType) : this()
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
62 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
63 if (mappingSchema == null) throw new ArgumentNullException("mappingSchema");
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
64
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
65 bool isSet;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
66 Database = mappingSchema.MetadataProvider.GetDatabaseName(objectType, mappingSchema.Extensions, out isSet);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
67 Owner = mappingSchema.MetadataProvider.GetOwnerName (objectType, mappingSchema.Extensions, out isSet);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
68 Name = mappingSchema.MetadataProvider.GetTableName (objectType, mappingSchema.Extensions, out isSet);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
69 ObjectType = objectType;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
70 PhysicalName = Name;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
71
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
72 var typeExt = TypeExtension.GetTypeExtension(objectType, mappingSchema.Extensions);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
73
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
74 foreach (MemberMapper mm in mappingSchema.GetObjectMapper(objectType))
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
75 if (mm.MapMemberInfo.SqlIgnore == false)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
76 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
77 var ua =
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
78 mappingSchema.MetadataProvider.GetNonUpdatableAttribute(objectType, typeExt, mm.MapMemberInfo.MemberAccessor, out isSet);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
79
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
80 var order = mappingSchema.MetadataProvider.GetPrimaryKeyOrder(objectType, typeExt, mm.MapMemberInfo.MemberAccessor, out isSet);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
81
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
82 Fields.Add(new SqlField(
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
83 mm.Type,
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
84 mm.MemberName,
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
85 mm.Name,
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
86 mm.MapMemberInfo.Nullable,
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
87 isSet ? order : int.MinValue,
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
88 ua,
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
89 mm));
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
90 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
91
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
92 var identityField = GetIdentityField();
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
93
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
94 if (identityField != null)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
95 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
96 var om = mappingSchema.GetObjectMapper(ObjectType);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
97 var mm = om[identityField.Name, true];
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
98
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
99 _sequenceAttributes = mm.MapMemberInfo.MemberAccessor.GetAttributes<SequenceNameAttribute>();
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
100 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
101 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
102
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
103 public SqlTable(Type objectType)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
104 : this(Map.DefaultSchema, objectType)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
105 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
106 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
107
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
108 #endregion
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
109
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
110 #region Init from Table
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
111
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
112 public SqlTable(SqlTable table) : this()
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
113 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
114 Alias = table.Alias;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
115 Database = table.Database;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
116 Owner = table.Owner;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
117 Name = table.Name;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
118 PhysicalName = table.PhysicalName;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
119 ObjectType = table.ObjectType;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
120 _sequenceAttributes = table._sequenceAttributes;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
121
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
122 foreach (var field in table.Fields.Values)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
123 Fields.Add(new SqlField(field));
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
124
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
125 foreach (var join in table.Joins)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
126 Joins.Add(join.Clone());
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
127
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
128 SqlTableType = table.SqlTableType;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
129 TableArguments = table.TableArguments;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
130 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
131
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
132 public SqlTable(SqlTable table, IEnumerable<SqlField> fields, IEnumerable<Join> joins, ISqlExpression[] tableArguments) : this()
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
133 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
134 Alias = table.Alias;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
135 Database = table.Database;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
136 Owner = table.Owner;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
137 Name = table.Name;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
138 PhysicalName = table.PhysicalName;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
139 ObjectType = table.ObjectType;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
140 _sequenceAttributes = table._sequenceAttributes;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
141
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
142 Fields.AddRange(fields);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
143 Joins. AddRange(joins);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
144
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
145 SqlTableType = table.SqlTableType;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
146 TableArguments = tableArguments;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
147 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
148
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
149 #endregion
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
150
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
151 #region Init from XML
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
152
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
153 public SqlTable(ExtensionList extensions, string name)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
154 : this(Map.DefaultSchema, extensions, name)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
155 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
156 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
157
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
158 public SqlTable([JetBrains.Annotations.NotNull] MappingSchema mappingSchema, ExtensionList extensions, string name) : this()
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
159 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
160 if (mappingSchema == null) throw new ArgumentNullException("mappingSchema");
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
161 if (extensions == null) throw new ArgumentNullException("extensions");
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
162 if (name == null) throw new ArgumentNullException("name");
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
163
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
164 var te = extensions[name];
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
165
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
166 if (te == TypeExtension.Null)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
167 throw new ArgumentException(string.Format("Table '{0}' not found.", name));
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
168
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
169 Name = te.Name;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
170 Alias = (string)te.Attributes["Alias"]. Value;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
171 Database = (string)te.Attributes["Database"]. Value;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
172 Owner = (string)te.Attributes["Owner"]. Value;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
173 PhysicalName = (string)te.Attributes["PhysicalName"].Value ?? te.Name;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
174
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
175 foreach (var me in te.Members.Values)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
176 Fields.Add(new SqlField(
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
177 (Type)me["Type"].Value,
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
178 me.Name,
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
179 (string)me["MapField"].Value ?? (string)me["PhysicalName"].Value,
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
180 (bool?)me["Nullable"].Value ?? false,
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
181 -1,
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
182 (bool?)me["Identity"].Value == true ? new IdentityAttribute() : null,
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
183 null));
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
184
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
185 foreach (var ae in te.Attributes["Join"])
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
186 Joins.Add(new Join(ae));
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
187
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
188 var baseExtension = (string)te.Attributes["BaseExtension"].Value;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
189
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
190 if (!string.IsNullOrEmpty(baseExtension))
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
191 InitFromBase(new SqlTable(mappingSchema, extensions, baseExtension));
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
192
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
193 var baseTypeName = (string)te.Attributes["BaseType"].Value;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
194
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
195 if (!string.IsNullOrEmpty(baseTypeName))
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
196 InitFromBase(new SqlTable(mappingSchema, Type.GetType(baseTypeName, true, true)));
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
197 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
198
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
199 void InitFromBase(SqlTable baseTable)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
200 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
201 if (Alias == null) Alias = baseTable.Alias;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
202 if (Database == null) Database = baseTable.Database;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
203 if (Owner == null) Owner = baseTable.Owner;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
204 if (PhysicalName == null) PhysicalName = baseTable.PhysicalName;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
205
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
206 foreach (var field in baseTable.Fields.Values)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
207 if (!Fields.ContainsKey(field.Name))
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
208 Fields.Add(new SqlField(field));
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
209
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
210 foreach (var join in baseTable.Joins)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
211 if (Joins.FirstOrDefault(j => j.TableName == join.TableName) == null)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
212 Joins.Add(join);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
213 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
214
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
215 #endregion
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
216
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
217 #region Overrides
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
218
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
219 #if OVERRIDETOSTRING
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
220
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
221 public override string ToString()
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
222 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
223 return ((IQueryElement)this).ToString(new StringBuilder(), new Dictionary<IQueryElement,IQueryElement>()).ToString();
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
224 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
225
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
226 #endif
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
227
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
228 #endregion
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
229
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
230 #region Public Members
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
231
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
232 public SqlField this[string fieldName]
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
233 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
234 get
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
235 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
236 SqlField field;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
237 Fields.TryGetValue(fieldName, out field);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
238 return field;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
239 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
240 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
241
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
242 public string Name { get; set; }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
243 public string Alias { get; set; }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
244 public string Database { get; set; }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
245 public string Owner { get; set; }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
246 public Type ObjectType { get; set; }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
247 public string PhysicalName { get; set; }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
248
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
249 private SqlTableType _sqlTableType = SqlTableType.Table;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
250 public SqlTableType SqlTableType { get { return _sqlTableType; } set { _sqlTableType = value; } }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
251
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
252 public ISqlExpression[] TableArguments { get; set; }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
253
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
254 readonly ChildContainer<ISqlTableSource,SqlField> _fields;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
255 public ChildContainer<ISqlTableSource,SqlField> Fields { get { return _fields; } }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
256
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
257 readonly List<Join> _joins = new List<Join>();
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
258 public List<Join> Joins { get { return _joins; } }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
259
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
260 private SequenceNameAttribute[] _sequenceAttributes;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
261 public SequenceNameAttribute[] SequenceAttributes
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
262 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
263 get { return _sequenceAttributes; }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
264 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
265
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
266 private SqlField _all;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
267 public SqlField All
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
268 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
269 get
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
270 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
271 if (_all == null)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
272 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
273 _all = new SqlField(null, "*", "*", true, -1, null, null);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
274 ((IChild<ISqlTableSource>)_all).Parent = this;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
275 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
276
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
277 return _all;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
278 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
279 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
280
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
281 public SqlField GetIdentityField()
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
282 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
283 foreach (var field in Fields)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
284 if (field.Value.IsIdentity)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
285 return field.Value;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
286
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
287 var keys = GetKeys(true);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
288
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
289 if (keys != null && keys.Count == 1)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
290 return (SqlField)keys[0];
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
291
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
292 return null;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
293 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
294
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
295 #endregion
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
296
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
297 #region ISqlTableSource Members
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
298
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
299 readonly int _sourceID;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
300 public int SourceID { get { return _sourceID; } }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
301
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
302 List<ISqlExpression> _keyFields;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
303
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
304 public IList<ISqlExpression> GetKeys(bool allIfEmpty)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
305 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
306 if (_keyFields == null)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
307 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
308 _keyFields = (
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
309 from f in Fields.Values
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
310 where f.IsPrimaryKey
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
311 orderby f.PrimaryKeyOrder
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
312 select f as ISqlExpression
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
313 ).ToList();
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
314 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
315
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
316 if (_keyFields.Count == 0 && allIfEmpty)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
317 return Fields.Values.Select(f => f as ISqlExpression).ToList();
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
318
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
319 return _keyFields;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
320 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
321
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
322 #endregion
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
323
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
324 #region ICloneableElement Members
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
325
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
326 public ICloneableElement Clone(Dictionary<ICloneableElement, ICloneableElement> objectTree, Predicate<ICloneableElement> doClone)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
327 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
328 if (!doClone(this))
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
329 return this;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
330
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
331 ICloneableElement clone;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
332
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
333 if (!objectTree.TryGetValue(this, out clone))
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
334 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
335 var table = new SqlTable
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
336 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
337 Name = Name,
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
338 Alias = Alias,
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
339 Database = Database,
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
340 Owner = Owner,
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
341 PhysicalName = PhysicalName,
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
342 ObjectType = ObjectType,
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
343 SqlTableType = SqlTableType,
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
344 _sequenceAttributes = _sequenceAttributes,
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
345 };
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
346
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
347 table._fields.Clear();
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
348
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
349 foreach (var field in _fields)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
350 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
351 var fc = new SqlField(field.Value);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
352
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
353 objectTree. Add(field.Value, fc);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
354 table._fields.Add(field.Key, fc);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
355 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
356
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
357 table._joins.AddRange(_joins.ConvertAll(j => j.Clone()));
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
358
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
359 if (TableArguments != null)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
360 TableArguments = TableArguments.Select(e => (ISqlExpression)e.Clone(objectTree, doClone)).ToArray();
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
361
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
362 objectTree.Add(this, table);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
363 objectTree.Add(All, table.All);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
364
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
365 clone = table;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
366 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
367
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
368 return clone;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
369 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
370
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
371 #endregion
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
372
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
373 #region IQueryElement Members
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
374
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
375 public QueryElementType ElementType { get { return QueryElementType.SqlTable; } }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
376
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
377 StringBuilder IQueryElement.ToString(StringBuilder sb, Dictionary<IQueryElement,IQueryElement> dic)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
378 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
379 return sb.Append(Name);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
380 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
381
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
382 #endregion
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
383
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
384 #region ISqlExpression Members
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
385
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
386 bool ISqlExpression.CanBeNull()
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
387 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
388 return true;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
389 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
390
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
391 public bool Equals(ISqlExpression other, Func<ISqlExpression, ISqlExpression, bool> comparer)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
392 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
393 return this == other;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
394 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
395
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
396 int ISqlExpression.Precedence
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
397 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
398 get { return Precedence.Unknown; }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
399 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
400
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
401 Type ISqlExpression.SystemType
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
402 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
403 get { return ObjectType; }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
404 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
405
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
406 #endregion
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
407
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
408 #region IEquatable<ISqlExpression> Members
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
409
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
410 bool IEquatable<ISqlExpression>.Equals(ISqlExpression other)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
411 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
412 return this == other;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
413 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
414
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
415 #endregion
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
416
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
417 #region ISqlExpressionWalkable Members
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
418
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
419 ISqlExpression ISqlExpressionWalkable.Walk(bool skipColumns, Func<ISqlExpression,ISqlExpression> func)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
420 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
421 if (TableArguments != null)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
422 for (var i = 0; i < TableArguments.Length; i++)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
423 TableArguments[i] = TableArguments[i].Walk(skipColumns, func);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
424
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
425 return func(this);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
426 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
427
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
428 #endregion
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
429 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
430 }