Skip to content

Commit f24bb36

Browse files
committed
fix: ensure calculations are selected on aggregate subqueries
1 parent 90ce6b7 commit f24bb36

4 files changed

Lines changed: 24 additions & 4 deletions

File tree

lib/aggregate.ex

Lines changed: 12 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -2504,7 +2504,10 @@ defmodule AshSql.Aggregate do
25042504
def wrap_in_subquery_for_aggregates(query) do
25052505
resource = query.__ash_bindings__.resource
25062506
selected_by_default = Ash.Resource.Info.selected_by_default_attribute_names(resource)
2507-
selected_fields = extract_selected_fields(query, resource, selected_by_default)
2507+
2508+
selected_fields =
2509+
query.__ash_bindings__[:select] ||
2510+
extract_selected_fields(query, resource, selected_by_default)
25082511

25092512
all_attr_names =
25102513
resource
@@ -2541,7 +2544,14 @@ defmodule AshSql.Aggregate do
25412544
subquery_query =
25422545
from(row in subquery(query_with_all_attrs),
25432546
as: ^query.__ash_bindings__.root_binding,
2544-
select: struct(row, ^selected_fields)
2547+
select:
2548+
struct(
2549+
row,
2550+
^Enum.concat(
2551+
selected_fields,
2552+
query.__ash_bindings__[:select_calculations] || []
2553+
)
2554+
)
25452555
)
25462556

25472557
bindings_without_aggregates =
@@ -2560,7 +2570,6 @@ defmodule AshSql.Aggregate do
25602570
Map.put(subquery_query, :__ash_bindings__, new_bindings)
25612571
end
25622572

2563-
# Extract the fields that are actually selected (respects `take` clause)
25642573
defp extract_selected_fields(
25652574
%{select: %Ecto.Query.SelectExpr{expr: expr, take: take}},
25662575
resource,

lib/calculation.ex

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -211,6 +211,7 @@ defmodule AshSql.Calculation do
211211
)
212212
end
213213

214-
Ecto.Query.select_merge(query, ^calcs)
214+
query = Ecto.Query.select_merge(query, ^calcs)
215+
put_in(query.__ash_bindings__[:select_calculations], Map.keys(calcs))
215216
end
216217
end

lib/distinct.ex

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -86,6 +86,14 @@ defmodule AshSql.Distinct do
8686
fn ash_bindings ->
8787
ash_bindings
8888
|> Map.put(:__order__?, query.__ash_bindings__[:__order__?] || false)
89+
|> Map.put(
90+
:select_calculations,
91+
query.__ash_bindings__[:select_calculations]
92+
)
93+
|> Map.put(
94+
:select,
95+
query.__ash_bindings__[:select]
96+
)
8997
|> Map.update(
9098
:calculations_require_rewrite,
9199
calculations_require_rewrite,

lib/query.ex

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -324,6 +324,8 @@ defmodule AshSql.Query do
324324
%{
325325
calculations_require_rewrite: calculations_require_rewrite,
326326
aggregates_require_rewrite: aggregates_require_rewrite,
327+
select: query.__ash_bindings__[:select],
328+
select_calculations: query.__ash_bindings__[:select_calculations],
327329
load_aggregates: query.__ash_bindings__[:load_aggregates]
328330
},
329331
fn _, v1, v2 -> Map.merge(v1, v2) end

0 commit comments

Comments
 (0)