Exemple #1
0
        /// <summary>
        /// Crée le filtre pour une facette sur les autres facettes multi-sélectionnables.
        /// </summary>
        /// <param name="builder">Query builder.</param>
        /// <param name="facet">Facette.</param>
        /// <param name="facetList">Liste des facettes.</param>
        /// <param name="selectedFacets">Facettes sélectionnées.</param>
        /// <param name="facetQueryBuilder">Builder de requête pour une facette.</param>
        /// <returns>La filtre.</returns>
        public static string BuildMultiSelectableFacetFilter(ElasticQueryBuilder builder, IFacetDefinition facet, ICollection <IFacetDefinition> facetList, FacetListInput selectedFacets, Func <string, IFacetDefinition, string, string> facetQueryBuilder)
        {
            return(builder.BuildAndQuery(selectedFacets?
                                         .Select(sf => {
                /* On ne filtre pas sur la facette en cours. */
                if (sf.Key == facet.Code)
                {
                    return null;
                }

                var targetFacet = facetList.Single(f => f.Code == sf.Key);

                /* On n'ajoute que les facettes multi-sélectionnables */
                if (targetFacet.IsMultiSelectable == false)
                {
                    return null;
                }

                return builder.BuildOrQuery(sf.Value
                                            .Select(v => facetQueryBuilder(v, targetFacet, null))
                                            .ToArray());
            })
                                         .Where(sf => sf != null)
                                         .ToArray()));
        }
        /// <inheritdoc/>
        public void DefineAggregation(Nest.AggregationContainerDescriptor <TDocument> agg, IFacetDefinition facet, ICollection <IFacetDefinition> facetList, FacetListInput selectedFacets, string portfolio)
        {
            if (string.IsNullOrEmpty(portfolio))
            {
                /* Portefeuille de l'utilisateur vide : on ne définit pas d'agregations. */
                return;
            }

            /* Récupère le nom du champ. */
            string fieldName = _document.Fields[facet.FieldName].FieldName;

            /* On construit la requête de filtrage sur les autres facettes multi-sélectionnables. */
            var filterQuery = FacetingUtil.BuildMultiSelectableFacetFilter(_builder, facet, facetList, selectedFacets, CreateFacetSubQuery);

            /* Créé une agrégation avec deux buckets. */
            var inQuery  = _builder.BuildAndQuery(_builder.BuildInclusiveInclude(fieldName, portfolio), filterQuery);
            var outQuery = _builder.BuildAndQuery(_builder.BuildExcludeQuery(fieldName, portfolio), filterQuery);

            agg.Filters(facet.Code, st => st.NamedFilters(x => x
                                                          /* Une pour les documents dans le portefeuille */
                                                          .Filter(InValue, d => d.QueryString(query => query.Query(inQuery)))
                                                          /* Une pour les documents absents du portefeuille */
                                                          .Filter(OutValue, d => d.QueryString(query => query.Query(outQuery)))));
        }