This is an automated email from the ASF dual-hosted git repository.

afs pushed a commit to branch main
in repository https://gitbox.apache.org/repos/asf/jena.git


The following commit(s) were added to refs/heads/main by this push:
     new e9f7445a95 GH-4174: Add ExprTransform.transform(ExprTripleTerm); use 
in ApplyTransformVisitor
e9f7445a95 is described below

commit e9f7445a9585cc7877d0941a384fe30ef0dca2d2
Author: Andy Seaborne <[email protected]>
AuthorDate: Sat Aug 29 18:09:51 2026 +0100

    GH-4174: Add ExprTransform.transform(ExprTripleTerm); use in 
ApplyTransformVisitor
---
 .../apache/jena/sparql/algebra/op/OpProject.java   | 15 +++++++---
 .../algebra/optimize/TransformScopeRename.java     |  2 +-
 .../algebra/walker/ApplyTransformVisitor.java      |  5 ++--
 .../org/apache/jena/sparql/expr/ExprTransform.java |  1 +
 .../apache/jena/sparql/expr/ExprTransformBase.java |  1 +
 .../apache/jena/sparql/expr/ExprTransformCopy.java | 35 ++++++++++++++--------
 .../apache/jena/sparql/expr/ExprTripleTerm.java    |  9 ++++--
 .../jena/sparql/graph/NodeTransformExpr.java       |  6 ++++
 .../sparql/algebra/optimize/TestVarRename.java     | 27 +++++++++++++----
 9 files changed, 73 insertions(+), 28 deletions(-)

diff --git 
a/jena-arq/src/main/java/org/apache/jena/sparql/algebra/op/OpProject.java 
b/jena-arq/src/main/java/org/apache/jena/sparql/algebra/op/OpProject.java
index 5655fa2ea7..25fa872abb 100644
--- a/jena-arq/src/main/java/org/apache/jena/sparql/algebra/op/OpProject.java
+++ b/jena-arq/src/main/java/org/apache/jena/sparql/algebra/op/OpProject.java
@@ -45,14 +45,21 @@ public class OpProject extends OpModifier
 
     @Override
     public String getName() { return Tags.tagProject; }
+
     @Override
-    public void visit(OpVisitor opVisitor)  { opVisitor.visit(this); }
+    public void visit(OpVisitor opVisitor) {
+        opVisitor.visit(this);
+    }
+
     @Override
-    public Op1 copy(Op subOp)                { return new OpProject(subOp, 
vars); }
+    public Op1 copy(Op subOp) {
+        return new OpProject(subOp, vars);
+    }
 
     @Override
-    public Op apply(Transform transform, Op subOp)
-    { return transform.transform(this, subOp); }
+    public Op apply(Transform transform, Op subOp) {
+        return transform.transform(this, subOp);
+    }
 
     @Override
     public int hashCode() {
diff --git 
a/jena-arq/src/main/java/org/apache/jena/sparql/algebra/optimize/TransformScopeRename.java
 
b/jena-arq/src/main/java/org/apache/jena/sparql/algebra/optimize/TransformScopeRename.java
index 7626aa6545..df7be52e8a 100644
--- 
a/jena-arq/src/main/java/org/apache/jena/sparql/algebra/optimize/TransformScopeRename.java
+++ 
b/jena-arq/src/main/java/org/apache/jena/sparql/algebra/optimize/TransformScopeRename.java
@@ -99,7 +99,7 @@ public class TransformScopeRename {
                 // Need to find the right project
                 // We already stripped outer modifier.
                 if ( projectCount >= projectRenameDepth )
-                    // Inner ones already done.
+                    // subOp already done.
                     subOp = Rename.renameVars(subOp, opProject.getVars());
                 return super.transform(opProject, subOp);
             }
diff --git 
a/jena-arq/src/main/java/org/apache/jena/sparql/algebra/walker/ApplyTransformVisitor.java
 
b/jena-arq/src/main/java/org/apache/jena/sparql/algebra/walker/ApplyTransformVisitor.java
index f655b7c813..6fa0101d5d 100644
--- 
a/jena-arq/src/main/java/org/apache/jena/sparql/algebra/walker/ApplyTransformVisitor.java
+++ 
b/jena-arq/src/main/java/org/apache/jena/sparql/algebra/walker/ApplyTransformVisitor.java
@@ -483,9 +483,8 @@ public class ApplyTransformVisitor implements 
OpVisitorByTypeAndExpr, ExprVisito
     }
 
     @Override
-    public void visit(ExprTripleTerm tripleTerm) {
-        //Expr e = tripleTerm.apply(exprTransform) ;
-        Expr e = tripleTerm;
+    public void visit(ExprTripleTerm exprTripleTerm) {
+        Expr e = exprTripleTerm.apply(exprTransform);
         push(exprStack, e) ;
     }
 
diff --git 
a/jena-arq/src/main/java/org/apache/jena/sparql/expr/ExprTransform.java 
b/jena-arq/src/main/java/org/apache/jena/sparql/expr/ExprTransform.java
index 6901b59470..195046cfa5 100644
--- a/jena-arq/src/main/java/org/apache/jena/sparql/expr/ExprTransform.java
+++ b/jena-arq/src/main/java/org/apache/jena/sparql/expr/ExprTransform.java
@@ -46,5 +46,6 @@ public interface ExprTransform
 
     public Expr transform(ExprNone exprNone);
     public Expr transform(ExprVar exprVar);
+    public Expr transform(ExprTripleTerm exprTripleTerm);
     public Expr transform(ExprAggregator eAgg);
 }
diff --git 
a/jena-arq/src/main/java/org/apache/jena/sparql/expr/ExprTransformBase.java 
b/jena-arq/src/main/java/org/apache/jena/sparql/expr/ExprTransformBase.java
index da065624a0..c7b89f3eec 100644
--- a/jena-arq/src/main/java/org/apache/jena/sparql/expr/ExprTransformBase.java
+++ b/jena-arq/src/main/java/org/apache/jena/sparql/expr/ExprTransformBase.java
@@ -34,5 +34,6 @@ public class ExprTransformBase implements ExprTransform
     @Override public Expr transform(NodeValue nv)                              
               { return nv; }
     @Override public Expr transform(ExprNone exprNone)                         
               { return exprNone; }
     @Override public Expr transform(ExprVar ev)                                
               { return ev; }
+    @Override public Expr transform(ExprTripleTerm exprTripleTerm)             
               { return exprTripleTerm; }
     @Override public Expr transform(ExprAggregator eAgg)                       
               { return eAgg; }
 }
diff --git 
a/jena-arq/src/main/java/org/apache/jena/sparql/expr/ExprTransformCopy.java 
b/jena-arq/src/main/java/org/apache/jena/sparql/expr/ExprTransformCopy.java
index 597af9ef0a..a35d2ea547 100644
--- a/jena-arq/src/main/java/org/apache/jena/sparql/expr/ExprTransformCopy.java
+++ b/jena-arq/src/main/java/org/apache/jena/sparql/expr/ExprTransformCopy.java
@@ -30,26 +30,26 @@ public class ExprTransformCopy implements ExprTransform
     public static final boolean COPY_ALWAYS         = true;
     public static final boolean COPY_ONLY_ON_CHANGE = false;
     private boolean alwaysCopy = false;
-    
+
     public ExprTransformCopy()                          { 
this(COPY_ONLY_ON_CHANGE); }
     public ExprTransformCopy(boolean alwaysDuplicate)   { this.alwaysCopy = 
alwaysDuplicate; }
-    
+
     @Override
-    public Expr transform(ExprFunction0 func)                   
+    public Expr transform(ExprFunction0 func)
     { return xform(func); }
 
     @Override
-    public Expr transform(ExprFunction1 func, Expr expr1)                   
+    public Expr transform(ExprFunction1 func, Expr expr1)
     { return xform(func, expr1); }
-    
+
     @Override
     public Expr transform(ExprFunction2 func, Expr expr1, Expr expr2)
     { return xform(func, expr1, expr2); }
-    
+
     @Override
     public Expr transform(ExprFunction3 func, Expr expr1, Expr expr2, Expr 
expr3)
     { return xform(func, expr1, expr2, expr3); }
-    
+
     @Override
     public Expr transform(ExprFunctionN func, ExprList args)
     { return xform(func, args); }
@@ -57,21 +57,25 @@ public class ExprTransformCopy implements ExprTransform
     @Override
     public Expr transform(ExprFunctionOp funcOp, ExprList args, Op opArg)
     { return xform(funcOp, args, opArg); }
-    
+
     @Override
-    public Expr transform(NodeValue nv)     
+    public Expr transform(NodeValue nv)
     { return xform(nv); }
-    
-    @Override 
+
+    @Override
     public Expr transform(ExprNone exprNone)
     { return xform(exprNone); }
 
     @Override
-    public Expr transform(ExprVar exprVar)       
+    public Expr transform(ExprVar exprVar)
     { return xform(exprVar); }
 
     @Override
-    public Expr transform(ExprAggregator eAgg)       
+    public Expr transform(ExprTripleTerm exprTripleTerm)
+    { return xform(exprTripleTerm); }
+
+    @Override
+    public Expr transform(ExprAggregator eAgg)
     { return xform(eAgg); }
 
     private Expr xform(ExprFunction0 func) {
@@ -139,6 +143,11 @@ public class ExprTransformCopy implements ExprTransform
         return exprVar;
     }
 
+    private Expr xform(ExprTripleTerm exprTripleTerm) {
+        return exprTripleTerm;
+    }
+
+
     private Expr xform(ExprAggregator eAgg) {
         if ( !alwaysCopy )
             return eAgg;
diff --git 
a/jena-arq/src/main/java/org/apache/jena/sparql/expr/ExprTripleTerm.java 
b/jena-arq/src/main/java/org/apache/jena/sparql/expr/ExprTripleTerm.java
index 6b8c1c3aa6..c03b7f844c 100644
--- a/jena-arq/src/main/java/org/apache/jena/sparql/expr/ExprTripleTerm.java
+++ b/jena-arq/src/main/java/org/apache/jena/sparql/expr/ExprTripleTerm.java
@@ -54,8 +54,6 @@ public class ExprTripleTerm extends ExprNode {
 //        this.nvTripleTerm = ( tripleTerm.isConcrete() ) ?  
NodeValue.makeNode(tripleTerm) : null;
 //    }
 
-    @Override public void visit(ExprVisitor visitor) { visitor.visit(this); }
-
     @Override public NodeValue eval(Binding binding, FunctionEnv env) {
         if ( nvTripleTerm != null )
             return nvTripleTerm;
@@ -91,6 +89,13 @@ public class ExprTripleTerm extends ExprNode {
         return new ExprTripleTerm(nodeTriple);
     }
 
+    @Override
+    public void visit(ExprVisitor visitor) { visitor.visit(this); }
+
+    public Expr apply(ExprTransform exprTransform) {
+        return exprTransform.transform(this);
+    }
+
     @Override
     public Expr applyNodeTransform(NodeTransform transform) {
         Node n = transform.apply(tripleTerm);
diff --git 
a/jena-arq/src/main/java/org/apache/jena/sparql/graph/NodeTransformExpr.java 
b/jena-arq/src/main/java/org/apache/jena/sparql/graph/NodeTransformExpr.java
index 9dae7377b0..1d6856835b 100644
--- a/jena-arq/src/main/java/org/apache/jena/sparql/graph/NodeTransformExpr.java
+++ b/jena-arq/src/main/java/org/apache/jena/sparql/graph/NodeTransformExpr.java
@@ -52,6 +52,12 @@ public class NodeTransformExpr extends ExprTransformCopy {
         return transform(exprVar.getAsNode());
     }
 
+    /** Transform a triple term - this causes a walk into the 3 components of 
the triple. */
+    @Override
+    public Expr transform(ExprTripleTerm exprTripleTerm) {
+        return exprTripleTerm.applyNodeTransform(transform);
+    }
+
     /** Transform node then create a {@link ExprVar} or {@link NodeValue}. */
     @Override
     public Expr transform(Node input) {
diff --git 
a/jena-arq/src/test/java/org/apache/jena/sparql/algebra/optimize/TestVarRename.java
 
b/jena-arq/src/test/java/org/apache/jena/sparql/algebra/optimize/TestVarRename.java
index d6c5a359c4..99a49c520d 100644
--- 
a/jena-arq/src/test/java/org/apache/jena/sparql/algebra/optimize/TestVarRename.java
+++ 
b/jena-arq/src/test/java/org/apache/jena/sparql/algebra/optimize/TestVarRename.java
@@ -374,6 +374,23 @@ public class TestVarRename
         rename(str1, str2, "x");
     }
 
+    @Test public void rename_tripleterms_01() {
+        String str1 = "(extend (?x <<(?s ?p ?o)>>) (table unit))";
+        String str2 = "(extend (?x <<(?/s ?/p ?/o)>> ) (table unit))";
+        rename(str1, str2, true, "x");
+    }
+
+    @Test public void rename_tripleterms_02() {
+        String str1 = "(extend (?x <<(?s ?p <<( ?x ?b ?c )>> )>>) (table 
unit))";
+        String str2 = "(extend (?x <<(?/s ?/p <<( ?x ?/b ?/c )>> )>> ) (table 
unit))";
+        rename(str1, str2, true, "x");
+    }
+
+    @Test public void rename_tripleterms_03() {
+        String str1 = "(triple (tripleterm ?s ?p ?o)  :q ?z )";
+        String str2 = "(triple (tripleterm ?s ?/p ?o) :q ?/z )";
+        rename(str1, str2, "s", "o");
+    }
 
     private void checkRename(String queryString, String opExpectedString)
     {
@@ -393,17 +410,17 @@ public class TestVarRename
         assertEquals(opExpected, opRenamed);
     }
 
-    private void reverse(String string, String string2, boolean repeatedly) {
-        Op opOrig = SSE.parseOp(string);
-        Op opExpected = SSE.parseOp(string2);
+    private void reverse(String input, String expected, boolean repeatedly) {
+        Op opOrig = SSE.parseOp(input);
+        Op opExpected = SSE.parseOp(expected);
         Op opActual = Rename.reverseVarRename(opOrig, repeatedly);
         assertEquals(opExpected, opActual);
     }
-    private void rename(String string, String string2, boolean reversable, 
String... varNames) {
+    private void rename(String input, String expected, boolean reversable, 
String... varNames) {
         Set<Var> s = new HashSet<>();
         for ( String vn : varNames )
             s.add(Var.alloc(vn));
-        rename(string, string2, reversable, s);
+        rename(input, expected, reversable, s);
     }
     private void rename(String inputStr, String expectedStr, boolean 
reversable, Set<Var> constant) {
         Op opOrig = SSE.parseOp(inputStr);

Reply via email to