From e44870e7f8ceb8e755776629e76ce123330bc109 Mon Sep 17 00:00:00 2001 From: Zach Daniel Date: Thu, 28 Mar 2024 09:12:32 -0400 Subject: [PATCH 01/18] fix: properly handle non-filter aggregate filters --- lib/aggregate.ex | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/lib/aggregate.ex b/lib/aggregate.ex index a608aa6f..e85b6b4f 100644 --- a/lib/aggregate.ex +++ b/lib/aggregate.ex @@ -1048,8 +1048,7 @@ defmodule AshPostgres.Aggregate do defp has_filter?(nil), do: false defp has_filter?(%{filter: nil}), do: false defp has_filter?(%{filter: %Ash.Filter{expression: nil}}), do: false - defp has_filter?(%{filter: %Ash.Filter{}}), do: true - defp has_filter?(_), do: false + defp has_filter?(_), do: true defp has_sort?(nil), do: false defp has_sort?(%{sort: nil}), do: false From 378bcaaf70131bc7891352ffc6170321c9c32387 Mon Sep 17 00:00:00 2001 From: Zach Daniel Date: Thu, 28 Mar 2024 09:18:23 -0400 Subject: [PATCH 02/18] chore: release version v1.5.23 --- CHANGELOG.md | 9 +++++++++ mix.exs | 2 +- 2 files changed, 10 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 8ea052f5..f53edb2d 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -5,6 +5,15 @@ See [Conventional Commits](Https://conventionalcommits.org) for commit guideline +## [v1.5.23](https://github.com/ash-project/ash_postgres/compare/v1.5.22...v1.5.23) (2024-03-28) + + + + +### Bug Fixes: + +* properly handle non-filter aggregate filters + ## [v1.5.22](https://github.com/ash-project/ash_postgres/compare/v1.5.21...v1.5.22) (2024-03-20) diff --git a/mix.exs b/mix.exs index 19c0d256..6a775987 100644 --- a/mix.exs +++ b/mix.exs @@ -6,7 +6,7 @@ defmodule AshPostgres.MixProject do support, and delegates to a configured repo. """ - @version "1.5.22" + @version "1.5.23" def project do [ From 5e43a6eb37ba3799251fe9581caf344555b5b3c5 Mon Sep 17 00:00:00 2001 From: Zach Daniel Date: Mon, 22 Apr 2024 11:41:18 -0400 Subject: [PATCH 03/18] fix: make string concat work with non literal lists --- lib/expr.ex | 43 +++++++++++++++++++++++++++++++++++++-- test/calculation_test.exs | 18 ++++++++++++++++ 2 files changed, 59 insertions(+), 2 deletions(-) diff --git a/lib/expr.ex b/lib/expr.ex index 5da45abc..f2e17f23 100644 --- a/lib/expr.ex +++ b/lib/expr.ex @@ -603,7 +603,7 @@ defmodule AshPostgres.Expr do embedded?, acc, type - ) do + ) when is_list(values) do do_dynamic_expr( query, %Fragment{ @@ -620,6 +620,27 @@ defmodule AshPostgres.Expr do ) end + defp do_dynamic_expr( + query, + %StringJoin{arguments: [values, joiner], embedded?: pred_embedded?}, + bindings, + embedded?, + acc, + type + ) do + do_dynamic_expr( + query, + %Fragment{ + embedded?: pred_embedded?, + arguments: [raw: "array_to_string(", expr: values, raw: ", ", expr: joiner, raw: ")"] + }, + bindings, + embedded?, + acc, + type + ) + end + defp do_dynamic_expr( query, %StringSplit{arguments: [string, delimiter, options], embedded?: pred_embedded?}, @@ -676,7 +697,7 @@ defmodule AshPostgres.Expr do embedded?, acc, type - ) do + ) when is_list(values) do do_dynamic_expr( query, %Fragment{ @@ -697,6 +718,24 @@ defmodule AshPostgres.Expr do ) end + defp do_dynamic_expr( + query, + %StringJoin{arguments: [values], embedded?: pred_embedded?}, + bindings, + embedded?, + acc, + type + ) do + do_dynamic_expr( + query, + %StringJoin{arguments: [values, ""], embedded?: pred_embedded?}, + bindings, + embedded?, + acc, + type + ) + end + defp do_dynamic_expr( query, %StringLength{arguments: [value], embedded?: pred_embedded?}, diff --git a/test/calculation_test.exs b/test/calculation_test.exs index 3b6344de..6b8cc1d1 100644 --- a/test/calculation_test.exs +++ b/test/calculation_test.exs @@ -238,6 +238,24 @@ defmodule AshPostgres.CalculationTest do |> Api.read_one!() end + test "concat calculation can use a non-literal value" do + author = + Author + |> Ash.Changeset.new(%{first_name: "is", last_name: "match", badges: [:foo, :bar]}) + |> Api.create!() + + string_badges = + Author + |> Ash.Query.filter(id == ^author.id) + |> Ash.Query.calculate(:string_badges, expr(string_join(badges, ", ")), :string) + |> Api.read_one!() + |> Map.get(:calculations) + |> Map.get(:string_badges) + + assert string_badges == "foo, bar" + + end + test "calculations that refer to aggregates in comparison expressions can be filtered on" do Post |> Ash.Query.load(:has_future_comment) From 9e22fb0435a37bf221b3b04f961517d56aef45e8 Mon Sep 17 00:00:00 2001 From: Zach Daniel Date: Mon, 22 Apr 2024 11:41:32 -0400 Subject: [PATCH 04/18] chore: release version v1.5.24 --- CHANGELOG.md | 11 +++++++++++ mix.exs | 2 +- 2 files changed, 12 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index f53edb2d..ae90bc0e 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -5,6 +5,17 @@ See [Conventional Commits](Https://conventionalcommits.org) for commit guideline +## [v1.5.24](https://github.com/ash-project/ash_postgres/compare/v1.5.23...v1.5.24) (2024-04-22) + + + + +### Bug Fixes: + +* make string concat work with non literal lists + +* properly handle non-filter aggregate filters + ## [v1.5.23](https://github.com/ash-project/ash_postgres/compare/v1.5.22...v1.5.23) (2024-03-28) diff --git a/mix.exs b/mix.exs index 6a775987..88c72b66 100644 --- a/mix.exs +++ b/mix.exs @@ -6,7 +6,7 @@ defmodule AshPostgres.MixProject do support, and delegates to a configured repo. """ - @version "1.5.23" + @version "1.5.24" def project do [ From ab8bcc86d72fb8689b0091605d953e10af7ec2a2 Mon Sep 17 00:00:00 2001 From: Zach Daniel Date: Mon, 22 Apr 2024 20:45:34 -0400 Subject: [PATCH 05/18] fix: properly set tenant on aggregate queries --- lib/aggregate.ex | 15 ++++++++++++--- 1 file changed, 12 insertions(+), 3 deletions(-) diff --git a/lib/aggregate.ex b/lib/aggregate.ex index e85b6b4f..e8a768e5 100644 --- a/lib/aggregate.ex +++ b/lib/aggregate.ex @@ -22,6 +22,15 @@ defmodule AshPostgres.Aggregate do def add_aggregates(query, aggregates, resource, select?, source_binding, root_data) do case resource_aggregates_to_aggregates(resource, aggregates) do {:ok, aggregates} -> + tenant = + case Enum.at(aggregates, 0) do + %{context: %{tenant: tenant}} -> + tenant + + _ -> + nil + end + query = AshPostgres.DataLayer.default_bindings(query, resource) {query, aggregates} = @@ -215,7 +224,7 @@ defmodule AshPostgres.Aggregate do AshPostgres.Join.set_join_prefix( subquery, - query, + %{query | prefix: tenant}, first_relationship.destination ) else @@ -242,7 +251,7 @@ defmodule AshPostgres.Aggregate do AshPostgres.Join.set_join_prefix( subquery, - query, + %{query | prefix: tenant}, first_relationship.destination ) else @@ -266,7 +275,7 @@ defmodule AshPostgres.Aggregate do subquery = AshPostgres.Join.set_join_prefix( subquery, - query, + %{query | prefix: tenant}, first_relationship.destination ) From bdbc0e20c6c9f69eea03ff248845b93226650bb6 Mon Sep 17 00:00:00 2001 From: Zach Daniel Date: Thu, 2 May 2024 01:22:14 -0400 Subject: [PATCH 06/18] fix: properly use `ash_postgres_subquery` callback for `exists` on manual relationships --- lib/data_layer.ex | 15 +++++++++------ lib/expr.ex | 27 +++++++++++++++++++++++++-- test/calculation_test.exs | 13 ++++++------- test/manual_relationships_test.exs | 16 ++++++++++++++++ 4 files changed, 56 insertions(+), 15 deletions(-) diff --git a/lib/data_layer.ex b/lib/data_layer.ex index d5e9fc7a..b96d0168 100644 --- a/lib/data_layer.ex +++ b/lib/data_layer.ex @@ -1140,12 +1140,15 @@ defmodule AshPostgres.DataLayer do Map.get(relationship, :manual) -> {module, opts} = relationship.manual - module.ash_postgres_subquery( - opts, - 0, - 0, - base_query - ) + {:ok, subquery} = + module.ash_postgres_subquery( + opts, + 0, + 0, + base_query + ) + + subquery Map.get(relationship, :no_attributes?) -> base_query diff --git a/lib/expr.ex b/lib/expr.ex index f2e17f23..984b5dc8 100644 --- a/lib/expr.ex +++ b/lib/expr.ex @@ -603,7 +603,8 @@ defmodule AshPostgres.Expr do embedded?, acc, type - ) when is_list(values) do + ) + when is_list(values) do do_dynamic_expr( query, %Fragment{ @@ -697,7 +698,8 @@ defmodule AshPostgres.Expr do embedded?, acc, type - ) when is_list(values) do + ) + when is_list(values) do do_dynamic_expr( query, %Fragment{ @@ -1565,6 +1567,27 @@ defmodule AshPostgres.Expr do cond do Map.get(first_relationship, :manual) -> + {module, opts} = first_relationship.manual + + source_binding = + ref_binding( + %Ref{ + attribute: + Ash.Resource.Info.attribute(resource, first_relationship.source_attribute), + relationship_path: at_path, + resource: resource + }, + bindings + ) + + {:ok, subquery} = + module.ash_postgres_subquery( + opts, + source_binding, + 0, + subquery + ) + subquery Map.get(first_relationship, :no_attributes?) -> diff --git a/test/calculation_test.exs b/test/calculation_test.exs index 6b8cc1d1..412412a1 100644 --- a/test/calculation_test.exs +++ b/test/calculation_test.exs @@ -245,15 +245,14 @@ defmodule AshPostgres.CalculationTest do |> Api.create!() string_badges = - Author - |> Ash.Query.filter(id == ^author.id) - |> Ash.Query.calculate(:string_badges, expr(string_join(badges, ", ")), :string) - |> Api.read_one!() - |> Map.get(:calculations) - |> Map.get(:string_badges) + Author + |> Ash.Query.filter(id == ^author.id) + |> Ash.Query.calculate(:string_badges, expr(string_join(badges, ", ")), :string) + |> Api.read_one!() + |> Map.get(:calculations) + |> Map.get(:string_badges) assert string_badges == "foo, bar" - end test "calculations that refer to aggregates in comparison expressions can be filtered on" do diff --git a/test/manual_relationships_test.exs b/test/manual_relationships_test.exs index 7b1b8d23..7aa900a3 100644 --- a/test/manual_relationships_test.exs +++ b/test/manual_relationships_test.exs @@ -15,6 +15,22 @@ defmodule AshPostgres.Test.ManualRelationshipsTest do Api.load!(post, :count_of_comments_containing_title) end + test "exists can be used" do + post = + Post + |> Ash.Changeset.new(%{title: "title"}) + |> Api.create!() + + Comment + |> Ash.Changeset.new(%{title: "title2"}) + |> Api.create!() + + assert [] = + Post + |> Ash.Query.filter(exists(comments_containing_title, true)) + |> Api.read!() + end + test "aggregates can be loaded with data" do post = Post From 991510b87fac919588c8b6216ad6a970b37134a4 Mon Sep 17 00:00:00 2001 From: Zach Daniel Date: Thu, 2 May 2024 01:22:39 -0400 Subject: [PATCH 07/18] chore: release version v1.5.25 --- CHANGELOG.md | 15 +++++++++++++++ mix.exs | 2 +- 2 files changed, 16 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index ae90bc0e..91e36f9f 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -5,6 +5,21 @@ See [Conventional Commits](Https://conventionalcommits.org) for commit guideline +## [v1.5.25](https://github.com/ash-project/ash_postgres/compare/v1.5.24...v1.5.25) (2024-05-02) + + + + +### Bug Fixes: + +* properly use `ash_postgres_subquery` callback for `exists` on manual relationships + +* properly set tenant on aggregate queries + +* make string concat work with non literal lists + +* properly handle non-filter aggregate filters + ## [v1.5.24](https://github.com/ash-project/ash_postgres/compare/v1.5.23...v1.5.24) (2024-04-22) diff --git a/mix.exs b/mix.exs index 88c72b66..63280489 100644 --- a/mix.exs +++ b/mix.exs @@ -6,7 +6,7 @@ defmodule AshPostgres.MixProject do support, and delegates to a configured repo. """ - @version "1.5.24" + @version "1.5.25" def project do [ From 69d8a732f0c8037b8f8835e17f76700da91c297e Mon Sep 17 00:00:00 2001 From: Zach Daniel Date: Tue, 7 May 2024 20:01:29 -0400 Subject: [PATCH 08/18] fix: don't use `fragment("1")` because ecto requires a proper source --- lib/expr.ex | 2 +- test/manual_relationships_test.exs | 7 +++---- 2 files changed, 4 insertions(+), 5 deletions(-) diff --git a/lib/expr.ex b/lib/expr.ex index 984b5dc8..f7a099e0 100644 --- a/lib/expr.ex +++ b/lib/expr.ex @@ -1561,7 +1561,7 @@ defmodule AshPostgres.Expr do on_subquery: fn subquery -> subquery = Ecto.Query.from(row in Ecto.Query.exclude(subquery, :select), - select: fragment("1") + select: row ) |> Map.put(:__ash_bindings__, subquery.__ash_bindings__) diff --git a/test/manual_relationships_test.exs b/test/manual_relationships_test.exs index 7aa900a3..a1956db1 100644 --- a/test/manual_relationships_test.exs +++ b/test/manual_relationships_test.exs @@ -16,10 +16,9 @@ defmodule AshPostgres.Test.ManualRelationshipsTest do end test "exists can be used" do - post = - Post - |> Ash.Changeset.new(%{title: "title"}) - |> Api.create!() + Post + |> Ash.Changeset.new(%{title: "title"}) + |> Api.create!() Comment |> Ash.Changeset.new(%{title: "title2"}) From ca5ae065ce298e2f6773bb1061c17c1c14b8aa78 Mon Sep 17 00:00:00 2001 From: Zach Daniel Date: Tue, 7 May 2024 20:02:10 -0400 Subject: [PATCH 09/18] chore: release version v1.5.26 --- CHANGELOG.md | 17 +++++++++++++++++ mix.exs | 2 +- 2 files changed, 18 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 91e36f9f..fb731b64 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -5,6 +5,23 @@ See [Conventional Commits](Https://conventionalcommits.org) for commit guideline +## [v1.5.26](https://github.com/ash-project/ash_postgres/compare/v1.5.25...v1.5.26) (2024-05-08) + + + + +### Bug Fixes: + +* don't use `fragment("1")` because ecto requires a proper source + +* properly use `ash_postgres_subquery` callback for `exists` on manual relationships + +* properly set tenant on aggregate queries + +* make string concat work with non literal lists + +* properly handle non-filter aggregate filters + ## [v1.5.25](https://github.com/ash-project/ash_postgres/compare/v1.5.24...v1.5.25) (2024-05-02) diff --git a/mix.exs b/mix.exs index 63280489..021cd30e 100644 --- a/mix.exs +++ b/mix.exs @@ -6,7 +6,7 @@ defmodule AshPostgres.MixProject do support, and delegates to a configured repo. """ - @version "1.5.25" + @version "1.5.26" def project do [ From 57173aa48c3f8c1ca63acfd918392f4bf57fb3cb Mon Sep 17 00:00:00 2001 From: Zach Daniel Date: Tue, 28 May 2024 00:02:20 -0400 Subject: [PATCH 10/18] fix: ensure we reselect all changing fields --- lib/data_layer.ex | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-) diff --git a/lib/data_layer.ex b/lib/data_layer.ex index b96d0168..c5633ed8 100644 --- a/lib/data_layer.ex +++ b/lib/data_layer.ex @@ -2614,7 +2614,11 @@ defmodule AshPostgres.DataLayer do source = resolve_source(resource, changeset) query = from(row in source, as: ^0) |> default_bindings(resource, changeset.context) - select = Keyword.keys(changeset.atomics) ++ Ash.Resource.Info.primary_key(resource) + select = + Keyword.keys(changeset.atomics) ++ + Ash.Resource.Info.primary_key(resource) ++ Map.keys(changeset.attributes) + + IO.inspect(select) case bulk_updatable_query(query, resource, changeset.atomics, changeset.context) do {:error, error} -> @@ -2638,9 +2642,6 @@ defmodule AshPostgres.DataLayer do {:ok, query} -> repo_opts = repo_opts(changeset.timeout, changeset.tenant, changeset.resource) - repo_opts = - Keyword.put(repo_opts, :returning, Keyword.keys(changeset.atomics)) - repo = dynamic_repo(resource, changeset) result = @@ -2663,7 +2664,7 @@ defmodule AshPostgres.DataLayer do {1, [result]} -> record = changeset.data - |> Map.merge(changeset.attributes) + |> Map.merge(Map.take(result, Map.keys(changeset.attributes))) |> Map.merge(Map.take(result, Keyword.keys(changeset.atomics))) maybe_update_tenant(resource, changeset, record) From e9e946c63eadc607f5169441ca36d4ca7aaa5c27 Mon Sep 17 00:00:00 2001 From: Zach Daniel Date: Tue, 28 May 2024 00:03:04 -0400 Subject: [PATCH 11/18] chore: release version v1.5.27 --- CHANGELOG.md | 19 +++++++++++++++++++ mix.exs | 2 +- 2 files changed, 20 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index fb731b64..379ae09c 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -5,6 +5,25 @@ See [Conventional Commits](Https://conventionalcommits.org) for commit guideline +## [v1.5.27](https://github.com/ash-project/ash_postgres/compare/v1.5.26...v1.5.27) (2024-05-28) + + + + +### Bug Fixes: + +* ensure we reselect all changing fields + +* don't use `fragment("1")` because ecto requires a proper source + +* properly use `ash_postgres_subquery` callback for `exists` on manual relationships + +* properly set tenant on aggregate queries + +* make string concat work with non literal lists + +* properly handle non-filter aggregate filters + ## [v1.5.26](https://github.com/ash-project/ash_postgres/compare/v1.5.25...v1.5.26) (2024-05-08) diff --git a/mix.exs b/mix.exs index 021cd30e..ea2bb515 100644 --- a/mix.exs +++ b/mix.exs @@ -6,7 +6,7 @@ defmodule AshPostgres.MixProject do support, and delegates to a configured repo. """ - @version "1.5.26" + @version "1.5.27" def project do [ From 064abcd09eb43f06db588730ac9529008554dd40 Mon Sep 17 00:00:00 2001 From: Zach Daniel Date: Tue, 28 May 2024 10:14:47 -0400 Subject: [PATCH 12/18] fix: remove erroneous IO.inspect --- lib/data_layer.ex | 2 -- 1 file changed, 2 deletions(-) diff --git a/lib/data_layer.ex b/lib/data_layer.ex index c5633ed8..aa872dfd 100644 --- a/lib/data_layer.ex +++ b/lib/data_layer.ex @@ -2618,8 +2618,6 @@ defmodule AshPostgres.DataLayer do Keyword.keys(changeset.atomics) ++ Ash.Resource.Info.primary_key(resource) ++ Map.keys(changeset.attributes) - IO.inspect(select) - case bulk_updatable_query(query, resource, changeset.atomics, changeset.context) do {:error, error} -> {:error, error} From 20476feb0edeb40bfd0e8f6b96653e74a3a73301 Mon Sep 17 00:00:00 2001 From: Zach Daniel Date: Tue, 28 May 2024 10:16:51 -0400 Subject: [PATCH 13/18] chore: release version v1.5.28 --- CHANGELOG.md | 21 +++++++++++++++++++++ mix.exs | 2 +- 2 files changed, 22 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 379ae09c..ea9ac387 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -5,6 +5,27 @@ See [Conventional Commits](Https://conventionalcommits.org) for commit guideline +## [v1.5.28](https://github.com/ash-project/ash_postgres/compare/v1.5.27...v1.5.28) (2024-05-28) + + + + +### Bug Fixes: + +* remove erroneous IO.inspect + +* ensure we reselect all changing fields + +* don't use `fragment("1")` because ecto requires a proper source + +* properly use `ash_postgres_subquery` callback for `exists` on manual relationships + +* properly set tenant on aggregate queries + +* make string concat work with non literal lists + +* properly handle non-filter aggregate filters + ## [v1.5.27](https://github.com/ash-project/ash_postgres/compare/v1.5.26...v1.5.27) (2024-05-28) diff --git a/mix.exs b/mix.exs index ea2bb515..288b6d6d 100644 --- a/mix.exs +++ b/mix.exs @@ -6,7 +6,7 @@ defmodule AshPostgres.MixProject do support, and delegates to a configured repo. """ - @version "1.5.27" + @version "1.5.28" def project do [ From e28fd1d221c9b0d949e5d13b3074343d4178673d Mon Sep 17 00:00:00 2001 From: Zach Daniel Date: Fri, 12 Jul 2024 07:58:26 -0400 Subject: [PATCH 14/18] fix: ensure we don't pass `nil` to `Ecto.Query.where` --- lib/data_layer.ex | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/lib/data_layer.ex b/lib/data_layer.ex index aa872dfd..9ebe7ff9 100644 --- a/lib/data_layer.ex +++ b/lib/data_layer.ex @@ -3197,6 +3197,13 @@ defmodule AshPostgres.DataLayer do |> Enum.reduce(query, fn filter, query -> {dynamic, acc} = AshPostgres.Expr.dynamic_expr(query, filter, query.__ash_bindings__) + dynamic = + if is_nil(dynamic) do + false + else + dynamic + end + query |> Ecto.Query.where(^dynamic) |> merge_expr_accumulator(acc) From 07c13892d7bcd9360df13c1b17ff1e7aa6bf6bcb Mon Sep 17 00:00:00 2001 From: Zach Daniel Date: Fri, 12 Jul 2024 07:59:40 -0400 Subject: [PATCH 15/18] chore: release version v1.5.29 --- CHANGELOG.md | 23 +++++++++++++++++++++++ mix.exs | 2 +- 2 files changed, 24 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index ea9ac387..51d0f62b 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -5,6 +5,29 @@ See [Conventional Commits](Https://conventionalcommits.org) for commit guideline +## [v1.5.29](https://github.com/ash-project/ash_postgres/compare/v1.5.28...v1.5.29) (2024-07-12) + + + + +### Bug Fixes: + +* ensure we don't pass `nil` to `Ecto.Query.where` + +* remove erroneous IO.inspect + +* ensure we reselect all changing fields + +* don't use `fragment("1")` because ecto requires a proper source + +* properly use `ash_postgres_subquery` callback for `exists` on manual relationships + +* properly set tenant on aggregate queries + +* make string concat work with non literal lists + +* properly handle non-filter aggregate filters + ## [v1.5.28](https://github.com/ash-project/ash_postgres/compare/v1.5.27...v1.5.28) (2024-05-28) diff --git a/mix.exs b/mix.exs index 288b6d6d..426c8a87 100644 --- a/mix.exs +++ b/mix.exs @@ -6,7 +6,7 @@ defmodule AshPostgres.MixProject do support, and delegates to a configured repo. """ - @version "1.5.28" + @version "1.5.29" def project do [ From 84989e74fea6b430b9610e060d161dcec4ec9b51 Mon Sep 17 00:00:00 2001 From: Zach Daniel Date: Fri, 12 Jul 2024 10:17:16 -0400 Subject: [PATCH 16/18] fix: ensure `nil` filters aren't ever split --- lib/data_layer.ex | 38 ++++++++++++++++++++++---------------- 1 file changed, 22 insertions(+), 16 deletions(-) diff --git a/lib/data_layer.ex b/lib/data_layer.ex index 9ebe7ff9..2b640af5 100644 --- a/lib/data_layer.ex +++ b/lib/data_layer.ex @@ -371,7 +371,6 @@ defmodule AshPostgres.DataLayer do ] } - alias Ash.Filter alias Ash.Query.{BooleanExpression, Not, Ref} @behaviour Ash.DataLayer @@ -3211,29 +3210,36 @@ defmodule AshPostgres.DataLayer do end @doc false - def split_and_statements(%Filter{expression: expression}) do - split_and_statements(expression) + def split_and_statements(nil), do: [] + def split_and_statements(other), do: do_split_statements(other) + + def do_split_statements(%Ash.Filter{expression: expression}) do + do_split_statements(expression) end - def split_and_statements(%BooleanExpression{op: :and, left: left, right: right}) do - split_and_statements(left) ++ split_and_statements(right) + def do_split_statements( + %Not{ + expression: %BooleanExpression{op: :or, left: left, right: right} + } + ) do + do_split_statements( + %BooleanExpression{ + op: :and, + left: %Not{expression: left}, + right: %Not{expression: right} + } + ) end - def split_and_statements(%Not{expression: %Not{expression: expression}}) do - split_and_statements(expression) + def do_split_statements(%Not{expression: %Not{expression: expression}}) do + do_split_statements(expression) end - def split_and_statements(%Not{ - expression: %BooleanExpression{op: :or, left: left, right: right} - }) do - split_and_statements(%BooleanExpression{ - op: :and, - left: %Not{expression: left}, - right: %Not{expression: right} - }) + def do_split_statements(%BooleanExpression{op: :and, left: left, right: right}) do + do_split_statements(left) ++ do_split_statements(right) end - def split_and_statements(other), do: [other] + def do_split_statements(other), do: [other] @doc false def add_binding(query, data, additional_bindings \\ 0) do From 11a43edae49730f0503b68097837048269bd452f Mon Sep 17 00:00:00 2001 From: Zach Daniel Date: Fri, 12 Jul 2024 10:17:33 -0400 Subject: [PATCH 17/18] chore: release version v1.5.30 --- CHANGELOG.md | 25 +++++++++++++++++++++++++ mix.exs | 2 +- 2 files changed, 26 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 51d0f62b..b87846a0 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -5,6 +5,31 @@ See [Conventional Commits](Https://conventionalcommits.org) for commit guideline +## [v1.5.30](https://github.com/ash-project/ash_postgres/compare/v1.5.29...v1.5.30) (2024-07-12) + + + + +### Bug Fixes: + +* ensure `nil` filters aren't ever split + +* ensure we don't pass `nil` to `Ecto.Query.where` + +* remove erroneous IO.inspect + +* ensure we reselect all changing fields + +* don't use `fragment("1")` because ecto requires a proper source + +* properly use `ash_postgres_subquery` callback for `exists` on manual relationships + +* properly set tenant on aggregate queries + +* make string concat work with non literal lists + +* properly handle non-filter aggregate filters + ## [v1.5.29](https://github.com/ash-project/ash_postgres/compare/v1.5.28...v1.5.29) (2024-07-12) diff --git a/mix.exs b/mix.exs index 426c8a87..8e090ecb 100644 --- a/mix.exs +++ b/mix.exs @@ -6,7 +6,7 @@ defmodule AshPostgres.MixProject do support, and delegates to a configured repo. """ - @version "1.5.29" + @version "1.5.30" def project do [ From 9284c7a28a3fdc64c8b8cd11b8e0fbe0b8376232 Mon Sep 17 00:00:00 2001 From: Zach Daniel Date: Fri, 12 Jul 2024 19:12:55 -0400 Subject: [PATCH 18/18] chore: skip splitting `nil` filter expr --- lib/data_layer.ex | 1 + 1 file changed, 1 insertion(+) diff --git a/lib/data_layer.ex b/lib/data_layer.ex index 2b640af5..2114d326 100644 --- a/lib/data_layer.ex +++ b/lib/data_layer.ex @@ -3211,6 +3211,7 @@ defmodule AshPostgres.DataLayer do @doc false def split_and_statements(nil), do: [] + def split_and_statements(%Ash.Filter{expression: nil}), do: [] def split_and_statements(other), do: do_split_statements(other) def do_split_statements(%Ash.Filter{expression: expression}) do