Skip to content

Commit d0aecf2

Browse files
bahusoidhazzik
authored andcommitted
Allow columns index be shared between columns from base and subclass classes
Fixes #2099
1 parent f13368c commit d0aecf2

File tree

5 files changed

+91
-2
lines changed

5 files changed

+91
-2
lines changed
Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,26 @@
1+
using System;
2+
3+
namespace NHibernate.Test.NHSpecificTest.GH2099
4+
{
5+
abstract class PersistentObject
6+
{
7+
public virtual Guid Id { get; set; }
8+
public virtual bool PDO_Deleted { get; set; }
9+
}
10+
11+
class WorkflowInstance : PersistentObject
12+
{
13+
public virtual bool IsWaiting { get; set; }
14+
}
15+
16+
class Level3 : WorkflowInstance
17+
{
18+
public virtual bool IsActive { get; set; }
19+
}
20+
21+
class WorkflowInstance2 : PersistentObject
22+
{
23+
public virtual bool IsActive { get; set; }
24+
public virtual bool IsWaiting { get; set; }
25+
}
26+
}
Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,27 @@
1+
using System.Linq;
2+
using NUnit.Framework;
3+
4+
namespace NHibernate.Test.NHSpecificTest.GH2099
5+
{
6+
[TestFixture]
7+
public class Fixture : BugTestCase
8+
{
9+
protected override void OnSetUp()
10+
{
11+
}
12+
13+
protected override void OnTearDown()
14+
{
15+
}
16+
17+
[Test]
18+
public void BaseClassCanShareIndexNameWithSubclass()
19+
{
20+
var table = cfg.CreateMappings().IterateTables.FirstOrDefault(t => t.Name == "Level3");
21+
22+
var index = table.GetIndex("CF_BASE_IDX");
23+
Assert.That(index?.ColumnSpan, Is.EqualTo(3));
24+
Assert.That(index.ColumnIterator.FirstOrDefault(c => c.Name == "PDO_Deleted"), Is.Not.Null);
25+
}
26+
}
27+
}
Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,22 @@
1+
<?xml version="1.0" encoding="utf-8" ?>
2+
<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2" assembly="NHibernate.Test"
3+
namespace="NHibernate.Test.NHSpecificTest.GH2099">
4+
5+
<class name="PersistentObject" table="PObject" abstract="true" dynamic-update="true" lazy="true">
6+
<id name="Id" generator="guid.comb" />
7+
<property name="PDO_Deleted" column="PDO_Deleted" index="IDX_DELETED, CF_BASE_IDX" />
8+
</class>
9+
10+
<union-subclass name="WorkflowInstance" table="WInstance" abstract="false" dynamic-update="true" lazy="true" extends="PersistentObject">
11+
<property name="IsWaiting" column="IsWaiting" index="CF_BASE_IDX" />
12+
</union-subclass>
13+
14+
<union-subclass name="WorkflowInstance2" table="WInstance2" abstract="false" dynamic-update="true" lazy="true" extends="PersistentObject">
15+
<property name="IsActive" column="IsActive" index="CF_BASE_IDX" />
16+
<property name="IsWaiting" column="IsWaiting" index="CF_BASE_IDX" />
17+
</union-subclass>
18+
19+
<union-subclass name="Level3" table="Level3" abstract="false" dynamic-update="true" lazy="true" extends="WorkflowInstance">
20+
<property name="IsActive" column="IsActive" index="CF_BASE_IDX" />
21+
</union-subclass>
22+
</hibernate-mapping>

src/NHibernate/Mapping/DenormalizedTable.cs

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -43,8 +43,16 @@ public override IEnumerable<Index> IndexIterator
4343
IEnumerable<Index> includedIdxs = includedTable.IndexIterator;
4444
foreach (Index parentIndex in includedIdxs)
4545
{
46+
var sharedIndex = GetIndex(parentIndex.Name);
47+
if (sharedIndex != null)
48+
{
49+
sharedIndex.AddColumns(parentIndex.ColumnIterator);
50+
sharedIndex.IsInherited = true;
51+
continue;
52+
}
4653
Index index = new Index();
47-
index.Name = Name + parentIndex.Name;
54+
index.Name = parentIndex.Name;
55+
index.IsInherited = true;
4856
index.Table = this;
4957
index.AddColumns(parentIndex.ColumnIterator);
5058
indexes.Add(index);

src/NHibernate/Mapping/Index.cs

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -68,7 +68,8 @@ public static string BuildSqlDropIndexString(Dialect.Dialect dialect, Table tabl
6868
/// </returns>
6969
public string SqlCreateString(Dialect.Dialect dialect, IMapping p, string defaultCatalog, string defaultSchema)
7070
{
71-
return BuildSqlCreateIndexString(dialect, Name, Table, ColumnIterator, false, defaultCatalog, defaultSchema);
71+
var indexName = IsInherited ? Table.Name + Name : Name;
72+
return BuildSqlCreateIndexString(dialect, indexName, Table, ColumnIterator, false, defaultCatalog, defaultSchema);
7273
}
7374

7475
/// <summary>
@@ -144,6 +145,11 @@ public string Name
144145
set { name = value; }
145146
}
146147

148+
/// <summary>
149+
/// Is this index inherited from the base class mapping
150+
/// </summary>
151+
public bool IsInherited { get; set; }
152+
147153
public bool ContainsColumn(Column column)
148154
{
149155
return columns.Contains(column);

0 commit comments

Comments
 (0)