/// <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); }
/// <summary> /// Filter the representations and return the result. /// </summary> /// <exception cref="ArgumentNullException">Thrown when representations are null.</exception> /// <param name="representations">Representations to filter.</param> /// <param name="searchParameter">Search parameters.</param> /// <param name="totalNumbers">Total number of records</param> /// <returns>Filtered response</returns> public FilterResult Filter(IEnumerable <Representation> representations, SearchParameter searchParameter, int totalNumbers) { 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) { // 2.1 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; } // 2.2 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; } else { filterResult.Values = result; } filterResult.TotalNumbers = totalNumbers; // 3. Paginate the representations. return(filterResult); }