You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@jena.apache.org by cl...@apache.org on 2016/02/14 21:18:30 UTC

[3/4] jena git commit: Fixes for JENA-1144

Fixes for JENA-1144


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

Branch: refs/heads/master
Commit: 59aa64bdcfc3eba5a4eacd0e8a27650fcea24e97
Parents: 00dad2d
Author: Claude Warren <cl...@apache.org>
Authored: Sun Feb 14 20:11:53 2016 +0000
Committer: Claude Warren <cl...@apache.org>
Committed: Sun Feb 14 20:11:53 2016 +0000

----------------------------------------------------------------------
 .../apache/jena/sparql/lang/arq/ARQParser.java  |  2 +-
 .../querybuilder/handlers/SelectHandler.java    | 62 +++++++++++++++++++-
 .../handlers/SelectHandlerTest.java             | 15 +++++
 3 files changed, 77 insertions(+), 2 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/jena/blob/59aa64bd/jena-arq/src/main/java/org/apache/jena/sparql/lang/arq/ARQParser.java
----------------------------------------------------------------------
diff --git a/jena-arq/src/main/java/org/apache/jena/sparql/lang/arq/ARQParser.java b/jena-arq/src/main/java/org/apache/jena/sparql/lang/arq/ARQParser.java
index cf11ab2..2272a52 100644
--- a/jena-arq/src/main/java/org/apache/jena/sparql/lang/arq/ARQParser.java
+++ b/jena-arq/src/main/java/org/apache/jena/sparql/lang/arq/ARQParser.java
@@ -13,7 +13,7 @@ import org.apache.jena.sparql.core.Quad ;
 
 @SuppressWarnings("all")
 public class ARQParser extends ARQParserBase implements ARQParserConstants {
-    boolean allowAggregatesInExpressions = false ;
+    protected boolean allowAggregatesInExpressions = false ;
 
   final public void QueryUnit() throws ParseException {
     ByteOrderMark();

http://git-wip-us.apache.org/repos/asf/jena/blob/59aa64bd/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 1d389ec..b05a626 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,15 +17,24 @@
  */
 package org.apache.jena.arq.querybuilder.handlers;
 
+import java.io.Reader;
+import java.io.StringReader;
+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.query.QueryBuildException;
+import org.apache.jena.query.QueryParseException;
 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.arq.ARQParser;
+import org.apache.jena.sparql.lang.arq.ARQParserTokenManager;
+import org.apache.jena.sparql.lang.arq.ParseException;
+import org.apache.jena.sparql.lang.arq.Token;
+import org.apache.jena.sparql.lang.arq.TokenMgrError;
 import org.apache.jena.sparql.util.ExprUtils ;
 
 /**
@@ -93,9 +102,50 @@ public class SelectHandler implements Handler {
 	 * @param var The variable to add.
 	 */
 	public void addVar(String expression, Var var)  {
-		addVar( ExprUtils.parse( query, expression, true ), var );
+		addVar( parseExpr( expression ), var );
 	}
 	
+	
+	 private Expr parseExpr(String s)
+	    {
+	        try {
+	            ExprParser parser = new ExprParser(query,s);
+	            Expr expr = parser.Expression() ;
+	            
+	           
+	                Token t = parser.getNextToken() ;
+	                if ( t.kind != ARQParserTokenManager.EOF )
+	                    throw new QueryParseException("Extra tokens beginning \""+t.image+"\" starting line "+t.beginLine+", column "+t.beginColumn,
+	                                                  t.beginLine, t.beginColumn) ;
+	            
+	            return expr ;
+	        } catch (ParseException ex)
+	        { throw new QueryParseException(ex.getMessage(),
+	                                        ex.currentToken.beginLine,
+	                                        ex.currentToken.beginLine) ;
+	        }
+	        catch (TokenMgrError tErr)
+	        {
+	            throw new QueryParseException(tErr.getMessage(), -1, -1) ;
+	        }
+	        catch (Error err)
+	        {
+	            // The token stream can throw java.lang.Error's 
+	            String tmp = err.getMessage() ;
+	            if ( tmp == null )
+	                throw new QueryParseException(err,-1, -1) ;
+	            throw new QueryParseException(tmp,-1, -1) ;
+	        } catch (NoSuchFieldException e) {
+	        	 throw new QueryParseException(e, -1, -1) ;
+			} catch (SecurityException e) {
+	        	 throw new QueryParseException(e, -1, -1) ;
+			} catch (IllegalArgumentException e) {
+	        	 throw new QueryParseException(e, -1, -1) ;
+			} catch (IllegalAccessException e) {
+	        	 throw new QueryParseException(e, -1, -1) ;
+			}
+	    }
+	
 	/**
 	 * Add an Expression as variable to the select.
 	 * @param expr The expresson to add.
@@ -156,4 +206,14 @@ public class SelectHandler implements Handler {
 		// handle the SELECT * case
 		query.getProjectVars();
 	}
+	
+	private class ExprParser extends ARQParser {
+		
+		private ExprParser(Query query, String s) throws NoSuchFieldException, SecurityException, IllegalArgumentException, IllegalAccessException
+		{
+			super( new StringReader(s));
+			allowAggregatesInExpressions = true;
+			setQuery( query );
+		}
+	}
 }

http://git-wip-us.apache.org/repos/asf/jena/blob/59aa64bd/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 d93848a..4e51478 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
@@ -24,6 +24,8 @@ 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.expr.ExprAggregator;
+import org.apache.jena.sparql.expr.aggregate.AggCount;
 import org.apache.jena.sparql.syntax.ElementGroup;
 import org.junit.Before;
 import org.junit.Test;
@@ -67,6 +69,19 @@ public class SelectHandlerTest extends AbstractHandlerTest {
 		assertTrue( "Should be an E_Random", e instanceof E_Random);
 	}
 	
+	@Test
+	public void testAddAggregateStringVar() {
+		Var v = Var.alloc("foo");
+		handler.addVar("count(*)", 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 ExprAggregator", e instanceof ExprAggregator);
+		assertTrue( "Should be AggCount", ((ExprAggregator)e).getAggregator() instanceof AggCount);
+	}
+	
+	@Test
 	public void testAddExprVar() {
 		Var v = Var.alloc("foo");
 		handler.addVar(new E_Random(), v);