|
@@ -48,31 +48,31 @@ public class Converters {
|
|
|
static final Converter<Long, LongField> LONG;
|
|
static final Converter<Long, LongField> LONG;
|
|
|
|
|
|
|
|
static {
|
|
static {
|
|
|
- BIGINTEGER = new Converter<>() {
|
|
|
|
|
|
|
+ BIGINTEGER = new Converter<BigInteger, BigIntegerField>() {
|
|
|
@Override
|
|
@Override
|
|
|
public BigIntegerField convert(Field<?> sourceField) {
|
|
public BigIntegerField convert(Field<?> sourceField) {
|
|
|
if (sourceField instanceof LongField) {
|
|
if (sourceField instanceof LongField) {
|
|
|
- return LongToBigInteger((LongField) sourceField);
|
|
|
|
|
|
|
+ return convertLongToBigIntegerField((LongField) sourceField);
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
if (sourceField instanceof DoubleField) {
|
|
if (sourceField instanceof DoubleField) {
|
|
|
- return DoubleToBigInteger((DoubleField) sourceField);
|
|
|
|
|
|
|
+ return convertDoubleToBigIntegerField((DoubleField) sourceField);
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
if (sourceField instanceof StringField) {
|
|
if (sourceField instanceof StringField) {
|
|
|
- return StringToBigInteger((StringField) sourceField);
|
|
|
|
|
|
|
+ return convertStringToBigIntegerField((StringField) sourceField);
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
if (sourceField instanceof DateMillisField) {
|
|
if (sourceField instanceof DateMillisField) {
|
|
|
- return LongToBigInteger(DateMillisToLong((DateMillisField) sourceField));
|
|
|
|
|
|
|
+ return convertLongToBigIntegerField(convertDateMillisToLongField((DateMillisField) sourceField));
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
if (sourceField instanceof DateNanosField) {
|
|
if (sourceField instanceof DateNanosField) {
|
|
|
- return LongToBigInteger(DateNanosToLong((DateNanosField) sourceField));
|
|
|
|
|
|
|
+ return convertLongToBigIntegerField(convertDateNanosToLongField((DateNanosField) sourceField));
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
if (sourceField instanceof BooleanField) {
|
|
if (sourceField instanceof BooleanField) {
|
|
|
- return LongToBigInteger(BooleanToLong((BooleanField) sourceField));
|
|
|
|
|
|
|
+ return convertLongToBigIntegerField(convertBooleanToLongField((BooleanField) sourceField));
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
throw new InvalidConversion(sourceField.getClass(), getFieldClass());
|
|
throw new InvalidConversion(sourceField.getClass(), getFieldClass());
|
|
@@ -89,31 +89,31 @@ public class Converters {
|
|
|
}
|
|
}
|
|
|
};
|
|
};
|
|
|
|
|
|
|
|
- LONG = new Converter<>() {
|
|
|
|
|
|
|
+ LONG = new Converter<Long, LongField>() {
|
|
|
@Override
|
|
@Override
|
|
|
public LongField convert(Field<?> sourceField) {
|
|
public LongField convert(Field<?> sourceField) {
|
|
|
if (sourceField instanceof DoubleField) {
|
|
if (sourceField instanceof DoubleField) {
|
|
|
- return DoubleToLong((DoubleField) sourceField);
|
|
|
|
|
|
|
+ return convertDoubleToLongField((DoubleField) sourceField);
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
if (sourceField instanceof StringField) {
|
|
if (sourceField instanceof StringField) {
|
|
|
- return StringToLong((StringField) sourceField);
|
|
|
|
|
|
|
+ return convertStringToLongField((StringField) sourceField);
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
if (sourceField instanceof DateMillisField) {
|
|
if (sourceField instanceof DateMillisField) {
|
|
|
- return DateMillisToLong((DateMillisField) sourceField);
|
|
|
|
|
|
|
+ return convertDateMillisToLongField((DateMillisField) sourceField);
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
if (sourceField instanceof DateNanosField) {
|
|
if (sourceField instanceof DateNanosField) {
|
|
|
- return DateNanosToLong((DateNanosField) sourceField);
|
|
|
|
|
|
|
+ return convertDateNanosToLongField((DateNanosField) sourceField);
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
if (sourceField instanceof BigIntegerField) {
|
|
if (sourceField instanceof BigIntegerField) {
|
|
|
- return BigIntegerToLong((BigIntegerField) sourceField);
|
|
|
|
|
|
|
+ return convertBigIntegerToLongField((BigIntegerField) sourceField);
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
if (sourceField instanceof BooleanField) {
|
|
if (sourceField instanceof BooleanField) {
|
|
|
- return BooleanToLong((BooleanField) sourceField);
|
|
|
|
|
|
|
+ return convertBooleanToLongField((BooleanField) sourceField);
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
throw new InvalidConversion(sourceField.getClass(), getFieldClass());
|
|
throw new InvalidConversion(sourceField.getClass(), getFieldClass());
|
|
@@ -134,9 +134,9 @@ public class Converters {
|
|
|
// No instances, please
|
|
// No instances, please
|
|
|
private Converters() {}
|
|
private Converters() {}
|
|
|
|
|
|
|
|
- static BigIntegerField LongToBigInteger(LongField sourceField) {
|
|
|
|
|
|
|
+ static BigIntegerField convertLongToBigIntegerField(LongField sourceField) {
|
|
|
FieldValues<Long> fv = sourceField.getFieldValues();
|
|
FieldValues<Long> fv = sourceField.getFieldValues();
|
|
|
- return new BigIntegerField(sourceField.getName(), new DelegatingFieldValues<>(fv) {
|
|
|
|
|
|
|
+ return new BigIntegerField(sourceField.getName(), new DelegatingFieldValues<BigInteger, Long>(fv) {
|
|
|
@Override
|
|
@Override
|
|
|
public List<BigInteger> getValues() {
|
|
public List<BigInteger> getValues() {
|
|
|
return values.getValues().stream().map(BigInteger::valueOf).collect(Collectors.toList());
|
|
return values.getValues().stream().map(BigInteger::valueOf).collect(Collectors.toList());
|
|
@@ -149,48 +149,48 @@ public class Converters {
|
|
|
});
|
|
});
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
- static BigIntegerField DoubleToBigInteger(DoubleField sourceField) {
|
|
|
|
|
|
|
+ static BigIntegerField convertDoubleToBigIntegerField(DoubleField sourceField) {
|
|
|
FieldValues<Double> fv = sourceField.getFieldValues();
|
|
FieldValues<Double> fv = sourceField.getFieldValues();
|
|
|
- return new BigIntegerField(sourceField.getName(), new DelegatingFieldValues<>(fv) {
|
|
|
|
|
|
|
+ return new BigIntegerField(sourceField.getName(), new DelegatingFieldValues<BigInteger, Double>(fv) {
|
|
|
@Override
|
|
@Override
|
|
|
public List<BigInteger> getValues() {
|
|
public List<BigInteger> getValues() {
|
|
|
- return values.getValues().stream().map(
|
|
|
|
|
- dbl -> BigInteger.valueOf(dbl.longValue())
|
|
|
|
|
- ).collect(Collectors.toList());
|
|
|
|
|
|
|
+ return values.getValues().stream().map(Converters::convertDoubleToBigInteger).collect(Collectors.toList());
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
@Override
|
|
@Override
|
|
|
public BigInteger getNonPrimitiveValue() {
|
|
public BigInteger getNonPrimitiveValue() {
|
|
|
- return BigInteger.valueOf(values.getLongValue());
|
|
|
|
|
|
|
+ return convertDoubleToBigInteger(values.getDoubleValue());
|
|
|
}
|
|
}
|
|
|
});
|
|
});
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
- static BigIntegerField StringToBigInteger(StringField sourceField) {
|
|
|
|
|
|
|
+ static BigIntegerField convertStringToBigIntegerField(StringField sourceField) {
|
|
|
FieldValues<String> fv = sourceField.getFieldValues();
|
|
FieldValues<String> fv = sourceField.getFieldValues();
|
|
|
return new BigIntegerField(sourceField.getName(), new DelegatingFieldValues<BigInteger, String>(fv) {
|
|
return new BigIntegerField(sourceField.getName(), new DelegatingFieldValues<BigInteger, String>(fv) {
|
|
|
- protected BigInteger parseNumber(String str) {
|
|
|
|
|
- try {
|
|
|
|
|
- return new BigInteger(str);
|
|
|
|
|
- } catch (NumberFormatException e) {
|
|
|
|
|
- return new BigDecimal(str).toBigInteger();
|
|
|
|
|
- }
|
|
|
|
|
- }
|
|
|
|
|
-
|
|
|
|
|
@Override
|
|
@Override
|
|
|
public List<BigInteger> getValues() {
|
|
public List<BigInteger> getValues() {
|
|
|
- // TODO(stu): this may throw
|
|
|
|
|
- return values.getValues().stream().map(this::parseNumber).collect(Collectors.toList());
|
|
|
|
|
|
|
+ // This may throw NumberFormatException, should we catch and truncate the List? (#76951)
|
|
|
|
|
+ return values.getValues().stream().map(Converters::convertStringToBigInteger).collect(Collectors.toList());
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
@Override
|
|
@Override
|
|
|
public BigInteger getNonPrimitiveValue() {
|
|
public BigInteger getNonPrimitiveValue() {
|
|
|
- return parseNumber(values.getNonPrimitiveValue());
|
|
|
|
|
|
|
+ return convertStringToBigInteger(values.getNonPrimitiveValue());
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ @Override
|
|
|
|
|
+ public long getLongValue() {
|
|
|
|
|
+ return getNonPrimitiveValue().longValue();
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ @Override
|
|
|
|
|
+ public double getDoubleValue() {
|
|
|
|
|
+ return getNonPrimitiveValue().doubleValue();
|
|
|
}
|
|
}
|
|
|
});
|
|
});
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
- static LongField BigIntegerToLong(BigIntegerField sourceField) {
|
|
|
|
|
|
|
+ static LongField convertBigIntegerToLongField(BigIntegerField sourceField) {
|
|
|
FieldValues<BigInteger> fv = sourceField.getFieldValues();
|
|
FieldValues<BigInteger> fv = sourceField.getFieldValues();
|
|
|
return new LongField(sourceField.getName(), new DelegatingFieldValues<Long, BigInteger>(fv) {
|
|
return new LongField(sourceField.getName(), new DelegatingFieldValues<Long, BigInteger>(fv) {
|
|
|
@Override
|
|
@Override
|
|
@@ -200,12 +200,22 @@ public class Converters {
|
|
|
|
|
|
|
|
@Override
|
|
@Override
|
|
|
public Long getNonPrimitiveValue() {
|
|
public Long getNonPrimitiveValue() {
|
|
|
- return values.getLongValue();
|
|
|
|
|
|
|
+ return convertBigIntegerToLong(values.getNonPrimitiveValue());
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ @Override
|
|
|
|
|
+ public long getLongValue() {
|
|
|
|
|
+ return convertBigIntegerToLong(values.getNonPrimitiveValue());
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ @Override
|
|
|
|
|
+ public double getDoubleValue() {
|
|
|
|
|
+ return convertBigIntegerToLong(values.getNonPrimitiveValue());
|
|
|
}
|
|
}
|
|
|
});
|
|
});
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
- static LongField BooleanToLong(BooleanField sourceField) {
|
|
|
|
|
|
|
+ static LongField convertBooleanToLongField(BooleanField sourceField) {
|
|
|
FieldValues<Boolean> fv = sourceField.getFieldValues();
|
|
FieldValues<Boolean> fv = sourceField.getFieldValues();
|
|
|
return new LongField(sourceField.getName(), new DelegatingFieldValues<Long, Boolean>(fv) {
|
|
return new LongField(sourceField.getName(), new DelegatingFieldValues<Long, Boolean>(fv) {
|
|
|
@Override
|
|
@Override
|
|
@@ -215,12 +225,22 @@ public class Converters {
|
|
|
|
|
|
|
|
@Override
|
|
@Override
|
|
|
public Long getNonPrimitiveValue() {
|
|
public Long getNonPrimitiveValue() {
|
|
|
- return getLongValue();
|
|
|
|
|
|
|
+ return convertBooleanToLong(values.getNonPrimitiveValue());
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ @Override
|
|
|
|
|
+ public long getLongValue() {
|
|
|
|
|
+ return convertBooleanToLong(values.getNonPrimitiveValue());
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ @Override
|
|
|
|
|
+ public double getDoubleValue() {
|
|
|
|
|
+ return convertBooleanToLong(values.getNonPrimitiveValue());
|
|
|
}
|
|
}
|
|
|
});
|
|
});
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
- static LongField DateMillisToLong(DateMillisField sourceField) {
|
|
|
|
|
|
|
+ static LongField convertDateMillisToLongField(DateMillisField sourceField) {
|
|
|
FieldValues<JodaCompatibleZonedDateTime> fv = sourceField.getFieldValues();
|
|
FieldValues<JodaCompatibleZonedDateTime> fv = sourceField.getFieldValues();
|
|
|
return new LongField(sourceField.getName(), new DelegatingFieldValues<Long, JodaCompatibleZonedDateTime>(fv) {
|
|
return new LongField(sourceField.getName(), new DelegatingFieldValues<Long, JodaCompatibleZonedDateTime>(fv) {
|
|
|
@Override
|
|
@Override
|
|
@@ -230,12 +250,22 @@ public class Converters {
|
|
|
|
|
|
|
|
@Override
|
|
@Override
|
|
|
public Long getNonPrimitiveValue() {
|
|
public Long getNonPrimitiveValue() {
|
|
|
- return values.getNonPrimitiveValue().toInstant().toEpochMilli();
|
|
|
|
|
|
|
+ return convertDateMillisToLong(values.getNonPrimitiveValue());
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ @Override
|
|
|
|
|
+ public long getLongValue() {
|
|
|
|
|
+ return convertDateMillisToLong(values.getNonPrimitiveValue());
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ @Override
|
|
|
|
|
+ public double getDoubleValue() {
|
|
|
|
|
+ return convertDateMillisToLong(values.getNonPrimitiveValue());
|
|
|
}
|
|
}
|
|
|
});
|
|
});
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
- static LongField DateNanosToLong(DateNanosField sourceField) {
|
|
|
|
|
|
|
+ static LongField convertDateNanosToLongField(DateNanosField sourceField) {
|
|
|
FieldValues<JodaCompatibleZonedDateTime> fv = sourceField.getFieldValues();
|
|
FieldValues<JodaCompatibleZonedDateTime> fv = sourceField.getFieldValues();
|
|
|
return new LongField(sourceField.getName(), new DelegatingFieldValues<Long, JodaCompatibleZonedDateTime>(fv) {
|
|
return new LongField(sourceField.getName(), new DelegatingFieldValues<Long, JodaCompatibleZonedDateTime>(fv) {
|
|
|
protected long nanoLong(JodaCompatibleZonedDateTime dt) {
|
|
protected long nanoLong(JodaCompatibleZonedDateTime dt) {
|
|
@@ -249,12 +279,22 @@ public class Converters {
|
|
|
|
|
|
|
|
@Override
|
|
@Override
|
|
|
public Long getNonPrimitiveValue() {
|
|
public Long getNonPrimitiveValue() {
|
|
|
- return ChronoUnit.NANOS.between(Instant.EPOCH, values.getNonPrimitiveValue().toInstant());
|
|
|
|
|
|
|
+ return convertDateNanosToLong(values.getNonPrimitiveValue());
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ @Override
|
|
|
|
|
+ public long getLongValue() {
|
|
|
|
|
+ return convertDateNanosToLong(values.getNonPrimitiveValue());
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ @Override
|
|
|
|
|
+ public double getDoubleValue() {
|
|
|
|
|
+ return convertDateNanosToLong(values.getNonPrimitiveValue());
|
|
|
}
|
|
}
|
|
|
});
|
|
});
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
- static LongField DoubleToLong(DoubleField sourceField) {
|
|
|
|
|
|
|
+ static LongField convertDoubleToLongField(DoubleField sourceField) {
|
|
|
FieldValues<Double> fv = sourceField.getFieldValues();
|
|
FieldValues<Double> fv = sourceField.getFieldValues();
|
|
|
return new LongField(sourceField.getName(), new DelegatingFieldValues<Long, Double>(fv) {
|
|
return new LongField(sourceField.getName(), new DelegatingFieldValues<Long, Double>(fv) {
|
|
|
@Override
|
|
@Override
|
|
@@ -269,7 +309,7 @@ public class Converters {
|
|
|
});
|
|
});
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
- static LongField StringToLong(StringField sourceField) {
|
|
|
|
|
|
|
+ static LongField convertStringToLongField(StringField sourceField) {
|
|
|
FieldValues<String> fv = sourceField.getFieldValues();
|
|
FieldValues<String> fv = sourceField.getFieldValues();
|
|
|
return new LongField(sourceField.getName(), new DelegatingFieldValues<Long, String>(fv) {
|
|
return new LongField(sourceField.getName(), new DelegatingFieldValues<Long, String>(fv) {
|
|
|
@Override
|
|
@Override
|
|
@@ -279,21 +319,68 @@ public class Converters {
|
|
|
|
|
|
|
|
@Override
|
|
@Override
|
|
|
public Long getNonPrimitiveValue() {
|
|
public Long getNonPrimitiveValue() {
|
|
|
- return Long.parseLong(values.getNonPrimitiveValue());
|
|
|
|
|
|
|
+ return convertStringToLong(values.getNonPrimitiveValue());
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
@Override
|
|
@Override
|
|
|
public long getLongValue() {
|
|
public long getLongValue() {
|
|
|
- return Long.parseLong(values.getNonPrimitiveValue());
|
|
|
|
|
|
|
+ return convertStringToLong(values.getNonPrimitiveValue());
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
@Override
|
|
@Override
|
|
|
public double getDoubleValue() {
|
|
public double getDoubleValue() {
|
|
|
- return getLongValue();
|
|
|
|
|
|
|
+ // conversion is to LongField, doesn't make sense to parse a Double out of the String here.
|
|
|
|
|
+ return convertStringToLong(values.getNonPrimitiveValue());
|
|
|
}
|
|
}
|
|
|
});
|
|
});
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
|
|
+ public static long convertBigIntegerToLong(BigInteger bigInteger) {
|
|
|
|
|
+ return bigInteger.longValue();
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ public static double convertBigIntegerToDouble(BigInteger bigInteger) {
|
|
|
|
|
+ return bigInteger.doubleValue();
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ public static long convertBooleanToLong(boolean bool) {
|
|
|
|
|
+ return bool ? 1L : 0L;
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ public static double convertBooleanToDouble(boolean bool) {
|
|
|
|
|
+ return bool ? 1.0d : 0.0d;
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ public static long convertDateMillisToLong(JodaCompatibleZonedDateTime dt) {
|
|
|
|
|
+ return dt.toInstant().toEpochMilli();
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ public static long convertDateNanosToLong(JodaCompatibleZonedDateTime dt) {
|
|
|
|
|
+ return ChronoUnit.NANOS.between(Instant.EPOCH, dt.toInstant());
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ public static BigInteger convertDoubleToBigInteger(double dbl) {
|
|
|
|
|
+ return BigDecimal.valueOf(dbl).toBigInteger();
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ // String
|
|
|
|
|
+ public static BigInteger convertStringToBigInteger(String str) {
|
|
|
|
|
+ try {
|
|
|
|
|
+ return new BigInteger(str);
|
|
|
|
|
+ } catch (NumberFormatException e) {
|
|
|
|
|
+ return new BigDecimal(str).toBigInteger();
|
|
|
|
|
+ }
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ public static double convertStringToDouble(String str) {
|
|
|
|
|
+ return Double.parseDouble(str);
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ public static long convertStringToLong(String str) {
|
|
|
|
|
+ return Long.parseLong(str);
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+
|
|
|
/**
|
|
/**
|
|
|
* Helper for creating {@link Converter} classes which delegates all un-overridden methods to the underlying
|
|
* Helper for creating {@link Converter} classes which delegates all un-overridden methods to the underlying
|
|
|
* {@link FieldValues}.
|
|
* {@link FieldValues}.
|