# HG changeset patch # User Sylvain <syt@logilab.fr> # Date 1210769651 -7200 # Wed May 14 14:54:11 2008 +0200 # Node ID 1db3a36561cfb050df246511e972ea406ac3cc30 # Parent 4edc22f28e8795d631a387cd4855411fa1a88356 remove group/sort undoing fix diff --git a/stmts.py b/stmts.py --- a/stmts.py +++ b/stmts.py @@ -605,7 +605,7 @@ from rql.undo import SelectVarOperation self.undo_manager.add_operation(SelectVarOperation(term)) - def add_group_var(self, var): + def add_group_var(self, var, index=None): """add var in 'orderby' constraints asc is a boolean indicating the group order (ascendent or descendent) """ @@ -613,7 +613,10 @@ self.groupby = [] vref = nodes.variable_ref(var) vref.register_reference() - self.groupby.append(vref) + if index is None: + self.groupby.append(vref) + else: + self.groupby.insert(index, vref) vref.parent = self if self.should_register_op: from rql.undo import AddGroupOperation @@ -621,11 +624,11 @@ def remove_group_var(self, vref): """remove the group variable and the group node if necessary""" - vref.unregister_reference() - self.groupby.remove(vref) if self.should_register_op: from rql.undo import RemoveGroupOperation self.undo_manager.add_operation(RemoveGroupOperation(vref)) + vref.unregister_reference() + self.groupby.remove(vref) def remove_groups(self): for vref in self.groupby[:]: @@ -640,10 +643,13 @@ term = nodes.SortTerm(vref, asc) self.add_sort_term(term) - def add_sort_term(self, term): + def add_sort_term(self, term, index=None): if not self.orderby: self.orderby = [] - self.orderby.append(term) + if index is None: + self.orderby.append(term) + else: + self.orderby.insert(index, term) term.parent = self for vref in term.iget_nodes(nodes.VariableRef): try: diff --git a/test/unittest_nodes.py b/test/unittest_nodes.py --- a/test/unittest_nodes.py +++ b/test/unittest_nodes.py @@ -97,15 +97,15 @@ self.assertEquals(tree.as_string(), 'Any X') def test_select_remove_sort_terms(self): - tree = self._parse('Any X ORDERBY X') + tree = self._parse('Any X,Y ORDERBY X,Y') tree.save_state() select = tree.children[0] select.remove_sort_terms() tree.check_references() - self.assertEquals(tree.as_string(), 'Any X') + self.assertEquals(tree.as_string(), 'Any X,Y') tree.recover() tree.check_references() - self.assertEquals(tree.as_string(), 'Any X ORDERBY X') + self.assertEquals(tree.as_string(), 'Any X,Y ORDERBY X,Y') def test_select_set_distinct(self): tree = self._parse('DISTINCT Any X') @@ -154,7 +154,7 @@ tree.recover() tree.check_references() self.assertEquals(tree.as_string(), 'Any X,Y GROUPBY X,Y') - + def test_select_base_1(self): tree = self._parse("Any X WHERE X is Person") self.assertIsInstance(tree, stmts.Union) diff --git a/undo.py b/undo.py --- a/undo.py +++ b/undo.py @@ -171,24 +171,31 @@ class RemoveSortOperation(NodeOperation): """defines how to undo 'remove sort'""" + def __init__(self, node): + NodeOperation.__init__(self, node) + self.index = self.stmt.orderby.index(self.node) def undo(self, selection): """undo the operation on the selection""" - self.stmt.add_sort_term(self.node) + self.stmt.add_sort_term(self.node, self.index) class AddGroupOperation(NodeOperation): """defines how to undo 'add group'""" - + def undo(self, selection): """undo the operation on the selection""" self.stmt.remove_group_var(self.node) class RemoveGroupOperation(NodeOperation): """defines how to undo 'remove group'""" - + + def __init__(self, node): + NodeOperation.__init__(self, node) + self.index = self.stmt.groupby.index(self.node) + def undo(self, selection): """undo the operation on the selection""" - self.stmt.add_group_var(self.node) + self.stmt.add_group_var(self.node, self.index) # misc operations #############################################################