Exemplo n.º 1
0
 public override bool TryParseValue(string Values)
 {
     this.ValueList = new List <SearchParameterStringValue>();
     foreach (string Value in Values.Split(OrDelimiter))
     {
         var DtoSearchParameterStringValue = new SearchParameterStringValue();
         if (this.Modifier.HasValue && this.Modifier == Hl7.Fhir.Model.SearchParameter.SearchModifierCode.Missing)
         {
             bool?IsMissing = DtoSearchParameterStringValue.ParseModifierEqualToMissing(Value);
             if (IsMissing.HasValue)
             {
                 DtoSearchParameterStringValue.IsMissing = IsMissing.Value;
                 this.ValueList.Add(DtoSearchParameterStringValue);
             }
             else
             {
                 this.InvalidMessage = $"Found the {Hl7.Fhir.Model.SearchParameter.SearchModifierCode.Missing.GetPyroLiteral()} Modifier yet is value was expected to be true or false yet found '{Value}'. ";
                 return(false);
             }
         }
         else
         {
             DtoSearchParameterStringValue.Value = StringSupport.ToLowerTrimRemoveDiacriticsTruncate(Value, Database.StaticDatabaseInfo.BaseDatabaseFieldLength.StringMaxLength);
             this.ValueList.Add(DtoSearchParameterStringValue);
         }
     }
     if (this.ValueList.Count() > 1)
     {
         this.HasLogicalOrProperties = true;
     }
     if (this.ValueList.Count > 0)
     {
         return(true);
     }
     else
     {
         return(false);
     }
 }
Exemplo n.º 2
0
        public override void ParseValue(string Values)
        {
            this.IsValid = true;
            this.ValueList.Clear();
            foreach (string Value in Values.Split(OrDelimiter))
            {
                if (this.Modifier.HasValue && this.Modifier == SearchModifierCode.Missing)
                {
                    bool?IsMissing = SearchQueryStringValue.ParseModifierEqualToMissing(Value);
                    if (IsMissing.HasValue)
                    {
                        this.ValueList.Add(new SearchQueryStringValue(IsMissing.Value, null));
                    }
                    else
                    {
                        this.InvalidMessage = $"Found the {SearchModifierCode.Missing.GetCode()} Modifier yet the value was expected to be true or false yet found '{Value}'. ";
                        this.IsValid        = false;
                        break;
                    }
                }
                else
                {
                    this.ValueList.Add(new SearchQueryStringValue(false, StringSupport.ToLowerTrimRemoveDiacriticsTruncate(Value, DatabaseMetaData.FieldLength.StringMaxLength)));
                }
            }

            if (ValueList.Count > 1)
            {
                this.HasLogicalOrProperties = true;
            }

            if (this.ValueList.Count == 0)
            {
                this.InvalidMessage = $"Unable to parse any values into a {this.GetType().Name} from the string: {Values}.";
                this.IsValid        = false;
            }
        }
Exemplo n.º 3
0
        public void TestQueryTypesPositive(Common.Enums.FhirVersion fhirVersion, Common.Enums.ResourceType ResourceContext, Common.Enums.SearchParamType SearchParamType, string searchParameterName, string queryValue)
        {
            //Prepare
            Setup();
            List <SearchParameter> SearchParameterListForResource = ISearchParameterCacheMock !.Object.GetForIndexingAsync(fhirVersion, ResourceContext).Result;
            SearchParameter        SearchParameter = SearchParameterListForResource.SingleOrDefault(x => x.Name == searchParameterName);

            var Parameter = new KeyValuePair <string, StringValues>(searchParameterName, new StringValues(queryValue));

            //Act
            IList <ISearchQueryBase> ISearchQueryBaseList = SearchQueryFactory !.Create(ResourceContext, SearchParameter, Parameter, false).Result;

            //Assert
            Assert.Equal(1, ISearchQueryBaseList.Count);
            ISearchQueryBase SearchQueryResult = ISearchQueryBaseList[0];

            Assert.Null(SearchQueryResult.ChainedSearchParameter);
            if (SearchParamType == Common.Enums.SearchParamType.Composite)
            {
                Assert.NotNull(SearchQueryResult.ComponentList);
                //We are only assuming all Composite have only two components here, which is not always true
                Assert.Equal(2, SearchQueryResult.ComponentList.Count);
            }
            else
            {
                Assert.Equal(0, SearchQueryResult.ComponentList.Count);
            }

            Assert.Equal(fhirVersion, SearchQueryResult.FhirVersionId);
            Assert.Equal(queryValue.Contains(','), SearchQueryResult.HasLogicalOrProperties);
            Assert.Equal(string.Empty, SearchQueryResult.InvalidMessage);
            Assert.True(SearchQueryResult.IsValid);
            Assert.Null(SearchQueryResult.Modifier);
            Assert.Equal(searchParameterName, SearchQueryResult.Name);
            Assert.Equal($"{searchParameterName}={queryValue}", SearchQueryResult.RawValue);
            Assert.Equal(ResourceContext, SearchQueryResult.ResourceContext);
            Assert.True(SearchQueryResult.ResourceTypeList.Count > 0);
            Assert.Contains(SearchQueryResult.ResourceTypeList.ToArray(), x => x.ResourceTypeId == ResourceContext);
            Assert.Equal(SearchParamType, SearchQueryResult.SearchParamTypeId);
            if (SearchParamType == Common.Enums.SearchParamType.Reference)
            {
                Assert.True(SearchQueryResult.TargetResourceTypeList.Count > 0);
            }
            else
            {
                Assert.True(SearchQueryResult.TargetResourceTypeList.Count == 0);
            }
            Assert.False(SearchQueryResult.TypeModifierResource.HasValue);


            if (SearchQueryResult is SearchQueryComposite SearchQueryComposite)
            {
                Assert.Equal(2, SearchQueryResult.ComponentList.Count);
                Assert.True(SearchQueryComposite.ValueList.Count == 1);
                Assert.True(SearchQueryComposite.ValueList[0].SearchQueryBaseList.Count == 2);
                if (SearchQueryComposite.ValueList[0].SearchQueryBaseList[0] is SearchQueryToken SearchQueryToken)
                {
                    Assert.True(SearchQueryToken.ValueList.Count == 1);
                    Assert.Equal(queryValue.Split('$')[0].Split('|')[0], SearchQueryToken.ValueList[0].System);
                    Assert.Equal(queryValue.Split('$')[0].Split('|')[1], SearchQueryToken.ValueList[0].Code);
                }
            }
            else if (SearchQueryResult is SearchQueryString SearchQueryString)
            {
                if (queryValue.Contains(','))
                {
                    Assert.Equal(StringSupport.ToLowerTrimRemoveDiacriticsTruncate(queryValue.Split(',')[0], DatabaseMetaData.FieldLength.StringMaxLength), SearchQueryString.ValueList[0].Value);
                    Assert.Equal(StringSupport.ToLowerTrimRemoveDiacriticsTruncate(queryValue.Split(',')[1], DatabaseMetaData.FieldLength.StringMaxLength), SearchQueryString.ValueList[1].Value);
                }
                else
                {
                    Assert.Equal(StringSupport.ToLowerTrimRemoveDiacriticsTruncate(queryValue, DatabaseMetaData.FieldLength.StringMaxLength), SearchQueryString.ValueList[0].Value);
                }
            }
            else if (SearchQueryResult is SearchQueryReference SearchQueryReference)
            {
                Assert.NotNull(SearchQueryReference.ValueList[0].FhirUri);
                if (queryValue.StartsWith(TestData.BaseUrlServer))
                {
                    Assert.Equal(Common.Enums.ResourceType.Patient.GetCode(), SearchQueryReference.ValueList[0].FhirUri !.ResourseName);
                    Assert.Equal("11", SearchQueryReference.ValueList[0].FhirUri !.ResourceId);
                    Assert.True(SearchQueryReference.ValueList[0].FhirUri !.IsRelativeToServer);
                }
                else if (queryValue.StartsWith(TestData.BaseUrlRemote))
                {
                    Assert.Equal(Common.Enums.ResourceType.Patient.GetCode(), SearchQueryReference.ValueList[0].FhirUri !.ResourseName);
                    Assert.Equal("11", SearchQueryReference.ValueList[0].FhirUri !.ResourceId);
                    Assert.False(SearchQueryReference.ValueList[0].FhirUri !.IsRelativeToServer);
                }
                else if (queryValue.Contains('/'))
                {
                    Assert.Equal(queryValue.Split('/')[0], SearchQueryReference.ValueList[0].FhirUri !.ResourseName);
                    Assert.Equal(queryValue.Split('/')[1], SearchQueryReference.ValueList[0].FhirUri !.ResourceId);
                }
                else
                {
                    Assert.Equal(Common.Enums.ResourceType.Encounter.GetCode(), SearchQueryReference.ValueList[0].FhirUri !.ResourseName);
                    Assert.Equal(queryValue, SearchQueryReference.ValueList[0].FhirUri !.ResourceId);
                }
            }
            else if (SearchQueryResult is SearchQueryToken SearchQueryToken)
            {
                if (queryValue.StartsWith("code"))
                {
                    Assert.Null(SearchQueryToken.ValueList[0].System);
                    Assert.Equal(queryValue, SearchQueryToken.ValueList[0].Code);
                }
                else if (queryValue.EndsWith("|"))
                {
                    Assert.Null(SearchQueryToken.ValueList[0].Code);
                    Assert.Equal(queryValue.TrimEnd('|'), SearchQueryToken.ValueList[0].System);
                }
                else
                {
                    Assert.Equal(queryValue.Split('|')[0], SearchQueryToken.ValueList[0].System);
                    Assert.Equal(queryValue.Split('|')[1], SearchQueryToken.ValueList[0].Code);
                }
            }
            else if (SearchQueryResult is SearchQueryQuantity SearchQueryQuantity)
            {
                Assert.Equal(queryValue.Split('|')[1], SearchQueryQuantity.ValueList[0].System);
                Assert.Equal(queryValue.Split('|')[2], SearchQueryQuantity.ValueList[0].Code);
                if (queryValue.Split('|')[0].Contains("e+10") && queryValue.Split('|')[0].StartsWith('-'))
                {
                    Assert.Equal(-54000000000m, SearchQueryQuantity.ValueList[0].Value);
                    Assert.Equal(0, SearchQueryQuantity.ValueList[0].Scale);
                    Assert.Equal(11, SearchQueryQuantity.ValueList[0].Precision);
                }
                else if (queryValue.Split('|')[0].Contains("e-3"))
                {
                    Assert.Equal(0.00540m, SearchQueryQuantity.ValueList[0].Value);
                    Assert.Equal(5, SearchQueryQuantity.ValueList[0].Scale);
                    Assert.Equal(5, SearchQueryQuantity.ValueList[0].Precision);
                }
                else if (queryValue.Split('|')[0].Contains("e+10"))
                {
                    Assert.Equal(54000000000m, SearchQueryQuantity.ValueList[0].Value);
                    Assert.Equal(0, SearchQueryQuantity.ValueList[0].Scale);
                    Assert.Equal(11, SearchQueryQuantity.ValueList[0].Precision);
                }
                else
                {
                    Assert.Equal(Decimal.Parse(queryValue.Split('|')[0]), SearchQueryQuantity.ValueList[0].Value);
                    Assert.Equal(1, SearchQueryQuantity.ValueList[0].Scale);
                    Assert.Equal(2, SearchQueryQuantity.ValueList[0].Precision);
                }
            }
            else if (SearchQueryResult is SearchQueryNumber SearchQueryNumber)
            {
                if (queryValue.StartsWith("gt"))
                {
                    Assert.Equal(100, SearchQueryNumber.ValueList[0].Value);
                    Assert.Equal(0, SearchQueryNumber.ValueList[0].Scale);
                    Assert.Equal(3, SearchQueryNumber.ValueList[0].Precision);
                    Assert.Equal(SearchComparator.Gt, SearchQueryNumber.ValueList[0].Prefix);
                }
                else if (queryValue.StartsWith("lt"))
                {
                    Assert.Equal(100, SearchQueryNumber.ValueList[0].Value);
                    Assert.Equal(0, SearchQueryNumber.ValueList[0].Scale);
                    Assert.Equal(3, SearchQueryNumber.ValueList[0].Precision);
                    Assert.Equal(SearchComparator.Lt, SearchQueryNumber.ValueList[0].Prefix);
                }
                else if (queryValue == "100")
                {
                    Assert.Equal(100, SearchQueryNumber.ValueList[0].Value);
                    Assert.Equal(0, SearchQueryNumber.ValueList[0].Scale);
                    Assert.Equal(3, SearchQueryNumber.ValueList[0].Precision);
                    Assert.Null(SearchQueryNumber.ValueList[0].Prefix);
                }
                else if (queryValue == "100.00")
                {
                    Assert.Equal(100.00m, SearchQueryNumber.ValueList[0].Value);
                    Assert.Equal(2, SearchQueryNumber.ValueList[0].Scale);
                    Assert.Equal(5, SearchQueryNumber.ValueList[0].Precision);
                    Assert.Null(SearchQueryNumber.ValueList[0].Prefix);
                }
            }
            else if (SearchQueryResult is SearchQueryDateTime SearchQueryDateTime)
            {
                if (queryValue.StartsWith("gt"))
                {
                    var testDate = new DateTimeOffset(new DateTime(2020, 04, 07), TimeSpan.FromHours(10));
                    Assert.Equal(testDate.ToUniversalTime().DateTime, SearchQueryDateTime.ValueList[0].Value);
                    Assert.Equal(DateTimePrecision.Day, SearchQueryDateTime.ValueList[0].Precision);
                    Assert.Equal(SearchComparator.Gt, SearchQueryDateTime.ValueList[0].Prefix);
                }
                else if (queryValue.Length == 16)
                {
                    var testDate = new DateTimeOffset(new DateTime(2020, 04, 07, 10, 00, 00), TimeSpan.FromHours(10));
                    Assert.Equal(testDate.ToUniversalTime().DateTime, SearchQueryDateTime.ValueList[0].Value);
                    Assert.Equal(DateTimePrecision.HourMin, SearchQueryDateTime.ValueList[0].Precision);
                }
                else if (queryValue.Length == 4)
                {
                    var testDate = new DateTimeOffset(new DateTime(2020, 01, 01), TimeSpan.FromHours(10));
                    Assert.Equal(testDate.ToUniversalTime().DateTime, SearchQueryDateTime.ValueList[0].Value);
                    Assert.Equal(DateTimePrecision.Year, SearchQueryDateTime.ValueList[0].Precision);
                }
                else if (queryValue.Length == 7)
                {
                    var testDate = new DateTimeOffset(new DateTime(2020, 04, 01), TimeSpan.FromHours(10));
                    Assert.Equal(testDate.ToUniversalTime().DateTime, SearchQueryDateTime.ValueList[0].Value);
                    Assert.Equal(DateTimePrecision.Month, SearchQueryDateTime.ValueList[0].Precision);
                }
                else if (queryValue.Length == 10)
                {
                    var testDate = new DateTimeOffset(new DateTime(2020, 04, 07), TimeSpan.FromHours(10));
                    Assert.Equal(testDate.ToUniversalTime().DateTime, SearchQueryDateTime.ValueList[0].Value);
                    Assert.Equal(DateTimePrecision.Day, SearchQueryDateTime.ValueList[0].Precision);
                }
                else if (queryValue.Length == 19)
                {
                    var testDate = new DateTimeOffset(new DateTime(2020, 04, 07, 10, 00, 10), TimeSpan.FromHours(10));
                    Assert.Equal(testDate.ToUniversalTime().DateTime, SearchQueryDateTime.ValueList[0].Value);
                    Assert.Equal(DateTimePrecision.Sec, SearchQueryDateTime.ValueList[0].Precision);
                }
                else if (queryValue.Length == 25)
                {
                    var testDate = new DateTimeOffset(new DateTime(2020, 04, 07, 10, 00, 10), TimeSpan.FromHours(5));
                    Assert.Equal(testDate.ToUniversalTime().DateTime, SearchQueryDateTime.ValueList[0].Value);
                    Assert.Equal(DateTimePrecision.Sec, SearchQueryDateTime.ValueList[0].Precision);
                }
            }
            else if (SearchQueryResult is SearchQueryUri SearchQueryUri)
            {
                Assert.Equal(new Uri(queryValue), SearchQueryUri.ValueList[0].Value);
            }
            else
            {
                Assert.Null(SearchQueryResult.ComponentList);
            }
        }