diff --git a/lib/dpul_collections/indexing_pipeline.ex b/lib/dpul_collections/indexing_pipeline.ex index e70c5338..6abe4b05 100644 --- a/lib/dpul_collections/indexing_pipeline.ex +++ b/lib/dpul_collections/indexing_pipeline.ex @@ -208,7 +208,37 @@ defmodule DpulCollections.IndexingPipeline do def get_figgy_resource!(id), do: FiggyRepo.get!(Figgy.Resource, id) @doc """ - ## Description + Gets all members of the given resource from the Figgy Database + + ## Examples + + iex> get_figgy_members(123) + [%Figgy.Resource{}, ...] + + iex> get_figgy_members(456) + ** [] + + """ + def get_figgy_members(id) do + Figgy.Resource + |> join( + :cross, + [resource], + id_position in fragment( + "jsonb_array_elements(?.metadata->'member_ids') WITH ORDINALITY", + resource + ) + ) + |> join(:left, [resource, id_position, member], member in Figgy.Resource, + on: fragment("(?.value->>'id')::UUID", id_position) == member.id + ) + |> select([..., member], member) + |> order_by([resource, id_position, member], id_position.ordinality) + |> where([resource], resource.id == ^id) + |> FiggyRepo.all() + end + + @doc """ Query to return a limited number of figgy resources using the value of a marker tuple. 1. Orders figgy records by updated_at and then id in ascending order diff --git a/lib/dpul_collections/indexing_pipeline/figgy/resource.ex b/lib/dpul_collections/indexing_pipeline/figgy/resource.ex index 4118c358..a59ee872 100644 --- a/lib/dpul_collections/indexing_pipeline/figgy/resource.ex +++ b/lib/dpul_collections/indexing_pipeline/figgy/resource.ex @@ -44,26 +44,20 @@ defmodule DpulCollections.IndexingPipeline.Figgy.Resource do end @spec extract_members(resource :: %__MODULE__{}) :: related_resource_map() - defp extract_members(%{:metadata => %{"member_ids" => member_ids}}) do - Enum.reduce(member_ids, %{}, &append_related_resource/2) + defp extract_members(resource = %{:metadata => %{"member_ids" => _member_ids}}) do + # Enum.reduce(member_ids, %{}, &append_related_resource/2) + # get just the list of members + # turn it into a map of id => FiggyResource + IndexingPipeline.get_figgy_members(resource.id) + |> Enum.map(fn m -> {m.id, to_map(m)} end) + |> Map.new() end + # there are no member_ids defp extract_members(_resource) do %{} end - @spec append_related_resource( - %{String.t() => resource_id :: String.t()}, - related_resource_map() - ) :: related_resource_map() - defp append_related_resource(%{"id" => id}, acc) do - acc - |> Map.put( - id, - IndexingPipeline.get_figgy_resource!(id) |> to_map() - ) - end - @spec to_map(resource :: %__MODULE__{}) :: map() defp to_map(resource = %__MODULE__{}) do resource diff --git a/test/dpul_collections/indexing_pipeline_test.exs b/test/dpul_collections/indexing_pipeline_test.exs index 10947c3a..06dd2b76 100644 --- a/test/dpul_collections/indexing_pipeline_test.exs +++ b/test/dpul_collections/indexing_pipeline_test.exs @@ -99,6 +99,19 @@ defmodule DpulCollections.IndexingPipelineTest do assert IndexingPipeline.get_figgy_resource!(ephemera_folder_id).id == ephemera_folder_id end + test "get_figgy_resource!/1 errors when the resource isn't there" do + ephemera_folder_id = "00000000-0000-0000-0000-000000000000" + + assert_raise Ecto.NoResultsError, fn -> + IndexingPipeline.get_figgy_resource!(ephemera_folder_id) + end + end + + test "get_figgy_members/1 returns an empty list when the resource doesn't exist" do + ephemera_folder_id = "00000000-0000-0000-0000-000000000000" + assert IndexingPipeline.get_figgy_members(ephemera_folder_id) == [] + end + test "get_figgy_resources_since!/2 does not return Events or PreservationObjects" do total_records = FiggyRepo.aggregate(IndexingPipeline.Figgy.Resource, :count)