/** * Returns a Schema for a VariableScaleDecimal but with all other default Schema settings. * * @return the schema * @see #builder() */ public static Schema schema() { return builder().build(); }
/** * Converts a value from its logical format to its encoded format - a struct containing * the scale of the number and a binary representation of the number. * * @param schema of the encoded value * @param value the value or the decimal * * @return the encoded value */ public static Struct fromLogical(Schema schema, SpecialValueDecimal value) { return fromLogical(schema, value.getDecimalValue().orElse(null)); }
@Test public void testVariableScaleDecimal() { final BigDecimal testValue = new BigDecimal("138.456"); final Struct struct = VariableScaleDecimal.fromLogical(VariableScaleDecimal.schema(), new SpecialValueDecimal(testValue)); final BigDecimal decodedValue = VariableScaleDecimal.toLogical(struct).getDecimalValue().get(); assertEquals("Number should be same after serde", testValue, decodedValue); } }
protected List<SchemaAndValueField> schemasAndValuesForArrayTypes() { Struct element; final List<Struct> varnumArray = new ArrayList<>(); element = new Struct(VariableScaleDecimal.schema()); element.put("scale", 1).put("value", new BigDecimal("1.1").unscaledValue().toByteArray()); varnumArray.add(element); element = new Struct(VariableScaleDecimal.schema()); element.put("scale", 2).put("value", new BigDecimal("2.22").unscaledValue().toByteArray()); varnumArray.add(element); element = new Struct(VariableScaleDecimal.schema()); element.put("scale", 3).put("value", new BigDecimal("3.333").unscaledValue().toByteArray()); varnumArray.add(element); new BigDecimal("5.60") )), new SchemaAndValueField("varnumeric_array", SchemaBuilder.array(VariableScaleDecimal.builder().optional().build()).optional().build(), varnumArray), new SchemaAndValueField("citext_array", SchemaBuilder.array(SchemaBuilder.OPTIONAL_STRING_SCHEMA).optional().build(),
protected List<SchemaAndValueField> schemasAndValuesForBigDecimalEncodedNumericTypes() { final Struct dvs = new Struct(VariableScaleDecimal.schema()); dvs.put("scale", 4).put("value", new BigDecimal("10.1111").unscaledValue().toByteArray()); final Struct nvs = new Struct(VariableScaleDecimal.schema()); nvs.put("scale", 4).put("value", new BigDecimal("22.2222").unscaledValue().toByteArray()); final Struct dvs_int = new Struct(VariableScaleDecimal.schema()); dvs_int.put("scale", 0).put("value", new BigDecimal("10").unscaledValue().toByteArray()); final Struct nvs_int = new Struct(VariableScaleDecimal.schema()); nvs_int.put("scale", 0).put("value", new BigDecimal("22").unscaledValue().toByteArray()); final List<SchemaAndValueField> fields = new ArrayList<SchemaAndValueField>(Arrays.asList( new SchemaAndValueField("d", Decimal.builder(2).parameter(TestHelper.PRECISION_PARAMETER_KEY, "3").optional().build(), new BigDecimal("1.10")), new SchemaAndValueField("dzs", Decimal.builder(0).parameter(TestHelper.PRECISION_PARAMETER_KEY, "4").optional().build(), new BigDecimal("10")), new SchemaAndValueField("dvs", VariableScaleDecimal.optionalSchema(), dvs), new SchemaAndValueField("d_nn", Decimal.builder(2).parameter(TestHelper.PRECISION_PARAMETER_KEY, "3").build(), new BigDecimal("3.30")), new SchemaAndValueField("n", Decimal.builder(4).parameter(TestHelper.PRECISION_PARAMETER_KEY, "6").optional().build(), new BigDecimal("22.2200")), new SchemaAndValueField("nzs", Decimal.builder(0).parameter(TestHelper.PRECISION_PARAMETER_KEY, "4").optional().build(), new BigDecimal("22")), new SchemaAndValueField("nvs", VariableScaleDecimal.optionalSchema(), nvs), new SchemaAndValueField("d_int", Decimal.builder(2).parameter(TestHelper.PRECISION_PARAMETER_KEY, "3").optional().build(), new BigDecimal("1.00")), new SchemaAndValueField("dvs_int", VariableScaleDecimal.optionalSchema(), dvs_int), new SchemaAndValueField("n_int", Decimal.builder(4).parameter(TestHelper.PRECISION_PARAMETER_KEY, "6").optional().build(), new BigDecimal("22.0000")), new SchemaAndValueField("nvs_int", VariableScaleDecimal.optionalSchema(), nvs_int) )); return fields; }
updatedRecord = consumer.remove(); final Struct dvs = new Struct(VariableScaleDecimal.schema()); dvs.put("scale", 4).put("value", new BigDecimal("123.4567").unscaledValue().toByteArray()); VerifyRecord.isValidInsert(updatedRecord, PK_FIELD, 3); assertRecordSchemaAndValues( Collections.singletonList(new SchemaAndValueField("num_val", VariableScaleDecimal.builder().optional().build(), dvs)), updatedRecord, Envelope.FieldName.AFTER); updatedRecord = consumer.remove(); final Struct dvs2 = new Struct(VariableScaleDecimal.schema()); dvs2.put("scale", 1).put("value", new BigDecimal("1225.1").unscaledValue().toByteArray()); VerifyRecord.isValidInsert(updatedRecord, PK_FIELD, 6); assertRecordSchemaAndValues( Collections.singletonList(new SchemaAndValueField("num_val", VariableScaleDecimal.builder().optional().build(), dvs2)), updatedRecord, Envelope.FieldName.AFTER); VerifyRecord.isValidInsert(updatedRecord, PK_FIELD, 7); assertRecordSchemaAndValues( Collections.singletonList(new SchemaAndValueField("num_val", VariableScaleDecimal.builder().build(), dvs2)), updatedRecord, Envelope.FieldName.AFTER);
protected List<SchemaAndValueField> schemasAndValuesForBigDecimalEncodedNumericTypes() { final Struct dvs = new Struct(VariableScaleDecimal.schema()); dvs.put("scale", 4).put("value", new BigDecimal("10.1111").unscaledValue().toByteArray()); final Struct nvs = new Struct(VariableScaleDecimal.schema()); nvs.put("scale", 4).put("value", new BigDecimal("22.2222").unscaledValue().toByteArray()); final Struct dvs_int = new Struct(VariableScaleDecimal.schema()); dvs_int.put("scale", 0).put("value", new BigDecimal("10").unscaledValue().toByteArray()); final Struct nvs_int = new Struct(VariableScaleDecimal.schema()); nvs_int.put("scale", 0).put("value", new BigDecimal("22").unscaledValue().toByteArray()); final List<SchemaAndValueField> fields = new ArrayList<SchemaAndValueField>(Arrays.asList( new SchemaAndValueField("d", Decimal.builder(2).parameter(TestHelper.PRECISION_PARAMETER_KEY, "3").optional().build(), new BigDecimal("1.10")), new SchemaAndValueField("dzs", Decimal.builder(0).parameter(TestHelper.PRECISION_PARAMETER_KEY, "4").optional().build(), new BigDecimal("10")), new SchemaAndValueField("dvs", VariableScaleDecimal.optionalSchema(), dvs), new SchemaAndValueField("d_nn", Decimal.builder(2).parameter(TestHelper.PRECISION_PARAMETER_KEY, "3").build(), new BigDecimal("3.30")), new SchemaAndValueField("n", Decimal.builder(4).parameter(TestHelper.PRECISION_PARAMETER_KEY, "6").optional().build(), new BigDecimal("22.2200")), new SchemaAndValueField("nzs", Decimal.builder(0).parameter(TestHelper.PRECISION_PARAMETER_KEY, "4").optional().build(), new BigDecimal("22")), new SchemaAndValueField("nvs", VariableScaleDecimal.optionalSchema(), nvs), new SchemaAndValueField("d_int", Decimal.builder(2).parameter(TestHelper.PRECISION_PARAMETER_KEY, "3").optional().build(), new BigDecimal("1.00")), new SchemaAndValueField("dvs_int", VariableScaleDecimal.optionalSchema(), dvs_int), new SchemaAndValueField("n_int", Decimal.builder(4).parameter(TestHelper.PRECISION_PARAMETER_KEY, "6").optional().build(), new BigDecimal("22.0000")), new SchemaAndValueField("nvs_int", VariableScaleDecimal.optionalSchema(), nvs_int) )); return fields; }
/** * Returns a Schema for an optional VariableScaleDecimal but with all other default Schema settings. * * @return the schema * @see #builder() */ public static Schema optionalSchema() { return builder().optional().build(); }
protected List<SchemaAndValueField> schemasAndValuesForArrayTypes() { Struct element; final List<Struct> varnumArray = new ArrayList<>(); element = new Struct(VariableScaleDecimal.schema()); element.put("scale", 1).put("value", new BigDecimal("1.1").unscaledValue().toByteArray()); varnumArray.add(element); element = new Struct(VariableScaleDecimal.schema()); element.put("scale", 2).put("value", new BigDecimal("2.22").unscaledValue().toByteArray()); varnumArray.add(element); element = new Struct(VariableScaleDecimal.schema()); element.put("scale", 3).put("value", new BigDecimal("3.333").unscaledValue().toByteArray()); varnumArray.add(element); new BigDecimal("5.60") )), new SchemaAndValueField("varnumeric_array", SchemaBuilder.array(VariableScaleDecimal.builder().optional().build()).optional().build(), varnumArray), new SchemaAndValueField("citext_array", SchemaBuilder.array(SchemaBuilder.OPTIONAL_STRING_SCHEMA).optional().build(),
protected Object convertDecimal(Column column, Field fieldDefn, Object data, DecimalMode mode) { SpecialValueDecimal value; BigDecimal newDecimal; if (data instanceof SpecialValueDecimal) { value = (SpecialValueDecimal)data; if (!value.getDecimalValue().isPresent()) { return SpecialValueDecimal.fromLogical(value, mode, column.name()); } } else { final Object o = toBigDecimal(column, fieldDefn, data); if (o == null || !(o instanceof BigDecimal)) { return o; } value = new SpecialValueDecimal((BigDecimal)o); } newDecimal = value.getDecimalValue().get(); if (column.scale().get() > newDecimal.scale()) { newDecimal = newDecimal.setScale(column.scale().get()); } if (isVariableScaleDecimal(column) && mode == DecimalMode.PRECISE) { newDecimal = newDecimal.stripTrailingZeros(); if (newDecimal.scale() < 0) { newDecimal = newDecimal.setScale(0); } return VariableScaleDecimal.fromLogical(fieldDefn.schema(), new SpecialValueDecimal(newDecimal)); } return SpecialValueDecimal.fromLogical(new SpecialValueDecimal(newDecimal), mode, column.name()); }
@Test public void testVariableScaleDecimal() { final BigDecimal testValue = new BigDecimal("138.456"); final Struct struct = VariableScaleDecimal.fromLogical(VariableScaleDecimal.schema(), new SpecialValueDecimal(testValue)); final BigDecimal decodedValue = VariableScaleDecimal.toLogical(struct).getDecimalValue().get(); assertEquals("Number should be same after serde", testValue, decodedValue); } }
private SchemaBuilder numericSchema(Column column) { if (decimalMode == DecimalMode.PRECISE && isVariableScaleDecimal(column)) { return VariableScaleDecimal.builder(); } return SpecialValueDecimal.builder(decimalMode, column.length(), column.scale().get()); }
updatedRecord = consumer.remove(); final Struct dvs = new Struct(VariableScaleDecimal.schema()); dvs.put("scale", 4).put("value", new BigDecimal("123.4567").unscaledValue().toByteArray()); VerifyRecord.isValidInsert(updatedRecord, PK_FIELD, 3); assertRecordSchemaAndValues( Collections.singletonList(new SchemaAndValueField("num_val", VariableScaleDecimal.builder().optional().build(), dvs)), updatedRecord, Envelope.FieldName.AFTER); updatedRecord = consumer.remove(); final Struct dvs2 = new Struct(VariableScaleDecimal.schema()); dvs2.put("scale", 1).put("value", new BigDecimal("1225.1").unscaledValue().toByteArray()); VerifyRecord.isValidInsert(updatedRecord, PK_FIELD, 6); assertRecordSchemaAndValues( Collections.singletonList(new SchemaAndValueField("num_val", VariableScaleDecimal.builder().optional().build(), dvs2)), updatedRecord, Envelope.FieldName.AFTER); VerifyRecord.isValidInsert(updatedRecord, PK_FIELD, 7); assertRecordSchemaAndValues( Collections.singletonList(new SchemaAndValueField("num_val", VariableScaleDecimal.builder().build(), dvs2)), updatedRecord, Envelope.FieldName.AFTER);
/** * Converts a value from its logical format to its encoded format - a struct containing * the scale of the number and a binary representation of the number. * * @param schema of the encoded value * @param value the value or the decimal * * @return the encoded value */ public static Struct fromLogical(Schema schema, SpecialValueDecimal value) { return fromLogical(schema, value.getDecimalValue().orElse(null)); }
Decimal.builder(2).parameter(TestHelper.PRECISION_PARAMETER_KEY, "3").optional().build(), Decimal.builder(0).parameter(TestHelper.PRECISION_PARAMETER_KEY, "4").optional().build(), VariableScaleDecimal.builder().optional().build(), Decimal.builder(4).parameter(TestHelper.PRECISION_PARAMETER_KEY, "6").optional().build(), Decimal.builder(0).parameter(TestHelper.PRECISION_PARAMETER_KEY, "4").optional().build(), VariableScaleDecimal.builder().optional().build() ); assertTableSchema("public.string_table", "vc, vcv, ch, c, t, ct",
protected Object convertVariableScale(Column column, Field fieldDefn, Object data) { data = convertNumeric(column, fieldDefn, data); // provides default value if (data == null) { return null; } // TODO Need to handle special values, it is not supported in variable scale decimal else if (data instanceof SpecialValueDecimal) { return VariableScaleDecimal.fromLogical(fieldDefn.schema(), (SpecialValueDecimal)data); } else if (data instanceof BigDecimal) { return VariableScaleDecimal.fromLogical(fieldDefn.schema(), new SpecialValueDecimal((BigDecimal)data)); } return handleUnknownData(column, fieldDefn, data); }
/** * Returns a Schema for a VariableScaleDecimal but with all other default Schema settings. * * @return the schema * @see #builder() */ public static Schema schema() { return builder().build(); }
protected Object convertDecimal(Column column, Field fieldDefn, Object data, DecimalMode mode) { SpecialValueDecimal value; BigDecimal newDecimal; if (data instanceof SpecialValueDecimal) { value = (SpecialValueDecimal)data; if (!value.getDecimalValue().isPresent()) { return SpecialValueDecimal.fromLogical(value, mode, column.name()); } } else { final Object o = toBigDecimal(column, fieldDefn, data); if (o == null || !(o instanceof BigDecimal)) { return o; } value = new SpecialValueDecimal((BigDecimal)o); } newDecimal = value.getDecimalValue().get(); if (column.scale().get() > newDecimal.scale()) { newDecimal = newDecimal.setScale(column.scale().get()); } if (isVariableScaleDecimal(column) && mode == DecimalMode.PRECISE) { newDecimal = newDecimal.stripTrailingZeros(); if (newDecimal.scale() < 0) { newDecimal = newDecimal.setScale(0); } return VariableScaleDecimal.fromLogical(fieldDefn.schema(), new SpecialValueDecimal(newDecimal)); } return SpecialValueDecimal.fromLogical(new SpecialValueDecimal(newDecimal), mode, column.name()); }
/** * Returns a Schema for an optional VariableScaleDecimal but with all other default Schema settings. * * @return the schema * @see #builder() */ public static Schema optionalSchema() { return builder().optional().build(); }
private SchemaBuilder numericSchema(Column column) { if (decimalMode == DecimalMode.PRECISE && isVariableScaleDecimal(column)) { return VariableScaleDecimal.builder(); } return SpecialValueDecimal.builder(decimalMode, column.length(), column.scale().get()); }