/// <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))))); }