コード例 #1
0
        /// <summary>
        /// Parse the query and return the search parameters.
        /// </summary>
        /// <exception cref="InvalidOperationException">Thrown when something goes wrong in the operation.</exception>
        /// <param name="query">Query parameters.</param>
        /// <returns>Search parameters.</returns>
        public SearchParameter ParseQuery(IQueryCollection query)
        {
            var result = new SearchParameter();

            if (query == null)
            {
                return(result);
            }

            foreach (var key in query.Keys)
            {
                TrySetEnum((r) => result.Attributes         = r.Select(a => GetFilter(a)), key, Common.Constants.SearchParameterNames.Attributes, query);
                TrySetEnum((r) => result.ExcludedAttributes = r.Select(a => GetFilter(a)), key, Common.Constants.SearchParameterNames.ExcludedAttributes, query);
                TrySetStr((r) => result.Filter     = GetFilter(r), key, Common.Constants.SearchParameterNames.Filter, query);
                TrySetStr((r) => result.SortBy     = GetFilter(r), key, Common.Constants.SearchParameterNames.SortBy, query);
                TrySetStr((r) => result.SortOrder  = GetSortOrder(r), key, Common.Constants.SearchParameterNames.SortOrder, query);
                TrySetInt((r) => result.StartIndex = r <= 0 ? result.StartIndex : r, key, Common.Constants.SearchParameterNames.StartIndex, query);
                TrySetInt((r) => result.Count      = r <= 0 ? result.Count : r, key, Common.Constants.SearchParameterNames.Count, query);
            }

            return(result);
        }
コード例 #2
0
        /// <summary>
        /// Filter the representations and return the result.
        /// </summary>
        /// <exception cref="ArgumentNullException">Thrown when representations are null.</exception>
        /// <param name="representationAttributes">Representations to filter.</param>
        /// <param name="searchParameter">Search parameters.</param>
        /// <returns>Filtered response</returns>
        public FilterResult Filter(
            IEnumerable <Representation> representations,
            SearchParameter searchParameter)
        {
            if (representations == null)
            {
                throw new ArgumentNullException(nameof(representations));
            }

            if (searchParameter == null)
            {
                throw new ArgumentNullException(nameof(searchParameter));
            }

            IEnumerable <string> commonAttrs = new[]
            {
                Common.Constants.MetaResponseNames.ResourceType,
                Common.Constants.MetaResponseNames.Created,
                Common.Constants.MetaResponseNames.LastModified,
                Common.Constants.MetaResponseNames.Version,
                Common.Constants.MetaResponseNames.Location
            };

            var result = new JArray();

            // 1. Sort the representations.
            if (searchParameter.SortBy != null)
            {
                var comparer = new RepresentationComparer(searchParameter.SortBy);
                if (searchParameter.SortOrder == SortOrders.Ascending)
                {
                    representations = representations.OrderBy(repr => repr, comparer);
                }
                else
                {
                    representations = representations.OrderByDescending(repr => repr, comparer);
                }
            }

            // 2. Filter the representations.
            foreach (var representation in representations)
            {
                // 1. Apply filter on the values.
                if (searchParameter.Filter != null)
                {
                    if (!searchParameter.Filter.Evaluate(representation).Any())
                    {
                        continue;
                    }
                }

                // 2. Exclude & include certains attributes.
                IEnumerable <RepresentationAttribute> attributes = null;
                if (searchParameter.ExcludedAttributes != null && searchParameter.ExcludedAttributes.Any())
                {
                    foreach (var excludedAttrFilter in searchParameter.ExcludedAttributes)
                    {
                        var excludedAttrs = excludedAttrFilter.Evaluate(representation);
                        if (excludedAttrs == null)
                        {
                            continue;
                        }

                        foreach (var excludedAttr in excludedAttrs)
                        {
                            var excludedParent = excludedAttr.Parent as ComplexRepresentationAttribute;
                            if (excludedParent == null)
                            {
                                continue;
                            }

                            excludedParent.Values = excludedParent.Values.Where(v => !excludedAttrs.Contains(v));
                        }
                    }
                }

                if (searchParameter.Attributes != null && searchParameter.Attributes.Any())
                {
                    attributes = new List <RepresentationAttribute>();
                    foreach (var attrFilter in searchParameter.Attributes)
                    {
                        attributes = attributes.Concat(attrFilter.Evaluate(representation));
                    }
                }
                else
                {
                    attributes = representation.Attributes;
                }

                if (attributes == null || !attributes.Any())
                {
                    continue;
                }

                // 3. Add all attributes
                var obj = new JObject();
                foreach (JProperty token in attributes.Select(a => (JProperty)GetToken(a, a.SchemaAttribute)))
                {
                    var value = obj[token.Name];
                    if (value != null)
                    {
                        var arr = value as JArray;
                        if (arr != null)
                        {
                            arr.Add(token.Value);
                        }
                        else
                        {
                            obj[token.Name] = new JArray(value, token.Value);
                        }
                    }
                    else
                    {
                        obj.Add(token);
                    }
                }

                result.Add(obj);
            }

            var filterResult = new FilterResult();

            if (result.Count() > searchParameter.Count)
            {
                filterResult.StartIndex   = searchParameter.StartIndex;
                filterResult.ItemsPerPage = searchParameter.Count;
                filterResult.Values       = result.Skip(searchParameter.StartIndex - 1).Take(searchParameter.Count);
            }
            else
            {
                filterResult.Values = result;
            }

            filterResult.TotalNumbers = result.Count();
            // 3. Paginate the representations.
            return(filterResult);
        }