mirror of
https://github.com/ash-project/ash_postgres.git
synced 2024-09-20 13:33:50 +12:00
37cc01957d
* WIP * chore: fix mix.lock merge issues * improvement: upgrade to 3.0 * chore: remove `repo.to_tenant` * chore: continue removal of unnecessary helper * chore: use `Ash.ToTenant`
180 lines
4.4 KiB
Elixir
180 lines
4.4 KiB
Elixir
defmodule AshPostgres.DistinctTest do
|
|
@moduledoc false
|
|
use AshPostgres.RepoCase, async: false
|
|
alias AshPostgres.Test.Post
|
|
|
|
require Ash.Query
|
|
|
|
setup do
|
|
Post
|
|
|> Ash.Changeset.for_create(:create, %{title: "title", score: 1})
|
|
|> Ash.create!()
|
|
|
|
Post
|
|
|> Ash.Changeset.for_create(:create, %{title: "title", score: 1})
|
|
|> Ash.create!()
|
|
|
|
Post
|
|
|> Ash.Changeset.for_create(:create, %{title: "foo", score: 2})
|
|
|> Ash.create!()
|
|
|
|
Post
|
|
|> Ash.Changeset.for_create(:create, %{title: "foo", score: 2})
|
|
|> Ash.create!()
|
|
|
|
:ok
|
|
end
|
|
|
|
test "records returned are distinct on the provided field" do
|
|
results =
|
|
Post
|
|
|> Ash.Query.distinct(:title)
|
|
|> Ash.Query.sort(:title)
|
|
|> Ash.read!()
|
|
|
|
assert [%{title: "foo"}, %{title: "title"}] = results
|
|
end
|
|
|
|
test "distinct pairs well with sort" do
|
|
results =
|
|
Post
|
|
|> Ash.Query.distinct(:title)
|
|
|> Ash.Query.sort(title: :desc)
|
|
|> Ash.read!()
|
|
|
|
assert [%{title: "title"}, %{title: "foo"}] = results
|
|
end
|
|
|
|
test "distinct pairs well with sort that does not match the distinct" do
|
|
results =
|
|
Post
|
|
|> Ash.Query.distinct(:title)
|
|
|> Ash.Query.sort(id: :desc)
|
|
|> Ash.Query.limit(3)
|
|
|> Ash.read!()
|
|
|
|
assert [_, _] = results
|
|
end
|
|
|
|
test "distinct pairs well with sort that does not match the distinct using a limit" do
|
|
results =
|
|
Post
|
|
|> Ash.Query.distinct(:title)
|
|
|> Ash.Query.sort(id: :desc)
|
|
|> Ash.Query.limit(3)
|
|
|> Ash.read!()
|
|
|
|
assert [_, _] = results
|
|
end
|
|
|
|
test "distinct pairs well with sort that does not match the distinct using a limit #2" do
|
|
results =
|
|
Post
|
|
|> Ash.Query.distinct(:title)
|
|
|> Ash.Query.sort(id: :desc)
|
|
|> Ash.Query.limit(1)
|
|
|> Ash.read!()
|
|
|
|
assert [_] = results
|
|
end
|
|
|
|
test "distinct can use calculations sort that does not match the distinct using a limit #2" do
|
|
results =
|
|
Post
|
|
|> Ash.Query.distinct(:negative_score)
|
|
|> Ash.Query.sort(:negative_score)
|
|
|> Ash.Query.load(:negative_score)
|
|
|> Ash.read!()
|
|
|
|
assert [
|
|
%{title: "foo", negative_score: -2},
|
|
%{title: "title", negative_score: -1}
|
|
] = results
|
|
|
|
results =
|
|
Post
|
|
|> Ash.Query.distinct(:negative_score)
|
|
|> Ash.Query.sort(negative_score: :desc)
|
|
|> Ash.Query.load(:negative_score)
|
|
|> Ash.read!()
|
|
|
|
assert [
|
|
%{title: "title", negative_score: -1},
|
|
%{title: "foo", negative_score: -2}
|
|
] = results
|
|
|
|
results =
|
|
Post
|
|
|> Ash.Query.distinct(:negative_score)
|
|
|> Ash.Query.sort(:title)
|
|
|> Ash.Query.load(:negative_score)
|
|
|> Ash.read!()
|
|
|
|
assert [
|
|
%{title: "foo", negative_score: -2},
|
|
%{title: "title", negative_score: -1}
|
|
] = results
|
|
end
|
|
|
|
test "distinct, join filters and sort can be combined" do
|
|
Post
|
|
|> Ash.Changeset.for_create(:create, %{title: "a", score: 2})
|
|
|> Ash.create!()
|
|
|
|
Post
|
|
|> Ash.Changeset.for_create(:create, %{title: "a", score: 1})
|
|
|> Ash.create!()
|
|
|
|
assert [] =
|
|
Post
|
|
|> Ash.Query.distinct(:negative_score)
|
|
|> Ash.Query.filter(author.first_name == "a")
|
|
|> Ash.Query.sort(:negative_score)
|
|
|> Ash.read!()
|
|
end
|
|
|
|
test "distinct sort is applied" do
|
|
Post
|
|
|> Ash.Changeset.for_create(:create, %{title: "a", score: 2})
|
|
|> Ash.create!()
|
|
|
|
Post
|
|
|> Ash.Changeset.for_create(:create, %{title: "a", score: 1})
|
|
|> Ash.create!()
|
|
|
|
results =
|
|
Post
|
|
|> Ash.Query.distinct(:negative_score)
|
|
|> Ash.Query.distinct_sort(:title)
|
|
|> Ash.Query.sort(:negative_score)
|
|
|> Ash.Query.load(:negative_score)
|
|
|> Ash.read!()
|
|
|
|
assert [
|
|
%{title: "a", negative_score: -2},
|
|
%{title: "a", negative_score: -1}
|
|
] = results
|
|
|
|
results =
|
|
Post
|
|
|> Ash.Query.distinct(:negative_score)
|
|
|> Ash.Query.distinct_sort(title: :desc)
|
|
|> Ash.Query.sort(:negative_score)
|
|
|> Ash.Query.load(:negative_score)
|
|
|> Ash.read!()
|
|
|
|
assert [
|
|
%{title: "foo", negative_score: -2},
|
|
%{title: "title", negative_score: -1}
|
|
] = results
|
|
end
|
|
|
|
test "distinct used on it's own" do
|
|
results =
|
|
Post
|
|
|> Ash.Query.distinct(:title)
|
|
|> Ash.read!()
|
|
|
|
assert [_, _] = results
|
|
end
|
|
end
|