Lotus.Storage.VariableResolver (Lotus v0.16.5)

Copy Markdown View Source

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"}]

Summary

Functions

Extract variable bindings from SQL statement.

Types

variable_binding()

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

Functions

resolve_variables(sql)

@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"}]