Hi,
I am currently trying to resolve two fields:
object :post do
field(:id, non_null(:uuid))
field :title, non_null(:string) do
resolve(&Resolvers.Blog.title_for_post/3)
end
field :category, non_null(:string) do
resolve(&Resolvers.Blog.category_for_post/3)
end
end
I have the following functions in my resolver:
def title_for_post(
post,
_,
params
) do
tenant = params.tenant
batch_key = {:one, Author, %{tenant: tenant}}
value = [post_titles: post]
Batcher.batching_fields(loader, Authors, batch_key, value)
end
def category_for_post(
post,
_,
params
) do
tenant = params.tenant
batch_key = {:one, Author, %{tenant: tenant}}
value = [post_categories: post]
Batcher.batching_fields(loader, Authors, batch_key, value)
end
Batcher.ex has the following function
def batching_fields(loader, module, batch_key, value) do
Dataloader.load(loader, module, batch_key, value)
|> on_load(fn loader ->
{:ok, loader |> Dataloader.get(module, batch_key, value)}
end)
end
And the Post dataloader currently has the following code
def data() do
Dataloader.Ecto.new(MyApp.Repo, query: &query/2, run_batch: &run_batch/5)
end
def query(Author, %{tenant: tenant}) do
Authors.get_authors(tenant)
end
def run_batch(
Author,
authors_query,
:post_titles,
posts,
_
) do
author_ids =
Enum.map(posts, & &1.author_id)
authors_map_from_query(authors_query, author_ids)
|> title_list(author_ids)
end
def run_batch(
Author,
authors_query,
:post_categories,
posts,
_
) do
author_ids =
Enum.map(posts, & &1.author_id)
authors_map_from_query(authors_query, author_ids)
|> category_list(author_ids)
end
This works but I see separate queries for title and category fields when I try to query for
query
{
posts
{
id
title
category
}
}
I would like to get a much efficient approach which is preferably using the same batch key when resolving for both fields. Any suggestions on how to achieve this?