zf

zenflows testing
git clone https://s.sonu.ch/~srfsh/zf.git
Log | Files | Refs | Submodules | README | LICENSE

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