@@ -9,7 +9,7 @@ namespace Xtensive.Orm.Rse.Compilation
99 /// Abstract base class for RSE <see cref="Provider"/> compilers that implements visitor pattern.
1010 /// Compiles <see cref="CompilableProvider"/>s into <see cref="ExecutableProvider"/>.
1111 /// </summary>
12- public abstract class Compiler < TResult > : ICompiler
12+ public abstract class Compiler < TResult > : ProviderVisitor < TResult > , ICompiler
1313 where TResult : ExecutableProvider
1414 {
1515 private readonly Stack < CompilableProvider > traversalStack = new Stack < CompilableProvider > ( ) ;
@@ -48,278 +48,20 @@ ExecutableProvider ICompiler.Compile(CompilableProvider provider)
4848 /// <param name="cp">The provider to compile.</param>
4949 public TResult Compile ( CompilableProvider cp )
5050 {
51- if ( cp == null )
51+ if ( cp == null ) {
5252 return null ;
53- if ( rootProvider == null ) {
53+ }
54+ if ( rootProvider == null ) {
5455 rootProvider = cp ;
5556 Initialize ( ) ;
5657 }
57- TResult result ;
5858 traversalStack . Push ( cp ) ;
59- switch ( cp . Type ) {
60- case ProviderType . Index :
61- result = VisitIndex ( ( IndexProvider ) cp ) ;
62- break ;
63- case ProviderType . Store :
64- result = VisitStore ( ( StoreProvider ) cp ) ;
65- break ;
66- case ProviderType . Aggregate :
67- result = VisitAggregate ( ( AggregateProvider ) cp ) ;
68- break ;
69- case ProviderType . Alias :
70- result = VisitAlias ( ( AliasProvider ) cp ) ;
71- break ;
72- case ProviderType . Calculate :
73- result = VisitCalculate ( ( CalculateProvider ) cp ) ;
74- break ;
75- case ProviderType . Distinct :
76- result = VisitDistinct ( ( DistinctProvider ) cp ) ;
77- break ;
78- case ProviderType . Filter :
79- result = VisitFilter ( ( FilterProvider ) cp ) ;
80- break ;
81- case ProviderType . Join :
82- result = VisitJoin ( ( JoinProvider ) cp ) ;
83- break ;
84- case ProviderType . PredicateJoin :
85- result = VisitPredicateJoin ( ( PredicateJoinProvider ) cp ) ;
86- break ;
87- case ProviderType . Sort :
88- result = VisitSort ( ( SortProvider ) cp ) ;
89- break ;
90- case ProviderType . Raw :
91- result = VisitRaw ( ( RawProvider ) cp ) ;
92- break ;
93- case ProviderType . Seek :
94- result = VisitSeek ( ( SeekProvider ) cp ) ;
95- break ;
96- case ProviderType . Select :
97- result = VisitSelect ( ( SelectProvider ) cp ) ;
98- break ;
99- case ProviderType . Tag :
100- result = VisitTag ( ( TagProvider ) cp ) ;
101- break ;
102- case ProviderType . Skip :
103- result = VisitSkip ( ( SkipProvider ) cp ) ;
104- break ;
105- case ProviderType . Take :
106- result = VisitTake ( ( TakeProvider ) cp ) ;
107- break ;
108- case ProviderType . Paging :
109- result = VisitPaging ( ( PagingProvider ) cp ) ;
110- break ;
111- case ProviderType . Apply :
112- result = VisitApply ( ( ApplyProvider ) cp ) ;
113- break ;
114- case ProviderType . RowNumber :
115- result = VisitRowNumber ( ( RowNumberProvider ) cp ) ;
116- break ;
117- case ProviderType . Existence :
118- result = VisitExistence ( ( ExistenceProvider ) cp ) ;
119- break ;
120- case ProviderType . Intersect :
121- result = VisitIntersect ( ( IntersectProvider ) cp ) ;
122- break ;
123- case ProviderType . Except :
124- result = VisitExcept ( ( ExceptProvider ) cp ) ;
125- break ;
126- case ProviderType . Concat :
127- result = VisitConcat ( ( ConcatProvider ) cp ) ;
128- break ;
129- case ProviderType . Union :
130- result = VisitUnion ( ( UnionProvider ) cp ) ;
131- break ;
132- case ProviderType . Lock :
133- result = VisitLock ( ( LockProvider ) cp ) ;
134- break ;
135- case ProviderType . Include :
136- result = VisitInclude ( ( IncludeProvider ) cp ) ;
137- break ;
138- case ProviderType . FreeText :
139- result = VisitFreeText ( ( FreeTextProvider ) cp ) ;
140- break ;
141- case ProviderType . ContainsTable :
142- result = VisitContainsTable ( ( ContainsTableProvider ) cp ) ;
143- break ;
144- case ProviderType . Void :
145- throw new NotSupportedException ( Strings . ExProcessingOfVoidProviderIsNotSupported ) ;
146- default :
147- throw new ArgumentOutOfRangeException ( ) ;
148- }
59+ TResult result = Visit ( cp ) ;
14960 traversalStack . Pop ( ) ;
15061 owner = null ;
15162 return result ;
15263 }
15364
154- /// <summary>
155- /// Compiles <see cref="TakeProvider"/>.
156- /// </summary>
157- /// <param name="provider">Take provider.</param>
158- protected abstract TResult VisitTake ( TakeProvider provider ) ;
159-
160- /// <summary>
161- /// Compiles <see cref="SkipProvider"/>.
162- /// </summary>
163- /// <param name="provider">Skip provider.</param>
164- protected abstract TResult VisitSkip ( SkipProvider provider ) ;
165-
166- /// <summary>
167- /// Compiles <see cref="PagingProvider"/>.
168- /// </summary>
169- /// <param name="provider">Paging provider.</param>
170- protected abstract TResult VisitPaging ( PagingProvider provider ) ;
171-
172- /// <summary>
173- /// Compiles <see cref="SelectProvider"/>.
174- /// </summary>
175- /// <param name="provider">Select provider.</param>
176- protected abstract TResult VisitSelect ( SelectProvider provider ) ;
177-
178- /// <summary>
179- /// Compiles <see cref="TagProvider"/>.
180- /// </summary>
181- /// <param name="provider">Tag provider.</param>
182- protected abstract TResult VisitTag ( TagProvider provider ) ;
183-
184- /// <summary>
185- /// Compiles <see cref="SeekProvider"/>.
186- /// </summary>
187- /// <param name="provider">Seek provider.</param>
188- protected abstract TResult VisitSeek ( SeekProvider provider ) ;
189-
190- /// <summary>
191- /// Compiles <see cref="RawProvider"/>.
192- /// </summary>
193- /// <param name="provider">Raw provider.</param>
194- protected abstract TResult VisitRaw ( RawProvider provider ) ;
195-
196- /// <summary>
197- /// Compiles <see cref="SortProvider"/>.
198- /// </summary>
199- /// <param name="provider">Sort provider.</param>
200- protected abstract TResult VisitSort ( SortProvider provider ) ;
201-
202- /// <summary>
203- /// Compiles <see cref="JoinProvider"/>.
204- /// </summary>
205- /// <param name="provider">Join provider.</param>
206- protected abstract TResult VisitJoin ( JoinProvider provider ) ;
207-
208- /// <summary>
209- /// Compiles <see cref="PredicateJoinProvider"/>.
210- /// </summary>
211- /// <param name="provider">Join provider.</param>
212- protected abstract TResult VisitPredicateJoin ( PredicateJoinProvider provider ) ;
213-
214- /// <summary>
215- /// Compiles <see cref="FilterProvider"/>.
216- /// </summary>
217- /// <param name="provider">Filter provider.</param>
218- protected abstract TResult VisitFilter ( FilterProvider provider ) ;
219-
220- /// <summary>
221- /// Compiles <see cref="DistinctProvider"/>.
222- /// </summary>
223- /// <param name="provider">Distinct provider.</param>
224- protected abstract TResult VisitDistinct ( DistinctProvider provider ) ;
225-
226- /// <summary>
227- /// Compiles <see cref="CalculateProvider"/>.
228- /// </summary>
229- /// <param name="provider">Calculate provider.</param>
230- protected abstract TResult VisitCalculate ( CalculateProvider provider ) ;
231-
232- /// <summary>
233- /// Compiles <see cref="AliasProvider"/>.
234- /// </summary>
235- /// <param name="provider">Alias provider.</param>
236- protected abstract TResult VisitAlias ( AliasProvider provider ) ;
237-
238- /// <summary>
239- /// Compiles <see cref="AggregateProvider"/>.
240- /// </summary>
241- /// <param name="provider">Aggregate provider.</param>
242- /// <returns></returns>
243- protected abstract TResult VisitAggregate ( AggregateProvider provider ) ;
244-
245- /// <summary>
246- /// Compiles <see cref="StoreProvider"/>.
247- /// </summary>
248- /// <param name="provider">Store provider.</param>
249- protected abstract TResult VisitStore ( StoreProvider provider ) ;
250-
251- /// <summary>
252- /// Compiles <see cref="IndexProvider"/>.
253- /// </summary>
254- /// <param name="provider">Index provider.</param>
255- protected abstract TResult VisitIndex ( IndexProvider provider ) ;
256-
257- /// <summary>
258- /// Compiles <see cref="ApplyProvider"/>.
259- /// </summary>
260- /// <param name="provider">The provider.</param>
261- protected abstract TResult VisitApply ( ApplyProvider provider ) ;
262-
263- /// <summary>
264- /// Compiles <see cref="RowNumberProvider"/>.
265- /// </summary>
266- /// <param name="provider">Row number provider.</param>
267- protected abstract TResult VisitRowNumber ( RowNumberProvider provider ) ;
268-
269- /// <summary>
270- /// Compiles <see cref="ExistenceProvider"/>.
271- /// </summary>
272- /// <param name="provider">Existence provider.</param>
273- protected abstract TResult VisitExistence ( ExistenceProvider provider ) ;
274-
275- /// <summary>
276- /// Compiles <see cref="IntersectProvider"/>.
277- /// </summary>
278- /// <param name="provider">Intersect provider.</param>
279- protected abstract TResult VisitIntersect ( IntersectProvider provider ) ;
280-
281- /// <summary>
282- /// Compiles <see cref="ExceptProvider"/>.
283- /// </summary>
284- /// <param name="provider">Except provider.</param>
285- protected abstract TResult VisitExcept ( ExceptProvider provider ) ;
286-
287- /// <summary>
288- /// Compiles <see cref="ConcatProvider"/>.
289- /// </summary>
290- /// <param name="provider">Concat provider.</param>
291- protected abstract TResult VisitConcat ( ConcatProvider provider ) ;
292-
293- /// <summary>
294- /// Compiles <see cref="UnionProvider"/>.
295- /// </summary>
296- /// <param name="provider">Union provider.</param>
297- protected abstract TResult VisitUnion ( UnionProvider provider ) ;
298-
299- /// <summary>
300- /// Compiles <see cref="LockProvider"/>.
301- /// </summary>
302- /// <param name="provider">Lock provider.</param>
303- protected abstract TResult VisitLock ( LockProvider provider ) ;
304-
305- /// <summary>
306- /// Compiles <see cref="IncludeProvider"/>.
307- /// </summary>
308- /// <param name="provider">Include provider.</param>
309- protected abstract TResult VisitInclude ( IncludeProvider provider ) ;
310-
311- /// <summary>
312- /// Compiles <see cref="FreeTextProvider"/>.
313- /// </summary>
314- /// <param name="provider">FreeText provider.</param>
315- protected abstract TResult VisitFreeText ( FreeTextProvider provider ) ;
316-
317- /// <summary>
318- /// Compiles <see cref="FreeTextProvider"/>.
319- /// </summary>
320- /// <param name="provider">ContainsTable provider.</param>
321- protected abstract TResult VisitContainsTable ( ContainsTableProvider provider ) ;
322-
32365 /// <summary>
32466 /// Initializes this instance just before first VisitXxx() is called.
32567 /// </summary>
0 commit comments