diff --git a/stmts.py b/stmts.py index 4edc22f28e8795d631a387cd4855411fa1a88356_c3RtdHMucHk=..1db3a36561cfb050df246511e972ea406ac3cc30_c3RtdHMucHk= 100644 --- 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,8 +624,6 @@ 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)) @@ -626,6 +627,8 @@ 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,6 +643,6 @@ 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 = [] @@ -644,6 +647,9 @@ 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 index 4edc22f28e8795d631a387cd4855411fa1a88356_dGVzdC91bml0dGVzdF9ub2Rlcy5weQ==..1db3a36561cfb050df246511e972ea406ac3cc30_dGVzdC91bml0dGVzdF9ub2Rlcy5weQ== 100644 --- a/test/unittest_nodes.py +++ b/test/unittest_nodes.py @@ -97,8 +97,8 @@ 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() @@ -101,7 +101,7 @@ 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() @@ -106,6 +106,6 @@ 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 index 4edc22f28e8795d631a387cd4855411fa1a88356_dW5kby5weQ==..1db3a36561cfb050df246511e972ea406ac3cc30_dW5kby5weQ== 100644 --- a/undo.py +++ b/undo.py @@ -171,6 +171,9 @@ 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""" @@ -174,7 +177,7 @@ 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'""" @@ -178,10 +181,10 @@ 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'""" @@ -182,9 +185,13 @@ 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""" @@ -189,6 +196,6 @@ 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 #############################################################