public async Task ExecuteAsync(QueueId queueId, WeeklyReleaseSchedule weeklyReleaseSchedule) { queueId.AssertNotNull("queueId"); weeklyReleaseSchedule.AssertNotNull("weeklyReleaseSchedule"); var newWeeklyReleaseTimes = weeklyReleaseSchedule.Value.Select( _ => new WeeklyReleaseTime(queueId.Value, null, (byte)_.Value)); var deletionParameters = new { QueueId = queueId.Value }; // Transaction required on the following, as database must always contain at least one weekly release time per // collection. The absence of weekly release times would cause a breaking inconsistency. using (var transaction = TransactionScopeBuilder.CreateAsync()) { using (var connection = this.connectionFactory.CreateConnection()) { await connection.ExecuteAsync(DeleteWeeklyReleaseTimesSql, deletionParameters); await connection.InsertAsync(newWeeklyReleaseTimes); } transaction.Complete(); } }
public async Task ExecuteAsync(QueueId queueId, WeeklyReleaseSchedule weeklyReleaseSchedule, DateTime now) { queueId.AssertNotNull("queueId"); weeklyReleaseSchedule.AssertNotNull("weeklyReleaseSchedule"); now.AssertUtc("now"); // Transaction required on the following, as we don't want user to see a queue that does not match the collection's release times. using (var transaction = TransactionScopeBuilder.CreateAsync()) { await this.replaceWeeklyReleaseTimes.ExecuteAsync(queueId, weeklyReleaseSchedule); await this.defragmentQueue.ExecuteAsync(queueId, weeklyReleaseSchedule, now); transaction.Complete(); } }
public async Task ExecuteAsync(QueueId queueId, WeeklyReleaseSchedule weeklyReleaseSchedule, DateTime now) { queueId.AssertNotNull("queueId"); weeklyReleaseSchedule.AssertNotNull("weeklyReleaseSchedule"); now.AssertUtc("now"); var queueSize = await this.getQueueSize.ExecuteAsync(queueId, now); if (queueSize == 0) { return; } var unfragmentedLiveDates = this.liveDateCalculator.GetNextLiveDates(now, weeklyReleaseSchedule, queueSize); await this.updateAllLiveDatesInQueue.ExecuteAsync(queueId, unfragmentedLiveDates, now); }
public IReadOnlyList <DateTime> GetNextLiveDates( DateTime exclusiveLowerBound, WeeklyReleaseSchedule weeklyReleaseSchedule, int numberOfLiveDatesToReturn) { exclusiveLowerBound.AssertUtc("exclusiveLowerBound"); weeklyReleaseSchedule.AssertNotNull("weeklyReleaseSchedule"); numberOfLiveDatesToReturn.AssertNonNegative("numberOfLiveDatesToReturn"); var startTimeWithWeekReset = new DateTime( exclusiveLowerBound.Year, exclusiveLowerBound.Month, exclusiveLowerBound.Day, 0, 0, 0, DateTimeKind.Utc) .AddDays(-1 * (int)exclusiveLowerBound.DayOfWeek); var ascendingWeeklyReleaseTimes = weeklyReleaseSchedule.Value; var releasesPerWeek = ascendingWeeklyReleaseTimes.Count; var currentHourOfWeek = HourOfWeek.Parse(exclusiveLowerBound).Value; var nextReleaseTimeAfterCurrentTime = ascendingWeeklyReleaseTimes.FirstOrDefault(_ => _.Value > currentHourOfWeek); var startFromNextWeek = nextReleaseTimeAfterCurrentTime == null; var releaseTimeIndexOffset = startFromNextWeek ? releasesPerWeek : ascendingWeeklyReleaseTimes.IndexOf(nextReleaseTimeAfterCurrentTime); var result = new List <DateTime>(); for (var i = releaseTimeIndexOffset; i < numberOfLiveDatesToReturn + releaseTimeIndexOffset; i++) { var weeksFilled = i / releasesPerWeek; var releaseTimeIndex = i % releasesPerWeek; var releaseHourOfWeek = ascendingWeeklyReleaseTimes[releaseTimeIndex].Value; var releaseWeek = startTimeWithWeekReset.AddDays(weeksFilled * 7); var releaseTime = releaseWeek.AddHours(releaseHourOfWeek); result.Add(releaseTime); } return(result); }