@@ -176,7 +176,63 @@ public static Iterable<Object[]> parameters() {
176176 equalTo (new BytesRef (InetAddressPoint .encode (InetAddresses .forString ("ffff::" ))))
177177 )
178178 ),
179-
179+ // For cases where we have limit == 1 and an outputField, we should not use the surrogate
180+ new TestCaseSupplier (
181+ List .of (DataType .DOUBLE , DataType .INTEGER , DataType .KEYWORD , DataType .INTEGER ),
182+ () -> new TestCaseSupplier .TestCase (
183+ List .of (
184+ TestCaseSupplier .TypedData .multiRow (List .of (3.14 , 2.71 , 1.41 ), DataType .DOUBLE , "field" ),
185+ new TestCaseSupplier .TypedData (1 , DataType .INTEGER , "limit" ).forceLiteral (),
186+ new TestCaseSupplier .TypedData (new BytesRef ("desc" ), DataType .KEYWORD , "order" ).forceLiteral (),
187+ TestCaseSupplier .TypedData .multiRow (List .of (1 , 2 , 3 ), DataType .INTEGER , "outputField" )
188+ ),
189+ "TopDoubleInt" ,
190+ DataType .INTEGER ,
191+ equalTo (1 )
192+ )
193+ ),
194+ new TestCaseSupplier (
195+ List .of (DataType .DOUBLE , DataType .INTEGER , DataType .KEYWORD , DataType .INTEGER ),
196+ () -> new TestCaseSupplier .TestCase (
197+ List .of (
198+ TestCaseSupplier .TypedData .multiRow (List .of (3.14 , 2.71 , 1.41 ), DataType .DOUBLE , "field" ),
199+ new TestCaseSupplier .TypedData (1 , DataType .INTEGER , "limit" ).forceLiteral (),
200+ new TestCaseSupplier .TypedData (new BytesRef ("asc" ), DataType .KEYWORD , "order" ).forceLiteral (),
201+ TestCaseSupplier .TypedData .multiRow (List .of (1 , 2 , 3 ), DataType .INTEGER , "outputField" )
202+ ),
203+ "TopDoubleInt" ,
204+ DataType .INTEGER ,
205+ equalTo (3 )
206+ )
207+ ),
208+ new TestCaseSupplier (
209+ List .of (DataType .INTEGER , DataType .INTEGER , DataType .KEYWORD , DataType .DOUBLE ),
210+ () -> new TestCaseSupplier .TestCase (
211+ List .of (
212+ TestCaseSupplier .TypedData .multiRow (List .of (1 , 2 , 3 ), DataType .INTEGER , "field" ),
213+ new TestCaseSupplier .TypedData (1 , DataType .INTEGER , "limit" ).forceLiteral (),
214+ new TestCaseSupplier .TypedData (new BytesRef ("desc" ), DataType .KEYWORD , "order" ).forceLiteral (),
215+ TestCaseSupplier .TypedData .multiRow (List .of (3.14 , 2.71 , 1.41 ), DataType .DOUBLE , "outputField" )
216+ ),
217+ "TopIntDouble" ,
218+ DataType .DOUBLE ,
219+ equalTo (1.41 )
220+ )
221+ ),
222+ new TestCaseSupplier (
223+ List .of (DataType .INTEGER , DataType .INTEGER , DataType .KEYWORD , DataType .DOUBLE ),
224+ () -> new TestCaseSupplier .TestCase (
225+ List .of (
226+ TestCaseSupplier .TypedData .multiRow (List .of (1 , 2 , 3 ), DataType .INTEGER , "field" ),
227+ new TestCaseSupplier .TypedData (1 , DataType .INTEGER , "limit" ).forceLiteral (),
228+ new TestCaseSupplier .TypedData (new BytesRef ("asc" ), DataType .KEYWORD , "order" ).forceLiteral (),
229+ TestCaseSupplier .TypedData .multiRow (List .of (3.14 , 2.71 , 1.41 ), DataType .DOUBLE , "outputField" )
230+ ),
231+ "TopIntDouble" ,
232+ DataType .DOUBLE ,
233+ equalTo (3.14 )
234+ )
235+ ),
180236 // Folding
181237 new TestCaseSupplier (
182238 List .of (DataType .BOOLEAN , DataType .INTEGER , DataType .KEYWORD ),
@@ -455,10 +511,10 @@ private static TestCaseSupplier makeSupplier(
455511 .toList ();
456512
457513 String baseName ;
458- if (limit != 1 ) {
514+ if (limit != 1 || outputFieldSupplied ) {
459515 baseName = "Top" ;
460516 } else {
461- // If the limit is 1 we rewrite TOP into MIN or MAX and never run our lovely TOP code.
517+ // If the limit is 1 and there is no `outputField` we rewrite TOP into MIN or MAX and never run our lovely TOP code.
462518 if (isAscending ) {
463519 baseName = "Min" ;
464520 } else {
0 commit comments