in core/src/main/java/com/jetbrains/youtrackdb/internal/core/metadata/schema/PropertyTypeInternal.java [1780:1968]
public static Number increment(final Number a, final Number b) {
if (a == null || b == null) {
throw new IllegalArgumentException("Cannot increment a null value");
}
switch (a) {
case Integer i -> {
switch (b) {
case Integer integer -> {
final var sum = a.intValue() + b.intValue();
if (sum < 0 && a.intValue() > 0 && b.intValue() > 0)
// SPECIAL CASE: UPGRADE TO LONG
{
return (long) (a.intValue() + b.intValue());
}
return sum;
}
case Long l -> {
return a.intValue() + b.longValue();
}
case Short aShort -> {
final var sum = a.intValue() + b.shortValue();
if (sum < 0 && a.intValue() > 0 && b.shortValue() > 0)
// SPECIAL CASE: UPGRADE TO LONG
{
return (long) (a.intValue() + b.shortValue());
}
return sum;
}
case Float v -> {
return a.intValue() + b.floatValue();
}
case Double v -> {
return a.intValue() + b.doubleValue();
}
case BigDecimal bigDecimal -> {
return new BigDecimal(a.intValue()).add(bigDecimal);
}
default -> {
}
}
}
case Long l -> {
switch (b) {
case Integer i -> {
return a.longValue() + b.intValue();
}
case Long aLong -> {
return a.longValue() + b.longValue();
}
case Short i -> {
return a.longValue() + b.shortValue();
}
case Float v -> {
return a.longValue() + b.floatValue();
}
case Double v -> {
return a.longValue() + b.doubleValue();
}
case BigDecimal bigDecimal -> {
return new BigDecimal(a.longValue()).add(bigDecimal);
}
default -> {
}
}
}
case Short i -> {
switch (b) {
case Integer integer -> {
final var sum = a.shortValue() + b.intValue();
if (sum < 0 && a.shortValue() > 0 && b.intValue() > 0)
// SPECIAL CASE: UPGRADE TO LONG
{
return (long) (a.shortValue() + b.intValue());
}
return sum;
}
case Long l -> {
return a.shortValue() + b.longValue();
}
case Short aShort -> {
final var sum = a.shortValue() + b.shortValue();
if (sum < 0 && a.shortValue() > 0 && b.shortValue() > 0)
// SPECIAL CASE: UPGRADE TO INTEGER
{
return a.intValue() + b.intValue();
}
return sum;
}
case Float v -> {
return a.shortValue() + b.floatValue();
}
case Double v -> {
return a.shortValue() + b.doubleValue();
}
case BigDecimal bigDecimal -> {
return new BigDecimal(a.shortValue()).add(bigDecimal);
}
default -> {
}
}
}
case Float v -> {
switch (b) {
case Integer i -> {
return a.floatValue() + b.intValue();
}
case Long l -> {
return a.floatValue() + b.longValue();
}
case Short i -> {
return a.floatValue() + b.shortValue();
}
case Float aFloat -> {
return a.floatValue() + b.floatValue();
}
case Double aDouble -> {
return a.floatValue() + b.doubleValue();
}
case BigDecimal bigDecimal -> {
return BigDecimal.valueOf(a.floatValue()).add(bigDecimal);
}
default -> {
}
}
}
case Double v -> {
switch (b) {
case Integer i -> {
return a.doubleValue() + b.intValue();
}
case Long l -> {
return a.doubleValue() + b.longValue();
}
case Short i -> {
return a.doubleValue() + b.shortValue();
}
case Float aFloat -> {
return a.doubleValue() + b.floatValue();
}
case Double aDouble -> {
return a.doubleValue() + b.doubleValue();
}
case BigDecimal bigDecimal -> {
return BigDecimal.valueOf(a.doubleValue()).add(bigDecimal);
}
default -> {
}
}
}
case BigDecimal bigDecimal -> {
switch (b) {
case Integer i -> {
return ((BigDecimal) a).add(new BigDecimal(b.intValue()));
}
case Long l -> {
return ((BigDecimal) a).add(new BigDecimal(b.longValue()));
}
case Short i -> {
return ((BigDecimal) a).add(new BigDecimal(b.shortValue()));
}
case Float v -> {
return ((BigDecimal) a).add(BigDecimal.valueOf(b.floatValue()));
}
case Double v -> {
return ((BigDecimal) a).add(BigDecimal.valueOf(b.doubleValue()));
}
case BigDecimal decimal -> {
return ((BigDecimal) a).add(decimal);
}
default -> {
}
}
}
default -> {
}
}
throw new IllegalArgumentException(
"Cannot increment value '"
+ a
+ "' ("
+ a.getClass()
+ ") with '"
+ b
+ "' ("
+ b.getClass()
+ ")");
}