diff --git a/src/main/java/org/elasticsearch/common/io/stream/StreamInput.java b/src/main/java/org/elasticsearch/common/io/stream/StreamInput.java index b98c7332309..dfbdb528eee 100644 --- a/src/main/java/org/elasticsearch/common/io/stream/StreamInput.java +++ b/src/main/java/org/elasticsearch/common/io/stream/StreamInput.java @@ -356,6 +356,8 @@ public abstract class StreamInput extends InputStream { return readBytesReference(); case 15: return readText(); + case 16: + return readShort(); default: throw new IOException("Can't read unknown type [" + type + "]"); } diff --git a/src/main/java/org/elasticsearch/common/io/stream/StreamOutput.java b/src/main/java/org/elasticsearch/common/io/stream/StreamOutput.java index 26285983d0e..758ac582f24 100644 --- a/src/main/java/org/elasticsearch/common/io/stream/StreamOutput.java +++ b/src/main/java/org/elasticsearch/common/io/stream/StreamOutput.java @@ -369,6 +369,9 @@ public abstract class StreamOutput extends OutputStream { } else if (value instanceof Text) { writeByte((byte) 15); writeText((Text) value); + } else if (value instanceof Short) { + writeByte((byte) 16); + writeShort((Short) value); } else { throw new IOException("Can't write type [" + type + "]"); } diff --git a/src/test/java/org/elasticsearch/test/integration/search/fields/SearchFieldsTests.java b/src/test/java/org/elasticsearch/test/integration/search/fields/SearchFieldsTests.java index 2e2beb64b3b..60e816b039a 100644 --- a/src/test/java/org/elasticsearch/test/integration/search/fields/SearchFieldsTests.java +++ b/src/test/java/org/elasticsearch/test/integration/search/fields/SearchFieldsTests.java @@ -21,10 +21,14 @@ package org.elasticsearch.test.integration.search.fields; import org.elasticsearch.action.search.SearchResponse; import org.elasticsearch.client.Client; +import org.elasticsearch.common.Base64; import org.elasticsearch.common.collect.MapBuilder; +import org.elasticsearch.common.joda.Joda; import org.elasticsearch.common.xcontent.XContentFactory; import org.elasticsearch.search.sort.SortOrder; import org.elasticsearch.test.integration.AbstractNodesTests; +import org.joda.time.DateTime; +import org.joda.time.DateTimeZone; import org.testng.annotations.AfterClass; import org.testng.annotations.BeforeClass; import org.testng.annotations.Test; @@ -277,4 +281,69 @@ public class SearchFieldsTests extends AbstractNodesTests { assertThat(partial2.containsKey("obj1"), equalTo(false)); assertThat(partial2.containsKey("field1"), equalTo(true)); } + + @Test + public void testStoredFieldsWithoutSource() throws Exception { + client.admin().indices().prepareDelete().execute().actionGet(); + client.admin().indices().prepareCreate("test").execute().actionGet(); + client.admin().cluster().prepareHealth().setWaitForYellowStatus().execute().actionGet(); + + String mapping = XContentFactory.jsonBuilder().startObject().startObject("type").startObject("properties") + .startObject("_source").field("enabled", false).endObject() + .startObject("byte_field").field("type", "byte").field("store", "yes").endObject() + .startObject("short_field").field("type", "short").field("store", "yes").endObject() + .startObject("integer_field").field("type", "integer").field("store", "yes").endObject() + .startObject("long_field").field("type", "long").field("store", "yes").endObject() + .startObject("float_field").field("type", "float").field("store", "yes").endObject() + .startObject("double_field").field("type", "double").field("store", "yes").endObject() + .startObject("date_field").field("type", "date").field("store", "yes").endObject() + .startObject("boolean_field").field("type", "boolean").field("store", "yes").endObject() + .startObject("binary_field").field("type", "binary").field("store", "yes").endObject() + .endObject().endObject().endObject().string(); + + client.admin().indices().preparePutMapping().setType("type1").setSource(mapping).execute().actionGet(); + + client.prepareIndex("test", "type1", "1").setSource(jsonBuilder().startObject() + .field("byte_field", (byte) 1) + .field("short_field", (short) 2) + .field("integer_field", 3) + .field("long_field", 4l) + .field("float_field", 5.0f) + .field("double_field", 6.0d) + .field("date_field", Joda.forPattern("dateOptionalTime").printer().print(new DateTime(2012, 3, 22, 0, 0, DateTimeZone.UTC))) + .field("boolean_field", true) + .field("binary_field", Base64.encodeBytes("testing text".getBytes("UTF8"))) + .endObject()).execute().actionGet(); + + client.admin().indices().prepareRefresh().execute().actionGet(); + + SearchResponse searchResponse = client.prepareSearch().setQuery(matchAllQuery()) + .addField("byte_field") + .addField("short_field") + .addField("integer_field") + .addField("long_field") + .addField("float_field") + .addField("double_field") + .addField("date_field") + .addField("boolean_field") + .addField("binary_field") + .execute().actionGet(); + + assertThat(searchResponse.hits().getTotalHits(), equalTo(1l)); + assertThat(searchResponse.hits().hits().length, equalTo(1)); + assertThat(searchResponse.hits().getAt(0).fields().size(), equalTo(9)); + + + assertThat(searchResponse.hits().getAt(0).fields().get("byte_field").value().toString(), equalTo("1")); + assertThat(searchResponse.hits().getAt(0).fields().get("short_field").value().toString(), equalTo("2")); + assertThat(searchResponse.hits().getAt(0).fields().get("integer_field").value(), equalTo((Object) 3)); + assertThat(searchResponse.hits().getAt(0).fields().get("long_field").value(), equalTo((Object) 4l)); + assertThat(searchResponse.hits().getAt(0).fields().get("float_field").value(), equalTo((Object) 5.0f)); + assertThat(searchResponse.hits().getAt(0).fields().get("double_field").value(), equalTo((Object) 6.0d)); + String dateTime = Joda.forPattern("dateOptionalTime").printer().print(new DateTime(2012, 3, 22, 0, 0, DateTimeZone.UTC)); + assertThat(searchResponse.hits().getAt(0).fields().get("date_field").value(), equalTo((Object) dateTime)); + assertThat(searchResponse.hits().getAt(0).fields().get("boolean_field").value(), equalTo((Object) "true")); + assertThat(searchResponse.hits().getAt(0).fields().get("binary_field").value().toString(), equalTo(Base64.encodeBytes("testing text".getBytes("UTF8")))); + + } }