Skip to content

Merge release/26.06 into main#22590

Closed
KyleFromNVIDIA wants to merge 10 commits into
rapidsai:mainfrom
KyleFromNVIDIA:main-merge-release/26.06
Closed

Merge release/26.06 into main#22590
KyleFromNVIDIA wants to merge 10 commits into
rapidsai:mainfrom
KyleFromNVIDIA:main-merge-release/26.06

Conversation

@KyleFromNVIDIA
Copy link
Copy Markdown
Member

Description

Checklist

  • I am familiar with the Contributing Guidelines.
  • New or existing tests cover these changes.
  • The documentation is up to date with these changes.

Matt711 and others added 10 commits May 18, 2026 19:00
Updated cudf-polars to support Polars 1.39.

Summary:

* **Dependency pin** updated across conda envs, the recipe, `dependencies.yaml`, and `pyproject.toml`. New `POLARS_VERSION_LT_139` flag gates version specific code.
* **Rolling expressions:** polars 1.39 makes `pl.col(...).rolling(...)` accessible again via `AExpr::Rolling`. A new `_translate_rolling` handles it, registered only when the node type exists. Rolling tests use a single `skip_rolling_expr_136_to_138` marker.
* **HConcat strict mode:** added a `strict` slot on the `HConcat` IR that raises `pl.exceptions.ShapeError` on height mismatch, threaded through every construction site.
* **IsBetween Decimal vs Float:** new `_align_decimal_float_for_comparison` casts Decimal to Float64 on 1.39+, since polars no longer inserts that cast and libcudf would otherwise give wrong results.
* **set_sorted:** options shape changed from `(asc_str,)` to `(descending_bool, ...)`; translator branches on type.
* **Dynamic predicates:** new `_is_dynamic_pred` helper makes Scan and Filter skip predicates that raise `"dynamic_pred"`.
* **IR version ceiling** raised from `(12, 1)` to `(12, 2)`. Sink format check now includes `"Json"`, and a precedence bug in `_sink_to_file` is fixed.

Authors:
  - Matthew Murray (https://github.com/Matt711)
  - Matthew Roeschke (https://github.com/mroeschke)

Approvers:
  - James Lamb (https://github.com/jameslamb)
  - Matthew Roeschke (https://github.com/mroeschke)

URL: rapidsai#22048
rapidsai#22558)

PR rapidsai#22048 (merged today) added the new `test_hconcat_strict_different_heights` test, which imports `assert_collect_raises`. However, PR rapidsai#22535 (also merged today) removed that helper.

The two PRs landed on `release/26.06` without the conflict being noticed.

On `main`, `test_hconcat.py` does not contain the strict-mode test, so the issue is limited to `release/26.06`.

Authors:
  - Mads R. B. Kristensen (https://github.com/madsbk)

Approvers:
  - Matthew Murray (https://github.com/Matt711)

URL: rapidsai#22558
…ai#22529)

This PR fixes the use-after-destroy and stream ordering (with PTDS input) issue (with host buffer source) in the `fetch_byte_ranges_to_device_async` IO utility used by parquet and hybrid scan.

See follow up PR rapidsai#22550 that reduces the locked region size by moving all `host_read_async` outside it.

Authors:
  - Muhammad Haseeb (https://github.com/mhaseeb123)

Approvers:
  - Bradley Dice (https://github.com/bdice)
  - Amin Aramoon (https://github.com/aminaramoon)
  - Vukasin Milovanovic (https://github.com/vuule)

URL: rapidsai#22529
This PR is pure moving/renaming.

### New layout
```
cudf_polars/
  callback.py
  containers/
  dsl/
  engine/         ← user-facing GPU engine classes (Streaming/Ray/Dask/SPMD/DefaultSingleton)
  streaming/      ← multi-partition execution layer (formerly "experimental")
    actor_graph/  ← RapidsMPF-backed runtime
    collectives/  ← RapidsMPF collective communication primitives
    benchmarks/
      utils.py    ← consolidated benchmark utilities (formerly split between utils.py shim and utils_new_frontends.py)
      pdsds.py
      ...
    base.py
    dispatch.py
    parallel.py
    groupby.py
    io.py
    join.py
    ...
  testing/
  typing/
  utils/
```

Engine entry points move from deeply nested experimental paths to top-level imports:
```
cudf_polars.experimental.rapidsmpf.frontend.options → cudf_polars.engine.options
cudf_polars.experimental.rapidsmpf.frontend.spmd    → cudf_polars.engine.spmd
cudf_polars.experimental.rapidsmpf.frontend.ray     → cudf_polars.engine.ray
cudf_polars.experimental.rapidsmpf.frontend.dask    → cudf_polars.engine.dask
cudf_polars.experimental.rapidsmpf.frontend.core    → cudf_polars.engine.core
```

Benchmarks is now under `streaming`:
```
python -m cudf_polars.streaming.benchmarks.pdsh
```

Authors:
  - Mads R. B. Kristensen (https://github.com/madsbk)

Approvers:
  - Lawrence Mitchell (https://github.com/wence-)
  - Peter Andreas Entschev (https://github.com/pentschev)
  - Bradley Dice (https://github.com/bdice)
  - Matthew Murray (https://github.com/Matt711)

URL: rapidsai#22491
This backports a pair of commits for the cudf-polars benchmarking CLI. We're currently running benchmarks against both release/26.06 and main.

Authors:
  - Tom Augspurger (https://github.com/TomAugspurger)
  - Lawrence Mitchell (https://github.com/wence-)

Approvers:
  - Bradley Dice (https://github.com/bdice)

URL: rapidsai#22572
Fixes a memcheck error introduced by rapidsai#22452 where an atomic operation on a bool variable is reported by compute-sanitizer as an out-of-bounds access. Changing the variable to an `int32_t` resolves the error.

Closes rapidsai#22570

Authors:
  - David Wendt (https://github.com/davidwendt)

Approvers:
  - Bradley Dice (https://github.com/bdice)
  - Yunsong Wang (https://github.com/PointKernel)

URL: rapidsai#22571
- Follow up to rapidsai#22491
- Moves the `collectives` module under `actor_graph` to break circular dependencies. The "collectives" are **mostly** used to build the actor graph anyway.

**Note**: Before merging this, I'd like to get confirmation that others see circular-import errors locally. E.g.

```
pytest -v python/cudf_polars/tests/streaming/test_groupby.py

...

E   ImportError: cannot import name 'ShuffleManager' from partially initialized module 'cudf_polars.streaming.collectives.shuffle' (most likely due to a circular import) (/raid/rzamora/rapids-26.06/cudf/python/cudf_polars/cudf_polars/streaming/collectives/shuffle.py)
```

Authors:
  - Richard (Rick) Zamora (https://github.com/rjzamora)

Approvers:
  - Matthew Murray (https://github.com/Matt711)
  - Mads R. B. Kristensen (https://github.com/madsbk)

URL: rapidsai#22578
Hand-tune `polars_impl` for 19 TPC-DS benchmark queries in `python/cudf_polars/cudf_polars/experimental/benchmarks/pdsds_queries/`. Each rewrite preserves query semantics and only changes how the polars LazyFrame is constructed; `duckdb_impl` is unchanged.

The optimizations apply a small set of recurring patterns that the polars optimizer does not (yet) perform automatically:

- **Predicate pushdown on dimension tables** — pre-filter `date_dim`, `item`, `store`, etc. by literal predicates (year, quarter, month window, category/class/brand) before any join, so the join builds smaller hash tables.
- **Semi-join fact-table pre-filtering** — use selective dimension keys (and in some cases `store_returns` (customer, item) pairs) as semi-join probes against the fact tables, shrinking them before the expensive joins.
- **Projection pushdown** — `select(...)` only the columns each table contributes before joining, instead of relying on the planner to prune them later.
- **Condition-join → equi-join** — replace cross-join + filter and CONDITIONALJOIN-style patterns with constant-key equi-joins where the predicate is equivalent.
- **Single-pass bucket aggregation** — collapse multiple independent global-sum group-bys over the same fact table into one pass that emits the values in a single aggregation, replacing N scans with 1.
- **Join reordering** — defer non-selective joins (e.g. customer) until after the selective filter chain so the row count entering the deferred join is much smaller.

## Test plan

- [ ] Run TPC-DS validation against DuckDB on the 19 modified queries
- [ ] Run benchmark sweep and confirm no regressions vs. main on unmodified queries
- [ ] Confirm result equality (sorted output) matches DuckDB reference

Authors:
  - Matthew Murray (https://github.com/Matt711)

Approvers:
  - Tom Augspurger (https://github.com/TomAugspurger)

URL: rapidsai#22395
@KyleFromNVIDIA KyleFromNVIDIA added improvement Improvement / enhancement to an existing function breaking Breaking change labels May 19, 2026
@KyleFromNVIDIA KyleFromNVIDIA requested review from a team as code owners May 19, 2026 21:12
@github-actions github-actions Bot added libcudf Affects libcudf (C++/CUDA) code. Python Affects Python cuDF API. CMake CMake build issue Java Affects Java cuDF API. cudf-polars Issues specific to cudf-polars labels May 19, 2026
@GPUtester GPUtester moved this to In Progress in cuDF Python May 19, 2026
@KyleFromNVIDIA
Copy link
Copy Markdown
Member Author

Closing in favor of #22585

@github-project-automation github-project-automation Bot moved this from In Progress to Done in cuDF Python May 19, 2026
@coderabbitai
Copy link
Copy Markdown

coderabbitai Bot commented May 19, 2026

Review Change Stack

Caution

Review failed

The pull request is closed.

ℹ️ Recent review info
⚙️ Run configuration

Configuration used: Path: .coderabbit.yaml

Review profile: CHILL

Plan: Enterprise

Run ID: daa607c0-a80a-402a-b1e4-c038955b0941

📥 Commits

Reviewing files that changed from the base of the PR and between f57751a and d5247d1.

📒 Files selected for processing (226)
  • conda/environments/all_cuda-129_arch-aarch64.yaml
  • conda/environments/all_cuda-129_arch-x86_64.yaml
  • conda/environments/all_cuda-132_arch-aarch64.yaml
  • conda/environments/all_cuda-132_arch-x86_64.yaml
  • conda/recipes/cudf-polars/recipe.yaml
  • cpp/cmake/thirdparty/patches/arrow_rapidjson_cmake_policy_version_minimum.diff
  • cpp/cmake/thirdparty/patches/override.json
  • cpp/src/io/json/json_tree.cu
  • cpp/src/io/parquet/io_utils/parquet_io_utils.cpp
  • dependencies.yaml
  • java/src/main/native/CMakeLists.txt
  • python/cudf_polars/cudf_polars/callback.py
  • python/cudf_polars/cudf_polars/containers/column.py
  • python/cudf_polars/cudf_polars/containers/dataframe.py
  • python/cudf_polars/cudf_polars/dsl/expressions/rolling.py
  • python/cudf_polars/cudf_polars/dsl/expressions/unary.py
  • python/cudf_polars/cudf_polars/dsl/ir.py
  • python/cudf_polars/cudf_polars/dsl/translate.py
  • python/cudf_polars/cudf_polars/engine/__init__.py
  • python/cudf_polars/cudf_polars/engine/core.py
  • python/cudf_polars/cudf_polars/engine/dask.py
  • python/cudf_polars/cudf_polars/engine/default_singleton_engine.py
  • python/cudf_polars/cudf_polars/engine/hardware_binding.py
  • python/cudf_polars/cudf_polars/engine/options.py
  • python/cudf_polars/cudf_polars/engine/ray.py
  • python/cudf_polars/cudf_polars/engine/spmd.py
  • python/cudf_polars/cudf_polars/experimental/__init__.py
  • python/cudf_polars/cudf_polars/experimental/benchmarks/utils.py
  • python/cudf_polars/cudf_polars/experimental/rapidsmpf/__init__.py
  • python/cudf_polars/cudf_polars/streaming/__init__.py
  • python/cudf_polars/cudf_polars/streaming/actor_graph/__init__.py
  • python/cudf_polars/cudf_polars/streaming/actor_graph/collectives/__init__.py
  • python/cudf_polars/cudf_polars/streaming/actor_graph/collectives/allgather.py
  • python/cudf_polars/cudf_polars/streaming/actor_graph/collectives/common.py
  • python/cudf_polars/cudf_polars/streaming/actor_graph/collectives/shuffle.py
  • python/cudf_polars/cudf_polars/streaming/actor_graph/collectives/sort.py
  • python/cudf_polars/cudf_polars/streaming/actor_graph/core.py
  • python/cudf_polars/cudf_polars/streaming/actor_graph/dispatch.py
  • python/cudf_polars/cudf_polars/streaming/actor_graph/groupby.py
  • python/cudf_polars/cudf_polars/streaming/actor_graph/io.py
  • python/cudf_polars/cudf_polars/streaming/actor_graph/join.py
  • python/cudf_polars/cudf_polars/streaming/actor_graph/nodes.py
  • python/cudf_polars/cudf_polars/streaming/actor_graph/over.py
  • python/cudf_polars/cudf_polars/streaming/actor_graph/repartition.py
  • python/cudf_polars/cudf_polars/streaming/actor_graph/tracing.py
  • python/cudf_polars/cudf_polars/streaming/actor_graph/union.py
  • python/cudf_polars/cudf_polars/streaming/actor_graph/utils.py
  • python/cudf_polars/cudf_polars/streaming/base.py
  • python/cudf_polars/cudf_polars/streaming/benchmarks/__init__.py
  • python/cudf_polars/cudf_polars/streaming/benchmarks/asserts.py
  • python/cudf_polars/cudf_polars/streaming/benchmarks/pdsds.py
  • python/cudf_polars/cudf_polars/streaming/benchmarks/pdsds_parameters/README.md
  • python/cudf_polars/cudf_polars/streaming/benchmarks/pdsds_parameters/__init__.py
  • python/cudf_polars/cudf_polars/streaming/benchmarks/pdsds_parameters/parameter_substitutions.py
  • python/cudf_polars/cudf_polars/streaming/benchmarks/pdsds_queries/__init__.py
  • python/cudf_polars/cudf_polars/streaming/benchmarks/pdsds_queries/q1.py
  • python/cudf_polars/cudf_polars/streaming/benchmarks/pdsds_queries/q10.py
  • python/cudf_polars/cudf_polars/streaming/benchmarks/pdsds_queries/q11.py
  • python/cudf_polars/cudf_polars/streaming/benchmarks/pdsds_queries/q12.py
  • python/cudf_polars/cudf_polars/streaming/benchmarks/pdsds_queries/q13.py
  • python/cudf_polars/cudf_polars/streaming/benchmarks/pdsds_queries/q14.py
  • python/cudf_polars/cudf_polars/streaming/benchmarks/pdsds_queries/q15.py
  • python/cudf_polars/cudf_polars/streaming/benchmarks/pdsds_queries/q16.py
  • python/cudf_polars/cudf_polars/streaming/benchmarks/pdsds_queries/q17.py
  • python/cudf_polars/cudf_polars/streaming/benchmarks/pdsds_queries/q18.py
  • python/cudf_polars/cudf_polars/streaming/benchmarks/pdsds_queries/q19.py
  • python/cudf_polars/cudf_polars/streaming/benchmarks/pdsds_queries/q2.py
  • python/cudf_polars/cudf_polars/streaming/benchmarks/pdsds_queries/q20.py
  • python/cudf_polars/cudf_polars/streaming/benchmarks/pdsds_queries/q21.py
  • python/cudf_polars/cudf_polars/streaming/benchmarks/pdsds_queries/q22.py
  • python/cudf_polars/cudf_polars/streaming/benchmarks/pdsds_queries/q23.py
  • python/cudf_polars/cudf_polars/streaming/benchmarks/pdsds_queries/q24.py
  • python/cudf_polars/cudf_polars/streaming/benchmarks/pdsds_queries/q25.py
  • python/cudf_polars/cudf_polars/streaming/benchmarks/pdsds_queries/q26.py
  • python/cudf_polars/cudf_polars/streaming/benchmarks/pdsds_queries/q27.py
  • python/cudf_polars/cudf_polars/streaming/benchmarks/pdsds_queries/q28.py
  • python/cudf_polars/cudf_polars/streaming/benchmarks/pdsds_queries/q29.py
  • python/cudf_polars/cudf_polars/streaming/benchmarks/pdsds_queries/q3.py
  • python/cudf_polars/cudf_polars/streaming/benchmarks/pdsds_queries/q30.py
  • python/cudf_polars/cudf_polars/streaming/benchmarks/pdsds_queries/q31.py
  • python/cudf_polars/cudf_polars/streaming/benchmarks/pdsds_queries/q32.py
  • python/cudf_polars/cudf_polars/streaming/benchmarks/pdsds_queries/q33.py
  • python/cudf_polars/cudf_polars/streaming/benchmarks/pdsds_queries/q34.py
  • python/cudf_polars/cudf_polars/streaming/benchmarks/pdsds_queries/q35.py
  • python/cudf_polars/cudf_polars/streaming/benchmarks/pdsds_queries/q36.py
  • python/cudf_polars/cudf_polars/streaming/benchmarks/pdsds_queries/q37.py
  • python/cudf_polars/cudf_polars/streaming/benchmarks/pdsds_queries/q38.py
  • python/cudf_polars/cudf_polars/streaming/benchmarks/pdsds_queries/q39.py
  • python/cudf_polars/cudf_polars/streaming/benchmarks/pdsds_queries/q4.py
  • python/cudf_polars/cudf_polars/streaming/benchmarks/pdsds_queries/q40.py
  • python/cudf_polars/cudf_polars/streaming/benchmarks/pdsds_queries/q41.py
  • python/cudf_polars/cudf_polars/streaming/benchmarks/pdsds_queries/q42.py
  • python/cudf_polars/cudf_polars/streaming/benchmarks/pdsds_queries/q43.py
  • python/cudf_polars/cudf_polars/streaming/benchmarks/pdsds_queries/q44.py
  • python/cudf_polars/cudf_polars/streaming/benchmarks/pdsds_queries/q45.py
  • python/cudf_polars/cudf_polars/streaming/benchmarks/pdsds_queries/q46.py
  • python/cudf_polars/cudf_polars/streaming/benchmarks/pdsds_queries/q47.py
  • python/cudf_polars/cudf_polars/streaming/benchmarks/pdsds_queries/q48.py
  • python/cudf_polars/cudf_polars/streaming/benchmarks/pdsds_queries/q49.py
  • python/cudf_polars/cudf_polars/streaming/benchmarks/pdsds_queries/q5.py
  • python/cudf_polars/cudf_polars/streaming/benchmarks/pdsds_queries/q50.py
  • python/cudf_polars/cudf_polars/streaming/benchmarks/pdsds_queries/q51.py
  • python/cudf_polars/cudf_polars/streaming/benchmarks/pdsds_queries/q52.py
  • python/cudf_polars/cudf_polars/streaming/benchmarks/pdsds_queries/q53.py
  • python/cudf_polars/cudf_polars/streaming/benchmarks/pdsds_queries/q54.py
  • python/cudf_polars/cudf_polars/streaming/benchmarks/pdsds_queries/q55.py
  • python/cudf_polars/cudf_polars/streaming/benchmarks/pdsds_queries/q56.py
  • python/cudf_polars/cudf_polars/streaming/benchmarks/pdsds_queries/q57.py
  • python/cudf_polars/cudf_polars/streaming/benchmarks/pdsds_queries/q58.py
  • python/cudf_polars/cudf_polars/streaming/benchmarks/pdsds_queries/q59.py
  • python/cudf_polars/cudf_polars/streaming/benchmarks/pdsds_queries/q6.py
  • python/cudf_polars/cudf_polars/streaming/benchmarks/pdsds_queries/q60.py
  • python/cudf_polars/cudf_polars/streaming/benchmarks/pdsds_queries/q61.py
  • python/cudf_polars/cudf_polars/streaming/benchmarks/pdsds_queries/q62.py
  • python/cudf_polars/cudf_polars/streaming/benchmarks/pdsds_queries/q63.py
  • python/cudf_polars/cudf_polars/streaming/benchmarks/pdsds_queries/q64.py
  • python/cudf_polars/cudf_polars/streaming/benchmarks/pdsds_queries/q65.py
  • python/cudf_polars/cudf_polars/streaming/benchmarks/pdsds_queries/q66.py
  • python/cudf_polars/cudf_polars/streaming/benchmarks/pdsds_queries/q67.py
  • python/cudf_polars/cudf_polars/streaming/benchmarks/pdsds_queries/q68.py
  • python/cudf_polars/cudf_polars/streaming/benchmarks/pdsds_queries/q69.py
  • python/cudf_polars/cudf_polars/streaming/benchmarks/pdsds_queries/q7.py
  • python/cudf_polars/cudf_polars/streaming/benchmarks/pdsds_queries/q70.py
  • python/cudf_polars/cudf_polars/streaming/benchmarks/pdsds_queries/q71.py
  • python/cudf_polars/cudf_polars/streaming/benchmarks/pdsds_queries/q72.py
  • python/cudf_polars/cudf_polars/streaming/benchmarks/pdsds_queries/q73.py
  • python/cudf_polars/cudf_polars/streaming/benchmarks/pdsds_queries/q74.py
  • python/cudf_polars/cudf_polars/streaming/benchmarks/pdsds_queries/q75.py
  • python/cudf_polars/cudf_polars/streaming/benchmarks/pdsds_queries/q76.py
  • python/cudf_polars/cudf_polars/streaming/benchmarks/pdsds_queries/q77.py
  • python/cudf_polars/cudf_polars/streaming/benchmarks/pdsds_queries/q78.py
  • python/cudf_polars/cudf_polars/streaming/benchmarks/pdsds_queries/q79.py
  • python/cudf_polars/cudf_polars/streaming/benchmarks/pdsds_queries/q8.py
  • python/cudf_polars/cudf_polars/streaming/benchmarks/pdsds_queries/q80.py
  • python/cudf_polars/cudf_polars/streaming/benchmarks/pdsds_queries/q81.py
  • python/cudf_polars/cudf_polars/streaming/benchmarks/pdsds_queries/q82.py
  • python/cudf_polars/cudf_polars/streaming/benchmarks/pdsds_queries/q83.py
  • python/cudf_polars/cudf_polars/streaming/benchmarks/pdsds_queries/q84.py
  • python/cudf_polars/cudf_polars/streaming/benchmarks/pdsds_queries/q85.py
  • python/cudf_polars/cudf_polars/streaming/benchmarks/pdsds_queries/q86.py
  • python/cudf_polars/cudf_polars/streaming/benchmarks/pdsds_queries/q87.py
  • python/cudf_polars/cudf_polars/streaming/benchmarks/pdsds_queries/q88.py
  • python/cudf_polars/cudf_polars/streaming/benchmarks/pdsds_queries/q89.py
  • python/cudf_polars/cudf_polars/streaming/benchmarks/pdsds_queries/q9.py
  • python/cudf_polars/cudf_polars/streaming/benchmarks/pdsds_queries/q90.py
  • python/cudf_polars/cudf_polars/streaming/benchmarks/pdsds_queries/q91.py
  • python/cudf_polars/cudf_polars/streaming/benchmarks/pdsds_queries/q92.py
  • python/cudf_polars/cudf_polars/streaming/benchmarks/pdsds_queries/q93.py
  • python/cudf_polars/cudf_polars/streaming/benchmarks/pdsds_queries/q94.py
  • python/cudf_polars/cudf_polars/streaming/benchmarks/pdsds_queries/q95.py
  • python/cudf_polars/cudf_polars/streaming/benchmarks/pdsds_queries/q96.py
  • python/cudf_polars/cudf_polars/streaming/benchmarks/pdsds_queries/q97.py
  • python/cudf_polars/cudf_polars/streaming/benchmarks/pdsds_queries/q98.py
  • python/cudf_polars/cudf_polars/streaming/benchmarks/pdsds_queries/q99.py
  • python/cudf_polars/cudf_polars/streaming/benchmarks/pdsh.py
  • python/cudf_polars/cudf_polars/streaming/benchmarks/utils.py
  • python/cudf_polars/cudf_polars/streaming/dispatch.py
  • python/cudf_polars/cudf_polars/streaming/distinct.py
  • python/cudf_polars/cudf_polars/streaming/explain.py
  • python/cudf_polars/cudf_polars/streaming/expressions.py
  • python/cudf_polars/cudf_polars/streaming/groupby.py
  • python/cudf_polars/cudf_polars/streaming/io.py
  • python/cudf_polars/cudf_polars/streaming/join.py
  • python/cudf_polars/cudf_polars/streaming/over.py
  • python/cudf_polars/cudf_polars/streaming/parallel.py
  • python/cudf_polars/cudf_polars/streaming/repartition.py
  • python/cudf_polars/cudf_polars/streaming/select.py
  • python/cudf_polars/cudf_polars/streaming/shuffle.py
  • python/cudf_polars/cudf_polars/streaming/sort.py
  • python/cudf_polars/cudf_polars/streaming/statistics.py
  • python/cudf_polars/cudf_polars/streaming/utils.py
  • python/cudf_polars/cudf_polars/testing/asserts.py
  • python/cudf_polars/cudf_polars/testing/engine_utils.py
  • python/cudf_polars/cudf_polars/testing/inject_gpu_engine.py
  • python/cudf_polars/cudf_polars/testing/io.py
  • python/cudf_polars/cudf_polars/utils/config.py
  • python/cudf_polars/cudf_polars/utils/versions.py
  • python/cudf_polars/docs/cudf-polars-mp.md
  • python/cudf_polars/docs/overview.md
  • python/cudf_polars/pyproject.toml
  • python/cudf_polars/tests/conftest.py
  • python/cudf_polars/tests/experimental/__init__.py
  • python/cudf_polars/tests/expressions/test_booleanfunction.py
  • python/cudf_polars/tests/expressions/test_rolling.py
  • python/cudf_polars/tests/expressions/test_sort.py
  • python/cudf_polars/tests/streaming/__init__.py
  • python/cudf_polars/tests/streaming/test_agg.py
  • python/cudf_polars/tests/streaming/test_all_gather_host_data.py
  • python/cudf_polars/tests/streaming/test_allgather.py
  • python/cudf_polars/tests/streaming/test_bind_to_gpu.py
  • python/cudf_polars/tests/streaming/test_dask.py
  • python/cudf_polars/tests/streaming/test_dataframescan.py
  • python/cudf_polars/tests/streaming/test_default_singleton_engine.py
  • python/cudf_polars/tests/streaming/test_distinct.py
  • python/cudf_polars/tests/streaming/test_empty_channels.py
  • python/cudf_polars/tests/streaming/test_explain.py
  • python/cudf_polars/tests/streaming/test_filter.py
  • python/cudf_polars/tests/streaming/test_groupby.py
  • python/cudf_polars/tests/streaming/test_hstack.py
  • python/cudf_polars/tests/streaming/test_io_multirank.py
  • python/cudf_polars/tests/streaming/test_join.py
  • python/cudf_polars/tests/streaming/test_metadata.py
  • python/cudf_polars/tests/streaming/test_options.py
  • python/cudf_polars/tests/streaming/test_parallel.py
  • python/cudf_polars/tests/streaming/test_ray.py
  • python/cudf_polars/tests/streaming/test_rolling.py
  • python/cudf_polars/tests/streaming/test_scan.py
  • python/cudf_polars/tests/streaming/test_select.py
  • python/cudf_polars/tests/streaming/test_shuffler.py
  • python/cudf_polars/tests/streaming/test_sink.py
  • python/cudf_polars/tests/streaming/test_sort.py
  • python/cudf_polars/tests/streaming/test_spilling.py
  • python/cudf_polars/tests/streaming/test_spmd.py
  • python/cudf_polars/tests/streaming/test_statistics.py
  • python/cudf_polars/tests/streaming/test_stats.py
  • python/cudf_polars/tests/streaming/test_tracing.py
  • python/cudf_polars/tests/streaming/test_union.py
  • python/cudf_polars/tests/streaming/test_unique.py
  • python/cudf_polars/tests/streaming/test_utils.py
  • python/cudf_polars/tests/test_hconcat.py
  • python/cudf_polars/tests/test_parquet_filters.py
  • python/cudf_polars/tests/test_repr.py
  • python/cudf_polars/tests/test_scan.py
  • python/cudf_polars/tests/test_window_functions.py
  • python/cudf_polars/tests/testing/test_asserts.py
  • python/cudf_polars/tests/testing/test_engine_utils.py

📝 Walkthrough

Summary by CodeRabbit

Release Notes

  • Chores

    • Updated Polars dependency support to <1.40.
    • Consolidated experimental streaming/engine APIs into stable cudf_polars.engine and cudf_polars.streaming modules.
    • Applied Arrow/RapidJSON CMake compatibility patch.
  • New Features

    • Added strict parameter to horizontal concatenation for row-count validation.
    • Extended set_sorted expression support with null handling.
  • Performance

    • Optimized benchmark queries with pre-filtering and semi-join strategies.
  • Bug Fixes

    • Fixed Parquet byte-range fetching to device via batched transfers.
    • Improved JSON tree builder depth-out-of-range detection mechanism.

Walkthrough

Mass migration from experimental to streaming/engine modules, Polars dependency upper bound to <1.40, DSL/IR/version-gate updates, Parquet async read refactor with batched device copies, Arrow/RapidJSON CMake override, plus extensive benchmark and test updates to new APIs.

Changes

Streaming/Engine Migration and Polars 1.40

Layer / File(s) Summary
Core reorg and compat updates
python/cudf_polars/...
Switches imports to cudf_polars.streaming and cudf_polars.engine, adds Polars <1.40 gates, updates DSL/IR (HConcat strict, rolling, set_sorted, is_between), restructures actor-graph, IO, parallel, and tests/benchmarks accordingly.

Estimated code review effort

🎯 5 (Critical) | ⏱️ ~120 minutes

Possibly related PRs

Suggested labels

Python, cudf-polars, libcudf, CMake

Suggested reviewers

  • mroeschke
  • rjzamora
  • TomAugspurger
  • vyasr
✨ Finishing Touches
🧪 Generate unit tests (beta)
  • Create PR with unit tests

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

breaking Breaking change CMake CMake build issue cudf-polars Issues specific to cudf-polars improvement Improvement / enhancement to an existing function Java Affects Java cuDF API. libcudf Affects libcudf (C++/CUDA) code. Python Affects Python cuDF API.

Projects

Status: Done

Development

Successfully merging this pull request may close these issues.

8 participants