1 //---------------------------------------------------------------------
2 // <copyright file="ColumnMapVisitorWithResults.cs" company="Microsoft">
3 // Copyright (c) Microsoft Corporation. All rights reserved.
8 //---------------------------------------------------------------------
10 namespace System.Data.Query.InternalTrees
12 using System.Collections;
13 using System.Collections.Generic;
16 using System.Data.Common;
17 using System.Data.Common.CommandTrees;
18 using System.Data.Metadata.Edm;
19 using System.Data.Query.PlanCompiler;
20 using System.Diagnostics;
22 using System.Threading;
25 /// Basic Visitor Design Pattern support for ColumnMap hierarchy;
27 /// This visitor class will walk the entire hierarchy, but does not
28 /// return results; it's useful for operations such as printing and
31 /// <typeparam name="TArgType"></typeparam>
32 internal abstract class ColumnMapVisitor<TArgType>
34 #region visitor helpers
37 /// Common List(ColumnMap) code
39 /// <param name="columnMaps"></param>
40 /// <param name="arg"></param>
41 protected void VisitList<TListType>(TListType[] columnMaps, TArgType arg)
42 where TListType : ColumnMap
44 foreach (TListType columnMap in columnMaps)
46 columnMap.Accept(this, arg);
52 #region EntityIdentity handling
54 protected void VisitEntityIdentity(EntityIdentity entityIdentity, TArgType arg)
56 DiscriminatedEntityIdentity dei = entityIdentity as DiscriminatedEntityIdentity;
59 VisitEntityIdentity(dei, arg);
63 VisitEntityIdentity((SimpleEntityIdentity)entityIdentity, arg);
67 protected virtual void VisitEntityIdentity(DiscriminatedEntityIdentity entityIdentity, TArgType arg)
69 entityIdentity.EntitySetColumnMap.Accept(this, arg);
70 foreach (SimpleColumnMap columnMap in entityIdentity.Keys)
72 columnMap.Accept(this, arg);
76 protected virtual void VisitEntityIdentity(SimpleEntityIdentity entityIdentity, TArgType arg)
78 foreach (SimpleColumnMap columnMap in entityIdentity.Keys)
80 columnMap.Accept(this, arg);
86 #region Visitor methods
88 internal virtual void Visit(ComplexTypeColumnMap columnMap, TArgType arg)
90 ColumnMap nullSentinel = columnMap.NullSentinel;
91 if (null != nullSentinel)
93 nullSentinel.Accept(this, arg);
95 foreach (ColumnMap p in columnMap.Properties)
101 internal virtual void Visit(DiscriminatedCollectionColumnMap columnMap, TArgType arg)
103 columnMap.Discriminator.Accept(this, arg);
104 foreach (SimpleColumnMap fk in columnMap.ForeignKeys)
106 fk.Accept(this, arg);
108 foreach (SimpleColumnMap k in columnMap.Keys)
112 columnMap.Element.Accept(this, arg);
115 internal virtual void Visit(EntityColumnMap columnMap, TArgType arg)
117 VisitEntityIdentity(columnMap.EntityIdentity, arg);
118 foreach (ColumnMap p in columnMap.Properties)
124 internal virtual void Visit(SimplePolymorphicColumnMap columnMap, TArgType arg)
126 columnMap.TypeDiscriminator.Accept(this, arg);
127 foreach (ColumnMap cm in columnMap.TypeChoices.Values)
129 cm.Accept(this, arg);
131 foreach (ColumnMap p in columnMap.Properties)
137 internal virtual void Visit(MultipleDiscriminatorPolymorphicColumnMap columnMap, TArgType arg)
139 foreach (var typeDiscriminator in columnMap.TypeDiscriminators)
141 typeDiscriminator.Accept(this, arg);
143 foreach (var typeColumnMap in columnMap.TypeChoices.Values)
145 typeColumnMap.Accept(this, arg);
147 foreach (var property in columnMap.Properties)
149 property.Accept(this, arg);
153 internal virtual void Visit(RecordColumnMap columnMap, TArgType arg)
155 ColumnMap nullSentinel = columnMap.NullSentinel;
156 if (null != nullSentinel)
158 nullSentinel.Accept(this, arg);
160 foreach (ColumnMap p in columnMap.Properties)
166 internal virtual void Visit(RefColumnMap columnMap, TArgType arg)
168 VisitEntityIdentity(columnMap.EntityIdentity, arg);
171 internal virtual void Visit(ScalarColumnMap columnMap, TArgType arg)
175 internal virtual void Visit(SimpleCollectionColumnMap columnMap, TArgType arg)
177 foreach (SimpleColumnMap fk in columnMap.ForeignKeys)
179 fk.Accept(this, arg);
181 foreach (SimpleColumnMap k in columnMap.Keys)
185 columnMap.Element.Accept(this, arg);
188 internal virtual void Visit(VarRefColumnMap columnMap, TArgType arg)
196 /// Basic Visitor Design Pattern support for ColumnMap hierarchy;
198 /// This visitor class allows you to return results; it's useful for operations
199 /// that copy or manipulate the hierarchy.
201 /// <typeparam name="TArgType"></typeparam>
202 /// <typeparam name="TResultType"></typeparam>
203 internal abstract class ColumnMapVisitorWithResults<TResultType, TArgType>
206 #region EntityIdentity handling
208 protected EntityIdentity VisitEntityIdentity(EntityIdentity entityIdentity, TArgType arg)
210 DiscriminatedEntityIdentity dei = entityIdentity as DiscriminatedEntityIdentity;
213 return VisitEntityIdentity(dei, arg);
217 return VisitEntityIdentity((SimpleEntityIdentity)entityIdentity, arg);
221 protected virtual EntityIdentity VisitEntityIdentity(DiscriminatedEntityIdentity entityIdentity, TArgType arg)
223 return entityIdentity;
226 protected virtual EntityIdentity VisitEntityIdentity(SimpleEntityIdentity entityIdentity, TArgType arg)
228 return entityIdentity;
233 #region Visitor methods
235 internal abstract TResultType Visit(ComplexTypeColumnMap columnMap, TArgType arg);
237 internal abstract TResultType Visit(DiscriminatedCollectionColumnMap columnMap, TArgType arg);
239 internal abstract TResultType Visit(EntityColumnMap columnMap, TArgType arg);
241 internal abstract TResultType Visit(SimplePolymorphicColumnMap columnMap, TArgType arg);
243 internal abstract TResultType Visit(RecordColumnMap columnMap, TArgType arg);
245 internal abstract TResultType Visit(RefColumnMap columnMap, TArgType arg);
247 internal abstract TResultType Visit(ScalarColumnMap columnMap, TArgType arg);
249 internal abstract TResultType Visit(SimpleCollectionColumnMap columnMap, TArgType arg);
251 internal abstract TResultType Visit(VarRefColumnMap columnMap, TArgType arg);
253 internal abstract TResultType Visit(MultipleDiscriminatorPolymorphicColumnMap columnMap, TArgType arg);