예제 #1
0
 public SearchQuery(string query = "*")
 {
     query_string = new SearchQueryString(query);
 }
        public List <Expression <Func <IndexString, bool> > > StringIndex(SearchQueryString SearchQueryString)
        {
            //var ResourceStorePredicate = LinqKit.PredicateBuilder.New<ResourceStore>(true);
            var ResultList = new List <Expression <Func <IndexString, bool> > >();

            foreach (SearchQueryStringValue StringValue in SearchQueryString.ValueList)
            {
                var IndexStringPredicate = LinqKit.PredicateBuilder.New <IndexString>(true);
                IndexStringPredicate = IndexStringPredicate.And(IsSearchParameterId(SearchQueryString.Id));

                if (!SearchQueryString.Modifier.HasValue)
                {
                    if (StringValue.Value is null)
                    {
                        throw new ArgumentNullException(nameof(StringValue.Value));
                    }
                    IndexStringPredicate = IndexStringPredicate.And(StartsWithOrEndsWith(StringValue.Value));
                    ResultList.Add(IndexStringPredicate);
                    //ResourceStorePredicate = ResourceStorePredicate.Or(AnyIndex(IndexStringPredicate));
                }
                else
                {
                    var ArrayOfSupportedModifiers = Common.FhirTools.SearchQuery.SearchQuerySupport.GetModifiersForSearchType(SearchQueryString.SearchParamTypeId);
                    if (ArrayOfSupportedModifiers.Contains(SearchQueryString.Modifier.Value))
                    {
                        if (SearchQueryString.Modifier.Value != SearchModifierCode.Missing)
                        {
                            if (StringValue.Value is null)
                            {
                                throw new ArgumentNullException(nameof(StringValue.Value));
                            }
                        }

                        switch (SearchQueryString.Modifier.Value)
                        {
                        case SearchModifierCode.Missing:
                            IndexStringPredicate = IndexStringPredicate.And(IsNotSearchParameterId(SearchQueryString.Id));
                            ResultList.Add(IndexStringPredicate);
                            //ResourceStorePredicate = ResourceStorePredicate.Or(AnyIndexEquals(IndexStringPredicate, !StringValue.IsMissing));
                            break;

                        case SearchModifierCode.Exact:
                            IndexStringPredicate = IndexStringPredicate.And(EqualTo(StringValue.Value !));
                            ResultList.Add(IndexStringPredicate);
                            //ResourceStorePredicate = ResourceStorePredicate.Or(AnyIndex(IndexStringPredicate));
                            break;

                        case SearchModifierCode.Contains:
                            IndexStringPredicate = IndexStringPredicate.And(Contains(StringValue.Value !));
                            ResultList.Add(IndexStringPredicate);
                            //ResourceStorePredicate = ResourceStorePredicate.Or(AnyIndex(IndexStringPredicate));
                            break;

                        default:
                            throw new ApplicationException($"Internal Server Error: The search query modifier: {SearchQueryString.Modifier.Value.GetCode()} has been added to the supported list for {SearchQueryString.SearchParamTypeId.GetCode()} search parameter queries and yet no database predicate has been provided.");
                        }
                    }
                    else
                    {
                        throw new ApplicationException($"Internal Server Error: The search query modifier: {SearchQueryString.Modifier.Value.GetCode()} is not supported for search parameter types of {SearchQueryString.SearchParamTypeId.GetCode()}.");
                    }
                }
            }
            return(ResultList);
        }