protected override int OnStart(StudyLoaderArgs studyLoaderArgs) { _sops = null; EventResult result = EventResult.Success; var loadedInstances = new AuditedInstances(); try { using (var context = new DataAccessContext()) { if (!studyLoaderArgs.Options.IgnoreInUse) { var workItemStatusFilter = WorkItemStatusFilter.StatusIn( WorkItemStatusEnum.Pending, WorkItemStatusEnum.InProgress, WorkItemStatusEnum.Idle, WorkItemStatusEnum.Failed); var updateItems = context.GetWorkItemBroker().GetWorkItems( WorkItemConcurrency.StudyUpdate, workItemStatusFilter, studyLoaderArgs.StudyInstanceUid); var deleteItems = context.GetWorkItemBroker().GetWorkItems( WorkItemConcurrency.StudyDelete, workItemStatusFilter, studyLoaderArgs.StudyInstanceUid); var updateTriggerItems = context.GetWorkItemBroker().GetWorkItems( WorkItemConcurrency.StudyUpdateTrigger, workItemStatusFilter, studyLoaderArgs.StudyInstanceUid); if (updateItems.Any() || deleteItems.Any() || updateTriggerItems.Any()) { var message = string.Format("There are work items actively modifying the study with UID '{0}'.", studyLoaderArgs.StudyInstanceUid); throw new InUseLoadStudyException(studyLoaderArgs.StudyInstanceUid, message); } } IStudy study = context.GetStudyBroker().GetStudy(studyLoaderArgs.StudyInstanceUid); if (study == null) { result = EventResult.MajorFailure; loadedInstances.AddInstance(studyLoaderArgs.StudyInstanceUid); throw new NotFoundLoadStudyException(studyLoaderArgs.StudyInstanceUid); } loadedInstances.AddInstance(study.PatientId, study.PatientsName, study.StudyInstanceUid); _sops = study.GetSopInstances().GetEnumerator(); return(study.NumberOfStudyRelatedInstances); } } finally { AuditHelper.LogOpenStudies(new[] { AuditHelper.LocalAETitle }, loadedInstances, EventSource.CurrentUser, result); } }
public void TestAddAndGet() { DeleteAllWorkItemUids(); long oid, workItemOid; string version; using (var context = new DataAccessContext()) { WorkItem workItem; var workItemBroker = context.GetWorkItemBroker(); workItemBroker.AddWorkItem(workItem = CreateWorkItem("A")); var workItemUid = CreateWorkItemUid(workItem, "ABCDEF", "2", "3", true, true, 123); var broker = context.GetWorkItemUidBroker(); broker.AddWorkItemUid(workItemUid); context.Commit(); workItemOid = workItem.Oid; Assert.AreNotEqual(0, oid = workItemUid.Oid, "Oid should have been assigned on insert"); Assert.IsNotNull(workItemUid.Version, "Version should have been assigned on insert"); version = workItemUid.Version.ToString(); } using (var context = new DataAccessContext()) { var broker = context.GetWorkItemUidBroker(); var workItemUid = broker.GetWorkItemUid(oid); Assert.AreEqual("ABCDEF", workItemUid.File, "File"); Assert.AreEqual("2", workItemUid.SeriesInstanceUid, "SeriesInstanceUid"); Assert.AreEqual("3", workItemUid.SopInstanceUid, "SopInstanceUid"); Assert.AreEqual(workItemOid, workItemUid.WorkItemOid, "WorkItemOid"); Assert.AreEqual(true, workItemUid.Complete, "Complete"); Assert.AreEqual(true, workItemUid.Failed, "Failed"); Assert.AreEqual(123, workItemUid.FailureCount, "FailureCount"); workItemUid.Failed = false; workItemUid.FailureCount = null; context.Commit(); Assert.AreNotEqual(version, workItemUid.Version, "Version should have been changed on update"); } using (var context = new DataAccessContext()) { var broker = context.GetWorkItemUidBroker(); var workItemUid = broker.GetWorkItemUid(oid); Assert.AreEqual("ABCDEF", workItemUid.File, "File"); Assert.AreEqual("2", workItemUid.SeriesInstanceUid, "SeriesInstanceUid"); Assert.AreEqual("3", workItemUid.SopInstanceUid, "SopInstanceUid"); Assert.AreEqual(workItemOid, workItemUid.WorkItemOid, "WorkItemOid"); Assert.AreEqual(true, workItemUid.Complete, "Complete"); Assert.AreEqual(false, workItemUid.Failed, "Failed"); Assert.AreEqual(null, workItemUid.FailureCount, "FailureCount"); } }
public void Refresh(WorkItemRefreshRequest request) { ThreadPool.QueueUserWorkItem( delegate { try { using (var context = new DataAccessContext()) { var broker = context.GetWorkItemBroker(); var dbList = broker.GetWorkItems(null, null, null); // send in batches of 200 foreach (var batch in BatchItems(dbList, 200)) { WorkItemPublishSubscribeHelper.PublishWorkItemsChanged(WorkItemsChangedEventType.Refresh, batch.Select(WorkItemDataHelper.FromWorkItem).ToList()); } } } catch (Exception e) { var message = SR.ExceptionErrorProcessingRefresh; var exceptionMessage = String.Format("{0}\nDetail:{1}", message, e.Message); Platform.Log(LogLevel.Error, e, exceptionMessage); // Don't rethrow here, we're in a thread pool anyways. } }); }
/// <summary> /// Simple routine for failing a <see cref="WorkItem"/> and rescheduling it at a specified time. /// </summary> /// <param name="failureType"></param> /// <param name="failureTime">The time to reschedule the WorkItem if it isn't a fatal error. </param> /// <param name="maxRetryCount">The maximum number of times the WorkItem should be retried before a fatal error occurs.</param> public void Fail(WorkItemFailureType failureType, DateTime failureTime, int maxRetryCount) { using (var context = new DataAccessContext(DataAccessContext.WorkItemMutex)) { var workItemBroker = context.GetWorkItemBroker(); Item = workItemBroker.GetWorkItem(Item.Oid); DateTime now = Platform.Time; Item.Progress = Progress; Item.FailureCount = Item.FailureCount + 1; Item.DeleteTime = now.AddMinutes(WorkItemServiceSettings.Default.DeleteDelayMinutes); if (Item.FailureCount >= maxRetryCount || failureType == WorkItemFailureType.Fatal) { Item.Status = WorkItemStatusEnum.Failed; Item.ExpirationTime = now; } else { Item.ProcessTime = failureTime; if (Item.ExpirationTime < Item.ProcessTime) { Item.ExpirationTime = Item.ProcessTime; } Item.Status = WorkItemStatusEnum.Pending; } context.Commit(); } Publish(false); Platform.Log(LogLevel, "Failing {0} WorkItem for OID {1}: {2}", Item.Type, Item.Oid, Item.Request.ActivityDescription); }
/// <summary> /// Resets any idle study process work items associated with the files imported in the current import context /// </summary> public void PulseStudyWorkItems() { try { lock (_context.StudyWorkItemsSyncLock) { using (var context = new DataAccessContext(DataAccessContext.WorkItemMutex)) { var broker = context.GetWorkItemBroker(); var scheduledTime = Platform.Time; foreach (var workItem in _context.StudyWorkItems.Values.Select(x => broker.GetWorkItem(x.Oid)).Where(x => x != null && x.Status == WorkItemStatusEnum.Idle)) { workItem.ProcessTime = scheduledTime; workItem.ExpirationTime = scheduledTime; } context.Commit(); } } } catch (Exception ex) { Platform.Log(LogLevel.Debug, ex, "Failed to pulse study work items"); } }
private void IncrementTotalFiles(InsertWorkItemCommand insertWorkItemCommand, string studyInstanceUid, string errorMessage = null) { bool foundStudy; lock (_context.StudyWorkItemsSyncLock) foundStudy = _context.StudyWorkItems.ContainsKey(studyInstanceUid); if (foundStudy) { // First image imported already has the TotalFilesToProcess pre-set to 1, so only update after the first var progress = insertWorkItemCommand.WorkItem.Progress as ProcessStudyProgress; if (progress != null) { using (var context = new DataAccessContext(DataAccessContext.WorkItemMutex)) { var broker = context.GetWorkItemBroker(); insertWorkItemCommand.WorkItem = broker.GetWorkItem(insertWorkItemCommand.WorkItem.Oid); progress = insertWorkItemCommand.WorkItem.Progress as ProcessStudyProgress; if (progress != null) { progress.TotalFilesToProcess++; if (!string.IsNullOrEmpty(errorMessage)) progress.StatusDetails = errorMessage; insertWorkItemCommand.WorkItem.Progress = progress; } context.Commit(); } } } // Save the updated WorkItem, note that this also publishes the workitem automatically lock (_context.StudyWorkItemsSyncLock) _context.StudyWorkItems[studyInstanceUid] = insertWorkItemCommand.WorkItem; }
private void Publish(bool saveToDatabase) { if (saveToDatabase) { try { using (var context = new DataAccessContext(DataAccessContext.WorkItemMutex)) { var broker = context.GetWorkItemBroker(); Item = broker.GetWorkItem(Item.Oid); Item.Progress = Progress; context.Commit(); } } catch (Exception) { // Saw ChangeCOnflictException here a few times } } else { Item.Progress = Progress; } WorkItemPublishSubscribeHelper.PublishWorkItemChanged(WorkItemsChangedEventType.Update, WorkItemDataHelper.FromWorkItem(Item)); }
private static void DeleteAllWorkItems() { using (var context = new DataAccessContext()) { var broker = context.GetWorkItemBroker(); broker.DeleteAll(); context.Commit(); } }
/// <summary> /// Mark <see cref="WorkItem"/> as being in the process of canceling /// </summary> public void Canceling() { using (var context = new DataAccessContext(DataAccessContext.WorkItemMutex)) { var workItemBroker = context.GetWorkItemBroker(); Item = workItemBroker.GetWorkItem(Item.Oid); Item.Progress = Progress; Item.Status = WorkItemStatusEnum.Canceling; context.Commit(); } Publish(false); Platform.Log(LogLevel, "Canceling {0} WorkItem for OID {1}: {2}", Item.Type, Item.Oid, Item.Request.ActivityDescription); }
/// <summary> /// Delete a <see cref="WorkItem"/>. /// </summary> public void Delete() { using (var context = new DataAccessContext(DataAccessContext.WorkItemMutex)) { var broker = context.GetWorkItemBroker(); Item = broker.GetWorkItem(Item.Oid); Item.Status = WorkItemStatusEnum.Deleted; broker.Delete(Item); context.Commit(); } Publish(false); Platform.Log(LogLevel, "Deleting {0} WorkItem for OID {1}: {2}", Item.Type, Item.Oid, Item.Request.ActivityDescription); }
/// <summary> /// Method for getting next <see cref="WorkItem"/> entry. /// </summary> /// <param name="count">The count.</param> /// <remarks> /// </remarks> /// <returns> /// A <see cref="WorkItem"/> entry if found, or else null; /// </returns> private List <WorkItem> GetWorkItemsToDelete(int count) { try { // Get WorkItems that have expired that need to be deleted using (var context = new DataAccessContext(DataAccessContext.WorkItemMutex)) { var workItemBroker = context.GetWorkItemBroker(); var workItems = workItemBroker.GetWorkItemsToDelete(count); foreach (var item in workItems) { item.Status = WorkItemStatusEnum.DeleteInProgress; } context.Commit(); if (workItems.Count > 0) { return(workItems); } } // Get entries already marked as deleted by the GUI. using (var context = new DataAccessContext(DataAccessContext.WorkItemMutex)) { var workItemBroker = context.GetWorkItemBroker(); var workItems = workItemBroker.GetWorkItemsDeleted(count); foreach (var item in workItems) { item.Status = WorkItemStatusEnum.DeleteInProgress; } context.Commit(); return(workItems); } } catch (Exception) { return(new List <WorkItem>()); } }
/// <summary> /// Complete a <see cref="WorkItem"/>. /// </summary> public void Complete() { using (var context = new DataAccessContext(DataAccessContext.WorkItemMutex)) { var broker = context.GetWorkItemBroker(); Item = broker.GetWorkItem(Item.Oid); DateTime now = Platform.Time; // Since we're completing, no need for additional status, its done. Progress.StatusDetails = string.Empty; Item.Progress = Progress; Item.ProcessTime = now; Item.ExpirationTime = now; Item.DeleteTime = now.AddMinutes(WorkItemServiceSettings.Default.DeleteDelayMinutes); Item.Status = WorkItemStatusEnum.Complete; var uidBroker = context.GetWorkItemUidBroker(); foreach (var entity in Item.WorkItemUids) { uidBroker.Delete(entity); } context.Commit(); } Publish(false); var studyRequest = Item.Request as WorkItemStudyRequest; if (studyRequest != null) { Platform.Log(LogLevel.Info, "Completing {0} WorkItem for OID {1}: {2}, {3}:{4}", Item.Type, Item.Oid, Item.Request.ActivityDescription, studyRequest.Patient.PatientsName, studyRequest.Patient.PatientId); } else { Platform.Log(LogLevel.Info, "Completing {0} WorkItem for OID {1}: {2}", Item.Type, Item.Oid, Item.Request.ActivityDescription); } }
public WorkItemQueryResponse Query(WorkItemQueryRequest request) { var response = new WorkItemQueryResponse(); using (var context = new DataAccessContext()) { var broker = context.GetWorkItemBroker(); var dbList = broker.GetWorkItems(request.Type, request.Status, request.StudyInstanceUid); var results = new List <WorkItemData>(); foreach (var dbItem in dbList) { results.Add(WorkItemDataHelper.FromWorkItem(dbItem)); } response.Items = results.ToArray(); } return(response); }
/// <summary> /// Cancel a <see cref="WorkItem"/> /// </summary> public void Cancel() { using (var context = new DataAccessContext(DataAccessContext.WorkItemMutex)) { var broker = context.GetWorkItemBroker(); Item = broker.GetWorkItem(Item.Oid); DateTime now = Platform.Time; Item.ProcessTime = now; Item.ExpirationTime = now; Item.DeleteTime = now.AddMinutes(WorkItemServiceSettings.Default.DeleteDelayMinutes); Item.Status = WorkItemStatusEnum.Canceled; Item.Progress = Progress; context.Commit(); } Publish(false); Platform.Log(LogLevel, "Canceling {0} WorkItem for OID {1}: {2}", Item.Type, Item.Oid, Item.Request.ActivityDescription); }
private static WorkItem ProcessStudy(long studyOid, DataAccessContext context) { var studyBroker = context.GetStudyBroker(); var study = studyBroker.GetStudy(studyOid); // on the off chance it was deleted by another thread/process, there's nothing to do here if (study.Deleted) { return(null); } // TODO (Marmot): this code was duplicated from DeleteClient.DeleteStudy var now = Platform.Time; var item = new WorkItem { Request = new DeleteStudyRequest { Study = new WorkItemStudy(study), Patient = new WorkItemPatient(study) }, Type = DeleteStudyRequest.WorkItemTypeString, Priority = WorkItemPriorityEnum.Normal, ScheduledTime = now.AddSeconds(WorkItemServiceSettings.Default.InsertDelaySeconds), ProcessTime = now.AddSeconds(WorkItemServiceSettings.Default.InsertDelaySeconds), DeleteTime = now.AddMinutes(WorkItemServiceSettings.Default.DeleteDelayMinutes), ExpirationTime = now.AddSeconds(WorkItemServiceSettings.Default.ExpireDelaySeconds), RequestedTime = now, Status = WorkItemStatusEnum.Pending, StudyInstanceUid = study.StudyInstanceUid }; var workItemBroker = context.GetWorkItemBroker(); workItemBroker.AddWorkItem(item); study.Deleted = true; return(item); }
/// <summary> /// Postpone a <see cref="WorkItem"/> /// </summary> public void Postpone(TimeSpan delay) { DateTime now = Platform.Time; var workItem = Item.Request as IWorkItemRequestTimeWindow; using (var context = new DataAccessContext(DataAccessContext.WorkItemMutex)) { var workItemBroker = context.GetWorkItemBroker(); Item = workItemBroker.GetWorkItem(Item.Oid); if (workItem != null && Item.Priority != WorkItemPriorityEnum.Stat) { DateTime scheduledTime = workItem.GetScheduledTime(now, delay.Seconds); Item.ProcessTime = scheduledTime; Item.ScheduledTime = scheduledTime; } else { Item.ProcessTime = now.Add(delay); } Item.Progress = Progress; if (Item.ProcessTime > Item.ExpirationTime) { Item.ExpirationTime = Item.ProcessTime; } Item.Status = WorkItemStatusEnum.Pending; context.Commit(); Publish(false); Platform.Log(LogLevel, "Postponing {0} WorkItem for OID {1} until {2}, expires {3}", Item.Type, Item.Oid, Item.ProcessTime.ToLongTimeString(), Item.ExpirationTime.ToLongTimeString()); } }
/// <summary> /// Make a <see cref="WorkItem"/> Idle. /// </summary> public void Idle() { using (var context = new DataAccessContext(DataAccessContext.WorkItemMutex)) { var broker = context.GetWorkItemBroker(); Item = broker.GetWorkItem(Item.Oid); DateTime now = Platform.Time; Item.Progress = Progress; Item.ProcessTime = now.AddSeconds(WorkItemServiceSettings.Default.PostponeSeconds); if (Item.ProcessTime > Item.ExpirationTime) { Item.ProcessTime = Item.ExpirationTime; } Item.Status = WorkItemStatusEnum.Idle; context.Commit(); } Publish(false); Platform.Log(LogLevel, "Idling {0} WorkItem for OID {1} until {2}, expires {3}", Item.Type, Item.Oid, Item.ProcessTime.ToLongTimeString(), Item.ExpirationTime.ToLongTimeString()); }
public void TestGetWorkItemsDeleted() { DeleteAllWorkItems(); var time = DateTime.Now.Truncate(); var pastTime = time.AddMinutes(-30); var futureTime = time.AddMinutes(30); using (var context = new DataAccessContext()) { var broker = context.GetWorkItemBroker(); broker.AddWorkItem(CreateWorkItem(_idCancelled, "1", status: WorkItemStatusEnum.Canceled, deleteTime: pastTime)); broker.AddWorkItem(CreateWorkItem(_idCanceling, "1", status: WorkItemStatusEnum.Canceling, deleteTime: pastTime)); broker.AddWorkItem(CreateWorkItem(_idComplete, "1", status: WorkItemStatusEnum.Complete, deleteTime: pastTime)); broker.AddWorkItem(CreateWorkItem(_idDeleting, "1", status: WorkItemStatusEnum.DeleteInProgress, deleteTime: pastTime)); broker.AddWorkItem(CreateWorkItem(_idDeleted, "1", status: WorkItemStatusEnum.Deleted, deleteTime: pastTime)); broker.AddWorkItem(CreateWorkItem(_idFailed, "1", status: WorkItemStatusEnum.Failed, deleteTime: pastTime)); broker.AddWorkItem(CreateWorkItem(_idIdling, "1", status: WorkItemStatusEnum.Idle, deleteTime: pastTime)); broker.AddWorkItem(CreateWorkItem(_idInProgress, "1", status: WorkItemStatusEnum.InProgress, deleteTime: pastTime)); broker.AddWorkItem(CreateWorkItem(_idPending, "1", status: WorkItemStatusEnum.Pending, deleteTime: pastTime)); broker.AddWorkItem(CreateWorkItem(_idCancelled, "2", status: WorkItemStatusEnum.Canceled, deleteTime: futureTime)); broker.AddWorkItem(CreateWorkItem(_idCanceling, "2", status: WorkItemStatusEnum.Canceling, deleteTime: futureTime)); broker.AddWorkItem(CreateWorkItem(_idComplete, "2", status: WorkItemStatusEnum.Complete, deleteTime: futureTime)); broker.AddWorkItem(CreateWorkItem(_idDeleting, "2", status: WorkItemStatusEnum.DeleteInProgress, deleteTime: futureTime)); broker.AddWorkItem(CreateWorkItem(_idDeleted, "2", status: WorkItemStatusEnum.Deleted, deleteTime: futureTime)); broker.AddWorkItem(CreateWorkItem(_idFailed, "2", status: WorkItemStatusEnum.Failed, deleteTime: futureTime)); broker.AddWorkItem(CreateWorkItem(_idIdling, "2", status: WorkItemStatusEnum.Idle, deleteTime: futureTime)); broker.AddWorkItem(CreateWorkItem(_idInProgress, "2", status: WorkItemStatusEnum.InProgress, deleteTime: futureTime)); broker.AddWorkItem(CreateWorkItem(_idPending, "2", status: WorkItemStatusEnum.Pending, deleteTime: futureTime)); broker.AddWorkItem(CreateWorkItem(_idDeleted, "3", status: WorkItemStatusEnum.Deleted, deleteTime: time.AddMinutes(-1))); broker.AddWorkItem(CreateWorkItem(_idDeleted, "4", status: WorkItemStatusEnum.Deleted, deleteTime: time.AddMinutes(-2))); broker.AddWorkItem(CreateWorkItem(_idDeleted, "5", status: WorkItemStatusEnum.Deleted, deleteTime: time.AddMinutes(-3))); context.Commit(); } using (var context = new DataAccessContext()) { var broker = context.GetWorkItemBroker(); // there are 5 deleted items here (status is deleted) var topDeleted = broker.GetWorkItemsDeleted(3); var allDeleted = broker.GetWorkItemsDeleted(7); // this ensures that the results are valid by checking that future time is indeed still in the future Assert.Less(DateTime.Now, futureTime, "Rerun Test! - Results are invalid due to an unreasonable delay during test setup, causing future timestamps to not be in the future"); Assert.AreEqual(3, topDeleted.Count, "Query top should yield 3 items"); Assert.IsTrue(topDeleted.All(x => x.Type == _idDeleted), "Query top yielded item with wrong identity"); Assert.IsTrue(topDeleted.All(x => x.Status == WorkItemStatusEnum.Deleted), "Query top yielded item with wrong status"); Assert.AreEqual(5, allDeleted.Count, "Query all should yield 5 items"); Assert.IsTrue(allDeleted.All(x => x.Type == _idDeleted), "Query all yielded item with wrong identity"); Assert.IsTrue(allDeleted.All(x => x.Status == WorkItemStatusEnum.Deleted), "Query all yielded item with wrong status"); Assert.AreEqual(1, allDeleted.Count(x => x.StudyInstanceUid == "1"), "Query all failed to yield deletable item"); Assert.AreEqual(1, allDeleted.Count(x => x.StudyInstanceUid == "2"), "Query all failed to yield deletable item"); Assert.AreEqual(1, allDeleted.Count(x => x.StudyInstanceUid == "3"), "Query all failed to yield deletable item"); Assert.AreEqual(1, allDeleted.Count(x => x.StudyInstanceUid == "4"), "Query all failed to yield deletable item"); Assert.AreEqual(1, allDeleted.Count(x => x.StudyInstanceUid == "5"), "Query all failed to yield deletable item"); } }
public void TestGetWorkItemUidsForWorkItem() { DeleteAllWorkItemUids(); long workItemOidA, workItemOidB, workItemOidC, workItemOidD; using (var context = new DataAccessContext()) { WorkItem workItemA, workItemB, workItemC, workItemD; var workItemBroker = context.GetWorkItemBroker(); workItemBroker.AddWorkItem(workItemA = CreateWorkItem("A")); workItemBroker.AddWorkItem(workItemB = CreateWorkItem("B")); workItemBroker.AddWorkItem(workItemC = CreateWorkItem("C")); workItemBroker.AddWorkItem(workItemD = CreateWorkItem("D")); var broker = context.GetWorkItemUidBroker(); broker.AddWorkItemUid(CreateWorkItemUid(workItemA, "file1", "series1", "sop1")); broker.AddWorkItemUid(CreateWorkItemUid(workItemA, "file4", "series2", "sop4")); broker.AddWorkItemUid(CreateWorkItemUid(workItemB, "file6", "series4", "sop6")); broker.AddWorkItemUid(CreateWorkItemUid(workItemA, "file3", "series2", "sop3")); broker.AddWorkItemUid(CreateWorkItemUid(workItemA, "file2", "series1", "sop2")); broker.AddWorkItemUid(CreateWorkItemUid(workItemB, "file5", "series3", "sop5")); context.Commit(); workItemOidA = workItemA.Oid; workItemOidB = workItemB.Oid; workItemOidC = workItemC.Oid; workItemOidD = workItemD.Oid; } using (var context = new DataAccessContext()) { var workItemBroker = context.GetWorkItemBroker(); workItemBroker.Delete(workItemBroker.GetWorkItem(workItemOidD)); context.Commit(); } using (var context = new DataAccessContext()) { var broker = context.GetWorkItemUidBroker(); var listA = broker.GetWorkItemUidsForWorkItem(workItemOidA).OrderBy(x => x.File).ToList(); var listB = broker.GetWorkItemUidsForWorkItem(workItemOidB).OrderBy(x => x.File).ToList(); var listC = broker.GetWorkItemUidsForWorkItem(workItemOidC); var listD = broker.GetWorkItemUidsForWorkItem(workItemOidD); Assert.AreEqual(4, listA.Count, "Unexpected number of results for work item A"); Assert.AreEqual("file1", listA[0].File, "Unexpected result for work item A"); Assert.AreEqual("file2", listA[1].File, "Unexpected result for work item A"); Assert.AreEqual("file3", listA[2].File, "Unexpected result for work item A"); Assert.AreEqual("file4", listA[3].File, "Unexpected result for work item A"); Assert.AreEqual(2, listB.Count, "Unexpected number of results for work item B"); Assert.AreEqual("file5", listB[0].File, "Unexpected result for work item A"); Assert.AreEqual("file6", listB[1].File, "Unexpected result for work item A"); Assert.AreEqual(0, listC.Count, "Unexpected results for work item C"); Assert.AreEqual(0, listD.Count, "Unexpected results for work item D"); } }
/// <summary> /// Called on startup to reset InProgress WorkItems back to Pending. /// </summary> private void ResetInProgressWorkItems() { bool reindexInProgress = false; using (var context = new DataAccessContext(DataAccessContext.WorkItemMutex)) { var workItemBroker = context.GetWorkItemBroker(); var list = workItemBroker.GetWorkItems(null, WorkItemStatusEnum.InProgress, null); foreach (var item in list) { item.Status = WorkItemStatusEnum.Pending; if (item.Type.Equals(ReindexRequest.WorkItemTypeString)) { reindexInProgress = true; } } context.Commit(); } using (var context = new DataAccessContext(DataAccessContext.WorkItemMutex)) { var workItemBroker = context.GetWorkItemBroker(); var list = workItemBroker.GetWorkItems(null, WorkItemStatusEnum.DeleteInProgress, null); foreach (var item in list) { item.Status = WorkItemStatusEnum.Deleted; } context.Commit(); } using (var context = new DataAccessContext(DataAccessContext.WorkItemMutex)) { var workItemBroker = context.GetWorkItemBroker(); var list = workItemBroker.GetWorkItems(null, WorkItemStatusEnum.Canceling, null); foreach (var item in list) { item.Status = WorkItemStatusEnum.Canceled; if (item.Type.Equals(ReindexRequest.WorkItemTypeString)) { reindexInProgress = true; } } context.Commit(); } if (reindexInProgress) { using (var context = new DataAccessContext(DataAccessContext.WorkItemMutex)) { var studyBroker = context.GetStudyBroker(); var studyList = studyBroker.GetReindexStudies(); foreach (var item in studyList) { item.Reindex = false; } context.Commit(); } } }
public void TestGetWorkItemsDeleted() { DeleteAllWorkItems(); var time = DateTime.Now.Truncate(); var pastTime = time.AddMinutes(-30); var futureTime = time.AddMinutes(30); using (var context = new DataAccessContext()) { var broker = context.GetWorkItemBroker(); broker.AddWorkItem(CreateWorkItem(_idCancelled, "1", status : WorkItemStatusEnum.Canceled, deleteTime : pastTime)); broker.AddWorkItem(CreateWorkItem(_idCanceling, "1", status : WorkItemStatusEnum.Canceling, deleteTime : pastTime)); broker.AddWorkItem(CreateWorkItem(_idComplete, "1", status : WorkItemStatusEnum.Complete, deleteTime : pastTime)); broker.AddWorkItem(CreateWorkItem(_idDeleting, "1", status : WorkItemStatusEnum.DeleteInProgress, deleteTime : pastTime)); broker.AddWorkItem(CreateWorkItem(_idDeleted, "1", status : WorkItemStatusEnum.Deleted, deleteTime : pastTime)); broker.AddWorkItem(CreateWorkItem(_idFailed, "1", status : WorkItemStatusEnum.Failed, deleteTime : pastTime)); broker.AddWorkItem(CreateWorkItem(_idIdling, "1", status : WorkItemStatusEnum.Idle, deleteTime : pastTime)); broker.AddWorkItem(CreateWorkItem(_idInProgress, "1", status : WorkItemStatusEnum.InProgress, deleteTime : pastTime)); broker.AddWorkItem(CreateWorkItem(_idPending, "1", status : WorkItemStatusEnum.Pending, deleteTime : pastTime)); broker.AddWorkItem(CreateWorkItem(_idCancelled, "2", status : WorkItemStatusEnum.Canceled, deleteTime : futureTime)); broker.AddWorkItem(CreateWorkItem(_idCanceling, "2", status : WorkItemStatusEnum.Canceling, deleteTime : futureTime)); broker.AddWorkItem(CreateWorkItem(_idComplete, "2", status : WorkItemStatusEnum.Complete, deleteTime : futureTime)); broker.AddWorkItem(CreateWorkItem(_idDeleting, "2", status : WorkItemStatusEnum.DeleteInProgress, deleteTime : futureTime)); broker.AddWorkItem(CreateWorkItem(_idDeleted, "2", status : WorkItemStatusEnum.Deleted, deleteTime : futureTime)); broker.AddWorkItem(CreateWorkItem(_idFailed, "2", status : WorkItemStatusEnum.Failed, deleteTime : futureTime)); broker.AddWorkItem(CreateWorkItem(_idIdling, "2", status : WorkItemStatusEnum.Idle, deleteTime : futureTime)); broker.AddWorkItem(CreateWorkItem(_idInProgress, "2", status : WorkItemStatusEnum.InProgress, deleteTime : futureTime)); broker.AddWorkItem(CreateWorkItem(_idPending, "2", status : WorkItemStatusEnum.Pending, deleteTime : futureTime)); broker.AddWorkItem(CreateWorkItem(_idDeleted, "3", status : WorkItemStatusEnum.Deleted, deleteTime : time.AddMinutes(-1))); broker.AddWorkItem(CreateWorkItem(_idDeleted, "4", status : WorkItemStatusEnum.Deleted, deleteTime : time.AddMinutes(-2))); broker.AddWorkItem(CreateWorkItem(_idDeleted, "5", status : WorkItemStatusEnum.Deleted, deleteTime : time.AddMinutes(-3))); context.Commit(); } using (var context = new DataAccessContext()) { var broker = context.GetWorkItemBroker(); // there are 5 deleted items here (status is deleted) var topDeleted = broker.GetWorkItemsDeleted(3); var allDeleted = broker.GetWorkItemsDeleted(7); // this ensures that the results are valid by checking that future time is indeed still in the future Assert.Less(DateTime.Now, futureTime, "Rerun Test! - Results are invalid due to an unreasonable delay during test setup, causing future timestamps to not be in the future"); Assert.AreEqual(3, topDeleted.Count, "Query top should yield 3 items"); Assert.IsTrue(topDeleted.All(x => x.Type == _idDeleted), "Query top yielded item with wrong identity"); Assert.IsTrue(topDeleted.All(x => x.Status == WorkItemStatusEnum.Deleted), "Query top yielded item with wrong status"); Assert.AreEqual(5, allDeleted.Count, "Query all should yield 5 items"); Assert.IsTrue(allDeleted.All(x => x.Type == _idDeleted), "Query all yielded item with wrong identity"); Assert.IsTrue(allDeleted.All(x => x.Status == WorkItemStatusEnum.Deleted), "Query all yielded item with wrong status"); Assert.AreEqual(1, allDeleted.Count(x => x.StudyInstanceUid == "1"), "Query all failed to yield deletable item"); Assert.AreEqual(1, allDeleted.Count(x => x.StudyInstanceUid == "2"), "Query all failed to yield deletable item"); Assert.AreEqual(1, allDeleted.Count(x => x.StudyInstanceUid == "3"), "Query all failed to yield deletable item"); Assert.AreEqual(1, allDeleted.Count(x => x.StudyInstanceUid == "4"), "Query all failed to yield deletable item"); Assert.AreEqual(1, allDeleted.Count(x => x.StudyInstanceUid == "5"), "Query all failed to yield deletable item"); } }
/// <summary> /// Method for getting next <see cref="WorkItem"/> entry. /// </summary> /// <param name="count">The count.</param> /// <param name="priority">Search for stat items.</param> /// <remarks> /// </remarks> /// <returns> /// A <see cref="WorkItem"/> entry if found, or else null; /// </returns> private List <WorkItem> InternalGetWorkItems(int count, WorkItemPriorityEnum priority) { _nowRunningWorkItems.Clear(); _postponedWorkItems.Clear(); var itemsToPublish = new List <WorkItemData>(); try { var workItemBroker = _context.GetWorkItemBroker(); List <WorkItem> workItems = workItemBroker.GetWorkItemsForProcessing(count * 4, priority); foreach (var item in workItems) { string reason; if (CanStart(item, out reason)) { item.Status = WorkItemStatusEnum.InProgress; _nowRunningWorkItems.Add(item); } else { Postpone(item); _postponedWorkItems.Add(item); WorkItemProgress progress = item.Progress; if (progress != null) { progress.StatusDetails = reason; item.Progress = progress; itemsToPublish.Add(WorkItemDataHelper.FromWorkItem(item)); } } if (_nowRunningWorkItems.Count >= count) { break; } } _context.Commit(); return(new List <WorkItem>(_nowRunningWorkItems)); } catch (Exception x) { Platform.Log(LogLevel.Warn, x, "Unexpected error querying for {0} {1} priority WorkItems", count, priority.GetDescription()); return(null); } finally { if (itemsToPublish.Count > 0) { WorkItemPublishSubscribeHelper.PublishWorkItemsChanged(WorkItemsChangedEventType.Update, itemsToPublish); } } }
public void TestGetWorkItemsForProcessingAnyPriority() { DeleteAllWorkItems(); var time = DateTime.Now.Truncate(); var pastTime = time.AddMinutes(-30); var futureTime = time.AddMinutes(30); using (var context = new DataAccessContext()) { var broker = context.GetWorkItemBroker(); broker.AddWorkItem(CreateWorkItem(_idCancelled, "1", status: WorkItemStatusEnum.Canceled, processTime: pastTime)); broker.AddWorkItem(CreateWorkItem(_idCanceling, "1", status: WorkItemStatusEnum.Canceling, processTime: pastTime)); broker.AddWorkItem(CreateWorkItem(_idComplete, "1", status: WorkItemStatusEnum.Complete, processTime: pastTime)); broker.AddWorkItem(CreateWorkItem(_idDeleting, "1", status: WorkItemStatusEnum.DeleteInProgress, processTime: pastTime)); broker.AddWorkItem(CreateWorkItem(_idDeleted, "1", status: WorkItemStatusEnum.Deleted, processTime: pastTime)); broker.AddWorkItem(CreateWorkItem(_idFailed, "1", status: WorkItemStatusEnum.Failed, processTime: pastTime)); broker.AddWorkItem(CreateWorkItem(_idIdling, "1a", status: WorkItemStatusEnum.Idle, processTime: pastTime, priority: WorkItemPriorityEnum.High)); broker.AddWorkItem(CreateWorkItem(_idInProgress, "1", status: WorkItemStatusEnum.InProgress, processTime: pastTime)); broker.AddWorkItem(CreateWorkItem(_idPending, "1b", status: WorkItemStatusEnum.Pending, processTime: pastTime)); broker.AddWorkItem(CreateWorkItem(_idCancelled, "2", status: WorkItemStatusEnum.Canceled, processTime: futureTime)); broker.AddWorkItem(CreateWorkItem(_idCanceling, "2", status: WorkItemStatusEnum.Canceling, processTime: futureTime)); broker.AddWorkItem(CreateWorkItem(_idComplete, "2", status: WorkItemStatusEnum.Complete, processTime: futureTime)); broker.AddWorkItem(CreateWorkItem(_idDeleting, "2", status: WorkItemStatusEnum.DeleteInProgress, processTime: futureTime)); broker.AddWorkItem(CreateWorkItem(_idDeleted, "2", status: WorkItemStatusEnum.Deleted, processTime: futureTime)); broker.AddWorkItem(CreateWorkItem(_idFailed, "2", status: WorkItemStatusEnum.Failed, processTime: futureTime)); broker.AddWorkItem(CreateWorkItem(_idIdling, "2a", status: WorkItemStatusEnum.Idle, processTime: futureTime, priority: WorkItemPriorityEnum.Stat)); broker.AddWorkItem(CreateWorkItem(_idInProgress, "2", status: WorkItemStatusEnum.InProgress, processTime: futureTime)); broker.AddWorkItem(CreateWorkItem(_idPending, "2b", status: WorkItemStatusEnum.Pending, processTime: futureTime, priority: WorkItemPriorityEnum.Stat)); broker.AddWorkItem(CreateWorkItem(_idIdling, "3", status: WorkItemStatusEnum.Idle, processTime: time.AddMinutes(-3), priority: WorkItemPriorityEnum.Stat)); broker.AddWorkItem(CreateWorkItem(_idPending, "4", status: WorkItemStatusEnum.Pending, processTime: time.AddMinutes(-1), priority: WorkItemPriorityEnum.Stat)); broker.AddWorkItem(CreateWorkItem(_idIdling, "5", status: WorkItemStatusEnum.Idle, processTime: time.AddMinutes(-1))); context.Commit(); } using (var context = new DataAccessContext()) { var broker = context.GetWorkItemBroker(); // there are 5 processable items here (status is idle or pending, and process time in the past) var topProcessable = broker.GetWorkItemsForProcessing(3); var allProcessable = broker.GetWorkItemsForProcessing(7); // this ensures that the results are valid by checking that future time is indeed still in the future Assert.Less(DateTime.Now, futureTime, "Rerun Test! - Results are invalid due to an unreasonable delay during test setup, causing future timestamps to not be in the future"); Assert.AreEqual(3, topProcessable.Count, "Query top should yield 3 items"); Assert.IsTrue(topProcessable.All(x => x.Status == WorkItemStatusEnum.Idle || x.Status == WorkItemStatusEnum.Pending), "Query top yielded item with wrong status"); Assert.AreEqual("3", topProcessable[0].StudyInstanceUid, "Query top yielded item with wrong identity"); Assert.AreEqual("4", topProcessable[1].StudyInstanceUid, "Query top yielded item with wrong identity"); Assert.AreEqual("1a", topProcessable[2].StudyInstanceUid, "Query top yielded item with wrong identity"); Assert.AreEqual(5, allProcessable.Count, "Query all should yield 5 items"); Assert.IsTrue(allProcessable.All(x => x.Status == WorkItemStatusEnum.Idle || x.Status == WorkItemStatusEnum.Pending), "Query top yielded item with wrong status"); Assert.AreEqual("3", allProcessable[0].StudyInstanceUid, "Query top yielded item with wrong identity"); Assert.AreEqual("4", allProcessable[1].StudyInstanceUid, "Query top yielded item with wrong identity"); Assert.AreEqual("1a", allProcessable[2].StudyInstanceUid, "Query top yielded item with wrong identity"); Assert.AreEqual("1b", allProcessable[3].StudyInstanceUid, "Query top yielded item with wrong identity"); Assert.AreEqual("5", allProcessable[4].StudyInstanceUid, "Query top yielded item with wrong identity"); } }
public WorkItemUpdateResponse Update(WorkItemUpdateRequest request) { var response = new WorkItemUpdateResponse(); using (var context = new DataAccessContext(DataAccessContext.WorkItemMutex)) { var broker = context.GetWorkItemBroker(); var workItem = broker.GetWorkItem(request.Identifier); if (workItem == null) { response.Item = null; return(response); } bool deleted = false; if (request.Delete.HasValue && request.Delete.Value) { if (workItem.Status != WorkItemStatusEnum.InProgress) { workItem.Status = WorkItemStatusEnum.Deleted; deleted = true; // If StudyDelete we're removing, "undelete" the study CheckDeleteStudyCanceled(context, workItem); } } if (!deleted) { if (request.ExpirationTime.HasValue) { workItem.ExpirationTime = request.ExpirationTime.Value; } if (request.Priority.HasValue) { workItem.Priority = request.Priority.Value; } if (request.Status.HasValue && workItem.Status != WorkItemStatusEnum.InProgress) { workItem.Status = request.Status.Value; if (request.Status.Value == WorkItemStatusEnum.Canceled) { workItem.DeleteTime = Platform.Time.AddMinutes(WorkItemServiceSettings.Default.DeleteDelayMinutes); } else if (request.Status.Value == WorkItemStatusEnum.Pending) { workItem.ScheduledTime = Platform.Time; workItem.FailureCount = 0; } // Cache the UserIdentityContext for later use by the shred if (workItem.Request.WorkItemType.Equals(ImportFilesRequest.WorkItemTypeString) && request.Status.Value == WorkItemStatusEnum.Pending) { UserIdentityCache.Put(workItem.Oid, UserIdentityContext.CreateFromCurrentThreadPrincipal()); } } if (request.ProcessTime.HasValue) { workItem.ProcessTime = request.ProcessTime.Value; } if (request.Cancel.HasValue && request.Cancel.Value) { if (workItem.Progress == null || workItem.Progress.IsCancelable) { if (workItem.Status.Equals(WorkItemStatusEnum.Idle) || workItem.Status.Equals(WorkItemStatusEnum.Pending)) { workItem.Status = WorkItemStatusEnum.Canceled; // If StudyDelete we're removing, "undelete" the study CheckDeleteStudyCanceled(context, workItem); } else if (workItem.Status.Equals(WorkItemStatusEnum.InProgress)) { // Abort the WorkItem WorkItemProcessor.Instance.Cancel(workItem.Oid); } } } } context.Commit(); response.Item = WorkItemDataHelper.FromWorkItem(workItem); } WorkItemPublishSubscribeHelper.PublishWorkItemChanged(WorkItemsChangedEventType.Update, response.Item); return(response); }
protected override void OnExecute(CommandProcessor theProcessor) { var workItemBroker = DataAccessContext.GetWorkItemBroker(); DateTime now = Platform.Time; if (WorkItem != null) { // Already have a committed WorkItem, just set the Oid WorkItemUid.WorkItemOid = WorkItem.Oid; WorkItem = workItemBroker.GetWorkItem(WorkItem.Oid); if (WorkItem.Status == WorkItemStatusEnum.Idle || WorkItem.Status == WorkItemStatusEnum.Pending || WorkItem.Status == WorkItemStatusEnum.InProgress) { WorkItem.ExpirationTime = now.AddSeconds(ExpirationDelaySeconds); var workItemUidBroker = DataAccessContext.GetWorkItemUidBroker(); workItemUidBroker.AddWorkItemUid(WorkItemUid); } else { WorkItem = null; } } if (WorkItem == null) { var list = workItemBroker.GetWorkItems(_request.WorkItemType, WorkItemStatusFilter.Active, _studyInstanceUid); if (list != null) { foreach (var item in list) { if (item.Request.GetType() == _request.GetType()) { var thisRequest = _request as DicomReceiveRequest; if (thisRequest != null) { var request = item.Request as DicomReceiveRequest; if (request != null) { if (request.SourceServerName.Equals(thisRequest.SourceServerName)) { WorkItem = item; break; } } } else { WorkItem = item; break; } } } } if (WorkItem == null) { WorkItem = new WorkItem { ScheduledTime = now.AddSeconds(WorkItemServiceSettings.Default.InsertDelaySeconds), Request = _request, ProcessTime = now.AddSeconds(WorkItemServiceSettings.Default.InsertDelaySeconds), Priority = _request.Priority, Type = _request.WorkItemType, DeleteTime = now.AddHours(2), ExpirationTime = now.AddSeconds(ExpirationDelaySeconds), RequestedTime = now, StudyInstanceUid = _studyInstanceUid, Status = WorkItemStatusEnum.Pending, Progress = _progress }; workItemBroker.AddWorkItem(WorkItem); WorkItemUid.WorkItem = WorkItem; var workItemUidBroker = DataAccessContext.GetWorkItemUidBroker(); workItemUidBroker.AddWorkItemUid(WorkItemUid); } else { WorkItem.ExpirationTime = now.AddSeconds(ExpirationDelaySeconds); WorkItemUid.WorkItemOid = WorkItem.Oid; var workItemUidBroker = DataAccessContext.GetWorkItemUidBroker(); workItemUidBroker.AddWorkItemUid(WorkItemUid); } } }
public void TestGetWorkItemsScheduledBeforeOrHighPriority() { DeleteAllWorkItems(); var time = DateTime.Now.Truncate(); var pastTime = time.AddMinutes(-30); var futureTime = time.AddMinutes(30); using (var context = new DataAccessContext()) { var broker = context.GetWorkItemBroker(); broker.AddWorkItem(CreateWorkItem(_idCancelled, "1", status: WorkItemStatusEnum.Canceled, scheduledTime: pastTime)); broker.AddWorkItem(CreateWorkItem(_idCanceling, "1", status: WorkItemStatusEnum.Canceling, scheduledTime: pastTime, priority: WorkItemPriorityEnum.Stat)); broker.AddWorkItem(CreateWorkItem(_idComplete, "1", status: WorkItemStatusEnum.Complete, scheduledTime: pastTime)); broker.AddWorkItem(CreateWorkItem(_idDeleting, "1", status: WorkItemStatusEnum.DeleteInProgress, scheduledTime: pastTime)); broker.AddWorkItem(CreateWorkItem(_idDeleted, "1", status: WorkItemStatusEnum.Deleted, scheduledTime: pastTime)); broker.AddWorkItem(CreateWorkItem(_idFailed, "1", status: WorkItemStatusEnum.Failed, scheduledTime: pastTime)); broker.AddWorkItem(CreateWorkItem(_idIdling, "1", status: WorkItemStatusEnum.Idle, scheduledTime: pastTime, priority: WorkItemPriorityEnum.High)); broker.AddWorkItem(CreateWorkItem(_idInProgress, "1", status: WorkItemStatusEnum.InProgress, scheduledTime: pastTime)); broker.AddWorkItem(CreateWorkItem(_idPending, "1", status: WorkItemStatusEnum.Pending, scheduledTime: pastTime)); broker.AddWorkItem(CreateWorkItem(_idCancelled, "2", status: WorkItemStatusEnum.Canceled, scheduledTime: futureTime)); broker.AddWorkItem(CreateWorkItem(_idCanceling, "2", status: WorkItemStatusEnum.Canceling, scheduledTime: futureTime)); broker.AddWorkItem(CreateWorkItem(_idComplete, "2", status: WorkItemStatusEnum.Complete, scheduledTime: futureTime)); broker.AddWorkItem(CreateWorkItem(_idDeleting, "2", status: WorkItemStatusEnum.DeleteInProgress, scheduledTime: futureTime)); broker.AddWorkItem(CreateWorkItem(_idDeleted, "2", status: WorkItemStatusEnum.Deleted, scheduledTime: futureTime)); broker.AddWorkItem(CreateWorkItem(_idFailed, "2", status: WorkItemStatusEnum.Failed, scheduledTime: futureTime)); broker.AddWorkItem(CreateWorkItem(_idIdling, "2", status: WorkItemStatusEnum.Idle, scheduledTime: futureTime, priority: WorkItemPriorityEnum.High)); broker.AddWorkItem(CreateWorkItem(_idInProgress, "2", status: WorkItemStatusEnum.InProgress, scheduledTime: futureTime)); broker.AddWorkItem(CreateWorkItem(_idPending, "2", status: WorkItemStatusEnum.Pending, scheduledTime: futureTime, priority: WorkItemPriorityEnum.Stat)); broker.AddWorkItem(CreateWorkItem(_idIdling, "3", status: WorkItemStatusEnum.Idle, scheduledTime: time.AddMinutes(-3), priority: WorkItemPriorityEnum.Stat)); broker.AddWorkItem(CreateWorkItem(_idPending, "4", status: WorkItemStatusEnum.Pending, scheduledTime: time.AddMinutes(-1), priority: WorkItemPriorityEnum.High)); broker.AddWorkItem(CreateWorkItem(_idIdling, "5", status: WorkItemStatusEnum.Idle, scheduledTime: time.AddMinutes(-1))); context.Commit(); } using (var context = new DataAccessContext()) { var broker = context.GetWorkItemBroker(); var highPriority = broker.GetWorkItemsScheduledBeforeOrHigherPriority(time, WorkItemPriorityEnum.High, null, null, null).ToList(); var highPriorityFuture = broker.GetWorkItemsScheduledBeforeOrHigherPriority(futureTime.AddMinutes(10), WorkItemPriorityEnum.High, null, null, null).ToList(); var highPriorityPast = broker.GetWorkItemsScheduledBeforeOrHigherPriority(time.AddMinutes(-10), WorkItemPriorityEnum.High, null, null, null).ToList(); var highPriorityRunningOrIdle = broker.GetWorkItemsScheduledBeforeOrHigherPriority(time, WorkItemPriorityEnum.High, WorkItemStatusFilter.RunningOrIdle, null, null).ToList(); var highPriorityStudyFilter = broker.GetWorkItemsScheduledBeforeOrHigherPriority(time, WorkItemPriorityEnum.High, null, "1", null).ToList(); var highPriorityTypeFilter = broker.GetWorkItemsScheduledBeforeOrHigherPriority(time, WorkItemPriorityEnum.High, null, null, _idCanceling, _idInProgress, _idPending).ToList(); var highPriorityStudyTypeFilter = broker.GetWorkItemsScheduledBeforeOrHigherPriority(time, WorkItemPriorityEnum.High, null, "1", _idCanceling, _idInProgress, _idPending).ToList(); // this ensures that the results are valid by checking that future time is indeed still in the future Assert.Less(DateTime.Now, futureTime, "Rerun Test! - Results are invalid due to an unreasonable delay during test setup, causing future timestamps to not be in the future"); Assert.AreEqual(4, highPriority.Count(), "Query yielded unexpected results for high or higher priority"); Assert.AreEqual("1" + _idCanceling, highPriority[0].StudyInstanceUid + highPriority[0].Type, "Query yield unexpected item"); Assert.AreEqual("3" + _idIdling, highPriority[1].StudyInstanceUid + highPriority[1].Type, "Query yield unexpected item"); Assert.AreEqual("1" + _idIdling, highPriority[2].StudyInstanceUid + highPriority[2].Type, "Query yield unexpected item"); Assert.AreEqual("4" + _idPending, highPriority[3].StudyInstanceUid + highPriority[3].Type, "Query yield unexpected item"); Assert.AreEqual(highPriority, highPriorityFuture, "Query should not yield results scheduled for future"); Assert.AreEqual(3, highPriorityPast.Count(), "Query yielded unexpected results for high or higher priority (past query)"); Assert.AreEqual("1" + _idCanceling, highPriorityPast[0].StudyInstanceUid + highPriorityPast[0].Type, "Query yield unexpected item (past query)"); Assert.AreEqual("3" + _idIdling, highPriorityPast[1].StudyInstanceUid + highPriorityPast[1].Type, "Query yield unexpected item (past query)"); Assert.AreEqual("1" + _idIdling, highPriorityPast[2].StudyInstanceUid + highPriorityPast[2].Type, "Query yield unexpected item (past query)"); Assert.AreEqual(3, highPriorityRunningOrIdle.Count(), "Query yielded unexpected results for high or higher priority (running or idle status filter)"); Assert.AreEqual("1" + _idCanceling, highPriorityRunningOrIdle[0].StudyInstanceUid + highPriorityRunningOrIdle[0].Type, "Query yield unexpected item (running or idle status filter)"); Assert.AreEqual("3" + _idIdling, highPriorityRunningOrIdle[1].StudyInstanceUid + highPriorityRunningOrIdle[1].Type, "Query yield unexpected item (running or idle status filter)"); Assert.AreEqual("1" + _idIdling, highPriorityRunningOrIdle[2].StudyInstanceUid + highPriorityRunningOrIdle[2].Type, "Query yield unexpected item (running or idle status filter)"); Assert.AreEqual(2, highPriorityStudyFilter.Count(), "Query yielded unexpected results for high or higher priority (study filter)"); Assert.AreEqual("1" + _idCanceling, highPriorityStudyFilter[0].StudyInstanceUid + highPriorityStudyFilter[0].Type, "Query yield unexpected item (study filter)"); Assert.AreEqual("1" + _idIdling, highPriorityStudyFilter[1].StudyInstanceUid + highPriorityStudyFilter[1].Type, "Query yield unexpected item (study filter)"); Assert.AreEqual(2, highPriorityTypeFilter.Count(), "Query yielded unexpected results for high or higher priority (type filter)"); Assert.AreEqual("1" + _idCanceling, highPriorityTypeFilter[0].StudyInstanceUid + highPriorityTypeFilter[0].Type, "Query yield unexpected item (type filter)"); Assert.AreEqual("4" + _idPending, highPriorityTypeFilter[1].StudyInstanceUid + highPriorityTypeFilter[1].Type, "Query yield unexpected item (type filter)"); Assert.AreEqual(1, highPriorityStudyTypeFilter.Count(), "Query yielded unexpected results for high or higher priority (study and type filter)"); Assert.AreEqual("1" + _idCanceling, highPriorityStudyTypeFilter[0].StudyInstanceUid + highPriorityStudyTypeFilter[0].Type, "Query yield unexpected item (study and type filter)"); } }
public WorkItemInsertResponse Insert(WorkItemInsertRequest request) { // TODO (CR Jun 2012): The fact that there is special processing in here for particular types of work items // indicates there is something wrong with the design that may make adding custom work item types difficult. // Maybe the different "processors" need to perform the insert, or at least have some kind of method (rule) // for processing the insert? var response = new WorkItemInsertResponse(); using (var context = new DataAccessContext(DataAccessContext.WorkItemMutex)) { DateTime now = Platform.Time; var broker = context.GetWorkItemBroker(); if (request.Request.WorkItemType.Equals(ReindexRequest.WorkItemTypeString)) { var list = broker.GetWorkItems(request.Request.WorkItemType, null, null); foreach (var workItem in list) { if (workItem.Status == WorkItemStatusEnum.Pending || workItem.Status == WorkItemStatusEnum.InProgress) { response.Item = WorkItemDataHelper.FromWorkItem(workItem); return(response); } } } var deleteStudyRequest = request.Request as DeleteStudyRequest; if (deleteStudyRequest != null) { var list = broker.GetWorkItems(request.Request.WorkItemType, null, deleteStudyRequest.Study.StudyInstanceUid); foreach (var workItem in list) { if (workItem.Status == WorkItemStatusEnum.Pending || workItem.Status == WorkItemStatusEnum.InProgress) { // Mark studies to delete as "deleted" in the database. var studyBroker = context.GetStudyBroker(); var study = studyBroker.GetStudy(deleteStudyRequest.Study.StudyInstanceUid); if (study != null) { study.Deleted = true; context.Commit(); } response.Item = WorkItemDataHelper.FromWorkItem(workItem); return(response); } } } var item = new WorkItem { Request = request.Request, Progress = request.Progress, Type = request.Request.WorkItemType, Priority = request.Request.Priority, ScheduledTime = now.AddSeconds(WorkItemServiceSettings.Default.InsertDelaySeconds), ProcessTime = now.AddSeconds(WorkItemServiceSettings.Default.InsertDelaySeconds), DeleteTime = now.AddMinutes(WorkItemServiceSettings.Default.DeleteDelayMinutes), ExpirationTime = now.AddSeconds(WorkItemServiceSettings.Default.ExpireDelaySeconds), RequestedTime = now, Status = WorkItemStatusEnum.Pending }; var studyRequest = request.Request as WorkItemStudyRequest; if (studyRequest != null) { item.StudyInstanceUid = studyRequest.Study.StudyInstanceUid; if (request.Request.WorkItemType.Equals(DeleteStudyRequest.WorkItemTypeString)) { // Mark studies to delete as "deleted" in the database. var studyBroker = context.GetStudyBroker(); var study = studyBroker.GetStudy(studyRequest.Study.StudyInstanceUid); if (study != null) { study.Deleted = true; } } } broker.AddWorkItem(item); context.Commit(); response.Item = WorkItemDataHelper.FromWorkItem(item); } // Cache the UserIdentityContext for later use by the shred if (request.Request.WorkItemType.Equals(ImportFilesRequest.WorkItemTypeString)) { UserIdentityCache.Put(response.Item.Identifier, UserIdentityContext.CreateFromCurrentThreadPrincipal()); } WorkItemPublishSubscribeHelper.PublishWorkItemChanged(WorkItemsChangedEventType.Update, response.Item); if (WorkItemProcessor.Instance != null) { WorkItemProcessor.Instance.SignalThread(); } return(response); }
public void TestAddAndGet() { DeleteAllWorkItems(); var time = new DateTime(2014, 07, 01, 11, 12, 45); long oid; string version; using (var context = new DataAccessContext()) { var workItem = CreateWorkItem("blah", "1", WorkItemPriorityEnum.High, WorkItemStatusEnum.Idle, 987, time, time.AddMinutes(1), time.AddMinutes(10), time.AddMinutes(30), time.AddMinutes(60), "request data", "progress data"); var broker = context.GetWorkItemBroker(); broker.AddWorkItem(CreateWorkItem("junk", "2")); broker.AddWorkItem(workItem); broker.AddWorkItem(CreateWorkItem("junk", "3")); context.Commit(); Assert.AreNotEqual(0, oid = workItem.Oid, "Oid should have been assigned on insert"); Assert.IsNotNull(workItem.Version, "Version should have been assigned on insert"); version = workItem.Version.ToString(); } using (var context = new DataAccessContext()) { var broker = context.GetWorkItemBroker(); var workItem = broker.GetWorkItem(oid); Assert.AreEqual("blah", workItem.Type, "Type"); Assert.AreEqual("1", workItem.StudyInstanceUid, "StudyInstanceUid"); Assert.AreEqual(WorkItemPriorityEnum.High, workItem.Priority, "Priority"); Assert.AreEqual(WorkItemStatusEnum.Idle, workItem.Status, "Status"); Assert.AreEqual(987, workItem.FailureCount, "FailureCount"); Assert.AreEqual(time, workItem.RequestedTime, "RequestedTime"); Assert.AreEqual(time.AddMinutes(1), workItem.ScheduledTime, "ScheduledTime"); Assert.AreEqual(time.AddMinutes(10), workItem.ProcessTime, "ProcessTime"); Assert.AreEqual(time.AddMinutes(30), workItem.ExpirationTime, "ExpirationTime"); Assert.AreEqual(time.AddMinutes(60), workItem.DeleteTime, "DeleteTime"); Assert.IsNotNull(workItem.Request, "Request"); Assert.AreEqual("request data", workItem.Request.WorkItemType, "Request.WorkItemType"); Assert.IsNotNull(workItem.Progress, "Progress"); Assert.AreEqual("progress data", workItem.Progress.StatusDetails, "Progress.StatusDetails"); workItem.Status = WorkItemStatusEnum.Pending; context.Commit(); Assert.AreNotEqual(version, workItem.Version, "Version should have been changed on update"); } using (var context = new DataAccessContext()) { var broker = context.GetWorkItemBroker(); var workItem = broker.GetWorkItem(oid); Assert.AreEqual("blah", workItem.Type, "Type after update"); Assert.AreEqual("1", workItem.StudyInstanceUid, "StudyInstanceUid after update"); Assert.AreEqual(WorkItemPriorityEnum.High, workItem.Priority, "Priority after update"); Assert.AreEqual(WorkItemStatusEnum.Pending, workItem.Status, "Status after update"); Assert.AreEqual(987, workItem.FailureCount, "FailureCount after update"); Assert.AreEqual(time, workItem.RequestedTime, "RequestedTime after update"); Assert.AreEqual(time.AddMinutes(1), workItem.ScheduledTime, "ScheduledTime after update"); Assert.AreEqual(time.AddMinutes(10), workItem.ProcessTime, "ProcessTime after update"); Assert.AreEqual(time.AddMinutes(30), workItem.ExpirationTime, "ExpirationTime after update"); Assert.AreEqual(time.AddMinutes(60), workItem.DeleteTime, "DeleteTime after update"); Assert.IsNotNull(workItem.Request, "Request after update"); Assert.AreEqual("request data", workItem.Request.WorkItemType, "Request.WorkItemType after update"); Assert.IsNotNull(workItem.Progress, "Progress after update"); Assert.AreEqual("progress data", workItem.Progress.StatusDetails, "Progress.StatusDetails after update"); } }
public void TestGetWorkItems() { DeleteAllWorkItems(); var time = DateTime.Now.Truncate(); var pastTime = time.AddMinutes(-30); var futureTime = time.AddMinutes(30); long oidOfActive, oidOfDeleted, oidOfDeleting; using (var context = new DataAccessContext()) { WorkItem itemA, itemB, itemC; var broker = context.GetWorkItemBroker(); broker.AddWorkItem(CreateWorkItem(_idCancelled, "1", status : WorkItemStatusEnum.Canceled, processTime : pastTime)); broker.AddWorkItem(CreateWorkItem(_idCanceling, "1", status : WorkItemStatusEnum.Canceling, processTime : pastTime, priority : WorkItemPriorityEnum.Stat)); broker.AddWorkItem(CreateWorkItem(_idComplete, "1", status : WorkItemStatusEnum.Complete, processTime : pastTime)); broker.AddWorkItem(CreateWorkItem(_idDeleting, "1", status : WorkItemStatusEnum.DeleteInProgress, processTime : pastTime)); broker.AddWorkItem(CreateWorkItem(_idDeleted, "1", status : WorkItemStatusEnum.Deleted, processTime : pastTime)); broker.AddWorkItem(CreateWorkItem(_idFailed, "1", status : WorkItemStatusEnum.Failed, processTime : pastTime)); broker.AddWorkItem(CreateWorkItem(_idIdling, "1", status : WorkItemStatusEnum.Idle, processTime : pastTime, priority : WorkItemPriorityEnum.High)); broker.AddWorkItem(CreateWorkItem(_idInProgress, "1", status : WorkItemStatusEnum.InProgress, processTime : pastTime)); broker.AddWorkItem(CreateWorkItem(_idPending, "1", status : WorkItemStatusEnum.Pending, processTime : pastTime)); broker.AddWorkItem(CreateWorkItem(_idCancelled, "2", status : WorkItemStatusEnum.Canceled, processTime : futureTime)); broker.AddWorkItem(CreateWorkItem(_idCanceling, "2", status : WorkItemStatusEnum.Canceling, processTime : futureTime)); broker.AddWorkItem(CreateWorkItem(_idComplete, "2", status : WorkItemStatusEnum.Complete, processTime : futureTime)); broker.AddWorkItem(itemB = CreateWorkItem(_idDeleting, "2", status : WorkItemStatusEnum.DeleteInProgress, processTime : futureTime)); broker.AddWorkItem(itemA = CreateWorkItem(_idDeleted, "2", status : WorkItemStatusEnum.Deleted, processTime : futureTime)); broker.AddWorkItem(CreateWorkItem(_idFailed, "2", status : WorkItemStatusEnum.Failed, processTime : futureTime)); broker.AddWorkItem(CreateWorkItem(_idIdling, "2", status : WorkItemStatusEnum.Idle, processTime : futureTime, priority : WorkItemPriorityEnum.High)); broker.AddWorkItem(itemC = CreateWorkItem(_idInProgress, "2", status : WorkItemStatusEnum.InProgress, processTime : futureTime)); broker.AddWorkItem(CreateWorkItem(_idPending, "2", status : WorkItemStatusEnum.Pending, processTime : futureTime, priority : WorkItemPriorityEnum.Stat)); broker.AddWorkItem(CreateWorkItem(_idIdling, "3", status : WorkItemStatusEnum.Idle, processTime : time.AddMinutes(-3), priority : WorkItemPriorityEnum.Stat)); broker.AddWorkItem(CreateWorkItem(_idPending, "4", status : WorkItemStatusEnum.Pending, processTime : time.AddMinutes(-1), priority : WorkItemPriorityEnum.High)); broker.AddWorkItem(CreateWorkItem(_idIdling, "5", status : WorkItemStatusEnum.Idle, processTime : time.AddMinutes(-1))); broker.AddWorkItem(CreateWorkItem(_idIdling, "999", status : WorkItemStatusEnum.Deleted, processTime : time.AddMinutes(-1))); context.Commit(); oidOfDeleted = itemA.Oid; oidOfDeleting = itemB.Oid; oidOfActive = itemC.Oid; } using (var context = new DataAccessContext()) { var broker = context.GetWorkItemBroker(); var getByOid = broker.GetWorkItems(null, null, null, oidOfActive).SingleOrDefault(); var getByDeletedOid = broker.GetWorkItems(null, null, null, oidOfDeleted).ToList(); var getByOidAndStudy = broker.GetWorkItems(null, null, "1", oidOfDeleted).ToList(); var getByStudy = broker.GetWorkItems(null, null, "2").ToList(); var getByStatus = broker.GetWorkItems(null, WorkItemStatusFilter.RunningOrIdle, string.Empty).ToList(); var getByStatusAndStudy = broker.GetWorkItems(null, WorkItemStatusFilter.RunningOrIdle, "2").ToList(); var getByType = broker.GetWorkItems(_idIdling, null, null).ToList(); var getByTypeAndStatus = broker.GetWorkItems(_idIdling, WorkItemStatusFilter.Nil, null).ToList(); var getByTypeAndStatusAndStudy = broker.GetWorkItems(_idIdling, WorkItemStatusFilter.Nil, "2").SingleOrDefault(); // this ensures that the results are valid by checking that future time is indeed still in the future Assert.Less(DateTime.Now, futureTime, "Rerun Test! - Results are invalid due to an unreasonable delay during test setup, causing future timestamps to not be in the future"); Assert.IsNotNull(getByOid, "Query by OID did not return expected result"); Assert.AreEqual(oidOfActive, getByOid.Oid, "Query by OID did not return expected result"); Assert.IsFalse(getByDeletedOid.Any(), "Query by OID (Deleted) should not return any results"); Assert.IsFalse(getByOidAndStudy.Any(), "Query by OID and Study should not return any results"); Assert.AreEqual(7, getByStudy.Count, "Query by Study did not expected number of results"); Assert.AreEqual(7, getByStudy.Select(x => x.Oid).Distinct().Count(), "Query by Study did not expected number of results"); Assert.IsFalse(getByStudy.Any(x => x.Oid == oidOfDeleted || x.Oid == oidOfDeleting), "Query by Study returned deleted items"); Assert.AreEqual(getByStudy.OrderBy(x => x.Priority).ThenBy(x => x.ProcessTime).ToList(), getByStudy, "Query by Study returned items out of order"); Assert.AreEqual(8, getByStatus.Count, "Query by Status did not expected number of results"); Assert.AreEqual(8, getByStatus.Select(x => x.Oid).Distinct().Count(), "Query by Status did not expected number of results"); Assert.IsTrue(getByStatus.All(x => x.Status == WorkItemStatusEnum.Canceling || x.Status == WorkItemStatusEnum.InProgress || x.Status == WorkItemStatusEnum.Idle), "Query by Status returned deleted items"); Assert.AreEqual(getByStatus.OrderBy(x => x.Priority).ThenBy(x => x.ProcessTime).ToList(), getByStatus, "Query by Status returned items out of order"); Assert.AreEqual(3, getByStatusAndStudy.Count, "Query by Status and Study did not expected number of results"); Assert.AreEqual(3, getByStatusAndStudy.Select(x => x.Oid).Distinct().Count(), "Query by Status and Study did not expected number of results"); Assert.IsTrue(getByStatusAndStudy.All(x => x.Status == WorkItemStatusEnum.Canceling || x.Status == WorkItemStatusEnum.InProgress || x.Status == WorkItemStatusEnum.Idle), "Query by Status and Study returned deleted items"); Assert.AreEqual(getByStatusAndStudy.OrderBy(x => x.Priority).ThenBy(x => x.ProcessTime).ToList(), getByStatusAndStudy, "Query by Status and Study returned items out of order"); Assert.AreEqual(4, getByType.Count, "Query by Type did not expected number of results"); Assert.AreEqual(4, getByType.Select(x => x.Oid).Distinct().Count(), "Query by Type did not expected number of results"); Assert.IsTrue(getByType.All(x => x.Status == WorkItemStatusEnum.Canceling || x.Status == WorkItemStatusEnum.InProgress || x.Status == WorkItemStatusEnum.Idle), "Query by Type returned deleted items"); Assert.AreEqual(getByType.OrderBy(x => x.Priority).ThenBy(x => x.ProcessTime).ToList(), getByType, "Query by Type returned items out of order"); Assert.AreEqual(5, getByTypeAndStatus.Count, "Query by Type and Status did not expected number of results"); Assert.AreEqual(5, getByTypeAndStatus.Select(x => x.Oid).Distinct().Count(), "Query by Type and Status did not expected number of results"); Assert.IsTrue(getByTypeAndStatus.All(x => x.Status == WorkItemStatusEnum.Canceling || x.Status == WorkItemStatusEnum.InProgress || x.Status == WorkItemStatusEnum.Idle || x.StudyInstanceUid == "999"), "Query by Type and Status returned unexpected items"); Assert.AreEqual(getByTypeAndStatus.OrderBy(x => x.Priority).ThenBy(x => x.ProcessTime).ToList(), getByTypeAndStatus, "Query by Type and Status returned items out of order"); Assert.IsNotNull(getByTypeAndStatusAndStudy, "Query by Type and Status and Study did not expected results"); } }
public void TestGetWorkItems() { DeleteAllWorkItems(); var time = DateTime.Now.Truncate(); var pastTime = time.AddMinutes(-30); var futureTime = time.AddMinutes(30); long oidOfActive, oidOfDeleted, oidOfDeleting; using (var context = new DataAccessContext()) { WorkItem itemA, itemB, itemC; var broker = context.GetWorkItemBroker(); broker.AddWorkItem(CreateWorkItem(_idCancelled, "1", status: WorkItemStatusEnum.Canceled, processTime: pastTime)); broker.AddWorkItem(CreateWorkItem(_idCanceling, "1", status: WorkItemStatusEnum.Canceling, processTime: pastTime, priority: WorkItemPriorityEnum.Stat)); broker.AddWorkItem(CreateWorkItem(_idComplete, "1", status: WorkItemStatusEnum.Complete, processTime: pastTime)); broker.AddWorkItem(CreateWorkItem(_idDeleting, "1", status: WorkItemStatusEnum.DeleteInProgress, processTime: pastTime)); broker.AddWorkItem(CreateWorkItem(_idDeleted, "1", status: WorkItemStatusEnum.Deleted, processTime: pastTime)); broker.AddWorkItem(CreateWorkItem(_idFailed, "1", status: WorkItemStatusEnum.Failed, processTime: pastTime)); broker.AddWorkItem(CreateWorkItem(_idIdling, "1", status: WorkItemStatusEnum.Idle, processTime: pastTime, priority: WorkItemPriorityEnum.High)); broker.AddWorkItem(CreateWorkItem(_idInProgress, "1", status: WorkItemStatusEnum.InProgress, processTime: pastTime)); broker.AddWorkItem(CreateWorkItem(_idPending, "1", status: WorkItemStatusEnum.Pending, processTime: pastTime)); broker.AddWorkItem(CreateWorkItem(_idCancelled, "2", status: WorkItemStatusEnum.Canceled, processTime: futureTime)); broker.AddWorkItem(CreateWorkItem(_idCanceling, "2", status: WorkItemStatusEnum.Canceling, processTime: futureTime)); broker.AddWorkItem(CreateWorkItem(_idComplete, "2", status: WorkItemStatusEnum.Complete, processTime: futureTime)); broker.AddWorkItem(itemB = CreateWorkItem(_idDeleting, "2", status: WorkItemStatusEnum.DeleteInProgress, processTime: futureTime)); broker.AddWorkItem(itemA = CreateWorkItem(_idDeleted, "2", status: WorkItemStatusEnum.Deleted, processTime: futureTime)); broker.AddWorkItem(CreateWorkItem(_idFailed, "2", status: WorkItemStatusEnum.Failed, processTime: futureTime)); broker.AddWorkItem(CreateWorkItem(_idIdling, "2", status: WorkItemStatusEnum.Idle, processTime: futureTime, priority: WorkItemPriorityEnum.High)); broker.AddWorkItem(itemC = CreateWorkItem(_idInProgress, "2", status: WorkItemStatusEnum.InProgress, processTime: futureTime)); broker.AddWorkItem(CreateWorkItem(_idPending, "2", status: WorkItemStatusEnum.Pending, processTime: futureTime, priority: WorkItemPriorityEnum.Stat)); broker.AddWorkItem(CreateWorkItem(_idIdling, "3", status: WorkItemStatusEnum.Idle, processTime: time.AddMinutes(-3), priority: WorkItemPriorityEnum.Stat)); broker.AddWorkItem(CreateWorkItem(_idPending, "4", status: WorkItemStatusEnum.Pending, processTime: time.AddMinutes(-1), priority: WorkItemPriorityEnum.High)); broker.AddWorkItem(CreateWorkItem(_idIdling, "5", status: WorkItemStatusEnum.Idle, processTime: time.AddMinutes(-1))); broker.AddWorkItem(CreateWorkItem(_idIdling, "999", status: WorkItemStatusEnum.Deleted, processTime: time.AddMinutes(-1))); context.Commit(); oidOfDeleted = itemA.Oid; oidOfDeleting = itemB.Oid; oidOfActive = itemC.Oid; } using (var context = new DataAccessContext()) { var broker = context.GetWorkItemBroker(); var getByOid = broker.GetWorkItems(null, null, null, oidOfActive).SingleOrDefault(); var getByDeletedOid = broker.GetWorkItems(null, null, null, oidOfDeleted).ToList(); var getByOidAndStudy = broker.GetWorkItems(null, null, "1", oidOfDeleted).ToList(); var getByStudy = broker.GetWorkItems(null, null, "2").ToList(); var getByStatus = broker.GetWorkItems(null, WorkItemStatusFilter.RunningOrIdle, string.Empty).ToList(); var getByStatusAndStudy = broker.GetWorkItems(null, WorkItemStatusFilter.RunningOrIdle, "2").ToList(); var getByType = broker.GetWorkItems(_idIdling, null, null).ToList(); var getByTypeAndStatus = broker.GetWorkItems(_idIdling, WorkItemStatusFilter.Nil, null).ToList(); var getByTypeAndStatusAndStudy = broker.GetWorkItems(_idIdling, WorkItemStatusFilter.Nil, "2").SingleOrDefault(); // this ensures that the results are valid by checking that future time is indeed still in the future Assert.Less(DateTime.Now, futureTime, "Rerun Test! - Results are invalid due to an unreasonable delay during test setup, causing future timestamps to not be in the future"); Assert.IsNotNull(getByOid, "Query by OID did not return expected result"); Assert.AreEqual(oidOfActive, getByOid.Oid, "Query by OID did not return expected result"); Assert.IsFalse(getByDeletedOid.Any(), "Query by OID (Deleted) should not return any results"); Assert.IsFalse(getByOidAndStudy.Any(), "Query by OID and Study should not return any results"); Assert.AreEqual(7, getByStudy.Count, "Query by Study did not expected number of results"); Assert.AreEqual(7, getByStudy.Select(x => x.Oid).Distinct().Count(), "Query by Study did not expected number of results"); Assert.IsFalse(getByStudy.Any(x => x.Oid == oidOfDeleted || x.Oid == oidOfDeleting), "Query by Study returned deleted items"); Assert.AreEqual(getByStudy.OrderBy(x => x.Priority).ThenBy(x => x.ProcessTime).ToList(), getByStudy, "Query by Study returned items out of order"); Assert.AreEqual(8, getByStatus.Count, "Query by Status did not expected number of results"); Assert.AreEqual(8, getByStatus.Select(x => x.Oid).Distinct().Count(), "Query by Status did not expected number of results"); Assert.IsTrue(getByStatus.All(x => x.Status == WorkItemStatusEnum.Canceling || x.Status == WorkItemStatusEnum.InProgress || x.Status == WorkItemStatusEnum.Idle), "Query by Status returned deleted items"); Assert.AreEqual(getByStatus.OrderBy(x => x.Priority).ThenBy(x => x.ProcessTime).ToList(), getByStatus, "Query by Status returned items out of order"); Assert.AreEqual(3, getByStatusAndStudy.Count, "Query by Status and Study did not expected number of results"); Assert.AreEqual(3, getByStatusAndStudy.Select(x => x.Oid).Distinct().Count(), "Query by Status and Study did not expected number of results"); Assert.IsTrue(getByStatusAndStudy.All(x => x.Status == WorkItemStatusEnum.Canceling || x.Status == WorkItemStatusEnum.InProgress || x.Status == WorkItemStatusEnum.Idle), "Query by Status and Study returned deleted items"); Assert.AreEqual(getByStatusAndStudy.OrderBy(x => x.Priority).ThenBy(x => x.ProcessTime).ToList(), getByStatusAndStudy, "Query by Status and Study returned items out of order"); Assert.AreEqual(4, getByType.Count, "Query by Type did not expected number of results"); Assert.AreEqual(4, getByType.Select(x => x.Oid).Distinct().Count(), "Query by Type did not expected number of results"); Assert.IsTrue(getByType.All(x => x.Status == WorkItemStatusEnum.Canceling || x.Status == WorkItemStatusEnum.InProgress || x.Status == WorkItemStatusEnum.Idle), "Query by Type returned deleted items"); Assert.AreEqual(getByType.OrderBy(x => x.Priority).ThenBy(x => x.ProcessTime).ToList(), getByType, "Query by Type returned items out of order"); Assert.AreEqual(5, getByTypeAndStatus.Count, "Query by Type and Status did not expected number of results"); Assert.AreEqual(5, getByTypeAndStatus.Select(x => x.Oid).Distinct().Count(), "Query by Type and Status did not expected number of results"); Assert.IsTrue(getByTypeAndStatus.All(x => x.Status == WorkItemStatusEnum.Canceling || x.Status == WorkItemStatusEnum.InProgress || x.Status == WorkItemStatusEnum.Idle || x.StudyInstanceUid == "999"), "Query by Type and Status returned unexpected items"); Assert.AreEqual(getByTypeAndStatus.OrderBy(x => x.Priority).ThenBy(x => x.ProcessTime).ToList(), getByTypeAndStatus, "Query by Type and Status returned items out of order"); Assert.IsNotNull(getByTypeAndStatusAndStudy, "Query by Type and Status and Study did not expected results"); } }
public void TestGetWorkItemsForProcessingAnyPriority() { DeleteAllWorkItems(); var time = DateTime.Now.Truncate(); var pastTime = time.AddMinutes(-30); var futureTime = time.AddMinutes(30); using (var context = new DataAccessContext()) { var broker = context.GetWorkItemBroker(); broker.AddWorkItem(CreateWorkItem(_idCancelled, "1", status : WorkItemStatusEnum.Canceled, processTime : pastTime)); broker.AddWorkItem(CreateWorkItem(_idCanceling, "1", status : WorkItemStatusEnum.Canceling, processTime : pastTime)); broker.AddWorkItem(CreateWorkItem(_idComplete, "1", status : WorkItemStatusEnum.Complete, processTime : pastTime)); broker.AddWorkItem(CreateWorkItem(_idDeleting, "1", status : WorkItemStatusEnum.DeleteInProgress, processTime : pastTime)); broker.AddWorkItem(CreateWorkItem(_idDeleted, "1", status : WorkItemStatusEnum.Deleted, processTime : pastTime)); broker.AddWorkItem(CreateWorkItem(_idFailed, "1", status : WorkItemStatusEnum.Failed, processTime : pastTime)); broker.AddWorkItem(CreateWorkItem(_idIdling, "1a", status : WorkItemStatusEnum.Idle, processTime : pastTime, priority : WorkItemPriorityEnum.High)); broker.AddWorkItem(CreateWorkItem(_idInProgress, "1", status : WorkItemStatusEnum.InProgress, processTime : pastTime)); broker.AddWorkItem(CreateWorkItem(_idPending, "1b", status : WorkItemStatusEnum.Pending, processTime : pastTime)); broker.AddWorkItem(CreateWorkItem(_idCancelled, "2", status : WorkItemStatusEnum.Canceled, processTime : futureTime)); broker.AddWorkItem(CreateWorkItem(_idCanceling, "2", status : WorkItemStatusEnum.Canceling, processTime : futureTime)); broker.AddWorkItem(CreateWorkItem(_idComplete, "2", status : WorkItemStatusEnum.Complete, processTime : futureTime)); broker.AddWorkItem(CreateWorkItem(_idDeleting, "2", status : WorkItemStatusEnum.DeleteInProgress, processTime : futureTime)); broker.AddWorkItem(CreateWorkItem(_idDeleted, "2", status : WorkItemStatusEnum.Deleted, processTime : futureTime)); broker.AddWorkItem(CreateWorkItem(_idFailed, "2", status : WorkItemStatusEnum.Failed, processTime : futureTime)); broker.AddWorkItem(CreateWorkItem(_idIdling, "2a", status : WorkItemStatusEnum.Idle, processTime : futureTime, priority : WorkItemPriorityEnum.Stat)); broker.AddWorkItem(CreateWorkItem(_idInProgress, "2", status : WorkItemStatusEnum.InProgress, processTime : futureTime)); broker.AddWorkItem(CreateWorkItem(_idPending, "2b", status : WorkItemStatusEnum.Pending, processTime : futureTime, priority : WorkItemPriorityEnum.Stat)); broker.AddWorkItem(CreateWorkItem(_idIdling, "3", status : WorkItemStatusEnum.Idle, processTime : time.AddMinutes(-3), priority : WorkItemPriorityEnum.Stat)); broker.AddWorkItem(CreateWorkItem(_idPending, "4", status : WorkItemStatusEnum.Pending, processTime : time.AddMinutes(-1), priority : WorkItemPriorityEnum.Stat)); broker.AddWorkItem(CreateWorkItem(_idIdling, "5", status : WorkItemStatusEnum.Idle, processTime : time.AddMinutes(-1))); context.Commit(); } using (var context = new DataAccessContext()) { var broker = context.GetWorkItemBroker(); // there are 5 processable items here (status is idle or pending, and process time in the past) var topProcessable = broker.GetWorkItemsForProcessing(3); var allProcessable = broker.GetWorkItemsForProcessing(7); // this ensures that the results are valid by checking that future time is indeed still in the future Assert.Less(DateTime.Now, futureTime, "Rerun Test! - Results are invalid due to an unreasonable delay during test setup, causing future timestamps to not be in the future"); Assert.AreEqual(3, topProcessable.Count, "Query top should yield 3 items"); Assert.IsTrue(topProcessable.All(x => x.Status == WorkItemStatusEnum.Idle || x.Status == WorkItemStatusEnum.Pending), "Query top yielded item with wrong status"); Assert.AreEqual("3", topProcessable[0].StudyInstanceUid, "Query top yielded item with wrong identity"); Assert.AreEqual("4", topProcessable[1].StudyInstanceUid, "Query top yielded item with wrong identity"); Assert.AreEqual("1a", topProcessable[2].StudyInstanceUid, "Query top yielded item with wrong identity"); Assert.AreEqual(5, allProcessable.Count, "Query all should yield 5 items"); Assert.IsTrue(allProcessable.All(x => x.Status == WorkItemStatusEnum.Idle || x.Status == WorkItemStatusEnum.Pending), "Query top yielded item with wrong status"); Assert.AreEqual("3", allProcessable[0].StudyInstanceUid, "Query top yielded item with wrong identity"); Assert.AreEqual("4", allProcessable[1].StudyInstanceUid, "Query top yielded item with wrong identity"); Assert.AreEqual("1a", allProcessable[2].StudyInstanceUid, "Query top yielded item with wrong identity"); Assert.AreEqual("1b", allProcessable[3].StudyInstanceUid, "Query top yielded item with wrong identity"); Assert.AreEqual("5", allProcessable[4].StudyInstanceUid, "Query top yielded item with wrong identity"); } }
private static void DeleteAllWorkItemUids() { using (var context = new DataAccessContext()) { var workItemUidBroker = context.GetWorkItemUidBroker(); workItemUidBroker.DeleteAll(); var workItemBroker = context.GetWorkItemBroker(); workItemBroker.DeleteAll(); context.Commit(); } }
public void TestGetWorkItemsForProcessingWithPriority() { DeleteAllWorkItems(); var time = DateTime.Now.Truncate(); var pastTime = time.AddMinutes(-30); var futureTime = time.AddMinutes(30); using (var context = new DataAccessContext()) { var broker = context.GetWorkItemBroker(); broker.AddWorkItem(CreateWorkItem(_idCancelled, "1", status: WorkItemStatusEnum.Canceled, processTime: pastTime)); broker.AddWorkItem(CreateWorkItem(_idCanceling, "1", status: WorkItemStatusEnum.Canceling, processTime: pastTime)); broker.AddWorkItem(CreateWorkItem(_idComplete, "1", status: WorkItemStatusEnum.Complete, processTime: pastTime)); broker.AddWorkItem(CreateWorkItem(_idDeleting, "1", status: WorkItemStatusEnum.DeleteInProgress, processTime: pastTime)); broker.AddWorkItem(CreateWorkItem(_idDeleted, "1", status: WorkItemStatusEnum.Deleted, processTime: pastTime)); broker.AddWorkItem(CreateWorkItem(_idFailed, "1", status: WorkItemStatusEnum.Failed, processTime: pastTime)); broker.AddWorkItem(CreateWorkItem(_idIdling, "1a", status: WorkItemStatusEnum.Idle, processTime: pastTime, priority: WorkItemPriorityEnum.High)); broker.AddWorkItem(CreateWorkItem(_idInProgress, "1", status: WorkItemStatusEnum.InProgress, processTime: pastTime)); broker.AddWorkItem(CreateWorkItem(_idPending, "1b", status: WorkItemStatusEnum.Pending, processTime: pastTime)); broker.AddWorkItem(CreateWorkItem(_idCancelled, "2", status: WorkItemStatusEnum.Canceled, processTime: futureTime)); broker.AddWorkItem(CreateWorkItem(_idCanceling, "2", status: WorkItemStatusEnum.Canceling, processTime: futureTime)); broker.AddWorkItem(CreateWorkItem(_idComplete, "2", status: WorkItemStatusEnum.Complete, processTime: futureTime)); broker.AddWorkItem(CreateWorkItem(_idDeleting, "2", status: WorkItemStatusEnum.DeleteInProgress, processTime: futureTime)); broker.AddWorkItem(CreateWorkItem(_idDeleted, "2", status: WorkItemStatusEnum.Deleted, processTime: futureTime)); broker.AddWorkItem(CreateWorkItem(_idFailed, "2", status: WorkItemStatusEnum.Failed, processTime: futureTime)); broker.AddWorkItem(CreateWorkItem(_idIdling, "2a", status: WorkItemStatusEnum.Idle, processTime: futureTime, priority: WorkItemPriorityEnum.High)); broker.AddWorkItem(CreateWorkItem(_idInProgress, "2", status: WorkItemStatusEnum.InProgress, processTime: futureTime)); broker.AddWorkItem(CreateWorkItem(_idPending, "2b", status: WorkItemStatusEnum.Pending, processTime: futureTime, priority: WorkItemPriorityEnum.Stat)); broker.AddWorkItem(CreateWorkItem(_idIdling, "3", status: WorkItemStatusEnum.Idle, processTime: time.AddMinutes(-3), priority: WorkItemPriorityEnum.Stat)); broker.AddWorkItem(CreateWorkItem(_idPending, "4", status: WorkItemStatusEnum.Pending, processTime: time.AddMinutes(-1), priority: WorkItemPriorityEnum.Stat)); broker.AddWorkItem(CreateWorkItem(_idIdling, "5", status: WorkItemStatusEnum.Idle, processTime: time.AddMinutes(-1))); context.Commit(); } using (var context = new DataAccessContext()) { var broker = context.GetWorkItemBroker(); // there are 5 processable items here (status is idle or pending, and process time in the past) var highPriority = broker.GetWorkItemsForProcessing(1, WorkItemPriorityEnum.High).SingleOrDefault(); var statPriority = broker.GetWorkItemsForProcessing(1, WorkItemPriorityEnum.Stat).SingleOrDefault(); var normPriority = broker.GetWorkItemsForProcessing(1, WorkItemPriorityEnum.Normal).SingleOrDefault(); var allHighPriority = broker.GetWorkItemsForProcessing(9, WorkItemPriorityEnum.High); var allStatPriority = broker.GetWorkItemsForProcessing(9, WorkItemPriorityEnum.Stat); var allNormPriority = broker.GetWorkItemsForProcessing(9, WorkItemPriorityEnum.Normal); // this ensures that the results are valid by checking that future time is indeed still in the future Assert.Less(DateTime.Now, futureTime, "Rerun Test! - Results are invalid due to an unreasonable delay during test setup, causing future timestamps to not be in the future"); Assert.IsNotNull(highPriority, "Query top did not yield expected result for high"); Assert.AreEqual("1a", highPriority.StudyInstanceUid, "Query top yielded item with wrong identity"); Assert.IsNotNull(statPriority, "Query top did not yield expected result for stat"); Assert.AreEqual("3", statPriority.StudyInstanceUid, "Query top yielded item with wrong identity"); Assert.IsNotNull(normPriority, "Query top did not yield expected result for normal"); Assert.AreEqual("1b", normPriority.StudyInstanceUid, "Query top yielded item with wrong identity"); Assert.AreEqual(1, allHighPriority.Count, "Query top did not yield expected result for high"); Assert.AreEqual("1a", allHighPriority[0].StudyInstanceUid, "Query top yielded item with wrong identity"); Assert.AreEqual(2, allStatPriority.Count, "Query top did not yield expected result for stat"); Assert.AreEqual("3", allStatPriority[0].StudyInstanceUid, "Query top yielded item with wrong identity"); Assert.AreEqual("4", allStatPriority[1].StudyInstanceUid, "Query top yielded item with wrong identity"); Assert.AreEqual(2, allNormPriority.Count, "Query top did not yield expected result for normal"); Assert.AreEqual("1b", allNormPriority[0].StudyInstanceUid, "Query top yielded item with wrong identity"); Assert.AreEqual("5", allNormPriority[1].StudyInstanceUid, "Query top yielded item with wrong identity"); } }
public void TestGetWorkItemsForProcessingWithPriority() { DeleteAllWorkItems(); var time = DateTime.Now.Truncate(); var pastTime = time.AddMinutes(-30); var futureTime = time.AddMinutes(30); using (var context = new DataAccessContext()) { var broker = context.GetWorkItemBroker(); broker.AddWorkItem(CreateWorkItem(_idCancelled, "1", status : WorkItemStatusEnum.Canceled, processTime : pastTime)); broker.AddWorkItem(CreateWorkItem(_idCanceling, "1", status : WorkItemStatusEnum.Canceling, processTime : pastTime)); broker.AddWorkItem(CreateWorkItem(_idComplete, "1", status : WorkItemStatusEnum.Complete, processTime : pastTime)); broker.AddWorkItem(CreateWorkItem(_idDeleting, "1", status : WorkItemStatusEnum.DeleteInProgress, processTime : pastTime)); broker.AddWorkItem(CreateWorkItem(_idDeleted, "1", status : WorkItemStatusEnum.Deleted, processTime : pastTime)); broker.AddWorkItem(CreateWorkItem(_idFailed, "1", status : WorkItemStatusEnum.Failed, processTime : pastTime)); broker.AddWorkItem(CreateWorkItem(_idIdling, "1a", status : WorkItemStatusEnum.Idle, processTime : pastTime, priority : WorkItemPriorityEnum.High)); broker.AddWorkItem(CreateWorkItem(_idInProgress, "1", status : WorkItemStatusEnum.InProgress, processTime : pastTime)); broker.AddWorkItem(CreateWorkItem(_idPending, "1b", status : WorkItemStatusEnum.Pending, processTime : pastTime)); broker.AddWorkItem(CreateWorkItem(_idCancelled, "2", status : WorkItemStatusEnum.Canceled, processTime : futureTime)); broker.AddWorkItem(CreateWorkItem(_idCanceling, "2", status : WorkItemStatusEnum.Canceling, processTime : futureTime)); broker.AddWorkItem(CreateWorkItem(_idComplete, "2", status : WorkItemStatusEnum.Complete, processTime : futureTime)); broker.AddWorkItem(CreateWorkItem(_idDeleting, "2", status : WorkItemStatusEnum.DeleteInProgress, processTime : futureTime)); broker.AddWorkItem(CreateWorkItem(_idDeleted, "2", status : WorkItemStatusEnum.Deleted, processTime : futureTime)); broker.AddWorkItem(CreateWorkItem(_idFailed, "2", status : WorkItemStatusEnum.Failed, processTime : futureTime)); broker.AddWorkItem(CreateWorkItem(_idIdling, "2a", status : WorkItemStatusEnum.Idle, processTime : futureTime, priority : WorkItemPriorityEnum.High)); broker.AddWorkItem(CreateWorkItem(_idInProgress, "2", status : WorkItemStatusEnum.InProgress, processTime : futureTime)); broker.AddWorkItem(CreateWorkItem(_idPending, "2b", status : WorkItemStatusEnum.Pending, processTime : futureTime, priority : WorkItemPriorityEnum.Stat)); broker.AddWorkItem(CreateWorkItem(_idIdling, "3", status : WorkItemStatusEnum.Idle, processTime : time.AddMinutes(-3), priority : WorkItemPriorityEnum.Stat)); broker.AddWorkItem(CreateWorkItem(_idPending, "4", status : WorkItemStatusEnum.Pending, processTime : time.AddMinutes(-1), priority : WorkItemPriorityEnum.Stat)); broker.AddWorkItem(CreateWorkItem(_idIdling, "5", status : WorkItemStatusEnum.Idle, processTime : time.AddMinutes(-1))); context.Commit(); } using (var context = new DataAccessContext()) { var broker = context.GetWorkItemBroker(); // there are 5 processable items here (status is idle or pending, and process time in the past) var highPriority = broker.GetWorkItemsForProcessing(1, WorkItemPriorityEnum.High).SingleOrDefault(); var statPriority = broker.GetWorkItemsForProcessing(1, WorkItemPriorityEnum.Stat).SingleOrDefault(); var normPriority = broker.GetWorkItemsForProcessing(1, WorkItemPriorityEnum.Normal).SingleOrDefault(); var allHighPriority = broker.GetWorkItemsForProcessing(9, WorkItemPriorityEnum.High); var allStatPriority = broker.GetWorkItemsForProcessing(9, WorkItemPriorityEnum.Stat); var allNormPriority = broker.GetWorkItemsForProcessing(9, WorkItemPriorityEnum.Normal); // this ensures that the results are valid by checking that future time is indeed still in the future Assert.Less(DateTime.Now, futureTime, "Rerun Test! - Results are invalid due to an unreasonable delay during test setup, causing future timestamps to not be in the future"); Assert.IsNotNull(highPriority, "Query top did not yield expected result for high"); Assert.AreEqual("1a", highPriority.StudyInstanceUid, "Query top yielded item with wrong identity"); Assert.IsNotNull(statPriority, "Query top did not yield expected result for stat"); Assert.AreEqual("3", statPriority.StudyInstanceUid, "Query top yielded item with wrong identity"); Assert.IsNotNull(normPriority, "Query top did not yield expected result for normal"); Assert.AreEqual("1b", normPriority.StudyInstanceUid, "Query top yielded item with wrong identity"); Assert.AreEqual(1, allHighPriority.Count, "Query top did not yield expected result for high"); Assert.AreEqual("1a", allHighPriority[0].StudyInstanceUid, "Query top yielded item with wrong identity"); Assert.AreEqual(2, allStatPriority.Count, "Query top did not yield expected result for stat"); Assert.AreEqual("3", allStatPriority[0].StudyInstanceUid, "Query top yielded item with wrong identity"); Assert.AreEqual("4", allStatPriority[1].StudyInstanceUid, "Query top yielded item with wrong identity"); Assert.AreEqual(2, allNormPriority.Count, "Query top did not yield expected result for normal"); Assert.AreEqual("1b", allNormPriority[0].StudyInstanceUid, "Query top yielded item with wrong identity"); Assert.AreEqual("5", allNormPriority[1].StudyInstanceUid, "Query top yielded item with wrong identity"); } }
public void TestGetWorkItemsScheduledBeforeOrHighPriority() { DeleteAllWorkItems(); var time = DateTime.Now.Truncate(); var pastTime = time.AddMinutes(-30); var futureTime = time.AddMinutes(30); using (var context = new DataAccessContext()) { var broker = context.GetWorkItemBroker(); broker.AddWorkItem(CreateWorkItem(_idCancelled, "1", status : WorkItemStatusEnum.Canceled, scheduledTime : pastTime)); broker.AddWorkItem(CreateWorkItem(_idCanceling, "1", status : WorkItemStatusEnum.Canceling, scheduledTime : pastTime, priority : WorkItemPriorityEnum.Stat)); broker.AddWorkItem(CreateWorkItem(_idComplete, "1", status : WorkItemStatusEnum.Complete, scheduledTime : pastTime)); broker.AddWorkItem(CreateWorkItem(_idDeleting, "1", status : WorkItemStatusEnum.DeleteInProgress, scheduledTime : pastTime)); broker.AddWorkItem(CreateWorkItem(_idDeleted, "1", status : WorkItemStatusEnum.Deleted, scheduledTime : pastTime)); broker.AddWorkItem(CreateWorkItem(_idFailed, "1", status : WorkItemStatusEnum.Failed, scheduledTime : pastTime)); broker.AddWorkItem(CreateWorkItem(_idIdling, "1", status : WorkItemStatusEnum.Idle, scheduledTime : pastTime, priority : WorkItemPriorityEnum.High)); broker.AddWorkItem(CreateWorkItem(_idInProgress, "1", status : WorkItemStatusEnum.InProgress, scheduledTime : pastTime)); broker.AddWorkItem(CreateWorkItem(_idPending, "1", status : WorkItemStatusEnum.Pending, scheduledTime : pastTime)); broker.AddWorkItem(CreateWorkItem(_idCancelled, "2", status : WorkItemStatusEnum.Canceled, scheduledTime : futureTime)); broker.AddWorkItem(CreateWorkItem(_idCanceling, "2", status : WorkItemStatusEnum.Canceling, scheduledTime : futureTime)); broker.AddWorkItem(CreateWorkItem(_idComplete, "2", status : WorkItemStatusEnum.Complete, scheduledTime : futureTime)); broker.AddWorkItem(CreateWorkItem(_idDeleting, "2", status : WorkItemStatusEnum.DeleteInProgress, scheduledTime : futureTime)); broker.AddWorkItem(CreateWorkItem(_idDeleted, "2", status : WorkItemStatusEnum.Deleted, scheduledTime : futureTime)); broker.AddWorkItem(CreateWorkItem(_idFailed, "2", status : WorkItemStatusEnum.Failed, scheduledTime : futureTime)); broker.AddWorkItem(CreateWorkItem(_idIdling, "2", status : WorkItemStatusEnum.Idle, scheduledTime : futureTime, priority : WorkItemPriorityEnum.High)); broker.AddWorkItem(CreateWorkItem(_idInProgress, "2", status : WorkItemStatusEnum.InProgress, scheduledTime : futureTime)); broker.AddWorkItem(CreateWorkItem(_idPending, "2", status : WorkItemStatusEnum.Pending, scheduledTime : futureTime, priority : WorkItemPriorityEnum.Stat)); broker.AddWorkItem(CreateWorkItem(_idIdling, "3", status : WorkItemStatusEnum.Idle, scheduledTime : time.AddMinutes(-3), priority : WorkItemPriorityEnum.Stat)); broker.AddWorkItem(CreateWorkItem(_idPending, "4", status : WorkItemStatusEnum.Pending, scheduledTime : time.AddMinutes(-1), priority : WorkItemPriorityEnum.High)); broker.AddWorkItem(CreateWorkItem(_idIdling, "5", status : WorkItemStatusEnum.Idle, scheduledTime : time.AddMinutes(-1))); context.Commit(); } using (var context = new DataAccessContext()) { var broker = context.GetWorkItemBroker(); var highPriority = broker.GetWorkItemsScheduledBeforeOrHigherPriority(time, WorkItemPriorityEnum.High, null, null, null).ToList(); var highPriorityFuture = broker.GetWorkItemsScheduledBeforeOrHigherPriority(futureTime.AddMinutes(10), WorkItemPriorityEnum.High, null, null, null).ToList(); var highPriorityPast = broker.GetWorkItemsScheduledBeforeOrHigherPriority(time.AddMinutes(-10), WorkItemPriorityEnum.High, null, null, null).ToList(); var highPriorityRunningOrIdle = broker.GetWorkItemsScheduledBeforeOrHigherPriority(time, WorkItemPriorityEnum.High, WorkItemStatusFilter.RunningOrIdle, null, null).ToList(); var highPriorityStudyFilter = broker.GetWorkItemsScheduledBeforeOrHigherPriority(time, WorkItemPriorityEnum.High, null, "1", null).ToList(); var highPriorityTypeFilter = broker.GetWorkItemsScheduledBeforeOrHigherPriority(time, WorkItemPriorityEnum.High, null, null, _idCanceling, _idInProgress, _idPending).ToList(); var highPriorityStudyTypeFilter = broker.GetWorkItemsScheduledBeforeOrHigherPriority(time, WorkItemPriorityEnum.High, null, "1", _idCanceling, _idInProgress, _idPending).ToList(); // this ensures that the results are valid by checking that future time is indeed still in the future Assert.Less(DateTime.Now, futureTime, "Rerun Test! - Results are invalid due to an unreasonable delay during test setup, causing future timestamps to not be in the future"); Assert.AreEqual(4, highPriority.Count(), "Query yielded unexpected results for high or higher priority"); Assert.AreEqual("1" + _idCanceling, highPriority[0].StudyInstanceUid + highPriority[0].Type, "Query yield unexpected item"); Assert.AreEqual("3" + _idIdling, highPriority[1].StudyInstanceUid + highPriority[1].Type, "Query yield unexpected item"); Assert.AreEqual("1" + _idIdling, highPriority[2].StudyInstanceUid + highPriority[2].Type, "Query yield unexpected item"); Assert.AreEqual("4" + _idPending, highPriority[3].StudyInstanceUid + highPriority[3].Type, "Query yield unexpected item"); Assert.AreEqual(highPriority, highPriorityFuture, "Query should not yield results scheduled for future"); Assert.AreEqual(3, highPriorityPast.Count(), "Query yielded unexpected results for high or higher priority (past query)"); Assert.AreEqual("1" + _idCanceling, highPriorityPast[0].StudyInstanceUid + highPriorityPast[0].Type, "Query yield unexpected item (past query)"); Assert.AreEqual("3" + _idIdling, highPriorityPast[1].StudyInstanceUid + highPriorityPast[1].Type, "Query yield unexpected item (past query)"); Assert.AreEqual("1" + _idIdling, highPriorityPast[2].StudyInstanceUid + highPriorityPast[2].Type, "Query yield unexpected item (past query)"); Assert.AreEqual(3, highPriorityRunningOrIdle.Count(), "Query yielded unexpected results for high or higher priority (running or idle status filter)"); Assert.AreEqual("1" + _idCanceling, highPriorityRunningOrIdle[0].StudyInstanceUid + highPriorityRunningOrIdle[0].Type, "Query yield unexpected item (running or idle status filter)"); Assert.AreEqual("3" + _idIdling, highPriorityRunningOrIdle[1].StudyInstanceUid + highPriorityRunningOrIdle[1].Type, "Query yield unexpected item (running or idle status filter)"); Assert.AreEqual("1" + _idIdling, highPriorityRunningOrIdle[2].StudyInstanceUid + highPriorityRunningOrIdle[2].Type, "Query yield unexpected item (running or idle status filter)"); Assert.AreEqual(2, highPriorityStudyFilter.Count(), "Query yielded unexpected results for high or higher priority (study filter)"); Assert.AreEqual("1" + _idCanceling, highPriorityStudyFilter[0].StudyInstanceUid + highPriorityStudyFilter[0].Type, "Query yield unexpected item (study filter)"); Assert.AreEqual("1" + _idIdling, highPriorityStudyFilter[1].StudyInstanceUid + highPriorityStudyFilter[1].Type, "Query yield unexpected item (study filter)"); Assert.AreEqual(2, highPriorityTypeFilter.Count(), "Query yielded unexpected results for high or higher priority (type filter)"); Assert.AreEqual("1" + _idCanceling, highPriorityTypeFilter[0].StudyInstanceUid + highPriorityTypeFilter[0].Type, "Query yield unexpected item (type filter)"); Assert.AreEqual("4" + _idPending, highPriorityTypeFilter[1].StudyInstanceUid + highPriorityTypeFilter[1].Type, "Query yield unexpected item (type filter)"); Assert.AreEqual(1, highPriorityStudyTypeFilter.Count(), "Query yielded unexpected results for high or higher priority (study and type filter)"); Assert.AreEqual("1" + _idCanceling, highPriorityStudyTypeFilter[0].StudyInstanceUid + highPriorityStudyTypeFilter[0].Type, "Query yield unexpected item (study and type filter)"); } }