forked from nhibernate/nhibernate-core
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathGeneratedCollectionAliases.cs
133 lines (114 loc) · 4.37 KB
/
GeneratedCollectionAliases.cs
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
using System;
using System.Collections.Generic;
using NHibernate.Persister.Collection;
namespace NHibernate.Loader
{
/// <summary>
/// CollectionAliases which handles the logic of selecting user provided aliases (via return-property),
/// before using the default aliases.
/// </summary>
public class GeneratedCollectionAliases : ICollectionAliases
{
private readonly string suffix;
private readonly string[] keyAliases;
private readonly string[] indexAliases;
private readonly string[] elementAliases;
private readonly string identifierAlias;
public GeneratedCollectionAliases(IDictionary<string, string[]> userProvidedAliases, ICollectionPersister persister, string suffix)
{
this.suffix = suffix;
keyAliases = GetUserProvidedAliases(userProvidedAliases, CollectionPersister.PropKey, persister.GetKeyColumnAliases(suffix));
indexAliases = GetUserProvidedAliases(userProvidedAliases, CollectionPersister.PropIndex, persister.GetIndexColumnAliases(suffix));
// NH-1612: Add aliases for all composite element properties to support access
// to individual composite element properties in <return-property> elements.
elementAliases = persister.ElementType.IsComponentType
? GetUserProvidedCompositeElementAliases(userProvidedAliases, persister.GetElementColumnAliases(suffix))
: GetUserProvidedAliases(userProvidedAliases, CollectionPersister.PropElement, persister.GetElementColumnAliases(suffix));
identifierAlias = GetUserProvidedAlias(userProvidedAliases, CollectionPersister.PropId, persister.GetIdentifierColumnAlias(suffix));
}
public GeneratedCollectionAliases(ICollectionPersister persister, string str)
: this(null, persister, str) {}
private static string[] GetUserProvidedCompositeElementAliases(IDictionary<string, string[]> userProvidedAliases, string[] defaultAliases)
{
var aliases = new List<string>();
if (userProvidedAliases != null)
{
foreach (var userProvidedAlias in userProvidedAliases)
{
if (userProvidedAlias.Key.StartsWith(
CollectionPersister.PropElement + ".",
StringComparison.Ordinal))
{
aliases.AddRange(userProvidedAlias.Value);
}
}
}
return aliases.Count > 0 ? aliases.ToArray() : defaultAliases;
}
/// <summary>
/// Returns the suffixed result-set column-aliases for columns making up the key for this collection (i.e., its FK to
/// its owner).
/// </summary>
public string[] SuffixedKeyAliases
{
get { return keyAliases; }
}
/// <summary>
/// Returns the suffixed result-set column-aliases for the columns making up the collection's index (map or list).
/// </summary>
public string[] SuffixedIndexAliases
{
get { return indexAliases; }
}
/// <summary>
/// Returns the suffixed result-set column-aliases for the columns making up the collection's elements.
/// </summary>
public string[] SuffixedElementAliases
{
get { return elementAliases; }
}
/// <summary>
/// Returns the suffixed result-set column-aliases for the column defining the collection's identifier (if any).
/// </summary>
public string SuffixedIdentifierAlias
{
get { return identifierAlias; }
}
/// <summary>
/// Returns the suffix used to unique the column aliases for this particular alias set.
/// </summary>
public string Suffix
{
get { return suffix; }
}
public override string ToString()
{
return
string.Format(
"{0} [suffix={1}, suffixedKeyAliases=[{2}], suffixedIndexAliases=[{3}], suffixedElementAliases=[{4}], suffixedIdentifierAlias=[{5}]]",
base.ToString(), suffix, Join(keyAliases), Join(indexAliases), Join(elementAliases), identifierAlias);
}
private static string Join(string[] aliases)
{
return aliases == null
? null
: string.Join(", ", aliases);
}
private static string[] GetUserProvidedAliases(IDictionary<string, string[]> userProvidedAliases, string propertyPath, string[] defaultAliases)
{
if (userProvidedAliases != null && userProvidedAliases.TryGetValue(propertyPath, out var result))
{
return result;
}
return defaultAliases;
}
private static string GetUserProvidedAlias(IDictionary<string, string[]> userProvidedAliases, string propertyPath, string defaultAlias)
{
if (userProvidedAliases != null && userProvidedAliases.TryGetValue(propertyPath, out var columns))
{
return columns[0];
}
return defaultAlias;
}
}
}