# HG changeset patch
# User Sylvain Thenault <sylvain.thenault@logilab.fr>
# Date 1223465568 -7200
#      Wed Oct 08 13:32:48 2008 +0200
# Node ID 581690fba7f701c80331334a392583cf44a28fc5
# Parent  03953db80b92807ade3d86e16255dac66cabf309
new traverse_scope argument to ored()

diff --git a/nodes.py b/nodes.py
--- a/nodes.py
+++ b/nodes.py
@@ -211,8 +211,9 @@
     def __repr__(self):
         return '%s AND %s' % (repr(self.children[0]), repr(self.children[1]))
     
-    def ored(self, _fromnode=None):
-        return self.parent.ored(_fromnode or self)
+    def ored(self, traverse_scope=False, _fromnode=None):
+        return self.parent.ored(traverse_scope, _fromnode or self)
+    
     def neged(self, _fromnode=None):
         return self.parent.neged(_fromnode or self)
 
@@ -228,8 +229,9 @@
     def __repr__(self):
         return '%s OR %s' % (repr(self.children[0]), repr(self.children[1]))
     
-    def ored(self, _fromnode=None):
+    def ored(self, traverse_scope=False, _fromnode=None):
         return self
+    
     def neged(self, _fromnode=None):
         return self.parent.neged(_fromnode or self)
 
@@ -250,8 +252,10 @@
     def scope(self):
         return self
     
-    def ored(self, _fromnode=None):
-        return self.parent.ored(_fromnode or self)
+    def ored(self, traverse_scope=False, _fromnode=None):
+        # XXX consider traverse_scope ?
+        return self.parent.ored(traverse_scope, _fromnode or self)
+    
     def neged(self, _fromnode=None):
         return self
 
@@ -299,10 +303,13 @@
     def scope(self):
         return self
     
-    def ored(self, _fromnode=None):
-        if _fromnode is not None: # stop here
-            return False
-        return self.parent.ored(self)
+    def ored(self, traverse_scope=False, _fromnode=None):
+        if not traverse_scope:
+            if _fromnode is not None: # stop here
+                return False
+            return self.parent.ored(traverse_scope, self)
+        return self.parent.ored(traverse_scope, _fromnode)
+    
     def neged(self, _fromnode=None, strict=False):
         if _fromnode is not None: # stop here
             return False
@@ -369,8 +376,9 @@
         """return the parent relation where self occurs or None"""
         return self
     
-    def ored(self, _fromnode=None):
-        return self.parent.ored(_fromnode or self)
+    def ored(self, traverse_scope=False, _fromnode=None):
+        return self.parent.ored(traverse_scope, _fromnode or self)
+    
     def neged(self, _fromnode=None, strict=False):
         if strict:
             return isinstance(self.parent, Not)
diff --git a/stmts.py b/stmts.py
--- a/stmts.py
+++ b/stmts.py
@@ -160,7 +160,7 @@
     def scope(self):
         return self
     
-    def ored(self, _fromnode=None):
+    def ored(self, traverse_scope=False, _fromnode=None):
         return None
     def neged(self, _fromnode=None, strict=False):
         return None
@@ -241,6 +241,8 @@
             
     def copy(self, copy_children=True):
         new = Union()
+        if self.schema is not None:
+            new.schema = self.schema
         if copy_children:
             for child in self.children:
                 new.append(child.copy())