Example #1
0
        public IList <ResIndexQuantityType> Set(IElementNavigator oElement, DtoServiceSearchParameterLight SearchParameter)
        {
            var ResourceIndexList        = new List <ResIndexQuantityType>();
            int ServiceSearchParameterId = SearchParameter.Id;

            if (oElement is Hl7.Fhir.ElementModel.PocoNavigator Poco && Poco.FhirValue != null)
            {
                if (Poco.FhirValue is Integer Integer)
                {
                    SetInteger(Integer, ResourceIndexList);
                }
                else if (Poco.FhirValue is PositiveInt PositiveInt)
                {
                    SetPositiveInt(PositiveInt, ResourceIndexList);
                }
                else if (Poco.FhirValue is Duration Duration)
                {
                    SetDuration(Duration, ResourceIndexList);
                }
                else if (Poco.FhirValue is FhirDecimal FhirDecimal)
                {
                    SetFhirDecimal(FhirDecimal, ResourceIndexList);
                }
                else if (Poco.FhirValue is Range Range)
                {
                    SetRange(Range, ResourceIndexList);
                }
                else
                {
                    throw new FormatException($"Unknown FhirType: '{oElement.Type}' for SearchParameterType: '{SearchParameter.Type}'");
                }
                ResourceIndexList.ForEach(x => x.ServiceSearchParameterId = ServiceSearchParameterId);
                return(ResourceIndexList);
            }
Example #2
0
        public IList <ResIndexReferenceType> Set(IElementNavigator oElement, DtoServiceSearchParameterLight SearchParameter)
        {
            var ResourceIndexList        = new List <ResIndexReferenceType>();
            var ServiceSearchParameterId = SearchParameter.Id;

            if (oElement is Hl7.Fhir.ElementModel.PocoNavigator Poco && Poco.FhirValue != null)
            {
                if (Poco.FhirValue is FhirUri FhirUri)
                {
                    SetFhirUri(FhirUri, ResourceIndexList);
                }
                else if (Poco.FhirValue is ResourceReference ResourceReference)
                {
                    SetResourcereference(ResourceReference, ResourceIndexList);
                }
                else if (Poco.FhirValue is Resource Resource)
                {
                    SetResource(Resource, ResourceIndexList);
                }
                else if (Poco.FhirValue is Attachment Attachment)
                {
                    SetUri(Attachment, ResourceIndexList);
                }
                else if (Poco.FhirValue is Identifier Identifier)
                {
                    SetIdentifier(Identifier, ResourceIndexList);
                }
                else
                {
                    throw new FormatException($"Unknown FhirType: '{oElement.Type}' for SearchParameterType: '{SearchParameter.Type}'");
                }
                ResourceIndexList.ForEach(x => x.ServiceSearchParameterId = ServiceSearchParameterId);
                return(ResourceIndexList);
            }
        // SearchParameterLight Methods =================================================================
        public List <DtoServiceSearchParameterLight> GetServiceSearchParametersLightForResource(string ResourceType)
        {
            var ReturnList = new List <DtoServiceSearchParameterLight>();

            var DynamicList = IPyroDbContext.ServiceSearchParameter.Include(x => x.TargetResourceTypeList).Include(c => c.ServiceSearchParameterCompositePivotList)
                              .Where(x => x.Resource == ResourceType & x.IsIndexed == true & (x.Status == PublicationStatus.Active || x.Status == PublicationStatus.Draft))
                              .Select(x => new { x.Id, x.Name, x.Expression, x.Resource, x.Type, x.TargetResourceTypeList, x.ServiceSearchParameterCompositePivotList }).ToList();

            if (DynamicList != null)
            {
                foreach (var x in DynamicList)
                {
                    var Light = new DtoServiceSearchParameterLight();
                    Light.Id                     = x.Id;
                    Light.Name                   = x.Name;
                    Light.Expression             = x.Expression;
                    Light.Type                   = x.Type;
                    Light.Resource               = x.Resource;
                    Light.TargetResourceTypeList = PopulateDtoTargetResourceList(x.TargetResourceTypeList);
                    Light.CompositeList          = PopulateDtoCompositeList(x.ServiceSearchParameterCompositePivotList);
                    ReturnList.Add(Light);
                }
            }
            return(ReturnList);
        }
        public IList <ResIndexQuantityType> Set(IElementNavigator oElement, DtoServiceSearchParameterLight SearchParameter)
        {
            var QuantityIndexList = IQuantitySetter.Set(oElement, SearchParameter);

            if (QuantityIndexList.Count == 0)
            {
                return(null);
            }

            var DbReferenceIndexList = new List <ResIndexQuantityType>();

            foreach (IQuantityIndex Index in QuantityIndexList)
            {
                var DbResourceIndex = new ResIndexQuantityType();
                DbResourceIndex.Comparator = Index.Comparator;
                DbResourceIndex.Quantity   = Index.Quantity;
                DbResourceIndex.Code       = Index.Code;
                DbResourceIndex.System     = Index.System;
                DbResourceIndex.Unit       = Index.Unit;

                DbResourceIndex.ComparatorHigh = Index.ComparatorHigh;
                DbResourceIndex.QuantityHigh   = Index.QuantityHigh;
                DbResourceIndex.CodeHigh       = Index.CodeHigh;
                DbResourceIndex.SystemHigh     = Index.SystemHigh;
                DbResourceIndex.UnitHigh       = Index.UnitHigh;

                DbResourceIndex.ServiceSearchParameterId = Index.ServiceSearchParameterLight.Id;

                DbReferenceIndexList.Add(DbResourceIndex);
            }
            return(DbReferenceIndexList);
        }
Example #5
0
        public IList <IQuantityIndex> Set(IElementNavigator oElement, DtoServiceSearchParameterLight SearchParameter)
        {
            _SearchParameter = SearchParameter;

            var ResourceIndexList        = new List <IQuantityIndex>();
            var ServiceSearchParameterId = SearchParameter.Id;

            if (oElement is Hl7.Fhir.ElementModel.PocoNavigator Poco && Poco.FhirValue != null)
            {
                if (Poco.FhirValue is Money Money)
                {
                    SetMoney(Money, ResourceIndexList);
                }
                else if (Poco.FhirValue is SimpleQuantity SimpleQuantity)
                {
                    SetSimpleQuantity(SimpleQuantity, ResourceIndexList);
                }
                else if (Poco.FhirValue is Quantity Quantity)
                {
                    SetQuantity(Quantity, ResourceIndexList);
                }
                else if (Poco.FhirValue is Location.PositionComponent PositionComponent)
                {
                    SetPositionComponent(PositionComponent, ResourceIndexList);
                }
                else if (Poco.FhirValue is Range Range)
                {
                    SetRange(Range, ResourceIndexList);
                }
                else
                {
                    throw new FormatException($"Unknown FhirType: '{oElement.Type}' for SearchParameterType: '{SearchParameter.Type}'");
                }
                return(ResourceIndexList);
            }
Example #6
0
        public List <DtoServiceSearchParameterLight> GetServiceSearchParametersLightForResource(string ResourceType)
        {
            var ReturnList = new List <DtoServiceSearchParameterLight>();

            var DynamicList = IPyroDbContext.ServiceSearchParameter.Include(x => x.TargetResourceTypeList)
                              .Where(x => x.Resource == ResourceType & x.IsIndexed == true & x.Status == PublicationStatus.Active)
                              .Select(x => new { x.Id, x.Name, x.Expression, x.Resource, x.Type, x.TargetResourceTypeList }).ToList();

            if (DynamicList != null)
            {
                foreach (var x in DynamicList)
                {
                    var Light = new DtoServiceSearchParameterLight();
                    Light.Id                     = x.Id;
                    Light.Name                   = x.Name;
                    Light.Expression             = x.Expression;
                    Light.Type                   = x.Type;
                    Light.Resource               = x.Resource;
                    Light.TargetResourceTypeList = new List <IServiceSearchParameterTargetResource>();
                    if (x.TargetResourceTypeList != null)
                    {
                        foreach (var Target in x.TargetResourceTypeList)
                        {
                            Light.TargetResourceTypeList.Add(new DtoServiceSearchParameterTargetResource()
                            {
                                ResourceType = Target.ResourceType
                            });
                        }
                    }
                    ReturnList.Add(Light);
                }
            }
            return(ReturnList);
        }
        private ITriggerOutcome ProcessUpdateOrDelete(ITriggerInput TriggerInput)
        {
            //Get any Compartment with the same FhirId
            DtoServiceSearchParameterLight TagSearchParameter = GetTagSearchParameters(TriggerInput.ResourceType.GetLiteral());

            if (TriggerInput.DbTokenIndexList.Any(x => x.ServiceSearchParameterId == TagSearchParameter.Id && x.Code == _ProtectedCoding.Code && x.System == _ProtectedCoding.System))
            {
                //The Resource is protected
                string Message = "Error Message Not Set";
                if (TriggerInput.CrudOperationType == RestEnum.CrudOperationType.Update)
                {
                    Message = $"The {TriggerInput.ResourceType.GetLiteral()} resource instance with Id: {TriggerInput.InboundResourceId} cannot be updated because it is a {_ProtectedCoding.Display}.";
                }
                else if (TriggerInput.CrudOperationType == RestEnum.CrudOperationType.Delete)
                {
                    Message = $"The {TriggerInput.ResourceType.GetLiteral()} resource instance with Id: {TriggerInput.InboundResourceId} cannot be deleted because it is a {_ProtectedCoding.Display}.";
                }
                var ReturnOperationOutcome = FhirOperationOutcomeSupport.Create(OperationOutcome.IssueSeverity.Error, OperationOutcome.IssueType.BusinessRule, Message);
                var TriggerOutcome         = new TriggerOutcome();
                TriggerOutcome.Report         = true;
                TriggerOutcome.HttpStatusCode = System.Net.HttpStatusCode.Conflict;
                TriggerOutcome.Resource       = ReturnOperationOutcome;
                return(TriggerOutcome);
            }
            else
            {
                //The resource is not Protected
                return(new TriggerOutcome()
                {
                    Report = false
                });
            }
        }
Example #8
0
 public override bool ValidatePrefixes(DtoServiceSearchParameterLight DtoSupportedSearchParameters)
 {
     foreach (var Value in ValueList)
     {
         if (!Value.ValidatePreFix(DtoSupportedSearchParameters))
         {
             return(false);
         }
     }
     return(true);
 }
Example #9
0
 public override bool ValidatePrefixes(DtoServiceSearchParameterLight DtoSupportedSearchParameters)
 {
     foreach (var Value in ValueList)
     {
         if (!Value.ValidatePreFix(DtoSupportedSearchParameters))
         {
             this.InvalidMessage = $"The search parameter had an unsupported prefix of '{Value.Prefix.GetLiteral()}'. ";
             return(false);
         }
     }
     return(true);
 }
Example #10
0
 public bool ValidatePreFix(DtoServiceSearchParameterLight DtoSupportedSearchParameters)
 {
     if (this.Prefix.HasValue == false)
     {
         return(true);
     }
     else if (Pyro.Common.Tools.SearchParameterTools.GetPrefixListForSearchType(DtoSupportedSearchParameters.Type).Contains(this.Prefix.GetLiteral()))
     {
         return(true);
     }
     else
     {
         return(false);
     }
 }
Example #11
0
        public IList <ResIndexUriType> Set(IElementNavigator oElement, DtoServiceSearchParameterLight SearchParameter)
        {
            var UriIndexList = IUriSetter.Set(oElement, SearchParameter);

            if (UriIndexList.Count == 0)
            {
                return(null);
            }

            var DbReferenceIndexList = new List <ResIndexUriType>();

            foreach (IUriIndex Index in UriIndexList)
            {
                var DbResourceIndex = new ResIndexUriType();
                DbResourceIndex.Uri = Index.Uri;
                DbResourceIndex.ServiceSearchParameterId = Index.ServiceSearchParameterLight.Id;
                DbReferenceIndexList.Add(DbResourceIndex);
            }
            return(DbReferenceIndexList);
        }
Example #12
0
        public IList <ResIndexTokenType> Set(IElementNavigator oElement, DtoServiceSearchParameterLight SearchParameter)
        {
            var TokenIndexList = ITokenSetter.Set(oElement, SearchParameter);

            if (TokenIndexList.Count == 0)
            {
                return(null);
            }

            var DbReferenceIndexList = new List <ResIndexTokenType>();

            foreach (ITokenIndex Index in TokenIndexList)
            {
                var DbResourceIndex = new ResIndexTokenType();
                DbResourceIndex.Code   = Index.Code;
                DbResourceIndex.System = Index.System;
                DbResourceIndex.ServiceSearchParameterId = Index.ServiceSearchParameterLight.Id;
                DbReferenceIndexList.Add(DbResourceIndex);
            }
            return(DbReferenceIndexList);
        }
Example #13
0
        public IList <ResIndexUriType> Set(IElementNavigator oElement, DtoServiceSearchParameterLight SearchParameter)
        {
            var ResourceIndexList        = new List <ResIndexUriType>();
            var ServiceSearchParameterId = SearchParameter.Id;

            if (oElement is Hl7.Fhir.ElementModel.PocoNavigator Poco && Poco.FhirValue != null)
            {
                if (Poco.FhirValue is FhirUri FhirUri)
                {
                    SetUri(FhirUri, ResourceIndexList);
                }
                else if (Poco.FhirValue is Oid Oid)
                {
                    SetOid(Oid, ResourceIndexList);
                }
                else
                {
                    throw new FormatException($"Unknown FhirType: '{oElement.Type}' for SearchParameterType: '{SearchParameter.Type}'");
                }
                ResourceIndexList.ForEach(x => x.ServiceSearchParameterId = ServiceSearchParameterId);
                return(ResourceIndexList);
            }
Example #14
0
        public IList <IDateTimeIndex> Set(IElementNavigator oElement, DtoServiceSearchParameterLight SearchParameter)
        {
            var ResourceIndexList = new List <IDateTimeIndex>();

            _SearchParameter = SearchParameter;

            if (oElement is Hl7.Fhir.ElementModel.PocoNavigator Poco && Poco.FhirValue != null)
            {
                if (Poco.FhirValue is Date Date)
                {
                    SetDate(Date, ResourceIndexList);
                }
                else if (Poco.FhirValue is Period Period)
                {
                    SetPeriod(Period, ResourceIndexList);
                }
                else if (Poco.FhirValue is FhirDateTime FhirDateTime)
                {
                    SetDateTime(FhirDateTime, ResourceIndexList);
                }
                else if (Poco.FhirValue is FhirString FhirString)
                {
                    SetString(FhirString, ResourceIndexList);
                }
                else if (Poco.FhirValue is Instant Instant)
                {
                    SetInstant(Instant, ResourceIndexList);
                }
                else if (Poco.FhirValue is Timing Timing)
                {
                    SetTiming(Timing, ResourceIndexList);
                }
                else
                {
                    throw new FormatException($"Unknown FhirType: '{oElement.Type}' for SearchParameterType: '{SearchParameter.Type}'");
                }

                return(ResourceIndexList);
            }
Example #15
0
        private void AddIncludeResourceInstanceForIncludes(List <DtoResource> IncludeResourceList, HashSet <string> CacheResourceIDsAlreadyCollected, string FhirId)
        {
            //Don't source the same resource again from the Database if we already have it
            if (!CacheResourceIDsAlreadyCollected.Contains($"{IResourceRepository.RepositoryResourceType.GetLiteral()}-{FhirId}"))
            {
                IDatabaseOperationOutcome DatabaseOperationOutcomeIncludes = null;
                //Here we need to add compartment search, if we have a Compartment and id
                if (!string.IsNullOrWhiteSpace(this._Compartment) && !string.IsNullOrWhiteSpace(this._CompartmentId))
                {
                    //Here we need create a search parameter for _id={FhirId)

                    DtoServiceSearchParameterLight _IdSearchParamLight = IServiceSearchParameterCache.GetSearchParameterForResource(Hl7.Fhir.Model.ResourceType.Resource.GetLiteral()).SingleOrDefault(x => x.Name == "_id");
                    //var IdSearchParameter = ServiceSearchParameterFactory.BaseResourceSearchParameters().SingleOrDefault(x => x.Name == "_id");
                    var IdParameterString = new Tuple <string, string>(_IdSearchParamLight.Name, FhirId);
                    //var IdParameterString = new Tuple<string, string>(IdSearchParameter.Name, FhirId);

                    ISearchParameterBase SearchParam = ISearchParameterFactory.CreateSearchParameter(_IdSearchParamLight, IdParameterString);
                    //ISearchParameterBase SearchParam = ISearchParameterFactory.CreateSearchParameter(IdSearchParameter, IdParameterString);

                    PyroSearchParameters FhirIdSearchParameter = new PyroSearchParameters();
                    FhirIdSearchParameter.SearchParametersList = new List <ISearchParameterBase>();
                    FhirIdSearchParameter.SearchParametersList.Add(SearchParam);

                    //And now the Compartmnet Search parameters
                    PyroSearchParameters CompartmentSearchParameter = ICompartmentSearchParameterService.GetSearchParameters(this._Compartment, this._CompartmentId, IResourceRepository.RepositoryResourceType.GetLiteral());
                    DatabaseOperationOutcomeIncludes = IResourceRepository.GetResourceByCompartmentSearch(CompartmentSearchParameter, FhirIdSearchParameter, true);
                }
                else
                {
                    DatabaseOperationOutcomeIncludes = IResourceRepository.GetResourceByFhirID(FhirId, true, false);
                }

                var DtoIncludeResourceList = new List <DtoIncludeResource>();
                DatabaseOperationOutcomeIncludes.ReturnedResourceList.ForEach(x => DtoIncludeResourceList.Add(new DtoIncludeResource(x)));
                IncludeResourceList.AddRange(DtoIncludeResourceList);
                CacheResourceIDsAlreadyCollected.Add($"{IResourceRepository.RepositoryResourceType.GetLiteral()}-{FhirId}");
            }
        }
Example #16
0
        public IList <IStringIndex> Set(IElementNavigator oElement, DtoServiceSearchParameterLight SearchParameter)
        {
            _SearchParameter = SearchParameter;

            var ResourceIndexList        = new List <IStringIndex>();
            var ServiceSearchParameterId = SearchParameter.Id;

            if (oElement is Hl7.Fhir.ElementModel.PocoNavigator Poco && Poco.FhirValue != null)
            {
                if (Poco.FhirValue is FhirString FhirString)
                {
                    SetFhirString(FhirString, ResourceIndexList);
                }
                else if (Poco.FhirValue is Address address)
                {
                    SetAddress(address, ResourceIndexList);
                }
                else if (Poco.FhirValue is HumanName HumanName)
                {
                    SetHumanName(HumanName, ResourceIndexList);
                }
                else if (Poco.FhirValue is Markdown Markdown)
                {
                    SetMarkdown(Markdown, ResourceIndexList);
                }
                else if (Poco.FhirValue is Annotation Annotation)
                {
                    SetAnnotation(Annotation, ResourceIndexList);
                }
                else if (Poco.FhirValue is Base64Binary Base64Binary)
                {
                    //No good purpose to index base64 content as a search index
                }
                else
                {
                    throw new FormatException($"Unknown FhirType: '{oElement.Type}' for SearchParameterType: '{SearchParameter.Type}'");
                }
            }
Example #17
0
        public IList <ResIndexDateTimeType> Set(IElementNavigator oElement, DtoServiceSearchParameterLight SearchParameter)
        {
            var DateTimeIndexList = IDateTimeSetter.Set(oElement, SearchParameter);

            if (DateTimeIndexList.Count == 0)
            {
                return(null);
            }

            var DbReferenceIndexList = new List <ResIndexDateTimeType>();

            foreach (IDateTimeIndex Index in DateTimeIndexList)
            {
                var DbResourceIndex = new ResIndexDateTimeType();

                DbResourceIndex.HighUtcDateTime = Index.HighUtcDateTime;
                DbResourceIndex.LowUtcDateTime  = Index.LowUtcDateTime;

                DbResourceIndex.ServiceSearchParameterId = Index.ServiceSearchParameterLight.Id;
                DbReferenceIndexList.Add(DbResourceIndex);
            }
            return(DbReferenceIndexList);
        }
        private bool ValidateSearchParameterSupported(DtoServiceSearchParameterLight oSupported, ISearchParameterBase oInboundSearchParameter, IList <UnspportedSearchParameter> UnspportedSearchParameterList)
        {
            UnspportedSearchParameter DtoUnspportedSearchParameter = null;

            if (!oInboundSearchParameter.IsValid)
            {
                DtoUnspportedSearchParameter = InitaliseUnspportedParamerter(oInboundSearchParameter, DtoUnspportedSearchParameter);
                DtoUnspportedSearchParameter.ReasonMessage = DtoUnspportedSearchParameter.ReasonMessage + oInboundSearchParameter.InvalidMessage + ", ";
            }

            if (oInboundSearchParameter.Modifier.HasValue)
            {
                IList <SearchParameter.SearchModifierCode> oSupportedModifierList = Common.Tools.SearchParameterTools.GetModifiersForSearchType(oInboundSearchParameter.Type);
                if (!oSupportedModifierList.Contains(oInboundSearchParameter.Modifier.Value))
                {
                    DtoUnspportedSearchParameter = InitaliseUnspportedParamerter(oInboundSearchParameter, DtoUnspportedSearchParameter);
                    DtoUnspportedSearchParameter.ReasonMessage = DtoUnspportedSearchParameter.ReasonMessage + $"The parameter's modifier: '{oInboundSearchParameter.Modifier.ToString()}' is not supported by this server for the resource type '{oInboundSearchParameter.Resource.ToString()}', the whole parameter was : '{DtoUnspportedSearchParameter.RawParameter}', ";
                }
                //I feel we already do this when parseing the Referance Paramerter
                //if (oInboundSearchParameter.Modifier == SearchParameter.SearchModifierCode.Type)
                //{

                //  if (!ServiceSearchParameterFactory.GetSearchParameterTargetResourceList(oInboundSearchParameter).Contains(oInboundSearchParameter.TypeModifierResource))
                //  {
                //    DtoUnspportedSearchParameter = InitaliseUnspportedParamerter(oInboundSearchParameter, DtoUnspportedSearchParameter);
                //    DtoUnspportedSearchParameter.ReasonMessage = DtoUnspportedSearchParameter.ReasonMessage + $"The search parameter modifier was expected to be a Fhir resource type that is supported for this search parameter. The Resource given was: {oInboundSearchParameter.TypeModifierResource} which is not supported for the search parameter '{oInboundSearchParameter.Name}.', ";
                //  }
                //}
            }

            if (!oInboundSearchParameter.ValidatePrefixes(oSupported))
            {
                DtoUnspportedSearchParameter = InitaliseUnspportedParamerter(oInboundSearchParameter, DtoUnspportedSearchParameter);
                string PreFixListString = string.Empty;
                Common.Tools.SearchParameterTools.GetPrefixListForSearchType(oSupported.Type).ForEach(x => PreFixListString = PreFixListString + "," + x);
                if (PreFixListString == string.Empty)
                {
                    PreFixListString = "(none)";
                }
                else
                {
                    PreFixListString = $"({PreFixListString})";
                }
                DtoUnspportedSearchParameter.ReasonMessage = DtoUnspportedSearchParameter.ReasonMessage + $"The one or more of the search parameter prefixes are not supported by this server against resource type of :'{oInboundSearchParameter.Resource.ToString()}', the whole parameter given was : '{DtoUnspportedSearchParameter.RawParameter}'. The prefixes that are supported are: {PreFixListString}, ";
            }

            //I feel we already do this when parseing the Referance Paramerter
            //if (oInboundSearchParameter.TypeModifierResource != null)
            //{
            //  if (!ServiceSearchParameterFactory.GetSearchParameterTargetResourceList(oInboundSearchParameter).Contains(oInboundSearchParameter.TypeModifierResource))
            //  {
            //    DtoUnspportedSearchParameter = InitaliseUnspportedParamerter(oInboundSearchParameter, DtoUnspportedSearchParameter);
            //    DtoUnspportedSearchParameter.ReasonMessage = DtoUnspportedSearchParameter.ReasonMessage + String.Format("Unsupported search, the Resource type given as the Modifier is not supported. Resource type: '{0}' in parameter '{1}'., ", oInboundSearchParameter.TypeModifierResource.ToString(), oInboundSearchParameter.RawValue);
            //  }
            //}

            if (DtoUnspportedSearchParameter != null)
            {
                UnspportedSearchParameterList.Add(DtoUnspportedSearchParameter);
                return(false);
            }
            else
            {
                UnspportedSearchParameterList.Clear();
                return(true);
            }
        }
Example #19
0
        public void Test_RecursiveChainSearch()
        {
            //Arrange
            Moq.Mock <ISearchParameterGenericFactory> MokISearchParameterGenericFactory = new Moq.Mock <ISearchParameterGenericFactory>();
            MokISearchParameterGenericFactory.Setup(x => x.CreateDtoSearchParameterGeneric()).Returns(new SearchParameterGeneric());

            Moq.Mock <ISearchParameterReferanceFactory> MokISearchParameterReferanceFactory = new Moq.Mock <ISearchParameterReferanceFactory>();
            MokISearchParameterReferanceFactory.Setup(x => x.CreateDtoSearchParameterReferance()).Returns(GetMokedSearchParameterReferance());


            // SearchParameterServiceFactory Set-up =======================
            // These are the actual supported search parameters that come from the database.
            var MokISearchParametersServiceOutcomeFactory = new Moq.Mock <ISearchParametersServiceOutcomeFactory>();

            MokISearchParametersServiceOutcomeFactory.Setup(x => x.CreateSearchParametersServiceOutcome()).Returns(new SearchParametersServiceOutcome());

            var MokIServiceSearchParameterCache = new Moq.Mock <IServiceSearchParameterCache>();

            //Search Parameters for DiagnosticReport Resource ---------------------------------------
            List <DtoServiceSearchParameterLight> DiagnosticReportServiceSearchParameterLightList = new List <DtoServiceSearchParameterLight>();

            DtoServiceSearchParameterLight ServiceSearchParameterLight_DiagnosticReportSubject = new DtoServiceSearchParameterLight();

            ServiceSearchParameterLight_DiagnosticReportSubject.Expression = "Test_Expression for subject";
            ServiceSearchParameterLight_DiagnosticReportSubject.Id         = 1;
            ServiceSearchParameterLight_DiagnosticReportSubject.Name       = "subject";
            ServiceSearchParameterLight_DiagnosticReportSubject.Resource   = "DiagnosticReport";
            var oTargetResourceTypeListDiagnosticReport = new List <IServiceSearchParameterTargetResource>();

            oTargetResourceTypeListDiagnosticReport.Add(
                new _ServiceSearchParameterTargetResource()
            {
                Id                       = 11,
                ResourceType             = ResourceType.Patient,
                ServiceSearchParameter   = null,
                ServiceSearchParameterId = 111
            });
            oTargetResourceTypeListDiagnosticReport.Add(new _ServiceSearchParameterTargetResource()
            {
                Id                       = 111,
                ResourceType             = ResourceType.Location,
                ServiceSearchParameter   = null,
                ServiceSearchParameterId = 112
            });
            ServiceSearchParameterLight_DiagnosticReportSubject.TargetResourceTypeList = oTargetResourceTypeListDiagnosticReport;
            ServiceSearchParameterLight_DiagnosticReportSubject.Type = SearchParamType.Reference;
            DiagnosticReportServiceSearchParameterLightList.Add(ServiceSearchParameterLight_DiagnosticReportSubject);

            DtoServiceSearchParameterLight ServiceSearchParameterLight_DiagnosticReportIdentifier = new DtoServiceSearchParameterLight();

            ServiceSearchParameterLight_DiagnosticReportIdentifier.Expression = "Test_Expression for identifier";
            ServiceSearchParameterLight_DiagnosticReportIdentifier.Id         = 11;
            ServiceSearchParameterLight_DiagnosticReportIdentifier.Name       = "identifier";
            ServiceSearchParameterLight_DiagnosticReportIdentifier.Resource   = "DiagnosticReport";
            ServiceSearchParameterLight_DiagnosticReportIdentifier.Type       = SearchParamType.Token;
            DiagnosticReportServiceSearchParameterLightList.Add(ServiceSearchParameterLight_DiagnosticReportIdentifier);

            MokIServiceSearchParameterCache.Setup(x => x.GetSearchParameterForResource("DiagnosticReport")).Returns(DiagnosticReportServiceSearchParameterLightList);

            //Search Parameters for Patient Resource ---------------------------------------
            List <DtoServiceSearchParameterLight> PatientServiceSearchParameterLightList = new List <DtoServiceSearchParameterLight>();

            DtoServiceSearchParameterLight ServiceSearchParameterLight_PatientOrganization = new DtoServiceSearchParameterLight();

            ServiceSearchParameterLight_PatientOrganization.Expression = "Test_Expression for organization";
            ServiceSearchParameterLight_PatientOrganization.Id         = 2;
            ServiceSearchParameterLight_PatientOrganization.Name       = "organization";
            ServiceSearchParameterLight_PatientOrganization.Resource   = "Patient";
            var oTargetResourceTypeListOrganization = new List <IServiceSearchParameterTargetResource>();

            oTargetResourceTypeListOrganization.Add(new _ServiceSearchParameterTargetResource()
            {
                Id = 22, ResourceType = ResourceType.Organization, ServiceSearchParameter = null, ServiceSearchParameterId = 222
            });
            ServiceSearchParameterLight_PatientOrganization.TargetResourceTypeList = oTargetResourceTypeListOrganization;
            ServiceSearchParameterLight_PatientOrganization.Type = SearchParamType.Reference;
            PatientServiceSearchParameterLightList.Add(ServiceSearchParameterLight_PatientOrganization);

            DtoServiceSearchParameterLight ServiceSearchParameterLight_PatientFamily = new DtoServiceSearchParameterLight();

            ServiceSearchParameterLight_PatientFamily.Expression = "Test_Expression for family";
            ServiceSearchParameterLight_PatientFamily.Id         = 22;
            ServiceSearchParameterLight_PatientFamily.Name       = "family";
            ServiceSearchParameterLight_PatientFamily.Resource   = "Patient";
            ServiceSearchParameterLight_PatientFamily.Type       = SearchParamType.String;
            PatientServiceSearchParameterLightList.Add(ServiceSearchParameterLight_PatientFamily);

            MokIServiceSearchParameterCache.Setup(x => x.GetSearchParameterForResource("Patient")).Returns(PatientServiceSearchParameterLightList);

            //Search Parameters for Organization Resource ---------------------------------------
            List <DtoServiceSearchParameterLight> OrganizationServiceSearchParameterLightList = new List <DtoServiceSearchParameterLight>();

            DtoServiceSearchParameterLight ServiceSearchParameterLight_OrganizationEndpoint = new DtoServiceSearchParameterLight();

            ServiceSearchParameterLight_OrganizationEndpoint.Expression = "Test_Expression for endpoint";
            ServiceSearchParameterLight_OrganizationEndpoint.Id         = 3;
            ServiceSearchParameterLight_OrganizationEndpoint.Name       = "endpoint";
            ServiceSearchParameterLight_OrganizationEndpoint.Resource   = "Organization";
            var oTargetResourceTypeListEndpoint = new List <IServiceSearchParameterTargetResource>();

            oTargetResourceTypeListEndpoint.Add(new _ServiceSearchParameterTargetResource()
            {
                Id = 33, ResourceType = ResourceType.Endpoint, ServiceSearchParameter = null, ServiceSearchParameterId = 333
            });
            oTargetResourceTypeListEndpoint.Add(new _ServiceSearchParameterTargetResource()
            {
                Id = 32, ResourceType = ResourceType.Location, ServiceSearchParameter = null, ServiceSearchParameterId = 332
            });
            ServiceSearchParameterLight_OrganizationEndpoint.TargetResourceTypeList = oTargetResourceTypeListEndpoint;
            ServiceSearchParameterLight_OrganizationEndpoint.Type = SearchParamType.Reference;
            OrganizationServiceSearchParameterLightList.Add(ServiceSearchParameterLight_OrganizationEndpoint);

            MokIServiceSearchParameterCache.Setup(x => x.GetSearchParameterForResource("Organization")).Returns(OrganizationServiceSearchParameterLightList);

            //Search Parameters for Endpoint Resource ---------------------------------------
            List <DtoServiceSearchParameterLight> EndpointServiceSearchParameterLightList = new List <DtoServiceSearchParameterLight>();

            DtoServiceSearchParameterLight ServiceSearchParameterLight_EndpointName = new DtoServiceSearchParameterLight();

            ServiceSearchParameterLight_EndpointName.Expression             = "Test_Expression for Endpoint";
            ServiceSearchParameterLight_EndpointName.Id                     = 4;
            ServiceSearchParameterLight_EndpointName.Name                   = "name";
            ServiceSearchParameterLight_EndpointName.Resource               = "Endpoint";
            ServiceSearchParameterLight_EndpointName.TargetResourceTypeList = null;
            ServiceSearchParameterLight_EndpointName.Type                   = SearchParamType.String;
            EndpointServiceSearchParameterLightList.Add(ServiceSearchParameterLight_EndpointName);

            MokIServiceSearchParameterCache.Setup(x => x.GetSearchParameterForResource("Endpoint")).Returns(EndpointServiceSearchParameterLightList);

            //--------------------------------------------------------------------------------

            Moq.Mock <ISearchParameterServiceFactory> MokISearchParameterServiceFactory = new Moq.Mock <ISearchParameterServiceFactory>();

            //The SearchParameterFactory returns individual search parameters
            SearchParameterFactory SearchParameterFactory = new SearchParameterFactory(MokISearchParameterServiceFactory.Object, MokISearchParameterGenericFactory.Object, MokISearchParameterReferanceFactory.Object);
            // The SearchParameterService wraps the factory above and processes all search parameters for a single URL
            SearchParameterService SearchParameterService = new SearchParameterService(MokISearchParametersServiceOutcomeFactory.Object, SearchParameterFactory, MokIServiceSearchParameterCache.Object);

            // A factor used by the SearchParameterService when processing chained parameters recursively
            MokISearchParameterServiceFactory.Setup(x => x.CreateSearchParameterService()).Returns(SearchParameterService);
            //====================================================

            string UrlSearchParametersString = "?subject:Patient.organization.endpoint:Endpoint.name=AcmeMail,AcmeMail2&identifier=123";
            var    DtoSearchParameterGeneric = new SearchParameterGeneric();

            DtoSearchParameterGeneric.Parse(UrlSearchParametersString);

            //Act
            ISearchParametersServiceOutcome Result = SearchParameterService.ProcessResourceSearchParameters(DtoSearchParameterGeneric, SearchParameterService.SearchParameterServiceType.Resource, FHIRAllTypes.DiagnosticReport);

            //Assert
            Assert.NotNull(Result, "Test returned null");
            Assert.NotNull(Result.SearchParameters, "SearchParameters returned null");
            Assert.AreEqual(Result.SearchParameters.SearchParametersList.Count, 2, "SearchParametersList must have 3 items");

            Assert.AreEqual(Result.SearchParameters.SearchParametersList[0].Type, SearchParamType.Reference);
            Assert.AreEqual(Result.SearchParameters.SearchParametersList[0].Name, "subject");
            Assert.AreEqual(Result.SearchParameters.SearchParametersList[0].Resource, FHIRAllTypes.DiagnosticReport.GetLiteral());
            Assert.AreEqual(Result.SearchParameters.SearchParametersList[0].TypeModifierResource, FHIRAllTypes.Patient.GetLiteral());
            Assert.AreEqual(Result.SearchParameters.SearchParametersList[0].ChainedSearchParameterList.Count, 3, "Should have 3 chained search parameters");
            Assert.AreEqual((Result.SearchParameters.SearchParametersList[0] is SearchParameterReferance), true, "Expected SearchParameterReferance type cast");
            Assert.AreEqual((Result.SearchParameters.SearchParametersList[0] as SearchParameterReferance).IsChained, true, "Expected IsChained = true");

            //Patient.organization
            Assert.AreEqual(Result.SearchParameters.SearchParametersList[0].ChainedSearchParameterList[0].Type, SearchParamType.Reference, "First chain should be type Referance");
            Assert.AreEqual(Result.SearchParameters.SearchParametersList[0].ChainedSearchParameterList[0].Name, "organization", "First chain must have name of organization");
            Assert.AreEqual(Result.SearchParameters.SearchParametersList[0].ChainedSearchParameterList[0].Resource, FHIRAllTypes.Patient.GetLiteral(), $"First chain should be Resource of {FHIRAllTypes.Patient.GetLiteral()}");

            //Organization.endpoint
            Assert.AreEqual(Result.SearchParameters.SearchParametersList[0].ChainedSearchParameterList[1].Type, SearchParamType.Reference, "First chain should be type Reference");
            Assert.AreEqual(Result.SearchParameters.SearchParametersList[0].ChainedSearchParameterList[1].Name, "endpoint", "First chain must have name of endpoint");
            Assert.AreEqual(Result.SearchParameters.SearchParametersList[0].ChainedSearchParameterList[1].Resource, FHIRAllTypes.Organization.GetLiteral(), $"First chain should be Resource of {FHIRAllTypes.Organization.GetLiteral()}");

            //Endpoint.name=AcmeMail
            Assert.AreEqual(Result.SearchParameters.SearchParametersList[0].ChainedSearchParameterList[2].Type, SearchParamType.String, "First chain should be type String");
            Assert.AreEqual(Result.SearchParameters.SearchParametersList[0].ChainedSearchParameterList[2].Name, "name", "First chain must have name of name");
            Assert.AreEqual(Result.SearchParameters.SearchParametersList[0].ChainedSearchParameterList[2].Resource, FHIRAllTypes.Endpoint.GetLiteral(), $"First chain should be Resource of {FHIRAllTypes.Endpoint.GetLiteral()}");
            Assert.AreEqual((Result.SearchParameters.SearchParametersList[0].ChainedSearchParameterList[2] as SearchParameterString).ValueList.Count, 2, $"Must 1 and only one value");
            Assert.AreEqual((Result.SearchParameters.SearchParametersList[0].ChainedSearchParameterList[2] as SearchParameterString).ValueList[0].Value, "AcmeMail", $"Value should be a string of 'AcmeMail'");
            Assert.AreEqual((Result.SearchParameters.SearchParametersList[0].ChainedSearchParameterList[2] as SearchParameterString).ValueList[1].Value, "AcmeMail2", $"Value should be a string of 'AcmeMail2'");

            //DiagnosticReport.identifier
            Assert.AreEqual(Result.SearchParameters.SearchParametersList[1].Type, SearchParamType.Token, "First chain should be type Token");
            Assert.AreEqual(Result.SearchParameters.SearchParametersList[1].Name, "identifier", "First chain must have name of identifier");
            Assert.AreEqual(Result.SearchParameters.SearchParametersList[1].Resource, FHIRAllTypes.DiagnosticReport.GetLiteral(), $"First chain should be Resource of {FHIRAllTypes.Organization.GetLiteral()}");
            Assert.AreEqual((Result.SearchParameters.SearchParametersList[1] is SearchParameterToken), true, "Expected SearchParameterToken type cast");
            Assert.AreEqual((Result.SearchParameters.SearchParametersList[1] as SearchParameterToken).ValueList.Count, 1, "Expected ValueList count = 1");
            Assert.AreEqual((Result.SearchParameters.SearchParametersList[1] as SearchParameterToken).ValueList[0].Code, "123", "Expected ValueList[0] to be '123'");
        }
Example #20
0
        private void ChainSearchProcessing(Tuple <string, string> Parameter)
        {
            _DtoSupportedSearchParametersList = GetSupportedSearchParameters(_SearchParameterServiceType, _OperationClass, _ResourceType);

            ISearchParameterBase ParentChainSearchParameter   = null;
            ISearchParameterBase PreviousChainSearchParameter = null;

            string[] ChaimedParameterSplit            = Parameter.Item1.Split(SearchParams.SEARCH_CHAINSEPARATOR);
            bool     ErrorInSearchParameterProcessing = false;

            for (int i = 0; i < ChaimedParameterSplit.Length; i++)
            {
                string ParameterName  = Parameter.Item1.Split(SearchParams.SEARCH_CHAINSEPARATOR)[i];
                string ParameterValue = string.Empty;
                //There is no valid Value for a chained reference parameter unless it is the last in a series of chains, so don't set it.
                //Only set the last parameter
                if (i == ChaimedParameterSplit.Count() - 1)
                {
                    ParameterValue = Parameter.Item2;
                }

                var SingleChainedParameter = new Tuple <string, string>(ParameterName, ParameterValue);

                string ParameterNameNoModifier        = ParameterName;
                string ParameterModifierTypedResource = string.Empty;

                //Check for a deal with modifiers e.g subject:Patient.family=millar
                if (ParameterName.Contains(SearchParams.SEARCH_MODIFIERSEPARATOR))
                {
                    string[] ParameterModifierSplit = ParameterName.Split(SearchParams.SEARCH_MODIFIERSEPARATOR);
                    ParameterNameNoModifier = ParameterModifierSplit[0].Trim();

                    if (ParameterModifierSplit.Length > 1)
                    {
                        Type ModifierResourceType = ModelInfo.GetTypeForFhirType(ParameterModifierSplit[1].Trim());
                        if (ModifierResourceType != null && ModelInfo.IsKnownResource(ModifierResourceType))
                        {
                            ParameterModifierTypedResource = ParameterModifierSplit[1].Trim();
                        }
                    }
                }

                if (PreviousChainSearchParameter != null)
                {
                    if (string.IsNullOrWhiteSpace(PreviousChainSearchParameter.TypeModifierResource))
                    {
                        if (PreviousChainSearchParameter.TargetResourceTypeList != null)
                        {
                            if (PreviousChainSearchParameter.TargetResourceTypeList.Count == 1)
                            {
                                _DtoSupportedSearchParametersList = GetSupportedSearchParameters(_SearchParameterServiceType, _OperationClass, PreviousChainSearchParameter.TargetResourceTypeList[0].ResourceType.GetLiteral());
                            }
                            else
                            {
                                //There is more than on target on the previous and yet the user has not given a modifier type to select one of them.
                                var DtoUnspportedSearchParameter = new UnspportedSearchParameter();
                                DtoUnspportedSearchParameter.RawParameter = $"{Parameter.Item1}={Parameter.Item2}";
                                string ResourceName = string.Empty;
                                if (_ResourceType.HasValue)
                                {
                                    ResourceName = _ResourceType.Value.ToString();
                                }
                                DtoUnspportedSearchParameter.ReasonMessage  = $"The search parameter '{Parameter.Item1}' is not supported by this server for the resource type '{ResourceName}'. ";
                                DtoUnspportedSearchParameter.ReasonMessage += $"Additional information: ";
                                DtoUnspportedSearchParameter.ReasonMessage += $"This search parameter was a chained search parameter. The part that was not recognised was '{PreviousChainSearchParameter.Name}.{ParameterName}' because the reference search parameter '{PreviousChainSearchParameter.Name}' can resolve to more than one target resource type. In this case you must specify the Resource type required using a search parameter Modifier. For example '{PreviousChainSearchParameter.Name}:{PreviousChainSearchParameter.TargetResourceTypeList[0].ResourceType.GetLiteral()}.{ParameterName}'.";
                                _SearchParametersServiceOutcome.SearchParameters.UnspportedSearchParameterList.Add(DtoUnspportedSearchParameter);
                                ErrorInSearchParameterProcessing = true;
                                break;
                            }
                        }
                        else
                        {
                            //Error that we have no target resource list on the previous parameter, must have not been a references type?
                            var DtoUnspportedSearchParameter = new UnspportedSearchParameter();
                            DtoUnspportedSearchParameter.RawParameter = $"{Parameter.Item1}={Parameter.Item2}";
                            string ResourceName = string.Empty;
                            if (_ResourceType.HasValue)
                            {
                                ResourceName = _ResourceType.Value.ToString();
                            }
                            DtoUnspportedSearchParameter.ReasonMessage  = $"The search parameter '{Parameter.Item1}' is not supported by this server for the resource type '{ResourceName}'. ";
                            DtoUnspportedSearchParameter.ReasonMessage += $"Additional information: ";
                            DtoUnspportedSearchParameter.ReasonMessage += $"This search parameter was a chained search parameter. The part that was not recognised was '{PreviousChainSearchParameter.Name}.{ParameterName}'";
                            _SearchParametersServiceOutcome.SearchParameters.UnspportedSearchParameterList.Add(DtoUnspportedSearchParameter);
                            ErrorInSearchParameterProcessing = true;
                            break;
                        }
                    }
                    else if (CheckModifierTypeResourceValidForSearchParameter(PreviousChainSearchParameter.TypeModifierResource, PreviousChainSearchParameter.TargetResourceTypeList))
                    {
                        _DtoSupportedSearchParametersList = GetSupportedSearchParameters(_SearchParameterServiceType, _OperationClass, PreviousChainSearchParameter.TypeModifierResource);
                    }
                    else
                    {
                        //The modifier target resource provided is not valid for the previous reference, e.g subject:DiagnosticReport.family=millar
                        var DtoUnspportedSearchParameter = new UnspportedSearchParameter();
                        DtoUnspportedSearchParameter.RawParameter = $"{Parameter.Item1}={Parameter.Item2}";
                        string ResourceName = string.Empty;
                        if (_ResourceType.HasValue)
                        {
                            ResourceName = _ResourceType.Value.ToString();
                        }
                        DtoUnspportedSearchParameter.ReasonMessage  = $"The search parameter '{Parameter.Item1}' is not supported by this server for the resource type '{ResourceName}'. ";
                        DtoUnspportedSearchParameter.ReasonMessage += $"Additional information: ";
                        DtoUnspportedSearchParameter.ReasonMessage += $"This search parameter was a chained search parameter. The part that was not recognised was '{PreviousChainSearchParameter.Name}.{ParameterName}', The search parameter modifier given '{PreviousChainSearchParameter.TypeModifierResource}' is not valid for the search parameter {PreviousChainSearchParameter.Name}. ";
                        _SearchParametersServiceOutcome.SearchParameters.UnspportedSearchParameterList.Add(DtoUnspportedSearchParameter);
                        ErrorInSearchParameterProcessing = true;
                        break;
                    }
                }

                DtoServiceSearchParameterLight oSupportedSearchParameter = _DtoSupportedSearchParametersList.SingleOrDefault(x => x.Name == ParameterNameNoModifier);

                if (oSupportedSearchParameter != null)
                {
                    ISearchParameterBase oSearchParameter = null;
                    if (i >= ChaimedParameterSplit.Length - 1)
                    {
                        oSearchParameter = ISearchParameterFactory.CreateSearchParameter(oSupportedSearchParameter, SingleChainedParameter, false);
                    }
                    else
                    {
                        oSearchParameter = ISearchParameterFactory.CreateSearchParameter(oSupportedSearchParameter, SingleChainedParameter, true);
                    }
                    var UnspportedSearchParameterList = new List <UnspportedSearchParameter>();
                    if (ValidateSearchParameterSupported(oSupportedSearchParameter, oSearchParameter, UnspportedSearchParameterList))
                    {
                        if (!IsSingularSearchParameter(oSearchParameter, _SearchParametersServiceOutcome))
                        {
                            if (ParentChainSearchParameter == null)
                            {
                                ParentChainSearchParameter = oSearchParameter.CloneDeep() as ISearchParameterBase;
                            }
                            else
                            {
                                ParentChainSearchParameter.ChainedSearchParameterList.Add(oSearchParameter.CloneDeep() as ISearchParameterBase);
                            }

                            PreviousChainSearchParameter = oSearchParameter.CloneDeep() as ISearchParameterBase;
                        }
                    }
                    else
                    {
                        var DtoUnspportedSearchParameter = new UnspportedSearchParameter();
                        DtoUnspportedSearchParameter.RawParameter = $"{Parameter.Item1}={Parameter.Item2}";
                        string ResourceName = string.Empty;
                        if (_ResourceType.HasValue)
                        {
                            ResourceName = _ResourceType.Value.ToString();
                        }
                        DtoUnspportedSearchParameter.ReasonMessage  = $"The parameter '{Parameter.Item1}' is not supported by this server for the resource type '{ResourceName}', the whole parameter was : '{DtoUnspportedSearchParameter.RawParameter}'. ";
                        DtoUnspportedSearchParameter.ReasonMessage += $"Additional information: ";
                        foreach (var UnspportedSearchParameter in UnspportedSearchParameterList)
                        {
                            DtoUnspportedSearchParameter.ReasonMessage += UnspportedSearchParameter.ReasonMessage;
                        }
                        _SearchParametersServiceOutcome.SearchParameters.UnspportedSearchParameterList.Add(DtoUnspportedSearchParameter);
                        ErrorInSearchParameterProcessing = true;
                        break;
                    }
                }
                else
                {
                    var DtoUnspportedSearchParameter = new UnspportedSearchParameter();
                    DtoUnspportedSearchParameter.RawParameter = $"{Parameter.Item1}={Parameter.Item2}";
                    string ResourceName = string.Empty;
                    if (_ResourceType.HasValue)
                    {
                        ResourceName = _ResourceType.Value.ToString();
                    }
                    DtoUnspportedSearchParameter.ReasonMessage  = $"The search parameter '{Parameter.Item1}' is not supported by this server for the resource type '{ResourceName}', the whole parameter was : '{DtoUnspportedSearchParameter.RawParameter}'. ";
                    DtoUnspportedSearchParameter.ReasonMessage += $"Additional information: ";
                    DtoUnspportedSearchParameter.ReasonMessage += $"This search parameter was a chained search parameter. The part that was not recognised was '{ParameterNameNoModifier}'";
                    _SearchParametersServiceOutcome.SearchParameters.UnspportedSearchParameterList.Add(DtoUnspportedSearchParameter);
                    ErrorInSearchParameterProcessing = true;
                    break;
                }
            }
            if (!ErrorInSearchParameterProcessing)
            {
                _SearchParametersServiceOutcome.SearchParameters.SearchParametersList.Add(ParentChainSearchParameter);
            }
        }
Example #21
0
        private SearchParameterService SetupMockedSearchParameterService()
        {
            //Arrange
            Moq.Mock <ISearchParameterGenericFactory> MokISearchParameterGenericFactory = new Moq.Mock <ISearchParameterGenericFactory>();
            MokISearchParameterGenericFactory.Setup(x => x.CreateDtoSearchParameterGeneric()).Returns(new SearchParameterGeneric());

            Moq.Mock <ISearchParameterReferanceFactory> MokISearchParameterReferanceFactory = new Moq.Mock <ISearchParameterReferanceFactory>();
            MokISearchParameterReferanceFactory.Setup(x => x.CreateDtoSearchParameterReferance()).Returns(GetMokedSearchParameterReferance());


            // SearchParameterServiceFactory Set-up =======================
            // These are the actual supported search parameters that come from the database.
            var MokISearchParametersServiceOutcomeFactory = new Moq.Mock <ISearchParametersServiceOutcomeFactory>();

            MokISearchParametersServiceOutcomeFactory.Setup(x => x.CreateSearchParametersServiceOutcome()).Returns(new SearchParametersServiceOutcome());

            var MokIServiceSearchParameterCache = new Moq.Mock <IServiceSearchParameterCache>();

            //Search Parameters for DiagnosticReport Resource ---------------------------------------
            List <DtoServiceSearchParameterLight> DiagnosticReportServiceSearchParameterLightList = new List <DtoServiceSearchParameterLight>();

            DtoServiceSearchParameterLight ServiceSearchParameterLight_DiagnosticReportSubject = new DtoServiceSearchParameterLight();

            ServiceSearchParameterLight_DiagnosticReportSubject.Expression = "Test_Expression for subject";
            ServiceSearchParameterLight_DiagnosticReportSubject.Id         = 1;
            ServiceSearchParameterLight_DiagnosticReportSubject.Name       = "subject";
            ServiceSearchParameterLight_DiagnosticReportSubject.Resource   = "DiagnosticReport";
            var oTargetResourceTypeListDiagnosticReport = new List <IServiceSearchParameterTargetResource>();

            oTargetResourceTypeListDiagnosticReport.Add(
                new _ServiceSearchParameterTargetResource()
            {
                Id                       = 11,
                ResourceType             = ResourceType.Patient,
                ServiceSearchParameter   = null,
                ServiceSearchParameterId = 111
            });
            oTargetResourceTypeListDiagnosticReport.Add(new _ServiceSearchParameterTargetResource()
            {
                Id                       = 111,
                ResourceType             = ResourceType.Location,
                ServiceSearchParameter   = null,
                ServiceSearchParameterId = 112
            });
            ServiceSearchParameterLight_DiagnosticReportSubject.TargetResourceTypeList = oTargetResourceTypeListDiagnosticReport;
            ServiceSearchParameterLight_DiagnosticReportSubject.Type = SearchParamType.Reference;
            DiagnosticReportServiceSearchParameterLightList.Add(ServiceSearchParameterLight_DiagnosticReportSubject);

            DtoServiceSearchParameterLight ServiceSearchParameterLight_DiagnosticReportIdentifier = new DtoServiceSearchParameterLight();

            ServiceSearchParameterLight_DiagnosticReportIdentifier.Expression = "Test_Expression for identifier";
            ServiceSearchParameterLight_DiagnosticReportIdentifier.Id         = 11;
            ServiceSearchParameterLight_DiagnosticReportIdentifier.Name       = "identifier";
            ServiceSearchParameterLight_DiagnosticReportIdentifier.Resource   = "DiagnosticReport";
            ServiceSearchParameterLight_DiagnosticReportIdentifier.Type       = SearchParamType.Token;
            DiagnosticReportServiceSearchParameterLightList.Add(ServiceSearchParameterLight_DiagnosticReportIdentifier);

            MokIServiceSearchParameterCache.Setup(x => x.GetSearchParameterForResource("DiagnosticReport")).Returns(DiagnosticReportServiceSearchParameterLightList);

            //Search Parameters for Patient Resource ---------------------------------------
            List <DtoServiceSearchParameterLight> PatientServiceSearchParameterLightList = new List <DtoServiceSearchParameterLight>();

            DtoServiceSearchParameterLight ServiceSearchParameterLight_PatientOrganization = new DtoServiceSearchParameterLight();

            ServiceSearchParameterLight_PatientOrganization.Expression = "Test_Expression for organization";
            ServiceSearchParameterLight_PatientOrganization.Id         = 2;
            ServiceSearchParameterLight_PatientOrganization.Name       = "organization";
            ServiceSearchParameterLight_PatientOrganization.Resource   = "Patient";
            var oTargetResourceTypeListOrganization = new List <IServiceSearchParameterTargetResource>();

            oTargetResourceTypeListOrganization.Add(new _ServiceSearchParameterTargetResource()
            {
                Id = 22, ResourceType = ResourceType.Organization, ServiceSearchParameter = null, ServiceSearchParameterId = 222
            });
            ServiceSearchParameterLight_PatientOrganization.TargetResourceTypeList = oTargetResourceTypeListOrganization;
            ServiceSearchParameterLight_PatientOrganization.Type = SearchParamType.Reference;
            PatientServiceSearchParameterLightList.Add(ServiceSearchParameterLight_PatientOrganization);

            DtoServiceSearchParameterLight ServiceSearchParameterLight_PatientFamily = new DtoServiceSearchParameterLight();

            ServiceSearchParameterLight_PatientFamily.Expression = "Test_Expression for family";
            ServiceSearchParameterLight_PatientFamily.Id         = 22;
            ServiceSearchParameterLight_PatientFamily.Name       = "family";
            ServiceSearchParameterLight_PatientFamily.Resource   = "Patient";
            ServiceSearchParameterLight_PatientFamily.Type       = SearchParamType.String;
            PatientServiceSearchParameterLightList.Add(ServiceSearchParameterLight_PatientFamily);

            MokIServiceSearchParameterCache.Setup(x => x.GetSearchParameterForResource("Patient")).Returns(PatientServiceSearchParameterLightList);


            //Search Parameters for Location Resource ---------------------------------------
            List <DtoServiceSearchParameterLight> LocationServiceSearchParameterLightList = new List <DtoServiceSearchParameterLight>();

            DtoServiceSearchParameterLight ServiceSearchParameterLight_LocationName = new DtoServiceSearchParameterLight();

            ServiceSearchParameterLight_LocationName.Expression = "Test_Expression for Location name";
            ServiceSearchParameterLight_LocationName.Id         = 2;
            ServiceSearchParameterLight_LocationName.Name       = "name";
            ServiceSearchParameterLight_LocationName.Resource   = "Location";
            //var oTargetResourceTypeListOrganization = new List<IServiceSearchParameterTargetResource>();
            //oTargetResourceTypeListOrganization.Add(new _ServiceSearchParameterTargetResource() { Id = 22, ResourceType = ResourceType.Organization, ServiceSearchParameter = null, ServiceSearchParameterId = 222 });
            ServiceSearchParameterLight_LocationName.TargetResourceTypeList = oTargetResourceTypeListOrganization;
            ServiceSearchParameterLight_LocationName.Type = SearchParamType.String;
            LocationServiceSearchParameterLightList.Add(ServiceSearchParameterLight_LocationName);

            MokIServiceSearchParameterCache.Setup(x => x.GetSearchParameterForResource("Location")).Returns(LocationServiceSearchParameterLightList);



            //Search Parameters for Organization Resource ---------------------------------------
            List <DtoServiceSearchParameterLight> OrganizationServiceSearchParameterLightList = new List <DtoServiceSearchParameterLight>();

            DtoServiceSearchParameterLight ServiceSearchParameterLight_OrganizationEndpoint = new DtoServiceSearchParameterLight();

            ServiceSearchParameterLight_OrganizationEndpoint.Expression = "Test_Expression for endpoint";
            ServiceSearchParameterLight_OrganizationEndpoint.Id         = 3;
            ServiceSearchParameterLight_OrganizationEndpoint.Name       = "endpoint";
            ServiceSearchParameterLight_OrganizationEndpoint.Resource   = "Organization";
            var oTargetResourceTypeListEndpoint = new List <IServiceSearchParameterTargetResource>();

            oTargetResourceTypeListEndpoint.Add(new _ServiceSearchParameterTargetResource()
            {
                Id = 33, ResourceType = ResourceType.Endpoint, ServiceSearchParameter = null, ServiceSearchParameterId = 333
            });
            oTargetResourceTypeListEndpoint.Add(new _ServiceSearchParameterTargetResource()
            {
                Id = 32, ResourceType = ResourceType.Location, ServiceSearchParameter = null, ServiceSearchParameterId = 332
            });
            ServiceSearchParameterLight_OrganizationEndpoint.TargetResourceTypeList = oTargetResourceTypeListEndpoint;
            ServiceSearchParameterLight_OrganizationEndpoint.Type = SearchParamType.Reference;
            OrganizationServiceSearchParameterLightList.Add(ServiceSearchParameterLight_OrganizationEndpoint);

            MokIServiceSearchParameterCache.Setup(x => x.GetSearchParameterForResource("Organization")).Returns(OrganizationServiceSearchParameterLightList);

            //Search Parameters for Endpoint Resource ---------------------------------------
            List <DtoServiceSearchParameterLight> EndpointServiceSearchParameterLightList = new List <DtoServiceSearchParameterLight>();

            DtoServiceSearchParameterLight ServiceSearchParameterLight_EndpointName = new DtoServiceSearchParameterLight();

            ServiceSearchParameterLight_EndpointName.Expression             = "Test_Expression for Endpoint";
            ServiceSearchParameterLight_EndpointName.Id                     = 4;
            ServiceSearchParameterLight_EndpointName.Name                   = "name";
            ServiceSearchParameterLight_EndpointName.Resource               = "Endpoint";
            ServiceSearchParameterLight_EndpointName.TargetResourceTypeList = null;
            ServiceSearchParameterLight_EndpointName.Type                   = SearchParamType.String;
            EndpointServiceSearchParameterLightList.Add(ServiceSearchParameterLight_EndpointName);

            MokIServiceSearchParameterCache.Setup(x => x.GetSearchParameterForResource("Endpoint")).Returns(EndpointServiceSearchParameterLightList);

            //--------------------------------------------------------------------------------

            Moq.Mock <ISearchParameterServiceFactory> MokISearchParameterServiceFactory = new Moq.Mock <ISearchParameterServiceFactory>();

            //The SearchParameterFactory returns individual search parameters
            SearchParameterFactory SearchParameterFactory = new SearchParameterFactory(MokISearchParameterServiceFactory.Object, MokISearchParameterGenericFactory.Object, MokISearchParameterReferanceFactory.Object, MokIServiceSearchParameterCache.Object);
            // The SearchParameterService wraps the factory above and processes all search parameters for a single URL
            SearchParameterService SearchParameterService = new SearchParameterService(MokISearchParametersServiceOutcomeFactory.Object, SearchParameterFactory, MokIServiceSearchParameterCache.Object);

            // A factor used by the SearchParameterService when processing chained parameters recursively
            MokISearchParameterServiceFactory.Setup(x => x.CreateSearchParameterService()).Returns(SearchParameterService);
            //====================================================
            return(SearchParameterService);
        }
Example #22
0
 public override bool ValidatePrefixes(DtoServiceSearchParameterLight DtoSupportedSearchParameters)
 {
     //Token search parameters do not contain prefixes, so return true
     return(true);
 }
Example #23
0
        public IList <ITokenIndex> Set(IElementNavigator oElement, DtoServiceSearchParameterLight SearchParameter)
        {
            _SearchParameter = SearchParameter;

            var ResourceIndexList        = new List <ITokenIndex>();
            var ServiceSearchParameterId = SearchParameter.Id;

            if (oElement is Hl7.Fhir.ElementModel.PocoNavigator Poco && Poco.FhirValue != null)
            {
                if (Poco.FhirValue is Code Code)
                {
                    SetCode(Code, ResourceIndexList);
                }
                else if (Poco.FhirValue is CodeableConcept CodeableConcept)
                {
                    SetCodeableConcept(CodeableConcept, ResourceIndexList);
                }
                else if (Poco.FhirValue is Coding Coding)
                {
                    SetCoding(Coding, ResourceIndexList);
                }
                else if (Poco.FhirValue.TypeName == "code")
                {
                    if (Poco.Value is string CodeValue)
                    {
                        SetCodeTypeT(CodeValue, ResourceIndexList);
                    }
                }
                else if (Poco.FhirValue is ContactPoint ContactPoint)
                {
                    SetContactPoint(ContactPoint, ResourceIndexList);
                }
                else if (Poco.FhirValue is FhirBoolean FhirBoolean)
                {
                    SetFhirBoolean(FhirBoolean, ResourceIndexList);
                }
                else if (Poco.FhirValue is FhirDateTime FhirDateTime)
                {
                    SetFhirDateTime(FhirDateTime, ResourceIndexList);
                }
                else if (Poco.FhirValue is FhirString FhirString)
                {
                    SetFhirString(FhirString, ResourceIndexList);
                }
                else if (Poco.FhirValue is Id Id)
                {
                    SetId(Id, ResourceIndexList);
                }
                else if (Poco.FhirValue is Identifier Identifier)
                {
                    SetIdentifier(Identifier, ResourceIndexList);
                }
                else if (Poco.FhirValue is PositiveInt PositiveInt)
                {
                    SetPositiveInt(PositiveInt, ResourceIndexList);
                }
                else if (Poco.FhirValue is Quantity Quantity)
                {
                    SetQuantity(Quantity, ResourceIndexList);
                }
                else if (Poco.FhirValue is Range Range)
                {
                    SetRange(Range, ResourceIndexList);
                }
                else if (Poco.FhirValue is Location.PositionComponent PositionComponent)
                {
                    SePositionComponent(PositionComponent, ResourceIndexList);
                }
                else
                {
                    throw new FormatException($"Unknown FhirType: '{oElement.Type}' for SearchParameterType: '{SearchParameter.Type}'");
                }
                return(ResourceIndexList);
            }
        private void ChainSearchProcessing(Tuple <string, string> Parameter)
        {
            _DtoSupportedSearchParametersList = GetSupportedSearchParameters(_SearchParameterServiceType, _OperationClass, _ResourceType);

            ISearchParameterBase ParentChainSearchParameter   = null;
            ISearchParameterBase PreviousChainSearchParameter = null;

            string[] ChaimedParameterSplit            = Parameter.Item1.Split(SearchParams.SEARCH_CHAINSEPARATOR);
            bool     ErrorInSearchParameterProcessing = false;

            for (int i = 0; i < ChaimedParameterSplit.Length; i++)
            {
                DtoServiceSearchParameterLight oSupportedSearchParameter = null;
                string ParameterName  = Parameter.Item1.Split(SearchParams.SEARCH_CHAINSEPARATOR)[i];
                string ParameterValue = string.Empty;
                //There is no valid Value for a chained reference parameter unless it is the last in a series
                //of chains, so don't set it.
                //Only set the last parameter
                if (i == ChaimedParameterSplit.Count() - 1)
                {
                    ParameterValue = Parameter.Item2;
                }

                var SingleChainedParameter = new Tuple <string, string>(ParameterName, ParameterValue);

                string ParameterNameNoModifier        = ParameterName;
                string ParameterModifierTypedResource = string.Empty;

                //Check for and deal with modifiers e.g 'Patient' in th example: subject:Patient.family=millar
                if (ParameterName.Contains(SearchParams.SEARCH_MODIFIERSEPARATOR))
                {
                    string[] ParameterModifierSplit = ParameterName.Split(SearchParams.SEARCH_MODIFIERSEPARATOR);
                    ParameterNameNoModifier = ParameterModifierSplit[0].Trim();

                    if (ParameterModifierSplit.Length > 1)
                    {
                        Type ModifierResourceType = ModelInfo.GetTypeForFhirType(ParameterModifierSplit[1].Trim());
                        if (ModifierResourceType != null && ModelInfo.IsKnownResource(ModifierResourceType))
                        {
                            ParameterModifierTypedResource = ParameterModifierSplit[1].Trim();
                        }
                    }
                }

                if (PreviousChainSearchParameter == null)
                {
                    oSupportedSearchParameter = _DtoSupportedSearchParametersList.SingleOrDefault(x => x.Name == ParameterNameNoModifier);
                }
                else
                {
                    if (string.IsNullOrWhiteSpace(PreviousChainSearchParameter.TypeModifierResource))
                    {
                        if (PreviousChainSearchParameter.TargetResourceTypeList != null)
                        {
                            if (PreviousChainSearchParameter.TargetResourceTypeList.Count == 1)
                            {
                                List <DtoServiceSearchParameterLight> _DtoSupportedSearchParametersListForTarget = GetSupportedSearchParameters(_SearchParameterServiceType, _OperationClass, PreviousChainSearchParameter.TargetResourceTypeList[0].ResourceType.GetLiteral());
                                DtoServiceSearchParameterLight        oSupportedSearchParameterForTarget         = _DtoSupportedSearchParametersListForTarget.SingleOrDefault(x => x.Name == ParameterNameNoModifier);
                                PreviousChainSearchParameter.TypeModifierResource = oSupportedSearchParameterForTarget.Resource;
                                oSupportedSearchParameter = oSupportedSearchParameterForTarget;
                            }
                            else
                            {
                                List <DtoServiceSearchParameterLight> oMultiChainedSupportedSearchParameter = new List <DtoServiceSearchParameterLight>();
                                foreach (var TargetResourceType in PreviousChainSearchParameter.TargetResourceTypeList)
                                {
                                    FHIRAllTypes TargetResource = Tools.ResourceNameResolutionSupport.GetResourceFhirAllType(TargetResourceType.ResourceType);
                                    List <DtoServiceSearchParameterLight> _DtoSupportedSearchParametersListForTarget = GetSupportedSearchParameters(SearchParameterServiceType.Resource, null, TargetResource);
                                    DtoServiceSearchParameterLight        oSupportedSearchParameterForTarget         = _DtoSupportedSearchParametersListForTarget.SingleOrDefault(x => x.Name == ParameterNameNoModifier);
                                    if (oSupportedSearchParameterForTarget != null)
                                    {
                                        oMultiChainedSupportedSearchParameter.Add(oSupportedSearchParameterForTarget);
                                    }
                                }
                                if (oMultiChainedSupportedSearchParameter.Count() == 1)
                                {
                                    PreviousChainSearchParameter.TypeModifierResource = oMultiChainedSupportedSearchParameter[0].Resource;
                                    oSupportedSearchParameter = oMultiChainedSupportedSearchParameter[0];
                                }
                                else
                                {
                                    //Need to do work here!!
                                    //oSupportedSearchParameter this needs to be set but we now have many!
                                    //the many is the list in oMultiChainedSupportedSearchParameter
                                    //PreviousChainSearchParameter.Modifier = SearchParameter.SearchModifierCode.Type;
                                    //PreviousChainSearchParameter.TypeModifierResource = oMultiChainedSupportedSearchParameter[0].Resource;
                                    string RefResources = string.Empty;
                                    oMultiChainedSupportedSearchParameter.ForEach(x => RefResources += ", " + x.Resource);
                                    //var DtoUnspportedSearchParameter = new UnspportedSearchParameter();
                                    //DtoUnspportedSearchParameter.RawParameter = $"{Parameter.Item1}={Parameter.Item2}";
                                    string ResourceName = string.Empty;
                                    if (_ResourceType.HasValue)
                                    {
                                        ResourceName = _ResourceType.Value.ToString();
                                    }
                                    string Message = string.Empty;
                                    Message  = $"The chained search parameter '{Parameter.Item1}' is ambiguous. ";
                                    Message += $"Additional information: ";
                                    Message += $"The search parameter '{oMultiChainedSupportedSearchParameter[0].Name}' can referance the following resource types ({RefResources.TrimStart(',').Trim()}). ";
                                    Message += $"To correct this you must prefix the search parameter with a Type modifier, for example: '{PreviousChainSearchParameter.Name}:{oMultiChainedSupportedSearchParameter[0].Resource}.{oMultiChainedSupportedSearchParameter[0].Name}' ";
                                    Message += $"If the '{oMultiChainedSupportedSearchParameter[0].Resource}' resource was the intended referance for the search parameter '{oMultiChainedSupportedSearchParameter[0].Name}'.";
                                    if (_SearchParametersServiceOutcome.FhirOperationOutcome == null)
                                    {
                                        _SearchParametersServiceOutcome.FhirOperationOutcome = Common.Tools.FhirOperationOutcomeSupport.Create(OperationOutcome.IssueSeverity.Error, OperationOutcome.IssueType.Processing, Message);
                                    }
                                    else
                                    {
                                        Common.Tools.FhirOperationOutcomeSupport.Append(OperationOutcome.IssueSeverity.Error, OperationOutcome.IssueType.Processing, Message, _SearchParametersServiceOutcome.FhirOperationOutcome);
                                    }
                                    _SearchParametersServiceOutcome.HttpStatusCode = System.Net.HttpStatusCode.BadRequest;
                                    ErrorInSearchParameterProcessing = true;
                                }
                            }
                        }
                        else
                        {
                            //Error that we have no target resource list on the previous parameter, must have not been a references type?
                            var DtoUnspportedSearchParameter = new UnspportedSearchParameter();
                            DtoUnspportedSearchParameter.RawParameter = $"{Parameter.Item1}={Parameter.Item2}";
                            string ResourceName = string.Empty;
                            if (_ResourceType.HasValue)
                            {
                                ResourceName = _ResourceType.Value.ToString();
                            }
                            DtoUnspportedSearchParameter.ReasonMessage  = $"The search parameter '{Parameter.Item1}' is not supported by this server for the resource type '{ResourceName}'. ";
                            DtoUnspportedSearchParameter.ReasonMessage += $"Additional information: ";
                            DtoUnspportedSearchParameter.ReasonMessage += $"This search parameter was a chained search parameter. The part that was not recognised was '{PreviousChainSearchParameter.Name}.{ParameterName}'";
                            _SearchParametersServiceOutcome.SearchParameters.UnspportedSearchParameterList.Add(DtoUnspportedSearchParameter);
                            ErrorInSearchParameterProcessing = true;
                            break;
                        }
                    }
                    else if (CheckModifierTypeResourceValidForSearchParameter(PreviousChainSearchParameter.TypeModifierResource, PreviousChainSearchParameter.TargetResourceTypeList))
                    {
                        _DtoSupportedSearchParametersList = GetSupportedSearchParameters(_SearchParameterServiceType, _OperationClass, PreviousChainSearchParameter.TypeModifierResource);
                        oSupportedSearchParameter         = _DtoSupportedSearchParametersList.SingleOrDefault(x => x.Name == ParameterNameNoModifier);
                        if (oSupportedSearchParameter.Resource == FHIRAllTypes.Resource.GetLiteral())
                        {
                            oSupportedSearchParameter.Resource = PreviousChainSearchParameter.TypeModifierResource;
                        }
                        PreviousChainSearchParameter.TypeModifierResource = oSupportedSearchParameter.Resource;
                    }
                    else
                    {
                        //The modifier target resource provided is not valid for the previous reference, e.g subject:DiagnosticReport.family=millar
                        var DtoUnspportedSearchParameter = new UnspportedSearchParameter();
                        DtoUnspportedSearchParameter.RawParameter = $"{Parameter.Item1}={Parameter.Item2}";
                        string ResourceName = string.Empty;
                        if (_ResourceType.HasValue)
                        {
                            ResourceName = _ResourceType.Value.ToString();
                        }
                        DtoUnspportedSearchParameter.ReasonMessage  = $"The search parameter '{Parameter.Item1}' is not supported by this server for the resource type '{ResourceName}'. ";
                        DtoUnspportedSearchParameter.ReasonMessage += $"Additional information: ";
                        DtoUnspportedSearchParameter.ReasonMessage += $"This search parameter was a chained search parameter. The part that was not recognised was '{PreviousChainSearchParameter.Name}.{ParameterName}', The search parameter modifier given '{PreviousChainSearchParameter.TypeModifierResource}' is not valid for the search parameter {PreviousChainSearchParameter.Name}. ";
                        _SearchParametersServiceOutcome.SearchParameters.UnspportedSearchParameterList.Add(DtoUnspportedSearchParameter);
                        ErrorInSearchParameterProcessing = true;
                        break;
                    }
                }



                _DtoSupportedSearchParametersList.Clear();



                if (oSupportedSearchParameter != null)
                {
                    ISearchParameterBase oSearchParameter = null;
                    if (i >= ChaimedParameterSplit.Length - 1)
                    {
                        oSearchParameter = ISearchParameterFactory.CreateSearchParameter(oSupportedSearchParameter, SingleChainedParameter, false);
                    }
                    else
                    {
                        oSearchParameter = ISearchParameterFactory.CreateSearchParameter(oSupportedSearchParameter, SingleChainedParameter, true);
                    }
                    var UnspportedSearchParameterList = new List <UnspportedSearchParameter>();
                    if (ValidateSearchParameterSupported(oSupportedSearchParameter, oSearchParameter, UnspportedSearchParameterList))
                    {
                        if (!IsSingularSearchParameter(oSearchParameter, _SearchParametersServiceOutcome))
                        {
                            ISearchParameterBase Temp = oSearchParameter.CloneDeep() as ISearchParameterBase;

                            if (ParentChainSearchParameter == null)
                            {
                                ParentChainSearchParameter = Temp;
                            }
                            else
                            {
                                if (ParentChainSearchParameter.ChainedSearchParameter == null)
                                {
                                    ParentChainSearchParameter.ChainedSearchParameter = Temp;
                                }
                                PreviousChainSearchParameter.ChainedSearchParameter = Temp;
                            }

                            PreviousChainSearchParameter = Temp;
                            if (i != ChaimedParameterSplit.Count() - 1)
                            {
                                PreviousChainSearchParameter.Modifier = SearchParameter.SearchModifierCode.Type;
                            }
                        }
                    }
                    else
                    {
                        var DtoUnspportedSearchParameter = new UnspportedSearchParameter();
                        DtoUnspportedSearchParameter.RawParameter = $"{Parameter.Item1}={Parameter.Item2}";
                        string ResourceName = string.Empty;
                        if (_ResourceType.HasValue)
                        {
                            ResourceName = _ResourceType.Value.ToString();
                        }
                        DtoUnspportedSearchParameter.ReasonMessage  = $"The parameter '{Parameter.Item1}' is not supported by this server for the resource type '{ResourceName}', the whole parameter was : '{DtoUnspportedSearchParameter.RawParameter}'. ";
                        DtoUnspportedSearchParameter.ReasonMessage += $"Additional information: ";
                        foreach (var UnspportedSearchParameter in UnspportedSearchParameterList)
                        {
                            DtoUnspportedSearchParameter.ReasonMessage += UnspportedSearchParameter.ReasonMessage;
                        }
                        _SearchParametersServiceOutcome.SearchParameters.UnspportedSearchParameterList.Add(DtoUnspportedSearchParameter);
                        ErrorInSearchParameterProcessing = true;
                        break;
                    }
                }
                else
                {
                    var DtoUnspportedSearchParameter = new UnspportedSearchParameter();
                    DtoUnspportedSearchParameter.RawParameter = $"{Parameter.Item1}={Parameter.Item2}";
                    string ResourceName = string.Empty;
                    if (_ResourceType.HasValue)
                    {
                        ResourceName = _ResourceType.Value.ToString();
                    }
                    DtoUnspportedSearchParameter.ReasonMessage  = $"The search parameter '{Parameter.Item1}' is not supported by this server for the resource type '{ResourceName}', the whole parameter was : '{DtoUnspportedSearchParameter.RawParameter}'. ";
                    DtoUnspportedSearchParameter.ReasonMessage += $"Additional information: ";
                    DtoUnspportedSearchParameter.ReasonMessage += $"This search parameter was a chained search parameter. The part that was not recognised was '{ParameterNameNoModifier}'";
                    _SearchParametersServiceOutcome.SearchParameters.UnspportedSearchParameterList.Add(DtoUnspportedSearchParameter);
                    ErrorInSearchParameterProcessing = true;
                    break;
                }
            }


            if (!ErrorInSearchParameterProcessing)
            {
                _SearchParametersServiceOutcome.SearchParameters.SearchParametersList.Add(ParentChainSearchParameter);
            }
        }
        private void ProcessIncludeSearchParameters(IList <Tuple <string, string> > IncludeList)
        {
            if (IncludeList != null)
            {
                foreach (var Include in IncludeList)
                {
                    bool ParseOk = true;

                    SearchParameterInclude SearchParameterInclude = null;
                    var Key           = Include.Item1;
                    var KeySplitArray = Key.Split(':'); //_includes:recurse

                    if (KeySplitArray[0].ToLower() == Hl7.Fhir.Rest.SearchParams.SEARCH_PARAM_INCLUDE.ToLower())
                    {
                        SearchParameterInclude = new SearchParameterInclude(SearchParameterInclude.IncludeType.Include);
                    }
                    else if (KeySplitArray[0].ToLower() == Hl7.Fhir.Rest.SearchParams.SEARCH_PARAM_REVINCLUDE.ToLower())
                    {
                        SearchParameterInclude = new SearchParameterInclude(SearchParameterInclude.IncludeType.RevInclude);
                    }
                    else
                    {
                        ParseOk = false;
                        _SearchParametersServiceOutcome.SearchParameters.UnspportedSearchParameterList.Add(new UnspportedSearchParameter()
                        {
                            RawParameter  = $"{Key}",
                            ReasonMessage = $"{Hl7.Fhir.Rest.SearchParams.SEARCH_PARAM_INCLUDE} or {Hl7.Fhir.Rest.SearchParams.SEARCH_PARAM_REVINCLUDE} parameter is not recognised."
                        });
                    }

                    SearchParameterInclude.IsRecurse = false;
                    if (KeySplitArray.Count() > 1)
                    {
                        if (KeySplitArray[1].ToLower() == "recurse")
                        {
                            SearchParameterInclude.IsRecurse = true;
                        }
                    }

                    var    Value           = Include.Item2;
                    var    valueSplitArray = Value.Split(':');
                    string ScourceResource = valueSplitArray[0].Trim();
                    if (ModelInfo.IsKnownResource(ScourceResource))
                    {
                        SearchParameterInclude.SourceResourceType = ModelInfo.FhirTypeNameToFhirType(ScourceResource).Value;
                    }
                    else
                    {
                        ParseOk = false;
                        _SearchParametersServiceOutcome.SearchParameters.UnspportedSearchParameterList.Add(new UnspportedSearchParameter()
                        {
                            RawParameter  = $"{Key}={Value}",
                            ReasonMessage = "The source Resource of the _includes parameter is not recognised."
                        });
                    }

                    if (valueSplitArray.Count() > 2)
                    {
                        string TargetResourceType = valueSplitArray[2].Trim();
                        //checked we have a something if we don't then that is fine just a syntax error of the callers part
                        //i.e _includes=Patient:subject:
                        if (!string.IsNullOrWhiteSpace(TargetResourceType))
                        {
                            if (ModelInfo.IsKnownResource(TargetResourceType))
                            {
                                SearchParameterInclude.SearchParameterTargetResourceType = ModelInfo.FhirTypeNameToFhirType(TargetResourceType).Value;
                            }
                            else
                            {
                                ParseOk = false;
                                _SearchParametersServiceOutcome.SearchParameters.UnspportedSearchParameterList.Add(new UnspportedSearchParameter()
                                {
                                    RawParameter  = $"{Key}={Value}",
                                    ReasonMessage = "The target Resource of the _includes parameter is not recognised."
                                });
                            }
                        }
                    }

                    if (valueSplitArray.Count() > 1)
                    {
                        string SearchTerm = valueSplitArray[1].Trim();
                        List <DtoServiceSearchParameterLight> DtoSupportedSearchParametersList = GetSupportedSearchParameters(SearchParameterServiceType.Resource, null, SearchParameterInclude.SourceResourceType.GetLiteral());
                        if (SearchTerm == "*")
                        {
                            if (SearchParameterInclude.SearchParameterTargetResourceType != null)
                            {
                                SearchParameterInclude.SearchParameterList = DtoSupportedSearchParametersList.Where(x => x.Type == SearchParamType.Reference && x.TargetResourceTypeList.Any(v => v.ResourceType.GetLiteral() == SearchParameterInclude.SearchParameterTargetResourceType.Value.GetLiteral())).ToList();
                            }
                            else
                            {
                                SearchParameterInclude.SearchParameterList = DtoSupportedSearchParametersList.Where(x => x.Type == SearchParamType.Reference).ToList();
                            }
                        }
                        else
                        {
                            DtoServiceSearchParameterLight DtoServiceSearchParameterLight = DtoSupportedSearchParametersList.SingleOrDefault(x => x.Name == SearchTerm);
                            if (DtoServiceSearchParameterLight != null)
                            {
                                if (DtoServiceSearchParameterLight.Type == SearchParamType.Reference)
                                {
                                    if (DtoServiceSearchParameterLight.TargetResourceTypeList != null && SearchParameterInclude.SearchParameterTargetResourceType.HasValue)
                                    {
                                        if (DtoServiceSearchParameterLight.TargetResourceTypeList.SingleOrDefault(x => x.ResourceType.GetLiteral() == SearchParameterInclude.SearchParameterTargetResourceType.Value.GetLiteral()) == null)
                                        {
                                            ParseOk = false;
                                            _SearchParametersServiceOutcome.SearchParameters.UnspportedSearchParameterList.Add(new UnspportedSearchParameter()
                                            {
                                                RawParameter  = $"{Key}={Value}",
                                                ReasonMessage = $"The target Resource '{SearchParameterInclude.SearchParameterTargetResourceType.Value.GetLiteral()}' of the _includes parameter is not recognised for the source '{SearchParameterInclude.SourceResourceType.GetLiteral()}' Resource's search parameter {DtoServiceSearchParameterLight.Name}."
                                            });
                                        }
                                    }
                                    SearchParameterInclude.SearchParameterList = new List <DtoServiceSearchParameterLight>();
                                    SearchParameterInclude.SearchParameterList.Add(DtoServiceSearchParameterLight);
                                }
                                else
                                {
                                    ParseOk = false;
                                    _SearchParametersServiceOutcome.SearchParameters.UnspportedSearchParameterList.Add(new UnspportedSearchParameter()
                                    {
                                        RawParameter  = $"{Key}={Value}",
                                        ReasonMessage = $"The source Resource '{SearchParameterInclude.SourceResourceType.GetLiteral()}' search parameter '{DtoServiceSearchParameterLight.Name}' of the _includes parameter is not of search parameter of type Reference, found search parameter type of '{DtoServiceSearchParameterLight.Type.ToString()}'."
                                    });
                                }
                            }
                            else
                            {
                                ParseOk = false;
                                _SearchParametersServiceOutcome.SearchParameters.UnspportedSearchParameterList.Add(new UnspportedSearchParameter()
                                {
                                    RawParameter  = $"{Key}={Value}",
                                    ReasonMessage = $"The source Resource '{SearchParameterInclude.SourceResourceType.GetLiteral()}' search parameter '{SearchTerm}' is not a valid search parameter for the source Resource type."
                                });
                            }
                        }
                    }

                    //All ok so add as valid include
                    if (ParseOk)
                    {
                        if (_SearchParametersServiceOutcome.SearchParameters.IncludeList == null)
                        {
                            _SearchParametersServiceOutcome.SearchParameters.IncludeList = new List <SearchParameterInclude>();
                        }
                        _SearchParametersServiceOutcome.SearchParameters.IncludeList.Add(SearchParameterInclude);
                    }
                }
            }
        }
Example #26
0
 public override bool ValidatePrefixes(DtoServiceSearchParameterLight DtoSupportedSearchParameters)
 {
     //String Search parameter types never have prefixes so always return true.
     return(true);
 }
Example #27
0
 public abstract bool ValidatePrefixes(DtoServiceSearchParameterLight DtoSupportedSearchParameters);
        public ISearchParametersServiceOutcome ProcessSearchParameters(
            ISearchParameterGeneric SearchParameterGeneric,
            SearchParameterServiceType SearchParameterServiceType,
            FHIRAllTypes?ResourceType,
            OperationClass OperationClass)
        {
            if (SearchParameterServiceType == SearchParameterServiceType.None)
            {
                throw new NullReferenceException("Server error: SearchParameterServiceType can not be 'None'.");
            }

            if (SearchParameterGeneric == null)
            {
                throw new NullReferenceException("Server error: SearchParameterGeneric can not be null.");
            }

            if (((SearchParameterServiceType & SearchParameterServiceType.Resource) == SearchParameterServiceType.Resource) &&
                ResourceType == null)
            {
                throw new NullReferenceException("Server error: ResourceType can not be null when enum SearchParameterServiceType is set to Resource.");
            }

            if (((SearchParameterServiceType & SearchParameterServiceType.Operation) == SearchParameterServiceType.Operation) &&
                OperationClass == null)
            {
                throw new NullReferenceException("Server error: OperationClass can not be null when enum SearchParameterServiceType is set to Operation.");
            }

            _ResourceType               = ResourceType;
            _OperationClass             = OperationClass;
            _SearchParameterServiceType = SearchParameterServiceType;

            _SearchParametersServiceOutcome = ISearchParametersServiceOutcomeFactory.CreateSearchParametersServiceOutcome();
            _SearchParametersServiceOutcome.SearchParameters = new PyroSearchParameters();
            _SearchParametersServiceOutcome.SearchParameters.ResourceTarget                = _ResourceType;
            _SearchParametersServiceOutcome.SearchParameters.SearchParametersList          = new List <ISearchParameterBase>();
            _SearchParametersServiceOutcome.SearchParameters.UnspportedSearchParameterList = new List <UnspportedSearchParameter>();
            _SearchParametersServiceOutcome.SearchParameters.CountOfRecordsRequested       = SearchParameterGeneric.Count;
            _SearchParametersServiceOutcome.SearchParameters.SummaryType = SearchParameterGeneric.SummaryType;

            //Parse Include and RevInclude parameters
            ProcessIncludeSearchParameters(SearchParameterGeneric.Include);
            ProcessIncludeSearchParameters(SearchParameterGeneric.RevInclude);

            foreach (var Parameter in SearchParameterGeneric.ParameterList)
            {
                //We will just ignore an empty parameter such as this last '&' URL?family=Smith&given=John&
                if (Parameter.Item1 + Parameter.Item2 != string.Empty)
                {
                    if (Parameter.Item1.Contains(SearchParams.SEARCH_CHAINSEPARATOR))
                    {
                        ChainSearchProcessing(Parameter);
                    }
                    else
                    {
                        NormalSearchProcessing(Parameter);
                    }
                }
            }

            //resolve Sort order parameters
            if (SearchParameterGeneric.Sort != null)
            {
                _SearchParametersServiceOutcome.SearchParameters.SortList = new List <PyroSearchParameters.Sort>();
                foreach (var SortItem in SearchParameterGeneric.Sort)
                {
                    string SearchParameterName = SortItem.Item1.Trim();
                    DtoServiceSearchParameterLight oSupportedSearchParameter = _DtoSupportedSearchParametersList.SingleOrDefault(x => x.Name == SearchParameterName);
                    _SearchParametersServiceOutcome.SearchParameters.SortList.Add(new PyroSearchParameters.Sort()
                    {
                        Value = oSupportedSearchParameter, SortOrderType = SortItem.Item2
                    });
                }
            }

            return(_SearchParametersServiceOutcome);
        }