예제 #1
0
			private void ApplyDefaultDeletionRule(RulesEngineOptions context, StudyEntry study)
			{
				if (!context.ApplyDeleteActions)
					return;

			    // TODO (CR Jun 2012): Again, seem to use "work item" mutex for all database updates. Should just pass in a boolean.
				using (var dac = new DataAccessContext(DataAccessContext.WorkItemMutex))
				{
					var broker = dac.GetStudyBroker();
					var dbStudy = broker.GetStudy(study.Study.StudyInstanceUid);

					var storageConfiguration = StudyStore.GetConfiguration();
					var defaultRule = storageConfiguration.DefaultDeletionRule;
					if (defaultRule.Enabled)
					{
						dbStudy.SetDeleteTime(defaultRule.TimeValue, defaultRule.TimeUnit, TimeOrigin.ReceivedDate, false);
					}
					else
					{
						dbStudy.ClearDeleteTime();
					}
							
					dac.Commit();
				}
			}
예제 #2
0
            private void ApplyDefaultDeletionRule(RulesEngineOptions context, StudyEntry study)
            {
                if (!context.ApplyDeleteActions)
                {
                    return;
                }

                // TODO (CR Jun 2012): Again, seem to use "work item" mutex for all database updates. Should just pass in a boolean.
                using (var dac = new DataAccessContext(DataAccessContext.WorkItemMutex))
                {
                    var broker  = dac.GetStudyBroker();
                    var dbStudy = broker.GetStudy(study.Study.StudyInstanceUid);

                    var storageConfiguration = StudyStore.GetConfiguration();
                    var defaultRule          = storageConfiguration.DefaultDeletionRule;
                    if (defaultRule.Enabled)
                    {
                        dbStudy.SetDeleteTime(defaultRule.TimeValue, defaultRule.TimeUnit, TimeOrigin.ReceivedDate, false);
                    }
                    else
                    {
                        dbStudy.ClearDeleteTime();
                    }

                    dac.Commit();
                }
            }
예제 #3
0
 private void UpdateTableItem(StudyEntry entry)
 {
     //don't need to check this again, it's just paranoia
     if (!StudyExists(entry.Study.StudyInstanceUid))
     {
         StudyTable.Items.Add(new StudyTableItem(entry));
     }
     else
     {
         int index = GetStudyIndex(entry.Study.StudyInstanceUid);
         //just update this since the rest won't change.
         StudyTable.Items[index].Entry = entry;
         StudyTable.Items.NotifyItemUpdated(index);
     }
 }
            public void Populate()
            {
                var context = (StudyBrowserToolContext)base.Context;
                var items   = new List <StudyTableItem>();
                var now     = DateTime.Now;

                for (int i = 0; i < 10000; ++i)
                {
                    var idString = _nextPatientId.ToString(CultureInfo.InvariantCulture);
                    var entry    = new StudyEntry();
                    var study    = new StudyRootStudyIdentifier
                    {
                        PatientsName                  = String.Format("Test{0}^Patient{0}", idString),
                        PatientId                     = idString,
                        AccessionNumber               = "A" + idString,
                        InstanceAvailability          = "ONLINE",
                        ModalitiesInStudy             = new[] { "MR" },
                        NumberOfStudyRelatedInstances = 10,
                        NumberOfStudyRelatedSeries    = 5,
                        StudyDescription              = "Study" + idString,
                        StudyInstanceUid              = idString,
                        StudyDate                     = now.ToString(DateParser.DicomDateFormat)
                    };

                    if (_dateCount >= 5)
                    {
                        _dateCount = 0;
                    }

                    var deleteOn = now.AddDays(_dateCount);
                    ++_dateCount;

                    entry.Study = study;
                    entry.Data  = new StudyEntryData {
                        DeleteTime = deleteOn
                    };
                    var item = new StudyTableItem(entry);

                    items.Add(item);
                    ++_nextPatientId;
                }

                var searchResult = context.Component.CurrentSearchResult;

                searchResult.SearchEnded(items, false);
            }
예제 #5
0
        public StudyEntry ToStoreEntry()
        {
            var entry = new StudyEntry
            {
                Study = new StudyRootStudyIdentifier(this)
                {
                    InstanceAvailability = "ONLINE",
                    RetrieveAE           = ServerDirectory.GetLocalServer(),
                    SpecificCharacterSet = SpecificCharacterSet
                },
                Data = new StudyEntryData
                {
                    DeleteTime = DeleteTime,
                    InstitutionNamesInStudy = DicomStringHelper.GetStringArray(InstitutionNamesInStudy),
                    SourceAETitlesInStudy   = DicomStringHelper.GetStringArray(SourceAETitlesInStudy),
                    StationNamesInStudy     = DicomStringHelper.GetStringArray(StationNamesInStudy),
                    StoreTime = StoreTime
                }
            };

            return(entry);
        }
        private static List <StudyEntry> GetStudyEntries(IDicomServiceNode server, StudyRootStudyIdentifier criteria)
        {
            // N.B.: we have to handle multiple modalities in the search criteria this way because DICOM does not allow multi-valued search on modality (if you think it does, re-read the standard carefully!)
            // normalize the list of modalities (no duplicates, and empty string only if no other modalities)
            var modalities = (criteria.ModalitiesInStudy ?? new string[0]).Except(new[] { string.Empty }).Distinct().ToList();

            if (modalities.Count == 0)
            {
                modalities.Add(string.Empty);
            }

            var storeQuery = server.IsSupported <IStudyStoreQuery>() ? server.GetService <IStudyStoreQuery>() : new StudyRootQueryStoreAdapter(server.GetService <IStudyRootQuery>());

            using (var bridge = new StudyStoreBridge(storeQuery))
            {
                IEnumerable <StudyEntry> results = new StudyEntry[0];
                foreach (var modality in modalities)
                {
                    var modalityCriteria = new StudyRootStudyIdentifier(criteria)
                    {
                        ModalitiesInStudy = new[] { modality }
                    };
                    var modalityResults = bridge.GetStudyEntries(modalityCriteria).ToList();                     // 'ToList' to execute query here and now

                    if ((modality == string.Empty) ||
                        (modalityResults.Any() && modalityResults.All(s => s.Study.ModalitiesInStudy.All(string.IsNullOrEmpty))) ||                     // 'All' returns true if sequence is empty, so make sure it's not empty!
                        (modalityResults.Any(s => !s.Study.ModalitiesInStudy.Any(m => modality.Equals(m, StringComparison.InvariantCultureIgnoreCase)))))
                    {
                        // if modality was not filtered in the query
                        // or if all results (non-empty) do not return modality (i.e. the server does not support querying or returning this optional tag)
                        // or if any result does not match the queried modality (i.e. the server does not support querying on this optional tag)
                        // then these are all the unique results we'll ever get, and we can skip the other modalities
                        return(modalityResults);
                    }
                    results = results.Union(modalityResults, s => s.Study.StudyInstanceUid);
                }
                return(results.ToList());
            }
        }
예제 #7
0
        private IEnumerable <Study> GetStudies(StudyEntry criteria)
        {
            try
            {
                //TODO (Marmot): make extended data queryable, too?
                DicomAttributeCollection dicomCriteria;
                if (criteria == null || criteria.Study == null)
                {
                    dicomCriteria = new DicomAttributeCollection();
                }
                else
                {
                    dicomCriteria = criteria.Study.ToDicomAttributeCollection();
                }

                var filters = new StudyPropertyFilters(dicomCriteria);
                var results = filters.Query(_context.Studies);
                return(results);
            }
            catch (Exception e)
            {
                throw new Exception("An error occurred while performing the study query.", e);
            }
        }
예제 #8
0
 public StudyTableItem(StudyEntry entry)
 {
     Entry = entry;
 }
예제 #9
0
			public void ApplyStudyRule(StudyEntry study, string ruleId, RulesEngineOptions options)
			{
				ApplyDefaultDeletionRule(options, study);
			}
예제 #10
0
        private IEnumerable<Study> GetStudies(StudyEntry criteria)
        {
            try
            {
                //TODO (Marmot): make extended data queryable, too?
                DicomAttributeCollection dicomCriteria;
                if (criteria == null || criteria.Study == null)
                    dicomCriteria = new DicomAttributeCollection();
                else
                    dicomCriteria = criteria.Study.ToDicomAttributeCollection();

                var filters = new StudyPropertyFilters(dicomCriteria);
                var results = filters.Query(_context.Studies);
                return results;
            }
            catch (Exception e)
            {
                throw new Exception("An error occurred while performing the study query.", e);
            }
        }
예제 #11
0
 public IList<StudyEntry> GetStudyEntries(StudyEntry criteria)
 {
     var studies = GetStudies(criteria);
     return studies.Select(s => s.ToStoreEntry()).ToList();
 }
예제 #12
0
 public int GetStudyCount(StudyEntry criteria)
 {
     int count = GetStudies(criteria).Count();
     return count;
 }
예제 #13
0
 public IList<StudyEntry> GetStudyEntries(StudyEntry criteria)
 {
     return Real.GetStudyEntries(new GetStudyEntriesRequest { Criteria = criteria }).StudyEntries;
 }
예제 #14
0
 public void ApplyStudyRule(StudyEntry study, string ruleId, RulesEngineOptions options)
 {
     ApplyDefaultDeletionRule(options, study);
 }
예제 #15
0
 public System.Collections.Generic.IList<StudyRootStudyIdentifier> StudyQuery(StudyRootStudyIdentifier queryCriteria)
 {
     var criteria = new StudyEntry {Study = queryCriteria};
     var result = Real.GetStudyEntries(new GetStudyEntriesRequest {Criteria = criteria});
     return result.StudyEntries.Select(e => e.Study).ToList();
 }
예제 #16
0
 public StudyTableItem(StudyEntry entry)
 {
     Entry = entry;
 }
예제 #17
0
 private void UpdateTableItem(StudyEntry entry)
 {
     //don't need to check this again, it's just paranoia
     if (!StudyExists(entry.Study.StudyInstanceUid))
     {
         StudyTable.Items.Add(new StudyTableItem(entry));
     }
     else
     {
         int index = GetStudyIndex(entry.Study.StudyInstanceUid);
         //just update this since the rest won't change.
         StudyTable.Items[index].Entry = entry;
         StudyTable.Items.NotifyItemUpdated(index);
     }
 }
예제 #18
0
        public StudyEntry ToStoreEntry()
        {
            var entry = new StudyEntry
            {
                Study = new StudyRootStudyIdentifier(this)
                {
                    InstanceAvailability = "ONLINE",
                    RetrieveAE = ServerDirectory.GetLocalServer(),
                    SpecificCharacterSet = SpecificCharacterSet
                },
                Data = new StudyEntryData
                {
                    DeleteTime = DeleteTime,
                    InstitutionNamesInStudy = DicomStringHelper.GetStringArray(InstitutionNamesInStudy),
                    SourceAETitlesInStudy = DicomStringHelper.GetStringArray(SourceAETitlesInStudy),
                    StationNamesInStudy = DicomStringHelper.GetStringArray(StationNamesInStudy),
                    StoreTime = StoreTime
                }
            };

            return entry;
        }
예제 #19
0
        public IList <StudyEntry> GetStudyEntries(StudyEntry criteria)
        {
            var studies = GetStudies(criteria);

            return(studies.Select(s => s.ToStoreEntry()).ToList());
        }
예제 #20
0
        public int GetStudyCount(StudyEntry criteria)
        {
            int count = GetStudies(criteria).Count();

            return(count);
        }