Author: rvesse
Date: Thu Apr 10 04:32:08 2014
New Revision: 1586211

URL: http://svn.apache.org/r1586211
Log:
Improve ExprTransformConstantFold to not unecessarily call copySubstitute on 
non-foldable expressions (JENA-630)

Modified:
    
jena/trunk/jena-arq/src/main/java/com/hp/hpl/jena/sparql/algebra/optimize/ExprTransformConstantFold.java

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=1586211&r1=1586210&r2=1586211&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
 Thu Apr 10 04:32:08 2014
@@ -38,6 +38,8 @@ public class ExprTransformConstantFold e
         // expr1);
         if (!func.getArg().equals(expr1))
             func = (ExprFunction1) func.copy(expr1);
+        if (!isFoldable(expr1))
+            return func.copy(expr1);
         Expr transformed = func.copySubstitute(this.b, true);
         if (transformed.equals(func))
             return super.transform(func, expr1);
@@ -46,10 +48,11 @@ public class ExprTransformConstantFold e
 
     @Override
     public Expr transform(ExprFunction2 func, Expr expr1, Expr expr2) {
-        // System.out.println("transform ExprFunction2: " + func + " - " + 
expr1
-        // + " - " + 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 func.copy(expr1, expr2);
         Expr transformed = func.copySubstitute(this.b, true);
         if (transformed.equals(func))
             return super.transform(func, expr1, expr2);
@@ -64,6 +67,8 @@ public class ExprTransformConstantFold e
 
         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 func.copy(expr1, expr2, expr3);
         Expr transformed = func.copySubstitute(this.b, true);
         if (transformed.equals(func))
             return super.transform(func, expr1, expr2, expr3);
@@ -74,6 +79,8 @@ public class ExprTransformConstantFold e
     public Expr transform(ExprFunctionN func, ExprList args) {
         if (!func.getArgs().equals(args.getList()))
             func = (ExprFunctionN) func.copy(args);
+        if (!isFoldable(args))
+            return func.copy(args);
         Expr transformed = func.copySubstitute(this.b, true);
         if (transformed.equals(func))
             return super.transform(func, args);
@@ -95,4 +102,19 @@ public class ExprTransformConstantFold e
         return funcOp.copy(newArgs, op);
     }
 
+    private boolean isFoldable(ExprList exprs) {
+        for (Expr e : exprs) {
+            if (e == null || !e.isConstant())
+                return false;
+        }
+        return true;
+    }
+
+    private boolean isFoldable(Expr... exprs) {
+        for (Expr e : exprs) {
+            if (e == null || !e.isConstant())
+                return false;
+        }
+        return true;
+    }
 }


Reply via email to