public IEnumerable <IHqlQuery> GetContentQueries(QueryPartRecord queryRecord, IEnumerable <SortCriterionRecord> sortCriteria, Dictionary <string, object> tokens) { var availableFilters = DescribeFilters().ToList(); var availableSortCriteria = DescribeSortCriteria().ToList(); if (tokens == null) { tokens = new Dictionary <string, object>(); } // pre-executing all groups var versionScope = queryRecord.VersionScope; foreach (var group in queryRecord.FilterGroups) { IHqlQuery contentQuery; if (versionScope == QueryVersionScopeOptions.Latest) { contentQuery = _contentManager.HqlQuery().ForVersion(VersionOptions.Latest); } else { contentQuery = _contentManager.HqlQuery().ForVersion(VersionOptions.Published); } // iterate over each filter to apply the alterations to the query object foreach (var filter in group.Filters) { var tokenizedState = _tokenizer.Replace(filter.State, tokens); var filterContext = new FilterContext { Query = contentQuery, State = FormParametersHelper.ToDynamic(tokenizedState), QueryPartRecord = queryRecord }; string category = filter.Category; string type = filter.Type; // look for the specific filter component var descriptor = availableFilters .SelectMany(x => x.Descriptors) .FirstOrDefault(x => x.Category == category && x.Type == type); // ignore unfound descriptors if (descriptor == null) { continue; } // apply alteration descriptor.Filter(filterContext); contentQuery = filterContext.Query; } // iterate over each sort criteria to apply the alterations to the query object foreach (var sortCriterion in sortCriteria.OrderBy(s => s.Position)) { var sortCriterionContext = new SortCriterionContext { Query = contentQuery, State = FormParametersHelper.ToDynamic(sortCriterion.State), QueryPartRecord = queryRecord }; string category = sortCriterion.Category; string type = sortCriterion.Type; // look for the specific filter component var descriptor = availableSortCriteria .SelectMany(x => x.Descriptors) .FirstOrDefault(x => x.Category == category && x.Type == type); // ignore unfound descriptors if (descriptor == null) { continue; } // apply alteration descriptor.Sort(sortCriterionContext); contentQuery = sortCriterionContext.Query; } yield return(contentQuery); } }
public IEnumerable <ContentItem> GetContentItems(int queryId, ContentPart part, int skip = 0, int count = 0) { var availableSortCriteria = DescribeSortCriteria().ToList(); var queryRecord = _queryRepository.Get(queryId); if (queryRecord == null) { throw new ArgumentException("queryId"); } var contentItems = new List <ContentItem>(); // prepares tokens Dictionary <string, object> tokens = new Dictionary <string, object>(); if (part != null) { tokens.Add("Content", part.ContentItem); } // aggregate the result for each group query foreach (var contentQuery in GetContentQueries(queryRecord, queryRecord.SortCriteria.OrderBy(sc => sc.Position), tokens)) { contentItems.AddRange(contentQuery.Slice(skip, count)); } if (queryRecord.FilterGroups.Count <= 1) { return(contentItems); } // re-executing the sorting with the cumulated groups var ids = contentItems.Select(c => c.Id).ToArray(); if (ids.Length == 0) { return(Enumerable.Empty <ContentItem>()); } var groupQuery = _contentManager.HqlQuery().Where(alias => alias.Named("ci"), x => x.InG("Id", ids)); // iterate over each sort criteria to apply the alterations to the query object foreach (var sortCriterion in queryRecord.SortCriteria.OrderBy(s => s.Position)) { var sortCriterionContext = new SortCriterionContext { Query = groupQuery, State = FormParametersHelper.ToDynamic(sortCriterion.State), QueryPartRecord = queryRecord }; string category = sortCriterion.Category; string type = sortCriterion.Type; // look for the specific filter component var descriptor = availableSortCriteria.SelectMany(x => x.Descriptors).FirstOrDefault(x => x.Category == category && x.Type == type); // ignore unfound descriptors if (descriptor == null) { continue; } // apply alteration descriptor.Sort(sortCriterionContext); groupQuery = sortCriterionContext.Query; } return(groupQuery.Slice(skip, count)); }