Lotus.Storage (Lotus v1.1.0)

Copy Markdown View Source

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.

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.

Types

attrs()

@type attrs() :: map()

changeset_error()

@type changeset_error() :: Ecto.Changeset.t()

id()

@type id() :: integer() | binary()

query_list()

@type query_list() :: [Lotus.Storage.Query.t()]

Functions

create_query(attrs, opts \\ [])

@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{}}

delete_query(query, opts \\ [])

@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{}}

get_query(id)

@spec get_query(id()) :: Lotus.Storage.Query.t() | nil

Gets a single query by ID.

Returns nil if the Query does not exist.

get_query!(id)

@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.

list_queries()

@spec list_queries() :: query_list()

Lists all queries from the database.

Returns a list of Query structs.

list_queries_by(opts \\ [])

@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{}, ...]

run(q, opts \\ [])

@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)

update_query(query, attrs, opts \\ [])

@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{}}