You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@jena.apache.org by rv...@apache.org on 2012/11/20 00:58:33 UTC

svn commit: r1411482 - in /jena/trunk/jena-arq/src: main/java/com/hp/hpl/jena/sparql/function/user/ test/java/com/hp/hpl/jena/sparql/function/user/

Author: rvesse
Date: Mon Nov 19 23:58:32 2012
New Revision: 1411482

URL: http://svn.apache.org/viewvc?rev=1411482&view=rev
Log:
Expand test coverage for new user defined functions

Modified:
    jena/trunk/jena-arq/src/main/java/com/hp/hpl/jena/sparql/function/user/UserDefinedFunctionDefinition.java
    jena/trunk/jena-arq/src/test/java/com/hp/hpl/jena/sparql/function/user/TS_UserFunctions.java
    jena/trunk/jena-arq/src/test/java/com/hp/hpl/jena/sparql/function/user/TestFunctionExpansion.java

Modified: jena/trunk/jena-arq/src/main/java/com/hp/hpl/jena/sparql/function/user/UserDefinedFunctionDefinition.java
URL: http://svn.apache.org/viewvc/jena/trunk/jena-arq/src/main/java/com/hp/hpl/jena/sparql/function/user/UserDefinedFunctionDefinition.java?rev=1411482&r1=1411481&r2=1411482&view=diff
==============================================================================
--- jena/trunk/jena-arq/src/main/java/com/hp/hpl/jena/sparql/function/user/UserDefinedFunctionDefinition.java (original)
+++ jena/trunk/jena-arq/src/main/java/com/hp/hpl/jena/sparql/function/user/UserDefinedFunctionDefinition.java Mon Nov 19 23:58:32 2012
@@ -20,16 +20,23 @@ package com.hp.hpl.jena.sparql.function.
 
 import java.util.ArrayList;
 import java.util.List;
+import java.util.Set;
+
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
 
 import com.hp.hpl.jena.sparql.core.Var;
 import com.hp.hpl.jena.sparql.expr.Expr;
 import com.hp.hpl.jena.sparql.function.Function;
+import com.hp.hpl.jena.sparql.sse.builders.ExprBuildException;
 
 /**
  * Represents the definition of a user defined function
  *
  */
 public class UserDefinedFunctionDefinition {
+	
+	private static final Logger LOG = LoggerFactory.getLogger(UserDefinedFunctionDefinition.class);
 
     private String uri;
     private Expr expr;
@@ -45,6 +52,20 @@ public class UserDefinedFunctionDefiniti
         this.uri = uri;
         this.expr = e;
         this.argList = new ArrayList<Var>(argList);
+        
+        //Verify that all mentioned variables are in the arguments list
+        Set<Var> mentioned = this.expr.getVarsMentioned();
+        for (Var v : mentioned) {
+        	if (!argList.contains(v)) throw new ExprBuildException("Cannot use the variable " + v.toString() + " in the expression since it is not included in the argList argument.  All variables must be arguments to the function"); 
+        }        
+        //If used variables is greater than argument variables this is an error
+        if (mentioned.size() > this.argList.size()) throw new ExprBuildException("Mismatch between variables used in expression and number of variables in argument list, expected " + this.argList.size() + " but found " + mentioned.size());
+        //May have more arguments than used, however this only gives warning(s)
+        if (mentioned.size() < this.argList.size()) {
+        	for (Var v : this.argList) {
+        		if (!mentioned.contains(v)) LOG.warn("Function <" + uri + "> has argument " + v + " which is never used in the expression");
+        	}
+        }
     }
     
     /**

Modified: jena/trunk/jena-arq/src/test/java/com/hp/hpl/jena/sparql/function/user/TS_UserFunctions.java
URL: http://svn.apache.org/viewvc/jena/trunk/jena-arq/src/test/java/com/hp/hpl/jena/sparql/function/user/TS_UserFunctions.java?rev=1411482&r1=1411481&r2=1411482&view=diff
==============================================================================
--- jena/trunk/jena-arq/src/test/java/com/hp/hpl/jena/sparql/function/user/TS_UserFunctions.java (original)
+++ jena/trunk/jena-arq/src/test/java/com/hp/hpl/jena/sparql/function/user/TS_UserFunctions.java Mon Nov 19 23:58:32 2012
@@ -18,12 +18,13 @@
 
 package com.hp.hpl.jena.sparql.function.user;
 
-import junit.framework.JUnit4TestAdapter ;
-import org.junit.runner.RunWith ;
-import org.junit.runners.Suite ;
-import org.junit.runners.Suite.SuiteClasses ;
+import junit.framework.JUnit4TestAdapter;
 
-import com.hp.hpl.jena.sparql.expr.TS_Expr ;
+import org.junit.runner.RunWith;
+import org.junit.runners.Suite;
+import org.junit.runners.Suite.SuiteClasses;
+
+import com.hp.hpl.jena.sparql.expr.TS_Expr;
 
 @RunWith(Suite.class)
 @SuiteClasses( {

Modified: jena/trunk/jena-arq/src/test/java/com/hp/hpl/jena/sparql/function/user/TestFunctionExpansion.java
URL: http://svn.apache.org/viewvc/jena/trunk/jena-arq/src/test/java/com/hp/hpl/jena/sparql/function/user/TestFunctionExpansion.java?rev=1411482&r1=1411481&r2=1411482&view=diff
==============================================================================
--- jena/trunk/jena-arq/src/test/java/com/hp/hpl/jena/sparql/function/user/TestFunctionExpansion.java (original)
+++ jena/trunk/jena-arq/src/test/java/com/hp/hpl/jena/sparql/function/user/TestFunctionExpansion.java Mon Nov 19 23:58:32 2012
@@ -18,19 +18,26 @@
 
 package com.hp.hpl.jena.sparql.function.user;
 
-import java.util.ArrayList ;
-import java.util.List ;
+import java.util.ArrayList;
+import java.util.List;
 
-import org.junit.AfterClass ;
-import org.junit.Assert ;
-import org.junit.BeforeClass ;
-import org.junit.Test ;
-
-import com.hp.hpl.jena.sparql.core.Var ;
-import com.hp.hpl.jena.sparql.expr.* ;
-import com.hp.hpl.jena.sparql.expr.nodevalue.NodeValueBoolean ;
-import com.hp.hpl.jena.sparql.expr.nodevalue.NodeValueDouble ;
-import com.hp.hpl.jena.sparql.expr.nodevalue.NodeValueInteger ;
+import org.junit.AfterClass;
+import org.junit.Assert;
+import org.junit.BeforeClass;
+import org.junit.Test;
+
+import com.hp.hpl.jena.sparql.core.Var;
+import com.hp.hpl.jena.sparql.expr.E_Add;
+import com.hp.hpl.jena.sparql.expr.E_Function;
+import com.hp.hpl.jena.sparql.expr.E_Multiply;
+import com.hp.hpl.jena.sparql.expr.E_Subtract;
+import com.hp.hpl.jena.sparql.expr.Expr;
+import com.hp.hpl.jena.sparql.expr.ExprList;
+import com.hp.hpl.jena.sparql.expr.ExprVar;
+import com.hp.hpl.jena.sparql.expr.nodevalue.NodeValueBoolean;
+import com.hp.hpl.jena.sparql.expr.nodevalue.NodeValueDouble;
+import com.hp.hpl.jena.sparql.expr.nodevalue.NodeValueInteger;
+import com.hp.hpl.jena.sparql.sse.builders.ExprBuildException;
 
 /**
  * Test for checking that functions are appropriately expanded when supplied with actual arguments
@@ -194,8 +201,11 @@ public class TestFunctionExpansion {
         ExprList altArgs = new ExprList();
         altArgs.add(new ExprVar("a"));
         altArgs.add(new ExprVar("b"));
+        ArrayList<Var> defArgs = new ArrayList<Var>();
+        defArgs.add(Var.alloc("a"));
+        defArgs.add(Var.alloc("b"));
         Expr test = new E_Function("http://example/takeaway", altArgs);
-        UserDefinedFunctionFactory.getFactory().add("http://example/test", test, new ArrayList<Var>());
+        UserDefinedFunctionFactory.getFactory().add("http://example/test", test, defArgs);
         
         UserDefinedFunctionDefinition def = UserDefinedFunctionFactory.getFactory().get("http://example/test");
         Expr base = def.getBaseExpr();
@@ -219,8 +229,11 @@ public class TestFunctionExpansion {
         ExprList altArgs = new ExprList();
         altArgs.add(new ExprVar("b"));
         altArgs.add(new ExprVar("a"));
+        ArrayList<Var> defArgs = new ArrayList<Var>();
+        defArgs.add(Var.alloc("a"));
+        defArgs.add(Var.alloc("b"));
         Expr test = new E_Function("http://example/takeaway", altArgs);
-        UserDefinedFunctionFactory.getFactory().add("http://example/test", test, new ArrayList<Var>());
+        UserDefinedFunctionFactory.getFactory().add("http://example/test", test, defArgs);
         
         UserDefinedFunctionDefinition def = UserDefinedFunctionFactory.getFactory().get("http://example/test");
         Expr base = def.getBaseExpr();
@@ -231,4 +244,99 @@ public class TestFunctionExpansion {
         Assert.assertEquals(subtract.getArg1().getVarName(), "b");
         Assert.assertEquals(subtract.getArg2().getVarName(), "a");
     }
+    
+    @Test
+    public void test_function_expansion_10() {
+        Expr single = new ExprVar("x");
+        UserDefinedFunctionFactory.getFactory().add("http://example/single", single, new ArrayList<Var>(single.getVarsMentioned()));
+        
+        //Test that with allowDependencies set to false (the default) that the definition is expanded appropriately
+        //when the outer function has differing numbers of arguments
+        List<Var> args = new ArrayList<Var>();
+        args.add(Var.alloc("x"));
+        args.add(Var.alloc("y"));
+        Expr add = new E_Add(new E_Function("http://example/single", new ExprList(new ExprVar("x"))), new ExprVar("y"));
+        UserDefinedFunctionFactory.getFactory().add("http://example/add", add, args);
+        
+        UserDefinedFunctionDefinition def = UserDefinedFunctionFactory.getFactory().get("http://example/add");
+        Expr base = def.getBaseExpr();
+        Assert.assertTrue(base instanceof E_Add);
+        E_Add actual = (E_Add)base;
+        Assert.assertTrue(actual.getArg1() instanceof ExprVar);
+        Assert.assertTrue(actual.getArg2() instanceof ExprVar);
+        Assert.assertEquals("x", actual.getArg1().getVarName());
+        Assert.assertEquals("y", actual.getArg2().getVarName());
+    }
+    
+    @Test
+    public void test_function_expansion_11() {
+        Expr single = new ExprVar("x");
+        UserDefinedFunctionFactory.getFactory().add("http://example/single", single, new ArrayList<Var>(single.getVarsMentioned()));
+        
+        //Test that with allowDependencies set to false (the default) that the definition is expanded appropriately
+        //when the outer function has differing numbers of arguments
+        List<Var> args = new ArrayList<Var>();
+        args.add(Var.alloc("x"));
+        args.add(Var.alloc("y"));
+        Expr add = new E_Add(new E_Function("http://example/single", new ExprList(new ExprVar("y"))), new ExprVar("y"));
+        UserDefinedFunctionFactory.getFactory().add("http://example/add", add, args);
+        
+        UserDefinedFunctionDefinition def = UserDefinedFunctionFactory.getFactory().get("http://example/add");
+        Expr base = def.getBaseExpr();
+        Assert.assertTrue(base instanceof E_Add);
+        E_Add actual = (E_Add)base;
+        Assert.assertTrue(actual.getArg1() instanceof ExprVar);
+        Assert.assertTrue(actual.getArg2() instanceof ExprVar);
+        Assert.assertEquals("y", actual.getArg1().getVarName());
+        Assert.assertEquals("y", actual.getArg2().getVarName());
+    }
+    
+    @Test
+    public void test_function_expansion_12() {
+        Expr takeaway = new E_Subtract(new ExprVar("x"), new ExprVar("y"));
+        List<Var> args = new ArrayList<Var>();
+        args.add(Var.alloc("x"));
+        args.add(Var.alloc("y"));
+        UserDefinedFunctionFactory.getFactory().add("http://example/takeaway", takeaway, args);
+        
+        //Test that with allowDependencies set to false (the default) that the definition is expanded appropriately
+        ExprList altArgs = new ExprList();
+        altArgs.add(new ExprVar("a"));
+        altArgs.add(new ExprVar("a"));
+        ArrayList<Var> defArgs = new ArrayList<Var>();
+        defArgs.add(Var.alloc("a"));
+        defArgs.add(Var.alloc("b"));
+        Expr test = new E_Function("http://example/takeaway", altArgs);
+        UserDefinedFunctionFactory.getFactory().add("http://example/test", test, defArgs);
+        
+        UserDefinedFunctionDefinition def = UserDefinedFunctionFactory.getFactory().get("http://example/test");
+        Expr base = def.getBaseExpr();
+        Assert.assertTrue(base instanceof E_Subtract);
+        E_Subtract subtract = (E_Subtract)base;
+        Assert.assertTrue(subtract.getArg1() instanceof ExprVar);
+        Assert.assertTrue(subtract.getArg2() instanceof ExprVar);
+        Assert.assertEquals(subtract.getArg1().getVarName(), "a");
+        Assert.assertEquals(subtract.getArg2().getVarName(), "a");
+    }
+    
+    @Test(expected=ExprBuildException.class)
+    public void test_function_expansion_bad_01() {
+        List<Var> args = new ArrayList<Var>();
+        args.add(Var.alloc("x"));
+        args.add(Var.alloc("y"));
+        Expr add = new E_Add(new ExprVar("x"), new ExprVar("y"));
+        
+        //It's an error to use a variable which is not mentioned in the argument list
+        UserDefinedFunctionFactory.getFactory().add("http://example/add", add, new ArrayList<Var>());
+    }
+    
+    @Test(expected=ExprBuildException.class)
+    public void test_function_expansion_bad_02() {
+        Expr single = new ExprVar("x");
+        UserDefinedFunctionFactory.getFactory().add("http://example/single", single, new ArrayList<Var>(single.getVarsMentioned()));
+        
+        //It's an error to use a variable which is not mentioned in the argument list, even in a call to a dependent function
+        Expr test = new E_Function("http://example/single", new ExprList(new ExprVar("x")));
+        UserDefinedFunctionFactory.getFactory().add("http://example/test", test, new ArrayList<Var>());
+    }
 }