Skip to content

Commit ae4aed2

Browse files
authored
Optimize PersistentGenericBag.EqualsSnapshot (#2399)
1 parent da4b6c9 commit ae4aed2

File tree

3 files changed

+104
-8
lines changed

3 files changed

+104
-8
lines changed

src/NHibernate.Test/Async/GenericTest/BagGeneric/BagGenericFixture.cs

Lines changed: 49 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -8,14 +8,16 @@
88
//------------------------------------------------------------------------------
99

1010

11-
using System;
1211
using System.Collections.Generic;
13-
using System.Text;
12+
using System.Linq;
13+
using NHibernate.Collection;
14+
using NHibernate.Util;
1415
using NUnit.Framework;
1516

1617
namespace NHibernate.Test.GenericTest.BagGeneric
1718
{
1819
using System.Threading.Tasks;
20+
using System.Threading;
1921
[TestFixture]
2022
public class BagGenericFixtureAsync : TestCase
2123
{
@@ -74,6 +76,51 @@ public async Task SimpleAsync()
7476
s.Close();
7577
}
7678

79+
[Test]
80+
public async Task EqualsSnapshotAsync()
81+
{
82+
var a = new A {Name = "first generic type"};
83+
var i0 = new B {Name = "1"};
84+
var i4 = new B {Name = "4"};
85+
a.Items = new List<B>
86+
{
87+
i0,
88+
i0,
89+
new B {Name = "2"},
90+
new B {Name = "3"},
91+
i4,
92+
i4,
93+
};
94+
var lastIdx = a.Items.Count - 1;
95+
using (var s = OpenSession())
96+
{
97+
await (s.SaveAsync(a));
98+
await (s.FlushAsync());
99+
var collection = (IPersistentCollection) a.Items;
100+
var collectionPersister = Sfi.GetCollectionPersister(collection.Role);
101+
102+
a.Items[0] = i4;
103+
Assert.Multiple(
104+
async () =>
105+
{
106+
Assert.That(await (collection.EqualsSnapshotAsync(collectionPersister, CancellationToken.None)), Is.False, "modify first collection element");
107+
108+
a.Items[lastIdx] = i0;
109+
Assert.That(await (collection.EqualsSnapshotAsync(collectionPersister, CancellationToken.None)), Is.True, "swap elements in collection");
110+
111+
a.Items[0] = i0;
112+
a.Items[lastIdx] = i0;
113+
Assert.That(await (collection.EqualsSnapshotAsync(collectionPersister, CancellationToken.None)), Is.False, "modify last collection element");
114+
115+
a.Items[lastIdx] = i4;
116+
var reversed = a.Items.Reverse().ToArray();
117+
a.Items.Clear();
118+
ArrayHelper.AddAll(a.Items, reversed);
119+
Assert.That(await (collection.EqualsSnapshotAsync(collectionPersister, CancellationToken.None)), Is.True, "reverse collection elements");
120+
});
121+
}
122+
}
123+
77124
[Test]
78125
public async Task CopyAsync()
79126
{

src/NHibernate.Test/GenericTest/BagGeneric/BagGenericFixture.cs

Lines changed: 48 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
1-
using System;
21
using System.Collections.Generic;
3-
using System.Text;
2+
using System.Linq;
3+
using NHibernate.Collection;
4+
using NHibernate.Util;
45
using NUnit.Framework;
56

67
namespace NHibernate.Test.GenericTest.BagGeneric
@@ -63,6 +64,51 @@ public void Simple()
6364
s.Close();
6465
}
6566

67+
[Test]
68+
public void EqualsSnapshot()
69+
{
70+
var a = new A {Name = "first generic type"};
71+
var i0 = new B {Name = "1"};
72+
var i4 = new B {Name = "4"};
73+
a.Items = new List<B>
74+
{
75+
i0,
76+
i0,
77+
new B {Name = "2"},
78+
new B {Name = "3"},
79+
i4,
80+
i4,
81+
};
82+
var lastIdx = a.Items.Count - 1;
83+
using (var s = OpenSession())
84+
{
85+
s.Save(a);
86+
s.Flush();
87+
var collection = (IPersistentCollection) a.Items;
88+
var collectionPersister = Sfi.GetCollectionPersister(collection.Role);
89+
90+
a.Items[0] = i4;
91+
Assert.Multiple(
92+
() =>
93+
{
94+
Assert.That(collection.EqualsSnapshot(collectionPersister), Is.False, "modify first collection element");
95+
96+
a.Items[lastIdx] = i0;
97+
Assert.That(collection.EqualsSnapshot(collectionPersister), Is.True, "swap elements in collection");
98+
99+
a.Items[0] = i0;
100+
a.Items[lastIdx] = i0;
101+
Assert.That(collection.EqualsSnapshot(collectionPersister), Is.False, "modify last collection element");
102+
103+
a.Items[lastIdx] = i4;
104+
var reversed = a.Items.Reverse().ToArray();
105+
a.Items.Clear();
106+
ArrayHelper.AddAll(a.Items, reversed);
107+
Assert.That(collection.EqualsSnapshot(collectionPersister), Is.True, "reverse collection elements");
108+
});
109+
}
110+
}
111+
66112
[Test]
67113
public void Copy()
68114
{

src/NHibernate/Collection/Generic/PersistentGenericBag.cs

Lines changed: 7 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -295,12 +295,15 @@ public override bool EqualsSnapshot(ICollectionPersister persister)
295295
return false;
296296
}
297297

298-
foreach (var elt in _gbag)
298+
for (var i = 0; i < _gbag.Count; i++)
299299
{
300-
if (CountOccurrences(elt, _gbag, elementType) != CountOccurrences(elt, sn, elementType))
301-
{
300+
if (elementType.IsSame(_gbag[i], sn[i]))
301+
continue;
302+
303+
var elt = _gbag[i];
304+
var countInSnapshot = CountOccurrences(elt, sn, elementType);
305+
if (countInSnapshot == 0 || CountOccurrences(elt, _gbag, elementType) != countInSnapshot)
302306
return false;
303-
}
304307
}
305308

306309
return true;

0 commit comments

Comments
 (0)