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 2013/06/26 23:54:46 UTC

svn commit: r1497125 - in /jena/trunk/jena-arq/src: main/java/arq/ main/java/com/hp/hpl/jena/sparql/algebra/op/ main/java/com/hp/hpl/jena/sparql/core/ main/java/com/hp/hpl/jena/sparql/modify/ main/java/com/hp/hpl/jena/sparql/modify/request/ main/java/c...

Author: andy
Date: Wed Jun 26 21:54:45 2013
New Revision: 1497125

URL: http://svn.apache.org/r1497125
Log:
Add Updaterequest isomorphism via .equalTo.
Refactor isomorphism support into class Iso.
Tests.

Added:
    jena/trunk/jena-arq/src/main/java/com/hp/hpl/jena/sparql/modify/UpdateCompare.java
    jena/trunk/jena-arq/src/main/java/com/hp/hpl/jena/sparql/util/Iso.java
    jena/trunk/jena-arq/src/test/java/com/hp/hpl/jena/sparql/modify/TestUpdateCompare.java
    jena/trunk/jena-arq/src/test/java/com/hp/hpl/jena/sparql/modify/TestUpdateWriter.java
Modified:
    jena/trunk/jena-arq/src/main/java/arq/uparse.java
    jena/trunk/jena-arq/src/main/java/com/hp/hpl/jena/sparql/algebra/op/OpPath.java
    jena/trunk/jena-arq/src/main/java/com/hp/hpl/jena/sparql/algebra/op/OpQuad.java
    jena/trunk/jena-arq/src/main/java/com/hp/hpl/jena/sparql/algebra/op/OpTriple.java
    jena/trunk/jena-arq/src/main/java/com/hp/hpl/jena/sparql/core/BasicPattern.java
    jena/trunk/jena-arq/src/main/java/com/hp/hpl/jena/sparql/core/PathBlock.java
    jena/trunk/jena-arq/src/main/java/com/hp/hpl/jena/sparql/core/Prologue.java
    jena/trunk/jena-arq/src/main/java/com/hp/hpl/jena/sparql/core/QueryCompare.java
    jena/trunk/jena-arq/src/main/java/com/hp/hpl/jena/sparql/modify/request/Target.java
    jena/trunk/jena-arq/src/main/java/com/hp/hpl/jena/sparql/modify/request/UpdateAdd.java
    jena/trunk/jena-arq/src/main/java/com/hp/hpl/jena/sparql/modify/request/UpdateBinaryOp.java
    jena/trunk/jena-arq/src/main/java/com/hp/hpl/jena/sparql/modify/request/UpdateCreate.java
    jena/trunk/jena-arq/src/main/java/com/hp/hpl/jena/sparql/modify/request/UpdateData.java
    jena/trunk/jena-arq/src/main/java/com/hp/hpl/jena/sparql/modify/request/UpdateDeleteWhere.java
    jena/trunk/jena-arq/src/main/java/com/hp/hpl/jena/sparql/modify/request/UpdateDropClear.java
    jena/trunk/jena-arq/src/main/java/com/hp/hpl/jena/sparql/modify/request/UpdateLoad.java
    jena/trunk/jena-arq/src/main/java/com/hp/hpl/jena/sparql/modify/request/UpdateModify.java
    jena/trunk/jena-arq/src/main/java/com/hp/hpl/jena/sparql/modify/request/UpdateWithUsing.java
    jena/trunk/jena-arq/src/main/java/com/hp/hpl/jena/sparql/modify/request/UpdateWriter.java
    jena/trunk/jena-arq/src/main/java/com/hp/hpl/jena/sparql/path/P_Link.java
    jena/trunk/jena-arq/src/main/java/com/hp/hpl/jena/sparql/path/P_ReverseLink.java
    jena/trunk/jena-arq/src/main/java/com/hp/hpl/jena/sparql/syntax/Element.java
    jena/trunk/jena-arq/src/main/java/com/hp/hpl/jena/sparql/syntax/Template.java
    jena/trunk/jena-arq/src/main/java/com/hp/hpl/jena/sparql/util/Utils.java
    jena/trunk/jena-arq/src/main/java/com/hp/hpl/jena/update/Update.java
    jena/trunk/jena-arq/src/main/java/com/hp/hpl/jena/update/UpdateRequest.java
    jena/trunk/jena-arq/src/test/java/com/hp/hpl/jena/sparql/modify/TS_Update.java

Modified: jena/trunk/jena-arq/src/main/java/arq/uparse.java
URL: http://svn.apache.org/viewvc/jena/trunk/jena-arq/src/main/java/arq/uparse.java?rev=1497125&r1=1497124&r2=1497125&view=diff
==============================================================================
--- jena/trunk/jena-arq/src/main/java/arq/uparse.java (original)
+++ jena/trunk/jena-arq/src/main/java/arq/uparse.java Wed Jun 26 21:54:45 2013
@@ -126,16 +126,9 @@ public class uparse extends CmdARQ
             System.err.println("Can not reparse update after serialization") ;
             System.err.println(updateString2) ; 
         }
-        // Currently, UpdateRequest do not implement value-based .equals
-//        if ( req.hashCode() != req2.hashCode() )
-//        {
-//            System.err.println("Reparsed update hash code does not equal original parsed request hash code") ;
-//        }
-//        else
-//        {
-//            if ( ! req.equals(req2) )
-//                System.err.println("Reparsed update does not .equals original parsed request") ;
-//        }
+
+        if ( ! req.equalTo(req2) )
+            System.err.println("Reparsed update does not .equalTo original parsed request") ;
         
         
     }

Modified: jena/trunk/jena-arq/src/main/java/com/hp/hpl/jena/sparql/algebra/op/OpPath.java
URL: http://svn.apache.org/viewvc/jena/trunk/jena-arq/src/main/java/com/hp/hpl/jena/sparql/algebra/op/OpPath.java?rev=1497125&r1=1497124&r2=1497125&view=diff
==============================================================================
--- jena/trunk/jena-arq/src/main/java/com/hp/hpl/jena/sparql/algebra/op/OpPath.java (original)
+++ jena/trunk/jena-arq/src/main/java/com/hp/hpl/jena/sparql/algebra/op/OpPath.java Wed Jun 26 21:54:45 2013
@@ -23,8 +23,8 @@ import com.hp.hpl.jena.sparql.algebra.Op
 import com.hp.hpl.jena.sparql.algebra.Transform ;
 import com.hp.hpl.jena.sparql.core.TriplePath ;
 import com.hp.hpl.jena.sparql.sse.Tags ;
+import com.hp.hpl.jena.sparql.util.Iso ;
 import com.hp.hpl.jena.sparql.util.NodeIsomorphismMap ;
-import com.hp.hpl.jena.sparql.util.Utils ;
 
 public class OpPath extends Op0
 {
@@ -59,7 +59,7 @@ public class OpPath extends Op0
     {
         if ( ! (other instanceof OpPath) ) return false ;
         OpPath p = (OpPath)other ;
-        return  Utils.triplePathIso(triplePath, p.triplePath, isoMap) ;
+        return  Iso.triplePathIso(triplePath, p.triplePath, isoMap) ;
     }
 
     @Override

Modified: jena/trunk/jena-arq/src/main/java/com/hp/hpl/jena/sparql/algebra/op/OpQuad.java
URL: http://svn.apache.org/viewvc/jena/trunk/jena-arq/src/main/java/com/hp/hpl/jena/sparql/algebra/op/OpQuad.java?rev=1497125&r1=1497124&r2=1497125&view=diff
==============================================================================
--- jena/trunk/jena-arq/src/main/java/com/hp/hpl/jena/sparql/algebra/op/OpQuad.java (original)
+++ jena/trunk/jena-arq/src/main/java/com/hp/hpl/jena/sparql/algebra/op/OpQuad.java Wed Jun 26 21:54:45 2013
@@ -25,8 +25,8 @@ import com.hp.hpl.jena.sparql.core.Basic
 import com.hp.hpl.jena.sparql.core.Quad ;
 import com.hp.hpl.jena.sparql.core.QuadPattern ;
 import com.hp.hpl.jena.sparql.sse.Tags ;
+import com.hp.hpl.jena.sparql.util.Iso ;
 import com.hp.hpl.jena.sparql.util.NodeIsomorphismMap ;
-import com.hp.hpl.jena.sparql.util.Utils ;
 
 /** Algebra operation for a single quad.
  * @see OpTriple
@@ -71,7 +71,7 @@ public class OpQuad extends Op0
         if ( ! (other instanceof OpQuad) )
             return false ;
         OpQuad opQuad = (OpQuad)other ;
-        return Utils.quadIso(getQuad(), opQuad.getQuad(), labelMap) ;
+        return Iso.quadIso(getQuad(), opQuad.getQuad(), labelMap) ;
     }
 
     @Override

Modified: jena/trunk/jena-arq/src/main/java/com/hp/hpl/jena/sparql/algebra/op/OpTriple.java
URL: http://svn.apache.org/viewvc/jena/trunk/jena-arq/src/main/java/com/hp/hpl/jena/sparql/algebra/op/OpTriple.java?rev=1497125&r1=1497124&r2=1497125&view=diff
==============================================================================
--- jena/trunk/jena-arq/src/main/java/com/hp/hpl/jena/sparql/algebra/op/OpTriple.java (original)
+++ jena/trunk/jena-arq/src/main/java/com/hp/hpl/jena/sparql/algebra/op/OpTriple.java Wed Jun 26 21:54:45 2013
@@ -24,8 +24,8 @@ import com.hp.hpl.jena.sparql.algebra.Op
 import com.hp.hpl.jena.sparql.algebra.Transform ;
 import com.hp.hpl.jena.sparql.core.BasicPattern ;
 import com.hp.hpl.jena.sparql.sse.Tags ;
+import com.hp.hpl.jena.sparql.util.Iso ;
 import com.hp.hpl.jena.sparql.util.NodeIsomorphismMap ;
-import com.hp.hpl.jena.sparql.util.Utils ;
 
 /** Algebra operation for a single triple.  Not normally used - triples are
  * contained in basic graph patterns (which is the unit of extension in SPARQL, 
@@ -73,7 +73,7 @@ public class OpTriple extends Op0
         if ( ! (other instanceof OpTriple) )
             return false ;
         OpTriple opTriple = (OpTriple)other ;
-        return Utils.tripleIso(getTriple(), opTriple.getTriple(), labelMap) ;
+        return Iso.tripleIso(getTriple(), opTriple.getTriple(), labelMap) ;
     }
 
     @Override

Modified: jena/trunk/jena-arq/src/main/java/com/hp/hpl/jena/sparql/core/BasicPattern.java
URL: http://svn.apache.org/viewvc/jena/trunk/jena-arq/src/main/java/com/hp/hpl/jena/sparql/core/BasicPattern.java?rev=1497125&r1=1497124&r2=1497125&view=diff
==============================================================================
--- jena/trunk/jena-arq/src/main/java/com/hp/hpl/jena/sparql/core/BasicPattern.java (original)
+++ jena/trunk/jena-arq/src/main/java/com/hp/hpl/jena/sparql/core/BasicPattern.java Wed Jun 26 21:54:45 2013
@@ -28,8 +28,8 @@ import com.hp.hpl.jena.graph.Triple ;
 import com.hp.hpl.jena.sparql.serializer.SerializationContext ;
 import com.hp.hpl.jena.sparql.sse.SSE ;
 import com.hp.hpl.jena.sparql.sse.writers.WriterNode ;
+import com.hp.hpl.jena.sparql.util.Iso ;
 import com.hp.hpl.jena.sparql.util.NodeIsomorphismMap ;
-import com.hp.hpl.jena.sparql.util.Utils ;
 
 /** A class whose purpose is to give a name to a collection of triples.
  * Reduces the use of bland "List" in APIs (Java 1.4) 
@@ -90,7 +90,7 @@ public class BasicPattern implements Ite
             Triple t1 = get(i) ;
             Triple t2 = other.get(i) ;
             
-            if ( ! Utils.tripleIso(t1, t2, isoMap) )
+            if ( ! Iso.tripleIso(t1, t2, isoMap) )
                 return false ;
         }
         return true ;

Modified: jena/trunk/jena-arq/src/main/java/com/hp/hpl/jena/sparql/core/PathBlock.java
URL: http://svn.apache.org/viewvc/jena/trunk/jena-arq/src/main/java/com/hp/hpl/jena/sparql/core/PathBlock.java?rev=1497125&r1=1497124&r2=1497125&view=diff
==============================================================================
--- jena/trunk/jena-arq/src/main/java/com/hp/hpl/jena/sparql/core/PathBlock.java (original)
+++ jena/trunk/jena-arq/src/main/java/com/hp/hpl/jena/sparql/core/PathBlock.java Wed Jun 26 21:54:45 2013
@@ -22,8 +22,8 @@ import java.util.ArrayList ;
 import java.util.List ;
 import java.util.ListIterator ;
 
+import com.hp.hpl.jena.sparql.util.Iso ;
 import com.hp.hpl.jena.sparql.util.NodeIsomorphismMap ;
-import com.hp.hpl.jena.sparql.util.Utils ;
 
 /** A class whose purpose is to give a name to a collection of triple paths. */ 
 
@@ -69,7 +69,7 @@ public class PathBlock implements Iterab
             TriplePath tp1 = get(i) ;
             TriplePath tp2 = other.get(i) ;
             
-            if ( ! Utils.triplePathIso(tp1, tp2, isoMap) )
+            if ( ! Iso.triplePathIso(tp1, tp2, isoMap) )
                 return false ;
         }
         return true ;

Modified: jena/trunk/jena-arq/src/main/java/com/hp/hpl/jena/sparql/core/Prologue.java
URL: http://svn.apache.org/viewvc/jena/trunk/jena-arq/src/main/java/com/hp/hpl/jena/sparql/core/Prologue.java?rev=1497125&r1=1497124&r2=1497125&view=diff
==============================================================================
--- jena/trunk/jena-arq/src/main/java/com/hp/hpl/jena/sparql/core/Prologue.java (original)
+++ jena/trunk/jena-arq/src/main/java/com/hp/hpl/jena/sparql/core/Prologue.java Wed Jun 26 21:54:45 2013
@@ -197,4 +197,18 @@ public class Prologue
     {
         return prefixMap.shortForm(uri) ;
     }
+    
+    /** Test whether a Prologue wil perform the same as this one. */
+    public boolean samePrologue(Prologue other) {
+        // Prologue are mutable and superclasses so .equals is left as the default.
+        String base1 = explicitlySetBaseURI() ? getBaseURI() : null ;
+        String base2 = other.explicitlySetBaseURI() ? other.getBaseURI() : null ;        
+        if (! Lib.equal(base1,  base2) )
+            return false ;
+        if ( getPrefixMapping() == null && other.getPrefixMapping() == null )
+            return true ;
+        if ( getPrefixMapping() == null )
+            return false ;
+        return getPrefixMapping().samePrefixMappingAs(other.getPrefixMapping()) ;    
+    }
 }

Modified: jena/trunk/jena-arq/src/main/java/com/hp/hpl/jena/sparql/core/QueryCompare.java
URL: http://svn.apache.org/viewvc/jena/trunk/jena-arq/src/main/java/com/hp/hpl/jena/sparql/core/QueryCompare.java?rev=1497125&r1=1497124&r2=1497125&view=diff
==============================================================================
--- jena/trunk/jena-arq/src/main/java/com/hp/hpl/jena/sparql/core/QueryCompare.java (original)
+++ jena/trunk/jena-arq/src/main/java/com/hp/hpl/jena/sparql/core/QueryCompare.java Wed Jun 26 21:54:45 2013
@@ -65,17 +65,7 @@ public class QueryCompare implements Que
     @Override
     public void visitPrologue(Prologue query1)
     {
-        // This is after parsing so all IRIs in the query have been made absolute.
-        // For two queries to be equal, their explicitly set base URIs must be the same. 
-        
-        String b1 = query1.explicitlySetBaseURI() ? query1.getBaseURI() : null ;
-        String b2 = query2.explicitlySetBaseURI() ? query2.getBaseURI() : null ;        
-        check("Base URIs", b1, b2) ;
-
-        if ( query1.getPrefixMapping() == null &&
-            query2.getPrefixMapping() == null )
-            return ;
-        check("Prefixes", query1.getPrefixMapping().samePrefixMappingAs(query2.getPrefixMapping())) ;
+        check("Prefixes/Base", query1.samePrologue(query2) ) ;
     }
 
     @Override

Added: jena/trunk/jena-arq/src/main/java/com/hp/hpl/jena/sparql/modify/UpdateCompare.java
URL: http://svn.apache.org/viewvc/jena/trunk/jena-arq/src/main/java/com/hp/hpl/jena/sparql/modify/UpdateCompare.java?rev=1497125&view=auto
==============================================================================
--- jena/trunk/jena-arq/src/main/java/com/hp/hpl/jena/sparql/modify/UpdateCompare.java (added)
+++ jena/trunk/jena-arq/src/main/java/com/hp/hpl/jena/sparql/modify/UpdateCompare.java Wed Jun 26 21:54:45 2013
@@ -0,0 +1,57 @@
+/**
+ * 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.modify;
+
+import java.util.List ;
+
+import com.hp.hpl.jena.sparql.util.NodeIsomorphismMap ;
+import com.hp.hpl.jena.update.Update ;
+import com.hp.hpl.jena.update.UpdateRequest ;
+
+public class UpdateCompare {
+    
+    public static boolean isomorphic(UpdateRequest req1, UpdateRequest req2) {
+        if ( req1 == req2 )
+            return true ;
+        if ( ! req1.samePrologue(req2) )
+            return false ;
+        List<Update> updates1 =  req1.getOperations() ;
+        List<Update> updates2 =  req2.getOperations() ;
+        if ( updates1.size() != updates2.size() )
+            return false ;
+         
+        NodeIsomorphismMap isomap = new NodeIsomorphismMap() ;
+        for ( int i = 0 ; i < updates1.size() ; i++ ) {
+            Update upd1 = updates1.get(i) ;
+            Update upd2 = updates2.get(i) ;
+            if ( !isomorphic(upd1, upd2, isomap) )
+                return false ;
+        }
+        return true ;
+    }
+
+    public static boolean isomorphic(Update req1, Update req2) {
+        return isomorphic(req1, req2, new NodeIsomorphismMap()) ;
+    }
+    
+    private static boolean isomorphic(Update upd1, Update upd2, NodeIsomorphismMap isomap) {
+        return upd1.equalTo(upd2, isomap) ;
+    }
+}
+

Modified: jena/trunk/jena-arq/src/main/java/com/hp/hpl/jena/sparql/modify/request/Target.java
URL: http://svn.apache.org/viewvc/jena/trunk/jena-arq/src/main/java/com/hp/hpl/jena/sparql/modify/request/Target.java?rev=1497125&r1=1497124&r2=1497125&view=diff
==============================================================================
--- jena/trunk/jena-arq/src/main/java/com/hp/hpl/jena/sparql/modify/request/Target.java (original)
+++ jena/trunk/jena-arq/src/main/java/com/hp/hpl/jena/sparql/modify/request/Target.java Wed Jun 26 21:54:45 2013
@@ -18,11 +18,15 @@
 
 package com.hp.hpl.jena.sparql.modify.request;
 
-import static com.hp.hpl.jena.sparql.modify.request.Target.Decl.* ;
+import static com.hp.hpl.jena.sparql.modify.request.Target.Decl.ALL$ ;
+import static com.hp.hpl.jena.sparql.modify.request.Target.Decl.DEFAULT$ ;
+import static com.hp.hpl.jena.sparql.modify.request.Target.Decl.IRI$ ;
+import static com.hp.hpl.jena.sparql.modify.request.Target.Decl.NAMED$ ;
 
 import com.hp.hpl.jena.graph.Node ;
 import com.hp.hpl.jena.graph.NodeFactory ;
 import com.hp.hpl.jena.sparql.util.FmtUtils ;
+import com.hp.hpl.jena.sparql.util.NodeIsomorphismMap ;
 
 public class Target
 {
@@ -60,12 +64,17 @@ public class Target
             return decl.toString() ;
     }
 
+    public boolean equalTo(Target other, NodeIsomorphismMap isoMap) {
+        return equals(other) ;
+    }
+
     @Override
     public int hashCode()
     {
         final int prime = 31 ;
         int result = 1 ;
         result = prime * result + ((decl == null) ? 0 : decl.hashCode()) ;
+        // OK since a URI.
         result = prime * result + ((graphIRI == null) ? 0 : graphIRI.hashCode()) ;
         return result ;
     }

Modified: jena/trunk/jena-arq/src/main/java/com/hp/hpl/jena/sparql/modify/request/UpdateAdd.java
URL: http://svn.apache.org/viewvc/jena/trunk/jena-arq/src/main/java/com/hp/hpl/jena/sparql/modify/request/UpdateAdd.java?rev=1497125&r1=1497124&r2=1497125&view=diff
==============================================================================
--- jena/trunk/jena-arq/src/main/java/com/hp/hpl/jena/sparql/modify/request/UpdateAdd.java (original)
+++ jena/trunk/jena-arq/src/main/java/com/hp/hpl/jena/sparql/modify/request/UpdateAdd.java Wed Jun 26 21:54:45 2013
@@ -18,6 +18,7 @@
 
 package com.hp.hpl.jena.sparql.modify.request;
 
+
 public class UpdateAdd extends UpdateBinaryOp
 {
     public UpdateAdd(Target src, Target dest)                  { super(src, dest, true) ; }

Modified: jena/trunk/jena-arq/src/main/java/com/hp/hpl/jena/sparql/modify/request/UpdateBinaryOp.java
URL: http://svn.apache.org/viewvc/jena/trunk/jena-arq/src/main/java/com/hp/hpl/jena/sparql/modify/request/UpdateBinaryOp.java?rev=1497125&r1=1497124&r2=1497125&view=diff
==============================================================================
--- jena/trunk/jena-arq/src/main/java/com/hp/hpl/jena/sparql/modify/request/UpdateBinaryOp.java (original)
+++ jena/trunk/jena-arq/src/main/java/com/hp/hpl/jena/sparql/modify/request/UpdateBinaryOp.java Wed Jun 26 21:54:45 2013
@@ -19,6 +19,7 @@
 package com.hp.hpl.jena.sparql.modify.request;
 
 import com.hp.hpl.jena.sparql.ARQException ;
+import com.hp.hpl.jena.sparql.util.NodeIsomorphismMap ;
 import com.hp.hpl.jena.update.Update ;
 
 public abstract class UpdateBinaryOp extends Update
@@ -47,4 +48,19 @@ public abstract class UpdateBinaryOp ext
     public Target getDest()     { return dest ; }
     
     public boolean getSilent()  { return silent ; }
+    
+    @Override
+    final
+    public boolean equalTo(Update obj, NodeIsomorphismMap isoMap) {
+        if (this == obj)
+            return true ;
+        if (getClass() != obj.getClass())
+            return false ;
+        UpdateBinaryOp other = (UpdateBinaryOp)obj ;
+        if (silent != other.silent)
+            return false ;
+
+        return  dest.equalTo(other.dest, isoMap) &&
+                src.equalTo(other.src, isoMap) ;
+    }
 }

Modified: jena/trunk/jena-arq/src/main/java/com/hp/hpl/jena/sparql/modify/request/UpdateCreate.java
URL: http://svn.apache.org/viewvc/jena/trunk/jena-arq/src/main/java/com/hp/hpl/jena/sparql/modify/request/UpdateCreate.java?rev=1497125&r1=1497124&r2=1497125&view=diff
==============================================================================
--- jena/trunk/jena-arq/src/main/java/com/hp/hpl/jena/sparql/modify/request/UpdateCreate.java (original)
+++ jena/trunk/jena-arq/src/main/java/com/hp/hpl/jena/sparql/modify/request/UpdateCreate.java Wed Jun 26 21:54:45 2013
@@ -20,6 +20,7 @@ package com.hp.hpl.jena.sparql.modify.re
 
 import com.hp.hpl.jena.graph.Node ;
 import com.hp.hpl.jena.graph.NodeFactory ;
+import com.hp.hpl.jena.sparql.util.NodeIsomorphismMap ;
 import com.hp.hpl.jena.update.Update ;
 
 
@@ -57,4 +58,17 @@ public class UpdateCreate extends Update
     @Override
     public void visit(UpdateVisitor visitor)
     { visitor.visit(this) ; }
+
+    @Override
+    public boolean equalTo(Update obj, NodeIsomorphismMap isoMap) {
+        if (this == obj)
+            return true ;
+        if (obj == null)
+            return false ;
+        if (getClass() != obj.getClass())
+            return false ;
+        UpdateCreate other = (UpdateCreate)obj ;
+        return silent == other.silent &&
+               isoMap.makeIsomorphic(graphRef, other.graphRef) ; 
+    }
 }

Modified: jena/trunk/jena-arq/src/main/java/com/hp/hpl/jena/sparql/modify/request/UpdateData.java
URL: http://svn.apache.org/viewvc/jena/trunk/jena-arq/src/main/java/com/hp/hpl/jena/sparql/modify/request/UpdateData.java?rev=1497125&r1=1497124&r2=1497125&view=diff
==============================================================================
--- jena/trunk/jena-arq/src/main/java/com/hp/hpl/jena/sparql/modify/request/UpdateData.java (original)
+++ jena/trunk/jena-arq/src/main/java/com/hp/hpl/jena/sparql/modify/request/UpdateData.java Wed Jun 26 21:54:45 2013
@@ -21,6 +21,8 @@ package com.hp.hpl.jena.sparql.modify.re
 import java.util.List ;
 
 import com.hp.hpl.jena.sparql.core.Quad ;
+import com.hp.hpl.jena.sparql.util.Iso ;
+import com.hp.hpl.jena.sparql.util.NodeIsomorphismMap ;
 import com.hp.hpl.jena.update.Update ;
 
 public abstract class UpdateData extends Update
@@ -30,4 +32,18 @@ public abstract class UpdateData extends
     public UpdateData(QuadDataAcc quadData) { this.quadData = quadData ; } 
     
     public List<Quad> getQuads() { return quadData.getQuads() ; }
+    
+    @Override
+    final
+    public boolean equalTo(Update obj, NodeIsomorphismMap isoMap) {
+        if (this == obj)
+            return true ;
+        if (getClass() != obj.getClass())
+            return false ;
+        UpdateData other = (UpdateData)obj ;
+        List<Quad> quads1 = getQuads() ;
+        List<Quad> quads2 = other.getQuads() ;
+        return Iso.isomorphicQuads(quads1, quads2, isoMap) ;
+    }
+
 }

Modified: jena/trunk/jena-arq/src/main/java/com/hp/hpl/jena/sparql/modify/request/UpdateDeleteWhere.java
URL: http://svn.apache.org/viewvc/jena/trunk/jena-arq/src/main/java/com/hp/hpl/jena/sparql/modify/request/UpdateDeleteWhere.java?rev=1497125&r1=1497124&r2=1497125&view=diff
==============================================================================
--- jena/trunk/jena-arq/src/main/java/com/hp/hpl/jena/sparql/modify/request/UpdateDeleteWhere.java (original)
+++ jena/trunk/jena-arq/src/main/java/com/hp/hpl/jena/sparql/modify/request/UpdateDeleteWhere.java Wed Jun 26 21:54:45 2013
@@ -21,6 +21,8 @@ package com.hp.hpl.jena.sparql.modify.re
 import java.util.List ;
 
 import com.hp.hpl.jena.sparql.core.Quad ;
+import com.hp.hpl.jena.sparql.util.Iso ;
+import com.hp.hpl.jena.sparql.util.NodeIsomorphismMap ;
 import com.hp.hpl.jena.update.Update ;
 
 public class UpdateDeleteWhere extends Update
@@ -34,4 +36,16 @@ public class UpdateDeleteWhere extends U
     @Override
     public void visit(UpdateVisitor visitor)
     { visitor.visit(this) ; }
+
+    @Override
+    public boolean equalTo(Update obj, NodeIsomorphismMap isoMap) {
+        if (this == obj)
+            return true ;
+        if (obj == null)
+            return false ;
+        if (getClass() != obj.getClass())
+            return false ;
+        UpdateDeleteWhere other = (UpdateDeleteWhere)obj ;
+        return Iso.isomorphicQuads(getQuads(), other.getQuads(), isoMap) ;
+    }
 }

Modified: jena/trunk/jena-arq/src/main/java/com/hp/hpl/jena/sparql/modify/request/UpdateDropClear.java
URL: http://svn.apache.org/viewvc/jena/trunk/jena-arq/src/main/java/com/hp/hpl/jena/sparql/modify/request/UpdateDropClear.java?rev=1497125&r1=1497124&r2=1497125&view=diff
==============================================================================
--- jena/trunk/jena-arq/src/main/java/com/hp/hpl/jena/sparql/modify/request/UpdateDropClear.java (original)
+++ jena/trunk/jena-arq/src/main/java/com/hp/hpl/jena/sparql/modify/request/UpdateDropClear.java Wed Jun 26 21:54:45 2013
@@ -19,6 +19,7 @@
 package com.hp.hpl.jena.sparql.modify.request;
 
 import com.hp.hpl.jena.graph.Node ;
+import com.hp.hpl.jena.sparql.util.NodeIsomorphismMap ;
 import com.hp.hpl.jena.update.Update ;
 
 public abstract class UpdateDropClear extends Update 
@@ -45,4 +46,18 @@ public abstract class UpdateDropClear ex
     
     //public String getGraphIRI() { return target.getGraphIRI() ; }
     public Node getGraph()      { return target.getGraph() ; }
+    
+    @Override
+    public boolean equalTo(Update obj, NodeIsomorphismMap isoMap) {
+        if (this == obj)
+            return true ;
+        if (obj == null)
+            return false ;
+        if (getClass() != obj.getClass())
+            return false ;
+        UpdateDropClear other = (UpdateDropClear)obj ;
+        if ( silent != other.silent )
+            return false ;
+        return target.equalTo(other.target, isoMap) ;
+    }
 }

Modified: jena/trunk/jena-arq/src/main/java/com/hp/hpl/jena/sparql/modify/request/UpdateLoad.java
URL: http://svn.apache.org/viewvc/jena/trunk/jena-arq/src/main/java/com/hp/hpl/jena/sparql/modify/request/UpdateLoad.java?rev=1497125&r1=1497124&r2=1497125&view=diff
==============================================================================
--- jena/trunk/jena-arq/src/main/java/com/hp/hpl/jena/sparql/modify/request/UpdateLoad.java (original)
+++ jena/trunk/jena-arq/src/main/java/com/hp/hpl/jena/sparql/modify/request/UpdateLoad.java Wed Jun 26 21:54:45 2013
@@ -18,8 +18,12 @@
 
 package com.hp.hpl.jena.sparql.modify.request;
 
+import org.apache.jena.atlas.lib.Lib ;
+
 import com.hp.hpl.jena.graph.Node ;
 import com.hp.hpl.jena.graph.NodeFactory ;
+import com.hp.hpl.jena.sparql.util.Iso ;
+import com.hp.hpl.jena.sparql.util.NodeIsomorphismMap ;
 import com.hp.hpl.jena.update.Update ;
 
 public class UpdateLoad extends Update
@@ -58,4 +62,19 @@ public class UpdateLoad extends Update
     @Override
     public void visit(UpdateVisitor visitor)
     { visitor.visit(this) ; }
+
+    @Override
+    public boolean equalTo(Update obj, NodeIsomorphismMap isoMap) {
+        if (this == obj)
+            return true ;
+        if (obj == null)
+            return false ;
+        if (getClass() != obj.getClass())
+            return false ;
+        UpdateLoad other = (UpdateLoad)obj ;
+        return 
+            silent == other.silent &&
+            Lib.equal(source, other.source) &&
+            Iso.nodeIso(dest, other.dest, isoMap) ;
+    }
 }

Modified: jena/trunk/jena-arq/src/main/java/com/hp/hpl/jena/sparql/modify/request/UpdateModify.java
URL: http://svn.apache.org/viewvc/jena/trunk/jena-arq/src/main/java/com/hp/hpl/jena/sparql/modify/request/UpdateModify.java?rev=1497125&r1=1497124&r2=1497125&view=diff
==============================================================================
--- jena/trunk/jena-arq/src/main/java/com/hp/hpl/jena/sparql/modify/request/UpdateModify.java (original)
+++ jena/trunk/jena-arq/src/main/java/com/hp/hpl/jena/sparql/modify/request/UpdateModify.java Wed Jun 26 21:54:45 2013
@@ -22,6 +22,9 @@ import java.util.List ;
 
 import com.hp.hpl.jena.sparql.core.Quad ;
 import com.hp.hpl.jena.sparql.syntax.Element ;
+import com.hp.hpl.jena.sparql.util.Iso ;
+import com.hp.hpl.jena.sparql.util.NodeIsomorphismMap ;
+import com.hp.hpl.jena.update.Update ;
 
 public class UpdateModify extends UpdateWithUsing
 {
@@ -95,4 +98,28 @@ public class UpdateModify extends Update
     @Override
     public void visit(UpdateVisitor visitor)
     { visitor.visit(this) ; }
+
+    @Override
+    public boolean equalTo(Update obj, NodeIsomorphismMap isoMap) {
+        if (this == obj)
+            return true ;
+        if (obj == null)
+            return false ;
+        if (getClass() != obj.getClass())
+            return false ;
+        UpdateModify other = (UpdateModify)obj ;
+        if ( hasDelete != other.hasDelete )
+            return false ;
+        if ( hasInsert != other.hasInsert )
+            return false ;
+        if ( ! equalIso(other, isoMap))
+            return false ;
+        if ( ! Iso.isomorphicQuads(getDeleteQuads(), other.getDeleteQuads(), isoMap) ) 
+            return false ;
+        if ( ! Iso.isomorphicQuads(getInsertQuads(), other.getInsertQuads(), isoMap) )
+            return false ;
+        if ( ! wherePattern.equalTo(other.wherePattern, isoMap) )
+            return false ;
+        return true ;
+    }
 }

Modified: jena/trunk/jena-arq/src/main/java/com/hp/hpl/jena/sparql/modify/request/UpdateWithUsing.java
URL: http://svn.apache.org/viewvc/jena/trunk/jena-arq/src/main/java/com/hp/hpl/jena/sparql/modify/request/UpdateWithUsing.java?rev=1497125&r1=1497124&r2=1497125&view=diff
==============================================================================
--- jena/trunk/jena-arq/src/main/java/com/hp/hpl/jena/sparql/modify/request/UpdateWithUsing.java (original)
+++ jena/trunk/jena-arq/src/main/java/com/hp/hpl/jena/sparql/modify/request/UpdateWithUsing.java Wed Jun 26 21:54:45 2013
@@ -23,6 +23,8 @@ import java.util.Collections ;
 import java.util.List ;
 
 import com.hp.hpl.jena.graph.Node ;
+import com.hp.hpl.jena.sparql.util.Iso ;
+import com.hp.hpl.jena.sparql.util.NodeIsomorphismMap ;
 import com.hp.hpl.jena.update.Update ;
 
 public abstract class UpdateWithUsing extends Update
@@ -43,5 +45,22 @@ public abstract class UpdateWithUsing ex
     public List<Node> getUsingNamed()       { return usingNamedView ; }
     
     public Node getWithIRI()                { return withIRI ; }
-    public void setWithIRI(Node node)       { this.withIRI = node ; } 
+    public void setWithIRI(Node node)       { this.withIRI = node ; }
+
+    protected boolean equalIso(UpdateWithUsing other, NodeIsomorphismMap isoMap) {
+        // Assumes IRIs
+        if ( withIRI == null && other.withIRI != null )
+            return false ;
+        if ( withIRI != null && other.withIRI == null )
+            return false ;
+        if ( withIRI != null && other.withIRI != null ) {
+            if ( ! Iso.nodeIso(withIRI, other.withIRI, isoMap) )
+                return false ;
+        }
+        if ( ! Iso.isomorphicNodes(using, other.using, isoMap) )
+                return false ;
+        if ( ! Iso.isomorphicNodes(usingNamed, other.usingNamed, isoMap) )
+            return false ;
+        return true ;
+    } 
 }

Modified: jena/trunk/jena-arq/src/main/java/com/hp/hpl/jena/sparql/modify/request/UpdateWriter.java
URL: http://svn.apache.org/viewvc/jena/trunk/jena-arq/src/main/java/com/hp/hpl/jena/sparql/modify/request/UpdateWriter.java?rev=1497125&r1=1497124&r2=1497125&view=diff
==============================================================================
--- jena/trunk/jena-arq/src/main/java/com/hp/hpl/jena/sparql/modify/request/UpdateWriter.java (original)
+++ jena/trunk/jena-arq/src/main/java/com/hp/hpl/jena/sparql/modify/request/UpdateWriter.java Wed Jun 26 21:54:45 2013
@@ -235,7 +235,8 @@ public class UpdateWriter implements Clo
     
     public static void output(UpdateRequest request, IndentedWriter out)
     {
-        output(request, out, null);
+        SerializationContext sCxt = new SerializationContext(request, new NodeToLabelMapBNode()) ;
+        output(request, out, sCxt);
     }
     
     public static void output(UpdateRequest request, IndentedWriter out, SerializationContext sCxt)

Modified: jena/trunk/jena-arq/src/main/java/com/hp/hpl/jena/sparql/path/P_Link.java
URL: http://svn.apache.org/viewvc/jena/trunk/jena-arq/src/main/java/com/hp/hpl/jena/sparql/path/P_Link.java?rev=1497125&r1=1497124&r2=1497125&view=diff
==============================================================================
--- jena/trunk/jena-arq/src/main/java/com/hp/hpl/jena/sparql/path/P_Link.java (original)
+++ jena/trunk/jena-arq/src/main/java/com/hp/hpl/jena/sparql/path/P_Link.java Wed Jun 26 21:54:45 2013
@@ -19,8 +19,8 @@
 package com.hp.hpl.jena.sparql.path;
 
 import com.hp.hpl.jena.graph.Node ;
+import com.hp.hpl.jena.sparql.util.Iso ;
 import com.hp.hpl.jena.sparql.util.NodeIsomorphismMap ;
-import com.hp.hpl.jena.sparql.util.Utils ;
 
 public class P_Link extends P_Path0
 {
@@ -41,7 +41,7 @@ public class P_Link extends P_Path0
     {
         if ( ! ( path2 instanceof P_Link ) ) return false ;
         P_Link other = (P_Link)path2 ;
-        return Utils.nodeIso(node, other.node, isoMap) ;
+        return Iso.nodeIso(node, other.node, isoMap) ;
     }
 
     @Override

Modified: jena/trunk/jena-arq/src/main/java/com/hp/hpl/jena/sparql/path/P_ReverseLink.java
URL: http://svn.apache.org/viewvc/jena/trunk/jena-arq/src/main/java/com/hp/hpl/jena/sparql/path/P_ReverseLink.java?rev=1497125&r1=1497124&r2=1497125&view=diff
==============================================================================
--- jena/trunk/jena-arq/src/main/java/com/hp/hpl/jena/sparql/path/P_ReverseLink.java (original)
+++ jena/trunk/jena-arq/src/main/java/com/hp/hpl/jena/sparql/path/P_ReverseLink.java Wed Jun 26 21:54:45 2013
@@ -19,8 +19,8 @@
 package com.hp.hpl.jena.sparql.path;
 
 import com.hp.hpl.jena.graph.Node ;
+import com.hp.hpl.jena.sparql.util.Iso ;
 import com.hp.hpl.jena.sparql.util.NodeIsomorphismMap ;
-import com.hp.hpl.jena.sparql.util.Utils ;
 
 public class P_ReverseLink extends P_Path0
 {
@@ -41,7 +41,7 @@ public class P_ReverseLink extends P_Pat
     {
         if ( ! ( path2 instanceof P_ReverseLink ) ) return false ;
         P_ReverseLink other = (P_ReverseLink)path2 ;
-        return Utils.nodeIso(node, other.node, isoMap) ;
+        return Iso.nodeIso(node, other.node, isoMap) ;
     }
 
     @Override

Modified: jena/trunk/jena-arq/src/main/java/com/hp/hpl/jena/sparql/syntax/Element.java
URL: http://svn.apache.org/viewvc/jena/trunk/jena-arq/src/main/java/com/hp/hpl/jena/sparql/syntax/Element.java?rev=1497125&r1=1497124&r2=1497125&view=diff
==============================================================================
--- jena/trunk/jena-arq/src/main/java/com/hp/hpl/jena/sparql/syntax/Element.java (original)
+++ jena/trunk/jena-arq/src/main/java/com/hp/hpl/jena/sparql/syntax/Element.java Wed Jun 26 21:54:45 2013
@@ -29,7 +29,7 @@ public abstract class Element
     
     @Override
     public abstract int hashCode() ;
-    // If the labeMap is null, do .equals() on nodes, else map from
+    // If the labelMap is null, do .equals() on nodes, else map from
     // bNode varables in one to bNodes variables in the other 
     public abstract boolean equalTo(Element el2, NodeIsomorphismMap isoMap) ;
     
@@ -43,7 +43,6 @@ public abstract class Element
         return equalTo((Element)el2, null) ;
     }
     
-    
     @Override
     public String toString()
     {

Modified: jena/trunk/jena-arq/src/main/java/com/hp/hpl/jena/sparql/syntax/Template.java
URL: http://svn.apache.org/viewvc/jena/trunk/jena-arq/src/main/java/com/hp/hpl/jena/sparql/syntax/Template.java?rev=1497125&r1=1497124&r2=1497125&view=diff
==============================================================================
--- jena/trunk/jena-arq/src/main/java/com/hp/hpl/jena/sparql/syntax/Template.java (original)
+++ jena/trunk/jena-arq/src/main/java/com/hp/hpl/jena/sparql/syntax/Template.java Wed Jun 26 21:54:45 2013
@@ -28,8 +28,8 @@ import com.hp.hpl.jena.sparql.core.Basic
 import com.hp.hpl.jena.sparql.engine.binding.Binding ;
 import com.hp.hpl.jena.sparql.modify.TemplateLib ;
 import com.hp.hpl.jena.sparql.serializer.FormatterTemplate ;
+import com.hp.hpl.jena.sparql.util.Iso ;
 import com.hp.hpl.jena.sparql.util.NodeIsomorphismMap ;
-import com.hp.hpl.jena.sparql.util.Utils ;
 
 /** Triples template. */
 
@@ -104,7 +104,7 @@ public class Template 
         {
             Triple t1 = list1.get(i) ;
             Triple t2 = list2.get(i) ;
-            Utils.tripleIso(t1, t2, labelMap) ;
+            Iso.tripleIso(t1, t2, labelMap) ;
         }
         return true ;
     }

Added: jena/trunk/jena-arq/src/main/java/com/hp/hpl/jena/sparql/util/Iso.java
URL: http://svn.apache.org/viewvc/jena/trunk/jena-arq/src/main/java/com/hp/hpl/jena/sparql/util/Iso.java?rev=1497125&view=auto
==============================================================================
--- jena/trunk/jena-arq/src/main/java/com/hp/hpl/jena/sparql/util/Iso.java (added)
+++ jena/trunk/jena-arq/src/main/java/com/hp/hpl/jena/sparql/util/Iso.java Wed Jun 26 21:54:45 2013
@@ -0,0 +1,137 @@
+/**
+ * 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.util;
+
+import java.util.List ;
+
+import com.hp.hpl.jena.graph.Node ;
+import com.hp.hpl.jena.graph.Triple ;
+import com.hp.hpl.jena.sparql.core.Quad ;
+import com.hp.hpl.jena.sparql.core.TriplePath ;
+import com.hp.hpl.jena.sparql.core.Var ;
+
+/** Isomorphism utilities */
+public class Iso {
+    // See also IsoMatcher
+    
+    public static boolean isomorphicTriples(List<Triple> triples1, List<Triple> triples2, NodeIsomorphismMap isoMap) {
+        if ( triples1.size() != triples2.size() )
+            return false ;
+        for ( int i = 0 ; i < triples1.size() ; i++ ) {
+            Triple t1 = triples1.get(i) ;
+            Triple t2 = triples2.get(i) ;
+            if ( ! tripleIso(t1, t2, isoMap))
+                return false ;
+        }
+        return true ;
+    }
+    
+    public static boolean isomorphicQuads(List<Quad> quads1, List<Quad> quads2, NodeIsomorphismMap isoMap) {
+        if ( quads1.size() != quads2.size() )
+            return false ;
+        for ( int i = 0 ; i < quads1.size() ; i++ ) {
+            Quad q1 = quads1.get(i) ;
+            Quad q2 = quads2.get(i) ;
+            if ( ! quadIso(q1, q2, isoMap))
+                return false ;
+        }
+        return true ;
+    }
+
+    public static boolean isomorphicNodes(List<Node> nodes1, List<Node> nodes2, NodeIsomorphismMap isoMap) {
+        if ( nodes1.size() != nodes2.size() )
+            return false ;
+        for ( int i = 0 ; i < nodes1.size() ; i++ ) {
+            Node n1 = nodes1.get(i) ;
+            Node n2 = nodes2.get(i) ;
+            if ( ! nodeIso(n1, n2, isoMap))
+                return false ;
+        }
+        return true ;
+    }
+
+    public static boolean triplePathIso(TriplePath tp1, TriplePath tp2, NodeIsomorphismMap isoMap)
+    {
+        if ( tp1.isTriple() ^ tp2.isTriple() ) 
+            return false ;
+    
+        if ( tp1.isTriple() )
+            return Iso.tripleIso(tp1.asTriple(), tp2.asTriple(), isoMap) ;
+        else
+            return Iso.nodeIso(tp1.getSubject(), tp2.getSubject(), isoMap) && 
+                   Iso.nodeIso(tp1.getObject(), tp2.getObject(), isoMap) &&
+                   tp1.getPath().equalTo(tp2.getPath(), isoMap) ;
+    }
+
+    public static boolean tripleIso(Triple t1, Triple t2, NodeIsomorphismMap labelMap)
+    {
+        Node s1 = t1.getSubject() ;
+        Node p1 = t1.getPredicate() ;
+        Node o1 = t1.getObject() ;
+        
+        Node s2 = t2.getSubject() ;
+        Node p2 = t2.getPredicate() ;
+        Node o2 = t2.getObject() ;
+        
+        if ( ! nodeIso(s1, s2, labelMap) )
+            return false ;
+        if ( ! nodeIso(p1, p2, labelMap) )
+            return false ;
+        if ( ! nodeIso(o1, o2, labelMap) )
+            return false ;
+    
+        return true ;
+    }
+
+    public static boolean quadIso(Quad t1, Quad t2, NodeIsomorphismMap labelMap)
+    {
+        Node g1 = t1.getGraph() ;
+        Node s1 = t1.getSubject() ;
+        Node p1 = t1.getPredicate() ;
+        Node o1 = t1.getObject() ;
+        
+        Node g2 = t2.getGraph() ;
+        Node s2 = t2.getSubject() ;
+        Node p2 = t2.getPredicate() ;
+        Node o2 = t2.getObject() ;
+        
+        if ( ! nodeIso(g1, g2, labelMap) )
+            return false ;
+        if ( ! nodeIso(s1, s2, labelMap) )
+            return false ;
+        if ( ! nodeIso(p1, p2, labelMap) )
+            return false ;
+        if ( ! nodeIso(o1, o2, labelMap) )
+            return false ;
+    
+        return true ;
+    }
+
+    public static boolean nodeIso(Node n1, Node n2, NodeIsomorphismMap isoMap)
+    {
+        if ( isoMap != null ) { 
+            if ( n1.isBlank() && n2.isBlank() )
+                return isoMap.makeIsomorphic(n1, n2) ;
+            if ( Var.isBlankNodeVar(n1) && Var.isBlankNodeVar(n2) )
+                return isoMap.makeIsomorphic(n1, n2) ;
+    }
+        return n1.equals(n2) ;
+    }
+}
+

Modified: jena/trunk/jena-arq/src/main/java/com/hp/hpl/jena/sparql/util/Utils.java
URL: http://svn.apache.org/viewvc/jena/trunk/jena-arq/src/main/java/com/hp/hpl/jena/sparql/util/Utils.java?rev=1497125&r1=1497124&r2=1497125&view=diff
==============================================================================
--- jena/trunk/jena-arq/src/main/java/com/hp/hpl/jena/sparql/util/Utils.java (original)
+++ jena/trunk/jena-arq/src/main/java/com/hp/hpl/jena/sparql/util/Utils.java Wed Jun 26 21:54:45 2013
@@ -27,11 +27,6 @@ import java.util.GregorianCalendar ;
 import java.util.TimeZone ;
 
 import com.hp.hpl.jena.datatypes.xsd.XSDDateTime ;
-import com.hp.hpl.jena.graph.Node ;
-import com.hp.hpl.jena.graph.Triple ;
-import com.hp.hpl.jena.sparql.core.Quad ;
-import com.hp.hpl.jena.sparql.core.TriplePath ;
-import com.hp.hpl.jena.sparql.core.Var ;
 
 /** Miscellaneous operations - not query specific */
 
@@ -173,68 +168,4 @@ public class Utils
         // No SPARQL short form.
         return Float.toString(f) ;
     }
-    
-    public static boolean triplePathIso(TriplePath tp1, TriplePath tp2, NodeIsomorphismMap isoMap)
-    {
-        if ( tp1.isTriple() ^ tp2.isTriple() ) 
-            return false ;
-
-        if ( tp1.isTriple() )
-            return Utils.tripleIso(tp1.asTriple(), tp2.asTriple(), isoMap) ;
-        else
-            return Utils.nodeIso(tp1.getSubject(), tp2.getSubject(), isoMap) && 
-                   Utils.nodeIso(tp1.getObject(), tp2.getObject(), isoMap) &&
-                   tp1.getPath().equalTo(tp2.getPath(), isoMap) ;
-    }
-    
-    public static boolean tripleIso(Triple t1, Triple t2, NodeIsomorphismMap labelMap)
-    {
-        Node s1 = t1.getSubject() ;
-        Node p1 = t1.getPredicate() ;
-        Node o1 = t1.getObject() ;
-        
-        Node s2 = t2.getSubject() ;
-        Node p2 = t2.getPredicate() ;
-        Node o2 = t2.getObject() ;
-        
-        if ( ! nodeIso(s1, s2, labelMap) )
-            return false ;
-        if ( ! nodeIso(p1, p2, labelMap) )
-            return false ;
-        if ( ! nodeIso(o1, o2, labelMap) )
-            return false ;
-
-        return true ;
-    }
-    
-    public static boolean quadIso(Quad t1, Quad t2, NodeIsomorphismMap labelMap)
-    {
-        Node g1 = t1.getGraph() ;
-        Node s1 = t1.getSubject() ;
-        Node p1 = t1.getPredicate() ;
-        Node o1 = t1.getObject() ;
-        
-        Node g2 = t2.getGraph() ;
-        Node s2 = t2.getSubject() ;
-        Node p2 = t2.getPredicate() ;
-        Node o2 = t2.getObject() ;
-        
-        if ( ! nodeIso(g1, g2, labelMap) )
-            return false ;
-        if ( ! nodeIso(s1, s2, labelMap) )
-            return false ;
-        if ( ! nodeIso(p1, p2, labelMap) )
-            return false ;
-        if ( ! nodeIso(o1, o2, labelMap) )
-            return false ;
-
-        return true ;
-    }
-    
-    public static boolean nodeIso(Node n1, Node n2, NodeIsomorphismMap isoMap)
-    {
-        if ( isoMap != null && Var.isBlankNodeVar(n1) && Var.isBlankNodeVar(n2) )
-            return isoMap.makeIsomorphic(n1, n2) ;
-        return n1.equals(n2) ;
-    }
 }

Modified: jena/trunk/jena-arq/src/main/java/com/hp/hpl/jena/update/Update.java
URL: http://svn.apache.org/viewvc/jena/trunk/jena-arq/src/main/java/com/hp/hpl/jena/update/Update.java?rev=1497125&r1=1497124&r2=1497125&view=diff
==============================================================================
--- jena/trunk/jena-arq/src/main/java/com/hp/hpl/jena/update/Update.java (original)
+++ jena/trunk/jena-arq/src/main/java/com/hp/hpl/jena/update/Update.java Wed Jun 26 21:54:45 2013
@@ -25,6 +25,7 @@ import com.hp.hpl.jena.shared.PrefixMapp
 import com.hp.hpl.jena.sparql.modify.request.UpdateVisitor ;
 import com.hp.hpl.jena.sparql.modify.request.UpdateWriter ;
 import com.hp.hpl.jena.sparql.serializer.SerializationContext ;
+import com.hp.hpl.jena.sparql.util.NodeIsomorphismMap ;
 import com.hp.hpl.jena.sparql.util.PrintSerializable ;
 import com.hp.hpl.jena.sparql.util.QueryOutputUtils ;
 
@@ -51,4 +52,32 @@ public abstract class Update implements 
     @Override
     public String toString()
     { return PrintUtils.toString(this) ; }
+    
+    /** Compare by isomorphism - if the isomorphism map is null, compare nodes by .equals */ 
+    public abstract boolean equalTo(Update other, NodeIsomorphismMap isoMap) ;
+    
+//    @Override
+//    public boolean equals(Object other) {
+//        if ( ! ( other instanceof Update ) )
+//            return false ;
+//        return equalTo((Update)other, null) ;
+//    }
+//    
+//    @Override
+//    public abstract int hashCode() ;
+    
+    protected static final int hashAdd          = 0x1000 ;
+    protected static final int hashCopy         = 0x1001 ;
+    protected static final int hashMove         = 0x1002 ;
+    protected static final int hashCreate       = 0x1003 ;
+    protected static final int hashInsertData   = 0x1004 ;
+    protected static final int hashDeleteData   = 0x1005 ;
+    protected static final int hashDeleteWhere  = 0x1006 ;
+
+    protected static final int hashClear        = 0x1007 ;
+    protected static final int hashDrop         = 0x1008 ;
+
+    protected static final int hashLoad         = 0x1009 ;
+    protected static final int hashDeleteInsert = 0x100A ;
+    
 }

Modified: jena/trunk/jena-arq/src/main/java/com/hp/hpl/jena/update/UpdateRequest.java
URL: http://svn.apache.org/viewvc/jena/trunk/jena-arq/src/main/java/com/hp/hpl/jena/update/UpdateRequest.java?rev=1497125&r1=1497124&r2=1497125&view=diff
==============================================================================
--- jena/trunk/jena-arq/src/main/java/com/hp/hpl/jena/update/UpdateRequest.java (original)
+++ jena/trunk/jena-arq/src/main/java/com/hp/hpl/jena/update/UpdateRequest.java Wed Jun 26 21:54:45 2013
@@ -28,6 +28,7 @@ import org.apache.jena.atlas.io.PrintUti
 import org.apache.jena.atlas.io.Printable ;
 
 import com.hp.hpl.jena.sparql.core.Prologue ;
+import com.hp.hpl.jena.sparql.modify.UpdateCompare ;
 import com.hp.hpl.jena.sparql.modify.request.UpdateWriter ;
 
 /** A SPARQL Update consists of a number of operations (e.g. INSERT, CLEAR).
@@ -67,4 +68,9 @@ public class UpdateRequest extends Prolo
     @Override
     public void output(IndentedWriter out)
     { UpdateWriter.output(this, out) ; }
+    
+    public boolean equalTo(UpdateRequest other) {
+        return UpdateCompare.isomorphic(this, other) ; 
+    }
+    
 }

Modified: jena/trunk/jena-arq/src/test/java/com/hp/hpl/jena/sparql/modify/TS_Update.java
URL: http://svn.apache.org/viewvc/jena/trunk/jena-arq/src/test/java/com/hp/hpl/jena/sparql/modify/TS_Update.java?rev=1497125&r1=1497124&r2=1497125&view=diff
==============================================================================
--- jena/trunk/jena-arq/src/test/java/com/hp/hpl/jena/sparql/modify/TS_Update.java (original)
+++ jena/trunk/jena-arq/src/test/java/com/hp/hpl/jena/sparql/modify/TS_Update.java Wed Jun 26 21:54:45 2013
@@ -24,9 +24,11 @@ import org.junit.runners.Suite.SuiteClas
 
 @RunWith(Suite.class)
 @SuiteClasses( { 
-    TestUpdateGraphMem.class ,
-    TestUpdateGraphMgtMem.class ,
-    TestUpdateOperations.class
+    TestUpdateGraphMem.class
+    , TestUpdateGraphMgtMem.class
+    , TestUpdateOperations.class
+    , TestUpdateCompare.class
+    //, TestUpdateWriter.class
 })
 public class TS_Update
 {

Added: jena/trunk/jena-arq/src/test/java/com/hp/hpl/jena/sparql/modify/TestUpdateCompare.java
URL: http://svn.apache.org/viewvc/jena/trunk/jena-arq/src/test/java/com/hp/hpl/jena/sparql/modify/TestUpdateCompare.java?rev=1497125&view=auto
==============================================================================
--- jena/trunk/jena-arq/src/test/java/com/hp/hpl/jena/sparql/modify/TestUpdateCompare.java (added)
+++ jena/trunk/jena-arq/src/test/java/com/hp/hpl/jena/sparql/modify/TestUpdateCompare.java Wed Jun 26 21:54:45 2013
@@ -0,0 +1,99 @@
+/**
+ * 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.modify;
+
+import org.apache.jena.atlas.junit.BaseTest ;
+import org.apache.jena.atlas.lib.StrUtils ;
+import org.junit.Test ;
+
+import com.hp.hpl.jena.update.UpdateFactory ;
+import com.hp.hpl.jena.update.UpdateRequest ;
+
+public class TestUpdateCompare extends BaseTest {
+    @Test public void updateCompare01()     { test("INSERT DATA {}") ; }
+    @Test public void updateCompare02()     { test("INSERT DATA {<s> <p> <o>}") ; }
+    @Test public void updateCompare03()     { test("INSERT DATA {<s> <p> _:a}", "INSERT DATA {<s> <p> _:b}") ; }
+    @Test public void updateCompare04()     { test("INSERT DATA {<s> <p> _:a ; <p> 123 }", "INSERT DATA {<s> <p> _:b . <s> <p> 123 }") ; }
+    @Test public void updateCompare05()     { test("INSERT DATA {<s> <p> _:a ; <p> 123 }", "INSERT DATA {<s> <p> 123 . <s> <p> _:b .  }", false) ; }
+
+    @Test public void updateCompare06()     { test("DELETE DATA {}", "INSERT DATA {}", false) ; }
+    @Test public void updateCompare07()     { test("DELETE DATA {<s> <p> <o>}", "DELETE DATA {<s> <p> <o>}") ; }
+    
+    @Test public void updateCompare08()     { test("DELETE {} INSERT {} WHERE {}") ; } 
+    @Test public void updateCompare09()     { test("DELETE {<s> <p> ?v} INSERT {<s> <t> _:a } WHERE { <s> <p> _:a }") ; } 
+    
+    @Test public void updateCompare10()     { test("PREFIX : <http://example/> INSERT DATA { :s :p :o }") ; }
+    @Test public void updateCompare11()     { test("PREFIX : <http://example/> INSERT DATA { :s :p :o }",
+                                                   "PREFIX ex: <http://example/> INSERT DATA { ex:s ex:p ex:o }",
+                                                   false) ; }
+    
+    @Test public void updateCompare20()     { 
+        String u1 = StrUtils.strjoinNL("PREFIX : <http://example/>",
+                                       "WITH :g1 INSERT { :s :p :o } WHERE {}") ;
+        test(u1) ;
+    }
+
+    @Test public void updateCompare21()     { 
+        String u1 = "PREFIX : <http://example/> WITH :AAA INSERT { } WHERE {}" ;
+        String u2 = "PREFIX : <http://example/> WITH :ZZZ INSERT { } WHERE {}" ;
+        test(u1, u2, false) ;
+    }
+    
+    @Test public void updateCompare22()     { 
+        String u1 = "PREFIX : <http://example/> DELETE { } USING :G WHERE {}" ;
+        test(u1) ;
+    }
+
+    @Test public void updateCompare23()     { 
+        String u1 = "PREFIX : <http://example/> DELETE { } USING :G WHERE {}" ;
+        String u2 = "PREFIX : <http://example/> DELETE { } USING :X WHERE {}" ;
+        test(u1, u2, false) ;
+    }
+
+    @Test public void updateCompare24()     { 
+        String u1 = "PREFIX : <http://example/> DELETE { } USING NAMED :G WHERE {}" ;
+        test(u1) ;
+    }
+
+    @Test public void updateCompare25()     { 
+        String u1 = "PREFIX : <http://example/> DELETE { } USING NAMED :G WHERE {}" ;
+        String u2 = "PREFIX : <http://example/> DELETE { } USING :G WHERE {}" ;
+        test(u1, u2, false) ;
+    }
+
+    private void test(String updateString) {
+        test(updateString, updateString, true) ;
+    }
+
+    private void test(String updateString1, String updateString2) {
+        test(updateString1, updateString2, true) ;
+    }
+
+    private void test(String updateString1, String updateString2, boolean isomorphic) {
+        UpdateRequest update1 = UpdateFactory.create(updateString1);
+        UpdateRequest update2 = UpdateFactory.create(updateString2);
+        test(update1, update2, isomorphic) ;
+    }
+        
+    private void test(UpdateRequest update1, UpdateRequest update2, boolean isomorphic) {
+        boolean b = UpdateCompare.isomorphic(update1, update2) ;
+        assertEquals(update1.toString(), b, isomorphic) ;
+    }
+}
+

Added: jena/trunk/jena-arq/src/test/java/com/hp/hpl/jena/sparql/modify/TestUpdateWriter.java
URL: http://svn.apache.org/viewvc/jena/trunk/jena-arq/src/test/java/com/hp/hpl/jena/sparql/modify/TestUpdateWriter.java?rev=1497125&view=auto
==============================================================================
--- jena/trunk/jena-arq/src/test/java/com/hp/hpl/jena/sparql/modify/TestUpdateWriter.java (added)
+++ jena/trunk/jena-arq/src/test/java/com/hp/hpl/jena/sparql/modify/TestUpdateWriter.java Wed Jun 26 21:54:45 2013
@@ -0,0 +1,53 @@
+/**
+ * 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.modify;
+
+import org.apache.jena.atlas.io.IndentedLineBuffer ;
+import org.apache.jena.atlas.junit.BaseTest ;
+import org.junit.Test ;
+
+import com.hp.hpl.jena.sparql.modify.request.UpdateWriter ;
+import com.hp.hpl.jena.update.UpdateFactory ;
+import com.hp.hpl.jena.update.UpdateRequest ;
+
+public class TestUpdateWriter extends BaseTest {
+    @Test public void updateWrite01()   { test("INSERT DATA {}") ; }
+    @Test public void updateWrite02()   { test("PREFIX : <http://example/> INSERT DATA { <s> :p 123 }") ; }
+    @Test public void updateWrite03()   { test("PREFIX : <http://example/> INSERT DATA { _:a :p 123 , 456 }") ; }
+    @Test public void updateWrite04()   { test("PREFIX : <http://example/> INSERT DATA { _:a :p 123 ; :q 456 }") ; }
+    @Test public void updateWrite05()   { test("DELETE {} INSERT {} WHERE {}") ; }
+    
+    // WITH
+    // USING / USING NAMED
+    
+    @Test public void updateWrite06()   { test("INSERT DATA {}") ; }
+    @Test public void updateWrite07()   { test("INSERT DATA {}") ; }
+    @Test public void updateWrite08()   { test("INSERT DATA {}") ; }
+    @Test public void updateWrite09()   { test("INSERT DATA {}") ; }
+
+    private void test(String updateString) {
+        UpdateRequest update1 = UpdateFactory.create(updateString);
+        IndentedLineBuffer w = new IndentedLineBuffer() ;
+        UpdateWriter.output(update1, w) ;
+        String s = w.asString() ;
+        UpdateRequest update2 = UpdateFactory.create(s);
+        assertTrue(update1.equalTo(update2)) ;
+    }
+}
+