Example #1
0
        public void EventSourcingWithInlinieAggregation()
        {
            var store = TestDocumentStore.Create(optionsHandler: options =>
            {
                options.Events.AggregateStreamsInlineWith <Route>();
            });

            var routeId = CombGuidIdGeneration.New();

            using (var session = store.OpenSession())
            {
                var route = new Route(routeId);
                route.Plan(DateTime.Now.AddDays(1));
                route.AddSource(new StopName("Home"), new TimeOfDay(17, 30), new Position(51.197894m, 4.481736m));
                route.AddDestination(new StopName("WooRank"), new TimeOfDay(18, 30), new Position(50.828417m, 4.400963m));
                route.AddStop(new StopName("Filling station"), new TimeOfDay(17, 45), new Position(50.828417m, 4.400963m));
                route.Drive(new DateTime(2016, 05, 20, 17, 32, 0));

                session.Events.StartStream <Route>(route.Id, route.GetChanges());

                session.SaveChanges();
            }

            using (var session = store.OpenSession())
            {
                var route = session.Load <Route>(routeId);

                _testOutputHelper.WriteAsJson(route);
            }
        }
Example #2
0
        public void CreateAnInlineViewModelBasedOnDomainEvents()
        {
            var store = TestDocumentStore.Create();

            var streamId = CombGuidIdGeneration.NewGuid();

            using (var session = store.OpenSession())
            {
                session.Events.StartStream <Route>(streamId,
                                                   new RoutePlanned(streamId, DateTime.Now),
                                                   new StopCreated(Guid.NewGuid(), streamId, "Home", TestData.PositionHome),
                                                   new StopCreated(Guid.NewGuid(), streamId, "Visug", TestData.PositionVisug),
                                                   new StopCreated(Guid.NewGuid(), streamId, "Home", TestData.PositionHome)
                                                   );

                session.SaveChanges();
            }

            using (var session = store.OpenSession())
            {
                var events = session.Events.FetchStream(streamId);

                _testOutputHelper.WriteAsJson(events);
            }
        }
Example #3
0
        // TODO -- come back and do this with a single command!
        public void ConfigureCommand(CommandBuilder builder)
        {
            var patchJson    = _serializer.ToCleanJson(_patch);
            var patchParam   = builder.AddJsonParameter(patchJson);
            var versionParam = builder.AddParameter(CombGuidIdGeneration.NewGuid(), NpgsqlDbType.Uuid);

            builder.Append("update ");
            builder.Append(_document.Table.QualifiedName);
            builder.Append(" as d set data = ");
            builder.Append(_transform.Identifier.QualifiedName);
            builder.Append("(data, :");
            builder.Append(patchParam.ParameterName);
            builder.Append("), ");
            builder.Append(DocumentMapping.LastModifiedColumn);
            builder.Append(" = (now() at time zone 'utc'), ");
            builder.Append(DocumentMapping.VersionColumn);
            builder.Append(" = :");
            builder.Append(versionParam.ParameterName);

            if (!_fragment.Contains("where"))
            {
                builder.Append(" where ");
            }
            else
            {
                builder.Append(" ");
            }

            _fragment.Apply(builder);

            applyUpdates(builder, _fragment);
        }
Example #4
0
        public void EventSourcingShowTheEvents()
        {
            var store   = TestDocumentStore.Create();
            var routeId = CombGuidIdGeneration.New();

            using (var session = store.OpenSession())
            {
                var route = new Route(routeId);
                route.Plan(DateTime.Now.AddDays(1));
                route.AddSource(new StopName("Home"), new TimeOfDay(17, 30), new Position(51.197894m, 4.481736m));
                route.AddDestination(new StopName("WooRank"), new TimeOfDay(18, 30), new Position(50.828417m, 4.400963m));
                route.AddStop(new StopName("Filling station"), new TimeOfDay(17, 45), new Position(50.828417m, 4.400963m));
                route.Drive(new DateTime(2016, 05, 20, 17, 32, 0));

                var events = route.GetChanges();
                //_testOutputHelper.WriteAsJson(events);

                session.Events.StartStream <Route>(route.Id);
                session.Events.Append(route.Id, events);

                session.SaveChanges();
            }

            using (var session = store.OpenSession())
            {
                var eventStream = session.Events.FetchStream(routeId);

                _testOutputHelper.WriteAsJson(eventStream);
            }
        }
Example #5
0
        public Envelope CloneForSending(Envelope envelope)
        {
            if (envelope.Message == null)
            {
                throw new ArgumentNullException(nameof(envelope.Message), "Envelope.Message cannot be null");
            }

            var sending = envelope.Clone();

            sending.Id         = CombGuidIdGeneration.NewGuid();
            sending.OriginalId = envelope.Id;

            if (envelope.RequiresLocalReply)
            {
                sending.ReplyUri = envelope.ReplyUri ?? Channel.LocalReplyUri;
            }

            Channel.ApplyModifications(sending);

            sending.ContentType = envelope.ContentType ?? ContentType;

            sending.Writer      = Writer;
            sending.Destination = Destination;
            sending.Route       = this;

            return(sending);
        }
        public void When_ids_are_generated_the_first_id_should_be_less_than_the_second()
        {
            var id1 = Format(CombGuidIdGeneration.NewGuid(new DateTime(2015, 03, 31, 21, 23, 00)));
            var id2 = Format(CombGuidIdGeneration.NewGuid(new DateTime(2015, 03, 31, 21, 23, 01)));

            id1.CompareTo(id2).ShouldBe(-1);
        }
Example #7
0
        public Envelope CloneForSending(Envelope envelope)
        {
            if (envelope.Message == null && envelope.Data == null)
            {
                throw new ArgumentNullException(nameof(envelope.Message), "Envelope.Message cannot be null");
            }



            var writer = envelope.ContentType.IsEmpty()
                ? _writer
                : _writers.ChooseWriter(envelope.ContentType);

            var sending = envelope.CloneForWriter(writer);

            sending.Id            = CombGuidIdGeneration.NewGuid();
            sending.CorrelationId = envelope.Id;

            sending.ReplyUri = envelope.ReplyUri ?? _agent.ReplyUri;

            sending.ContentType = _writer.ContentType;

            sending.Destination = _agent.Destination;

            sending.Sender = _agent;

            applyEnvelopeRules(sending);

            return(sending);
        }
Example #8
0
        public EventStream AddEvents(IEnumerable <IEvent> events)
        {
            _events.AddRange(events);
            _events.Where(x => x.Id == Guid.Empty).Each(x => x.Id = CombGuidIdGeneration.NewGuid());

            return(this);
        }
Example #9
0
 public EventStream(string stream, IEvent[] events, bool isNew)
 {
     Id  = CombGuidIdGeneration.NewGuid();
     Key = stream;
     AddEvents(events);
     IsNew = isNew;
 }
Example #10
0
        public void RegisterUpdate(string tenantIdOverride, UpdateStyle updateStyle, UpdateBatch batch, object entity, string json)
        {
            var newVersion     = CombGuidIdGeneration.NewGuid();
            var currentVersion = batch.Versions.Version <T>(Identity(entity));

            ICallback           callback           = null;
            IExceptionTransform exceptionTransform = null;
            var sprocName = determineDbObjectName(updateStyle, batch);

            var tenantId = tenantIdOverride ?? batch.TenantId;

            if (_mapping.UseOptimisticConcurrency && batch.Concurrency == ConcurrencyChecks.Enabled)
            {
                callback = new OptimisticConcurrencyCallback <T>(Identity(entity), batch.Versions, newVersion,
                                                                 currentVersion);
            }

            if (!_mapping.UseOptimisticConcurrency && updateStyle == UpdateStyle.Update)
            {
                callback = new UpdateDocumentCallback <T>(Identity(entity));
            }

            if (updateStyle == UpdateStyle.Insert)
            {
                exceptionTransform = new InsertExceptionTransform <T>(Identity(entity), _mapping.Table.Name);
            }


            var call = batch.Sproc(sprocName, callback, exceptionTransform);

            _sprocWriter(call, (T)entity, batch, _mapping, currentVersion, newVersion, tenantId);
        }
Example #11
0
        public void EventSourcingWithInlineProjection()
        {
            var store = TestDocumentStore.Create(optionsHandler: options =>
            {
                options.Events.InlineProjections.Add(new RouteDetailsViewProjection());
            });

            var routeId = CombGuidIdGeneration.NewGuid();

            using (var session = store.OpenSession())
            {
                var route = new Route(routeId);
                route.Plan(DateTime.Now.AddDays(1));
                route.AddSource(new StopName("Home"), new TimeOfDay(17, 30), new Position(51.197894m, 4.481736m));
                route.AddDestination(new StopName("Visug"), new TimeOfDay(18, 30), new Position(50.828417m, 4.400963m));
                route.AddStop(new StopName("Filling station"), new TimeOfDay(17, 45), new Position(50.828417m, 4.400963m));
                route.Drive(new DateTime(2016, 05, 20, 17, 32, 0));

                var events = route.GetChanges();
                //_testOutputHelper.WriteAsJson(events);

                session.Events.StartStream <Route>(route.Id);
                session.Events.Append(route.Id, events);

                session.SaveChanges();
            }

            //load the view by route id
            using (var session = store.OpenSession())
            {
                var view = session.Load <RouteDetails>(routeId);

                _testOutputHelper.WriteAsJson(view);
            }
        }
Example #12
0
 /// <summary>
 /// Strictly for testing
 /// </summary>
 /// <typeparam name="T"></typeparam>
 /// <param name="@event"></param>
 /// <returns></returns>
 public EventStream Add <T>(T @event)
 {
     _events.Add(new Event <T>(@event)
     {
         Id = CombGuidIdGeneration.NewGuid()
     });
     return(this);
 }
        public void Can_Roundtrip_CombGuid_DateTimeOffset()
        {
            var timestamp = DateTimeOffset.UtcNow;
            var comb      = CombGuidIdGeneration.Create(Guid.NewGuid(), timestamp);
            var roundtrip = CombGuidIdGeneration.GetTimestamp(comb);

            roundtrip.ToUnixTimeMilliseconds().ShouldBe(timestamp.ToUnixTimeMilliseconds());
        }
Example #14
0
        public static Guid GenerateNewGuid(bool standardGuid)
        {
            Guid resultGuid = standardGuid
                ? Guid.NewGuid()
                : CombGuidIdGeneration.NewGuid();

            return(resultGuid);
        }
Example #15
0
 /// <summary>
 /// Strictly for testing
 /// </summary>
 /// <typeparam name="T"></typeparam>
 /// <param name="@event"></param>
 /// <returns></returns>
 public StreamAction Add <T>(T @event)
 {
     _events.Add(new Event <T>(@event)
     {
         Id        = CombGuidIdGeneration.NewGuid(),
         StreamId  = Id,
         StreamKey = Key,
     });
     return(this);
 }
Example #16
0
        public void AddParameters(IBatchCommand batch)
        {
            var patchJson    = batch.Serializer.ToCleanJson(_patch);
            var patchParam   = batch.AddParameter(patchJson, NpgsqlDbType.Jsonb);
            var versionParam = batch.AddParameter(CombGuidIdGeneration.NewGuid(), NpgsqlDbType.Uuid);

            var where = _fragment.ToSql(batch.Command);

            _sql = $@"
update {_document.Table.QualifiedName} as d 
set data = {_transform.Function.QualifiedName}(data, :{patchParam.ParameterName}), {DocumentMapping.LastModifiedColumn} = (now() at time zone 'utc'), {DocumentMapping.VersionColumn} = :{versionParam.ParameterName}
where {where}";
        }
        public void generate_lots_of_guids()
        {
            var seed = Guid.NewGuid();

            var list = new List <Guid>();

            for (int i = 0; i < 20; i++)
            {
                list.Add(CombGuidIdGeneration.Create(seed, DateTime.UtcNow));
            }

            list.OrderBy(x => x).ShouldHaveTheSameElementsAs(list);
        }
Example #18
0
        public void ConfigureCommand(CommandBuilder builder, IMartenSession session)
        {
            var patchParam = builder.AddJsonParameter(_serializer.ToCleanJson(_patch));

            if (_patch.TryGetValue("value", out var document))
            {
                var value = PossiblyPolymorhpic ? _serializer.ToJsonWithTypes(document) : _serializer.ToJson(document);
                var copy  = new Dictionary <string, object>();
                foreach (var item in _patch)
                {
                    copy.Add(item.Key, item.Value);
                }
                copy["value"] = VALUE_LOOKUP;

                var patchJson     = _serializer.ToJson(copy);
                var replacedValue = patchJson.Replace($"\"{VALUE_LOOKUP}\"", value);

                patchParam = builder.AddJsonParameter(replacedValue);
            }

            var versionParam = builder.AddParameter(CombGuidIdGeneration.NewGuid(), NpgsqlDbType.Uuid);

            builder.Append("update ");
            builder.Append(_storage.TableName.QualifiedName);
            builder.Append(" as d set data = ");
            builder.Append(_transform.Identifier.QualifiedName);
            builder.Append("(data, :");
            builder.Append(patchParam.ParameterName);
            builder.Append("), ");
            builder.Append(SchemaConstants.LastModifiedColumn);
            builder.Append(" = (now() at time zone 'utc'), ");
            builder.Append(SchemaConstants.VersionColumn);
            builder.Append(" = :");
            builder.Append(versionParam.ParameterName);

            if (!_fragment.Contains("where"))
            {
                builder.Append(" where ");
            }
            else
            {
                builder.Append(" ");
            }

            _fragment.Apply(builder);

            applyUpdates(builder, _fragment);
        }
Example #19
0
        public void Apply(CommandBuilder sql)
        {
            var version = CombGuidIdGeneration.NewGuid();

            sql.Append("update ");
            sql.Append(_mapping.Table.QualifiedName);
            sql.Append(" as d set data = ");
            sql.Append(_function.Identifier.QualifiedName);
            sql.Append("(data), ");
            sql.Append(DocumentMapping.LastModifiedColumn);
            sql.Append(" = (now() at time zone 'utc'), ");
            sql.Append(DocumentMapping.VersionColumn);
            sql.Append(" = '");
            sql.Append(version);
            sql.Append("'");
        }
Example #20
0
        private static void writeBasicSql(CommandBuilder sql, IDocumentMapping mapping, TransformFunction transform)
        {
            var version = CombGuidIdGeneration.NewGuid();

            sql.Append("update ");
            sql.Append(mapping.Table.QualifiedName);
            sql.Append(" as d set data = ");
            sql.Append(transform.Identifier.QualifiedName);
            sql.Append("(data), ");
            sql.Append(DocumentMapping.LastModifiedColumn);
            sql.Append(" = (now() at time zone 'utc'), ");
            sql.Append(DocumentMapping.VersionColumn);
            sql.Append(" = '");
            sql.Append(version);
            sql.Append("'");
        }
        public void Apply(CommandBuilder sql)
        {
            var version = CombGuidIdGeneration.NewGuid();

            sql.Append("update ");
            sql.Append(_storage.TableName.QualifiedName);
            sql.Append(" as d set data = ");
            sql.Append(_function.Identifier.QualifiedName);
            sql.Append("(data), ");
            sql.Append(SchemaConstants.LastModifiedColumn);
            sql.Append(" = (now() at time zone 'utc'), ");
            sql.Append(SchemaConstants.VersionColumn);
            sql.Append(" = '");
            sql.Append(version.ToString());
            sql.Append("'");
        }
Example #22
0
        internal StreamAction AddEvents(IReadOnlyList <IEvent> events)
        {
            // TODO -- let's get rid of this maybe?
            _events.AddRange(events);

            foreach (var @event in events)
            {
                if (@event.Id == Guid.Empty)
                {
                    @event.Id = CombGuidIdGeneration.NewGuid();
                }
                @event.StreamId  = Id;
                @event.StreamKey = Key;
            }

            return(this);
        }
Example #23
0
        public StreamAction AddEvents(IEnumerable <object> events)
        {
            // TODO -- let's get rid of this maybe?
            _events.AddRange(events.Select(coerce));

            foreach (var @event in _events)
            {
                if (@event.Id == Guid.Empty)
                {
                    @event.Id = CombGuidIdGeneration.NewGuid();
                }
                @event.StreamId  = Id;
                @event.StreamKey = Key;
            }

            return(this);
        }
Example #24
0
        public void PrepareEvents(int currentVersion, EventGraph graph, Queue <long> sequences, IMartenSession session)
        {
            var timestamp = DateTimeOffset.UtcNow;

            if (AggregateType != null)
            {
                AggregateTypeName = graph.AggregateAliasFor(AggregateType);
            }

            var i = currentVersion;

            if (currentVersion != 0)
            {
                // Guard logic for optimistic concurrency
                if (ExpectedVersionOnServer.HasValue)
                {
                    if (currentVersion != ExpectedVersionOnServer.Value)
                    {
                        throw new EventStreamUnexpectedMaxEventIdException((object)Key ?? Id, AggregateType, ExpectedVersionOnServer.Value, currentVersion);
                    }
                }

                ExpectedVersionOnServer = currentVersion;
            }



            foreach (var @event in _events)
            {
                @event.Version        = ++i;
                @event.DotNetTypeName = graph.DotnetTypeNameFor(@event.EventType);

                var mapping = graph.EventMappingFor(@event.EventType);
                @event.EventTypeName = mapping.EventTypeName;
                if (@event.Id == Guid.Empty)
                {
                    @event.Id = CombGuidIdGeneration.NewGuid();
                }
                @event.Sequence = sequences.Dequeue();
                @event.TenantId ??= session.Tenant.TenantId;
                @event.Timestamp = timestamp;
            }

            Version = Events.Last().Version;
        }
Example #25
0
        public void LoadAggregateById()
        {
            var slaveStore = TestDocumentStore.Create(ConnectionString.Slave,
                                                      optionsHandler: options =>
            {
                options.UpsertType = PostgresUpsertType.Legacy;
                options.AutoCreateSchemaObjects = AutoCreate.None;
            }, clear: false);
            var masterStore = TestDocumentStore.Create(ConnectionString.Master, optionsHandler: options => options.UpsertType = PostgresUpsertType.Legacy);

            var tempRouteId = CombGuidIdGeneration.New();
            var routeId     = CombGuidIdGeneration.New();

            using (var massWriter = new Writer(masterStore))
                using (var listenerMaster = new Listener("master", _testOutputHelper, masterStore, routeId, tempRouteId))
                    using (var listenerSlave = new Listener("slave", _testOutputHelper, slaveStore, routeId, tempRouteId))
                        using (var session = masterStore.OpenSession())
                        {
                            session.Store(new Route {
                                ID = tempRouteId
                            });
                            session.SaveChanges();

                            massWriter.Start();

                            Thread.Sleep(5000);

                            listenerSlave.Stored();
                            listenerMaster.Stored();

                            session.Store(new Route {
                                ID = routeId
                            });
                            session.SaveChanges();

                            listenerMaster.Start();
                            listenerSlave.Start();


                            _testOutputHelper.WriteLine($"Route stored");

                            Thread.Sleep(500);
                        }
        }
        public void load_non_existing_with_a_store_shoudl_return_new_added_document()
        {
            var routeId = CombGuidIdGeneration.NewGuid();

            using (var session = theStore.OpenSession())
            {
                var details = session.Load <RouteDetails>(routeId);
                details.ShouldBeNull();

                var routeDetails = new RouteDetails {
                    Id = routeId
                };
                session.Store(routeDetails);

                details = session.Load <RouteDetails>(routeId);

                details.ShouldBeTheSameAs(routeDetails);
            }
        }
Example #27
0
        public void RegisterUpdate(UpdateBatch batch, object entity, string json)
        {
            var newVersion     = CombGuidIdGeneration.NewGuid();
            var currentVersion = batch.Versions.Version <T>(Identity(entity));

            ICallback callback = null;

            if (_mapping.UseOptimisticConcurrency)
            {
                callback = new OptimisticConcurrencyCallback <T>(Identity(entity), batch.Versions, newVersion, currentVersion);
            }


            var call = batch.Sproc(_upsertName, callback);



            _sprocWriter(call, (T)entity, batch, _mapping, currentVersion, newVersion);
        }
Example #28
0
        internal bool TryCreateTombstoneBatch(DocumentSessionBase session, out UpdateBatch batch)
        {
            if (session.UnitOfWork.Streams.Any())
            {
                var stream = StreamAction.ForTombstone();

                var tombstone = new Tombstone();
                var mapping   = EventMappingFor <Tombstone>();

                var operations = new List <IStorageOperation>();
                var storage    = session.EventStorage();

                var dotNetTypeName = DotnetTypeNameFor(typeof(Tombstone));

                operations.Add(_establishTombstone.Value);
                var tombstones = session.UnitOfWork.Streams
                                 .SelectMany(x => x.Events)
                                 .Select(x => new Event <Tombstone>(tombstone)
                {
                    Sequence       = x.Sequence,
                    Version        = x.Version,
                    TenantId       = x.TenantId,
                    StreamId       = EstablishTombstoneStream.StreamId,
                    StreamKey      = EstablishTombstoneStream.StreamKey,
                    Id             = CombGuidIdGeneration.NewGuid(),
                    EventTypeName  = mapping.EventTypeName,
                    DotNetTypeName = dotNetTypeName
                })
                                 .Select(e => storage.AppendEvent(this, session, stream, e));

                operations.AddRange(tombstones);

                batch = new UpdateBatch(operations);

                return(true);
            }

            batch = null;
            return(false);
        }
Example #29
0
        public Envelope CloneForSending(Envelope envelope)
        {
            if (envelope.Message == null && envelope.Data == null)
            {
                throw new ArgumentNullException(nameof(envelope.Message), "Envelope.Message cannot be null");
            }

            var sending = envelope.Clone();

            sending.Id            = CombGuidIdGeneration.NewGuid();
            sending.CorrelationId = envelope.Id;

            sending.Data = envelope.Data;

            sending.ReplyUri = envelope.ReplyUri ?? Subscriber.ReplyUri;

            sending.ContentType = envelope.ContentType ?? ContentType;

            sending.Writer      = Writer;
            sending.Destination = Destination;
            sending.Subscriber  = Subscriber;

            return(sending);
        }
        private void GenerateAndShowNewGuid()
        {
            Guid guid = GuidMaker.GenerateNewGuid(StandardGuidRadioButton.IsChecked.IsTrue());

            GuidTextBox.Text = GuidMaker.FormatGuid(guid);

            try
            {
                DateTimeOffset dateTimeOffset = CombGuidIdGeneration.GetTimestamp(guid);

                if (dateTimeOffset.Date > new DateTime(1900, 1, 1) && dateTimeOffset.Date < new DateTime(2200, 1, 1))
                {
                    CombGuidDateLabel.Content = dateTimeOffset.DateTime.ToString("O");
                }
                else
                {
                    ShowNoCombGuid("Date of out range");
                }
            }
            catch (Exception ex)
            {
                ShowNoCombGuid(ex.Message);
            }
        }