Skip to content

Commit

Permalink
Merge pull request eclipse-rdf4j#12 from Tpt/issues/eclipse-rdf4j#184-…
Browse files Browse the repository at this point in the history
…duration-compare

issue eclipse-rdf4j#184: Adds xsd:duration comparison to SPARQL extended mode
  • Loading branch information
James Leigh committed Nov 10, 2017
2 parents ecda369 + 787e04c commit 5677eba
Show file tree
Hide file tree
Showing 2 changed files with 96 additions and 2 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,7 @@
package org.eclipse.rdf4j.query.algebra.evaluation.util;

import javax.xml.datatype.DatatypeConstants;
import javax.xml.datatype.Duration;
import javax.xml.datatype.XMLGregorianCalendar;

import org.eclipse.rdf4j.model.IRI;
Expand Down Expand Up @@ -229,6 +230,11 @@ else if (!strict && XMLDatatypeUtil.isCalendarDatatype(leftDatatype)
// We're not running in strict eval mode so we use extended datatype comparsion.
commonDatatype = XMLSchema.DATETIME;
}
else if (!strict && XMLDatatypeUtil.isDurationDatatype(leftDatatype)
&& XMLDatatypeUtil.isDurationDatatype(rightDatatype))
{
commonDatatype = XMLSchema.DURATION;
}
}

if (commonDatatype != null) {
Expand Down Expand Up @@ -274,6 +280,14 @@ else if (XMLDatatypeUtil.isCalendarDatatype(commonDatatype)) {

}
}
else if (!strict && XMLDatatypeUtil.isDurationDatatype(commonDatatype)) {
Duration left = XMLDatatypeUtil.parseDuration(leftLit.getLabel());
Duration right = XMLDatatypeUtil.parseDuration(rightLit.getLabel());
compareResult = left.compare(right);
if (compareResult == DatatypeConstants.INDETERMINATE) {
compareResult = null; //We fallback to regular term comparison
}
}
else if (commonDatatype.equals(XMLSchema.STRING)) {
compareResult = leftLit.getLabel().compareTo(rightLit.getLabel());
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -58,6 +58,14 @@ public class QueryEvaluationUtilTest {

private Literal arg2dateTime;

private Literal arg1duration;

private Literal arg2duration;

private Literal arg1yearMonthDuration;

private Literal arg2yearMonthDuration;

private Literal arg1unknown;

private Literal arg2unknown;
Expand Down Expand Up @@ -87,6 +95,12 @@ public void setUp()
arg1int = f.createLiteral(10);
arg2int = f.createLiteral(1);

arg1duration = f.createLiteral("P1Y30DT1H1M1S", XMLSchema.DURATION);
arg2duration = f.createLiteral("P1Y31DT1H1M1S", XMLSchema.DURATION);

arg1yearMonthDuration = f.createLiteral("P1M", XMLSchema.YEARMONTHDURATION);
arg2yearMonthDuration = f.createLiteral("P1Y1M", XMLSchema.YEARMONTHDURATION);

arg1unknown = f.createLiteral("foo", f.createIRI("http://example.com/datatype"));
arg2unknown = f.createLiteral("bar", f.createIRI("http://example.com/datatype"));
}
Expand Down Expand Up @@ -141,6 +155,8 @@ public void testCompareEQ()
assertCompareTrue(arg1int, arg1int, EQ);
assertCompareTrue(arg1year, arg1year, EQ);
assertCompareTrue(arg1dateTime, arg1dateTime, EQ);
assertCompareTrue(arg1duration, arg1duration, EQ);
assertCompareTrue(arg1yearMonthDuration, arg1yearMonthDuration, EQ);
assertCompareException(arg1unknown, arg2unknown, EQ);

assertCompareFalse(arg1simple, arg2simple, EQ);
Expand Down Expand Up @@ -198,6 +214,18 @@ public void testCompareEQ()
assertCompareFalse(arg1dateTime, arg2year, EQ);
assertCompareFalse(arg1dateTime, arg2dateTime, EQ);
assertCompareException(arg1dateTime, arg2unknown, EQ);

assertCompareException(arg1duration, arg2simple, EQ);
assertCompareFalse(arg1duration, arg2en, EQ);
assertCompareException(arg1duration, arg2string, EQ);
assertCompareException(arg1duration, arg2int, EQ);
assertCompareException(arg1duration, arg2year, EQ);
assertCompareException(arg1duration, arg2dateTime, EQ);
assertCompareException(arg1duration, arg2duration, EQ);
assertCompareFalse(arg1duration, arg2duration, EQ, false);
assertCompareException(arg1duration, arg2yearMonthDuration, EQ);
assertCompareException(arg1duration, arg2yearMonthDuration, EQ, false);
assertCompareException(arg1duration, arg2unknown, EQ);
}

@Test
Expand Down Expand Up @@ -268,6 +296,18 @@ public void testCompareNE()
assertCompareTrue(arg1dateTime, arg2year, NE);
assertCompareTrue(arg1dateTime, arg2dateTime, NE);
assertCompareException(arg1dateTime, arg2unknown, NE);

assertCompareException(arg1duration, arg2simple, NE);
assertCompareTrue(arg1duration, arg2en, NE);
assertCompareException(arg1duration, arg2string, NE);
assertCompareException(arg1duration, arg2int, NE);
assertCompareException(arg1duration, arg2year, NE);
assertCompareException(arg1duration, arg2dateTime, NE);
assertCompareException(arg1duration, arg2duration, NE);
assertCompareTrue(arg1duration, arg2duration, NE, false);
assertCompareException(arg1duration, arg2yearMonthDuration, NE);
assertCompareException(arg1duration, arg2yearMonthDuration, NE, false);
assertCompareException(arg1duration, arg2unknown, NE);
}

@Test
Expand Down Expand Up @@ -332,11 +372,35 @@ public void testCompareLT()
assertCompareException(arg1dateTime, arg2year, LT);
assertCompareFalse(arg1dateTime, arg2dateTime, LT);
assertCompareException(arg1dateTime, arg2unknown, LT);

assertCompareException(arg1duration, arg2simple, LT);
assertCompareException(arg1duration, arg2en, LT);
assertCompareException(arg1duration, arg2string, LT);
assertCompareException(arg1duration, arg2int, LT);
assertCompareException(arg1duration, arg2year, LT);
assertCompareException(arg1duration, arg2dateTime, LT);
assertCompareException(arg1duration, arg2duration, LT);
assertCompareTrue(arg1duration, arg2duration, LT, false);
assertCompareException(arg1duration, arg2yearMonthDuration, LT);
assertCompareException(arg1duration, arg2yearMonthDuration, LT, false);
assertCompareException(arg1duration, arg2unknown, LT);

assertCompareException(arg1yearMonthDuration, arg2simple, LT);
assertCompareException(arg1yearMonthDuration, arg2en, LT);
assertCompareException(arg1yearMonthDuration, arg2string, LT);
assertCompareException(arg1yearMonthDuration, arg2int, LT);
assertCompareException(arg1yearMonthDuration, arg2year, LT);
assertCompareException(arg1yearMonthDuration, arg2dateTime, LT);
assertCompareException(arg1yearMonthDuration, arg2duration, LT);
assertCompareTrue(arg1yearMonthDuration, arg2duration, LT, false);
assertCompareException(arg1yearMonthDuration, arg2yearMonthDuration, LT);
assertCompareTrue(arg1yearMonthDuration, arg2yearMonthDuration, LT, false);
assertCompareException(arg1yearMonthDuration, arg2unknown, LT);
}

/**
* Assert that there is an exception as a result of comparing the two literals with the given operator.
*
*
* @param lit1
* The left literal
* @param lit2
Expand All @@ -345,10 +409,26 @@ public void testCompareLT()
* The operator for the comparison
*/
private void assertCompareException(Literal lit1, Literal lit2, CompareOp op)
throws Exception
{
assertCompareException(lit1, lit2, op, true);
}

/**
* Assert that there is an exception as a result of comparing the two literals with the given operator.
*
* @param lit1
* The left literal
* @param lit2
* The right literal
* @param op
* The operator for the comparison
*/
private void assertCompareException(Literal lit1, Literal lit2, CompareOp op, boolean strict)
throws Exception
{
try {
boolean returnValue = QueryEvaluationUtil.compareLiterals(lit1, lit2, op);
boolean returnValue = QueryEvaluationUtil.compareLiterals(lit1, lit2, op, strict);
fail("Did not receive expected ValueExprEvaluationException (return value was " + returnValue
+ ") for " + lit1.toString() + op.getSymbol() + lit2.toString());
}
Expand Down

0 comments on commit 5677eba

Please sign in to comment.