Skip to content

Commit e608b92

Browse files
authored
Proposes changes on top of #274 (#134)
* Make CompilableProviderVisitor API declaration for provider vistitors - ProviderVisitor no longer parent type for any other type and [Obsolete] - ProviderVisitor changes reverted - CompilableProviderVisitor gets protected Visit method from ProviderVisitor and all the summaries coppied; also changes signature of expressionTranslator to not allow having Provider as incoming parameter and cause issies. * Apply covariant returns to CompilableProviderVisitor descendants * CompilableProviderVisitor: convert IFs to conditionals * Revert obsolescence of ProviderVisitor
1 parent ad8d967 commit e608b92

7 files changed

Lines changed: 108 additions & 123 deletions

File tree

Orm/Xtensive.Orm/Orm/Linq/Expressions/Visitors/ExtendedExpressionReplacer.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -72,7 +72,7 @@ protected override Expression VisitSubQueryExpression(SubQueryExpression express
7272
return expression;
7373
}
7474

75-
private Expression TranslateExpression(Provider provider, Expression original)
75+
private Expression TranslateExpression(CompilableProvider provider, Expression original)
7676
{
7777
var result = Visit(original);
7878
return result ?? original;

Orm/Xtensive.Orm/Orm/Linq/Rewriters/ApplyParameterToTupleParameterRewriter.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -74,7 +74,7 @@ protected override Expression VisitSubQueryExpression(SubQueryExpression express
7474
return expression;
7575
}
7676

77-
private Expression RewriteExpression(Provider provider, Expression expression)
77+
private Expression RewriteExpression(CompilableProvider provider, Expression expression)
7878
{
7979
return Visit(expression);
8080
}

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

Lines changed: 75 additions & 90 deletions
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,7 @@ namespace Xtensive.Orm.Rse.Providers
2020
[Serializable]
2121
public class CompilableProviderVisitor : ProviderVisitor
2222
{
23-
protected Func<Provider, Expression, Expression> translate;
23+
protected Func<CompilableProvider, Expression, Expression> translate;
2424

2525
/// <summary>
2626
/// Visits the compilable provider.
@@ -33,32 +33,26 @@ protected override CompilableProvider VisitTake(TakeProvider provider)
3333
{
3434
OnRecursionEntrance(provider);
3535
var source = VisitCompilable(provider.Source);
36-
OnRecursionExit(provider);
37-
if (source == provider.Source)
38-
return provider;
39-
return new TakeProvider(source, provider.Count);
36+
_ = OnRecursionExit(provider);
37+
return source == provider.Source ? provider : new TakeProvider(source, provider.Count);
4038
}
4139

4240
/// <inheritdoc/>
4341
protected override CompilableProvider VisitSkip(SkipProvider provider)
4442
{
4543
OnRecursionEntrance(provider);
4644
var source = VisitCompilable(provider.Source);
47-
OnRecursionExit(provider);
48-
if (source == provider.Source)
49-
return provider;
50-
return new SkipProvider(source, provider.Count);
45+
_ = OnRecursionExit(provider);
46+
return source == provider.Source ? provider : new SkipProvider(source, provider.Count);
5147
}
5248

5349
/// <inheritdoc/>
5450
protected override CompilableProvider VisitPaging(PagingProvider provider)
5551
{
5652
OnRecursionEntrance(provider);
5753
var source = VisitCompilable(provider.Source);
58-
OnRecursionExit(provider);
59-
if (source == provider.Source)
60-
return provider;
61-
return new PagingProvider(source, provider);
54+
_ = OnRecursionExit(provider);
55+
return source == provider.Source ? provider : new PagingProvider(source, provider);
6256
}
6357

6458
/// <inheritdoc/>
@@ -67,17 +61,17 @@ protected override CompilableProvider VisitSelect(SelectProvider provider)
6761
OnRecursionEntrance(provider);
6862
var source = VisitCompilable(provider.Source);
6963
var columnIndexes = (int[])OnRecursionExit(provider);
70-
if (source == provider.Source)
71-
return provider;
72-
return new SelectProvider(source, columnIndexes ?? provider.ColumnIndexes);
64+
return source == provider.Source
65+
? provider
66+
: new SelectProvider(source, columnIndexes ?? provider.ColumnIndexes);
7367
}
7468

7569
/// <inheritdoc/>
7670
protected override CompilableProvider VisitTag(TagProvider provider)
7771
{
7872
OnRecursionEntrance(provider);
7973
var source = VisitCompilable(provider.Source);
80-
OnRecursionExit(provider);
74+
_ = OnRecursionExit(provider);
8175
return source == provider.Source ? provider : new TagProvider(source, provider.Tag);
8276
}
8377

@@ -86,10 +80,8 @@ protected override CompilableProvider VisitSeek(SeekProvider provider)
8680
{
8781
OnRecursionEntrance(provider);
8882
var source = VisitCompilable(provider.Source);
89-
OnRecursionExit(provider);
90-
if (source==provider.Source)
91-
return provider;
92-
return new SeekProvider(source, provider.Key);
83+
_ = OnRecursionExit(provider);
84+
return source == provider.Source ? provider : new SeekProvider(source, provider.Key);
9385
}
9486

9587
/// <inheritdoc/>
@@ -104,9 +96,9 @@ protected override CompilableProvider VisitSort(SortProvider provider)
10496
OnRecursionEntrance(provider);
10597
var source = VisitCompilable(provider.Source);
10698
var order = OnRecursionExit(provider);
107-
if (source == provider.Source)
108-
return provider;
109-
return new SortProvider(source, (order == null) ? provider.Order : (DirectionCollection<int>)order);
99+
return source == provider.Source
100+
? provider
101+
: new SortProvider(source, (order == null) ? provider.Order : (DirectionCollection<int>)order);
110102
}
111103

112104
/// <inheritdoc/>
@@ -116,30 +108,30 @@ protected override CompilableProvider VisitJoin(JoinProvider provider)
116108
var left = VisitCompilable(provider.Left);
117109
var right = VisitCompilable(provider.Right);
118110
var equalIndexes = OnRecursionExit(provider);
119-
if (left == provider.Left && right == provider.Right)
120-
return provider;
121-
return new JoinProvider(left, right, provider.JoinType,
122-
equalIndexes != null ? (Pair<int>[])equalIndexes : provider.EqualIndexes);
111+
return left == provider.Left && right == provider.Right
112+
? provider
113+
: new JoinProvider(left, right, provider.JoinType,
114+
equalIndexes != null ? (Pair<int>[])equalIndexes : provider.EqualIndexes);
123115
}
124116

125117
/// <inheritdoc/>
126118
protected override CompilableProvider VisitFilter(FilterProvider provider)
127119
{
128120
OnRecursionEntrance(provider);
129121
var source = VisitCompilable(provider.Source);
130-
OnRecursionExit(provider);
122+
_ = OnRecursionExit(provider);
131123
var predicate = translate(provider, provider.Predicate);
132-
if (source == provider.Source && predicate == provider.Predicate)
133-
return provider;
134-
return new FilterProvider(source, (Expression<Func<Tuple, bool>>) predicate);
124+
return source == provider.Source && predicate == provider.Predicate
125+
? provider
126+
: new FilterProvider(source, (Expression<Func<Tuple, bool>>) predicate);
135127
}
136128

137129
/// <inheritdoc/>
138130
protected override CompilableProvider VisitDistinct(DistinctProvider provider)
139131
{
140132
OnRecursionEntrance(provider);
141133
var source = VisitCompilable(provider.Source);
142-
OnRecursionExit(provider);
134+
_ = OnRecursionExit(provider);
143135
return source == provider.Source ? provider : new DistinctProvider(source);
144136
}
145137

@@ -148,7 +140,7 @@ protected override CompilableProvider VisitCalculate(CalculateProvider provider)
148140
{
149141
OnRecursionEntrance(provider);
150142
var source = VisitCompilable(provider.Source);
151-
OnRecursionExit(provider);
143+
_ = OnRecursionExit(provider);
152144
var translated = false;
153145
var descriptors = new List<CalculatedColumnDescriptor>(provider.CalculatedColumns.Length);
154146
foreach (var column in provider.CalculatedColumns) {
@@ -158,19 +150,18 @@ protected override CompilableProvider VisitCalculate(CalculateProvider provider)
158150
var ccd = new CalculatedColumnDescriptor(column.Name, column.Type, (Expression<Func<Tuple, object>>) expression);
159151
descriptors.Add(ccd);
160152
}
161-
if (!translated && source == provider.Source)
162-
return provider;
163-
return new CalculateProvider(source, descriptors.ToArray());
153+
return !translated && source == provider.Source
154+
? provider
155+
: new CalculateProvider(source, descriptors.ToArray());
164156
}
165157

158+
/// <inheritdoc/>
166159
protected override CompilableProvider VisitRowNumber(RowNumberProvider provider)
167160
{
168161
OnRecursionEntrance(provider);
169162
var source = VisitCompilable(provider.Source);
170-
OnRecursionExit(provider);
171-
if (source == provider.Source)
172-
return provider;
173-
return new RowNumberProvider(source, provider.SystemColumn.Name);
163+
_ = OnRecursionExit(provider);
164+
return source == provider.Source ? provider : new RowNumberProvider(source, provider.SystemColumn.Name);
174165
}
175166

176167

@@ -179,10 +170,8 @@ protected override CompilableProvider VisitAlias(AliasProvider provider)
179170
{
180171
OnRecursionEntrance(provider);
181172
var source = VisitCompilable(provider.Source);
182-
OnRecursionExit(provider);
183-
return source == provider.Source
184-
? provider
185-
: new AliasProvider(source, provider.Alias);
173+
_ = OnRecursionExit(provider);
174+
return source == provider.Source ? provider : new AliasProvider(source, provider.Alias);
186175
}
187176

188177
/// <inheritdoc/>
@@ -205,37 +194,34 @@ protected override CompilableProvider VisitAggregate(AggregateProvider provider)
205194
/// <inheritdoc/>
206195
protected override CompilableProvider VisitStore(StoreProvider provider)
207196
{
208-
if (!(provider.Source is CompilableProvider compilableSource))
209-
return provider;
197+
var compilableSource = provider.Source;
210198
OnRecursionEntrance(provider);
211199
var source = VisitCompilable(compilableSource);
212-
OnRecursionExit(provider);
213-
return source == compilableSource
214-
? provider
215-
: new StoreProvider(source, provider.Name);
200+
_ = OnRecursionExit(provider);
201+
return source == compilableSource ? provider : new StoreProvider(source, provider.Name);
216202
}
217203

218204
/// <inheritdoc/>
219205
protected override CompilableProvider VisitIndex(IndexProvider provider)
220206
{
221207
OnRecursionEntrance(provider);
222-
OnRecursionExit(provider);
208+
_ = OnRecursionExit(provider);
223209
return provider;
224210
}
225211

226212
/// <inheritdoc/>
227213
protected override CompilableProvider VisitFreeText(FreeTextProvider provider)
228214
{
229215
OnRecursionEntrance(provider);
230-
OnRecursionExit(provider);
216+
_ = OnRecursionExit(provider);
231217
return provider;
232218
}
233219

234220
/// <inheritdoc/>
235221
protected override CompilableProvider VisitContainsTable(ContainsTableProvider provider)
236222
{
237223
OnRecursionEntrance(provider);
238-
OnRecursionExit(provider);
224+
_ = OnRecursionExit(provider);
239225
return provider;
240226
}
241227

@@ -246,17 +232,17 @@ protected override CompilableProvider VisitPredicateJoin(PredicateJoinProvider p
246232
var left = VisitCompilable(provider.Left);
247233
var right = VisitCompilable(provider.Right);
248234
var predicate = (Expression<Func<Tuple, Tuple, bool>>)OnRecursionExit(provider);
249-
if (left == provider.Left && right == provider.Right)
250-
return provider;
251-
return new PredicateJoinProvider(left, right, predicate ?? provider.Predicate, provider.JoinType);
235+
return left == provider.Left && right == provider.Right
236+
? provider
237+
: new PredicateJoinProvider(left, right, predicate ?? provider.Predicate, provider.JoinType);
252238
}
253239

254240
/// <inheritdoc/>
255241
protected override CompilableProvider VisitExistence(ExistenceProvider provider)
256242
{
257243
OnRecursionEntrance(provider);
258244
var source = VisitCompilable(provider.Source);
259-
OnRecursionExit(provider);
245+
_ = OnRecursionExit(provider);
260246
return source == provider.Source ? provider : new ExistenceProvider(source, provider.ExistenceColumnName);
261247
}
262248

@@ -266,10 +252,11 @@ protected override CompilableProvider VisitApply(ApplyProvider provider)
266252
OnRecursionEntrance(provider);
267253
var left = VisitCompilable(provider.Left);
268254
var right = VisitCompilable(provider.Right);
269-
OnRecursionExit(provider);
270-
if (left == provider.Left && right == provider.Right)
271-
return provider;
272-
return new ApplyProvider(provider.ApplyParameter, left, right, provider.IsInlined, provider.SequenceType, provider.ApplyType);
255+
_ = OnRecursionExit(provider);
256+
return left == provider.Left && right == provider.Right
257+
? provider
258+
: new ApplyProvider(provider.ApplyParameter, left, right,
259+
provider.IsInlined, provider.SequenceType, provider.ApplyType);
273260
}
274261

275262
/// <inheritdoc/>
@@ -278,10 +265,10 @@ protected override CompilableProvider VisitIntersect(IntersectProvider provider)
278265
OnRecursionEntrance(provider);
279266
var left = VisitCompilable(provider.Left);
280267
var right = VisitCompilable(provider.Right);
281-
OnRecursionExit(provider);
282-
if (left == provider.Left && right == provider.Right)
283-
return provider;
284-
return new IntersectProvider(left, right);
268+
_ = OnRecursionExit(provider);
269+
return left == provider.Left && right == provider.Right
270+
? provider
271+
: new IntersectProvider(left, right);
285272
}
286273

287274
/// <inheritdoc/>
@@ -290,10 +277,10 @@ protected override CompilableProvider VisitExcept(ExceptProvider provider)
290277
OnRecursionEntrance(provider);
291278
var left = VisitCompilable(provider.Left);
292279
var right = VisitCompilable(provider.Right);
293-
OnRecursionExit(provider);
294-
if (left == provider.Left && right == provider.Right)
295-
return provider;
296-
return new ExceptProvider(left, right);
280+
_ = OnRecursionExit(provider);
281+
return left == provider.Left && right == provider.Right
282+
? provider
283+
: new ExceptProvider(left, right);
297284
}
298285

299286
/// <inheritdoc/>
@@ -302,10 +289,10 @@ protected override CompilableProvider VisitConcat(ConcatProvider provider)
302289
OnRecursionEntrance(provider);
303290
var left = VisitCompilable(provider.Left);
304291
var right = VisitCompilable(provider.Right);
305-
OnRecursionExit(provider);
306-
if (left == provider.Left && right == provider.Right)
307-
return provider;
308-
return new ConcatProvider(left, right);
292+
_ = OnRecursionExit(provider);
293+
return left == provider.Left && right == provider.Right
294+
? provider
295+
: new ConcatProvider(left, right);
309296
}
310297

311298
/// <inheritdoc/>
@@ -314,35 +301,31 @@ protected override CompilableProvider VisitUnion(UnionProvider provider)
314301
OnRecursionEntrance(provider);
315302
var left = VisitCompilable(provider.Left);
316303
var right = VisitCompilable(provider.Right);
317-
OnRecursionExit(provider);
318-
if (left == provider.Left && right == provider.Right)
319-
return provider;
320-
return new UnionProvider(left, right);
304+
_ = OnRecursionExit(provider);
305+
return left == provider.Left && right == provider.Right
306+
? provider
307+
: new UnionProvider(left, right);
321308
}
322309

323310
/// <inheritdoc/>
324311
protected override CompilableProvider VisitLock(LockProvider provider)
325312
{
326313
OnRecursionEntrance(provider);
327314
var source = VisitCompilable(provider.Source);
328-
OnRecursionExit(provider);
315+
_ = OnRecursionExit(provider);
329316
return source == provider.Source ? provider : new LockProvider(source, provider.LockMode, provider.LockBehavior);
330317
}
331318

319+
/// <inheritdoc/>
332320
protected override CompilableProvider VisitInclude(IncludeProvider provider)
333321
{
334322
OnRecursionEntrance(provider);
335323
var source = VisitCompilable(provider.Source);
336-
OnRecursionExit(provider);
337-
if (source == provider.Source)
338-
return provider;
339-
return new IncludeProvider(source, provider.Algorithm, provider.IsInlined,
340-
provider.FilterDataSource, provider.ResultColumnName, provider.FilteredColumns);
341-
}
342-
343-
private static Expression DefaultExpressionTranslator(Provider p, Expression e)
344-
{
345-
return e;
324+
_ = OnRecursionExit(provider);
325+
return source == provider.Source
326+
? provider
327+
: new IncludeProvider(source, provider.Algorithm, provider.IsInlined,
328+
provider.FilterDataSource, provider.ResultColumnName, provider.FilteredColumns);
346329
}
347330

348331
/// <summary>
@@ -360,6 +343,8 @@ protected virtual void OnRecursionEntrance(Provider provider)
360343
{
361344
}
362345

346+
private static Expression DefaultExpressionTranslator(CompilableProvider p, Expression e) => e;
347+
363348
// Constructors
364349

365350
/// <inheritdoc/>
@@ -370,7 +355,7 @@ public CompilableProviderVisitor()
370355

371356
/// <inheritdoc/>
372357
/// <param name="expressionTranslator">Expression translator.</param>
373-
public CompilableProviderVisitor(Func<Provider, Expression, Expression> expressionTranslator)
358+
public CompilableProviderVisitor(Func<CompilableProvider, Expression, Expression> expressionTranslator)
374359
{
375360
translate = expressionTranslator;
376361
}

0 commit comments

Comments
 (0)