Selecto.Executor (Selecto v0.4.5)

Copy Markdown

Query execution engine for Selecto.

Handles execution of generated SQL queries through configured adapter or repo contexts, with proper error handling and connection management.

Summary

Functions

Get connection statistics for monitoring.

Execute a query and return results with standardized error handling.

Execute a query expecting exactly one row, returning {:ok, row} or {:error, reason}.

Execute a query as a stream of {row, columns, aliases} tuples.

Fallback execution when adapter-native repo execution is unavailable.

Execute query using an Ecto repository.

Execute a query and return results with metadata including SQL, params, and execution time.

Execute query using the default PostgreSQL adapter.

Validate connection before executing query.

Functions

connection_info(selecto)

Get connection statistics for monitoring.

Returns information about the current connection state.

execute(selecto, opts \\ [])

Execute a query and return results with standardized error handling.

Parameters

  • selecto - The Selecto struct containing connection and query info
  • opts - Execution options (currently unused but reserved for future use)

Returns

  • {:ok, {rows, columns, aliases}} - Successful execution with results
  • {:error, %Selecto.Error{}} - Execution failure with detailed error

Examples

case Selecto.Executor.execute(selecto) do
  {:ok, {rows, columns, aliases}} ->
    # Process successful results
    handle_results(rows, columns, aliases)
  {:error, error} ->
    # Handle database error
    Logger.error("Query failed: #{inspect(error)}")
end

execute_one(selecto, opts \\ [])

Execute a query expecting exactly one row, returning {:ok, row} or {:error, reason}.

Useful for queries that should return a single record (e.g., with LIMIT 1 or aggregate functions). Returns an error if zero rows or multiple rows are returned.

Examples

case Selecto.Executor.execute_one(selecto) do
  {:ok, row} ->
    # Handle single row result
    process_single_result(row)
  {:error, :no_results} ->
    # Handle case where no rows were found
  {:error, :multiple_results} ->
    # Handle case where multiple rows were found
  {:error, error} ->
    # Handle database or other errors
end

execute_stream(selecto, opts \\ [])

Execute a query as a stream of {row, columns, aliases} tuples.

Current stream support:

  • The default PostgreSQL adapter via adapter-owned stream hooks
  • Custom adapters that implement stream/4

execute_with_adapter(adapter, connection, query, params, aliases)

Execute query using a database adapter.

This function delegates to the adapter's execute/4 function, allowing for different database types like SQLite, MySQL, etc.

execute_with_connection_pool(pool_ref, query, params, aliases)

Execute query using connection pool.

execute_with_ecto_fallback(repo, query, params, aliases)

Fallback execution when adapter-native repo execution is unavailable.

Creates a temporary adapter-managed connection from repo configuration.

execute_with_ecto_repo(repo, query, params, aliases)

Execute query using an Ecto repository.

Routes repository execution through the configured adapter.

execute_with_metadata(selecto, opts \\ [])

@spec execute_with_metadata(Selecto.Types.t(), Selecto.Types.execute_options()) ::
  {:ok, Selecto.Types.execute_result(), map()} | {:error, Selecto.Error.t()}

Execute a query and return results with metadata including SQL, params, and execution time.

Parameters

  • selecto - The Selecto struct containing connection and query info
  • opts - Execution options

Returns

  • {:ok, result, metadata} - Successful execution with results and metadata
  • {:error, error} - Execution failure with detailed error

The metadata map includes:

  • :sql - The generated SQL query string
  • :params - The query parameters
  • :execution_time - Query execution time in milliseconds

Examples

case Selecto.Executor.execute_with_metadata(selecto) do
  {:ok, {rows, columns, aliases}, _meta} ->
    # Process successful results with metadata
    handle_results(rows, columns, aliases)
  {:error, error} ->
    # Handle database error
    Logger.error("Query failed: #{inspect(error)}")
end

execute_with_postgrex(conn, query, params, aliases)

Execute query using the default PostgreSQL adapter.

validate_connection(selecto)

Validate connection before executing query.

Returns :ok if connection is valid, {:error, reason} otherwise.