示例#1
0
        protected override object DoExecute(CommerceDataSourceContext context, ParsedGenericCommerceDataSourceSettings settings)
        {
            var cartId = 0;
            var user   = context.HttpContext.GetMembershipUser();

            if (user == null)
            {
                var sessionIdProvider = EngineContext.Current.Resolve <IShoppingCartSessionIdProvider>();
                cartId = context.Site.Commerce().ShoppingCarts.GetCartIdBySessionId(sessionIdProvider.GetCurrentSessionId(true));
            }
            else
            {
                cartId = context.Site.Commerce().ShoppingCarts.GetCartIdByCustomer(user.Email);
            }

            var query = context.Site.Commerce().ShoppingCarts.Query().ById(cartId);

            if (settings.Includes != null && settings.Includes.Count > 0)
            {
                foreach (var path in settings.Includes)
                {
                    query.Include(path);
                }
            }

            return(query.FirstOrDefault());
        }
示例#2
0
        private IRecommendationEngine GetRecommendationEngine(CommerceDataSourceContext context, ParsedGenericCommerceDataSourceSettings settings, out ISet <string> toIgnoreItems)
        {
            var filter = settings.Filters.Find(f => f.Name == "ByProduct");

            if (filter != null)
            {
                var productId = (int)filter.GetParameterValue("ProductId");

                toIgnoreItems = new HashSet <string> {
                    productId.ToString()
                };

                return(new FeatureBasedRecommendationEngine(new[] { new Feature(productId.ToString()) }, RelatedItemsProviders.GetProviders(context.Instance)));
            }
            else
            {
                toIgnoreItems = new HashSet <string>();

                foreach (var behaviorType in BehaviorTypes.All())
                {
                    var store = BehaviorStores.Get(context.Instance, behaviorType);
                    foreach (var itemId in store.GetItemsUserHadBehaviorsOn(context.HttpContext.EnsureVisitorUniqueId(), 10000))
                    {
                        toIgnoreItems.Add(itemId);
                    }
                }

                return(RecommendationEngines.GetEngines(context.Instance));
            }
        }
        protected override object DoExecute(CommerceDataSourceContext context, ParsedGenericCommerceDataSourceSettings settings)
        {
            var cartId = 0;
            var user = context.HttpContext.GetMembershipUser();
            if (user == null)
            {
                var sessionIdProvider = EngineContext.Current.Resolve<IShoppingCartSessionIdProvider>();
                cartId = context.Site.Commerce().ShoppingCarts.GetCartIdBySessionId(sessionIdProvider.GetCurrentSessionId(true));
            }
            else
            {
                cartId = context.Site.Commerce().ShoppingCarts.GetCartIdByCustomer(user.Email);
            }

            var query = context.Site.Commerce().ShoppingCarts.Query().ById(cartId);

            if (settings.Includes != null && settings.Includes.Count > 0)
            {
                foreach (var path in settings.Includes)
                {
                    query.Include(path);
                }
            }

            return query.FirstOrDefault();
        }
示例#4
0
        public ParsedFilter Parse(FilterDescription definition, CommerceDataSourceContext context)
        {
            var paramValues = new Dictionary <string, object>(StringComparer.OrdinalIgnoreCase);

            foreach (var paramDef in definition.Parameters)
            {
                var param = ParameterValues.Find(p => p.ParameterName.Equals(paramDef.Name, StringComparison.OrdinalIgnoreCase));

                // Parameter is required but it's missing in data source settings (might cause by code changes). Parse failed.
                if (paramDef.Required && param == null)
                {
                    return(null);
                }

                var strParamValue = ParameterizedFieldValue.GetFieldValue(param.ParameterValue, context.ValueProvider);
                // Parameter is required but it's missing in current context. Parse failed.
                if (paramDef.Required && strParamValue == null)
                {
                    return(null);
                }

                var paramValue = StringConvert.ToObject(strParamValue, paramDef.ValueType);
                paramValues.Add(paramDef.Name, paramValue);
            }

            return(new ParsedFilter(definition.Name)
            {
                ParameterValues = paramValues
            });
        }
        protected override object DoExecute(CommerceDataSourceContext context, ParsedGenericCommerceDataSourceSettings settings)
        {
            int? currentCategoryId = null;

            var productFilter = settings.Filters.Find(f => f.Name == "ByCurrentProduct");
            if (productFilter != null)
            {
                var productId = (int)productFilter.ParameterValues["CurrentProductId"];
                var product = context.Site.Commerce().Products.Query().ById(productId).Include(p => p.Categories).FirstOrDefault();
                if (product != null)
                {
                    var category = product.Categories.FirstOrDefault();
                    if (category != null)
                    {
                        currentCategoryId = category.Id;
                    }
                }
            }

            if (currentCategoryId == null)
            {
                var categoryFilter = settings.Filters.Find(f => f.Name == "ByCurrentCategory");
                if (categoryFilter != null)
                {
                    currentCategoryId = (int)categoryFilter.ParameterValues["CurrentCategoryId"];
                }
            }

            if (currentCategoryId == null)
            {
                return null;
            }

            return context.Site.Commerce().Categories.Breadcrumb(currentCategoryId.Value);
        }
示例#6
0
        public ParsedFilter Parse(FilterDescription definition, CommerceDataSourceContext context)
        {
            var paramValues = new Dictionary<string, object>(StringComparer.OrdinalIgnoreCase);

            foreach (var paramDef in definition.Parameters)
            {
                var param = ParameterValues.Find(p => p.ParameterName.Equals(paramDef.Name, StringComparison.OrdinalIgnoreCase));

                // Parameter is required but it's missing in data source settings (might cause by code changes). Parse failed.
                if (paramDef.Required && param == null)
                {
                    return null;
                }

                var strParamValue = ParameterizedFieldValue.GetFieldValue(param.ParameterValue, context.ValueProvider);
                // Parameter is required but it's missing in current context. Parse failed.
                if (paramDef.Required && strParamValue == null)
                {
                    return null;
                }

                var paramValue = StringConvert.ToObject(strParamValue, paramDef.ValueType);
                paramValues.Add(paramDef.Name, paramValue);
            }

            return new ParsedFilter(definition.Name)
            {
                ParameterValues = paramValues
            };
        }
示例#7
0
        protected bool TryParseSettings(CommerceDataSourceContext context, out ParsedGenericCommerceDataSourceSettings settings)
        {
            if (Settings == null)
            {
                settings = null;
                return(false);
            }

            settings = new ParsedGenericCommerceDataSourceSettings();

            // Filters
            if (Settings.Filters != null && Settings.Filters.Count > 0)
            {
                foreach (var savedFilter in Settings.Filters)
                {
                    var filterDefinition = Filters.FirstOrDefault(f => f.Name == savedFilter.Name);
                    if (filterDefinition == null)
                    {
                        continue;
                    }

                    var parsedFilter = savedFilter.Parse(filterDefinition, context);
                    if (parsedFilter != null)
                    {
                        settings.Filters.Add(parsedFilter);
                    }
                    else if (savedFilter.Required)
                    {
                        // If filter is required but it's not presented in current context. Parse failed.
                        settings = null;
                        return(false);
                    }
                }
            }

            settings.TakeOperation = Settings.TakeOperation;

            // Pagination
            settings.EnablePaging = Settings.EnablePaging;
            if (settings.EnablePaging)
            {
                settings.PageSize   = context.ResolveFieldValue <int?>(Settings.PageSize, null);
                settings.PageNumber = context.ResolveFieldValue <int?>(Settings.PageNumber, null);
            }

            settings.Top = context.ResolveFieldValue <int?>(Settings.Top, null);

            // Includes
            if (Settings.Includes != null)
            {
                settings.Includes = Settings.Includes.ToList();
            }

            return(true);
        }
示例#8
0
        public object Execute(CommerceDataSourceContext context)
        {
            ParsedGenericCommerceDataSourceSettings settings;

            if (TryParseSettings(context, out settings))
            {
                return(DoExecute(context, settings));
            }

            return(null);
        }
示例#9
0
        private int EvaluatePageSize(CommerceDataSourceContext context)
        {
            var pageSize = ParameterizedFieldValue.GetFieldValue(PageSize, context.ValueProvider);

            if (String.IsNullOrEmpty(pageSize))
            {
                return(60);
            }

            return(Convert.ToInt32(pageSize));
        }
示例#10
0
        private IList <Filter> GetFacetFilters(CommerceDataSourceContext context)
        {
            var facetFilters = new List <Filter>();

            foreach (var facet in Facets)
            {
                // Ignore if the filter is already defined
                if (Filters != null && Filters.Any(f => f.Name == facet.Name))
                {
                    continue;
                }

                var value = context.ValueProvider.GetValue(facet.Name);
                if (value != null && !String.IsNullOrEmpty(value.AttemptedValue))
                {
                    var filterValue = value.AttemptedValue;
                    var filter      = new Filter
                    {
                        Name       = facet.Name,
                        Fields     = facet.Field,
                        FieldValue = filterValue
                    };

                    if (facet.Ranges != null && facet.Ranges.Count > 0)
                    {
                        // If it's a range facet, then try to find range by label.
                        // If nothing was found, then the range label might be empty, so parse it with range syntax.
                        var range = facet.Ranges.FirstOrDefault(r => !String.IsNullOrEmpty(r.Label) && r.Label.Equals(filterValue));
                        if (range == null)
                        {
                            range = FacetRange.Parse(null, filterValue);
                        }

                        filter.UseRangeFiltering = true;
                        filter.FromValue         = range.FromValue.ToString();
                        filter.ToValue           = range.ToValue.ToString();
                        filter.FromInclusive     = range.FromInclusive;
                        filter.ToInclusive       = range.ToInclusive;
                    }

                    facetFilters.Add(filter);
                }
            }

            return(facetFilters);
        }
示例#11
0
        protected override object DoExecute(CommerceDataSourceContext context, ParsedGenericCommerceDataSourceSettings settings)
        {
            var query = Query(context.Site.Commerce());

            // Filters
            query = ApplyFilters(query, settings.Filters, context);

            // Sorting
            if (!String.IsNullOrEmpty(settings.SortField))
            {
                query.Sorts.Add(new Sort(settings.SortField, settings.SortDirection));
            }

            // Includes
            if (settings.Includes != null && settings.Includes.Count > 0)
            {
                foreach (var path in settings.Includes)
                {
                    query.Include(path);
                }
            }

            if (settings.TakeOperation == TakeOperation.First)
            {
                return(query.FirstOrDefault());
            }

            // Pagination
            if (settings.EnablePaging)
            {
                var pageSize   = settings.PageSize.GetValueOrDefault(50);
                var pageNumber = settings.PageNumber.GetValueOrDefault(1);

                query.Skip((pageNumber - 1) * pageSize).Take(pageSize);
            }
            else
            {
                if (settings.Top != null && settings.Top.Value > 0)
                {
                    query.Take(settings.Top.Value);
                }
            }

            return(query.ToList());
        }
示例#12
0
        private int EvaluatePageNumber(CommerceDataSourceContext context)
        {
            var pageNumber = ParameterizedFieldValue.GetFieldValue(PageNumber, context.ValueProvider);

            if (String.IsNullOrEmpty(pageNumber))
            {
                return(1);
            }

            var page = Convert.ToInt32(pageNumber);

            if (page < 1)
            {
                page = 1;
            }

            return(page);
        }
        protected override object DoExecute(CommerceDataSourceContext context, ParsedGenericCommerceDataSourceSettings settings)
        {
            var user = context.HttpContext.GetMembershipUser();
            if (user == null)
            {
                return null;
            }

            var query = context.Site.Commerce().Customers.Query().ByEmail(user.Email);

            if (settings.Includes != null)
            {
                foreach (var include in settings.Includes)
                {
                    query.Include(include);
                }
            }

            return query.FirstOrDefault();
        }
        protected override object DoExecute(CommerceDataSourceContext context, ParsedGenericCommerceDataSourceSettings settings)
        {
            var user = context.HttpContext.GetMembershipUser();

            if (user == null)
            {
                return(null);
            }

            var query = context.Site.Commerce().Customers.Query().ByEmail(user.Email);

            if (settings.Includes != null)
            {
                foreach (var include in settings.Includes)
                {
                    query.Include(include);
                }
            }

            return(query.FirstOrDefault());
        }
示例#15
0
        protected override object DoExecute(CommerceDataSourceContext context, ParsedGenericCommerceDataSourceSettings settings)
        {
            int?currentCategoryId = null;

            var productFilter = settings.Filters.Find(f => f.Name == "ByCurrentProduct");

            if (productFilter != null)
            {
                var productId = (int)productFilter.ParameterValues["CurrentProductId"];
                var product   = context.Site.Commerce().Products.Query().ById(productId).Include(p => p.Categories).FirstOrDefault();
                if (product != null)
                {
                    var category = product.Categories.FirstOrDefault();
                    if (category != null)
                    {
                        currentCategoryId = category.Id;
                    }
                }
            }

            if (currentCategoryId == null)
            {
                var categoryFilter = settings.Filters.Find(f => f.Name == "ByCurrentCategory");
                if (categoryFilter != null)
                {
                    currentCategoryId = (int)categoryFilter.ParameterValues["CurrentCategoryId"];
                }
            }

            if (currentCategoryId == null)
            {
                return(null);
            }

            return(context.Site.Commerce().Categories.Breadcrumb(currentCategoryId.Value));
        }
示例#16
0
 public override IDictionary<string, object> GetDefinitions(CommerceDataSourceContext context)
 {
     return DataSourceDefinitionHelper.GetDefinitions(typeof(Kooboo.Commerce.Api.Products.Product));
 }
示例#17
0
        protected override object DoExecute(CommerceDataSourceContext context, ParsedGenericCommerceDataSourceSettings settings)
        {
            var productIdFilter = settings.Filters.Find(f => f.Name == "ByProduct");

            if (productIdFilter == null)
            {
                return(null);
            }

            var productId = productIdFilter.GetParameterValue("productId");

            if (productId == null)
            {
                return(null);
            }

            var instanceName = context.Site.GetCommerceInstanceName();

            if (String.IsNullOrWhiteSpace(instanceName))
            {
                throw new InvalidOperationException("Commerce instance name is not configured in CMS.");
            }

            using (var instance = _instanceManager.GetInstance(instanceName))
                using (var scope = Scope.Begin(instance))
                {
                    var accessories = ProductAccessoryService().GetAccessories((int)productId);
                    if (!String.IsNullOrEmpty(settings.SortField) && settings.SortField == "Rank")
                    {
                        if (settings.SortDirection == SortDirection.Asc)
                        {
                            accessories = accessories.OrderBy(r => r.Rank).ToList();
                        }
                        else
                        {
                            accessories = accessories.OrderByDescending(r => r.Rank).ToList();
                        }
                    }

                    if (settings.Top != null)
                    {
                        accessories = accessories.Take(settings.Top.Value).ToList();
                    }

                    var accessoryIds = accessories.Select(x => x.ProductId).ToArray();

                    var result = new List <Kooboo.Commerce.Api.Products.Product>();
                    foreach (var id in accessoryIds)
                    {
                        // TODO: should not use resolve, use ApiService instead
                        var model = EngineContext.Current.Resolve <Kooboo.Commerce.Api.Products.IProductApi>()
                                    .Query()
                                    .ById(id)
                                    .Include("PriceList")
                                    .Include("Images")
                                    .Include("Brand")
                                    .FirstOrDefault();
                        if (model != null)
                        {
                            result.Add(model);
                        }
                    }

                    return(result);
                }
        }
示例#18
0
 public override IDictionary <string, object> GetDefinitions(CommerceDataSourceContext context)
 {
     return(DataSourceDefinitionHelper.GetDefinitions(typeof(Kooboo.Commerce.Api.Products.Product)));
 }
示例#19
0
 private List<Filter> ParseFilters(CommerceDataSourceContext context)
 {
     return Filters.Select(f => f.Parse(context.ValueProvider)).ToList();
 }
示例#20
0
 public override IDictionary <string, object> GetDefinitions(CommerceDataSourceContext context)
 {
     return(DataSourceDefinitionHelper.GetDefinitions(typeof(T)));
 }
        private IRecommendationEngine GetRecommendationEngine(CommerceDataSourceContext context, ParsedGenericCommerceDataSourceSettings settings, out ISet<string> toIgnoreItems)
        {
            var filter = settings.Filters.Find(f => f.Name == "ByProduct");
            if (filter != null)
            {
                var productId = (int)filter.GetParameterValue("ProductId");

                toIgnoreItems = new HashSet<string> { productId.ToString() };

                return new FeatureBasedRecommendationEngine(new[] { new Feature(productId.ToString()) }, RelatedItemsProviders.GetProviders(context.Instance));
            }
            else
            {
                toIgnoreItems = new HashSet<string>();

                foreach (var behaviorType in BehaviorTypes.All())
                {
                    var store = BehaviorStores.Get(context.Instance, behaviorType);
                    foreach (var itemId in store.GetItemsUserHadBehaviorsOn(context.HttpContext.EnsureVisitorUniqueId(), 10000))
                    {
                        toIgnoreItems.Add(itemId);
                    }
                }

                return RecommendationEngines.GetEngines(context.Instance);
            }
        }
示例#22
0
        protected override object DoExecute(CommerceDataSourceContext context, ParsedGenericCommerceDataSourceSettings settings)
        {
            var productIdFilter = settings.Filters.Find(f => f.Name == "ByProduct");
            if (productIdFilter == null)
            {
                return null;
            }

            var productId = productIdFilter.GetParameterValue("productId");
            if (productId == null)
            {
                return null;
            }

            var instanceName = context.Site.GetCommerceInstanceName();

            if (String.IsNullOrWhiteSpace(instanceName))
                throw new InvalidOperationException("Commerce instance name is not configured in CMS.");

            using (var instance = _instanceManager.GetInstance(instanceName))
            using (var scope = Scope.Begin(instance))
            {
                var accessories = ProductAccessoryService().GetAccessories((int)productId);
                if (!String.IsNullOrEmpty(settings.SortField) && settings.SortField == "Rank")
                {
                    if (settings.SortDirection == SortDirection.Asc)
                    {
                        accessories = accessories.OrderBy(r => r.Rank).ToList();
                    }
                    else
                    {
                        accessories = accessories.OrderByDescending(r => r.Rank).ToList();
                    }
                }

                if (settings.Top != null)
                {
                    accessories = accessories.Take(settings.Top.Value).ToList();
                }

                var accessoryIds = accessories.Select(x => x.ProductId).ToArray();

                var result = new List<Kooboo.Commerce.Api.Products.Product>();
                foreach (var id in accessoryIds)
                {
                    // TODO: should not use resolve, use ApiService instead
                    var model = EngineContext.Current.Resolve<Kooboo.Commerce.Api.Products.IProductApi>()
                                           .Query()
                                           .ById(id)
                                           .Include("PriceList")
                                           .Include("Images")
                                           .Include("Brand")
                                           .FirstOrDefault();
                    if (model != null)
                    {
                        result.Add(model);
                    }
                }

                return result;
            }
        }
示例#23
0
 protected abstract object DoExecute(CommerceDataSourceContext context, ParsedGenericCommerceDataSourceSettings settings);
        public object Execute(CommerceDataSourceContext context)
        {
            ParsedGenericCommerceDataSourceSettings settings;
            if (TryParseSettings(context, out settings))
            {
                return DoExecute(context, settings);
            }

            return null;
        }
        protected bool TryParseSettings(CommerceDataSourceContext context, out ParsedGenericCommerceDataSourceSettings settings)
        {
            if (Settings == null)
            {
                settings = null;
                return false;
            }

            settings = new ParsedGenericCommerceDataSourceSettings();

            // Filters
            if (Settings.Filters != null && Settings.Filters.Count > 0)
            {
                foreach (var savedFilter in Settings.Filters)
                {
                    var filterDefinition = Filters.FirstOrDefault(f => f.Name == savedFilter.Name);
                    if (filterDefinition == null)
                    {
                        continue;
                    }

                    var parsedFilter = savedFilter.Parse(filterDefinition, context);
                    if (parsedFilter != null)
                    {
                        settings.Filters.Add(parsedFilter);
                    }
                    else if (savedFilter.Required)
                    {
                        // If filter is required but it's not presented in current context. Parse failed.
                        settings = null;
                        return false;
                    }
                }
            }

            settings.TakeOperation = Settings.TakeOperation;

            // Pagination
            settings.EnablePaging = Settings.EnablePaging;
            if (settings.EnablePaging)
            {
                settings.PageSize = context.ResolveFieldValue<int?>(Settings.PageSize, null);
                settings.PageNumber = context.ResolveFieldValue<int?>(Settings.PageNumber, null);
            }

            settings.Top = context.ResolveFieldValue<int?>(Settings.Top, null);

            // Includes
            if (Settings.Includes != null)
            {
                settings.Includes = Settings.Includes.ToList();
            }

            return true;
        }
 protected abstract object DoExecute(CommerceDataSourceContext context, ParsedGenericCommerceDataSourceSettings settings);
示例#27
0
 private List <Filter> ParseFilters(CommerceDataSourceContext context)
 {
     return(Filters.Select(f => f.Parse(context.ValueProvider)).ToList());
 }
示例#28
0
        private int EvaluatePageNumber(CommerceDataSourceContext context)
        {
            var pageNumber = ParameterizedFieldValue.GetFieldValue(PageNumber, context.ValueProvider);
            if (String.IsNullOrEmpty(pageNumber))
            {
                return 1;
            }

            var page = Convert.ToInt32(pageNumber);
            if (page < 1)
            {
                page = 1;
            }

            return page;
        }
示例#29
0
        protected virtual Query <T> ApplyFilters(Query <T> query, IList <ParsedFilter> filters, CommerceDataSourceContext context)
        {
            if (filters == null)
            {
                return(query);
            }

            foreach (var filter in filters)
            {
                query.Filters.Add(new QueryFilter(filter.Name, filter.ParameterValues));
            }

            return(query);
        }
示例#30
0
        public object Execute(CommerceDataSourceContext context)
        {
            var culture = CultureInfo.InvariantCulture;

            if (!String.IsNullOrEmpty(context.Site.Culture))
            {
                var languageStore = LanguageStores.Get(context.Instance);
                if (languageStore.Exists(context.Site.Culture))
                {
                    culture = CultureInfo.GetCultureInfo(context.Site.Culture);
                }
            }

            var store = IndexStores.Get <ProductModel>(context.Instance, culture);
            var query = store.Query();

            // Apply defined filters
            if (Filters != null)
            {
                query = query.ApplyFilters(ParseFilters(context), culture);
            }

            // Apply implicit facet filters repsented in url query
            IList <Filter> facetFilters = null;

            if (IncludeFacets && Facets != null && Facets.Count > 0)
            {
                facetFilters = GetFacetFilters(context);
                if (facetFilters.Count > 0)
                {
                    query = query.ApplyFilters(facetFilters, culture);
                }
            }

            // Apply sorting
            var sortField = ParameterizedFieldValue.GetFieldValue(SortField, context.ValueProvider);

            if (!String.IsNullOrEmpty(sortField))
            {
                query.AddOrderBy(sortField);
            }

            // Execute result
            var result = new ProductSearchResult();

            var pagination = query.Paginate(EvaluatePageNumber(context) - 1, EvaluatePageSize(context));

            result.Total    = pagination.TotalItems;
            result.Products = ToProducts(pagination.Cast <ProductModel>().ToList(), context.Site.Commerce());

            // Get facets
            if (IncludeFacets && Facets != null && Facets.Count > 0)
            {
                result.Facets = query.ToFacets(Facets);

                // Generate facet urls
                var url = HttpContext.Current.Request.RawUrl;

                CategoryTree localizedCategoryTree = null;

                foreach (var facetResult in result.Facets)
                {
                    // Categories are in tree structure, and all level of categories of a product are indexed for seaier search.
                    // If Category facet is not presented in url query, we should only return the ROOT level categories.
                    // If Category facet is presented in url query, we should only return it's children categories.
                    // Otherwise there'll be too many category results.
                    if (facetResult.Field == FacetDefinition.Category.Field)
                    {
                        if (localizedCategoryTree == null)
                        {
                            localizedCategoryTree = CategoryTree.Get(context.Instance).Localize(culture, "Name");
                        }

                        var filter = facetFilters.FirstOrDefault(f => f.Name == FacetDefinition.Category.Name);

                        if (filter != null)
                        {
                            var category = localizedCategoryTree.Desendants().FirstOrDefault(c => c.Name == filter.FieldValue);
                            foreach (var value in facetResult.Values.ToList())
                            {
                                if (!category.Children.Any(c => c.Name == value.Term))
                                {
                                    facetResult.Values.Remove(value);
                                }
                            }
                        }
                        else
                        {
                            foreach (var value in facetResult.Values.ToList())
                            {
                                if (!localizedCategoryTree.Categories.Any(c => c.Name == value.Term))
                                {
                                    facetResult.Values.Remove(value);
                                }
                            }
                        }
                    }

                    foreach (var value in facetResult.Values)
                    {
                        var paramName = facetResult.Name;
                        value.Url = UrlUtility.RemoveQuery(url, paramName);
                        value.Url = UrlUtility.AddQueryParam(value.Url, paramName, value.Term);
                    }
                }
            }

            return(result);
        }
示例#31
0
        private int EvaluatePageSize(CommerceDataSourceContext context)
        {
            var pageSize = ParameterizedFieldValue.GetFieldValue(PageSize, context.ValueProvider);
            if (String.IsNullOrEmpty(pageSize))
            {
                return 60;
            }

            return Convert.ToInt32(pageSize);
        }
示例#32
0
        public object Execute(CommerceDataSourceContext context)
        {
            var culture = CultureInfo.InvariantCulture;

            if (!String.IsNullOrEmpty(context.Site.Culture))
            {
                var languageStore = LanguageStores.Get(context.Instance);
                if (languageStore.Exists(context.Site.Culture))
                {
                    culture = CultureInfo.GetCultureInfo(context.Site.Culture);
                }
            }

            var store = IndexStores.Get<ProductModel>(context.Instance, culture);
            var query = store.Query();

            // Apply defined filters
            if (Filters != null)
            {
                query = query.ApplyFilters(ParseFilters(context), culture);
            }

            // Apply implicit facet filters repsented in url query
            IList<Filter> facetFilters = null;
            if (IncludeFacets && Facets != null && Facets.Count > 0)
            {
                facetFilters = GetFacetFilters(context);
                if (facetFilters.Count > 0)
                {
                    query = query.ApplyFilters(facetFilters, culture);
                }
            }

            // Apply sorting
            var sortField = ParameterizedFieldValue.GetFieldValue(SortField, context.ValueProvider);
            if (!String.IsNullOrEmpty(sortField))
            {
                query.AddOrderBy(sortField);
            }

            // Execute result
            var result = new ProductSearchResult();

            var pagination = query.Paginate(EvaluatePageNumber(context) - 1, EvaluatePageSize(context));

            result.Total = pagination.TotalItems;
            result.Products = ToProducts(pagination.Cast<ProductModel>().ToList(), context.Site.Commerce());

            // Get facets
            if (IncludeFacets && Facets != null && Facets.Count > 0)
            {
                result.Facets = query.ToFacets(Facets);

                // Generate facet urls
                var url = HttpContext.Current.Request.RawUrl;

                CategoryTree localizedCategoryTree = null;

                foreach (var facetResult in result.Facets)
                {
                    // Categories are in tree structure, and all level of categories of a product are indexed for seaier search.
                    // If Category facet is not presented in url query, we should only return the ROOT level categories.
                    // If Category facet is presented in url query, we should only return it's children categories.
                    // Otherwise there'll be too many category results.
                    if (facetResult.Field == FacetDefinition.Category.Field)
                    {
                        if (localizedCategoryTree == null)
                        {
                            localizedCategoryTree = CategoryTree.Get(context.Instance).Localize(culture, "Name");
                        }

                        var filter = facetFilters.FirstOrDefault(f => f.Name == FacetDefinition.Category.Name);

                        if (filter != null)
                        {
                            var category = localizedCategoryTree.Desendants().FirstOrDefault(c => c.Name == filter.FieldValue);
                            foreach (var value in facetResult.Values.ToList())
                            {
                                if (!category.Children.Any(c => c.Name == value.Term))
                                {
                                    facetResult.Values.Remove(value);
                                }
                            }
                        }
                        else
                        {
                            foreach (var value in facetResult.Values.ToList())
                            {
                                if (!localizedCategoryTree.Categories.Any(c => c.Name == value.Term))
                                {
                                    facetResult.Values.Remove(value);
                                }
                            }
                        }
                    }

                    foreach (var value in facetResult.Values)
                    {
                        var paramName = facetResult.Name;
                        value.Url = UrlUtility.RemoveQuery(url, paramName);
                        value.Url = UrlUtility.AddQueryParam(value.Url, paramName, value.Term);
                    }
                }
            }

            return result;
        }
示例#33
0
        private IList<Filter> GetFacetFilters(CommerceDataSourceContext context)
        {
            var facetFilters = new List<Filter>();
            foreach (var facet in Facets)
            {
                // Ignore if the filter is already defined
                if (Filters != null && Filters.Any(f => f.Name == facet.Name))
                {
                    continue;
                }

                var value = context.ValueProvider.GetValue(facet.Name);
                if (value != null && !String.IsNullOrEmpty(value.AttemptedValue))
                {
                    var filterValue = value.AttemptedValue;
                    var filter = new Filter
                    {
                        Name = facet.Name,
                        Fields = facet.Field,
                        FieldValue = filterValue
                    };

                    if (facet.Ranges != null && facet.Ranges.Count > 0)
                    {
                        // If it's a range facet, then try to find range by label.
                        // If nothing was found, then the range label might be empty, so parse it with range syntax.
                        var range = facet.Ranges.FirstOrDefault(r => !String.IsNullOrEmpty(r.Label) && r.Label.Equals(filterValue));
                        if (range == null)
                        {
                            range = FacetRange.Parse(null, filterValue);
                        }

                        filter.UseRangeFiltering = true;
                        filter.FromValue = range.FromValue.ToString();
                        filter.ToValue = range.ToValue.ToString();
                        filter.FromInclusive = range.FromInclusive;
                        filter.ToInclusive = range.ToInclusive;
                    }

                    facetFilters.Add(filter);
                }
            }

            return facetFilters;
        }
示例#34
0
 public virtual IDictionary <string, object> GetDefinitions(CommerceDataSourceContext context)
 {
     return(new Dictionary <string, object>());
 }
示例#35
0
 public IDictionary<string, object> GetDefinitions(CommerceDataSourceContext context)
 {
     return new Dictionary<string, object>();
 }