1212import org .elasticsearch .compute .data .AggregateMetricDoubleBlockBuilder ;
1313import org .elasticsearch .compute .data .Block ;
1414import org .elasticsearch .compute .data .DoubleBlock ;
15+ import org .elasticsearch .compute .data .DoubleVector ;
1516import org .elasticsearch .compute .data .IntBlock ;
1617import org .elasticsearch .compute .data .LongBlock ;
1718import org .elasticsearch .compute .data .Page ;
19+ import org .elasticsearch .compute .data .Vector ;
1820import org .elasticsearch .compute .operator .DriverContext ;
1921import org .elasticsearch .compute .operator .EvalOperator ;
2022import org .elasticsearch .core .Releasables ;
2527import org .elasticsearch .xpack .esql .core .type .DataType ;
2628import org .elasticsearch .xpack .esql .expression .function .FunctionInfo ;
2729import org .elasticsearch .xpack .esql .expression .function .Param ;
28- import org .elasticsearch .xpack .esql .expression .function .scalar .math .Cast ;
2930import org .elasticsearch .xpack .esql .type .EsqlDataTypeConverter ;
3031
3132import java .io .IOException ;
@@ -131,40 +132,60 @@ public EvalOperator.ExpressionEvaluator get(DriverContext context) {
131132 final EvalOperator .ExpressionEvaluator eval = fieldEvaluator .get (context );
132133
133134 return new EvalOperator .ExpressionEvaluator () {
135+ private Block evalBlock (Block block ) {
136+ int positionCount = block .getPositionCount ();
137+ DoubleBlock doubleBlock = (DoubleBlock ) block ;
138+ try (
139+ AggregateMetricDoubleBlockBuilder result = context .blockFactory ()
140+ .newAggregateMetricDoubleBlockBuilder (positionCount )
141+ ) {
142+ CompensatedSum sum = new CompensatedSum ();
143+ for (int p = 0 ; p < positionCount ; p ++) {
144+ int valueCount = doubleBlock .getValueCount (p );
145+ int start = doubleBlock .getFirstValueIndex (p );
146+ int end = start + valueCount ;
147+ if (valueCount == 0 ) {
148+ result .appendNull ();
149+ continue ;
150+ }
151+ double min = Double .POSITIVE_INFINITY ;
152+ double max = Double .NEGATIVE_INFINITY ;
153+ for (int i = start ; i < end ; i ++) {
154+ double current = doubleBlock .getDouble (i );
155+ min = Math .min (min , current );
156+ max = Math .max (max , current );
157+ sum .add (current );
158+ }
159+ result .min ().appendDouble (min );
160+ result .max ().appendDouble (max );
161+ result .sum ().appendDouble (sum .value ());
162+ result .count ().appendInt (valueCount );
163+ sum .reset (0 , 0 );
164+ }
165+ return result .build ();
166+ }
167+ }
168+
169+ private Block evalVector (Vector vector ) {
170+ int positionCount = vector .getPositionCount ();
171+ DoubleVector doubleVector = (DoubleVector ) vector ;
172+ try (
173+ AggregateMetricDoubleBlockBuilder .AggregateMetricDoubleVectorBuilder builder = context .blockFactory ()
174+ .newAggregateMetricDoubleVectorBuilder (positionCount )
175+ ) {
176+ for (int p = 0 ; p < positionCount ; p ++) {
177+ double value = doubleVector .getDouble (p );
178+ builder .appendValue (value );
179+ }
180+ return builder .build ();
181+ }
182+ }
183+
134184 @ Override
135185 public Block eval (Page page ) {
136186 try (Block block = eval .eval (page )) {
137- int positionCount = block .getPositionCount ();
138- DoubleBlock doubleBlock = (DoubleBlock ) block ;
139- try (
140- AggregateMetricDoubleBlockBuilder result = context .blockFactory ()
141- .newAggregateMetricDoubleBlockBuilder (positionCount )
142- ) {
143- CompensatedSum sum = new CompensatedSum ();
144- for (int p = 0 ; p < positionCount ; p ++) {
145- int valueCount = doubleBlock .getValueCount (p );
146- int start = doubleBlock .getFirstValueIndex (p );
147- int end = start + valueCount ;
148- if (valueCount == 0 ) {
149- result .appendNull ();
150- continue ;
151- }
152- double min = Double .POSITIVE_INFINITY ;
153- double max = Double .NEGATIVE_INFINITY ;
154- for (int i = start ; i < end ; i ++) {
155- double current = doubleBlock .getDouble (i );
156- min = Math .min (min , current );
157- max = Math .max (max , current );
158- sum .add (current );
159- }
160- result .min ().appendDouble (min );
161- result .max ().appendDouble (max );
162- result .sum ().appendDouble (sum .value ());
163- result .count ().appendInt (valueCount );
164- sum .reset (0 , 0 );
165- }
166- return result .build ();
167- }
187+ Vector vector = block .asVector ();
188+ return vector == null ? evalBlock (block ) : evalVector (vector );
168189 }
169190 }
170191
@@ -175,7 +196,7 @@ public void close() {
175196
176197 @ Override
177198 public String toString () {
178- return "ToAggregateMetricDoubleFromDoubleEvaluator [field=" + eval + "]" ;
199+ return "ToAggregateMetricDoubleEvaluator [field=" + eval + "]" ;
179200 }
180201 };
181202 }
0 commit comments