public DocumentProvider <T> StorageFor <T>() where T : notnull { var documentType = typeof(T); if (_storage.TryFind(documentType, out var stored)) { return(stored.As <DocumentProvider <T> >()); } if (documentType == typeof(IEvent)) { var slot = EventDocumentStorageGenerator.BuildProvider(_options); _storage = _storage.AddOrUpdate(documentType, slot); return(slot.As <DocumentProvider <T> >()); } var mapping = _options.Storage.FindMapping(documentType); switch (mapping) { case DocumentMapping m: { var builder = new DocumentPersistenceBuilder(m, _options); var slot = builder.Generate <T>(); _storage = _storage.AddOrUpdate(documentType, slot); return(slot); } case SubClassMapping s: { var loader = typeof(SubClassLoader <, ,>).CloseAndBuildAs <ISubClassLoader <T> >(mapping.Root.DocumentType, documentType, mapping.IdType); var slot = loader.BuildPersistence(this, s); _storage = _storage.AddOrUpdate(documentType, slot); return(slot); } case EventMapping em: { var storage = (IDocumentStorage <T>)em; var slot = new DocumentProvider <T> { Lightweight = storage, IdentityMap = storage, DirtyTracking = storage, QueryOnly = storage }; _storage = _storage.AddOrUpdate(documentType, slot); return(slot); } default: throw new NotSupportedException("Unable to build document persistence handlers for " + mapping.DocumentType.FullNameInCode()); } }
public void can_fetch_stream_sync(TestCase @case) { @case.Store.Advanced.Clean.CompletelyRemoveAll(); @case.StartNewStream(); using var query = @case.Store.QuerySession(); var builder = EventDocumentStorageGenerator.GenerateStorage(@case.Store.Options); var handler = builder.QueryForStream(@case.ToEventStream()); var state = query.As <QuerySession>().ExecuteHandler(handler); state.ShouldNotBeNull(); }
public async Task can_fetch_stream_async(TestCase @case) { @case.Store.Advanced.Clean.CompletelyRemoveAll(); @case.StartNewStream(new TestOutputMartenLogger(_output)); using var query = @case.Store.QuerySession(); var builder = EventDocumentStorageGenerator.GenerateStorage(@case.Store.Options); var handler = builder.QueryForStream(@case.ToEventStream()); var state = await query.As <QuerySession>().ExecuteHandlerAsync(handler, CancellationToken.None); state.ShouldNotBeNull(); }
IServiceVariableSource IGeneratesCode.AssemblyTypes(GenerationRules rules, GeneratedAssembly assembly) { rules.ApplicationNamespace = SchemaConstants.MartenGeneratedNamespace; EventDocumentStorageGenerator.AssembleTypes(Options, assembly); var projections = Options.Projections.All.OfType <IGeneratedProjection>(); foreach (var projection in projections) { projection.AssembleTypes(assembly, Options); } return(null); }
public async Task can_insert_a_new_stream(TestCase @case) { // This is just forcing the store to start the event storage @case.Store.Advanced.Clean.CompletelyRemoveAll(); @case.StartNewStream(); var stream = @case.CreateNewStream(); var builder = EventDocumentStorageGenerator.GenerateStorage(@case.Store.Options); var op = builder.InsertStream(stream); using var session = @case.Store.LightweightSession(); session.QueueOperation(op); await session.SaveChangesAsync(); }
Task IGeneratesCode.AttachPreBuiltTypes(GenerationRules rules, Assembly assembly, IServiceProvider services) { var provider = EventDocumentStorageGenerator.BuildProviderFromAssembly(assembly, Options); Options.Providers.Append(provider); var projections = Options.Projections.All.OfType <IGeneratedProjection>(); foreach (var projection in projections) { projection.AttachTypes(assembly, Options); } return(Task.CompletedTask); }
public async Task can_update_the_version_of_an_existing_stream_sad_path(TestCase @case) { @case.Store.Advanced.Clean.CompletelyRemoveAll(); var stream = @case.StartNewStream(); stream.ExpectedVersionOnServer = 3; // it's actually 4, so this should fail stream.Version = 10; var builder = EventDocumentStorageGenerator.GenerateStorage(@case.Store.Options); var op = builder.UpdateStreamVersion(stream); using var session = @case.Store.LightweightSession(); session.QueueOperation(op); await Should.ThrowAsync <EventStreamUnexpectedMaxEventIdException>(() => session.SaveChangesAsync()); }
public async Task can_update_the_version_of_an_existing_stream_happy_path(TestCase @case) { @case.Store.Advanced.Clean.CompletelyRemoveAll(); var stream = @case.StartNewStream(new TestOutputMartenLogger(_output)); stream.ExpectedVersionOnServer = 4; stream.Version = 10; var builder = EventDocumentStorageGenerator.GenerateStorage(@case.Store.Options); var op = builder.UpdateStreamVersion(stream); using var session = @case.Store.LightweightSession(); session.QueueOperation(op); session.Logger = new TestOutputMartenLogger(_output); await session.SaveChangesAsync(); var handler = builder.QueryForStream(stream); var state = session.As <QuerySession>().ExecuteHandler(handler); state.Version.ShouldBe(10); }
public void generate_operation_builder(TestCase @case) { EventDocumentStorageGenerator.GenerateStorage(@case.Store.Options) .ShouldNotBeNull(); }
void ICodeFile.AssembleTypes(GeneratedAssembly assembly) { EventDocumentStorageGenerator.AssembleTypes(Options, assembly); }