From 1f708637b628c8cdaf40f0ec61e464de21ab138e Mon Sep 17 00:00:00 2001 From: Antonin Delpeuch Date: Fri, 13 Dec 2019 15:23:24 +0100 Subject: [PATCH] Fix overflow error for quantities stored as doubles. Closes #2244. --- .../wikidata/schema/WbQuantityExpr.java | 4 ++-- .../wikidata/schema/WbStringVariable.java | 2 +- .../wikidata/schema/WbQuantityExprTest.java | 6 ++++++ .../wikidata/schema/WbStringVariableTest.java | 16 ++++++++++++++++ 4 files changed, 25 insertions(+), 3 deletions(-) diff --git a/extensions/wikidata/src/org/openrefine/wikidata/schema/WbQuantityExpr.java b/extensions/wikidata/src/org/openrefine/wikidata/schema/WbQuantityExpr.java index 7223a1ffd..373818535 100644 --- a/extensions/wikidata/src/org/openrefine/wikidata/schema/WbQuantityExpr.java +++ b/extensions/wikidata/src/org/openrefine/wikidata/schema/WbQuantityExpr.java @@ -61,7 +61,7 @@ public class WbQuantityExpr implements WbExpression { @Override public QuantityValue evaluate(ExpressionContext ctxt) throws SkipSchemaExpressionException { - StringValue amount = getLanguageExpr().evaluate(ctxt); + StringValue amount = getAmountExpr().evaluate(ctxt); // we know the amount is nonnull, nonempty here BigDecimal parsedAmount = null; @@ -99,7 +99,7 @@ public class WbQuantityExpr implements WbExpression { } @JsonProperty("amount") - public WbExpression getLanguageExpr() { + public WbExpression getAmountExpr() { return amountExpr; } diff --git a/extensions/wikidata/src/org/openrefine/wikidata/schema/WbStringVariable.java b/extensions/wikidata/src/org/openrefine/wikidata/schema/WbStringVariable.java index 622b1ffad..d1019d868 100644 --- a/extensions/wikidata/src/org/openrefine/wikidata/schema/WbStringVariable.java +++ b/extensions/wikidata/src/org/openrefine/wikidata/schema/WbStringVariable.java @@ -59,7 +59,7 @@ public class WbStringVariable extends WbVariableExpr { if (!cell.value.toString().isEmpty()) { String stringValue = cell.value.toString(); if (cell.value instanceof Double && ((Double)cell.value) % 1 == 0) { - stringValue = Integer.toString(((Double)cell.value).intValue()); + stringValue = Long.toString(((Double)cell.value).longValue()); } return Datamodel.makeStringValue(stringValue.trim()); } diff --git a/extensions/wikidata/tests/src/org/openrefine/wikidata/schema/WbQuantityExprTest.java b/extensions/wikidata/tests/src/org/openrefine/wikidata/schema/WbQuantityExprTest.java index ae7ca5d37..b5dcf2bbd 100644 --- a/extensions/wikidata/tests/src/org/openrefine/wikidata/schema/WbQuantityExprTest.java +++ b/extensions/wikidata/tests/src/org/openrefine/wikidata/schema/WbQuantityExprTest.java @@ -46,6 +46,12 @@ public class WbQuantityExprTest extends WbExpressionTest { setRow("4.00"); evaluatesTo(Datamodel.makeQuantityValue(new BigDecimal("4.00"), null, null, "1"), exprWithoutUnit); } + + @Test + public void testOverflow() { + setRow(14341937500d); + evaluatesTo(Datamodel.makeQuantityValue(new BigDecimal("14341937500"), null, null, "1"), exprWithoutUnit); + } @Test public void testInvalidAmountWithoutUnit() { diff --git a/extensions/wikidata/tests/src/org/openrefine/wikidata/schema/WbStringVariableTest.java b/extensions/wikidata/tests/src/org/openrefine/wikidata/schema/WbStringVariableTest.java index 334ce09f5..975fb5b4a 100644 --- a/extensions/wikidata/tests/src/org/openrefine/wikidata/schema/WbStringVariableTest.java +++ b/extensions/wikidata/tests/src/org/openrefine/wikidata/schema/WbStringVariableTest.java @@ -69,6 +69,22 @@ public class WbStringVariableTest extends WbVariableTest { public void testDoubleInteger() { evaluatesTo(Datamodel.makeStringValue("45"), new Cell(45.0,null)); } + + /** + * Test that large doubles are correctly converted to strings + */ + @Test + public void testLargeDouble() { + evaluatesTo(Datamodel.makeStringValue("14341937500"), new Cell(14341937500d, null)); + } + + /** + * Test that large doubles are correctly converted to strings + */ + @Test + public void testLong() { + evaluatesTo(Datamodel.makeStringValue("14341937500"), new Cell(14341937500L, null)); + } @Test