Example #1
0
        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);
Example #4
0
        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);
        }
Example #5
0
        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));
            }
        }
Example #8
0
        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);
        }
Example #9
0
        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);
            }
        }
Example #11
0
        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))));
        }