forked from nhibernate/nhibernate-core
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathDefaultEntityAliases.cs
143 lines (116 loc) · 4.06 KB
/
DefaultEntityAliases.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
134
135
136
137
138
139
140
141
142
143
using System.Collections.Generic;
using NHibernate.Persister.Entity;
namespace NHibernate.Loader
{
/// <summary>
/// EntityAliases which handles the logic of selecting user provided aliases (via return-property),
/// before using the default aliases.
/// </summary>
public class DefaultEntityAliases : IEntityAliases
{
private readonly string _suffix;
private readonly IDictionary<string, string[]> _userProvidedAliases;
private string _rowIdAlias;
public DefaultEntityAliases(ILoadable persister, string suffix)
: this(null, persister, suffix)
{
}
/// <summary>
/// Calculate and cache select-clause aliases.
/// </summary>
public DefaultEntityAliases(IDictionary<string, string[]> userProvidedAliases, ILoadable persister, string suffix)
{
_suffix = suffix;
_userProvidedAliases = userProvidedAliases?.Count > 0 ? userProvidedAliases : null;
SuffixedKeyAliases = DetermineKeyAliases(persister);
SuffixedPropertyAliases = DeterminePropertyAliases(persister);
SuffixedDiscriminatorAlias = DetermineDiscriminatorAlias(persister);
SuffixedVersionAliases = persister.IsVersioned ? SuffixedPropertyAliases[persister.VersionProperty] : null;
//rowIdAlias is generated on demand in property
}
/// <summary>
/// Returns aliases for subclass persister
/// </summary>
public string[][] GetSuffixedPropertyAliases(ILoadable persister)
{
if (_userProvidedAliases == null)
return GetAllPropertyAliases(persister);
var propertyNames = persister.PropertyNames;
var suffixedPropertyAliases = new string[propertyNames.Length][];
for (var i = 0; i < propertyNames.Length; i++)
{
suffixedPropertyAliases[i] =
SafeGetUserProvidedAliases(propertyNames[i]) ??
GetPropertyAliases(persister, i);
}
return suffixedPropertyAliases;
}
public string[] SuffixedVersionAliases { get; }
public string[][] SuffixedPropertyAliases { get; }
public string SuffixedDiscriminatorAlias { get; }
public string[] SuffixedKeyAliases { get; }
// TODO: not visible to the user!
public string RowIdAlias => _rowIdAlias ?? (_rowIdAlias = Loadable.RowIdAlias + _suffix);
/// <summary>
/// Returns default aliases for all the properties
/// </summary>
private string[][] GetAllPropertyAliases(ILoadable persister)
{
var propertyNames = persister.PropertyNames;
var suffixedPropertyAliases = new string[propertyNames.Length][];
for (var i = 0; i < propertyNames.Length; i++)
{
suffixedPropertyAliases[i] = GetPropertyAliases(persister, i);
}
return suffixedPropertyAliases;
}
protected virtual string GetDiscriminatorAlias(ILoadable persister, string suffix)
{
return persister.GetDiscriminatorAlias(suffix);
}
protected virtual string[] GetIdentifierAliases(ILoadable persister, string suffix)
{
return persister.GetIdentifierAliases(suffix);
}
protected virtual string[] GetPropertyAliases(ILoadable persister, int j)
{
return persister.GetPropertyAliases(_suffix, j);
}
private string[] DetermineKeyAliases(ILoadable persister)
{
if (_userProvidedAliases != null)
{
var result = SafeGetUserProvidedAliases(persister.IdentifierPropertyName) ??
GetUserProvidedAliases(EntityPersister.EntityID);
if (result != null)
return result;
}
return GetIdentifierAliases(persister, _suffix);
}
private string[][] DeterminePropertyAliases(ILoadable persister)
{
return GetSuffixedPropertyAliases(persister);
}
private string DetermineDiscriminatorAlias(ILoadable persister)
{
if (_userProvidedAliases != null)
{
var columns = GetUserProvidedAliases(AbstractEntityPersister.EntityClass);
if (columns != null)
return columns[0];
}
return GetDiscriminatorAlias(persister, _suffix);
}
private string[] SafeGetUserProvidedAliases(string propertyPath)
{
if (propertyPath == null)
return null;
return GetUserProvidedAliases(propertyPath);
}
private string[] GetUserProvidedAliases(string propertyPath)
{
_userProvidedAliases.TryGetValue(propertyPath, out var result);
return result;
}
}
}