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()
{