Skip to content

Filter and sort computed fields by a DQL expression - #318

Merged
TomHAnderson merged 1 commit into
API-Skeletons:14.1.xfrom
TomHAnderson:feature/computed-field-expressions
Oct 4, 2026
Merged

TomHAnderson merged 1 commit into
API-Skeletons:14.1.xfrom
TomHAnderson:feature/computed-field-expressions

Conversation

@TomHAnderson

Copy link
Copy Markdown
Member

A ComputedField may give an expression, the DQL of its value. The field then has filters, sort and sortPriority among them, applied to the expression as a field's are applied to its column.

  • Every alias in an expression is a {placeholder}, renamed on each use, so two filters, or a filter and a sort, on one field do not collide. {entity} is the root entity. {:name} is the argument name, bound from the filter's args, else its default, else null.
  • A sort selects the expression AS HIDDEN and orders by it. The batch id-pair query keeps the hidden selects when it replaces the select; the batch count query applies no sorts (Filter\QueryBuilder::apply() takes $sort).
  • Each expression is parsed with Query::getAST(), without a database, after the metadata.build event. Invalid DQL, an alias without a placeholder, an unknown {:name}, an expression on a list or an entity type, and excluded filters without an expression throw Exception\Metadata.
  • DQL takes a subquery only for comparisons, so between is applied as two comparisons, and the in, notin, isnull and LIKE filters DQL rejects for an expression are added to its excludeFilters in the metadata.
  • excludeFilters and includeFilters on ComputedField limit its filters. The expression and excludeFilters keys are left out of the metadata of a field without them, so Metadata::FORMAT_VERSION is unchanged.

A ComputedField may give an expression, the DQL of its value.  The field
then has filters, sort and sortPriority among them, applied to the
expression as a field's are applied to its column.

- Every alias in an expression is a {placeholder}, renamed on each use,
  so two filters, or a filter and a sort, on one field do not collide.
  {entity} is the root entity.  {:name} is the argument name, bound from
  the filter's args, else its default, else null.
- A sort selects the expression AS HIDDEN and orders by it.  The batch
  id-pair query keeps the hidden selects when it replaces the select; the
  batch count query applies no sorts (Filter\QueryBuilder::apply() takes
  $sort).
- Each expression is parsed with Query::getAST(), without a database,
  after the metadata.build event.  Invalid DQL, an alias without a
  placeholder, an unknown {:name}, an expression on a list or an entity
  type, and excluded filters without an expression throw
  Exception\Metadata.
- DQL takes a subquery only for comparisons, so between is applied as two
  comparisons, and the in, notin, isnull and LIKE filters DQL rejects for
  an expression are added to its excludeFilters in the metadata.
- excludeFilters and includeFilters on ComputedField limit its filters.
  The expression and excludeFilters keys are left out of the metadata of
  a field without them, so Metadata::FORMAT_VERSION is unchanged.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
@codecov

codecov Bot commented Oct 4, 2026 •

Copy link
Copy Markdown

Codecov Report

✅ All modified and coverable lines are covered by tests.
⚠️ Please upload report for BASE (14.1.x@ecaaa1d). Learn more about missing BASE report.

Additional details and impacted files
@@            Coverage Diff             @@
##             14.1.x      #318   +/-   ##
==========================================
  Coverage          ?   100.00%           
  Complexity        ?      1276           
==========================================
  Files             ?        81           
  Lines             ?      3490           
  Branches          ?         0           
==========================================
  Hits              ?      3490           
  Misses            ?         0           
  Partials          ?         0           

☔ View full report in Codecov by Harness.
📢 Have feedback on the report? Share it here.

🚀 New features to boost your workflow:
  • ❄️ Test Analytics: Detect flaky tests, report on failures, and find test suite problems.

@TomHAnderson
TomHAnderson merged commit 245ec6d into API-Skeletons:14.1.x Oct 4, 2026
13 checks passed
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.

1 participant