pub struct ReplaceDistinctWithAggregate {}
Expand description

Optimizer that replaces logical [Distinct] with a logical [Aggregate]

SELECT DISTINCT a, b FROM tab

Into

SELECT a, b FROM tab GROUP BY a, b

On the other hand, for a DISTINCT ON query the replacement is a bit more involved and effectively converts

SELECT DISTINCT ON (a) b FROM tab ORDER BY a DESC, c

into

SELECT b FROM (
    SELECT a, FIRST_VALUE(b ORDER BY a DESC, c) AS b
    FROM tab
    GROUP BY a
)
ORDER BY a DESC

Optimizer that replaces logical [Distinct] with a logical [Aggregate]

Implementations§

Trait Implementations§

source§

impl Default for ReplaceDistinctWithAggregate

source§

fn default() -> ReplaceDistinctWithAggregate

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

impl OptimizerRule for ReplaceDistinctWithAggregate

source§

fn supports_rewrite(&self) -> bool

Does this rule support rewriting owned plans (rather than by reference)?
source§

fn rewrite( &self, plan: LogicalPlan, config: &dyn OptimizerConfig, ) -> Result<Transformed<LogicalPlan>>

Try to rewrite plan to an optimized form, returning Transformed::yes if the plan was rewritten and Transformed::no if it was not. Read more
source§

fn name(&self) -> &str

A human readable name for this optimizer rule
source§

fn apply_order(&self) -> Option<ApplyOrder>

How should the rule be applied by the optimizer? See comments on ApplyOrder for details. Read more
source§

fn try_optimize( &self, _plan: &LogicalPlan, _config: &dyn OptimizerConfig, ) -> Result<Option<LogicalPlan>>

👎Deprecated since 40.0.0: please implement supports_rewrite and rewrite instead
Try and rewrite plan to an optimized form, returning None if the plan cannot be optimized by this rule. 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, 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, U> TryFrom<U> for T
where U: Into<T>,

§

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>,

§

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<T> Allocation for T
where T: RefUnwindSafe + Send + Sync,