Example #1
0
        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();
        }
Example #4
0
        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);
 }