Repository: jena Updated Branches: refs/heads/master 8d53fedc0 -> 25b365221
Fixes for JENA-946 Project: http://git-wip-us.apache.org/repos/asf/jena/repo Commit: http://git-wip-us.apache.org/repos/asf/jena/commit/25b36522 Tree: http://git-wip-us.apache.org/repos/asf/jena/tree/25b36522 Diff: http://git-wip-us.apache.org/repos/asf/jena/diff/25b36522 Branch: refs/heads/master Commit: 25b365221aab0aafbdf32b248934e4ff152eec4b Parents: 8d53fed Author: Claude Warren <[email protected]> Authored: Sat May 16 21:56:53 2015 +0100 Committer: Claude Warren <[email protected]> Committed: Sat May 16 21:56:53 2015 +0100 ---------------------------------------------------------------------- .../jena/arq/querybuilder/SelectBuilder.java | 21 +++++++++++ .../arq/querybuilder/clauses/SelectClause.java | 33 +++++++++++++++++ .../querybuilder/handlers/SelectHandler.java | 39 +++++++++++++++++++- .../querybuilder/clauses/SelectClauseTest.java | 29 +++++++++++++++ .../handlers/SelectHandlerTest.java | 25 +++++++++++++ 5 files changed, 146 insertions(+), 1 deletion(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/jena/blob/25b36522/jena-extras/jena-querybuilder/src/main/java/org/apache/jena/arq/querybuilder/SelectBuilder.java ---------------------------------------------------------------------- diff --git a/jena-extras/jena-querybuilder/src/main/java/org/apache/jena/arq/querybuilder/SelectBuilder.java b/jena-extras/jena-querybuilder/src/main/java/org/apache/jena/arq/querybuilder/SelectBuilder.java index b51328b..7829aca 100644 --- a/jena-extras/jena-querybuilder/src/main/java/org/apache/jena/arq/querybuilder/SelectBuilder.java +++ b/jena-extras/jena-querybuilder/src/main/java/org/apache/jena/arq/querybuilder/SelectBuilder.java @@ -17,6 +17,7 @@ */ package org.apache.jena.arq.querybuilder; +import java.io.ByteArrayInputStream; import java.util.Collection; import java.util.List; @@ -32,8 +33,12 @@ import org.apache.jena.graph.FrontsNode ; import org.apache.jena.graph.FrontsTriple ; import org.apache.jena.graph.Node ; import org.apache.jena.graph.Triple ; +import org.apache.jena.sparql.core.Prologue; import org.apache.jena.sparql.core.Var ; +import org.apache.jena.sparql.expr.Expr; import org.apache.jena.sparql.lang.sparql_11.ParseException ; +import org.apache.jena.sparql.lang.sparql_11.SPARQLParser11; +import org.apache.jena.sparql.syntax.ElementFilter; /** * Build a select query. @@ -101,6 +106,22 @@ public class SelectBuilder extends AbstractQueryBuilder<SelectBuilder> return this; } + /** + * Add an expression string as a filter. + * @param expression The expression string to add. + * @throws ParseException If the expression can not be parsed. + */ + public SelectBuilder addVar(String expression, Object var) throws ParseException { + selectHandler.addVar( expression, makeVar(var) ); + return this; + } + + @Override + public SelectBuilder addVar(Expr expr, Object var) { + selectHandler.addVar(expr, makeVar(var)); + return this; + } + @Override public List<Var> getVars() { return selectHandler.getVars(); http://git-wip-us.apache.org/repos/asf/jena/blob/25b36522/jena-extras/jena-querybuilder/src/main/java/org/apache/jena/arq/querybuilder/clauses/SelectClause.java ---------------------------------------------------------------------- diff --git a/jena-extras/jena-querybuilder/src/main/java/org/apache/jena/arq/querybuilder/clauses/SelectClause.java b/jena-extras/jena-querybuilder/src/main/java/org/apache/jena/arq/querybuilder/clauses/SelectClause.java index fba28b6..2ada741 100644 --- a/jena-extras/jena-querybuilder/src/main/java/org/apache/jena/arq/querybuilder/clauses/SelectClause.java +++ b/jena-extras/jena-querybuilder/src/main/java/org/apache/jena/arq/querybuilder/clauses/SelectClause.java @@ -22,6 +22,8 @@ import java.util.List; import org.apache.jena.arq.querybuilder.AbstractQueryBuilder; import org.apache.jena.arq.querybuilder.handlers.SelectHandler; import org.apache.jena.sparql.core.Var ; +import org.apache.jena.sparql.expr.Expr; +import org.apache.jena.sparql.lang.sparql_11.ParseException; /** * Interface that defines the SelectClause as per @@ -70,8 +72,39 @@ public interface SelectClause<T extends AbstractQueryBuilder<T>> { * @return The builder for chaining. */ public T addVar(Object var); + + /** + * Add an expression as variable to the select statement. + * + * creates an '(Expression as Var)' to the select statement. + * + * A variable may only be added once. Attempting to add the same variable + * multiple times will be silently ignored. + * + * @param expr The expression to be added + * @param var + * The variable to add. + * @return The builder for chaining. + */ + public T addVar(Expr expr, Object var); /** + * Add an expression as variable to the select statement. + * + * creates an '(Expression as Var)' to the select statement. + * + * A variable may only be added once. Attempting to add the same variable + * multiple times will be silently ignored. + * + * @param expr The expression to be added + * @param var + * The variable to add. + * @return The builder for chaining. + * @throws ParseException + */ + public T addVar(String expr, Object var) throws ParseException; + + /** * @return A list of all the variables that have been added. */ public List<Var> getVars(); http://git-wip-us.apache.org/repos/asf/jena/blob/25b36522/jena-extras/jena-querybuilder/src/main/java/org/apache/jena/arq/querybuilder/handlers/SelectHandler.java ---------------------------------------------------------------------- diff --git a/jena-extras/jena-querybuilder/src/main/java/org/apache/jena/arq/querybuilder/handlers/SelectHandler.java b/jena-extras/jena-querybuilder/src/main/java/org/apache/jena/arq/querybuilder/handlers/SelectHandler.java index 7dba795..37726d8 100644 --- a/jena-extras/jena-querybuilder/src/main/java/org/apache/jena/arq/querybuilder/handlers/SelectHandler.java +++ b/jena-extras/jena-querybuilder/src/main/java/org/apache/jena/arq/querybuilder/handlers/SelectHandler.java @@ -17,14 +17,19 @@ */ package org.apache.jena.arq.querybuilder.handlers; +import java.io.ByteArrayInputStream; import java.lang.reflect.Field; import java.util.List; import java.util.Map; import org.apache.jena.graph.Node ; import org.apache.jena.query.Query ; +import org.apache.jena.sparql.core.Prologue; import org.apache.jena.sparql.core.Var ; import org.apache.jena.sparql.core.VarExprList ; +import org.apache.jena.sparql.expr.Expr; +import org.apache.jena.sparql.lang.sparql_11.ParseException; +import org.apache.jena.sparql.lang.sparql_11.SPARQLParser11; /** * A Select clause handler. @@ -73,7 +78,7 @@ public class SelectHandler implements Handler { /** * Add a variable to the select. - * If the variable is the variables are set to star. + * If the variable is <code>null</code> the variables are set to star. * @param var The variable to add. */ public void addVar(Var var) { @@ -85,6 +90,38 @@ public class SelectHandler implements Handler { } } + /** Add an Expression as variable to the select. + * If the variable is the variables are set to star. + * @param expression The expression as a string. + * @param var The variable to add. + * @throws ParseException + */ + public void addVar(String expression, Var var) throws ParseException { + SPARQLParser11 parser = new SPARQLParser11(new ByteArrayInputStream( + expression.getBytes())); + Prologue prologue = new Prologue( query.getPrefixMapping() ); + parser.setPrologue(prologue); + addVar( parser.Expression(), var ); + } + + /** + * Add an Expression as variable to the select. + * @param expr The expresson to add. + * @param var The variable to add. + */ + public void addVar(Expr expr, Var var) { + if (expr ==null) + { + throw new IllegalArgumentException( "expr may not be null"); + } + if (var == null) + { + throw new IllegalArgumentException( "var may not be null"); + } + query.setQueryResultStar(false); + query.addResultVar(var, expr); + } + /** * Get the list of variables from the query. * @return The list of variables in the query. http://git-wip-us.apache.org/repos/asf/jena/blob/25b36522/jena-extras/jena-querybuilder/src/test/java/org/apache/jena/arq/querybuilder/clauses/SelectClauseTest.java ---------------------------------------------------------------------- diff --git a/jena-extras/jena-querybuilder/src/test/java/org/apache/jena/arq/querybuilder/clauses/SelectClauseTest.java b/jena-extras/jena-querybuilder/src/test/java/org/apache/jena/arq/querybuilder/clauses/SelectClauseTest.java index c93e2d8..c3ab7f3 100644 --- a/jena-extras/jena-querybuilder/src/test/java/org/apache/jena/arq/querybuilder/clauses/SelectClauseTest.java +++ b/jena-extras/jena-querybuilder/src/test/java/org/apache/jena/arq/querybuilder/clauses/SelectClauseTest.java @@ -18,12 +18,15 @@ package org.apache.jena.arq.querybuilder.clauses; import static org.junit.Assert.*; + import org.apache.jena.arq.querybuilder.AbstractQueryBuilder; import org.apache.jena.arq.querybuilder.handlers.SelectHandler; import org.apache.jena.graph.NodeFactory ; import org.apache.jena.query.Query ; import org.apache.jena.sparql.core.Var ; import org.apache.jena.sparql.core.VarExprList ; +import org.apache.jena.sparql.expr.E_Random; +import org.apache.jena.sparql.expr.Expr; import org.junit.After; import org.xenei.junit.contract.Contract; import org.xenei.junit.contract.ContractTest; @@ -153,6 +156,7 @@ public class SelectClauseTest<T extends SelectClause<?>> extends AbstractQueryBuilder<?> builder = selectClause.addVar(NodeFactory .createVariable("foo")); String[] s = byLine(builder); + assertContainsRegex( SELECT+var("foo"), s ); } @ContractTest @@ -165,4 +169,29 @@ public class SelectClauseTest<T extends SelectClause<?>> extends assertTrue(query.isQueryResultStar()); } + @ContractTest + public void testAddExprVar() throws Exception { + SelectClause<?> selectClause = getProducer().newInstance(); + AbstractQueryBuilder<?> aqb = selectClause.addVar( new E_Random(), Var.alloc( "foo")); + + Query query = getQuery(aqb); + VarExprList expr = query.getProject(); + assertEquals(1, expr.size()); + Expr e = expr.getExpr( Var.alloc( "foo" )); + assertNotNull( "expression should not be null", e ); + assertTrue( "Should be an E_Random", e instanceof E_Random); + } + + @ContractTest + public void testAddStringVar() throws Exception { + SelectClause<?> selectClause = getProducer().newInstance(); + AbstractQueryBuilder<?> aqb = selectClause.addVar( "rand()", Var.alloc( "foo")); + + Query query = getQuery(aqb); + VarExprList expr = query.getProject(); + assertEquals(1, expr.size()); + Expr e = expr.getExpr( Var.alloc( "foo" )); + assertNotNull( "expression should not be null", e ); + assertTrue( "Should be an E_Random", e instanceof E_Random); + } } http://git-wip-us.apache.org/repos/asf/jena/blob/25b36522/jena-extras/jena-querybuilder/src/test/java/org/apache/jena/arq/querybuilder/handlers/SelectHandlerTest.java ---------------------------------------------------------------------- diff --git a/jena-extras/jena-querybuilder/src/test/java/org/apache/jena/arq/querybuilder/handlers/SelectHandlerTest.java b/jena-extras/jena-querybuilder/src/test/java/org/apache/jena/arq/querybuilder/handlers/SelectHandlerTest.java index 09c3661..52c07da 100644 --- a/jena-extras/jena-querybuilder/src/test/java/org/apache/jena/arq/querybuilder/handlers/SelectHandlerTest.java +++ b/jena-extras/jena-querybuilder/src/test/java/org/apache/jena/arq/querybuilder/handlers/SelectHandlerTest.java @@ -18,9 +18,13 @@ package org.apache.jena.arq.querybuilder.handlers; import static org.junit.Assert.*; + import org.apache.jena.query.Query ; import org.apache.jena.sparql.core.Var ; import org.apache.jena.sparql.core.VarExprList ; +import org.apache.jena.sparql.expr.E_Random; +import org.apache.jena.sparql.expr.Expr; +import org.apache.jena.sparql.lang.sparql_11.ParseException; import org.junit.Before; import org.junit.Test; @@ -53,6 +57,27 @@ public class SelectHandlerTest extends AbstractHandlerTest { } @Test + public void testAddStringVar() throws ParseException { + Var v = Var.alloc("foo"); + handler.addVar("rand()", v); + VarExprList expr = query.getProject();; + assertEquals(1, expr.size()); + Expr e = expr.getExpr( Var.alloc( "foo" )); + assertNotNull( "expression should not be null", e ); + assertTrue( "Should be an E_Random", e instanceof E_Random); + } + + public void testAddExprVar() throws ParseException { + Var v = Var.alloc("foo"); + handler.addVar(new E_Random(), v); + VarExprList expr = query.getProject();; + assertEquals(1, expr.size()); + Expr e = expr.getExpr( Var.alloc( "foo" )); + assertNotNull( "expression should not be null", e ); + assertTrue( "Should be an E_Random", e instanceof E_Random); + } + + @Test public void testAddVarAfterAsterisk() { handler.addVar(null); handler.addVar(Var.alloc("x"));
