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 2016/04/11 13:19:21 UTC

[3/5] jena git commit: Tests for sprintf are now Locale dependent (compatible with the implementation of the function) Sprintf accepts any number of value argument. Classes that we don't know how to sprintf will be printed as strings.

Tests for sprintf are now Locale dependent (compatible with the implementation of the function)
Sprintf accepts any number of value argument.
Classes that we don't know how to sprintf will be printed as strings.


Project: http://git-wip-us.apache.org/repos/asf/jena/repo
Commit: http://git-wip-us.apache.org/repos/asf/jena/commit/bf14c982
Tree: http://git-wip-us.apache.org/repos/asf/jena/tree/bf14c982
Diff: http://git-wip-us.apache.org/repos/asf/jena/diff/bf14c982

Branch: refs/heads/master
Commit: bf14c982b8ae3eb8f040f55c28f8262efb5dad01
Parents: a0cea2c
Author: ales004 <ci...@hotmail.com>
Authored: Sun Apr 10 20:22:39 2016 +0200
Committer: ales004 <ci...@hotmail.com>
Committed: Sun Apr 10 20:22:39 2016 +0200

----------------------------------------------------------------------
 .../jena/sparql/expr/nodevalue/XSDFuncOp.java   | 80 +++++++++++---------
 .../jena/sparql/function/library/sprintf.java   | 15 ++--
 .../apache/jena/sparql/expr/TestFunctions.java  |  9 ++-
 3 files changed, 59 insertions(+), 45 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/jena/blob/bf14c982/jena-arq/src/main/java/org/apache/jena/sparql/expr/nodevalue/XSDFuncOp.java
----------------------------------------------------------------------
diff --git a/jena-arq/src/main/java/org/apache/jena/sparql/expr/nodevalue/XSDFuncOp.java b/jena-arq/src/main/java/org/apache/jena/sparql/expr/nodevalue/XSDFuncOp.java
index f3ddbde..8030525 100644
--- a/jena-arq/src/main/java/org/apache/jena/sparql/expr/nodevalue/XSDFuncOp.java
+++ b/jena-arq/src/main/java/org/apache/jena/sparql/expr/nodevalue/XSDFuncOp.java
@@ -33,6 +33,7 @@ import static org.apache.jena.sparql.expr.nodevalue.NumericType.OP_INTEGER ;
 
 import java.math.BigDecimal ;
 import java.math.BigInteger ;
+import java.util.ArrayList;
 import java.util.HashSet ;
 import java.util.List ;
 import java.util.Set ;
@@ -353,42 +354,46 @@ public class XSDFuncOp
     }
 
     // expecting nvString = format | nvStart = value (int,float, string,....)
-    public static NodeValue javaSprintf(NodeValue nvFormat, NodeValue nvValue) {
+    public static NodeValue javaSprintf(NodeValue nvFormat, List<NodeValue> valuesToPrint) {
         try {
             String formatForOutput = nvFormat.getString() ;
-            ValueSpaceClassification vlSpClass = nvValue.getValueSpace();
-            switch(vlSpClass){
-                case VSPACE_NUM:
-                    NumericType type = classifyNumeric("javaSprintf",nvValue);
-                    switch(type) {
-                        case OP_DECIMAL:
-                            BigDecimal decimalValue = nvValue.getDecimal();
-                            return NodeValue.makeString(String.format(formatForOutput,decimalValue)) ;
-                        case OP_INTEGER:
-                            BigInteger integerValue = nvValue.getInteger();
-                            return NodeValue.makeString(String.format(formatForOutput,integerValue)) ;
-                        case OP_DOUBLE:
-                            Double doubValue = nvValue.getDouble();
-                            return NodeValue.makeString(String.format(formatForOutput,doubValue)) ;
-                        case OP_FLOAT:
-                            Float floatValue = nvValue.getFloat();
-                            return NodeValue.makeString(String.format(formatForOutput,floatValue)) ;
-                    }
-                case VSPACE_DATE:
-                case VSPACE_DATETIME:
-                    XMLGregorianCalendar gregorianCalendarValue = nvValue.getDateTime();
-                    return NodeValue.makeString(String.format(formatForOutput,gregorianCalendarValue.toGregorianCalendar().getTime())) ;
-                case VSPACE_STRING:
-                    String strValue = nvValue.getString();
-                    return NodeValue.makeString(String.format(formatForOutput,strValue));
-                case VSPACE_BOOLEAN:
-                    Boolean boolValue = nvValue.getBoolean();
-                    return NodeValue.makeString(String.format(formatForOutput,boolValue));
-                case VSPACE_LANG:
-                    String langValue = nvValue.getLang();
-                    return NodeValue.makeString(String.format(formatForOutput,langValue));
-                default:
-/*              These cases for the moment are not supported. Maybe we could treat them all like strings.
+            List<Object> objVals = new ArrayList<>();
+            for(NodeValue nvValue:valuesToPrint) {
+                ValueSpaceClassification vlSpClass = nvValue.getValueSpace();
+                switch (vlSpClass) {
+                    case VSPACE_NUM:
+                        NumericType type = classifyNumeric("javaSprintf", nvValue);
+                        switch (type) {
+                            case OP_DECIMAL:
+                                objVals.add(nvValue.getDecimal());
+                                break;
+                            case OP_INTEGER:
+                                objVals.add(nvValue.getInteger());
+                                break;
+                            case OP_DOUBLE:
+                                objVals.add(nvValue.getDouble());
+                                break;
+                            case OP_FLOAT:
+                                objVals.add(nvValue.getFloat());
+                                break;
+                        }
+                        break;
+                    case VSPACE_DATE:
+                    case VSPACE_DATETIME:
+                        XMLGregorianCalendar gregorianCalendarValue = nvValue.getDateTime();
+                        objVals.add(gregorianCalendarValue.toGregorianCalendar().getTime());
+                        break;
+                    case VSPACE_STRING:
+                        objVals.add(nvValue.getString());
+                        break;
+                    case VSPACE_BOOLEAN:
+                        objVals.add(nvValue.getBoolean());
+                        break;
+                    case VSPACE_LANG:
+                        objVals.add(nvValue.getLang());
+                        break;
+                    default:
+/*              These cases for the moment are not supported. We treat them all like strings.
                 case VSPACE_NODE:
                 case VSPACE_TIME:
                 case VSPACE_G_DAY:
@@ -399,8 +404,13 @@ public class XSDFuncOp
                 case VSPACE_DURATION:
                 case VSPACE_UNKNOWN:
 */
-                    throw new ARQInternalErrorException("Unrecognized sprintf type, value: "+nvValue);
+                        objVals.add(NodeFunctions.str(nvValue));
+                        break;
+                }
             }
+
+            return NodeValue.makeString(String.format(formatForOutput,objVals.toArray()));
+
         } catch (IndexOutOfBoundsException ex) {
             throw new ExprEvalException("IndexOutOfBounds", ex) ;
         }

http://git-wip-us.apache.org/repos/asf/jena/blob/bf14c982/jena-arq/src/main/java/org/apache/jena/sparql/function/library/sprintf.java
----------------------------------------------------------------------
diff --git a/jena-arq/src/main/java/org/apache/jena/sparql/function/library/sprintf.java b/jena-arq/src/main/java/org/apache/jena/sparql/function/library/sprintf.java
index 9a68149..0a981e7 100644
--- a/jena-arq/src/main/java/org/apache/jena/sparql/function/library/sprintf.java
+++ b/jena-arq/src/main/java/org/apache/jena/sparql/function/library/sprintf.java
@@ -8,6 +8,7 @@ import org.apache.jena.sparql.expr.NodeValue;
 import org.apache.jena.sparql.expr.nodevalue.XSDFuncOp;
 import org.apache.jena.sparql.function.FunctionBase;
 
+import java.util.ArrayList;
 import java.util.List;
 
 /** sprintf(string,string) - Java style */
@@ -18,20 +19,22 @@ public class sprintf extends FunctionBase
 
     @Override
     public void checkBuild(String uri, ExprList args) {
-        if ( args.size() != 2)
-            throw new QueryBuildException("Function '"+ Lib.className(this)+"' takes two or three arguments") ;
+        if(args.size() < 2)
+            throw new QueryBuildException("Function '"+ Lib.className(this)+"' takes at least two arguments") ;
     }
 
     @Override
     public NodeValue exec(List<NodeValue> args) {
-        if ( args.size() != 2 )
+        if ( args.size() < 2 )
             throw new ExprEvalException(Lib.className(this)+": Wrong number of arguments: "+
-                    args.size()+" : [wanted 2]") ;
+                    args.size()+" : [wanted at least 2]") ;
 
         NodeValue v1 = args.get(0) ;
-        NodeValue v2 = args.get(1) ;
+        List<NodeValue> allArgs = new ArrayList<NodeValue>();
+        for(int i = 1;i < args.size();i++)
+            allArgs.add(args.get(i));
 
-        return XSDFuncOp.javaSprintf(v1, v2) ;
+        return XSDFuncOp.javaSprintf(v1, allArgs) ;
     }
 
 }

http://git-wip-us.apache.org/repos/asf/jena/blob/bf14c982/jena-arq/src/test/java/org/apache/jena/sparql/expr/TestFunctions.java
----------------------------------------------------------------------
diff --git a/jena-arq/src/test/java/org/apache/jena/sparql/expr/TestFunctions.java b/jena-arq/src/test/java/org/apache/jena/sparql/expr/TestFunctions.java
index 535ea5f..e1643e8 100644
--- a/jena-arq/src/test/java/org/apache/jena/sparql/expr/TestFunctions.java
+++ b/jena-arq/src/test/java/org/apache/jena/sparql/expr/TestFunctions.java
@@ -82,11 +82,12 @@ public class TestFunctions
             test("afn:sprintf('%1$tm %1$te,%1$tY', "+nodeStr+")",NodeValue.makeString("10 14,2005")) ;
     }
     @Test public void exprSprintf_06()      { test("afn:sprintf('this is %s', 'false'^^xsd:boolean)",NodeValue.makeString("this is false")) ; }
-    @Test public void exprSprintf_07()      { test("afn:sprintf('this number is equal to %.2f', '11.22'^^xsd:decimal)",NodeValue.makeString("this number is equal to 11.22")) ; }
-    @Test public void exprSprintf_08()      { test("afn:sprintf('%.3f', '1.23456789'^^xsd:float)",NodeValue.makeString("1.235")) ; }
+    @Test public void exprSprintf_07()      { test("afn:sprintf('this number is equal to %.2f', '11.22'^^xsd:decimal)",NodeValue.makeString("this number is equal to "+String.format("%.2f",11.22))) ; }
+    @Test public void exprSprintf_08()      { test("afn:sprintf('%.3f', '1.23456789'^^xsd:float)",NodeValue.makeString(String.format("%.3f",1.23456789))) ; }
     @Test public void exprSprintf_09()      { test("afn:sprintf('this number is equal to %o in the octal system', '11'^^xsd:integer)",NodeValue.makeString("this number is equal to 13 in the octal system")) ; }
-    @Test public void exprSprintf_10()      { test("afn:sprintf('this number is equal to %.5f', '1.23456789'^^xsd:double)",NodeValue.makeString("this number is equal to 1.23457")) ; }
-
+    @Test public void exprSprintf_10()      { test("afn:sprintf('this number is equal to %.5f', '1.23456789'^^xsd:double)",NodeValue.makeString("this number is equal to "+String.format("%.5f",1.23456789))) ; }
+    @Test public void exprSprintf_11()      { test("afn:sprintf('%.0f != %s', '12.23456789'^^xsd:double,'15')",NodeValue.makeString("12 != 15")) ; }
+    @Test public void exprSprintf_12()      { test("afn:sprintf('(%.0f,%s,%d) %4$tm %4$te,%4$tY', '12.23456789'^^xsd:double,'12',11,'2016-03-17'^^xsd:date)",NodeValue.makeString("(12,12,11) 03 17,2016")) ; }
 
     @Test public void exprStrStart0() { test("fn:starts-with('abc', '')", TRUE) ; }
     @Test public void exprStrStart1() { test("fn:starts-with('abc', 'a')", TRUE) ; }