Skip to content

Commit 22c32d7

Browse files
refactor: Make join order propogation explicit in node (#1434)
1 parent 74ffc53 commit 22c32d7

File tree

4 files changed

+7
-10
lines changed

4 files changed

+7
-10
lines changed

bigframes/core/array_value.py

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -452,6 +452,7 @@ def relational_join(
452452
other: ArrayValue,
453453
conditions: typing.Tuple[typing.Tuple[str, str], ...] = (),
454454
type: typing.Literal["inner", "outer", "left", "right", "cross"] = "inner",
455+
propogate_order: Optional[bool] = None,
455456
) -> typing.Tuple[ArrayValue, typing.Tuple[dict[str, str], dict[str, str]]]:
456457
l_mapping = { # Identity mapping, only rename right side
457458
lcol.name: lcol.name for lcol in self.node.ids
@@ -465,6 +466,7 @@ def relational_join(
465466
for l_col, r_col in conditions
466467
),
467468
type=type,
469+
propogate_order=propogate_order or self.session._strictly_ordered,
468470
)
469471
return ArrayValue(join_node), (l_mapping, r_mapping)
470472

bigframes/core/compile/compiler.py

Lines changed: 2 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -68,9 +68,7 @@ def compile_sql(
6868
node = self._replace_unsupported_ops(node)
6969
# prune before pulling up order to avoid unnnecessary row_number() ops
7070
node = rewrites.column_pruning(node)
71-
node, ordering = rewrites.pull_up_order(
72-
node, order_root=ordered, ordered_joins=self.strict
73-
)
71+
node, ordering = rewrites.pull_up_order(node, order_root=ordered)
7472
# final pruning to cleanup up any leftovers unused values
7573
node = rewrites.column_pruning(node)
7674
return self.compile_node(node).to_sql(
@@ -87,9 +85,7 @@ def compile_raw(
8785
]:
8886
node = self._replace_unsupported_ops(node)
8987
node = rewrites.column_pruning(node)
90-
node, ordering = rewrites.pull_up_order(
91-
node, order_root=True, ordered_joins=self.strict
92-
)
88+
node, ordering = rewrites.pull_up_order(node, order_root=True)
9389
node = rewrites.column_pruning(node)
9490
sql = self.compile_node(node).to_sql()
9591
return sql, node.schema.to_bigquery(), ordering

bigframes/core/nodes.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -287,6 +287,7 @@ class JoinNode(BigFrameNode):
287287
right_child: BigFrameNode
288288
conditions: typing.Tuple[typing.Tuple[ex.DerefOp, ex.DerefOp], ...]
289289
type: typing.Literal["inner", "outer", "left", "right", "cross"]
290+
propogate_order: bool
290291

291292
def _validate(self):
292293
assert not (
@@ -311,8 +312,7 @@ def order_ambiguous(self) -> bool:
311312

312313
@property
313314
def explicitly_ordered(self) -> bool:
314-
# Do not consider user pre-join ordering intent - they need to re-order post-join in unordered mode.
315-
return False
315+
return self.propogate_order
316316

317317
@property
318318
def fields(self) -> Iterable[Field]:

bigframes/core/rewrite/order.py

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -29,7 +29,6 @@ def pull_up_order(
2929
root: bigframes.core.nodes.BigFrameNode,
3030
*,
3131
order_root: bool = True,
32-
ordered_joins: bool = True,
3332
) -> Tuple[bigframes.core.nodes.BigFrameNode, bigframes.core.ordering.RowOrdering]:
3433
"""
3534
Pull the ordering up, putting full order definition into window ops.
@@ -92,7 +91,7 @@ def pull_up_order_inner(
9291
child_result, child_order = pull_up_order_inner(node.child)
9392
return node.replace_child(child_result), child_order
9493
elif isinstance(node, bigframes.core.nodes.JoinNode):
95-
if ordered_joins:
94+
if node.propogate_order:
9695
return pull_order_join(node)
9796
else:
9897
return (

0 commit comments

Comments
 (0)