@Override public SchemaBuilder schemaBuilder(Column column) { switch (column.jdbcType()) { // Numeric integers case Types.TINYINT: // values are an 8-bit unsigned integer value between 0 and 255, we thus need to store it in short int return SchemaBuilder.int16(); // Floating point case microsoft.sql.Types.SMALLMONEY: case microsoft.sql.Types.MONEY: return SpecialValueDecimal.builder(decimalMode, column.length(), column.scale().get()); case microsoft.sql.Types.DATETIMEOFFSET: return ZonedTimestamp.builder(); default: return super.schemaBuilder(column); } }
case Types.SMALLINT: return SchemaBuilder.int16(); case Types.INTEGER:
assertThat(values.field("C5").schema()).isEqualTo(SchemaBuilder.bytes().build()); // JDBC BINARY = bytes assertThat(values.field("C6").index()).isEqualTo(5); assertThat(values.field("C6").schema()).isEqualTo(SchemaBuilder.int16().build());
private SchemaBuilder getNumericSchema(Column column) { if (column.scale().isPresent()) { // return sufficiently sized int schema for non-floating point types Integer scale = column.scale().get(); // a negative scale means rounding, e.g. NUMBER(10, -2) would be rounded to hundreds if (scale <= 0) { int width = column.length() - scale; if (width < 3) { return SchemaBuilder.int8(); } else if (width < 5) { return SchemaBuilder.int16(); } else if (width < 10) { return SchemaBuilder.int32(); } else if (width < 19) { return SchemaBuilder.int64(); } } // larger non-floating point types and floating point types use Decimal return super.schemaBuilder(column); } else { return VariableScaleDecimal.builder(); } }
return new SchemaAndValue(SchemaBuilder.string().optional(), value); } else if (cls.isAssignableFrom(Short.class)) { return new SchemaAndValue(SchemaBuilder.int16().optional(), value); } else if (cls.isAssignableFrom(Integer.class)) {
private SchemaBuilder convertFieldType(Schema.Type type) { switch (type) { case INT8: return SchemaBuilder.int8(); case INT16: return SchemaBuilder.int16(); case INT32: return SchemaBuilder.int32(); case INT64: return SchemaBuilder.int64(); case FLOAT32: return SchemaBuilder.float32(); case FLOAT64: return SchemaBuilder.float64(); case BOOLEAN: return SchemaBuilder.bool(); case STRING: return SchemaBuilder.string(); default: throw new DataException("Unexpected type in Cast transformation: " + type); } }
@TestFactory @DisplayName("tests for int16 field conversions") public List<DynamicTest> testInt16FieldConverter() { SinkFieldConverter converter = new Int16FieldConverter(); List<DynamicTest> tests = new ArrayList<>(); new ArrayList<>(Arrays.asList(Short.MIN_VALUE,(short)0,Short.MAX_VALUE)).forEach( el -> tests.add(dynamicTest("conversion with " + converter.getClass().getSimpleName() + " for "+el, () -> assertEquals((short)el, ((BsonInt32)converter.toBson(el)).getValue()) )) ); tests.add(dynamicTest("optional type conversions", () -> { Schema valueOptionalDefault = SchemaBuilder.int16().optional().defaultValue((short)0); assertAll("checks", () -> assertThrows(DataException.class, () -> converter.toBson(null, Schema.INT16_SCHEMA)), () -> assertEquals(new BsonNull(), converter.toBson(null, Schema.OPTIONAL_INT16_SCHEMA)), () -> assertEquals(((short)valueOptionalDefault.defaultValue()), ((BsonInt32)converter.toBson(null, valueOptionalDefault)).getValue()) ); })); return tests; }
case Types.SMALLINT: return SchemaBuilder.int16(); case Types.INTEGER: