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

Extracts variable-to-column bindings from SQL queries.

Parses SQL queries to determine which table.column each `{{variable}}` binds to.
Uses regex-based heuristics (not full SQL parsing) for simplicity and performance.
Handles 95% of common query patterns.

## Supported Patterns

1. **Explicit**: `WHERE users.id = {{user_id}}`
2. **Implicit**: `WHERE id = {{user_id}}` (resolves table from FROM clause)
3. **Multiple vars**: `WHERE users.id = {{id}} AND users.email = {{email}}`
4. **Aliased tables**: `WHERE u.id = {{id}}` (resolves alias 'u' to 'users')

## Limitations

- Does not handle subqueries or complex JOINs perfectly
- Assumes first table in FROM clause for implicit bindings
- Best-effort heuristics, not a full SQL parser

## Usage

    sql = "SELECT * FROM users WHERE users.id = {{user_id}}"
    VariableResolver.resolve_variables(sql)
    # => [%{variable: "user_id", table: "users", column: "id"}]

# `variable_binding`

```elixir
@type variable_binding() :: %{
  variable: String.t(),
  table: String.t() | nil,
  column: String.t()
}
```

# `resolve_variables`

```elixir
@spec resolve_variables(sql :: String.t()) :: [variable_binding()]
```

Extract variable bindings from SQL statement.

Returns list of bindings for each variable found in the query.

## Examples

    # Explicit binding
    resolve_variables("SELECT * FROM users WHERE users.id = {{user_id}}")
    # => [%{variable: "user_id", table: "users", column: "id"}]

    # Implicit binding
    resolve_variables("SELECT * FROM users WHERE id = {{user_id}}")
    # => [%{variable: "user_id", table: "users", column: "id"}]

    # With alias
    resolve_variables("SELECT * FROM users u WHERE u.id = {{user_id}}")
    # => [%{variable: "user_id", table: "users", column: "id"}]

---

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