I had completely forgotten about multiline optimizations
This commit is contained in:
parent
8755236f94
commit
7228c86d72
@ -31,28 +31,51 @@ from relational import querysplit
|
|||||||
from relational.maintenance import UserInterface
|
from relational.maintenance import UserInterface
|
||||||
|
|
||||||
|
|
||||||
def optimize_program(code, rels: Dict[str, Relation]):
|
def optimize_program(code: str, rels: Dict[str, Relation]) -> str:
|
||||||
'''
|
'''
|
||||||
Optimize an entire program, composed by multiple expressions
|
Optimize an entire program, composed by multiple expressions
|
||||||
and assignments.
|
and assignments.
|
||||||
'''
|
'''
|
||||||
raise NotImplementedError()
|
|
||||||
lines = code.split('\n')
|
lines = code.split('\n')
|
||||||
context = {}
|
context: Dict[str, Node] = {}
|
||||||
|
|
||||||
for line in lines:
|
for line in lines:
|
||||||
|
# skip comments or empty lines
|
||||||
line = line.strip()
|
line = line.strip()
|
||||||
if line.startswith(';') or not line:
|
if line.startswith(';') or not line:
|
||||||
continue
|
continue
|
||||||
|
|
||||||
|
|
||||||
res, query = UserInterface.split_query(line)
|
res, query = UserInterface.split_query(line)
|
||||||
last_res = res
|
last_res = res
|
||||||
parsed = tree(query)
|
parsed = tree(query)
|
||||||
optimizations.replace_leaves(parsed, context)
|
replace_leaves(parsed, context)
|
||||||
context[res] = parsed
|
context[res] = parsed
|
||||||
node = optimize_all(context[last_res], rels, tostr=False)
|
node = optimize_all(context[last_res], rels, tostr=False)
|
||||||
return querysplit.split(node, rels)
|
return querysplit.split(node, rels)
|
||||||
|
|
||||||
|
|
||||||
|
def replace_leaves(node: Node, context: Dict[str, Node]) -> None:
|
||||||
|
'''
|
||||||
|
If a name appearing in node appears
|
||||||
|
also in context, the parse tree is
|
||||||
|
modified to replace the node with the
|
||||||
|
subtree found in context.
|
||||||
|
'''
|
||||||
|
if isinstance(node, Unary):
|
||||||
|
replace_leaves(node.child, context)
|
||||||
|
|
||||||
|
if isinstance(node.child, Variable) and node.child.name in context:
|
||||||
|
node.child = context[node.child.name]
|
||||||
|
elif isinstance(node, Binary):
|
||||||
|
replace_leaves(node.left, context)
|
||||||
|
replace_leaves(node.right, context)
|
||||||
|
if isinstance(node.left, Variable) and node.left.name in context:
|
||||||
|
node.left = context[node.left.name]
|
||||||
|
if isinstance(node.right, Variable) and node.right.name in context:
|
||||||
|
node.right = context[node.right.name]
|
||||||
|
|
||||||
|
|
||||||
def optimize_all(expression: Union[str, Node], rels: Dict[str, Relation], specific: bool = True, general: bool = True, debug: Optional[list] = None, tostr: bool = True) -> Union[str, Node]:
|
def optimize_all(expression: Union[str, Node], rels: Dict[str, Relation], specific: bool = True, general: bool = True, debug: Optional[list] = None, tostr: bool = True) -> Union[str, Node]:
|
||||||
'''This function performs all the available optimizations.
|
'''This function performs all the available optimizations.
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user