@@ -193,9 +193,10 @@ export async function getNumberHistogram(
193193 ? minMaxResult . aggregations ! . sample . top_values
194194 : {
195195 buckets : [ ] as Array < { doc_count : number ; key : string | number } > ,
196+ sum_other_doc_count : 0 ,
196197 } ;
197198
198- const topValuesBuckets = {
199+ const topValues = {
199200 buckets : terms . buckets . map ( ( bucket ) => ( {
200201 count : bucket . doc_count ,
201202 key : bucket . key ,
@@ -211,9 +212,11 @@ export async function getNumberHistogram(
211212 if ( histogramInterval === 0 ) {
212213 return {
213214 totalDocuments : getHitsTotal ( minMaxResult ) ,
214- sampledValues : minMaxResult . aggregations ! . sample . sample_count . value ! ,
215+ sampledValues :
216+ sumSampledValues ( topValues , terms . sum_other_doc_count ) ||
217+ minMaxResult . aggregations ! . sample . sample_count . value ! ,
215218 sampledDocuments : minMaxResult . aggregations ! . sample . doc_count ,
216- topValues : topValuesBuckets ,
219+ topValues,
217220 histogram : useTopHits
218221 ? { buckets : [ ] }
219222 : {
@@ -244,14 +247,16 @@ export async function getNumberHistogram(
244247 return {
245248 totalDocuments : getHitsTotal ( minMaxResult ) ,
246249 sampledDocuments : minMaxResult . aggregations ! . sample . doc_count ,
247- sampledValues : minMaxResult . aggregations ! . sample . sample_count . value ! ,
250+ sampledValues :
251+ sumSampledValues ( topValues , terms . sum_other_doc_count ) ||
252+ minMaxResult . aggregations ! . sample . sample_count . value ! ,
248253 histogram : {
249254 buckets : histogramResult . aggregations ! . sample . histo . buckets . map ( ( bucket ) => ( {
250255 count : bucket . doc_count ,
251256 key : bucket . key ,
252257 } ) ) ,
253258 } ,
254- topValues : topValuesBuckets ,
259+ topValues,
255260 } ;
256261}
257262
@@ -284,16 +289,22 @@ export async function getStringSamples(
284289 { body : { aggs : typeof topValuesBody } }
285290 > ;
286291
292+ const topValues = {
293+ buckets : topValuesResult . aggregations ! . sample . top_values . buckets . map ( ( bucket ) => ( {
294+ count : bucket . doc_count ,
295+ key : bucket . key ,
296+ } ) ) ,
297+ } ;
298+
287299 return {
288300 totalDocuments : getHitsTotal ( topValuesResult ) ,
289301 sampledDocuments : topValuesResult . aggregations ! . sample . doc_count ,
290- sampledValues : topValuesResult . aggregations ! . sample . sample_count . value ! ,
291- topValues : {
292- buckets : topValuesResult . aggregations ! . sample . top_values . buckets . map ( ( bucket ) => ( {
293- count : bucket . doc_count ,
294- key : bucket . key ,
295- } ) ) ,
296- } ,
302+ sampledValues :
303+ sumSampledValues (
304+ topValues ,
305+ topValuesResult . aggregations ! . sample . top_values . sum_other_doc_count
306+ ) || topValuesResult . aggregations ! . sample . sample_count . value ! ,
307+ topValues,
297308 } ;
298309}
299310
@@ -392,3 +403,14 @@ function getFieldRef(field: DataViewField) {
392403const getHitsTotal = ( body : estypes . SearchResponse ) : number => {
393404 return ( body . hits . total as estypes . SearchTotalHits ) . value ?? body . hits . total ?? 0 ;
394405} ;
406+
407+ // We could use `aggregations.sample.sample_count.value` instead, but it does not always give a correct sum
408+ // See Github issue #144625
409+ export function sumSampledValues (
410+ topValues : FieldStatsResponse < string | number > [ 'topValues' ] ,
411+ sumOtherDocCount : number
412+ ) : number {
413+ const valuesInTopBuckets =
414+ topValues ?. buckets ?. reduce ( ( prev , bucket ) => bucket . count + prev , 0 ) || 0 ;
415+ return valuesInTopBuckets + ( sumOtherDocCount || 0 ) ;
416+ }
0 commit comments