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;
}