swap_rename_projection

This commit is contained in:
Salvo 'LtWorf' Tomaselli 2020-06-09 18:27:11 +02:00
parent b17bb103f6
commit cac990b598
No known key found for this signature in database
GPG Key ID: B3A7CF0C801886CF

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,
]