This is an automated email from the ASF dual-hosted git repository.

mibo pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/olingo-odata4.git


The following commit(s) were added to refs/heads/master by this push:
     new 6a800beee [OLINGO-1568] Add handling of special case precision/scale
6a800beee is described below

commit 6a800beee37f10aa5c21087a2c213bd9a6996e10
Author: mibo <[email protected]>
AuthorDate: Sun Sep 24 07:14:21 2023 +0200

    [OLINGO-1568] Add handling of special case precision/scale
---
 .../core/domain/ClientPrimitiveValueImpl.java      |  6 ++++-
 .../client/core/serialization/JsonSerializer.java  | 12 ++++++----
 .../olingo/client/core/PrimitiveValueTest.java     | 13 ++++++++++
 .../core/serialization/JsonSerializerTest.java     | 28 ++++++++++++++++++++++
 4 files changed, 54 insertions(+), 5 deletions(-)

diff --git 
a/lib/client-core/src/main/java/org/apache/olingo/client/core/domain/ClientPrimitiveValueImpl.java
 
b/lib/client-core/src/main/java/org/apache/olingo/client/core/domain/ClientPrimitiveValueImpl.java
index d42126863..04a6063d3 100644
--- 
a/lib/client-core/src/main/java/org/apache/olingo/client/core/domain/ClientPrimitiveValueImpl.java
+++ 
b/lib/client-core/src/main/java/org/apache/olingo/client/core/domain/ClientPrimitiveValueImpl.java
@@ -206,12 +206,16 @@ public class ClientPrimitiveValueImpl extends 
AbstractClientValue implements Cli
       return value.toString();
     } else {
       try {
-        // TODO: set facets
         Integer precision = Constants.DEFAULT_PRECISION;
         Integer scale = Constants.DEFAULT_SCALE;
         if (typeKind.equals(EdmPrimitiveTypeKind.Decimal) && value instanceof 
BigDecimal) {
             precision = ((BigDecimal) value).precision();
             scale = ((BigDecimal) value).scale();
+            if (precision == 0) {
+              precision = null;
+            } else if (scale > precision) {
+              precision = scale;
+            }
         }
         return type.valueToString(value, null, null, precision, scale, null);
       } catch (EdmPrimitiveTypeException e) {
diff --git 
a/lib/client-core/src/main/java/org/apache/olingo/client/core/serialization/JsonSerializer.java
 
b/lib/client-core/src/main/java/org/apache/olingo/client/core/serialization/JsonSerializer.java
index f13e87284..50f09c575 100644
--- 
a/lib/client-core/src/main/java/org/apache/olingo/client/core/serialization/JsonSerializer.java
+++ 
b/lib/client-core/src/main/java/org/apache/olingo/client/core/serialization/JsonSerializer.java
@@ -296,16 +296,20 @@ public class JsonSerializer implements ODataSerializer {
         jgen.writeString(value.toString()); // This might not be valid OData.
       }
     } else {
-      // TODO: add facets
-      Integer precesion = Constants.DEFAULT_PRECISION;
+      Integer precision = Constants.DEFAULT_PRECISION;
       Integer scale = Constants.DEFAULT_SCALE;
       if(kind == EdmPrimitiveTypeKind.Decimal && value instanceof BigDecimal){
           BigDecimal bigDecimal = (BigDecimal)value;
-          precesion = bigDecimal.precision();
+          precision = bigDecimal.precision();
           scale = bigDecimal.scale();
+          if (precision == 0) {
+            precision = null;
+          } else if (scale > precision) {
+            precision = scale;
+          }
       }
       final String serialized = EdmPrimitiveTypeFactory.getInstance(kind)
-          .valueToString(value, null, null, precesion, scale, null);
+          .valueToString(value, null, null, precision, scale, null);
 
       if (isIEEE754Compatible && (kind == EdmPrimitiveTypeKind.Int64 || kind 
== EdmPrimitiveTypeKind.Decimal)
           || !NUMBER_TYPES.contains(kind)) {
diff --git 
a/lib/client-core/src/test/java/org/apache/olingo/client/core/PrimitiveValueTest.java
 
b/lib/client-core/src/test/java/org/apache/olingo/client/core/PrimitiveValueTest.java
index 3c31b551a..bcd4ae5fd 100644
--- 
a/lib/client-core/src/test/java/org/apache/olingo/client/core/PrimitiveValueTest.java
+++ 
b/lib/client-core/src/test/java/org/apache/olingo/client/core/PrimitiveValueTest.java
@@ -20,6 +20,7 @@ package org.apache.olingo.client.core;
 
 import static org.junit.Assert.assertEquals;
 
+import java.math.BigDecimal;
 import java.util.Calendar;
 
 import org.apache.olingo.client.api.domain.ClientValue;
@@ -64,4 +65,16 @@ public class PrimitiveValueTest extends AbstractTest {
 
     assertEquals("2013-01-10", value.asPrimitive().toString());
   }
+
+  @Test
+  public void testBigDecimalToStringConversion() throws 
EdmPrimitiveTypeException {
+    final ClientValue leadingZerosDecimalValue = 
client.getObjectFactory().newPrimitiveValueBuilder()
+            .setType(EdmPrimitiveTypeKind.Decimal).setValue(new 
BigDecimal("0.01")).build();
+    final ClientValue arbitraryPrecisionDecimalValue = 
client.getObjectFactory().newPrimitiveValueBuilder()
+            .setType(EdmPrimitiveTypeKind.Decimal).setValue(new 
BigDecimal(0.01)).build();
+
+    assertEquals("0.01", leadingZerosDecimalValue.asPrimitive().toString());
+    
assertEquals("0.01000000000000000020816681711721685132943093776702880859375",
+        arbitraryPrecisionDecimalValue.asPrimitive().toString());
+  }
 }
diff --git 
a/lib/client-core/src/test/java/org/apache/olingo/client/core/serialization/JsonSerializerTest.java
 
b/lib/client-core/src/test/java/org/apache/olingo/client/core/serialization/JsonSerializerTest.java
index 99f026d4b..057c1d85f 100644
--- 
a/lib/client-core/src/test/java/org/apache/olingo/client/core/serialization/JsonSerializerTest.java
+++ 
b/lib/client-core/src/test/java/org/apache/olingo/client/core/serialization/JsonSerializerTest.java
@@ -19,6 +19,7 @@ import static org.hamcrest.CoreMatchers.is;
 import static org.junit.Assert.assertThat;
 
 import java.io.StringWriter;
+import java.math.BigDecimal;
 
 import org.apache.olingo.client.api.ODataClient;
 import org.apache.olingo.client.api.domain.ClientEntity;
@@ -66,6 +67,33 @@ public class JsonSerializerTest {
 
     JsonSerializer jsonSerializer = new JsonSerializer(false, 
ContentType.JSON_FULL_METADATA);
 
+    StringWriter writer = new StringWriter();
+    jsonSerializer.write(writer, 
odataClient.getBinder().getEntity(clientEntity));
+    assertThat(writer.toString(), is(expectedJson));
+  }
+  @Test
+  public void testClientEntityJSONWithBigDecimal() throws 
ODataSerializerException {
+    String expectedJson = "{\"@odata.type\":\"#test.testClientEntity\","
+            + "\"[email protected]\":\"Decimal\","
+            + "\"testLeadingZerosDecimal\":0.01,"
+            + "\"[email protected]\":\"Decimal\","
+            + 
"\"testArbitraryPrecisionDecimal\":0.01000000000000000020816681711721685132943093776702880859375}";
+
+    ODataClient odataClient = ODataClientFactory.getClient();
+    ClientObjectFactory objFactory = odataClient.getObjectFactory();
+    ClientEntity clientEntity = objFactory.newEntity(new 
FullQualifiedName("test", "testClientEntity"));
+
+    clientEntity.getProperties().add(
+            objFactory.newPrimitiveProperty(
+                    "testLeadingZerosDecimal",
+                    objFactory.newPrimitiveValueBuilder().buildDecimal(new 
BigDecimal("0.01"))));
+    clientEntity.getProperties().add(
+            objFactory.newPrimitiveProperty(
+                    "testArbitraryPrecisionDecimal",
+                    objFactory.newPrimitiveValueBuilder().buildDecimal(new 
BigDecimal(0.01))));
+
+    JsonSerializer jsonSerializer = new JsonSerializer(false, 
ContentType.JSON_FULL_METADATA);
+
     StringWriter writer = new StringWriter();
     jsonSerializer.write(writer, 
odataClient.getBinder().getEntity(clientEntity));
     assertThat(writer.toString(), is(expectedJson));

Reply via email to