Skip to content

Commit 1caa68f

Browse files
committed
Merge branch 'release/10.1.0'
2 parents 437636b + 4b380f5 commit 1caa68f

25 files changed

Lines changed: 317 additions & 48 deletions

Changelog.md

Lines changed: 61 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,66 @@
11
# NEventStore.Persistence.Sql
22

3+
## 10.1.0
4+
5+
- Updated Microsoft.Data.SqlClient to version 6.1.1
6+
- Added indexes to optimize query performance [#38](https://github.com/NEventStore/NEventStore.Persistence.SQL/issues/38)
7+
- Bucket-scoped checkpoint scans: (BucketId, CheckpointNumber)
8+
- Per-stream operations and delete: (BucketId, StreamId)
9+
- Snapshot join/aggregation: (StreamId, StreamRevision)
10+
11+
### BugFix
12+
13+
- Fixed GetStreamsToSnapshot pagination [#54](https://github.com/NEventStore/NEventStore.Persistence.SQL/issues/54)
14+
15+
### Breaking Changes
16+
17+
The following indexes were added to the default schema (upon database initialization), add it manually to an existing database:
18+
19+
#### SqlServer
20+
21+
```sql
22+
CREATE INDEX [IX_Commits_Bucket_Checkpoint] ON [dbo].[Commits] ([BucketId], [CheckpointNumber]);
23+
CREATE INDEX [IX_Commits_Bucket_Stream] ON [dbo].[Commits] ([BucketId], [StreamId]);
24+
CREATE INDEX [IX_Commits_Bucket_Stamp] ON dbo.Commits ([BucketId], [CommitStamp]);
25+
CREATE INDEX [IX_Snapshots_Stream_Revision] ON [dbo].[Snapshots] ([StreamId], [StreamRevision]);
26+
```
27+
28+
#### MySql
29+
30+
```sql
31+
CREATE INDEX IX_Commits_Bucket_Checkpoint ON Commits (BucketId, CheckpointNumber);
32+
CREATE INDEX IX_Commits_Bucket_Stream ON Commits (BucketId, StreamId);
33+
CREATE INDEX IX_Commits_Bucket_Stamp ON Commits (BucketId, CommitStamp);
34+
CREATE INDEX IX_Snapshots_Stream_Revision ON Snapshots (StreamId, StreamRevision);
35+
```
36+
37+
#### Oracle
38+
39+
```sql
40+
CREATE INDEX IX_Commits_Bucket_Checkpoint ON Commits (BucketId, CheckpointNumber);
41+
CREATE INDEX IX_Commits_Bucket_Stream ON Commits (BucketId, StreamId);
42+
CREATE INDEX IX_Commits_Bucket_Stamp ON Commits (BucketId, CommitStamp);
43+
CREATE INDEX IX_Snapshots_Stream_Revision ON Snapshots (StreamId, StreamRevision);
44+
```
45+
46+
#### PostgreSql
47+
48+
```sql
49+
CREATE INDEX IX_Commits_Bucket_Checkpoint ON Commits (BucketId, CheckpointNumber);
50+
CREATE INDEX IX_Commits_Bucket_Stream ON Commits (BucketId, StreamId);
51+
CREATE INDEX IX_Commits_Bucket_Stamp ON Commits (BucketId, CommitStamp);
52+
CREATE INDEX IX_Snapshots_Stream_Revision ON Snapshots (StreamId, StreamRevision);
53+
```
54+
55+
#### SQLite
56+
57+
```sql
58+
CREATE INDEX IF NOT EXISTS IX_Commits_Bucket_Checkpoint ON Commits (BucketId, CheckpointNumber);
59+
CREATE INDEX IF NOT EXISTS IX_Commits_Bucket_Stream ON Commits (BucketId, StreamId);
60+
CREATE INDEX IF NOT EXISTS IX_Commits_Bucket_Stamp ON Commits (BucketId, CommitStamp);
61+
CREATE INDEX IF NOT EXISTS IX_Snapshots_Stream_Revision ON Snapshots (StreamId, StreamRevision);
62+
```
63+
364
## 10.0.0
465

566
- Async methods [#51](https://github.com/NEventStore/NEventStore.Persistence.SQL/issues/51)

appveyor.yml

Lines changed: 4 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@ version: 1.0.{build}
22
image: Visual Studio 2022
33
configuration: Release
44
init:
5-
- ps: Start-Service MySQL80, postgresql-x64-15
5+
- ps: Start-Service MySQL80, postgresql-x64-15
66
assembly_info:
77
patch: true
88
file: '**\AssemblyInfo.*'
@@ -23,11 +23,10 @@ environment:
2323
NEventStore.MySql: Server=localhost;Database=NEventStore;Uid=root;Pwd=Password12!;AutoEnlist=false;
2424
NEventStore.PostgreSql: Server=localhost;Database=NEventStore;Uid=postgres;Pwd=Password12!;Enlist=false;
2525
IGNORE_NORMALISATION_GIT_HEAD_MOVE: 1
26-
services:
27-
- mssql2017
26+
services: mssql2017
2827
install:
2928
- cmd: >-
30-
choco install gitversion.portable -pre -y
29+
choco install gitversion.portable -y
3130
3231
git submodule update --init --recursive
3332
before_build:
@@ -87,7 +86,7 @@ test_script:
8786
iex "& $pgcmd"
8887
8988
90-
nunit3-console "C:\projects\neventstore-persistence-sql\src\NEventStore.Persistence.MsSql.Tests\bin\Release\net462\NEventStore.Persistence.MsSql.Tests.dll" "C:\projects\neventstore-persistence-sql\src\NEventStore.Persistence.MySql.Tests\bin\Release\net462\NEventStore.Persistence.MySql.Tests.dll" "C:\projects\neventstore-persistence-sql\src\NEventStore.Persistence.PostgreSql.Tests\bin\Release\net462\NEventStore.Persistence.PostgreSql.Tests.dll" "C:\projects\neventstore-persistence-sql\src\NEventStore.Persistence.Sqlite.Tests\bin\Release\net462\NEventStore.Persistence.Sqlite.Tests.dll" --workers=0 --result=testsresults.xml;
89+
nunit3-console "C:\projects\neventstore-persistence-sql\src\NEventStore.Persistence.MsSql.Tests\bin\Release\net472\NEventStore.Persistence.MsSql.Tests.dll" "C:\projects\neventstore-persistence-sql\src\NEventStore.Persistence.MySql.Tests\bin\Release\net472\NEventStore.Persistence.MySql.Tests.dll" "C:\projects\neventstore-persistence-sql\src\NEventStore.Persistence.PostgreSql.Tests\bin\Release\net472\NEventStore.Persistence.PostgreSql.Tests.dll" "C:\projects\neventstore-persistence-sql\src\NEventStore.Persistence.Sqlite.Tests\bin\Release\net472\NEventStore.Persistence.Sqlite.Tests.dll" --workers=0 --result=testsresults.xml;
9190
9291
9392
# upload results to AppVeyor

docker/docker-compose.ci.linux.db.yml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@ services:
77
sqlexpress:
88
container_name: nesci-sqlexpress-1
99
platform: linux
10-
image: mcr.microsoft.com/mssql/server #@sha256:0753f9e9c614c469e1e6b98ea60b21e20abd249323c9f6a9eab476c87a8cf826
10+
image: mcr.microsoft.com/mssql/server:2022-RTM-GDR1-ubuntu-20.04
1111
mem_limit: 2000m
1212
environment:
1313
- SA_PASSWORD=Password1
Lines changed: 85 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,85 @@
1+
// These Tests have to be back ported to NEventStore core because they test the IPersistStreams interface
2+
// You can safely remove them once we update NEventStore.
3+
4+
#pragma warning disable 169 // ReSharper disable InconsistentNaming
5+
#pragma warning disable IDE1006 // Naming Styles
6+
7+
using NEventStore.Persistence.AcceptanceTests.BDD;
8+
using FluentAssertions;
9+
#if MSTEST
10+
using Microsoft.VisualStudio.TestTools.UnitTesting;
11+
#endif
12+
#if NUNIT
13+
using NUnit.Framework;
14+
#endif
15+
#if XUNIT
16+
using Xunit;
17+
using Xunit.Should;
18+
#endif
19+
20+
namespace NEventStore.Persistence.AcceptanceTests.Async
21+
{
22+
23+
/// <summary>
24+
/// <para>
25+
/// NEventStore.Persistence.Sql issue #54
26+
/// GetStreamsToSnapshot fails when number of streams exceeds PageSize.
27+
/// </para>
28+
/// <para>
29+
/// Query implementation was wrong: checking how the query and the pagination were implemented
30+
/// it was lacking to check for C.StreamId > @StreamId.
31+
/// which is needed to page through the results (similar to @Coalesce in GetCommitsFromStartingRevision)
32+
/// </para>
33+
/// </summary>
34+
#if MSTEST
35+
[TestClass]
36+
#endif
37+
public class when_getting_streams_to_snapshot_amount_exceeds_PageSize : PersistenceEngineConcernAsync
38+
{
39+
private int _moreThanPageSize;
40+
private Guid _lastStreamId;
41+
42+
protected override async Task BecauseAsync()
43+
{
44+
_moreThanPageSize = ConfiguredPageSizeForTesting + 1;
45+
var eventStore = new OptimisticEventStore(Persistence, null, null);
46+
for (int i = 0; i < _moreThanPageSize; i++)
47+
{
48+
_lastStreamId = Guid.NewGuid();
49+
using IEventStream stream = await eventStore.OpenStreamAsync(_lastStreamId).ConfigureAwait(false);
50+
stream.Add(new EventMessage { Body = new TestEvent() { S = "Hi " + i } });
51+
await stream.CommitChangesAsync(Guid.NewGuid(), CancellationToken.None).ConfigureAwait(false);
52+
stream.Add(new EventMessage { Body = new TestEvent() { S = "Hi " + i } });
53+
await stream.CommitChangesAsync(Guid.NewGuid(), CancellationToken.None).ConfigureAwait(false);
54+
stream.Add(new EventMessage { Body = new TestEvent() { S = "Hi " + i } });
55+
await stream.CommitChangesAsync(Guid.NewGuid(), CancellationToken.None).ConfigureAwait(false);
56+
}
57+
}
58+
59+
[Fact]
60+
public void GetStreamsToSnapshot_does_not_crash_and_returns_all_the_streams()
61+
{
62+
Assert.DoesNotThrowAsync(async () =>
63+
{
64+
var observer = new StreamHeadObserver();
65+
await Persistence.GetStreamsToSnapshotAsync(0, observer, CancellationToken.None).ConfigureAwait(false);
66+
observer.StreamHeads.Count.Should().Be(_moreThanPageSize);
67+
});
68+
}
69+
70+
[Fact]
71+
public void GetFrom_does_not_crash_and_returns_all_the_streams()
72+
{
73+
Assert.DoesNotThrowAsync(async () =>
74+
{
75+
var observer = new CommitStreamObserver();
76+
await Persistence.GetFromAsync(Bucket.Default, _lastStreamId.ToString(), 0, int.MaxValue, observer, CancellationToken.None).ConfigureAwait(false);
77+
observer.Commits.Count.Should().Be(3);
78+
});
79+
}
80+
}
81+
82+
}
83+
84+
#pragma warning restore 169 // ReSharper disable InconsistentNaming
85+
#pragma warning restore IDE1006 // Naming Styles
Lines changed: 83 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,83 @@
1+
// These Tests have to be back ported to NEventStore core because they test the IPersistStreams interface
2+
// You can safely remove them once we update NEventStore.
3+
4+
#pragma warning disable 169 // ReSharper disable InconsistentNaming
5+
#pragma warning disable IDE1006 // Naming Styles
6+
7+
using NEventStore.Persistence.AcceptanceTests.BDD;
8+
using FluentAssertions;
9+
#if MSTEST
10+
using Microsoft.VisualStudio.TestTools.UnitTesting;
11+
#endif
12+
#if NUNIT
13+
using NUnit.Framework;
14+
#endif
15+
#if XUNIT
16+
using Xunit;
17+
using Xunit.Should;
18+
#endif
19+
20+
namespace NEventStore.Persistence.AcceptanceTests
21+
{
22+
23+
/// <summary>
24+
/// <para>
25+
/// NEventStore.Persistence.Sql issue #54
26+
/// GetStreamsToSnapshot fails when number of streams exceeds PageSize.
27+
/// </para>
28+
/// <para>
29+
/// Query implementation was wrong: checking how the query and the pagination were implemented
30+
/// it was lacking to check for C.StreamId > @StreamId.
31+
/// which is needed to page through the results (similar to @Coalesce in GetCommitsFromStartingRevision)
32+
/// </para>
33+
/// </summary>
34+
#if MSTEST
35+
[TestClass]
36+
#endif
37+
public class when_getting_streams_to_snapshot_amount_exceeds_PageSize : PersistenceEngineConcern
38+
{
39+
private int _moreThanPageSize;
40+
private Guid _lastStreamId;
41+
42+
protected override void Because()
43+
{
44+
_moreThanPageSize = ConfiguredPageSizeForTesting + 1;
45+
var eventStore = new OptimisticEventStore(Persistence, null, null);
46+
for (int i = 0; i < _moreThanPageSize; i++)
47+
{
48+
_lastStreamId = Guid.NewGuid();
49+
using IEventStream stream = eventStore.OpenStream(_lastStreamId);
50+
stream.Add(new EventMessage { Body = new TestEvent() { S = "Hi " + i } });
51+
stream.CommitChanges(Guid.NewGuid());
52+
stream.Add(new EventMessage { Body = new TestEvent() { S = "Hi " + i } });
53+
stream.CommitChanges(Guid.NewGuid());
54+
stream.Add(new EventMessage { Body = new TestEvent() { S = "Hi " + i } });
55+
stream.CommitChanges(Guid.NewGuid());
56+
}
57+
}
58+
59+
[Fact]
60+
public void GetStreamsToSnapshot_does_not_crash_and_returns_all_the_streams()
61+
{
62+
Assert.DoesNotThrow(() =>
63+
{
64+
var streamHeads = Persistence.GetStreamsToSnapshot(0).ToArray();
65+
streamHeads.Length.Should().Be(_moreThanPageSize);
66+
});
67+
}
68+
69+
[Fact]
70+
public void GetFrom_does_not_crash_and_returns_all_the_streams()
71+
{
72+
Assert.DoesNotThrow(() =>
73+
{
74+
var streamHeads = Persistence.GetFrom(Bucket.Default, _lastStreamId.ToString(), 0, int.MaxValue).ToArray();
75+
streamHeads.Length.Should().Be(3);
76+
});
77+
}
78+
}
79+
80+
}
81+
82+
#pragma warning restore 169 // ReSharper disable InconsistentNaming
83+
#pragma warning restore IDE1006 // Naming Styles

src/NEventStore.Persistence.MsSql.Tests/NEventStore.Persistence.MsSql.Core.Tests.csproj

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -14,16 +14,16 @@
1414
</PropertyGroup>
1515

1616
<ItemGroup>
17-
<PackageReference Include="Microsoft.Data.SqlClient" Version="5.2.2" />
17+
<PackageReference Include="Microsoft.Data.SqlClient" Version="6.1.1" />
1818
</ItemGroup>
1919
<ItemGroup Condition="'$(TargetFramework)' == 'net472'">
2020
<Reference Include="System.Transactions" />
2121
</ItemGroup>
2222
<ItemGroup>
2323
<PackageReference Include="FluentAssertions" Version="7.0.0" />
24-
<PackageReference Include="Microsoft.NET.Test.Sdk" Version="17.12.0" />
25-
<PackageReference Include="NUnit" Version="4.3.2" />
26-
<PackageReference Include="NUnit3TestAdapter" Version="4.6.0" />
24+
<PackageReference Include="Microsoft.NET.Test.Sdk" Version="17.14.1" />
25+
<PackageReference Include="NUnit" Version="4.4.0" />
26+
<PackageReference Include="NUnit3TestAdapter" Version="5.1.0" />
2727
</ItemGroup>
2828

2929
<ItemGroup>
@@ -45,6 +45,8 @@
4545
<ItemGroup>
4646
<Compile Include="..\..\dependencies\NEventStore\src\NEventStore.Persistence.AcceptanceTests\PersistenceTests.cs" Link="PersistenceTests.cs" />
4747
<Compile Include="..\..\dependencies\NEventStore\src\NEventStore.Persistence.AcceptanceTests\PersistenceTests.Async.cs" Link="PersistenceTests.Async.cs" />
48+
<Compile Include="..\AdditionalTests\AdditionalPersistenceTests.Async.cs" Link="AdditionalPersistenceTests.Async.cs" />
49+
<Compile Include="..\AdditionalTests\AdditionalPersistenceTests.cs" Link="AdditionalPersistenceTests.cs" />
4850
<Compile Include="..\NEventStore.Persistence.Sql.Tests\PersistenceTests.Transactions.cs" Link="PersistenceTests.Transactions.cs" />
4951
<Compile Include="..\NEventStore.Persistence.Sql.Tests\PersistenceTests.Transactions.Async.cs" Link="PersistenceTests.Transactions.Async.cs" />
5052
</ItemGroup>

src/NEventStore.Persistence.MySql.Tests/NEventStore.Persistence.MySql.Core.Tests.csproj

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -14,17 +14,17 @@
1414
</PropertyGroup>
1515

1616
<ItemGroup>
17-
<PackageReference Include="MySql.Data" Version="8.1.0" />
17+
<PackageReference Include="MySql.Data" Version="9.4.0" />
1818
</ItemGroup>
1919
<ItemGroup Condition="'$(TargetFramework)' == 'net472'">
2020
<Reference Include="System.Data" />
2121
<Reference Include="System.Transactions" />
2222
</ItemGroup>
2323
<ItemGroup>
2424
<PackageReference Include="FluentAssertions" Version="7.0.0" />
25-
<PackageReference Include="Microsoft.NET.Test.Sdk" Version="17.12.0" />
26-
<PackageReference Include="NUnit" Version="4.3.2" />
27-
<PackageReference Include="NUnit3TestAdapter" Version="4.6.0" />
25+
<PackageReference Include="Microsoft.NET.Test.Sdk" Version="17.14.1" />
26+
<PackageReference Include="NUnit" Version="4.4.0" />
27+
<PackageReference Include="NUnit3TestAdapter" Version="5.1.0" />
2828
</ItemGroup>
2929

3030
<ItemGroup>
@@ -46,6 +46,8 @@
4646
<ItemGroup>
4747
<Compile Include="..\..\dependencies\NEventStore\src\NEventStore.Persistence.AcceptanceTests\PersistenceTests.cs" Link="PersistenceTests.cs" />
4848
<Compile Include="..\..\dependencies\NEventStore\src\NEventStore.Persistence.AcceptanceTests\PersistenceTests.Async.cs" Link="PersistenceTests.Async.cs" />
49+
<Compile Include="..\AdditionalTests\AdditionalPersistenceTests.Async.cs" Link="AdditionalPersistenceTests.Async.cs" />
50+
<Compile Include="..\AdditionalTests\AdditionalPersistenceTests.cs" Link="AdditionalPersistenceTests.cs" />
4951
</ItemGroup>
5052

5153
<ItemGroup>

src/NEventStore.Persistence.PostgreSql.Tests/NEventStore.Persistence.PostgreSql.Core.Tests.csproj

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -17,11 +17,11 @@
1717
<Reference Include="System.Transactions" />
1818
</ItemGroup>
1919
<ItemGroup>
20-
<PackageReference Include="Npgsql" Version="7.0.4" />
20+
<PackageReference Include="Npgsql" Version="8.0.7" />
2121
<PackageReference Include="FluentAssertions" Version="7.0.0" />
22-
<PackageReference Include="Microsoft.NET.Test.Sdk" Version="17.12.0" />
23-
<PackageReference Include="NUnit" Version="4.3.2" />
24-
<PackageReference Include="NUnit3TestAdapter" Version="4.6.0" />
22+
<PackageReference Include="Microsoft.NET.Test.Sdk" Version="17.14.1" />
23+
<PackageReference Include="NUnit" Version="4.4.0" />
24+
<PackageReference Include="NUnit3TestAdapter" Version="5.1.0" />
2525
</ItemGroup>
2626

2727
<ItemGroup>
@@ -43,6 +43,8 @@
4343
<ItemGroup>
4444
<Compile Include="..\..\dependencies\NEventStore\src\NEventStore.Persistence.AcceptanceTests\PersistenceTests.cs" Link="PersistenceTests.cs" />
4545
<Compile Include="..\..\dependencies\NEventStore\src\NEventStore.Persistence.AcceptanceTests\PersistenceTests.Async.cs" Link="PersistenceTests.Async.cs" />
46+
<Compile Include="..\AdditionalTests\AdditionalPersistenceTests.Async.cs" Link="AdditionalPersistenceTests.Async.cs" />
47+
<Compile Include="..\AdditionalTests\AdditionalPersistenceTests.cs" Link="AdditionalPersistenceTests.cs" />
4648
</ItemGroup>
4749

4850
<ItemGroup>

src/NEventStore.Persistence.Sql.Core.sln

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11

22
Microsoft Visual Studio Solution File, Format Version 12.00
3-
# Visual Studio Version 17
4-
VisualStudioVersion = 17.1.31911.260
3+
# Visual Studio Version 18
4+
VisualStudioVersion = 18.0.11018.127 d18.0
55
MinimumVisualStudioVersion = 10.0.40219.1
66
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "NEventStore.Core", "..\dependencies\NEventStore\src\NEventStore\NEventStore.Core.csproj", "{6F7B51D5-C6F0-4D10-BCCD-E813F005BF21}"
77
EndProject
@@ -49,6 +49,12 @@ Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "docker", "docker", "{C68C81
4949
EndProject
5050
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "NEventStore.Serialization.Binary.Core", "..\dependencies\NEventStore\src\NEventStore.Serialization.Binary\NEventStore.Serialization.Binary.Core.csproj", "{F61C5A0D-19AA-A699-E2E6-6707B9455C12}"
5151
EndProject
52+
Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "AdditionalTests", "AdditionalTests", "{366DF2AF-DFC5-44B9-9687-8958B5B30C1F}"
53+
ProjectSection(SolutionItems) = preProject
54+
AdditionalTests\AdditionalPersistenceTests.Async.cs = AdditionalTests\AdditionalPersistenceTests.Async.cs
55+
AdditionalTests\AdditionalPersistenceTests.cs = AdditionalTests\AdditionalPersistenceTests.cs
56+
EndProjectSection
57+
EndProject
5258
Global
5359
GlobalSection(SolutionConfigurationPlatforms) = preSolution
5460
Debug|Any CPU = Debug|Any CPU

src/NEventStore.Persistence.Sql/NEventStore.Persistence.Sql.Core.csproj

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -33,7 +33,7 @@
3333
</PropertyGroup>
3434

3535
<ItemGroup>
36-
<PackageReference Include="Microsoft.Data.SqlClient" Version="5.2.2" />
36+
<PackageReference Include="Microsoft.Data.SqlClient" Version="6.1.1" />
3737
<PackageReference Include="Microsoft.SourceLink.GitHub" Version="8.0.0">
3838
<PrivateAssets>all</PrivateAssets>
3939
<IncludeAssets>runtime; build; native; contentfiles; analyzers; buildtransitive</IncludeAssets>

0 commit comments

Comments
 (0)