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 2015/10/12 19:15:54 UTC
[4/4] jena git commit: JENA-1047: Rename to CastXSD
JENA-1047: Rename to CastXSD
Project: http://git-wip-us.apache.org/repos/asf/jena/repo
Commit: http://git-wip-us.apache.org/repos/asf/jena/commit/d3180b5e
Tree: http://git-wip-us.apache.org/repos/asf/jena/tree/d3180b5e
Diff: http://git-wip-us.apache.org/repos/asf/jena/diff/d3180b5e
Branch: refs/heads/master
Commit: d3180b5e75b8842cb201fa2bc73843025957ba70
Parents: 5156ba6
Author: Andy Seaborne <an...@apache.org>
Authored: Mon Oct 12 18:15:34 2015 +0100
Committer: Andy Seaborne <an...@apache.org>
Committed: Mon Oct 12 18:15:34 2015 +0100
----------------------------------------------------------------------
.../apache/jena/sparql/function/CastXSD.java | 317 +++++++++++++++++++
.../apache/jena/sparql/function/CastXSD2.java | 317 -------------------
.../jena/sparql/function/StandardFunctions.java | 6 +-
3 files changed, 320 insertions(+), 320 deletions(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/jena/blob/d3180b5e/jena-arq/src/main/java/org/apache/jena/sparql/function/CastXSD.java
----------------------------------------------------------------------
diff --git a/jena-arq/src/main/java/org/apache/jena/sparql/function/CastXSD.java b/jena-arq/src/main/java/org/apache/jena/sparql/function/CastXSD.java
new file mode 100644
index 0000000..b3c3837
--- /dev/null
+++ b/jena-arq/src/main/java/org/apache/jena/sparql/function/CastXSD.java
@@ -0,0 +1,317 @@
+/**
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.apache.jena.sparql.function;
+
+import java.math.BigDecimal ;
+import java.math.BigInteger ;
+import java.util.Objects ;
+
+import javax.xml.datatype.DatatypeConstants ;
+import javax.xml.datatype.Duration ;
+
+import org.apache.jena.datatypes.xsd.XSDDatatype ;
+import org.apache.jena.datatypes.xsd.impl.XSDAbstractDateTimeType ;
+import org.apache.jena.datatypes.xsd.impl.XSDBaseNumericType ;
+import org.apache.jena.graph.Node ;
+import org.apache.jena.sparql.expr.ExprEvalException ;
+import org.apache.jena.sparql.expr.ExprEvalTypeException ;
+import org.apache.jena.sparql.expr.ExprException ;
+import org.apache.jena.sparql.expr.NodeValue ;
+import org.apache.jena.sparql.expr.nodevalue.XSDFuncOp ;
+
+public class CastXSD extends FunctionBase1 implements FunctionFactory {
+
+ protected final XSDDatatype castType ;
+
+ public CastXSD(XSDDatatype dt)
+ {
+ this.castType = dt ;
+ }
+
+ @Override
+ public Function create(String uri)
+ {
+ return this ;
+ }
+
+ @Override
+ public NodeValue exec(NodeValue v)
+ {
+ return cast(v, castType) ;
+ }
+
+
+ private static boolean isTemporalDatatype(XSDDatatype datatype) {
+ return
+ datatype.equals(XSDDatatype.XSDdateTime) ||
+ datatype.equals(XSDDatatype.XSDtime) ||
+ datatype.equals(XSDDatatype.XSDdate) ||
+ datatype.equals(XSDDatatype.XSDgYear) ||
+ datatype.equals(XSDDatatype.XSDgYearMonth) ||
+ datatype.equals(XSDDatatype.XSDgMonth) ||
+ datatype.equals(XSDDatatype.XSDgMonthDay) ||
+ datatype.equals(XSDDatatype.XSDgDay) ;
+ }
+
+ private static boolean isDurationDatatype(XSDDatatype datatype) {
+ return
+ datatype.equals(XSDDatatype.XSDduration) ||
+ datatype.equals(XSDDatatype.XSDyearMonthDuration) ||
+ datatype.equals(XSDDatatype.XSDdayTimeDuration ) ;
+ }
+
+ /** Cast a NodeValue to an XSD datatype.
+ * This includes "by value" so 1e0 (an xsd:double) casts to 1 (an xsd:intger)
+ * @param nv
+ * @param castType
+ * @return NodeValue
+ * @throws ExprEvalException
+ */
+ public static NodeValue cast(NodeValue nv, XSDDatatype castType) {
+ // http://www.w3.org/TR/xpath-functions/#casting
+ Node n = nv.asNode() ;
+
+ if ( n.isBlank() )
+ throw exception("Can't cast blank nodes: "+nv) ;
+
+ if ( n.isURI() ) {
+ if ( castType.equals(XSDDatatype.XSDstring) )
+ return cast$(n.getURI(), castType) ;
+ else
+ throw exception("Can't cast URIs to "+castType.getURI()) ;
+ }
+
+ if ( ! n.isLiteral() )
+ throw exception("Can't cast (not a literal, nor URI to string) "+nv+" : "+castType.getURI()) ;
+
+ // It's a literal.
+
+ // Cast to self but may be an invalid lexical form.
+ if ( Objects.equals(nv.getNode().getLiteralDatatype(), castType) ) {
+ String lex = nv.getNode().getLiteralLexicalForm() ;
+ if ( castType.isValid(lex) )
+ return nv ;
+ throw exception("Invalid lexical form for "+castType.getURI()) ;
+ }
+
+
+ // Many casts can be done by testing the lexical is valid for the datatype.
+ // But some cases need to consider values.
+ // e.g. boolean -> numeric , double -> integer (doubles have "e" in them)
+
+ // To a temporal
+ if ( isTemporalDatatype(castType) ) {
+ return XSDFuncOp.dateTimeCast(nv, castType) ;
+ }
+
+ if ( isDurationDatatype(castType) ) {
+ // Duration cast.
+ // yearMonthDuration and TT is xs:dayTimeDuration -> 0.0S
+ // xs:dayTimeDuration and TT is yearMonthDuration -> P0M
+
+ if ( nv.isDuration() ) {
+ Duration d = nv.getDuration() ;
+ if ( castType.equals(XSDDatatype.XSDyearMonthDuration) ) {
+
+ // Include xsd:duration only covering year-month.
+ if ( nv.isDayTimeDuration() )
+ return NodeValue.makeNode("P0M", castType) ;
+
+ Duration d2 = NodeValue.xmlDatatypeFactory.newDuration
+ (d.getSign()>=0,
+ (BigInteger)d.getField(DatatypeConstants.YEARS), (BigInteger)d.getField(DatatypeConstants.MONTHS), null,
+ null, null, null) ;
+ return NodeValue.makeNode(d2.toString(), castType) ;
+ }
+ if ( castType.equals(XSDDatatype.XSDdayTimeDuration) ) {
+ if ( nv.isYearMonthDuration() )
+ return NodeValue.makeNode("PT0S", castType) ;
+ Duration d2 = NodeValue.xmlDatatypeFactory.newDuration
+
+ (d.getSign()>=0,
+ null, null, (BigInteger)d.getField(DatatypeConstants.DAYS),
+ (BigInteger)d.getField(DatatypeConstants.HOURS), (BigInteger)d.getField(DatatypeConstants.MINUTES), (BigDecimal)d.getField(DatatypeConstants.SECONDS)) ;
+ // return NodeValue.makeDuration(d2) ;
+ return NodeValue.makeNode(d2.toString(), castType) ;
+ }
+ }
+ }
+
+ // From number, can consider value.
+ if ( nv.isNumber() ) {
+ if ( castType.equals(XSDDatatype.XSDdecimal) ) {
+ // Number to decimal.
+ if ( isDouble(nv) || isFloat(nv) ) {
+ // FP to decimal.
+ double d = nv.getDouble() ;
+ if ( Double.isNaN(d) )
+ throw exception("Can't cast NaN to xsd:decimal") ;
+ if ( Double.isInfinite(d) )
+ throw exception("Can't cast Inf or -Inf to xsd:decimal") ;
+ // BigDecimal.valueOf(d) can lead to trailing zeros
+ // BigDecimal.valueOf(d) goes via strings.
+ String lex = doubleToDecimalString(d) ;
+ return NodeValue.makeDecimal(lex) ;
+ }
+ // Integer, or derived type -> decimal.
+ return castByLex(nv, castType) ;
+ }
+ if ( XSDFuncOp.isIntegerType(castType) ) {
+ // Number to integer
+ if ( isDouble(nv) || isFloat(nv) ) {
+ // FP to integer
+ double d = nv.getDouble() ;
+ boolean isIntegerValue = ( Math.rint(d) == d ) ;
+ if ( isIntegerValue ) {
+ String lex = doubleIntegerToString(d) ;
+ if ( lex != null )
+ return castByLex(lex, castType) ;
+ }
+ throw exception(nv, castType) ;
+ } else if ( isDecimal(nv) ) {
+ // Decimal to integer
+ BigDecimal bd = nv.getDecimal() ;
+ try {
+ // Exception on fraction.
+ BigInteger bi = bd.toBigIntegerExact() ;
+ return castByLex(bi.toString(), castType) ;
+ } catch (ArithmeticException ex) {
+ throw new ExprEvalException("CastXSD: Not a valid cast: '"+nv+"'") ;
+ }
+ } else {
+ // Integer derived type -> integer derived type.
+ return castByLex(nv, castType) ;
+ }
+ }
+ }
+
+ // Boolean -> xsd:
+ if ( nv.isBoolean() ) {
+ boolean b = nv.getBoolean() ;
+ // Boolean to boolean covered above.
+ String lex ;
+ if ( XSDDatatype.XSDfloat.equals(castType) || XSDDatatype.XSDdouble.equals(castType) )
+ return cast$( ( b ? "1.0E0" : "0.0E0" ) , castType) ;
+ else if ( XSDDatatype.XSDdecimal.equals(castType) )
+ return cast$( ( b ? "1.0" : "0.0" ) , castType) ;
+ else if ( XSDFuncOp.isIntegerType(castType))
+ return cast$( ( b ? "1" : "0" ) , castType ) ;
+ else if ( XSDDatatype.XSDstring.equals(castType) )
+ return cast$( nv.getNode().getLiteralLexicalForm(), castType ) ;
+ throw exception("Can't cast xsd:boolean to "+castType) ;
+ }
+
+ // Try by lexical
+ return castByLex(nv, castType) ;
+ }
+
+ /** Presentation form of an XSD datatype URI */
+ private static String xsdName(String datatype) {
+ return datatype.replaceAll(XSDDatatype.XSD+"#", "xsd:") ;
+ }
+
+ /** Test to see if a NodeValue is a valid double value and is of datatype xsd:double. */
+ private static boolean isDouble(NodeValue nv) {
+ return nv.isDouble() && nv.getDatatypeURI().equals(XSDDatatype.XSDdouble.getURI()) ;
+ }
+
+ /** Test to see if a NodeValue is a valid float value and is of datatype float. */
+ private static boolean isFloat(NodeValue nv) {
+ return nv.isFloat() && nv.getDatatypeURI().equals(XSDDatatype.XSDfloat.getURI()) ;
+ }
+
+ /** Test to see if a NodeValue is a valid decimal value and is of datatype decimal. */
+ private static boolean isDecimal(NodeValue nv) {
+ return nv.isDecimal() && nv.getDatatypeURI().equals(XSDDatatype.XSDdecimal.getURI()) ;
+ }
+
+ /** Test to see if a NodeValue is a valid numeric value. */
+ private static boolean isNumeric(NodeValue nv) {
+ return nv.isNumber() ;
+ }
+
+ private static ExprException exception(NodeValue nv, XSDDatatype dt) {
+ return exception("Invalid cast: "+nv+" -> "+xsdName(dt.getURI())) ;
+ }
+
+ private static ExprException exception(String msg) {
+ return new ExprEvalTypeException(msg) ;
+ }
+
+ // Cast by lexical form with checking.
+ private static NodeValue castByLex(NodeValue nv, XSDDatatype castType) {
+ String lex = nv.getNode().getLiteralLexicalForm() ;
+ return castByLex(lex, castType) ;
+ }
+
+ // Cast by lexical form with checking.
+ private static NodeValue castByLex(String lex, XSDDatatype castType) {
+ if ( ! castType.isValid(lex) )
+ throw exception("Invalid lexical form: '"+lex+"' for "+castType.getURI()) ;
+ if ( castType instanceof XSDBaseNumericType ||
+ castType.equals(XSDDatatype.XSDfloat) ||
+ castType.equals(XSDDatatype.XSDdouble) ||
+ castType.equals(XSDDatatype.XSDboolean) ||
+ castType instanceof XSDAbstractDateTimeType ) // Includes durations, and Gregorian
+ {
+ // More helpful error message.
+ if ( lex.startsWith(" ") || lex.endsWith(" ") )
+ throw exception("Not a valid literal form (has whitespace): '"+lex+"'") ;
+ }
+ return NodeValue.makeNode(lex, castType) ;
+
+ }
+
+ // Known to work casts. No checking.
+ private static NodeValue cast$(String lex, XSDDatatype castType) {
+ return NodeValue.makeNode(lex, castType) ;
+ }
+
+ // Return the integer lexical form for a double, where the double is known to be integer valued.
+ private static String doubleIntegerToString(double d) {
+ // Fast path
+ long x = Math.round(d) ;
+ if ( x != Long.MAX_VALUE && x != Long.MIN_VALUE )
+ return Long.toString(x) ;
+
+ String lex = BigDecimal.valueOf(d).toPlainString() ;
+ int i = lex.indexOf('.') ;
+ if ( i >= 0 )
+ // Adds .0 for some (small) doubles.
+ lex = lex.substring(0, i) ;
+ return lex;
+ }
+
+ // Return the decimal lexical form for a double value.
+ // Java big decimal allows "E" forms, XSD does not.
+ private static String doubleToDecimalString(double d) {
+ // BigDecimal.valueOf(d) can lead to trailing zeros.
+ String lex = BigDecimal.valueOf(d).toPlainString() ;
+ // Clean the string.
+ int i = lex.indexOf('.') ;
+ if ( i < 0 )
+ return lex ;
+ // Often one or two
+ while(lex.endsWith("00"))
+ lex = lex.substring(0, lex.length()-2) ;
+ while(lex.endsWith("0"))
+ lex = lex.substring(0, lex.length()-1) ;
+ return lex ;
+ }
+}
\ No newline at end of file
http://git-wip-us.apache.org/repos/asf/jena/blob/d3180b5e/jena-arq/src/main/java/org/apache/jena/sparql/function/CastXSD2.java
----------------------------------------------------------------------
diff --git a/jena-arq/src/main/java/org/apache/jena/sparql/function/CastXSD2.java b/jena-arq/src/main/java/org/apache/jena/sparql/function/CastXSD2.java
deleted file mode 100644
index 6d742b3..0000000
--- a/jena-arq/src/main/java/org/apache/jena/sparql/function/CastXSD2.java
+++ /dev/null
@@ -1,317 +0,0 @@
-/**
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements. See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership. The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License. You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package org.apache.jena.sparql.function;
-
-import java.math.BigDecimal ;
-import java.math.BigInteger ;
-import java.util.Objects ;
-
-import javax.xml.datatype.DatatypeConstants ;
-import javax.xml.datatype.Duration ;
-
-import org.apache.jena.datatypes.xsd.XSDDatatype ;
-import org.apache.jena.datatypes.xsd.impl.XSDAbstractDateTimeType ;
-import org.apache.jena.datatypes.xsd.impl.XSDBaseNumericType ;
-import org.apache.jena.graph.Node ;
-import org.apache.jena.sparql.expr.ExprEvalException ;
-import org.apache.jena.sparql.expr.ExprEvalTypeException ;
-import org.apache.jena.sparql.expr.ExprException ;
-import org.apache.jena.sparql.expr.NodeValue ;
-import org.apache.jena.sparql.expr.nodevalue.XSDFuncOp ;
-
-public class CastXSD2 extends FunctionBase1 implements FunctionFactory {
-
- protected final XSDDatatype castType ;
-
- public CastXSD2(XSDDatatype dt)
- {
- this.castType = dt ;
- }
-
- @Override
- public Function create(String uri)
- {
- return this ;
- }
-
- @Override
- public NodeValue exec(NodeValue v)
- {
- return cast(v, castType) ;
- }
-
-
- private static boolean isTemporalDatatype(XSDDatatype datatype) {
- return
- datatype.equals(XSDDatatype.XSDdateTime) ||
- datatype.equals(XSDDatatype.XSDtime) ||
- datatype.equals(XSDDatatype.XSDdate) ||
- datatype.equals(XSDDatatype.XSDgYear) ||
- datatype.equals(XSDDatatype.XSDgYearMonth) ||
- datatype.equals(XSDDatatype.XSDgMonth) ||
- datatype.equals(XSDDatatype.XSDgMonthDay) ||
- datatype.equals(XSDDatatype.XSDgDay) ;
- }
-
- private static boolean isDurationDatatype(XSDDatatype datatype) {
- return
- datatype.equals(XSDDatatype.XSDduration) ||
- datatype.equals(XSDDatatype.XSDyearMonthDuration) ||
- datatype.equals(XSDDatatype.XSDdayTimeDuration ) ;
- }
-
- /** Cast a NodeValue to an XSD datatype.
- * This includes "by value" so 1e0 (an xsd:double) casts to 1 (an xsd:intger)
- * @param nv
- * @param castType
- * @return NodeValue
- * @throws ExprEvalException
- */
- public static NodeValue cast(NodeValue nv, XSDDatatype castType) {
- // http://www.w3.org/TR/xpath-functions/#casting
- Node n = nv.asNode() ;
-
- if ( n.isBlank() )
- throw exception("Can't cast blank nodes: "+nv) ;
-
- if ( n.isURI() ) {
- if ( castType.equals(XSDDatatype.XSDstring) )
- return cast$(n.getURI(), castType) ;
- else
- throw exception("Can't cast URIs to "+castType.getURI()) ;
- }
-
- if ( ! n.isLiteral() )
- throw exception("Can't cast (not a literal, nor URI to string) "+nv+" : "+castType.getURI()) ;
-
- // It's a literal.
-
- // Cast to self but may be an invalid lexical form.
- if ( Objects.equals(nv.getNode().getLiteralDatatype(), castType) ) {
- String lex = nv.getNode().getLiteralLexicalForm() ;
- if ( castType.isValid(lex) )
- return nv ;
- throw exception("Invalid lexical form for "+castType.getURI()) ;
- }
-
-
- // Many casts can be done by testing the lexical is valid for the datatype.
- // But some cases need to consider values.
- // e.g. boolean -> numeric , double -> integer (doubles have "e" in them)
-
- // To a temporal
- if ( isTemporalDatatype(castType) ) {
- return XSDFuncOp.dateTimeCast(nv, castType) ;
- }
-
- if ( isDurationDatatype(castType) ) {
- // Duration cast.
- // yearMonthDuration and TT is xs:dayTimeDuration -> 0.0S
- // xs:dayTimeDuration and TT is yearMonthDuration -> P0M
-
- if ( nv.isDuration() ) {
- Duration d = nv.getDuration() ;
- if ( castType.equals(XSDDatatype.XSDyearMonthDuration) ) {
-
- // Include xsd:duration only covering year-month.
- if ( nv.isDayTimeDuration() )
- return NodeValue.makeNode("P0M", castType) ;
-
- Duration d2 = NodeValue.xmlDatatypeFactory.newDuration
- (d.getSign()>=0,
- (BigInteger)d.getField(DatatypeConstants.YEARS), (BigInteger)d.getField(DatatypeConstants.MONTHS), null,
- null, null, null) ;
- return NodeValue.makeNode(d2.toString(), castType) ;
- }
- if ( castType.equals(XSDDatatype.XSDdayTimeDuration) ) {
- if ( nv.isYearMonthDuration() )
- return NodeValue.makeNode("PT0S", castType) ;
- Duration d2 = NodeValue.xmlDatatypeFactory.newDuration
-
- (d.getSign()>=0,
- null, null, (BigInteger)d.getField(DatatypeConstants.DAYS),
- (BigInteger)d.getField(DatatypeConstants.HOURS), (BigInteger)d.getField(DatatypeConstants.MINUTES), (BigDecimal)d.getField(DatatypeConstants.SECONDS)) ;
- // return NodeValue.makeDuration(d2) ;
- return NodeValue.makeNode(d2.toString(), castType) ;
- }
- }
- }
-
- // From number, can consider value.
- if ( nv.isNumber() ) {
- if ( castType.equals(XSDDatatype.XSDdecimal) ) {
- // Number to decimal.
- if ( isDouble(nv) || isFloat(nv) ) {
- // FP to decimal.
- double d = nv.getDouble() ;
- if ( Double.isNaN(d) )
- throw exception("Can't cast NaN to xsd:decimal") ;
- if ( Double.isInfinite(d) )
- throw exception("Can't cast Inf or -Inf to xsd:decimal") ;
- // BigDecimal.valueOf(d) can lead to trailing zeros
- // BigDecimal.valueOf(d) goes via strings.
- String lex = doubleToDecimalString(d) ;
- return NodeValue.makeDecimal(lex) ;
- }
- // Integer, or derived type -> decimal.
- return castByLex(nv, castType) ;
- }
- if ( XSDFuncOp.isIntegerType(castType) ) {
- // Number to integer
- if ( isDouble(nv) || isFloat(nv) ) {
- // FP to integer
- double d = nv.getDouble() ;
- boolean isIntegerValue = ( Math.rint(d) == d ) ;
- if ( isIntegerValue ) {
- String lex = doubleIntegerToString(d) ;
- if ( lex != null )
- return castByLex(lex, castType) ;
- }
- throw exception(nv, castType) ;
- } else if ( isDecimal(nv) ) {
- // Decimal to integer
- BigDecimal bd = nv.getDecimal() ;
- try {
- // Exception on fraction.
- BigInteger bi = bd.toBigIntegerExact() ;
- return castByLex(bi.toString(), castType) ;
- } catch (ArithmeticException ex) {
- throw new ExprEvalException("CastXSD: Not a valid cast: '"+nv+"'") ;
- }
- } else {
- // Integer derived type -> integer derived type.
- return castByLex(nv, castType) ;
- }
- }
- }
-
- // Boolean -> xsd:
- if ( nv.isBoolean() ) {
- boolean b = nv.getBoolean() ;
- // Boolean to boolean covered above.
- String lex ;
- if ( XSDDatatype.XSDfloat.equals(castType) || XSDDatatype.XSDdouble.equals(castType) )
- return cast$( ( b ? "1.0E0" : "0.0E0" ) , castType) ;
- else if ( XSDDatatype.XSDdecimal.equals(castType) )
- return cast$( ( b ? "1.0" : "0.0" ) , castType) ;
- else if ( XSDFuncOp.isIntegerType(castType))
- return cast$( ( b ? "1" : "0" ) , castType ) ;
- else if ( XSDDatatype.XSDstring.equals(castType) )
- return cast$( nv.getNode().getLiteralLexicalForm(), castType ) ;
- throw exception("Can't cast xsd:boolean to "+castType) ;
- }
-
- // Try by lexical
- return castByLex(nv, castType) ;
- }
-
- /** Presentation form of an XSD datatype URI */
- private static String xsdName(String datatype) {
- return datatype.replaceAll(XSDDatatype.XSD+"#", "xsd:") ;
- }
-
- /** Test to see if a NodeValue is a valid double value and is of datatype xsd:double. */
- private static boolean isDouble(NodeValue nv) {
- return nv.isDouble() && nv.getDatatypeURI().equals(XSDDatatype.XSDdouble.getURI()) ;
- }
-
- /** Test to see if a NodeValue is a valid float value and is of datatype float. */
- private static boolean isFloat(NodeValue nv) {
- return nv.isFloat() && nv.getDatatypeURI().equals(XSDDatatype.XSDfloat.getURI()) ;
- }
-
- /** Test to see if a NodeValue is a valid decimal value and is of datatype decimal. */
- private static boolean isDecimal(NodeValue nv) {
- return nv.isDecimal() && nv.getDatatypeURI().equals(XSDDatatype.XSDdecimal.getURI()) ;
- }
-
- /** Test to see if a NodeValue is a valid numeric value. */
- private static boolean isNumeric(NodeValue nv) {
- return nv.isNumber() ;
- }
-
- private static ExprException exception(NodeValue nv, XSDDatatype dt) {
- return exception("Invalid cast: "+nv+" -> "+xsdName(dt.getURI())) ;
- }
-
- private static ExprException exception(String msg) {
- return new ExprEvalTypeException(msg) ;
- }
-
- // Cast by lexical form with checking.
- private static NodeValue castByLex(NodeValue nv, XSDDatatype castType) {
- String lex = nv.getNode().getLiteralLexicalForm() ;
- return castByLex(lex, castType) ;
- }
-
- // Cast by lexical form with checking.
- private static NodeValue castByLex(String lex, XSDDatatype castType) {
- if ( ! castType.isValid(lex) )
- throw exception("Invalid lexical form: '"+lex+"' for "+castType.getURI()) ;
- if ( castType instanceof XSDBaseNumericType ||
- castType.equals(XSDDatatype.XSDfloat) ||
- castType.equals(XSDDatatype.XSDdouble) ||
- castType.equals(XSDDatatype.XSDboolean) ||
- castType instanceof XSDAbstractDateTimeType ) // Includes durations, and Gregorian
- {
- // More helpful error message.
- if ( lex.startsWith(" ") || lex.endsWith(" ") )
- throw exception("Not a valid literal form (has whitespace): '"+lex+"'") ;
- }
- return NodeValue.makeNode(lex, castType) ;
-
- }
-
- // Known to work casts. No checking.
- private static NodeValue cast$(String lex, XSDDatatype castType) {
- return NodeValue.makeNode(lex, castType) ;
- }
-
- // Return the integer lexical form for a double, where the double is known to be integer valued.
- private static String doubleIntegerToString(double d) {
- // Fast path
- long x = Math.round(d) ;
- if ( x != Long.MAX_VALUE && x != Long.MIN_VALUE )
- return Long.toString(x) ;
-
- String lex = BigDecimal.valueOf(d).toPlainString() ;
- int i = lex.indexOf('.') ;
- if ( i >= 0 )
- // Adds .0 for some (small) doubles.
- lex = lex.substring(0, i) ;
- return lex;
- }
-
- // Return the decimal lexical form for a double value.
- // Java big decimal allows "E" forms, XSD does not.
- private static String doubleToDecimalString(double d) {
- // BigDecimal.valueOf(d) can lead to trailing zeros.
- String lex = BigDecimal.valueOf(d).toPlainString() ;
- // Clean the string.
- int i = lex.indexOf('.') ;
- if ( i < 0 )
- return lex ;
- // Often one or two
- while(lex.endsWith("00"))
- lex = lex.substring(0, lex.length()-2) ;
- while(lex.endsWith("0"))
- lex = lex.substring(0, lex.length()-1) ;
- return lex ;
- }
-}
\ No newline at end of file
http://git-wip-us.apache.org/repos/asf/jena/blob/d3180b5e/jena-arq/src/main/java/org/apache/jena/sparql/function/StandardFunctions.java
----------------------------------------------------------------------
diff --git a/jena-arq/src/main/java/org/apache/jena/sparql/function/StandardFunctions.java b/jena-arq/src/main/java/org/apache/jena/sparql/function/StandardFunctions.java
index a988bdd..ac0dbe1 100644
--- a/jena-arq/src/main/java/org/apache/jena/sparql/function/StandardFunctions.java
+++ b/jena-arq/src/main/java/org/apache/jena/sparql/function/StandardFunctions.java
@@ -116,17 +116,17 @@ public class StandardFunctions
private static void addCastXSD(FunctionRegistry registry, XSDDatatype dt)
{
- registry.put(dt.getURI(), new CastXSD2(dt) ) ;
+ registry.put(dt.getURI(), new CastXSD(dt) ) ;
}
private static void addCastNumeric(FunctionRegistry registry, XSDDatatype dt)
{
- registry.put(dt.getURI(), new CastXSD2(dt) ) ;
+ registry.put(dt.getURI(), new CastXSD(dt) ) ;
}
private static void addCastTemporal(FunctionRegistry registry, XSDDatatype dt)
{
- registry.put(dt.getURI(), new CastXSD2(dt) ) ;
+ registry.put(dt.getURI(), new CastXSD(dt) ) ;
}
private static void add(FunctionRegistry registry, String uri, Class<?> funcClass)