commit 700919107d38375c31dc2ffc19ccd3c6e278fde5
parent 9067505ee3dd44de76a292d4c3ab77221a689be2
Author: Alberto Lerda <albertolerda97@gmail.com>
Date: Tue, 6 Dec 2022 11:22:49 +0100
Zenflows.VF.EcomicResource: first version DPP of stefano
Diffstat:
3 files changed, 91 insertions(+), 0 deletions(-)
diff --git a/src/zenflows/vf/economic_resource/domain.ex b/src/zenflows/vf/economic_resource/domain.ex
@@ -272,4 +272,88 @@ def multi_delete(m, key \\ multi_key(), id) do
|> multi_one("#{key}.one", id)
|> Multi.delete(key, &Map.fetch!(&1, "#{key}.one"))
end
+
+@max_depth 100000000
+
+@spec trace_dpp_tree_er_before(EconomicResource.t(), MapSet.t(), integer()) :: {MapSet.t(), map()}
+def trace_dpp_tree_er_before(_item, visited, depth) when depth >= @max_depth do
+ {visited, %{}}
+end
+def trace_dpp_tree_er_before(item = %EconomicResource{}, visited, depth) do
+ a_dpp_item = %{node: item}
+ {visited2, children} = EconomicResource.Domain.previous(item) |> Enum.reduce({visited, []},
+ fn ee, {visited, children} ->
+ if MapSet.member?(visited, {ee.__struct__, ee.id}) do
+ {visited, children}
+ else
+ {visited2, child} = trace_dpp_tree_ee_before(ee, visited, depth+1)
+ {MapSet.put(visited2, {ee.__struct__, ee.id}), [ child | children ]}
+ end
+ end
+ )
+ {visited2, Map.put(a_dpp_item, :children, children)}
+end
+
+@spec trace_dpp_tree_ee_before_recurse(
+ EconomicEvent.t() | EconomicResource.t() | Process.t(),
+ MapSet.t(), pos_integer() ) :: {MapSet.t(), map()}
+def trace_dpp_tree_ee_before_recurse(item = %EconomicResource{}, visited, depth) do
+ trace_dpp_tree_er_before(item, visited, depth)
+end
+def trace_dpp_tree_ee_before_recurse(item = %EconomicEvent{}, visited, depth) do
+ trace_dpp_tree_ee_before(item, visited, depth)
+end
+def trace_dpp_tree_ee_before_recurse(item = %Process{}, visited, depth) do
+ trace_dpp_tree_pr_before(item, MapSet.put(visited, {item.__struct__, item.id}), depth)
+end
+
+@spec trace_dpp_tree_ee_before(EconomicEvent.t(), MapSet.t(), pos_integer()) :: {MapSet.t(), map()}
+def trace_dpp_tree_ee_before(_item, visited, depth) when depth >= @max_depth do
+ {visited, %{}}
+end
+def trace_dpp_tree_ee_before(item = %EconomicEvent{}, visited, depth) do
+ a_dpp_item = %{node: item}
+ pr_item = EconomicEvent.Domain.previous(item)
+ if pr_item == nil do
+ {visited, Map.put(a_dpp_item, :children, [])}
+ else
+ {visited2, children} = [pr_item] |> Enum.reduce({visited, []},
+ fn pf, {visited, children} ->
+ if MapSet.member?(visited, {pf.__struct__, pf.id}) do
+ {visited, children}
+ else
+ {visited2, child} = trace_dpp_tree_ee_before_recurse(pf, visited, depth+1)
+ { MapSet.put(visited2, {pf.__struct__, pf.id}), [ child | children ]}
+ end
+ end
+ )
+ {visited2, Map.put(a_dpp_item, :children, children)}
+ end
+end
+
+@spec trace_dpp_tree_pr_before(Process.t(), MapSet.t(), integer()) :: {MapSet.t(), map()}
+def trace_dpp_tree_pr_before(_item, visited, depth) when depth >= @max_depth do
+ {visited, %{}}
+end
+def trace_dpp_tree_pr_before(item, visited, depth) do
+ a_dpp_item = %{node: item}
+ {visited2, children} = Process.Domain.previous(item) |> Enum.reduce({visited, []},
+ fn ee, {visited, children} ->
+ if MapSet.member?(visited, ee.id) do
+ {visited, children}
+ else
+ {visited2, child} = trace_dpp_tree_ee_before(ee, visited, depth+1)
+ {MapSet.put(visited2, ee.id), [ child | children ]}
+ end
+ end
+ )
+ {visited2, Map.put(a_dpp_item, :children, children)}
+end
+
+@spec trace_dpp_tree(EconomicResource.t(), Page.t()) :: map()
+def trace_dpp_tree(item, _page \\ Page.new()) do
+ {visited, dpp} = trace_dpp_tree_er_before(item, MapSet.new(), 0)
+ dpp.children |> IO.inspect
+ dpp
+end
end
diff --git a/src/zenflows/vf/economic_resource/resolv.ex b/src/zenflows/vf/economic_resource/resolv.ex
@@ -117,4 +117,8 @@ end
def trace(eco_res, _, _) do
{:ok, Domain.trace(eco_res)}
end
+
+def trace_dpp_tree(eco_res, _, _) do
+ {:ok, Domain.trace_dpp_tree(eco_res)}
+end
end
diff --git a/src/zenflows/vf/economic_resource/type.ex b/src/zenflows/vf/economic_resource/type.ex
@@ -183,6 +183,9 @@ object :economic_resource do
field :trace, list_of(non_null(:track_trace_item)),
resolve: &Resolv.trace/3
+
+ field :trace_dpp_tree, non_null(:json),
+ resolve: &Resolv.trace_dpp_tree/3
end
input_object :economic_resource_create_params do