public IEnumerable <BulkCompartmentAssignmentTableTypeV1Row> GenerateRows(IReadOnlyList <ResourceWrapper> resources) { EnsureInitialized(); for (var index = 0; index < resources.Count; index++) { ResourceWrapper resource = resources[index]; var resourceMetadata = new ResourceMetadata( resource.CompartmentIndices, resource.SearchIndices?.ToLookup(e => _searchParameterTypeMap.GetSearchValueType(e)), resource.LastModifiedClaims); CompartmentIndices compartments = resourceMetadata.Compartments; if (compartments == null) { yield break; } if (compartments.PatientCompartmentEntry != null) { foreach (var entry in compartments.PatientCompartmentEntry) { yield return(new BulkCompartmentAssignmentTableTypeV1Row(index, _patientCompartmentId, entry)); } } if (compartments.EncounterCompartmentEntry != null) { foreach (var entry in compartments.EncounterCompartmentEntry) { yield return(new BulkCompartmentAssignmentTableTypeV1Row(index, _encounterCompartmentId, entry)); } } if (compartments.RelatedPersonCompartmentEntry != null) { foreach (var entry in compartments.RelatedPersonCompartmentEntry) { yield return(new BulkCompartmentAssignmentTableTypeV1Row(index, _relatedPersonCompartmentId, entry)); } } if (compartments.PractitionerCompartmentEntry != null) { foreach (var entry in compartments.PractitionerCompartmentEntry) { yield return(new BulkCompartmentAssignmentTableTypeV1Row(index, _practitionerCompartmentId, entry)); } } if (compartments.DeviceCompartmentEntry != null) { foreach (var entry in compartments.DeviceCompartmentEntry) { yield return(new BulkCompartmentAssignmentTableTypeV1Row(index, _deviceCompartmentId, entry)); } } } }
public void GivenSearchIndicesWithMultipleReferenceSearchParams_WhenExtracted_ThenCorrectIndicesExtracted(CompartmentType expectedCompartmentType1, CompartmentType expectedCompartmentType2, CompartmentType expectedCompartmentType3) { HashSet <string> compParams = null; string expectedCareTeamResource = ResourceType.CareTeam.ToString(); // Setup the compartment search definitions. string expectedCompartmentType1Str = expectedCompartmentType1.ToString(); _compartmentManager.TryGetSearchParams(expectedCareTeamResource, expectedCompartmentType1Str, out compParams) .Returns(x => { x[2] = new HashSet <string> { _referenceSearchTestParam.Name }; return(true); }); string expectedCompartmentType2Str = expectedCompartmentType2.ToString(); _compartmentManager.TryGetSearchParams(expectedCareTeamResource, expectedCompartmentType2Str, out compParams) .Returns(x => { x[2] = new HashSet <string> { _anotherReferenceSearchTestParam.Name }; return(true); }); string expectedCompartmentType3Str = expectedCompartmentType3.ToString(); _compartmentManager.TryGetSearchParams(expectedCareTeamResource, expectedCompartmentType3Str, out compParams) .Returns(x => { x[2] = new HashSet <string> { _yetAnotherReferenceSearchTestParam.Name }; return(true); }); const string ExpectedResourceIdR1 = "r1"; const string ExpectedResourceIdR2 = "r2"; const string ExpectedResourceIdR3 = "r3"; // Setup multiple reference search parameters with expected resource ids for the compartments. var searchIndexEntries = new List <SearchIndexEntry> { new SearchIndexEntry(_referenceSearchTestParam, new ReferenceSearchValue(ReferenceKind.InternalOrExternal, _baseUri, CompartmentDefinitionManager.CompartmentTypeToResourceType(expectedCompartmentType1Str).ToString(), ExpectedResourceIdR1)), new SearchIndexEntry(_anotherReferenceSearchTestParam, new ReferenceSearchValue(ReferenceKind.Internal, _baseUri, CompartmentDefinitionManager.CompartmentTypeToResourceType(expectedCompartmentType2Str).ToString(), ExpectedResourceIdR2)), new SearchIndexEntry(_yetAnotherReferenceSearchTestParam, new ReferenceSearchValue(ReferenceKind.External, _baseUri, CompartmentDefinitionManager.CompartmentTypeToResourceType(expectedCompartmentType3Str).ToString(), ExpectedResourceIdR3)), }; CompartmentIndices compartmentIndices = _compartmentIndexer.Extract(expectedCareTeamResource, searchIndexEntries); Assert.Collection(GetResourceIdsForCompartmentType(expectedCompartmentType1, compartmentIndices), r => string.Equals(ExpectedResourceIdR1, r, StringComparison.OrdinalIgnoreCase)); Assert.Collection(GetResourceIdsForCompartmentType(expectedCompartmentType2, compartmentIndices), r => string.Equals(ExpectedResourceIdR2, r, StringComparison.OrdinalIgnoreCase)); Assert.Collection(GetResourceIdsForCompartmentType(expectedCompartmentType3, compartmentIndices), r => string.Equals(ExpectedResourceIdR3, r, StringComparison.OrdinalIgnoreCase)); }
/// <summary> /// Initializes a new instance of the <see cref="ResourceWrapperWithSearchIndices"/> class. /// </summary> /// <param name="resource">The resource.</param> /// <param name="rawResource">The raw resource.</param> /// <param name="request">Request information for how th resource was made.</param> /// <param name="isDeleted">A flag indicating whether the source is deleted or not.</param> /// <param name="searchIndices">The search indices.</param> /// <param name="compartmentIndices">The comparment indices.</param> /// <param name="lastModifiedClaims">The security claims when the resource was last modified.</param> public ResourceWrapperWithSearchIndices( Resource resource, RawResource rawResource, ResourceRequest request, bool isDeleted, IReadOnlyCollection <SearchIndexEntry> searchIndices, CompartmentIndices compartmentIndices, IReadOnlyCollection <KeyValuePair <string, string> > lastModifiedClaims) : base(resource, rawResource, request, isDeleted, lastModifiedClaims, compartmentIndices) { SearchIndices = searchIndices ?? System.Array.Empty <SearchIndexEntry>(); }
public void GivenSearchIndicesWithResourceTypeAndCompartmentType_WhenExtracted_ThenCorrectIndicesExtracted(ResourceType resourceType, CompartmentType compartmentType, string resourceId) { var compartmentManager = Substitute.For <ICompartmentDefinitionManager>(); var compartmentIndexer = new CompartmentIndexer(compartmentManager); HashSet <string> compParams = null; compartmentManager.TryGetSearchParams(resourceType, compartmentType, out compParams) .Returns(x => { x[2] = new HashSet <string> { "testParam" }; return(true); }); var searchIndexEntries = new List <SearchIndexEntry> { new SearchIndexEntry(new SearchParameter { Name = "testParam" }, new ReferenceSearchValue(ReferenceKind.Internal, new Uri("http://localhost"), CompartmentDefinitionManager.CompartmentTypeToResourceType(compartmentType), resourceId)) }; CompartmentIndices compartmentIndices = compartmentIndexer.Extract(resourceType, searchIndexEntries); IReadOnlyCollection <string> resourceIds = null; if (compartmentType == CompartmentType.Device) { resourceIds = compartmentIndices.DeviceCompartmentEntry; } else if (compartmentType == CompartmentType.Encounter) { resourceIds = compartmentIndices.EncounterCompartmentEntry; } else if (compartmentType == CompartmentType.Patient) { resourceIds = compartmentIndices.PatientCompartmentEntry; } else if (compartmentType == CompartmentType.Practitioner) { resourceIds = compartmentIndices.PractitionerCompartmentEntry; } else if (compartmentType == CompartmentType.RelatedPerson) { resourceIds = compartmentIndices.RelatedPersonCompartmentEntry; } Assert.Single(resourceIds); Assert.Contains(resourceId, resourceIds); }
public FhirCosmosResourceWrapper( string resourceId, string versionId, string resourceTypeName, RawResource rawResource, ResourceRequest request, DateTimeOffset lastModified, bool deleted, bool history, IReadOnlyCollection <SearchIndexEntry> searchIndices, CompartmentIndices compartmentIndices, IReadOnlyCollection <KeyValuePair <string, string> > lastModifiedClaims) : base(resourceId, versionId, resourceTypeName, rawResource, request, lastModified, deleted, searchIndices, compartmentIndices, lastModifiedClaims) { IsHistory = history; }
public void GivenSearchIndicesWithResourceTypeAndCompartmentTypeAndNullReferenceSearchResourceType_WhenExtracted_ThenNoIndicesExtracted(ResourceType resourceType, CompartmentType compartmentType, ReferenceKind referenceKind, string expectedResourceId) { HashSet <string> compParams = null; _compartmentManager.TryGetSearchParams(resourceType.ToString(), compartmentType, out compParams) .Returns(x => { x[2] = new HashSet <string> { _referenceSearchTestParam.Name }; return(true); }); var searchIndexEntries = new List <SearchIndexEntry> { new SearchIndexEntry(_referenceSearchTestParam, new ReferenceSearchValue(referenceKind, null, null, expectedResourceId)), }; CompartmentIndices compartmentIndices = _compartmentIndexer.Extract(resourceType.ToString(), searchIndexEntries); Assert.Null(GetResourceIdsForCompartmentType(compartmentType, compartmentIndices)); }
public void GivenSearchIndicesWithResourceTypeAndCompartmentType_WhenExtracted_ThenCorrectIndicesExtracted(ResourceType resourceType, CompartmentType compartmentType, ReferenceKind referenceKind, string expectedResourceId) { HashSet <string> compParams = null; _compartmentManager.TryGetSearchParams(resourceType.ToString(), compartmentType, out compParams) .Returns(x => { x[2] = new HashSet <string> { _referenceSearchTestParam.Name, _nonReferenceReferenceSearchTestParam.Name }; return(true); }); var searchIndexEntries = new List <SearchIndexEntry> { new SearchIndexEntry(_referenceSearchTestParam, new ReferenceSearchValue(referenceKind, _baseUri, CompartmentDefinitionManager.CompartmentTypeToResourceType(compartmentType.ToString()).ToString(), expectedResourceId)), new SearchIndexEntry(_nonReferenceReferenceSearchTestParam, new StringSearchValue("aadsdas")), }; CompartmentIndices compartmentIndices = _compartmentIndexer.Extract(resourceType.ToString(), searchIndexEntries); Assert.Collection(GetResourceIdsForCompartmentType(compartmentType, compartmentIndices), r => string.Equals(expectedResourceId, r, StringComparison.OrdinalIgnoreCase)); }
public CompartmentIndices Extract(string resourceType, IReadOnlyCollection <SearchIndexEntry> searchIndices) { EnsureArg.IsNotNull(searchIndices, nameof(searchIndices)); var compartmentTypeToResourceIds = new Dictionary <string, IReadOnlyCollection <string> >(); Dictionary <string, List <SearchIndexEntry> > searchIndicesByCompartmentType = ExtractSearchIndexByCompartmentType(searchIndices); foreach (CompartmentType compartmentType in Enum.GetValues(typeof(CompartmentType))) { string compartmentTypeLiteral = compartmentType.ToString(); compartmentTypeToResourceIds[compartmentTypeLiteral] = null; if (_compartmentDefinitionManager.TryGetSearchParams(resourceType, compartmentType, out HashSet <string> searchParams) && searchIndicesByCompartmentType.TryGetValue(compartmentTypeLiteral, out List <SearchIndexEntry> searchIndicesForCompartment)) { var searchEntries = searchIndicesForCompartment.Where(si => searchParams.Contains(si.SearchParameter.Name)); var resourceIds = new HashSet <string>(StringComparer.OrdinalIgnoreCase); string compartmentResourceType = CompartmentDefinitionManager.CompartmentTypeToResourceType(compartmentTypeLiteral); foreach (SearchIndexEntry entry in searchEntries) { var refValue = (ReferenceSearchValue)entry.Value; if (refValue.ResourceType == compartmentResourceType) { resourceIds.Add(refValue.ResourceId); } } if (resourceIds.Any()) { compartmentTypeToResourceIds[compartmentType.ToString()] = resourceIds; } } } var compartmentIndices = new CompartmentIndices(compartmentTypeToResourceIds); return(compartmentIndices); }
private static IReadOnlyCollection <string> GetResourceIdsForCompartmentType(CompartmentType compartmentType, CompartmentIndices compartmentIndices) { IReadOnlyCollection <string> resourceIds = null; if (compartmentType == CompartmentType.Device) { resourceIds = compartmentIndices.DeviceCompartmentEntry; } else if (compartmentType == CompartmentType.Encounter) { resourceIds = compartmentIndices.EncounterCompartmentEntry; } else if (compartmentType == CompartmentType.Patient) { resourceIds = compartmentIndices.PatientCompartmentEntry; } else if (compartmentType == CompartmentType.Practitioner) { resourceIds = compartmentIndices.PractitionerCompartmentEntry; } else if (compartmentType == CompartmentType.RelatedPerson) { resourceIds = compartmentIndices.RelatedPersonCompartmentEntry; } return(resourceIds); }
public ResourceMetadata(CompartmentIndices compartmentIndices = null, ILookup <Type, SearchIndexEntry> groupedSearchIndices = null, IReadOnlyCollection <KeyValuePair <string, string> > resourceWriteClaims = null) { Compartments = compartmentIndices; _groupedSearchIndices = groupedSearchIndices; WriteClaims = resourceWriteClaims; }