def numeric(expr): """ return a number from a literal http://www.w3.org/TR/xpath20/#promotion or TypeError """ if not isinstance(expr, Literal): raise SPARQLTypeError("%r is not a literal!" % expr) if expr.datatype not in ( XSD.float, XSD.double, XSD.decimal, XSD.integer, XSD.nonPositiveInteger, XSD.negativeInteger, XSD.nonNegativeInteger, XSD.positiveInteger, XSD.unsignedLong, XSD.unsignedInt, XSD.unsignedShort, XSD.unsignedByte, XSD.long, XSD.int, XSD.short, XSD.byte, ): raise SPARQLTypeError("%r does not have a numeric datatype!" % expr) return expr.toPython()
def EBV(rt): """ Effective Boolean Value (EBV) * If the argument is a typed literal with a datatype of xsd:boolean, the EBV is the value of that argument. * If the argument is a plain literal or a typed literal with a datatype of xsd:string, the EBV is false if the operand value has zero length; otherwise the EBV is true. * If the argument is a numeric type or a typed literal with a datatype derived from a numeric type, the EBV is false if the operand value is NaN or is numerically equal to zero; otherwise the EBV is true. * All other arguments, including unbound arguments, produce a type error. """ if isinstance(rt, Literal): if rt.datatype == XSD.boolean: return rt.toPython() elif rt.datatype == XSD.string or rt.datatype is None: return len(rt) > 0 else: pyRT = rt.toPython() if isinstance(pyRT, Literal): # Type error, see: http://www.w3.org/TR/rdf-sparql-query/#ebv raise SPARQLTypeError( "http://www.w3.org/TR/rdf-sparql-query/#ebv - ' + \ 'Could not determine the EBV for : %r" % rt ) else: return bool(pyRT) else: raise SPARQLTypeError( "http://www.w3.org/TR/rdf-sparql-query/#ebv - ' + \ 'Only literals have Boolean values! %r" % rt )