View Source Aggregates

Aggregates in Ash allow for retrieving summary information over groups of related data. A simple example might be to show the "count of published posts for a user".

declaring-aggregates-on-a-resource

Declaring aggregates on a resource

Example:

aggregates do
  count :count_of_posts, :posts do
    filter expr(published == true)
  end
end

The available aggregate types are:

  • count - counts related items meeting the criteria
  • first - gets the first related value matching the criteria. Must specify the field to get.
  • sum - sums the related items meeting the criteria. Must specify the field to sum.
  • list - lists the related values. Must specify the field to list.

See the docs on {{link:ash:dsl:aggregates/aggregate}} for more information.

The aggregates declared on a resource allow for declaring a set of named aggregates that can be used by extensions.

As an escape hatch, they can also be loaded in the query using Ash.Query.load/2, or after the fact using Ash.Api.load/3. Aggregates declared on the resource will be keys in the resource's struct.

custom-aggregates-in-the-query

Custom aggregates in the query

Example:

User
|> Ash.Query.new()
|> Ash.Query.aggregate(:count_of_posts, :count, :posts, filter: [published: true])

See the documentation for Ash.Query.aggregate/4 for more information.