/// <inheritdoc/> public void DefineAggregation(Nest.AggregationContainerDescriptor <TDocument> agg, IFacetDefinition facet, ICollection <IFacetDefinition> facetList, FacetListInput selectedFacets, string portfolio) { /* Récupère le nom du champ. */ var 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); var hasFilterQuery = !string.IsNullOrEmpty(filterQuery); agg.Filter(facet.Code, f => { if (hasFilterQuery) { /* Crée le filtre sur les facettes multi-sélectionnables. */ f.Filter(q => q.QueryString(qs => qs.Query(filterQuery))); } return(f.Aggregations(aa => aa /* Créé une agrégation sur les valeurs discrètes du champ. */ .Terms(facet.Code, st => st.Field(fieldName).Size(50)) /* Créé une agrégation pour les valeurs non renseignées du champ. */ .Missing(facet.Code + MissingFacetPrefix, ad => ad.Field(fieldName)))); }); }
/// <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))))); }