case VSPACE_G_MONTH :
case VSPACE_G_MONTHDAY :
case VSPACE_G_YEAR :
case VSPACE_G_YEARMONTH :
case VSPACE_DURATION:
throw new ARQInternalErrorException("Still seeing date/dateTime/time/duration compare type") ;
case VSPACE_NUM: return XSDFuncOp.compareNumeric(nv1, nv2) ;
case VSPACE_STRING:
{
int cmp = XSDFuncOp.compareString(nv1, nv2) ;
// Split plain literals and xsd:strings for sorting purposes.
if ( ! sortOrderingCompare )
return cmp ;
if ( cmp != Expr.CMP_EQUAL )
return cmp ;
// Same by string value.
String dt1 = nv1.asNode().getLiteralDatatypeURI() ;
String dt2 = nv2.asNode().getLiteralDatatypeURI() ;
if ( dt1 == null && dt2 != null )
return Expr.CMP_LESS ;
if ( dt2 == null && dt1 != null )
return Expr.CMP_GREATER ;
return Expr.CMP_EQUAL; // Both plain or both xsd:string.
}
case VSPACE_BOOLEAN: return XSDFuncOp.compareBoolean(nv1, nv2) ;
case VSPACE_LANG:
{
// Two literals, both with language tags.
Node node1 = nv1.asNode() ;
Node node2 = nv2.asNode() ;
int x = StrUtils.strCompareIgnoreCase(node1.getLiteralLanguage(), node2.getLiteralLanguage()) ;
if ( x != Expr.CMP_EQUAL )
{
// Different lang tags
if ( ! sortOrderingCompare )
raise(new ExprNotComparableException("Can't compare (different languages) "+nv1+" and "+nv2)) ;
// Different lang tags - sorting
return x ;
}
// same lang tag (case insensitive)
x = StrUtils.strCompare(node1.getLiteralLexicalForm(), node2.getLiteralLexicalForm()) ;
if ( x != Expr.CMP_EQUAL )
return x ;
// Same lexcial forms, same lang tag by value
// Try to split by syntactic lang tags.
x = StrUtils.strCompare(node1.getLiteralLanguage(), node2.getLiteralLanguage()) ;
// Maybe they are the same after all!
// Should be node.equals by now.
if ( x == Expr.CMP_EQUAL && ! NodeFunctions.sameTerm(node1, node2) )
throw new ARQInternalErrorException("Look the same (lang tags) but no node equals") ;
return x ;
}
case VSPACE_NODE:
// Two non-literals don't compare except for sorting.
if ( sortOrderingCompare )
return NodeUtils.compareRDFTerms(nv1.asNode(), nv2.asNode()) ;
else
{
raise(new ExprNotComparableException("Can't compare (nodes) "+nv1+" and "+nv2)) ;
throw new ARQInternalErrorException("NodeValue.raise returned") ;
}
case VSPACE_UNKNOWN:
{
// One or two unknown value spaces.
Node node1 = nv1.asNode() ;
Node node2 = nv2.asNode() ;
// Two unknown literals can be equal.
if ( NodeFunctions.sameTerm(node1, node2) )
return Expr.CMP_EQUAL ;
if ( sortOrderingCompare )
return NodeUtils.compareRDFTerms(node1, node2) ;
raise(new ExprNotComparableException("Can't compare "+nv1+" and "+nv2)) ;
throw new ARQInternalErrorException("NodeValue.raise returned") ;
}
case VSPACE_DIFFERENT:
// Two literals, from different known value spaces
if ( sortOrderingCompare )
return NodeUtils.compareRDFTerms(nv1.asNode(), nv2.asNode()) ;
raise(new ExprNotComparableException("Can't compare (incompatible value spaces)"+nv1+" and "+nv2)) ;
throw new ARQInternalErrorException("NodeValue.raise returned") ;
}
throw new ARQInternalErrorException("Compare failure "+nv1+" and "+nv2) ;
}