public virtual async Task <List <SignalDispatch <long> > > SelectLocked(DispatchQueryParameters <long> parameters, Guid lockId, DateTime lockExpirationDate) { List <SignalDispatch <long> > list = null; using (SenderDbContext context = _dbContextFactory.GetDbContext()) { IQueryable <SignalDispatchLong> query = context.SignalDispatches.AsQueryable <SignalDispatchLong>(); query = Filter(query, parameters); query = query.Where(msg => msg.LockedBy == lockId && msg.LockedSinceUtc != null && msg.LockedSinceUtc >= lockExpirationDate); List <SignalDispatchLong> response = await query .OrderBy(msg => msg.SendDateUtc) .Take(parameters.Count) .ToListAsync() .ConfigureAwait(false); list = response .Select(_mapper.Map <SignalDispatch <long> >) .ToList(); } return(list); }
public virtual Task <List <SignalDispatch <ObjectId> > > SelectNotSetLock(DispatchQueryParameters <ObjectId> parameters) { FilterDefinition <SignalDispatch <ObjectId> > filter = ToFilter(parameters); var options = new FindOptions() { AllowPartialResults = true }; return(_collectionFactory .GetCollection <SignalDispatch <ObjectId> >(CollectionNames.DISPATCHES) .Find(filter, options) .SortBy(p => p.SendDateUtc) .Limit(parameters.Count) .ToListAsync()); }
public virtual async Task <List <SignalDispatch <long> > > SelectWithSetLock(DispatchQueryParameters <long> parameters, Guid lockId, DateTime lockExpirationDate) { //same date as stored in LockTracker DateTime lockStartTimeUtc = DateTime.UtcNow; int lockedDispatches = await SetLock(parameters, lockId, lockStartDate : lockStartTimeUtc, lockExpirationDate : lockExpirationDate) .ConfigureAwait(false); if (lockedDispatches == 0) { return(new List <SignalDispatch <long> >()); } return(await SelectLocked(parameters, lockId, lockExpirationDate) .ConfigureAwait(false)); }
//Select protected virtual FilterDefinition <SignalDispatch <ObjectId> > ToFilter(DispatchQueryParameters <ObjectId> parameters) { var filter = Builders <SignalDispatch <ObjectId> > .Filter.Where( p => p.SendDateUtc <= DateTime.UtcNow && parameters.ActiveDeliveryTypes.Contains(p.DeliveryType) && p.FailedAttempts < parameters.MaxFailedAttempts && !parameters.ExcludeIds.Contains(p.SignalDispatchId)); foreach (ConsolidationLock <ObjectId> locked in parameters.ExcludeConsolidated) { filter &= Builders <SignalDispatch <ObjectId> > .Filter.Where( x => x.ReceiverSubscriberId != locked.ReceiverSubscriberId || x.CategoryId != locked.CategoryId || x.DeliveryType != locked.DeliveryType); } //string json = FilterDefinitionExtensions.ToJson(filter); return(filter); }
public virtual Task <List <SignalDispatch <ObjectId> > > SelectLocked(DispatchQueryParameters <ObjectId> parameters, Guid lockId, DateTime lockExpirationDate) { FilterDefinition <SignalDispatch <ObjectId> > filter = ToFilter(parameters); filter &= Builders <SignalDispatch <ObjectId> > .Filter.Where( p => p.LockedBy == lockId && p.LockedSinceUtc != null && p.LockedSinceUtc >= lockExpirationDate); var options = new FindOptions() { AllowPartialResults = true }; return(_collectionFactory .GetCollection <SignalDispatch <ObjectId> >(CollectionNames.DISPATCHES) .Find(filter, options) .SortBy(x => x.SendDateUtc) .Limit(parameters.Count) .ToListAsync()); }
public virtual async Task <List <SignalDispatch <long> > > SelectNotSetLock(DispatchQueryParameters <long> parameters) { List <SignalDispatch <long> > list = null; using (SenderDbContext context = _dbContextFactory.GetDbContext()) { IQueryable <SignalDispatchLong> query = context.SignalDispatches.AsQueryable <SignalDispatchLong>(); query = Filter(query, parameters); List <SignalDispatchLong> response = await query .OrderBy(msg => msg.SendDateUtc) .Take(parameters.Count) .ToListAsync() .ConfigureAwait(false); list = response .Select(_mapper.Map <SignalDispatch <long> >) .ToList(); } return(list); }
public virtual Task <List <SignalDispatch <ObjectId> > > SelectUnlocked(DispatchQueryParameters <ObjectId> parameters, DateTime lockExpirationDate) { FilterDefinition <SignalDispatch <ObjectId> > filter = ToFilter(parameters); filter &= Builders <SignalDispatch <ObjectId> > .Filter.Where( p => p.LockedBy == null || p.LockedSinceUtc == null || p.LockedSinceUtc < lockExpirationDate); var options = new FindOptions() { AllowPartialResults = true }; //string filterJson = FilterDefinitionExtensions.ToJson(filter); return(_collectionFactory .GetCollection <SignalDispatch <ObjectId> >(CollectionNames.DISPATCHES) .Find(filter, options) .SortBy(p => p.SendDateUtc) .Limit(parameters.Count) .ToListAsync()); }
public virtual async Task <List <SignalDispatch <ObjectId> > > SelectWithSetLock(DispatchQueryParameters <ObjectId> parameters, Guid lockId, DateTime lockExpirationDate) { //same date as stored in LockTracker DateTime lockStartTimeUtc = DateTime.UtcNow; List <SignalDispatch <ObjectId> > selected = await SelectUnlocked(parameters, lockExpirationDate) .ConfigureAwait(false); if (selected.Count == 0) { return(selected); } List <ObjectId> dispatchIds = selected.Select(x => x.SignalDispatchId).ToList(); bool lockSetOnAllEntities = await SetLock(dispatchIds, lockId, lockStartTimeUtc, lockExpirationDate) .ConfigureAwait(false); if (lockSetOnAllEntities) { return(selected); } return(await SelectLocked(parameters, lockId, lockExpirationDate).ConfigureAwait(false)); }
//Select protected virtual IQueryable <SignalDispatchLong> Filter(IQueryable <SignalDispatchLong> query, DispatchQueryParameters <long> parameters) { query = query.Where(msg => msg.SendDateUtc <= DateTime.UtcNow && msg.FailedAttempts < parameters.MaxFailedAttempts && parameters.ActiveDeliveryTypes.Contains(msg.DeliveryType) && !parameters.ExcludeIds.Contains(msg.SignalDispatchId)); foreach (ConsolidationLock <long> locked in parameters.ExcludeConsolidated) { query = query.Where( x => x.ReceiverSubscriberId != locked.ReceiverSubscriberId || x.CategoryId != locked.CategoryId || x.DeliveryType != locked.DeliveryType); } return(query); }