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(); } }
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(); } }
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); }
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()); } }
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); } }
public StudyTableItem(StudyEntry entry) { Entry = entry; }
public void ApplyStudyRule(StudyEntry study, string ruleId, RulesEngineOptions options) { ApplyDefaultDeletionRule(options, study); }
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); } }
public IList<StudyEntry> GetStudyEntries(StudyEntry criteria) { var studies = GetStudies(criteria); return studies.Select(s => s.ToStoreEntry()).ToList(); }
public int GetStudyCount(StudyEntry criteria) { int count = GetStudies(criteria).Count(); return count; }
public IList<StudyEntry> GetStudyEntries(StudyEntry criteria) { return Real.GetStudyEntries(new GetStudyEntriesRequest { Criteria = criteria }).StudyEntries; }
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(); }
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; }
public IList <StudyEntry> GetStudyEntries(StudyEntry criteria) { var studies = GetStudies(criteria); return(studies.Select(s => s.ToStoreEntry()).ToList()); }
public int GetStudyCount(StudyEntry criteria) { int count = GetStudies(criteria).Count(); return(count); }