Skip to content

Commit

Permalink
Show file tree
Hide file tree
Showing 4 changed files with 101 additions and 84 deletions.
31 changes: 31 additions & 0 deletions src/zenflows/vf/economic_event/domain.ex
Original file line number Diff line number Diff line change
Expand Up @@ -21,6 +21,8 @@ defmodule Zenflows.VF.EconomicEvent.Domain do

import Ecto.Query

require Logger

alias Ecto.{Changeset, Multi}
alias Zenflows.DB.{Page, Repo, Schema}
alias Zenflows.VF.{
Expand Down Expand Up @@ -71,6 +73,35 @@ def previous(id) do
end
end

@spec trace_dpp_before(EconomicEvent.t(), non_neg_integer(),
MapSet.t(), [EconomicResource.t() | EconomicEvent.t() | Process.t()])
:: {MapSet.t(), [EconomicResource.t() | EconomicEvent.t() | Process.t()]}
def trace_dpp_before(%{id: id}, 0, visited, children) do
Logger.info(%{type: "EconomicEvent", id: id, visited: visited, children: children})
{visited, children}
end
def trace_dpp_before(evt, depth, visited, children) do
{:ok, result} = Repo.multi(fn ->
{visited, evt_children} =
case previous(evt) do
nil ->
{visited, []}
%EconomicEvent{} = evt ->
visited = MapSet.put(visited, "evt#{evt.id}")
trace_dpp_before(evt, depth - 1, visited, [])
%EconomicResource{} = res ->
EconomicResource.Domain.trace_dpp_before(res, depth - 1, visited, [])
%Process{} = proc ->
visited = MapSet.put(visited, "proc#{proc.id}")
Process.Domain.trace_dpp_before(proc, depth - 1, visited, [])
end
child = %{type: "EconomicEvent", node: evt, children: Enum.reverse(evt_children)}
children = [child | children]
{:ok, {visited, children}}
end)
result
end

@spec create(Schema.params(), nil | Schema.params())
:: {:ok, EconomicEvent.t()} | {:error, String.t() | Changeset.t()}
def create(evt_params, res_params \\ nil) do
Expand Down
123 changes: 40 additions & 83 deletions src/zenflows/vf/economic_resource/domain.ex
Original file line number Diff line number Diff line change
Expand Up @@ -19,6 +19,8 @@
defmodule Zenflows.VF.EconomicResource.Domain do
@moduledoc "Domain logic of EconomicResources."

require Logger

alias Ecto.{Changeset, Multi}
alias Zenflows.DB.{Page, Repo, Schema}
alias Zenflows.VF.{
Expand Down Expand Up @@ -183,6 +185,44 @@ end
defp handle_set(_, _, flows, visited, contained, modified, delivered, saved_event),
do: {flows, visited, contained, modified, delivered, saved_event}

@spec trace_dpp(EconomicResource.t()) :: [EconomicResource.t() | EconomicEvent.t() | Process.t()]
def trace_dpp(res) do
{:ok, result} = Repo.multi(fn ->
# the initial value for `_depth_countdown` was taken from:
# https://github.com/interfacerproject/Interfacer-notebook/blob/326750b1cae445ce5faa0fafb057e50538077910/if_consts.py#L25
{_visited, children} =
trace_dpp_before(res, _depth_countdown = 100_000_000, _visited = MapSet.new(), _children = [])
{:ok, Enum.reverse(children)}
end)
result
end

@spec trace_dpp_before(EconomicResource.t(), non_neg_integer(),
MapSet.t(), [EconomicResource.t() | EconomicEvent.t() | Process.t()])
:: {MapSet.t(), [EconomicResource.t() | EconomicEvent.t() | Process.t()]}
def trace_dpp_before(%{id: id}, 0, visited, children) do
Logger.info(%{type: "EconomicResource", id: id, visited: visited, children: children})
{visited, children}
end
def trace_dpp_before(res, depth, visited, children) do
{:ok, result} = Repo.multi(fn ->
{visited, res_children} =
previous(res)
|> Enum.reduce({visited, []}, fn evt, {visited, res_children} ->
if MapSet.member?(visited, "evt#{evt.id}") do
{visited, res_children}
else
visited = MapSet.put(visited, "evt#{evt.id}")
EconomicEvent.Domain.trace_dpp_before(evt, depth - 1, visited, res_children)
end
end)
child = %{type: "EconomicResource", node: res, children: Enum.reverse(res_children)}
children = [child | children]
{:ok, {visited, children}}
end)
result
end

@spec classifications(Page.t()) :: {:ok, [String.t()]} | {:error, Changeset.t()}
def classifications(page \\ Page.new()) do
with {:ok, q} <- Query.classifications(page) do
Expand Down Expand Up @@ -271,87 +311,4 @@ 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 100_000_000

@spec trace_dpp_er_before(EconomicResource.t(), MapSet.t(), integer()) :: {MapSet.t(), map()}
def trace_dpp_er_before(_item, visited, depth) when depth >= @max_depth do
{visited, %{}}
end
def trace_dpp_er_before(%EconomicResource{} = item, visited, depth) do
a_dpp_item = %{type: "EconomicResource", 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_ee_before(ee, MapSet.put(visited, {ee.__struct__, ee.id}), depth + 1)
{visited2, [child | children]}
end
end
)
{visited2, Map.put(a_dpp_item, :children, children)}
end

@spec trace_dpp_ee_before_recurse(
EconomicEvent.t() | EconomicResource.t() | Process.t(),
MapSet.t(), pos_integer() ) :: {MapSet.t(), map()}
def trace_dpp_ee_before_recurse(%EconomicResource{} = item, visited, depth) do
trace_dpp_er_before(item, visited, depth)
end
def trace_dpp_ee_before_recurse(%EconomicEvent{} = item, visited, depth) do
trace_dpp_ee_before(item, MapSet.put(visited, {item.__struct__, item.id}), depth)
end
def trace_dpp_ee_before_recurse(%Process{} = item, visited, depth) do
trace_dpp_pr_before(item, MapSet.put(visited, {item.__struct__, item.id}), depth)
end

@spec trace_dpp_ee_before(EconomicEvent.t(), MapSet.t(), pos_integer()) :: {MapSet.t(), map()}
def trace_dpp_ee_before(_item, visited, depth) when depth >= @max_depth do
{visited, %{}}
end
def trace_dpp_ee_before(%EconomicEvent{} = item, visited, depth) do
a_dpp_item = %{type: "EconomicEvent", 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_ee_before_recurse(pf, visited, depth + 1)
{visited2, [child | children]}
end
end
)
{visited2, Map.put(a_dpp_item, :children, children)}
end
end

@spec trace_dpp_pr_before(Process.t(), MapSet.t(), integer()) :: {MapSet.t(), map()}
def trace_dpp_pr_before(_item, visited, depth) when depth >= @max_depth do
{visited, %{}}
end
def trace_dpp_pr_before(item, visited, depth) do
a_dpp_item = %{type: "Process", node: item}
{visited2, children} = Process.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_ee_before(ee, MapSet.put(visited, {ee.__struct__, ee.id}), depth + 1)
{visited2, [child | children]}
end
end
)
{visited2, Map.put(a_dpp_item, :children, children)}
end

@spec trace_dpp(EconomicResource.t(), Page.t()) :: map()
def trace_dpp(item, _page \\ Page.new()) do
{_, dpp} = trace_dpp_er_before(item, MapSet.new(), 0)
dpp
end
end
2 changes: 1 addition & 1 deletion src/zenflows/vf/economic_resource/type.ex
Original file line number Diff line number Diff line change
Expand Up @@ -186,7 +186,7 @@ object :economic_resource do
field :trace, list_of(non_null(:track_trace_item)),
resolve: &Resolv.trace/3

field :trace_dpp, non_null(:json), resolve: &Resolv.trace_dpp/3
field :trace_dpp, non_null(:json_array), resolve: &Resolv.trace_dpp/3
end

input_object :economic_resource_create_params do
Expand Down
29 changes: 29 additions & 0 deletions src/zenflows/vf/process/domain.ex
Original file line number Diff line number Diff line change
Expand Up @@ -21,10 +21,13 @@ defmodule Zenflows.VF.Process.Domain do

import Ecto.Query

require Logger

alias Ecto.Changeset
alias Zenflows.DB.{Page, Repo, Schema}
alias Zenflows.VF.{
EconomicEvent,
EconomicResource,
Process,
Process.Query,
ProcessGroup,
Expand Down Expand Up @@ -71,6 +74,32 @@ def previous(id, page) do
|> Enum.reverse()
end

@spec trace_dpp_before(Process.t(), non_neg_integer(),
MapSet.t(), [EconomicResource.t() | EconomicEvent.t() | Process.t()])
:: {MapSet.t(), [EconomicResource.t() | EconomicEvent.t() | Process.t()]}
def trace_dpp_before(%{id: id}, 0, visited, children) do
Logger.info(%{type: "Process", id: id, visited: visited, children: children})
{visited, children}
end
def trace_dpp_before(proc, depth, visited, children) do
{:ok, result} = Repo.multi(fn ->
{visited, proc_children} =
previous(proc)
|> Enum.reduce({visited, []}, fn evt, {visited, proc_children} ->
if MapSet.member?(visited, "evt#{evt.id}") do
{visited, proc_children}
else
visited = MapSet.put(visited, "evt#{evt.id}")
EconomicEvent.Domain.trace_dpp_before(evt, depth - 1, visited, proc_children)
end
end)
child = %{type: "Process", node: proc, children: Enum.reverse(proc_children)}
children = [child | children]
{:ok, {visited, children}}
end)
result
end

@spec create(Schema.params()) :: {:ok, Process.t()} | {:error, Changeset.t()}
def create(params) do
Repo.multi(fn ->
Expand Down

0 comments on commit c856b85

Please sign in to comment.