Skip to content

Commit 06d5cf5

Browse files
committed
IPostCompiler/IPrecompiler visitors revised
more efficient collections operations
1 parent b464f71 commit 06d5cf5

7 files changed

Lines changed: 72 additions & 56 deletions

File tree

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

Lines changed: 32 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -131,7 +131,7 @@ protected override Provider VisitJoin(JoinProvider provider)
131131

132132
var newLeftProvider = provider.Left;
133133
var newRightProvider = provider.Right;
134-
VisitJoin(ref leftMapping, ref newLeftProvider, ref rightMapping, ref newRightProvider);
134+
VisitJoin(ref leftMapping, ref newLeftProvider, ref rightMapping, ref newRightProvider, true);
135135

136136
mappings[provider] = MergeMappings(provider.Left, leftMapping, rightMapping);
137137

@@ -159,7 +159,7 @@ protected override Provider VisitPredicateJoin(PredicateJoinProvider provider)
159159

160160
var newLeftProvider = provider.Left;
161161
var newRightProvider = provider.Right;
162-
VisitJoin(ref leftMapping, ref newLeftProvider, ref rightMapping, ref newRightProvider);
162+
VisitJoin(ref leftMapping, ref newLeftProvider, ref rightMapping, ref newRightProvider, false);
163163
mappings[provider] = MergeMappings(provider.Left, leftMapping, rightMapping);
164164
var predicate = TranslateJoinPredicate(leftMapping, rightMapping, provider.Predicate);
165165

@@ -428,11 +428,27 @@ protected override void OnRecursionEntrance(Provider provider)
428428

429429
private static List<int> Merge(IEnumerable<int> left, IEnumerable<int> right)
430430
{
431-
return left
432-
.Union(right)
433-
.Distinct()
434-
.OrderBy(i => i)
435-
.ToList();
431+
var hs = new HashSet<int>(left);
432+
foreach (var r in right) {
433+
_ = hs.Add(r);
434+
}
435+
var resultList = hs.ToList(hs.Count);
436+
resultList.Sort();
437+
return resultList;
438+
}
439+
440+
private static List<int> Merge(List<int> leftMap, IEnumerable<int> rightMap)
441+
{
442+
var preReturn = leftMap.Union(rightMap).ToList(leftMap.Count * 2);
443+
preReturn.Sort();
444+
return preReturn;
445+
}
446+
447+
private static List<int> Merge(List<int> leftMap, List<int> rightMap)
448+
{
449+
var preReturn = leftMap.Union(rightMap).ToList(leftMap.Count + rightMap.Count);
450+
preReturn.Sort();
451+
return preReturn;
436452
}
437453

438454
private static List<int> MergeMappings(Provider originalLeft, List<int> leftMap, List<int> rightMap)
@@ -488,11 +504,16 @@ private Expression TranslateJoinPredicate(IList<int> leftMapping,
488504
expression.Parameters[1]);
489505
}
490506

491-
private void VisitJoin(ref List<int> leftMapping, ref CompilableProvider left, ref List<int> rightMapping,
492-
ref CompilableProvider right)
507+
private void VisitJoin(
508+
ref List<int> leftMapping, ref CompilableProvider left,
509+
ref List<int> rightMapping, ref CompilableProvider right, bool skipSort)
493510
{
494-
leftMapping = leftMapping.Distinct().OrderBy(i => i).ToList();
495-
rightMapping = rightMapping.Distinct().OrderBy(i => i).ToList();
511+
if (!skipSort) {
512+
leftMapping = leftMapping.Distinct().ToList(leftMapping.Count);
513+
leftMapping.Sort();
514+
rightMapping = rightMapping.Distinct().ToList(rightMapping.Count);
515+
rightMapping.Sort();
516+
}
496517

497518
// visit
498519

Orm/Xtensive.Orm/Orm/Rse/Transformation/Internals/ApplyPredicateCollector.cs

Lines changed: 4 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -19,8 +19,8 @@ namespace Xtensive.Orm.Rse.Transformation
1919
internal sealed class ApplyPredicateCollector
2020
{
2121
private readonly ApplyProviderCorrectorRewriter owner;
22-
private readonly ApplyParameterSearcher parameterSearcher = new ApplyParameterSearcher();
23-
private readonly CollectorHelper collectorHelper = new CollectorHelper();
22+
private readonly ApplyParameterSearcher parameterSearcher = new();
23+
private readonly CollectorHelper collectorHelper = new();
2424

2525
public bool TryAdd(FilterProvider filter)
2626
{
@@ -67,9 +67,8 @@ public void ValidateSelectedColumnIndexes(SelectProvider provider)
6767

6868
private void SaveApplyPredicate(FilterProvider filter, ApplyParameter applyParameter)
6969
{
70-
if (owner.State.Predicates.ContainsKey(applyParameter)) {
71-
owner.State.Predicates[applyParameter]
72-
.Add((filter.Predicate, filter.Header.Columns));
70+
if (owner.State.Predicates.TryGetValue(applyParameter, out var predicates)) {
71+
predicates.Add((filter.Predicate, filter.Header.Columns));
7372
}
7473
else {
7574
owner.State.Predicates.Add(applyParameter,

Orm/Xtensive.Orm/Orm/Rse/Transformation/Internals/ApplyProviderCorrectorRewriter.cs

Lines changed: 15 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -95,14 +95,14 @@ private void UpdateOwnerState()
9595
if (previousState == null)
9696
return;
9797
foreach (var pair in CalculateProviders) {
98-
if (previousState.CalculateProviders.ContainsKey(pair.Key))
99-
previousState.CalculateProviders[pair.Key].AddRange(pair.Value);
98+
if (previousState.CalculateProviders.TryGetValue(pair.Key, out var existingValue))
99+
existingValue.AddRange(pair.Value);
100100
else
101101
previousState.CalculateProviders.Add(pair.Key, pair.Value);
102102
}
103103
foreach (var pair in CalculateFilters) {
104-
if (previousState.CalculateFilters.ContainsKey(pair.Key))
105-
previousState.CalculateFilters[pair.Key].AddRange(pair.Value);
104+
if (previousState.CalculateFilters.TryGetValue(pair.Key, out var existingValue))
105+
existingValue.AddRange(pair.Value);
106106
else
107107
previousState.CalculateFilters.Add(pair.Key, pair.Value);
108108
}
@@ -117,17 +117,16 @@ private void UpdateOwnerState()
117117

118118
#endregion
119119

120-
public CorrectorState State { get; private set;}
121-
122120
private readonly bool throwOnCorrectionFault;
123121

124-
private readonly ApplyFilterRewriter predicateRewriter = new ApplyFilterRewriter();
125-
private readonly CollectorHelper collectorHelper = new CollectorHelper();
126-
private readonly CalculateRelatedExpressionRewriter calculateExpressionRewriter =
127-
new CalculateRelatedExpressionRewriter();
122+
private readonly ApplyFilterRewriter predicateRewriter = new();
123+
private readonly CollectorHelper collectorHelper = new();
124+
private readonly CalculateRelatedExpressionRewriter calculateExpressionRewriter = new();
128125
private readonly ApplyPredicateCollector predicateCollector;
129126
private readonly CalculateProviderCollector calculateProviderCollector;
130127

128+
public CorrectorState State { get; private set; }
129+
131130
public CompilableProvider Rewrite(CompilableProvider rootProvider)
132131
{
133132
State = null;
@@ -391,19 +390,17 @@ private void EnsureAbsenceOfApplyProviderRequiringConversion()
391390
private static AggregateProvider RecreateAggregate(AggregateProvider provider, CompilableProvider source)
392391
{
393392
var columnCount = provider.AggregateColumns.Length;
394-
var acds = provider.AggregateColumns.Select(
395-
ac => new AggregateColumnDescriptor(ac.Name, ac.SourceIndex, ac.AggregateType))
396-
.ToArray(columnCount);
393+
var acds = provider.AggregateColumns.SelectToArray(
394+
ac => new AggregateColumnDescriptor(ac.Name, ac.SourceIndex, ac.AggregateType));
397395
return new AggregateProvider(source, provider.GroupColumnIndexes, acds);
398396
}
399397

400398
private static CalculateProvider RecreateCalculate(CalculateProvider provider, CompilableProvider source)
401399
{
402400
var columnsCount = provider.CalculatedColumns.Length;
403401
var ccds = provider.CalculatedColumns
404-
.Select(
405-
column => new CalculatedColumnDescriptor(column.Name, column.Type, column.Expression))
406-
.ToArray(columnsCount);
402+
.SelectToArray(
403+
column => new CalculatedColumnDescriptor(column.Name, column.Type, column.Expression));
407404
return new CalculateProvider(source, ccds);
408405
}
409406

@@ -412,15 +409,15 @@ private CalculateProvider RewriteCalculateColumnExpressions(
412409
{
413410
var calculateProvider = providerPair.Item1;
414411
var columnCollection = providerPair.Item2;
415-
var ccd = calculateProvider.CalculatedColumns.Select(
412+
var ccd = calculateProvider.CalculatedColumns.SelectToArray(
416413
column => {
417414
var newColumnExpression = (Expression<Func<Tuple, object>>) calculateExpressionRewriter
418415
.Rewrite(column.Expression, column.Expression.Parameters[0], columnCollection,
419416
source.Header.Columns);
420417
var currentName = columnCollection.Single(c => c.Index==column.Index).Name;
421418
return new CalculatedColumnDescriptor(currentName, column.Type, newColumnExpression);
422419
});
423-
return new CalculateProvider(source, ccd.ToArray());
420+
return new CalculateProvider(source, ccd);
424421
}
425422

426423
#endregion

Orm/Xtensive.Orm/Orm/Rse/Transformation/Internals/CalculateProviderCollector.cs

Lines changed: 9 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -18,9 +18,9 @@ namespace Xtensive.Orm.Rse.Transformation
1818
internal sealed class CalculateProviderCollector
1919
{
2020
private readonly ApplyProviderCorrectorRewriter owner;
21-
private readonly ApplyParameterSearcher parameterSearcher = new ApplyParameterSearcher();
22-
private readonly CollectorHelper collectorHelper = new CollectorHelper();
23-
private readonly TupleAccessGatherer tupleGatherer = new TupleAccessGatherer((p, i) => {});
21+
private readonly ApplyParameterSearcher parameterSearcher = new();
22+
private readonly CollectorHelper collectorHelper = new();
23+
private readonly TupleAccessGatherer tupleGatherer = new((p, i) => {});
2424

2525
public bool TryAdd(CalculateProvider provider)
2626
{
@@ -100,12 +100,12 @@ private bool TryAddCalculateFilter(FilterProvider filterProvider, List<int> tupl
100100
{
101101
var result = false;
102102
foreach (var key in owner.State.Predicates.Keys) {
103-
if (!owner.State.CalculateProviders.ContainsKey(key))
104-
continue;
105-
foreach (var providerPair in owner.State.CalculateProviders[key]) {
106-
if (ContainsAccessToTupleField(tupleAccesses, providerPair.Item1, filterProvider)) {
107-
result = true;
108-
AddCalculateFilter(providerPair.Item1, filterProvider);
103+
if (owner.State.CalculateProviders.TryGetValue(key, out var providerPairs)) {
104+
foreach (var providerPair in providerPairs) {
105+
if (ContainsAccessToTupleField(tupleAccesses, providerPair.Item1, filterProvider)) {
106+
result = true;
107+
AddCalculateFilter(providerPair.Item1, filterProvider);
108+
}
109109
}
110110
}
111111
}

Orm/Xtensive.Orm/Orm/Rse/Transformation/Internals/CollectorHelper.cs

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,7 @@ namespace Xtensive.Orm.Rse.Transformation
1818
{
1919
internal sealed class CollectorHelper
2020
{
21-
private readonly ParameterRewriter parameterRewriter = new ParameterRewriter();
21+
private readonly ParameterRewriter parameterRewriter = new();
2222

2323
public Expression<Func<Tuple, bool>> CreatePredicatesConjunction(
2424
Expression<Func<Tuple, bool>> newPredicate, Expression<Func<Tuple, bool>> oldPredicate)
@@ -53,7 +53,7 @@ public Pair<Expression<Func<Tuple, bool>>, ColumnCollection> ConcatenateWithExis
5353
existingPredicatePair.Item1);
5454
var currentColumns = existingPredicatePair.Item2;
5555
foreach (var column in provider.Header.Columns)
56-
if (!currentColumns.Any(c => c.Name==column.Name))
56+
if (currentColumns[column.Name] is null)
5757
currentColumns.Add(column);
5858
return new Pair<Expression<Func<Tuple, bool>>, ColumnCollection>(newPredicate, currentColumns);
5959
}
@@ -65,7 +65,7 @@ public Pair<Expression<Func<Tuple, bool>>, ColumnCollection> ConcatenateWithExis
6565
var newFilters =
6666
new Dictionary<TDictKey, List<(TPairKey, ColumnCollection)>>(currentState.Count);
6767
foreach (var providerPair in currentState) {
68-
var newProviderPairValue = new List<(TPairKey, ColumnCollection)>();
68+
var newProviderPairValue = new List<(TPairKey, ColumnCollection)>(providerPair.Value.Count);
6969
foreach (var predicatePair in providerPair.Value) {
7070
var newPredicatePair = (predicatePair.Item1, predicatePair.Item2.Alias(provider.Alias));
7171
newProviderPairValue.Add(newPredicatePair);

Orm/Xtensive.Orm/Orm/Rse/Transformation/Internals/OrderingRewriter.cs

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -104,8 +104,9 @@ protected override Provider VisitAggregate(AggregateProvider provider)
104104
}
105105
if (sortOrder.Count > 0) {
106106
var selectOrdering = new DirectionCollection<int>();
107+
var groupColumnIndexes = result.GroupColumnIndexes;
107108
foreach (var pair in sortOrder) {
108-
var columnIndex = result.GroupColumnIndexes.IndexOf(pair.Key);
109+
var columnIndex = groupColumnIndexes.IndexOf(pair.Key);
109110
if (columnIndex < 0) {
110111
if (selectOrdering.Count > 0)
111112
selectOrdering.Clear();

Orm/Xtensive.Orm/Sql/Compiler/Internals/PostCompiler.cs

Lines changed: 7 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -32,7 +32,7 @@ public static string Process(Node root, SqlPostCompilerConfiguration configurati
3232

3333
public override void Visit(TextNode node)
3434
{
35-
result.Append(node.Text);
35+
_ = result.Append(node.Text);
3636
}
3737

3838
public override void Visit(VariantNode node)
@@ -45,30 +45,28 @@ public override void Visit(VariantNode node)
4545

4646
public override void Visit(PlaceholderNode node)
4747
{
48-
string value;
49-
if (!configuration.PlaceholderValues.TryGetValue(node.Id, out value))
48+
if (!configuration.PlaceholderValues.TryGetValue(node.Id, out var value))
5049
throw new InvalidOperationException(string.Format(Strings.ExValueForPlaceholderXIsNotSet, node.Id));
51-
result.Append(value);
50+
_ = result.Append(value);
5251
}
5352

5453
public override void Visit(CycleItemNode node)
5554
{
56-
result.Append(currentCycleItem[node.Index]);
55+
_ = result.Append(currentCycleItem[node.Index]);
5756
}
5857

5958
public override void Visit(CycleNode node)
6059
{
61-
List<string[]> items;
62-
if (!configuration.DynamicFilterValues.TryGetValue(node.Id, out items))
60+
if (!configuration.DynamicFilterValues.TryGetValue(node.Id, out var items))
6361
throw new InvalidOperationException(string.Format(Strings.ExItemsForCycleXAreNotSpecified, node.Id));
6462
if (items==null || items.Count==0) {
6563
VisitNodeSequence(node.EmptyCase);
6664
return;
6765
}
68-
for (int i = 0; i < items.Count - 1; i++) {
66+
for (int i = 0, count = items.Count; i < count - 1; i++) {
6967
currentCycleItem = items[i];
7068
VisitNodeSequence(node.Body);
71-
result.Append(node.Delimiter);
69+
_ = result.Append(node.Delimiter);
7270
}
7371
currentCycleItem = items[items.Count - 1];
7472
VisitNodeSequence(node.Body);

0 commit comments

Comments
 (0)