in smallpond/logical/optimizer.py [0:0]
def visit_query_engine_node(self, node: SqlEngineNode, depth: int) -> Node:
# fuse consecutive SqlEngineNodes
if len(node.input_deps) == 1 and isinstance(child := self.visit(node.input_deps[0], depth + 1), SqlEngineNode):
fused = copy.copy(node)
fused.input_deps = child.input_deps
fused.udfs = node.udfs + child.udfs
fused.cpu_limit = max(node.cpu_limit, child.cpu_limit)
fused.gpu_limit = max(node.gpu_limit, child.gpu_limit)
fused.memory_limit = (
max(node.memory_limit, child.memory_limit)
if node.memory_limit is not None and child.memory_limit is not None
else node.memory_limit or child.memory_limit
)
# merge the sql queries
# example:
# ```
# child.sql_queries = ["select * from {0}"]
# node.sql_queries = ["select a, b from {0}"]
# fused.sql_queries = ["select a, b from (select * from {0})"]
# ```
fused.sql_queries = child.sql_queries[:-1] + [query.format(f"({child.sql_queries[-1]})") for query in node.sql_queries]
return fused
return self.generic_visit(node, depth)