Skip to content

Commit

Permalink
Merge pull request #310 from pulibrary/227-members-query
Browse files Browse the repository at this point in the history
Get all members at once, rather than one at a time from the db
  • Loading branch information
tpendragon authored Feb 13, 2025
2 parents 5cefde4 + 664004f commit 44eb205
Show file tree
Hide file tree
Showing 3 changed files with 52 additions and 15 deletions.
32 changes: 31 additions & 1 deletion lib/dpul_collections/indexing_pipeline.ex
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down
22 changes: 8 additions & 14 deletions lib/dpul_collections/indexing_pipeline/figgy/resource.ex
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down
13 changes: 13 additions & 0 deletions test/dpul_collections/indexing_pipeline_test.exs
Original file line number Diff line number Diff line change
Expand Up @@ -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)

Expand Down

0 comments on commit 44eb205

Please sign in to comment.