3232import org .elasticsearch .action .get .GetRequest ;
3333import org .elasticsearch .action .index .IndexRequest ;
3434import org .elasticsearch .action .search .ClearScrollRequest ;
35+ import org .elasticsearch .action .search .MultiSearchRequest ;
3536import org .elasticsearch .action .search .SearchRequest ;
3637import org .elasticsearch .action .search .SearchScrollRequest ;
3738import org .elasticsearch .action .search .SearchType ;
4243import org .elasticsearch .action .support .replication .ReplicatedWriteRequest ;
4344import org .elasticsearch .action .support .replication .ReplicationRequest ;
4445import org .elasticsearch .action .update .UpdateRequest ;
46+ import org .elasticsearch .common .CheckedBiConsumer ;
4547import org .elasticsearch .common .Strings ;
4648import org .elasticsearch .common .bytes .BytesArray ;
4749import org .elasticsearch .common .bytes .BytesReference ;
5658import org .elasticsearch .index .VersionType ;
5759import org .elasticsearch .index .query .TermQueryBuilder ;
5860import org .elasticsearch .rest .action .search .RestSearchAction ;
61+ import org .elasticsearch .search .Scroll ;
5962import org .elasticsearch .search .aggregations .bucket .terms .TermsAggregationBuilder ;
6063import org .elasticsearch .search .aggregations .support .ValueType ;
6164import org .elasticsearch .search .builder .SearchSourceBuilder ;
7275import java .io .InputStream ;
7376import java .lang .reflect .Constructor ;
7477import java .lang .reflect .Modifier ;
78+ import java .util .ArrayList ;
7579import java .util .HashMap ;
80+ import java .util .List ;
7681import java .util .Locale ;
7782import java .util .Map ;
7883import java .util .StringJoiner ;
84+ import java .util .function .BiConsumer ;
7985import java .util .function .Consumer ;
8086import java .util .function .Function ;
8187import java .util .function .Supplier ;
8288
8389import static java .util .Collections .singletonMap ;
90+ import static org .elasticsearch .client .Request .REQUEST_BODY_CONTENT_TYPE ;
8491import static org .elasticsearch .client .Request .enforceSameContentType ;
92+ import static org .elasticsearch .search .RandomSearchRequestGenerator .randomSearchRequest ;
8593import static org .elasticsearch .test .hamcrest .ElasticsearchAssertions .assertToXContentEquivalent ;
8694
8795public class RequestTests extends ESTestCase {
@@ -771,6 +779,55 @@ public void testSearch() throws Exception {
771779 }
772780 }
773781
782+ public void testMultiSearch () throws IOException {
783+ int numberOfSearchRequests = randomIntBetween (0 , 32 );
784+ MultiSearchRequest multiSearchRequest = new MultiSearchRequest ();
785+ for (int i = 0 ; i < numberOfSearchRequests ; i ++) {
786+ SearchRequest searchRequest = randomSearchRequest (() -> {
787+ // No need to return a very complex SearchSourceBuilder here, that is tested elsewhere
788+ SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder ();
789+ searchSourceBuilder .from (randomInt (10 ));
790+ searchSourceBuilder .size (randomIntBetween (20 , 100 ));
791+ return searchSourceBuilder ;
792+ });
793+ // scroll is not supported in the current msearch api, so unset it:
794+ searchRequest .scroll ((Scroll ) null );
795+ // only expand_wildcards, ignore_unavailable and allow_no_indices can be specified from msearch api, so unset other options:
796+ IndicesOptions randomlyGenerated = searchRequest .indicesOptions ();
797+ IndicesOptions msearchDefault = new MultiSearchRequest ().indicesOptions ();
798+ searchRequest .indicesOptions (IndicesOptions .fromOptions (
799+ randomlyGenerated .ignoreUnavailable (), randomlyGenerated .allowNoIndices (), randomlyGenerated .expandWildcardsOpen (),
800+ randomlyGenerated .expandWildcardsClosed (), msearchDefault .allowAliasesToMultipleIndices (),
801+ msearchDefault .forbidClosedIndices (), msearchDefault .ignoreAliases ()
802+ ));
803+ multiSearchRequest .add (searchRequest );
804+ }
805+
806+ Map <String , String > expectedParams = new HashMap <>();
807+ expectedParams .put (RestSearchAction .TYPED_KEYS_PARAM , "true" );
808+ if (randomBoolean ()) {
809+ multiSearchRequest .maxConcurrentSearchRequests (randomIntBetween (1 , 8 ));
810+ expectedParams .put ("max_concurrent_searches" , Integer .toString (multiSearchRequest .maxConcurrentSearchRequests ()));
811+ }
812+
813+ Request request = Request .multiSearch (multiSearchRequest );
814+ assertEquals ("/_msearch" , request .getEndpoint ());
815+ assertEquals (expectedParams , request .getParameters ());
816+
817+ List <SearchRequest > requests = new ArrayList <>();
818+ CheckedBiConsumer <SearchRequest , XContentParser , IOException > consumer = (searchRequest , p ) -> {
819+ SearchSourceBuilder searchSourceBuilder = SearchSourceBuilder .fromXContent (p );
820+ if (searchSourceBuilder .equals (new SearchSourceBuilder ()) == false ) {
821+ searchRequest .source (searchSourceBuilder );
822+ }
823+ requests .add (searchRequest );
824+ };
825+ MultiSearchRequest .readMultiLineFormat (new BytesArray (EntityUtils .toByteArray (request .getEntity ())),
826+ REQUEST_BODY_CONTENT_TYPE .xContent (), consumer , null , multiSearchRequest .indicesOptions (), null , null ,
827+ null , xContentRegistry (), true );
828+ assertEquals (requests , multiSearchRequest .requests ());
829+ }
830+
774831 public void testSearchScroll () throws IOException {
775832 SearchScrollRequest searchScrollRequest = new SearchScrollRequest ();
776833 searchScrollRequest .scrollId (randomAlphaOfLengthBetween (5 , 10 ));
@@ -782,7 +839,7 @@ public void testSearchScroll() throws IOException {
782839 assertEquals ("/_search/scroll" , request .getEndpoint ());
783840 assertEquals (0 , request .getParameters ().size ());
784841 assertToXContentBody (searchScrollRequest , request .getEntity ());
785- assertEquals (Request . REQUEST_BODY_CONTENT_TYPE .mediaTypeWithoutParameters (), request .getEntity ().getContentType ().getValue ());
842+ assertEquals (REQUEST_BODY_CONTENT_TYPE .mediaTypeWithoutParameters (), request .getEntity ().getContentType ().getValue ());
786843 }
787844
788845 public void testClearScroll () throws IOException {
@@ -796,11 +853,11 @@ public void testClearScroll() throws IOException {
796853 assertEquals ("/_search/scroll" , request .getEndpoint ());
797854 assertEquals (0 , request .getParameters ().size ());
798855 assertToXContentBody (clearScrollRequest , request .getEntity ());
799- assertEquals (Request . REQUEST_BODY_CONTENT_TYPE .mediaTypeWithoutParameters (), request .getEntity ().getContentType ().getValue ());
856+ assertEquals (REQUEST_BODY_CONTENT_TYPE .mediaTypeWithoutParameters (), request .getEntity ().getContentType ().getValue ());
800857 }
801858
802859 private static void assertToXContentBody (ToXContent expectedBody , HttpEntity actualEntity ) throws IOException {
803- BytesReference expectedBytes = XContentHelper .toXContent (expectedBody , Request . REQUEST_BODY_CONTENT_TYPE , false );
860+ BytesReference expectedBytes = XContentHelper .toXContent (expectedBody , REQUEST_BODY_CONTENT_TYPE , false );
804861 assertEquals (XContentType .JSON .mediaTypeWithoutParameters (), actualEntity .getContentType ().getValue ());
805862 assertEquals (expectedBytes , new BytesArray (EntityUtils .toByteArray (actualEntity )));
806863 }
0 commit comments