LibEctoV2.QueryBuilder (lib_ecto v0.4.0)

View Source

查询构建器模块,提供构建和管理数据库查询条件的功能。

此模块专注于将用户提供的过滤参数转换为 Ecto 查询条件。

Summary

Functions

应用排序、限制和偏移到查询。

根据提供的参数和过滤器构建查询条件。

计算分页查询的偏移量。

检查查询条件构建的结果,并处理空条件的情况。

Functions

apply_query_options(query, sort_by, limit, offset)

@spec apply_query_options(
  Ecto.Query.t(),
  keyword() | nil,
  non_neg_integer() | nil,
  non_neg_integer() | nil
) :: Ecto.Query.t()

应用排序、限制和偏移到查询。

参数

  • query: Ecto 查询
  • sort_by: 排序选项
  • limit: 限制返回记录数
  • offset: 跳过前 N 条记录

返回值

  • 包含排序、限制和偏移的 Ecto 查询

示例

iex> query = from(u in User)
iex> LibEctoV2.QueryBuilder.apply_query_options(query, [desc: :inserted_at], 10, 0)
#Ecto.Query<...>

build_condition(init, params, filters, filter_fn, check_empty? \\ true)

@spec build_condition(any(), map(), list(), function(), boolean()) ::
  {:ok, any()} | {:error, any()}

根据提供的参数和过滤器构建查询条件。

参数

  • init: 初始查询条件
  • params: 包含过滤参数的映射
  • filters: 过滤器列表
  • filter_fn: 用于应用过滤器的函数
  • check_empty?: 是否检查空条件,默认为 true

返回值

  • {:ok, dynamic}: 成功构建的查询条件
  • {:error, reason}: 发生错误时的错误原因

示例

iex> init = true
iex> params = %{"name" => "test"}
iex> filters = [:name, :age]
iex> filter_fn = &MyModule.filter/3
iex> LibEctoV2.QueryBuilder.build_condition(init, params, filters, filter_fn)
{:ok, dynamic_expr}

calculate_offset(page, page_size)

@spec calculate_offset(non_neg_integer(), non_neg_integer()) :: non_neg_integer()

计算分页查询的偏移量。

参数

  • page: 页码(从1开始)
  • page_size: 每页记录数

返回值

  • 偏移量

示例

iex> LibEctoV2.QueryBuilder.calculate_offset(2, 10)
10

check_result(arg, init, check_empty?)

@spec check_result({:ok, any()} | {:error, any()}, any(), boolean()) ::
  {:ok, any()} | {:error, any()}

检查查询条件构建的结果,并处理空条件的情况。

参数

  • result: 构建查询条件的结果
  • init: 初始查询条件
  • check_empty?: 是否检查空条件

返回值

  • {:ok, dynamic}: 有效的查询条件
  • {:error, reason}: 错误原因