From 983f9a5d94146c301eb5c6bde84bc67acc879188 Mon Sep 17 00:00:00 2001 From: Ben Kurtovic Date: Wed, 14 May 2014 11:02:35 -0400 Subject: [PATCH] Implement basic tree balancing. --- bitshift/query/__init__.py | 15 +++++++++++++-- 1 file changed, 13 insertions(+), 2 deletions(-) diff --git a/bitshift/query/__init__.py b/bitshift/query/__init__.py index 3348dc9..2ed29c2 100644 --- a/bitshift/query/__init__.py +++ b/bitshift/query/__init__.py @@ -235,6 +235,16 @@ class _QueryParser(object): else: return self._parse_term(nest[0]) + def _balance_tree(self, node): + """Auto-balance a tree using a string sorting function.""" + if isinstance(node, BinaryOp): + self._balance_tree(node.left) + self._balance_tree(node.right) + if repr(node.right) < repr(node.left): + node.left, node.right = node.right, node.left + elif isinstance(node, UnaryOp): + self._balance_tree(node.node) + def parse(self, query): """ Parse a search query. @@ -251,12 +261,13 @@ class _QueryParser(object): :raises: :py:class:`.QueryParseException` """ - ## TODO: balance tree nest = self._split_query(query.rstrip()) if not nest: raise QueryParseException('Empty query: "%s"' % query) self._parse_boolean_operators(nest) - return Tree(self._parse_nest(nest)) + root = self._parse_nest(nest) + self._balance_tree(root) + return Tree(root) parse_query = _QueryParser().parse