Packages

Builds dynamic Ecto queries based on given parameters, allowing developers to retrieve data flexibly without writing custom queries for each use case.

Current section

Files

Jump to
bind lib query_builder.ex
Raw

lib/query_builder.ex

defmodule Bind.QueryBuilder do
import Ecto.Query
def add_limit_query(query, params) do
case Map.get(params, "limit") do
nil ->
Ecto.Query.limit(query, [r], 10)
limit_param when is_integer(limit_param) ->
Ecto.Query.limit(query, [r], ^limit_param)
limit_param when is_binary(limit_param) ->
Ecto.Query.limit(query, [r], ^String.to_integer(limit_param))
end
end
def add_offset_query(query, params) do
case Map.get(params, "start") do
nil ->
query
start_id ->
Ecto.Query.where(query, [r], field(r, :id) > ^start_id)
end
end
def build_where_query(params) do
Enum.reduce(params, Ecto.Query.dynamic(true), fn {param, param_value}, dynamic ->
case Bind.Parse.where_field(param) do
nil ->
dynamic
[prop, constraint] ->
case Bind.Parse.constraint(prop, constraint, param_value) do
{:error, reason} ->
dynamic
constraint ->
dynamic([r], ^dynamic and ^constraint)
end
end
end)
end
def build_sort_query(params) do
case params["sort"] do
nil -> [asc: :id]
"" -> [asc: :id]
sort_param -> Bind.Parse.sort_field(sort_param)
end
end
end