pub trait CommandTranslator {
// Required method
fn translate_explode(
&self,
_ctx: &mut TranslationContext<'_>,
cmd: &IRCommand,
_explode_cmd: &IRExplodeCommand,
_query: QueryInput,
) -> CommandTranslationResult;
// Provided methods
fn translate_command(
&self,
ctx: &mut TranslationContext<'_>,
cmd: &IRCommand,
query: QueryInput,
) -> CommandTranslationResult { ... }
fn translate_from(
&self,
_ctx: &mut TranslationContext<'_>,
cmd: &IRCommand,
from_cmd: &IRFromCommand,
_query: QueryInput,
) -> CommandTranslationResult { ... }
fn translate_where(
&self,
_ctx: &mut TranslationContext<'_>,
cmd: &IRCommand,
where_cmd: &IRWhereCommand,
query: QueryInput,
) -> CommandTranslationResult { ... }
fn translate_select(
&self,
ctx: &mut TranslationContext<'_>,
_cmd: &IRCommand,
select_cmd: &IRSelectCommand,
query: QueryInput,
) -> CommandTranslationResult { ... }
fn translate_sort(
&self,
ctx: &mut TranslationContext<'_>,
_cmd: &IRCommand,
sort_cmd: &IRSortCommand,
query: QueryInput,
) -> CommandTranslationResult { ... }
fn translate_limit(
&self,
_ctx: &mut TranslationContext<'_>,
cmd: &IRCommand,
limit_cmd: &IRLimitCommand,
query: QueryInput,
) -> CommandTranslationResult { ... }
fn translate_agg(
&self,
ctx: &mut TranslationContext<'_>,
_cmd: &IRCommand,
agg_cmd: &IRAggCommand,
query: QueryInput,
) -> CommandTranslationResult { ... }
fn translate_window(
&self,
ctx: &mut TranslationContext<'_>,
cmd: &IRCommand,
window_cmd: &IRWindowCommand,
query: QueryInput,
) -> CommandTranslationResult { ... }
fn translate_join(
&self,
ctx: &mut TranslationContext<'_>,
cmd: &IRCommand,
join_cmd: &IRJoinCommand,
query: QueryInput,
) -> CommandTranslationResult { ... }
}Expand description
Trait for translating IR commands to SQL.
This trait provides default implementations for all command types. Dialects can override specific methods to customize SQL generation.
Required Methods§
Sourcefn translate_explode(
&self,
_ctx: &mut TranslationContext<'_>,
cmd: &IRCommand,
_explode_cmd: &IRExplodeCommand,
_query: QueryInput,
) -> CommandTranslationResult
fn translate_explode( &self, _ctx: &mut TranslationContext<'_>, cmd: &IRCommand, _explode_cmd: &IRExplodeCommand, _query: QueryInput, ) -> CommandTranslationResult
Translate an EXPLODE command.
No default implementation - EXPLODE syntax varies significantly across dialects:
- Trino:
CROSS JOIN UNNEST(array_col) AS t(col_name) - DuckDB:
unnest(array_col)as a table function
Each dialect must provide its own implementation.
Provided Methods§
Sourcefn translate_command(
&self,
ctx: &mut TranslationContext<'_>,
cmd: &IRCommand,
query: QueryInput,
) -> CommandTranslationResult
fn translate_command( &self, ctx: &mut TranslationContext<'_>, cmd: &IRCommand, query: QueryInput, ) -> CommandTranslationResult
Main dispatcher - translates any IR command to SQL.
Override this only if you need to change the dispatch logic itself. Most dialects should override individual command methods instead.
Sourcefn translate_from(
&self,
_ctx: &mut TranslationContext<'_>,
cmd: &IRCommand,
from_cmd: &IRFromCommand,
_query: QueryInput,
) -> CommandTranslationResult
fn translate_from( &self, _ctx: &mut TranslationContext<'_>, cmd: &IRCommand, from_cmd: &IRFromCommand, _query: QueryInput, ) -> CommandTranslationResult
Translate a FROM command.
FROM can have one or more inputs:
- Single input: direct table reference or CTE reference
- Multiple inputs: UNION ALL of all inputs
Sourcefn translate_where(
&self,
_ctx: &mut TranslationContext<'_>,
cmd: &IRCommand,
where_cmd: &IRWhereCommand,
query: QueryInput,
) -> CommandTranslationResult
fn translate_where( &self, _ctx: &mut TranslationContext<'_>, cmd: &IRCommand, where_cmd: &IRWhereCommand, query: QueryInput, ) -> CommandTranslationResult
Translate a WHERE command.
Adds a filter predicate to the query.
If there’s an input query, we wrap it in a subquery first. This ensures that the WHERE clause can reference column aliases from the previous SELECT (SQL doesn’t allow referencing aliases in the same SELECT’s WHERE).
Sourcefn translate_select(
&self,
ctx: &mut TranslationContext<'_>,
_cmd: &IRCommand,
select_cmd: &IRSelectCommand,
query: QueryInput,
) -> CommandTranslationResult
fn translate_select( &self, ctx: &mut TranslationContext<'_>, _cmd: &IRCommand, select_cmd: &IRSelectCommand, query: QueryInput, ) -> CommandTranslationResult
Translate a SELECT command.
If no input query, just apply projections directly (expression-only queries). Otherwise wraps the input in a subquery and applies projections.
Sourcefn translate_sort(
&self,
ctx: &mut TranslationContext<'_>,
_cmd: &IRCommand,
sort_cmd: &IRSortCommand,
query: QueryInput,
) -> CommandTranslationResult
fn translate_sort( &self, ctx: &mut TranslationContext<'_>, _cmd: &IRCommand, sort_cmd: &IRSortCommand, query: QueryInput, ) -> CommandTranslationResult
Translate a SORT command.
Adds ORDER BY clause to the query.
Sourcefn translate_limit(
&self,
_ctx: &mut TranslationContext<'_>,
cmd: &IRCommand,
limit_cmd: &IRLimitCommand,
query: QueryInput,
) -> CommandTranslationResult
fn translate_limit( &self, _ctx: &mut TranslationContext<'_>, cmd: &IRCommand, limit_cmd: &IRLimitCommand, query: QueryInput, ) -> CommandTranslationResult
Translate a LIMIT command.
Adds LIMIT clause to the query. If the query already has a LIMIT, wraps it in a subquery first to preserve both limits.
Sourcefn translate_agg(
&self,
ctx: &mut TranslationContext<'_>,
_cmd: &IRCommand,
agg_cmd: &IRAggCommand,
query: QueryInput,
) -> CommandTranslationResult
fn translate_agg( &self, ctx: &mut TranslationContext<'_>, _cmd: &IRCommand, agg_cmd: &IRAggCommand, query: QueryInput, ) -> CommandTranslationResult
Translate an AGG command.
Creates a GROUP BY query with aggregate projections.
Sourcefn translate_window(
&self,
ctx: &mut TranslationContext<'_>,
cmd: &IRCommand,
window_cmd: &IRWindowCommand,
query: QueryInput,
) -> CommandTranslationResult
fn translate_window( &self, ctx: &mut TranslationContext<'_>, cmd: &IRCommand, window_cmd: &IRWindowCommand, query: QueryInput, ) -> CommandTranslationResult
Translate a WINDOW command.
Creates window function projections with OVER clause.
WINDOW extends the input with new columns (unlike AGG which replaces). So we need to pass through all input columns AND add the window projections.
Sourcefn translate_join(
&self,
ctx: &mut TranslationContext<'_>,
cmd: &IRCommand,
join_cmd: &IRJoinCommand,
query: QueryInput,
) -> CommandTranslationResult
fn translate_join( &self, ctx: &mut TranslationContext<'_>, cmd: &IRCommand, join_cmd: &IRJoinCommand, query: QueryInput, ) -> CommandTranslationResult
Translate a JOIN command.
Creates a SQL JOIN with the specified join type and condition.