public async Task <TimeSpan?> Age(string channel)
        {
            var streamName = $"DELAY.{Assembly.GetEntryAssembly().FullName}.{channel}";

            Logger.Write(LogLevel.Debug, () => $"Getting age of delayed channel [{channel}]");

            var read = await _store.GetEventsBackwards($"{streamName}.SNAP", StreamPosition.End, 1).ConfigureAwait(false);

            if (read != null && read.Any())
            {
                var snapshot = read.Single().Event as Snapshot;
                return(DateTime.UtcNow - snapshot.Created);
            }
            return(null);
        }
示例#2
0
        public async Task <Tuple <long, T> > Get <T>(string bucket, Id streamId, Id[] parents) where T : class
        {
            var streamName = _streamGen(typeof(T), StreamTypes.Poco, bucket, streamId, parents);

            Logger.DebugEvent("Get", "[{Stream:l}] bucket [{Bucket:l}]", streamName);

            if (_shouldCache)
            {
                var cached = _cache.Retreive(streamName) as Tuple <long, T>;
                if (cached != null)
                {
                    Logger.DebugEvent("Cached", "[{Stream:l}] version {Version}", streamName, cached.Item1);
                    return(new Tuple <long, T>(cached.Item1,
                                               // An easy way to make a deep copy
                                               _serializer.Deserialize <T>(_serializer.Serialize(cached.Item2))));
                }
            }

            var read = await _store.GetEventsBackwards(streamName, StreamPosition.End, 1).ConfigureAwait(false);

            if (read == null || !read.Any())
            {
                return(null);
            }

            var @event = read.Single();

            if (_shouldCache)
            {
                _cache.Cache(streamName, @event.Event);
            }
            return(new Tuple <long, T>(@event.Descriptor.Version, @event.Event as T));
        }
示例#3
0
        public async Task <T> Get <T>(string bucket, string stream) where T : class
        {
            var streamName = _streamGen(typeof(T), StreamTypes.Poco, bucket, stream);

            Logger.Write(LogLevel.Debug, () => $"Getting stream [{streamName}]");

            if (_shouldCache)
            {
                var cached = _cache.Retreive(streamName) as T;
                if (cached != null)
                {
                    HitMeter.Mark();
                    Logger.Write(LogLevel.Debug, () => $"Found poco [{stream}] bucket [{bucket}] in cache");
                    // An easy way to make a deep copy
                    return(JsonConvert.DeserializeObject <T>(JsonConvert.SerializeObject(cached)));
                }
                MissMeter.Mark();
            }

            var read = await _store.GetEventsBackwards(streamName, StreamPosition.End, 1).ConfigureAwait(false);

            if (read == null || !read.Any())
            {
                return(null);
            }

            var @event = read.Single();

            if (_shouldCache)
            {
                _cache.Cache(streamName, @event.Event);
            }
            return(@event.Event as T);
        }
示例#4
0
        public async Task <Tuple <long, T> > Get <T>(string bucket, Id streamId, IEnumerable <Id> parents) where T : class
        {
            var streamName = _streamGen(typeof(T), StreamTypes.Poco, bucket, streamId, parents);

            Logger.Write(LogLevel.Debug, () => $"Getting poco stream [{streamName}]");

            if (_shouldCache)
            {
                var cached = _cache.Retreive(streamName) as Tuple <long, T>;
                if (cached != null)
                {
                    HitMeter.Mark();
                    Logger.Write(LogLevel.Debug, () => $"Found poco [{streamId}] bucket [{bucket}] version {cached.Item1} in cache");
                    return(new Tuple <long, T>(cached.Item1,
                                               // An easy way to make a deep copy
                                               JsonConvert.DeserializeObject <T>(JsonConvert.SerializeObject(cached.Item2))));
                }
                MissMeter.Mark();
            }

            var read = await _store.GetEventsBackwards(streamName, StreamPosition.End, 1).ConfigureAwait(false);

            if (read == null || !read.Any())
            {
                return(null);
            }

            var @event = read.Single();

            if (_shouldCache)
            {
                _cache.Cache(streamName, @event.Event);
            }
            return(new Tuple <long, T>(@event.Descriptor.Version, @event.Event as T));
        }
示例#5
0
        public async Task <IEnumerable <IFullEvent> > GetEventsBackwards <T>(IEventStream stream, long start, int count, string oob = null) where T : class, IEventSource
        {
            if (string.IsNullOrEmpty(oob))
            {
                var streamName = _streamGen(typeof(T), StreamTypes.Domain, stream.Bucket, stream.StreamId, stream.Parents);
                return(await _store.GetEventsBackwards(streamName, start : start, count : count).ConfigureAwait(false));
            }

            var oobName = _streamGen(typeof(T), StreamTypes.OOB, stream.Bucket, stream.StreamId, stream.Parents);

            count = count / 10;
            // if take is 100, take 10 from each of 10 streams - see above
            var events = await Enumerable.Range(1, 10).ToArray()
                         .StartEachAsync(5,
                                         (vary) => _store.GetEventsBackwards($"{oobName}-{oob}.{vary}", start, count))
                         .ConfigureAwait(false);

            return(events.SelectMany(x => x));
        }
示例#6
0
        public async Task <TEntity[]> GetChildren <TEntity, TParent>(TParent parent) where TEntity : IChildEntity <TParent> where TParent : IHaveEntities <TParent>
        {
            var uow       = (Configuration.Settings.LocalContainer.Value ?? Configuration.Settings.Container).Resolve <Aggregates.UnitOfWork.IDomain>();
            var streamGen = Configuration.Settings.Generator;

            var parents = getParents(parent);

            var parentEntityType = _registrar.GetVersionedName(typeof(TParent));
            var childEntityType  = _registrar.GetVersionedName(typeof(TEntity));

            Logger.DebugEvent("Children", "Getting children for entity type {EntityType} stream id {Id}", parentEntityType, parent.Id);

            var stream = streamGen(parentEntityType, StreamTypes.Children, parent.Bucket, parent.Id, parents?.Select(x => x.StreamId).ToArray());

            // ES generated stream name
            var fullStream = $"$projections-aggregates.net.children.{_version}-{stream}-result";

            var stateEvents = await _eventstore.GetEventsBackwards(fullStream, count : 1).ConfigureAwait(false);

            if (!stateEvents.Any())
            {
                return new TEntity[] { }
            }
            ;

            var state    = stateEvents[0];
            var children = state.Event as ChildrenProjection;

            var desiredChildren = children?.Children.Where(x => x.EntityType == childEntityType).ToArray();

            if (children == null || !desiredChildren.Any())
            {
                return new TEntity[] { }
            }
            ;

            Logger.DebugEvent("Hydrating", "Hydrating {Count} children of entity type {EntityType} stream id {Id}", desiredChildren.Length, parentEntityType, parent.Id);

            var entities = new List <TEntity>();

            foreach (var child in desiredChildren)
            {
                var childEntity = await uow.For <TEntity, TParent>(parent).Get(child.StreamId).ConfigureAwait(false);

                entities.Add(childEntity);
            }
            return(entities.ToArray());
        }
    }
}
示例#7
0
        public async Task <ISnapshot> GetSnapshot <T>(string bucket, string streamId) where T : class, IEventSource
        {
            var streamName = $"{_streamGen(typeof(T), bucket + ".SNAP", streamId)}";

            Logger.Write(LogLevel.Debug, () => $"Getting snapshot for stream [{streamName}]");

            if (_shouldCache)
            {
                var cached = _cache.Retreive(streamName) as ISnapshot;
                if (cached != null)
                {
                    HitMeter.Mark();
                    Logger.Write(LogLevel.Debug, () => $"Found snapshot [{streamName}] in cache");
                    return(cached);
                }
                MissMeter.Mark();
            }
            Logger.Write(LogLevel.Debug, () => $"Reading snapshot for stream [{streamName}] from store");


            var read = await _store.GetEventsBackwards(streamName, StreamPosition.End, 1).ConfigureAwait(false);

            if (read == null || !read.Any())
            {
                return(null);
            }


            var @event   = read.Single();
            var snapshot = new Snapshot
            {
                EntityType = @event.Descriptor.EntityType,
                Bucket     = bucket,
                Stream     = streamId,
                Timestamp  = @event.Descriptor.Timestamp,
                Version    = @event.Descriptor.Version,
                Payload    = @event.Event
            };

            if (_shouldCache)
            {
                _cache.Cache(streamName, snapshot);
            }
            return(snapshot);
        }
        public async Task <ISnapshot> GetSnapshot <T>(string bucket, string streamId) where T : class, IEventSource
        {
            var streamName = _streamGen(typeof(T), StreamTypes.Snapshot, bucket, streamId);

            Logger.Write(LogLevel.Debug, () => $"Getting snapshot for stream [{streamName}]");
            {
                var snapshot = await _snapshots.Retreive(streamName).ConfigureAwait(false);

                if (snapshot != null)
                {
                    HitMeter.Mark();
                    Logger.Write(LogLevel.Debug,
                                 () => $"Found snapshot [{streamName}] version {snapshot.Version} from subscription");
                    return(snapshot);
                }
            }

            // Check store directly (this might be a new instance which hasn't caught up to snapshot stream yet

            Logger.Write(LogLevel.Debug, () => $"Checking for snapshot for stream [{streamName}] in store");

            var read = await _store.GetEventsBackwards(streamName, StreamPosition.End, 1).ConfigureAwait(false);

            if (read != null && read.Any())
            {
                var @event   = read.Single();
                var snapshot = new Snapshot
                {
                    EntityType = @event.Descriptor.EntityType,
                    Bucket     = bucket,
                    StreamId   = streamId,
                    Timestamp  = @event.Descriptor.Timestamp,
                    Version    = @event.Descriptor.Version,
                    Payload    = @event.Event
                };
                HitMeter.Mark();
                Logger.Write(LogLevel.Debug, () => $"Found snapshot [{streamName}] version {snapshot.Version} from store");
                return(snapshot);
            }

            MissMeter.Mark();
            Logger.Write(LogLevel.Debug, () => $"Snapshot not found for stream [{streamName}]");
            return(null);
        }
示例#9
0
        public async Task <ISnapshot> GetSnapshot <T>(string bucket, Id streamId, Id[] parents) where T : IEntity
        {
            var streamName = _streamGen(_registrar.GetVersionedName(typeof(T)), StreamTypes.Snapshot, bucket, streamId, parents);

            Logger.DebugEvent("Get", "[{Stream:l}]", streamName);
            if (_snapshots != null)
            {
                var snapshot = await _snapshots.Retreive(streamName).ConfigureAwait(false);

                if (snapshot != null)
                {
                    _metrics.Mark("Snapshot Cache Hits", Unit.Items);
                    Logger.DebugEvent("Cached", "[{Stream:l}] version {Version}", streamName, snapshot.Version);
                    return(snapshot);
                }
            }
            _metrics.Mark("Snapshot Cache Misses", Unit.Items);

            // Check store directly (this might be a new instance which hasn't caught up to snapshot stream yet


            var read = await _store.GetEventsBackwards(streamName, StreamPosition.End, 1).ConfigureAwait(false);

            if (read != null && read.Any())
            {
                var @event   = read.Single();
                var snapshot = new Snapshot
                {
                    EntityType = @event.Descriptor.EntityType,
                    Bucket     = bucket,
                    StreamId   = streamId,
                    Timestamp  = @event.Descriptor.Timestamp,
                    Version    = @event.Descriptor.Version,
                    Payload    = @event.Event as IState
                };
                Logger.DebugEvent("Read", "[{Stream:l}] version {Version}", streamName, snapshot.Version);
                return(snapshot);
            }

            Logger.DebugEvent("NotFound", "[{Stream:l}]", streamName);
            return(null);
        }
示例#10
0
        public Task <IFullEvent[]> GetEventsBackwards <TEntity>(string bucket, Id streamId, Id[] parents, string oobId, long?start = null, int?count = null) where TEntity : IEntity
        {
            var stream = _generator(typeof(TEntity), StreamTypes.OOB, $"{oobId}.{bucket}", streamId, parents);

            return(_store.GetEventsBackwards(stream, start, count));
        }
        public Task <IEnumerable <IWritableEvent> > Retrieve <T>(string bucket, string streamId, int?skip = null, int?take = null, bool ascending = true) where T : class, IEventSource
        {
            var streamName = _streamGen(typeof(T), bucket + ".OOB", streamId);

            return(!ascending?_store.GetEventsBackwards(streamName) : _store.GetEvents(streamName));
        }
示例#12
0
        public Task <IEnumerable <IWritableEvent> > GetEventsBackwards <T>(string bucket, string streamId, long?start = null, int?count = null) where T : class, IEventSource
        {
            var streamName = _streamGen(typeof(T), StreamTypes.Domain, bucket, streamId);

            return(_store.GetEventsBackwards(streamName, start: start, count: count));
        }