From: Robert Varga Date: Thu, 18 May 2023 08:42:26 +0000 (+0200) Subject: Improve Decimal64 coding X-Git-Tag: v11.0.0~132 X-Git-Url: https://git.opendaylight.org/gerrit/gitweb?a=commitdiff_plain;h=70d6e02ce8cc821232a147363f14aae004c9f9ad;p=yangtools.git Improve Decimal64 coding We are defining the Potassium output format, make sure we do not use Strings to encode Decimal64, just plain binary -- up to 9 bytes. JIRA: YANGTOOLS-568 Change-Id: If0f42d0b16594fd3ed6703277d41e547ef197302 Signed-off-by: Robert Varga --- diff --git a/codec/yang-data-codec-binfmt/src/main/java/org/opendaylight/yangtools/yang/data/codec/binfmt/PotassiumDataInput.java b/codec/yang-data-codec-binfmt/src/main/java/org/opendaylight/yangtools/yang/data/codec/binfmt/PotassiumDataInput.java index ee5e05c18a..73550a9fb8 100644 --- a/codec/yang-data-codec-binfmt/src/main/java/org/opendaylight/yangtools/yang/data/codec/binfmt/PotassiumDataInput.java +++ b/codec/yang-data-codec-binfmt/src/main/java/org/opendaylight/yangtools/yang/data/codec/binfmt/PotassiumDataInput.java @@ -26,6 +26,7 @@ import java.util.concurrent.ExecutionException; import javax.xml.transform.dom.DOMSource; import org.eclipse.jdt.annotation.NonNull; import org.opendaylight.yangtools.concepts.Either; +import org.opendaylight.yangtools.concepts.WritableObjects; import org.opendaylight.yangtools.util.xml.UntrustedXML; import org.opendaylight.yangtools.yang.common.Decimal64; import org.opendaylight.yangtools.yang.common.Empty; @@ -719,9 +720,8 @@ final class PotassiumDataInput extends AbstractNormalizedNodeDataInput { return Uint64.ZERO; case PotassiumValue.UINT64_4B: return Uint64.fromLongBits(input.readInt() & 0xFFFFFFFFL); - case PotassiumValue.BIGDECIMAL: - // FIXME: use string -> Decimal64 cache - return Decimal64.valueOf(input.readUTF()); + case PotassiumValue.DECIMAL64: + return Decimal64.of(input.readByte(), WritableObjects.readLong(input)); case PotassiumValue.STRING_EMPTY: return ""; case PotassiumValue.STRING_UTF: diff --git a/codec/yang-data-codec-binfmt/src/main/java/org/opendaylight/yangtools/yang/data/codec/binfmt/PotassiumDataOutput.java b/codec/yang-data-codec-binfmt/src/main/java/org/opendaylight/yangtools/yang/data/codec/binfmt/PotassiumDataOutput.java index 2834c5e8c7..dbc4c3c61b 100644 --- a/codec/yang-data-codec-binfmt/src/main/java/org/opendaylight/yangtools/yang/data/codec/binfmt/PotassiumDataOutput.java +++ b/codec/yang-data-codec-binfmt/src/main/java/org/opendaylight/yangtools/yang/data/codec/binfmt/PotassiumDataOutput.java @@ -12,7 +12,6 @@ import static com.google.common.base.Preconditions.checkArgument; import java.io.DataOutput; import java.io.IOException; import java.io.StringWriter; -import java.math.BigDecimal; import java.nio.charset.StandardCharsets; import java.util.ArrayDeque; import java.util.Deque; @@ -27,6 +26,7 @@ import javax.xml.transform.TransformerFactory; import javax.xml.transform.dom.DOMSource; import javax.xml.transform.stream.StreamResult; import org.eclipse.jdt.annotation.NonNull; +import org.opendaylight.yangtools.concepts.WritableObjects; import org.opendaylight.yangtools.yang.common.Decimal64; import org.opendaylight.yangtools.yang.common.Empty; import org.opendaylight.yangtools.yang.common.QName; @@ -320,9 +320,10 @@ final class PotassiumDataOutput extends AbstractNormalizedNodeDataOutput { output.writeByte(PotassiumValue.EMPTY); } else if (value instanceof Set set) { writeValue(set); - } else if (value instanceof BigDecimal || value instanceof Decimal64) { - output.writeByte(PotassiumValue.BIGDECIMAL); - output.writeUTF(value.toString()); + } else if (value instanceof Decimal64 decimal) { + output.writeByte(PotassiumValue.DECIMAL64); + output.writeByte(decimal.scale()); + WritableObjects.writeLong(output, decimal.unscaledValue()); } else { throw new IOException("Unhandled value type " + value.getClass()); } diff --git a/codec/yang-data-codec-binfmt/src/main/java/org/opendaylight/yangtools/yang/data/codec/binfmt/PotassiumValue.java b/codec/yang-data-codec-binfmt/src/main/java/org/opendaylight/yangtools/yang/data/codec/binfmt/PotassiumValue.java index 0313bf0221..a9c21a3c51 100644 --- a/codec/yang-data-codec-binfmt/src/main/java/org/opendaylight/yangtools/yang/data/codec/binfmt/PotassiumValue.java +++ b/codec/yang-data-codec-binfmt/src/main/java/org/opendaylight/yangtools/yang/data/codec/binfmt/PotassiumValue.java @@ -8,8 +8,7 @@ package org.opendaylight.yangtools.yang.data.codec.binfmt; import java.io.DataOutput; -import java.math.BigDecimal; -import java.math.BigInteger; +import org.opendaylight.yangtools.yang.common.Decimal64; import org.opendaylight.yangtools.yang.common.Empty; import org.opendaylight.yangtools.yang.common.Uint16; import org.opendaylight.yangtools.yang.common.Uint32; @@ -176,18 +175,12 @@ final class PotassiumValue { * Reference a previously defined QNameModule. Reference number is encoded as {@code int}. */ static final byte MODREF_4B = 0x1C; - - /** - * A {@link BigDecimal}, encoded through {@link DataOutput#writeUTF(String)}. - */ - // This is legacy compatibility. At some point we will remove support for writing these. - static final byte BIGDECIMAL = 0x1D; /** - * A {@link BigInteger}, encoded through {@link DataOutput#writeUTF(String)}. + * A {@link Decimal64}, encoded with fraction-digits byte and a WritableObjects.writeLong(). */ - // This is legacy compatibility. At some point we will remove support for writing these. - static final byte BIGINTEGER = 0x1E; + static final byte DECIMAL64 = 0x1D; + // 0x1E reserved // 0x1F reserved /** diff --git a/codec/yang-data-codec-binfmt/src/test/java/org/opendaylight/yangtools/yang/data/codec/binfmt/NormalizedNodeStreamReaderWriterTest.java b/codec/yang-data-codec-binfmt/src/test/java/org/opendaylight/yangtools/yang/data/codec/binfmt/NormalizedNodeStreamReaderWriterTest.java index e724e6e8cc..faf038e422 100644 --- a/codec/yang-data-codec-binfmt/src/test/java/org/opendaylight/yangtools/yang/data/codec/binfmt/NormalizedNodeStreamReaderWriterTest.java +++ b/codec/yang-data-codec-binfmt/src/test/java/org/opendaylight/yangtools/yang/data/codec/binfmt/NormalizedNodeStreamReaderWriterTest.java @@ -55,7 +55,7 @@ public class NormalizedNodeStreamReaderWriterTest { @Parameters(name = "{0} {1}") public static Iterable data() { return Collections.singletonList( - new Object[] { NormalizedNodeStreamVersion.POTASSIUM, 1_049_589, 2_289_103, 139, 796, 103, 229, 99 }); + new Object[] { NormalizedNodeStreamVersion.POTASSIUM, 1_049_587, 2_289_103, 139, 794, 103, 229, 99 }); } @Parameter(0)