meth = getattr(v, "enter_%s" % obj.__visit_name__, None)
if meth:
meth(obj)
-
- for c in obj.get_children(clone=clone, **self.__traverse_options__):
+
+ if clone:
+ obj.copy_internals()
+ for c in obj.get_children(**self.__traverse_options__):
_trav(c)
for v in visitors:
return self is other
- def get_children(self, clone=False, **kwargs):
+ def copy_internals(self):
+ """reassign internal elements to be clones of themselves.
+
+ called during a copy-and-traverse operation on newly
+ shallow-copied elements to create a deep copy."""
+
+ pass
+
+ def get_children(self, **kwargs):
"""return immediate child elements of this ``ClauseElement``.
this is used for visit traversal.
- clone indicates child items should be _cloned(), replacing
- the elements contained by this element, and the cloned
- copy returned. this allows modifying traversals
- to take place.
-
\**kwargs may contain flags that change the collection
that is returned, for example to return a subset of items
in order to cut down on larger traversals, or to return
columns = property(lambda s:[])
- def get_children(self, clone=False, **kwargs):
- if clone:
- self.bindparams = [b._clone() for b in self.bindparams]
-
+ def copy_internals(self):
+ self.bindparams = [b._clone() for b in self.bindparams]
+
+ def get_children(self, **kwargs):
return self.bindparams.values()
def _get_from_objects(self, **modifiers):
else:
self.clauses.append(_literal_as_text(clause))
- def get_children(self, clone=False, **kwargs):
- if clone:
- self.clauses = [clause._clone() for clause in self.clauses]
-
+ def copy_internals(self):
+ self.clauses = [clause._clone() for clause in self.clauses]
+
+ def get_children(self, **kwargs):
return self.clauses
def _get_from_objects(self, **modifiers):
key = property(lambda self:self.name or "_calc_")
- def get_children(self, clone=False, **kwargs):
- if clone:
- self.clause_expr = self.clause_expr._clone()
+ def copy_internals(self):
+ self.clause_expr = self.clause_expr._clone()
+
+ def get_children(self, **kwargs):
return self.clause_expr,
def _get_from_objects(self, **modifiers):
key = property(lambda self:self.name)
- def get_children(self, clone=False, **kwargs):
- if clone:
- self._clone_from_clause()
- return _CalculatedClause.get_children(self, clone=clone, **kwargs)
+ def copy_internals(self):
+ self._clone_from_clause()
+
+ def get_children(self, **kwargs):
+ return _CalculatedClause.get_children(self, **kwargs)
def append(self, clause):
self.clauses.append(_literal_as_binds(clause, self.name))
self.clause = clause
self.typeclause = _TypeClause(self.type)
- def get_children(self, clone=False, **kwargs):
- if clone:
- self.clause = self.clause._clone()
- self.typeclause = self.typeclause._clone()
-
+ def copy_internals(self):
+ self.clause = self.clause._clone()
+ self.typeclause = self.typeclause._clone()
+
+ def get_children(self, **kwargs):
return self.clause, self.typeclause
def _get_from_objects(self, **modifiers):
def _get_from_objects(self, **modifiers):
return self.element._get_from_objects(**modifiers)
- def get_children(self, clone=False, **kwargs):
- if clone:
- self.element = self.element._clone()
+ def copy_internals(self):
+ self.element = self.element._clone()
+
+ def get_children(self, **kwargs):
return self.element,
def compare(self, other):
def _get_from_objects(self, **modifiers):
return self.left._get_from_objects(**modifiers) + self.right._get_from_objects(**modifiers)
- def get_children(self, clone=False, **kwargs):
- if clone:
- self.left = self.left._clone()
- self.right = self.right._clone()
-
+ def copy_internals(self):
+ self.left = self.left._clone()
+ self.right = self.right._clone()
+
+ def get_children(self, **kwargs):
return self.left, self.right
def compare(self, other):
self._foreign_keys.add(f)
return column
- def get_children(self, clone=False, **kwargs):
- if clone:
- self._clone_from_clause()
- self.left = self.left._clone()
- self.right = self.right._clone()
- self.onclause = self.onclause._clone()
- self.__folded_equivalents = None
- self._init_primary_key()
+ def copy_internals(self):
+ self._clone_from_clause()
+ self.left = self.left._clone()
+ self.right = self.right._clone()
+ self.onclause = self.onclause._clone()
+ self.__folded_equivalents = None
+ self._init_primary_key()
+
+ def get_children(self, **kwargs):
return self.left, self.right, self.onclause
def _match_primaries(self, primary, secondary):
#return self.selectable._exportable_columns()
return self.selectable.columns
- def get_children(self, clone=False, **kwargs):
- if clone:
- self._clone_from_clause()
- self.selectable = self.selectable._clone()
- baseselectable = self.selectable
- while isinstance(baseselectable, Alias):
- baseselectable = baseselectable.selectable
- self.original = baseselectable
+ def copy_internals(self):
+ self._clone_from_clause()
+ self.selectable = self.selectable._clone()
+ baseselectable = self.selectable
+ while isinstance(baseselectable, Alias):
+ baseselectable = baseselectable.selectable
+ self.original = baseselectable
+
+ def get_children(self, **kwargs):
for c in self.c:
yield c
yield self.selectable
_label = property(lambda s: s.elem._label)
orig_set = property(lambda s:s.elem.orig_set)
- def get_children(self, clone=False, **kwargs):
- if clone:
- self.elem = self.elem._clone()
+ def copy_internals(self):
+ self.elem = self.elem._clone()
+
+ def get_children(self, **kwargs):
return self.elem,
def _hide_froms(self, **modifiers):
def _compare_self(self):
return self.obj
- def get_children(self, clone=False, **kwargs):
- if clone:
- self.obj = self.obj._clone()
+ def copy_internals(self):
+ self.obj = self.obj._clone()
+
+ def get_children(self, **kwargs):
return self.obj,
def _get_from_objects(self, **modifiers):
col.orig_set = colset
return col
- def get_children(self, clone=False, column_collections=True, **kwargs):
- if clone:
- self._clone_from_clause()
- self._col_map = {}
- self.selects = [s._clone() for s in self.selects]
- for attr in ('_order_by_clause', '_group_by_clause'):
- if getattr(self, attr) is not None:
- setattr(self, attr, getattr(self, attr)._clone())
+ def copy_internals(self):
+ self._clone_from_clause()
+ self._col_map = {}
+ self.selects = [s._clone() for s in self.selects]
+ for attr in ('_order_by_clause', '_group_by_clause'):
+ if getattr(self, attr) is not None:
+ setattr(self, attr, getattr(self, attr)._clone())
+ def get_children(self, column_collections=True, **kwargs):
return (column_collections and list(self.c) or []) + \
[self._order_by_clause, self._group_by_clause] + list(self.selects)
inner_columns = property(_get_inner_columns)
- def get_children(self, clone=False, column_collections=True, **kwargs):
- if clone:
- self._clone_from_clause()
- self._raw_columns = [c._clone() for c in self._raw_columns]
- self._recorrelate_froms([f._clone() for f in self._froms])
- for attr in ('_whereclause', '_having', '_order_by_clause', '_group_by_clause'):
- if getattr(self, attr) is not None:
- setattr(self, attr, getattr(self, attr)._clone())
-
+ def copy_internals(self):
+ self._clone_from_clause()
+ self._raw_columns = [c._clone() for c in self._raw_columns]
+ self._recorrelate_froms([f._clone() for f in self._froms])
+ for attr in ('_whereclause', '_having', '_order_by_clause', '_group_by_clause'):
+ if getattr(self, attr) is not None:
+ setattr(self, attr, getattr(self, attr)._clone())
+
+ def get_children(self, column_collections=True, **kwargs):
return (column_collections and list(self.columns) or []) + \
list(self._froms) + \
[x for x in (self._whereclause, self._having, self._order_by_clause, self._group_by_clause) if x is not None]