From af4f09a1a35d8264ddc40f4c879a25407a15bd4a Mon Sep 17 00:00:00 2001 From: Mayel Date: Thu, 4 Feb 2021 15:12:05 +0100 Subject: [PATCH 1/2] can use with schemas with @primary_key: false --- lib/arbor/tree.ex | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/lib/arbor/tree.ex b/lib/arbor/tree.ex index db31dcf..f213e49 100644 --- a/lib/arbor/tree.ex +++ b/lib/arbor/tree.ex @@ -35,7 +35,12 @@ defmodule Arbor.Tree do defmacro __before_compile__(%{module: definition} = _env) do arbor_opts = Module.get_attribute(definition, :arbor_opts) - {primary_key, primary_key_type, _} = Module.get_attribute(definition, :primary_key) + + {primary_key, primary_key_type} = case Module.get_attribute(definition, :primary_key) do + {primary_key, primary_key_type, _} -> {primary_key, primary_key_type} + _ -> {arbor_opts[:primary_key], arbor_opts[:primary_key_type]} + end + struct_fields = Module.get_attribute(definition, :struct_fields) struct_source = struct_fields[:__meta__].source From 0f4ae2cdd91d3ca56e53803e9790461771f40afe Mon Sep 17 00:00:00 2001 From: Mayel Date: Thu, 4 Feb 2021 16:06:07 +0100 Subject: [PATCH 2/2] fallback to :id --- lib/arbor/tree.ex | 12 +++++++----- 1 file changed, 7 insertions(+), 5 deletions(-) diff --git a/lib/arbor/tree.ex b/lib/arbor/tree.ex index f213e49..2ab71b5 100644 --- a/lib/arbor/tree.ex +++ b/lib/arbor/tree.ex @@ -85,13 +85,15 @@ defmodule Arbor.Tree do ) end + defp id(struct), do: Map.get(struct, unquote(opts[:foreign_key]), Map.get(struct, :id)) + def parent(struct) do from( t in unquote(definition), where: fragment( unquote("#{opts[:primary_key]} = ?"), - type(^struct.unquote(opts[:foreign_key]), unquote(opts[:foreign_key_type])) + type(^id(struct), unquote(opts[:foreign_key_type])) ) ) end @@ -102,7 +104,7 @@ defmodule Arbor.Tree do where: fragment( unquote("#{opts[:foreign_key]} = ?"), - type(^struct.unquote(opts[:primary_key]), unquote(opts[:foreign_key_type])) + type(^id(struct), unquote(opts[:foreign_key_type])) ) ) end @@ -112,7 +114,7 @@ defmodule Arbor.Tree do t in unquote(definition), where: t.unquote(opts[:primary_key]) != - type(^struct.unquote(opts[:primary_key]), unquote(opts[:primary_key_type])), + type(^id(struct), unquote(opts[:primary_key_type])), where: fragment( unquote("#{opts[:foreign_key]} = ?"), @@ -142,7 +144,7 @@ defmodule Arbor.Tree do SELECT * FROM #{opts[:tree_name]} ) - """), type(^struct.unquote(opts[:primary_key]), unquote(opts[:primary_key_type]))), + """), type(^id(struct), unquote(opts[:primary_key_type]))), on: t.unquote(opts[:primary_key]) == g.unquote(opts[:foreign_key]) end @@ -169,7 +171,7 @@ defmodule Arbor.Tree do ) SELECT #{opts[:primary_key]} FROM #{opts[:tree_name]} """), - type(^struct.unquote(opts[:primary_key]), unquote(opts[:foreign_key_type])), + type(^id(struct), unquote(opts[:foreign_key_type])), type(^depth, :integer) ) )