Last active
July 9, 2021 18:01
-
-
Save ceolinrenato/cf7ae3c3d571800e306c42e5baf4d48f to your computer and use it in GitHub Desktop.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
# 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