Aggregates causing error in AshGraphQL

Orders have many OrderItems have many OrderItemModifiers

OrderItem and OrderItemModifier both have attributes of quantity and price

I want Order to be able to aggregate/calculate the total for the order.

First I looked at Aggregates, specifically at sum, but since I need to do multiplication I thought maybe a Calculation would be needed. I’d like to do it as an expression so that Postgres is doing the calculation/aggregation and not Elixir code.

Update: I think I figured this out, Calculations and Aggregates are not an either or thing where if Aggregates don’t work use Calculations, you can also build up complex logic by combing simple calculations and Aggregates, I think…

I still have an error in GraphQL with one of the Aggregates, so I’m going to put my solution here and see if there’s an issue with it:

OrderItemModifier:

  calculations do
    calculate :total, :decimal, expr(price * quantity)
  end

OrderItem:

  calculations do
    calculate :subtotal, :decimal, expr(price * quantity + modifiers_total)
  end

  aggregates do
    sum :modifiers_total, :modifiers, :total
  end

Order:

  aggregates do
    sum :subtotal, :order_items, :sub_total
    sum :tax_total, :order_taxes, :percentage
  end

  calculations do
    calculate :total, :decimal, expr(subtotal * tax_total)
  end

It could just be a typo somewhere (GraphQL errors like this are typically basic Ash errors that don’t get caught), but I’m getting this error from AshGraphQL after trying to compile this new code:

== Compilation error in file lib/point_of_sale/schema.ex ==
** (UndefinedFunctionError) function nil.embedded?/0 is undefined. If you are using the dot syntax, such as module.function(), make sure the left-hand side of the dot is a module atom
nil.embedded?()
(ash_graphql 0.26.9) lib/resource/resource.ex:2473: AshGraphql.Resource.filterable?/2
(elixir 1.16.1) lib/enum.ex:4277: Enum.filter_list/2
(ash_graphql 0.26.9) lib/resource/resource.ex:2386: AshGraphql.Resource.aggregate_filter_fields/2
(ash_graphql 0.26.9) lib/resource/resource.ex:2352: AshGraphql.Resource.resource_filter_fields/2
(ash_graphql 0.26.9) lib/resource/resource.ex:1283: AshGraphql.Resource.args/5
(ash_graphql 0.26.9) lib/resource/resource.ex:473: anonymous fn/6 in AshGraphql.Resource.queries/5
(elixir 1.16.1) lib/enum.ex:1700: Enum.“-map/2-lists^map/1-1-”/2

LOL, indeed it was a typo:

:sub_total in the Order aggregate :subtotal should be :subtotal

Now to test if this chain of calculations and aggregates works.

1 Like

We should definitely make that errror better, can you open an issue?

:saluting_face::saluting_face::saluting_face::saluting_face::saluting_face::saluting_face:

1 Like

Logged here: Better error for typos in Aggregates when using AshGraphQL · Issue #115 · ash-project/ash_graphql · GitHub

1 Like