public async Task RemoveEntityFromProjectionAsync(ProjectionSourceDescriptor projectionSource, ProjectionTargetDescriptor removedProjection, CancellationToken cancellation) { var(originalMetadata, metadata) = await GetMetadataAsync(removedProjection, cancellation); if (metadata == null) { Assert(false); return; } var removed = metadata.ProjectionSources .RemoveFirstWhere(p => p.Id == projectionSource.SourceId && p.Type == projectionSource.SourceType.GetUnqualifiedTypeName()); Assert(removed != null); if (!metadata.ProjectionSources.Any()) { _targetMetadataCache[removedProjection] = new ProjectionTargetMetadataCacheEntry(originalMetadata, metadata: null, touched: true); var predicate = DataPropertyHelper.BuildPredicate <TProjectionId, TProjection>(metadata.TargetId); var projection = await _database.GetAsync(predicate, cancellation).FirstOrDefault(); if (projection != null) { _targetsToDelete.Add(projection); //await _database.RemoveAsync(projection, cancellation); } } _targetMetadataCache[removedProjection] = new ProjectionTargetMetadataCacheEntry(originalMetadata, metadata, touched: true); }
public Task <ISnapshot> GetSnapshotAsync(string bucketId, string streamId, long maxRevision = default, CancellationToken cancellation = default) { if (maxRevision < 0) { throw new ArgumentOutOfRangeException(nameof(maxRevision)); } Expression <Func <Snapshot, bool> > predicate; if (maxRevision == default) { predicate = snapshot => snapshot.BucketId.Equals(bucketId) && snapshot.StreamId.Equals(streamId); } else { predicate = snapshot => snapshot.BucketId.Equals(bucketId) && snapshot.StreamId.Equals(streamId) && snapshot.StreamRevision <= maxRevision; } return(_database.GetAsync(predicate, cancellation) .OrderByDescending(snapshot => snapshot.StreamRevision) .Cast <ISnapshot>() .FirstOrDefault(cancellation)); }