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));
        }
Exemple #3
0
 /// <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);
        }
Exemple #5
0
 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;
 }
Exemple #6
0
        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));
        }
Exemple #7
0
        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));
        }
Exemple #8
0
        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);
        }
Exemple #9
0
        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);
        }
Exemple #10
0
 public ResourceMetadata(CompartmentIndices compartmentIndices = null, ILookup <Type, SearchIndexEntry> groupedSearchIndices = null, IReadOnlyCollection <KeyValuePair <string, string> > resourceWriteClaims = null)
 {
     Compartments          = compartmentIndices;
     _groupedSearchIndices = groupedSearchIndices;
     WriteClaims           = resourceWriteClaims;
 }