Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
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
27 changes: 27 additions & 0 deletions .github/workflows/ci.yml
Original file line number Diff line number Diff line change
Expand Up @@ -66,6 +66,33 @@ jobs:
- run: cargo clippy -p graphql-orm --all-targets -- -D warnings
- run: RUSTDOCFLAGS="-D warnings" cargo doc -p graphql-orm -p graphql-orm-macros --no-deps

orm-text-group-pages:
runs-on: ubuntu-latest
timeout-minutes: 25
steps:
- uses: actions/checkout@v5
- uses: dtolnay/rust-toolchain@stable
with:
components: clippy
- uses: Swatinem/rust-cache@v2
- name: Execute complete SQLite groups and unchanged aggregate behavior
run: cargo test -p graphql-orm --locked --no-default-features --features sqlite --lib --test complete_group_pages --test grouped_aggregates
- name: Execute the dependency-minimal private repository example
run: cargo run --manifest-path crates/graphql-orm/tests/fixtures/repository-aggregate-consumer/Cargo.toml --locked --no-default-features --features sqlite --example complete_events
- name: Verify unsupported profiles before pool I/O
run: |
cargo test -p graphql-orm --locked --no-default-features --features postgres --lib --test complete_group_pages_unsupported
cargo test -p graphql-orm --locked --no-default-features --features mssql --lib --test complete_group_pages_unsupported
- name: Execute existing aggregates on a test-owned PostgreSQL container
run: cargo test -p graphql-orm --locked --no-default-features --features postgres --test grouped_aggregates_postgres -- --ignored --test-threads=1
- name: Check explicit backend Clippy and Rustdoc lanes
run: |
for backend in sqlite postgres mssql; do
cargo clippy -p graphql-orm -p graphql-orm-macros --locked --no-default-features --features "$backend" --lib --test complete_group_pages --test complete_group_pages_unsupported -- -D warnings
RUSTDOCFLAGS="-D warnings" cargo doc -p graphql-orm -p graphql-orm-macros --locked --no-default-features --features "$backend" --no-deps
done
cargo clippy --manifest-path crates/graphql-orm/tests/fixtures/repository-aggregate-consumer/Cargo.toml --locked --no-default-features --features sqlite --all-targets -- -D warnings

companions:
runs-on: ubuntu-latest
steps:
Expand Down
20 changes: 19 additions & 1 deletion CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@ title: "Changelog"
kind: reference
status: active
owner: workspace-maintainers
last_reviewed: 2026-09-30
last_reviewed: 2026-10-01
review_by: 2027-02-01
supersedes: []
---
Expand All @@ -14,6 +14,24 @@ This file is the authoritative user-facing release chronology. The former
[release-notes ledger](docs/archive/2026/graphql-orm-release-notes.md) is retained
for historical context.

## 0.35.0 - 2026-10-01

Companion macros crate: `graphql-orm-macros` **0.35.0** (alignment only).

- Add complete bounded SQLite text-group enumeration through the existing
aggregate builder, with native group equality, stable NOCASE/BINARY ordering,
typed host-context cursors and continuation after grouping.
- Apply current complete SQL row visibility before grouping, retaining field/entity
authorization and fail-closed residual policies; bound pages to 1–1,000 plus
one lookahead. Keep ordinary aggregate APIs/GraphQL SDL/cursors unchanged.
- Add a standalone private repository consumer example without query SQL/direct
async-graphql and SQLite execution/unsupported-backend regressions. Other scalar
groups/backends and computed SQL Server summaries remain separate capabilities.

This static feature remains independent of runtime A–D. The 0.35.0 package
identity preserves the independently reviewed 0.33.4/0.33.5 compatibility fixes;
release coordination does not imply completion of the broader static query plan.

## 0.33.5 - 2026-10-01

Companion macros crate: `graphql-orm-macros` **0.33.5**.
Expand Down
4 changes: 2 additions & 2 deletions Cargo.lock

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

2 changes: 1 addition & 1 deletion Cargo.toml
Original file line number Diff line number Diff line change
Expand Up @@ -37,7 +37,7 @@ cynic-parser = { version = "=0.11.2", features = ["pretty"] }
futures = "0.3"
getrandom = "0.3"
graphql-composition = "=0.12.2"
graphql-orm = { path = "crates/graphql-orm", version = "0.33.5", default-features = false }
graphql-orm = { path = "crates/graphql-orm", version = "0.35.0", default-features = false }
graphql-orm-ai-tool-profiles = { path = "crates/graphql-orm-ai-tool-profiles", version = "0.15.0" }
graphql-orm-backup = { path = "crates/graphql-orm-backup", version = "0.7.2", default-features = false }
graphql-orm-operation-catalog = { path = "crates/graphql-orm-operation-catalog", version = "0.4.0" }
Expand Down
23 changes: 22 additions & 1 deletion MIGRATION.md
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@ title: "Migration Guide"
kind: reference
status: active
owner: workspace-maintainers
last_reviewed: 2026-09-30
last_reviewed: 2026-10-01
review_by: 2027-02-01
supersedes: []
---
Expand All @@ -13,6 +13,27 @@ supersedes: []
`graphql-orm` is distributed from GitHub only. Use a reviewed full 40-character commit in `rev`;
neither the runtime nor macros crate is published to crates.io.

## Complete text-group pages (0.35.0)

Adopt aligned ORM/macros 0.35.0 after owner review/publication. This is an additive
static aggregate API with no stored-data, existing aggregate SDL or cursor-format
migration. Loop over `fetch_group_page` with a bounded `group_limit`, one text
grouping field and trusted host context. Existing bounded `fetch` remains unchanged;
use pages when the complete distinct set exceeds the group cap.

The initial page profile is SQLite only, with native group equality and explicit
BINARY/NOCASE ordering. Complete SQL row policies are reapplied before grouping;
residual callbacks cannot authorize groups after aggregation. Include verified
identity/public revision in host context and protect the bounded cursor JSON in
an application-owned envelope when required. This fingerprint is not authority.
See [typed aggregates](docs/reference/graphql-orm/typed-aggregates.md) and its
compiled private consumer example for exact null, collation and continuation rules.

Other backends/scalar/multi-key groups fail before query I/O for this new method.
Existing PostgreSQL/MSSQL aggregate behavior remains unchanged. Computed summaries,
joined/computed source reads and private generated GraphQL views remain independent
work; no runtime-schema/dynamic GraphQL adoption is required for this API.

## 0.33.4 to 0.33.5: authoritative generated relationship access

Adopt runtime and macros 0.33.5 together. Generated relationship resolvers no
Expand Down
2 changes: 1 addition & 1 deletion crates/graphql-orm-macros/Cargo.toml
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
[package]
name = "graphql-orm-macros"
version = "0.33.5"
version = "0.35.0"
edition = "2024"
authors = ["Toby Martin"]
description = "Procedural macros for async-graphql and ORM-backed entities, relations, and CRUD operations."
Expand Down
10 changes: 7 additions & 3 deletions crates/graphql-orm-macros/README.md
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@ title: "graphql-orm-macros"
kind: reference
status: active
owner: graphql-orm-macros-maintainers
last_reviewed: 2026-09-30
last_reviewed: 2026-10-01
review_by: 2027-02-01
supersedes: []
---
Expand All @@ -16,13 +16,13 @@ macro/runtime versions aligned:

```toml
[dependencies]
graphql-orm = { git = "https://github.com/Dastari/graphql-orm.git", rev = "<reviewed-full-40-character-commit-sha>", version = "0.33.5", default-features = false, features = ["sqlite"] }
graphql-orm = { git = "https://github.com/Dastari/graphql-orm.git", rev = "<reviewed-full-40-character-commit-sha>", version = "0.35.0", default-features = false, features = ["sqlite"] }
```

Direct use is supported for tooling that needs the macro package:

```toml
graphql-orm-macros = { git = "https://github.com/Dastari/graphql-orm.git", rev = "<reviewed-full-40-character-commit-sha>", version = "0.33.5", default-features = false, features = ["sqlite"] }
graphql-orm-macros = { git = "https://github.com/Dastari/graphql-orm.git", rev = "<reviewed-full-40-character-commit-sha>", version = "0.35.0", default-features = false, features = ["sqlite"] }
```

The direct dependency still requires a compatible `graphql-orm` runtime in the
Expand Down Expand Up @@ -169,3 +169,7 @@ for compiled plain Rust aggregate calls without a direct async-graphql dependenc
Version 0.33.3 gives the repository aggregate compatibility fix a distinct package
identity after the independent 0.33.2 fixture maintenance. Generated behavior is
unchanged from the reviewed aggregate fix.

Version 0.35.0 aligns with the additive core text-group paging API. Existing generated
aggregate enums/builders and ordinary GraphQL aggregate SDL remain unchanged;
repository-only consumers still need no direct async-graphql dependency.

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

4 changes: 2 additions & 2 deletions crates/graphql-orm/Cargo.toml
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
[package]
name = "graphql-orm"
version = "0.33.5"
version = "0.35.0"
edition = "2024"
description = "Runtime support crate for graphql-orm-macros"
license = "MIT"
Expand Down Expand Up @@ -68,7 +68,7 @@ futures = "0.3"
geo = { version = "0.33", optional = true, default-features = false }
geo-types = { version = "0.7", optional = true }
geojson = { version = "1", optional = true, default-features = true }
graphql-orm-macros = { path = "../graphql-orm-macros", version = "0.33.5", default-features = false }
graphql-orm-macros = { path = "../graphql-orm-macros", version = "0.35.0", default-features = false }
graphql-orm-operation-catalog = { workspace = true }
rust_decimal = { workspace = true }
serde = { version = "1", features = ["derive"] }
Expand Down
9 changes: 7 additions & 2 deletions crates/graphql-orm/README.md
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@ title: "graphql-orm"
kind: reference
status: active
owner: graphql-orm-maintainers
last_reviewed: 2026-09-30
last_reviewed: 2026-10-01
review_by: 2027-02-01
supersedes: []
---
Expand All @@ -29,7 +29,7 @@ backend:

```toml
[dependencies]
graphql-orm = { git = "https://github.com/Dastari/graphql-orm.git", rev = "<reviewed-full-40-character-commit-sha>", version = "0.33.5", default-features = false, features = ["sqlite"] }
graphql-orm = { git = "https://github.com/Dastari/graphql-orm.git", rev = "<reviewed-full-40-character-commit-sha>", version = "0.35.0", default-features = false, features = ["sqlite"] }
```

This unpublished package has no docs.rs release. Use this Git README and the
Expand Down Expand Up @@ -187,3 +187,8 @@ compiles scalar and composite keys on SQLite/PostgreSQL/MSSQL; its
[owned-backend tests](tests/fixtures/repository-aggregate-consumer/tests/owned_backend.rs)
execute grouped aggregates and denial before SQL on disposable SQLite/PostgreSQL.
Ordinary `GraphQLEntity` aggregate SDL remains unchanged.

Complete bounded SQLite text-group pages reuse generated aggregate enums and the
existing aggregate builder. See [typed aggregates](../../docs/reference/graphql-orm/typed-aggregates.md)
and the SQL-free private consumer example for native distinct identities, current
SQL visibility and typed continuation. Existing aggregate SDL/cursors are unchanged.
2 changes: 1 addition & 1 deletion crates/graphql-orm/src/db.rs
Original file line number Diff line number Diff line change
Expand Up @@ -975,7 +975,7 @@ impl<B: OrmBackend> Database<B> {
}

/// Observe SQL text (without bind values) and database rows fetched by
/// EntityQuery reads. Intended for diagnostics and query-behavior tests.
/// EntityQuery and aggregate-page reads. Intended for diagnostics and query-behavior tests.
pub fn with_read_query_observer(
mut self,
observer: impl crate::graphql::orm::ReadQueryObserver + 'static,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -143,7 +143,6 @@ impl ReadVisibility {
_ => None,
}
}

pub fn requires_residual_checks(&self) -> bool {
matches!(self, Self::CallbackOnly | Self::Prefilter(_))
}
Expand Down
Loading
Loading