Package org.hibernate.dialect.function
Class AggregateWindowEmulationQueryTransformer
java.lang.Object
org.hibernate.dialect.function.AggregateWindowEmulationQueryTransformer
- All Implemented Interfaces:
QueryTransformer
Since the query spec will render a hypothetical set window function instead of an aggregate,
the following query transformer will wrap the query spec and apply aggregation in the outer query.
We can do this because these functions can only be used in the select clause.
A hypothetical set aggregate function like e.g. "rank" returns the rank of a passed value within
the ordered set as defined through the WITHIN GROUP clause.
When used as window function, the function provides the rank of the current row within the ordered set
as defined for the window frame through the OVER clause, but does not do aggregation.
The aggregation effect can be achieved by:
1. Selecting the elements by which the ordered set is sorted
2. In the outer query, add a comparison predicate `function_args`=`sort_expressions`
3. Use an arbitrary row produced by the inner query by using e.g. the "min" function
The following query
select rank(5) within group (order by e.num)
from (values (1), (2), (5)) e(num)
can be rewritten to
select min(t.c1) from (
select rank() over (order by e.num), e.num
from (values (1), (2), (5)) e(num)
) t(c1,c2)
where t.c2 = 5
-
Constructor Summary
ConstructorsConstructorDescriptionAggregateWindowEmulationQueryTransformer
(Over<Object> windowFunction, List<SortSpecification> withinGroup, List<SqlAstNode> arguments) -
Method Summary
Modifier and TypeMethodDescriptiontransform
(CteContainer cteContainer, QuerySpec querySpec, SqmToSqlAstConverter converter)
-
Constructor Details
-
AggregateWindowEmulationQueryTransformer
public AggregateWindowEmulationQueryTransformer(Over<Object> windowFunction, List<SortSpecification> withinGroup, List<SqlAstNode> arguments)
-
-
Method Details
-
transform
public QuerySpec transform(CteContainer cteContainer, QuerySpec querySpec, SqmToSqlAstConverter converter) - Specified by:
transform
in interfaceQueryTransformer
-