public async Task GivenANonExistingDicomInstance_WhenAdded_ThenItShouldBeAdded() { DicomDataset dataset = CreateTestDicomDataset(); string studyInstanceUid = dataset.GetString(DicomTag.StudyInstanceUID); string seriesInstanceUid = dataset.GetString(DicomTag.SeriesInstanceUID); string sopInstanceUid = dataset.GetString(DicomTag.SOPInstanceUID); string patientId = dataset.GetString(DicomTag.PatientID); string patientName = dataset.GetString(DicomTag.PatientName); string referringPhysicianName = dataset.GetString(DicomTag.ReferringPhysicianName); string studyDescription = dataset.GetString(DicomTag.StudyDescription); string accessionNumber = dataset.GetString(DicomTag.AccessionNumber); string modality = dataset.GetString(DicomTag.Modality); long version = await _indexDataStore.CreateInstanceIndexAsync(dataset); IReadOnlyList <StudyMetadata> studyMetadataEntries = await _testHelper.GetStudyMetadataAsync(studyInstanceUid); Assert.Collection( studyMetadataEntries, entry => ValidateStudyMetadata( studyInstanceUid, patientId, patientName, referringPhysicianName, new DateTime(2020, 3, 1, 0, 0, 0, DateTimeKind.Utc), studyDescription, accessionNumber, entry)); IReadOnlyList <SeriesMetadata> seriesMetadataEntries = await _testHelper.GetSeriesMetadataAsync(seriesInstanceUid); Assert.Collection( seriesMetadataEntries, entry => ValidateSeriesMetadata( seriesInstanceUid, modality, new DateTime(2020, 3, 2, 0, 0, 0, DateTimeKind.Utc), entry)); // Make sure the ID matches between the study and series metadata. Assert.Equal(studyMetadataEntries[0].StudyKey, seriesMetadataEntries[0].StudyKey); IReadOnlyList <Instance> instances = await _testHelper.GetInstancesAsync(studyInstanceUid, seriesInstanceUid, sopInstanceUid); Assert.NotNull(instances); Assert.Single(instances); Instance instance = instances[0]; Assert.Equal(studyInstanceUid, instance.StudyInstanceUid); Assert.Equal(seriesInstanceUid, instance.SeriesInstanceUid); Assert.Equal(sopInstanceUid, instance.SopInstanceUid); Assert.Equal(version, instance.Watermark); Assert.Equal((byte)IndexStatus.Creating, instance.Status); Assert.InRange(instance.LastStatusUpdatedDate, _startDateTime.AddSeconds(-1), Clock.UtcNow.AddSeconds(1)); Assert.InRange(instance.CreatedDate, _startDateTime.AddSeconds(-1), Clock.UtcNow.AddSeconds(1)); }
/// <inheritdoc /> public async Task StoreDicomInstanceEntryAsync( IDicomInstanceEntry dicomInstanceEntry, CancellationToken cancellationToken) { EnsureArg.IsNotNull(dicomInstanceEntry, nameof(dicomInstanceEntry)); DicomDataset dicomDataset = await dicomInstanceEntry.GetDicomDatasetAsync(cancellationToken); long version = await _indexDataStore.CreateInstanceIndexAsync(dicomDataset, cancellationToken); var versionedInstanceIdentifier = dicomDataset.ToVersionedInstanceIdentifier(version); try { // We have successfully created the index, store the files. Task[] tasks = new[] { StoreFileAsync(versionedInstanceIdentifier, dicomInstanceEntry, cancellationToken), StoreInstanceMetadataAsync(dicomDataset, version, cancellationToken), }; await Task.WhenAll(tasks); // Successfully uploaded the files. Update the status to be available. await _indexDataStore.UpdateInstanceIndexStatusAsync(versionedInstanceIdentifier, IndexStatus.Created, cancellationToken); } catch (Exception) { // Exception occurred while storing the file. Try delete the index. await TryCleanupInstanceIndexAsync(versionedInstanceIdentifier); throw; } }
public async Task GivenExistingExtendedQueryTagIndexData_WhenDeleteExtendedQueryTag_ThenShouldDeleteIndexData() { DicomTag tag = DicomTag.DeviceSerialNumber; // Prepare index data DicomDataset dataset = Samples.CreateRandomInstanceDataset(); dataset.Add(tag, "123"); await _extendedQueryTagStore.AddExtendedQueryTagsAsync(new AddExtendedQueryTagEntry[] { tag.BuildAddExtendedQueryTagEntry() }); ExtendedQueryTagStoreEntry storeEntry = (await _extendedQueryTagStore.GetExtendedQueryTagsAsync(path: tag.GetPath()))[0]; QueryTag queryTag = new QueryTag(storeEntry); await _indexDataStore.CreateInstanceIndexAsync(dataset, new QueryTag[] { queryTag }); var extendedQueryTagIndexData = await _testHelper.GetExtendedQueryTagDataForTagKeyAsync(ExtendedQueryTagDataType.StringData, storeEntry.Key); Assert.NotEmpty(extendedQueryTagIndexData); // Delete tag await _extendedQueryTagStore.DeleteExtendedQueryTagAsync(storeEntry.Path, storeEntry.VR); await VerifyTagNotExist(storeEntry.Path); // Verify index data is removed extendedQueryTagIndexData = await _testHelper.GetExtendedQueryTagDataForTagKeyAsync(ExtendedQueryTagDataType.StringData, storeEntry.Key); Assert.Empty(extendedQueryTagIndexData); }
public StoreOrchestratorTests() { _dicomDataset = new DicomDataset() { { DicomTag.StudyInstanceUID, DefaultStudyInstanceUid }, { DicomTag.SeriesInstanceUID, DefaultSeriesInstanceUid }, { DicomTag.SOPInstanceUID, DefaultSopInstanceUid }, }; _dicomInstanceEntry.GetDicomDatasetAsync(DefaultCancellationToken).Returns(_dicomDataset); _dicomInstanceEntry.GetStreamAsync(DefaultCancellationToken).Returns(_stream); _indexDataStore.CreateInstanceIndexAsync(_dicomDataset, DefaultCancellationToken).Returns(DefaultVersion); _storeOrchestrator = new StoreOrchestrator(_fileStore, _metadataStore, _indexDataStore, _deleteService); }
public StoreOrchestratorTests() { _dicomDataset = new DicomDataset() { { DicomTag.StudyInstanceUID, DefaultStudyInstanceUid }, { DicomTag.SeriesInstanceUID, DefaultSeriesInstanceUid }, { DicomTag.SOPInstanceUID, DefaultSopInstanceUid }, }; _dicomInstanceEntry.GetDicomDatasetAsync(DefaultCancellationToken).Returns(_dicomDataset); _dicomInstanceEntry.GetStreamAsync(DefaultCancellationToken).Returns(_stream); _indexDataStoreFactory.GetInstance().Returns(_indexDataStore); _indexDataStore.CreateInstanceIndexAsync(_dicomDataset, DefaultCancellationToken).Returns(DefaultVersion); _queryTagService.GetQueryTagsAsync(Arg.Any <CancellationToken>()) .Returns(Array.Empty <QueryTag>()); _storeOrchestrator = new StoreOrchestrator(_fileStore, _metadataStore, _indexDataStoreFactory, _deleteService, _queryTagService); }
/// <inheritdoc /> public async Task <long> CreateInstanceIndexAsync(DicomDataset dicomDataset, CancellationToken cancellationToken) { EnsureArg.IsNotNull(dicomDataset, nameof(dicomDataset)); LogCreateInstanceIndexDelegate(_logger, dicomDataset.ToInstanceIdentifier(), null); try { long version = await _indexDataStore.CreateInstanceIndexAsync(dicomDataset, cancellationToken); LogCreateInstanceIndexSucceededDelegate(_logger, version, null); return(version); } catch (Exception ex) { LogOperationFailedDelegate(_logger, ex); throw; } }
private async Task StoreDatasetsAndInstances(DicomDataset dataset, bool flagToStoreInstance) { long version = await _indexDataStore.CreateInstanceIndexAsync(dataset); var versionedInstanceIdentifier = dataset.ToVersionedInstanceIdentifier(version); if (flagToStoreInstance) { var dicomFile = new DicomFile(dataset); Samples.AppendRandomPixelData(5, 5, 0, dicomFile); await using MemoryStream stream = _recyclableMemoryStreamManager.GetStream(); dicomFile.Save(stream); stream.Position = 0; await _fileStore.StoreFileAsync( versionedInstanceIdentifier, stream); } await _indexDataStore.UpdateInstanceIndexStatusAsync(versionedInstanceIdentifier, IndexStatus.Created); }
public static Task <long> CreateInstanceIndexAsync(this IIndexDataStore indexDataStore, DicomDataset dicomDataset, CancellationToken cancellationToken = default) { return(indexDataStore.CreateInstanceIndexAsync(dicomDataset, Array.Empty <QueryTag>(), cancellationToken)); }