public static JXSearchProvider CreateProvider(JXSearchType t)
        {
            JXSearchProvider provider = null;

            switch (t)
            {
            case JXSearchType.Product:
                provider = new ProductSearchProvider();
                break;

            default:
                provider = new KeywordSearchProvider();
                break;
            }
            return(provider);
        }
        public IActionResult AdvancedSearch(ProductSearchViewModel model)
        {
            if (model == null || !ModelState.IsValid)
            {
                return(Redirect($"/Search/Advanced/{LanguageStrings.Products}/"));
            }

            GetSearchId(model);

            KeywordSearchProvider searchProvider = new KeywordSearchProvider(_productProvider);

            KeywordSearchOptions options = new KeywordSearchOptions(model.SearchText ?? String.Empty)
            {
                MaximumSearchResults = Constants.MaximumProducts
            };

            GetSearchId(model);
            options.SearchName = model.SearchName;

            // add additional search options
            foreach (CheckedViewItemModel item in model.ProductGroups)
            {
                if (item.Selected)
                {
                    options.Properties.Add(item.Name, KeywordSearchProvider.ProductGroup);
                }
            }

            List <ProductPriceInfo> prices      = new List <ProductPriceInfo>();
            List <ProductPriceInfo> priceGroups = GetPriceGroups();

            foreach (CheckedViewItemModel item in model.Prices)
            {
                if (item.Selected)
                {
                    ProductPriceInfo priceGroup = priceGroups.Where(pg => pg.Text.Equals(item.Name)).FirstOrDefault();

                    if (priceGroup != null)
                    {
                        prices.Add(priceGroup);
                    }
                }
            }

            if (prices.Count == 0)
            {
                prices.AddRange(priceGroups);
            }

            options.Properties.Add(KeywordSearchProvider.Price, prices);

            if (model.ContainsVideo)
            {
                options.Properties.Add(KeywordSearchProvider.ContainsVideo, true);
            }

            // perform the search, the results will be held in memory and shown on search page
            DefaultSearchThread.KeywordSearch(searchProvider, options);

            string cacheName = $"Product Search View Model {model.SearchName}";

            _memoryCache.GetExtendingCache().Add(cacheName, new CacheItem(cacheName, model), true);

            return(Redirect($"/Search/Advanced/{LanguageStrings.Products}/{model.SearchName}/"));
        }