in src/Microsoft.Health.Fhir.Core/Features/Operations/Export/ExportJobTask.cs [485:556]
private async Task RunExportCompartmentSearch(
ExportJobConfiguration exportJobConfiguration,
ExportJobProgress progress,
List<Tuple<string, string>> sharedQueryParametersList,
IAnonymizer anonymizer,
CancellationToken cancellationToken,
string batchIdPrefix = "")
{
EnsureArg.IsNotNull(exportJobConfiguration, nameof(exportJobConfiguration));
EnsureArg.IsNotNull(progress, nameof(progress));
EnsureArg.IsNotNull(sharedQueryParametersList, nameof(sharedQueryParametersList));
List<Tuple<string, string>> queryParametersList = new List<Tuple<string, string>>(sharedQueryParametersList);
if (progress.ContinuationToken != null)
{
queryParametersList.Add(Tuple.Create(KnownQueryParameterNames.ContinuationToken, progress.ContinuationToken));
}
var requestedResourceTypes = _exportJobRecord.ResourceType?.Split(',');
var filteredResources = new HashSet<string>(StringComparer.OrdinalIgnoreCase);
if (_exportJobRecord.Filters != null)
{
foreach (var filter in _exportJobRecord.Filters)
{
filteredResources.Add(filter.ResourceType);
}
}
if (progress.CurrentFilter != null)
{
await ProcessFilterForCompartment(exportJobConfiguration, progress, queryParametersList, anonymizer, batchIdPrefix + "-filter", cancellationToken);
}
if (_exportJobRecord.Filters != null)
{
foreach (var filter in _exportJobRecord.Filters)
{
if (!progress.CompletedFilters.Contains(filter) &&
requestedResourceTypes != null &&
requestedResourceTypes.Contains(filter.ResourceType, StringComparison.OrdinalIgnoreCase))
{
progress.SetFilter(filter);
await ProcessFilterForCompartment(exportJobConfiguration, progress, queryParametersList, anonymizer, batchIdPrefix + "-filter", cancellationToken);
}
}
}
if (_exportJobRecord.Filters == null ||
_exportJobRecord.Filters.Count == 0 ||
!requestedResourceTypes.All(resourceType => filteredResources.Contains(resourceType)))
{
if (requestedResourceTypes != null)
{
List<string> resources = new List<string>();
foreach (var resource in requestedResourceTypes)
{
if (!filteredResources.Contains(resource))
{
resources.Add(resource);
}
}
if (resources.Count > 0)
{
queryParametersList.Add(Tuple.Create(KnownQueryParameterNames.Type, resources.JoinByOrSeparator()));
}
}
await SearchCompartmentWithFilter(exportJobConfiguration, progress, null, queryParametersList, anonymizer, batchIdPrefix, cancellationToken);
}
}