swap_rename_projection

This commit is contained in:
Salvo 'LtWorf' Tomaselli
2020-06-09 18:27:11 +02:00
parent b17bb103f6
commit cac990b598

View File

@@ -329,46 +329,40 @@ def tokenize_select(expression):
return l
def swap_rename_projection(n: parser.Node) -> int:
'''This function locates things like π k(ρ j(R))
and replaces them with ρ j(π k(R)).
def swap_rename_projection(n: parser.Node) -> Tuple[parser.Node, int]:
'''This function locates things like
π k(ρ j(R))
and replaces them with
ρ j(π k(R)).
This will let rename work on a hopefully smaller set
and more important, will hopefully allow further optimizations.
Will also eliminate fields in the rename that are cutted in the projection.
Will also eliminate fields in the rename that are cut in the projection.
'''
changes = 0
if n.name == PROJECTION and n.child.name == RENAME:
changes = 1
# π index,name(ρ id➡index(R))
_vars = {}
for i in n.child.prop.split(','):
q = i.split(ARROW)
_vars[q[1].strip()] = q[0].strip()
renames = n.child.get_rename_prop()
projections = set(n.get_projection_prop())
_pr = n.prop.split(',')
for i in range(len(_pr)):
try:
_pr[i] = _vars[_pr[i].strip()]
except:
pass
# Use pre-rename names in the projection
for k, v in renames.items():
if v in projections:
projections.remove(v)
projections.add(k)
_pr_reborn = n.prop.split(',')
for i in list(_vars.keys()):
if i not in _pr_reborn:
_vars.pop(i)
n.name = n.child.name
# Eliminate fields
for i in list(renames.keys()):
if i not in projections:
del renames[i]
n.prop = ','.join('%s%s%s' % (i[1], ARROW, i[0]) for i in _vars.items())
child = parser.Unary(PROJECTION,'' , n.child.child)
child.set_projection_prop(projections)
n = parser.Unary(RENAME, '', child)
n.set_rename_prop(renames)
return n, 1
n.child.name = PROJECTION
n.child.prop = ''
for i in _pr:
n.child.prop += i + ','
n.child.prop = n.child.prop[:-1]
return changes + recoursive_scan(swap_rename_projection, n)
return n, 0
def swap_rename_select(n: parser.Node) -> int:
@@ -636,7 +630,7 @@ general_optimizations = [
#swap_rename_select,
futile_union_intersection_subtraction,
swap_union_renames,
#swap_rename_projection,
swap_rename_projection,
#select_union_intersect_subtract,
#union_and_product,
]