@Override
 public Filter nullValueFilter() {
   if (nullValue == null) {
     return null;
   }
   return NumericRangeFilter.newIntRange(
       names.indexName(), precisionStep, nullValue.intValue(), nullValue.intValue(), true, true);
 }
 private byte parseValue(Object value) {
   if (value instanceof Number) {
     return ((Number) value).byteValue();
   }
   if (value instanceof BytesRef) {
     return Byte.parseByte(((BytesRef) value).utf8ToString());
   }
   return Byte.parseByte(value.toString());
 }
 @Override
 public Query fuzzyQuery(
     String value, String minSim, int prefixLength, int maxExpansions, boolean transpositions) {
   byte iValue = Byte.parseByte(value);
   byte iSim;
   try {
     iSim = Byte.parseByte(minSim);
   } catch (NumberFormatException e) {
     iSim = (byte) Float.parseFloat(minSim);
   }
   return NumericRangeQuery.newIntRange(
       names.indexName(), precisionStep, iValue - iSim, iValue + iSim, true, true);
 }
 protected ByteFieldMapper(
     Names names,
     int precisionStep,
     float boost,
     FieldType fieldType,
     Byte nullValue,
     Explicit<Boolean> ignoreMalformed,
     PostingsFormatProvider postingsProvider,
     DocValuesFormatProvider docValuesProvider,
     SimilarityProvider similarity,
     @Nullable Settings fieldDataSettings,
     Settings indexSettings) {
   super(
       names,
       precisionStep,
       boost,
       fieldType,
       ignoreMalformed,
       new NamedAnalyzer("_byte/" + precisionStep, new NumericIntegerAnalyzer(precisionStep)),
       new NamedAnalyzer("_byte/max", new NumericIntegerAnalyzer(Integer.MAX_VALUE)),
       postingsProvider,
       docValuesProvider,
       similarity,
       fieldDataSettings,
       indexSettings);
   this.nullValue = nullValue;
   this.nullValueAsString = nullValue == null ? null : nullValue.toString();
 }
 @Override
 public Byte value(Object value) {
   if (value == null) {
     return null;
   }
   if (value instanceof Number) {
     return ((Number) value).byteValue();
   }
   if (value instanceof BytesRef) {
     return ((BytesRef) value).bytes[((BytesRef) value).offset];
   }
   return Byte.parseByte(value.toString());
 }
 @Override
 public String numericAsString() {
   return Byte.toString(number);
 }
 @Override
 protected void innerParseCreateField(ParseContext context, List<Field> fields)
     throws IOException {
   byte value;
   float boost = this.boost;
   if (context.externalValueSet()) {
     Object externalValue = context.externalValue();
     if (externalValue == null) {
       if (nullValue == null) {
         return;
       }
       value = nullValue;
     } else if (externalValue instanceof String) {
       String sExternalValue = (String) externalValue;
       if (sExternalValue.length() == 0) {
         if (nullValue == null) {
           return;
         }
         value = nullValue;
       } else {
         value = Byte.parseByte(sExternalValue);
       }
     } else {
       value = ((Number) externalValue).byteValue();
     }
     if (context.includeInAll(includeInAll, this)) {
       context.allEntries().addText(names.fullName(), Byte.toString(value), boost);
     }
   } else {
     XContentParser parser = context.parser();
     if (parser.currentToken() == XContentParser.Token.VALUE_NULL
         || (parser.currentToken() == XContentParser.Token.VALUE_STRING
             && parser.textLength() == 0)) {
       if (nullValue == null) {
         return;
       }
       value = nullValue;
       if (nullValueAsString != null && (context.includeInAll(includeInAll, this))) {
         context.allEntries().addText(names.fullName(), nullValueAsString, boost);
       }
     } else if (parser.currentToken() == XContentParser.Token.START_OBJECT) {
       XContentParser.Token token;
       String currentFieldName = null;
       Byte objValue = nullValue;
       while ((token = parser.nextToken()) != XContentParser.Token.END_OBJECT) {
         if (token == XContentParser.Token.FIELD_NAME) {
           currentFieldName = parser.currentName();
         } else {
           if ("value".equals(currentFieldName) || "_value".equals(currentFieldName)) {
             if (parser.currentToken() != XContentParser.Token.VALUE_NULL) {
               objValue = (byte) parser.shortValue();
             }
           } else if ("boost".equals(currentFieldName) || "_boost".equals(currentFieldName)) {
             boost = parser.floatValue();
           } else {
             throw new ElasticSearchIllegalArgumentException(
                 "unknown property [" + currentFieldName + "]");
           }
         }
       }
       if (objValue == null) {
         // no value
         return;
       }
       value = objValue;
     } else {
       value = (byte) parser.shortValue();
       if (context.includeInAll(includeInAll, this)) {
         context.allEntries().addText(names.fullName(), parser.text(), boost);
       }
     }
   }
   if (fieldType.indexed() || fieldType.stored()) {
     CustomByteNumericField field = new CustomByteNumericField(this, value, fieldType);
     field.setBoost(boost);
     fields.add(field);
   }
   if (hasDocValues()) {
     addDocValue(context, value);
   }
 }