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");
			}
		}
示例#3
0
        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.
                }
            });
        }
示例#4
0
        /// <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");
            }
        }
示例#6
0
        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;
        }
示例#7
0
        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));
        }
示例#8
0
 private static void DeleteAllWorkItems()
 {
     using (var context = new DataAccessContext())
     {
         var broker = context.GetWorkItemBroker();
         broker.DeleteAll();
         context.Commit();
     }
 }
示例#9
0
        /// <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);
        }
示例#10
0
        /// <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>());
            }
        }
示例#12
0
        /// <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);
        }
示例#14
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);
        }
示例#15
0
        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);
        }
示例#16
0
        /// <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());
            }
        }
示例#17
0
        /// <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());
        }
示例#18
0
        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");
			}
		}
示例#22
0
        /// <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);
                }
            }
        }
示例#23
0
        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);
                }
            }
        }
示例#26
0
        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");
			}
		}
示例#30
0
        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");
            }
        }
示例#31
0
        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();
			}
		}
示例#34
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");
            }
        }
		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");
			}
		}
示例#36
0
        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)");
			}
		}
示例#38
0
        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");
            }
        }