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 async Task <GetExtendedQueryTagResponse> GetExtendedQueryTagAsync(string tagPath, CancellationToken cancellationToken) { string numericalTagPath = null; DicomTag[] tags; if (_dicomTagParser.TryParse(tagPath, out tags, supportMultiple: false)) { if (tags.Length > 1) { throw new NotImplementedException(DicomCoreResource.SequentialDicomTagsNotSupported); } numericalTagPath = tags[0].GetPath(); } else { throw new InvalidExtendedQueryTagPathException(string.Format(DicomCoreResource.InvalidExtendedQueryTag, tagPath ?? string.Empty)); } IReadOnlyList <ExtendedQueryTagStoreEntry> extendedQueryTags = await _extendedQueryTagStore.GetExtendedQueryTagsAsync(numericalTagPath, cancellationToken); if (!extendedQueryTags.Any()) { throw new ExtendedQueryTagNotFoundException(string.Format(DicomCoreResource.ExtendedQueryTagNotFound, tagPath)); } return(new GetExtendedQueryTagResponse(extendedQueryTags[0].ToExtendedQueryTagEntry())); }
public async Task GivenRequestForMultipleTags_WhenNoTagsAreStored_ThenReturnEmptyResult() { _extendedQueryTagStore.GetExtendedQueryTagsAsync(7, 0).Returns(Array.Empty <ExtendedQueryTagStoreJoinEntry>()); GetExtendedQueryTagsResponse response = await _getExtendedQueryTagsService.GetExtendedQueryTagsAsync(7, 0); await _extendedQueryTagStore.Received(1).GetExtendedQueryTagsAsync(7, 0); _urlResolver.DidNotReceiveWithAnyArgs().ResolveQueryTagErrorsUri(default);
private async Task <List <QueryTag> > ResolveQueryTagsAsync(CancellationToken cancellationToken) { var tags = new List <QueryTag>(CoreQueryTags); IReadOnlyList <ExtendedQueryTagStoreEntry> extendedQueryTags = await _extendedQueryTagStore.GetExtendedQueryTagsAsync(int.MaxValue, 0, cancellationToken); tags.AddRange(extendedQueryTags.Select(entry => new QueryTag(entry))); return(tags); }
public async Task GivenNoExtendedQueryTags_WhenCreateIndex_ThenShouldSucceed() { var extendedTags = await _extendedQueryTagStore.GetExtendedQueryTagsAsync(int.MaxValue); // make sure there is no extended query tags Assert.Empty(extendedTags); DicomDataset dataset = Samples.CreateRandomInstanceDataset(); await _indexDataStore.BeginCreateInstanceIndexAsync(DefaultPartition.Key, dataset, QueryTagService.CoreQueryTags); }
public async Task GivenValidInput_WhenGetExtendedQueryTagsIsCalledMultipleTimes_ThenExtendedQueryTagStoreIsCalledOnce() { _extendedQueryTagStore.GetExtendedQueryTagsAsync(null, Arg.Any <CancellationToken>()) .Returns(Array.Empty <ExtendedQueryTagStoreEntry>()); await _queryTagService.GetQueryTagsAsync(); await _queryTagService.GetQueryTagsAsync(); await _extendedQueryTagStore.Received(1).GetExtendedQueryTagsAsync(null, Arg.Any <CancellationToken>()); }
private async Task <IReadOnlyCollection <Uri> > GetResourceUrlsAsync( OperationType type, IReadOnlyCollection <string> resourceIds, CancellationToken cancellationToken) { switch (type) { case OperationType.Reindex: List <int> tagKeys = resourceIds?.Select(x => int.Parse(x, CultureInfo.InvariantCulture)).ToList(); IReadOnlyCollection <ExtendedQueryTagStoreEntry> tagPaths = Array.Empty <ExtendedQueryTagStoreEntry>(); if (tagKeys?.Count > 0) { tagPaths = await _extendedQueryTagStore.GetExtendedQueryTagsAsync(tagKeys, cancellationToken); } return(tagPaths.Select(x => _urlResolver.ResolveQueryTagUri(x.Path)).ToList()); default: throw new ArgumentOutOfRangeException(nameof(type)); } }
public async Task GivenValidExtendedQueryTags_WhenGettingExtendedQueryTagsByKey_ThenOnlyPresentTagsAreReturned() { Guid id = Guid.NewGuid(); DicomTag tag1 = DicomTag.DeviceSerialNumber; DicomTag tag2 = new DicomTag(0x0405, 0x1001, "PrivateCreator1"); AddExtendedQueryTagEntry expected1 = tag1.BuildAddExtendedQueryTagEntry(); AddExtendedQueryTagEntry expected2 = tag2.BuildAddExtendedQueryTagEntry(vr: DicomVRCode.CS); int key1 = (await AddExtendedQueryTagsAsync(new AddExtendedQueryTagEntry[] { expected1 }, ready: false)).Single(); int key2 = (await AddExtendedQueryTagsAsync(new AddExtendedQueryTagEntry[] { expected2 }, ready: true)).Single(); await _extendedQueryTagStore.AssignReindexingOperationAsync(new List <int> { key1 }, id); // Fetch the newly added keys (and pass 1 more key we know doesn't have a corresponding entry) IReadOnlyList <ExtendedQueryTagStoreJoinEntry> actual = await _extendedQueryTagStore.GetExtendedQueryTagsAsync(new int[] { key1, key2, key2 + 1 }); Assert.Equal(2, actual.Count); AssertTag(key1, expected1, actual[0], ExtendedQueryTagStatus.Adding, operationId: id); AssertTag(key2, expected2, actual[1], ExtendedQueryTagStatus.Ready); }
public async Task DeleteExtendedQueryTagAsync(string tagPath, CancellationToken cancellationToken) { DicomTag[] tags; if (!_dicomTagParser.TryParse(tagPath, out tags, supportMultiple: false)) { throw new InvalidExtendedQueryTagPathException( string.Format(CultureInfo.InvariantCulture, DicomCoreResource.InvalidExtendedQueryTag, tagPath ?? string.Empty)); } string normalizedPath = tags[0].GetPath(); IReadOnlyList <ExtendedQueryTagStoreEntry> extendedQueryTagEntries = await _extendedQueryTagStore.GetExtendedQueryTagsAsync(normalizedPath, cancellationToken); if (extendedQueryTagEntries.Count > 0) { await _extendedQueryTagStore.DeleteExtendedQueryTagAsync(normalizedPath, extendedQueryTagEntries[0].VR, cancellationToken); } else { throw new ExtendedQueryTagNotFoundException(string.Format(DicomCoreResource.ExtendedQueryTagNotFound, tagPath)); } }
public async Task <IReadOnlyCollection <QueryTag> > GetQueryTagsAsync(CancellationToken cancellationToken = default) { if (_enableExtendedQueryTags) { if (Interlocked.CompareExchange(ref _allQueryTagsStatus, 1, 0) == 0) { _allQueryTags = new List <QueryTag>(CoreQueryTags); IReadOnlyList <ExtendedQueryTagStoreEntry> extendedQueryTagEntries = await _extendedQueryTagStore.GetExtendedQueryTagsAsync(cancellationToken : cancellationToken); _allQueryTags.AddRange(extendedQueryTagEntries.Select(entry => new QueryTag(entry))); _allQueryTagsCompletionSource.SetResult(true); } await _allQueryTagsCompletionSource.Task; return(_allQueryTags); } else { return(CoreQueryTags); } }
public async Task <GetExtendedQueryTagsResponse> GetExtendedQueryTagsAsync(int limit, int offset = 0, CancellationToken cancellationToken = default) { IReadOnlyList <ExtendedQueryTagStoreJoinEntry> extendedQueryTags = await _extendedQueryTagStore.GetExtendedQueryTagsAsync(limit, offset, cancellationToken); return(new GetExtendedQueryTagsResponse(extendedQueryTags.Select(x => x.ToGetExtendedQueryTagEntry(_urlResolver)))); }