示例#1
0
        public DynamicContentItem[] EvaluateItems(IEvaluationContext context)
        {
            var dynamicContext = context as DynamicContentEvaluationContext;

            if (dynamicContext == null)
            {
                throw new ArgumentException("The context must be a DynamicContentEvaluationContext.");
            }
            if (dynamicContext.ToDate == default(DateTime))
            {
                dynamicContext.ToDate = DateTime.UtcNow;
            }
            var retVal = new List <DynamicContentItem>();

            using (var repository = _repositoryFactory())
            {
                var publishings = repository.PublishingGroups.Include(x => x.ContentItems)
                                  .Where(x => x.IsActive)
                                  .Where(x => x.StoreId == dynamicContext.StoreId)
                                  .Where(x => (x.StartDate == null || dynamicContext.ToDate >= x.StartDate) && (x.EndDate == null || x.EndDate >= dynamicContext.ToDate))
                                  .Where(x => x.ContentPlaces.Any(y => y.ContentPlace.Name == dynamicContext.PlaceName))
                                  .OrderBy(x => x.Priority)
                                  .ToArray();

                //Get content items ids for publishings without ConditionExpression
                var contentItemIds = publishings.Where(x => x.ConditionExpression == null)
                                     .SelectMany(x => x.ContentItems)
                                     .Select(x => x.DynamicContentItemId)
                                     .ToList();
                foreach (var publishing in publishings.Where(x => x.ConditionExpression != null))
                {
                    try
                    {
                        //Next step need filter assignments contains dynamicexpression
                        var condition = _expressionSerializer.DeserializeExpression <Func <IEvaluationContext, bool> >(publishing.ConditionExpression);
                        if (condition(context))
                        {
                            contentItemIds.AddRange(publishing.ContentItems.Select(x => x.DynamicContentItemId));
                        }
                    }
                    catch (Exception ex)
                    {
                        _logger.Error(ex);
                    }
                }

                retVal.AddRange(_dynamicContentService.GetContentItemsByIds(contentItemIds.ToArray()));
            }

            return(retVal.ToArray());
        }
示例#2
0
        /// <summary>
        /// Evaluate pricelists for special context. All resulting pricelists ordered by priority
        /// </summary>
        /// <param name="evalContext"></param>
        /// <returns></returns>
        public virtual IEnumerable <coreModel.Pricelist> EvaluatePriceLists(coreModel.PriceEvaluationContext evalContext)
        {
            coreModel.PricelistAssignment[] assignmentsGetters()
            {
                var allAssignments = GetAllPricelistAssignments();

                foreach (var assignment in allAssignments.Where(x => !string.IsNullOrEmpty(x.ConditionExpression)))
                {
                    try
                    {
                        //Deserialize conditions
                        assignment.Condition = _expressionSerializer.DeserializeExpression <Func <IEvaluationContext, bool> >(assignment.ConditionExpression);
                    }
                    catch (Exception ex)
                    {
                        _logger.Error(ex);
                    }
                }
                return(allAssignments);
            }

            IQueryable <coreModel.PricelistAssignment> query = null;

            if (_cacheManager != null)
            {
                query = _cacheManager.Get("PricingServiceImpl.EvaluatePriceLists", "PricingModuleRegion", assignmentsGetters).AsQueryable();
            }
            else
            {
                query = assignmentsGetters().AsQueryable();
            }

            if (evalContext.CatalogId != null)
            {
                //filter by catalog
                query = query.Where(x => x.CatalogId == evalContext.CatalogId);
            }

            if (evalContext.Currency != null)
            {
                //filter by currency
                query = query.Where(x => x.Pricelist.Currency == evalContext.Currency.ToString());
            }

            if (evalContext.CertainDate != null)
            {
                //filter by date expiration
                query = query.Where(x => (x.StartDate == null || evalContext.CertainDate >= x.StartDate) && (x.EndDate == null || x.EndDate > evalContext.CertainDate));
            }

            var assignments         = query.ToArray();
            var assignmentsToReturn = assignments.Where(x => x.Condition == null).ToList();

            foreach (var assignment in assignments.Where(x => x.Condition != null))
            {
                try
                {
                    if (assignment.Condition(evalContext))
                    {
                        if (assignmentsToReturn.All(x => x.PricelistId != assignment.PricelistId))
                        {
                            assignmentsToReturn.Add(assignment);
                        }
                    }
                }
                catch (Exception ex)
                {
                    _logger.Error(ex);
                }
            }

            return(assignmentsToReturn.OrderByDescending(x => x.Priority).ThenByDescending(x => x.Name).Select(x => x.Pricelist));
        }