@@ -382,141 +382,148 @@ private static Pair<AggregationBuilder, MetricParser> createRegularAggregation(
382382 switch (aggCall .getAggregation ().kind ) {
383383 case AVG :
384384 return Pair .of (
385- helper .build (args .get (0 ), AggregationBuilders .avg (aggFieldName )),
386- new SingleValueParser (aggFieldName ));
385+ helper .build (args .get (0 ), AggregationBuilders .avg (aggFieldName )),
386+ new SingleValueParser (aggFieldName ));
387387 case SUM :
388388 // 1. Only case SUM, skip SUM0 / COUNT since calling avg() in DSL should be faster.
389389 // 2. To align with databases, SUM0 is not preferred now.
390390 return Pair .of (
391- helper .build (args .get (0 ), AggregationBuilders .sum (aggFieldName )),
392- new SingleValueParser (aggFieldName ));
391+ helper .build (args .get (0 ), AggregationBuilders .sum (aggFieldName )),
392+ new SingleValueParser (aggFieldName ));
393393 case COUNT :
394394 return Pair .of (
395- helper .build (
396- !args .isEmpty () ? args .get (0 ) : null , AggregationBuilders .count (aggFieldName )),
397- new SingleValueParser (aggFieldName ));
395+ helper .build (
396+ !args .isEmpty () ? args .get (0 ) : null , AggregationBuilders .count (aggFieldName )),
397+ new SingleValueParser (aggFieldName ));
398398 case MIN : {
399399 ExprType fieldType =
400- OpenSearchTypeFactory .convertRelDataTypeToExprType (args .get (0 ).getType ());
400+ OpenSearchTypeFactory .convertRelDataTypeToExprType (args .get (0 ).getType ());
401401 if (supportsMaxMinAggregation (fieldType )) {
402402 return Pair .of (
403- helper .build (args .get (0 ), AggregationBuilders .min (aggFieldName )),
404- new SingleValueParser (aggFieldName ));
403+ helper .build (args .get (0 ), AggregationBuilders .min (aggFieldName )),
404+ new SingleValueParser (aggFieldName ));
405405 } else {
406406 return Pair .of (
407- AggregationBuilders .topHits (aggFieldName )
408- .fetchSource (helper .inferNamedField (args .get (0 )).getRootName (), null )
409- .size (1 )
410- .from (0 )
411- .sort (
412- helper .inferNamedField (args .get (0 )).getReferenceForTermQuery (),
413- SortOrder .ASC ),
414- new TopHitsParser (aggFieldName , true ));
407+ AggregationBuilders .topHits (aggFieldName )
408+ .fetchSource (helper .inferNamedField (args .get (0 )).getRootName (), null )
409+ .size (1 )
410+ .from (0 )
411+ .sort (
412+ helper .inferNamedField (args .get (0 )).getReferenceForTermQuery (),
413+ SortOrder .ASC ),
414+ new TopHitsParser (aggFieldName , true ));
415415 }
416416 }
417417 case MAX : {
418418 ExprType fieldType =
419- OpenSearchTypeFactory .convertRelDataTypeToExprType (args .get (0 ).getType ());
419+ OpenSearchTypeFactory .convertRelDataTypeToExprType (args .get (0 ).getType ());
420420 if (supportsMaxMinAggregation (fieldType )) {
421421 return Pair .of (
422- helper .build (args .get (0 ), AggregationBuilders .max (aggFieldName )),
423- new SingleValueParser (aggFieldName ));
422+ helper .build (args .get (0 ), AggregationBuilders .max (aggFieldName )),
423+ new SingleValueParser (aggFieldName ));
424424 } else {
425425 return Pair .of (
426- AggregationBuilders .topHits (aggFieldName )
427- .fetchSource (helper .inferNamedField (args .get (0 )).getRootName (), null )
428- .size (1 )
429- .from (0 )
430- .sort (
431- helper .inferNamedField (args .get (0 )).getReferenceForTermQuery (),
432- SortOrder .DESC ),
433- new TopHitsParser (aggFieldName , true ));
426+ AggregationBuilders .topHits (aggFieldName )
427+ .fetchSource (helper .inferNamedField (args .get (0 )).getRootName (), null )
428+ .size (1 )
429+ .from (0 )
430+ .sort (
431+ helper .inferNamedField (args .get (0 )).getReferenceForTermQuery (),
432+ SortOrder .DESC ),
433+ new TopHitsParser (aggFieldName , true ));
434434 }
435435 }
436436 case VAR_SAMP :
437437 return Pair .of (
438- helper .build (args .get (0 ), AggregationBuilders .extendedStats (aggFieldName )),
439- new StatsParser (ExtendedStats ::getVarianceSampling , aggFieldName ));
438+ helper .build (args .get (0 ), AggregationBuilders .extendedStats (aggFieldName )),
439+ new StatsParser (ExtendedStats ::getVarianceSampling , aggFieldName ));
440440 case VAR_POP :
441441 return Pair .of (
442- helper .build (args .get (0 ), AggregationBuilders .extendedStats (aggFieldName )),
443- new StatsParser (ExtendedStats ::getVariancePopulation , aggFieldName ));
442+ helper .build (args .get (0 ), AggregationBuilders .extendedStats (aggFieldName )),
443+ new StatsParser (ExtendedStats ::getVariancePopulation , aggFieldName ));
444444 case STDDEV_SAMP :
445445 return Pair .of (
446- helper .build (args .get (0 ), AggregationBuilders .extendedStats (aggFieldName )),
447- new StatsParser (ExtendedStats ::getStdDeviationSampling , aggFieldName ));
446+ helper .build (args .get (0 ), AggregationBuilders .extendedStats (aggFieldName )),
447+ new StatsParser (ExtendedStats ::getStdDeviationSampling , aggFieldName ));
448448 case STDDEV_POP :
449449 return Pair .of (
450- helper .build (args .get (0 ), AggregationBuilders .extendedStats (aggFieldName )),
451- new StatsParser (ExtendedStats ::getStdDeviationPopulation , aggFieldName ));
450+ helper .build (args .get (0 ), AggregationBuilders .extendedStats (aggFieldName )),
451+ new StatsParser (ExtendedStats ::getStdDeviationPopulation , aggFieldName ));
452452 case ARG_MAX :
453453 return Pair .of (
454- AggregationBuilders .topHits (aggFieldName )
455- .fetchSource (helper .inferNamedField (args .get (0 )).getRootName (), null )
456- .size (1 )
457- .from (0 )
458- .sort (
459- helper .inferNamedField (args .get (1 )).getRootName (),
460- org .opensearch .search .sort .SortOrder .DESC ),
461- new ArgMaxMinParser (aggFieldName ));
454+ AggregationBuilders .topHits (aggFieldName )
455+ .fetchSource (helper .inferNamedField (args .get (0 )).getRootName (), null )
456+ .size (1 )
457+ .from (0 )
458+ .sort (
459+ helper .inferNamedField (args .get (1 )).getRootName (),
460+ org .opensearch .search .sort .SortOrder .DESC ),
461+ new ArgMaxMinParser (aggFieldName ));
462462 case ARG_MIN :
463463 return Pair .of (
464- AggregationBuilders .topHits (aggFieldName )
465- .fetchSource (helper .inferNamedField (args .get (0 )).getRootName (), null )
466- .size (1 )
467- .from (0 )
468- .sort (
469- helper .inferNamedField (args .get (1 )).getRootName (),
470- org .opensearch .search .sort .SortOrder .ASC ),
471- new ArgMaxMinParser (aggFieldName ));
464+ AggregationBuilders .topHits (aggFieldName )
465+ .fetchSource (helper .inferNamedField (args .get (0 )).getRootName (), null )
466+ .size (1 )
467+ .from (0 )
468+ .sort (
469+ helper .inferNamedField (args .get (1 )).getRootName (),
470+ org .opensearch .search .sort .SortOrder .ASC ),
471+ new ArgMaxMinParser (aggFieldName ));
472472 case OTHER_FUNCTION :
473473 BuiltinFunctionName functionName =
474- BuiltinFunctionName .ofAggregation (aggCall .getAggregation ().getName ()).get ();
474+ BuiltinFunctionName .ofAggregation (aggCall .getAggregation ().getName ()).get ();
475475 switch (functionName ) {
476476 case TAKE :
477477 return Pair .of (
478- AggregationBuilders .topHits (aggFieldName )
479- .fetchSource (helper .inferNamedField (args .get (0 )).getRootName (), null )
480- .size (helper .inferValue (args .get (1 ), Integer .class ))
481- .from (0 ),
482- new TopHitsParser (aggFieldName ));
478+ AggregationBuilders .topHits (aggFieldName )
479+ .fetchSource (helper .inferNamedField (args .get (0 )).getRootName (), null )
480+ .size (helper .inferValue (args .get (1 ), Integer .class ))
481+ .from (0 ),
482+ new TopHitsParser (aggFieldName ));
483483 case FIRST :
484484 TopHitsAggregationBuilder firstBuilder =
485- AggregationBuilders .topHits (aggFieldName ).size (1 ).from (0 );
485+ AggregationBuilders .topHits (aggFieldName ).size (1 ).from (0 );
486486 if (!args .isEmpty ()) {
487487 firstBuilder .fetchSource (helper .inferNamedField (args .get (0 )).getRootName (), null );
488488 }
489489 return Pair .of (firstBuilder , new TopHitsParser (aggFieldName , true ));
490490 case LAST :
491491 TopHitsAggregationBuilder lastBuilder =
492- AggregationBuilders .topHits (aggFieldName )
493- .size (1 )
494- .from (0 )
495- .sort ("_doc" , org .opensearch .search .sort .SortOrder .DESC );
492+ AggregationBuilders .topHits (aggFieldName )
493+ .size (1 )
494+ .from (0 )
495+ .sort ("_doc" , org .opensearch .search .sort .SortOrder .DESC );
496496 if (!args .isEmpty ()) {
497497 lastBuilder .fetchSource (helper .inferNamedField (args .get (0 )).getRootName (), null );
498498 }
499499 return Pair .of (lastBuilder , new TopHitsParser (aggFieldName , true ));
500500 case PERCENTILE_APPROX :
501501 PercentilesAggregationBuilder aggBuilder =
502- helper
503- .build (args .get (0 ), AggregationBuilders .percentiles (aggFieldName ))
504- .percentiles (helper .inferValue (args .get (1 ), Double .class ));
502+ helper
503+ .build (args .get (0 ), AggregationBuilders .percentiles (aggFieldName ))
504+ .percentiles (helper .inferValue (args .get (1 ), Double .class ));
505505 /* See {@link PercentileApproxFunction}, PERCENTILE_APPROX accepts args of [FIELD, PERCENTILE, TYPE, COMPRESSION(optional)] */
506506 if (args .size () > 3 ) {
507507 aggBuilder .compression (helper .inferValue (args .get (3 ), Double .class ));
508508 }
509509 return Pair .of (aggBuilder , new SinglePercentileParser (aggFieldName ));
510+ case DISTINCT_COUNT_APPROX :
511+ return Pair .of (
512+ helper .build (
513+ !args .isEmpty () ? args .getFirst () : null ,
514+ AggregationBuilders .cardinality (aggFieldName )),
515+ new SingleValueParser (aggFieldName ));
510516 default :
511517 throw new AggregateAnalyzer .AggregateAnalyzerException (
512- String .format ("Unsupported push-down aggregator %s" , aggCall .getAggregation ()));
518+ String .format ("Unsupported push-down aggregator %s" , aggCall .getAggregation ()));
513519 }
514520 default :
515521 throw new AggregateAnalyzer .AggregateAnalyzerException (
516- String .format ("unsupported aggregator %s" , aggCall .getAggregation ()));
522+ String .format ("unsupported aggregator %s" , aggCall .getAggregation ()));
517523 }
518524 }
519525
526+
520527 private static boolean supportsMaxMinAggregation (ExprType fieldType ) {
521528 ExprType coreType =
522529 (fieldType instanceof OpenSearchDataType )
0 commit comments