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 SqlBulkCopyDataWrapper CreateSqlBulkCopyDataWrapper(ImportResource resource)
        {
            var resourceMetadata = new ResourceMetadata(
                resource.Resource.CompartmentIndices,
                resource.Resource.SearchIndices?.ToLookup(e => _searchParameterTypeMap.GetSearchValueType(e)),
                resource.Resource.LastModifiedClaims);
            short resourceTypeId = _model.GetResourceTypeId(resource.Resource.ResourceTypeName);

            resource.CompressedStream.Seek(0, 0);

            return(new SqlBulkCopyDataWrapper()
            {
                Metadata = resourceMetadata,
                ResourceTypeId = resourceTypeId,
                Resource = resource.Resource,
                ResourceSurrogateId = resource.Id,
                Index = resource.Index,
                BulkImportResource = resource.ExtractBulkImportResourceTypeV1Row(resourceTypeId),
            });
        }
        public virtual IEnumerable <TRow> GenerateRows(IReadOnlyList <ResourceWrapper> input)
        {
            EnsureInitialized();

            for (var index = 0; index < input.Count; index++)
            {
                ResourceWrapper resource = input[index];

                var resourceMetadata = new ResourceMetadata(
                    resource.CompartmentIndices,
                    resource.SearchIndices?.ToLookup(e => _searchParameterTypeMap.GetSearchValueType(e)),
                    resource.LastModifiedClaims);

                foreach (SearchIndexEntry v in resourceMetadata.GetSearchIndexEntriesByType(typeof(TSearchValue)))
                {
                    short searchParamId = Model.GetSearchParamId(v.SearchParameter.Url);

                    if (!_isConvertSearchValueOverridden)
                    {
                        // save an array allocation
                        if (TryGenerateRow(index, searchParamId, (TSearchValue)v.Value, out TRow row))
                        {
                            yield return(row);
                        }
                    }
                    else
                    {
                        foreach (var searchValue in ConvertSearchValue(v))
                        {
                            if (TryGenerateRow(index, searchParamId, searchValue, out TRow row))
                            {
                                yield return(row);
                            }
                        }
                    }
                }
            }
        }
Ejemplo n.º 4
0
        public IEnumerable <BulkResourceWriteClaimTableTypeV1Row> GenerateRows(IReadOnlyList <ResourceWrapper> resources)
        {
            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);

                IReadOnlyCollection <KeyValuePair <string, string> > writeClaims = resourceMetadata.WriteClaims;
                if (writeClaims == null)
                {
                    yield break;
                }

                foreach (var claim in writeClaims)
                {
                    yield return(new BulkResourceWriteClaimTableTypeV1Row(index, _model.GetClaimTypeId(claim.Key), claim.Value));
                }
            }
        }
        private NormalizedSearchParameterQueryGenerator VisitSearchParameterExpressionBase(SearchParameterInfo searchParameterInfo, Expression childExpression, object context)
        {
            switch (searchParameterInfo.Name)
            {
            case SearchParameterNames.Id:
            case SearchParameterNames.LastUpdated:
            case SearchParameterNames.ResourceType:
            case SqlSearchParameters.ResourceSurrogateIdParameterName:
                // these are all denormalized
                return(null);
            }

            if (childExpression != null)
            {
                if (searchParameterInfo.Type == SearchParamType.Token)
                {
                    // could be Token or TokenText
                    return(childExpression.AcceptVisitor(this, context));
                }
            }

            if (!_cache.TryGetValue(searchParameterInfo.Url, out var generator))
            {
                generator = GetGenerator(searchParameterInfo);
                _cache.TryAdd(searchParameterInfo.Url, generator);
            }

            return(generator);

            NormalizedSearchParameterQueryGenerator GetGenerator(SearchParameterInfo param)
            {
                switch (param.Type)
                {
                case SearchParamType.Token:
                    return(TokenSearchParameterQueryGenerator.Instance);

                case SearchParamType.Date:
                    return(DateTimeSearchParameterQueryGenerator.Instance);

                case SearchParamType.Number:
                    return(NumberSearchParameterQueryGenerator.Instance);

                case SearchParamType.Quantity:
                    return(QuantitySearchParameterQueryGenerator.Instance);

                case SearchParamType.Reference:
                    return(ReferenceSearchParameterQueryGenerator.Instance);

                case SearchParamType.String:
                    return(StringSearchParameterQueryGenerator.Instance);

                case SearchParamType.Uri:
                    return(UriSearchParameterQueryGenerator.Instance);

                case SearchParamType.Composite:
                    Type searchValueType = _searchParameterToSearchValueTypeMap.GetSearchValueType(param);
                    if (searchValueType == typeof(ValueTuple <TokenSearchValue, QuantitySearchValue>))
                    {
                        return(TokenQuantityCompositeSearchParameterQueryGenerator.Instance);
                    }

                    if (searchValueType == typeof(ValueTuple <ReferenceSearchValue, TokenSearchValue>))
                    {
                        return(ReferenceTokenCompositeSearchParameterQueryGenerator.Instance);
                    }

                    if (searchValueType == typeof(ValueTuple <TokenSearchValue, TokenSearchValue>))
                    {
                        return(TokenTokenCompositeSearchParameterQueryGenerator.Instance);
                    }

                    if (searchValueType == typeof(ValueTuple <TokenSearchValue, DateTimeSearchValue>))
                    {
                        return(TokenDateTimeCompositeSearchParameterQueryGenerator.Instance);
                    }

                    if (searchValueType == typeof(ValueTuple <TokenSearchValue, StringSearchValue>))
                    {
                        return(TokenStringCompositeSearchParameterQueryGenerator.Instance);
                    }

                    if (searchValueType == typeof(ValueTuple <TokenSearchValue, NumberSearchValue, NumberSearchValue>))
                    {
                        return(TokenNumberNumberSearchParameterQueryGenerator.Instance);
                    }

                    throw new InvalidOperationException($"Unexpected composite search parameter {param.Url}");

                default:
                    throw new InvalidOperationException($"Unexpected search parameter type {param.Type}");
                }
            }
        }
Ejemplo n.º 6
0
        public SearchParamTableExpressionQueryGenerator GetGenerator(SearchParameterInfo param)
        {
            switch (param.Type)
            {
            case SearchParamType.Token:
                return(TokenQueryGenerator.Instance);

            case SearchParamType.Date:
                return(DateTimeQueryGenerator.Instance);

            case SearchParamType.Number:
                return(NumberQueryGenerator.Instance);

            case SearchParamType.Quantity:
                return(QuantityQueryGenerator.Instance);

            case SearchParamType.Reference:
                return(ReferenceQueryGenerator.Instance);

            case SearchParamType.String:
                return(StringQueryGenerator.Instance);

            case SearchParamType.Uri:
                return(UriQueryGenerator.Instance);

            case SearchParamType.Composite:
                Type searchValueType = _searchParameterToSearchValueTypeMap.GetSearchValueType(param);
                if (searchValueType == typeof(ValueTuple <TokenSearchValue, QuantitySearchValue>))
                {
                    return(TokenQuantityCompositeQueryGenerator.Instance);
                }

                if (searchValueType == typeof(ValueTuple <ReferenceSearchValue, TokenSearchValue>))
                {
                    return(ReferenceTokenCompositeQueryGenerator.Instance);
                }

                if (searchValueType == typeof(ValueTuple <TokenSearchValue, TokenSearchValue>))
                {
                    return(TokenTokenCompositeQueryGenerator.Instance);
                }

                if (searchValueType == typeof(ValueTuple <TokenSearchValue, DateTimeSearchValue>))
                {
                    return(TokenDateTimeCompositeQueryGenerator.Instance);
                }

                if (searchValueType == typeof(ValueTuple <TokenSearchValue, StringSearchValue>))
                {
                    return(TokenStringCompositeQueryGenerator.Instance);
                }

                if (searchValueType == typeof(ValueTuple <TokenSearchValue, NumberSearchValue, NumberSearchValue>))
                {
                    return(TokenNumberNumberQueryGenerator.Instance);
                }

                throw new InvalidOperationException($"Unexpected composite search parameter {param.Url}");

            default:
                throw new InvalidOperationException($"Unexpected search parameter type {param.Type}");
            }
        }