mirror of
https://github.com/ash-project/ash_sqlite.git
synced 2024-09-20 05:13:19 +12:00
176 lines
4.6 KiB
Elixir
176 lines
4.6 KiB
Elixir
|
defmodule AshSqlite.SortTest do
|
||
|
@moduledoc false
|
||
|
use AshSqlite.RepoCase, async: false
|
||
|
alias AshSqlite.Test.{Api, Comment, Post, PostLink}
|
||
|
|
||
|
require Ash.Query
|
||
|
|
||
|
test "multi-column sorts work" do
|
||
|
Post
|
||
|
|> Ash.Changeset.new(%{title: "aaa", score: 0})
|
||
|
|> Api.create!()
|
||
|
|
||
|
Post
|
||
|
|> Ash.Changeset.new(%{title: "aaa", score: 1})
|
||
|
|> Api.create!()
|
||
|
|
||
|
Post
|
||
|
|> Ash.Changeset.new(%{title: "bbb", score: 0})
|
||
|
|> Api.create!()
|
||
|
|
||
|
assert [
|
||
|
%{title: "aaa", score: 0},
|
||
|
%{title: "aaa", score: 1},
|
||
|
%{title: "bbb"}
|
||
|
] =
|
||
|
Api.read!(
|
||
|
Post
|
||
|
|> Ash.Query.sort(title: :asc, score: :asc)
|
||
|
)
|
||
|
end
|
||
|
|
||
|
test "multi-column sorts work on inclusion" do
|
||
|
post =
|
||
|
Post
|
||
|
|> Ash.Changeset.new(%{title: "aaa", score: 0})
|
||
|
|> Api.create!()
|
||
|
|
||
|
Post
|
||
|
|> Ash.Changeset.new(%{title: "aaa", score: 1})
|
||
|
|> Api.create!()
|
||
|
|
||
|
Post
|
||
|
|> Ash.Changeset.new(%{title: "bbb", score: 0})
|
||
|
|> Api.create!()
|
||
|
|
||
|
Comment
|
||
|
|> Ash.Changeset.new(%{title: "aaa", likes: 1})
|
||
|
|> Ash.Changeset.manage_relationship(:post, post, type: :append_and_remove)
|
||
|
|> Api.create!()
|
||
|
|
||
|
Comment
|
||
|
|> Ash.Changeset.new(%{title: "bbb", likes: 1})
|
||
|
|> Ash.Changeset.manage_relationship(:post, post, type: :append_and_remove)
|
||
|
|> Api.create!()
|
||
|
|
||
|
Comment
|
||
|
|> Ash.Changeset.new(%{title: "aaa", likes: 2})
|
||
|
|> Ash.Changeset.manage_relationship(:post, post, type: :append_and_remove)
|
||
|
|> Api.create!()
|
||
|
|
||
|
posts =
|
||
|
Post
|
||
|
|> Ash.Query.load(
|
||
|
comments:
|
||
|
Comment
|
||
|
|> Ash.Query.sort([:title, :likes])
|
||
|
|> Ash.Query.select([:title, :likes])
|
||
|
|> Ash.Query.limit(1)
|
||
|
)
|
||
|
|> Ash.Query.sort([:title, :score])
|
||
|
|> Api.read!()
|
||
|
|
||
|
assert [
|
||
|
%{title: "aaa", comments: [%{title: "aaa"}]},
|
||
|
%{title: "aaa"},
|
||
|
%{title: "bbb"}
|
||
|
] = posts
|
||
|
end
|
||
|
|
||
|
test "multicolumn sort works with a select statement" do
|
||
|
Post
|
||
|
|> Ash.Changeset.new(%{title: "aaa", score: 0})
|
||
|
|> Api.create!()
|
||
|
|
||
|
Post
|
||
|
|> Ash.Changeset.new(%{title: "aaa", score: 1})
|
||
|
|> Api.create!()
|
||
|
|
||
|
Post
|
||
|
|> Ash.Changeset.new(%{title: "bbb", score: 0})
|
||
|
|> Api.create!()
|
||
|
|
||
|
assert [
|
||
|
%{title: "aaa", score: 0},
|
||
|
%{title: "aaa", score: 1},
|
||
|
%{title: "bbb"}
|
||
|
] =
|
||
|
Api.read!(
|
||
|
Post
|
||
|
|> Ash.Query.sort(title: :asc, score: :asc)
|
||
|
|> Ash.Query.select([:title, :score])
|
||
|
)
|
||
|
end
|
||
|
|
||
|
test "sorting when joining to a many to many relationship sorts properly" do
|
||
|
post1 =
|
||
|
Post
|
||
|
|> Ash.Changeset.new(%{title: "aaa", score: 0})
|
||
|
|> Api.create!()
|
||
|
|
||
|
post2 =
|
||
|
Post
|
||
|
|> Ash.Changeset.new(%{title: "bbb", score: 1})
|
||
|
|> Api.create!()
|
||
|
|
||
|
post3 =
|
||
|
Post
|
||
|
|> Ash.Changeset.new(%{title: "ccc", score: 0})
|
||
|
|> Api.create!()
|
||
|
|
||
|
PostLink
|
||
|
|> Ash.Changeset.new()
|
||
|
|> Ash.Changeset.manage_relationship(:source_post, post1, type: :append)
|
||
|
|> Ash.Changeset.manage_relationship(:destination_post, post3, type: :append)
|
||
|
|> Api.create!()
|
||
|
|
||
|
PostLink
|
||
|
|> Ash.Changeset.new()
|
||
|
|> Ash.Changeset.manage_relationship(:source_post, post2, type: :append)
|
||
|
|> Ash.Changeset.manage_relationship(:destination_post, post2, type: :append)
|
||
|
|> Api.create!()
|
||
|
|
||
|
PostLink
|
||
|
|> Ash.Changeset.new()
|
||
|
|> Ash.Changeset.manage_relationship(:source_post, post3, type: :append)
|
||
|
|> Ash.Changeset.manage_relationship(:destination_post, post1, type: :append)
|
||
|
|> Api.create!()
|
||
|
|
||
|
assert [
|
||
|
%{title: "aaa"},
|
||
|
%{title: "bbb"},
|
||
|
%{title: "ccc"}
|
||
|
] =
|
||
|
Api.read!(
|
||
|
Post
|
||
|
|> Ash.Query.sort(title: :asc)
|
||
|
|> Ash.Query.filter(linked_posts.title in ["aaa", "bbb", "ccc"])
|
||
|
)
|
||
|
|
||
|
assert [
|
||
|
%{title: "ccc"},
|
||
|
%{title: "bbb"},
|
||
|
%{title: "aaa"}
|
||
|
] =
|
||
|
Api.read!(
|
||
|
Post
|
||
|
|> Ash.Query.sort(title: :desc)
|
||
|
|> Ash.Query.filter(linked_posts.title in ["aaa", "bbb", "ccc"] or title == "aaa")
|
||
|
)
|
||
|
|
||
|
assert [
|
||
|
%{title: "ccc"},
|
||
|
%{title: "bbb"},
|
||
|
%{title: "aaa"}
|
||
|
] =
|
||
|
Api.read!(
|
||
|
Post
|
||
|
|> Ash.Query.sort(title: :desc)
|
||
|
|> Ash.Query.filter(
|
||
|
linked_posts.title in ["aaa", "bbb", "ccc"] or
|
||
|
post_links.source_post_id == ^post2.id
|
||
|
)
|
||
|
)
|
||
|
end
|
||
|
end
|