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();
+        }
     }
 }