diff --git a/src/main/java/org/elasticsearch/action/search/MultiSearchRequest.java b/src/main/java/org/elasticsearch/action/search/MultiSearchRequest.java index cf5f1c0b20c..7d7ae3e3cf5 100644 --- a/src/main/java/org/elasticsearch/action/search/MultiSearchRequest.java +++ b/src/main/java/org/elasticsearch/action/search/MultiSearchRequest.java @@ -70,45 +70,46 @@ public class MultiSearchRequest implements ActionRequest { if (nextMarker == -1) { break; } - // now parse the action - XContentParser parser = xContent.createParser(data, from, nextMarker - from); - - // move pointers - from = nextMarker + 1; - - // Move to START_OBJECT - XContentParser.Token token = parser.nextToken(); - if (token == null) { - continue; - } - assert token == XContentParser.Token.START_OBJECT; - SearchRequest searchRequest = new SearchRequest(indices); if (types != null && types.length > 0) { searchRequest.types(types); } - String currentFieldName = null; - while ((token = parser.nextToken()) != XContentParser.Token.END_OBJECT) { - if (token == XContentParser.Token.FIELD_NAME) { - currentFieldName = parser.currentName(); - } else if (token.isValue()) { - if ("index".equals(currentFieldName) || "indices".equals(currentFieldName)) { - searchRequest.indices(Strings.splitStringByCommaToArray(parser.text())); - } else if ("type".equals(currentFieldName) || "types".equals(currentFieldName)) { - searchRequest.types(Strings.splitStringByCommaToArray(parser.text())); - } else if ("search_type".equals(currentFieldName) || "searchType".equals(currentFieldName)) { - searchRequest.searchType(parser.text()); - } else if ("preference".equals(currentFieldName)) { - searchRequest.preference(parser.text()); - } else if ("routing".equals(currentFieldName)) { - searchRequest.routing(parser.text()); - } else if ("query_hint".equals(currentFieldName) || "queryHint".equals(currentFieldName)) { - searchRequest.queryHint(parser.text()); + + // now parse the action + XContentParser parser = xContent.createParser(data, from, nextMarker - from); + try { + // Move to START_OBJECT, if token is null, its an empty data + XContentParser.Token token = parser.nextToken(); + if (token != null) { + assert token == XContentParser.Token.START_OBJECT; + String currentFieldName = null; + while ((token = parser.nextToken()) != XContentParser.Token.END_OBJECT) { + if (token == XContentParser.Token.FIELD_NAME) { + currentFieldName = parser.currentName(); + } else if (token.isValue()) { + if ("index".equals(currentFieldName) || "indices".equals(currentFieldName)) { + searchRequest.indices(Strings.splitStringByCommaToArray(parser.text())); + } else if ("type".equals(currentFieldName) || "types".equals(currentFieldName)) { + searchRequest.types(Strings.splitStringByCommaToArray(parser.text())); + } else if ("search_type".equals(currentFieldName) || "searchType".equals(currentFieldName)) { + searchRequest.searchType(parser.text()); + } else if ("preference".equals(currentFieldName)) { + searchRequest.preference(parser.text()); + } else if ("routing".equals(currentFieldName)) { + searchRequest.routing(parser.text()); + } else if ("query_hint".equals(currentFieldName) || "queryHint".equals(currentFieldName)) { + searchRequest.queryHint(parser.text()); + } + } } } + } finally { + parser.close(); } + // move pointers + from = nextMarker + 1; // now for the body nextMarker = findNextMarker(marker, from, data, length); if (nextMarker == -1) { @@ -134,7 +135,7 @@ public class MultiSearchRequest implements ActionRequest { return -1; } - List requests() { + public List requests() { return this.requests; } diff --git a/src/test/java/org/elasticsearch/test/unit/action/bulk/BulkActionTests.java b/src/test/java/org/elasticsearch/test/unit/action/bulk/BulkRequestTests.java similarity index 98% rename from src/test/java/org/elasticsearch/test/unit/action/bulk/BulkActionTests.java rename to src/test/java/org/elasticsearch/test/unit/action/bulk/BulkRequestTests.java index fa536e8ac32..303c16f68f1 100644 --- a/src/test/java/org/elasticsearch/test/unit/action/bulk/BulkActionTests.java +++ b/src/test/java/org/elasticsearch/test/unit/action/bulk/BulkRequestTests.java @@ -26,7 +26,7 @@ import static org.elasticsearch.common.io.Streams.copyToStringFromClasspath; import static org.hamcrest.MatcherAssert.assertThat; import static org.hamcrest.Matchers.equalTo; -public class BulkActionTests { +public class BulkRequestTests { @Test public void testSimpleBulk1() throws Exception { diff --git a/src/test/java/org/elasticsearch/test/unit/action/search/MultiSearchRequestTests.java b/src/test/java/org/elasticsearch/test/unit/action/search/MultiSearchRequestTests.java new file mode 100644 index 00000000000..41672f09dec --- /dev/null +++ b/src/test/java/org/elasticsearch/test/unit/action/search/MultiSearchRequestTests.java @@ -0,0 +1,53 @@ +/* + * Licensed to ElasticSearch and Shay Banon under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. ElasticSearch licenses this + * file to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +package org.elasticsearch.test.unit.action.search; + +import org.elasticsearch.action.search.MultiSearchRequest; +import org.elasticsearch.action.search.SearchType; +import org.elasticsearch.common.io.Streams; +import org.testng.annotations.Test; + +import static org.hamcrest.MatcherAssert.assertThat; +import static org.hamcrest.Matchers.equalTo; +import static org.hamcrest.Matchers.nullValue; + +/** + */ +@Test +public class MultiSearchRequestTests { + + @Test + public void simpleAdd() throws Exception { + byte[] data = Streams.copyToBytesFromClasspath("/org/elasticsearch/test/unit/action/search/simple-msearch1.json"); + MultiSearchRequest request = new MultiSearchRequest().add(data, 0, data.length, false, null, null); + assertThat(request.requests().size(), equalTo(5)); + assertThat(request.requests().get(0).indices()[0], equalTo("test")); + assertThat(request.requests().get(0).types().length, equalTo(0)); + assertThat(request.requests().get(1).indices()[0], equalTo("test")); + assertThat(request.requests().get(1).types()[0], equalTo("type1")); + assertThat(request.requests().get(2).indices(), nullValue()); + assertThat(request.requests().get(2).types().length, equalTo(0)); + assertThat(request.requests().get(3).indices(), nullValue()); + assertThat(request.requests().get(3).types().length, equalTo(0)); + assertThat(request.requests().get(3).searchType(), equalTo(SearchType.COUNT)); + assertThat(request.requests().get(4).indices(), nullValue()); + assertThat(request.requests().get(4).types().length, equalTo(0)); + } +} diff --git a/src/test/java/org/elasticsearch/test/unit/action/search/simple-msearch1.json b/src/test/java/org/elasticsearch/test/unit/action/search/simple-msearch1.json new file mode 100644 index 00000000000..a9aca8bf550 --- /dev/null +++ b/src/test/java/org/elasticsearch/test/unit/action/search/simple-msearch1.json @@ -0,0 +1,10 @@ +{"index":"test"} +{"query" : {"match_all" {}}} +{"index" : "test", "type" : "type1"} +{"query" : {"match_all" {}}} +{} +{"query" : {"match_all" {}}} +{"search_type" : "count"} +{"query" : {"match_all" {}}} + +{"query" : {"match_all" {}}}