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/01/30 18:35:39 UTC
[2/2] jena git commit: JENA-1126: Clean up.
JENA-1126: Clean up.
Introduce ExprLib.evalOrNull.
Project: http://git-wip-us.apache.org/repos/asf/jena/repo
Commit: http://git-wip-us.apache.org/repos/asf/jena/commit/a523a406
Tree: http://git-wip-us.apache.org/repos/asf/jena/tree/a523a406
Diff: http://git-wip-us.apache.org/repos/asf/jena/diff/a523a406
Branch: refs/heads/master
Commit: a523a4066af5af5c6b1cc9d6504ba4d247f38df4
Parents: d12d7cd
Author: Andy Seaborne <an...@apache.org>
Authored: Sat Jan 30 17:35:33 2016 +0000
Committer: Andy Seaborne <an...@apache.org>
Committed: Sat Jan 30 17:35:33 2016 +0000
----------------------------------------------------------------------
.../org/apache/jena/sparql/expr/E_Bound.java | 6 +-
.../org/apache/jena/sparql/expr/ExprLib.java | 55 +++++++++++++++++++
.../sparql/expr/aggregate/AccumulatorExpr.java | 58 ++------------------
.../jena/sparql/expr/aggregate/AggSample.java | 17 +++---
.../expr/aggregate/AggSampleDistinct.java | 17 +++---
5 files changed, 80 insertions(+), 73 deletions(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/jena/blob/a523a406/jena-arq/src/main/java/org/apache/jena/sparql/expr/E_Bound.java
----------------------------------------------------------------------
diff --git a/jena-arq/src/main/java/org/apache/jena/sparql/expr/E_Bound.java b/jena-arq/src/main/java/org/apache/jena/sparql/expr/E_Bound.java
index caa7516..631cb0d 100644
--- a/jena-arq/src/main/java/org/apache/jena/sparql/expr/E_Bound.java
+++ b/jena-arq/src/main/java/org/apache/jena/sparql/expr/E_Bound.java
@@ -33,8 +33,10 @@ public class E_Bound extends ExprFunction1
}
@Override
- public NodeValue evalSpecial(Binding binding, FunctionEnv env)
- {
+ public NodeValue evalSpecial(Binding binding, FunctionEnv env) {
+ // See alse ExprLib.evalorNull.
+ // This code predates that; it handles exceptions very slightly differently.
+
if ( expr.isConstant() )
// The case of the variable already being substituted for a constant.
return NodeValue.FALSE ;
http://git-wip-us.apache.org/repos/asf/jena/blob/a523a406/jena-arq/src/main/java/org/apache/jena/sparql/expr/ExprLib.java
----------------------------------------------------------------------
diff --git a/jena-arq/src/main/java/org/apache/jena/sparql/expr/ExprLib.java b/jena-arq/src/main/java/org/apache/jena/sparql/expr/ExprLib.java
index 71bc006..ac7f1a5 100644
--- a/jena-arq/src/main/java/org/apache/jena/sparql/expr/ExprLib.java
+++ b/jena-arq/src/main/java/org/apache/jena/sparql/expr/ExprLib.java
@@ -18,12 +18,67 @@
package org.apache.jena.sparql.expr;
+import org.apache.jena.graph.Node ;
import org.apache.jena.sparql.ARQInternalErrorException ;
import org.apache.jena.sparql.algebra.optimize.ExprTransformConstantFold ;
import org.apache.jena.sparql.core.Var ;
+import org.apache.jena.sparql.engine.binding.Binding ;
+import org.apache.jena.sparql.function.FunctionEnv ;
public class ExprLib
{
+ /** Evaluate or return null.
+ * <p>
+ * This is better (faster) than the simple implementation
+ * which captures {@link ExprEvalException} and returns null.
+ */
+
+ public static NodeValue evalOrNull(Expr expr, Binding binding, FunctionEnv functionEnv) {
+ return evalOrElse(expr, binding, functionEnv, null) ;
+ }
+
+ /** evaluate or throw an exception */
+ // This post dates a lot of code that uses expr.eval directly.
+ // Placeholder for now.
+ private static NodeValue evalOrException(Expr expr, Binding binding, FunctionEnv functionEnv) {
+ return expr.eval(binding, functionEnv) ;
+ }
+
+ private static NodeValue evalOrElse(Expr expr, Binding binding, FunctionEnv functionEnv, NodeValue exceptionValue) {
+ // Exceptions in java are expensive if the stack information is
+ // collected which is the default behaviour. The expensive step is
+ // Throwable.fillInStackTrace.
+ //
+ // Otherwise, they are reasonable cheap. It needs special exceptions
+ // which overrides fillInStackTrace to be cheap but they loose the
+ // general information for development.
+ //
+ // Instead, pick out specal cases, the expression being a single variable
+ // being the important one.
+ //
+ // BOUND(?x) is a important case where the expression is often an exception
+ // in general evaluation.
+
+ if ( expr.isConstant() )
+ // Easy case.
+ return expr.getConstant() ;
+ if ( expr.isVariable() ) {
+ // The case of the expr being a single variable.
+ Var v = expr.asVar() ;
+ Node n = binding.get(v) ;
+ if ( n == null )
+ return exceptionValue ;
+ NodeValue nv = NodeValue.makeNode(n) ;
+ return nv ;
+ }
+
+ try {
+ return expr.eval(binding, functionEnv) ;
+ } catch (ExprEvalException ex) {
+ return exceptionValue ;
+ }
+ }
+
/** Attempt to fold any sub-expressions of the Expr.
* Return an expression that is euqivalent to the argument but maybe simpler.
* @param expr
http://git-wip-us.apache.org/repos/asf/jena/blob/a523a406/jena-arq/src/main/java/org/apache/jena/sparql/expr/aggregate/AccumulatorExpr.java
----------------------------------------------------------------------
diff --git a/jena-arq/src/main/java/org/apache/jena/sparql/expr/aggregate/AccumulatorExpr.java b/jena-arq/src/main/java/org/apache/jena/sparql/expr/aggregate/AccumulatorExpr.java
index d7b3d16..0e7611d 100644
--- a/jena-arq/src/main/java/org/apache/jena/sparql/expr/aggregate/AccumulatorExpr.java
+++ b/jena-arq/src/main/java/org/apache/jena/sparql/expr/aggregate/AccumulatorExpr.java
@@ -18,11 +18,9 @@
package org.apache.jena.sparql.expr.aggregate;
-import org.apache.jena.graph.Node ;
-import org.apache.jena.sparql.core.Var ;
import org.apache.jena.sparql.engine.binding.Binding ;
import org.apache.jena.sparql.expr.Expr ;
-import org.apache.jena.sparql.expr.ExprEvalException ;
+import org.apache.jena.sparql.expr.ExprLib ;
import org.apache.jena.sparql.expr.NodeValue ;
import org.apache.jena.sparql.function.FunctionEnv ;
@@ -41,7 +39,7 @@ abstract class AccumulatorExpr implements Accumulator
@Override
final public void accumulate(Binding binding, FunctionEnv functionEnv)
{
- NodeValue nv = evalOrNull(expr, binding, functionEnv) ;
+ NodeValue nv = ExprLib.evalOrNull(expr, binding, functionEnv) ;
if ( nv != null ) {
accumulate(nv, binding, functionEnv) ;
count++ ;
@@ -51,57 +49,9 @@ abstract class AccumulatorExpr implements Accumulator
}
}
-
- private static NodeValue evalOrException(Expr expr, Binding binding, FunctionEnv functionEnv) {
- return expr.eval(binding, functionEnv) ;
- }
-
- // ==> ExprLib
- /** This is better (faster) than the simple implementation which captures {@link ExprEvalException}
- * and returns null.
- */
-
- /*ExprLib*/ private static NodeValue evalOrNull(Expr expr, Binding binding, FunctionEnv functionEnv) {
- return evalOrElse(expr, binding, functionEnv, null) ;
- }
-
- private static NodeValue evalOrElse(Expr expr, Binding binding, FunctionEnv functionEnv, NodeValue exceptionValue) {
- // Exceptions in java are expensive if the stack information is
- // collected which is the default behaviour. The expensive step is
- // Throwable.fillInStackTrace.
- //
- // Otherwise, they are reasonable cheap. It needs special exceptions
- // which overrides fillInStackTrace to be cheap but they loose the
- // general information for development.
- //
- // Instead, pick out specal cases, the expression being a single variable
- // being the important one.
- //
- // BOUND(?x) is a important case where the expression is often an exception
- // in general evaluation.
-
- if ( expr.isConstant() )
- // Easy case.
- return expr.getConstant() ;
- if ( expr.isVariable() ) {
- // The case of the expr being a single variable.
- Var v = expr.asVar() ;
- Node n = binding.get(v) ;
- if ( n == null )
- return exceptionValue ;
- NodeValue nv = NodeValue.makeNode(n) ;
- return nv ;
- }
-
- try {
- return expr.eval(binding, functionEnv) ;
- } catch (ExprEvalException ex) {
- return exceptionValue ;
- }
- }
-
// COUNT(?v) is different : errors of the expression/variable do not cause an aggregate eval error.
- // SAMPLE is different : it treats errors as "just another value" and tries to
+ // SAMPLE is different : it treats errors as "just another value" and tries to return a defined value if any have been seen.
+
@Override
public NodeValue getValue()
{
http://git-wip-us.apache.org/repos/asf/jena/blob/a523a406/jena-arq/src/main/java/org/apache/jena/sparql/expr/aggregate/AggSample.java
----------------------------------------------------------------------
diff --git a/jena-arq/src/main/java/org/apache/jena/sparql/expr/aggregate/AggSample.java b/jena-arq/src/main/java/org/apache/jena/sparql/expr/aggregate/AggSample.java
index 00f5523..e889cab 100644
--- a/jena-arq/src/main/java/org/apache/jena/sparql/expr/aggregate/AggSample.java
+++ b/jena-arq/src/main/java/org/apache/jena/sparql/expr/aggregate/AggSample.java
@@ -44,6 +44,7 @@ public class AggSample extends AggregatorBase
@Override
public int hashCode() { return HC_AggSample ^ getExpr().hashCode() ; }
+
@Override
public boolean equals(Aggregator other, boolean bySyntax) {
if ( other == null ) return false ;
@@ -63,12 +64,10 @@ public class AggSample extends AggregatorBase
public AccSample(Expr expr) { super(expr) ; }
@Override
- public void accumulate(NodeValue nv , Binding binding, FunctionEnv functionEnv)
- {
- if ( sampleSoFar == null && nv != null )
- {
- sampleSoFar = nv ;
- return ;
+ public void accumulate(NodeValue nv, Binding binding, FunctionEnv functionEnv) {
+ if ( sampleSoFar == null && nv != null ) {
+ sampleSoFar = nv;
+ return;
}
}
@@ -81,7 +80,9 @@ public class AggSample extends AggregatorBase
{ return sampleSoFar ; }
@Override
- public NodeValue getValue()
- { return getAccValue() ; }
+ public NodeValue getValue() {
+ // Return any seen value and null only if none.
+ return getAccValue();
+ }
}
}
http://git-wip-us.apache.org/repos/asf/jena/blob/a523a406/jena-arq/src/main/java/org/apache/jena/sparql/expr/aggregate/AggSampleDistinct.java
----------------------------------------------------------------------
diff --git a/jena-arq/src/main/java/org/apache/jena/sparql/expr/aggregate/AggSampleDistinct.java b/jena-arq/src/main/java/org/apache/jena/sparql/expr/aggregate/AggSampleDistinct.java
index dee1e36..e2623ef 100644
--- a/jena-arq/src/main/java/org/apache/jena/sparql/expr/aggregate/AggSampleDistinct.java
+++ b/jena-arq/src/main/java/org/apache/jena/sparql/expr/aggregate/AggSampleDistinct.java
@@ -33,9 +33,8 @@ public class AggSampleDistinct extends AggregatorBase
public Aggregator copy(ExprList exprs) { return new AggSampleDistinct(exprs.get(0)) ; }
@Override
- public Accumulator createAccumulator()
- {
- return new AccSampleDistict(getExpr()) ;
+ public Accumulator createAccumulator() {
+ return new AccSampleDistict(getExpr());
}
@Override
@@ -63,11 +62,10 @@ public class AggSampleDistinct extends AggregatorBase
public AccSampleDistict(Expr expr) { super(expr) ; }
@Override
- public void accumulate(NodeValue nv, Binding binding, FunctionEnv functionEnv)
- {
+ public void accumulate(NodeValue nv, Binding binding, FunctionEnv functionEnv) {
if ( nv != null )
// Last value seen.
- sampleSoFar = nv ;
+ sampleSoFar = nv;
}
@Override
@@ -79,8 +77,9 @@ public class AggSampleDistinct extends AggregatorBase
{ return sampleSoFar ; }
@Override
- public NodeValue getValue()
- { return getAccValue() ; }
-
+ public NodeValue getValue() {
+ // Return any seen value and null only if none.
+ return getAccValue();
+ }
}
}