From 5258527dacd4637f266eedff6a8a803d1e159740 Mon Sep 17 00:00:00 2001 From: Alex Antonov Date: Sat, 15 Jul 2017 20:39:09 +0300 Subject: [PATCH 1/7] Improved migration documentation --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index f48576e..fa74985 100644 --- a/README.md +++ b/README.md @@ -43,7 +43,7 @@ defmodule MyApp.AddMaterializedPathToComments do def change do alter table(:comments) do - add :materialized_path, {:array, :integer}, null: false, default: [] + add :path, {:array, :integer}, null: false end end end From 0cbd37bd88bd57a1cb19b00e4e8227c79977f977 Mon Sep 17 00:00:00 2001 From: Alex Antonov Date: Sun, 16 Jul 2017 10:15:59 +0300 Subject: [PATCH 2/7] disable email notifications for travis --- .travis.yml | 2 ++ 1 file changed, 2 insertions(+) diff --git a/.travis.yml b/.travis.yml index 1fa127b..9ae18eb 100644 --- a/.travis.yml +++ b/.travis.yml @@ -14,3 +14,5 @@ cache: directories: - _build - deps +notifications: + email: false From af95fa63a81dd242f7c8b2b3d2ca51dd08d37a22 Mon Sep 17 00:00:00 2001 From: Alex Antonov Date: Mon, 17 Jul 2017 08:59:35 +0300 Subject: [PATCH 3/7] arranging empty list --- lib/ecto_materialized_path.ex | 1 + test/ecto_materialized_path_test.exs | 6 +++++- 2 files changed, 6 insertions(+), 1 deletion(-) diff --git a/lib/ecto_materialized_path.ex b/lib/ecto_materialized_path.ex index a809e87..b1e2125 100644 --- a/lib/ecto_materialized_path.ex +++ b/lib/ecto_materialized_path.ex @@ -160,6 +160,7 @@ defmodule EctoMaterializedPath do changeset |> Ecto.Changeset.change(%{ :"#{column_name}" => new_path }) end + def arrange([], _), do: [] def arrange(nodes_list, column_name) do nodes_depth_map = nodes_list |> nodes_by_depth_map(%{}, column_name) diff --git a/test/ecto_materialized_path_test.exs b/test/ecto_materialized_path_test.exs index 8e29191..27baff0 100644 --- a/test/ecto_materialized_path_test.exs +++ b/test/ecto_materialized_path_test.exs @@ -367,7 +367,11 @@ defmodule EctoMaterializedPathTest do ] end - test "raises an exception when node isn't arranged" do + test "returns empty list if there are no children" do + assert Comment.arrange([]) == [] + end + + test "raises an exception when node can't arranged" do comment_1 = %Comment{ id: 1 } comment_3 = %Comment{ id: 3, path: [1] } # parent is missing From 6d732b542b4a90fb6a425c8ce398cbb21291aca2 Mon Sep 17 00:00:00 2001 From: Alex Antonov Date: Sat, 22 Jul 2017 16:11:50 +0300 Subject: [PATCH 4/7] sponsorship info --- README.md | 12 ++++++++++++ brutalist_logo.png | Bin 0 -> 13743 bytes 2 files changed, 12 insertions(+) create mode 100644 brutalist_logo.png diff --git a/README.md b/README.md index fa74985..f635a55 100644 --- a/README.md +++ b/README.md @@ -323,3 +323,15 @@ Comment.brutalist_root(comment) Comment.brutalist_root?(comment) # et.c. ``` + +## About [Brutalist](https://brutalist.press) + + + Brutalist + +

+ +`ecto_materialized_path` package is maintained and funded by folks from [Brutalist](https://brutalist.press) - media platform for writing and sharing news and stories with strong focus on traditional values, think-tank level analytics and political research. diff --git a/brutalist_logo.png b/brutalist_logo.png new file mode 100644 index 0000000000000000000000000000000000000000..e198f5af4230a27c42703e5ffeba19035dca6881 GIT binary patch literal 13743 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 Date: Sat, 28 Oct 2017 11:45:43 +0300 Subject: [PATCH 5/7] Fixing where_depth/2 --- README.md | 2 +- lib/ecto_materialized_path.ex | 10 +++++----- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/README.md b/README.md index f635a55..6828e3b 100644 --- a/README.md +++ b/README.md @@ -253,7 +253,7 @@ You can get depth level of the node in the tree #### `where_depth/2` -You can specify a query to search for nodes with some level of depth +You can specify a query to search for nodes with some level of depth. It uses `CARDINALITY()` postgres function internally, so ensure your postgres version is at least `9.4`. ``` elixir Comment.where_depth(Comment, is_bigger_than: 2) # => Find all nodes with more than 2 levels deep diff --git a/lib/ecto_materialized_path.ex b/lib/ecto_materialized_path.ex index b1e2125..ca3eea9 100644 --- a/lib/ecto_materialized_path.ex +++ b/lib/ecto_materialized_path.ex @@ -130,19 +130,19 @@ defmodule EctoMaterializedPath do end defp do_where_depth(query, [is_bigger_than: ibt], column_name) when is_integer(ibt) and ibt > 0 do - Ecto.Query.from(q in query, where: fragment("array_length(?, 1)", ^column_name) > ^ibt) + Ecto.Query.from(q in query, where: fragment("CARDINALITY(?) > ?", field(q, ^column_name), ^ibt)) end defp do_where_depth(query, [is_bigger_than_or_equal_to: ibtoet], column_name) when is_integer(ibtoet) and ibtoet >= 0 do - Ecto.Query.from(q in query, where: fragment("array_length(?, 1)", ^column_name) >= ^ibtoet) + Ecto.Query.from(q in query, where: fragment("CARDINALITY(?) >= ?", field(q, ^column_name), ^ibtoet)) end defp do_where_depth(query, [is_equal_to: iet], column_name) when is_integer(iet) and iet > 0 do - Ecto.Query.from(q in query, where: fragment("array_length(?, 1)", ^column_name) == ^iet) + Ecto.Query.from(q in query, where: fragment("CARDINALITY(?) = ?", field(q, ^column_name), ^iet)) end defp do_where_depth(query, [is_smaller_than_or_equal_to: istoet], column_name) when is_integer(istoet) and istoet >= 0 do - Ecto.Query.from(q in query, where: fragment("array_length(?, 1)", ^column_name) <= ^istoet) + Ecto.Query.from(q in query, where: fragment("CARDINALITY(?) <= ?", field(q, ^column_name), ^istoet)) end defp do_where_depth(query, [is_smaller_than: ist], column_name) when is_integer(ist) and ist > 0 do - Ecto.Query.from(q in query, where: fragment("array_length(?, 1)", ^column_name) < ^ist) + Ecto.Query.from(q in query, where: fragment("CARDINALITY(?) < ?", field(q, ^column_name), ^ist)) end defp do_where_depth(_, _, _) do raise ArgumentError, "invalid arguments" From 45fa649897cf008c38af1a5a38b4549104b07010 Mon Sep 17 00:00:00 2001 From: Alex Antonov Date: Sat, 28 Oct 2017 12:45:53 +0300 Subject: [PATCH 6/7] 0.2.0 --- mix.exs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/mix.exs b/mix.exs index 202d36f..303065c 100644 --- a/mix.exs +++ b/mix.exs @@ -2,7 +2,7 @@ defmodule EctoMaterializedPath.Mixfile do use Mix.Project @project_url "https://github.com/asiniy/ecto_materialized_path" - @version "0.1.0" + @version "0.2.0" def project do [ From e9002daf7bbe1bd64ac6f2a2612052adde28c3af Mon Sep 17 00:00:00 2001 From: Christoph Klocker Date: Wed, 21 Mar 2018 15:42:35 +0100 Subject: [PATCH 7/7] Allow binarys as well to handle UUID's that might be used as primary keys --- lib/ecto_materialized_path/path.ex | 2 +- test/ecto_materialized_path/path_test.exs | 6 +++++- 2 files changed, 6 insertions(+), 2 deletions(-) diff --git a/lib/ecto_materialized_path/path.ex b/lib/ecto_materialized_path/path.ex index d9d5959..f316f39 100644 --- a/lib/ecto_materialized_path/path.ex +++ b/lib/ecto_materialized_path/path.ex @@ -7,7 +7,7 @@ defmodule EctoMaterializedPath.Path do """ def cast(list) when is_list(list) do - path_is_correct? = Enum.all?(list, fn(path_id) -> is_integer(path_id) end) + path_is_correct? = Enum.all?(list, fn(path_id) -> (is_integer(path_id) || is_binary(path_id)) end) if path_is_correct? do { :ok, list } diff --git a/test/ecto_materialized_path/path_test.exs b/test/ecto_materialized_path/path_test.exs index e9616b5..8ddba79 100644 --- a/test/ecto_materialized_path/path_test.exs +++ b/test/ecto_materialized_path/path_test.exs @@ -11,11 +11,15 @@ defmodule EctoMaterializedPath.PathTest do assert Path.cast([13, 45, 18]) == { :ok, [13, 45, 18] } end + test "passes with UUID's" do + assert Path.cast(["38432046-4351-4676-8988-10f0262da113", "a65ce828-52f2-4931-8719-9f7d97723f3b"]) == { :ok, ["38432046-4351-4676-8988-10f0262da113", "a65ce828-52f2-4931-8719-9f7d97723f3b"] } + end + test "fails with random value" do assert Path.cast(4) == :error end test "fails with wrongs path" do - assert Path.cast([14, "ee", 45]) == :error + assert Path.cast([14, [:ok], 45]) == :error end end