Skip to content

Instantly share code, notes, and snippets.

@ceolinrenato
Last active July 9, 2021 18:01
Show Gist options
  • Save ceolinrenato/cf7ae3c3d571800e306c42e5baf4d48f to your computer and use it in GitHub Desktop.
Save ceolinrenato/cf7ae3c3d571800e306c42e5baf4d48f to your computer and use it in GitHub Desktop.
# Core.Query
defmodule Core.Query do
@type query :: {query_name :: atom(), args :: keyword()}
@callback composeable_query(queryable :: Ecto.Query.t(), query()) :: Ecto.Query.t()
@spec compose(
query :: Ecto.Query.t(),
module :: module(),
queries :: list(query())
) :: Ecto.Query.t()
def compose(query, module, queries) do
queries
|> Enum.map(fn
{_query_name, _args} = query ->
query
query_name ->
{query_name, []}
end)
|> Enum.reduce(@schema, &__MODULE__.composeable_query/2)
end
end
# Core.Games.Queries
defmodule Core.Games.Queries do
@behaviour Core.Query
@impl true
def composeable_query(query, {:by_provider, args}), do: where(query, provider: ^args[:provider])
@impl true
def composeable_query(query, {:by_category, args}), do: where(query, category: ^args[:category])
@impl true
def composeable_query(query, {:enabled, _args}), do: where(query, enabled: true)
end
# Usage
queries = [
{:by_category, category: "slots"},
:enabled,
{:by_provider, provider: "netent"}
]
Core.Games.Queries.compose(Core.Schemas.Game, Core.Games.Queries, queries)
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment