private ExpressionStarter <IResourceIndexed> PredicateSearchParameter(SearchParameterBase SearchItem) { var Search = new Search <IResourceIndexed>(); ExpressionStarter <IResourceIndexed> Predicate = LinqKit.PredicateBuilder.New <IResourceIndexed>(); switch (SearchItem.Type) { case SearchParamType.Date: Predicate = DateTimePeriodPredicateBuilder <IResourceIndexed> .Build(Search, Predicate, SearchItem); break; case SearchParamType.Number: { if (SearchItem is SearchParameterNumber) { var SearchTypeNumber = SearchItem as SearchParameterNumber; foreach (var SearchValue in SearchTypeNumber.ValueList) { if (SearchTypeNumber.Name != "page") { //ToDo: more needed here } } } Predicate = NumberPredicateBuilder <IResourceIndexed> .Build(Search, Predicate, SearchItem); } break; case SearchParamType.Quantity: Predicate = QuantityPredicateBuilder <IResourceIndexed> .Build(Search, Predicate, SearchItem); break; case SearchParamType.Reference: Predicate = ReferancePredicateBuilder <IResourceIndexed> .Build(Search, Predicate, SearchItem, IPrimaryServiceRootCache.GetPrimaryRootUrlStoreFromDatabase()); break; case SearchParamType.String: Predicate = StringPredicateBuilder <IResourceIndexed> .Build(Search, Predicate, SearchItem); break; case SearchParamType.Token: Predicate = TokenPredicateBuilder <IResourceIndexed> .Build(Search, Predicate, SearchItem); break; case SearchParamType.Uri: Predicate = UriPredicateBuilder <IResourceIndexed> .Build(Search, Predicate, SearchItem); break; default: throw new System.ComponentModel.InvalidEnumArgumentException(SearchItem.Type.ToString(), (int)SearchItem.Type, typeof(SearchParamType)); } return(Predicate); }
public static ExpressionStarter <ResCurrentType> Build( ResourceSearchExpressionTrees <ResCurrentType, ResIndexStringType, ResIndexTokenType, ResIndexUriType, ResIndexReferenceType, ResIndexQuantityType, ResIndexDateTimeType> Search, ExpressionStarter <ResCurrentType> NewPredicate, SearchParameterBase SearchItem, IPrimaryServiceRootCache IPrimaryServiceRootCache) { if (SearchItem is SearchParameterComposite) { var SearchTypeComposite = SearchItem as SearchParameterComposite; foreach (var SearchValue in SearchTypeComposite.ValueList) { if (!SearchTypeComposite.Modifier.HasValue) { NewPredicate = CollectionEqualToPredicate(Search, NewPredicate, SearchTypeComposite, SearchValue, IPrimaryServiceRootCache); } else { switch (SearchTypeComposite.Modifier) { case SearchParameter.SearchModifierCode.Missing: throw new FormatException($"The search modifier: {SearchTypeComposite.Modifier.ToString()} is not supported for search parameter types of Composite."); case SearchParameter.SearchModifierCode.Exact: throw new FormatException($"The search modifier: {SearchTypeComposite.Modifier.ToString()} is not supported for search parameter types of Composite."); case SearchParameter.SearchModifierCode.Contains: throw new FormatException($"The search modifier: {SearchTypeComposite.Modifier.ToString()} is not supported for search parameter types of Composite."); case SearchParameter.SearchModifierCode.Text: throw new FormatException($"The search modifier: {SearchTypeComposite.Modifier.ToString()} is not supported for search parameter types of Composite."); case SearchParameter.SearchModifierCode.Type: throw new FormatException($"The search modifier: {SearchTypeComposite.Modifier.ToString()} is not supported for search parameter types of Composite."); case SearchParameter.SearchModifierCode.Below: throw new FormatException($"The search modifier: {SearchTypeComposite.Modifier.ToString()} is not supported for search parameter types of Composite."); case SearchParameter.SearchModifierCode.Above: throw new FormatException($"The search modifier: {SearchTypeComposite.Modifier.ToString()} is not supported for search parameter types of Composite."); case SearchParameter.SearchModifierCode.In: throw new FormatException($"The search modifier: {SearchTypeComposite.Modifier.ToString()} is not supported for search parameter types of Composite."); case SearchParameter.SearchModifierCode.NotIn: throw new FormatException($"The search modifier: {SearchTypeComposite.Modifier.ToString()} is not supported for search parameter types of Composite."); default: throw new System.ComponentModel.InvalidEnumArgumentException(SearchTypeComposite.Modifier.ToString(), (int)SearchTypeComposite.Modifier, typeof(SearchParameter.SearchModifierCode)); } } } } return(NewPredicate); }
public static ExpressionStarter <ResCurrentType> Build(ResourceSearch <ResCurrentType, ResIndexStringType, ResIndexTokenType, ResIndexUriType, ResIndexReferenceType, ResIndexQuantityType, ResIndexDateTimeType> Search, ExpressionStarter <ResCurrentType> NewPredicate, SearchParameterBase SearchItem) { if (SearchItem is SearchParameterQuantity) { var SearchTypeNumber = SearchItem as SearchParameterQuantity; foreach (var SearchValue in SearchTypeNumber.ValueList) { if (SearchTypeNumber.Modifier.HasValue == false) { if (SearchValue.Prefix.HasValue == false) { NewPredicate = CollectionEqualToPredicate(Search, NewPredicate, SearchTypeNumber, SearchValue); } else { switch (SearchValue.Prefix) { case SearchParameter.SearchComparator.Eq: NewPredicate = CollectionEqualToPredicate(Search, NewPredicate, SearchTypeNumber, SearchValue); break; case SearchParameter.SearchComparator.Ne: NewPredicate = CollectionNotEqualToPredicate(Search, NewPredicate, SearchTypeNumber, SearchValue); break; case SearchParameter.SearchComparator.Gt: NewPredicate = NewPredicate.Or(Search.QuantityCollectionAnyGreaterThan(SearchTypeNumber.Id, SearchValue.Value, SearchValue.System, SearchValue.Code)); break; case SearchParameter.SearchComparator.Lt: NewPredicate = NewPredicate.Or(Search.QuantityCollectionAnyLessThan(SearchTypeNumber.Id, SearchValue.Value, SearchValue.System, SearchValue.Code)); break; case SearchParameter.SearchComparator.Ge: NewPredicate = NewPredicate.Or(Search.QuantityCollectionAnyGreaterThanOrEqualTo(SearchTypeNumber.Id, SearchValue.Value, SearchValue.System, SearchValue.Code)); break; case SearchParameter.SearchComparator.Le: NewPredicate = NewPredicate.Or(Search.QuantityCollectionAnyLessThanOrEqualTo(SearchTypeNumber.Id, SearchValue.Value, SearchValue.System, SearchValue.Code)); break; case SearchParameter.SearchComparator.Sa: throw new FormatException($"The search prefix: {SearchValue.Prefix.ToString()} is not supported for search parameter types of Quantity."); case SearchParameter.SearchComparator.Eb: throw new FormatException($"The search prefix: {SearchValue.Prefix.ToString()} is not supported for search parameter types of Quantity."); case SearchParameter.SearchComparator.Ap: throw new FormatException($"The search prefix: {SearchValue.Prefix.ToString()} is not supported for search parameter types of Quantity."); default: throw new System.ComponentModel.InvalidEnumArgumentException(SearchValue.Prefix.Value.GetLiteral(), (int)SearchValue.Prefix, typeof(SearchParameter.SearchComparator)); } } } else { switch (SearchTypeNumber.Modifier) { case SearchParameter.SearchModifierCode.Missing: if (SearchValue.Prefix.HasValue == false) { if (SearchValue.IsMissing) { NewPredicate = NewPredicate.Or(Search.SearchParameterIsNull <ResIndexQuantityType>(SearchTypeNumber.Id)); } else { NewPredicate = NewPredicate.Or(Search.SearchParameterIdIsNotNull <ResIndexQuantityType>(SearchTypeNumber.Id)); } } else { switch (SearchValue.Prefix) { case SearchParameter.SearchComparator.Eq: throw new FormatException($"The search prefix: {SearchValue.Prefix.ToString()} is not supported for search parameter types of Quantity with a Modifier of: {SearchTypeNumber.Modifier.ToString()}."); case SearchParameter.SearchComparator.Ne: throw new FormatException($"The search prefix: {SearchValue.Prefix.ToString()} is not supported for search parameter types of Quantity with a Modifier of: {SearchTypeNumber.Modifier.ToString()}."); case SearchParameter.SearchComparator.Gt: throw new FormatException($"The search prefix: {SearchValue.Prefix.ToString()} is not supported for search parameter types of Quantity with a Modifier of: {SearchTypeNumber.Modifier.ToString()}."); case SearchParameter.SearchComparator.Lt: throw new FormatException($"The search prefix: {SearchValue.Prefix.ToString()} is not supported for search parameter types of Quantity with a Modifier of: {SearchTypeNumber.Modifier.ToString()}."); case SearchParameter.SearchComparator.Ge: throw new FormatException($"The search prefix: {SearchValue.Prefix.ToString()} is not supported for search parameter types of Quantity with a Modifier of: {SearchTypeNumber.Modifier.ToString()}."); case SearchParameter.SearchComparator.Le: throw new FormatException($"The search prefix: {SearchValue.Prefix.ToString()} is not supported for search parameter types of Quantity with a Modifier of: {SearchTypeNumber.Modifier.ToString()}."); case SearchParameter.SearchComparator.Sa: throw new FormatException($"The search prefix: {SearchValue.Prefix.ToString()} is not supported for search parameter types of Quantity with a Modifier of: {SearchTypeNumber.Modifier.ToString()}."); case SearchParameter.SearchComparator.Eb: throw new FormatException($"The search prefix: {SearchValue.Prefix.ToString()} is not supported for search parameter types of Quantity with a Modifier of: {SearchTypeNumber.Modifier.ToString()}."); case SearchParameter.SearchComparator.Ap: throw new FormatException($"The search prefix: {SearchValue.Prefix.ToString()} is not supported for search parameter types of Quantity with a Modifier of: {SearchTypeNumber.Modifier.ToString()}."); default: throw new System.ComponentModel.InvalidEnumArgumentException(SearchValue.Prefix.Value.GetLiteral(), (int)SearchValue.Prefix, typeof(SearchParameter.SearchComparator)); } } break; case SearchParameter.SearchModifierCode.Exact: throw new FormatException($"The search modifier: {SearchTypeNumber.Modifier.ToString()} is not supported for search parameter types of date."); case SearchParameter.SearchModifierCode.Contains: throw new FormatException($"The search modifier: {SearchTypeNumber.Modifier.ToString()} is not supported for search parameter types of date."); case SearchParameter.SearchModifierCode.Text: throw new FormatException($"The search modifier: {SearchTypeNumber.Modifier.ToString()} is not supported for search parameter types of date."); case SearchParameter.SearchModifierCode.Type: throw new FormatException($"The search modifier: {SearchTypeNumber.Modifier.ToString()} is not supported for search parameter types of date."); case SearchParameter.SearchModifierCode.Below: throw new FormatException($"The search modifier: {SearchTypeNumber.Modifier.ToString()} is not supported for search parameter types of date."); case SearchParameter.SearchModifierCode.Above: throw new FormatException($"The search modifier: {SearchTypeNumber.Modifier.ToString()} is not supported for search parameter types of date."); case SearchParameter.SearchModifierCode.In: throw new FormatException($"The search modifier: {SearchTypeNumber.Modifier.ToString()} is not supported for search parameter types of date."); case SearchParameter.SearchModifierCode.NotIn: throw new FormatException($"The search modifier: {SearchTypeNumber.Modifier.ToString()} is not supported for search parameter types of date."); default: throw new System.ComponentModel.InvalidEnumArgumentException(SearchTypeNumber.Modifier.Value.GetLiteral(), (int)SearchTypeNumber.Modifier, typeof(SearchParameter.SearchModifierCode)); } } } } return(NewPredicate); }
public static ExpressionStarter <ResCurrentType> Build(ResourceSearch <ResCurrentType, ResIndexStringType, ResIndexTokenType, ResIndexUriType, ResIndexReferenceType, ResIndexQuantityType, ResIndexDateTimeType> Search, ExpressionStarter <ResCurrentType> NewPredicate, SearchParameterBase SearchItem) { if (SearchItem is SearchParameterString) { var SearchTypeString = SearchItem as SearchParameterString; foreach (var SearchValue in SearchTypeString.ValueList) { if (!SearchTypeString.Modifier.HasValue) { NewPredicate = NewPredicate.Or(Search.StringCollectionAnyStartsOrEndsWith(SearchTypeString.Id, SearchValue.Value)); } else { switch (SearchTypeString.Modifier) { case SearchParameter.SearchModifierCode.Missing: if (SearchValue.IsMissing) { NewPredicate = NewPredicate.Or(Search.SearchParameterIsNull <ResIndexStringType>(SearchTypeString.Id)); } else { NewPredicate = NewPredicate.Or(Search.SearchParameterIdIsNotNull <ResIndexStringType>(SearchTypeString.Id)); } break; case SearchParameter.SearchModifierCode.Exact: NewPredicate = NewPredicate.Or(Search.StringCollectionAnyEqualTo(SearchTypeString.Id, SearchValue.Value)); break; case SearchParameter.SearchModifierCode.Contains: NewPredicate = NewPredicate.Or(Search.StringCollectionAnyContains(SearchTypeString.Id, SearchValue.Value)); break; case SearchParameter.SearchModifierCode.Text: throw new FormatException($"The search modifier: {SearchTypeString.Modifier.ToString()} is not supported for search parameter types of string."); case SearchParameter.SearchModifierCode.Type: throw new FormatException($"The search modifier: {SearchTypeString.Modifier.ToString()} is not supported for search parameter types of string."); case SearchParameter.SearchModifierCode.Below: throw new FormatException($"The search modifier: {SearchTypeString.Modifier.ToString()} is not supported for search parameter types of string."); case SearchParameter.SearchModifierCode.Above: throw new FormatException($"The search modifier: {SearchTypeString.Modifier.ToString()} is not supported for search parameter types of string."); case SearchParameter.SearchModifierCode.In: throw new FormatException($"The search modifier: {SearchTypeString.Modifier.ToString()} is not supported for search parameter types of string."); case SearchParameter.SearchModifierCode.NotIn: throw new FormatException($"The search modifier: {SearchTypeString.Modifier.ToString()} is not supported for search parameter types of string."); default: throw new System.ComponentModel.InvalidEnumArgumentException(SearchTypeString.Modifier.Value.ToString(), (int)SearchTypeString.Modifier.Value, typeof(Hl7.Fhir.Model.SearchParameter.SearchModifierCode)); } } } } return(NewPredicate); }
public static ExpressionStarter <IResourceIndexed> Build(Search <IResourceIndexed> Search, ExpressionStarter <IResourceIndexed> NewPredicate, SearchParameterBase SearchItem) { if (SearchItem is SearchParameterUri) { var SearchTypeString = SearchItem as SearchParameterUri; foreach (var SearchValue in SearchTypeString.ValueList) { if (!SearchTypeString.Modifier.HasValue) { NewPredicate = NewPredicate.Or(Search.UriCollectionAnyEqualTo(SearchTypeString.Id, SearchValue.Value.OriginalString.StripHttp().ToLower())); } else { switch (SearchTypeString.Modifier) { case SearchParameter.SearchModifierCode.Missing: if (SearchValue.IsMissing) { NewPredicate = NewPredicate.Or(Search.SearchParameterIsNull <Index.IUriIndex>(SearchTypeString.Id)); } else { NewPredicate = NewPredicate.Or(Search.SearchParameterIdIsNotNull <Index.IUriIndex>(SearchTypeString.Id)); } break; case SearchParameter.SearchModifierCode.Exact: NewPredicate = NewPredicate.Or(Search.UriCollectionAnyEqualTo(SearchTypeString.Id, SearchValue.Value.OriginalString.StripHttp().ToLower())); break; case SearchParameter.SearchModifierCode.Contains: NewPredicate = NewPredicate.Or(Search.UriCollectionAnyContains(SearchTypeString.Id, SearchValue.Value.OriginalString.StripHttp().ToLower())); break; case SearchParameter.SearchModifierCode.Text: throw new FormatException($"The search modifier: {SearchTypeString.Modifier.ToString()} is not supported for search parameter types of string."); case SearchParameter.SearchModifierCode.Type: throw new FormatException($"The search modifier: {SearchTypeString.Modifier.ToString()} is not supported for search parameter types of string."); case SearchParameter.SearchModifierCode.Below: NewPredicate = NewPredicate.Or(Search.UriCollectionAnyStartsWith(SearchTypeString.Id, SearchValue.Value.OriginalString.StripHttp().ToLower())); break; case SearchParameter.SearchModifierCode.Above: NewPredicate = NewPredicate.Or(Search.UriCollectionAnyEndsWith(SearchTypeString.Id, SearchValue.Value.OriginalString.StripHttp().ToLower())); break; case SearchParameter.SearchModifierCode.In: throw new FormatException($"The search modifier: {SearchTypeString.Modifier.ToString()} is not supported for search parameter types of string."); case SearchParameter.SearchModifierCode.NotIn: throw new FormatException($"The search modifier: {SearchTypeString.Modifier.ToString()} is not supported for search parameter types of string."); default: throw new System.ComponentModel.InvalidEnumArgumentException(SearchTypeString.Modifier.ToString(), (int)SearchTypeString.Modifier, typeof(SearchParameter.SearchModifierCode)); } } } } return(NewPredicate); }
public static ExpressionStarter <IResourceIndexed> Build(Search <IResourceIndexed> Search, ExpressionStarter <IResourceIndexed> NewPredicate, SearchParameterBase SearchItem) { if (SearchItem is SearchParameterDateTime) { var SearchTypeDateTime = SearchItem as SearchParameterDateTime; foreach (var SearchValue in SearchTypeDateTime.ValueList) { if (SearchTypeDateTime.Modifier.HasValue == false) { if (SearchValue.Prefix.HasValue == false) { NewPredicate = CollectionEqualToPredicate(Search, NewPredicate, SearchTypeDateTime, SearchValue); } else { switch (SearchValue.Prefix) { case SearchParameter.SearchComparator.Eq: NewPredicate = CollectionEqualToPredicate(Search, NewPredicate, SearchTypeDateTime, SearchValue); break; case SearchParameter.SearchComparator.Ne: NewPredicate = CollectionNotEqualToPredicate(Search, NewPredicate, SearchTypeDateTime, SearchValue); break; case SearchParameter.SearchComparator.Gt: NewPredicate = NewPredicate.Or(Search.DateTimePeriodCollectionGreaterThan(SearchTypeDateTime.Id, SearchValue.Value, FhirDateTimeSupport.CalculateHighDateTimeForRange(SearchValue.Value, SearchValue.Precision))); break; case SearchParameter.SearchComparator.Lt: NewPredicate = NewPredicate.Or(Search.DateTimePeriodCollectionLessThan(SearchTypeDateTime.Id, SearchValue.Value, FhirDateTimeSupport.CalculateHighDateTimeForRange(SearchValue.Value, SearchValue.Precision))); break; case SearchParameter.SearchComparator.Ge: NewPredicate = NewPredicate.Or(Search.DateTimePeriodCollectionGreaterThanOrEqualTo(SearchTypeDateTime.Id, SearchValue.Value, FhirDateTimeSupport.CalculateHighDateTimeForRange(SearchValue.Value, SearchValue.Precision))); break; case SearchParameter.SearchComparator.Le: NewPredicate = NewPredicate.Or(Search.DateTimePeriodCollectionLessThanOrEqualTo(SearchTypeDateTime.Id, SearchValue.Value, FhirDateTimeSupport.CalculateHighDateTimeForRange(SearchValue.Value, SearchValue.Precision))); break; case SearchParameter.SearchComparator.Sa: throw new FormatException($"The search prefix: {SearchValue.Prefix.ToString()} is not supported for search parameter types of FhirDateTime."); case SearchParameter.SearchComparator.Eb: throw new FormatException($"The search prefix: {SearchValue.Prefix.ToString()} is not supported for search parameter types of FhirDateTime."); case SearchParameter.SearchComparator.Ap: throw new FormatException($"The search prefix: {SearchValue.Prefix.ToString()} is not supported for search parameter types of FhirDateTime."); default: throw new System.ComponentModel.InvalidEnumArgumentException(SearchValue.Prefix.Value.GetLiteral(), (int)SearchValue.Prefix, typeof(SearchParameter.SearchComparator)); } } } else { switch (SearchTypeDateTime.Modifier.Value) { case SearchParameter.SearchModifierCode.Missing: if (SearchValue.Prefix.HasValue == false) { if (SearchValue.IsMissing) { NewPredicate = NewPredicate.Or(Search.SearchParameterIsNull <Index.IDateTimeIndex>(SearchTypeDateTime.Id)); } else { NewPredicate = NewPredicate.Or(Search.SearchParameterIdIsNotNull <Index.IDateTimeIndex>(SearchTypeDateTime.Id)); } } else { switch (SearchValue.Prefix) { case SearchParameter.SearchComparator.Eq: throw new FormatException($"The search prefix: {SearchValue.Prefix.ToString()} is not supported for search parameter types of FhirDateTime with a Modifier of: {SearchTypeDateTime.Modifier.ToString()}."); case SearchParameter.SearchComparator.Ne: throw new FormatException($"The search prefix: {SearchValue.Prefix.ToString()} is not supported for search parameter types of FhirDateTime with a Modifier of: {SearchTypeDateTime.Modifier.ToString()}."); case SearchParameter.SearchComparator.Gt: throw new FormatException($"The search prefix: {SearchValue.Prefix.ToString()} is not supported for search parameter types of FhirDateTime with a Modifier of: {SearchTypeDateTime.Modifier.ToString()}."); case SearchParameter.SearchComparator.Lt: throw new FormatException($"The search prefix: {SearchValue.Prefix.ToString()} is not supported for search parameter types of FhirDateTime with a Modifier of: {SearchTypeDateTime.Modifier.ToString()}."); case SearchParameter.SearchComparator.Ge: throw new FormatException($"The search prefix: {SearchValue.Prefix.ToString()} is not supported for search parameter types of FhirDateTime with a Modifier of: {SearchTypeDateTime.Modifier.ToString()}."); case SearchParameter.SearchComparator.Le: throw new FormatException($"The search prefix: {SearchValue.Prefix.ToString()} is not supported for search parameter types of FhirDateTime with a Modifier of: {SearchTypeDateTime.Modifier.ToString()}."); case SearchParameter.SearchComparator.Sa: throw new FormatException($"The search prefix: {SearchValue.Prefix.ToString()} is not supported for search parameter types of FhirDateTime with a Modifier of: {SearchTypeDateTime.Modifier.ToString()}."); case SearchParameter.SearchComparator.Eb: throw new FormatException($"The search prefix: {SearchValue.Prefix.ToString()} is not supported for search parameter types of FhirDateTime with a Modifier of: {SearchTypeDateTime.Modifier.ToString()}."); case SearchParameter.SearchComparator.Ap: throw new FormatException($"The search prefix: {SearchValue.Prefix.ToString()} is not supported for search parameter types of FhirDateTime with a Modifier of: {SearchTypeDateTime.Modifier.ToString()}."); default: throw new System.ComponentModel.InvalidEnumArgumentException(SearchValue.Prefix.Value.GetLiteral(), (int)SearchValue.Prefix, typeof(SearchParameter.SearchComparator)); } //break; } break; case SearchParameter.SearchModifierCode.Exact: throw new FormatException($"The search modifier: {SearchTypeDateTime.Modifier.ToString()} is not supported for search parameter types of date."); case SearchParameter.SearchModifierCode.Contains: throw new FormatException($"The search modifier: {SearchTypeDateTime.Modifier.ToString()} is not supported for search parameter types of date."); case SearchParameter.SearchModifierCode.Text: throw new FormatException($"The search modifier: {SearchTypeDateTime.Modifier.ToString()} is not supported for search parameter types of date."); case SearchParameter.SearchModifierCode.Type: throw new FormatException($"The search modifier: {SearchTypeDateTime.Modifier.ToString()} is not supported for search parameter types of date."); case SearchParameter.SearchModifierCode.Below: throw new FormatException($"The search modifier: {SearchTypeDateTime.Modifier.ToString()} is not supported for search parameter types of date."); case SearchParameter.SearchModifierCode.Above: throw new FormatException($"The search modifier: {SearchTypeDateTime.Modifier.ToString()} is not supported for search parameter types of date."); case SearchParameter.SearchModifierCode.In: throw new FormatException($"The search modifier: {SearchTypeDateTime.Modifier.ToString()} is not supported for search parameter types of date."); case SearchParameter.SearchModifierCode.NotIn: throw new FormatException($"The search modifier: {SearchTypeDateTime.Modifier.ToString()} is not supported for search parameter types of date."); default: throw new System.ComponentModel.InvalidEnumArgumentException(SearchTypeDateTime.Modifier.Value.GetLiteral(), (int)SearchTypeDateTime.Modifier, typeof(SearchParameter.SearchModifierCode)); } } } } return(NewPredicate); }
public static ExpressionStarter <ResCurrentType> Build(ResourceSearchExpressionTrees <ResCurrentType, ResIndexStringType, ResIndexTokenType, ResIndexUriType, ResIndexReferenceType, ResIndexQuantityType, ResIndexDateTimeType> Search, ExpressionStarter <ResCurrentType> NewPredicate, SearchParameterBase SearchItem, IDtoRootUrlStore PrimaryRootUrlStore) { if (SearchItem is SearchParameterReferance SearchTypeReference) { //Improved Query when searching for FhirIds for the same Resource type and search parameter yet different FhirIds. //It creates a SQL 'IN' cause instead of many 'OR' statements and should be more efficient. //Heavily used in chain searching where we traverse many References. //The 'Type' modifier is already resolved when the search parameter is parsed, so the SearchValue.FhirRequestUri.ResourseName is the correct Resource name at this stage if (SearchTypeReference.ValueList.Count > 1 && SearchTypeReference.ValueList.TrueForAll(x => x.FhirRequestUri.IsRelativeToServer && x.FhirRequestUri.ResourseName == SearchTypeReference.ValueList[0].FhirRequestUri.ResourseName && string.IsNullOrWhiteSpace(x.FhirRequestUri.VersionId))) { string[] ReferenceFhirIdArray = SearchTypeReference.ValueList.Select(x => x.FhirRequestUri.ResourceId).ToArray(); NewPredicate = NewPredicate.Or(Search.ReferanceCollectionAnyEqualTo_ByKey_Many_FhirIds(SearchTypeReference.Id, PrimaryRootUrlStore.Id, SearchTypeReference.ValueList[0].FhirRequestUri.ResourseName, ReferenceFhirIdArray, SearchTypeReference.ValueList[0].FhirRequestUri.VersionId)); return(NewPredicate); } foreach (var SearchValue in SearchTypeReference.ValueList) { if (!SearchTypeReference.Modifier.HasValue) { if (IsServiceUrlPrimary(PrimaryRootUrlStore, SearchValue)) { NewPredicate = NewPredicate.Or(Search.ReferanceCollectionAnyEqualTo_ByKey(SearchTypeReference.Id, PrimaryRootUrlStore.Id, SearchValue.FhirRequestUri.ResourseName, SearchValue.FhirRequestUri.ResourceId, SearchValue.FhirRequestUri.VersionId)); } else { NewPredicate = NewPredicate.Or(Search.ReferanceCollectionAnyEqualTo_ByUrlString(SearchTypeReference.Id, SearchValue.FhirRequestUri.UriPrimaryServiceRoot.OriginalString.StripHttp().ToLower(), SearchValue.FhirRequestUri.ResourseName, SearchValue.FhirRequestUri.ResourceId, SearchValue.FhirRequestUri.VersionId)); } } else { switch (SearchTypeReference.Modifier) { case SearchParameter.SearchModifierCode.Missing: if (SearchValue.IsMissing) { NewPredicate = NewPredicate.Or(Search.ReferanceCollectionIsNull(SearchTypeReference.Id)); } else { NewPredicate = NewPredicate.Or(Search.ReferanceCollectionIsNotNull(SearchTypeReference.Id)); } break; case SearchParameter.SearchModifierCode.Exact: throw new FormatException($"The search modifier: {SearchTypeReference.Modifier.ToString()} is not supported for search parameter types of Reference."); case SearchParameter.SearchModifierCode.Contains: throw new FormatException($"The search modifier: {SearchTypeReference.Modifier.ToString()} is not supported for search parameter types of Reference."); case SearchParameter.SearchModifierCode.Text: throw new FormatException($"The search modifier: {SearchTypeReference.Modifier.ToString()} is not supported for search parameter types of Reference."); case SearchParameter.SearchModifierCode.Type: //The 'Type' modifier is already resolved when the search parameter is parsed, so the SearchValue.FhirRequestUri.ResourseName is the correct Resource name at this stage if (IsServiceUrlPrimary(PrimaryRootUrlStore, SearchValue)) { NewPredicate = NewPredicate.Or(Search.ReferanceCollectionAnyEqualTo_ByKey(SearchTypeReference.Id, PrimaryRootUrlStore.Id, SearchValue.FhirRequestUri.ResourseName, SearchValue.FhirRequestUri.ResourceId, SearchValue.FhirRequestUri.VersionId)); } else { NewPredicate = NewPredicate.Or(Search.ReferanceCollectionAnyEqualTo_ByUrlString(SearchTypeReference.Id, SearchValue.FhirRequestUri.UriPrimaryServiceRoot.OriginalString.StripHttp().ToLower(), SearchValue.FhirRequestUri.ResourseName, SearchValue.FhirRequestUri.ResourceId, SearchValue.FhirRequestUri.VersionId)); } break; case SearchParameter.SearchModifierCode.Below: throw new FormatException($"The search modifier: {SearchTypeReference.Modifier.ToString()} is not supported for search parameter types of Reference."); case SearchParameter.SearchModifierCode.Above: throw new FormatException($"The search modifier: {SearchTypeReference.Modifier.ToString()} is not supported for search parameter types of Reference."); case SearchParameter.SearchModifierCode.In: throw new FormatException($"The search modifier: {SearchTypeReference.Modifier.ToString()} is not supported for search parameter types of Reference."); case SearchParameter.SearchModifierCode.NotIn: throw new FormatException($"The search modifier: {SearchTypeReference.Modifier.ToString()} is not supported for search parameter types of Reference."); default: throw new System.ComponentModel.InvalidEnumArgumentException(SearchTypeReference.Modifier.ToString(), (int)SearchTypeReference.Modifier, typeof(SearchParameter.SearchModifierCode)); } } } } return(NewPredicate); }
protected ExpressionStarter <ResCurrentType> PredicateSearchParameter < ResCurrentType, ResIndexStringType, ResIndexTokenType, ResIndexUriType, ResIndexReferenceType, ResIndexQuantityType, ResIndexDateTimeType>(SearchParameterBase SearchItem) where ResCurrentType : ResourceCurrentBase <ResCurrentType, ResIndexStringType, ResIndexTokenType, ResIndexUriType, ResIndexReferenceType, ResIndexQuantityType, ResIndexDateTimeType> where ResIndexStringType : ResourceIndexString <ResCurrentType, ResIndexStringType, ResIndexTokenType, ResIndexUriType, ResIndexReferenceType, ResIndexQuantityType, ResIndexDateTimeType> where ResIndexTokenType : ResourceIndexToken <ResCurrentType, ResIndexStringType, ResIndexTokenType, ResIndexUriType, ResIndexReferenceType, ResIndexQuantityType, ResIndexDateTimeType> where ResIndexUriType : ResourceIndexUri <ResCurrentType, ResIndexStringType, ResIndexTokenType, ResIndexUriType, ResIndexReferenceType, ResIndexQuantityType, ResIndexDateTimeType>, new() where ResIndexReferenceType : ResourceIndexReference <ResCurrentType, ResIndexStringType, ResIndexTokenType, ResIndexUriType, ResIndexReferenceType, ResIndexQuantityType, ResIndexDateTimeType> where ResIndexQuantityType : ResourceIndexQuantity <ResCurrentType, ResIndexStringType, ResIndexTokenType, ResIndexUriType, ResIndexReferenceType, ResIndexQuantityType, ResIndexDateTimeType> where ResIndexDateTimeType : ResourceIndexDateTime <ResCurrentType, ResIndexStringType, ResIndexTokenType, ResIndexUriType, ResIndexReferenceType, ResIndexQuantityType, ResIndexDateTimeType> { var Search = new ResourceSearch <ResCurrentType, ResIndexStringType, ResIndexTokenType, ResIndexUriType, ResIndexReferenceType, ResIndexQuantityType, ResIndexDateTimeType>(); ExpressionStarter <ResCurrentType> Predicate = LinqKit.PredicateBuilder.New <ResCurrentType>(); switch (SearchItem.Type) { case SearchParamType.Date: Predicate = DateTimePeriodPredicateBuilder <ResCurrentType, ResIndexStringType, ResIndexTokenType, ResIndexUriType, ResIndexReferenceType, ResIndexQuantityType, ResIndexDateTimeType> .Build(Search, Predicate, SearchItem); break; case SearchParamType.Number: { if (SearchItem is SearchParameterNumber) { var SearchTypeNumber = SearchItem as SearchParameterNumber; foreach (var SearchValue in SearchTypeNumber.ValueList) { if (SearchTypeNumber.Name != "page") { //ToDo: more needed here } } } Predicate = NumberPredicateBuilder <ResCurrentType, ResIndexStringType, ResIndexTokenType, ResIndexUriType, ResIndexReferenceType, ResIndexQuantityType, ResIndexDateTimeType> .Build(Search, Predicate, SearchItem); } break; case SearchParamType.Quantity: Predicate = QuantityPredicateBuilder <ResCurrentType, ResIndexStringType, ResIndexTokenType, ResIndexUriType, ResIndexReferenceType, ResIndexQuantityType, ResIndexDateTimeType> .Build(Search, Predicate, SearchItem); break; case SearchParamType.Reference: Predicate = ReferancePredicateBuilder <ResCurrentType, ResIndexStringType, ResIndexTokenType, ResIndexUriType, ResIndexReferenceType, ResIndexQuantityType, ResIndexDateTimeType> .Build(Search, Predicate, SearchItem, IPrimaryServiceRootCache.GetPrimaryRootUrlFromDatabase()); break; case SearchParamType.String: Predicate = StringPredicateBuilder <ResCurrentType, ResIndexStringType, ResIndexTokenType, ResIndexUriType, ResIndexReferenceType, ResIndexQuantityType, ResIndexDateTimeType> .Build(Search, Predicate, SearchItem); break; case SearchParamType.Token: Predicate = TokenPredicateBuilder <ResCurrentType, ResIndexStringType, ResIndexTokenType, ResIndexUriType, ResIndexReferenceType, ResIndexQuantityType, ResIndexDateTimeType> .Build(Search, Predicate, SearchItem); break; case SearchParamType.Uri: Predicate = UriPredicateBuilder <ResCurrentType, ResIndexStringType, ResIndexTokenType, ResIndexUriType, ResIndexReferenceType, ResIndexQuantityType, ResIndexDateTimeType> .Build(Search, Predicate, SearchItem); break; default: throw new System.ComponentModel.InvalidEnumArgumentException(SearchItem.Type.ToString(), (int)SearchItem.Type, typeof(SearchParamType)); } return(Predicate); }
public static ExpressionStarter <IResourceIndexed> Build(Search <IResourceIndexed> Search, ExpressionStarter <IResourceIndexed> NewPredicate, SearchParameterBase SearchItem) { if (SearchItem is SearchParameterToken) { var SearchTypeToken = SearchItem as SearchParameterToken; foreach (var SearchValue in SearchTypeToken.ValueList) { if (!SearchTypeToken.Modifier.HasValue) { NewPredicate = CollectionEqualToPredicate(Search, NewPredicate, SearchTypeToken, SearchValue); } else { switch (SearchTypeToken.Modifier) { case SearchParameter.SearchModifierCode.Missing: if (SearchValue.IsMissing) { NewPredicate = NewPredicate.Or(Search.SearchParameterIsNull <Index.ITokenIndex>(SearchTypeToken.Id)); } else { NewPredicate = NewPredicate.Or(Search.SearchParameterIdIsNotNull <Index.ITokenIndex>(SearchTypeToken.Id)); } break; case SearchParameter.SearchModifierCode.Exact: throw new FormatException($"The search modifier: {SearchTypeToken.Modifier.ToString()} is not supported for search parameter types of Token."); case SearchParameter.SearchModifierCode.Contains: throw new FormatException($"The search modifier: {SearchTypeToken.Modifier.ToString()} is not supported for search parameter types of Token."); case SearchParameter.SearchModifierCode.Text: throw new FormatException($"The search modifier: {SearchTypeToken.Modifier.ToString()} is not supported for search parameter types of Token."); case SearchParameter.SearchModifierCode.Type: throw new FormatException($"The search modifier: {SearchTypeToken.Modifier.ToString()} is not supported for search parameter types of Token."); case SearchParameter.SearchModifierCode.Below: throw new FormatException($"The search modifier: {SearchTypeToken.Modifier.ToString()} is not supported for search parameter types of Token."); case SearchParameter.SearchModifierCode.Above: throw new FormatException($"The search modifier: {SearchTypeToken.Modifier.ToString()} is not supported for search parameter types of Token."); case SearchParameter.SearchModifierCode.In: throw new FormatException($"The search modifier: {SearchTypeToken.Modifier.ToString()} is not supported for search parameter types of Token."); case SearchParameter.SearchModifierCode.NotIn: throw new FormatException($"The search modifier: {SearchTypeToken.Modifier.ToString()} is not supported for search parameter types of Token."); default: throw new System.ComponentModel.InvalidEnumArgumentException(SearchTypeToken.Modifier.ToString(), (int)SearchTypeToken.Modifier, typeof(SearchParameter.SearchModifierCode)); } } } } return(NewPredicate); }
public IPagedList<UserClient> GetUsersByClientId(SearchParameterBase model) { var search = (UserClientSearchModel)model; var data = _repUserClient.Fetch(m => m.ClientId == search.clientId); if (!string.IsNullOrEmpty(search.keyword)) { data.Where(m => m.UserName.Contains(search.keyword)); } return data.OrderBy(m => m.Id).ToPagedList(search.page,search.limit); }
public ActionResult List(SearchParameterBase search) { //_authorizer.Authorize(Permissions.ManagerClient, "没有权限查看应用列表!"); var data = _clientManager.GetClients(); return View(data.ToPagedList(0,100,data.Count())); }
public ExpressionStarter <ResCurrentType> PredicateSearchParameter(SearchParameterBase SearchItem) { return(_ResourceSearch.PredicateSearchParameter(SearchItem)); }