Example #1
0
        protected virtual IFilter ConvertPriceRangeFilter(PriceRangeFilter priceRangeFilter, IList <string> valueIds, ProductIndexedSearchCriteria criteria)
        {
            IFilter result = null;

            if (string.IsNullOrEmpty(criteria.Currency) || priceRangeFilter.Currency.EqualsInvariant(criteria.Currency))
            {
                var knownValues = priceRangeFilter.Values
                                  ?.Where(v => valueIds.Contains(v.Id, StringComparer.OrdinalIgnoreCase))
                                  .ToArray();

                if (knownValues != null && knownValues.Any())
                {
                    var filters = knownValues
                                  .Select(v => FiltersHelper.CreatePriceRangeFilter(priceRangeFilter.Currency, criteria.Pricelists, v.Lower, v.Upper, v.IncludeLower, v.IncludeUpper))
                                  .Where(f => f != null)
                                  .ToList();

                    result = filters.Or();
                }
                else
                {
                    // Unknown term values should produce empty result
                    result = new IdsFilter {
                        Values = new[] { string.Empty }
                    };
                }
            }

            return(result);
        }
Example #2
0
        public SearchCriteria()
        {
            // Set defaults
            Zipcode     = "92612";
            vdpPrice    = "";
            vdpMileage  = "";
            RadiusMiles = 100;

            Skip = 0;
            Take = 12;

            Sort = new Dto.Sort
            {
                By        = Common.Sort.By.BestMatch,
                Direction = Common.Sort.Direction.Ascending
            };

            MakeModelComboFilter    = new MakeModelComboFilter();
            CategoryMakeComboFilter = new CategoryMakeComboFilter();
            NewStatusFilter         = new NewStatusFilter();
            CityMpgFilter           = new CityMpgFilter();
            HighwayMpgFilter        = new HighwayMpgFilter();
            PriceRangeFilter        = new PriceRangeFilter();
            MileageRangeFilter      = new MileageRangeFilter();
            YearRangeFilter         = new YearRangeFilter();
            CylindersFilter         = new CylindersFilter();
            DriveTypeFilter         = new DriveTypeFilter();
            FuelTypeFilter          = new FuelTypeFilter();
            TransmissionTypeFilter  = new TransmissionTypeFilter();
            OptionBitsFilter        = new OptionBitsFilter();
            TrimIdFilter            = new TrimIdFilter();
        }
Example #3
0
        public void FilterPriceTest()
        {
            var inv = TestInitialize();
            var priceRangeFilter = new PriceRangeFilter(100, 200);
            var filtered         = inv.Filter(new List <IFilter> {
                priceRangeFilter
            });

            CollectionAssert.Contains(filtered, inv.Items[4]);
        }
Example #4
0
        protected virtual Aggregation GetPriceRangeAggregation(PriceRangeFilter priceRangeFilter, IList <AggregationResponse> aggregationResponses)
        {
            var result = new Aggregation
            {
                AggregationType = "pricerange",
                Field           = priceRangeFilter.Key,
                Items           = GetRangeAggregationItems(priceRangeFilter.Key, priceRangeFilter.Values, aggregationResponses).ToArray(),
            };


            return(result);
        }
        public static ISearchFilter Convert(this ISearchFilterService helper, ISearchFilter filter, string[] keys)
        {
            // get values that we have filters set for
            var values = from v in filter.GetValues() where keys.Contains(v.Id) select v;

            var attributeFilter = filter as AttributeFilter;

            if (attributeFilter != null)
            {
                var newFilter = new AttributeFilter();
                newFilter.InjectFrom(filter);
                newFilter.Values = values.OfType <AttributeFilterValue>().ToArray();
                return(newFilter);
            }

            var rangeFilter = filter as RangeFilter;

            if (rangeFilter != null)
            {
                var newFilter = new RangeFilter();
                newFilter.InjectFrom(filter);

                newFilter.Values = values.OfType <RangeFilterValue>().ToArray();
                return(newFilter);
            }

            var priceRangeFilter = filter as PriceRangeFilter;

            if (priceRangeFilter != null)
            {
                var newFilter = new PriceRangeFilter();
                newFilter.InjectFrom(filter);

                newFilter.Values = values.OfType <RangeFilterValue>().ToArray();
                return(newFilter);
            }

            var categoryFilter = filter as CategoryFilter;

            if (categoryFilter != null)
            {
                var newFilter = new CategoryFilter();
                newFilter.InjectFrom(filter);
                newFilter.Values = values.OfType <CategoryFilterValue>().ToArray();
                return(newFilter);
            }

            return(null);
        }
        private static IBrowseFilter ConvertToFilter(AggregationProperty property, int order)
        {
            IBrowseFilter result = null;

            switch (property.Type)
            {
            case _attributeType:
                result = new AttributeFilter
                {
                    Order     = order,
                    Key       = property.Name,
                    FacetSize = property.Size,
                    Values    = property.Values?.OrderBy(v => v, StringComparer.OrdinalIgnoreCase).Select(v => new AttributeFilterValue {
                        Id = v
                    }).ToArray(),
                };
                break;

            case _rangeType:
                result = new RangeFilter
                {
                    Order  = order,
                    Key    = property.Name,
                    Values = GetRangeFilterValues(property.Values),
                };
                break;

            case _priceRangeType:
                result = new PriceRangeFilter
                {
                    Order    = order,
                    Currency = property.Currency,
                    Values   = GetRangeFilterValues(property.Values),
                };
                break;
            }

            return(result);
        }
        private static void CreatePriceFilters(FilteredBrowsing browsing)
        {
            var filters = browsing.Prices != null ? new List <PriceRangeFilter>(browsing.Prices) : new List <PriceRangeFilter>();

            var vals = new List <RangeFilterValue>();

            var filter = new PriceRangeFilter {
                Currency = "USD", IsLocalized = false
            };

            vals.Add(CreateRange("Under $100", "under-100", String.Empty, "100", "en"));

            vals.Add(CreateRange("$100 - $200", "100-200", "100", "200", "en"));
            vals.Add(CreateRange("$200 - $600", "200-600", "200", "600", "en"));
            vals.Add(CreateRange("$600 - $1000", "600-1000", "600", "1000", "en"));
            vals.Add(CreateRange("Over $1000", "over-1000", "1000", String.Empty, "en"));

            filter.Values = vals.ToArray();
            filters.Add(filter);

            vals = new List <RangeFilterValue>();

            filter = new PriceRangeFilter {
                Currency = "EUR", IsLocalized = false
            };

            vals.Add(CreateRange("Under 100€", "under-100", String.Empty, "100", "en"));

            vals.Add(CreateRange("100€ - 200€", "100-200", "100", "200", "en"));
            vals.Add(CreateRange("200€ - 600€", "200-600", "200", "600", "en"));
            vals.Add(CreateRange("600€ - 1000€", "600-1000", "600", "1000", "en"));
            vals.Add(CreateRange("Over 1000€", "over-1000", "1000", String.Empty, "en"));

            filter.Values = vals.ToArray();
            filters.Add(filter);

            browsing.Prices = filters.ToArray();
        }
Example #8
0
        public void Can_get_item_facets_lucene()
        {
            var scope        = "default";
            var queryBuilder = new LuceneSearchQueryBuilder();
            var conn         = new SearchConnection(_LuceneStorageDir, scope);
            var provider     = new LuceneSearchProvider(queryBuilder, conn);

            Debug.WriteLine("Lucene connection: {0}", conn.ToString());

            if (Directory.Exists(_LuceneStorageDir))
            {
                Directory.Delete(_LuceneStorageDir, true);
            }

            SearchHelper.CreateSampleIndex(provider, scope);

            var criteria = new CatalogIndexedSearchCriteria
            {
                SearchPhrase      = "",
                IsFuzzySearch     = true,
                Catalog           = "goods",
                RecordsToRetrieve = 10,
                StartingRecord    = 0,
                Currency          = "USD",
                Pricelists        = new[] { "default" }
            };

            var filter = new AttributeFilter {
                Key = "Color"
            };

            filter.Values = new[]
            {
                new AttributeFilterValue {
                    Id = "red", Value = "red"
                },
                new AttributeFilterValue {
                    Id = "blue", Value = "blue"
                },
                new AttributeFilterValue {
                    Id = "black", Value = "black"
                }
            };

            var rangefilter = new RangeFilter {
                Key = "size"
            };

            rangefilter.Values = new[]
            {
                new RangeFilterValue {
                    Id = "0_to_5", Lower = "0", Upper = "5"
                },
                new RangeFilterValue {
                    Id = "5_to_10", Lower = "5", Upper = "10"
                }
            };

            var priceRangefilter = new PriceRangeFilter {
                Currency = "usd"
            };

            priceRangefilter.Values = new[]
            {
                new RangeFilterValue {
                    Id = "0_to_100", Lower = "0", Upper = "100"
                },
                new RangeFilterValue {
                    Id = "100_to_700", Lower = "100", Upper = "700"
                }
            };

            criteria.Add(filter);
            criteria.Add(rangefilter);
            criteria.Add(priceRangefilter);

            var results = provider.Search(scope, criteria);

            Assert.True(results.DocCount == 4, String.Format("Returns {0} instead of 4", results.DocCount));

            var redCount = GetFacetCount(results, "Color", "red");

            Assert.True(redCount == 2, String.Format("Returns {0} facets of red instead of 2", redCount));

            var priceCount = GetFacetCount(results, "Price", "0_to_100");

            Assert.True(priceCount == 2, String.Format("Returns {0} facets of 0_to_100 prices instead of 2", priceCount));

            var priceCount2 = GetFacetCount(results, "Price", "100_to_700");

            Assert.True(priceCount2 == 2, String.Format("Returns {0} facets of 100_to_700 prices instead of 2", priceCount2));

            var sizeCount = GetFacetCount(results, "size", "0_to_5");

            Assert.True(sizeCount == 2, String.Format("Returns {0} facets of 0_to_5 size instead of 2", sizeCount));

            var sizeCount2 = GetFacetCount(results, "size", "5_to_10");

            Assert.True(sizeCount2 == 1, String.Format("Returns {0} facets of 5_to_10 size instead of 1", sizeCount2)); // only 1 result because upper bound is not included

            var outlineCount = results.Documents[0].Documents[0]["__outline"].Values.Count();

            Assert.True(outlineCount == 2, String.Format("Returns {0} outlines instead of 2", outlineCount));

            Directory.Delete(_LuceneStorageDir, true);
        }
Example #9
0
        public void Can_get_item_multiple_filters_lucene()
        {
            var scope        = "default";
            var queryBuilder = new LuceneSearchQueryBuilder();
            var conn         = new SearchConnection(_LuceneStorageDir, scope);
            var provider     = new LuceneSearchProvider(queryBuilder, conn);

            Debug.WriteLine("Lucene connection: {0}", conn.ToString());

            if (Directory.Exists(_LuceneStorageDir))
            {
                Directory.Delete(_LuceneStorageDir, true);
            }

            SearchHelper.CreateSampleIndex(provider, scope);

            var criteria = new CatalogIndexedSearchCriteria
            {
                SearchPhrase      = "",
                IsFuzzySearch     = true,
                Catalog           = "goods",
                RecordsToRetrieve = 10,
                StartingRecord    = 0,
                Currency          = "USD",
                Pricelists        = new[] { "default" }
            };

            var colorFilter = new AttributeFilter {
                Key = "Color"
            };

            colorFilter.Values = new[]
            {
                new AttributeFilterValue {
                    Id = "red", Value = "red"
                },
                new AttributeFilterValue {
                    Id = "blue", Value = "blue"
                },
                new AttributeFilterValue {
                    Id = "black", Value = "black"
                }
            };

            var filter = new AttributeFilter {
                Key = "Color"
            };

            filter.Values = new[]
            {
                new AttributeFilterValue {
                    Id = "black", Value = "black"
                }
            };

            var rangefilter = new RangeFilter {
                Key = "size"
            };

            rangefilter.Values = new[]
            {
                new RangeFilterValue {
                    Id = "0_to_5", Lower = "0", Upper = "5"
                },
                new RangeFilterValue {
                    Id = "5_to_10", Lower = "5", Upper = "11"
                }
            };

            var priceRangefilter = new PriceRangeFilter {
                Currency = "usd"
            };

            priceRangefilter.Values = new[]
            {
                new RangeFilterValue {
                    Id = "100_to_700", Lower = "100", Upper = "700"
                }
            };

            criteria.Add(colorFilter);
            criteria.Add(priceRangefilter);

            // add applied filters
            criteria.Apply(filter);
            //criteria.Apply(rangefilter);
            //criteria.Apply(priceRangefilter);

            var results = provider.Search(scope, criteria);

            var blackCount = GetFacetCount(results, "Color", "black");

            Assert.True(blackCount == 1, String.Format("Returns {0} facets of black instead of 2", blackCount));

            //Assert.True(results.DocCount == 1, String.Format("Returns {0} instead of 1", results.DocCount));

            Directory.Delete(_LuceneStorageDir, true);
        }
Example #10
0
        protected virtual AggregationRequest GetPriceRangeFilterValueAggregationRequest(PriceRangeFilter priceRangeFilter, RangeFilterValue value, IEnumerable <IFilter> existingFilters, IList <string> pricelists)
        {
            var valueFilter = FiltersHelper.CreatePriceRangeFilter(priceRangeFilter.Currency, pricelists, value.Lower, value.Upper, value.IncludeLower, value.IncludeUpper);

            var result = new TermAggregationRequest
            {
                Id     = $"{priceRangeFilter.Key}-{value.Id}",
                Filter = existingFilters.And(valueFilter)
            };

            return(result);
        }
Example #11
0
        protected virtual IList <AggregationRequest> GetPriceRangeFilterAggregationRequests(PriceRangeFilter priceRangeFilter, ProductIndexedSearchCriteria criteria, IList <IFilter> existingFilters)
        {
            var result = priceRangeFilter.Values?.Select(v => GetPriceRangeFilterValueAggregationRequest(priceRangeFilter, v, existingFilters, criteria.Pricelists)).ToList();

            return(result);
        }
        public void Can_index_product_demo_data_and_search(string providerType)
        {
            var provider = GetSearchProvider(providerType, _scope);

            RebuildIndex(provider, CatalogItemSearchCriteria.DocType);

            // find all products in the category
            var criteria = new CatalogItemSearchCriteria
            {
                Catalog  = GetCatalogId("electronics"),
                Currency = "USD"
            };

            // Add facets
            var colorFacet = new AttributeFilter {
                Key = "color"
            };

            var brandFacet = new AttributeFilter
            {
                Key         = "brand",
                IsLocalized = true,
                Values      = new[]
                {
                    new AttributeFilterValue {
                        Id = "Apple", Value = "Apple"
                    },
                    new AttributeFilterValue {
                        Id = "Asus", Value = "Asus"
                    },
                    new AttributeFilterValue {
                        Id = "Samsung", Value = "Samsung"
                    }
                }
            };

            var sizeFacet = new RangeFilter
            {
                Key    = "display_size",
                Values = new[]
                {
                    new RangeFilterValue {
                        Id = "0_to_5", Lower = "0", Upper = "5"
                    },
                    new RangeFilterValue {
                        Id = "5_to_10", Lower = "5", Upper = "10"
                    }
                }
            };

            var priceFacet = new PriceRangeFilter
            {
                Currency = "USD",
                Values   = new[]
                {
                    new RangeFilterValue {
                        Id = "under-100", Upper = "100"
                    },
                    new RangeFilterValue {
                        Id = "200-600", Lower = "200", Upper = "600"
                    }
                }
            };

            criteria.Add(brandFacet);
            criteria.Add(colorFacet);
            criteria.Add(sizeFacet);
            criteria.Add(priceFacet);

            var ibs           = GetItemBrowsingService(provider);
            var searchResults = ibs.SearchItems(_scope, criteria, ItemResponseGroup.ItemLarge);

            Assert.True(searchResults.TotalCount > 0, $"Didn't find any products using {providerType} provider");
            Assert.True(searchResults.Aggregations.Any(), $"Didn't find any aggregations using {providerType} provider");

            Assert.True(GetFacetValuesCount(searchResults, "color") > 0, $"Didn't find any aggregation value for Color using {providerType} provider");

            Assert.Equal(0, GetFacetValue(searchResults, "brand", "Apple"));
            Assert.Equal(2, GetFacetValue(searchResults, "brand", "Asus"));
            Assert.Equal(5, GetFacetValue(searchResults, "brand", "Samsung"));

            criteria = new CatalogItemSearchCriteria {
                Currency = "USD", Locale = "en-us", SearchPhrase = "sony"
            };
            searchResults = ibs.SearchItems(_scope, criteria, ItemResponseGroup.ItemLarge);

            Assert.True(searchResults.TotalCount > 0);
        }
Example #13
0
        public void Can_index_product_demo_data_and_search(string providerType)
        {
            var scope    = "test";
            var provider = GetSearchProvider(providerType, scope);

            //if (provider is ElasticSearchProvider)
            //    (provider as ElasticSearchProvider).AutoCommitCount = 1; // commit every one document

            provider.RemoveAll(scope, "");
            var controller = GetSearchIndexController(provider);

            controller.RemoveIndex(scope, CatalogItemSearchCriteria.DocType);
            controller.BuildIndex(scope, CatalogItemSearchCriteria.DocType, x => { return; });


            // sleep for index to be commited
            Thread.Sleep(5000);

            // get catalog id by name
            var catalogRepo = GetCatalogRepository();
            var catalog     = catalogRepo.Catalogs.SingleOrDefault(x => x.Name.Equals("electronics", StringComparison.OrdinalIgnoreCase));

            // find all prodducts in the category
            var catalogCriteria = new CatalogItemSearchCriteria()
            {
                Catalog  = catalog.Id,
                Currency = "USD"
            };

            // Add all filters
            var brandFilter = new AttributeFilter {
                Key = "brand"
            };
            var filter = new AttributeFilter {
                Key = "color", IsLocalized = true
            };

            filter.Values = new[]
            {
                new AttributeFilterValue {
                    Id = "Red", Value = "Red"
                },
                new AttributeFilterValue {
                    Id = "Gray", Value = "Gray"
                },
                new AttributeFilterValue {
                    Id = "Black", Value = "Black"
                }
            };

            var rangefilter = new RangeFilter {
                Key = "size"
            };

            rangefilter.Values = new[]
            {
                new RangeFilterValue {
                    Id = "0_to_5", Lower = "0", Upper = "5"
                },
                new RangeFilterValue {
                    Id = "5_to_10", Lower = "5", Upper = "10"
                }
            };

            var priceRangefilter = new PriceRangeFilter {
                Currency = "USD"
            };

            priceRangefilter.Values = new[]
            {
                new RangeFilterValue {
                    Id = "under-100", Upper = "100"
                },
                new RangeFilterValue {
                    Id = "200-600", Lower = "200", Upper = "600"
                }
            };

            catalogCriteria.Add(filter);
            catalogCriteria.Add(rangefilter);
            catalogCriteria.Add(priceRangefilter);
            catalogCriteria.Add(brandFilter);

            var ibs           = GetItemBrowsingService(provider);
            var searchResults = ibs.SearchItems(scope, catalogCriteria, Domain.Catalog.Model.ItemResponseGroup.ItemLarge);

            Assert.True(searchResults.TotalCount > 0, string.Format("Didn't find any products using {0} search", providerType));
            Assert.True(searchResults.Aggregations.Count() > 0, string.Format("Didn't find any aggregations using {0} search", providerType));

            var colorAggregation = searchResults.Aggregations.SingleOrDefault(a => a.Field.Equals("color", StringComparison.OrdinalIgnoreCase));

            Assert.True(colorAggregation.Items.Where(x => x.Value.ToString().Equals("Red", StringComparison.OrdinalIgnoreCase)).SingleOrDefault().Count == 6);
            Assert.True(colorAggregation.Items.Where(x => x.Value.ToString().Equals("Gray", StringComparison.OrdinalIgnoreCase)).SingleOrDefault().Count == 3);
            Assert.True(colorAggregation.Items.Where(x => x.Value.ToString().Equals("Black", StringComparison.OrdinalIgnoreCase)).SingleOrDefault().Count == 13);

            var brandAggregation = searchResults.Aggregations.SingleOrDefault(a => a.Field.Equals("brand", StringComparison.OrdinalIgnoreCase));

            Assert.True(brandAggregation.Items.Where(x => x.Value.ToString().Equals("Beats By Dr Dre", StringComparison.OrdinalIgnoreCase)).SingleOrDefault().Count == 3);

            var keywordSearchCriteria = new KeywordSearchCriteria(CatalogItemSearchCriteria.DocType)
            {
                Currency = "USD", Locale = "en-us", SearchPhrase = "sony"
            };

            searchResults = ibs.SearchItems(scope, keywordSearchCriteria, Domain.Catalog.Model.ItemResponseGroup.ItemLarge);
            Assert.True(searchResults.TotalCount > 0);
        }
Example #14
0
        public void Can_get_item_multiple_filters(string providerType)
        {
            var scope    = _DefaultScope;
            var provider = GetSearchProvider(providerType, scope);

            SearchHelper.CreateSampleIndex(provider, scope);

            var criteria = new CatalogItemSearchCriteria
            {
                SearchPhrase      = "",
                IsFuzzySearch     = true,
                Catalog           = "goods",
                RecordsToRetrieve = 10,
                StartingRecord    = 0,
                Currency          = "USD",
                Pricelists        = new[] { "default" }
            };

            var colorFilter = new AttributeFilter {
                Key = "Color"
            };

            colorFilter.Values = new[]
            {
                new AttributeFilterValue {
                    Id = "red", Value = "red"
                },
                new AttributeFilterValue {
                    Id = "blue", Value = "blue"
                },
                new AttributeFilterValue {
                    Id = "black", Value = "black"
                }
            };

            var filter = new AttributeFilter {
                Key = "Color"
            };

            filter.Values = new[]
            {
                new AttributeFilterValue {
                    Id = "black", Value = "black"
                }
            };

            var rangefilter = new RangeFilter {
                Key = "size"
            };

            rangefilter.Values = new[]
            {
                new RangeFilterValue {
                    Id = "0_to_5", Lower = "0", Upper = "5"
                },
                new RangeFilterValue {
                    Id = "5_to_10", Lower = "5", Upper = "11"
                }
            };

            var priceRangefilter = new PriceRangeFilter {
                Currency = "usd"
            };

            priceRangefilter.Values = new[]
            {
                new RangeFilterValue {
                    Id = "100_to_700", Lower = "100", Upper = "700"
                }
            };

            criteria.Add(colorFilter);
            criteria.Add(rangefilter);
            criteria.Add(priceRangefilter);

            // add applied filters
            criteria.Apply(filter);
            criteria.Apply(rangefilter);
            criteria.Apply(priceRangefilter);

            var results = provider.Search <DocumentDictionary>(scope, criteria);

            var blackCount = GetFacetCount(results, "Color", "black");

            Assert.True(blackCount == 1, string.Format("Returns {0} facets of black instead of 1", blackCount));

            var redCount = GetFacetCount(results, "Color", "red");

            Assert.True(redCount == 2, string.Format("Returns {0} facets of black instead of 2", redCount));

            var priceCount = GetFacetCount(results, "Price", "100_to_700");

            Assert.True(priceCount == 1, string.Format("Returns {0} facets of 100_to_700 instead of 1", priceCount));

            Assert.True(results.DocCount == 1, string.Format("Returns {0} instead of 1", results.DocCount));
        }
Example #15
0
        public void Can_find_pricelists_prices(string providerType)
        {
            var scope    = _DefaultScope;
            var provider = GetSearchProvider(providerType, scope);

            SearchHelper.CreateSampleIndex(provider, scope);

            var criteria = new CatalogItemSearchCriteria
            {
                IsFuzzySearch     = true,
                Catalog           = "goods",
                RecordsToRetrieve = 10,
                StartingRecord    = 0,
                Currency          = "usd",
                Pricelists        = new string[] { "default", "sale" }
            };

            var priceRangefilter = new PriceRangeFilter {
                Currency = "usd"
            };

            priceRangefilter.Values = new[]
            {
                new RangeFilterValue {
                    Id = "0_to_100", Lower = "0", Upper = "100"
                },
                new RangeFilterValue {
                    Id = "100_to_700", Lower = "100", Upper = "700"
                }
            };

            criteria.Add(priceRangefilter);

            var results = provider.Search <DocumentDictionary>(scope, criteria);

            Assert.True(results.DocCount == 6, string.Format("Returns {0} instead of 6", results.DocCount));

            var priceCount = GetFacetCount(results, "Price", "0_to_100");

            Assert.True(priceCount == 2, string.Format("Returns {0} facets of 0_to_100 prices instead of 2", priceCount));

            var priceCount2 = GetFacetCount(results, "Price", "100_to_700");

            Assert.True(priceCount2 == 3, string.Format("Returns {0} facets of 100_to_700 prices instead of 3", priceCount2));

            criteria = new CatalogItemSearchCriteria
            {
                IsFuzzySearch     = true,
                Catalog           = "goods",
                RecordsToRetrieve = 10,
                StartingRecord    = 0,
                Currency          = "usd",
                Pricelists        = new string[] { "sale", "default" }
            };

            criteria.Add(priceRangefilter);

            results = provider.Search <DocumentDictionary>(scope, criteria);

            Assert.True(results.DocCount == 6, string.Format("\"Sample Product\" search returns {0} instead of 6", results.DocCount));

            var priceSaleCount = GetFacetCount(results, "Price", "0_to_100");

            Assert.True(priceSaleCount == 3, string.Format("Returns {0} facets of 0_to_100 prices instead of 2", priceSaleCount));

            var priceSaleCount2 = GetFacetCount(results, "Price", "100_to_700");

            Assert.True(priceSaleCount2 == 2, string.Format("Returns {0} facets of 100_to_700 prices instead of 3", priceSaleCount2));
        }
Example #16
0
        public void Can_get_item_facets(string providerType)
        {
            var scope    = _DefaultScope;
            var provider = GetSearchProvider(providerType, scope);

            SearchHelper.CreateSampleIndex(provider, scope);

            var criteria = new CatalogItemSearchCriteria
            {
                SearchPhrase      = "",
                IsFuzzySearch     = true,
                Catalog           = "goods",
                RecordsToRetrieve = 10,
                StartingRecord    = 0,
                Currency          = "USD",
                Pricelists        = new[] { "default" }
            };

            var filter = new AttributeFilter {
                Key = "Color"
            };

            filter.Values = new[]
            {
                new AttributeFilterValue {
                    Id = "red", Value = "red"
                },
                new AttributeFilterValue {
                    Id = "blue", Value = "blue"
                },
                new AttributeFilterValue {
                    Id = "black", Value = "black"
                }
            };

            var rangefilter = new RangeFilter {
                Key = "size"
            };

            rangefilter.Values = new[]
            {
                new RangeFilterValue {
                    Id = "0_to_5", Lower = "0", Upper = "5"
                },
                new RangeFilterValue {
                    Id = "5_to_10", Lower = "5", Upper = "10"
                }
            };

            var priceRangefilter = new PriceRangeFilter {
                Currency = "usd"
            };

            priceRangefilter.Values = new[]
            {
                new RangeFilterValue {
                    Id = "0_to_100", Lower = "0", Upper = "100"
                },
                new RangeFilterValue {
                    Id = "100_to_700", Lower = "100", Upper = "700"
                },
                new RangeFilterValue {
                    Id = "over_700", Lower = "700"
                },
                new RangeFilterValue {
                    Id = "under_100", Upper = "100"
                },
            };

            criteria.Add(filter);
            criteria.Add(rangefilter);
            criteria.Add(priceRangefilter);

            var results = provider.Search <DocumentDictionary>(scope, criteria);

            Assert.True(results.DocCount == 6, string.Format("Returns {0} instead of 6", results.DocCount));

            var redCount = GetFacetCount(results, "Color", "red");

            Assert.True(redCount == 3, string.Format("Returns {0} facets of red instead of 3", redCount));

            var priceCount = GetFacetCount(results, "Price", "0_to_100");

            Assert.True(priceCount == 2, string.Format("Returns {0} facets of 0_to_100 prices instead of 2", priceCount));

            var priceCount2 = GetFacetCount(results, "Price", "100_to_700");

            Assert.True(priceCount2 == 3, string.Format("Returns {0} facets of 100_to_700 prices instead of 3", priceCount2));

            var priceCount3 = GetFacetCount(results, "Price", "over_700");

            Assert.True(priceCount3 == 1, string.Format("Returns {0} facets of over_700 prices instead of 1", priceCount3));

            var priceCount4 = GetFacetCount(results, "Price", "under_100");

            Assert.True(priceCount4 == 2, string.Format("Returns {0} facets of priceCount4 prices instead of 2", priceCount4));

            var sizeCount = GetFacetCount(results, "size", "0_to_5");

            Assert.True(sizeCount == 3, string.Format("Returns {0} facets of 0_to_5 size instead of 3", sizeCount));

            var sizeCount2 = GetFacetCount(results, "size", "5_to_10");

            Assert.True(sizeCount2 == 1, string.Format("Returns {0} facets of 5_to_10 size instead of 1", sizeCount2)); // only 1 result because upper bound is not included

            int outlineCount  = 0;
            var outlineObject = results.Documents.ElementAt(0)["__outline"]; // can be JArray or object[] depending on provider used

            if (outlineObject is JArray)
            {
                outlineCount = (outlineObject as JArray).Count;
            }
            else
            {
                outlineCount = (outlineObject as object[]).Count();
            }

            Assert.True(outlineCount == 2, string.Format("Returns {0} outlines instead of 2", outlineCount));
        }