diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index 504eec952..2cc6bdc7d 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -5,10 +5,10 @@ on: - main pull_request: paths: - - rust/** + - crates/** + - Cargo.toml + - Cargo.lock - .github/workflows/build.yml - - rust/lance-graph/Cargo.toml - - rust/lance-graph/Cargo.lock concurrency: group: ${{ github.workflow }}-${{ github.event.pull_request.number || github.ref }} @@ -36,17 +36,17 @@ jobs: rustup default ${{ matrix.toolchain }} - uses: Swatinem/rust-cache@v2 with: - workspaces: rust/lance-graph + workspaces: crates/lance-graph cache-targets: false - name: Install dependencies run: | sudo apt update sudo apt install -y protobuf-compiler - name: Build - run: cargo build --manifest-path rust/lance-graph/Cargo.toml + run: cargo build --manifest-path crates/lance-graph/Cargo.toml - name: Build tests - run: cargo test --manifest-path rust/lance-graph/Cargo.toml --no-run + run: cargo test --manifest-path crates/lance-graph/Cargo.toml --no-run - name: Run tests - run: cargo test --manifest-path rust/lance-graph/Cargo.toml + run: cargo test --manifest-path crates/lance-graph/Cargo.toml - name: Check benchmarks - run: cargo check --manifest-path rust/lance-graph/Cargo.toml --benches + run: cargo check --manifest-path crates/lance-graph/Cargo.toml --benches diff --git a/.github/workflows/python-test.yml b/.github/workflows/python-test.yml index c433b0588..97f4caab9 100644 --- a/.github/workflows/python-test.yml +++ b/.github/workflows/python-test.yml @@ -6,7 +6,9 @@ on: pull_request: paths: - python/** - - rust/lance-graph/** + - crates/lance-graph/** + - Cargo.toml + - Cargo.lock - .github/workflows/python-test.yml concurrency: diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index ce1e981b9..b364565ae 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -120,7 +120,7 @@ jobs: - name: Update Cargo lock version (when version changes) if: inputs.release_type != 'current' run: | - cargo check --manifest-path rust/lance-graph/Cargo.toml + cargo check --manifest-path crates/lance-graph/Cargo.toml cargo check --manifest-path python/Cargo.toml - name: Create release commit (when version changes) diff --git a/.github/workflows/rust-publish.yml b/.github/workflows/rust-publish.yml index 1fe7387db..26f660a5d 100644 --- a/.github/workflows/rust-publish.yml +++ b/.github/workflows/rust-publish.yml @@ -27,6 +27,7 @@ env: jobs: publish: + if: github.event_name != 'pull_request' runs-on: ubuntu-24.04 timeout-minutes: 60 steps: @@ -50,5 +51,5 @@ jobs: with: registry-token: ${{ secrets.CARGO_REGISTRY_TOKEN }} args: "--all-features" - path: rust/lance-graph + path: crates/lance-graph dry-run: ${{ github.event_name == 'pull_request' || (github.event_name == 'workflow_dispatch' && github.event.inputs.mode == 'dry_run') }} diff --git a/.github/workflows/rust-test.yml b/.github/workflows/rust-test.yml index 85748f56a..22bcb7fac 100644 --- a/.github/workflows/rust-test.yml +++ b/.github/workflows/rust-test.yml @@ -5,10 +5,10 @@ on: - main pull_request: paths: - - rust/** - - .github/workflows/rust-test.yml + - crates/** - Cargo.toml - Cargo.lock + - .github/workflows/rust-test.yml concurrency: group: ${{ github.workflow }}-${{ github.event.pull_request.number || github.ref }} @@ -37,18 +37,18 @@ jobs: rustup default ${{ matrix.toolchain }} - uses: Swatinem/rust-cache@v2 with: - workspaces: rust/lance-graph + workspaces: crates/lance-graph cache-targets: false - name: Install dependencies run: | sudo apt update sudo apt install -y protobuf-compiler - name: Build tests - run: cargo test --manifest-path rust/lance-graph/Cargo.toml --no-run + run: cargo test --manifest-path crates/lance-graph/Cargo.toml --no-run - name: Run unit tests - run: cargo test --manifest-path rust/lance-graph/Cargo.toml --lib + run: cargo test --manifest-path crates/lance-graph/Cargo.toml --lib - name: Run doc tests - run: cargo test --manifest-path rust/lance-graph/Cargo.toml --doc + run: cargo test --manifest-path crates/lance-graph/Cargo.toml --doc test-with-coverage: runs-on: ubuntu-24.04 @@ -61,7 +61,7 @@ jobs: rustup default stable - uses: Swatinem/rust-cache@v2 with: - workspaces: rust/lance-graph + workspaces: crates/lance-graph cache-targets: false - name: Install dependencies run: | @@ -71,7 +71,7 @@ jobs: uses: taiki-e/install-action@cargo-llvm-cov - name: Run tests with coverage run: | - cargo llvm-cov --manifest-path rust/lance-graph/Cargo.toml --lcov --output-path lcov.info + cargo llvm-cov --manifest-path crates/lance-graph/Cargo.toml --lcov --output-path lcov.info - name: Upload coverage to Codecov uses: codecov/codecov-action@v4 with: diff --git a/.github/workflows/style.yml b/.github/workflows/style.yml index 1954f0590..cb7878fbe 100644 --- a/.github/workflows/style.yml +++ b/.github/workflows/style.yml @@ -5,10 +5,10 @@ on: - main pull_request: paths: - - rust/** + - crates/** + - Cargo.toml + - Cargo.lock - .github/workflows/style.yml - - rust/lance-graph/Cargo.toml - - rust/lance-graph/Cargo.lock concurrency: group: ${{ github.workflow }}-${{ github.event.pull_request.number || github.ref }} @@ -28,7 +28,7 @@ jobs: with: components: rustfmt - name: Check formatting - run: cargo fmt --manifest-path rust/lance-graph/Cargo.toml -- --check + run: cargo fmt --manifest-path crates/lance-graph/Cargo.toml -- --check clippy: runs-on: ubuntu-24.04 @@ -37,13 +37,13 @@ jobs: - uses: actions/checkout@v4 - uses: Swatinem/rust-cache@v2 with: - workspaces: rust/lance-graph + workspaces: crates/lance-graph - name: Install dependencies run: | sudo apt update sudo apt install -y protobuf-compiler - name: Clippy - run: cargo clippy --manifest-path rust/lance-graph/Cargo.toml --all-targets -- -D warnings + run: cargo clippy --manifest-path crates/lance-graph/Cargo.toml --all-targets -- -D warnings typos: name: Spell Check @@ -52,4 +52,4 @@ jobs: - name: Checkout uses: actions/checkout@v4 - name: Check spelling - uses: crate-ci/typos@v1.26.0 \ No newline at end of file + uses: crate-ci/typos@v1.26.0 diff --git a/AGENTS.md b/AGENTS.md index 700da4b1c..6cbe64856 100644 --- a/AGENTS.md +++ b/AGENTS.md @@ -1,13 +1,13 @@ # Repository Guidelines ## Project Structure & Module Organization -- `rust/lance-graph/` hosts the Rust Cypher engine; keep new modules under `src/` and co-locate helpers inside `query/` or feature-specific submodules. +- `crates/lance-graph/` hosts the Rust Cypher engine; keep new modules under `src/` and co-locate helpers inside `query/` or feature-specific submodules. - `python/src/` contains the PyO3 bridge; `python/python/lance_graph/` holds the pure-Python facade and packaging metadata. - `python/python/tests/` stores functional tests; mirror new features with targeted cases here and in the corresponding Rust module. - `examples/` demonstrates Cypher usage; update or add examples when introducing new public APIs. ## Build, Test, and Development Commands -- `cargo check` / `cargo test --all` (run inside `rust/lance-graph`) validate Rust code paths. +- `cargo check` / `cargo test --all` (run inside `crates/lance-graph`) validate Rust code paths. - `cargo bench --bench graph_execution` measures performance-critical changes; include shortened runs with `--warm-up-time 1`. - `uv venv --python 3.11 .venv` and `uv pip install -e '.[tests]'` bootstrap the Python workspace. - `maturin develop` rebuilds the extension after Rust edits; `pytest python/python/tests/ -v` exercises Python bindings. diff --git a/rust/lance-graph/Cargo.lock b/Cargo.lock similarity index 100% rename from rust/lance-graph/Cargo.lock rename to Cargo.lock diff --git a/Cargo.toml b/Cargo.toml new file mode 100644 index 000000000..e188a70a5 --- /dev/null +++ b/Cargo.toml @@ -0,0 +1,8 @@ +[workspace] +members = [ + "crates/lance-graph", +] +exclude = [ + "python", +] +resolver = "2" diff --git a/README.md b/README.md index bc9626ec0..f1ed4070c 100644 --- a/README.md +++ b/README.md @@ -4,11 +4,14 @@ Lance Graph is a Cypher-capable graph query engine built in Rust with Python bin This repository contains: -- `rust/lance-graph` – the Cypher-capable query engine implemented in Rust +- `crates/lance-graph` – the Cypher-capable query engine implemented in Rust - `python/` – PyO3 bindings and Python packages: - `lance_graph` – thin wrapper around the Rust query engine - `knowledge_graph` – Lance-backed knowledge graph CLI, API, and utilities +See `docs/project_structure.md` for the proposed workspace-based structure from +issue #92. + ## Prerequisites - Rust toolchain (1.82 or newer recommended) @@ -18,7 +21,7 @@ This repository contains: ## Rust crate quick start ```bash -cd rust/lance-graph +cd crates/lance-graph cargo check cargo test ``` @@ -147,7 +150,7 @@ working solely on the bindings. - protoc: install `protobuf-compiler` (Debian/Ubuntu: `sudo apt-get install -y protobuf-compiler`). - Optional: gnuplot for Criterion's gnuplot backend; otherwise the plotters backend is used. -- Run (from `rust/lance-graph`): +- Run (from `crates/lance-graph`): ```bash cargo bench --bench graph_execution @@ -157,8 +160,8 @@ cargo bench --bench graph_execution -- --warm-up-time 1 --measurement-time 2 --s ``` - Reports: - - Global index: `rust/lance-graph/target/criterion/report/index.html` - - Group index: `rust/lance-graph/target/criterion/cypher_execution/report/index.html` + - Global index: `crates/lance-graph/target/criterion/report/index.html` + - Group index: `crates/lance-graph/target/criterion/cypher_execution/report/index.html` - Typical results (x86_64, quick run: warm-up 1s, measurement 2s, sample size 10): diff --git a/rust/lance-graph/CONTRIBUTING.md b/crates/lance-graph/CONTRIBUTING.md similarity index 62% rename from rust/lance-graph/CONTRIBUTING.md rename to crates/lance-graph/CONTRIBUTING.md index 30e03a7e9..395cd649b 100644 --- a/rust/lance-graph/CONTRIBUTING.md +++ b/crates/lance-graph/CONTRIBUTING.md @@ -4,11 +4,11 @@ Contributing (Rust crate) Before pushing or opening a PR, please verify Rust code formatting matches CI: ```bash -cargo fmt --manifest-path rust/lance-graph/Cargo.toml -- --check +cargo fmt --manifest-path crates/lance-graph/Cargo.toml -- --check ``` If the check fails, format the code locally: ```bash -cargo fmt --manifest-path rust/lance-graph/Cargo.toml +cargo fmt --manifest-path crates/lance-graph/Cargo.toml ``` diff --git a/rust/lance-graph/Cargo.toml b/crates/lance-graph/Cargo.toml similarity index 100% rename from rust/lance-graph/Cargo.toml rename to crates/lance-graph/Cargo.toml diff --git a/rust/lance-graph/README.md b/crates/lance-graph/README.md similarity index 100% rename from rust/lance-graph/README.md rename to crates/lance-graph/README.md diff --git a/rust/lance-graph/benches/graph_execution.rs b/crates/lance-graph/benches/graph_execution.rs similarity index 100% rename from rust/lance-graph/benches/graph_execution.rs rename to crates/lance-graph/benches/graph_execution.rs diff --git a/rust/lance-graph/src/ast.rs b/crates/lance-graph/src/ast.rs similarity index 100% rename from rust/lance-graph/src/ast.rs rename to crates/lance-graph/src/ast.rs diff --git a/rust/lance-graph/src/config.rs b/crates/lance-graph/src/config.rs similarity index 100% rename from rust/lance-graph/src/config.rs rename to crates/lance-graph/src/config.rs diff --git a/rust/lance-graph/src/datafusion_planner/analysis.rs b/crates/lance-graph/src/datafusion_planner/analysis.rs similarity index 100% rename from rust/lance-graph/src/datafusion_planner/analysis.rs rename to crates/lance-graph/src/datafusion_planner/analysis.rs diff --git a/rust/lance-graph/src/datafusion_planner/builder/aggregate_ops.rs b/crates/lance-graph/src/datafusion_planner/builder/aggregate_ops.rs similarity index 100% rename from rust/lance-graph/src/datafusion_planner/builder/aggregate_ops.rs rename to crates/lance-graph/src/datafusion_planner/builder/aggregate_ops.rs diff --git a/rust/lance-graph/src/datafusion_planner/builder/basic_ops.rs b/crates/lance-graph/src/datafusion_planner/builder/basic_ops.rs similarity index 100% rename from rust/lance-graph/src/datafusion_planner/builder/basic_ops.rs rename to crates/lance-graph/src/datafusion_planner/builder/basic_ops.rs diff --git a/rust/lance-graph/src/datafusion_planner/builder/expand_ops.rs b/crates/lance-graph/src/datafusion_planner/builder/expand_ops.rs similarity index 100% rename from rust/lance-graph/src/datafusion_planner/builder/expand_ops.rs rename to crates/lance-graph/src/datafusion_planner/builder/expand_ops.rs diff --git a/rust/lance-graph/src/datafusion_planner/builder/helpers.rs b/crates/lance-graph/src/datafusion_planner/builder/helpers.rs similarity index 100% rename from rust/lance-graph/src/datafusion_planner/builder/helpers.rs rename to crates/lance-graph/src/datafusion_planner/builder/helpers.rs diff --git a/rust/lance-graph/src/datafusion_planner/builder/join_builder.rs b/crates/lance-graph/src/datafusion_planner/builder/join_builder.rs similarity index 100% rename from rust/lance-graph/src/datafusion_planner/builder/join_builder.rs rename to crates/lance-graph/src/datafusion_planner/builder/join_builder.rs diff --git a/rust/lance-graph/src/datafusion_planner/builder/mod.rs b/crates/lance-graph/src/datafusion_planner/builder/mod.rs similarity index 100% rename from rust/lance-graph/src/datafusion_planner/builder/mod.rs rename to crates/lance-graph/src/datafusion_planner/builder/mod.rs diff --git a/rust/lance-graph/src/datafusion_planner/config_helpers.rs b/crates/lance-graph/src/datafusion_planner/config_helpers.rs similarity index 100% rename from rust/lance-graph/src/datafusion_planner/config_helpers.rs rename to crates/lance-graph/src/datafusion_planner/config_helpers.rs diff --git a/rust/lance-graph/src/datafusion_planner/expression.rs b/crates/lance-graph/src/datafusion_planner/expression.rs similarity index 100% rename from rust/lance-graph/src/datafusion_planner/expression.rs rename to crates/lance-graph/src/datafusion_planner/expression.rs diff --git a/rust/lance-graph/src/datafusion_planner/join_ops.rs b/crates/lance-graph/src/datafusion_planner/join_ops.rs similarity index 100% rename from rust/lance-graph/src/datafusion_planner/join_ops.rs rename to crates/lance-graph/src/datafusion_planner/join_ops.rs diff --git a/rust/lance-graph/src/datafusion_planner/mod.rs b/crates/lance-graph/src/datafusion_planner/mod.rs similarity index 100% rename from rust/lance-graph/src/datafusion_planner/mod.rs rename to crates/lance-graph/src/datafusion_planner/mod.rs diff --git a/rust/lance-graph/src/datafusion_planner/scan_ops.rs b/crates/lance-graph/src/datafusion_planner/scan_ops.rs similarity index 100% rename from rust/lance-graph/src/datafusion_planner/scan_ops.rs rename to crates/lance-graph/src/datafusion_planner/scan_ops.rs diff --git a/rust/lance-graph/src/datafusion_planner/test_fixtures.rs b/crates/lance-graph/src/datafusion_planner/test_fixtures.rs similarity index 100% rename from rust/lance-graph/src/datafusion_planner/test_fixtures.rs rename to crates/lance-graph/src/datafusion_planner/test_fixtures.rs diff --git a/rust/lance-graph/src/datafusion_planner/udf.rs b/crates/lance-graph/src/datafusion_planner/udf.rs similarity index 100% rename from rust/lance-graph/src/datafusion_planner/udf.rs rename to crates/lance-graph/src/datafusion_planner/udf.rs diff --git a/rust/lance-graph/src/datafusion_planner/vector_ops.rs b/crates/lance-graph/src/datafusion_planner/vector_ops.rs similarity index 100% rename from rust/lance-graph/src/datafusion_planner/vector_ops.rs rename to crates/lance-graph/src/datafusion_planner/vector_ops.rs diff --git a/rust/lance-graph/src/error.rs b/crates/lance-graph/src/error.rs similarity index 100% rename from rust/lance-graph/src/error.rs rename to crates/lance-graph/src/error.rs diff --git a/rust/lance-graph/src/lance_native_planner.rs b/crates/lance-graph/src/lance_native_planner.rs similarity index 100% rename from rust/lance-graph/src/lance_native_planner.rs rename to crates/lance-graph/src/lance_native_planner.rs diff --git a/rust/lance-graph/src/lance_vector_search.rs b/crates/lance-graph/src/lance_vector_search.rs similarity index 100% rename from rust/lance-graph/src/lance_vector_search.rs rename to crates/lance-graph/src/lance_vector_search.rs diff --git a/rust/lance-graph/src/lib.rs b/crates/lance-graph/src/lib.rs similarity index 100% rename from rust/lance-graph/src/lib.rs rename to crates/lance-graph/src/lib.rs diff --git a/rust/lance-graph/src/logical_plan.rs b/crates/lance-graph/src/logical_plan.rs similarity index 100% rename from rust/lance-graph/src/logical_plan.rs rename to crates/lance-graph/src/logical_plan.rs diff --git a/rust/lance-graph/src/namespace/directory.rs b/crates/lance-graph/src/namespace/directory.rs similarity index 100% rename from rust/lance-graph/src/namespace/directory.rs rename to crates/lance-graph/src/namespace/directory.rs diff --git a/rust/lance-graph/src/namespace/mod.rs b/crates/lance-graph/src/namespace/mod.rs similarity index 100% rename from rust/lance-graph/src/namespace/mod.rs rename to crates/lance-graph/src/namespace/mod.rs diff --git a/rust/lance-graph/src/parser.rs b/crates/lance-graph/src/parser.rs similarity index 100% rename from rust/lance-graph/src/parser.rs rename to crates/lance-graph/src/parser.rs diff --git a/rust/lance-graph/src/query.rs b/crates/lance-graph/src/query.rs similarity index 100% rename from rust/lance-graph/src/query.rs rename to crates/lance-graph/src/query.rs diff --git a/rust/lance-graph/src/query_processor.rs b/crates/lance-graph/src/query_processor.rs similarity index 100% rename from rust/lance-graph/src/query_processor.rs rename to crates/lance-graph/src/query_processor.rs diff --git a/rust/lance-graph/src/semantic.rs b/crates/lance-graph/src/semantic.rs similarity index 100% rename from rust/lance-graph/src/semantic.rs rename to crates/lance-graph/src/semantic.rs diff --git a/rust/lance-graph/src/simple_executor/aliases.rs b/crates/lance-graph/src/simple_executor/aliases.rs similarity index 100% rename from rust/lance-graph/src/simple_executor/aliases.rs rename to crates/lance-graph/src/simple_executor/aliases.rs diff --git a/rust/lance-graph/src/simple_executor/clauses.rs b/crates/lance-graph/src/simple_executor/clauses.rs similarity index 100% rename from rust/lance-graph/src/simple_executor/clauses.rs rename to crates/lance-graph/src/simple_executor/clauses.rs diff --git a/rust/lance-graph/src/simple_executor/expr.rs b/crates/lance-graph/src/simple_executor/expr.rs similarity index 100% rename from rust/lance-graph/src/simple_executor/expr.rs rename to crates/lance-graph/src/simple_executor/expr.rs diff --git a/rust/lance-graph/src/simple_executor/mod.rs b/crates/lance-graph/src/simple_executor/mod.rs similarity index 100% rename from rust/lance-graph/src/simple_executor/mod.rs rename to crates/lance-graph/src/simple_executor/mod.rs diff --git a/rust/lance-graph/src/simple_executor/path_executor.rs b/crates/lance-graph/src/simple_executor/path_executor.rs similarity index 100% rename from rust/lance-graph/src/simple_executor/path_executor.rs rename to crates/lance-graph/src/simple_executor/path_executor.rs diff --git a/rust/lance-graph/src/source_catalog.rs b/crates/lance-graph/src/source_catalog.rs similarity index 100% rename from rust/lance-graph/src/source_catalog.rs rename to crates/lance-graph/src/source_catalog.rs diff --git a/rust/lance-graph/tests/test_datafusion_pipeline.rs b/crates/lance-graph/tests/test_datafusion_pipeline.rs similarity index 100% rename from rust/lance-graph/tests/test_datafusion_pipeline.rs rename to crates/lance-graph/tests/test_datafusion_pipeline.rs diff --git a/rust/lance-graph/tests/test_datafusion_scenarios.rs b/crates/lance-graph/tests/test_datafusion_scenarios.rs similarity index 100% rename from rust/lance-graph/tests/test_datafusion_scenarios.rs rename to crates/lance-graph/tests/test_datafusion_scenarios.rs diff --git a/rust/lance-graph/tests/test_datafusion_varlength_complex.rs b/crates/lance-graph/tests/test_datafusion_varlength_complex.rs similarity index 100% rename from rust/lance-graph/tests/test_datafusion_varlength_complex.rs rename to crates/lance-graph/tests/test_datafusion_varlength_complex.rs diff --git a/rust/lance-graph/tests/test_datafusion_vector_search.rs b/crates/lance-graph/tests/test_datafusion_vector_search.rs similarity index 100% rename from rust/lance-graph/tests/test_datafusion_vector_search.rs rename to crates/lance-graph/tests/test_datafusion_vector_search.rs diff --git a/rust/lance-graph/tests/test_datafusion_with_context.rs b/crates/lance-graph/tests/test_datafusion_with_context.rs similarity index 100% rename from rust/lance-graph/tests/test_datafusion_with_context.rs rename to crates/lance-graph/tests/test_datafusion_with_context.rs diff --git a/rust/lance-graph/tests/test_explain_output.rs b/crates/lance-graph/tests/test_explain_output.rs similarity index 100% rename from rust/lance-graph/tests/test_explain_output.rs rename to crates/lance-graph/tests/test_explain_output.rs diff --git a/rust/lance-graph/tests/test_lance_vector_search.rs b/crates/lance-graph/tests/test_lance_vector_search.rs similarity index 100% rename from rust/lance-graph/tests/test_lance_vector_search.rs rename to crates/lance-graph/tests/test_lance_vector_search.rs diff --git a/rust/lance-graph/tests/test_to_sql.rs b/crates/lance-graph/tests/test_to_sql.rs similarity index 100% rename from rust/lance-graph/tests/test_to_sql.rs rename to crates/lance-graph/tests/test_to_sql.rs diff --git a/docs/project_structure.md b/docs/project_structure.md new file mode 100644 index 000000000..e0c2237d0 --- /dev/null +++ b/docs/project_structure.md @@ -0,0 +1,60 @@ +Project Structure Proposal (Issue #92) +====================================== + +This document captures a pragmatic "proper" structure for lance-graph based on +issue #92. It focuses on clearer separation of concerns, a Cargo workspace, and +first-class Python bindings. + +Goals +----- +- Keep lightweight crates usable without pulling in heavy dependencies. +- Allow custom graph-native operators without forcing everything through SQL. +- Make Python bindings and examples first-class citizens. + +Current Layout (after refactor) +------------------------------- +- `crates/lance-graph/` hosts the Rust engine crate. +- `python/` contains PyO3 bindings plus the `lance_graph` and + `knowledge_graph` Python packages. +- `examples/` holds simple Cypher usage examples. + +Proposed Layout (Workspace) +--------------------------- +The issue recommends moving to a Cargo workspace to split functionality and +avoid pulling DataFusion/Tokio into every consumer: + +``` +lance-graph/ +├── Cargo.toml # Workspace definition +├── README.md # Unified docs +├── docs/ # ADRs + design notes +├── crates/ +│ ├── lance-graph/ # Facade crate (re-exports) +│ ├── lance-graph-core/ # AST + schema types (no heavy deps) +│ └── lance-graph-planner/ # Cypher -> LogicalPlan +├── python/ # PyO3 + Python packages +└── examples/ # End-to-end examples +``` + +Why this helps +-------------- +- `lance-graph-core` can be reused by tooling and schema validators without + DataFusion or Tokio. +- `lance-graph-planner` keeps translation logic isolated for easier evolution. +- A future `lance-graph-physical` crate can be introduced once we have + substantial graph-native kernels (traversal, vector search). +- The facade crate offers a stable public API while allowing internal churn. + +Suggested Migration Steps +------------------------- +1. Add a top-level `Cargo.toml` workspace and move the existing Rust crate into + `crates/lance-graph/` without changing its internal module layout. +2. Extract AST + schema types into `crates/lance-graph-core/` and update + references. +3. Split the planner (`Cypher -> LogicalPlan`) into `lance-graph-planner`. +4. Refactor the Simple executor so it lives in the workspace cleanly (either + inside the facade crate or as a `lance-graph-simple` crate). +5. Update `python/Cargo.toml` to depend on the workspace crates. +6. Add ADRs for each step under `docs/` to document tradeoffs. +7. Update GitHub workflows to match the new workspace paths (build, test, + release/publish), otherwise releases will fail. diff --git a/python/Cargo.toml b/python/Cargo.toml index 30b96d1c0..eafe5b624 100644 --- a/python/Cargo.toml +++ b/python/Cargo.toml @@ -15,7 +15,7 @@ arrow-array = "56.2" arrow-schema = "56.2" arrow-ipc = "56.2" futures = "0.3" -lance-graph = { path = "../rust/lance-graph" } +lance-graph = { path = "../crates/lance-graph" } serde = { version = "1", features = ["derive"] } serde_json = "1" pyo3 = { version = "0.25", features = ["extension-module", "abi3-py39", "py-clone"] }