query.ex (2116B)
1 # Zenflows is designed to implement the Valueflows vocabulary, 2 # written and maintained by srfsh <info@dyne.org>. 3 # Copyright (C) 2021-2023 Dyne.org foundation <foundation@dyne.org>. 4 # 5 # This program is free software: you can redistribute it and/or modify 6 # it under the terms of the GNU Affero General Public License as published by 7 # the Free Software Foundation, either version 3 of the License, or 8 # (at your option) any later version. 9 # 10 # This program is distributed in the hope that it will be useful, 11 # but WITHOUT ANY WARRANTY; without even the implied warranty of 12 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 13 # GNU Affero General Public License for more details. 14 # 15 # You should have received a copy of the GNU Affero General Public License 16 # along with this program. If not, see <https://www.gnu.org/licenses/>. 17 18 defmodule Zenflows.VF.EconomicEvent.Query do 19 @moduledoc false 20 21 import Ecto.Query 22 23 alias Ecto.{Multi, Queryable} 24 alias Zenflows.DB.{Repo, Schema} 25 alias Zenflows.VF.{EconomicEvent, EconomicResource, Process} 26 27 @spec previous(Schema.id()) :: nil | Queryable.t() 28 def previous(id) do 29 Multi.new() 30 |> Multi.run(:event, fn repo, _ -> 31 where(EconomicEvent, id: ^id) 32 |> select(~w[ 33 action_id output_of_id triggered_by_id 34 resource_inventoried_as_id previous_event_id 35 ]a) 36 |> repo.one() 37 |> case do 38 nil -> {:error, "does not exist"} 39 v -> {:ok, v} 40 end 41 end) 42 |> Multi.run(:query, fn _, %{event: evt} -> 43 {:ok, cond do 44 evt.output_of_id != nil -> 45 where(Process, id: ^evt.output_of_id) 46 evt.triggered_by_id != nil -> 47 where(EconomicEvent, id: ^evt.triggered_by_id) 48 evt.action_id == "raise" and evt.previous_event_id == nil -> 49 nil 50 evt.resource_inventoried_as_id != nil -> 51 where(EconomicResource, id: ^evt.resource_inventoried_as_id) 52 true -> 53 nil 54 end} 55 end) 56 |> Repo.transaction() 57 |> case do 58 # Instead of returning and error, we return nil 59 # just so because we did the same thing with other 60 # "previous" queries. We returned empty lists to 61 # indicate nilness. 62 {:ok, %{query: q}} -> q 63 {:error, _, _, _} -> nil 64 end 65 end 66 end