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:19 UTC

[1/5] jena git commit: Correct a small typo in the TestFunctions2 file.

Repository: jena
Updated Branches:
  refs/heads/master 01821ebc9 -> a5c0f6244


Correct a small typo in the TestFunctions2 file.


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

Branch: refs/heads/master
Commit: e2b7c9a9f1c922f8290c704465483e30f9178ef9
Parents: ce467aa
Author: ales004 <ci...@hotmail.com>
Authored: Thu Mar 17 21:09:47 2016 +0100
Committer: ales004 <ci...@hotmail.com>
Committed: Fri Apr 1 08:08:22 2016 +0200

----------------------------------------------------------------------
 .../test/java/org/apache/jena/sparql/expr/TestFunctions2.java  | 6 +++---
 1 file changed, 3 insertions(+), 3 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/jena/blob/e2b7c9a9/jena-arq/src/test/java/org/apache/jena/sparql/expr/TestFunctions2.java
----------------------------------------------------------------------
diff --git a/jena-arq/src/test/java/org/apache/jena/sparql/expr/TestFunctions2.java b/jena-arq/src/test/java/org/apache/jena/sparql/expr/TestFunctions2.java
index 10e1747..bd937d5 100644
--- a/jena-arq/src/test/java/org/apache/jena/sparql/expr/TestFunctions2.java
+++ b/jena-arq/src/test/java/org/apache/jena/sparql/expr/TestFunctions2.java
@@ -82,8 +82,8 @@ public class TestFunctions2 extends BaseTest
     | 'STRDT' '(' Expression ',' Expression ')'
     */
     
-    // Note in these tests, the rsult is written exactly as expected
-    // Any same value would do - we test for the exact lexcial form
+    // Note in these tests, the result is written exactly as expected
+    // Any same value would do - we test for the exact lexical form
     // of the implementation.
     
     @Test public void round_01()    { test("round(123)",    "123") ; }
@@ -289,7 +289,7 @@ public class TestFunctions2 extends BaseTest
     public void strends_20()            { test("strends(1816, '6'^^xsd:string)", "true") ; }
     @Test(expected=ExprEvalException.class)
     public void strends_21()            { test("strends('abc', 1066)", "true") ; }
-    
+
     // YEAR
     @Test public void year_01()         { test("year('2010-12-24T16:24:01.123'^^xsd:dateTime)", "2010") ; }
     @Test public void year_02()         { test("year('2010-12-24'^^xsd:date)", "2010") ; }


[5/5] jena git commit: Fast-forward from https://github.com/apache/jena/pull/132/. This closes #132.

Posted by an...@apache.org.
Fast-forward from https://github.com/apache/jena/pull/132/. This closes #132.


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

Branch: refs/heads/master
Commit: a5c0f6244104cd1673b2861ac2bad8ddcc21ea4c
Parents: 059fa04
Author: Andy Seaborne <an...@apache.org>
Authored: Mon Apr 11 12:19:03 2016 +0100
Committer: Andy Seaborne <an...@apache.org>
Committed: Mon Apr 11 12:19:03 2016 +0100

----------------------------------------------------------------------

----------------------------------------------------------------------



[2/5] jena git commit: Implemented the afn:sprintf function that uses the String.format Java function to format an input value to string. In the current implementation, the input value can be a number, a string, a date or a datetime value. Other types ar

Posted by an...@apache.org.
Implemented the afn:sprintf function that uses the String.format Java function to format an input value to string. In the current implementation, the input value can be a number, a string, a date or a datetime value. Other types are not accepted.


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

Branch: refs/heads/master
Commit: a0cea2c45a4bc9ed2cfb6601c253e702d9ff5751
Parents: e2b7c9a
Author: ales004 <ci...@hotmail.com>
Authored: Thu Mar 17 21:07:25 2016 +0100
Committer: ales004 <ci...@hotmail.com>
Committed: Fri Apr 1 08:09:10 2016 +0200

----------------------------------------------------------------------
 .../jena/sparql/expr/nodevalue/XSDFuncOp.java   | 54 ++++++++++++++++++++
 .../jena/sparql/function/library/sprintf.java   | 37 ++++++++++++++
 .../apache/jena/sparql/expr/TestFunctions.java  | 18 ++++++-
 3 files changed, 108 insertions(+), 1 deletion(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/jena/blob/a0cea2c4/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 7d95c12..f3ddbde 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
@@ -352,6 +352,60 @@ public class XSDFuncOp
         }
     }
 
+    // expecting nvString = format | nvStart = value (int,float, string,....)
+    public static NodeValue javaSprintf(NodeValue nvFormat, NodeValue nvValue) {
+        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.
+                case VSPACE_NODE:
+                case VSPACE_TIME:
+                case VSPACE_G_DAY:
+                case VSPACE_G_MONTH:
+                case VSPACE_G_MONTHDAY:
+                case VSPACE_G_YEAR:
+                case VSPACE_G_YEARMONTH:
+                case VSPACE_DURATION:
+                case VSPACE_UNKNOWN:
+*/
+                    throw new ARQInternalErrorException("Unrecognized sprintf type, value: "+nvValue);
+            }
+        } catch (IndexOutOfBoundsException ex) {
+            throw new ExprEvalException("IndexOutOfBounds", ex) ;
+        }
+    }
+
     public static NodeValue strlen(NodeValue nvString) {
         Node n = checkAndGetStringLiteral("strlen", nvString) ;
         String str = n.getLiteralLexicalForm();

http://git-wip-us.apache.org/repos/asf/jena/blob/a0cea2c4/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
new file mode 100644
index 0000000..9a68149
--- /dev/null
+++ b/jena-arq/src/main/java/org/apache/jena/sparql/function/library/sprintf.java
@@ -0,0 +1,37 @@
+package org.apache.jena.sparql.function.library;
+
+import org.apache.jena.atlas.lib.Lib;
+import org.apache.jena.query.QueryBuildException;
+import org.apache.jena.sparql.expr.ExprEvalException;
+import org.apache.jena.sparql.expr.ExprList;
+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.List;
+
+/** sprintf(string,string) - Java style */
+
+public class sprintf extends FunctionBase
+{
+    public sprintf() { super() ; }
+
+    @Override
+    public void checkBuild(String uri, ExprList args) {
+        if ( args.size() != 2)
+            throw new QueryBuildException("Function '"+ Lib.className(this)+"' takes two or three arguments") ;
+    }
+
+    @Override
+    public NodeValue exec(List<NodeValue> args) {
+        if ( args.size() != 2 )
+            throw new ExprEvalException(Lib.className(this)+": Wrong number of arguments: "+
+                    args.size()+" : [wanted 2]") ;
+
+        NodeValue v1 = args.get(0) ;
+        NodeValue v2 = args.get(1) ;
+
+        return XSDFuncOp.javaSprintf(v1, v2) ;
+    }
+
+}

http://git-wip-us.apache.org/repos/asf/jena/blob/a0cea2c4/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 db23201..535ea5f 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
@@ -71,7 +71,23 @@ public class TestFunctions
     @Test public void exprJavaSubstring4() { test("<"+ARQConstants.ARQFunctionLibrary+"substr>('abc',0,1)", NodeValue.makeString("a")) ; }
     // Test from JENA-785
     @Test public void exprJavaSubstring5() { test("afn:substr('𐐈𐑌𐐻𐐪𐑉𐐿𐐻𐐮𐐿𐐲', 0, 1)", NodeValue.makeString("𐐈")) ; }
-    
+
+    // SPRINTF
+    @Test public void exprSprintf_01()      { test("afn:sprintf('%06d', 11)",NodeValue.makeString("000011")) ; }
+    @Test public void exprSprintf_02()      { test("afn:sprintf('%s', 'abcdefghi')",NodeValue.makeString("abcdefghi")) ; }
+    @Test public void exprSprintf_03()      { test("afn:sprintf('sometext %s', 'abcdefghi')",NodeValue.makeString("sometext abcdefghi")) ; }
+    @Test public void exprSprintf_04()      { test("afn:sprintf('%1$tm %1$te,%1$tY', '2016-03-17'^^xsd:date)",NodeValue.makeString("03 17,2016")) ; }
+    @Test public void exprSprintf_05()      {
+            String nodeStr = NodeValue.makeDateTime("2005-10-14T13:09:43Z").toString();
+            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_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 exprStrStart0() { test("fn:starts-with('abc', '')", TRUE) ; }
     @Test public void exprStrStart1() { test("fn:starts-with('abc', 'a')", TRUE) ; }
     @Test public void exprStrStart2() { test("fn:starts-with('abc', 'ab')", TRUE) ; }


[4/5] jena git commit: Merge remote-tracking branch 'upstream/master'

Posted by an...@apache.org.
Merge remote-tracking branch 'upstream/master'


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

Branch: refs/heads/master
Commit: 059fa049896ec6fc0bb41db4819a8b14c740ae5b
Parents: bf14c98 01821eb
Author: ales004 <ci...@hotmail.com>
Authored: Sun Apr 10 20:26:13 2016 +0200
Committer: ales004 <ci...@hotmail.com>
Committed: Sun Apr 10 20:26:13 2016 +0200

----------------------------------------------------------------------
 .../main/java/org/apache/jena/riot/SysRIOT.java |  7 ++-
 .../sparql/core/DatasetGraphTrackActive.java    |  2 +-
 .../test/java/org/apache/jena/riot/TC_Riot.java |  2 +-
 .../org/apache/jena/riot/TS_ReaderRIOT.java     | 40 ------------
 .../org/apache/jena/riot/TS_RiotGeneral.java    | 39 ++++++++++++
 .../java/org/apache/jena/riot/TestSysRIOT.java  | 42 +++++++++++++
 jena-base/pom.xml                               |  2 +-
 .../org/apache/jena/atlas/lib/AlarmClock.java   | 11 +++-
 jena-cmds/src/main/java/arq/qexpr.java          |  7 ++-
 jena-parent/pom.xml                             | 10 +--
 .../apache/jena/tdb/store/DatasetGraphTDB.java  |  2 +-
 .../jena/tdb/transaction/NodeTableTrans.java    |  3 +-
 .../apache/jena/query/text/TextIndexConfig.java |  9 +++
 .../apache/jena/query/text/TextIndexLucene.java | 27 +++++++--
 .../query/text/TextIndexLuceneMultilingual.java |  4 +-
 .../assembler/TextIndexLuceneAssembler.java     | 12 ++++
 .../jena/query/text/assembler/TextVocab.java    |  1 +
 .../org/apache/jena/query/text/TS_Text.java     |  1 +
 .../TestDatasetWithAnalyzingQueryParser.java    | 64 ++++++++++++++++++++
 .../text/TestDatasetWithKeywordAnalyzer.java    | 10 ++-
 20 files changed, 228 insertions(+), 67 deletions(-)
----------------------------------------------------------------------



[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.

Posted by an...@apache.org.
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) ; }