diff --git a/relational/optimizations.py b/relational/optimizations.py index 6d61150..2f3cfe3 100644 --- a/relational/optimizations.py +++ b/relational/optimizations.py @@ -506,17 +506,15 @@ def selection_and_product(n: parser.Node, rels: Dict[str, Relation]) -> parser.N if j in r_attr: # Field in right r_fields = True - if l_fields and r_fields: # Fields in both - both.append(i) - elif l_fields: + if l_fields and not r_fields: left.append(i) - elif r_fields: + elif r_fields and not l_fields: right.append(i) else: # Unknown.. adding in both both.append(i) # Preparing left selection - if len(left) > 0: + if left: l_prop = '' while len(left) > 0: c = left.pop(0) @@ -531,8 +529,7 @@ def selection_and_product(n: parser.Node, rels: Dict[str, Relation]) -> parser.N l_node = n.child.left # Preparing right selection - if len(right) > 0: - + if right: r_prop = '' while len(right) > 0: c = right.pop(0) @@ -548,8 +545,8 @@ def selection_and_product(n: parser.Node, rels: Dict[str, Relation]) -> parser.N b_node = parser.Binary(n.child.name, l_node, r_node) # Changing main selection - both_prop = '' - if len(both) != 0: + if both: + both_prop = '' while len(both) > 0: c = both.pop(0) both_prop += ' '.join(c) @@ -557,7 +554,8 @@ def selection_and_product(n: parser.Node, rels: Dict[str, Relation]) -> parser.N both_prop += ' and ' if '(' in both_prop: both_prop = '(%s)' % both_prop - return parser.Unary(SELECTION, both_prop, b_node), 1 + r = parser.Unary(SELECTION, both_prop, b_node) + return r, len(left) + len(right) else: # No need for general select return b_node, 1