mirror of
https://github.com/apache/olingo-odata4.git
synced 2025-02-07 18:49:39 +00:00
[OLINGO-1568] Add handling of special case precision/scale
This commit is contained in:
parent
5d1fae138a
commit
6a800beee3
@ -206,12 +206,16 @@ public class ClientPrimitiveValueImpl extends AbstractClientValue implements Cli
|
|||||||
return value.toString();
|
return value.toString();
|
||||||
} else {
|
} else {
|
||||||
try {
|
try {
|
||||||
// TODO: set facets
|
|
||||||
Integer precision = Constants.DEFAULT_PRECISION;
|
Integer precision = Constants.DEFAULT_PRECISION;
|
||||||
Integer scale = Constants.DEFAULT_SCALE;
|
Integer scale = Constants.DEFAULT_SCALE;
|
||||||
if (typeKind.equals(EdmPrimitiveTypeKind.Decimal) && value instanceof BigDecimal) {
|
if (typeKind.equals(EdmPrimitiveTypeKind.Decimal) && value instanceof BigDecimal) {
|
||||||
precision = ((BigDecimal) value).precision();
|
precision = ((BigDecimal) value).precision();
|
||||||
scale = ((BigDecimal) value).scale();
|
scale = ((BigDecimal) value).scale();
|
||||||
|
if (precision == 0) {
|
||||||
|
precision = null;
|
||||||
|
} else if (scale > precision) {
|
||||||
|
precision = scale;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
return type.valueToString(value, null, null, precision, scale, null);
|
return type.valueToString(value, null, null, precision, scale, null);
|
||||||
} catch (EdmPrimitiveTypeException e) {
|
} catch (EdmPrimitiveTypeException e) {
|
||||||
|
@ -296,16 +296,20 @@ public class JsonSerializer implements ODataSerializer {
|
|||||||
jgen.writeString(value.toString()); // This might not be valid OData.
|
jgen.writeString(value.toString()); // This might not be valid OData.
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
// TODO: add facets
|
Integer precision = Constants.DEFAULT_PRECISION;
|
||||||
Integer precesion = Constants.DEFAULT_PRECISION;
|
|
||||||
Integer scale = Constants.DEFAULT_SCALE;
|
Integer scale = Constants.DEFAULT_SCALE;
|
||||||
if(kind == EdmPrimitiveTypeKind.Decimal && value instanceof BigDecimal){
|
if(kind == EdmPrimitiveTypeKind.Decimal && value instanceof BigDecimal){
|
||||||
BigDecimal bigDecimal = (BigDecimal)value;
|
BigDecimal bigDecimal = (BigDecimal)value;
|
||||||
precesion = bigDecimal.precision();
|
precision = bigDecimal.precision();
|
||||||
scale = bigDecimal.scale();
|
scale = bigDecimal.scale();
|
||||||
|
if (precision == 0) {
|
||||||
|
precision = null;
|
||||||
|
} else if (scale > precision) {
|
||||||
|
precision = scale;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
final String serialized = EdmPrimitiveTypeFactory.getInstance(kind)
|
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)
|
if (isIEEE754Compatible && (kind == EdmPrimitiveTypeKind.Int64 || kind == EdmPrimitiveTypeKind.Decimal)
|
||||||
|| !NUMBER_TYPES.contains(kind)) {
|
|| !NUMBER_TYPES.contains(kind)) {
|
||||||
|
@ -20,6 +20,7 @@ package org.apache.olingo.client.core;
|
|||||||
|
|
||||||
import static org.junit.Assert.assertEquals;
|
import static org.junit.Assert.assertEquals;
|
||||||
|
|
||||||
|
import java.math.BigDecimal;
|
||||||
import java.util.Calendar;
|
import java.util.Calendar;
|
||||||
|
|
||||||
import org.apache.olingo.client.api.domain.ClientValue;
|
import org.apache.olingo.client.api.domain.ClientValue;
|
||||||
@ -64,4 +65,16 @@ public class PrimitiveValueTest extends AbstractTest {
|
|||||||
|
|
||||||
assertEquals("2013-01-10", value.asPrimitive().toString());
|
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());
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
@ -19,6 +19,7 @@ import static org.hamcrest.CoreMatchers.is;
|
|||||||
import static org.junit.Assert.assertThat;
|
import static org.junit.Assert.assertThat;
|
||||||
|
|
||||||
import java.io.StringWriter;
|
import java.io.StringWriter;
|
||||||
|
import java.math.BigDecimal;
|
||||||
|
|
||||||
import org.apache.olingo.client.api.ODataClient;
|
import org.apache.olingo.client.api.ODataClient;
|
||||||
import org.apache.olingo.client.api.domain.ClientEntity;
|
import org.apache.olingo.client.api.domain.ClientEntity;
|
||||||
@ -66,6 +67,33 @@ public class JsonSerializerTest {
|
|||||||
|
|
||||||
JsonSerializer jsonSerializer = new JsonSerializer(false, ContentType.JSON_FULL_METADATA);
|
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\","
|
||||||
|
+ "\"testLeadingZerosDecimal@odata.type\":\"Decimal\","
|
||||||
|
+ "\"testLeadingZerosDecimal\":0.01,"
|
||||||
|
+ "\"testArbitraryPrecisionDecimal@odata.type\":\"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();
|
StringWriter writer = new StringWriter();
|
||||||
jsonSerializer.write(writer, odataClient.getBinder().getEntity(clientEntity));
|
jsonSerializer.write(writer, odataClient.getBinder().getEntity(clientEntity));
|
||||||
assertThat(writer.toString(), is(expectedJson));
|
assertThat(writer.toString(), is(expectedJson));
|
||||||
|
Loading…
x
Reference in New Issue
Block a user