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); } }
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; } }
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); } }