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); }
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); }
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); }
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 }); } }
public override bool ValidatePrefixes(DtoServiceSearchParameterLight DtoSupportedSearchParameters) { foreach (var Value in ValueList) { if (!Value.ValidatePreFix(DtoSupportedSearchParameters)) { return(false); } } return(true); }
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); }
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); } }
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); }
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); }
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); }
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); }
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}"); } }
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}'"); } }
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); } }
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'"); }
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); } }
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); }
public override bool ValidatePrefixes(DtoServiceSearchParameterLight DtoSupportedSearchParameters) { //Token search parameters do not contain prefixes, so return true return(true); }
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); } } } }
public override bool ValidatePrefixes(DtoServiceSearchParameterLight DtoSupportedSearchParameters) { //String Search parameter types never have prefixes so always return true. return(true); }
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); }