Skip to content

Commit b7673bb

Browse files
committed
Merge branch 'pr242-subset-complete' into avoid-merge-before-fix-problems
# Conflicts: # Orm/Xtensive.Orm.Tests.Framework/DomainModelExtensions.cs # Orm/Xtensive.Orm.Tests/Model/LibraryTest.cs # Orm/Xtensive.Orm.Tests/Storage/Prefetch/PrefetchTestHelper.cs # Orm/Xtensive.Orm/Collections/Interfaces/IFilterable.cs # Orm/Xtensive.Orm/Orm/Building/Builders/IndexBuilder.ClassTable.cs # Orm/Xtensive.Orm/Orm/Building/Builders/IndexBuilder.ClusteredIndexes.cs # Orm/Xtensive.Orm/Orm/Building/Builders/IndexBuilder.ConcreteTable.cs # Orm/Xtensive.Orm/Orm/Building/Builders/IndexBuilder.FullText.cs # Orm/Xtensive.Orm/Orm/Building/Builders/IndexBuilder.SingleTable.cs # Orm/Xtensive.Orm/Orm/Building/Builders/IndexBuilder.cs # Orm/Xtensive.Orm/Orm/Building/Builders/ModelBuilder.cs # Orm/Xtensive.Orm/Orm/Building/Builders/StorageMappingValidator.cs # Orm/Xtensive.Orm/Orm/Building/Builders/TypeBuilder.cs # Orm/Xtensive.Orm/Orm/Internals/Prefetch/PrefetchManager.cs # Orm/Xtensive.Orm/Orm/Linq/Translator.Expressions.cs # Orm/Xtensive.Orm/Orm/Model/ColumnInfoCollection.cs # Orm/Xtensive.Orm/Orm/Model/FieldInfoCollection.cs # Orm/Xtensive.Orm/Orm/Model/HierarchyInfo.cs # Orm/Xtensive.Orm/Orm/Model/IndexInfoCollection.cs # Orm/Xtensive.Orm/Orm/Model/TypeInfo.cs # Orm/Xtensive.Orm/Orm/Model/TypeInfoCollection.cs # Orm/Xtensive.Orm/Orm/Upgrade/Internals/DomainModelConverter.cs
2 parents 6f41ce5 + ed81e6b commit b7673bb

21 files changed

+402
-284
lines changed

Orm/Xtensive.Orm.Tests.Framework/DomainModelExtensions.cs

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -92,8 +92,8 @@ public static void DumpAncestor(this TypeInfo target, int indent)
9292
public static void DumpDescendants(this TypeInfo target, int indent)
9393
{
9494
WriteLine(indent, "Descendants:");
95-
var direct = target.Descendants;
96-
foreach (TypeInfo descendant in target.RecursiveDescendants) {
95+
var direct = target.DirectDescendants;
96+
foreach (TypeInfo descendant in target.AllDescendants) {
9797
if (direct.Contains(descendant))
9898
WriteLine(indent + 1, descendant.Name + " (direct)");
9999
else
@@ -104,8 +104,8 @@ public static void DumpDescendants(this TypeInfo target, int indent)
104104
public static void DumpInterfaces(this TypeInfo target, int indent)
105105
{
106106
WriteLine(indent, "Interfaces:");
107-
var direct = target.Interfaces;
108-
foreach (TypeInfo @interface in target.RecursiveInterfaces) {
107+
var direct = target.DirectInterfaces;
108+
foreach (TypeInfo @interface in target.AllInterfaces) {
109109
if (direct.Contains(@interface))
110110
WriteLine(indent + 1, @interface.Name + " (direct)");
111111
else
@@ -116,8 +116,8 @@ public static void DumpInterfaces(this TypeInfo target, int indent)
116116
public static void DumpImplementors(this TypeInfo target, int indent)
117117
{
118118
WriteLine(indent, "Implementors:");
119-
var direct = target.Implementors;
120-
foreach (TypeInfo implementor in target.RecursiveImplementors) {
119+
var direct = target.DirectImplementors;
120+
foreach (TypeInfo implementor in target.AllImplementors) {
121121
if (direct.Contains(implementor))
122122
WriteLine(indent + 1, implementor.Name + " (direct)");
123123
else
@@ -166,7 +166,7 @@ public static void Dump(this TypeInfo target, int indent)
166166
WriteLine(indent, "Ancestor: " + target.Ancestor.Name);
167167
}
168168
else if (target.IsInterface) {
169-
WriteLine(indent, "Implementors: " + target.Implementors.Select(t => t.Name).ToCommaDelimitedString());
169+
WriteLine(indent, "Implementors: " + target.DirectImplementors.Select(t => t.Name).ToCommaDelimitedString());
170170
}
171171

172172
target.DumpMappingName(indent);

Orm/Xtensive.Orm.Tests/Storage/Prefetch/PrefetchTestHelper.cs

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -41,9 +41,9 @@ public static void AssertOnlySpecifiedColumnsAreLoaded(Key key, TypeInfo type, S
4141
{
4242
var state = session.EntityStateCache[key, true];
4343
var realType = state.Key.TypeInfo;
44-
Assert.IsTrue(realType.Equals(type)
45-
|| realType.Ancestors.Contains(type)
46-
|| (type.IsInterface && realType.RecursiveInterfaces.Contains(type)));
44+
Assert.IsTrue(realType.Equals(type)
45+
|| realType.Ancestors.Contains(type)
46+
|| (type.IsInterface && realType.AllInterfaces.Contains(type)));
4747
var tuple = state.Tuple;
4848
Assert.IsNotNull(tuple);
4949
foreach (var field in type.Fields) {

Orm/Xtensive.Orm/Collections/Interfaces/IFilterable.cs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -20,15 +20,15 @@ public interface IFilterable<TFilter, TItem>
2020
/// Finds the items from initial collection according to specified filter <paramref name="criteria"/>.
2121
/// </summary>
2222
/// <param name="criteria">The object to filter initial collection with.</param>
23-
/// <returns><see cref="ICollection{TItem}"/> object.</returns>
23+
/// <returns><see cref="IEnumerable{TItem}"/> object.</returns>
2424
IEnumerable<TItem> Find(TFilter criteria);
2525

2626
/// <summary>
2727
/// Finds the items from initial collection according to specified filter <paramref name="criteria"/>.
2828
/// </summary>
2929
/// <param name="criteria">The object to filter initial collection with.</param>
3030
/// <param name="matchType">Type of the match.</param>
31-
/// <returns><see cref="ICollection{TItem}"/> object.</returns>
31+
/// <returns><see cref="IEnumerable{TItem}"/> object.</returns>
3232
IEnumerable<TItem> Find(TFilter criteria, MatchType matchType);
3333
}
3434
}

Orm/Xtensive.Orm/Orm/Building/Builders/IndexBuilder.ClassTable.cs

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -25,7 +25,7 @@ private void BuildClassTableIndexes(TypeInfo type)
2525
var root = type.Hierarchy.Root;
2626
var typeDef = context.ModelDef.Types[type.UnderlyingType];
2727
var ancestors = type.Ancestors;
28-
var interfaces = type.Interfaces;
28+
var interfaces = type.DirectInterfaces;
2929

3030
// Building declared indexes both secondary and primary (for root of the hierarchy only)
3131
foreach (var indexDescriptor in typeDef.Indexes) {
@@ -80,14 +80,14 @@ private void BuildClassTableIndexes(TypeInfo type)
8080
}
8181

8282
// Build indexes for descendants
83-
foreach (var descendant in type.Descendants)
83+
foreach (var descendant in type.DirectDescendants)
8484
BuildClassTableIndexes(descendant);
8585

8686
// Import inherited indexes
8787
var primaryIndex = type.Indexes.FindFirst(IndexAttributes.Primary | IndexAttributes.Real);
8888
if (untypedIndexes.Contains(primaryIndex) && primaryIndex.ReflectedType == root)
8989
primaryIndex = type.Indexes.Single(i => i.DeclaringIndex == primaryIndex.DeclaringIndex && i.IsTyped);
90-
var filterByTypes = type.RecursiveDescendants.Append(type).ToList();
90+
var filterByTypes = type.AllDescendants.Append(type).ToList(type.AllDescendants.Count + 1);
9191

9292
// Build virtual primary index
9393
if (ancestors.Count > 0) {

Orm/Xtensive.Orm/Orm/Building/Builders/IndexBuilder.ClusteredIndexes.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,7 @@ private void ChooseClusteredIndexes()
2323
var clusteredIndexesMap = new Dictionary<TypeInfo, IndexInfo>();
2424
queue.Enqueue(hierarchy.Root);
2525
while (queue.TryDequeue(out var type)) {
26-
foreach (var decendant in type.Descendants) {
26+
foreach (var decendant in type.DirectDescendants) {
2727
queue.Enqueue(decendant);
2828
}
2929
var clusteredIndexes = type.Indexes

Orm/Xtensive.Orm/Orm/Building/Builders/IndexBuilder.ConcreteTable.cs

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -53,7 +53,7 @@ private void BuildConcreteTableIndexes(TypeInfo type)
5353
}
5454

5555
// Building inherited from interfaces indexes
56-
foreach (var @interface in type.RecursiveInterfaces) {
56+
foreach (var @interface in type.AllInterfaces) {
5757
foreach (var parentIndex in @interface.Indexes.Find(IndexAttributes.Primary, MatchType.None)) {
5858
if (parentIndex.DeclaringIndex != parentIndex)
5959
continue;
@@ -75,12 +75,12 @@ private void BuildConcreteTableIndexes(TypeInfo type)
7575
}
7676

7777
// Build indexes for descendants
78-
foreach (var descendant in type.Descendants) {
78+
foreach (var descendant in type.DirectDescendants) {
7979
BuildConcreteTableIndexes(descendant);
8080
}
8181

8282
var ancestors = type.Ancestors;
83-
var descendants = type.RecursiveDescendants;
83+
var descendants = type.AllDescendants;
8484

8585
// Build primary virtual union index
8686
if (descendants.Count > 0) {

Orm/Xtensive.Orm/Orm/Building/Builders/IndexBuilder.FullText.cs

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -44,7 +44,7 @@ private void BuildFullTextIndexesClassTable(TypeInfo root, IEnumerable<FullTextI
4444
var indexesToDefine = hierarchyIndexes.ToList();
4545
if (indexesToDefine.Any(fti => fti.Type.UnderlyingType != root.UnderlyingType) || indexesToDefine.Count > 1)
4646
throw new DomainBuilderException(string.Format(Strings.ExUnableToBuildFulltextIndexesForHierarchyWithInheritanceSchemaClassTable, root.Name));
47-
var descendants = root.RecursiveDescendants.Append(root);
47+
var descendants = root.AllDescendants.Append(root);
4848
var indexDef = indexesToDefine[0];
4949
var primaryIndex = root.Indexes.Single(i => i.IsPrimary && !i.IsVirtual);
5050
var name = context.NameBuilder.BuildFullTextIndexName(root);
@@ -68,7 +68,8 @@ private void BuildFullTextIndexesSingleTable(TypeInfo root, IEnumerable<FullText
6868
foreach (var fullTextIndexDef in hierarchyIndexes) {
6969
var type = model.Types[fullTextIndexDef.Type.UnderlyingType];
7070
types.Add(type);
71-
types.UnionWith(type.RecursiveDescendants);
71+
foreach (var descendant in type.AllDescendants)
72+
types.Add(descendant);
7273
foreach (var fullTextFieldDef in fullTextIndexDef.Fields) {
7374
var fullTextColumn = GetFullTextColumn(type, fullTextFieldDef);
7475
index.Columns.Add(fullTextColumn);
@@ -119,7 +120,7 @@ private Dictionary<TypeInfo, List<FullTextIndexDef>> GatherFullTextIndexDefinito
119120
{
120121
var model = context.Model;
121122
var processQueue = new Queue<TypeInfo>();
122-
foreach (var type in root.Descendants) {
123+
foreach (var type in root.DirectDescendants) {
123124
processQueue.Enqueue(type);
124125
}
125126

@@ -141,7 +142,7 @@ private Dictionary<TypeInfo, List<FullTextIndexDef>> GatherFullTextIndexDefinito
141142
}
142143
}
143144
if (typeHasIndexDef)
144-
foreach (var descendant in type.Descendants) {
145+
foreach (var descendant in type.DirectDescendants) {
145146
processQueue.Enqueue(descendant);
146147
}
147148
}

Orm/Xtensive.Orm/Orm/Building/Builders/IndexBuilder.SingleTable.cs

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -42,7 +42,7 @@ private void BuildSingleTableIndexes(TypeInfo type)
4242

4343
var parent = type.Ancestor;
4444
// Building inherited from interfaces indexes
45-
foreach (var @interface in type.Interfaces) {
45+
foreach (var @interface in type.DirectInterfaces) {
4646
foreach (var interfaceIndex in @interface.Indexes.Find(IndexAttributes.Primary, MatchType.None)) {
4747
if (root.Indexes.Any(i => i.DeclaringIndex == interfaceIndex.DeclaringIndex && i.ReflectedType == type))
4848
continue;
@@ -68,12 +68,12 @@ private void BuildSingleTableIndexes(TypeInfo type)
6868
}
6969

7070
// Build indexes for descendants
71-
foreach (var descendant in type.Descendants) {
71+
foreach (var descendant in type.DirectDescendants) {
7272
BuildSingleTableIndexes(descendant);
7373
}
7474

7575
if (type == root) return;
76-
var descendants = type.RecursiveDescendants;
76+
var descendants = type.AllDescendants;
7777

7878
var primaryIndexFilterTypes = new List<TypeInfo>();
7979
if (!type.IsAbstract)
@@ -96,7 +96,7 @@ private void BuildSingleTableIndexes(TypeInfo type)
9696
continue;
9797
if (ancestorIndex.DeclaringType.IsInterface) {
9898
var filteredDescendants = descendants
99-
.Where(t => !t.IsAbstract && !t.Interfaces.Contains(ancestorIndex.DeclaringType));
99+
.Where(t => !t.IsAbstract && !t.DirectInterfaces.Contains(ancestorIndex.DeclaringType));
100100
var filterByTypes = new List<TypeInfo>();
101101
if (!type.IsAbstract)
102102
filterByTypes.Add(type);

Orm/Xtensive.Orm/Orm/Building/Builders/IndexBuilder.cs

Lines changed: 15 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -80,7 +80,7 @@ private void CreateInterfaceIndexes(TypeInfo @interface, ICollection<TypeInfo> p
8080
context.Model.RealIndexes.Add(index);
8181
}
8282

83-
var interfaces = @interface.Interfaces;
83+
var interfaces = @interface.DirectInterfaces;
8484
foreach (var typeInfo in interfaces) {
8585
CreateInterfaceIndexes(typeInfo, processedInterfaces);
8686
}
@@ -102,7 +102,7 @@ private void CreateInterfaceIndexes(TypeInfo @interface, ICollection<TypeInfo> p
102102
private void BuildInterfaceIndexes()
103103
{
104104
foreach (var @interface in context.Model.Types.Find(TypeAttributes.Interface)) {
105-
var implementors = @interface.Implementors;
105+
var implementors = @interface.DirectImplementors;
106106

107107
// Building primary indexes
108108
if (implementors.Count == 1) {
@@ -180,7 +180,7 @@ private void BuildInterfaceIndexes()
180180
}
181181
case InheritanceSchema.ConcreteTable: {
182182
var grouping = hierarchy;
183-
var allImplementors = @interface.RecursiveImplementors
183+
var allImplementors = @interface.AllImplementors
184184
.Where(t => t.Hierarchy == grouping.Key && !t.IsAbstract)
185185
.ToList();
186186
var primaryIndexes = allImplementors
@@ -223,7 +223,7 @@ private void BuildInterfaceIndexes()
223223
var filterByTypes = new List<TypeInfo>();
224224
if (!implementor.IsAbstract)
225225
filterByTypes.Add(implementor);
226-
var subHierarchyNodeCount = implementor.RecursiveDescendants.Count + filterByTypes.Count;
226+
var subHierarchyNodeCount = implementor.AllDescendants.Count + filterByTypes.Count;
227227
filterByTypes.AddRange(GatherDescendants(implementor, hierarchyImplementors));
228228
if (filterByTypes.Count != subHierarchyNodeCount)
229229
index = BuildFilterIndex(implementor, index, filterByTypes);
@@ -246,7 +246,7 @@ private void BuildInterfaceIndexes()
246246
break;
247247
}
248248
case InheritanceSchema.ConcreteTable: {
249-
var indexes = @interface.RecursiveImplementors
249+
var indexes = @interface.AllImplementors
250250
.Where(t => t.Hierarchy == grouping.Key)
251251
.Select(t => (Index: t.Indexes.Single(i => i.DeclaringIndex == localIndex.DeclaringIndex && !i.IsVirtual), Type: t))
252252
.Select(p => untypedIndexes.Contains(p.Index)
@@ -339,12 +339,12 @@ private IndexInfo BuildIndex(TypeInfo typeInfo, IndexDef indexDef, bool buildAbs
339339
if (indexDef.IsPrimary) {
340340
var typeInfoAsArray = new[] { typeInfo };
341341
var types = typeInfo.IsInterface
342-
? typeInfo.Interfaces.Union(typeInfoAsArray)
342+
? typeInfo.DirectInterfaces.Union(typeInfoAsArray)
343343
: typeInfo.Hierarchy.InheritanceSchema switch {
344-
InheritanceSchema.SingleTable => typeInfoAsArray.Concat(typeInfo.Hierarchy.Root.RecursiveDescendants.Except(typeInfoAsArray)), // Order does matter. typeInfo must be first.
345-
InheritanceSchema.ConcreteTable => typeInfo.Ancestors.Union(typeInfoAsArray),
346-
_ => typeInfoAsArray
347-
};
344+
InheritanceSchema.SingleTable => typeInfoAsArray.Concat(typeInfo.Hierarchy.Root.AllDescendants.Except(typeInfoAsArray)), // Order does matter. typeInfo must be first.
345+
InheritanceSchema.ConcreteTable => typeInfo.Ancestors.Union(typeInfoAsArray),
346+
_ => typeInfoAsArray
347+
};
348348

349349
var columns = result.IncludedColumns
350350
.Concat(types.SelectMany(t => t.Columns
@@ -359,9 +359,9 @@ private IndexInfo BuildIndex(TypeInfo typeInfo, IndexDef indexDef, bool buildAbs
359359
var orderedColumns = indexedColumns.OrderBy(el => el.j).Select(el => el.column).Distinct();
360360
result.ValueColumns.AddRange(GatherValueColumns(orderedColumns));
361361
}
362-
else
362+
else {
363363
result.ValueColumns.AddRange(GatherValueColumns(columns));
364-
364+
}
365365
}
366366
else {
367367
foreach (var column in typeInfo.Columns.Where(c => c.IsPrimaryKey)) {
@@ -690,7 +690,7 @@ private IndexInfo BuildViewIndex(TypeInfo reflectedType, IndexInfo indexToApplyV
690690
? indexToApplyView.ReflectedType.Ancestors.Append(indexToApplyView.ReflectedType)
691691
: reflectedType.Ancestors.Append(reflectedType)).ToHashSet();
692692
var interfaces = (reflectedType.IsInterface
693-
? reflectedType.RecursiveInterfaces.Append(reflectedType)
693+
? reflectedType.AllInterfaces.Append(reflectedType)
694694
: Enumerable.Empty<TypeInfo>()).ToHashSet();
695695

696696
var indexReflectedType = indexToApplyView.ReflectedType;
@@ -761,7 +761,7 @@ private IndexInfo BuildViewIndex(TypeInfo reflectedType, IndexInfo indexToApplyV
761761
#region Helper methods
762762

763763
private static IEnumerable<TypeInfo> GatherDescendants(TypeInfo type, IEnumerable<TypeInfo> hierarchyImplementors) =>
764-
type.RecursiveDescendants.Where(static t => !t.IsAbstract).Except(hierarchyImplementors);
764+
type.AllDescendants.Where(static t => !t.IsAbstract).Except(hierarchyImplementors);
765765

766766
private static IReadOnlyList<TypeInfo> NonAbstractTypeWithDescendants(TypeInfo type, IEnumerable<TypeInfo> hierarchyImplementors)
767767
{
@@ -884,7 +884,7 @@ private void ExtractAffectedIndexes(
884884
private void BuildAffectedIndexesForMaterializedInterface(TypeInfo typeInfo)
885885
{
886886
var primaryIndex = typeInfo.Indexes.PrimaryIndex;
887-
foreach (var descendant in typeInfo.RecursiveDescendants.Where(t => t.IsEntity)) {
887+
foreach (var descendant in typeInfo.AllDescendants.Where(t => t.IsEntity).Distinct()) {
888888
descendant.AffectedIndexes.Add(primaryIndex);
889889
foreach (var indexInfo in typeInfo.Indexes.Find(IndexAttributes.Primary, MatchType.None)) {
890890
var descendantIndex = descendant.Indexes.Where(i => i.DeclaringIndex == indexInfo.DeclaringIndex).FirstOrDefault();
@@ -918,7 +918,6 @@ private void ProcessAncestors(TypeInfo typeInfo, Action<TypeInfo> ancestorProces
918918

919919
private void BuildFiltersForPartialIndexes()
920920
{
921-
922921
foreach (var index in context.Model.RealIndexes.Where(index => index.FilterExpression != null))
923922
PartialIndexFilterBuilder.BuildFilter(index);
924923
}

Orm/Xtensive.Orm/Orm/Building/Builders/ModelBuilder.cs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -477,8 +477,8 @@ private void FindAndMarkInboundAndOutboundTypes(BuildingContext context)
477477
private void RegiserReferences(Dictionary<TypeInfo, int> referenceRegistrator, params TypeInfo[] typesToRegisterReferences)
478478
{
479479
foreach (var type in typesToRegisterReferences) {
480-
var typeImplementors = type.Implementors;
481-
var descendantTypes = type.RecursiveDescendants;
480+
var typeImplementors = type.DirectImplementors;
481+
var descendantTypes = type.AllDescendants;
482482
if (typeImplementors.Any())
483483
{
484484
foreach (var implementor in typeImplementors)

0 commit comments

Comments
 (0)