# 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 #############################################################