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 21:12:26 UTC
svn commit: r1335203 - in /jena/Jena2/ARQ/trunk/src:
main/java/com/hp/hpl/jena/sparql/expr/
main/java/com/hp/hpl/jena/sparql/expr/nodevalue/
test/java/com/hp/hpl/jena/sparql/expr/
Author: andy
Date: Mon May 7 19:12:26 2012
New Revision: 1335203
URL: http://svn.apache.org/viewvc?rev=1335203&view=rev
Log:
Algorithms for XSD date/time/duration operations.
Added:
jena/Jena2/ARQ/trunk/src/main/java/com/hp/hpl/jena/sparql/expr/nodevalue/NodeValueOps.java
- copied, changed from r1335123, jena/Scratch/AFS/Dev/trunk/src/main/java/projects/nodevalue/NodeValueOps.java
jena/Jena2/ARQ/trunk/src/test/java/com/hp/hpl/jena/sparql/expr/TestNodeValueOps.java
- copied, changed from r1335123, jena/Scratch/AFS/Dev/trunk/src/main/java/projects/nodevalue/TestNodeValueOps.java
Modified:
jena/Jena2/ARQ/trunk/src/main/java/com/hp/hpl/jena/sparql/expr/NodeValue.java
jena/Jena2/ARQ/trunk/src/test/java/com/hp/hpl/jena/sparql/expr/TS_Expr.java
Modified: jena/Jena2/ARQ/trunk/src/main/java/com/hp/hpl/jena/sparql/expr/NodeValue.java
URL: http://svn.apache.org/viewvc/jena/Jena2/ARQ/trunk/src/main/java/com/hp/hpl/jena/sparql/expr/NodeValue.java?rev=1335203&r1=1335202&r2=1335203&view=diff
==============================================================================
--- jena/Jena2/ARQ/trunk/src/main/java/com/hp/hpl/jena/sparql/expr/NodeValue.java (original)
+++ jena/Jena2/ARQ/trunk/src/main/java/com/hp/hpl/jena/sparql/expr/NodeValue.java Mon May 7 19:12:26 2012
@@ -169,10 +169,10 @@ public abstract class NodeValue extends
public static final String xsdNamespace = XSD+"#" ;
- private static DatatypeFactory datatypefactory = null ;
+ public static DatatypeFactory xmlDatatypeFactory = null ;
static
{
- try { datatypefactory = DatatypeFactory.newInstance() ; }
+ try { xmlDatatypeFactory = DatatypeFactory.newInstance() ; }
catch (DatatypeConfigurationException ex)
{ throw new ARQInternalErrorException("Can't create a javax.xml DatatypeFactory") ; }
}
@@ -1129,7 +1129,7 @@ public abstract class NodeValue extends
dtXSDyearMonthDuration.equals(datatypeURI) ) &&
XSDduration.isValid(lex) ) // use lex
{
- Duration duration = datatypefactory.newDuration(lex) ;
+ Duration duration = xmlDatatypeFactory.newDuration(lex) ;
if ( dtXSDdayTimeDuration.equals(datatypeURI) && ! XSDFuncOp.isDayTime(duration) )
return null ;
Copied: jena/Jena2/ARQ/trunk/src/main/java/com/hp/hpl/jena/sparql/expr/nodevalue/NodeValueOps.java (from r1335123, jena/Scratch/AFS/Dev/trunk/src/main/java/projects/nodevalue/NodeValueOps.java)
URL: http://svn.apache.org/viewvc/jena/Jena2/ARQ/trunk/src/main/java/com/hp/hpl/jena/sparql/expr/nodevalue/NodeValueOps.java?p2=jena/Jena2/ARQ/trunk/src/main/java/com/hp/hpl/jena/sparql/expr/nodevalue/NodeValueOps.java&p1=jena/Scratch/AFS/Dev/trunk/src/main/java/projects/nodevalue/NodeValueOps.java&r1=1335123&r2=1335203&rev=1335203&view=diff
==============================================================================
--- jena/Scratch/AFS/Dev/trunk/src/main/java/projects/nodevalue/NodeValueOps.java (original)
+++ jena/Jena2/ARQ/trunk/src/main/java/com/hp/hpl/jena/sparql/expr/nodevalue/NodeValueOps.java Mon May 7 19:12:26 2012
@@ -16,7 +16,7 @@
* limitations under the License.
*/
-package projects.nodevalue;
+package com.hp.hpl.jena.sparql.expr.nodevalue;
import static com.hp.hpl.jena.datatypes.xsd.XSDDatatype.XSD ;
import static com.hp.hpl.jena.sparql.expr.ValueSpaceClassification.VSPACE_DATE ;
@@ -28,6 +28,7 @@ import static com.hp.hpl.jena.sparql.exp
import static javax.xml.datatype.DatatypeConstants.FIELD_UNDEFINED ;
import java.math.BigDecimal ;
+import java.util.GregorianCalendar ;
import javax.xml.datatype.Duration ;
import javax.xml.datatype.XMLGregorianCalendar ;
@@ -38,11 +39,69 @@ import com.hp.hpl.jena.query.ARQ ;
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 ;
+/** The code parts of arithmetic opperations on Nodevlaues.
+ */
public class NodeValueOps
{
+ /* Date/time/duration coverage
+ * add, subtract (duration, duration)
+ *
+(xsd:duration, xsd:duration) -> xsd:duration
+ 10.6.1 op:add-yearMonthDurations
+ 10.6.2 op:subtract-yearMonthDurations
+(xsd:duration, xsd:duration) -> xsd:duration
+ 10.6.6 op:add-dayTimeDurations
+ 10.6.7 op:subtract-dayTimeDurations
+** Java has general duration subtract
+
+ * Subtract two date/times
+
+(xsd:dateTime, xsd:dateTime) -> xsd:duration
+ 10.8.1 op:subtract-dateTimes -> xsd:dayTimeDuration
+(xsd:date, xsd:date) -> xsd:duration
+ 10.8.2 op:subtract-dates
+(xsd:time, xsd:time) -> xsd:duration
+ 10.8.3 op:subtract-times
+
+ * Date/time and duration
+** Java has general duration subtract (error needed?)
+
+(xsd:dateTime, xsd:duration) -> xsd:dateTime
+ 10.8.4 op:add-yearMonthDuration-to-dateTime
+ 10.8.5 op:add-dayTimeDuration-to-dateTime
+ 10.8.6 op:subtract-yearMonthDuration-from-dateTime
+ 10.8.7 op:subtract-dayTimeDuration-from-dateTime
+
+(xsd:date, xsd:duration) -> xsd:date
+ 10.8.8 op:add-yearMonthDuration-to-date
+ 10.8.9 op:add-dayTimeDuration-to-date
+ 10.8.10 op:subtract-yearMonthDuration-from-date
+ 10.8.11 op:subtract-dayTimeDuration-from-date
+
+(xsd:time, xsd:duration) -> xsd:time
+ 10.8.12 op:add-dayTimeDuration-to-time
+ 10.8.13 op:subtract-dayTimeDuration-from-time
+
+(xsd:duration, xsd:double) -> xsd:duration
+ 10.6.8 op:multiply-dayTimeDuration
+ */
+
+ /* Missing:
+(xsd:duration, xsd:double) -> xsd:duration
+ 10.6.9 op:divide-dayTimeDuration
+
+(xsd:duration, xsd:duration) -> xsd:decimal
+ 10.6.10 op:divide-dayTimeDuration-by-dayTimeDuration
+ */
+ /* Notes:
+ * Does not consider whether a duration is dayTime or yearMonth
+ * for addition and subtraction.
+ * As per the Java (Xerces) implementation, it just work on durations.
+ */
+
+ // Until part of Jena datatypes.
private static final String dtXSDdateTimeStamp = XSD+"#dateTimeStamp" ;
private static final String dtXSDdayTimeDuration = XSD+"#dayTimeDuration" ;
private static final String dtXSDyearMonthDuration = XSD+"#yearMonthDuration" ;
@@ -82,7 +141,7 @@ public class NodeValueOps
if ( vs1.equals(VSPACE_DATETIME) && vs2.equals(VSPACE_DURATION) )
{
XMLGregorianCalendar cal = nv1.getDateTime() ;
- XMLGregorianCalendar result = NV2.xsd_add(cal, nv2.getDuration()) ;
+ XMLGregorianCalendar result = xsd_add(cal, nv2.getDuration()) ;
NodeValue r = NodeValue.makeDateTime(result) ;
return r ;
}
@@ -90,7 +149,7 @@ public class NodeValueOps
if ( vs1.equals(VSPACE_DATE) && vs2.equals(VSPACE_DURATION) )
{
XMLGregorianCalendar cal = nv1.getDateTime() ;
- XMLGregorianCalendar result = NV2.xsd_add(cal, nv2.getDuration()) ;
+ XMLGregorianCalendar result = xsd_add(cal, nv2.getDuration()) ;
NodeValue r = NodeValue.makeDate(result) ;
return r ;
}
@@ -99,7 +158,7 @@ public class NodeValueOps
{
// ONLY dayTime.
XMLGregorianCalendar cal = nv1.getDateTime() ;
- XMLGregorianCalendar result = NV2.xsd_add(cal, nv2.getDuration()) ;
+ XMLGregorianCalendar result = xsd_add(cal, nv2.getDuration()) ;
NodeValue r = NodeValue.makeNode(result.toXMLFormat(), XSDDatatype.XSDtime) ;
return r ;
}
@@ -149,7 +208,7 @@ public class NodeValueOps
if ( ( isDef1 && !isDef2 ) || ( !isDef1 && isDef2 ) )
throw new ExprEvalTypeException("Operator '-': can't substract timezone/non-timezone values") ;
// Inspect duration and force to better type? xsd:dayTimeDuration
- return NodeValue.makeDuration(NV2.xsd_substract(cal1, cal2));
+ return NodeValue.makeDuration(xsd_substract(cal1, cal2));
}
// Loose style. Subtract any duration to any date or time value.
@@ -157,7 +216,7 @@ public class NodeValueOps
{
XMLGregorianCalendar cal = nv1.getDateTime() ;
// add-negation
- XMLGregorianCalendar result = NV2.xsd_subtract(cal, nv2.getDuration()) ;
+ XMLGregorianCalendar result = xsd_subtract(cal, nv2.getDuration()) ;
NodeValue r = NodeValue.makeDateTime(result) ;
return r ;
}
@@ -165,7 +224,7 @@ public class NodeValueOps
{
XMLGregorianCalendar cal = nv1.getDateTime() ;
// add-negation
- XMLGregorianCalendar result = NV2.xsd_subtract(cal, nv2.getDuration()) ;
+ XMLGregorianCalendar result = xsd_subtract(cal, nv2.getDuration()) ;
NodeValue r = NodeValue.makeDate(result) ;
return r ;
}
@@ -173,7 +232,7 @@ public class NodeValueOps
{
XMLGregorianCalendar cal = nv1.getDateTime() ;
// add-negation
- XMLGregorianCalendar result = NV2.xsd_subtract(cal, nv2.getDuration()) ;
+ XMLGregorianCalendar result = xsd_subtract(cal, nv2.getDuration()) ;
NodeValue r = NodeValue.makeNode(result.toXMLFormat(), XSDDatatype.XSDtime) ;
return r ;
}
@@ -218,7 +277,6 @@ public class NodeValueOps
}
- // XSDFuncOps
private static boolean isDT(ValueSpaceClassification vs)
{
switch (vs)
@@ -237,5 +295,30 @@ public class NodeValueOps
}
}
+ private static XMLGregorianCalendar xsd_add(XMLGregorianCalendar cal, Duration duration)
+ {
+ //if ( ! isYearMonth(duration) && ! isDayTime(duration) )
+
+ XMLGregorianCalendar result = (XMLGregorianCalendar)cal.clone() ;
+ result.add(duration) ;
+ return result ;
+ }
+
+ private static XMLGregorianCalendar xsd_subtract(XMLGregorianCalendar cal, Duration duration)
+ {
+ return xsd_add(cal, duration.negate()) ;
+ }
+
+ private static Duration xsd_substract(XMLGregorianCalendar cal1, XMLGregorianCalendar cal2)
+ {
+ GregorianCalendar gcal1 = cal1.toGregorianCalendar() ;
+ GregorianCalendar gcal2 = cal2.toGregorianCalendar() ;
+ long x1 = gcal1.getTimeInMillis() ;
+ long x2 = gcal2.getTimeInMillis() ;
+ //return datatypefactory.newDurationDayTime(x1-x2) ;
+ return NodeValue.xmlDatatypeFactory.newDuration(x1-x2) ;
+ }
+
+
}
Modified: jena/Jena2/ARQ/trunk/src/test/java/com/hp/hpl/jena/sparql/expr/TS_Expr.java
URL: http://svn.apache.org/viewvc/jena/Jena2/ARQ/trunk/src/test/java/com/hp/hpl/jena/sparql/expr/TS_Expr.java?rev=1335203&r1=1335202&r2=1335203&view=diff
==============================================================================
--- jena/Jena2/ARQ/trunk/src/test/java/com/hp/hpl/jena/sparql/expr/TS_Expr.java (original)
+++ jena/Jena2/ARQ/trunk/src/test/java/com/hp/hpl/jena/sparql/expr/TS_Expr.java Mon May 7 19:12:26 2012
@@ -32,6 +32,7 @@ import org.junit.runners.Suite.SuiteClas
, TestExpressions2.class
, TestFunctions.class
, TestFunctions2.class
+ , TestNodeValueOps.class
, TestOrdering.class
, TestRegex.class
, TestXSDFuncOp.class
Copied: jena/Jena2/ARQ/trunk/src/test/java/com/hp/hpl/jena/sparql/expr/TestNodeValueOps.java (from r1335123, jena/Scratch/AFS/Dev/trunk/src/main/java/projects/nodevalue/TestNodeValueOps.java)
URL: http://svn.apache.org/viewvc/jena/Jena2/ARQ/trunk/src/test/java/com/hp/hpl/jena/sparql/expr/TestNodeValueOps.java?p2=jena/Jena2/ARQ/trunk/src/test/java/com/hp/hpl/jena/sparql/expr/TestNodeValueOps.java&p1=jena/Scratch/AFS/Dev/trunk/src/main/java/projects/nodevalue/TestNodeValueOps.java&r1=1335123&r2=1335203&rev=1335203&view=diff
==============================================================================
--- jena/Scratch/AFS/Dev/trunk/src/main/java/projects/nodevalue/TestNodeValueOps.java (original)
+++ jena/Jena2/ARQ/trunk/src/test/java/com/hp/hpl/jena/sparql/expr/TestNodeValueOps.java Mon May 7 19:12:26 2012
@@ -16,10 +16,11 @@
* limitations under the License.
*/
-package projects.nodevalue;
+package com.hp.hpl.jena.sparql.expr;
import com.hp.hpl.jena.sparql.expr.ExprEvalException ;
import com.hp.hpl.jena.sparql.expr.NodeValue ;
+import com.hp.hpl.jena.sparql.expr.nodevalue.NodeValueOps ;
import org.junit.Test ;
import org.openjena.atlas.junit.BaseTest ;