/** * Return a new converter that calls this converter and passes the result to the specified converter. * * @param delegate the converter to call after this converter * @return the new converter, or this converter if {@code delegate} is {@code null} */ default ValueConverter and(ValueConverter delegate) { if (delegate == null) return this; return (data) -> { return delegate.convert(convert(data)); }; }
/** * Return a new converter that will call this converter only when the input is not {@code null}. * * @return the new converter; never null */ default ValueConverter nullOr() { return (data) -> { if (data == null) return null; return convert(data); }; }
/** * Adapt this converter to call the specified <em>fallback</em> converter when this converter returns {@code null} for * a non-null input. * * @param fallback the converter to fall back to when this converter returns {@code null} for a non-null input * @return the new converter, or this converter if {@code fallback} is {@code null} */ default ValueConverter or(ValueConverter fallback) { if (fallback == null) return this; return (data) -> { Object result = convert(data); return result != null || data == null ? result : fallback.convert(data); }; }
private ValueConverter wrapInMappingConverterIfNeeded(ColumnMappers mappers, TableId tableId, Column column, ValueConverter converter) { if (mappers == null || converter == null) { return converter; } ValueConverter mappingConverter = mappers.mappingConverterFor(tableId, column); if (mappingConverter == null) { return converter; } return (value) -> { if (value != null) { value = converter.convert(value); } return mappingConverter.convert(value); }; }
@Test public void shouldTruncateStrings() { String maskValue = "*****"; converter = new MaskStrings(maskValue).create(column); assertThat(converter.convert("1234567890").toString()).isEqualTo(maskValue); assertThat(converter.convert("123456").toString()).isEqualTo(maskValue); assertThat(converter.convert("12345").toString()).isEqualTo(maskValue); assertThat(converter.convert("1234").toString()).isEqualTo(maskValue); assertThat(converter.convert("123").toString()).isEqualTo(maskValue); assertThat(converter.convert("12").toString()).isEqualTo(maskValue); assertThat(converter.convert("1").toString()).isEqualTo(maskValue); assertThat(converter.convert(null).toString()).isEqualTo(maskValue); }
@Test public void shouldTruncateStrings() { converter = new TruncateStrings(5).create(column); assertThat(converter.convert("1234567890").toString()).isEqualTo("12345"); assertThat(converter.convert("123456").toString()).isEqualTo("12345"); assertThat(converter.convert("12345").toString()).isEqualTo("12345"); assertThat(converter.convert("1234").toString()).isEqualTo("1234"); assertThat(converter.convert("123").toString()).isEqualTo("123"); assertThat(converter.convert("12").toString()).isEqualTo("12"); assertThat(converter.convert("1").toString()).isEqualTo("1"); assertThat(converter.convert(null)).isNull(); }
@Test public void shouldTruncateStrings() { Configuration config = Configuration.create() .with("column.truncate.to.10.chars", fullyQualifiedNames.toUpperCase()) .build(); mappers = ColumnMappers.create(config); converter = mappers.mappingConverterFor(tableId, column); assertThat(converter).isNotNull(); assertThat(converter.convert("12345678901234567890").toString()).isEqualTo("1234567890"); assertThat(converter.convert("12345678901234567890").toString().length()).isEqualTo(10); assertThat(converter.convert("12345678901").toString()).isEqualTo("1234567890"); assertThat(converter.convert("12345678901").toString().length()).isEqualTo(10); assertThat(converter.convert("1234567890").toString()).isEqualTo("1234567890"); assertThat(converter.convert("1234567890").toString().length()).isEqualTo(10); assertThat(converter.convert("123456789").toString()).isEqualTo("123456789"); assertThat(converter.convert("123456789").toString().length()).isEqualTo(9); assertThat(converter.convert(null)).isNull(); // null values are unaltered }
if (converter != null) { try { value = converter.convert(value); result.put(fields[i], value); } catch (DataException|IllegalArgumentException e) {
ValueConverter converter = converters[i]; if (converter != null) { value = value == null ? value : converter.convert(value); try { result.put(fields[i], value);
@Test public void shouldMaskStringsWithSpecificValue() { String maskValue = "*-*-*-*-*"; mappers = ColumnMappers.build().maskStrings(fullyQualifiedNames, maskValue).build(); // exact case converter = mappers.mappingConverterFor(tableId, column); assertThat(converter).isNotNull(); assertThat(converter.convert("12345678901234567890")).isEqualTo(maskValue); assertThat(converter.convert("12345678901")).isEqualTo(maskValue); assertThat(converter.convert("1234567890")).isEqualTo(maskValue); assertThat(converter.convert("123456789")).isEqualTo(maskValue); assertThat(converter.convert(null)).isEqualTo(maskValue); // null values are masked, too }
@Test public void shouldMaskStringsToFixedNumberOfSpecifiedCharacters() { char maskChar = '='; String maskValue = Strings.createString(maskChar, 10); mappers = ColumnMappers.build().maskStrings(fullyQualifiedNames, maskValue.length(), maskChar).build(); converter = mappers.mappingConverterFor(tableId, column); assertThat(converter).isNotNull(); assertThat(converter.convert("12345678901234567890")).isEqualTo(maskValue); assertThat(converter.convert("12345678901")).isEqualTo(maskValue); assertThat(converter.convert("1234567890")).isEqualTo(maskValue); assertThat(converter.convert("123456789")).isEqualTo(maskValue); assertThat(converter.convert(null)).isEqualTo(maskValue); // null values are masked, too }
@Test public void shouldMapValuesUsingFunctionByClassName() { mappers = ColumnMappers.build().map(fullyQualifiedNames, RepeatingColumnMapper.class.getName()).build(); converter = mappers.mappingConverterFor(tableId, column); assertThat(converter).isNotNull(); assertThat(converter.convert("1234")).isEqualTo("12341234"); assertThat(converter.convert("a")).isEqualTo("aa"); assertThat(converter.convert(null)).isNull(); }
@Test public void shouldMaskStringsToFixedLength() { String maskValue = "**********"; Configuration config = Configuration.create() .with("column.mask.with.10.chars", fullyQualifiedNames) .build(); mappers = ColumnMappers.create(config); // exact case converter = mappers.mappingConverterFor(tableId, column); assertThat(converter).isNotNull(); assertThat(converter.convert("12345678901234567890")).isEqualTo(maskValue); assertThat(converter.convert("12345678901")).isEqualTo(maskValue); assertThat(converter.convert("1234567890")).isEqualTo(maskValue); assertThat(converter.convert("123456789")).isEqualTo(maskValue); assertThat(converter.convert(null)).isEqualTo(maskValue); // null values are masked, too }
@Test public void shouldMapValuesUsingColumnMapperInstance() { RepeatingColumnMapper mapper = new RepeatingColumnMapper(); mappers = ColumnMappers.build().map(fullyQualifiedNames, mapper).build(); converter = mappers.mappingConverterFor(tableId, column); assertThat(converter).isNotNull(); assertThat(converter.convert("1234")).isEqualTo("12341234"); assertThat(converter.convert("a")).isEqualTo("aa"); assertThat(converter.convert(null)).isNull(); }
private void convertDefaultValueToSchemaType(ColumnEditor columnEditor) { final Column column = columnEditor.create(); // if converters is not null and the default value is not null, we need to convert default value if (converters != null && columnEditor.defaultValue() != null) { Object defaultValue = columnEditor.defaultValue(); final SchemaBuilder schemaBuilder = converters.schemaBuilder(column); if (schemaBuilder == null) { return; } final Schema schema = schemaBuilder.build(); //In order to get the valueConverter for this column, we have to create a field; //The index value -1 in the field will never used when converting default value; //So we can set any number here; final Field field = new Field(column.name(), -1, schema); final ValueConverter valueConverter = converters.converter(column, field); if (defaultValue instanceof String) { defaultValue = defaultValuePreConverter.convert(column, (String)defaultValue); } defaultValue = valueConverter.convert(defaultValue); columnEditor.defaultValue(defaultValue); } }
private void convertDefaultValueToSchemaType(ColumnEditor columnEditor) { final Column column = columnEditor.create(); // if converters is not null and the default value is not null, we need to convert default value if (converters != null && columnEditor.defaultValue() != null) { Object defaultValue = columnEditor.defaultValue(); final SchemaBuilder schemaBuilder = converters.schemaBuilder(column); if (schemaBuilder == null) { return; } final Schema schema = schemaBuilder.build(); //In order to get the valueConverter for this column, we have to create a field; //The index value -1 in the field will never used when converting default value; //So we can set any number here; final Field field = new Field(column.name(), -1, schema); final ValueConverter valueConverter = converters.converter(column, field); if (defaultValue instanceof String) { defaultValue = defaultValuePreConverter.convert(column, (String)defaultValue); } defaultValue = valueConverter.convert(defaultValue); columnEditor.defaultValue(defaultValue); } }
@Test public void testJsonValues() { String sql = "CREATE TABLE JSON_TABLE (" + " A JSON," + " B JSON NOT NULL" + ");"; MySqlValueConverters converters = new MySqlValueConverters(JdbcValueConverters.DecimalMode.DOUBLE, TemporalPrecisionMode.CONNECT, JdbcValueConverters.BigIntUnsignedMode.LONG); DdlParser parser = new MySqlAntlrDdlParser(); Tables tables = new Tables(); parser.parse(sql, tables); Table table = tables.forTable(new TableId(null, null, "JSON_TABLE")); // ColA - Nullable column Column colA= table.columnWithName("A"); Field fieldA = new Field(colA.name(), -1, converters.schemaBuilder(colA).optional().build()); assertThat(converters.converter(colA, fieldA).convert("{}")).isEqualTo("{}"); assertThat(converters.converter(colA, fieldA).convert("[]")).isEqualTo("[]"); assertThat(converters.converter(colA, fieldA).convert(new byte[0])).isNull(); assertThat(converters.converter(colA, fieldA).convert(null)).isNull(); assertThat(converters.converter(colA, fieldA).convert("{ \"key1\": \"val1\", \"key2\": {\"key3\":\"val3\"} }")).isEqualTo("{ \"key1\": \"val1\", \"key2\": {\"key3\":\"val3\"} }"); // ColB - NOT NUll column Column colB= table.columnWithName("B"); Field fieldB = new Field(colB.name(), -1, converters.schemaBuilder(colB).build()); assertThat(converters.converter(colB, fieldB).convert("{}")).isEqualTo("{}"); assertThat(converters.converter(colB, fieldB).convert("[]")).isEqualTo("[]"); assertThat(converters.converter(colB, fieldB).convert(new byte[0])).isEqualTo("{}"); assertThat(converters.converter(colB, fieldB).convert(null)).isEqualTo("{}"); assertThat(converters.converter(colB, fieldB).convert("{ \"key1\": \"val1\", \"key2\": {\"key3\":\"val3\"} }")).isEqualTo("{ \"key1\": \"val1\", \"key2\": {\"key3\":\"val3\"} }"); }
/** * Return a new converter that will call this converter only when the input is not {@code null}. * * @return the new converter; never null */ default ValueConverter nullOr() { return (data) -> { if (data == null) return null; return convert(data); }; }
/** * Return a new converter that calls this converter and passes the result to the specified converter. * * @param delegate the converter to call after this converter * @return the new converter, or this converter if {@code delegate} is {@code null} */ default ValueConverter and(ValueConverter delegate) { if (delegate == null) return this; return (data) -> { return delegate.convert(convert(data)); }; }
/** * Adapt this converter to call the specified <em>fallback</em> converter when this converter returns {@code null} for * a non-null input. * * @param fallback the converter to fall back to when this converter returns {@code null} for a non-null input * @return the new converter, or this converter if {@code fallback} is {@code null} */ default ValueConverter or(ValueConverter fallback) { if (fallback == null) return this; return (data) -> { Object result = convert(data); return result != null || data == null ? result : fallback.convert(data); }; }