# `Lotus.Storage`
[🔗](https://github.com/typhoonworks/lotus/blob/v0.16.4/lib/lotus/storage.ex#L1)

Storage operations for Lotus queries.

Handles CRUD operations for persisting and retrieving queries.

# `attrs`

```elixir
@type attrs() :: map()
```

# `changeset_error`

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

# `id`

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

# `query_list`

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

# `create_query`

```elixir
@spec create_query(attrs()) ::
  {:ok, Lotus.Storage.Query.t()} | {:error, changeset_error()}
```

Creates a new query.

## Examples

    iex> create_query(%{name: "Users", statement: "SELECT * FROM users"})
    {:ok, %Query{}}

    iex> create_query(%{})
    {:error, %Ecto.Changeset{}}

# `delete_query`

```elixir
@spec delete_query(Lotus.Storage.Query.t()) ::
  {:ok, Lotus.Storage.Query.t()} | {:error, changeset_error()}
```

Deletes a query.

## Examples

    iex> delete_query(query)
    {:ok, %Query{}}

# `get_query`

```elixir
@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!`

```elixir
@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`

```elixir
@spec list_queries() :: query_list()
```

Lists all queries from the database.

Returns a list of Query structs.

# `list_queries_by`

```elixir
@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`

```elixir
@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`

```elixir
@spec update_query(Lotus.Storage.Query.t(), attrs()) ::
  {:ok, Lotus.Storage.Query.t()} | {:error, changeset_error()}
```

Updates a query.

## Examples

    iex> update_query(query, %{name: "New Name"})
    {:ok, %Query{}}

    iex> update_query(query, %{name: ""})
    {:error, %Ecto.Changeset{}}

---

*Consult [api-reference.md](api-reference.md) for complete listing*
