diff --git a/GitVersion.yml b/GitVersion.yml index 9e8eaba..cc333bd 100644 --- a/GitVersion.yml +++ b/GitVersion.yml @@ -1,5 +1,5 @@ mode: ContinuousDelivery -next-version: 0.4.1 +next-version: 0.5.0 branches: master: tag: beta diff --git a/src/RdbmsEventStore.EntityFramework.Tests/EventStoreTests/ExtraMetaTests.cs b/src/RdbmsEventStore.EntityFramework.Tests/EventStoreTests/ExtraMetaTests.cs index ab799e5..f3f97d3 100644 --- a/src/RdbmsEventStore.EntityFramework.Tests/EventStoreTests/ExtraMetaTests.cs +++ b/src/RdbmsEventStore.EntityFramework.Tests/EventStoreTests/ExtraMetaTests.cs @@ -43,7 +43,7 @@ public ExtraMetaTests(ExtraMetaEventFactoryFixture fixture, AssemblyInitializerF [InlineData("stream-2", 2)] public async Task ReturnsEventsFromCorrectStreamOnly(string streamId, long expectedCount) { - var store = _fixture.BuildEventStore(_dbContext) as IEventStream; + var store = _fixture.BuildEventStore(_dbContext) as IEventStore; var events = await store.Events(streamId); Assert.Equal(expectedCount, events.Count()); } @@ -53,7 +53,7 @@ public async Task ReturnsEventsFromCorrectStreamOnly(string streamId, long expec [InlineData("stream-2", 1)] public async Task ReturnsEventsAccordingToQuery(string streamId, long expectedCount) { - var store = _fixture.BuildEventStore(_dbContext) as IEventStream; + var store = _fixture.BuildEventStore(_dbContext) as IEventStore; var events = await store.Events(streamId, es => es.Where(e => e.ExtraMeta.StartsWith("Foo"))); Assert.Equal(expectedCount, events.Count()); } @@ -63,7 +63,7 @@ public async Task ReturnsEventsAccordingToQuery(string streamId, long expectedCo [InlineData("stream-2", 1)] public async Task ReturnsEventsWithMetadata(string streamId, long expectedCount) { - var store = _fixture.BuildEventStore(_dbContext) as IEventStream; + var store = _fixture.BuildEventStore(_dbContext) as IEventStore; var events = await store.Events(streamId, es => es.Where(e => e.ExtraMeta.StartsWith("Foo"))); Assert.All(events, @event => Assert.StartsWith("Foo", @event.ExtraMeta)); } @@ -73,7 +73,7 @@ public async Task ReturnsEventsWithMetadata(string streamId, long expectedCount) [InlineData("stream-2", 1)] public async Task CanQueryByExtraMetadata(string streamId, long expectedCount) { - var store = _fixture.BuildEventStore(_dbContext) as IEventStream; + var store = _fixture.BuildEventStore(_dbContext) as IEventStore; var events = await store.Events(streamId, es => es.Where(e => e.ExtraMeta.StartsWith("Foo"))); Assert.Equal(expectedCount, events.Count()); } diff --git a/src/RdbmsEventStore.EntityFramework.Tests/EventStoreTests/QueryEventsTests.cs b/src/RdbmsEventStore.EntityFramework.Tests/EventStoreTests/QueryEventsTests.cs index 3e552d8..378151e 100644 --- a/src/RdbmsEventStore.EntityFramework.Tests/EventStoreTests/QueryEventsTests.cs +++ b/src/RdbmsEventStore.EntityFramework.Tests/EventStoreTests/QueryEventsTests.cs @@ -32,7 +32,7 @@ public QueryEventsTests(EventStoreFixture>; + var store = _fixture.BuildEventStore(_dbContext) as IEventStore>; var events = await store.Events(streamId); Assert.Equal(expectedCount, events.Count()); } @@ -42,7 +42,7 @@ public async Task ReturnsEventsFromCorrectStreamOnly(string streamId, long expec [InlineData("stream-2", 1)] public async Task ReturnsEventsAccordingToQuery(string streamId, long expectedCount) { - var store = _fixture.BuildEventStore(_dbContext) as IEventStream>; + var store = _fixture.BuildEventStore(_dbContext) as IEventStore>; var events = await store.Events(streamId, es => es.Where(e => e.Version > 1)); Assert.Equal(expectedCount, events.Count()); } @@ -50,7 +50,7 @@ public async Task ReturnsEventsAccordingToQuery(string streamId, long expectedCo [Fact] public async Task ReturnsAllEvents() { - var store = _fixture.BuildEventStore(_dbContext) as IEventStream>; + var store = _fixture.BuildEventStore(_dbContext) as IEventStore>; var events = await store.Events(); Assert.Equal(5, events.Count()); } @@ -58,7 +58,7 @@ public async Task ReturnsAllEvents() [Fact] public async Task ReturnsAllEventsAccordingToQuery() { - var store = _fixture.BuildEventStore(_dbContext) as IEventStream>; + var store = _fixture.BuildEventStore(_dbContext) as IEventStore>; var events = await store.Events(es => es.Where(e => e.Version > 1)); Assert.Equal(3, events.Count()); } diff --git a/src/RdbmsEventStore.EntityFramework.Tests/ExtensibilityTests/NonDefaultImplementationsTests.cs b/src/RdbmsEventStore.EntityFramework.Tests/ExtensibilityTests/NonDefaultImplementationsTests.cs index 686c097..b035e46 100644 --- a/src/RdbmsEventStore.EntityFramework.Tests/ExtensibilityTests/NonDefaultImplementationsTests.cs +++ b/src/RdbmsEventStore.EntityFramework.Tests/ExtensibilityTests/NonDefaultImplementationsTests.cs @@ -79,7 +79,7 @@ public async Task CanReadEventsFromStoreWithNonDefaultImplementations() }); await _dbContext.SaveChangesAsync(); - var store = _fixture.BuildEventStore(_dbContext) as IEventStream>; + var store = _fixture.BuildEventStore(_dbContext) as IEventStore>; var events = await store.Events(1); diff --git a/src/RdbmsEventStore.EntityFramework/EntityFrameworkEventStore.cs b/src/RdbmsEventStore.EntityFramework/EntityFrameworkEventStore.cs index f6fb37b..3b0c165 100644 --- a/src/RdbmsEventStore.EntityFramework/EntityFrameworkEventStore.cs +++ b/src/RdbmsEventStore.EntityFramework/EntityFrameworkEventStore.cs @@ -7,7 +7,7 @@ namespace RdbmsEventStore.EntityFramework { - public class EntityFrameworkEventStore : IEventStream + public class EntityFrameworkEventStore : IEventStore where TId : IEquatable where TStreamId : IEquatable where TContext : DbContext, IEventDbContext @@ -15,24 +15,22 @@ public class EntityFrameworkEventStore, TEventMetadata, new() where TEventMetadata : class, IEventMetadata { - private readonly TContext context; + private readonly TContext _context; private readonly IEventFactory _eventFactory; private readonly IWriteLock _writeLock; private readonly IEventSerializer _serializer; public EntityFrameworkEventStore(TContext context, IEventFactory eventFactory, IWriteLock writeLock, IEventSerializer serializer) { - this.context = context; + _context = context; _eventFactory = eventFactory; _writeLock = writeLock; _serializer = serializer; } - public Task> Events() => Events(events => events); - public async Task> Events(Func, IQueryable> query) { - var storedEvents = await context.Events + var storedEvents = await _context.Events .AsNoTracking() .Apply(query) .OrderBy(e => e.Timestamp) @@ -45,32 +43,11 @@ public async Task> Events(Func, I return events; } - public Task> Events(TStreamId streamId) => Events(streamId, events => events); - - public async Task> Events(TStreamId streamId, Func, IQueryable> query) - { - var storedEvents = await context.Events - .Where(e => e.StreamId.Equals(streamId)) - .AsNoTracking() - .Apply(query) - .OrderBy(e => e.Timestamp) - .ToListAsync(); - - var events = storedEvents - .Cast() - .Select(_serializer.Deserialize); - - return events; - } - - public Task Append(TStreamId streamId, long versionBefore, object payload) - => Append(streamId, versionBefore, new[] { payload }); - public async Task Append(TStreamId streamId, long versionBefore, IEnumerable payloads) { using (await _writeLock.Aquire(streamId)) { - var highestVersionNumber = await context.Events + var highestVersionNumber = await _context.Events .Where(e => e.StreamId.Equals(streamId)) .Select(e => e.Version) .DefaultIfEmpty(0) @@ -82,8 +59,8 @@ public async Task Append(TStreamId streamId, long versionBefore, IEnumerable Apply(this IQueryable source, Func, IQueryable> projection) => projection(source); - } -} \ No newline at end of file diff --git a/src/RdbmsEventStore/EventStoreExtensions.cs b/src/RdbmsEventStore/EventStoreExtensions.cs new file mode 100644 index 0000000..bee8aef --- /dev/null +++ b/src/RdbmsEventStore/EventStoreExtensions.cs @@ -0,0 +1,34 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Threading.Tasks; + +namespace RdbmsEventStore +{ + public static class EventStoreExtensions + { + public static Task> Events(this IEventStore store) + where TStreamId : IEquatable + where TEvent : class, TEventMetadata, IEvent + where TEventMetadata : class, IEventMetadata + => store.Events(events => events); + + public static Task> Events(this IEventStore store, TStreamId streamId) + where TStreamId : IEquatable + where TEvent : class, TEventMetadata, IEvent + where TEventMetadata : class, IEventMetadata + => store.Events(streamId, events => events); + + public static Task> Events(this IEventStore store, TStreamId streamId, Func, IQueryable> query) + where TStreamId : IEquatable + where TEvent : class, TEventMetadata, IEvent + where TEventMetadata : class, IEventMetadata + => store.Events(events => events.Where(e => e.StreamId.Equals(streamId)).Apply(query)); + + public static Task Append(this IEventStore store, TStreamId streamId, long versionBefore, object payload) + where TStreamId : IEquatable + where TEvent : class, TEventMetadata, IEvent + where TEventMetadata : class, IEventMetadata + => store.Append(streamId, versionBefore, new[] { payload }); + } +} \ No newline at end of file diff --git a/src/RdbmsEventStore/IEventStream.cs b/src/RdbmsEventStore/IEventStore.cs similarity index 54% rename from src/RdbmsEventStore/IEventStream.cs rename to src/RdbmsEventStore/IEventStore.cs index 6a61fde..ab32793 100644 --- a/src/RdbmsEventStore/IEventStream.cs +++ b/src/RdbmsEventStore/IEventStore.cs @@ -5,20 +5,13 @@ namespace RdbmsEventStore { - public interface IEventStream + public interface IEventStore + where TStreamId : IEquatable where TEvent : IEvent, TEventMetadata where TEventMetadata : IEventMetadata { - Task> Events(); - Task> Events(Func, IQueryable> query); - Task> Events(TStreamId streamId); - - Task> Events(TStreamId streamId, Func, IQueryable> query); - - Task Append(TStreamId streamId, long versionBefore, object payload); - Task Append(TStreamId streamId, long versionBefore, IEnumerable payloads); } } \ No newline at end of file diff --git a/src/RdbmsEventStore/QueryableExtensions.cs b/src/RdbmsEventStore/QueryableExtensions.cs new file mode 100644 index 0000000..445a0da --- /dev/null +++ b/src/RdbmsEventStore/QueryableExtensions.cs @@ -0,0 +1,8 @@ +// ReSharper disable once CheckNamespace +namespace System.Linq +{ + public static class QueryableExtensions + { + public static IQueryable Apply(this IQueryable source, Func, IQueryable> projection) => projection(source); + } +} \ No newline at end of file