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/04/29 17:53:30 UTC

svn commit: r1331929 - in /incubator/jena/Jena2/ARQ/trunk/src/main/java/com/hp/hpl/jena/sparql/expr: Expr.java NodeValue.java ValueSpaceClassification.java nodevalue/NodeValueDouble.java nodevalue/NodeValueDuration.java nodevalue/XSDFuncOp.java

Author: andy
Date: Sun Apr 29 15:53:30 2012
New Revision: 1331929

URL: http://svn.apache.org/viewvc?rev=1331929&view=rev
Log:
Switch to using javax.xml.datattypes.Duration, not Jena's XSDDuration, as internal value of a NodeValueDuration.
More arthimetic can be supported this way.
(But then normally, Java uses it's built in Xerces so it is different route to same heritiage.)

Modified:
    incubator/jena/Jena2/ARQ/trunk/src/main/java/com/hp/hpl/jena/sparql/expr/Expr.java
    incubator/jena/Jena2/ARQ/trunk/src/main/java/com/hp/hpl/jena/sparql/expr/NodeValue.java
    incubator/jena/Jena2/ARQ/trunk/src/main/java/com/hp/hpl/jena/sparql/expr/ValueSpaceClassification.java
    incubator/jena/Jena2/ARQ/trunk/src/main/java/com/hp/hpl/jena/sparql/expr/nodevalue/NodeValueDouble.java
    incubator/jena/Jena2/ARQ/trunk/src/main/java/com/hp/hpl/jena/sparql/expr/nodevalue/NodeValueDuration.java
    incubator/jena/Jena2/ARQ/trunk/src/main/java/com/hp/hpl/jena/sparql/expr/nodevalue/XSDFuncOp.java

Modified: incubator/jena/Jena2/ARQ/trunk/src/main/java/com/hp/hpl/jena/sparql/expr/Expr.java
URL: http://svn.apache.org/viewvc/incubator/jena/Jena2/ARQ/trunk/src/main/java/com/hp/hpl/jena/sparql/expr/Expr.java?rev=1331929&r1=1331928&r2=1331929&view=diff
==============================================================================
--- incubator/jena/Jena2/ARQ/trunk/src/main/java/com/hp/hpl/jena/sparql/expr/Expr.java (original)
+++ incubator/jena/Jena2/ARQ/trunk/src/main/java/com/hp/hpl/jena/sparql/expr/Expr.java Sun Apr 29 15:53:30 2012
@@ -21,6 +21,8 @@ package com.hp.hpl.jena.sparql.expr;
 import java.util.Collection ;
 import java.util.Set ;
 
+import javax.xml.datatype.DatatypeConstants ;
+
 import com.hp.hpl.jena.sparql.core.Var ;
 import com.hp.hpl.jena.sparql.engine.binding.Binding ;
 import com.hp.hpl.jena.sparql.function.FunctionEnv ;
@@ -28,12 +30,12 @@ import com.hp.hpl.jena.sparql.graph.Node
 
 public interface Expr
 {
-    public static final int CMP_GREATER  = +1 ;
-    public static final int CMP_EQUAL    =  0 ;
-    public static final int CMP_LESS     = -1 ;
+    public static final int CMP_GREATER  =  DatatypeConstants.GREATER ;
+    public static final int CMP_EQUAL    =  DatatypeConstants.EQUAL ;
+    public static final int CMP_LESS     =  DatatypeConstants.LESSER ;
     
     public static final int CMP_UNEQUAL  = -9 ;
-    public static final int CMP_INDETERMINATE  = 2 ;
+    public static final int CMP_INDETERMINATE  = DatatypeConstants.INDETERMINATE ;
     
     /** Test whether a Constraint is satisfied, given a set of bindings
      *  Includes error propagtion and Effective Boolean Value rules.

Modified: incubator/jena/Jena2/ARQ/trunk/src/main/java/com/hp/hpl/jena/sparql/expr/NodeValue.java
URL: http://svn.apache.org/viewvc/incubator/jena/Jena2/ARQ/trunk/src/main/java/com/hp/hpl/jena/sparql/expr/NodeValue.java?rev=1331929&r1=1331928&r2=1331929&view=diff
==============================================================================
--- incubator/jena/Jena2/ARQ/trunk/src/main/java/com/hp/hpl/jena/sparql/expr/NodeValue.java (original)
+++ incubator/jena/Jena2/ARQ/trunk/src/main/java/com/hp/hpl/jena/sparql/expr/NodeValue.java Sun Apr 29 15:53:30 2012
@@ -18,20 +18,45 @@
 
 package com.hp.hpl.jena.sparql.expr;
 
-import static com.hp.hpl.jena.sparql.expr.ValueSpaceClassification.* ;
+import static com.hp.hpl.jena.sparql.expr.ValueSpaceClassification.VSPACE_BOOLEAN ;
+import static com.hp.hpl.jena.sparql.expr.ValueSpaceClassification.VSPACE_DATE ;
+import static com.hp.hpl.jena.sparql.expr.ValueSpaceClassification.VSPACE_DATETIME ;
+import static com.hp.hpl.jena.sparql.expr.ValueSpaceClassification.VSPACE_DIFFERENT ;
+import static com.hp.hpl.jena.sparql.expr.ValueSpaceClassification.VSPACE_DURATION ;
+import static com.hp.hpl.jena.sparql.expr.ValueSpaceClassification.VSPACE_G_DAY ;
+import static com.hp.hpl.jena.sparql.expr.ValueSpaceClassification.VSPACE_G_MONTH ;
+import static com.hp.hpl.jena.sparql.expr.ValueSpaceClassification.VSPACE_G_MONTHDAY ;
+import static com.hp.hpl.jena.sparql.expr.ValueSpaceClassification.VSPACE_G_YEAR ;
+import static com.hp.hpl.jena.sparql.expr.ValueSpaceClassification.VSPACE_G_YEARMONTH ;
+import static com.hp.hpl.jena.sparql.expr.ValueSpaceClassification.VSPACE_LANG ;
+import static com.hp.hpl.jena.sparql.expr.ValueSpaceClassification.VSPACE_NODE ;
+import static com.hp.hpl.jena.sparql.expr.ValueSpaceClassification.VSPACE_NUM ;
+import static com.hp.hpl.jena.sparql.expr.ValueSpaceClassification.VSPACE_STRING ;
+import static com.hp.hpl.jena.sparql.expr.ValueSpaceClassification.VSPACE_TIME ;
+import static com.hp.hpl.jena.sparql.expr.ValueSpaceClassification.VSPACE_UNKNOWN ;
+import static javax.xml.datatype.DatatypeConstants.DAYS ;
+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.math.BigDecimal ;
 import java.math.BigInteger ;
 import java.util.Calendar ;
 
+import javax.xml.datatype.DatatypeConfigurationException ;
+import javax.xml.datatype.DatatypeFactory ;
+import javax.xml.datatype.Duration ;
+
 import org.openjena.atlas.lib.StrUtils ;
+import org.openjena.atlas.logging.Log ;
 
 import com.hp.hpl.jena.datatypes.DatatypeFormatException ;
 import com.hp.hpl.jena.datatypes.RDFDatatype ;
 import com.hp.hpl.jena.datatypes.TypeMapper ;
 import com.hp.hpl.jena.datatypes.xsd.XSDDatatype ;
 import com.hp.hpl.jena.datatypes.xsd.XSDDateTime ;
-import com.hp.hpl.jena.datatypes.xsd.XSDDuration ;
 import com.hp.hpl.jena.graph.Node ;
 import com.hp.hpl.jena.graph.impl.LiteralLabel ;
 import com.hp.hpl.jena.query.ARQ ;
@@ -44,13 +69,7 @@ import com.hp.hpl.jena.sparql.function.F
 import com.hp.hpl.jena.sparql.graph.NodeConst ;
 import com.hp.hpl.jena.sparql.graph.NodeTransform ;
 import com.hp.hpl.jena.sparql.serializer.SerializationContext ;
-import org.openjena.atlas.logging.Log ;
-import com.hp.hpl.jena.sparql.util.FmtUtils ;
-import com.hp.hpl.jena.sparql.util.NodeUtils ;
-import com.hp.hpl.jena.sparql.util.RefBoolean ;
-import com.hp.hpl.jena.sparql.util.RomanNumeral ;
-import com.hp.hpl.jena.sparql.util.RomanNumeralDatatype ;
-import com.hp.hpl.jena.sparql.util.Utils ;
+import com.hp.hpl.jena.sparql.util.* ;
 import com.hp.hpl.jena.vocabulary.XSD ;
 
 public abstract class NodeValue extends ExprNode
@@ -744,10 +763,10 @@ public abstract class NodeValue extends 
         throw new ARQInternalErrorException("Compare failure "+nv1+" and "+nv2) ;
     }
 
-    private static ValueSpaceClassification classifyValueOp(NodeValue nv1, NodeValue nv2)
+    public static ValueSpaceClassification classifyValueOp(NodeValue nv1, NodeValue nv2)
     {
-        ValueSpaceClassification c1 = classifyValueSpace(nv1) ;
-        ValueSpaceClassification c2 = classifyValueSpace(nv2) ;
+        ValueSpaceClassification c1 = nv1.getValueSpace() ;
+        ValueSpaceClassification c2 = nv2.getValueSpace() ;
         if ( c1 == c2 ) return c1 ;
         if ( c1 == VSPACE_UNKNOWN || c2 == VSPACE_UNKNOWN )
             return VSPACE_UNKNOWN ;
@@ -756,6 +775,8 @@ public abstract class NodeValue extends 
         return VSPACE_DIFFERENT ;
     }
     
+    public ValueSpaceClassification getValueSpace()     { return classifyValueSpace(this) ; }
+    
     private static ValueSpaceClassification classifyValueSpace(NodeValue nv)
     {
         if ( nv.isNumber() )        return VSPACE_NUM ;
@@ -833,6 +854,22 @@ public abstract class NodeValue extends 
     public boolean isTime()         { return false ; }
     public boolean isDuration()     { return false ; }
 
+    public boolean isYearMonth()
+    {
+        if ( ! isDuration() ) return false ;
+        Duration dur = getDuration() ;
+        return ( dur.isSet(YEARS) || dur.isSet(MONTHS) ) &&
+               ! dur.isSet(DAYS) && ! dur.isSet(HOURS) && ! dur.isSet(MINUTES) && ! dur.isSet(SECONDS) ;
+    }
+
+    boolean isDayTime()
+    {
+        if ( ! isDuration() ) return false ;
+        Duration dur = getDuration() ;
+        return !dur.isSet(YEARS) && ! dur.isSet(MONTHS) &&
+            ( dur.isSet(DAYS) || dur.isSet(HOURS) || dur.isSet(MINUTES) || dur.isSet(SECONDS) );
+    }
+
     public boolean isGYear()        { return false ; }
     public boolean isGYearMonth()   { return false ; }
     public boolean isGMonth()       { return false ; }
@@ -865,7 +902,7 @@ public abstract class NodeValue extends 
 //    public XSDDateTime getGDay()        { raise(new ExprEvalException("Not a dateTime: "+this)) ; return null ; }
 
     
-    public XSDDuration    getDuration() { raise(new ExprEvalTypeException("Not a duration: "+this)) ; return null ; }
+    public Duration    getDuration() { raise(new ExprEvalTypeException("Not a duration: "+this)) ; return null ; }
 
     // ----------------------------------------------------------------
     // ---- Setting : used when a node is used to make a NodeValue
@@ -1027,8 +1064,9 @@ public abstract class NodeValue extends 
             
             if ( XSDDatatype.XSDduration.isValidLiteral(lit) )
             {
-                XSDDuration duration = (XSDDuration)lit.getValue() ;
-                return new NodeValueDuration(duration, node) ;
+                //XSDDuration duration = (XSDDuration)lit.getValue() ;
+                Duration jduration = createDuration(lit.getLexicalForm()) ;
+                return new NodeValueDuration(jduration, node) ;
             }
             
             if ( XSDDatatype.XSDboolean.isValidLiteral(lit) )
@@ -1068,6 +1106,19 @@ public abstract class NodeValue extends 
     
     // ----------------------------------------------------------------
     
+    private static DatatypeFactory df = null ;
+    static
+    {
+        try { df = DatatypeFactory.newInstance() ; }
+        catch (DatatypeConfigurationException ex)
+        { throw new ARQInternalErrorException("Can't create a javax.xml DatatypeFactory") ; }
+    }
+
+    private static Duration createDuration(String lex)
+    {
+        return df.newDuration(lex) ;
+    }
+    
     // Point to catch all exceptions.
     public static void raise(ExprException ex)
     {

Modified: incubator/jena/Jena2/ARQ/trunk/src/main/java/com/hp/hpl/jena/sparql/expr/ValueSpaceClassification.java
URL: http://svn.apache.org/viewvc/incubator/jena/Jena2/ARQ/trunk/src/main/java/com/hp/hpl/jena/sparql/expr/ValueSpaceClassification.java?rev=1331929&r1=1331928&r2=1331929&view=diff
==============================================================================
--- incubator/jena/Jena2/ARQ/trunk/src/main/java/com/hp/hpl/jena/sparql/expr/ValueSpaceClassification.java (original)
+++ incubator/jena/Jena2/ARQ/trunk/src/main/java/com/hp/hpl/jena/sparql/expr/ValueSpaceClassification.java Sun Apr 29 15:53:30 2012
@@ -18,7 +18,7 @@
 
 package com.hp.hpl.jena.sparql.expr;
 
-enum ValueSpaceClassification {
+public enum ValueSpaceClassification {
     VSPACE_NODE,
     VSPACE_NUM, 
     VSPACE_DATETIME, 

Modified: incubator/jena/Jena2/ARQ/trunk/src/main/java/com/hp/hpl/jena/sparql/expr/nodevalue/NodeValueDouble.java
URL: http://svn.apache.org/viewvc/incubator/jena/Jena2/ARQ/trunk/src/main/java/com/hp/hpl/jena/sparql/expr/nodevalue/NodeValueDouble.java?rev=1331929&r1=1331928&r2=1331929&view=diff
==============================================================================
--- incubator/jena/Jena2/ARQ/trunk/src/main/java/com/hp/hpl/jena/sparql/expr/nodevalue/NodeValueDouble.java (original)
+++ incubator/jena/Jena2/ARQ/trunk/src/main/java/com/hp/hpl/jena/sparql/expr/nodevalue/NodeValueDouble.java Sun Apr 29 15:53:30 2012
@@ -28,7 +28,7 @@ import com.hp.hpl.jena.sparql.util.Utils
 
 public class NodeValueDouble extends NodeValue
 {
-   double value = Double.NaN ;
+    double value = Double.NaN ;
     
     public NodeValueDouble(double d)         { super() ; value = d ; }
     public NodeValueDouble(double d, Node n) { super(n) ; value = d ; } 

Modified: incubator/jena/Jena2/ARQ/trunk/src/main/java/com/hp/hpl/jena/sparql/expr/nodevalue/NodeValueDuration.java
URL: http://svn.apache.org/viewvc/incubator/jena/Jena2/ARQ/trunk/src/main/java/com/hp/hpl/jena/sparql/expr/nodevalue/NodeValueDuration.java?rev=1331929&r1=1331928&r2=1331929&view=diff
==============================================================================
--- incubator/jena/Jena2/ARQ/trunk/src/main/java/com/hp/hpl/jena/sparql/expr/nodevalue/NodeValueDuration.java (original)
+++ incubator/jena/Jena2/ARQ/trunk/src/main/java/com/hp/hpl/jena/sparql/expr/nodevalue/NodeValueDuration.java Sun Apr 29 15:53:30 2012
@@ -18,35 +18,30 @@
 
 package com.hp.hpl.jena.sparql.expr.nodevalue;
 
+import javax.xml.datatype.Duration ;
+
 import com.hp.hpl.jena.datatypes.xsd.XSDDatatype ;
-import com.hp.hpl.jena.datatypes.xsd.XSDDuration ;
 import com.hp.hpl.jena.graph.Node ;
-import com.hp.hpl.jena.sparql.expr.ExprException ;
 import com.hp.hpl.jena.sparql.expr.NodeValue ;
 
-/** XSD Duration (which is unrelated to XSD dateTime in the datatype hierarchy) */ 
+/** XSD Duration */ 
 
 public class NodeValueDuration extends NodeValue
 {
-    XSDDuration duration ; 
+    Duration duration ; 
     
-    public NodeValueDuration(XSDDuration dt)
+    public NodeValueDuration(Duration dt)
     { 
         duration = dt ;
-        if (dt.getDays() != 0 && dt.getMonths() !=0 && dt.getYears() != 0) {
-        	throw new ExprException("Illegal time: "+dt) ;
-        }
-        if ( dt.getTimePart() == 0 ) 
-            throw new ExprException("Illegal time: "+dt) ;
     }
     
-    public NodeValueDuration(XSDDuration dt, Node n) { super(n) ; duration = dt ; }
+    public NodeValueDuration(Duration dt, Node n) { super(n) ; duration = dt ; }
     
     @Override
     public boolean isDuration() { return true ; }
     @Override
-    public XSDDuration getDuration()     { return duration ; }
-    
+    public Duration getDuration()     { return duration ; }
+
     @Override
     protected Node makeNode()
     {

Modified: incubator/jena/Jena2/ARQ/trunk/src/main/java/com/hp/hpl/jena/sparql/expr/nodevalue/XSDFuncOp.java
URL: http://svn.apache.org/viewvc/incubator/jena/Jena2/ARQ/trunk/src/main/java/com/hp/hpl/jena/sparql/expr/nodevalue/XSDFuncOp.java?rev=1331929&r1=1331928&r2=1331929&view=diff
==============================================================================
--- incubator/jena/Jena2/ARQ/trunk/src/main/java/com/hp/hpl/jena/sparql/expr/nodevalue/XSDFuncOp.java (original)
+++ incubator/jena/Jena2/ARQ/trunk/src/main/java/com/hp/hpl/jena/sparql/expr/nodevalue/XSDFuncOp.java Sun Apr 29 15:53:30 2012
@@ -32,13 +32,15 @@ import java.util.List ;
 import java.util.Set ;
 import java.util.regex.Pattern ;
 
+import javax.xml.datatype.DatatypeConstants ;
+import javax.xml.datatype.Duration ;
+
 import org.openjena.atlas.lib.StrUtils ;
 import org.openjena.atlas.logging.Log ;
 
 import com.hp.hpl.jena.datatypes.RDFDatatype ;
 import com.hp.hpl.jena.datatypes.xsd.XSDDatatype ;
 import com.hp.hpl.jena.datatypes.xsd.XSDDateTime ;
-import com.hp.hpl.jena.datatypes.xsd.XSDDuration ;
 import com.hp.hpl.jena.graph.Node ;
 import com.hp.hpl.jena.sparql.ARQInternalErrorException ;
 import com.hp.hpl.jena.sparql.expr.* ;
@@ -862,7 +864,7 @@ public class XSDFuncOp
     
     public static int compareDuration(NodeValue nv1, NodeValue nv2)
     { 
-        return compareXSDDuration(nv1.getDuration(), nv2.getDuration()) ;
+        return compareDuration(nv1.getDuration(), nv2.getDuration()) ;
     }
 
     public static int compareGYear(NodeValue nv1, NodeValue nv2)
@@ -947,7 +949,7 @@ public class XSDFuncOp
             if ( nv3 != null )
             {
                 XSDDateTime dt3 = nv3.getDateTime() ; 
-                x =  compareXSDDateTime(dt1, dt3) ;
+                x = compareXSDDateTime(dt1, dt3) ;
                 if ( x == XSDDateTime.INDETERMINATE )
                     throw new ARQInternalErrorException("Still get indeterminate comparison") ;
                 return x ;
@@ -991,34 +993,31 @@ public class XSDFuncOp
         // F&O has an "implicit timezone" - this code implements the XMLSchema compare algorithm.  
 
         int x = dt1.compare(dt2) ;
-        if ( x == XSDDateTime.EQUAL )
-            return Expr.CMP_EQUAL ;
-        if ( x == XSDDateTime.LESS_THAN )
-            return Expr.CMP_LESS ;
-        if ( x == XSDDateTime.GREATER_THAN )
-            return Expr.CMP_GREATER ;
-        if ( x == XSDDateTime.INDETERMINATE )
-            return Expr.CMP_INDETERMINATE ;
-        throw new ARQInternalErrorException("Unexpected return from XSDDateTime.compare: "+x) ;
+        return convertComparison(x) ;
     }
 
-    private static int compareXSDDuration(XSDDuration duration1 , XSDDuration duration2)
+    private static int compareDuration(Duration duration1 , Duration duration2)
     {
         // Returns codes are -1/0/1 but also 2 for "Indeterminate"
         // Not fully sure when Indeterminate is returned with regards to a duration
 
         int x = duration1.compare(duration2) ;
-        if ( x == XSDDuration.EQUAL )
+        return convertComparison(x) ;
+    }
+
+    private static int convertComparison(int x)
+    {
+        if ( x == DatatypeConstants.EQUAL )
             return Expr.CMP_EQUAL ;
-        if ( x == XSDDuration.LESS_THAN )
+        if ( x == DatatypeConstants.LESSER )
             return Expr.CMP_LESS ;
-        if ( x == XSDDuration.GREATER_THAN )
+        if ( x == DatatypeConstants.GREATER )
             return Expr.CMP_GREATER ;
-        if ( x == XSDDuration.INDETERMINATE )
+        if ( x == DatatypeConstants.INDETERMINATE )
             return Expr.CMP_INDETERMINATE ;
         throw new ARQInternalErrorException("Unexpected return from XSDDuration.compare: "+x) ;
     }
-
+    
     // --------------------------------
     // Boolean operations