-
Notifications
You must be signed in to change notification settings - Fork 934
/
Copy pathDenormalizedTable.cs
113 lines (103 loc) · 2.47 KB
/
DenormalizedTable.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
using System;
using NHibernate.Util;
using System.Collections.Generic;
using System.Linq;
namespace NHibernate.Mapping
{
[Serializable]
public class DenormalizedTable : Table
{
private readonly Table includedTable;
public DenormalizedTable(Table includedTable)
{
this.includedTable = includedTable;
includedTable.SetHasDenormalizedTables();
}
public override IEnumerable<Column> ColumnIterator
{
get { return includedTable.ColumnIterator.Concat(base.ColumnIterator); }
}
public override IEnumerable<UniqueKey> UniqueKeyIterator
{
get
{
//weird implementation because of hacky behavior
//of Table.SqlCreateString() which modifies the
//list of unique keys by side-effect on some dialects
Dictionary<string, UniqueKey> uks = new Dictionary<string, UniqueKey>();
ArrayHelper.AddAll(uks, UniqueKeys);
ArrayHelper.AddAll(uks, includedTable.UniqueKeys);
return uks.Values;
}
}
public override IEnumerable<Index> IndexIterator
{
get
{
IEnumerable<Index> includedIdxs = includedTable.IndexIterator;
foreach (Index parentIndex in includedIdxs)
{
var sharedIndex = GetIndex(parentIndex.Name);
if (sharedIndex != null)
{
sharedIndex.AddColumns(parentIndex.ColumnIterator);
sharedIndex.IsInherited = true;
continue;
}
Index index = new Index();
index.Name = parentIndex.Name;
index.IsInherited = true;
index.Table = this;
index.AddColumns(parentIndex.ColumnIterator);
yield return index;
}
foreach (var index in base.IndexIterator)
{
yield return index;
}
}
}
public override void CreateForeignKeys()
{
includedTable.CreateForeignKeys();
var includedFks = includedTable.ForeignKeyIterator;
foreach (var fk in includedFks)
{
CreateForeignKey(
Constraint.GenerateName(
fk.GeneratedConstraintNamePrefix,
this,
null,
fk.Columns),
fk.Columns, fk.ReferencedEntityName);
}
}
public override Column GetColumn(Column column)
{
Column superColumn = base.GetColumn(column);
if (superColumn != null)
{
return superColumn;
}
else
{
return includedTable.GetColumn(column);
}
}
public override bool ContainsColumn(Column column)
{
return base.ContainsColumn(column) || includedTable.ContainsColumn(column);
}
public override PrimaryKey PrimaryKey
{
get
{
return includedTable.PrimaryKey;
}
set
{
base.PrimaryKey = value;
}
}
}
}