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) ;
}
}