Skip to content

Commit caa44c1

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

File tree

3 files changed

+49
-0
lines changed

3 files changed

+49
-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: 36 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -120,6 +120,29 @@ 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_9()
124+
{ test("'18'^^xsd:decimal",
125+
NodeFactory.createLiteralDT("18.0", XSDDatatype.XSDdecimal));
126+
}
127+
128+
@Test public void nodeId_decimal_10()
129+
{ test("'18.'^^xsd:decimal", NodeFactory.createLiteralDT("18.0", XSDDatatype.XSDdecimal)); }
130+
131+
@Test public void nodeId_decimal_11()
132+
{ test("18.0", NodeFactory.createLiteralDT("18.0", XSDDatatype.XSDdecimal)); }
133+
134+
@Test public void nodeId_decimal_20()
135+
{ testNodeIdRoundtrip(NodeValue.makeDecimal("18").asNode()); }
136+
137+
@Test public void nodeId_decimal_21()
138+
{ testNodeIdRoundtrip(NodeValue.makeDecimal("18.0").asNode()); }
139+
140+
@Test public void nodeId_decimal_22()
141+
{ testNodeIdRoundtrip(NodeValue.makeDecimal("18.00").asNode()); }
142+
143+
@Test public void nodeId_decimal_23()
144+
{ testNodeIdRoundtrip(NodeValue.makeDecimal("18.000").asNode()); }
145+
123146
@Test public void nodeId_dateTime_01()
124147
{ test("'2008-04-28T15:36:15+01:00'^^xsd:dateTime"); }
125148

@@ -306,4 +329,17 @@ private void test(String x, Node correct) {
306329
// Term equality.
307330
assertEquals(correct, n2, ()->"Not same term");
308331
}
332+
333+
/** For a Node n assert: nodeId(n) == nodeId(extract(nodeId(n)) */
334+
private static void testNodeIdRoundtrip(Node node) {
335+
NodeId nodeId = NodeId.inline(node);
336+
testNodeIdRoundtrip(nodeId);
337+
}
338+
339+
/** For a NodeId n assert: n == nodeId(extract(n)) */
340+
private static void testNodeIdRoundtrip(NodeId expected) {
341+
Node extractedNode = NodeId.extract(expected);
342+
NodeId actual = NodeId.inline(extractedNode);
343+
assertEquals(expected, actual);
344+
}
309345
}

0 commit comments

Comments
 (0)