Skip to content

Commit cca10f7

Browse files
authored
Merge pull request #275 from servicetitan/upstream/RefactorProviderVisitor
Refactor ProviderVisitor to generic form
2 parents 5fb1d6a + b85bea7 commit cca10f7

3 files changed

Lines changed: 37 additions & 295 deletions

File tree

Orm/Xtensive.Orm/Orm/Rse/Compilation/Compiler.cs

Lines changed: 5 additions & 263 deletions
Original file line numberDiff line numberDiff line change
@@ -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>

Orm/Xtensive.Orm/Orm/Rse/Providers/CompilableProviderVisitor.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,7 @@ namespace Xtensive.Orm.Rse.Providers
1818
/// <see cref="CompilableProvider"/> visitor class. Result is <see cref="CompilableProvider"/>.
1919
/// </summary>
2020
[Serializable]
21-
public class CompilableProviderVisitor : ProviderVisitor
21+
public class CompilableProviderVisitor : ProviderVisitor<CompilableProvider>
2222
{
2323
protected Func<CompilableProvider, Expression, Expression> translate;
2424

0 commit comments

Comments
 (0)