/// <summary> /// Add a filter clause. /// </summary> /// <param name="filterClause">The clause to add.</param> public void Add(FilterClause filterClause) { if (filterClause.Occur == Occur.MUST) { if (mustFilters == null) { mustFilters = new EquatableList<Filter>(); } mustFilters.Add(filterClause.Filter); } if (filterClause.Occur == Occur.SHOULD) { if (shouldFilters == null) { shouldFilters = new EquatableList<Filter>(); } shouldFilters.Add(filterClause.Filter); } if (filterClause.Occur == Occur.MUST_NOT) { if (notFilters == null) { notFilters = new EquatableList<Filter>(); } notFilters.Add(filterClause.Filter); } }
/// <summary> /// Builds the query. /// </summary> /// <param name="criteria">The criteria.</param> /// <returns></returns> public virtual object BuildQuery(ISearchCriteria criteria) { var queryBuilder = new QueryBuilder(); var queryFilter = new BooleanFilter(); var query = new BooleanQuery(); queryBuilder.Query = query; queryBuilder.Filter = queryFilter; if (criteria.CurrentFilters != null) { foreach (var filter in criteria.CurrentFilters) { // Skip currencies that are not part of the filter if (filter.GetType() == typeof(PriceRangeFilter)) // special filtering { var currency = (filter as PriceRangeFilter).Currency; if (!currency.Equals(criteria.Currency, StringComparison.OrdinalIgnoreCase)) { continue; } } var filterQuery = LuceneQueryHelper.CreateQuery(criteria, filter, Occur.SHOULD); // now add other values that should also be counted? if (filterQuery != null) { var clause = new FilterClause(filterQuery, Occur.MUST); queryFilter.Add(clause); } } } return queryBuilder; }
/// <summary> /// Creates the price range query. /// </summary> /// <param name="priceLists">The price lists.</param> /// <param name="index">The index.</param> /// <param name="field">The field.</param> /// <param name="currency">The currency.</param> /// <param name="lowerbound">The lowerbound.</param> /// <param name="upperbound">The upperbound.</param> /// <param name="lowerboundincluded"> /// if set to <c>true</c> [lowerboundincluded]. /// </param> /// <param name="upperboundincluded"> /// if set to <c>true</c> [upperboundincluded]. /// </param> /// <returns></returns> private static BooleanFilter CreatePriceRangeQuery( string[] priceLists, int index, string field, string currency, string lowerbound, string upperbound, bool lowerboundincluded, bool upperboundincluded) { var query = new BooleanFilter(); // create left part var filter = new TermRangeFilter( string.Format(CultureInfo.InvariantCulture, "{0}_{1}_{2}", field, currency, priceLists[index - 1].ToLower()), "*", "*", true, false); var leftClause = new FilterClause(filter, Occur.MUST_NOT); query.Add(leftClause); // create right part if (index == priceLists.Length) // last element { //var rangefilter = NumericRangeFilter.; var filter2 = new TermRangeFilter( string.Format(CultureInfo.InvariantCulture, "{0}_{1}_{2}", field, currency, priceLists[index - 1].ToLower()), lowerbound, upperbound, lowerboundincluded, upperboundincluded); var rightClause = new FilterClause(filter2, Occur.MUST); query.Add(rightClause); } else { query.Add(new FilterClause( CreatePriceRangeQuery( priceLists, index + 1, field, currency, lowerbound, upperbound, lowerboundincluded, upperboundincluded), Occur.SHOULD)); } return query; }