Skip to content

Commit f1f2e0f

Browse files
committed
#16 Querying on a subset of a composite-id fixed
Partly a port from Hibernate's HHH-8567
1 parent 4fd5dcf commit f1f2e0f

File tree

2 files changed

+43
-11
lines changed

2 files changed

+43
-11
lines changed

Src/NHibernate.Envers.Tests/Integration/Query/SimpleQueryTest.cs

Lines changed: 29 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@
44
using NHibernate.Criterion;
55
using NHibernate.Envers.Query;
66
using NHibernate.Envers.Tests.Entities;
7+
using NHibernate.Envers.Tests.Entities.Ids;
78
using NUnit.Framework;
89
using SharpTestsEx;
910

@@ -14,25 +15,22 @@ public class SimpleQueryTest : TestBase
1415
private int id1;
1516
private int id2;
1617
private int id3;
18+
private EmbId embId;
1719

1820
public SimpleQueryTest(AuditStrategyForTest strategyType) : base(strategyType)
1921
{
2022
}
2123

22-
protected override IEnumerable<string> Mappings
23-
{
24-
get
25-
{
26-
return new[] { "Entities.Mapping.hbm.xml" };
27-
}
28-
}
24+
protected override IEnumerable<string> Mappings =>
25+
new[] {"Entities.Mapping.hbm.xml", "Entities.Ids.Mapping.hbm.xml"};
2926

3027
protected override void Initialize()
3128
{
3229
var site1 = new StrIntTestEntity { Str = "a", Number = 10 };
3330
var site2 = new StrIntTestEntity { Str = "a", Number = 10 };
3431
var site3 = new StrIntTestEntity { Str = "b", Number = 5 };
35-
32+
embId = new EmbId{X = 3, Y = 4};
33+
3634
using (var tx = Session.BeginTransaction())
3735
{
3836
id1 = (int) Session.Save(site1);
@@ -42,6 +40,7 @@ protected override void Initialize()
4240
}
4341
using (var tx = Session.BeginTransaction())
4442
{
43+
Session.Save(new EmbIdTestEntity{Id = embId, Str1 = "something"});
4544
site1.Str = "aBc";
4645
site2.Number = 20;
4746
tx.Commit();
@@ -374,5 +373,27 @@ public void VerifyInsensitiveLikeWithMatchMode()
374373
.Single()
375374
.Should().Be.EqualTo(site1);
376375
}
376+
377+
[Test]
378+
public void VerifyIdPropertyRestriction()
379+
{
380+
var ver2 = AuditReader().CreateQuery()
381+
.ForEntitiesAtRevision<StrIntTestEntity>(2)
382+
.Add(AuditEntity.Property("Id").Eq(id2))
383+
.Single();
384+
ver2.Number.Should().Be.EqualTo(20);
385+
ver2.Str.Should().Be.EqualTo("a");
386+
}
387+
388+
[Test]
389+
public void VerifyEmbeddedIdPropertyRestriction()
390+
{
391+
var ver2 = AuditReader().CreateQuery()
392+
.ForEntitiesAtRevision<EmbIdTestEntity>(2)
393+
.Add(AuditEntity.Property("Id.X").Eq(embId.X))
394+
.Add(AuditEntity.Property("Id.Y").Eq(embId.Y))
395+
.Single();
396+
ver2.Str1.Should().Be.EqualTo("something");
397+
}
377398
}
378399
}

Src/NHibernate.Envers/Query/Criteria/CriteriaTools.cs

Lines changed: 14 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -46,12 +46,23 @@ public static string DeterminePropertyName(AuditConfiguration auditCfg, IAuditRe
4646
public static string DeterminePropertyName(AuditConfiguration auditCfg, IAuditReaderImplementor versionsReader,
4747
string entityName, string propertyName)
4848
{
49+
var sessionFactory = versionsReader.SessionImplementor.Factory;
4950
if (AuditId.IdentifierPlaceholder.Equals(propertyName))
5051
{
51-
var identifierPropertyName =
52-
versionsReader.SessionImplementor.Factory.GetEntityPersister(entityName).IdentifierPropertyName;
53-
propertyName = auditCfg.AuditEntCfg.OriginalIdPropName + "." + identifierPropertyName;
52+
var identifierPropertyName = sessionFactory.GetEntityPersister(entityName).IdentifierPropertyName;
53+
return auditCfg.AuditEntCfg.OriginalIdPropName + "." + identifierPropertyName;
5454
}
55+
56+
var idPropertyName = sessionFactory.GetEntityPersister(entityName).IdentifierPropertyName;
57+
if (propertyName.Equals(idPropertyName))
58+
{
59+
return auditCfg.AuditEntCfg.OriginalIdPropName + "." + propertyName;
60+
}
61+
if (propertyName.StartsWith(idPropertyName + "_"))
62+
{
63+
return auditCfg.AuditEntCfg.OriginalIdPropName + "." + propertyName.Substring(idPropertyName.Length + 1);
64+
}
65+
5566
return propertyName;
5667
}
5768
}

0 commit comments

Comments
 (0)