Skip to content

Commit 973ea7f

Browse files
committed
UpgradeHintProcessor code improvements
- Optimized collections usage. Less enumerations, used exact capacity where possible. - Some results of UpgradeHintProcessor's work passed to further use to elimitate recalculations (e.g. non-connector types) - ClassifiedCollection extended with method alowing to get item count in each class group - Ordinal string comparison where possible - general code clean-up and formatting
1 parent 44f4f45 commit 973ea7f

File tree

9 files changed

+288
-187
lines changed

9 files changed

+288
-187
lines changed

Orm/Xtensive.Orm/Collections/ClassifiedCollection.cs

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -124,6 +124,12 @@ public IEnumerable<TClass> GetClasses()
124124
return classified.Keys;
125125
}
126126

127+
public int GetItemCount(TClass @class)
128+
{
129+
var items = classified.GetValueOrDefault(@class);
130+
return items != null ? items.Count : 0;
131+
}
132+
127133
#region IEnumerable<...> members
128134

129135
IEnumerator IEnumerable.GetEnumerator()

Orm/Xtensive.Orm/Collections/TypeClassifier.cs

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -29,6 +29,11 @@ public IEnumerable<TItem> GetItems<TClass>()
2929
return GetItems(typeof (TClass));
3030
}
3131

32+
public int GetItemCount<TClass>()
33+
{
34+
return GetItemCount(typeof(TClass));
35+
}
36+
3237
// Constructors
3338

3439
/// <inheritdoc/>

Orm/Xtensive.Orm/Core/Extensions/CollectionExtensions.cs

Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -207,5 +207,33 @@ public static IEnumerable<TSource> ReverseList<TSource>(this IList<TSource> sour
207207
for (var i = source.Count - 1; i >= 0; i--)
208208
yield return source[i];
209209
}
210+
211+
/// <summary>
212+
/// Projects each element of a sequence into two elements of new form and adds it to the first or the second array respectively.
213+
/// </summary>
214+
/// <typeparam name="TSource">Type of source sequence.</typeparam>
215+
/// <typeparam name="TFirst">Type of elements of first result array.</typeparam>
216+
/// <typeparam name="TSecond">Type of elements of first result array.</typeparam>
217+
/// <param name="source">A collection of values to invoke a transform functions on.</param>
218+
/// <param name="firstArraySelector">A transform function to apply to each element to get element of the first array.</param>
219+
/// <param name="secondArraySelector">A transform function to apply to each element to get element of the second array.</param>
220+
/// <returns>Pair of two arrays.</returns>
221+
internal static Pair<TFirst[], TSecond[]> SelectToArrays<TSource, TFirst,TSecond>(
222+
this ICollection<TSource> source, Func<TSource, TFirst> firstArraySelector, Func<TSource, TSecond> secondArraySelector)
223+
{
224+
ArgumentValidator.EnsureArgumentNotNull(source, nameof(source));
225+
ArgumentValidator.EnsureArgumentNotNull(firstArraySelector, nameof(firstArraySelector));
226+
ArgumentValidator.EnsureArgumentNotNull(secondArraySelector, nameof(secondArraySelector));
227+
228+
var first = new TFirst[source.Count];
229+
var second = new TSecond[source.Count];
230+
var index = 0;
231+
foreach (var item in source) {
232+
first[index] = firstArraySelector(item);
233+
second[index] = secondArraySelector(item);
234+
index++;
235+
}
236+
return new Pair<TFirst[], TSecond[]>(first, second);
237+
}
210238
}
211239
}

Orm/Xtensive.Orm/Orm/Upgrade/Internals/Extensions/DomainModelExtensions.cs

Lines changed: 0 additions & 27 deletions
This file was deleted.

Orm/Xtensive.Orm/Orm/Upgrade/Internals/HintGenerator.cs

Lines changed: 17 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,7 @@ internal sealed class HintGenerator
2828
private readonly StoredDomainModel extractedModel;
2929
private readonly StoredDomainModel currentModel;
3030

31+
private readonly UpgradeHintsProcessingResult processingResults;
3132
private readonly Dictionary<StoredTypeInfo, StoredTypeInfo> typeMapping;
3233
private readonly Dictionary<StoredTypeInfo, StoredTypeInfo> reverseTypeMapping;
3334
private readonly Dictionary<StoredFieldInfo, StoredFieldInfo> fieldMapping;
@@ -721,45 +722,40 @@ private static InvalidOperationException TypeIsNotInHierarchy(string type)
721722

722723
// Constructors
723724

724-
public HintGenerator(Dictionary<StoredTypeInfo, StoredTypeInfo> typeMapping,
725-
Dictionary<StoredTypeInfo, StoredTypeInfo> reverseTypeMapping,
726-
Dictionary<StoredFieldInfo, StoredFieldInfo> fieldMapping,
727-
NativeTypeClassifier<UpgradeHint> hints,
725+
public HintGenerator(UpgradeHintsProcessingResult hintsProcessingResult,
728726
HandlerAccessor handlers,
729727
MappingResolver resolver,
730728
StorageModel extractedStorageModel,
731729
StoredDomainModel currentDomainModel,
732730
StoredDomainModel extractedDomainModel)
733731
{
734-
ArgumentValidator.EnsureArgumentNotNull(typeMapping, "typeMapping");
735-
ArgumentValidator.EnsureArgumentNotNull(reverseTypeMapping, "reverseTypeMapping");
736-
ArgumentValidator.EnsureArgumentNotNull(fieldMapping, "fieldMapping");
737-
ArgumentValidator.EnsureArgumentNotNull(hints, "hints");
738-
ArgumentValidator.EnsureArgumentNotNull(handlers, "handlers");
739-
ArgumentValidator.EnsureArgumentNotNull(resolver, "resolver");
740-
ArgumentValidator.EnsureArgumentNotNull(extractedStorageModel, "extractedStorageModel");
741-
ArgumentValidator.EnsureArgumentNotNull(currentDomainModel, "currentDomainModel");
742-
ArgumentValidator.EnsureArgumentNotNull(extractedDomainModel, "extractedDomainModel");
743-
744-
this.typeMapping = typeMapping;
745-
this.reverseTypeMapping = reverseTypeMapping;
746-
this.fieldMapping = fieldMapping;
747-
this.hints = hints;
732+
ArgumentValidator.EnsureArgumentNotNull(hintsProcessingResult, nameof(hintsProcessingResult));
733+
ArgumentValidator.EnsureArgumentNotNull(handlers, nameof(handlers));
734+
ArgumentValidator.EnsureArgumentNotNull(resolver, nameof(resolver));
735+
ArgumentValidator.EnsureArgumentNotNull(extractedStorageModel, nameof(extractedStorageModel));
736+
ArgumentValidator.EnsureArgumentNotNull(currentDomainModel, nameof(currentDomainModel));
737+
ArgumentValidator.EnsureArgumentNotNull(extractedDomainModel, nameof(extractedDomainModel));
748738

749-
extractedModelFields = new Dictionary<StoredTypeInfo, StoredFieldInfo[]>();
739+
processingResults = hintsProcessingResult;
740+
741+
typeMapping = hintsProcessingResult.TypeMapping;
742+
reverseTypeMapping = hintsProcessingResult.ReverseTypeMapping;
743+
fieldMapping = hintsProcessingResult.FieldMapping;
744+
hints = hintsProcessingResult.Hints;
750745

751746
this.extractedStorageModel = extractedStorageModel;
752747
this.resolver = resolver;
753-
754748
nameBuilder = handlers.NameBuilder;
755749

756750
currentModel = currentDomainModel;
757751
currentModel.UpdateReferences();
758752

753+
extractedModelFields = new Dictionary<StoredTypeInfo, StoredFieldInfo[]>();
759754
extractedModel = extractedDomainModel;
760755

761-
foreach (var type in extractedModel.Types)
756+
foreach (var type in extractedModel.Types) {
762757
extractedModelFields.Add(type, type.Fields.Flatten(f => f.Fields, null, true).ToArray());
758+
}
763759
}
764760
}
765761
}

Orm/Xtensive.Orm/Orm/Upgrade/Internals/NullUpgradeHintsProcessor.cs

Lines changed: 11 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,14 @@
1-
// Copyright (C) 2015 Xtensive LLC.
2-
// All rights reserved.
3-
// For conditions of distribution and use, see license.
1+
// Copyright (C) 2015-2021 Xtensive LLC.
2+
// This code is distributed under MIT license terms.
3+
// See the License.txt file in the project root for more information.
44
// Created by: Alexey Kulakov
55
// Created: 2015.01.22
66

7+
using System;
78
using System.Collections.Generic;
89
using System.Linq;
910
using Xtensive.Collections;
11+
using Xtensive.Core;
1012
using Xtensive.Orm.Model.Stored;
1113
using Xtensive.Orm.Upgrade.Internals.Interfaces;
1214

@@ -24,14 +26,17 @@ public UpgradeHintsProcessingResult Process(IEnumerable<UpgradeHint> inputHints)
2426
var fieldMapping = new Dictionary<StoredFieldInfo, StoredFieldInfo>();
2527
var reverseFieldMapping = new Dictionary<StoredFieldInfo, StoredFieldInfo>();
2628
var currentModelTypes = currentDomainModel.Types.ToDictionary(t => t.UnderlyingType);
27-
var suspiciousTypes = new List<StoredTypeInfo>();
28-
29-
return new UpgradeHintsProcessingResult(hints, typeMapping, reverseTypeMapping, fieldMapping, reverseFieldMapping, currentModelTypes, suspiciousTypes);
29+
var suspiciousTypes = new HashSet<StoredTypeInfo>();
3030

31+
return new UpgradeHintsProcessingResult(
32+
hints, typeMapping, reverseTypeMapping, fieldMapping, reverseFieldMapping, currentModelTypes,
33+
suspiciousTypes, Array.Empty<StoredTypeInfo>(), Array.Empty<StoredTypeInfo>());
3134
}
3235

3336
public NullUpgradeHintsProcessor(StoredDomainModel currentDomainModel)
3437
{
38+
ArgumentValidator.EnsureArgumentNotNull(currentDomainModel, nameof(currentDomainModel));
39+
3540
this.currentDomainModel = currentDomainModel;
3641
}
3742
}
Lines changed: 30 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -1,31 +1,36 @@
1-
// Copyright (C) 2015 Xtensive LLC.
2-
// All rights reserved.
3-
// For conditions of distribution and use, see license.
1+
// Copyright (C) 2015-2021 Xtensive LLC.
2+
// This code is distributed under MIT license terms.
3+
// See the License.txt file in the project root for more information.
44
// Created by: Alexey Kulakov
55
// Created: 2015.01.22
66

77
using System.Collections.Generic;
88
using System.Linq;
99
using Xtensive.Collections;
10+
using Xtensive.Core;
1011
using Xtensive.Orm.Model.Stored;
1112

1213
namespace Xtensive.Orm.Upgrade.Internals
1314
{
1415
internal sealed class UpgradeHintsProcessingResult
1516
{
16-
public NativeTypeClassifier<UpgradeHint> Hints { get; private set; }
17+
public NativeTypeClassifier<UpgradeHint> Hints { get; }
1718

18-
public Dictionary<StoredTypeInfo, StoredTypeInfo> TypeMapping { get; private set; }
19+
public Dictionary<StoredTypeInfo, StoredTypeInfo> TypeMapping { get; }
1920

20-
public Dictionary<StoredTypeInfo, StoredTypeInfo> ReverseTypeMapping { get; private set; }
21+
public Dictionary<StoredTypeInfo, StoredTypeInfo> ReverseTypeMapping { get; }
2122

22-
public Dictionary<StoredFieldInfo, StoredFieldInfo> FieldMapping { get; private set; }
23+
public Dictionary<StoredFieldInfo, StoredFieldInfo> FieldMapping { get; }
2324

24-
public Dictionary<StoredFieldInfo, StoredFieldInfo> ReverseFieldMapping { get; private set; }
25+
public Dictionary<StoredFieldInfo, StoredFieldInfo> ReverseFieldMapping { get; }
2526

26-
public Dictionary<string, StoredTypeInfo> CurrentModelTypes { get; private set; }
27+
public Dictionary<string, StoredTypeInfo> CurrentModelTypes { get; }
2728

28-
public List<StoredTypeInfo> SuspiciousTypes { get; set; }
29+
public HashSet<StoredTypeInfo> SuspiciousTypes { get; }
30+
31+
public IReadOnlyList<StoredTypeInfo> CurrentNonConnectorTypes { get; }
32+
33+
public IReadOnlyList<StoredTypeInfo> ExtractedNonConnectorTypes { get; }
2934

3035
public bool AreAllTypesMapped()
3136
{
@@ -44,15 +49,29 @@ public UpgradeHintsProcessingResult(NativeTypeClassifier<UpgradeHint> hints,
4449
Dictionary<StoredFieldInfo, StoredFieldInfo> fieldMapping,
4550
Dictionary<StoredFieldInfo, StoredFieldInfo> reverseFieldMapping,
4651
Dictionary<string, StoredTypeInfo> currentModelTypes,
47-
List<StoredTypeInfo> suspiciousTypes)
52+
HashSet<StoredTypeInfo> suspiciousTypes,
53+
IReadOnlyList<StoredTypeInfo> currentNonConnectorTypes,
54+
IReadOnlyList<StoredTypeInfo> extractedNonConnectorTypes)
4855
{
56+
ArgumentValidator.EnsureArgumentNotNull(hints, nameof(hints));
57+
ArgumentValidator.EnsureArgumentNotNull(typeMapping, nameof(typeMapping));
58+
ArgumentValidator.EnsureArgumentNotNull(reverseTypeMapping, nameof(reverseTypeMapping));
59+
ArgumentValidator.EnsureArgumentNotNull(fieldMapping, nameof(fieldMapping));
60+
ArgumentValidator.EnsureArgumentNotNull(reverseFieldMapping, nameof(reverseFieldMapping));
61+
ArgumentValidator.EnsureArgumentNotNull(currentModelTypes, nameof(currentModelTypes));
62+
ArgumentValidator.EnsureArgumentNotNull(suspiciousTypes, nameof(suspiciousTypes));
63+
ArgumentValidator.EnsureArgumentNotNull(currentNonConnectorTypes, nameof(suspiciousTypes));
64+
ArgumentValidator.EnsureArgumentNotNull(extractedNonConnectorTypes, nameof(suspiciousTypes));
65+
4966
Hints = hints;
5067
TypeMapping = typeMapping;
5168
ReverseTypeMapping = reverseTypeMapping;
5269
FieldMapping = fieldMapping;
5370
ReverseFieldMapping = reverseFieldMapping;
5471
CurrentModelTypes = currentModelTypes;
5572
SuspiciousTypes = suspiciousTypes;
73+
CurrentNonConnectorTypes = currentNonConnectorTypes;
74+
ExtractedNonConnectorTypes = extractedNonConnectorTypes;
5675
}
5776
}
5877
}

0 commit comments

Comments
 (0)