Current section
Files
Jump to
Current section
Files
lib/ecto_cqs/loader.ex
defmodule EctoCQS.Loader do
defmacro __using__(opts) do
repo = EctoCQS.Helpers.repo(opts)
schema = EctoCQS.Helpers.schema(opts)
quote do
# don't try to extract each and every query into schema Query -
# write simple queries (which are not meant to be reused) right
# inside schema Loader
import Ecto.Query, warn: false
alias Ecto.Multi
alias unquote(repo), as: Repo
alias unquote(schema), as: Schema
alias unquote(schema)
alias unquote(:"#{schema}.Query")
# don't test delegating functions
#
# use Repo functions that don't require schema
# (like Repo.preload/2) directly without Loader
defdelegate all(schema \\ Schema), to: Repo
defdelegate get(schema \\ Schema, id), to: Repo
defdelegate get!(schema \\ Schema, id), to: Repo
defdelegate get_by(schema \\ Schema, clauses), to: Repo
defdelegate get_by!(schema \\ Schema, clauses), to: Repo
def all_by(clauses) do
Schema
|> where(^clauses)
|> order_by(:inserted_at)
|> Repo.all()
end
def all_ordered_by(expr) do
Schema
|> order_by(^expr)
|> Repo.all()
end
def first do
Schema
|> EctoCQS.Query.first()
|> Repo.one()
end
def last do
Schema
|> EctoCQS.Query.last()
|> Repo.one()
end
def count do
Schema
|> Repo.aggregate(:count, :id)
end
end
end
end