Commit 0922e32e authored by Frank Bessou's avatar Frank Bessou 🍁
Browse files

refactor: remove prefix on identifiers from same module

parent 8f32328e2505
......@@ -104,7 +104,7 @@ class BaseNode(VisitableMixIn):
return self.parent.scope
return None # should we return None or something else?
Y = TypeVar("Y", bound="rql.base.BaseNode")
Y = TypeVar("Y", bound="BaseNode")
def get_nodes(self, klass: Type["Y"]) -> List["Y"]:
"""Return the list of nodes of a given class in the subtree.
......@@ -172,12 +172,12 @@ class BaseNode(VisitableMixIn):
return self
return self.children[path[0]].go_to_index_path(path[1:])
def copy(self, stmt: Optional["rql.stmts.Statement"] = None) -> "rql.base.BaseNode":
def copy(self, stmt: Optional["rql.stmts.Statement"] = None) -> "BaseNode":
raise NotImplementedError()
def replace(
self, old_child: "rql.base.BaseNode", new_child: "rql.base.BaseNode"
) -> Tuple["rql.base.BaseNode", "rql.base.BaseNode", Optional[int]]:
self, old_child: "BaseNode", new_child: "BaseNode"
) -> Tuple["BaseNode", "BaseNode", Optional[int]]:
raise NotImplementedError()
......@@ -186,8 +186,8 @@ class Node(BaseNode):
__slots__: Iterable[str] = ("children",)
P = TypeVar("P", bound="rql.base.BaseNode")
C = TypeVar("C", bound="rql.base.BaseNode")
P = TypeVar("P", bound="BaseNode")
C = TypeVar("C", bound="BaseNode")
def __init__(self):
self.parent: Optional["P"] = None # noqa: F821
......@@ -199,8 +199,8 @@ class Node(BaseNode):
child.parent = self
def remove(
self, child: "rql.base.BaseNode"
) -> Tuple["rql.base.BaseNode", Optional["rql.base.BaseNode"], Optional[int]]:
self, child: "BaseNode"
) -> Tuple["BaseNode", Optional["BaseNode"], Optional[int]]:
"""Remove a child node. Return the removed node, its old parent and
index in the children list.
"""
......@@ -216,8 +216,8 @@ class Node(BaseNode):
child.parent = self
def replace(
self, old_child: "rql.base.BaseNode", new_child: "rql.base.BaseNode"
) -> Tuple["rql.base.BaseNode", "rql.base.BaseNode", Optional[int]]:
self, old_child: "BaseNode", new_child: "BaseNode"
) -> Tuple["BaseNode", "BaseNode", Optional[int]]:
"""replace a child node with another"""
i = self.children.index(old_child)
self.children.pop(i)
......@@ -241,8 +241,8 @@ class BinaryNode(Node):
def __init__(
self,
lhs: Optional["rql.base.BaseNode"] = None,
rhs: Optional["rql.base.BaseNode"] = None,
lhs: Optional["BaseNode"] = None,
rhs: Optional["BaseNode"] = None,
):
Node.__init__(self)
......@@ -252,15 +252,15 @@ class BinaryNode(Node):
self.append(rhs)
def remove(
self, child: "rql.base.BaseNode"
) -> Tuple["rql.base.BaseNode", Optional["rql.base.BaseNode"], Optional[int]]:
self, child: "BaseNode"
) -> Tuple["BaseNode", Optional["BaseNode"], Optional[int]]:
"""Remove the child and replace this node with the other child."""
index: int = self.children.index(child)
if self.parent is not None:
return self.parent.replace(self, self.children[not index])
return child, None, index
def get_parts(self) -> Tuple["rql.base.BaseNode", "rql.base.BaseNode"]:
def get_parts(self) -> Tuple["BaseNode", "BaseNode"]:
"""Return the left hand side and the right hand side of this node."""
return self.children[0], self.children[1]
......@@ -273,14 +273,14 @@ class LeafNode(BaseNode):
# We can't do that because of a bug in mypy see
# https://github.com/python/mypy/issues/4125#issuecomment-337187251
# @property
# def children(self) -> Sequence["rql.base.BaseNode"]:
# def children(self) -> Sequence["BaseNode"]:
@property
def children(self):
return ()
def copy(
self: "rql.base.BaseNode", stmt: Optional["rql.stmts.Statement"] = None
) -> "rql.base.BaseNode":
self: "BaseNode", stmt: Optional["rql.stmts.Statement"] = None
) -> "BaseNode":
"""Create and return a copy of this node and its descendant.
stmt is the root node, which should be use to get new variables.
......
......@@ -110,9 +110,7 @@ def etype_from_pyobj(value: ValueType) -> str:
return ETYPE_PYOBJ_MAP[type(value)]
def variable_ref(
var: Union_["rql.nodes.Variable", "rql.nodes.VariableRef"]
) -> "rql.nodes.VariableRef":
def variable_ref(var: Union_["Variable", "rql.nodes.VariableRef"]) -> "VariableRef":
"""get a VariableRef"""
if isinstance(var, Variable):
return VariableRef(var, noautoref=1)
......@@ -123,8 +121,8 @@ def variable_ref(
# Incompatible types in "yield" (actual type "BaseNode", expected type "VariableRef") [misc]
# We may need to update the iget_nodes signature
def variable_refs(
node: "rql.nodes.VariableRef",
) -> Iterator[Union_["rql.base.BaseNode", "rql.nodes.VariableRef"]]:
node: "VariableRef",
) -> Iterator[Union_["rql.base.BaseNode", "VariableRef"]]:
for vref in node.iget_nodes(VariableRef):
vref = cast(VariableRef, vref)
if isinstance(vref.variable, Variable):
......@@ -169,7 +167,7 @@ class HSMixin:
__slots__: Iterable[str] = ()
def relation(self: rt.HasHand) -> Optional["rql.nodes.Relation"]:
def relation(self: rt.HasHand) -> Optional["Relation"]:
"""return the parent relation where self occurs or None"""
try:
return self.parent.relation()
......@@ -189,12 +187,12 @@ class HSMixin:
def make_relation(
var: "rql.nodes.Variable",
var: "Variable",
rel: str,
rhsargs: Tuple[Any, ...],
rhsclass: type,
operator: str = "=",
) -> "rql.nodes.Relation":
) -> "Relation":
"""build an relation equivalent to '<var> rel = <cst>'"""
cmpop = Comparison(operator)
cmpop.append(rhsclass(*rhsargs))
......@@ -208,8 +206,8 @@ def make_relation(
def make_constant_restriction(
var: "rql.nodes.Variable", rtype: str, value: str, ctype: str, operator: str = "="
) -> "rql.nodes.Relation":
var: "Variable", rtype: str, value: str, ctype: str, operator: str = "="
) -> "Relation":
if ctype is None:
ctype = etype_from_pyobj(value)
......@@ -271,7 +269,7 @@ class EditableMixIn:
RemoveNodeOperation(node, parent, stmt, index)
)
def add_restriction(self, relation: "rql.nodes.Relation") -> "rql.nodes.Relation":
def add_restriction(self, relation: "Relation") -> "rql.nodes.Relation":
"""add a restriction relation"""
# "EditableMixIn" has no attribute "where" [attr-defined]
r = self.where # type: ignore[attr-defined]
......@@ -294,12 +292,12 @@ class EditableMixIn:
def add_constant_restriction(
self,
var: "rql.nodes.Variable",
var: "Variable",
rtype: str,
value: str,
ctype: str,
operator: str = "=",
) -> "rql.nodes.Relation":
) -> "Relation":
"""builds a restriction node to express a constant restriction:
variable rtype = value
......@@ -308,25 +306,23 @@ class EditableMixIn:
return self.add_restriction(restr)
def add_relation(
self, lhsvar: "rql.nodes.Variable", rtype: str, rhsvar: "rql.nodes.Variable"
) -> "rql.nodes.Relation":
self, lhsvar: "Variable", rtype: str, rhsvar: "rql.nodes.Variable"
) -> "Relation":
"""builds a restriction node to express '<var> eid <eid>'"""
return self.add_restriction(
make_relation(lhsvar, rtype, (rhsvar,), VariableRef)
)
def add_eid_restriction(
self, var: "rql.nodes.Variable", eid: str, c_type: str = "Int"
) -> "rql.nodes.Relation":
self, var: "Variable", eid: str, c_type: str = "Int"
) -> "Relation":
"""builds a restriction node to express '<var> eid <eid>'"""
assert c_type in ("Int", "Substitute"), (
"Error got c_type=%r in eid restriction" % c_type
)
return self.add_constant_restriction(var, "eid", eid, c_type)
def add_type_restriction(
self, var: "rql.nodes.Variable", etype: str
) -> "rql.nodes.Relation":
def add_type_restriction(self, var: "Variable", etype: str) -> "Relation":
"""builds a restriction node to express : variable is etype"""
# what is stinfo?
typerel = var.stinfo.get("typerel", None)
......@@ -367,7 +363,7 @@ class SubQuery(BaseNode):
def __init__(
self,
aliases: Optional[List["rql.nodes.VariableRef"]] = None,
aliases: Optional[List["VariableRef"]] = None,
query: Optional["rql.stmts.Union"] = None,
) -> None:
if aliases is not None:
......@@ -375,7 +371,7 @@ class SubQuery(BaseNode):
if query is not None:
self.set_query(query)
def set_aliases(self, aliases: List["rql.nodes.VariableRef"]) -> None:
def set_aliases(self, aliases: List["VariableRef"]) -> None:
self.aliases = aliases
for node in aliases:
node.parent = self
......@@ -384,9 +380,7 @@ class SubQuery(BaseNode):
self.query = node
node.parent = self
def copy(
self, stmt: Optional["rql.stmts.Statement"] = None
) -> "rql.nodes.SubQuery":
def copy(self, stmt: Optional["rql.stmts.Statement"] = None) -> "SubQuery":
# error: List comprehension has incompatible type List[BaseNode];
# expected List[VariableRef] [misc]
# type: ignore[misc]
......@@ -426,16 +420,12 @@ class And(BinaryNode):
def __repr__(self) -> str:
return "%s AND %s" % (repr(self.children[0]), repr(self.children[1]))
def ored(
self, traverse_scope: bool = False, _fromnode: Any = None
) -> "rql.nodes.Or":
def ored(self, traverse_scope: bool = False, _fromnode: Any = None) -> "Or":
# Item "BaseNode" of "Optional[BaseNode]"
# has no attribute "ored" [union-attr]
return self.parent.ored(traverse_scope, _fromnode or self) # type: ignore[union-attr]
def neged(
self, traverse_scope: bool = False, _fromnode: Any = None
) -> "rql.nodes.Not":
def neged(self, traverse_scope: bool = False, _fromnode: Any = None) -> "Not":
# Item "BaseNode" of "Optional[BaseNode]"
# has no attribute "neged" [union-attr]
return self.parent.neged(traverse_scope, _fromnode or self) # type: ignore[union-attr]
......@@ -455,14 +445,10 @@ class Or(BinaryNode):
def __repr__(self) -> str:
return "%s OR %s" % (repr(self.children[0]), repr(self.children[1]))
def ored(
self, traverse_scope: bool = False, _fromnode: Any = None
) -> "rql.nodes.Or":
def ored(self, traverse_scope: bool = False, _fromnode: Any = None) -> "Or":
return self
def neged(
self, traverse_scope: bool = False, _fromnode: Any = None
) -> "rql.nodes.Not":
def neged(self, traverse_scope: bool = False, _fromnode: Any = None) -> "Not":
# Item "BaseNode" of "Optional[BaseNode]" has no attribute "neged" [union-attr]
return self.parent.neged(traverse_scope, _fromnode or self) # type: ignore[union-attr]
......@@ -487,16 +473,14 @@ class Not(Node):
) -> str:
return "NOT (%s)" % repr(self.children[0])
def ored(
self, traverse_scope: bool = False, _fromnode: Any = None
) -> "rql.nodes.Or":
def ored(self, traverse_scope: bool = False, _fromnode: Any = None) -> "Or":
# XXX consider traverse_scope ?
# Item "BaseNode" of "Optional[BaseNode]" has no attribute "ored" [union-attr]
return self.parent.ored(traverse_scope, _fromnode or self) # type: ignore[union-attr]
def neged(
self, traverse_scope: bool = False, _fromnode: Any = None, strict: bool = False
) -> "rql.nodes.Not":
) -> "Not":
return self
def remove(
......@@ -527,8 +511,8 @@ class Exists(EditableMixIn, BaseNode):
else:
self.query: Any = None
def copy(self, stmt: Optional["rql.stmts.Statement"] = None) -> "rql.nodes.Exists":
# def copy(self, stmt: "rql.stmts.Statement") -> "rql.nodes.SubQuery":
def copy(self, stmt: Optional["rql.stmts.Statement"] = None) -> "Exists":
# def copy(self, stmt: "rql.stmts.Statement") -> "SubQuery":
new: Any = self.query.copy(stmt)
return Exists(new)
......@@ -581,7 +565,7 @@ class Exists(EditableMixIn, BaseNode):
def ored(
self, traverse_scope: bool = False, _fromnode: Any = None
) -> Union_["rql.nodes.Or", bool]:
) -> Union_["Or", bool]:
if not traverse_scope:
if _fromnode is not None: # stop here
return False
......@@ -590,7 +574,7 @@ class Exists(EditableMixIn, BaseNode):
def neged(
self, traverse_scope: bool = False, _fromnode: Any = None, strict: bool = None
) -> Union_["rql.nodes.Not", bool]:
) -> Union_["Not", bool]:
if not traverse_scope:
if _fromnode is not None: # stop here
return False
......@@ -622,7 +606,7 @@ class Relation(Node):
"""return list of arguments to give to __init__ to clone this node"""
return self.r_type, self.optional
def is_equivalent(self, other: "rql.nodes.Relation") -> bool:
def is_equivalent(self, other: "Relation") -> bool:
if not Node.is_equivalent(self, other):
return False
if self.r_type != other.r_type:
......@@ -664,15 +648,13 @@ class Relation(Node):
"""return the parent relation where self occurs or None"""
return self
def ored(
self, traverse_scope: bool = False, _fromnode: Any = None
) -> "rql.nodes.Or":
def ored(self, traverse_scope: bool = False, _fromnode: Any = None) -> "Or":
# Item "BaseNode" of "Optional[BaseNode]" has no attribute "ored" [union-attr]
return self.parent.ored(traverse_scope, _fromnode or self) # type: ignore[union-attr]
def neged(
self, traverse_scope: bool = False, _fromnode: Any = None, strict: bool = None
) -> Union_["rql.nodes.Not", bool]:
) -> Union_["Not", bool]:
if strict:
return isinstance(self.parent, Not)
return self.parent.neged(traverse_scope, _fromnode or self) # type: ignore[union-attr]
......@@ -747,11 +729,11 @@ class Comparison(HSMixin, Node):
self,
operator: str,
value: Union_[
"rql.nodes.Function",
"rql.nodes.Constant",
"rql.nodes.Constant",
"rql.nodes.VariableRef",
"rql.nodes.MathExpression",
"Function",
"Constant",
"Constant",
"VariableRef",
"MathExpression",
None,
] = None,
optional: Optional[str] = None,
......@@ -817,8 +799,8 @@ class MathExpression(OperatorExpressionMixin, HSMixin, BinaryNode):
def __init__(
self,
operator: str,
lhs: Optional["rql.nodes.Node"] = None,
rhs: Optional["rql.nodes.Node"] = None,
lhs: Optional["Node"] = None,
rhs: Optional["Node"] = None,
) -> None:
BinaryNode.__init__(self, lhs, rhs)
self.operator = operator
......@@ -1045,9 +1027,7 @@ class VariableRef(HSMixin, LeafNode):
__slots__: Iterable[str] = ("variable", "name")
def __init__(
self, variable: "rql.nodes.Variable", noautoref: Optional[int] = None
) -> None:
def __init__(self, variable: "Variable", noautoref: Optional[int] = None) -> None:
LeafNode.__init__(self) # don't care about Node attributes
self.variable = variable
self.name: str = variable.name
......@@ -1209,11 +1189,11 @@ class Referenceable(VisitableMixIn):
"""return the tree as an encoded rql string"""
return self.name
def register_reference(self, vref: "rql.nodes.VariableRef") -> None:
def register_reference(self, vref: "VariableRef") -> None:
"""add a reference to this variable"""
self.stinfo["references"].add(vref)
def unregister_reference(self, vref: "rql.nodes.VariableRef") -> None:
def unregister_reference(self, vref: "VariableRef") -> None:
"""remove a reference to this variable"""
try:
self.stinfo["references"].remove(vref)
......
......@@ -144,9 +144,7 @@ class RQLSTChecker:
# for term in node.selected_terms():
# result.append(term.eval(kwargs))
def _visit(
self, node: BaseNode, state: Optional["rql.stcheck.STCheckState"]
) -> None:
def _visit(self, node: BaseNode, state: Optional["STCheckState"]) -> None:
try:
node.accept(self, state)
except GoTo as ex:
......@@ -161,7 +159,7 @@ class RQLSTChecker:
node: Union_[
"rql.stmts.Set", "rql.stmts.Insert", "rql.stmts.Delete", "rql.stmts.Select"
],
state: "rql.stcheck.STCheckState",
state: "STCheckState",
) -> None:
for i, term in enumerate(node.selection):
# selected terms are not included by the default visit,
......@@ -172,7 +170,7 @@ class RQLSTChecker:
self,
term: "rql.nodes.VariableRef",
termtype: str,
state: "rql.stcheck.STCheckState",
state: "STCheckState",
) -> None:
"""check that variables referenced in the given term are selected"""
for variable_ref in variable_refs(term):
......@@ -191,9 +189,7 @@ class RQLSTChecker:
# statement nodes #########################################################
def visit_union(
self, node: "rql.stmts.Union", state: "rql.stcheck.STCheckState"
) -> None:
def visit_union(self, node: "rql.stmts.Union", state: "STCheckState") -> None:
# "BaseNode" has no attribute "selection" [attr-defined]
nbselected: int = len(cast("rql.stmts.Select", node.children[0]).selection)
for select in node.children[1:]:
......@@ -207,17 +203,13 @@ class RQLSTChecker:
def leave_union(self, node, state):
pass
def visit_select(
self, node: "rql.stmts.Select", state: "rql.stcheck.STCheckState"
) -> None:
def visit_select(self, node: "rql.stmts.Select", state: "STCheckState") -> None:
node.vargraph = {} # graph representing links between variable
# "Select" has no attribute "aggregated"
node.aggregated = set() # type:ignore[attr-defined]
self._visit_selectedterm(node, state)
def leave_select(
self, node: "rql.stmts.Select", state: "rql.stcheck.STCheckState"
) -> None:
def leave_select(self, node: "rql.stmts.Select", state: "STCheckState") -> None:
selected = node.selection
# check selected variable are used in restriction
if node.where is not None or len(selected) > 1:
......@@ -308,7 +300,7 @@ class RQLSTChecker:
insert: Union_[
"rql.stmts.Set", "rql.stmts.Insert", "rql.stmts.Delete", "rql.stmts.Select"
],
state: "rql.stcheck.STCheckState",
state: "STCheckState",
) -> None:
self._visit_selectedterm(insert, state)
......@@ -326,7 +318,7 @@ class RQLSTChecker:
update: Union_[
"rql.stmts.Set", "rql.stmts.Insert", "rql.stmts.Delete", "rql.stmts.Select"
],
state: "rql.stcheck.STCheckState",
state: "STCheckState",
) -> None:
self._visit_selectedterm(update, state)
......
......@@ -135,7 +135,7 @@ class ScopeNode(BaseNode):
# either add a parameter that won't be used, either ignore
def copy(
self,
stmt: Optional["rql.stmts.Statement"] = None,
stmt: Optional["Statement"] = None,
copy_solutions: bool = True,
solutions: SolutionsList = None,
) -> "rql.base.BaseNode":
......@@ -284,7 +284,7 @@ class Union(Statement, Node):
# used
undoing: bool = False # used to prevent from memorizing when undoing !
memorizing: int = 0 # recoverable modification attributes
children: List["rql.stmts.Select"]
children: List["Select"]
def wrap_selects(self) -> None:
"""return a new rqlst root containing the given union as a subquery"""
......@@ -292,7 +292,7 @@ class Union(Statement, Node):
for select in self.children[:]:
child.append(select)
self.remove_select(select)
newselect: "rql.stmts.Select" = Select()
newselect: "Select" = Select()
aliases: List["rql.nodes.VariableRef"] = []
for i in range(len(select.selection)):
aliases.append(nodes.VariableRef(newselect.make_variable()))
......@@ -308,12 +308,12 @@ class Union(Statement, Node):
def set_offset(self, offset: int) -> None:
if len(self.children) == 1:
last_children = cast("rql.stmts.Select", self.children[-1])
last_children = cast("Select", self.children[-1])
last_children.set_offset(offset)
# we have to introduce a new root
# XXX not undoable since a new root has to be introduced
self.wrap_selects()
first_child = cast("rql.stmts.Select", self.children[0])
first_child = cast("Select", self.children[0])
first_child.set_offset(offset)
offset = property(_get_offset, set_offset)
......@@ -374,9 +374,9 @@ class Union(Statement, Node):
return " UNION ".join("(%s)" % part for part in strings)
def copy(
self, stmt: Optional["rql.stmts.Statement"] = None, copy_children: bool = True
) -> "rql.stmts.Union":
new: "rql.stmts.Union" = Union()
self, stmt: Optional["Statement"] = None, copy_children: bool = True
) -> "Union":
new: "Union" = Union()
if self.schema is not None:
new.schema = self.schema
if copy_children:
......@@ -482,7 +482,7 @@ class Union(Statement, Node):
def should_register_op(self):
return self.memorizing and not self.undoing
def undo_modification(self) -> "rql.stmts.undo_modification":
def undo_modification(self) -> "undo_modification":
return undo_modification(self)
def save_state(self) -> None:
......@@ -502,14 +502,14 @@ class Union(Statement, Node):
select.check_references()
return True
def append_select(self, select: "rql.stmts.Select") -> None:
def append_select(self, select: "Select") -> None:
if self.should_register_op:
from rql.undo import AppendSelectOperation
self.undo_manager.add_operation(AppendSelectOperation(self, select))
self.children.append(select)
def remove_select(self, select: "rql.stmts.Select") -> None:
def remove_select(self, select: "Select") -> None:
idx: int = self.children.index(select)
if self.should_register_op:
from rql.undo import RemoveSelectOperation
......@@ -622,14 +622,14 @@ class Select(Statement, nodes.EditableMixIn, ScopeNode):
def copy(
self,
stmt: Optional["rql.stmts.Statement"] = None,
stmt: Optional["Statement"] = None,
copy_solutions: bool = True,
solutions: Optional[SolutionsList] = None,
) -> "rql.stmts.Select":
) -> "Select":
new = super().copy(self, copy_solutions, solutions)
# "ScopeNode" has no attribute .... [attr-defined]
new = cast("rql.stmts.Select", new)
new = cast("Select", new)
if self.with_:
new.set_with([sq.copy(new) for sq in self.with_], check=False)
......@@ -749,7 +749,7 @@ class Select(Statement, nodes.EditableMixIn, ScopeNode):
# "BaseNode" has no attribute "selection"
if check and len(node.aliases) != len(
cast("rql.stmts.Select", node.query.children[0]).selection
cast("Select", node.query.children[0]).selection
):
raise BadRQLQuery(
"Should have the same number of aliases than "
......@@ -1173,7 +1173,7 @@ class Delete(Statement, ScopeNode):
# Signature of "copy" incompatible with supertype "ScopeNode" [override]
# Signature of "copy" incompatible with supertype "BaseNode" [override]
def copy(self) -> "rql.stmts.Delete": # type:ignore[override]
def copy(self) -> "Delete": # type:ignore[override]
new = Delete()
for etype, var in self.main_variables:
vref = nodes.VariableRef(new.get_variable(var.name))
......@@ -1271,7 +1271,7 @@ insertion variable"
# Signature of "copy" incompatible with supertype "ScopeNode" [override]
# Signature of "copy" incompatible with supertype "BaseNode" [override]
def copy(self) -> "rql.stmts.Insert": # type:ignore[override]
def copy(self) -> "Insert": # type:ignore[override]
new = Insert()
for etype, var in self.main_variables:
vref = nodes.VariableRef(new.get_variable(var.name))
......@@ -1341,7 +1341,7 @@ class Set(Statement, ScopeNode):
# Signature of "copy" incompatible with supertype "ScopeNode" [override]
# Signature of "copy" incompatible with supertype "BaseNode" [override]
def copy(self) -> "rql.stmts.Set": # type:ignore[override]
def copy(self) -> "Set": # type:ignore[override]
new = Set()
for child in self.main_relations:
new.add_main_relation(child.copy(new))
......
......@@ -34,25 +34,25 @@ if TYPE_CHECKING:
__docformat__: str = "restructuredtext en"
Op = Union_[
"rql.undo.NodeOperation",
"rql.undo.MakeVarOperation",
"rql.undo.UndefineVarOperation",
"rql.undo.SelectVarOperation",
"rql.undo.UnselectVarOperation",
"rql.undo.AddNodeOperation",
"rql.undo.ReplaceNodeOperation",
"rql.undo.RemoveNodeOperation",
"rql.undo.AddSortOperation",
"rql.undo.RemoveSortOperation",
"rql.undo.AddGroupOperation",
"rql.undo.RemoveGroupOperation",
"rql.undo.SetDistinctOperation",
"rql.undo.SetOffsetOperation",
"rql.undo.SetLimitOperation",
"rql.undo.SetOptionalOperation",
"rql.undo.SetHavingOperation",