NumericFieldMapper.java 4.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118
  1. package org.es.mapping.mapper;
  2. import com.google.common.collect.ImmutableMap;
  3. import org.apache.commons.lang.StringUtils;
  4. import org.elasticsearch.common.xcontent.XContentBuilder;
  5. import org.es.mapping.annotations.enums.NumberType;
  6. import org.es.mapping.annotations.fieldtype.NumberField;
  7. import org.es.mapping.utils.BeanUtils;
  8. import java.io.IOException;
  9. import java.lang.reflect.Field;
  10. import java.math.BigDecimal;
  11. import java.math.BigInteger;
  12. import java.util.Map;
  13. public class NumericFieldMapper {
  14. private static final Map<Class, NumberType> validNumericFieldClassMap = ImmutableMap.<Class, NumberType>builder()
  15. .put(Double.class, NumberType.Double)
  16. .put(BigDecimal.class, NumberType.Double)
  17. .put(Float.class, NumberType.Float)
  18. .put(Long.class, NumberType.Long)
  19. .put(BigInteger.class, NumberType.Long)
  20. .put(Integer.class, NumberType.Integer)
  21. .put(Short.class, NumberType.Short)
  22. .put(Byte.class, NumberType.Byte)
  23. .put(double.class, NumberType.Double)
  24. .put(float.class, NumberType.Float)
  25. .put(long.class, NumberType.Long)
  26. .put(int.class, NumberType.Integer)
  27. .put(short.class, NumberType.Short)
  28. .put(byte.class, NumberType.Byte)
  29. .build();
  30. public static boolean isValidNumberType(Field field) {
  31. if (BeanUtils.isCollectionType(field)) {
  32. if (!BeanUtils.isValidCollectionType(field)) {
  33. throw new IllegalArgumentException(
  34. String.format("Unsupported more than one collection generic type, name[%s].", field.getName()));
  35. }
  36. Class genericTypeClass = (Class) BeanUtils.getCollectionGenericType(field);
  37. return validNumericFieldClassMap.keySet().contains(genericTypeClass);
  38. }
  39. Class<?> fieldClass = field.getType();
  40. return validNumericFieldClassMap.keySet().contains(fieldClass);
  41. }
  42. public static void mapDataType(XContentBuilder mappingBuilder, NumberField numberField) throws IOException {
  43. mappingBuilder.field("type", numberField.type().code());
  44. if (!numberField.coerce()) {
  45. mappingBuilder.field("coerce", numberField.coerce());
  46. }
  47. if (numberField.boost() != 1.0f) {
  48. mappingBuilder.field("boost", numberField.boost());
  49. }
  50. if (!numberField.doc_values()) {
  51. mappingBuilder.field("doc_values", numberField.doc_values());
  52. }
  53. if (numberField.ignore_malformed()) {
  54. mappingBuilder.field("ignore_malformed", numberField.ignore_malformed());
  55. }
  56. if (!numberField.include_in_all()) {
  57. mappingBuilder.field("include_in_all", numberField.include_in_all());
  58. }
  59. else if (!numberField.index()) {
  60. mappingBuilder.field("include_in_all", false);
  61. }
  62. if (!numberField.index()) {
  63. mappingBuilder.field("index", numberField.index());
  64. }
  65. if (StringUtils.isNotBlank(numberField.null_value())) {
  66. mappingBuilder.field("null_value", numberField.null_value());
  67. }
  68. if (numberField.store()) {
  69. mappingBuilder.field("store", numberField.store());
  70. }
  71. if (numberField.type() == NumberType.ScaledFloat && numberField.scaling_factor() != 1) {
  72. mappingBuilder.field("scaling_factor", numberField.scaling_factor());
  73. }
  74. }
  75. public static void mapDataType(XContentBuilder mappingBuilder, Field field) throws IOException {
  76. if (!isValidNumberType(field)) {
  77. throw new IllegalArgumentException(
  78. String.format("field type[%s] is invalid type of number.", field.getType()));
  79. }
  80. if (field.isAnnotationPresent(NumberField.class)) {
  81. NumberField numberField = field.getDeclaredAnnotation(NumberField.class);
  82. mapDataType(mappingBuilder, numberField);
  83. return;
  84. }
  85. if (BeanUtils.isCollectionType(field)) {
  86. Class genericTypeClass = (Class) BeanUtils.getCollectionGenericType(field);
  87. NumberType numberType = validNumericFieldClassMap.get(genericTypeClass);
  88. mappingBuilder.field("type", numberType.code());
  89. }
  90. else {
  91. NumberType numberType = validNumericFieldClassMap.get(field.getType());
  92. mappingBuilder.field("type", numberType.code());
  93. }
  94. }
  95. }