Package org.hibernate.dialect.function
Class AggregateWindowEmulationQueryTransformer
- java.lang.Object
-
- org.hibernate.dialect.function.AggregateWindowEmulationQueryTransformer
-
- All Implemented Interfaces:
QueryTransformer
public class AggregateWindowEmulationQueryTransformer extends Object implements 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 queryselect rank(5) within group (order by e.num) from (values (1), (2), (5)) e(num)
can be rewritten toselect 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
Constructors Constructor Description AggregateWindowEmulationQueryTransformer(Over<Object> windowFunction, List<SortSpecification> withinGroup, List<SqlAstNode> arguments)
-
Method Summary
All Methods Instance Methods Concrete Methods Modifier and Type Method Description QuerySpec
transform(CteContainer cteContainer, QuerySpec querySpec, SqmToSqlAstConverter converter)
-
-
-
Constructor Detail
-
AggregateWindowEmulationQueryTransformer
public AggregateWindowEmulationQueryTransformer(Over<Object> windowFunction, List<SortSpecification> withinGroup, List<SqlAstNode> arguments)
-
-
Method Detail
-
transform
public QuerySpec transform(CteContainer cteContainer, QuerySpec querySpec, SqmToSqlAstConverter converter)
- Specified by:
transform
in interfaceQueryTransformer
-
-