@@ -269,41 +269,47 @@ public MultiMatch(
269269 // options. We also remember the originally supplied arguments in order to make tests happy.
270270 private final transient List <Expression > fields ;
271271 private final transient List <Expression > fieldsOriginal ;
272+ private final transient List <Expression > fieldsAndQuery ;
272273 private final transient Expression options ;
273274 private final transient Expression optionsOriginal ;
274275
275- private static List <Expression > initChildren (Expression query , List <Expression > fields , Expression options ) {
276- Stream <Expression > fieldsAndQuery = Stream .concat (Stream .of (query ), fields .stream ());
277- return (options == null ? fieldsAndQuery : Stream .concat (fieldsAndQuery , Stream .of (options ))).toList ();
276+ private static List <Expression > initChildren (List <Expression > fieldsAndQuery , Expression options ) {
277+ return (options == null ? fieldsAndQuery .stream () : Stream .concat (fieldsAndQuery .stream (), Stream .of (options ))).toList ();
278278 }
279279
280- private MultiMatch (Source source , Expression query , List <Expression > fields , Expression options , QueryBuilder queryBuilder ) {
281- super (source , query , initChildren (query , fields , options ), queryBuilder );
282- this .fieldsOriginal = fields ;
280+ private MultiMatch (Source source , Expression field , List <Expression > fieldsAndQuery , Expression options , QueryBuilder queryBuilder ) {
281+ super (
282+ source ,
283+ fieldsAndQuery .getLast (),
284+ initChildren (Stream .concat (Stream .of (field ), fieldsAndQuery .stream ()).toList (), options ),
285+ queryBuilder
286+ );
287+ this .fieldsAndQuery = Stream .concat (Stream .of (field ), fieldsAndQuery .subList (0 , fieldsAndQuery .size ()).stream ()).toList ();
288+ this .fieldsOriginal = Stream .concat (Stream .of (field ), fieldsAndQuery .subList (0 , fieldsAndQuery .size () - 1 ).stream ()).toList ();
283289 this .optionsOriginal = options ;
284290
285291 if (options == null || options instanceof MapExpression ) {
286- this .fields = fields ;
292+ this .fields = fieldsOriginal ;
287293 this .options = options ;
288294 } else {
289- this .fields = Stream .concat (fields .stream (), Stream .of (options )).toList ();
295+ this .fields = Stream .concat (fieldsOriginal .stream (), Stream .of (options )).toList ();
290296 this .options = null ;
291297 }
292298 }
293299
294300 private static MultiMatch readFrom (StreamInput in ) throws IOException {
295301 Source source = Source .readFrom ((PlanStreamInput ) in );
296- Expression query = in .readNamedWriteable (Expression .class );
297- List <Expression > fields = in .readNamedWriteableCollectionAsList (Expression .class );
302+ Expression firstField = in .readNamedWriteable (Expression .class );
303+ List <Expression > fieldsAndQuery = in .readNamedWriteableCollectionAsList (Expression .class );
298304 QueryBuilder queryBuilder = in .readOptionalNamedWriteable (QueryBuilder .class );
299- return new MultiMatch (source , query , fields , null , queryBuilder );
305+ return new MultiMatch (source , firstField , fieldsAndQuery , null , queryBuilder );
300306 }
301307
302308 @ Override
303309 public void writeTo (StreamOutput out ) throws IOException {
304310 source ().writeTo (out );
305- out .writeNamedWriteable (query ());
306- out .writeNamedWriteableCollection (fields );
311+ out .writeNamedWriteable (fieldsAndQuery . getFirst ());
312+ out .writeNamedWriteableCollection (fieldsAndQuery . subList ( 1 , fieldsAndQuery . size () - 1 ) );
307313 out .writeOptionalNamedWriteable (queryBuilder ());
308314 }
309315
@@ -331,7 +337,13 @@ public Expression replaceChildren(List<Expression> newChildren) {
331337 @ Override
332338 protected NodeInfo <? extends Expression > info () {
333339 // Specifically create new instance with original arguments.
334- return NodeInfo .create (this , MultiMatch ::new , query (), fieldsOriginal , optionsOriginal );
340+ return NodeInfo .create (
341+ this ,
342+ MultiMatch ::new ,
343+ fieldsAndQuery .getFirst (),
344+ fieldsAndQuery .subList (1 , fieldsAndQuery .size ()),
345+ optionsOriginal
346+ );
335347 }
336348
337349 @ Override
@@ -349,7 +361,13 @@ protected Query translate(TranslatorHandler handler) {
349361 @ Override
350362 public Expression replaceQueryBuilder (QueryBuilder queryBuilder ) {
351363 // Specifically create new instance with original arguments.
352- return new MultiMatch (source (), query (), fieldsOriginal , optionsOriginal , queryBuilder );
364+ return new MultiMatch (
365+ source (),
366+ fieldsAndQuery .getFirst (),
367+ fieldsAndQuery .subList (1 , fieldsAndQuery .size ()),
368+ optionsOriginal ,
369+ queryBuilder
370+ );
353371 }
354372
355373 public List <Expression > fields () {
0 commit comments