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)); }
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)); }
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)); }
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> /// 根据标签查找资源。 <br/> /// 若要查找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> /// 根据标签查找资源。 <br/> /// 若要查找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)); }