Storage operations for Lotus queries.
Handles CRUD operations for persisting and retrieving queries.
Content changes
create_query/2, update_query/3 and delete_query/2 take opts with a
:context, opaque caller data such as the current user. Each write fires the
:before_content_change and :after_content_change middleware. A plug that
halts makes the function return {:error, {:halted, reason}} and nothing is
written.
Deleting a query also deletes its visualizations, sets query_id to nil
on the dashboard cards that showed it and sets source_query_id to nil on
the dashboard filters that got their options from it. Those changes fire no event; the
query's :delete is the event to gate and to record. See Lotus.Middleware.
Summary
Functions
Creates a new query.
Deletes a query.
Gets a single query by ID.
Gets a single query by ID.
Lists all queries from the database.
Lists queries with filtering search term.
Run a saved query directly from Storage.
Updates a query.
Types
@type attrs() :: map()
@type changeset_error() :: Ecto.Changeset.t()
@type query_list() :: [Lotus.Storage.Query.t()]
Functions
@spec create_query(attrs(), keyword()) :: {:ok, Lotus.Storage.Query.t()} | {:error, changeset_error() | Lotus.Middleware.halted()}
Creates a new query.
Examples
iex> create_query(%{name: "Users", statement: "SELECT * FROM users"})
{:ok, %Query{}}
iex> create_query(%{})
{:error, %Ecto.Changeset{}}
@spec delete_query(Lotus.Storage.Query.t(), keyword()) :: {:ok, Lotus.Storage.Query.t()} | {:error, changeset_error() | Lotus.Middleware.halted()}
Deletes a query.
Examples
iex> delete_query(query)
{:ok, %Query{}}
@spec get_query(id()) :: Lotus.Storage.Query.t() | nil
Gets a single query by ID.
Returns nil if the Query does not exist.
@spec get_query!(id()) :: Lotus.Storage.Query.t() | no_return()
Gets a single query by ID.
Raises Ecto.NoResultsError if the Query does not exist.
@spec list_queries() :: query_list()
Lists all queries from the database.
Returns a list of Query structs.
@spec list_queries_by(keyword()) :: [Lotus.Storage.Query.t()]
Lists queries with filtering search term.
Options
:search- Search term to match against query names (case insensitive)
Examples
iex> list_queries_by(search: "user")
[%Query{}, ...]
@spec run(Lotus.Storage.Query.t(), keyword()) :: {:ok, Lotus.Result.t()} | {:error, term()}
Run a saved query directly from Storage.
This is a convenience function that delegates to Lotus.run_query/2.
Examples
query = get_query!(123)
{:ok, result} = run(query, statement_timeout_ms: 3_000)
@spec update_query(Lotus.Storage.Query.t(), attrs(), keyword()) :: {:ok, Lotus.Storage.Query.t()} | {:error, changeset_error() | Lotus.Middleware.halted()}
Updates a query.
Examples
iex> update_query(query, %{name: "New Name"})
{:ok, %Query{}}
iex> update_query(query, %{name: ""})
{:error, %Ecto.Changeset{}}