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)); }
/// <summary> /// 提交 /// </summary> /// <param name="dbName"></param> public static void Commit(string dbName) { CheckDbName(dbName); string key = GetKey(dbName); if (!ServiceContext.Current.Contains(key)) { throw new InvalidOperationException(string.Format("数据库{0}的上下文环境不存在。", dbName)); } DataAccessContext dac = ServiceContext.Current[key] as DataAccessContext; if (dac == null) { throw new Exception("DataAccessContext is null"); } try { dac.Commit(); } finally { dac.CloseConnection(); ServiceContext.Current.Remove(key); } }
public void TestGetReindexStudies() { DeleteAllStudies(); using (var context = new DataAccessContext()) { var broker = context.GetStudyBroker(); broker.AddStudy(CreateStudy("12.3", "A123")); broker.AddStudy(CreateStudy("45.6", "A456", deleted: true, reindex: true)); broker.AddStudy(CreateStudy("78.9", "A789", reindex: true)); broker.AddStudy(CreateStudy("", "A", deleted: true)); context.Commit(); } using (var context = new DataAccessContext()) { var broker = context.GetStudyBroker(); var studies = broker.GetReindexStudies(); Assert.AreEqual(2, studies.Count); Assert.IsTrue(studies.Any(s => s.StudyInstanceUid == "45.6"), "Missing study 45.6"); Assert.IsTrue(studies.Any(s => s.StudyInstanceUid == "78.9"), "Missing study 78.9"); } }
public void TestGetStudies() { DeleteAllStudies(); long oid123, oid456, oid789, oidBlank; using (var context = new DataAccessContext()) { Study study123, study456, study789, studyBlank; var broker = context.GetStudyBroker(); broker.AddStudy(study123 = CreateStudy("12.3", "A123")); broker.AddStudy(study456 = CreateStudy("45.6", "A456", deleted: true)); broker.AddStudy(study789 = CreateStudy("78.9", "A789")); broker.AddStudy(studyBlank = CreateStudy("", "A")); context.Commit(); oid123 = study123.Oid; oid456 = study456.Oid; oid789 = study789.Oid; oidBlank = studyBlank.Oid; } using (var context = new DataAccessContext()) { var broker = context.GetStudyBroker(); var studies = broker.GetStudies(); Assert.AreEqual(new[] { oid123, oid456, oid789, oidBlank }.OrderBy(x => x), studies.Select(x => x.Oid).OrderBy(x => x)); } }
/// <summary> /// Cleanup any failed items in the queue and delete the queue entry. /// </summary> public override void Delete() { using (var context = new DataAccessContext(DataAccessContext.WorkItemMutex)) { var broker = context.GetWorkItemUidBroker(); var uidBroker = context.GetWorkItemUidBroker(); var list = broker.GetWorkItemUidsForWorkItem(Proxy.Item.Oid); foreach (WorkItemUid sop in list) { uidBroker.Delete(sop); } context.Commit(); } if (PublishFiles != null && (PublishFiles.DeletionBehaviour == DeletionBehaviour.DeleteAlways || PublishFiles.DeletionBehaviour == DeletionBehaviour.DeleteOnSuccess)) { foreach (string file in PublishFiles.FilePaths) { try { FileUtils.Delete(file); DirectoryUtility.DeleteIfEmpty(Path.GetDirectoryName(file)); } catch (Exception e) { Platform.Log(LogLevel.Warn, "Unable to delete temporary publish file {0}: {1}", file, e.Message); } } } Proxy.Delete(); }
private void ResetReindexStudies() { var resetStudyUids = new List <string>(); using (var context = new DataAccessContext(DataAccessContext.WorkItemMutex)) { var studyBroker = context.GetStudyBroker(); var studyList = studyBroker.GetReindexStudies(); foreach (var study in studyList) { if (study.Reindex) { resetStudyUids.Add(study.StudyInstanceUid); study.Reindex = false; } } context.Commit(); } if (resetStudyUids.Count > 0) { EventsHelper.Fire(_studiesRestoredEvent, this, new StudiesEventArgs { StudyInstanceUids = resetStudyUids }); } }
private void ApplyDefaultDeletionRule(RulesEngineOptions context, StudyEntry study) { if (!context.ApplyDeleteActions) { return; } // TODO (CR Jun 2012): Again, seem to use "work item" mutex for all database updates. Should just pass in a boolean. using (var dac = new DataAccessContext(DataAccessContext.WorkItemMutex)) { var broker = dac.GetStudyBroker(); var dbStudy = broker.GetStudy(study.Study.StudyInstanceUid); var storageConfiguration = StudyStore.GetConfiguration(); var defaultRule = storageConfiguration.DefaultDeletionRule; if (defaultRule.Enabled) { dbStudy.SetDeleteTime(defaultRule.TimeValue, defaultRule.TimeUnit, TimeOrigin.ReceivedDate, false); } else { dbStudy.ClearDeleteTime(); } dac.Commit(); } }
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"); } }
protected override void ProcessItem(Study study) { var result = EventResult.Success; try { WorkItem item; using (var context = new DataAccessContext(DataAccessContext.WorkItemMutex)) { item = ProcessStudy(study.Oid, context); context.Commit(); } if (item != null) { WorkItemPublishSubscribeHelper.PublishWorkItemChanged(WorkItemsChangedEventType.Update, WorkItemDataHelper.FromWorkItem(item)); } } catch (Exception) { result = EventResult.MajorFailure; throw; } finally { var instances = new AuditedInstances(); instances.AddInstance(study.PatientId, study.PatientsName, study.StudyInstanceUid); AuditHelper.LogDeleteStudies(AuditHelper.LocalAETitle, instances, EventSource.CurrentUser, result); } }
/// <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"); } }
/// <summary> /// Routine for failing a work queue uid record. /// </summary> /// <param name="uid">The WorkItemUid entry to fail.</param> /// <param name="retry">A boolean value indicating whether a retry will be attempted later.</param> protected WorkItemUid FailWorkItemUid(WorkItemUid uid, bool retry) { using (var context = new DataAccessContext(DataAccessContext.WorkItemMutex)) { var broker = context.GetWorkItemUidBroker(); var sop = broker.GetWorkItemUid(uid.Oid); if (!sop.FailureCount.HasValue) { sop.FailureCount = 1; } else { sop.FailureCount = (byte)(sop.FailureCount.Value + 1); } if (sop.FailureCount > WorkItemServiceSettings.Default.RetryCount) { sop.Failed = true; } context.Commit(); return(sop); } }
private static void DeleteAllWorkItems() { using (var context = new DataAccessContext()) { var broker = context.GetWorkItemBroker(); broker.DeleteAll(); context.Commit(); } }
public void Commit() { if (DataAccessContext == null) { throw new ApplicationException("Unable to commit, no DataAccessContext."); } DataAccessContext.Commit(); }
private static void DeleteAllStudies() { using (var context = new DataAccessContext()) { var broker = context.GetStudyBroker(); broker.DeleteAll(); context.Commit(); } }
public DeleteAllServersResult DeleteAllServers(DeleteAllServersRequest request) { using (var scope = new DataAccessContext()) { var broker = scope.GetDeviceBroker(); broker.DeleteAllDevices(); scope.Commit(); return(new DeleteAllServersResult()); } }
/// <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); } } }
/// <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); }
public DeleteServerResult DeleteServer(DeleteServerRequest request) { using (var context = new DataAccessContext()) { var broker = context.GetDeviceBroker(); var existing = broker.GetDeviceByName(request.ServerEntry.Server.Name); if (existing == null) { throw new ArgumentException(); } broker.DeleteDevice(existing); context.Commit(); return(new DeleteServerResult()); } }
/// <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); } }
private void ProcessStudiesInDatabase() { foreach (long oid in StudyOidList) { try { using (var context = new DataAccessContext(DataAccessContext.WorkItemMutex)) { var broker = context.GetStudyBroker(); var study = broker.GetStudy(oid); var location = new StudyLocation(study.StudyInstanceUid); if (!Directory.Exists(location.StudyFolder)) { broker.Delete(study); context.Commit(); EventsHelper.Fire(_studyDeletedEvent, this, new StudyEventArgs { StudyInstanceUid = study.StudyInstanceUid }); Platform.Log(LogLevel.Info, "Deleted Study that wasn't on disk, but in the database: {0}", study.StudyInstanceUid); } else { EventsHelper.Fire(_studyProcessedEvent, this, new StudyEventArgs { StudyInstanceUid = study.StudyInstanceUid }); } } } catch (Exception x) { Platform.Log(LogLevel.Warn, "Unexpected exception attempting to reindex StudyOid {0}: {1}", oid, x.Message); } if (_cancelRequested) { return; } } }
public AddServerResult AddServer(AddServerRequest request) { using (var context = new DataAccessContext()) { var broker = context.GetDeviceBroker(); var existing = broker.GetDeviceByName(request.ServerEntry.Server.Name); if (existing != null) { throw new ArgumentException(); // TODO (CR Jun 2012): Should set the message, but it's just re-interpreted as a Fault. } var device = request.ServerEntry.ToDevice(); broker.AddDevice(device); context.Commit(); return(new AddServerResult { ServerEntry = device.ToDataContract() }); } }
public UpdateServerResult UpdateServer(UpdateServerRequest request) { using (var context = new DataAccessContext()) { var broker = context.GetDeviceBroker(); var existing = broker.GetDeviceByName(request.ServerEntry.Server.Name); if (existing == null) { throw new ArgumentException(); } var ae = request.ServerEntry.Server; existing.AETitle = ae.AETitle; existing.HostName = ae.ScpParameters.HostName; existing.Port = ae.ScpParameters.Port; existing.Location = ae.Location; existing.Description = ae.Description; existing.IsPriorsServer = request.ServerEntry.IsPriorsServer; if (ae.StreamingParameters != null) { existing.StreamingHeaderPort = ae.StreamingParameters.HeaderServicePort; existing.StreamingImagePort = ae.StreamingParameters.WadoServicePort; } else { existing.StreamingHeaderPort = null; existing.StreamingImagePort = null; } existing.ExtensionData = request.ServerEntry.Data == null ? null : Serializer.SerializeServerExtensionData(request.ServerEntry.Data); context.Commit(); return(new UpdateServerResult { ServerEntry = existing.ToDataContract() }); } }
public void TestGetStudiesForDeletion() { DeleteAllStudies(); var time = DateTime.Now.Truncate(); var pastTime = time.AddMinutes(-30); var futureTime = time.AddMinutes(30); using (var context = new DataAccessContext()) { var broker = context.GetStudyBroker(); broker.AddStudy(CreateStudy("12.3", "A123")); broker.AddStudy(CreateStudy("45.6", "A456", deleted: true, deleteTime: pastTime)); broker.AddStudy(CreateStudy("78.9", "A789", deleteTime: pastTime.AddMinutes(-1))); broker.AddStudy(CreateStudy("89.0", "A890", deleteTime: futureTime)); broker.AddStudy(CreateStudy("", "A", deleted: true)); context.Commit(); } using (var context = new DataAccessContext()) { var broker = context.GetStudyBroker(); var deletableOld = broker.GetStudiesForDeletion(time, 5); var deletableOldest = broker.GetStudiesForDeletion(time, 1).SingleOrDefault(); var deletableAny = broker.GetStudiesForDeletion(futureTime.AddMinutes(100), 9); Assert.AreEqual(1, deletableOld.Count); Assert.AreEqual("78.9", deletableOld[0].StudyInstanceUid, "Missing deletable old study 78.9"); Assert.IsNotNull(deletableOldest, "Missing oldest deletable"); Assert.AreEqual("78.9", deletableOldest.StudyInstanceUid, "missing deletable oldest study"); Assert.AreEqual(2, deletableAny.Count); Assert.AreEqual("78.9", deletableAny[0].StudyInstanceUid, "Missing deletable old study 78.9"); Assert.AreEqual("89.0", deletableAny[1].StudyInstanceUid, "Missing deletable newer study 89.0"); } }
/// <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); }
public bool Process() { // Decided not to use the command processor here, since we're just removing everything and want to be as forgiving as possible. try { DirectoryUtility.DeleteIfExists(_location.StudyFolder); } catch (Exception e) { Platform.Log(LogLevel.Error, e, "Unable to delete study folder: {0}", _location.StudyFolder); } try { using (var context = new DataAccessContext(DataAccessContext.WorkItemMutex)) { var studyBroker = context.GetStudyBroker(); var study = studyBroker.GetStudy(_location.Study.StudyInstanceUid); if (study != null) { studyBroker.Delete(study); } context.Commit(); } Platform.Log(LogLevel.Info, "Deleted study for: {0}:{1}", _location.Study.PatientsName, _location.Study.PatientId); return(true); } catch (Exception e) { Platform.Log(LogLevel.Error, e, "Unexpected exception when {0} deleting Study related database entries for study: {0}", _location.Study.StudyInstanceUid); return(false); } }
/// <summary> /// Initialize the Reindex. Determine the number of studies in the database and the number of folders on disk to be used /// for progress. /// </summary> public void Initialize() { // Before scanning the study folders, cleanup any empty directories. CleanupFilestoreDirectory(); try { DirectoryList = new List <string>(Directory.GetDirectories(FilestoreDirectory)); } catch (Exception x) { Platform.Log(LogLevel.Error, x); throw; } StudyFoldersToScan = DirectoryList.Count; // TODO (CR Jun 2012): Seems we're using the "work item" mutex for all updates to the database. // Should we just pass in a boolean specifying whether or not to use a mutex? using (var context = new DataAccessContext(DataAccessContext.WorkItemMutex)) { var broker = context.GetStudyBroker(); StudyOidList = new List <long>(); var studyList = broker.GetStudies(); foreach (var study in studyList) { study.Reindex = true; StudyOidList.Add(study.Oid); } context.Commit(); } DatabaseStudiesToScan = StudyOidList.Count; _threadPool.Start(); }
public void TestGetStudyByUid() { DeleteAllStudies(); using (var context = new DataAccessContext()) { var broker = context.GetStudyBroker(); broker.AddStudy(CreateStudy("12.3", "A123")); broker.AddStudy(CreateStudy("45.6", "A456", deleted: true)); broker.AddStudy(CreateStudy("78.9", "A789")); broker.AddStudy(CreateStudy("", "A")); context.Commit(); } using (var context = new DataAccessContext()) { var broker = context.GetStudyBroker(); var study456 = broker.GetStudy("45.6"); var study123 = broker.GetStudy("12.3"); var study120 = broker.GetStudy("12.0"); var study890 = broker.GetStudy("89.0"); var studyBlank = broker.GetStudy(""); Assert.IsNotNull(study456); Assert.AreEqual(study456.StudyInstanceUid, "45.6"); Assert.AreEqual(study456.AccessionNumber, "A456"); Assert.IsNotNull(study123); Assert.AreEqual(study123.StudyInstanceUid, "12.3"); Assert.AreEqual(study123.AccessionNumber, "A123"); Assert.IsNull(study120); Assert.IsNull(study890); Assert.IsNotNull(studyBlank); Assert.AreEqual(studyBlank.StudyInstanceUid, ""); Assert.AreEqual(studyBlank.AccessionNumber, "A"); } }
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"); } }
public void TestGetStudyByUid() { DeleteAllStudies(); using (var context = new DataAccessContext()) { var broker = context.GetStudyBroker(); broker.AddStudy(CreateStudy("12.3", "A123")); broker.AddStudy(CreateStudy("45.6", "A456", deleted : true)); broker.AddStudy(CreateStudy("78.9", "A789")); broker.AddStudy(CreateStudy("", "A")); context.Commit(); } using (var context = new DataAccessContext()) { var broker = context.GetStudyBroker(); var study456 = broker.GetStudy("45.6"); var study123 = broker.GetStudy("12.3"); var study120 = broker.GetStudy("12.0"); var study890 = broker.GetStudy("89.0"); var studyBlank = broker.GetStudy(""); Assert.IsNotNull(study456); Assert.AreEqual(study456.StudyInstanceUid, "45.6"); Assert.AreEqual(study456.AccessionNumber, "A456"); Assert.IsNotNull(study123); Assert.AreEqual(study123.StudyInstanceUid, "12.3"); Assert.AreEqual(study123.AccessionNumber, "A123"); Assert.IsNull(study120); Assert.IsNull(study890); Assert.IsNotNull(studyBlank); Assert.AreEqual(studyBlank.StudyInstanceUid, ""); Assert.AreEqual(studyBlank.AccessionNumber, "A"); } }
public void TestGetStudyCount() { DeleteAllStudies(); using (var context = new DataAccessContext()) { var broker = context.GetStudyBroker(); broker.AddStudy(CreateStudy("12.3", "A123")); broker.AddStudy(CreateStudy("45.6", "A456", deleted : true)); broker.AddStudy(CreateStudy("78.9", "A789")); broker.AddStudy(CreateStudy("", "A")); context.Commit(); } using (var context = new DataAccessContext()) { var broker = context.GetStudyBroker(); var count = broker.GetStudyCount(); Assert.AreEqual(4, count); } }
public void TestGetStudies() { DeleteAllStudies(); long oid123, oid456, oid789, oidBlank; using (var context = new DataAccessContext()) { Study study123, study456, study789, studyBlank; var broker = context.GetStudyBroker(); broker.AddStudy(study123 = CreateStudy("12.3", "A123")); broker.AddStudy(study456 = CreateStudy("45.6", "A456", deleted : true)); broker.AddStudy(study789 = CreateStudy("78.9", "A789")); broker.AddStudy(studyBlank = CreateStudy("", "A")); context.Commit(); oid123 = study123.Oid; oid456 = study456.Oid; oid789 = study789.Oid; oidBlank = studyBlank.Oid; } using (var context = new DataAccessContext()) { var broker = context.GetStudyBroker(); var studies = broker.GetStudies(); Assert.AreEqual(new[] {oid123, oid456, oid789, oidBlank}.OrderBy(x => x), studies.Select(x => x.Oid).OrderBy(x => x)); } }
public void TestGetReindexStudies() { DeleteAllStudies(); using (var context = new DataAccessContext()) { var broker = context.GetStudyBroker(); broker.AddStudy(CreateStudy("12.3", "A123")); broker.AddStudy(CreateStudy("45.6", "A456", deleted : true, reindex : true)); broker.AddStudy(CreateStudy("78.9", "A789", reindex : true)); broker.AddStudy(CreateStudy("", "A", deleted : true)); context.Commit(); } using (var context = new DataAccessContext()) { var broker = context.GetStudyBroker(); var studies = broker.GetReindexStudies(); Assert.AreEqual(2, studies.Count); Assert.IsTrue(studies.Any(s => s.StudyInstanceUid == "45.6"), "Missing study 45.6"); Assert.IsTrue(studies.Any(s => s.StudyInstanceUid == "78.9"), "Missing study 78.9"); } }
public void TestGetStudiesForDeletion() { DeleteAllStudies(); var time = DateTime.Now.Truncate(); var pastTime = time.AddMinutes(-30); var futureTime = time.AddMinutes(30); using (var context = new DataAccessContext()) { var broker = context.GetStudyBroker(); broker.AddStudy(CreateStudy("12.3", "A123")); broker.AddStudy(CreateStudy("45.6", "A456", deleted : true, deleteTime : pastTime)); broker.AddStudy(CreateStudy("78.9", "A789", deleteTime : pastTime.AddMinutes(-1))); broker.AddStudy(CreateStudy("89.0", "A890", deleteTime : futureTime)); broker.AddStudy(CreateStudy("", "A", deleted : true)); context.Commit(); } using (var context = new DataAccessContext()) { var broker = context.GetStudyBroker(); var deletableOld = broker.GetStudiesForDeletion(time, 5); var deletableOldest = broker.GetStudiesForDeletion(time, 1).SingleOrDefault(); var deletableAny = broker.GetStudiesForDeletion(futureTime.AddMinutes(100), 9); Assert.AreEqual(1, deletableOld.Count); Assert.AreEqual("78.9", deletableOld[0].StudyInstanceUid, "Missing deletable old study 78.9"); Assert.IsNotNull(deletableOldest, "Missing oldest deletable"); Assert.AreEqual("78.9", deletableOldest.StudyInstanceUid, "missing deletable oldest study"); Assert.AreEqual(2, deletableAny.Count); Assert.AreEqual("78.9", deletableAny[0].StudyInstanceUid, "Missing deletable old study 78.9"); Assert.AreEqual("89.0", deletableAny[1].StudyInstanceUid, "Missing deletable newer study 89.0"); } }
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"); } }
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 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 TestAddAndGet() { DeleteAllStudies(); var time = DateTime.Now.Truncate(); long oid; string version; using (var context = new DataAccessContext()) { var study = CreateStudy("123", "A#", "MRN", "BOBSON^BOB", new DateTime(2014, 07, 01), "1234", "DESU", @"CT\PT\KO\PR\SC", 6, 2101, time, true, time.AddMinutes(100)); var broker = context.GetStudyBroker(); broker.AddStudy(CreateStudy("456", "2")); broker.AddStudy(study); broker.AddStudy(CreateStudy("789", "3")); context.Commit(); Assert.AreNotEqual(0, oid = study.Oid, "Oid should have been assigned on insert"); Assert.IsNotNull(study.Version, "Version should have been assigned on insert"); version = study.Version.ToString(); } using (var context = new DataAccessContext()) { var broker = context.GetStudyBroker(); var study = broker.GetStudy(oid); Assert.AreEqual("123", study.StudyInstanceUid, "StudyInstanceUid"); Assert.AreEqual("A#", study.AccessionNumber, "AccessionNumber"); Assert.AreEqual("MRN", study.PatientId, "PatientId"); Assert.AreEqual("BOBSON^BOB", study.PatientsName, "PatientsName"); Assert.AreEqual(new DateTime(2014, 07, 01), study.StudyDate, "StudyDate"); Assert.AreEqual("20140701", study.StudyDateRaw, "StudyDateRaw"); Assert.AreEqual("1234", study.StudyId, "StudyId"); Assert.AreEqual("DESU", study.StudyDescription, "StudyDescription"); Assert.AreEqual(@"CT\PT\KO\PR\SC", study.ModalitiesInStudy, "ModalitiesInStudy"); Assert.AreEqual(6, study.NumberOfStudyRelatedSeries, "NumberOfStudyRelatedSeries"); Assert.AreEqual(2101, study.NumberOfStudyRelatedInstances, "NumberOfStudyRelatedInstances"); Assert.AreEqual(time, study.StoreTime, "StoreTime"); Assert.AreEqual(true, study.Reindex, "Reindex"); Assert.AreEqual(time.AddMinutes(100), study.DeleteTime, "DeleteTime"); study.ModalitiesInStudy = @"CT\PT"; context.Commit(); Assert.AreNotEqual(version, study.Version, "Version should have been changed on update"); } using (var context = new DataAccessContext()) { var broker = context.GetStudyBroker(); var study = broker.GetStudy(oid); Assert.AreEqual("123", study.StudyInstanceUid, "StudyInstanceUid"); Assert.AreEqual("A#", study.AccessionNumber, "AccessionNumber"); Assert.AreEqual("MRN", study.PatientId, "PatientId"); Assert.AreEqual("BOBSON^BOB", study.PatientsName, "PatientsName"); Assert.AreEqual(new DateTime(2014, 07, 01), study.StudyDate, "StudyDate"); Assert.AreEqual("20140701", study.StudyDateRaw, "StudyDateRaw"); Assert.AreEqual("1234", study.StudyId, "StudyId"); Assert.AreEqual("DESU", study.StudyDescription, "StudyDescription"); Assert.AreEqual(@"CT\PT", study.ModalitiesInStudy, "ModalitiesInStudy"); Assert.AreEqual(6, study.NumberOfStudyRelatedSeries, "NumberOfStudyRelatedSeries"); Assert.AreEqual(2101, study.NumberOfStudyRelatedInstances, "NumberOfStudyRelatedInstances"); Assert.AreEqual(time, study.StoreTime, "StoreTime"); Assert.AreEqual(true, study.Reindex, "Reindex"); Assert.AreEqual(time.AddMinutes(100), study.DeleteTime, "DeleteTime"); } }
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 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 void TestAddAndGetPrior() { DeleteAllDocuments(); string documentName = "test"; string instanceKey = null; string user = null; var oldestKey = new ConfigurationDocumentKey(documentName, new Version(3, 5, 21685, 22177), user, instanceKey); var oldest = new ConfigurationDocument { CreationTime = DateTime.Now, DocumentName = oldestKey.DocumentName, DocumentVersionString = VersionUtils.ToPaddedVersionString(oldestKey.Version, false, false), User = oldestKey.User, InstanceKey = oldestKey.InstanceKey, DocumentText = "oldest" }; var previousKey = new ConfigurationDocumentKey(documentName, new Version(4, 4, 21685, 22177), user, instanceKey); var previous = new ConfigurationDocument { CreationTime = DateTime.Now, DocumentName = previousKey.DocumentName, DocumentVersionString = VersionUtils.ToPaddedVersionString(previousKey.Version, false, false), User = previousKey.User, InstanceKey = previousKey.InstanceKey, DocumentText = "previous" }; var newestKey = new ConfigurationDocumentKey(documentName, new Version(5, 1, 21685, 22177), user, instanceKey); var newest = new ConfigurationDocument { CreationTime = DateTime.Now, DocumentName = newestKey.DocumentName, DocumentVersionString = VersionUtils.ToPaddedVersionString(newestKey.Version, false, false), User = newestKey.User, InstanceKey = newestKey.InstanceKey, DocumentText = "newest" }; using (var context = new DataAccessContext()) { var broker = context.GetConfigurationDocumentBroker(); broker.AddConfigurationDocument(oldest); broker.AddConfigurationDocument(previous); broker.AddConfigurationDocument(newest); context.Commit(); } using (var context = new DataAccessContext()) { var broker = context.GetConfigurationDocumentBroker(); var oldestRetrieved = broker.GetConfigurationDocument(oldestKey); Assert.AreEqual(oldestRetrieved.DocumentName, oldest.DocumentName); Assert.AreEqual(oldestRetrieved.DocumentVersionString, oldest.DocumentVersionString); var previousRetrieved = broker.GetConfigurationDocument(previousKey); Assert.AreEqual(previousRetrieved.DocumentName, previous.DocumentName); Assert.AreEqual(previousRetrieved.DocumentVersionString, previous.DocumentVersionString); var newestRetrieved = broker.GetConfigurationDocument(newestKey); Assert.AreEqual(newestRetrieved.DocumentName, newest.DocumentName); Assert.AreEqual(newestRetrieved.DocumentVersionString, newest.DocumentVersionString); var previousOfNewest = broker.GetPriorConfigurationDocument(newestKey); Assert.AreEqual(previousOfNewest.DocumentName, previous.DocumentName); Assert.AreEqual(previousOfNewest.DocumentVersionString, previous.DocumentVersionString); } }
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 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)"); } }