Skip to content

Commit 021757e

Browse files
fix: avoid unnecessary row_number() on sort key for io
1 parent f957b27 commit 021757e

File tree

3 files changed

+31
-21
lines changed

3 files changed

+31
-21
lines changed

bigframes/core/__init__.py

+8-4
Original file line numberDiff line numberDiff line change
@@ -125,14 +125,18 @@ def to_sql(
125125
col_id_overrides: typing.Mapping[str, str] = {},
126126
sorted: bool = False,
127127
) -> str:
128-
if sorted or offset_column:
129-
return self._compile_ordered().to_sql(
130-
offset_column=offset_column,
128+
array_value = self
129+
if offset_column:
130+
array_value = self.promote_offsets(offset_column)
131+
if sorted:
132+
return array_value._compile_ordered().to_sql(
131133
col_id_overrides=col_id_overrides,
132134
sorted=sorted,
133135
)
134136
else:
135-
return self._compile_unordered().to_sql(col_id_overrides=col_id_overrides)
137+
return array_value._compile_unordered().to_sql(
138+
col_id_overrides=col_id_overrides
139+
)
136140

137141
def start_query(
138142
self,

bigframes/core/compile/compiled.py

+19-9
Original file line numberDiff line numberDiff line change
@@ -1031,31 +1031,41 @@ def _reproject_to_table(self) -> OrderedIR:
10311031

10321032
def to_sql(
10331033
self,
1034-
offset_column: typing.Optional[str] = None,
10351034
col_id_overrides: typing.Mapping[str, str] = {},
10361035
sorted: bool = False,
10371036
) -> str:
1038-
offsets_id = offset_column or ORDER_ID_COLUMN
1039-
10401037
sql = ibis_bigquery.Backend().compile(
10411038
self._to_ibis_expr(
1042-
ordering_mode="offset_col"
1043-
if (offset_column or sorted)
1044-
else "unordered",
1045-
order_col_name=offsets_id,
1039+
ordering_mode="unordered",
10461040
col_id_overrides=col_id_overrides,
1041+
expose_hidden_cols=sorted,
10471042
)
10481043
)
10491044
if sorted:
1045+
ordering_columns = self._ordering.all_ordering_columns
1046+
except_cols = ", ".join(
1047+
map(lambda ref: f"`{ref.column_id}`", ordering_columns)
1048+
)
1049+
order_by_clause = self._ordering_clause(self._ordering.all_ordering_columns)
1050+
10501051
sql = textwrap.dedent(
1051-
f"SELECT * EXCEPT (`{offsets_id}`)\n"
1052+
f"SELECT * EXCEPT ({except_cols})\n"
10521053
"FROM (\n"
10531054
f"{sql}\n"
10541055
")\n"
1055-
f"ORDER BY `{offsets_id}`\n"
1056+
f"{order_by_clause}\n"
10561057
)
10571058
return typing.cast(str, sql)
10581059

1060+
def _ordering_clause(self, ordering: Iterable[OrderingColumnReference]) -> str:
1061+
parts = []
1062+
for col_ref in ordering:
1063+
asc_desc = "ASC" if col_ref.direction.is_ascending else "DESC"
1064+
null_clause = "NULLS LAST" if col_ref.na_last else "NULLS FIRST"
1065+
part = f"`{col_ref.column_id}` {asc_desc} {null_clause}"
1066+
parts.append(part)
1067+
return f"ORDER BY {' ,'.join(parts)}"
1068+
10591069
def _to_ibis_expr(
10601070
self,
10611071
*,

bigframes/dataframe.py

+4-8
Original file line numberDiff line numberDiff line change
@@ -2577,14 +2577,10 @@ def _create_io_query(self, index: bool, ordering_id: Optional[str]) -> str:
25772577
}
25782578

25792579
if ordering_id is not None:
2580-
return array_value.to_sql(
2581-
offset_column=ordering_id,
2582-
col_id_overrides=id_overrides,
2583-
)
2584-
else:
2585-
return array_value.to_sql(
2586-
col_id_overrides=id_overrides,
2587-
)
2580+
array_value = array_value.promote_offsets(ordering_id)
2581+
return array_value.to_sql(
2582+
col_id_overrides=id_overrides,
2583+
)
25882584

25892585
def _run_io_query(
25902586
self,

0 commit comments

Comments
 (0)