public static Boolean currentTokenAsBoolean(JsonParser parser) throws IOException { switch (parser.currentToken()) { case VALUE_NULL: return null; case VALUE_STRING: case FIELD_NAME: return VarcharOperators.castToBoolean(Slices.utf8Slice(parser.getText())); case VALUE_NUMBER_FLOAT: return DoubleOperators.castToBoolean(parser.getDoubleValue()); case VALUE_NUMBER_INT: return BigintOperators.castToBoolean(parser.getLongValue()); case VALUE_TRUE: return true; case VALUE_FALSE: return false; default: throw new JsonCastException(format("Unexpected token when cast to %s: %s", StandardTypes.BOOLEAN, parser.getText())); } }
public static Long currentTokenAsBigint(JsonParser parser) throws IOException { switch (parser.currentToken()) { case VALUE_NULL: return null; case VALUE_STRING: case FIELD_NAME: return VarcharOperators.castToBigint(Slices.utf8Slice(parser.getText())); case VALUE_NUMBER_FLOAT: return DoubleOperators.castToLong(parser.getDoubleValue()); case VALUE_NUMBER_INT: return parser.getLongValue(); case VALUE_TRUE: return BooleanOperators.castToBigint(true); case VALUE_FALSE: return BooleanOperators.castToBigint(false); default: throw new JsonCastException(format("Unexpected token when cast to %s: %s", StandardTypes.BIGINT, parser.getText())); } }
public static Slice currentTokenAsVarchar(JsonParser parser) throws IOException { switch (parser.currentToken()) { case VALUE_NULL: return null; case VALUE_STRING: case FIELD_NAME: return Slices.utf8Slice(parser.getText()); case VALUE_NUMBER_FLOAT: // Avoidance of loss of precision does not seem to be possible here because of Jackson implementation. return DoubleOperators.castToVarchar(parser.getDoubleValue()); case VALUE_NUMBER_INT: // An alternative is calling getLongValue and then BigintOperators.castToVarchar. // It doesn't work as well because it can result in overflow and underflow exceptions for large integral numbers. return Slices.utf8Slice(parser.getText()); case VALUE_TRUE: return BooleanOperators.castToVarchar(true); case VALUE_FALSE: return BooleanOperators.castToVarchar(false); default: throw new JsonCastException(format("Unexpected token when cast to %s: %s", StandardTypes.VARCHAR, parser.getText())); } }
@ScalarOperator(SATURATED_FLOOR_CAST) @SqlType(StandardTypes.INTEGER) public static long saturatedFloorCastToInteger(@SqlType(StandardTypes.DOUBLE) double value) { return saturatedFloorCastToLong(value, Integer.MIN_VALUE, MIN_INTEGER_AS_DOUBLE, Integer.MAX_VALUE, MAX_INTEGER_PLUS_ONE_AS_DOUBLE); }
@SqlType(StandardTypes.BOOLEAN) public static boolean isDistinctFrom( @SqlType(StandardTypes.DOUBLE) double left, @IsNull boolean leftNull, @SqlType(StandardTypes.DOUBLE) double right, @IsNull boolean rightNull) { if (leftNull != rightNull) { return true; } if (leftNull) { return false; } if (Double.isNaN(left) && Double.isNaN(right)) { return false; } return notEqual(left, right); }
@Test public void testNanHash() { long[] nanRepresentations = new long[] {doubleToLongBits(Double.NaN), 0xfff8000000000000L, 0x7ff8123412341234L, 0xfff8123412341234L}; for (long nanRepresentation : nanRepresentations) { assertTrue(isNaN(longBitsToDouble(nanRepresentation))); // longBitsToDouble() keeps the bitwise difference in NaN assertTrue(nanRepresentation == nanRepresentations[0] || doubleToRawLongBits(longBitsToDouble(nanRepresentation)) != doubleToRawLongBits(longBitsToDouble(nanRepresentations[0]))); assertEquals(DoubleOperators.hashCode(longBitsToDouble(nanRepresentation)), DoubleOperators.hashCode(longBitsToDouble(nanRepresentations[0]))); } } }
public static Long currentTokenAsInteger(JsonParser parser) throws IOException { switch (parser.currentToken()) { case VALUE_NULL: return null; case VALUE_STRING: case FIELD_NAME: return VarcharOperators.castToInteger(Slices.utf8Slice(parser.getText())); case VALUE_NUMBER_FLOAT: return DoubleOperators.castToInteger(parser.getDoubleValue()); case VALUE_NUMBER_INT: return (long) toIntExact(parser.getLongValue()); case VALUE_TRUE: return BooleanOperators.castToInteger(true); case VALUE_FALSE: return BooleanOperators.castToInteger(false); default: throw new JsonCastException(format("Unexpected token when cast to %s: %s", StandardTypes.INTEGER, parser.getText())); } }
public static Long currentTokenAsTinyint(JsonParser parser) throws IOException { switch (parser.currentToken()) { case VALUE_NULL: return null; case VALUE_STRING: case FIELD_NAME: return VarcharOperators.castToTinyint(Slices.utf8Slice(parser.getText())); case VALUE_NUMBER_FLOAT: return DoubleOperators.castToTinyint(parser.getDoubleValue()); case VALUE_NUMBER_INT: return (long) SignedBytes.checkedCast(parser.getLongValue()); case VALUE_TRUE: return BooleanOperators.castToTinyint(true); case VALUE_FALSE: return BooleanOperators.castToTinyint(false); default: throw new JsonCastException(format("Unexpected token when cast to %s: %s", StandardTypes.TINYINT, parser.getText())); } }
public static Long currentTokenAsSmallint(JsonParser parser) throws IOException { switch (parser.currentToken()) { case VALUE_NULL: return null; case VALUE_STRING: case FIELD_NAME: return VarcharOperators.castToSmallint(Slices.utf8Slice(parser.getText())); case VALUE_NUMBER_FLOAT: return DoubleOperators.castToSmallint(parser.getDoubleValue()); case VALUE_NUMBER_INT: return (long) Shorts.checkedCast(parser.getLongValue()); case VALUE_TRUE: return BooleanOperators.castToSmallint(true); case VALUE_FALSE: return BooleanOperators.castToSmallint(false); default: throw new JsonCastException(format("Unexpected token when cast to %s: %s", StandardTypes.SMALLINT, parser.getText())); } }
@ScalarOperator(SATURATED_FLOOR_CAST) @SqlType(StandardTypes.TINYINT) public static long saturatedFloorCastToTinyint(@SqlType(StandardTypes.DOUBLE) double value) { return saturatedFloorCastToLong(value, Byte.MIN_VALUE, MIN_BYTE_AS_DOUBLE, Byte.MAX_VALUE, MAX_BYTE_PLUS_ONE_AS_DOUBLE); }
@SqlType(StandardTypes.BOOLEAN) public static boolean isDistinctFrom( @BlockPosition @SqlType(value = StandardTypes.DOUBLE, nativeContainerType = double.class) Block leftBlock, @BlockIndex int leftPosition, @BlockPosition @SqlType(value = StandardTypes.DOUBLE, nativeContainerType = double.class) Block rightBlock, @BlockIndex int rightPosition) { if (leftBlock.isNull(leftPosition) != rightBlock.isNull(rightPosition)) { return true; } if (leftBlock.isNull(leftPosition)) { return false; } double left = DOUBLE.getDouble(leftBlock, leftPosition); double right = DOUBLE.getDouble(rightBlock, rightPosition); if (Double.isNaN(left) && Double.isNaN(right)) { return false; } return notEqual(left, right); } }
break; case VALUE_NUMBER_FLOAT: result = DoubleOperators.castToBoolean(parser.getDoubleValue()); break; case VALUE_NUMBER_INT:
break; case VALUE_NUMBER_FLOAT: result = DoubleOperators.castToLong(parser.getDoubleValue()); break; case VALUE_NUMBER_INT:
case VALUE_NUMBER_FLOAT: result = DoubleOperators.castToVarchar(parser.getDoubleValue()); break; case VALUE_NUMBER_INT:
@ScalarOperator(SATURATED_FLOOR_CAST) @SqlType(StandardTypes.SMALLINT) public static long saturatedFloorCastToSmallint(@SqlType(StandardTypes.DOUBLE) double value) { return saturatedFloorCastToLong(value, Short.MIN_VALUE, MIN_SHORT_AS_DOUBLE, Short.MAX_VALUE, MAX_SHORT_PLUS_ONE_AS_DOUBLE); }