Skip to content
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
52 commits
Select commit Hold shift + click to select a range
9c95e5c
initial patch
Apr 10, 2026
b5ed772
align reader context
Apr 10, 2026
b0e8b62
align delete context
Apr 10, 2026
ff01dca
align scheme handler & project column when read
Apr 10, 2026
9ea7739
guard against key based buffer
Apr 12, 2026
dd6bfb3
avro schema utils
Apr 12, 2026
527e6c7
avro schema util
Apr 12, 2026
6714a07
clean up tests
Apr 12, 2026
8c1f487
update claude.md
Apr 13, 2026
a1af9f6
add design spec for keyFilterOpt port from hudi-internal
May 7, 2026
cd126eb
update keyFilterOpt spec: kind() pattern-match accessors
May 7, 2026
733d837
add implementation plan for keyFilterOpt port
May 7, 2026
e2f29e2
add empty module skeletons for expression + internal_schema
May 7, 2026
284b7fd
port Type trait + TypeID enum from internal.schema.Type.java
May 7, 2026
379f6fd
port primitive Types from internal.schema.Types.java
May 7, 2026
2fee0b7
port nested Types (Field, RecordType, ArrayType, MapType)
May 7, 2026
ec9cb00
port StructLike + ArrayData traits
May 7, 2026
2315c4c
fix Task 1.5: ArrayData should be a concrete struct, not a trait
May 7, 2026
1f2c0c6
port Expression trait + Operator enum + empty ExpressionKind
May 7, 2026
a4cf7fa
port LeafExpression trait + BinaryExpression helper struct
May 7, 2026
e2ff04d
port Literal + LiteralValue + add ExpressionKind::Literal variant
May 7, 2026
ddbc944
port NameReference + add ExpressionKind::NameReference variant
May 7, 2026
4fbfa63
port BoundReference + add ExpressionKind::BoundReference variant
May 7, 2026
67c4e7c
port Predicate trait + PredicateKind skeleton; finalize ExpressionKind
May 7, 2026
dfb2bd6
port Predicates::TrueExpression + FalseExpression
May 7, 2026
1023c94
port Predicates::And/Or/Not + 3 PredicateKind variants
May 7, 2026
cfe6457
port Predicates::{BinaryComparison,In,IsNull,IsNotNull,StringStartsWi…
May 7, 2026
ae3812e
port Comparators
May 7, 2026
2453daa
port ExpressionVisitor + BindVisitor + PartialBindVisitor (stubs)
May 7, 2026
08c5ff7
phase 1: fix clippy bool_assert_comparison in array_data test
May 7, 2026
3780b8b
add KeySpec + create_key_spec for keyFilterOpt log-scan path
May 7, 2026
40a5d87
add key_filter_opt field to ReaderContext
May 7, 2026
540ff15
scan_internal accepts Option<KeySpec>; buffer applies key-spec filter
May 7, 2026
86ff53e
wire create_key_spec into HoodieMergedLogRecordReader::perform_scan
May 7, 2026
021960f
apply keyFilterOpt as row filter on base parquet batches
May 7, 2026
5ed1cfe
phase 2 cross-check vs readerContext_callstack.md (appendix)
May 7, 2026
4a9b106
add e2e test helpers for keyFilterOpt phase 3 smoke test
May 7, 2026
f865f31
add Phase 3 e2e smoke test for keyFilterOpt
May 7, 2026
ceb9eaf
phase 3: add key_filter_opt: None to FFI ReaderContext literals
May 7, 2026
35d9603
phase 3: drop unused import in bound_reference test
May 7, 2026
81ab79b
add design spec for keyFilterOpt e2e coverage expansion
May 7, 2026
221c397
add implementation plan for keyFilterOpt e2e coverage expansion
May 7, 2026
6659a6b
add FilterAbResult helper + refactor keyFilterOpt e2e test 1
May 7, 2026
91e7278
add e2e test fg_filter_in_base_only_key (isolates base-file filter)
May 7, 2026
615584c
add e2e test fg_filter_in_no_match (filter drops everything)
May 7, 2026
5dc45bd
add e2e test fg_filter_starts_with_any_prefix (PrefixKeys path)
May 7, 2026
a9b8a8a
add e2e test fg_filter_unsupported_predicate_is_noop (regression guard)
May 7, 2026
0d80038
add e2e test fg_filter_in_with_delete_block (delete-block path) +
May 7, 2026
c49c19b
add e2e test fg_filter_in_log_updated_key_nonpart
May 7, 2026
1ff9780
add e2e test fg_filter_in_log_only_filegroup (isolates log-scan filter)
May 7, 2026
b0faa9a
chore: cargo fmt --all
May 8, 2026
1eb45d4
fix(cpp): align test_read_record_batch_column_projection with FFI pro…
May 8, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 0 additions & 1 deletion .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -18,7 +18,6 @@
/Cargo.lock
/target
**/target
**/data
**/results

/.idea
Expand Down
82 changes: 82 additions & 0 deletions CLAUDE.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,82 @@
# CLAUDE.md

Guidance for Claude Code when working in the hudi-rs repo.

## Toolchain

- **Rust:** `1.88` (edition 2024), pinned in `rust-toolchain.toml` and `Cargo.toml` (`workspace.package.rust-version`). Rustup auto-installs this when you run cargo in the repo.
- **Python:** managed via [uv](https://github.com/astral-sh/uv). See `python/pyproject.toml` for the supported version range.
- **Maturin:** used to build the Python bindings; version is pinned in `python/pyproject.toml` (`requires = ...`).

## Workspace layout

Cargo workspace (`resolver = "2"`) with these members:

- `crates/core` — core Hudi logic (`hudi-core`)
- `crates/datafusion` — DataFusion integration
- `crates/hudi` — umbrella crate published as `hudi` on crates.io
- `crates/test` — shared test utilities
- `cpp` — C++ bindings via cxx
- `python` — PyO3/Maturin bindings, published as `hudi` on PyPI
- `benchmark/tpch` — TPC-H benchmark harness

## Build & test (Rust)

Prefer the Makefile targets; they wrap the canonical commands.

```shell
# All Rust tests (workspace, all targets, all features)
make test-rust
# equivalent: cargo test --no-fail-fast --all-targets --all-features --workspace

# Single crate
cargo test -p hudi-core

# Single test
cargo test -p hudi-core table::tests::hudi_table_get_schema

# Format / lint (matches CI)
make format-rust # cargo fmt --all
make check-rust # cargo clippy --all-targets --all-features --workspace --no-deps -- -D warnings
# + cargo fmt --all -- --check
```

Note: Rust commands are invoked through `./build-wrapper.sh` in the Makefile. Running `cargo` directly works fine for local dev.

## Build & test (Python)

```shell
make setup-venv # uv venv .venv
source .venv/bin/activate
make develop # maturin develop --extras=devel,datafusion --features datafusion,testing
make test-python # uv run pytest -s python
pytest python/tests/test_table_read.py -s -k "test_read_table_has_correct_schema"
make check-python # ruff format --check, ruff check, mypy
```

## Before opening a PR

```shell
make format check test
```

This runs format + check + test for both Rust and Python. Same checks CI runs.

## Coverage

```shell
make coverage-rust # HTML report at ./cov-reports/tarpaulin-report.html
make coverage-check # fails if below COV_THRESHOLD (default 60)
```
Requires `cargo install cargo-tarpaulin`.

## Benchmarks

TPC-H harness lives in `benchmark/tpch`. See `make tpch-generate`, `make tpch-create-tables`, `make bench-tpch`.

## PR conventions (from CONTRIBUTING.md)

- Title must follow [conventional commits](https://www.conventionalcommits.org).
- Keep diffs under ~1000 lines when feasible.
- New features / bug fixes require tests.
- Prefer self-explanatory code over comments; only comment non-obvious logic.
17 changes: 16 additions & 1 deletion cpp/Cargo.toml
Original file line number Diff line number Diff line change
Expand Up @@ -32,12 +32,27 @@ name = "hudi"
crate-type = ["cdylib", "rlib"]

[dependencies]
hudi = { path = "../crates/hudi", version = "0.5.0-dev" }
hudi-dep = { package = "hudi", path = "../crates/hudi", version = "0.5.0-dev" }
hudi-test = { path = "../crates/test", version = "0.5.0-dev" }
cxx = { version = "1.0" }
apache-avro = { workspace = true }
arrow = { workspace = true , features = ["ffi"]}
arrow-array = { workspace = true , features = ["ffi"]}
arrow-schema = { workspace = true }
tokio = { workspace = true }
env_logger = { version = "0.11" }
log = { version = "0.4" }

[dev-dependencies]
arrow = { workspace = true }
arrow-array = { workspace = true }
arrow-cast = { workspace = true }
arrow-ord = { workspace = true }
arrow-schema = { workspace = true }
arrow-select = { workspace = true }
hudi-test = { path = "../crates/test", version = "0.5.0-dev" }
parquet = { workspace = true }
tokio = { workspace = true, features = ["macros", "rt-multi-thread"] }

[build-dependencies]
cxx-build = { version = "1.0" }
Loading