示例#1
0
        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);
            }
        }
示例#2
0
        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));
        }