{"action":"created","comment":{"url":"https://api.github.com/repos/elastic/elasticsearch/pulls/comments/49512051","id":49512051,"diff_hunk":"@@ -0,0 +1,399 @@\n+/*\n+ * Licensed to Elasticsearch under one or more contributor\n+ * license agreements. See the NOTICE file distributed with\n+ * this work for additional information regarding copyright\n+ * ownership. Elasticsearch licenses this file to you under\n+ * the Apache License, Version 2.0 (the \"License\"); you may\n+ * not use this file except in compliance with the License.\n+ * You may obtain a copy of the License at\n+ *\n+ *    http://www.apache.org/licenses/LICENSE-2.0\n+ *\n+ * Unless required by applicable law or agreed to in writing,\n+ * software distributed under the License is distributed on an\n+ * \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n+ * KIND, either express or implied.  See the License for the\n+ * specific language governing permissions and limitations\n+ * under the License.\n+ */\n+\n+package org.elasticsearch.index.mapper.fixed;\n+\n+import org.apache.lucene.analysis.Analyzer;\n+import org.apache.lucene.analysis.TokenStream;\n+import org.apache.lucene.document.Field;\n+import org.apache.lucene.index.IndexOptions;\n+import org.apache.lucene.index.Terms;\n+import org.apache.lucene.search.NumericRangeQuery;\n+import org.apache.lucene.search.Query;\n+import org.apache.lucene.util.BytesRef;\n+import org.apache.lucene.util.BytesRefBuilder;\n+import org.apache.lucene.util.NumericUtils;\n+import org.elasticsearch.Version;\n+import org.elasticsearch.action.fieldstats.FieldStats;\n+import org.elasticsearch.common.Explicit;\n+import org.elasticsearch.common.Numbers;\n+import org.elasticsearch.common.Strings;\n+import org.elasticsearch.common.settings.Settings;\n+import org.elasticsearch.common.unit.Fuzziness;\n+import org.elasticsearch.common.xcontent.XContentBuilder;\n+import org.elasticsearch.common.xcontent.XContentParser;\n+import org.elasticsearch.index.analysis.NamedAnalyzer;\n+import org.elasticsearch.index.analysis.NumericLongAnalyzer;\n+import org.elasticsearch.index.mapper.MappedFieldType;\n+import org.elasticsearch.index.mapper.Mapper;\n+import org.elasticsearch.index.mapper.MapperParsingException;\n+import org.elasticsearch.index.mapper.ParseContext;\n+import org.elasticsearch.index.mapper.core.NumberFieldMapper;\n+\n+import java.io.IOException;\n+import java.util.Iterator;\n+import java.util.List;\n+import java.util.Map;\n+\n+import static org.elasticsearch.common.xcontent.support.XContentMapValues.nodeLongValue;\n+import static org.elasticsearch.index.mapper.MapperBuilders.fixedPointField;\n+import static org.elasticsearch.index.mapper.MapperBuilders.longField;\n+import static org.elasticsearch.index.mapper.core.TypeParsers.parseNumberField;\n+\n+/**\n+ *\n+ */\n+public class FixedPointFieldMapper extends NumberFieldMapper {\n+\n+    public static final String CONTENT_TYPE = \"fixed\";\n+\n+    public static class Defaults extends NumberFieldMapper.Defaults {\n+        public static final MappedFieldType FIELD_TYPE = new FixedPointFieldType();\n+        public static final long DECIMAL_PLACES = 2;\n+        public static final long DECIMAL_FACTOR = 100;\n+\n+        static {\n+            FIELD_TYPE.freeze();\n+        }\n+    }\n+\n+    public static class Builder extends NumberFieldMapper.Builder<Builder, FixedPointFieldMapper> {\n+\n+        public Builder(String name) {\n+            super(name, Defaults.FIELD_TYPE, Defaults.PRECISION_STEP_64_BIT);\n+            builder = this;\n+        }\n+\n+        public Builder nullValue(long nullValue) {\n+            this.fieldType.setNullValue(nullValue);\n+            return this;\n+        }\n+\n+        public Builder decimalPlaces(long decimalPlaces) {\n+            fieldType().setDecimalPlaces(decimalPlaces);\n+            return this;\n+        }\n+\n+        @Override\n+        public FixedPointFieldType fieldType() {\n+            return (FixedPointFieldType)fieldType;\n+        }\n+\n+        @Override\n+        public FixedPointFieldMapper build(BuilderContext context) {\n+            setupFieldType(context);\n+            FixedPointFieldMapper fieldMapper = new FixedPointFieldMapper(name, fieldType, defaultFieldType,\n+                ignoreMalformed(context), coerce(context), context.indexSettings(), multiFieldsBuilder.build(this, context), copyTo);\n+            return (FixedPointFieldMapper) fieldMapper.includeInAll(includeInAll);\n+        }\n+\n+        @Override\n+        protected NamedAnalyzer makeNumberAnalyzer(int precisionStep) {\n+            return NumericLongAnalyzer.buildNamedAnalyzer(precisionStep);\n+        }\n+\n+        @Override\n+        protected int maxPrecisionStep() {\n+            return 64;\n+        }\n+    }\n+\n+    public static class TypeParser implements Mapper.TypeParser {\n+        @Override\n+        public Mapper.Builder parse(String name, Map<String, Object> node, ParserContext parserContext) throws MapperParsingException {\n+            FixedPointFieldMapper.Builder builder = fixedPointField(name);\n+            parseNumberField(builder, name, node, parserContext);\n+            for (Iterator<Map.Entry<String, Object>> iterator = node.entrySet().iterator(); iterator.hasNext();) {\n+                Map.Entry<String, Object> entry = iterator.next();\n+                String propName = Strings.toUnderscoreCase(entry.getKey());\n+                Object propNode = entry.getValue();\n+                if (propName.equals(\"null_value\")) {\n+                    if (propNode == null) {\n+                        throw new MapperParsingException(\"Property [null_value] cannot be null.\");\n+                    }\n+                    builder.nullValue(nodeLongValue(propNode));\n+                    iterator.remove();\n+                } else if (propName.equals(\"decimal_places\")) {\n+                    if (propNode == null) {\n+                        throw new MapperParsingException(\"Property [decimal_places] cannot be null.\");\n+                    }\n+                    long decimalPlaces = nodeLongValue(propNode);\n+                    if (decimalPlaces <= 0) {\n+                        throw new MapperParsingException(\"Property [decimal_places] must be greater than zero.\");\n+                    }\n+                    if (decimalPlaces >= 19) {\n+                        // would cause an overflow in decimalFactor later\n+                        //\n+                        // Long.MAX_VALUE ==  9223372036854775807\n+                        // 10^19          == 10000000000000000000\n+                        throw new MapperParsingException(\"Property [decimal_places] must be smaller than 19.\");\n+                    }\n+\n+                    builder.decimalPlaces((byte)decimalPlaces);\n+                    iterator.remove();\n+                }\n+            }\n+            return builder;\n+        }\n+    }\n+\n+    public static class FixedPointFieldType extends NumberFieldType {\n+        private long decimalPlaces = Defaults.DECIMAL_PLACES;\n+        private long decimalFactor = Defaults.DECIMAL_FACTOR;\n+\n+        public FixedPointFieldType() {\n+            super(NumericType.LONG);\n+        }\n+\n+        protected FixedPointFieldType(FixedPointFieldType ref) {\n+            super(ref);\n+        }\n+\n+        public void setDecimalPlaces(long decimalPlaces) {\n+            this.decimalPlaces = decimalPlaces;\n+            this.decimalFactor = (long) Math.pow(10.0, decimalPlaces);\n+        }\n+\n+        public long getDecimalPlaces() {\n+            return this.decimalPlaces;\n+        }\n+\n+        public long getDecimalFactor() {\n+            return this.decimalFactor;\n+        }\n+\n+        @Override\n+        public NumberFieldType clone() {\n+            return new FixedPointFieldType(this);\n+        }\n+\n+        @Override\n+        public String typeName() {\n+            return CONTENT_TYPE;\n+        }\n+\n+        @Override\n+        public Double nullValue() {\n+            return (Double)super.nullValue();\n+        }\n+\n+        @Override\n+        public Long value(Object value) {\n+            if (value == null) {\n+                return null;\n+            }\n+            if (value instanceof Number) {\n+                return ((Number) value).longValue();\n+            }\n+            if (value instanceof BytesRef) {\n+                return Numbers.bytesToLong((BytesRef) value);\n+            }\n+            return Long.parseLong(value.toString());\n+        }\n+\n+        @Override\n+        public BytesRef indexedValueForSearch(Object value) {\n+            long longValue = (long)(parseDoubleValue(value) * decimalFactor);\n+            BytesRefBuilder bytesRef = new BytesRefBuilder();\n+            NumericUtils.longToPrefixCoded(longValue, 0, bytesRef);   // 0 because of exact match\n+            return bytesRef.get();\n+        }\n+\n+        @Override\n+        public Query rangeQuery(Object lowerTerm, Object upperTerm, boolean includeLower, boolean includeUpper) {\n+            return NumericRangeQuery.newLongRange(name(), numericPrecisionStep(),\n+                lowerTerm == null ? null : (long) (parseDoubleValue(lowerTerm) * decimalFactor),\n+                upperTerm == null ? null : (long) (parseDoubleValue(upperTerm) * decimalFactor),\n+                includeLower, includeUpper);\n+        }\n+\n+        @Override\n+        public Query fuzzyQuery(Object value, Fuzziness fuzziness, int prefixLength, int maxExpansions, boolean transpositions) {\n+            final long iValue = (long)(parseDoubleValue(value) * decimalFactor);\n+            final long iSim = fuzziness.asLong();\n+            return NumericRangeQuery.newLongRange(name(), numericPrecisionStep(),\n+                iValue - iSim,\n+                iValue + iSim,\n+                true, true);\n+        }\n+\n+        @Override\n+        public FieldStats stats(Terms terms, int maxDoc) throws IOException {\n+            long minValue = NumericUtils.getMinLong(terms);\n+            long maxValue = NumericUtils.getMaxLong(terms);\n+            return new FieldStats.Long(\n+                maxDoc, terms.getDocCount(), terms.getSumDocFreq(), terms.getSumTotalTermFreq(), minValue, maxValue\n+            );\n+        }\n+    }\n+\n+    protected FixedPointFieldMapper(String simpleName, MappedFieldType fieldType, MappedFieldType defaultFieldType,\n+                              Explicit<Boolean> ignoreMalformed, Explicit<Boolean> coerce,\n+                              Settings indexSettings, MultiFields multiFields, CopyTo copyTo) {\n+        super(simpleName, fieldType, defaultFieldType, ignoreMalformed, coerce, indexSettings, multiFields, copyTo);\n+    }\n+\n+    @Override\n+    public FixedPointFieldType fieldType() {\n+        return (FixedPointFieldType) super.fieldType();\n+    }\n+\n+    @Override\n+    protected boolean customBoost() {\n+        return true;\n+    }\n+\n+    @Override\n+    protected void innerParseCreateField(ParseContext context, List<Field> fields) throws IOException {\n+        double value;\n+        float boost = fieldType().boost();\n+        if (context.externalValueSet()) {\n+            Object externalValue = context.externalValue();\n+            if (externalValue == null) {\n+                if (fieldType().nullValue() == null) {\n+                    return;\n+                }\n+                value = fieldType().nullValue();\n+            } else if (externalValue instanceof String) {\n+                String sExternalValue = (String) externalValue;\n+                if (sExternalValue.length() == 0) {\n+                    if (fieldType().nullValue() == null) {\n+                        return;\n+                    }\n+                    value = fieldType().nullValue();\n+                } else {\n+                    value = Double.parseDouble(sExternalValue);\n+                }\n+            } else {\n+                value = ((Number) externalValue).doubleValue();\n+            }\n+            if (context.includeInAll(includeInAll, this)) {\n+                context.allEntries().addText(fieldType().name(), Double.toString(value), boost);\n+            }\n+        } else {\n+            XContentParser parser = context.parser();\n+            if (parser.currentToken() == XContentParser.Token.VALUE_NULL ||\n+                (parser.currentToken() == XContentParser.Token.VALUE_STRING && parser.textLength() == 0)) {\n+                if (fieldType().nullValue() == null) {\n+                    return;\n+                }\n+                value = fieldType().nullValue();\n+                if (fieldType().nullValueAsString() != null && (context.includeInAll(includeInAll, this))) {\n+                    context.allEntries().addText(fieldType().name(), fieldType().nullValueAsString(), boost);\n+                }\n+            } else if (parser.currentToken() == XContentParser.Token.START_OBJECT\n+                && Version.indexCreated(context.indexSettings()).before(Version.V_3_0_0)) {","path":"core/src/main/java/org/elasticsearch/index/mapper/fixed/FixedPointFieldMapper.java","position":301,"original_position":301,"commit_id":"878e1b087bc8af533ec54cc37be49d37a193ac8f","original_commit_id":"878e1b087bc8af533ec54cc37be49d37a193ac8f","user":{"login":"nik9000","id":215970,"avatar_url":"https://avatars.githubusercontent.com/u/215970?v=3","gravatar_id":"","url":"https://api.github.com/users/nik9000","html_url":"https://github.com/nik9000","followers_url":"https://api.github.com/users/nik9000/followers","following_url":"https://api.github.com/users/nik9000/following{/other_user}","gists_url":"https://api.github.com/users/nik9000/gists{/gist_id}","starred_url":"https://api.github.com/users/nik9000/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/nik9000/subscriptions","organizations_url":"https://api.github.com/users/nik9000/orgs","repos_url":"https://api.github.com/users/nik9000/repos","events_url":"https://api.github.com/users/nik9000/events{/privacy}","received_events_url":"https://api.github.com/users/nik9000/received_events","type":"User","site_admin":false},"body":"Maybe it doesn't matter and this has to be supported anyway....","created_at":"2016-01-12T20:56:54Z","updated_at":"2016-01-12T20:56:54Z","html_url":"https://github.com/elastic/elasticsearch/pull/15939#discussion_r49512051","pull_request_url":"https://api.github.com/repos/elastic/elasticsearch/pulls/15939","_links":{"self":{"href":"https://api.github.com/repos/elastic/elasticsearch/pulls/comments/49512051"},"html":{"href":"https://github.com/elastic/elasticsearch/pull/15939#discussion_r49512051"},"pull_request":{"href":"https://api.github.com/repos/elastic/elasticsearch/pulls/15939"}}},"pull_request":{"url":"https://api.github.com/repos/elastic/elasticsearch/pulls/15939","id":55811783,"html_url":"https://github.com/elastic/elasticsearch/pull/15939","diff_url":"https://github.com/elastic/elasticsearch/pull/15939.diff","patch_url":"https://github.com/elastic/elasticsearch/pull/15939.patch","issue_url":"https://api.github.com/repos/elastic/elasticsearch/issues/15939","number":15939,"state":"open","locked":false,"title":"Add a fixed-point mapping type","user":{"login":"polyfractal","id":1224228,"avatar_url":"https://avatars.githubusercontent.com/u/1224228?v=3","gravatar_id":"","url":"https://api.github.com/users/polyfractal","html_url":"https://github.com/polyfractal","followers_url":"https://api.github.com/users/polyfractal/followers","following_url":"https://api.github.com/users/polyfractal/following{/other_user}","gists_url":"https://api.github.com/users/polyfractal/gists{/gist_id}","starred_url":"https://api.github.com/users/polyfractal/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/polyfractal/subscriptions","organizations_url":"https://api.github.com/users/polyfractal/orgs","repos_url":"https://api.github.com/users/polyfractal/repos","events_url":"https://api.github.com/users/polyfractal/events{/privacy}","received_events_url":"https://api.github.com/users/polyfractal/received_events","type":"User","site_admin":false},"body":"Adds a new `fixed` mapping type, which provides storage of real-valued numbers in a `long` via an associated scaling factor.  Uses a base-10 scaling factor because base-2 can give strange results (to a human) when searching, due to it not lining up with discrete digits.\r\n\r\nI felt very much like a bull in a china shop here... unclear if all the right things were modified/overridden, or if there is a cleaner way to do this.\r\n\r\nRelated to #13625","created_at":"2016-01-12T20:24:33Z","updated_at":"2016-01-12T20:56:54Z","closed_at":null,"merged_at":null,"merge_commit_sha":"d924755ae6167cd43a23f3566add11443e817803","assignee":null,"milestone":null,"commits_url":"https://api.github.com/repos/elastic/elasticsearch/pulls/15939/commits","review_comments_url":"https://api.github.com/repos/elastic/elasticsearch/pulls/15939/comments","review_comment_url":"https://api.github.com/repos/elastic/elasticsearch/pulls/comments{/number}","comments_url":"https://api.github.com/repos/elastic/elasticsearch/issues/15939/comments","statuses_url":"https://api.github.com/repos/elastic/elasticsearch/statuses/878e1b087bc8af533ec54cc37be49d37a193ac8f","head":{"label":"polyfractal:feature/fixed_point","ref":"feature/fixed_point","sha":"878e1b087bc8af533ec54cc37be49d37a193ac8f","user":{"login":"polyfractal","id":1224228,"avatar_url":"https://avatars.githubusercontent.com/u/1224228?v=3","gravatar_id":"","url":"https://api.github.com/users/polyfractal","html_url":"https://github.com/polyfractal","followers_url":"https://api.github.com/users/polyfractal/followers","following_url":"https://api.github.com/users/polyfractal/following{/other_user}","gists_url":"https://api.github.com/users/polyfractal/gists{/gist_id}","starred_url":"https://api.github.com/users/polyfractal/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/polyfractal/subscriptions","organizations_url":"https://api.github.com/users/polyfractal/orgs","repos_url":"https://api.github.com/users/polyfractal/repos","events_url":"https://api.github.com/users/polyfractal/events{/privacy}","received_events_url":"https://api.github.com/users/polyfractal/received_events","type":"User","site_admin":false},"repo":{"id":7764033,"name":"elasticsearch","full_name":"polyfractal/elasticsearch","owner":{"login":"polyfractal","id":1224228,"avatar_url":"https://avatars.githubusercontent.com/u/1224228?v=3","gravatar_id":"","url":"https://api.github.com/users/polyfractal","html_url":"https://github.com/polyfractal","followers_url":"https://api.github.com/users/polyfractal/followers","following_url":"https://api.github.com/users/polyfractal/following{/other_user}","gists_url":"https://api.github.com/users/polyfractal/gists{/gist_id}","starred_url":"https://api.github.com/users/polyfractal/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/polyfractal/subscriptions","organizations_url":"https://api.github.com/users/polyfractal/orgs","repos_url":"https://api.github.com/users/polyfractal/repos","events_url":"https://api.github.com/users/polyfractal/events{/privacy}","received_events_url":"https://api.github.com/users/polyfractal/received_events","type":"User","site_admin":false},"private":false,"html_url":"https://github.com/polyfractal/elasticsearch","description":"Open Source, Distributed, RESTful Search Engine","fork":true,"url":"https://api.github.com/repos/polyfractal/elasticsearch","forks_url":"https://api.github.com/repos/polyfractal/elasticsearch/forks","keys_url":"https://api.github.com/repos/polyfractal/elasticsearch/keys{/key_id}","collaborators_url":"https://api.github.com/repos/polyfractal/elasticsearch/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/polyfractal/elasticsearch/teams","hooks_url":"https://api.github.com/repos/polyfractal/elasticsearch/hooks","issue_events_url":"https://api.github.com/repos/polyfractal/elasticsearch/issues/events{/number}","events_url":"https://api.github.com/repos/polyfractal/elasticsearch/events","assignees_url":"https://api.github.com/repos/polyfractal/elasticsearch/assignees{/user}","branches_url":"https://api.github.com/repos/polyfractal/elasticsearch/branches{/branch}","tags_url":"https://api.github.com/repos/polyfractal/elasticsearch/tags","blobs_url":"https://api.github.com/repos/polyfractal/elasticsearch/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/polyfractal/elasticsearch/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/polyfractal/elasticsearch/git/refs{/sha}","trees_url":"https://api.github.com/repos/polyfractal/elasticsearch/git/trees{/sha}","statuses_url":"https://api.github.com/repos/polyfractal/elasticsearch/statuses/{sha}","languages_url":"https://api.github.com/repos/polyfractal/elasticsearch/languages","stargazers_url":"https://api.github.com/repos/polyfractal/elasticsearch/stargazers","contributors_url":"https://api.github.com/repos/polyfractal/elasticsearch/contributors","subscribers_url":"https://api.github.com/repos/polyfractal/elasticsearch/subscribers","subscription_url":"https://api.github.com/repos/polyfractal/elasticsearch/subscription","commits_url":"https://api.github.com/repos/polyfractal/elasticsearch/commits{/sha}","git_commits_url":"https://api.github.com/repos/polyfractal/elasticsearch/git/commits{/sha}","comments_url":"https://api.github.com/repos/polyfractal/elasticsearch/comments{/number}","issue_comment_url":"https://api.github.com/repos/polyfractal/elasticsearch/issues/comments{/number}","contents_url":"https://api.github.com/repos/polyfractal/elasticsearch/contents/{+path}","compare_url":"https://api.github.com/repos/polyfractal/elasticsearch/compare/{base}...{head}","merges_url":"https://api.github.com/repos/polyfractal/elasticsearch/merges","archive_url":"https://api.github.com/repos/polyfractal/elasticsearch/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/polyfractal/elasticsearch/downloads","issues_url":"https://api.github.com/repos/polyfractal/elasticsearch/issues{/number}","pulls_url":"https://api.github.com/repos/polyfractal/elasticsearch/pulls{/number}","milestones_url":"https://api.github.com/repos/polyfractal/elasticsearch/milestones{/number}","notifications_url":"https://api.github.com/repos/polyfractal/elasticsearch/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/polyfractal/elasticsearch/labels{/name}","releases_url":"https://api.github.com/repos/polyfractal/elasticsearch/releases{/id}","created_at":"2013-01-22T23:47:55Z","updated_at":"2015-05-01T23:01:11Z","pushed_at":"2016-01-12T20:17:11Z","git_url":"git://github.com/polyfractal/elasticsearch.git","ssh_url":"git@github.com:polyfractal/elasticsearch.git","clone_url":"https://github.com/polyfractal/elasticsearch.git","svn_url":"https://github.com/polyfractal/elasticsearch","homepage":"http://elasticsearch.org","size":177575,"stargazers_count":1,"watchers_count":1,"language":"Java","has_issues":false,"has_downloads":true,"has_wiki":false,"has_pages":false,"forks_count":0,"mirror_url":null,"open_issues_count":0,"forks":0,"open_issues":0,"watchers":1,"default_branch":"master"}},"base":{"label":"elastic:master","ref":"master","sha":"ce32b959fdcdaf5f3a78df9bf2d8039082735940","user":{"login":"elastic","id":6764390,"avatar_url":"https://avatars.githubusercontent.com/u/6764390?v=3","gravatar_id":"","url":"https://api.github.com/users/elastic","html_url":"https://github.com/elastic","followers_url":"https://api.github.com/users/elastic/followers","following_url":"https://api.github.com/users/elastic/following{/other_user}","gists_url":"https://api.github.com/users/elastic/gists{/gist_id}","starred_url":"https://api.github.com/users/elastic/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/elastic/subscriptions","organizations_url":"https://api.github.com/users/elastic/orgs","repos_url":"https://api.github.com/users/elastic/repos","events_url":"https://api.github.com/users/elastic/events{/privacy}","received_events_url":"https://api.github.com/users/elastic/received_events","type":"Organization","site_admin":false},"repo":{"id":507775,"name":"elasticsearch","full_name":"elastic/elasticsearch","owner":{"login":"elastic","id":6764390,"avatar_url":"https://avatars.githubusercontent.com/u/6764390?v=3","gravatar_id":"","url":"https://api.github.com/users/elastic","html_url":"https://github.com/elastic","followers_url":"https://api.github.com/users/elastic/followers","following_url":"https://api.github.com/users/elastic/following{/other_user}","gists_url":"https://api.github.com/users/elastic/gists{/gist_id}","starred_url":"https://api.github.com/users/elastic/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/elastic/subscriptions","organizations_url":"https://api.github.com/users/elastic/orgs","repos_url":"https://api.github.com/users/elastic/repos","events_url":"https://api.github.com/users/elastic/events{/privacy}","received_events_url":"https://api.github.com/users/elastic/received_events","type":"Organization","site_admin":false},"private":false,"html_url":"https://github.com/elastic/elasticsearch","description":"Open Source, Distributed, RESTful Search Engine","fork":false,"url":"https://api.github.com/repos/elastic/elasticsearch","forks_url":"https://api.github.com/repos/elastic/elasticsearch/forks","keys_url":"https://api.github.com/repos/elastic/elasticsearch/keys{/key_id}","collaborators_url":"https://api.github.com/repos/elastic/elasticsearch/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/elastic/elasticsearch/teams","hooks_url":"https://api.github.com/repos/elastic/elasticsearch/hooks","issue_events_url":"https://api.github.com/repos/elastic/elasticsearch/issues/events{/number}","events_url":"https://api.github.com/repos/elastic/elasticsearch/events","assignees_url":"https://api.github.com/repos/elastic/elasticsearch/assignees{/user}","branches_url":"https://api.github.com/repos/elastic/elasticsearch/branches{/branch}","tags_url":"https://api.github.com/repos/elastic/elasticsearch/tags","blobs_url":"https://api.github.com/repos/elastic/elasticsearch/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/elastic/elasticsearch/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/elastic/elasticsearch/git/refs{/sha}","trees_url":"https://api.github.com/repos/elastic/elasticsearch/git/trees{/sha}","statuses_url":"https://api.github.com/repos/elastic/elasticsearch/statuses/{sha}","languages_url":"https://api.github.com/repos/elastic/elasticsearch/languages","stargazers_url":"https://api.github.com/repos/elastic/elasticsearch/stargazers","contributors_url":"https://api.github.com/repos/elastic/elasticsearch/contributors","subscribers_url":"https://api.github.com/repos/elastic/elasticsearch/subscribers","subscription_url":"https://api.github.com/repos/elastic/elasticsearch/subscription","commits_url":"https://api.github.com/repos/elastic/elasticsearch/commits{/sha}","git_commits_url":"https://api.github.com/repos/elastic/elasticsearch/git/commits{/sha}","comments_url":"https://api.github.com/repos/elastic/elasticsearch/comments{/number}","issue_comment_url":"https://api.github.com/repos/elastic/elasticsearch/issues/comments{/number}","contents_url":"https://api.github.com/repos/elastic/elasticsearch/contents/{+path}","compare_url":"https://api.github.com/repos/elastic/elasticsearch/compare/{base}...{head}","merges_url":"https://api.github.com/repos/elastic/elasticsearch/merges","archive_url":"https://api.github.com/repos/elastic/elasticsearch/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/elastic/elasticsearch/downloads","issues_url":"https://api.github.com/repos/elastic/elasticsearch/issues{/number}","pulls_url":"https://api.github.com/repos/elastic/elasticsearch/pulls{/number}","milestones_url":"https://api.github.com/repos/elastic/elasticsearch/milestones{/number}","notifications_url":"https://api.github.com/repos/elastic/elasticsearch/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/elastic/elasticsearch/labels{/name}","releases_url":"https://api.github.com/repos/elastic/elasticsearch/releases{/id}","created_at":"2010-02-08T13:20:56Z","updated_at":"2016-01-12T20:56:26Z","pushed_at":"2016-01-12T20:24:34Z","git_url":"git://github.com/elastic/elasticsearch.git","ssh_url":"git@github.com:elastic/elasticsearch.git","clone_url":"https://github.com/elastic/elasticsearch.git","svn_url":"https://github.com/elastic/elasticsearch","homepage":"https://www.elastic.co/products/elasticsearch","size":236558,"stargazers_count":14351,"watchers_count":14351,"language":"Java","has_issues":true,"has_downloads":true,"has_wiki":false,"has_pages":false,"forks_count":4787,"mirror_url":null,"open_issues_count":1257,"forks":4787,"open_issues":1257,"watchers":14351,"default_branch":"master"}},"_links":{"self":{"href":"https://api.github.com/repos/elastic/elasticsearch/pulls/15939"},"html":{"href":"https://github.com/elastic/elasticsearch/pull/15939"},"issue":{"href":"https://api.github.com/repos/elastic/elasticsearch/issues/15939"},"comments":{"href":"https://api.github.com/repos/elastic/elasticsearch/issues/15939/comments"},"review_comments":{"href":"https://api.github.com/repos/elastic/elasticsearch/pulls/15939/comments"},"review_comment":{"href":"https://api.github.com/repos/elastic/elasticsearch/pulls/comments{/number}"},"commits":{"href":"https://api.github.com/repos/elastic/elasticsearch/pulls/15939/commits"},"statuses":{"href":"https://api.github.com/repos/elastic/elasticsearch/statuses/878e1b087bc8af533ec54cc37be49d37a193ac8f"}}}}