in src/Microsoft.Health.Dicom.Core/Features/Query/QueryParser.cs [77:137]
public QueryParser(IDicomTagParser dicomTagPathParser)
=> _dicomTagPathParser = EnsureArg.IsNotNull(dicomTagPathParser, nameof(dicomTagPathParser));
public QueryExpression Parse(QueryParameters parameters, IReadOnlyCollection<QueryTag> queryTags)
{
EnsureArg.IsNotNull(parameters, nameof(parameters));
EnsureArg.IsNotNull(queryTags, nameof(queryTags));
// Update the list of query tags
queryTags = GetQualifiedQueryTags(queryTags, parameters.QueryResourceType);
List<string> erroneousTags = new List<string>();
var filterConditions = new Dictionary<DicomTag, QueryFilterCondition>();
foreach (KeyValuePair<string, string> filter in parameters.Filters)
{
// filter conditions with attributeId as key
if (!ParseFilterCondition(filter, queryTags, parameters.FuzzyMatching, out QueryFilterCondition condition))
{
throw new QueryParseException(string.Format(DicomCoreResource.UnknownQueryParameter, filter.Key));
}
if (condition.QueryTag.IsExtendedQueryTag && condition.QueryTag.ExtendedQueryTagStoreEntry.ErrorCount > 0)
{
erroneousTags.Add(filter.Key);
}
if (!filterConditions.TryAdd(condition.QueryTag.Tag, condition))
{
throw new QueryParseException(string.Format(DicomCoreResource.DuplicateAttribute, filter.Key));
}
}
// add UIDs as filter conditions
if (parameters.StudyInstanceUid != null)
{
var condition = new StringSingleValueMatchCondition(new QueryTag(DicomTag.StudyInstanceUID), parameters.StudyInstanceUid);
if (!filterConditions.TryAdd(DicomTag.StudyInstanceUID, condition))
{
throw new QueryParseException(DicomCoreResource.DisallowedStudyInstanceUIDAttribute);
}
}
if (parameters.SeriesInstanceUid != null)
{
var condition = new StringSingleValueMatchCondition(new QueryTag(DicomTag.SeriesInstanceUID), parameters.SeriesInstanceUid);
if (!filterConditions.TryAdd(DicomTag.SeriesInstanceUID, condition))
{
throw new QueryParseException(DicomCoreResource.DisallowedSeriesInstanceUIDAttribute);
}
}
return new QueryExpression(
parameters.QueryResourceType,
ParseIncludeFields(parameters.IncludeField),
parameters.FuzzyMatching,
parameters.Limit,
parameters.Offset,
filterConditions.Values,
erroneousTags);
}