public async Task <QueryResourceResponse> QueryAsync(
            QueryResourceRequest message,
            CancellationToken cancellationToken)
        {
            EnsureArg.IsNotNull(message);

            ValidateRequestIdentifiers(message);

            var queryTags = await _queryTagService.GetQueryTagsAsync(cancellationToken);

            QueryExpression queryExpression = _queryParser.Parse(message, queryTags);

            QueryResult queryResult = await _queryStore.QueryAsync(queryExpression, cancellationToken);

            if (!queryResult.DicomInstances.Any())
            {
                return(new QueryResourceResponse());
            }

            IEnumerable <DicomDataset> instanceMetadata = await Task.WhenAll(
                queryResult.DicomInstances
                .Select(x => _metadataStore.GetInstanceMetadataAsync(x, cancellationToken)));

            var responseBuilder = new QueryResponseBuilder(queryExpression);
            IEnumerable <DicomDataset> responseMetadata = instanceMetadata.Select(m => responseBuilder.GenerateResponseDataset(m));

            return(new QueryResourceResponse(responseMetadata));
        }
Esempio n. 2
0
        public QueryExpression Parse(QueryResourceRequest request, IReadOnlyCollection <QueryTag> queryTags)
        {
            EnsureArg.IsNotNull(request, nameof(request));
            EnsureArg.IsNotNull(queryTags, nameof(queryTags));

            _parsedQuery = new QueryExpressionImp();
            queryTags    = GetQualifiedQueryTags(queryTags, request.QueryResourceType);

            foreach (KeyValuePair <string, StringValues> queryParam in request.RequestQuery)
            {
                var trimmedKey = queryParam.Key.Trim();

                // known keys
                if (_paramParsers.TryGetValue(trimmedKey, out Action <KeyValuePair <string, StringValues> > paramParser))
                {
                    paramParser(queryParam);
                    continue;
                }

                // filter conditions with attributeId as key
                if (ParseFilterCondition(queryParam, queryTags, out QueryFilterCondition condition))
                {
                    if (_parsedQuery.FilterConditions.Any(item => item.QueryTag.Tag == condition.QueryTag.Tag))
                    {
                        throw new QueryParseException(string.Format(DicomCoreResource.DuplicateQueryParam, queryParam.Key));
                    }

                    _parsedQuery.FilterConditions.Add(condition);

                    continue;
                }

                throw new QueryParseException(string.Format(DicomCoreResource.UnknownQueryParameter, queryParam.Key));
            }

            // add UIDs as filter conditions
            if (request.StudyInstanceUid != null)
            {
                var condition = new StringSingleValueMatchCondition(new QueryTag(DicomTag.StudyInstanceUID), request.StudyInstanceUid);
                _parsedQuery.FilterConditions.Add(condition);
            }

            if (request.SeriesInstanceUid != null)
            {
                var condition = new StringSingleValueMatchCondition(new QueryTag(DicomTag.SeriesInstanceUID), request.SeriesInstanceUid);
                _parsedQuery.FilterConditions.Add(condition);
            }

            PostProcessFilterConditions(_parsedQuery);

            return(new QueryExpression(
                       request.QueryResourceType,
                       new QueryIncludeField(_parsedQuery.AllValue, _parsedQuery.IncludeFields),
                       _parsedQuery.FuzzyMatch,
                       _parsedQuery.Limit,
                       _parsedQuery.Offset,
                       _parsedQuery.FilterConditions));
        }
Esempio n. 3
0
        public void GivenQidoQuery_WithInvalidStudyInstanceUid_ThrowsValidationException(QueryResource resourceType, string studyInstanceUid)
        {
            var request = new QueryResourceRequest(
                Substitute.For <IEnumerable <KeyValuePair <string, StringValues> > >(),
                resourceType,
                studyInstanceUid);

            Assert.ThrowsAsync <InvalidIdentifierException>(async() => await _queryService.QueryAsync(request, CancellationToken.None));
        }
Esempio n. 4
0
        public async void GivenRequestForStudies_WhenRetrievingQueriableExtendedQueryTags_ReturnsStudyTags(QueryResource resourceType)
        {
            var request = new QueryResourceRequest(
                Substitute.For <IEnumerable <KeyValuePair <string, StringValues> > >(),
                resourceType,
                TestUidGenerator.Generate(),
                TestUidGenerator.Generate());

            List <ExtendedQueryTagStoreEntry> storeEntries = new List <ExtendedQueryTagStoreEntry>()
            {
                new ExtendedQueryTagStoreEntry(1, "00741000", "CS", null, QueryTagLevel.Instance, ExtendedQueryTagStatus.Ready),
                new ExtendedQueryTagStoreEntry(2, "0040A121", "DA", null, QueryTagLevel.Series, ExtendedQueryTagStatus.Ready),
                new ExtendedQueryTagStoreEntry(3, "00101005", "PN", null, QueryTagLevel.Study, ExtendedQueryTagStatus.Ready),
            };

            var list = QueryTagService.CoreQueryTags.Concat(storeEntries.Select(item => new QueryTag(item))).ToList();

            _queryStore.QueryAsync(Arg.Any <QueryExpression>(), Arg.Any <CancellationToken>()).ReturnsForAnyArgs(new QueryResult(new List <VersionedInstanceIdentifier>()));
            await _queryService.QueryAsync(request, CancellationToken.None);

            _queryParser.Received().Parse(request, Arg.Do <IReadOnlyCollection <QueryTag> >(x => Assert.Equal(x, list, QueryTagComparer.Default)));
        }
        private static void ValidateRequestIdentifiers(QueryResourceRequest message)
        {
            switch (message.QueryResourceType)
            {
            case QueryResource.StudySeries:
            case QueryResource.StudyInstances:
                UidValidator.Validate(message.StudyInstanceUid, nameof(message.StudyInstanceUid));
                break;

            case QueryResource.StudySeriesInstances:
                UidValidator.Validate(message.StudyInstanceUid, nameof(message.StudyInstanceUid));
                UidValidator.Validate(message.SeriesInstanceUid, nameof(message.SeriesInstanceUid));
                break;

            case QueryResource.AllStudies:
            case QueryResource.AllSeries:
            case QueryResource.AllInstances:
                break;

            default:
                Debug.Fail("A newly added query resource is not handled.");
                break;
            }
        }
 /// <summary>
 ///  根据标签查找资源。 &lt;br/&gt;
 /// 若要查找cdn产品线的资源则url中的regionId必须指定为cn-all。
 ///
 /// </summary>
 /// <param name="request">请求参数信息</param>
 /// <returns>请求结果信息</returns>
 public async Task <QueryResourceResponse> QueryResource(QueryResourceRequest request)
 {
     return(await new QueryResourceExecutor().Client(this).Execute <QueryResourceResponse, QueryResourceResult, QueryResourceRequest>(request).ConfigureAwait(false));
 }
 /// <summary>
 ///  根据标签查找资源。 &lt;br/&gt;
 /// 若要查找cdn产品线的资源则url中的regionId必须指定为cn-all。
 ///
 /// </summary>
 /// <param name="request">请求参数信息</param>
 /// <returns>请求结果信息</returns>
 public QueryResourceResponse QueryResource(QueryResourceRequest request)
 {
     return(new QueryResourceExecutor().Client(this).Execute <QueryResourceResponse, QueryResourceResult, QueryResourceRequest>(request));
 }