Skip to content

Feat/nested pagination - #75

Open
andr-ec wants to merge 2 commits into
ash-project:mainfrom
andr-ec:feat/nested-pagination
Open

Feat/nested pagination#75
andr-ec wants to merge 2 commits into
ash-project:mainfrom
andr-ec:feat/nested-pagination

Conversation

@andr-ec

@andr-ec andr-ec commented May 11, 2026

Copy link
Copy Markdown

closes #74

implements nested pagination

Contributor checklist

Leave anything that you believe does not apply unchecked.

  • I accept the AI Policy, or AI was not used in the creation of this PR.
  • Bug fixes include regression tests
  • Chores
  • Documentation changes
  • Features include unit/acceptance tests
  • Refactoring
  • Update dependencies

andr-ec added 2 commits May 7, 2026 17:23
Lets a paginated child collection be fetched alongside its parent in one call:

    { comments: { page: { limit: 10, after: cursor }, fields: [...] } }

Mirrors `Ash.Query.load(query, [comments: Comment |> Ash.Query.page(opts)])`
on the runtime side and the inline pagination shape that the top-level
codegen already emits on the result side.

Relationship metadata gains a `__pagination: "keyset" | "offset" | "mixed"`
discriminator when the destination read action supports pagination.
`ComplexFieldSelection` permits the `{ page, fields }` envelope only on
those relationships, and `InferFieldValue` returns
`NestedPageResult<R, F, P>` for them.
- field_selector: drop redundant `then(fn q -> if ... end)` (use direct
  Ash.Query.load), pass `fields` straight through validate_non_empty
  (no `|| []`), switch cardinality check to `rel.type in [:has_many,
  :many_to_many]` to match the codegen helper, thread `path` through
  parse_field_request/classify_nested_request so the args+page
  rejection carries the real path, fold the orphan get_fields_value/1
  back into its single caller, and trim drive-by comments
- result_processor: collapse the relationship_inner_* pair into a
  single unwrap_array_type/2 returning {type, constraints}
- output_formatter: drop ResultProcessor cross-call (it inverted the
  pipeline order); mirror the top-level pagination handler exactly,
  using format_value with parent-resource type lookup so the wire
  shape matches between top-level and nested page reads
- test assertion follows the same atom/string convention as
  top-level page output (atoms pass through to the caller)
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

Pagination on nested relationship loads

1 participant