Skip to main content

PivotExpander

Struct PivotExpander 

Source
pub struct PivotExpander;
Expand description

PIVOT Expander - Transforms PIVOT syntax into standard SQL with CASE expressions

This transformer converts SQL Server-style PIVOT operations into standard SQL using CASE expressions and GROUP BY clauses.

Transformation Example:

-- Input (PIVOT syntax):
SELECT * FROM food_eaten
PIVOT (MAX(AmountEaten) FOR FoodName IN ('Sammich', 'Pickle', 'Apple'))

-- Output (Standard SQL):
SELECT Date,
    MAX(CASE WHEN FoodName = 'Sammich' THEN AmountEaten ELSE NULL END) AS Sammich,
    MAX(CASE WHEN FoodName = 'Pickle' THEN AmountEaten ELSE NULL END) AS Pickle,
    MAX(CASE WHEN FoodName = 'Apple' THEN AmountEaten ELSE NULL END) AS Apple
FROM food_eaten
GROUP BY Date

The algorithm:

  1. Detect PIVOT in FROM clause or JOINs
  2. Extract PIVOT specification (aggregate function, pivot column, pivot values)
  3. Generate CASE expression for each pivot value
  4. Wrap each CASE in the aggregate function
  5. Determine GROUP BY columns (all source columns except pivot_column and aggregate_column)
  6. Build new SelectStatement with CASE expressions and GROUP BY

Implementations§

Source§

impl PivotExpander

Source

pub fn expand(statement: SelectStatement) -> Result<SelectStatement>

Transform a SELECT statement, expanding any PIVOT operations

Source

pub fn expand_pivot( source: &TableSource, aggregate: &PivotAggregate, pivot_column: &str, pivot_values: &[String], alias: &Option<String>, ) -> Result<SelectStatement>

Expand a PIVOT operation into CASE expressions + GROUP BY

Trait Implementations§

Source§

impl ASTTransformer for PivotExpander

Source§

fn name(&self) -> &str

Name of this transformer (for logging and debugging)
Source§

fn description(&self) -> &str

Description of what this transformer does
Source§

fn transform(&mut self, stmt: SelectStatement) -> Result<SelectStatement>

Transform the AST, returning the modified statement Read more
Source§

fn enabled(&self) -> bool

Whether this transformer is enabled
Source§

fn begin(&mut self) -> Result<()>

Called before transformation starts (for initialization)
Source§

fn end(&mut self) -> Result<()>

Called after transformation completes (for cleanup)
Source§

impl Default for PivotExpander

Source§

fn default() -> Self

Returns the “default value” for a type. Read more

Auto Trait Implementations§

Blanket Implementations§

Source§

impl<T> Any for T
where T: 'static + ?Sized,

Source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
Source§

impl<T> Borrow<T> for T
where T: ?Sized,

Source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
Source§

impl<T> BorrowMut<T> for T
where T: ?Sized,

Source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

Source§

impl<T> Instrument for T

Source§

fn instrument(self, span: Span) -> Instrumented<Self>

Instruments this type with the provided Span, returning an Instrumented wrapper. Read more
Source§

fn in_current_span(self) -> Instrumented<Self>

Instruments this type with the current Span, returning an Instrumented wrapper. Read more
Source§

impl<T, U> Into<U> for T
where U: From<T>,

Source§

fn into(self) -> U

Calls U::from(self).

That is, this conversion is whatever the implementation of From<T> for U chooses to do.

Source§

impl<T> IntoEither for T

Source§

fn into_either(self, into_left: bool) -> Either<Self, Self>

Converts self into a Left variant of Either<Self, Self> if into_left is true. Converts self into a Right variant of Either<Self, Self> otherwise. Read more
Source§

fn into_either_with<F>(self, into_left: F) -> Either<Self, Self>
where F: FnOnce(&Self) -> bool,

Converts self into a Left variant of Either<Self, Self> if into_left(&self) returns true. Converts self into a Right variant of Either<Self, Self> otherwise. Read more
Source§

impl<T> Same for T

Source§

type Output = T

Should always be Self
Source§

impl<T, U> TryFrom<U> for T
where U: Into<T>,

Source§

type Error = Infallible

The type returned in the event of a conversion error.
Source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
Source§

impl<T, U> TryInto<U> for T
where U: TryFrom<T>,

Source§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
Source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
Source§

impl<V, T> VZip<V> for T
where V: MultiLane<T>,

Source§

fn vzip(self) -> V

Source§

impl<T> WithSubscriber for T

Source§

fn with_subscriber<S>(self, subscriber: S) -> WithDispatch<Self>
where S: Into<Dispatch>,

Attaches the provided Subscriber to this type, returning a WithDispatch wrapper. Read more
Source§

fn with_current_subscriber(self) -> WithDispatch<Self>

Attaches the current default Subscriber to this type, returning a WithDispatch wrapper. Read more