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

andy pushed a commit to branch main
in repository https://gitbox.apache.org/repos/asf/jena.git


The following commit(s) were added to refs/heads/main by this push:
     new 66fefd47bf GH-2908: Adjust for T24:00:00 in xsd:dateTime
66fefd47bf is described below

commit 66fefd47bff38d96ab17ed8a080a0c076ed7278c
Author: Andy Seaborne <[email protected]>
AuthorDate: Sat Dec 28 12:15:07 2024 +0000

    GH-2908: Adjust for T24:00:00 in xsd:dateTime
---
 .../jena/sparql/expr/nodevalue/NodeFunctions.java     |  6 +++++-
 .../apache/jena/sparql/expr/nodevalue/XSDFuncOp.java  | 19 ++++++++++++++++++-
 .../org/apache/jena/sparql/expr/TestExpressions.java  | 12 ++++++++++++
 3 files changed, 35 insertions(+), 2 deletions(-)

diff --git 
a/jena-arq/src/main/java/org/apache/jena/sparql/expr/nodevalue/NodeFunctions.java
 
b/jena-arq/src/main/java/org/apache/jena/sparql/expr/nodevalue/NodeFunctions.java
index 829aeb314e..4f015eb903 100644
--- 
a/jena-arq/src/main/java/org/apache/jena/sparql/expr/nodevalue/NodeFunctions.java
+++ 
b/jena-arq/src/main/java/org/apache/jena/sparql/expr/nodevalue/NodeFunctions.java
@@ -503,10 +503,14 @@ public class NodeFunctions {
         return NodeValue.makeLangString(lex, lang) ;
     }
 
+
+    /** Canonocal duration of 0 -- "P0S" */
+    private static Duration zeroDuration = 
NodeValue.xmlDatatypeFactory.newDuration(true, null, null, null, null, null, 
BigDecimal.ZERO) ;
+
     /** A duration, tided */
     public static Duration duration(int seconds) {
         if ( seconds == 0 )
-            return XSDFuncOp.zeroDuration;
+            return zeroDuration;
         Duration dur = NodeValue.xmlDatatypeFactory.newDuration(1000L*seconds);
         // Neaten the duration. Not all the fields are zero.
         dur = NodeValue.xmlDatatypeFactory.newDuration(dur.getSign()>=0,
diff --git 
a/jena-arq/src/main/java/org/apache/jena/sparql/expr/nodevalue/XSDFuncOp.java 
b/jena-arq/src/main/java/org/apache/jena/sparql/expr/nodevalue/XSDFuncOp.java
index 0082091bb5..66c1f24c8f 100644
--- 
a/jena-arq/src/main/java/org/apache/jena/sparql/expr/nodevalue/XSDFuncOp.java
+++ 
b/jena-arq/src/main/java/org/apache/jena/sparql/expr/nodevalue/XSDFuncOp.java
@@ -1142,6 +1142,13 @@ public class XSDFuncOp
                 dt.setHour(0);
             return dt;
         }
+        if ( nv.isDateTime() ) {
+            if ( dt.getHour() == 24 ) {
+                dt.setHour(0);
+                dt.add(duration1day);
+            }
+            return dt;
+        }
         return dt;
     }
 
@@ -1169,6 +1176,14 @@ public class XSDFuncOp
             if ( dt.getHour() == 24 )
                 // Normalize "24:00:00"
                 dt.setHour(0);
+            return dt;
+        }
+        if ( nv.isDateTime() ) {
+            if ( dt.getHour() == 24 ) {
+                dt.setHour(0);
+                dt.add(duration1day);
+            }
+            return dt;
         }
         return dt;
     }
@@ -1611,7 +1626,9 @@ public class XSDFuncOp
         return NodeValue.makeInteger((BigInteger)x) ;
     }
 
-    public static Duration zeroDuration = 
NodeValue.xmlDatatypeFactory.newDuration(true, null, null, null, null, null, 
BigDecimal.ZERO) ;
+    private static Duration duration1day = 
NodeValue.xmlDatatypeFactory.newDuration(true,
+                                                                               
     BigInteger.ZERO, BigInteger.ZERO, BigInteger.ONE,
+                                                                               
     BigInteger.ZERO, BigInteger.ZERO, BigDecimal.ZERO) ;
 
     public static int compareDuration(NodeValue nv1, NodeValue nv2) {
         return compareDuration(nv1.getDuration(), nv2.getDuration()) ;
diff --git 
a/jena-arq/src/test/java/org/apache/jena/sparql/expr/TestExpressions.java 
b/jena-arq/src/test/java/org/apache/jena/sparql/expr/TestExpressions.java
index 245307a982..e1556da5d8 100644
--- a/jena-arq/src/test/java/org/apache/jena/sparql/expr/TestExpressions.java
+++ b/jena-arq/src/test/java/org/apache/jena/sparql/expr/TestExpressions.java
@@ -205,6 +205,17 @@ public class TestExpressions
     @Test(expected=ExprEvalException.class)
     public void boolean_74()       { testBoolean("isNumeric(?x)", true) ; }
 
+    // 24:00:00
+    // Equal
+    static String dateTime1999_24 = 
"'1999-12-31T24:00:00Z'^^<"+XSDDatatype.XSDdateTime.getURI()+">" ;
+    static String dateTime2000_00 = 
"'2000-01-01T00:00:00Z'^^<"+XSDDatatype.XSDdateTime.getURI()+">" ;
+
+    static String time_24 = "'24:00:00'^^<"+XSDDatatype.XSDtime.getURI()+">" ;
+    static String time_00 = "'00:00:00'^^<"+XSDDatatype.XSDtime.getURI()+">" ;
+
+    @Test public void dateTime24_01() { testBoolean(dateTime1999_24+" = 
"+dateTime2000_00 , true) ; }
+    @Test public void time24_01()     { testBoolean(time_24+" = "+time_00 , 
true) ; }
+
     static String duration1 =  
"'P1Y1M1DT1H1M1S"+"'^^<"+XSDDatatype.XSDduration.getURI()+">";
     static String duration2 =  
"'P2Y1M1DT1H1M1S"+"'^^<"+XSDDatatype.XSDduration.getURI()+">";
     static String duration3 =  
"'P1Y1M1DT1H1M1S"+"'^^<"+XSDDatatype.XSDduration.getURI()+">";
@@ -418,6 +429,7 @@ public class TestExpressions
     static String dateTime3 = 
"'2005-01-01T12:03:34Z'^^<"+XSDDatatype.XSDdateTime.getURI()+">" ;
     // Later
     static String dateTime4 = 
"'2005-02-25T13:00:00Z'^^<"+XSDDatatype.XSDdateTime.getURI()+">" ;
+
     static String time1 = "'12:03:34Z'^^<" + XSDDatatype.XSDtime.getURI() + 
">";
     static String time2 = "'12:03:34Z'^^<" + XSDDatatype.XSDtime.getURI() + 
">";
     static String time3 = "'13:00:00Z'^^<" + XSDDatatype.XSDtime.getURI() + 
">";

Reply via email to