示例#1
0
        /// <summary>
        /// Adds the facet queries.
        /// </summary>
        /// <param name="param">The param.</param>
        /// <param name="fieldName">Name of the field.</param>
        /// <param name="values">The values.</param>
        private void AddFacetQueries(
            Facets <ESDocument> param, string fieldName, IEnumerable <AttributeFilterValue> values, ISearchCriteria criteria)
        {
            if (values == null)
            {
                return;
            }

            var ffilter = new BoolFilter <ESDocument>();

            foreach (var f in criteria.CurrentFilters)
            {
                if (!f.Key.Equals(fieldName))
                {
                    var q = ElasticQueryHelper.CreateQuery(criteria, f);
                    ffilter.Must(ff => ff.Bool(bb => q));
                }
            }

            var facetFilter = new FacetFilter <ESDocument>();

            facetFilter.Bool(f => ffilter);

            //var filter = new FacetFilter<ESDocument>();
            //facetFilter.Terms(x => x.Values(values.Select(y => y.Value).ToArray()));
            //var filterFacet = new FilterFacet<ESDocument>();
            //filterFacet.FacetName(fieldName.ToLower()).FacetFilter(f => facetFilter);

            param.Terms(t => t.FacetName(fieldName.ToLower()).Field(fieldName.ToLower()).FacetFilter(ff => facetFilter));
        }
        public static BoolFilter<ESDocument> CreateQueryForValue(ISearchCriteria criteria, ISearchFilter filter, ISearchFilterValue value)
        {
            var query = new BoolFilter<ESDocument>();
            var field = filter.Key.ToLower();
            if (filter.GetType() == typeof(PriceRangeFilter))
            {
                var tempQuery = CreatePriceRangeFilter(criteria, field, value as RangeFilterValue);
                if (tempQuery != null)
                {
                    query.Must(q => q.Bool(b => tempQuery));
                }
            }
            else
            {
                if (value.GetType() == typeof(AttributeFilterValue))
                {
                    query.Must(q => q.Term(t=>t.Field(field).Value(((AttributeFilterValue)value).Value)));
                }
                else if (value.GetType() == typeof(RangeFilterValue))
                {
                    var tempValue = value as RangeFilterValue;
                    var tempFilter = new RangeFilter<ESDocument>();
                    tempFilter.Field(field).From(tempValue.Lower).To(tempValue.Upper).IncludeLower(true).IncludeUpper(false);
                    query.Should(q => q.Range(r => tempFilter));
                }
            }

            return query;
        }
        private static BoolFilter<ESDocument> CreatePriceRangeFilter(string[] priceLists, int index, string field, string currency, string lowerbound, string upperbound, bool lowerboundincluded, bool upperboundincluded)
        {
            var query = new BoolFilter<ESDocument>();

            // create left part
            var filter = new RangeFilter<ESDocument>();
            filter.Field(String.Format("{0}_{1}_{2}", field, currency, priceLists[index - 1].ToLower()))/*.From("*").To("*")*/.IncludeLower(lowerboundincluded).IncludeUpper(upperboundincluded);
            //query.MustNot(q => q.ConstantScore(c => c.Filter(f => f.Range(r => filter))));
            query.MustNot(q => q.Range(r => filter));

            // create right part
            if (index == priceLists.Count() - 1) // last element
            {
                var filter2 = new RangeFilter<ESDocument>();
                filter2.Field(String.Format("{0}_{1}_{2}", field, currency, priceLists[index].ToLower())).From(lowerbound).To(upperbound).IncludeLower(lowerboundincluded).IncludeUpper(upperboundincluded);
                //query.Must(q => q.ConstantScore(c => c.Filter(f => f.Range(r => filter2))));
                query.Must(q => q.Range(r => filter2));
            }
            else
            {
                query.Should(q => q.Bool(b => CreatePriceRangeFilter(priceLists, index + 1, field, currency, lowerbound, upperbound, lowerboundincluded, upperboundincluded)));
            }

            return query;
        }
示例#4
0
        private static BoolFilter <ESDocument> CreatePriceRangeFilter(string[] priceLists, int index, string field, string currency, string lowerbound, string upperbound, bool lowerboundincluded, bool upperboundincluded)
        {
            var query = new BoolFilter <ESDocument>();

            // create left part
            var filter = new RangeFilter <ESDocument>();

            filter.Field(String.Format("{0}_{1}_{2}", field, currency, priceLists[index - 1].ToLower())) /*.From("*").To("*")*/.IncludeLower(lowerboundincluded).IncludeUpper(upperboundincluded);
            //query.MustNot(q => q.ConstantScore(c => c.Filter(f => f.Range(r => filter))));
            query.MustNot(q => q.Range(r => filter));

            // create right part
            if (index == priceLists.Count() - 1) // last element
            {
                var filter2 = new RangeFilter <ESDocument>();
                filter2.Field(String.Format("{0}_{1}_{2}", field, currency, priceLists[index].ToLower())).From(lowerbound).To(upperbound).IncludeLower(lowerboundincluded).IncludeUpper(upperboundincluded);
                //query.Must(q => q.ConstantScore(c => c.Filter(f => f.Range(r => filter2))));
                query.Must(q => q.Range(r => filter2));
            }
            else
            {
                query.Should(q => q.Bool(b => CreatePriceRangeFilter(priceLists, index + 1, field, currency, lowerbound, upperbound, lowerboundincluded, upperboundincluded)));
            }

            return(query);
        }
示例#5
0
        public static BoolFilter <ESDocument> CreateQueryForValue(ISearchCriteria criteria, ISearchFilter filter, ISearchFilterValue value)
        {
            var query = new BoolFilter <ESDocument>();
            var field = filter.Key.ToLower();

            if (filter.GetType() == typeof(PriceRangeFilter))
            {
                var tempQuery = CreatePriceRangeFilter(criteria, field, value as RangeFilterValue);
                if (tempQuery != null)
                {
                    query.Must(q => q.Bool(b => tempQuery));
                }
            }
            else
            {
                if (value.GetType() == typeof(AttributeFilterValue))
                {
                    query.Must(q => q.Term(t => t.Field(field).Value(((AttributeFilterValue)value).Value)));
                }
                else if (value.GetType() == typeof(RangeFilterValue))
                {
                    var tempValue  = value as RangeFilterValue;
                    var tempFilter = new RangeFilter <ESDocument>();
                    tempFilter.Field(field).From(tempValue.Lower).To(tempValue.Upper).IncludeLower(true).IncludeUpper(false);
                    query.Should(q => q.Range(r => tempFilter));
                }
            }

            return(query);
        }
示例#6
0
        //добавление нового
        private BoolFilter AddBool()
        {
            bool val = fBool.Value;

            BoolFilter bf = new BoolFilter(_currentItem, val, _current);

            return(bf);
        }
示例#7
0
 public BoolFilterStrategy(BoolFilter filter,
                           ComboBox conditionComboBox,
                           TextBox valueTextBox,
                           GroupBox filterGroupBox,
                           DockPanel valueDockPanel)
     : base(conditionComboBox, valueTextBox, filterGroupBox, valueDockPanel)
 {
     this.Filter = filter;
 }
示例#8
0
        public void SerializerBoolFilter()
        {
            JsonSerializer jsonSerializer = new JsonSerializer();
            BoolFilter     boolFilter     = new BoolFilter();

            boolFilter.Must(new TermFilter("term1", "value1"));
            boolFilter.Should(new TermFilter("term2", "value2"));
            boolFilter.Should(new TermFilter("term3", "value3"));
            string jsonString = jsonSerializer.Serialize(boolFilter);

            Console.WriteLine(jsonString);
        }
        public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer)
        {
            BoolFilter boolFilter = (BoolFilter)value;

            if (boolFilter == null)
            {
                return;
            }

            /*
             * "bool" : {
             *  "must" : {},
             *  "must_not" : {},
             *  "should" : [{},{}]
             *  }
             */

            writer.WriteStartObject();
            writer.WritePropertyName("bool");
            writer.WriteStartObject();
            if (boolFilter.MustFilters != null && boolFilter.MustFilters.Count > 0)
            {
                writer.WritePropertyName("must");
                writer.WriteStartArray();
                foreach (var mustFilter in boolFilter.MustFilters)
                {
                    serializer.Serialize(writer, mustFilter);
                }
                writer.WriteEndArray();
            }
            if (boolFilter.MustNotFilter != null && boolFilter.MustNotFilter.Count > 0)
            {
                writer.WritePropertyName("must_not");
                writer.WriteStartArray();
                foreach (var mustNotFilter in boolFilter.MustNotFilter)
                {
                    serializer.Serialize(writer, mustNotFilter);
                }
                writer.WriteEndArray();
            }
            if (boolFilter.ShouldFilter != null && boolFilter.ShouldFilter.Count > 0)
            {
                writer.WritePropertyName("should");
                writer.WriteStartArray();
                foreach (var shouldFilter in boolFilter.ShouldFilter)
                {
                    serializer.Serialize(writer, shouldFilter);
                }
                writer.WriteEndArray();
            }
            writer.WriteEndObject();
            writer.WriteEndObject();
        }
        public static BoolFilter<ESDocument> CreateQuery(ISearchCriteria criteria, ISearchFilter filter)
        {
            var values = GetFilterValues(filter);
            if (values == null) return null;

            var query = new BoolFilter<ESDocument>();
            foreach (var value in values)
            {
                var valueQuery = CreateQueryForValue(criteria, filter, value);
                //var boolQuery = new Query<ESDocument>();
                //boolQuery.Bool(x => valueQuery);
                query.Should(x=>x.Bool(y=>valueQuery));
            }

            return query;
        }
示例#11
0
        /// <summary>
        /// Creates the price range filter.
        /// </summary>
        /// <param name="criteria">The criteria.</param>
        /// <param name="field">The field.</param>
        /// <param name="value">The value.</param>
        /// <returns></returns>
        public static BoolFilter <ESDocument> CreatePriceRangeFilter(ISearchCriteria criteria, string field, RangeFilterValue value)
        {
            var query = new BoolFilter <ESDocument>();

            var lowerbound = value.Lower;
            var upperbound = value.Upper;

            var lowerboundincluded = true;
            var upperboundincluded = false;

            var currency = criteria.Currency.ToLower();

            // format is "fieldname_store_currency_pricelist"
            string[] pls = null;
            if (criteria is CatalogIndexedSearchCriteria)
            {
                pls = ((CatalogIndexedSearchCriteria)criteria).Pricelists;
            }

            var parentPriceList = String.Empty;

            // Create  filter of type
            // price_USD_pricelist1:[100 TO 200} (-price_USD_pricelist1:[* TO *} +(price_USD_pricelist2:[100 TO 200} (-price_USD_pricelist2:[* TO *} (+price_USD_pricelist3[100 TO 200}))))

            if (pls == null || !pls.Any())
            {
                return(null);
            }

            var priceListId = pls[0].ToLower();

            var filter = new RangeFilter <ESDocument>();

            filter.Field(String.Format("{0}_{1}_{2}", field, currency, priceListId)).From(lowerbound).To(upperbound).IncludeLower(lowerboundincluded).IncludeUpper(upperboundincluded);

            //query.Should(q => q.ConstantScore(c => c.Filter(f => f.Range(r => filter))));
            query.Should(q => q.Range(r => filter));

            if (pls.Count() > 1)
            {
                var temp = CreatePriceRangeFilter(pls, 1, field, currency, lowerbound, upperbound, lowerboundincluded, upperboundincluded);
                query.Should(q => q.Bool(b => temp));
            }

            //Query query = new ConstantScoreQuery(filter);
            return(query);
        }
        /// <summary>
        /// Creates the price range filter.
        /// </summary>
        /// <param name="criteria">The criteria.</param>
        /// <param name="field">The field.</param>
        /// <param name="value">The value.</param>
        /// <returns></returns>
        public static BoolFilter<ESDocument> CreatePriceRangeFilter(ISearchCriteria criteria, string field, RangeFilterValue value)
        {
            var query = new BoolFilter<ESDocument>();

            var lowerbound = value.Lower;
            var upperbound = value.Upper;

            var lowerboundincluded = true;
            var upperboundincluded = false;

            var currency = criteria.Currency.ToLower();

            // format is "fieldname_store_currency_pricelist"
            string[] pls = null;
            if (criteria is CatalogItemSearchCriteria)
            {
                pls = ((CatalogItemSearchCriteria)criteria).Pricelists;
            }

            var parentPriceList = String.Empty;

            // Create  filter of type 
            // price_USD_pricelist1:[100 TO 200} (-price_USD_pricelist1:[* TO *} +(price_USD_pricelist2:[100 TO 200} (-price_USD_pricelist2:[* TO *} (+price_USD_pricelist3[100 TO 200}))))

            if (pls == null || pls.Count() == 0)
                return null;

            var priceListId = pls[0].ToLower();

            var filter = new RangeFilter<ESDocument>();
            filter.Field(String.Format("{0}_{1}_{2}", field, currency, priceListId)).From(lowerbound).To(upperbound).IncludeLower(lowerboundincluded).IncludeUpper(upperboundincluded);

            //query.Should(q => q.ConstantScore(c => c.Filter(f => f.Range(r => filter))));
            query.Should(q => q.Range(r => filter));

            if (pls.Count() > 1)
            {
                var temp = CreatePriceRangeFilter(pls, 1, field, currency, lowerbound, upperbound, lowerboundincluded, upperboundincluded);
                query.Should(q => q.Bool(b => temp));
            }

            //Query query = new ConstantScoreQuery(filter);
            return query;
        }
示例#13
0
        /// <summary>
        /// Adds the facet queries.
        /// </summary>
        /// <param name="param">The param.</param>
        /// <param name="fieldName">Name of the field.</param>
        /// <param name="criteria">Search criteria.</param>
        private void AddFacetQueries(Facets <ESDocument> param, string fieldName, ISearchCriteria criteria)
        {
            var ffilter = new BoolFilter <ESDocument>();

            foreach (var f in criteria.CurrentFilters)
            {
                if (!f.Key.Equals(fieldName))
                {
                    var q = ElasticQueryHelper.CreateQuery(criteria, f);
                    ffilter.Must(ff => ff.Bool(bb => q));
                }
            }

            var facetFilter = new FacetFilter <ESDocument>();

            facetFilter.Bool(f => ffilter);

            param.Terms(t => t.FacetName(fieldName.ToLower()).Field(fieldName.ToLower()).FacetFilter(ff => facetFilter));
        }
示例#14
0
        public static bool Pass(
            BoolFilter enFilter,
            bool bVal)
        {
            if (enFilter == BoolFilter.Unspecified)
            {
                return(true);
            }

            if (bVal && (enFilter == BoolFilter.True))
            {
                return(true);
            }

            if (!bVal && (enFilter == BoolFilter.False))
            {
                return(true);
            }

            return(false);
        }
示例#15
0
        public static BoolFilter <ESDocument> CreateQuery(ISearchCriteria criteria, ISearchFilter filter)
        {
            var values = GetFilterValues(filter);

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

            var query = new BoolFilter <ESDocument>();

            foreach (var value in values)
            {
                var valueQuery = CreateQueryForValue(criteria, filter, value);
                //var boolQuery = new Query<ESDocument>();
                //boolQuery.Bool(x => valueQuery);
                query.Should(x => x.Bool(y => valueQuery));
            }

            return(query);
        }
示例#16
0
        public ScfeApp(File startingFile, string[] columnsToAdd)
        {
            CurrentDir = startingFile ?? new File(Directory.GetCurrentDirectory());
            _filter    = new AndFilter <File>(
                new BoolFilter <File>(f => ShowHiddenFiles || !f.IsHidden()),
                new BranchingFilter <File>(() => _filterOnBoxInput && TextBoxHandler == null,
                                           new StringFilter <File>(file => file.GetFileName().ToLowerInvariant(),
                                                                   () => TextBox.Text.ToLowerInvariant()),
                                           new TrueFilter <File>()));
            FileSorting = FileSorters[0];

            _noSearchFilter = new BoolFilter <File>(f => ShowHiddenFiles || !f.IsHidden());

            Tasks = new TaskPool <string>((task, tresult) =>
            {
                _cons?.DoGraphicsLater(g =>
                {
                    if (tresult.Message != null)
                    {
                        ShowHelpMessage(tresult.Message, g, tresult.Success ? ConsoleColor.Green : ConsoleColor.Red);
                    }
                });
            });

            _main = new Parent(new BorderStrategy());
            AddMainBindings();

            var p = new Parent(new LineStrategy());

            _main.AddComponent(p, BorderStrategy.Top);

            var p2 = new Parent(new BorderStrategy());

            p.AddComponent(p2);

            p2.AddComponent(new TextComponent("dir: ")
            {
                Foreground = ConsoleColor.DarkGray
            }, BorderStrategy.Left);

            _filePath = new TextComponent(CurrentDir.Path)
            {
                CutOverflowFrom = HorizontalAlignment.Centered, ClearBlankSpaceOnReprint = true
            };
            p2.AddComponent(_filePath, BorderStrategy.Center);

            _elementsCount = new TextComponent("[...]")
            {
                ClearBlankSpaceOnReprint = true
            };
            p2.AddComponent(_elementsCount, BorderStrategy.Right);

            p.AddComponent(new Separator {
                Foreground = ConsoleColor.DarkGray
            });

            p = new Parent(new LineStrategy());
            _main.AddComponent(p, BorderStrategy.Bottom);

            p.AddComponent(new Separator {
                Foreground = ConsoleColor.DarkGray
            });

            p2 = new Parent(new BorderStrategy());
            p.AddComponent(p2);

            var p3 = new Parent(new FlowStrategy(1));

            p2.AddComponent(p3, BorderStrategy.Left);

            _mode = new TextComponent("xxx");
            p3.AddComponent(_mode);

            p3.AddComponent(new Separator {
                Orientation = Orientation.Vertical, Foreground = ConsoleColor.DarkGray
            });
            p3.AddComponent(new TextComponent("")); // To have an extra separator at the end

            _help = new TextComponent("Welcome to SCFE!")
            {
                ClearBlankSpaceOnReprint = true
            };
            p2.AddComponent(_help, BorderStrategy.Center);

            p2 = new Parent(new BorderStrategy());
            p.AddComponent(p2);
            p2.AddComponent(new TextComponent("~> "), BorderStrategy.Left);

            TextBox = new TextField
            {
                PlaceholderText =
                    "Press E or M (in NAV mode, with Ctrl in SEA mode) to switch modes. Ctrl+Enter or (Ctrl+)Shift+M for COM mode.",
                ShowLine = false
            };
            TextBox.OnTextChanged += (sender, args) =>
            {
                if (_filterOnBoxInput && TextBoxHandler == null)
                {
                    SwitchToFolder(CurrentDir, args.Graphics);
                }
            };
            TextBox.ActionOnComponent += (sender, args) =>
            {
                if (TextBoxHandler != null)
                {
                    TextBoxHandler(sender, args);
                }
                else if (_filterOnBoxInput)
                {
                    if (_table.Data.Count == 1 && _table.Data[0] != null)
                    {
                        HandlerOpenFileInTable(_table.Data[0], args.Graphics);
                    }

                    TextBox.SetFocused(false, args.Graphics);
                    _table.SetFocused(true, args.Graphics);
                }
            };
            TextBox.ActionMap.Put(StandardActionNames.CancelAction, (o, args) =>
            {
                args.Graphics.SetCursorVisible(false);
                if (TextBoxHandler != null)
                {
                    CancelTextBoxHandler(args.Graphics);
                }
                else if (_filterOnBoxInput)
                {
                    ResetTextBox(args.Graphics);
                    SwitchToFolder(CurrentDir, args.Graphics);
                    ResetFocusableStates(args.Graphics);
                }
            });
            p2.AddComponent(TextBox, BorderStrategy.Center);

            _wrapper = new Parent {
                ClearAreaBeforePrint = true
            };
            _wrapper.Strategy = new SwitcherStrategy(_wrapper);
            _main.AddComponent(_wrapper, BorderStrategy.Center);

            _extensions.Add(new BaseExtension(this));
            _extensions.Add(new ComExtension(this));

            var gitExt = new GitExtension(this);

            ColorScheme = gitExt;
            _extensions.Add(gitExt);

            _extensions.Add(new FileWatchExtension(this));

            _table = new ScfeTable(this);
            InstallOnActionMap(_table.ActionMap);
            _table.ActionOnComponent += (o, args) => HandlerOpenFileInTable(_table.FocusedElement, args.Graphics);

            _table.AddColumn(new IndicatorColumnType <File>());

            var columnsAvailable = _extensions.SelectMany(e => e.GetColumns()).ToList();

            foreach (var colName in columnsToAdd)
            {
                var col = columnsAvailable.FirstOrDefault(c => c.GetTitle(_table, int.MaxValue) == colName);
                if (col != null)
                {
                    _table.AddColumn(col);
                }
            }

            _wrapper.AddComponent(_table, 0);
            ((SwitcherStrategy)_wrapper.Strategy).SwitchToComponentWithHint(0, null);

            _tableInputMap  = new SwappableAddinHierDic <KeyStroke, string>(_table.InputMap);
            _table.InputMap = _tableInputMap;

            InstallExtensionsOnFileOptionsPanel();

            SwitchToFolder(CurrentDir);

            ChangeModeTo(NavigationMode.NavMode, null);
        }
        public object BuildQuery(ISearchCriteria criteria)
        {
            var builder = new QueryBuilder<ESDocument>();
            var mainFilter = new Filter<ESDocument>();
            var mainQuery = new BoolQuery<ESDocument>();

            #region Sorting

            // Add sort order
            if (criteria.Sort != null)
            {
                var fields = criteria.Sort.GetSort();
                foreach (var field in fields)
                {
                    builder.Sort(d => d.Field(field.FieldName, field.IsDescending ? SortDirection.desc : SortDirection.asc, ignoreUnmapped: field.IgnoredUnmapped));
                }
            }

            #endregion

            #region Filters
            // Perform facet filters
            if (criteria.CurrentFilters != null)
            {
                var combinedFilter = new BoolFilter<ESDocument>();
                // group filters
                foreach (var filter in criteria.CurrentFilters)
                {
                    // Skip currencies that are not part of the filter
                    if (filter.GetType() == typeof(PriceRangeFilter)) // special filtering 
                    {
	                    var priceRangeFilter = filter as PriceRangeFilter;
	                    if (priceRangeFilter != null)
	                    {
		                    var currency = priceRangeFilter.Currency;
		                    if (!currency.Equals(criteria.Currency, StringComparison.OrdinalIgnoreCase))
			                    continue;
	                    }
                    }

                    var filterQuery = ElasticQueryHelper.CreateQuery(criteria, filter);

                    if (filterQuery != null)
                    {
                        combinedFilter.Must(c => c.Bool(q=>filterQuery));
                    }
                }

                mainFilter.Bool(bl => combinedFilter);
            }
            #endregion

            #region CatalogItemSearchCriteria
            if (criteria is CatalogItemSearchCriteria)
            {
                var c = criteria as CatalogItemSearchCriteria;

                mainQuery.Must(m => m
                    .Range(r => r.Field("startdate").To(c.StartDate.ToString("s")))
					);


                if (c.StartDateFrom.HasValue)
                {
                    mainQuery.Must(m => m
                        .Range(r => r.Field("startdate").From(c.StartDateFrom.Value.ToString("s")))
                   );
                }

				if (c.EndDate.HasValue)
				{
					mainQuery.Must(m => m
						.Range(r => r.Field("enddate").From(c.EndDate.Value.ToString("s")))
				   );
				}

				mainQuery.Must(m => m.Term(t => t.Field("__hidden").Value("false")));

                if (c.Outlines != null && c.Outlines.Count > 0)
                    AddQuery("__outline", mainQuery, c.Outlines);

                if (!String.IsNullOrEmpty(c.SearchPhrase))
                {
					AddQueryString("__content", mainQuery, c);
                }

				if (!String.IsNullOrEmpty(c.Catalog))
				{
					AddQuery("catalog", mainQuery, c.Catalog);
				}
            }
            #endregion

            if (criteria is ElasticSearchCriteria)
            {
                var c = criteria as ElasticSearchCriteria;
                mainQuery.Must(m => m.Custom(c.RawQuery));
            }

            builder.Query(q => q.Bool(b => mainQuery));
            builder.Filter(f => mainFilter);

            // Add search facets
            var facets = GetFacets(criteria);
            builder.Facets(f => facets);

            return builder;
        }
        /// <summary>
        /// Adds the facet queries.
        /// </summary>
        /// <param name="param">The param.</param>
        /// <param name="fieldName">Name of the field.</param>
        /// <param name="values">The values.</param>
        private void AddFacetQueries(
            Facets<ESDocument> param, string fieldName, IEnumerable<AttributeFilterValue> values, ISearchCriteria criteria)
        {
            if (values == null) return;

            var ffilter = new BoolFilter<ESDocument>();
            foreach (var f in criteria.CurrentFilters)
            {
                if (!f.Key.Equals(fieldName))
                {
                    var q = ElasticQueryHelper.CreateQuery(criteria, f);
                    ffilter.Must(ff => ff.Bool(bb=>q));
                }
            }

            var facetFilter = new FacetFilter<ESDocument>();
            facetFilter.Bool(f => ffilter);
            
            //var filter = new FacetFilter<ESDocument>();
            //facetFilter.Terms(x => x.Values(values.Select(y => y.Value).ToArray()));
            //var filterFacet = new FilterFacet<ESDocument>();
            //filterFacet.FacetName(fieldName.ToLower()).FacetFilter(f => facetFilter);

            param.Terms(t => t.FacetName(fieldName.ToLower()).Field(fieldName.ToLower()).FacetFilter(ff => facetFilter));
        }
示例#19
0
        public object BuildQuery(ISearchCriteria criteria)
        {
            var builder    = new QueryBuilder <ESDocument>();
            var mainFilter = new Filter <ESDocument>();
            var mainQuery  = new BoolQuery <ESDocument>();

            #region Sorting

            // Add sort order
            if (criteria.Sort != null)
            {
                var fields = criteria.Sort.GetSort();
                foreach (var field in fields)
                {
                    builder.Sort(d => d.Field(field.FieldName, field.IsDescending ? SortDirection.desc : SortDirection.asc, ignoreUnmapped: field.IgnoredUnmapped));
                }
            }

            #endregion

            #region Filters
            // Perform facet filters
            if (criteria.CurrentFilters != null)
            {
                var combinedFilter = new BoolFilter <ESDocument>();
                // group filters
                foreach (var filter in criteria.CurrentFilters)
                {
                    // Skip currencies that are not part of the filter
                    if (filter.GetType() == typeof(PriceRangeFilter)) // special filtering
                    {
                        var priceRangeFilter = filter as PriceRangeFilter;
                        if (priceRangeFilter != null)
                        {
                            var currency = priceRangeFilter.Currency;
                            if (!currency.Equals(criteria.Currency, StringComparison.OrdinalIgnoreCase))
                            {
                                continue;
                            }
                        }
                    }

                    var filterQuery = ElasticQueryHelper.CreateQuery(criteria, filter);

                    if (filterQuery != null)
                    {
                        combinedFilter.Must(c => c.Bool(q => filterQuery));
                    }
                }

                mainFilter.Bool(bl => combinedFilter);
            }
            #endregion

            #region CatalogItemSearchCriteria
            if (criteria is CatalogItemSearchCriteria)
            {
                var c = criteria as CatalogItemSearchCriteria;

                mainQuery.Must(m => m
                               .Range(r => r.Field("startdate").To(c.StartDate.ToString("s")))
                               );


                if (c.StartDateFrom.HasValue)
                {
                    mainQuery.Must(m => m
                                   .Range(r => r.Field("startdate").From(c.StartDateFrom.Value.ToString("s")))
                                   );
                }

                if (c.EndDate.HasValue)
                {
                    mainQuery.Must(m => m
                                   .Range(r => r.Field("enddate").From(c.EndDate.Value.ToString("s")))
                                   );
                }

                mainQuery.Must(m => m.Term(t => t.Field("__hidden").Value("false")));

                if (c.Outlines != null && c.Outlines.Count > 0)
                {
                    AddQuery("__outline", mainQuery, c.Outlines);
                }

                if (!String.IsNullOrEmpty(c.SearchPhrase))
                {
                    var contentField = string.Format("__content_{0}", c.Locale.ToLower());
                    AddQueryString(mainQuery, c, "__content", contentField);
                }

                if (!String.IsNullOrEmpty(c.Catalog))
                {
                    AddQuery("catalog", mainQuery, c.Catalog);
                }

                if (c.ClassTypes != null && c.ClassTypes.Count > 0)
                {
                    AddQuery("__type", mainQuery, c.ClassTypes, false);
                }
            }
            #endregion

            if (criteria is ElasticSearchCriteria)
            {
                var c = criteria as ElasticSearchCriteria;
                mainQuery.Must(m => m.Custom(c.RawQuery));
            }

            builder.Query(q => q.Bool(b => mainQuery));
            builder.Filter(f => mainFilter);

            // Add search facets
            var facets = GetFacets(criteria);
            builder.Facets(f => facets);

            return(builder);
        }
示例#20
0
        private Filter GetSelectedFilter(List <FacetGroupOption> options, string currentField)
        {
            var filters = new List <Filter>();
            var facets  = _facetRegistry.GetFacetDefinitions();

            foreach (var facetGroupOption in options)
            {
                if (facetGroupOption.GroupFieldName.Equals(currentField))
                {
                    continue;
                }

                var filter = facets.FirstOrDefault(x => x.FieldName.Equals(facetGroupOption.GroupFieldName));
                if (filter == null)
                {
                    continue;
                }

                if (!facetGroupOption.Facets.Any(x => x.Selected))
                {
                    continue;
                }

                if (filter is FacetStringDefinition)
                {
                    filters.Add(new TermsFilter(_findClient.GetFullFieldName(facetGroupOption.GroupFieldName, typeof(string)),
                                                facetGroupOption.Facets.Where(x => x.Selected).Select(x => FieldFilterValue.Create(x.Name))));
                }
                else if (filter is FacetStringListDefinition)
                {
                    var termFilters = facetGroupOption.Facets.Where(x => x.Selected)
                                      .Select(s => new TermFilter(facetGroupOption.GroupFieldName, FieldFilterValue.Create(s.Name)))
                                      .Cast <Filter>()
                                      .ToList();

                    filters.AddRange(termFilters);
                }
                else if (filter is FacetNumericRangeDefinition)
                {
                    var rangeFilters = filter as FacetNumericRangeDefinition;
                    foreach (var selectedRange in facetGroupOption.Facets.Where(x => x.Selected))
                    {
                        var rangeFilter = rangeFilters.Range.FirstOrDefault(x => x.Id.Equals(selectedRange.Key.Split(':')[1]));
                        if (rangeFilter == null)
                        {
                            continue;
                        }
                        filters.Add(RangeFilter.Create(_findClient.GetFullFieldName(facetGroupOption.GroupFieldName, typeof(double)),
                                                       rangeFilter.From ?? 0,
                                                       rangeFilter.To ?? double.MaxValue));
                    }
                }
            }

            if (!filters.Any())
            {
                return(null);
            }

            if (filters.Count == 1)
            {
                return(filters.FirstOrDefault());
            }

            var boolFilter = new BoolFilter();

            foreach (var filter in filters)
            {
                boolFilter.Should.Add(filter);
            }
            return(boolFilter);
        }
示例#21
0
 public void Init()
 {
     instance = new BoolFilter();
 }
示例#22
0
 public void Init()
 {
     instance = new BoolFilter();
 }
示例#23
0
        //реакция на тычок по созданному фильтру
        private void lbFilters_SelectedIndexChanged(object sender, EventArgs e)
        {
            if (lbFilters.SelectedIndex < 0)
            {
                btnChange.Enabled = false;
                return;
            }
            else
            {
                btnChange.Enabled = true;
            }

            //если жмут по стрелкам, ничего не происходит
            if (flag)
            {
                flag = false;
                return;
            }

            object obj = lbFilters.SelectedItem;

            if (obj is Bracket)
            {
                btnUp.Enabled = btnDown.Enabled = false;
            }
            else
            {
                btnUp.Enabled = btnDown.Enabled = true;
            }

            if (!(obj is Filter))
            {
                return;
            }

            Filter filter = obj as Filter;

            //проставили в комбик нужный фильтр
            cmbFilters.SelectedIndex = filter.NumInList;

            if (filter is BoolFilter)
            {
                BoolFilter bf = filter as BoolFilter;
                fBool.Value = bf.Value;
            }
            else if (filter is DateFromToFilter)
            {
                DateFromToFilter dftf = filter as DateFromToFilter;

                fDateFromTo.FromValue = dftf.FromValue;
                fDateFromTo.ToValue   = dftf.ToValue;
            }
            else if (filter is FromToFilter)
            {
                FromToFilter ftf = filter as FromToFilter;

                fFromTo.FromValue = ftf.FromValue;
                fFromTo.ToValue   = ftf.ToValue;
            }
            else if (filter is MultiSelectFilter)
            {
                MultiSelectFilter msf = filter as MultiSelectFilter;

                FillMulti();
                fMult.FillList(msf.List, false);

                foreach (ListItem li in msf.List)
                {
                    fMult.RemoveAtRight(li.Name);
                }
            }
            else if (filter is TextFilter)
            {
                TextFilter tf = filter as TextFilter;

                fText.Text = tf.Value;
            }
            else if (filter is MultiFromToFilter)
            {
                MultiSelectFilter msf = (filter as MultiFromToFilter).MultiSelectFilter;

                FillMulti();
                fMult.FillList(msf.List, false);

                foreach (ListItem li in msf.List)
                {
                    fMult.RemoveAtRight(li.Name);
                }

                FromToFilter ftf = (filter as MultiFromToFilter).FromtoFilter;

                fFromTo.FromValue = ftf.FromValue;
                fFromTo.ToValue   = ftf.ToValue;
            }
        }
        /// <summary>
        /// Adds the facet queries.
        /// </summary>
        /// <param name="param">The param.</param>
        /// <param name="fieldName">Name of the field.</param>
        /// <param name="criteria">Search criteria.</param>
        private void AddFacetQueries(Facets<ESDocument> param, string fieldName, ISearchCriteria criteria)
        {
            var ffilter = new BoolFilter<ESDocument>();
            foreach (var f in criteria.CurrentFilters)
            {
                if (!f.Key.Equals(fieldName))
                {
                    var q = ElasticQueryHelper.CreateQuery(criteria, f);
                    ffilter.Must(ff => ff.Bool(bb => q));
                }
            }

            var facetFilter = new FacetFilter<ESDocument>();
            facetFilter.Bool(f => ffilter);

            param.Terms(t => t.FacetName(fieldName.ToLower()).Field(fieldName.ToLower()).FacetFilter(ff => facetFilter));
        }