public bool ProcessEvent(
            string partition, CheckpointTag eventPosition, string category1, ResolvedEvent data,
            out string newState, out string newSharedState, out EmittedEventEnvelope[] emittedEvents)
        {
            newSharedState = null;
            emittedEvents = null;
            newState = null;
            if (data.EventStreamId != data.PositionStreamId)
                return false;
            var indexedEventType = data.EventType;
            if (indexedEventType == "$>")
                return false;

            string positionStreamId;
            var isStreamDeletedEvent = StreamDeletedHelper.IsStreamDeletedEvent(
                data.PositionStreamId, data.EventType, data.Data, out positionStreamId);
            if (isStreamDeletedEvent)
                indexedEventType = "$deleted";

            emittedEvents = new[]
            {
                new EmittedEventEnvelope(
                    new EmittedDataEvent(
                        _indexStreamPrefix + indexedEventType, Guid.NewGuid(), "$>", false,
                        data.EventSequenceNumber + "@" + positionStreamId,
                        isStreamDeletedEvent
                            ? new ExtraMetaData(new Dictionary<string, JRaw> {{"$deleted", new JRaw(-1)}})
                            : null, eventPosition, expectedTag: null))
            };

            return true;
        }
        public bool ProcessEvent(
            string partition, CheckpointTag eventPosition, string category1, ResolvedEvent data,
            out string newState, out EmittedEventEnvelope[] emittedEvents)
        {
            emittedEvents = null;
            newState = null;
            if (data.PositionSequenceNumber != 0)
                return false; // not our event
            if (data.EventStreamId.StartsWith("$"))
                return false;
            var lastSlashPos = data.EventStreamId.LastIndexOf(_separator);
            if (lastSlashPos < 0)
                return true; // handled but not interesting to us

            var category = data.EventStreamId.Substring(0, lastSlashPos);

            emittedEvents = new[]
            {
                new EmittedEventEnvelope(
                    new EmittedDataEvent(
                        "$category" + _separator + category, Guid.NewGuid(), SystemEventTypes.StreamReference, false,
                        data.EventStreamId, null, eventPosition, expectedTag: null))
            };

            return true;
        }
        public bool ProcessEvent(
            string partition, CheckpointTag eventPosition, string category1, ResolvedEvent data,
            out string newState, out EmittedEventEnvelope[] emittedEvents)
        {
            emittedEvents = null;
            newState = null;
            if (data.PositionStreamId.StartsWith("$"))
                return false;
            var lastSlashPos = data.PositionStreamId.LastIndexOf(_separator);
            if (lastSlashPos < 0)
                return true; // handled but not interesting to us

            var category = data.PositionStreamId.Substring(0, lastSlashPos);

            string linkTarget;
            if (data.EventType == SystemEventTypes.LinkTo) 
                linkTarget = data.Data;
            else 
                linkTarget = data.EventSequenceNumber + "@" + data.EventStreamId;

            emittedEvents = new[]
            {
                new EmittedEventEnvelope(
                    new EmittedLinkToWithRecategorization(
                        _categoryStreamPrefix + category, Guid.NewGuid(), linkTarget, eventPosition, expectedTag: null,
                        originalStreamId: data.PositionStreamId))
            };

            return true;
        }
        public bool ProcessEvent(
            string partition, CheckpointTag eventPosition, string category, ResolvedEvent data, out string newState,
            out string newSharedState, out EmittedEventEnvelope[] emittedEvents)
        {
            newSharedState = null;
            if (!data.EventStreamId.StartsWith(UserStreamPrefix))
                throw new InvalidOperationException(
                    string.Format(
                        "Invalid stream name: '{0}' The IndexUsersProjectionHandler cannot handle events from other streams than named after the '$user-' pattern",
                        data.EventStreamId));

            var loginName = data.EventStreamId.Substring(UserStreamPrefix.Length);

            var userData = data.Data.ParseJson<UserData>();
            if (userData.LoginName != loginName)
                throw new InvalidOperationException(
                    string.Format(
                        "Invalid $UserCreated event found.  '{0}' login name expected, but '{1}' found", loginName,
                        userData.LoginName));

            emittedEvents = new[]
            {
                new EmittedEventEnvelope(
                    new EmittedDataEvent(
                        UsersStream, Guid.NewGuid(), UserEventType, false, loginName, null, eventPosition, null))
            };
            newState = "";
            return true;
        }
        public bool ProcessEvent(
            string partition, CheckpointTag eventPosition, string category1, ResolvedEvent data,
            out string newState, out string newSharedState, out EmittedEventEnvelope[] emittedEvents)
        {
            newSharedState = null;
            emittedEvents = null;
            newState = null;

            if (data.PositionSequenceNumber != 0)
                return false; // not our event

            var category = _streamCategoryExtractor.GetCategoryByStreamId(data.PositionStreamId);
            if (category == null)
                return true; // handled but not interesting

            emittedEvents = new[]
            {
                new EmittedEventEnvelope(
                    new EmittedDataEvent(
                        "$category" + "-" + category, Guid.NewGuid(), SystemEventTypes.StreamReference, false,
                        data.PositionStreamId, null, eventPosition, expectedTag: null))
            };

            return true;
        }
        public bool ProcessEvent(
            string partition, CheckpointTag eventPosition, string category1, ResolvedEvent data,
            out string newState, out string newSharedState, out EmittedEventEnvelope[] emittedEvents)
        {
            newSharedState = null;
            emittedEvents = null;
            newState = null;
            var category = _streamCategoryExtractor.GetCategoryByStreamId(data.PositionStreamId);
            if (category == null)
                return true; // handled but not interesting

            string linkTarget;
            if (data.EventType == SystemEventTypes.LinkTo) 
                linkTarget = data.Data;
            else 
                linkTarget = data.EventSequenceNumber + "@" + data.EventStreamId;

            emittedEvents = new[]
            {
                new EmittedEventEnvelope(
                    new EmittedLinkToWithRecategorization(
                        _categoryStreamPrefix + category, Guid.NewGuid(), linkTarget, eventPosition, expectedTag: null,
                        originalStreamId: data.PositionStreamId))
            };

            return true;
        }
예제 #7
0
 public bool ProcessEvent(
     string partition, CheckpointTag eventPosition, string category1, ResolvedEvent data,
     out string newState, out EmittedEventEnvelope[] emittedEvents)
 {
     emittedEvents = null;
     newState = null;
     return true;
 }
 public bool ProcessEvent(
     string partition, CheckpointTag eventPosition, string category1, ResolvedEvent data,
     out string newState, out EmittedEvent[] emittedEvents)
 {
     if (data.EventType == "fail" || _query == "fail")
         throw new Exception("failed");
     _logger("ProcessEvent(" + "..." + ")");
     newState = "{\"data\": " + _state + data + "}";
     emittedEvents = null;
     return true;
 }
예제 #9
0
 public bool ProcessEvent(
     string partition, CheckpointTag eventPosition, string category1, ResolvedEvent data,
     out string newState, out string newSharedState, out EmittedEventEnvelope[] emittedEvents)
 {
     newSharedState = null;
     if (data.EventType == "fail" || _query == "fail")
         throw new Exception("failed");
     Log("ProcessEvent(" + "..." + ")");
     newState = "{\"data\": 1}";
     emittedEvents = null;
     return true;
 }
        public void returns_emitted_events()
        {

            var e = new ResolvedEvent(
                "stream", 0, "stream", 0, false, new TFPos(1000, 900), Guid.NewGuid(), "event", true, "{}", "{\"m\":1}");

            EmittedEventEnvelope[] emittedEvents;
            _stateHandler.ProcessPartitionCreated(
                "partition", CheckpointTag.FromPosition(0, 10, 5), e, out emittedEvents);

            Assert.IsNotNull(emittedEvents);
            Assert.AreEqual(1, emittedEvents.Length);
            Assert.AreEqual("stream1", emittedEvents[0].Event.StreamId);
            Assert.AreEqual("event1", emittedEvents[0].Event.EventType);
            Assert.AreEqual("{\"a\":1}", emittedEvents[0].Event.Data);
        }
        protected override void Given()
        {
            base.Given();
            _streams = new[] {"pa", "pb"};
            ExistingEvent("a", "test1", "{}", "{}");
            ExistingEvent("b", "test1", "{}", "{}");

            ExistingEvent("pa", "$>", "1@a", "{$o:\"oa\"}");
            ExistingEvent("pb", "$>", "1@b", "{$o:\"ob\"}");

            _event1 = new ResolvedEvent("pa", 1, "a", 1, true, new TFPos(200, 150), Guid.NewGuid(), "test1", true, "{}", "{}", "{$o:\"oa\"");
            _event2 = new ResolvedEvent("pb", 1, "b", 1, true, new TFPos(300, 250), Guid.NewGuid(), "test1", true, "{}", "{}", "{$o:\"ob\"");

            NoOtherStreams();
            AllWritesSucceed();
        }
        public void invokes_created_handler()
        {

            var e = new ResolvedEvent(
                "stream", 0, "stream", 0, false, new TFPos(1000, 900), Guid.NewGuid(), "event", true, "{}", "{\"m\":1}");
            
            EmittedEventEnvelope[] emittedEvents;
            _stateHandler.ProcessPartitionCreated(
                "partition", CheckpointTag.FromPosition(0, 10, 5), e, out emittedEvents);

            Assert.AreEqual(5, _logged.Count);
            Assert.AreEqual(@"handler-invoked", _logged[0]);
            Assert.AreEqual(@"stream", _logged[1]);
            Assert.AreEqual(@"event", _logged[2]);
            Assert.AreEqual(@"{}", _logged[3]);
            Assert.AreEqual(@"{""m"":1}", _logged[4]);
        }
예제 #13
0
        public bool ProcessEvent(
            string partition, CheckpointTag eventPosition, string category1, ResolvedEvent data,
            out string newState, out EmittedEvent[] emittedEvents)
        {
            emittedEvents = null;
            newState = null;
            if (data.EventSequenceNumber != 0)
                return false; // not our event

            emittedEvents = new[]
                {
                    new EmittedDataEvent(
                        SystemStreams.StreamsStream, Guid.NewGuid(), SystemEventTypes.LinkTo,
                        data.EventSequenceNumber + "@" + data.EventStreamId, null, eventPosition, expectedTag: null)
                };

            return true;
        }
 public string GetStatePartition(
     CheckpointTag eventPosition, string category, ResolvedEvent @event)
 {
     CheckDisposed();
     if (@event == null) throw new ArgumentNullException("event");
     var partition = _query.GetPartition(
         @event.Data.Trim(), // trimming data passed to a JS
         new string[]
         {
             @event.EventStreamId, @event.IsJson ? "1" : "", @event.EventType, category ?? "",
             @event.EventSequenceNumber.ToString(CultureInfo.InvariantCulture), @event.Metadata ?? "",
             @event.PositionMetadata ?? ""
         });
     if (partition == "")
         return null;
     else
         return partition;
 }
        public bool ProcessEvent(
            string partition, CheckpointTag eventPosition, string category1, ResolvedEvent data,
            out string newState, out EmittedEvent[] emittedEvents)
        {
            emittedEvents = null;
            newState = null;
            if (data.EventStreamId != data.PositionStreamId)
                return false;
            if (data.EventType == "$>")
                return false;

            emittedEvents = new[]
                {
                    new EmittedDataEvent(
                        _indexStreamPrefix + data.EventType, Guid.NewGuid(), "$>",
                        data.EventSequenceNumber + "@" + data.EventStreamId, null, eventPosition, expectedTag: null)
                };

            return true;
        }
 public static CommittedEventReceived Sample(
     ResolvedEvent data, CheckpointTag checkpointTag, Guid subscriptionId, long subscriptionMessageSequenceNumber)
 {
     return new CommittedEventReceived(
         subscriptionId, checkpointTag, null, data, 77.7f, subscriptionMessageSequenceNumber, null);
 }
 public string TransformCatalogEvent(CheckpointTag eventPosition, ResolvedEvent data)
 {
     throw new NotImplementedException();
 }
예제 #18
0
 public CommittedEventDistributed(Guid correlationId, ResolvedEvent data, CheckpointTag preTagged = null)
     : this(correlationId, data, data.Position.PreparePosition, 11.1f, preTagged)
 {
 }
 public string GetStatePartition(CheckpointTag eventPosition, string category, ResolvedEvent data)
 {
     throw new NotImplementedException();
 }
 public string TransformCatalogEvent(CheckpointTag position, ResolvedEvent @event)
 {
     return(_stateHandler.TransformCatalogEvent(position, @event));
 }
 public abstract void RecordEventOrder(ResolvedEvent resolvedEvent, CheckpointTag orderCheckpointTag, Action committed);
 public bool ProcessPartitionCreated(string partition, CheckpointTag createPosition, ResolvedEvent data, out EmittedEventEnvelope[] emittedEvents)
 {
     CheckDisposed();
     _eventPosition = createPosition;
     _emittedEvents = null;
     var newStates = _query.NotifyCreated(
         data.Data.Trim(), // trimming data passed to a JS 
         new[]
         {
             data.IsJson ? "1" : "", data.EventStreamId, data.EventType, "",
             data.EventSequenceNumber.ToString(CultureInfo.InvariantCulture), data.Metadata ?? "",
             data.PositionMetadata ?? "", partition, ""
         });
     emittedEvents = _emittedEvents == null ? null : _emittedEvents.ToArray();
     return true;
 }
        public bool ProcessEvent(
            string partition, CheckpointTag eventPosition, string category, ResolvedEvent data, out string newState,
            out string newSharedState, out EmittedEventEnvelope[] emittedEvents)
        {
            CheckDisposed();
            if (data == null)
                throw new ArgumentNullException("data");
            _eventPosition = eventPosition;
            _emittedEvents = null;
            var newStates = _query.Push(
                data.Data.Trim(), // trimming data passed to a JS 
                new[]
                {
                    data.IsJson ? "1" : "", data.EventStreamId, data.EventType, category ?? "",
                    data.EventSequenceNumber.ToString(CultureInfo.InvariantCulture), data.Metadata ?? "",
                    data.PositionMetadata ?? "", partition, ""
                });
            newState = newStates.Item1;
            newSharedState = newStates.Item2;
/*            try
            {
                if (!string.IsNullOrEmpty(newState))
                {
                    var jo = newState.ParseJson<JObject>();
                }

            }
            catch (InvalidCastException)
            {
                Console.Error.WriteLine(newState);
            }
            catch (JsonException)
            {
                Console.Error.WriteLine(newState);
            }*/
            emittedEvents = _emittedEvents == null ? null : _emittedEvents.ToArray();
            return true;
        }
        public string TransformCatalogEvent(CheckpointTag eventPosition, ResolvedEvent data)
        {
            CheckDisposed();
            if (data == null) throw new ArgumentNullException("data");

            return _query.TransformCatalogEvent(
                (data.Data ?? "").Trim(), // trimming data passed to a JS 
                new[]
                {
                    data.IsJson ? "1" : "", data.EventStreamId, data.EventType ?? "", "",
                    data.EventSequenceNumber.ToString(CultureInfo.InvariantCulture), data.Metadata ?? "",
                    data.PositionMetadata ?? "", data.EventStreamId, data.StreamMetadata ?? ""
                });
        }
 public override void RecordEventOrder(
     ResolvedEvent resolvedEvent, CheckpointTag orderCheckpointTag, Action committed)
 {
     committed();
 }
 public bool ProcessPartitionCreated(string partition, CheckpointTag createPosition, ResolvedEvent data, out EmittedEventEnvelope[] emittedEvents)
 {
     emittedEvents = null;
     return(false);
 }
 private CommittedEventReceived(
     Guid subscriptionId, CheckpointTag checkpointTag, string eventCategory, ResolvedEvent data,
     float progress, long subscriptionMessageSequenceNumber, object source)
     : base(subscriptionId, checkpointTag, progress, subscriptionMessageSequenceNumber, source)
 {
     if (data == null) throw new ArgumentNullException("data");
     _data = data;
     _eventCategory = eventCategory;
 }
 private CommittedEventReceived(
     Guid subscriptionId, int phase, string eventCategory, ResolvedEvent data, float progress,
     long subscriptionMessageSequenceNumber)
     : this(
         subscriptionId,
         CheckpointTag.FromPosition(phase, data.Position.CommitPosition, data.Position.PreparePosition),
         eventCategory, data, progress, subscriptionMessageSequenceNumber, null)
 {
 }
예제 #29
0
        public static IEnumerable <object[]> GetTestCases()
        {
            var assembly = typeof(SpecRunner).Assembly;
            var specs    = assembly.GetManifestResourceNames().Where(x => x.EndsWith("-spec.json"));

            foreach (var spec in specs)
            {
                JsonDocument doc;
                using (var stream = assembly.GetManifestResourceStream(spec)) {
                    doc = JsonDocument.Parse(stream !);
                }

                var projection = doc.RootElement.GetProperty("projection").GetString();
                Assert.False(string.IsNullOrWhiteSpace(projection));
                var projectionSourceName = assembly.GetManifestResourceNames()
                                           .SingleOrDefault(x => x.EndsWith($"{projection}.js"));
                Assert.NotNull(projectionSourceName);
                string source;
                using (var stream = assembly.GetManifestResourceStream(projectionSourceName !)) {
                    Assert.NotNull(stream);
                    using (var sr = new StreamReader(stream !)) {
                        source = sr.ReadToEnd();
                    }
                }

                List <InputEventSequence> sequences = new();
                foreach (var inputEvent in doc.RootElement.GetProperty("input").EnumerateArray())
                {
                    var stream = inputEvent.GetProperty("streamId").GetString();
                    Assert.NotNull(stream);
                    var sequence = new InputEventSequence(stream !);
                    sequences.Add(sequence);
                    foreach (var e in inputEvent.GetProperty("events").EnumerateArray())
                    {
                        var et = e.GetProperty("eventType").GetString();
                        Assert.NotNull(et);
                        bool skip = false;
                        if (e.TryGetProperty("skip", out var skipElement))
                        {
                            skip = skipElement.GetBoolean();
                        }

                        var initializedPartitions = new List <string>();
                        if (e.TryGetProperty("initializedPartitions", out var partitions))
                        {
                            foreach (var element in partitions.EnumerateArray())
                            {
                                initializedPartitions.Add(element.GetString() !);
                            }
                        }
                        var expectedStates = new Dictionary <string, string?>();
                        int stateCount     = 0;
                        if (e.TryGetProperty("states", out var states))
                        {
                            foreach (var state in states.EnumerateArray())
                            {
                                stateCount++;
                                var expectedStateNode = state.GetProperty("state");
                                var expectedState     = expectedStateNode.ValueKind == JsonValueKind.Null ? null : expectedStateNode.GetRawText();
                                if (!expectedStates.TryAdd(state.GetProperty("partition").GetString() !,
                                                           expectedState))
                                {
                                    throw new InvalidOperationException("Duplicate state");
                                }
                            }
                        }
                        if (stateCount > 2)
                        {
                            throw new InvalidOperationException("Cannot specify more than 2 states");
                        }

                        sequence.Events.Add(new InputEvent(et !, e.GetProperty("data").GetRawText(), e.TryGetProperty("metadata", out var metadata) ? metadata.GetRawText() : null, initializedPartitions, expectedStates, skip, e.TryGetProperty("eventId", out var idElement) && idElement.TryGetGuid(out var id) ? id: Guid.NewGuid()));
                    }
                }

                var output = doc.RootElement.GetProperty("output");
                var sdb    = new SourceDefinitionBuilder();
                var config = output.GetProperty("config");
                foreach (var item in config.EnumerateObject())
                {
                    switch (item.Name)
                    {
                    case "definesStateTransform":
                        if (item.Value.GetBoolean())
                        {
                            sdb.SetDefinesStateTransform();
                        }
                        break;

                    case "handlesDeletedNotifications":
                        sdb.SetHandlesStreamDeletedNotifications(item.Value.GetBoolean());
                        break;

                    case "producesResults":
                        if (item.Value.GetBoolean())
                        {
                            sdb.SetOutputState();
                        }
                        break;

                    case "definesFold":
                        if (item.Value.GetBoolean())
                        {
                            sdb.SetDefinesFold();
                        }
                        break;

                    case "resultStreamName":
                        sdb.SetResultStreamNameOption(item.Value.GetString());
                        break;

                    case "partitionResultStreamNamePattern":
                        sdb.SetPartitionResultStreamNamePatternOption(item.Value.GetString());
                        break;

                    case "$includeLinks":
                        sdb.SetIncludeLinks(item.Value.GetBoolean());
                        break;

                    case "reorderEvents":
                        sdb.SetReorderEvents(item.Value.GetBoolean());
                        break;

                    case "processingLag":
                        sdb.SetProcessingLag(item.Value.GetInt32());
                        break;

                    case "biState":
                        sdb.SetIsBiState(item.Value.GetBoolean());
                        break;

                    case "categories":
                        foreach (var c in item.Value.EnumerateArray())
                        {
                            sdb.FromCategory(c.GetString());
                        }
                        break;

                    case "partitioned":
                        if (item.Value.GetBoolean())
                        {
                            sdb.SetByCustomPartitions();
                        }
                        break;

                    case "events":
                        foreach (var e in item.Value.EnumerateArray())
                        {
                            sdb.IncludeEvent(e.GetString());
                        }
                        break;

                    case "allEvents":
                        if (item.Value.GetBoolean())
                        {
                            sdb.AllEvents();
                        }
                        else
                        {
                            sdb.NotAllEvents();
                        }
                        break;

                    case "allStreams":
                        if (item.Value.GetBoolean())
                        {
                            sdb.FromAll();
                        }
                        break;

                    default:
                        throw new Exception($"unexpected property in expected config {item.Name}");
                    }
                }
#nullable disable

                List <OutputEvent> expectedEmittedEvents = new();
                if (output.TryGetProperty("emitted", out var expectedEmittedElement))
                {
                    foreach (var element in expectedEmittedElement.EnumerateObject())
                    {
                        var stream = element.Name;
                        foreach (var eventElement in element.Value.EnumerateArray())
                        {
                            if (eventElement.ValueKind == JsonValueKind.String)
                            {
                                expectedEmittedEvents.Add(
                                    new OutputEvent(stream, "$>", eventElement.GetString(), null));
                            }
                        }
                    }
                }
                JintProjectionStateHandler runner = null;
                IQuerySources definition          = null;

                IQuerySources expectedDefinition = sdb.Build();
                yield return(WithOutput($"{projection} compiles", o => {
                    runner = new JintProjectionStateHandler(source, true,
                                                            TimeSpan.FromMilliseconds(100), TimeSpan.FromMilliseconds(100));
                }));

                yield return(For($"{projection} getDefinition", () => {
                    definition = runner.GetSourceDefinition();
                }));

                yield return(For($"{projection} qs.AllStreams", () => Assert.Equal(expectedDefinition.AllStreams, definition.AllStreams)));

                yield return(For($"{projection} qs.Categories", () => Assert.Equal(expectedDefinition.Categories, definition.Categories)));

                yield return(For($"{projection} qs.Streams", () => Assert.Equal(expectedDefinition.Streams, definition.Streams)));

                yield return(For($"{projection} qs.AllEvents", () => Assert.Equal(expectedDefinition.AllEvents, definition.AllEvents)));

                yield return(For($"{projection} qs.Events", () => Assert.Equal(expectedDefinition.Events, definition.Events)));

                yield return(For($"{projection} qs.ByStreams", () => Assert.Equal(expectedDefinition.ByStreams, definition.ByStreams)));

                yield return(For($"{projection} qs.ByCustomPartitions", () => Assert.Equal(expectedDefinition.ByCustomPartitions, definition.ByCustomPartitions)));

                yield return(For($"{projection} qs.DefinesStateTransform", () => Assert.Equal(expectedDefinition.DefinesStateTransform, definition.DefinesStateTransform)));

                yield return(For($"{projection} qs.DefinesFold", () => Assert.Equal(expectedDefinition.DefinesFold, definition.DefinesFold)));

                yield return(For($"{projection} qs.HandlesDeletedNotifications", () => Assert.Equal(expectedDefinition.HandlesDeletedNotifications, definition.HandlesDeletedNotifications)));

                yield return(For($"{projection} qs.ProducesResults", () => Assert.Equal(expectedDefinition.ProducesResults, definition.ProducesResults)));

                yield return(For($"{projection} qs.IsBiState", () => Assert.Equal(expectedDefinition.IsBiState, definition.IsBiState)));

                yield return(For($"{projection} qs.IncludeLinksOption", () => Assert.Equal(expectedDefinition.IncludeLinksOption, definition.IncludeLinksOption)));

                yield return(For($"{projection} qs.ResultStreamNameOption", () => Assert.Equal(expectedDefinition.ResultStreamNameOption, definition.ResultStreamNameOption)));

                yield return(For($"{projection} qs.PartitionResultStreamNamePatternOption", () => Assert.Equal(expectedDefinition.PartitionResultStreamNamePatternOption,
                                                                                                               definition.PartitionResultStreamNamePatternOption)));

                yield return(For($"{projection} qs.ReorderEventsOption", () => Assert.Equal(expectedDefinition.ReorderEventsOption, definition.ReorderEventsOption)));

                yield return(For($"{projection} qs.ProcessingLagOption", () => Assert.Equal(expectedDefinition.ProcessingLagOption, definition.ProcessingLagOption)));

                yield return(For($"{projection} qs.LimitingCommitPosition", () => Assert.Equal(expectedDefinition.LimitingCommitPosition, definition.LimitingCommitPosition)));

                var partitionedState       = new Dictionary <string, string>();
                var sharedStateInitialized = false;
                var revision = new Dictionary <string, long>();
                List <EmittedEventEnvelope> actualEmittedEvents = new();

                for (int i = 0; i < sequences.Count; i++)
                {
                    var sequence = sequences[i];
                    if (!revision.TryGetValue(sequence.Stream, out _))
                    {
                        revision[sequence.Stream] = 0;
                    }
                    for (int j = 0; j < sequences[i].Events.Count; j++)
                    {
                        var logPosition = i * 100 + j;
                        var flags       = PrepareFlags.IsJson | PrepareFlags.Data;
                        if (j == 0)
                        {
                            flags |= PrepareFlags.TransactionBegin;
                        }
                        if (j == sequence.Events.Count - 1)
                        {
                            flags |= PrepareFlags.TransactionEnd;
                        }

                        /*Sequence:
                         * Get partition if bycustom partition or by stream
                         *      if the partition is null or an empty string skip this event (NB: need to indicate that an event should be skipped)
                         * load the state if it doesn't exist or tell the projection to init state
                         * init shared if it doesn't exist
                         * if init was state was called, call created
                         * if processing a delete, call partition deleted (NB: bistate partitions do not support deletes)
                         * process the event
                         * save any shared state if it isn't null
                         * save any state
                         * save emitted events to verify later
                         */
                        var @event   = sequence.Events[j];
                        var body     = JObject.Parse(@event.Body).ToString(Formatting.Indented);
                        var metadata = Array.Empty <byte>();
                        if (@event.Metadata != null)
                        {
                            metadata = Utf8NoBom.GetBytes(JObject.Parse(@event.Metadata).ToString(Formatting.Indented));
                        }
                        var er = new EventRecord(
                            revision[sequence.Stream], logPosition, Guid.NewGuid(), @event.EventId, i, j,
                            sequence.Stream, i, DateTime.Now, flags, @event.EventType,
                            Utf8NoBom.GetBytes(body), metadata);
                        var e = new ResolvedEvent(EventStore.Core.Data.ResolvedEvent.ForUnresolvedEvent(er, logPosition), Array.Empty <byte>());
                        if (@event.Skip)
                        {
                            yield return(For($"{projection} skips {er.EventNumber}@{sequence.Stream}",
                                             () => Assert.Null(runner.GetStatePartition(CheckpointTag.Empty, "", e))));
                        }
                        else
                        {
                            var expectedPartition = "";
                            if (expectedDefinition.DefinesFold)
                            {
                                if (@event.ExpectedStates.Any())
                                {
                                    expectedPartition = @event.ExpectedStates
                                                        .SingleOrDefault(x => string.Empty != x.Key).Key ?? string.Empty;
                                    if (expectedPartition != string.Empty)
                                    {
                                        yield return(For(
                                                         $"{projection} {er.EventNumber}@{sequence.Stream} returns expected partition",
                                                         () => Assert.Equal(expectedPartition,
                                                                            runner.GetStatePartition(CheckpointTag.Empty, "", e))));

                                        foreach (var initializedState in @event.InitializedPartitions)
                                        {
                                            yield return(For(
                                                             $"should not have already initialized \"{initializedState}\" at {er.EventNumber}@{sequence.Stream}",
                                                             () => Assert.DoesNotContain(initializedState,
                                                                                         (IReadOnlyDictionary <string, string>)partitionedState)));
                                        }
                                    }

                                    if (expectedDefinition.IsBiState && !sharedStateInitialized)
                                    {
                                        sharedStateInitialized = true;
                                        yield return(For("initializes shared state without error", () => {
                                            runner.InitializeShared();
                                        }));
                                    }

                                    if ([email protected](expectedPartition))
                                    {
                                        yield return(For(
                                                         $"can load current state at {er.EventNumber}@{sequence.Stream}",
                                                         () => {
                                            Assert.True(
                                                partitionedState.TryGetValue(expectedPartition, out var value),
                                                $"did not find expected state for partition{expectedPartition}");
                                            runner.Load(value);
                                        }));
예제 #30
0
 public string GetStatePartition(CheckpointTag eventPosition, string category, ResolvedEvent data)
 {
     _logger("GetStatePartition(" + "..." + ")");
     throw new NotImplementedException();
 }
 public string GetStatePartition(CheckpointTag eventPosition, string category, ResolvedEvent data)
 {
     _logger("GetStatePartition(" + "..." + ")");
     return @data.EventStreamId;
 }
 public abstract void RecordEventOrder(ResolvedEvent resolvedEvent, CheckpointTag orderCheckpointTag, Action committed);
 private CommittedEventReceived(
     Guid correlationId, Guid subscriptionId, EventPosition position, CheckpointTag checkpointTag,
     string positionStreamId, int positionSequenceNumber, string eventStreamId, int eventSequenceNumber,
     string eventCategory, bool resolvedLinkTo, ResolvedEvent data, float progress,
     long subscriptionMessageSequenceNumber)
     : base(subscriptionId, checkpointTag, progress, subscriptionMessageSequenceNumber)
 {
     if (data == null) throw new ArgumentNullException("data");
     _data = data;
     _position = position;
     _positionStreamId = positionStreamId;
     _positionSequenceNumber = positionSequenceNumber;
     _eventStreamId = eventStreamId;
     _eventSequenceNumber = eventSequenceNumber;
     _eventCategory = eventCategory;
     _resolvedLinkTo = resolvedLinkTo;
 }
 public string TransformCatalogEvent(CheckpointTag eventPosition, ResolvedEvent data)
 {
     throw new NotImplementedException();
 }
 private CommittedEventReceived(
     Guid correlationId, Guid subscriptionId, EventPosition position, string eventStreamId,
     int eventSequenceNumber, string eventCategory, bool resolvedLinkTo, ResolvedEvent data, float progress,
     long subscriptionMessageSequenceNumber)
     : this(
         correlationId, subscriptionId, position,
         CheckpointTag.FromPosition(position.CommitPosition, position.PreparePosition), eventStreamId,
         eventSequenceNumber, eventStreamId, eventSequenceNumber, eventCategory, resolvedLinkTo, data,
         progress, subscriptionMessageSequenceNumber)
 {
 }
 public bool ProcessPartitionCreated(string partition, CheckpointTag createPosition, ResolvedEvent data, out EmittedEventEnvelope[] emittedEvents)
 {
     emittedEvents = null;
     return false;
 }
 public static CommittedEventReceived Sample(
     Guid correlationId, Guid subscriptionId, EventPosition position, string eventStreamId,
     int eventSequenceNumber, bool resolvedLinkTo, ResolvedEvent data, long subscriptionMessageSequenceNumber)
 {
     return new CommittedEventReceived(
         correlationId, subscriptionId, position, eventStreamId, eventSequenceNumber, null, resolvedLinkTo, data, 77.7f,
         subscriptionMessageSequenceNumber);
 }
            private void DeliverEventRetrievedFromTf(EventStore.Core.Data.ResolvedEvent pair, float progress, TFPos position)
            {
                var resolvedEvent = new ResolvedEvent(pair, null);

                DeliverEvent(progress, resolvedEvent, position);
            }
 public string GetStatePartition(CheckpointTag eventPosition, string category, ResolvedEvent data)
 {
     throw new NotImplementedException();
 }