|
1 | 1 | /*
|
2 |
| - * Hibernate, Relational Persistence for Idiomatic Java |
3 |
| - * |
4 |
| - * License: GNU Lesser General Public License (LGPL), version 2.1 or later. |
5 |
| - * See the lgpl.txt file in the root directory or <http://www.gnu.org/licenses/lgpl-2.1.html>. |
| 2 | + * SPDX-License-Identifier: Apache-2.0 |
| 3 | + * Copyright Red Hat Inc. and Hibernate Authors |
6 | 4 | */
|
7 | 5 | package org.hibernate.orm.test.hql.customFunctions;
|
8 | 6 |
|
|
31 | 29 |
|
32 | 30 | //tag::hql-user-defined-dialect-function-sqm-renderer[]
|
33 | 31 | public class CountItemsGreaterValSqmFunction extends AbstractSqmSelfRenderingFunctionDescriptor {
|
34 |
| - private final CastFunction castFunction; |
35 |
| - private final BasicType<BigDecimal> bigDecimalType; |
| 32 | + private final CastFunction castFunction; |
| 33 | + private final BasicType<BigDecimal> bigDecimalType; |
36 | 34 |
|
37 |
| - public CountItemsGreaterValSqmFunction(String name, Dialect dialect, TypeConfiguration typeConfiguration) { |
38 |
| - super( |
39 |
| - name, |
40 |
| - FunctionKind.AGGREGATE, |
41 |
| - /* Function consumes 2 numeric typed args: |
42 |
| - - the aggregation argument |
43 |
| - - the bottom edge for the count predicate*/ |
44 |
| - new ArgumentTypesValidator(StandardArgumentsValidators.exactly(2), |
45 |
| - FunctionParameterType.NUMERIC, |
46 |
| - FunctionParameterType.NUMERIC |
47 |
| - ), |
48 |
| - // Function returns one value - the number of items |
49 |
| - StandardFunctionReturnTypeResolvers.invariant( |
50 |
| - typeConfiguration.getBasicTypeRegistry() |
51 |
| - .resolve(StandardBasicTypes.BIG_INTEGER) |
52 |
| - ), |
53 |
| - StandardFunctionArgumentTypeResolvers.invariant( |
54 |
| - typeConfiguration, NUMERIC, NUMERIC |
55 |
| - ) |
56 |
| - ); |
57 |
| - // Extracting cast function for setting input arguments to correct the type |
58 |
| - castFunction = new CastFunction( |
59 |
| - dialect, |
60 |
| - dialect.getPreferredSqlTypeCodeForBoolean() |
61 |
| - ); |
62 |
| - bigDecimalType = typeConfiguration.getBasicTypeRegistry() |
63 |
| - .resolve(StandardBasicTypes.BIG_DECIMAL); |
64 |
| - } |
| 35 | + public CountItemsGreaterValSqmFunction(String name, Dialect dialect, TypeConfiguration typeConfiguration) { |
| 36 | + super( |
| 37 | + name, |
| 38 | + FunctionKind.AGGREGATE, |
| 39 | + /* Function consumes 2 numeric typed args: |
| 40 | + - the aggregation argument |
| 41 | + - the bottom edge for the count predicate*/ |
| 42 | + new ArgumentTypesValidator(StandardArgumentsValidators.exactly(2), |
| 43 | + FunctionParameterType.NUMERIC, |
| 44 | + FunctionParameterType.NUMERIC |
| 45 | + ), |
| 46 | + // Function returns one value - the number of items |
| 47 | + StandardFunctionReturnTypeResolvers.invariant( |
| 48 | + typeConfiguration.getBasicTypeRegistry() |
| 49 | + .resolve(StandardBasicTypes.BIG_INTEGER) |
| 50 | + ), |
| 51 | + StandardFunctionArgumentTypeResolvers.invariant( |
| 52 | + typeConfiguration, NUMERIC, NUMERIC |
| 53 | + ) |
| 54 | + ); |
| 55 | + // Extracting cast function for setting input arguments to correct the type |
| 56 | + castFunction = new CastFunction( |
| 57 | + dialect, |
| 58 | + dialect.getPreferredSqlTypeCodeForBoolean() |
| 59 | + ); |
| 60 | + bigDecimalType = typeConfiguration.getBasicTypeRegistry() |
| 61 | + .resolve(StandardBasicTypes.BIG_DECIMAL); |
| 62 | + } |
65 | 63 |
|
66 |
| - @Override |
67 |
| - public void render( |
68 |
| - SqlAppender sqlAppender, |
69 |
| - List<? extends SqlAstNode> sqlAstArguments, |
70 |
| - SqlAstTranslator<?> walker) { |
71 |
| - render(sqlAppender, sqlAstArguments, null, walker); |
72 |
| - } |
| 64 | + @Override |
| 65 | + public void render( |
| 66 | + SqlAppender sqlAppender, |
| 67 | + List<? extends SqlAstNode> sqlAstArguments, |
| 68 | + SqlAstTranslator<?> walker) { |
| 69 | + render(sqlAppender, sqlAstArguments, null, walker); |
| 70 | + } |
73 | 71 |
|
74 |
| - //tag::hql-user-defined-dialect-function-sqm-renderer-definition[] |
75 |
| - @Override |
76 |
| - public void render( |
77 |
| - SqlAppender sqlAppender, |
78 |
| - List<? extends SqlAstNode> sqlAstArguments, |
79 |
| - Predicate filter, |
80 |
| - SqlAstTranslator<?> translator) { |
81 |
| - // Renderer definition |
82 |
| - //end::hql-user-defined-dialect-function-sqm-renderer[] |
| 72 | + //tag::hql-user-defined-dialect-function-sqm-renderer-definition[] |
| 73 | + @Override |
| 74 | + public void render( |
| 75 | + SqlAppender sqlAppender, |
| 76 | + List<? extends SqlAstNode> sqlAstArguments, |
| 77 | + Predicate filter, |
| 78 | + SqlAstTranslator<?> translator) { |
| 79 | + // Renderer definition |
| 80 | + //end::hql-user-defined-dialect-function-sqm-renderer[] |
83 | 81 |
|
84 |
| - // Appending name of SQL function to result query |
85 |
| - sqlAppender.appendSql(getName()); |
86 |
| - sqlAppender.appendSql('('); |
| 82 | + // Appending name of SQL function to result query |
| 83 | + sqlAppender.appendSql(getName()); |
| 84 | + sqlAppender.appendSql('('); |
87 | 85 |
|
88 |
| - // Extracting 2 arguments |
89 |
| - final Expression first_arg = (Expression) sqlAstArguments.get(0); |
90 |
| - final Expression second_arg = (Expression) sqlAstArguments.get(1); |
| 86 | + // Extracting 2 arguments |
| 87 | + final Expression first_arg = (Expression) sqlAstArguments.get(0); |
| 88 | + final Expression second_arg = (Expression) sqlAstArguments.get(1); |
91 | 89 |
|
92 |
| - // If JPQL contains "filter" expression, but database doesn't support it |
93 |
| - // then append: function_name(case when (filter_expr) then (argument) else null end) |
94 |
| - final boolean caseWrapper = filter != null && !translator.supportsFilterClause(); |
95 |
| - if (caseWrapper) { |
96 |
| - translator.getCurrentClauseStack().push(Clause.WHERE); |
97 |
| - sqlAppender.appendSql("case when "); |
| 90 | + // If JPQL contains "filter" expression, but database doesn't support it |
| 91 | + // then append: function_name(case when (filter_expr) then (argument) else null end) |
| 92 | + final boolean caseWrapper = filter != null && !translator.supportsFilterClause(); |
| 93 | + if (caseWrapper) { |
| 94 | + translator.getCurrentClauseStack().push(Clause.WHERE); |
| 95 | + sqlAppender.appendSql("case when "); |
98 | 96 |
|
99 |
| - filter.accept(translator); |
100 |
| - translator.getCurrentClauseStack().pop(); |
| 97 | + filter.accept(translator); |
| 98 | + translator.getCurrentClauseStack().pop(); |
101 | 99 |
|
102 |
| - sqlAppender.appendSql(" then "); |
103 |
| - renderArgument(sqlAppender, translator, first_arg); |
104 |
| - sqlAppender.appendSql(" else null end)"); |
105 |
| - } else { |
106 |
| - renderArgument(sqlAppender, translator, first_arg); |
107 |
| - sqlAppender.appendSql(", "); |
108 |
| - renderArgument(sqlAppender, translator, second_arg); |
109 |
| - sqlAppender.appendSql(')'); |
110 |
| - if (filter != null) { |
111 |
| - translator.getCurrentClauseStack().push(Clause.WHERE); |
112 |
| - sqlAppender.appendSql(" filter (where "); |
| 100 | + sqlAppender.appendSql(" then "); |
| 101 | + renderArgument(sqlAppender, translator, first_arg); |
| 102 | + sqlAppender.appendSql(" else null end)"); |
| 103 | + } else { |
| 104 | + renderArgument(sqlAppender, translator, first_arg); |
| 105 | + sqlAppender.appendSql(", "); |
| 106 | + renderArgument(sqlAppender, translator, second_arg); |
| 107 | + sqlAppender.appendSql(')'); |
| 108 | + if (filter != null) { |
| 109 | + translator.getCurrentClauseStack().push(Clause.WHERE); |
| 110 | + sqlAppender.appendSql(" filter (where "); |
113 | 111 |
|
114 |
| - filter.accept(translator); |
115 |
| - sqlAppender.appendSql(')'); |
116 |
| - translator.getCurrentClauseStack().pop(); |
117 |
| - } |
118 |
| - } |
119 |
| - //tag::hql-user-defined-dialect-function-sqm-renderer[] |
120 |
| - } |
| 112 | + filter.accept(translator); |
| 113 | + sqlAppender.appendSql(')'); |
| 114 | + translator.getCurrentClauseStack().pop(); |
| 115 | + } |
| 116 | + } |
| 117 | + //tag::hql-user-defined-dialect-function-sqm-renderer[] |
| 118 | + } |
121 | 119 |
|
122 |
| - //end::hql-user-defined-dialect-function-sqm-renderer[] |
123 |
| - private void renderArgument( |
124 |
| - SqlAppender sqlAppender, |
125 |
| - SqlAstTranslator<?> translator, |
126 |
| - Expression arg) { |
127 |
| - // Extracting the type of argument |
128 |
| - final JdbcMapping sourceMapping = arg.getExpressionType().getJdbcMappings().get(0); |
129 |
| - if (sourceMapping.getJdbcType().isNumber()) { |
130 |
| - castFunction.render(sqlAppender, |
131 |
| - Arrays.asList(arg, new CastTarget(bigDecimalType)), |
132 |
| - translator |
133 |
| - ); |
134 |
| - } else { |
135 |
| - arg.accept(translator); |
136 |
| - } |
137 |
| - } |
138 |
| - //tag::hql-user-defined-dialect-function-sqm-renderer[] |
139 |
| - //end::hql-user-defined-dialect-function-sqm-renderer-definition[] |
| 120 | + //end::hql-user-defined-dialect-function-sqm-renderer[] |
| 121 | + private void renderArgument( |
| 122 | + SqlAppender sqlAppender, |
| 123 | + SqlAstTranslator<?> translator, |
| 124 | + Expression arg) { |
| 125 | + // Extracting the type of argument |
| 126 | + final JdbcMapping sourceMapping = arg.getExpressionType().getJdbcMappings().get(0); |
| 127 | + if (sourceMapping.getJdbcType().isNumber()) { |
| 128 | + castFunction.render(sqlAppender, |
| 129 | + Arrays.asList(arg, new CastTarget(bigDecimalType)), |
| 130 | + translator |
| 131 | + ); |
| 132 | + } else { |
| 133 | + arg.accept(translator); |
| 134 | + } |
| 135 | + } |
| 136 | + //tag::hql-user-defined-dialect-function-sqm-renderer[] |
| 137 | + //end::hql-user-defined-dialect-function-sqm-renderer-definition[] |
140 | 138 | }
|
141 | 139 | //end::hql-user-defined-dialect-function-sqm-renderer[]
|
0 commit comments