You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@jena.apache.org by an...@apache.org on 2012/05/07 15:51:14 UTC

svn commit: r1335023 - in /incubator/jena/Scratch/AFS/Dev/trunk: .classpath src/main/java/projects/nodevalue/NV2.java src/main/java/projects/nodevalue/TestDateTimeOps.java src/main/java/projects/nodevalue/TestNodeValueOps.java

Author: andy
Date: Mon May  7 13:51:13 2012
New Revision: 1335023

URL: http://svn.apache.org/viewvc?rev=1335023&view=rev
Log: (empty)

Added:
    incubator/jena/Scratch/AFS/Dev/trunk/src/main/java/projects/nodevalue/TestNodeValueOps.java
      - copied, changed from r1334490, incubator/jena/Scratch/AFS/Dev/trunk/src/main/java/projects/nodevalue/TestDateTimeOps.java
Removed:
    incubator/jena/Scratch/AFS/Dev/trunk/src/main/java/projects/nodevalue/TestDateTimeOps.java
Modified:
    incubator/jena/Scratch/AFS/Dev/trunk/.classpath
    incubator/jena/Scratch/AFS/Dev/trunk/src/main/java/projects/nodevalue/NV2.java

Modified: incubator/jena/Scratch/AFS/Dev/trunk/.classpath
URL: http://svn.apache.org/viewvc/incubator/jena/Scratch/AFS/Dev/trunk/.classpath?rev=1335023&r1=1335022&r2=1335023&view=diff
==============================================================================
--- incubator/jena/Scratch/AFS/Dev/trunk/.classpath (original)
+++ incubator/jena/Scratch/AFS/Dev/trunk/.classpath Mon May  7 13:51:13 2012
@@ -19,8 +19,6 @@
 	<classpathentry kind="var" path="M2_REPO/org/slf4j/slf4j-api/1.6.4/slf4j-api-1.6.4.jar" sourcepath="M2_REPO/org/slf4j/slf4j-api/1.6.4/slf4j-api-1.6.4-sources.jar"/>
 	<classpathentry kind="var" path="M2_REPO/org/slf4j/slf4j-log4j12/1.6.4/slf4j-log4j12-1.6.4.jar" sourcepath="M2_REPO/org/slf4j/slf4j-log4j12/1.6.4/slf4j-log4j12-1.6.4-sources.jar"/>
 	<classpathentry kind="var" path="M2_REPO/org/slf4j/jcl-over-slf4j/1.6.4/jcl-over-slf4j-1.6.4.jar" sourcepath="M2_REPO/org/slf4j/jcl-over-slf4j/1.6.4/jcl-over-slf4j-1.6.4-sources.jar"/>
-	<classpathentry kind="var" path="M2_REPO/xerces/xercesImpl/2.10.0/xercesImpl-2.10.0.jar"/>
-	<classpathentry kind="var" path="M2_REPO/xml-apis/xml-apis/1.4.01/xml-apis-1.4.01.jar"/>
 	<classpathentry combineaccessrules="false" kind="src" path="/ARQ"/>
 	<classpathentry combineaccessrules="false" kind="src" path="/TDB"/>
 	<classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER/org.eclipse.jdt.internal.debug.ui.launcher.StandardVMType/JavaSE-1.7"/>

Modified: incubator/jena/Scratch/AFS/Dev/trunk/src/main/java/projects/nodevalue/NV2.java
URL: http://svn.apache.org/viewvc/incubator/jena/Scratch/AFS/Dev/trunk/src/main/java/projects/nodevalue/NV2.java?rev=1335023&r1=1335022&r2=1335023&view=diff
==============================================================================
--- incubator/jena/Scratch/AFS/Dev/trunk/src/main/java/projects/nodevalue/NV2.java (original)
+++ incubator/jena/Scratch/AFS/Dev/trunk/src/main/java/projects/nodevalue/NV2.java Mon May  7 13:51:13 2012
@@ -18,16 +18,11 @@
 
 package projects.nodevalue;
 
-import static com.hp.hpl.jena.sparql.expr.ValueSpaceClassification.VSPACE_DURATION ;
+import static com.hp.hpl.jena.datatypes.xsd.XSDDatatype.XSD ;
+import static com.hp.hpl.jena.sparql.expr.ValueSpaceClassification.* ;
 import static com.hp.hpl.jena.sparql.expr.ValueSpaceClassification.VSPACE_NUM ;
 import static com.hp.hpl.jena.sparql.expr.ValueSpaceClassification.VSPACE_STRING ;
-import static javax.xml.datatype.DatatypeConstants.DAYS ;
 import static javax.xml.datatype.DatatypeConstants.FIELD_UNDEFINED ;
-import static javax.xml.datatype.DatatypeConstants.HOURS ;
-import static javax.xml.datatype.DatatypeConstants.MINUTES ;
-import static javax.xml.datatype.DatatypeConstants.MONTHS ;
-import static javax.xml.datatype.DatatypeConstants.SECONDS ;
-import static javax.xml.datatype.DatatypeConstants.YEARS ;
 
 import java.util.GregorianCalendar ;
 
@@ -36,12 +31,15 @@ import javax.xml.datatype.DatatypeFactor
 import javax.xml.datatype.Duration ;
 import javax.xml.datatype.XMLGregorianCalendar ;
 
+import com.hp.hpl.jena.datatypes.xsd.XSDDatatype ;
+import com.hp.hpl.jena.graph.Node ;
 import com.hp.hpl.jena.query.ARQ ;
 import com.hp.hpl.jena.sparql.ARQInternalErrorException ;
 import com.hp.hpl.jena.sparql.expr.ExprEvalTypeException ;
 import com.hp.hpl.jena.sparql.expr.NodeValue ;
 import com.hp.hpl.jena.sparql.expr.ValueSpaceClassification ;
 import com.hp.hpl.jena.sparql.expr.nodevalue.XSDFuncOp ;
+import com.hp.hpl.jena.sparql.util.NodeFactory ;
 
 public class NV2
 {
@@ -90,8 +88,16 @@ public class NV2
 
 (xsd:time, xsd:duration) -> xsd:time
         10.8.12 op:add-dayTimeDuration-to-time
-        10.8.13 op:subtract-dayTimeDuration-from-time      */
+        10.8.13 op:subtract-dayTimeDuration-from-time      
+        */
     
+        /* Missing:
+(xsd:duration, xsd:double) -> xsd:duration
+        10.6.8 op:multiply-dayTimeDuration
+        10.6.9 op:divide-dayTimeDuration
+(xsd:duration, xsd:duration) -> xsd:decimal
+        10.6.10 op:divide-dayTimeDuration-by-dayTimeDuration 
+         */
     /*
 fn:dateTime($arg1 as xs:date?, $arg2 as xs:time?) as xs:dateTime?
 
@@ -101,9 +107,10 @@ Properties of Date/time Seven-property M
 http://www.w3.org/TR/xmlschema11-2/#dt-dt-7PropMod
      */
     
-    private static DatatypeFactory datatypefactory = null ;
+    private static DatatypeFactory datatypefactory ;
     static
     {
+        //System.setProperty("javax.xml.datatype.DatatypeFactory", "com.sun.org.apache.xerces.internal.jaxp.datatype.DatatypeFactoryImpl") ;
         try { datatypefactory = DatatypeFactory.newInstance() ; }
         catch (DatatypeConfigurationException ex)
         { throw new ARQInternalErrorException("Can't create a javax.xml DatatypeFactory") ; }
@@ -111,6 +118,10 @@ http://www.w3.org/TR/xmlschema11-2/#dt-d
     
     public static void main(String... argv)
     {
+        
+        Node n = NodeFactory.parseNode("'PT1H'^^xsd:dayTimeDuration") ;
+        NodeValue nv = NodeValue.makeNode(n) ;
+        
 //        execAdd("'2012-05-05T12:45:56.8'^^xsd:dateTime", "'P11DT0.788S'^^xsd:duration") ;
 //        execAdd("123", "45") ;
 //        execSub("'2012-05-05T12:45:56.8'^^xsd:dateTime", "'P11DT0.788S'^^xsd:duration") ;
@@ -153,7 +164,10 @@ http://www.w3.org/TR/xmlschema11-2/#dt-d
         }
     }
     
-    // NodeFunctions
+    private static final String dtXSDdateTimeStamp      = XSD+"#dateTimeStamp" ; 
+    private static final String dtXSDdayTimeDuration    = XSD+"#dayTimeDuration" ; 
+    private static final String dtXSDyearMonthDuration  = XSD+"#yearMonthDuration" ; 
+    
     public static NodeValue addNV(NodeValue nv1, NodeValue nv2)
     {
         ValueSpaceClassification vs1 = nv1.getValueSpace() ;
@@ -168,29 +182,54 @@ http://www.w3.org/TR/xmlschema11-2/#dt-d
             return NodeValue.makeString(nv1.asString()+nv2.asString()) ;
         if ( vs1.equals(VSPACE_DURATION) && vs2.equals(VSPACE_DURATION) )
         {
+            // A lot of testing to keep it as derived types.
+            boolean isDTDur = dtXSDdayTimeDuration.equals(nv1.getDatatypeURI()) && 
+                              dtXSDdayTimeDuration.equals(nv2.getDatatypeURI()) ;
+            boolean isYMDur = dtXSDyearMonthDuration.equals(nv1.getDatatypeURI()) && 
+                              dtXSDyearMonthDuration.equals(nv2.getDatatypeURI()) ;
             Duration d3 = nv1.getDuration().add(nv2.getDuration()) ;
-            return NodeValue.makeDuration(d3) ;
+            String lex = d3.toString() ;
+            Node n ;
+            if ( isDTDur )
+                n = NodeFactory.createLiteralNode(lex, null, dtXSDdayTimeDuration) ;
+            else if ( isYMDur )
+                n = NodeFactory.createLiteralNode(lex, null, dtXSDyearMonthDuration) ;
+            else
+                n = Node.createLiteral(lex, XSDDatatype.XSDduration) ;
+            return NodeValue.makeNodeDuration(d3, n) ;
         }
         
         // Loose style. Add any duration to any date or time value.
-        if ( isDT(vs1) && vs2.equals(VSPACE_DURATION) )
+        if ( vs1.equals(VSPACE_DATETIME) && vs2.equals(VSPACE_DURATION) )
         {
             XMLGregorianCalendar cal = nv1.getDateTime() ;
             XMLGregorianCalendar result = xsd_add(cal, nv2.getDuration()) ;
             NodeValue r = NodeValue.makeDateTime(result) ;
             return r ;
         }
-        
-        if ( isDT(vs2) && vs1.equals(VSPACE_DURATION) )
+        // Loose style. Add any duration to any date or time value.
+        if ( vs1.equals(VSPACE_DATE) && vs2.equals(VSPACE_DURATION) )
         {
-            XMLGregorianCalendar cal = nv2.getDateTime() ;
-            XMLGregorianCalendar result = xsd_add(cal, nv1.getDuration()) ;
-            NodeValue r = NodeValue.makeDateTime(result) ;
+            XMLGregorianCalendar cal = nv1.getDateTime() ;
+            XMLGregorianCalendar result = xsd_add(cal, nv2.getDuration()) ;
+            NodeValue r = NodeValue.makeDate(result) ;
             return r ;
         }
+        // Loose style. Add any duration to any date or time value.
+        if ( vs1.equals(VSPACE_TIME) && vs2.equals(VSPACE_DURATION) )
+        {
+            XMLGregorianCalendar cal = nv1.getDateTime() ;
+            XMLGregorianCalendar result = xsd_add(cal, nv2.getDuration()) ;
+            NodeValue r = NodeValue.makeNode(result.toXMLFormat(), XSDDatatype.XSDtime) ; 
+            return r ;
+        }
+        
+        if ( isDT(vs2) && vs1.equals(VSPACE_DURATION) )
+            // Carefully ...
+            return addNV(nv2, nv1) ;
         throw new ExprEvalTypeException("Operator '+' : Undefined addition: "+nv1+" and "+nv2) ; 
     }
-
+    
     // NodeFunctions
     public static NodeValue subNV(NodeValue nv1, NodeValue nv2)
     {
@@ -204,8 +243,21 @@ http://www.w3.org/TR/xmlschema11-2/#dt-d
         
         if ( vs1.equals(VSPACE_DURATION) && vs2.equals(VSPACE_DURATION) )
         {
+         // A lot of testing to keep it as derived types.
+            boolean isDTDur = dtXSDdayTimeDuration.equals(nv1.getDatatypeURI()) && 
+                              dtXSDdayTimeDuration.equals(nv2.getDatatypeURI()) ;
+            boolean isYMDur = dtXSDyearMonthDuration.equals(nv1.getDatatypeURI()) && 
+                              dtXSDyearMonthDuration.equals(nv2.getDatatypeURI()) ;
             Duration d3 = nv1.getDuration().subtract(nv2.getDuration()) ;
-            return NodeValue.makeDuration(d3) ;
+            String lex = d3.toString() ;
+            Node n ;
+            if ( isDTDur )
+                n = NodeFactory.createLiteralNode(lex, null, dtXSDdayTimeDuration) ;
+            else if ( isYMDur )
+                n = NodeFactory.createLiteralNode(lex, null, dtXSDyearMonthDuration) ;
+            else
+                n = Node.createLiteral(lex, XSDDatatype.XSDduration) ;
+            return NodeValue.makeNodeDuration(d3, n) ;
         }
         
         if ( isDT(vs1) && isDT(vs2) )
@@ -221,7 +273,7 @@ http://www.w3.org/TR/xmlschema11-2/#dt-d
         }
         
         // Loose style. Subtract any duration to any date or time value.
-        if ( isDT(vs1) && vs2.equals(VSPACE_DURATION) )
+        if ( vs1.equals(VSPACE_DATETIME) && vs2.equals(VSPACE_DURATION) )
         {
             XMLGregorianCalendar cal = nv1.getDateTime() ;
             // add-negation
@@ -229,6 +281,22 @@ http://www.w3.org/TR/xmlschema11-2/#dt-d
             NodeValue r = NodeValue.makeDateTime(result) ;
             return r ;
         }
+        if ( vs1.equals(VSPACE_DATE) && vs2.equals(VSPACE_DURATION) )
+        {
+            XMLGregorianCalendar cal = nv1.getDateTime() ;
+            // add-negation
+            XMLGregorianCalendar result = xsd_subtract(cal, nv2.getDuration()) ;
+            NodeValue r = NodeValue.makeDate(result) ;
+            return r ;
+        }
+        if ( vs1.equals(VSPACE_TIME) && vs2.equals(VSPACE_DURATION) )
+        {
+            XMLGregorianCalendar cal = nv1.getDateTime() ;
+            // add-negation
+            XMLGregorianCalendar result = xsd_subtract(cal, nv2.getDuration()) ;
+            NodeValue r = NodeValue.makeNode(result.toXMLFormat(), XSDDatatype.XSDtime) ; 
+            return r ;
+        }
         
         throw new ExprEvalTypeException("Operator '-' : Undefined subtraction: "+nv1+" and "+nv2) ; 
     }
@@ -279,20 +347,5 @@ http://www.w3.org/TR/xmlschema11-2/#dt-d
         }
     }
     
-    // NodeFunctions
-    public static boolean isYearMonth(Duration dur)
-    {
-        // Not dur.getXMLSchemaType()
-        return ( dur.isSet(YEARS) || dur.isSet(MONTHS) ) &&
-            ! dur.isSet(DAYS) && ! dur.isSet(HOURS) && ! dur.isSet(MINUTES) && ! dur.isSet(SECONDS) ;
-    }
-
-    // NodeFunctions
-    public static boolean isDayTime(Duration dur)
-    {
-        return !dur.isSet(YEARS) && ! dur.isSet(MONTHS) &&
-            ( dur.isSet(DAYS) || dur.isSet(HOURS) || dur.isSet(MINUTES) || dur.isSet(SECONDS) );
-    }
-    
 }
 

Copied: incubator/jena/Scratch/AFS/Dev/trunk/src/main/java/projects/nodevalue/TestNodeValueOps.java (from r1334490, incubator/jena/Scratch/AFS/Dev/trunk/src/main/java/projects/nodevalue/TestDateTimeOps.java)
URL: http://svn.apache.org/viewvc/incubator/jena/Scratch/AFS/Dev/trunk/src/main/java/projects/nodevalue/TestNodeValueOps.java?p2=incubator/jena/Scratch/AFS/Dev/trunk/src/main/java/projects/nodevalue/TestNodeValueOps.java&p1=incubator/jena/Scratch/AFS/Dev/trunk/src/main/java/projects/nodevalue/TestDateTimeOps.java&r1=1334490&r2=1335023&rev=1335023&view=diff
==============================================================================
--- incubator/jena/Scratch/AFS/Dev/trunk/src/main/java/projects/nodevalue/TestDateTimeOps.java (original)
+++ incubator/jena/Scratch/AFS/Dev/trunk/src/main/java/projects/nodevalue/TestNodeValueOps.java Mon May  7 13:51:13 2012
@@ -18,38 +18,111 @@
 
 package projects.nodevalue;
 
+import com.hp.hpl.jena.sparql.expr.ExprEvalException ;
 import com.hp.hpl.jena.sparql.expr.NodeValue ;
 
 import org.junit.Test ;
 import org.openjena.atlas.junit.BaseTest ;
 
-public class TestDateTimeOps extends BaseTest
+public class TestNodeValueOps extends BaseTest
 {
-    @Test public void nv_add_1() { testAdd("12", "13", "25" ) ; }
+    // Numerics
+    @Test public void nv_add_1() { testAdd("12", "13", "'25'^^xsd:integer" ) ; }
+    @Test public void nv_add_2() { testAdd("'12'^^xsd:decimal", "13", "'25'^^xsd:decimal" ) ; }
+    @Test public void nv_add_3() { testAdd("'12.0'^^xsd:decimal", "13", "'25.0'^^xsd:decimal" ) ; }
+    @Test public void nv_add_4() { testAdd("12e0", "13", "25.0e0" ) ; }
+    
+    // Strings
+    @Test public void nv_add_10() { testAdd("'12'", "'13'", "'1213'" ) ; }
+
+    //Durations (need to test the wiring, not whether the calculation is right)
+    @Test public void nv_add_20() { testAdd("'PT1H'^^xsd:duration", "'PT1H'^^xsd:duration", "'PT2H'^^xsd:duration" ) ; }
+  
+    @Test public void nv_add_21() { testAdd("'PT1H'^^xsd:dayTimeDuration", "'PT1H'^^xsd:dayTimeDuration", "'PT2H'^^xsd:dayTimeDuration" ) ; }
+    @Test public void nv_add_22() { testAdd("'P1Y'^^xsd:yearMonthDuration", "'PT4H'^^xsd:dayTimeDuration", "'P1YT4H'^^xsd:duration" ) ; }
+
+    
+    // Date/time + duration
+    @Test public void nv_add_23() { testAdd("'2000-01-01'^^xsd:date", "'P1Y'^^xsd:duration", "'2001-01-01'^^xsd:date") ; }
+    @Test public void nv_add_24() { testAdd("'2000-01-01T00:00:00Z'^^xsd:dateTime", 
+                                            "'P1Y1M'^^xsd:yearMonthDuration", 
+                                            "'2001-02-01T00:00:00Z'^^xsd:dateTime") ; }
+    @Test public void nv_add_25() { testAdd("'2000-01-01T00:00:00Z'^^xsd:dateTime", 
+                                            "'P1Y1M1DT1H1M1.1S'^^xsd:duration", 
+                                            "'2001-02-02T01:01:01.1Z'^^xsd:dateTime") ; }
+    @Test public void nv_add_26() { testAdd("'00:00:00'^^xsd:time", 
+                                            "'PT1H2M3.4S'^^xsd:duration", 
+                                            "'01:02:03.4'^^xsd:time") ; }
+    
+    // Bad mixes
+    @Test(expected=ExprEvalException.class) 
+    public void nv_add_50() { testAdd("'12'", "13") ; }
 
+    @Test(expected=ExprEvalException.class) 
+    public void nv_add_51() { testAdd("'12'", "'PT1H'^^xsd:duration") ; }
     
+    @Test(expected=ExprEvalException.class) 
+    public void nv_add_52() { testAdd("'2012-04-05'^^xsd:date", "'2012-04-05'^^xsd:date") ; }
     
 
+    // Numerics
     @Test public void nv_sub_1() { testSub("12", "13", "-1" ) ; }
+    @Test public void nv_sub_2() { testSub("12", "13.0", "-1.0" ) ; }
+    @Test public void nv_sub_3() { testSub("12e0", "13.0", "-1.0e0" ) ; }
+    
+    // Durations
+    //Durations (need to test the wiring, not whether the calculation is right)
+    @Test public void nv_sub_20() { testSub("'PT2H'^^xsd:duration", "'PT1H'^^xsd:duration", "'PT1H'^^xsd:duration" ) ; }
+    @Test public void nv_sub_21() { testSub("'PT2H'^^xsd:dayTimeDuration", "'PT1H'^^xsd:dayTimeDuration", "'PT1H'^^xsd:dayTimeDuration" ) ; }
+    @Test public void nv_sub_22() { testSub("'P2Y'^^xsd:yearMonthDuration", "'P1Y'^^xsd:yearMonthDuration", "'P1Y'^^xsd:yearMonthDuration" ) ; }
+    @Test public void nv_sub_23() { testSub("'P3D'^^xsd:dayTimeDuration", "'PT4H'^^xsd:dayTimeDuration", "'P2DT20H'^^xsd:dayTimeDuration" ) ; }
+
+    
+    // Date/time - duration
+    @Test public void nv_sub_30() { testSub("'2000-01-01'^^xsd:date", "'P1Y'^^xsd:duration", "'1999-01-01'^^xsd:date") ; }
+    @Test public void nv_sub_31() { testSub("'2000-01-01T00:00:00Z'^^xsd:dateTime", 
+                                            "'P1Y1M'^^xsd:yearMonthDuration", 
+                                            "'1998-12-01T00:00:00Z'^^xsd:dateTime") ; }
+    @Test public void nv_sub_32() { testSub("'2000-01-01T00:00:00Z'^^xsd:dateTime", 
+                                            "'P1Y1M1DT1H1M1.1S'^^xsd:duration", 
+                                            "'1998-11-29T22:58:58.9Z'^^xsd:dateTime") ; }
+    
+    @Test public void nv_sub_33() { testSub("'10:11:12'^^xsd:time", 
+                                            "'PT1H2M3.4S'^^xsd:duration", 
+                                            "'09:09:08.6'^^xsd:time") ; }
+    // Date/time - date/time
+    
+    // Bad
+    @Test(expected=ExprEvalException.class) 
+    public void nv_sub_50() { testSub("'12'", "'13'" ) ; }
 
     
     static void testAdd(String s1, String s2, String s3)
     {
-        NodeValue nv1 = NodeValue.parse(s1) ;
-        NodeValue nv2 = NodeValue.parse(s2) ;
         NodeValue nv3 = NodeValue.parse(s3) ;
-        NodeValue nv = NV2.addNV(nv1, nv2) ;
+        NodeValue nv = testAdd(s1, s2) ;
         assertEquals(nv3, nv) ;
     }
     
-    static void testSub(String s1, String s2, String s3)
+    static NodeValue testAdd(String s1, String s2)
     {
         NodeValue nv1 = NodeValue.parse(s1) ;
         NodeValue nv2 = NodeValue.parse(s2) ;
+        return NV2.addNV(nv1, nv2) ;
+    }
+    
+    static void testSub(String s1, String s2, String s3)
+    {
         NodeValue nv3 = NodeValue.parse(s3) ;
-        NodeValue nv = NV2.subNV(nv1, nv2) ;
+        NodeValue nv = testSub(s1, s2) ;
         assertEquals(nv3, nv) ;
-        
+    }
+    
+    static NodeValue testSub(String s1, String s2)
+    {
+        NodeValue nv1 = NodeValue.parse(s1) ;
+        NodeValue nv2 = NodeValue.parse(s2) ;
+        return NV2.subNV(nv1, nv2) ;
     }
 
 }