swap_rename_projection

master
Salvo 'LtWorf' Tomaselli 2020-06-09 18:27:11 +07:00
parent b17bb103f6
commit cac990b598
No known key found for this signature in database
GPG Key ID: B3A7CF0C801886CF
1 changed files with 25 additions and 31 deletions

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