Skip to content

Commit 3ff662f

Browse files
committed
Prevents StoreProvider columns from optimization when grouping
1 parent 8f6c3de commit 3ff662f

File tree

1 file changed

+30
-0
lines changed

1 file changed

+30
-0
lines changed

Orm/Xtensive.Orm/Orm/Rse/Transformation/ColumnMappingInspector.cs

Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,8 @@ internal abstract class ColumnMappingInspector : CompilableProviderVisitor
1818
private readonly CompilableProviderVisitor outerColumnUsageVisitor;
1919
private readonly CompilableProvider rootProvider;
2020

21+
private bool hasGrouping;
22+
2123
public virtual CompilableProvider RemoveRedundantColumns()
2224
{
2325
mappings.Add(rootProvider, Enumerable.Range(0, rootProvider.Header.Length).ToList());
@@ -224,7 +226,13 @@ protected override Provider VisitAggregate(AggregateProvider provider)
224226
.Select(c => c.SourceIndex)
225227
.Union(provider.GroupColumnIndexes);
226228
mappings[provider.Source] = Merge(mappings[provider], map);
229+
230+
if (provider.GroupColumnIndexes.Length > 0) {
231+
hasGrouping = true;
232+
}
233+
227234
var source = VisitCompilable(provider.Source);
235+
hasGrouping = false;
228236

229237
var sourceMap = mappings[provider.Source];
230238
var currentMap = mappings[provider];
@@ -292,6 +300,28 @@ protected override Provider VisitRowNumber(RowNumberProvider provider)
292300
return new RowNumberProvider(newSource, rowNumberColumn.Name);
293301
}
294302

303+
protected override Provider VisitStore(StoreProvider provider)
304+
{
305+
var compilableSource = provider.Source as CompilableProvider;
306+
if (compilableSource == null)
307+
return provider;
308+
309+
if (hasGrouping) {
310+
mappings.Add(provider.Sources[0],
311+
Merge(mappings[provider], provider.Header.Columns.Select((c, i) => i)));
312+
}
313+
else {
314+
OnRecursionEntrance(provider);
315+
}
316+
317+
var source = VisitCompilable(compilableSource);
318+
319+
_ = OnRecursionExit(provider);
320+
if (source == compilableSource)
321+
return provider;
322+
return new StoreProvider(source, provider.Name);
323+
}
324+
295325
protected override Provider VisitConcat(ConcatProvider provider)
296326
{
297327
return VisitSetOperationProvider(provider);

0 commit comments

Comments
 (0)