Skip to content

Commit aa4dfbb

Browse files
committed
GH-3404: Restore lexical forms of TDB2 NodeId-decimals as plain strings.
1 parent 53c6f4d commit aa4dfbb

File tree

3 files changed

+64
-0
lines changed

3 files changed

+64
-0
lines changed

jena-arq/src/main/java/org/apache/jena/sparql/util/XSDNumUtils.java

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -147,6 +147,18 @@ public static String canonicalDecimalStrNoIntegerDot(BigDecimal bd) {
147147
return bd.stripTrailingZeros().toPlainString();
148148
}
149149

150+
/** Return a canonical decimal with a trailing ".0". */
151+
public static BigDecimal canonicalDecimalWithDot(BigDecimal decimal) {
152+
BigDecimal result = decimal;
153+
if (result.scale() > 1) {
154+
result = decimal.stripTrailingZeros();
155+
}
156+
if (result.scale() <= 0) {
157+
result = result.setScale(1);
158+
}
159+
return result;
160+
}
161+
150162
/**
151163
* Integer-valued decimals have a trailing ".0".
152164
* (In XML Schema Datatype 1.1 they did not have a ".0".)

jena-tdb2/src/main/java/org/apache/jena/tdb2/store/NodeIdInline.java

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -163,6 +163,7 @@ public static boolean hasInlineDatatype(Node node) {
163163
// But at this point we know it's a valid literal so the excessive
164164
// chopping by .trim is safe.
165165
BigDecimal decimal = new BigDecimal(lit.getLexicalForm().trim());
166+
decimal = XSDNumUtils.canonicalDecimalWithDot(decimal);
166167

167168
// Does range checking.
168169
DecimalNode56 dn = DecimalNode56.valueOf(decimal);

jena-tdb2/src/test/java/org/apache/jena/tdb2/store/value/TestNodeIdInline.java

Lines changed: 51 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -120,6 +120,39 @@ public class TestNodeIdInline
120120
@Test public void nodeId_decimal_8()
121121
{ test("0.00000001", NodeFactory.createLiteralDT("0.00000001", XSDDatatype.XSDdecimal)); }
122122

123+
@Test public void nodeId_decimal_10()
124+
{ testNodeIdRoundtripDecimal("0"); }
125+
126+
@Test public void nodeId_decimal_11()
127+
{ testNodeIdRoundtripDecimal("-0"); }
128+
129+
@Test public void nodeId_decimal_12()
130+
{ testNodeIdRoundtripDecimal("0.0"); }
131+
132+
@Test public void nodeId_decimal_13()
133+
{ testNodeIdRoundtripDecimal("-0.0"); }
134+
135+
@Test public void nodeId_decimal_14()
136+
{ testNodeIdRoundtripDecimal(".0"); }
137+
138+
@Test public void nodeId_decimal_15()
139+
{ testNodeIdRoundtripDecimal("-.0"); }
140+
141+
@Test public void nodeId_decimal_16()
142+
{ testNodeIdRoundtripDecimal("18"); }
143+
144+
@Test public void nodeId_decimal_17()
145+
{ testNodeIdRoundtripDecimal("18."); }
146+
147+
@Test public void nodeId_decimal_18()
148+
{ testNodeIdRoundtripDecimal("18.0"); }
149+
150+
@Test public void nodeId_decimal_19()
151+
{ testNodeIdRoundtripDecimal("18.00"); }
152+
153+
@Test public void nodeId_decimal_20()
154+
{ testNodeIdRoundtripDecimal("18.000"); }
155+
123156
@Test public void nodeId_dateTime_01()
124157
{ test("'2008-04-28T15:36:15+01:00'^^xsd:dateTime"); }
125158

@@ -306,4 +339,22 @@ private void test(String x, Node correct) {
306339
// Term equality.
307340
assertEquals(correct, n2, ()->"Not same term");
308341
}
342+
343+
private static void testNodeIdRoundtripDecimal(String decimalStr) {
344+
Node node = NodeFactory.createLiteralDT(decimalStr, XSDDatatype.XSDdecimal);
345+
testNodeIdRoundtrip(node);
346+
}
347+
348+
/** For a Node n assert: nodeId(n) == nodeId(extract(nodeId(n)) */
349+
private static void testNodeIdRoundtrip(Node node) {
350+
NodeId nodeId = NodeId.inline(node);
351+
testNodeIdRoundtrip(nodeId);
352+
}
353+
354+
/** For a NodeId n assert: n == nodeId(extract(n)) */
355+
private static void testNodeIdRoundtrip(NodeId expected) {
356+
Node extractedNode = NodeId.extract(expected);
357+
NodeId actual = NodeId.inline(extractedNode);
358+
assertEquals(expected, actual);
359+
}
309360
}

0 commit comments

Comments
 (0)