Author: rvesse
Date: Fri Apr 18 16:36:53 2014
New Revision: 1588511

URL: http://svn.apache.org/r1588511
Log:
Apply Andy's revised patch for constant folding (JENA-630)

Modified:
    jena/trunk/jena-arq/src/main/java/arq/qexpr.java
    
jena/trunk/jena-arq/src/main/java/com/hp/hpl/jena/sparql/algebra/optimize/ExprTransformConstantFold.java
    jena/trunk/jena-arq/src/main/java/com/hp/hpl/jena/sparql/expr/E_Exists.java
    
jena/trunk/jena-arq/src/main/java/com/hp/hpl/jena/sparql/expr/E_NotExists.java
    jena/trunk/jena-arq/src/main/java/com/hp/hpl/jena/sparql/expr/E_Scalar.java
    jena/trunk/jena-arq/src/main/java/com/hp/hpl/jena/sparql/expr/Expr.java
    
jena/trunk/jena-arq/src/main/java/com/hp/hpl/jena/sparql/expr/ExprAggregator.java
    
jena/trunk/jena-arq/src/main/java/com/hp/hpl/jena/sparql/expr/ExprFunction0.java
    
jena/trunk/jena-arq/src/main/java/com/hp/hpl/jena/sparql/expr/ExprFunction1.java
    
jena/trunk/jena-arq/src/main/java/com/hp/hpl/jena/sparql/expr/ExprFunction2.java
    
jena/trunk/jena-arq/src/main/java/com/hp/hpl/jena/sparql/expr/ExprFunction3.java
    
jena/trunk/jena-arq/src/main/java/com/hp/hpl/jena/sparql/expr/ExprFunctionN.java
    jena/trunk/jena-arq/src/main/java/com/hp/hpl/jena/sparql/expr/ExprLib.java
    jena/trunk/jena-arq/src/main/java/com/hp/hpl/jena/sparql/expr/ExprList.java
    jena/trunk/jena-arq/src/main/java/com/hp/hpl/jena/sparql/expr/ExprNode.java
    jena/trunk/jena-arq/src/main/java/com/hp/hpl/jena/sparql/expr/ExprVar.java
    jena/trunk/jena-arq/src/main/java/com/hp/hpl/jena/sparql/expr/NodeValue.java
    
jena/trunk/jena-security/src/main/java/org/apache/jena/security/query/rewriter/SecuredFunction.java

Modified: jena/trunk/jena-arq/src/main/java/arq/qexpr.java
URL: 
http://svn.apache.org/viewvc/jena/trunk/jena-arq/src/main/java/arq/qexpr.java?rev=1588511&r1=1588510&r2=1588511&view=diff
==============================================================================
--- jena/trunk/jena-arq/src/main/java/arq/qexpr.java (original)
+++ jena/trunk/jena-arq/src/main/java/arq/qexpr.java Fri Apr 18 16:36:53 2014
@@ -37,9 +37,9 @@ import com.hp.hpl.jena.shared.PrefixMapp
 import com.hp.hpl.jena.sparql.ARQConstants ;
 import com.hp.hpl.jena.sparql.core.Prologue ;
 import com.hp.hpl.jena.sparql.engine.ExecutionContext ;
-import com.hp.hpl.jena.sparql.engine.binding.BindingFactory ;
 import com.hp.hpl.jena.sparql.expr.Expr ;
 import com.hp.hpl.jena.sparql.expr.ExprEvalException ;
+import com.hp.hpl.jena.sparql.expr.ExprLib ;
 import com.hp.hpl.jena.sparql.expr.NodeValue ;
 import com.hp.hpl.jena.sparql.function.FunctionEnv ;
 import com.hp.hpl.jena.sparql.sse.WriterSSE ;
@@ -166,7 +166,9 @@ public class qexpr
                 pmap.setNsPrefixes(ARQConstants.getGlobalPrefixMap()) ;
                 pmap.setNsPrefix("", "http://example/";) ;
                 pmap.setNsPrefix("ex", "http://example/ns#";) ;
-                
+//              Node n = asNode() ;
+//              return makeNode(n) ;
+
                 Expr expr = ExprUtils.parse(exprStr, pmap) ;
                 if ( verbose )
                     System.out.print(expr.toString()+" => ") ;
@@ -183,7 +185,7 @@ public class qexpr
                 try {
                     if ( actionCopySubstitute )
                     {
-                        Expr e = expr.copySubstitute(BindingFactory.create(), 
true) ;
+                        Expr e = ExprLib.foldConstants(expr) ;
                         System.out.println(e) ;
                     }
                     else

Modified: 
jena/trunk/jena-arq/src/main/java/com/hp/hpl/jena/sparql/algebra/optimize/ExprTransformConstantFold.java
URL: 
http://svn.apache.org/viewvc/jena/trunk/jena-arq/src/main/java/com/hp/hpl/jena/sparql/algebra/optimize/ExprTransformConstantFold.java?rev=1588511&r1=1588510&r2=1588511&view=diff
==============================================================================
--- 
jena/trunk/jena-arq/src/main/java/com/hp/hpl/jena/sparql/algebra/optimize/ExprTransformConstantFold.java
 (original)
+++ 
jena/trunk/jena-arq/src/main/java/com/hp/hpl/jena/sparql/algebra/optimize/ExprTransformConstantFold.java
 Fri Apr 18 16:36:53 2014
@@ -18,11 +18,14 @@
 
 package com.hp.hpl.jena.sparql.algebra.optimize;
 
-import com.hp.hpl.jena.sparql.algebra.Op;
-import com.hp.hpl.jena.sparql.algebra.TransformCopy;
-import com.hp.hpl.jena.sparql.algebra.Transformer;
-import com.hp.hpl.jena.sparql.engine.binding.Binding;
-import com.hp.hpl.jena.sparql.expr.*;
+import java.util.ArrayList ;
+import java.util.List ;
+
+import com.hp.hpl.jena.sparql.algebra.Op ;
+import com.hp.hpl.jena.sparql.algebra.TransformCopy ;
+import com.hp.hpl.jena.sparql.algebra.Transformer ;
+import com.hp.hpl.jena.sparql.engine.binding.Binding ;
+import com.hp.hpl.jena.sparql.expr.* ;
 
 /**
  * An expression transform that simplifies expressions by constant folding
@@ -31,73 +34,59 @@ import com.hp.hpl.jena.sparql.expr.*;
 public class ExprTransformConstantFold extends ExprTransformCopy {
 
     private Binding b = null;
-
+    
     @Override
     public Expr transform(ExprFunction1 func, Expr expr1) {
-        // System.out.println("transform ExprFunction1: " + func + " - " +
-        // expr1);
-        if (!func.getArg().equals(expr1))
-            func = (ExprFunction1) func.copy(expr1);
-        if (!isFoldable(expr1))
-            return super.transform(func, expr1);
-        Expr transformed = func.copySubstitute(this.b, true);
-        if (transformed.equals(func))
-            return super.transform(func, expr1);
-        return transformed;
+        if (isFoldable(expr1)) {
+            try {
+                return func.eval(expr1.getConstant()) ;
+            } catch (Exception ex) { /* Drop through */ }
+        }
+        return super.transform(func, expr1);
     }
 
     @Override
     public Expr transform(ExprFunction2 func, Expr expr1, Expr expr2) {
-        //System.out.println("transform ExprFunction2: " + func + " - " + 
expr1 + " - " + expr2);
-        if (!func.getArg1().equals(expr1) || !func.getArg2().equals(expr2))
-            func = (ExprFunction2) func.copy(expr1, expr2);
-        if (!isFoldable(expr1, expr2))
-            return super.transform(func, expr1, expr2);
-        Expr transformed = func.copySubstitute(this.b, true);
-        if (transformed.equals(func))
-            return super.transform(func, expr1, expr2);
-        return transformed;
-
+        if (isFoldable(expr1, expr2)) {
+            try {
+                return func.eval(expr1.getConstant(), expr2.getConstant()) ;
+            } catch (Exception ex) { /* Drop through */ }
+        }
+        return super.transform(func, expr1, expr2);
     }
 
     @Override
     public Expr transform(ExprFunction3 func, Expr expr1, Expr expr2, Expr 
expr3) {
-        // System.out.println("transform ExprFunction3: " + func + " - " + 
expr1
-        // + " - " + expr2 + " - " + expr3);
-
-        if (!func.getArg1().equals(expr1) || !func.getArg2().equals(expr2) || 
!func.getArg3().equals(expr3))
-            func = (ExprFunction3) func.copy(expr1, expr2, expr3);
-        if (!isFoldable(expr1, expr2, expr3))
-            return super.transform(func, expr1, expr2, expr3);
-        Expr transformed = func.copySubstitute(this.b, true);
-        if (transformed.equals(func))
-            return super.transform(func, expr1, expr2, expr3);
-        return transformed;
+        if (isFoldable(expr1, expr2, expr3)) {
+            try { 
+                return func.eval(expr1.getConstant(), expr2.getConstant(), 
expr3.getConstant()) ;
+            } catch (Exception ex) { /* Drop through */ }
+        }
+        return super.transform(func, expr1, expr2, expr3);
     }
 
     @Override
     public Expr transform(ExprFunctionN func, ExprList args) {
-        //System.out.println("transform ExprFunctionN: " + func + " - " + 
args);
-        if (!func.getArgs().equals(args.getList()))
-            func = (ExprFunctionN) func.copy(args);
-        if (!isFoldable(args))
-            return super.transform(func, args);
-        Expr transformed = func.copySubstitute(this.b, true);
-        if (transformed.equals(func))
-            return super.transform(func, args);
-        return transformed;
+        if (isFoldable(args)) {
+            List<NodeValue> args2 = new ArrayList<NodeValue>() ;
+            // Need to "cast" to constants
+            for ( Expr e : args )
+                args2.add(e.getConstant()) ;
+            try {
+                return func.eval(args2) ;
+            } catch (Exception ex) { /* Drop through */ }
+        }
+        return super.transform(func, args);
     }
 
     @Override
     public Expr transform(ExprFunctionOp funcOp, ExprList args, Op opArg) {
-        // Calling copySubstitute() likely won't work for these cases
-
         // Manually transform each argument
         Op op = Transformer.transform(new TransformCopy(), this, 
funcOp.getGraphPattern());
         ExprList newArgs = new ExprList();
         for (int i = 0; i < args.size(); i++) {
             Expr curr = args.get(i);
-            Expr newArg = curr.copySubstitute(this.b, true);
+            Expr newArg = ExprTransformer.transform(this, curr) ;
             newArgs.add(newArg);
         }
         return funcOp.copy(newArgs, op);

Modified: 
jena/trunk/jena-arq/src/main/java/com/hp/hpl/jena/sparql/expr/E_Exists.java
URL: 
http://svn.apache.org/viewvc/jena/trunk/jena-arq/src/main/java/com/hp/hpl/jena/sparql/expr/E_Exists.java?rev=1588511&r1=1588510&r2=1588511&view=diff
==============================================================================
--- jena/trunk/jena-arq/src/main/java/com/hp/hpl/jena/sparql/expr/E_Exists.java 
(original)
+++ jena/trunk/jena-arq/src/main/java/com/hp/hpl/jena/sparql/expr/E_Exists.java 
Fri Apr 18 16:36:53 2014
@@ -49,9 +49,8 @@ public class E_Exists extends ExprFuncti
     }
 
     @Override
-    public Expr copySubstitute(Binding binding, boolean foldConstants)
+    public Expr copySubstitute(Binding binding)
     {
-        // Does not pass down fold constants.  Oh well.
         Op op2 = Substitute.substitute(getGraphPattern(), binding) ;
         return new E_Exists(getElement(), op2) ;
     }

Modified: 
jena/trunk/jena-arq/src/main/java/com/hp/hpl/jena/sparql/expr/E_NotExists.java
URL: 
http://svn.apache.org/viewvc/jena/trunk/jena-arq/src/main/java/com/hp/hpl/jena/sparql/expr/E_NotExists.java?rev=1588511&r1=1588510&r2=1588511&view=diff
==============================================================================
--- 
jena/trunk/jena-arq/src/main/java/com/hp/hpl/jena/sparql/expr/E_NotExists.java 
(original)
+++ 
jena/trunk/jena-arq/src/main/java/com/hp/hpl/jena/sparql/expr/E_NotExists.java 
Fri Apr 18 16:36:53 2014
@@ -50,9 +50,8 @@ public class E_NotExists extends ExprFun
     }
 
     @Override
-    public Expr copySubstitute(Binding binding, boolean foldConstants)
+    public Expr copySubstitute(Binding binding)
     {
-        // Does not pass down fold constants.  Oh well.
         Op op2 = Substitute.substitute(getGraphPattern(), binding) ;
         return new E_NotExists(getElement(), op2) ;
     }

Modified: 
jena/trunk/jena-arq/src/main/java/com/hp/hpl/jena/sparql/expr/E_Scalar.java
URL: 
http://svn.apache.org/viewvc/jena/trunk/jena-arq/src/main/java/com/hp/hpl/jena/sparql/expr/E_Scalar.java?rev=1588511&r1=1588510&r2=1588511&view=diff
==============================================================================
--- jena/trunk/jena-arq/src/main/java/com/hp/hpl/jena/sparql/expr/E_Scalar.java 
(original)
+++ jena/trunk/jena-arq/src/main/java/com/hp/hpl/jena/sparql/expr/E_Scalar.java 
Fri Apr 18 16:36:53 2014
@@ -1,62 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package com.hp.hpl.jena.sparql.expr;
-
-import com.hp.hpl.jena.sparql.algebra.Op ;
-import com.hp.hpl.jena.sparql.engine.QueryIterator ;
-import com.hp.hpl.jena.sparql.engine.binding.Binding ;
-import com.hp.hpl.jena.sparql.function.FunctionEnv ;
-import com.hp.hpl.jena.sparql.graph.NodeTransform ;
-import com.hp.hpl.jena.sparql.syntax.Element ;
-
-/** A scalar subquery that returns a single row/column. */
-public class E_Scalar extends ExprFunctionOp
-{
-    // Work-in-progress
-    private static final String symbol = "scalar" ;
-    
-    protected E_Scalar(Element el, Op op)
-    {
-        super(symbol, el, op) ;
-    }
-
-    @Override
-    public ExprFunctionOp copy(ExprList args, Op x)
-    {
-        return null ;
-    }
-
-    @Override
-    protected NodeValue eval(Binding binding, QueryIterator iter, FunctionEnv 
env)
-    {
-        return null ;
-    }
-
-    @Override
-    public Expr applyNodeTransform(NodeTransform transform)
-    {
-        return null ;
-    }
-
-    @Override
-    public Expr copySubstitute(Binding binding, boolean foldConstants)
-    {
-        return null ;
-    }
-}

Modified: 
jena/trunk/jena-arq/src/main/java/com/hp/hpl/jena/sparql/expr/Expr.java
URL: 
http://svn.apache.org/viewvc/jena/trunk/jena-arq/src/main/java/com/hp/hpl/jena/sparql/expr/Expr.java?rev=1588511&r1=1588510&r2=1588511&view=diff
==============================================================================
--- jena/trunk/jena-arq/src/main/java/com/hp/hpl/jena/sparql/expr/Expr.java 
(original)
+++ jena/trunk/jena-arq/src/main/java/com/hp/hpl/jena/sparql/expr/Expr.java Fri 
Apr 18 16:36:53 2014
@@ -62,16 +62,14 @@ public interface Expr
      */
     public NodeValue eval(Binding binding, FunctionEnv env) ;
     
-    // These (copySubstitute, applyNodeTransform) predate transform support 
and should be changed.
-    // But they work so there is no hurry.
-    
     /** Deep copy with substitution */
     public Expr copySubstitute(Binding binding) ;
 
-//    /** Deep copy with substitution, possibly collapsing constant 
sub-expressions */
-// Issues: 
-// 1/ folding constants should be separated out (static optimization)
-// 2/ Danger of some functions not evaluating if the FunctionEnv is not 
available.
+    
+    /** Deep copy with substitution, possibly collapsing constant 
sub-expressions.
+     * @deprecated See ExprTransformConstantFold for constant folding.
+     */
+    @Deprecated  // To be removed.
     public Expr copySubstitute(Binding binding, boolean foldConstants) ;
 
     /**
@@ -79,9 +77,6 @@ public interface Expr
      */
     public Expr applyNodeTransform(NodeTransform transform) ;
 
-//    /** Transform. */
-//    public Expr apply(ExprTransform transform) ;
-    
     /** Deep copy */
     public Expr deepCopy() ;
     

Modified: 
jena/trunk/jena-arq/src/main/java/com/hp/hpl/jena/sparql/expr/ExprAggregator.java
URL: 
http://svn.apache.org/viewvc/jena/trunk/jena-arq/src/main/java/com/hp/hpl/jena/sparql/expr/ExprAggregator.java?rev=1588511&r1=1588510&r2=1588511&view=diff
==============================================================================
--- 
jena/trunk/jena-arq/src/main/java/com/hp/hpl/jena/sparql/expr/ExprAggregator.java
 (original)
+++ 
jena/trunk/jena-arq/src/main/java/com/hp/hpl/jena/sparql/expr/ExprAggregator.java
 Fri Apr 18 16:36:53 2014
@@ -99,7 +99,7 @@ public class ExprAggregator extends Expr
     { return aggregator.toString() ; }
     
     @Override
-    public ExprAggregator copySubstitute(Binding binding, boolean 
foldConstants)
+    public ExprAggregator copySubstitute(Binding binding)
     {
         Var v = var ;
         Aggregator agg = aggregator ;

Modified: 
jena/trunk/jena-arq/src/main/java/com/hp/hpl/jena/sparql/expr/ExprFunction0.java
URL: 
http://svn.apache.org/viewvc/jena/trunk/jena-arq/src/main/java/com/hp/hpl/jena/sparql/expr/ExprFunction0.java?rev=1588511&r1=1588510&r2=1588511&view=diff
==============================================================================
--- 
jena/trunk/jena-arq/src/main/java/com/hp/hpl/jena/sparql/expr/ExprFunction0.java
 (original)
+++ 
jena/trunk/jena-arq/src/main/java/com/hp/hpl/jena/sparql/expr/ExprFunction0.java
 Fri Apr 18 16:36:53 2014
@@ -62,7 +62,7 @@ public abstract class ExprFunction0 exte
     public abstract Expr copy() ;
     
     @Override
-    final public Expr copySubstitute(Binding binding, boolean foldConstants)
+    final public Expr copySubstitute(Binding binding)
     {
         return copy() ;
     }

Modified: 
jena/trunk/jena-arq/src/main/java/com/hp/hpl/jena/sparql/expr/ExprFunction1.java
URL: 
http://svn.apache.org/viewvc/jena/trunk/jena-arq/src/main/java/com/hp/hpl/jena/sparql/expr/ExprFunction1.java?rev=1588511&r1=1588510&r2=1588511&view=diff
==============================================================================
--- 
jena/trunk/jena-arq/src/main/java/com/hp/hpl/jena/sparql/expr/ExprFunction1.java
 (original)
+++ 
jena/trunk/jena-arq/src/main/java/com/hp/hpl/jena/sparql/expr/ExprFunction1.java
 Fri Apr 18 16:36:53 2014
@@ -22,7 +22,6 @@ import org.apache.jena.atlas.lib.Lib ;
 
 import com.hp.hpl.jena.sparql.engine.binding.Binding ;
 import com.hp.hpl.jena.sparql.function.FunctionEnv ;
-import com.hp.hpl.jena.sparql.function.FunctionEnvBase ;
 import com.hp.hpl.jena.sparql.graph.NodeTransform ;
 
 /** A function that has a single argument */
@@ -79,17 +78,9 @@ public abstract class ExprFunction1 exte
     protected NodeValue evalSpecial(Binding binding, FunctionEnv env) { return 
null ; } 
     
     @Override
-    final public Expr copySubstitute(Binding binding, boolean foldConstants)
+    final public Expr copySubstitute(Binding binding)
     {
-        Expr e = (expr == null ? null : expr.copySubstitute(binding, 
foldConstants)) ;
-        
-        if ( foldConstants)
-        {
-            try {
-                if ( e != null && e.isConstant() )
-                    return eval(e.getConstant(), new FunctionEnvBase()) ;
-            } catch (ExprEvalException ex) { /* Drop through */ }
-        }
+        Expr e = (expr == null ? null : expr.copySubstitute(binding)) ;
         return copy(e) ;
     }
 

Modified: 
jena/trunk/jena-arq/src/main/java/com/hp/hpl/jena/sparql/expr/ExprFunction2.java
URL: 
http://svn.apache.org/viewvc/jena/trunk/jena-arq/src/main/java/com/hp/hpl/jena/sparql/expr/ExprFunction2.java?rev=1588511&r1=1588510&r2=1588511&view=diff
==============================================================================
--- 
jena/trunk/jena-arq/src/main/java/com/hp/hpl/jena/sparql/expr/ExprFunction2.java
 (original)
+++ 
jena/trunk/jena-arq/src/main/java/com/hp/hpl/jena/sparql/expr/ExprFunction2.java
 Fri Apr 18 16:36:53 2014
@@ -86,23 +86,11 @@ public abstract class ExprFunction2 exte
 
     public abstract NodeValue eval(NodeValue x, NodeValue y) ; 
 
-    // ---- Duplication
-    
     @Override
-    final public Expr copySubstitute(Binding binding, boolean foldConstants)
+    final public Expr copySubstitute(Binding binding)
     {
-        //System.out.println("ExprFunction2: "+this) ;
-        
-        Expr e1 = (expr1 == null ? null : expr1.copySubstitute(binding, 
foldConstants)) ;
-        Expr e2 = (expr2 == null ? null : expr2.copySubstitute(binding, 
foldConstants)) ;
-        
-        if ( foldConstants)
-        {
-            try {
-                if ( e1 != null && e2 != null && e1.isConstant() && 
e2.isConstant() )
-                    return eval(e1.getConstant(), e2.getConstant()) ;
-            } catch (ExprEvalException ex) { /* Drop through */ }
-        }
+        Expr e1 = (expr1 == null ? null : expr1.copySubstitute(binding)) ;
+        Expr e2 = (expr2 == null ? null : expr2.copySubstitute(binding)) ;
         return copy(e1, e2) ;
     }
     

Modified: 
jena/trunk/jena-arq/src/main/java/com/hp/hpl/jena/sparql/expr/ExprFunction3.java
URL: 
http://svn.apache.org/viewvc/jena/trunk/jena-arq/src/main/java/com/hp/hpl/jena/sparql/expr/ExprFunction3.java?rev=1588511&r1=1588510&r2=1588511&view=diff
==============================================================================
--- 
jena/trunk/jena-arq/src/main/java/com/hp/hpl/jena/sparql/expr/ExprFunction3.java
 (original)
+++ 
jena/trunk/jena-arq/src/main/java/com/hp/hpl/jena/sparql/expr/ExprFunction3.java
 Fri Apr 18 16:36:53 2014
@@ -96,20 +96,11 @@ public abstract class ExprFunction3 exte
     // ---- Duplication
     
     @Override
-    final public Expr copySubstitute(Binding binding, boolean foldConstants)
+    final public Expr copySubstitute(Binding binding)
     {
-        Expr e1 = (expr1 == null ? null : expr1.copySubstitute(binding, 
foldConstants)) ;
-        Expr e2 = (expr2 == null ? null : expr2.copySubstitute(binding, 
foldConstants)) ;
-        Expr e3 = (expr3 == null ? null : expr3.copySubstitute(binding, 
foldConstants)) ;
-        
-        if ( foldConstants)
-        {
-            try {
-                if ( e1 != null && e2 != null && e3 != null &&
-                     e1.isConstant() && e2.isConstant() && e3.isConstant() )
-                    return eval(e1.getConstant(), e2.getConstant(), 
e3.getConstant()) ;
-            } catch (ExprEvalException ex) { /* Drop through */ }
-        }
+        Expr e1 = (expr1 == null ? null : expr1.copySubstitute(binding)) ;
+        Expr e2 = (expr2 == null ? null : expr2.copySubstitute(binding)) ;
+        Expr e3 = (expr3 == null ? null : expr3.copySubstitute(binding)) ;
         return copy(e1, e2, e3) ;
     }
     

Modified: 
jena/trunk/jena-arq/src/main/java/com/hp/hpl/jena/sparql/expr/ExprFunctionN.java
URL: 
http://svn.apache.org/viewvc/jena/trunk/jena-arq/src/main/java/com/hp/hpl/jena/sparql/expr/ExprFunctionN.java?rev=1588511&r1=1588510&r2=1588511&view=diff
==============================================================================
--- 
jena/trunk/jena-arq/src/main/java/com/hp/hpl/jena/sparql/expr/ExprFunctionN.java
 (original)
+++ 
jena/trunk/jena-arq/src/main/java/com/hp/hpl/jena/sparql/expr/ExprFunctionN.java
 Fri Apr 18 16:36:53 2014
@@ -21,7 +21,6 @@ package com.hp.hpl.jena.sparql.expr;
 import java.util.ArrayList ;
 import java.util.List ;
 
-import com.hp.hpl.jena.sparql.ARQInternalErrorException;
 import com.hp.hpl.jena.sparql.engine.binding.Binding ;
 import com.hp.hpl.jena.sparql.function.FunctionEnv ;
 import com.hp.hpl.jena.sparql.graph.NodeTransform ;
@@ -69,36 +68,16 @@ public abstract class ExprFunctionN exte
     public List<Expr> getArgs() { return args.getList() ; }
 
     @Override
-    public Expr copySubstitute(Binding binding, boolean foldConstants)
+    public Expr copySubstitute(Binding binding)
     {
         ExprList newArgs = new ExprList() ;
         for ( int i = 1 ; i <= numArgs() ; i++ )
         {
             Expr e = getArg(i) ;
-            e = e.copySubstitute(binding, foldConstants) ;
+            e = e.copySubstitute(binding) ;
             newArgs.add(e) ;
         }
-        
-        if (!foldConstants) 
-            return copy(newArgs);
-        
-        // Can we fold the whole expression?
-        List<NodeValue> values = new ArrayList<NodeValue>();
-        for (Expr e : newArgs) {
-            // Can't fold if anything is null/non-constant
-            if (e == null || !e.isConstant()) return copy(newArgs);
-            values.add(e.getConstant());
-        }
-        
-        try {
-            // Try to fold whole expression
-            return eval(values);
-        } catch (ExprEvalException ex) {
-            return copy(newArgs);
-        } catch (ARQInternalErrorException ex) {
-            // May show up when trying to fold certain things
-            return copy(newArgs);
-        }
+        return copy(newArgs);
     }
 
     @Override

Modified: 
jena/trunk/jena-arq/src/main/java/com/hp/hpl/jena/sparql/expr/ExprLib.java
URL: 
http://svn.apache.org/viewvc/jena/trunk/jena-arq/src/main/java/com/hp/hpl/jena/sparql/expr/ExprLib.java?rev=1588511&r1=1588510&r2=1588511&view=diff
==============================================================================
--- jena/trunk/jena-arq/src/main/java/com/hp/hpl/jena/sparql/expr/ExprLib.java 
(original)
+++ jena/trunk/jena-arq/src/main/java/com/hp/hpl/jena/sparql/expr/ExprLib.java 
Fri Apr 18 16:36:53 2014
@@ -19,10 +19,20 @@
 package com.hp.hpl.jena.sparql.expr;
 
 import com.hp.hpl.jena.sparql.ARQInternalErrorException ;
+import com.hp.hpl.jena.sparql.algebra.optimize.ExprTransformConstantFold ;
 import com.hp.hpl.jena.sparql.core.Var ;
 
 public class ExprLib
 {
+    /** Attempt to fold any sub-expressions of the Expr.
+     * Return an expression that is euqivalent to the argument but maybe 
simpler.    
+     * @param expr
+     * @return Expression
+     */
+    public static Expr foldConstants(Expr expr) {
+        return ExprTransformer.transform(new ExprTransformConstantFold(), 
expr) ;
+    }
+
     /** transform an expression that may involve aggregates into one that just 
uses the variable for the aggregate */  
 
     public static Expr replaceAggregateByVariable(Expr expr)

Modified: 
jena/trunk/jena-arq/src/main/java/com/hp/hpl/jena/sparql/expr/ExprList.java
URL: 
http://svn.apache.org/viewvc/jena/trunk/jena-arq/src/main/java/com/hp/hpl/jena/sparql/expr/ExprList.java?rev=1588511&r1=1588510&r2=1588511&view=diff
==============================================================================
--- jena/trunk/jena-arq/src/main/java/com/hp/hpl/jena/sparql/expr/ExprList.java 
(original)
+++ jena/trunk/jena-arq/src/main/java/com/hp/hpl/jena/sparql/expr/ExprList.java 
Fri Apr 18 16:36:53 2014
@@ -75,14 +75,13 @@ public class ExprList implements Iterabl
             expr.varsMentioned(acc) ;
     }
     
-    public ExprList copySubstitute(Binding binding) { return 
copySubstitute(binding, false) ; }
-    public ExprList copySubstitute(Binding binding, boolean foldConstants)
+    public ExprList copySubstitute(Binding binding)
     {
         ExprList x = new ExprList() ;
         for ( Iterator<Expr> iter = expressions.iterator() ; iter.hasNext() ; )
         {
             Expr expr = iter.next();
-            expr = expr.copySubstitute(binding, foldConstants) ;
+            expr = expr.copySubstitute(binding) ;
             x.add(expr) ;
         }
         return x ;

Modified: 
jena/trunk/jena-arq/src/main/java/com/hp/hpl/jena/sparql/expr/ExprNode.java
URL: 
http://svn.apache.org/viewvc/jena/trunk/jena-arq/src/main/java/com/hp/hpl/jena/sparql/expr/ExprNode.java?rev=1588511&r1=1588510&r2=1588511&view=diff
==============================================================================
--- jena/trunk/jena-arq/src/main/java/com/hp/hpl/jena/sparql/expr/ExprNode.java 
(original)
+++ jena/trunk/jena-arq/src/main/java/com/hp/hpl/jena/sparql/expr/ExprNode.java 
Fri Apr 18 16:36:53 2014
@@ -78,15 +78,21 @@ public abstract class ExprNode implement
     }
     
     @Override
-    final public Expr copySubstitute(Binding binding)
-    { return copySubstitute(binding, false) ; }
+    final public Expr deepCopy()                     
+    { return copySubstitute(null) ; }
     
     @Override
-    final public Expr deepCopy()                     
-    { return copySubstitute(null, false) ; }
+    public abstract Expr copySubstitute(Binding binding) ;
     
     @Override
-    public abstract Expr copySubstitute(Binding binding, boolean 
foldConstants) ;
+    @Deprecated
+    final
+    public Expr copySubstitute(Binding binding, boolean foldConstants) {
+        Expr expr = copySubstitute(binding) ;
+        if ( foldConstants )
+            expr = ExprLib.foldConstants(expr) ;
+        return expr ;
+    }
     
     @Override
     public abstract Expr applyNodeTransform(NodeTransform transform) ;

Modified: 
jena/trunk/jena-arq/src/main/java/com/hp/hpl/jena/sparql/expr/ExprVar.java
URL: 
http://svn.apache.org/viewvc/jena/trunk/jena-arq/src/main/java/com/hp/hpl/jena/sparql/expr/ExprVar.java?rev=1588511&r1=1588510&r2=1588511&view=diff
==============================================================================
--- jena/trunk/jena-arq/src/main/java/com/hp/hpl/jena/sparql/expr/ExprVar.java 
(original)
+++ jena/trunk/jena-arq/src/main/java/com/hp/hpl/jena/sparql/expr/ExprVar.java 
Fri Apr 18 16:36:53 2014
@@ -66,7 +66,7 @@ public class ExprVar extends ExprNode
     }
     
     @Override
-    public Expr copySubstitute(Binding binding, boolean foldConstants)
+    public Expr copySubstitute(Binding binding)
     {
         Var v = varNode ;  
         if ( binding == null || !binding.contains(v) )

Modified: 
jena/trunk/jena-arq/src/main/java/com/hp/hpl/jena/sparql/expr/NodeValue.java
URL: 
http://svn.apache.org/viewvc/jena/trunk/jena-arq/src/main/java/com/hp/hpl/jena/sparql/expr/NodeValue.java?rev=1588511&r1=1588510&r2=1588511&view=diff
==============================================================================
--- 
jena/trunk/jena-arq/src/main/java/com/hp/hpl/jena/sparql/expr/NodeValue.java 
(original)
+++ 
jena/trunk/jena-arq/src/main/java/com/hp/hpl/jena/sparql/expr/NodeValue.java 
Fri Apr 18 16:36:53 2014
@@ -452,11 +452,9 @@ public abstract class NodeValue extends 
 
     // NodeValues are immutable so no need to duplicate.
     @Override
-    public Expr copySubstitute(Binding binding, boolean foldConstants)
-    {  // return this ; 
-        //System.out.println("NodeValue: " + this);
-        Node n = asNode() ;
-        return makeNode(n) ;
+    public Expr copySubstitute(Binding binding)
+    {
+        return this ;
     }
     
     @Override

Modified: 
jena/trunk/jena-security/src/main/java/org/apache/jena/security/query/rewriter/SecuredFunction.java
URL: 
http://svn.apache.org/viewvc/jena/trunk/jena-security/src/main/java/org/apache/jena/security/query/rewriter/SecuredFunction.java?rev=1588511&r1=1588510&r2=1588511&view=diff
==============================================================================
--- 
jena/trunk/jena-security/src/main/java/org/apache/jena/security/query/rewriter/SecuredFunction.java
 (original)
+++ 
jena/trunk/jena-security/src/main/java/org/apache/jena/security/query/rewriter/SecuredFunction.java
 Fri Apr 18 16:36:53 2014
@@ -101,7 +101,7 @@ public class SecuredFunction extends Exp
 
 
        @Override
-       public Expr copySubstitute( Binding binding, boolean foldConstants )
+       public Expr copySubstitute( Binding binding )
        {
                return this;
        }


Reply via email to