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 2014/12/14 11:58:55 UTC

jena git commit: JENA-814 : Handled mixed dayTime/yearMonth comparision.

Repository: jena
Updated Branches:
  refs/heads/master 8fb7ff112 -> 508ac678d


JENA-814 : Handled mixed dayTime/yearMonth comparision.

Java says "equal" when they are in fact not comparable.

Project: http://git-wip-us.apache.org/repos/asf/jena/repo
Commit: http://git-wip-us.apache.org/repos/asf/jena/commit/508ac678
Tree: http://git-wip-us.apache.org/repos/asf/jena/tree/508ac678
Diff: http://git-wip-us.apache.org/repos/asf/jena/diff/508ac678

Branch: refs/heads/master
Commit: 508ac678d8aa9a28a48af6bd014b11e1b9d26b20
Parents: 8fb7ff1
Author: Andy Seaborne <an...@apache.org>
Authored: Sun Dec 14 10:56:48 2014 +0000
Committer: Andy Seaborne <an...@apache.org>
Committed: Sun Dec 14 10:56:48 2014 +0000

----------------------------------------------------------------------
 .../com/hp/hpl/jena/sparql/expr/NodeValue.java  | 12 ++++
 .../hp/hpl/jena/sparql/expr/TestXSDFuncOp.java  | 64 +++++++++++++++++++-
 2 files changed, 75 insertions(+), 1 deletion(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/jena/blob/508ac678/jena-arq/src/main/java/com/hp/hpl/jena/sparql/expr/NodeValue.java
----------------------------------------------------------------------
diff --git a/jena-arq/src/main/java/com/hp/hpl/jena/sparql/expr/NodeValue.java b/jena-arq/src/main/java/com/hp/hpl/jena/sparql/expr/NodeValue.java
index 6f1e0b3..3ca8cc3 100644
--- a/jena-arq/src/main/java/com/hp/hpl/jena/sparql/expr/NodeValue.java
+++ b/jena-arq/src/main/java/com/hp/hpl/jena/sparql/expr/NodeValue.java
@@ -729,6 +729,18 @@ public abstract class NodeValue extends ExprNode
             case VSPACE_DURATION:
             {
                 int x = XSDFuncOp.compareDuration(nv1, nv2) ;
+                // Fix up - Java (Oracle java7 at least) returns "equals" for 
+                // "D1Y"/"D365D" and "D1M"/"D28D", and others split over 
+                // YearMoth/DayTime.
+                
+                // OR return Expr.CMP_INDETERMINATE ??
+                if ( x == Expr.CMP_EQUAL ) {
+                    Duration d1 = nv1.getDuration() ;
+                    Duration d2 = nv2.getDuration() ;
+                    if ( ( XSDFuncOp.isDayTime(d1) && XSDFuncOp.isYearMonth(d2) ) ||
+                         ( XSDFuncOp.isDayTime(d2) && XSDFuncOp.isYearMonth(d1) ) )
+                        x = Expr.CMP_INDETERMINATE ;
+                }
                 if ( x != Expr.CMP_INDETERMINATE )
                     return x ;
                 // Indeterminate => can't compare as strict values.

http://git-wip-us.apache.org/repos/asf/jena/blob/508ac678/jena-arq/src/test/java/com/hp/hpl/jena/sparql/expr/TestXSDFuncOp.java
----------------------------------------------------------------------
diff --git a/jena-arq/src/test/java/com/hp/hpl/jena/sparql/expr/TestXSDFuncOp.java b/jena-arq/src/test/java/com/hp/hpl/jena/sparql/expr/TestXSDFuncOp.java
index 19fe919..ce23737 100644
--- a/jena-arq/src/test/java/com/hp/hpl/jena/sparql/expr/TestXSDFuncOp.java
+++ b/jena-arq/src/test/java/com/hp/hpl/jena/sparql/expr/TestXSDFuncOp.java
@@ -23,9 +23,11 @@ import org.junit.Assert ;
 import org.junit.Test ;
 
 import com.hp.hpl.jena.datatypes.xsd.XSDDatatype ;
+import com.hp.hpl.jena.graph.Node ;
 import com.hp.hpl.jena.graph.NodeFactory ;
 import com.hp.hpl.jena.query.ARQ ;
 import com.hp.hpl.jena.sparql.expr.nodevalue.* ;
+import com.hp.hpl.jena.sparql.sse.SSE ;
 
 public class TestXSDFuncOp extends BaseTest
 {
@@ -434,7 +436,6 @@ public class TestXSDFuncOp extends BaseTest
         { /* expected */}
     }
     
-
     @Test public void testSameUnknown_1()
     {
         NodeValue nv1 = NodeValue.makeNode(NodeFactory.createURI("test:abc")) ; 
@@ -606,6 +607,67 @@ public class TestXSDFuncOp extends BaseTest
         assertEquals("Does not compare "+nv1+" & "+nv2, NodeValue.CMP_LESS, NodeValue.compareAlways(nv1, nv2) ) ;
     }
 
+    @Test public void testCompareDuration_01() {
+        testCompare("'P365D'^^xsd:duration", "'P300D'^^xsd:duration", Expr.CMP_GREATER) ;
+    }
+    
+    // JENA-814
+    @Test(expected=ExprNotComparableException.class) 
+    public void testCompareDuration_02() {
+        testCompare("'P365D'^^xsd:duration", "'P1Y'^^xsd:duration", Expr.CMP_INDETERMINATE) ;
+    }
+    
+    // JENA-814
+    @Test(expected=ExprNotComparableException.class) 
+    public void testCompareDuration_03() {
+        testCompare("'P365D'^^xsd:dayTimeDuration", "'P1Y'^^xsd:yearMonthDuration", Expr.CMP_INDETERMINATE) ;
+    }
+
+    // JENA-814
+    @Test(expected=ExprNotComparableException.class) 
+    public void testCompareDuration_04() {
+        testCompare("'P1M'^^xsd:duration", "'P28D'^^xsd:duration", Expr.CMP_INDETERMINATE) ;
+    }
+
+    // JENA-814
+    @Test(expected=ExprNotComparableException.class) 
+    public void testCompareDuration_05() {
+        testCompare("'P1M'^^xsd:yearMonthDuration", "'P28D'^^xsd:dayTimeDuration", Expr.CMP_INDETERMINATE) ;
+    }
+
+    @Test public void testCompareDuration_06() {
+        testCompare("'P13M'^^xsd:yearMonthDuration", "'P1Y'^^xsd:yearMonthDuration", Expr.CMP_GREATER) ;
+    }
+    
+    // -------
+    
+    private static void testCompare(String s1, String s2, int correct) {
+        NodeValue nv1 = parse(s1) ; 
+        NodeValue nv2 = parse(s2) ; 
+        int x = NodeValue.compare(nv1, nv2) ;
+        assertEquals("("+s1+", "+s2+") -> "+name(x)+" ["+name(correct)+"]", correct, x) ;
+        int y = x ;
+        if ( x == Expr.CMP_LESS || x == Expr.CMP_GREATER ) 
+            y = -x ;
+        assertEquals("Not symmetric: ("+s1+", "+s2+")", NodeValue.compare(nv2, nv1), y) ;
+    }
+    
+    private static String name(int cmp) {
+        switch(cmp) {
+            case Expr.CMP_EQUAL :       return "EQ" ;
+            case Expr.CMP_GREATER :     return "GT" ;
+            case Expr.CMP_LESS :        return "LT" ;
+            case Expr.CMP_UNEQUAL :     return "NE" ;
+            case Expr.CMP_INDETERMINATE : return "INDET" ;
+            default:return "Unknown" ;
+                
+        }
+    }
+    
+    private static NodeValue parse(String str) {
+        Node n = SSE.parseNode(str) ;
+        return NodeValue.makeNode(n) ; 
+    }
     // abs is a test of Function.unaryOp machinary 
     @Test public void testAbs1()
     {