# `AshClickhouse.DataLayer.QueryBuilder`
[🔗](https://github.com/ohhi-vn/ash_clickhouse/blob/main/lib/ash_clickhouse/data_layer/query_builder.ex#L1)

Builds ClickHouse SQL from an `AshClickhouse.Query` struct.

ClickHouse is a full SQL dialect, so most Ash query features map directly:
`WHERE`, `ORDER BY`, `LIMIT`, `OFFSET`, `SELECT`, `DISTINCT`, `GROUP BY`, and
aggregate functions are all natively supported.

# `build_optimized_query`

```elixir
@spec build_optimized_query(AshClickhouse.Query.t()) :: {String.t(), list()}
```

Builds the final SELECT query and parameter list.

# `build_where_clause`

```elixir
@spec build_where_clause(list()) :: {String.t(), list()}
```

Builds a WHERE clause from a list of Ash filter expressions.

Returns `{clause, params}` where `clause` is either `""` or
`" WHERE <expr>"`.

# `build_where_clause`

```elixir
@spec build_where_clause(list(), module() | nil) :: {String.t(), list()}
```

# `cql_identifier`

```elixir
@spec cql_identifier(String.t() | atom()) :: String.t()
```

Quotes a ClickHouse identifier.

# `get_filter_columns`

```elixir
@spec get_filter_columns(list()) :: [atom()]
```

Returns the set of column names referenced by a list of filters.

# `qualified_table`

```elixir
@spec qualified_table(String.t() | nil, String.t() | nil) :: String.t()
```

Quotes a table name, optionally qualifying it with a database.

---

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