From e715a5eec2641e7ca64ff3d6c62b0cc8ec8910e5 Mon Sep 17 00:00:00 2001 From: Gavin King Date: Thu, 11 Sep 2025 10:44:12 +0200 Subject: [PATCH] minor cleanups to things implementing ArgumentsValidator --- .../dialect/function/AvgFunction.java | 97 +++++++++--------- .../dialect/function/ChrLiteralEmulation.java | 7 +- .../dialect/function/DateTruncEmulation.java | 52 +++++----- .../function/DynamicDispatchFunction.java | 68 +++++++------ .../GenerateSeriesArgumentValidator.java | 27 +++-- .../dialect/function/TruncFunction.java | 98 +++++++------------ .../ArrayAndElementArgumentValidator.java | 11 +-- .../array/ArrayArgumentValidator.java | 22 ++--- .../array/ArrayConstructorFunction.java | 8 +- .../array/ArrayContainsArgumentValidator.java | 9 +- .../array/ArrayIncludesArgumentValidator.java | 7 +- .../ArraysOfSameTypeArgumentValidator.java | 8 +- .../json/JsonObjectArgumentsValidator.java | 68 ++++++------- .../function/xml/XmlElementFunction.java | 13 +-- .../function/xml/XmlForestFunction.java | 2 +- .../org/hibernate/query/sqm/NodeBuilder.java | 2 + .../sqm/internal/SqmCriteriaNodeBuilder.java | 1 + .../function/ArgumentTypesValidator.java | 47 +++++---- .../function/StandardArgumentsValidators.java | 8 +- 19 files changed, 253 insertions(+), 302 deletions(-) diff --git a/hibernate-core/src/main/java/org/hibernate/dialect/function/AvgFunction.java b/hibernate-core/src/main/java/org/hibernate/dialect/function/AvgFunction.java index 8f1f3a7a5b4d..f1d3274d61ef 100644 --- a/hibernate-core/src/main/java/org/hibernate/dialect/function/AvgFunction.java +++ b/hibernate-core/src/main/java/org/hibernate/dialect/function/AvgFunction.java @@ -4,18 +4,17 @@ */ package org.hibernate.dialect.function; -import java.util.Arrays; import java.util.List; import java.util.Locale; import java.util.function.Supplier; +import org.hibernate.AssertionFailure; import org.hibernate.dialect.Dialect; import org.hibernate.metamodel.mapping.BasicValuedMapping; import org.hibernate.metamodel.mapping.JdbcMapping; import org.hibernate.metamodel.model.domain.DomainType; import org.hibernate.metamodel.model.domain.ReturnableType; import org.hibernate.type.BindingContext; -import org.hibernate.query.sqm.SqmExpressible; import org.hibernate.query.sqm.function.AbstractSqmSelfRenderingFunctionDescriptor; import org.hibernate.query.sqm.function.FunctionKind; import org.hibernate.query.sqm.produce.function.ArgumentsValidator; @@ -35,9 +34,7 @@ import org.hibernate.sql.ast.tree.predicate.Predicate; import org.hibernate.type.BasicPluralType; import org.hibernate.type.BasicType; -import org.hibernate.type.SqlTypes; import org.hibernate.type.StandardBasicTypes; -import org.hibernate.type.descriptor.java.JavaType; import org.hibernate.type.descriptor.jdbc.ArrayJdbcType; import org.hibernate.type.descriptor.jdbc.JdbcType; import org.hibernate.type.descriptor.jdbc.ObjectJdbcType; @@ -45,7 +42,9 @@ import org.checkerframework.checker.nullness.qual.Nullable; +import static java.util.Arrays.asList; import static org.hibernate.query.sqm.produce.function.FunctionParameterType.NUMERIC; +import static org.hibernate.type.SqlTypes.isNumericType; /** * @author Christian Beikov @@ -90,15 +89,20 @@ public void render( Predicate filter, ReturnableType returnType, SqlAstTranslator translator) { - final boolean caseWrapper = filter != null && !filterClauseSupported( translator ); + final boolean caseWrapper = + filter != null && !filterClauseSupported( translator ); sqlAppender.appendSql( "avg(" ); final Expression arg; - if ( sqlAstArguments.get( 0 ) instanceof Distinct ) { + final var argNode = sqlAstArguments.get( 0 ); + if ( argNode instanceof Distinct distinct ) { sqlAppender.appendSql( "distinct " ); - arg = ( (Distinct) sqlAstArguments.get( 0 ) ).getExpression(); + arg = distinct.getExpression(); + } + else if ( argNode instanceof Expression expression ) { + arg = expression; } else { - arg = (Expression) sqlAstArguments.get( 0 ); + throw new AssertionFailure( "Unexpected argument type" ); } if ( caseWrapper ) { translator.getCurrentClauseStack().push( Clause.WHERE ); @@ -128,7 +132,7 @@ private void renderArgument(SqlAppender sqlAppender, SqlAstTranslator transla if ( sourceMapping.getJdbcType().isInteger() ) { castFunction.render( sqlAppender, - Arrays.asList( realArg, new CastTarget( doubleType ) ), + asList( realArg, new CastTarget( doubleType ) ), doubleType, translator ); @@ -163,34 +167,31 @@ public void validate( ) ); } - final SqmTypedNode argument = arguments.get( 0 ); - final SqmExpressible expressible = argument.getExpressible(); - final DomainType domainType; - if ( expressible != null && ( domainType = expressible.getSqmType() ) != null ) { - final JdbcType jdbcType = getJdbcType( domainType, bindingContext.getTypeConfiguration() ); - if ( !isNumeric( jdbcType ) ) { - throw new FunctionArgumentException( - String.format( - "Parameter %d of function '%s()' has type '%s', but argument is of type '%s'", - 1, - functionName, - NUMERIC, - domainType.getTypeName() - ) - ); + final var expressible = arguments.get( 0 ).getExpressible(); + if ( expressible != null ) { + final var domainType = expressible.getSqmType(); + if ( domainType != null ) { + final var jdbcType = getJdbcType( domainType, bindingContext.getTypeConfiguration() ); + if ( !isNumeric( jdbcType ) ) { + throw new FunctionArgumentException( + String.format( + "Parameter %d of function '%s()' has type '%s', but argument is of type '%s'", + 1, + functionName, + NUMERIC, + domainType.getTypeName() + ) + ); + } } } } private static boolean isNumeric(JdbcType jdbcType) { final int sqlTypeCode = jdbcType.getDefaultSqlTypeCode(); - if ( SqlTypes.isNumericType( sqlTypeCode ) ) { - return true; - } - if ( jdbcType instanceof ArrayJdbcType arrayJdbcType ) { - return isNumeric( arrayJdbcType.getElementJdbcType() ); - } - return false; + return isNumericType( sqlTypeCode ) + || jdbcType instanceof ArrayJdbcType arrayJdbcType + && isNumeric( arrayJdbcType.getElementJdbcType() ); } private static JdbcType getJdbcType(DomainType domainType, TypeConfiguration typeConfiguration) { @@ -198,14 +199,11 @@ private static JdbcType getJdbcType(DomainType domainType, TypeConfiguration return jdbcMapping.getJdbcType(); } else { - final JavaType javaType = domainType.getExpressibleJavaType(); - if ( javaType.getJavaTypeClass().isEnum() ) { - // we can't tell if the enum is mapped STRING or ORDINAL - return ObjectJdbcType.INSTANCE; - } - else { - return javaType.getRecommendedJdbcType( typeConfiguration.getCurrentBaseSqlTypeIndicators() ); - } + final var javaType = domainType.getExpressibleJavaType(); + return javaType.getJavaTypeClass().isEnum() + // we can't tell if the enum is mapped STRING or ORDINAL + ? ObjectJdbcType.INSTANCE + : javaType.getRecommendedJdbcType( typeConfiguration.getCurrentBaseSqlTypeIndicators() ); } } @@ -220,23 +218,24 @@ public static class ReturnTypeResolver implements FunctionReturnTypeResolver { private final BasicType doubleType; public ReturnTypeResolver(TypeConfiguration typeConfiguration) { - this.doubleType = typeConfiguration.getBasicTypeRegistry().resolve( StandardBasicTypes.DOUBLE ); + doubleType = typeConfiguration.getBasicTypeRegistry().resolve( StandardBasicTypes.DOUBLE ); } @Override public BasicValuedMapping resolveFunctionReturnType( Supplier impliedTypeAccess, List arguments) { - final BasicValuedMapping impliedType = impliedTypeAccess.get(); + final var impliedType = impliedTypeAccess.get(); if ( impliedType != null ) { return impliedType; } - Expression expression = (Expression) arguments.get( 0 ); - final JdbcMapping jdbcMapping = expression.getExpressionType().getSingleJdbcMapping(); - if ( jdbcMapping instanceof BasicPluralType ) { - return (BasicValuedMapping) jdbcMapping; + else { + var expression = (Expression) arguments.get( 0 ); + final var jdbcMapping = expression.getExpressionType().getSingleJdbcMapping(); + return jdbcMapping instanceof BasicPluralType + ? (BasicValuedMapping) jdbcMapping + : doubleType; } - return doubleType; } @Override @@ -245,9 +244,9 @@ public ReturnableType resolveFunctionReturnType( @Nullable SqmToSqlAstConverter converter, List> arguments, TypeConfiguration typeConfiguration) { - final SqmExpressible expressible = arguments.get( 0 ).getExpressible(); - final DomainType domainType; - if ( expressible != null && ( domainType = expressible.getSqmType() ) != null ) { + final var expressible = arguments.get( 0 ).getExpressible(); + if ( expressible != null ) { + final var domainType = expressible.getSqmType(); if ( domainType instanceof BasicPluralType ) { return (ReturnableType) domainType; } diff --git a/hibernate-core/src/main/java/org/hibernate/dialect/function/ChrLiteralEmulation.java b/hibernate-core/src/main/java/org/hibernate/dialect/function/ChrLiteralEmulation.java index 89622f385722..84fb8e387853 100644 --- a/hibernate-core/src/main/java/org/hibernate/dialect/function/ChrLiteralEmulation.java +++ b/hibernate-core/src/main/java/org/hibernate/dialect/function/ChrLiteralEmulation.java @@ -43,12 +43,13 @@ public ChrLiteralEmulation(TypeConfiguration typeConfiguration) { new ArgumentsValidator() { @Override public void validate(List> arguments, String functionName, BindingContext bindingContext) { - if ( !( arguments.get( 0 ) instanceof SqmLiteral ) ) { + final var arg = arguments.get( 0 ); + if ( !( arg instanceof SqmLiteral ) ) { throw new QueryException( String.format( Locale.ROOT, "Emulation of function chr() supports only integer literals, but %s argument given", - arguments.get( 0 ).getClass().getName() + arg.getClass().getName() ) ); } @@ -71,7 +72,7 @@ public void render( ReturnableType returnType, SqlAstTranslator walker) { @SuppressWarnings("unchecked") - final QueryLiteral literal = (QueryLiteral) arguments.get( 0 ); + final var literal = (QueryLiteral) arguments.get( 0 ); sqlAppender.appendSql( '\'' ); sqlAppender.appendSql( (char) literal.getLiteralValue().intValue() ); sqlAppender.appendSql( '\'' ); diff --git a/hibernate-core/src/main/java/org/hibernate/dialect/function/DateTruncEmulation.java b/hibernate-core/src/main/java/org/hibernate/dialect/function/DateTruncEmulation.java index 4b8f898bf9e1..e0e39a3f0700 100644 --- a/hibernate-core/src/main/java/org/hibernate/dialect/function/DateTruncEmulation.java +++ b/hibernate-core/src/main/java/org/hibernate/dialect/function/DateTruncEmulation.java @@ -103,37 +103,31 @@ protected SelfRenderingSqmFunction generateSqmFunctionExpression( default: throw new UnsupportedOperationException( "Temporal unit not supported [" + temporalUnit + "]" ); } - final SqmTypedNode datetime = arguments.get( 0 ); - final SqmExpression formatExpression = queryEngine.getSqmFunctionRegistry() - .findFunctionDescriptor( "format" ) - .generateSqmExpression( - asList( - datetime, - new SqmFormat( - pattern, - nodeBuilder.getTypeConfiguration().getBasicTypeForJavaType( String.class ), - nodeBuilder - ) - ), - null, - queryEngine - ); + final var datetime = arguments.get( 0 ); + final var formatExpression = + queryEngine.getSqmFunctionRegistry() + .findFunctionDescriptor( "format" ) + .generateSqmExpression( + asList( + datetime, + new SqmFormat( pattern, nodeBuilder.getStringType(), nodeBuilder ) + ), + null, + queryEngine + ); final SqmExpression formattedDatetime; if ( literal != null ) { - formattedDatetime = queryEngine.getSqmFunctionRegistry() - .findFunctionDescriptor( "concat" ) - .generateSqmExpression( - asList( - formatExpression, - new SqmLiteral<>( - literal, - nodeBuilder.getTypeConfiguration().getBasicTypeForJavaType( String.class ), - nodeBuilder - ) - ), - null, - queryEngine - ); + formattedDatetime = + queryEngine.getSqmFunctionRegistry() + .findFunctionDescriptor( "concat" ) + .generateSqmExpression( + asList( + formatExpression, + new SqmLiteral<>( literal, nodeBuilder.getStringType(), nodeBuilder ) + ), + null, + queryEngine + ); } else { formattedDatetime = formatExpression; diff --git a/hibernate-core/src/main/java/org/hibernate/dialect/function/DynamicDispatchFunction.java b/hibernate-core/src/main/java/org/hibernate/dialect/function/DynamicDispatchFunction.java index eaad01a24512..c63a98d23236 100644 --- a/hibernate-core/src/main/java/org/hibernate/dialect/function/DynamicDispatchFunction.java +++ b/hibernate-core/src/main/java/org/hibernate/dialect/function/DynamicDispatchFunction.java @@ -33,11 +33,14 @@ public class DynamicDispatchFunction implements SqmFunctionDescriptor, Arguments public DynamicDispatchFunction(SqmFunctionRegistry functionRegistry, String... functionNames) { this.functionRegistry = functionRegistry; this.functionNames = functionNames; + this.functionKind = functionKind( functionRegistry, functionNames ); + } + private static FunctionKind functionKind(SqmFunctionRegistry functionRegistry, String[] functionNames) { FunctionKind functionKind = null; // Sanity check for ( String overload : functionNames ) { - final SqmFunctionDescriptor functionDescriptor = functionRegistry.findFunctionDescriptor( overload ); + final var functionDescriptor = functionRegistry.findFunctionDescriptor( overload ); if ( functionDescriptor == null ) { throw new IllegalArgumentException( "No function registered under the name '" + overload + "'" ); } @@ -45,10 +48,12 @@ public DynamicDispatchFunction(SqmFunctionRegistry functionRegistry, String... f functionKind = functionDescriptor.getFunctionKind(); } else if ( functionKind != functionDescriptor.getFunctionKind() ) { - throw new IllegalArgumentException( "Function has function kind " + functionDescriptor.getFunctionKind() + ", but other overloads have " + functionKind + ". An overloaded function needs a single function kind." ); + throw new IllegalArgumentException( "Function has function kind " + functionDescriptor.getFunctionKind() + + ", but other overloads have " + functionKind + + ". An overloaded function needs a single function kind." ); } } - this.functionKind = functionKind; + return functionKind; } @Override @@ -61,8 +66,8 @@ public SelfRenderingSqmFunction generateSqmExpression( List> arguments, ReturnableType impliedResultType, QueryEngine queryEngine) { - final SqmFunctionDescriptor functionDescriptor = validateGetFunction( arguments, queryEngine ); - return functionDescriptor.generateSqmExpression( arguments, impliedResultType, queryEngine ); + return validateGetFunction( arguments, queryEngine ) + .generateSqmExpression( arguments, impliedResultType, queryEngine ); } @Override @@ -71,13 +76,13 @@ public SelfRenderingSqmFunction generateAggregateSqmExpression( SqmPredicate filter, ReturnableType impliedResultType, QueryEngine queryEngine) { - final SqmFunctionDescriptor functionDescriptor = validateGetFunction( arguments, queryEngine ); - return functionDescriptor.generateAggregateSqmExpression( - arguments, - filter, - impliedResultType, - queryEngine - ); + return validateGetFunction( arguments, queryEngine ) + .generateAggregateSqmExpression( + arguments, + filter, + impliedResultType, + queryEngine + ); } @Override @@ -87,14 +92,14 @@ public SelfRenderingSqmFunction generateOrderedSetAggregateSqmExpression( SqmOrderByClause withinGroupClause, ReturnableType impliedResultType, QueryEngine queryEngine) { - final SqmFunctionDescriptor functionDescriptor = validateGetFunction( arguments, queryEngine ); - return functionDescriptor.generateOrderedSetAggregateSqmExpression( - arguments, - filter, - withinGroupClause, - impliedResultType, - queryEngine - ); + return validateGetFunction( arguments, queryEngine ) + .generateOrderedSetAggregateSqmExpression( + arguments, + filter, + withinGroupClause, + impliedResultType, + queryEngine + ); } @Override @@ -105,15 +110,15 @@ public SelfRenderingSqmFunction generateWindowSqmExpression( Boolean fromFirst, ReturnableType impliedResultType, QueryEngine queryEngine) { - final SqmFunctionDescriptor functionDescriptor = validateGetFunction( arguments, queryEngine ); - return functionDescriptor.generateWindowSqmExpression( - arguments, - filter, - respectNulls, - fromFirst, - impliedResultType, - queryEngine - ); + return validateGetFunction( arguments, queryEngine ) + .generateWindowSqmExpression( + arguments, + filter, + respectNulls, + fromFirst, + impliedResultType, + queryEngine + ); } @Override @@ -134,12 +139,13 @@ private SqmFunctionDescriptor validateGetFunction( BindingContext bindingContext) { RuntimeException exception = null; for ( String overload : functionNames ) { - final SqmFunctionDescriptor functionDescriptor = functionRegistry.findFunctionDescriptor( overload ); + final var functionDescriptor = functionRegistry.findFunctionDescriptor( overload ); if ( functionDescriptor == null ) { throw new IllegalArgumentException( "No function registered under the name '" + overload + "'" ); } try { - functionDescriptor.getArgumentsValidator().validate( arguments, overload, bindingContext ); + functionDescriptor.getArgumentsValidator() + .validate( arguments, overload, bindingContext ); return functionDescriptor; } catch (RuntimeException ex) { diff --git a/hibernate-core/src/main/java/org/hibernate/dialect/function/GenerateSeriesArgumentValidator.java b/hibernate-core/src/main/java/org/hibernate/dialect/function/GenerateSeriesArgumentValidator.java index 2cb780f9cb9e..45206fa2092f 100644 --- a/hibernate-core/src/main/java/org/hibernate/dialect/function/GenerateSeriesArgumentValidator.java +++ b/hibernate-core/src/main/java/org/hibernate/dialect/function/GenerateSeriesArgumentValidator.java @@ -5,14 +5,11 @@ package org.hibernate.dialect.function; import org.hibernate.metamodel.mapping.JdbcMapping; -import org.hibernate.metamodel.model.domain.DomainType; import org.hibernate.type.BindingContext; -import org.hibernate.query.sqm.SqmExpressible; import org.hibernate.query.sqm.produce.function.ArgumentsValidator; import org.hibernate.query.sqm.produce.function.FunctionArgumentException; import org.hibernate.query.sqm.produce.function.StandardArgumentsValidators; import org.hibernate.query.sqm.tree.SqmTypedNode; -import org.hibernate.type.descriptor.jdbc.JdbcType; import java.util.List; import java.util.Locale; @@ -35,17 +32,17 @@ public void validate( BindingContext bindingContext) { delegate.validate( arguments, functionName, bindingContext ); - final SqmTypedNode start = arguments.get( 0 ); - final SqmTypedNode stop = arguments.get( 1 ); - final SqmTypedNode step = arguments.size() > 2 ? arguments.get( 2 ) : null; + final var start = arguments.get( 0 ); + final var stop = arguments.get( 1 ); + final var step = arguments.size() > 2 ? arguments.get( 2 ) : null; - final SqmExpressible startExpressible = start.getExpressible(); - final SqmExpressible stopExpressible = stop.getExpressible(); - final SqmExpressible stepExpressible = step == null ? null : step.getExpressible(); + final var startExpressible = start.getExpressible(); + final var stopExpressible = stop.getExpressible(); + final var stepExpressible = step == null ? null : step.getExpressible(); - final DomainType startType = startExpressible == null ? null : startExpressible.getSqmType(); - final DomainType stopType = stopExpressible == null ? null : stopExpressible.getSqmType(); - final DomainType stepType = stepExpressible == null ? null : stepExpressible.getSqmType(); + final var startType = startExpressible == null ? null : startExpressible.getSqmType(); + final var stopType = stopExpressible == null ? null : stopExpressible.getSqmType(); + final var stepType = stepExpressible == null ? null : stepExpressible.getSqmType(); if ( startType == null ) { throw unknownType( functionName, arguments, 0 ); @@ -64,8 +61,8 @@ public void validate( ) ); } - final JdbcMapping type = (JdbcMapping) startType; - final JdbcType jdbcType = type.getJdbcType(); + final var type = (JdbcMapping) startType; + final var jdbcType = type.getJdbcType(); if ( jdbcType.isInteger() || jdbcType.isDecimal() ) { if ( step != null ) { if ( stepType == null ) { @@ -98,7 +95,7 @@ else if ( jdbcType.isTemporal() ) { if ( stepType == null ) { throw unknownType( functionName, arguments, 2 ); } - final JdbcType stepJdbcType = ((JdbcMapping) stepType).getJdbcType(); + final var stepJdbcType = ((JdbcMapping) stepType).getJdbcType(); if ( !stepJdbcType.isInterval() && !stepJdbcType.isDuration() ) { throw new FunctionArgumentException( String.format( diff --git a/hibernate-core/src/main/java/org/hibernate/dialect/function/TruncFunction.java b/hibernate-core/src/main/java/org/hibernate/dialect/function/TruncFunction.java index 81ed652d5a3f..3b963edfe7d8 100644 --- a/hibernate-core/src/main/java/org/hibernate/dialect/function/TruncFunction.java +++ b/hibernate-core/src/main/java/org/hibernate/dialect/function/TruncFunction.java @@ -10,8 +10,6 @@ import org.hibernate.metamodel.model.domain.ReturnableType; import org.hibernate.type.BindingContext; import org.hibernate.query.spi.QueryEngine; -import org.hibernate.query.sqm.NodeBuilder; -import org.hibernate.query.common.TemporalUnit; import org.hibernate.query.sqm.function.AbstractSqmFunctionDescriptor; import org.hibernate.query.sqm.function.FunctionRenderer; import org.hibernate.query.sqm.function.SelfRenderingSqmFunction; @@ -76,23 +74,26 @@ public TruncFunction( StandardFunctionArgumentTypeResolvers.NULL ) ); - this.numericRenderingSupport = new TruncRenderingSupport( - new PatternRenderer( truncPattern ), - twoArgTruncPattern != null ? new PatternRenderer( twoArgTruncPattern ) : null - ); this.datetimeTrunc = datetimeTrunc; - TruncRenderingSupport renderingSupport = null; - DateTruncEmulation emulation = null; - if ( datetimeTrunc != null ) { + numericRenderingSupport = + new TruncRenderingSupport( new PatternRenderer( truncPattern ), + twoArgTruncPattern == null ? null : new PatternRenderer( twoArgTruncPattern ) ); + if ( datetimeTrunc == null ) { + dateTruncEmulation = null; + datetimeRenderingSupport = null; + } + else { if ( datetimeTrunc.getPattern() != null ) { - renderingSupport = new TruncRenderingSupport( new PatternRenderer( datetimeTrunc.getPattern() ), null ); + datetimeRenderingSupport = + new TruncRenderingSupport( new PatternRenderer( datetimeTrunc.getPattern() ), null ); + dateTruncEmulation = null; } else { - emulation = new DateTruncEmulation( toDateFunction, typeConfiguration ); + dateTruncEmulation = + new DateTruncEmulation( toDateFunction, typeConfiguration ); + datetimeRenderingSupport = null; } } - this.datetimeRenderingSupport = renderingSupport; - this.dateTruncEmulation = emulation; } @Override @@ -100,11 +101,11 @@ protected SelfRenderingSqmFunction generateSqmFunctionExpression( List> arguments, ReturnableType impliedResultType, QueryEngine queryEngine) { - final NodeBuilder nodeBuilder = queryEngine.getCriteriaBuilder(); + final var nodeBuilder = queryEngine.getCriteriaBuilder(); final List> args = new ArrayList<>( arguments ); final FunctionRenderer renderingSupport; final ArgumentsValidator argumentsValidator; - if ( arguments.size() == 2 && arguments.get( 1 ) instanceof SqmExtractUnit ) { + if ( arguments.size() == 2 && arguments.get( 1 ) instanceof SqmExtractUnit extractUnit ) { // datetime truncation renderingSupport = datetimeRenderingSupport; argumentsValidator = TruncArgumentsValidator.DATETIME_VALIDATOR; @@ -120,39 +121,20 @@ protected SelfRenderingSqmFunction generateSqmFunctionExpression( } else if ( datetimeTrunc == DatetimeTrunc.TRUNC ) { // the trunc() function requires translating the temporal_unit to a format string - final TemporalUnit temporalUnit = ( (SqmExtractUnit) arguments.get( 1 ) ).getUnit(); - final String pattern; - switch ( temporalUnit ) { - case YEAR: - pattern = "YYYY"; - break; - case MONTH: - pattern = "MM"; - break; - case WEEK: - pattern = "IW"; - break; - case DAY: - pattern = "DD"; - break; - case HOUR: - pattern = "HH"; - break; - case MINUTE: - pattern = "MI"; - break; - case SECOND: - pattern = "SS"; - break; - default: - throw new UnsupportedOperationException( "Temporal unit not supported [" + temporalUnit + "]" ); - } + final var temporalUnit = extractUnit.getUnit(); + final String pattern = switch ( temporalUnit ) { + case YEAR -> "YYYY"; + case MONTH -> "MM"; + case WEEK -> "IW"; + case DAY -> "DD"; + case HOUR -> "HH"; + case MINUTE -> "MI"; + case SECOND -> "SS"; + default -> throw new UnsupportedOperationException( + "Temporal unit not supported [" + temporalUnit + "]" ); + }; // replace temporal_unit parameter with translated string format literal - args.set( 1, new SqmLiteral<>( - pattern, - nodeBuilder.getTypeConfiguration().getBasicTypeForJavaType( String.class ), - nodeBuilder - ) ); + args.set( 1, new SqmLiteral<>( pattern, nodeBuilder.getStringType(), nodeBuilder ) ); } } else { @@ -188,13 +170,10 @@ public void render( List sqlAstArguments, ReturnableType returnType, SqlAstTranslator walker) { - final PatternRenderer pattern; - if ( twoArgTruncPattern != null && sqlAstArguments.size() == 2 ) { - pattern = twoArgTruncPattern; - } - else { - pattern = truncPattern; - } + final var pattern = + twoArgTruncPattern != null && sqlAstArguments.size() == 2 + ? twoArgTruncPattern + : truncPattern; pattern.render( sqlAppender, sqlAstArguments, walker ); } } @@ -217,12 +196,11 @@ public void validate( List> arguments, String functionName, BindingContext bindingContext) { - if ( arguments.size() == 2 && arguments.get( 1 ) instanceof SqmExtractUnit ) { - DATETIME_VALIDATOR.validate( arguments, functionName, bindingContext ); - } - else { - NUMERIC_VALIDATOR.validate( arguments, functionName, bindingContext ); - } + final var validator = + arguments.size() == 2 && arguments.get( 1 ) instanceof SqmExtractUnit + ? DATETIME_VALIDATOR + : NUMERIC_VALIDATOR; + validator.validate( arguments, functionName, bindingContext ); } } } diff --git a/hibernate-core/src/main/java/org/hibernate/dialect/function/array/ArrayAndElementArgumentValidator.java b/hibernate-core/src/main/java/org/hibernate/dialect/function/array/ArrayAndElementArgumentValidator.java index 4c87172ac87c..d7ba0e0ec5b9 100644 --- a/hibernate-core/src/main/java/org/hibernate/dialect/function/array/ArrayAndElementArgumentValidator.java +++ b/hibernate-core/src/main/java/org/hibernate/dialect/function/array/ArrayAndElementArgumentValidator.java @@ -6,13 +6,10 @@ import java.util.List; -import org.hibernate.query.sqm.SqmBindableType; import org.hibernate.type.BindingContext; -import org.hibernate.query.sqm.SqmExpressible; import org.hibernate.query.sqm.produce.function.ArgumentsValidator; import org.hibernate.query.sqm.produce.function.FunctionArgumentException; import org.hibernate.query.sqm.tree.SqmTypedNode; -import org.hibernate.type.BasicType; /** * A {@link ArgumentsValidator} that validates the array type is compatible with the element type. @@ -33,12 +30,12 @@ public void validate( List> arguments, String functionName, BindingContext bindingContext) { - final BasicType expectedElementType = getElementType( arguments, functionName, bindingContext ); + final var expectedElementType = getElementType( arguments, functionName ); for ( int elementIndex : elementIndexes ) { if ( elementIndex < arguments.size() ) { - final SqmTypedNode elementArgument = arguments.get( elementIndex ); - final SqmBindableType expressible = elementArgument.getExpressible(); - final SqmExpressible elementType = expressible != null ? expressible.getSqmType() : null; + final var elementArgument = arguments.get( elementIndex ); + final var expressible = elementArgument.getExpressible(); + final var elementType = expressible != null ? expressible.getSqmType() : null; if ( expectedElementType != null && elementType != null && expectedElementType != elementType ) { throw new FunctionArgumentException( String.format( diff --git a/hibernate-core/src/main/java/org/hibernate/dialect/function/array/ArrayArgumentValidator.java b/hibernate-core/src/main/java/org/hibernate/dialect/function/array/ArrayArgumentValidator.java index 62881a01ba6d..5e3ea3d945c3 100644 --- a/hibernate-core/src/main/java/org/hibernate/dialect/function/array/ArrayArgumentValidator.java +++ b/hibernate-core/src/main/java/org/hibernate/dialect/function/array/ArrayArgumentValidator.java @@ -7,7 +7,6 @@ import java.util.List; import org.hibernate.type.BindingContext; -import org.hibernate.query.sqm.SqmExpressible; import org.hibernate.query.sqm.produce.function.ArgumentsValidator; import org.hibernate.query.sqm.produce.function.FunctionArgumentException; import org.hibernate.query.sqm.tree.SqmTypedNode; @@ -32,28 +31,26 @@ public void validate( List> arguments, String functionName, BindingContext bindingContext) { - getElementType( arguments, functionName, bindingContext ); + getElementType( arguments, functionName ); } protected BasicType getElementType( List> arguments, - String functionName, - BindingContext bindingContext) { - return getElementType( arrayIndex, arguments, functionName, bindingContext ); + String functionName) { + return getElementType( arrayIndex, arguments, functionName ); } protected BasicPluralType getPluralType( int arrayIndex, List> arguments, - String functionName, - BindingContext bindingContext) { - final SqmTypedNode arrayArgument = arguments.get( arrayIndex ); - final SqmExpressible expressible = arrayArgument.getExpressible(); + String functionName) { + final var arrayArgument = arguments.get( arrayIndex ); + final var expressible = arrayArgument.getExpressible(); if ( expressible == null ) { return null; } else { - final SqmExpressible arrayType = expressible.getSqmType(); + final var arrayType = expressible.getSqmType(); if ( arrayType == null ) { return null; } @@ -76,8 +73,7 @@ else if ( arrayType instanceof BasicPluralType basicPluralType ) { protected BasicType getElementType( int arrayIndex, List> arguments, - String functionName, - BindingContext bindingContext) { - return getPluralType( arrayIndex, arguments, functionName, bindingContext ).getElementType(); + String functionName) { + return getPluralType( arrayIndex, arguments, functionName ).getElementType(); } } diff --git a/hibernate-core/src/main/java/org/hibernate/dialect/function/array/ArrayConstructorFunction.java b/hibernate-core/src/main/java/org/hibernate/dialect/function/array/ArrayConstructorFunction.java index b90ae31686e4..7d3f01044109 100644 --- a/hibernate-core/src/main/java/org/hibernate/dialect/function/array/ArrayConstructorFunction.java +++ b/hibernate-core/src/main/java/org/hibernate/dialect/function/array/ArrayConstructorFunction.java @@ -55,9 +55,8 @@ public void render( else { char separator = '['; for ( int i = 0; i < size; i++ ) { - SqlAstNode argument = arguments.get( i ); sqlAppender.append( separator ); - argument.accept( walker ); + arguments.get( i ).accept( walker ); separator = ','; } } @@ -79,7 +78,7 @@ public void validate( final int size = arguments.size(); SqmBindableType firstType = null; for ( int i = 0; i < size; i++ ) { - final SqmBindableType argument = arguments.get( i ).getExpressible(); + final var argument = arguments.get( i ).getExpressible(); if ( firstType == null ) { firstType = argument; } @@ -101,7 +100,8 @@ public void validateSqlTypes(List arguments, String functi final int size = arguments.size(); JdbcMappingContainer firstType = null; for ( int i = 0; i < size; i++ ) { - final JdbcMappingContainer argumentType = ( (Expression) arguments.get( i ) ).getExpressionType(); + final var expression = (Expression) arguments.get( i ); + final var argumentType = expression.getExpressionType(); if ( argumentType != null && !( argumentType instanceof BottomType ) ) { if ( firstType == null ) { firstType = argumentType; diff --git a/hibernate-core/src/main/java/org/hibernate/dialect/function/array/ArrayContainsArgumentValidator.java b/hibernate-core/src/main/java/org/hibernate/dialect/function/array/ArrayContainsArgumentValidator.java index d559f62cf99f..78e99f83ced5 100644 --- a/hibernate-core/src/main/java/org/hibernate/dialect/function/array/ArrayContainsArgumentValidator.java +++ b/hibernate-core/src/main/java/org/hibernate/dialect/function/array/ArrayContainsArgumentValidator.java @@ -7,11 +7,9 @@ import java.util.List; import org.hibernate.type.BindingContext; -import org.hibernate.query.sqm.SqmExpressible; import org.hibernate.query.sqm.produce.function.ArgumentsValidator; import org.hibernate.query.sqm.produce.function.FunctionArgumentException; import org.hibernate.query.sqm.tree.SqmTypedNode; -import org.hibernate.type.BasicPluralType; /** * A {@link ArgumentsValidator} that validates the arguments for the {@code array_contains} function. @@ -29,10 +27,9 @@ public void validate( List> arguments, String functionName, BindingContext bindingContext) { - final BasicPluralType haystackType = - getPluralType( 0, arguments, functionName, bindingContext ); - final SqmExpressible expressible = arguments.get( 1 ).getExpressible(); - final SqmExpressible needleType = expressible == null ? null : expressible.getSqmType(); + final var haystackType = getPluralType( 0, arguments, functionName ); + final var expressible = arguments.get( 1 ).getExpressible(); + final var needleType = expressible == null ? null : expressible.getSqmType(); if ( haystackType!= null && needleType != null && !haystackType.equals( needleType ) && !haystackType.getElementType().equals( needleType ) ) { diff --git a/hibernate-core/src/main/java/org/hibernate/dialect/function/array/ArrayIncludesArgumentValidator.java b/hibernate-core/src/main/java/org/hibernate/dialect/function/array/ArrayIncludesArgumentValidator.java index 62a01760f809..d552d1b1631b 100644 --- a/hibernate-core/src/main/java/org/hibernate/dialect/function/array/ArrayIncludesArgumentValidator.java +++ b/hibernate-core/src/main/java/org/hibernate/dialect/function/array/ArrayIncludesArgumentValidator.java @@ -10,7 +10,6 @@ import org.hibernate.query.sqm.produce.function.ArgumentsValidator; import org.hibernate.query.sqm.produce.function.FunctionArgumentException; import org.hibernate.query.sqm.tree.SqmTypedNode; -import org.hibernate.type.BasicPluralType; /** * A {@link ArgumentsValidator} that validates the arguments for the {@code array_includes} function. @@ -28,10 +27,8 @@ public void validate( List> arguments, String functionName, BindingContext bindingContext) { - final BasicPluralType haystackType = - getPluralType( 0, arguments, functionName, bindingContext ); - final BasicPluralType needleType = - getPluralType( 1, arguments, functionName, bindingContext ); + final var haystackType = getPluralType( 0, arguments, functionName ); + final var needleType = getPluralType( 1, arguments, functionName ); if ( haystackType != null && needleType != null && !haystackType.equals( needleType ) && !haystackType.getElementType().equals( needleType ) ) { diff --git a/hibernate-core/src/main/java/org/hibernate/dialect/function/array/ArraysOfSameTypeArgumentValidator.java b/hibernate-core/src/main/java/org/hibernate/dialect/function/array/ArraysOfSameTypeArgumentValidator.java index 004ae3caf093..0e3c528e333d 100644 --- a/hibernate-core/src/main/java/org/hibernate/dialect/function/array/ArraysOfSameTypeArgumentValidator.java +++ b/hibernate-core/src/main/java/org/hibernate/dialect/function/array/ArraysOfSameTypeArgumentValidator.java @@ -9,7 +9,6 @@ import org.hibernate.metamodel.model.domain.DomainType; import org.hibernate.type.BindingContext; -import org.hibernate.query.sqm.SqmExpressible; import org.hibernate.query.sqm.produce.function.ArgumentsValidator; import org.hibernate.query.sqm.produce.function.FunctionArgumentException; import org.hibernate.query.sqm.tree.SqmTypedNode; @@ -29,7 +28,7 @@ public void validate( BindingContext bindingContext) { BasicPluralType arrayType = null; for ( int i = 0; i < arguments.size(); i++ ) { - final SqmExpressible expressible = arguments.get( i ).getExpressible(); + final var expressible = arguments.get( i ).getExpressible(); final DomainType sqmType; if ( expressible != null && ( sqmType = expressible.getSqmType() ) != null ) { if ( arrayType == null ) { @@ -61,8 +60,9 @@ else if ( !isCompatible( arrayType, sqmType ) ) { } private static boolean isCompatible(BasicPluralType arrayType, DomainType sqmType) { - return arrayType == sqmType || sqmType instanceof BasicPluralType basicPluralType - && Objects.equals( arrayType.getElementType(), basicPluralType.getElementType() ); + return arrayType == sqmType + || sqmType instanceof BasicPluralType basicPluralType + && Objects.equals( arrayType.getElementType(), basicPluralType.getElementType() ); } @Override diff --git a/hibernate-core/src/main/java/org/hibernate/dialect/function/json/JsonObjectArgumentsValidator.java b/hibernate-core/src/main/java/org/hibernate/dialect/function/json/JsonObjectArgumentsValidator.java index 6e17d82c6992..1d4eff940943 100644 --- a/hibernate-core/src/main/java/org/hibernate/dialect/function/json/JsonObjectArgumentsValidator.java +++ b/hibernate-core/src/main/java/org/hibernate/dialect/function/json/JsonObjectArgumentsValidator.java @@ -7,10 +7,7 @@ import java.util.List; import org.hibernate.metamodel.mapping.JdbcMapping; -import org.hibernate.metamodel.mapping.JdbcMappingContainer; -import org.hibernate.metamodel.model.domain.DomainType; import org.hibernate.type.BindingContext; -import org.hibernate.query.sqm.SqmExpressible; import org.hibernate.query.sqm.produce.function.ArgumentsValidator; import org.hibernate.query.sqm.produce.function.FunctionArgumentException; import org.hibernate.query.sqm.produce.function.FunctionParameterType; @@ -19,7 +16,6 @@ import org.hibernate.sql.ast.tree.SqlAstNode; import org.hibernate.sql.ast.tree.expression.Expression; import org.hibernate.sql.ast.tree.expression.JsonNullBehavior; -import org.hibernate.type.descriptor.java.JavaType; import static org.hibernate.query.sqm.produce.function.ArgumentTypesValidator.checkArgumentType; import static org.hibernate.query.sqm.produce.function.ArgumentTypesValidator.isUnknownExpressionType; @@ -33,32 +29,29 @@ public void validate( String functionName, BindingContext bindingContext) { if ( !arguments.isEmpty() ) { - final SqmTypedNode lastArgument = arguments.get( arguments.size() - 1 ); - final int argumentsCount; - if ( lastArgument instanceof SqmJsonNullBehavior ) { - argumentsCount = arguments.size() - 1; - } - else { - argumentsCount = arguments.size(); - } + final var lastArgument = arguments.get( arguments.size() - 1 ); + final int argumentsCount = + lastArgument instanceof SqmJsonNullBehavior + ? arguments.size() - 1 + : arguments.size(); checkArgumentsCount( argumentsCount ); for ( int i = 0; i < argumentsCount; i += 2 ) { - final SqmTypedNode key = arguments.get( i ); - final SqmExpressible nodeType = key.getNodeType(); - final JavaType javaType = nodeType == null - ? null - : nodeType.getRelationalJavaType(); - if ( !isUnknown( javaType ) ) { - final DomainType domainType = key.getExpressible().getSqmType(); - if ( domainType instanceof JdbcMapping jdbcMapping ) { - checkArgumentType( - i, - functionName, - FunctionParameterType.STRING, - jdbcMapping.getJdbcType(), - javaType.getJavaTypeClass() - ); - } + final var key = arguments.get( i ); + final var nodeType = key.getNodeType(); + final var javaType = + nodeType == null + ? null + : nodeType.getRelationalJavaType(); + if ( !isUnknown( javaType ) + && key.getExpressible().getSqmType() + instanceof JdbcMapping jdbcMapping ) { + checkArgumentType( + i, + functionName, + FunctionParameterType.STRING, + jdbcMapping.getJdbcType(), + javaType.getJavaTypeClass() + ); } } } @@ -67,21 +60,18 @@ public void validate( @Override public void validateSqlTypes(List arguments, String functionName) { if ( !arguments.isEmpty() ) { - final SqlAstNode lastArgument = arguments.get( arguments.size() - 1 ); - final int argumentsCount; - if ( lastArgument instanceof JsonNullBehavior ) { - argumentsCount = arguments.size() - 1; - } - else { - argumentsCount = arguments.size(); - } + final var lastArgument = arguments.get( arguments.size() - 1 ); + final int argumentsCount = + lastArgument instanceof JsonNullBehavior + ? arguments.size() - 1 + : arguments.size(); checkArgumentsCount( argumentsCount ); for ( int i = 0; i < argumentsCount; i += 2 ) { - final SqlAstNode argument = arguments.get( i ); + final var argument = arguments.get( i ); if ( argument instanceof Expression expression ) { - final JdbcMappingContainer expressionType = expression.getExpressionType(); + final var expressionType = expression.getExpressionType(); if ( expressionType != null && !isUnknownExpressionType( expressionType ) ) { - final JdbcMapping mapping = expressionType.getSingleJdbcMapping(); + final var mapping = expressionType.getSingleJdbcMapping(); checkArgumentType( i, functionName, diff --git a/hibernate-core/src/main/java/org/hibernate/dialect/function/xml/XmlElementFunction.java b/hibernate-core/src/main/java/org/hibernate/dialect/function/xml/XmlElementFunction.java index 6e15c706b25c..a014d3a3620d 100644 --- a/hibernate-core/src/main/java/org/hibernate/dialect/function/xml/XmlElementFunction.java +++ b/hibernate-core/src/main/java/org/hibernate/dialect/function/xml/XmlElementFunction.java @@ -5,7 +5,6 @@ package org.hibernate.dialect.function.xml; import java.util.List; -import java.util.Map; import org.hibernate.type.descriptor.jdbc.XmlHelper; import org.hibernate.metamodel.model.domain.ReturnableType; @@ -20,7 +19,6 @@ import org.hibernate.query.sqm.produce.function.StandardArgumentsValidators; import org.hibernate.query.sqm.produce.function.StandardFunctionReturnTypeResolvers; import org.hibernate.query.sqm.tree.SqmTypedNode; -import org.hibernate.query.sqm.tree.expression.SqmExpression; import org.hibernate.query.sqm.tree.expression.SqmLiteral; import org.hibernate.query.sqm.tree.expression.SqmXmlAttributesExpression; import org.hibernate.query.sqm.tree.expression.SqmXmlElementExpression; @@ -55,7 +53,8 @@ public void validate( String functionName, BindingContext bindingContext) { //noinspection unchecked - final String elementName = ( (SqmLiteral) arguments.get( 0 ) ).getLiteralValue(); + final var literal = (SqmLiteral) arguments.get( 0 ); + final String elementName = literal.getLiteralValue(); if ( !XmlHelper.isValidXmlName( elementName ) ) { throw new FunctionArgumentException( String.format( @@ -66,8 +65,7 @@ public void validate( } if ( arguments.size() > 1 && arguments.get( 1 ) instanceof SqmXmlAttributesExpression attributesExpression ) { - final Map> attributes = attributesExpression.getAttributes(); - for ( Map.Entry> entry : attributes.entrySet() ) { + for ( var entry : attributesExpression.getAttributes().entrySet() ) { if ( !XmlHelper.isValidXmlName( entry.getKey() ) ) { throw new FunctionArgumentException( String.format( @@ -125,7 +123,7 @@ protected void render( if ( arguments.attributes() != null ) { sqlAppender.appendSql( ",xmlattributes" ); char separator = '('; - for ( Map.Entry entry : arguments.attributes().getAttributes().entrySet() ) { + for ( var entry : arguments.attributes().getAttributes().entrySet() ) { sqlAppender.appendSql( separator ); entry.getValue().accept( walker ); sqlAppender.appendSql( " as " ); @@ -148,10 +146,9 @@ protected record XmlElementArguments( @Nullable XmlAttributes attributes, List content) { static XmlElementArguments extract(List arguments) { - final Literal elementName = (Literal) arguments.get( 0 ); + final var elementName = (Literal) arguments.get( 0 ); final XmlAttributes attributes; final List content; - int index = 1; if ( arguments.size() > index && arguments.get( index ) instanceof XmlAttributes xmlAttributes ) { diff --git a/hibernate-core/src/main/java/org/hibernate/dialect/function/xml/XmlForestFunction.java b/hibernate-core/src/main/java/org/hibernate/dialect/function/xml/XmlForestFunction.java index 3f4150995d7f..438a51458d23 100644 --- a/hibernate-core/src/main/java/org/hibernate/dialect/function/xml/XmlForestFunction.java +++ b/hibernate-core/src/main/java/org/hibernate/dialect/function/xml/XmlForestFunction.java @@ -78,7 +78,7 @@ public void render( SqlAstTranslator walker) { sqlAppender.appendSql( "xmlforest" ); char separator = '('; - for ( SqlAstNode sqlAstArgument : sqlAstArguments ) { + for ( var sqlAstArgument : sqlAstArguments ) { sqlAppender.appendSql( separator ); if ( sqlAstArgument instanceof AliasedExpression aliasedExpression ) { aliasedExpression.getExpression().accept( walker ); diff --git a/hibernate-core/src/main/java/org/hibernate/query/sqm/NodeBuilder.java b/hibernate-core/src/main/java/org/hibernate/query/sqm/NodeBuilder.java index 31d12424ebda..ac59872da689 100644 --- a/hibernate-core/src/main/java/org/hibernate/query/sqm/NodeBuilder.java +++ b/hibernate-core/src/main/java/org/hibernate/query/sqm/NodeBuilder.java @@ -1529,6 +1529,8 @@ default SqmSortSpecification sort( BasicType getCharacterType(); + BasicType getStringType(); + JpaCompliance getJpaCompliance(); @Deprecated(since = "7.0", forRemoval = true) diff --git a/hibernate-core/src/main/java/org/hibernate/query/sqm/internal/SqmCriteriaNodeBuilder.java b/hibernate-core/src/main/java/org/hibernate/query/sqm/internal/SqmCriteriaNodeBuilder.java index 07a41107dbd6..cce13272e242 100644 --- a/hibernate-core/src/main/java/org/hibernate/query/sqm/internal/SqmCriteriaNodeBuilder.java +++ b/hibernate-core/src/main/java/org/hibernate/query/sqm/internal/SqmCriteriaNodeBuilder.java @@ -301,6 +301,7 @@ public BasicType getCharacterType() { return characterType; } + @Override public BasicType getStringType() { final BasicType stringType = this.stringType; if ( stringType == null ) { diff --git a/hibernate-core/src/main/java/org/hibernate/query/sqm/produce/function/ArgumentTypesValidator.java b/hibernate-core/src/main/java/org/hibernate/query/sqm/produce/function/ArgumentTypesValidator.java index 1932bb357c7b..f68b2799119b 100644 --- a/hibernate-core/src/main/java/org/hibernate/query/sqm/produce/function/ArgumentTypesValidator.java +++ b/hibernate-core/src/main/java/org/hibernate/query/sqm/produce/function/ArgumentTypesValidator.java @@ -13,7 +13,6 @@ import org.hibernate.metamodel.mapping.JdbcMappingContainer; import org.hibernate.query.sqm.tuple.TupleType; import org.hibernate.type.BindingContext; -import org.hibernate.query.sqm.SqmExpressible; import org.hibernate.query.sqm.tree.SqmTypedNode; import org.hibernate.query.sqm.tree.expression.SqmCollation; import org.hibernate.query.sqm.tree.expression.SqmDurationUnit; @@ -51,15 +50,15 @@ public class ArgumentTypesValidator implements ArgumentsValidator { // this number has to be distinct from every code in SqlTypes! // private static final int ENUM_UNKNOWN_JDBC_TYPE = -101977; - final ArgumentsValidator delegate; + private final ArgumentsValidator delegate; private final FunctionParameterType[] types; public ArgumentTypesValidator(ArgumentsValidator delegate, FunctionParameterType... types) { this.types = types; - if ( delegate == null ) { - delegate = StandardArgumentsValidators.exactly(types.length); - } - this.delegate = delegate; + this.delegate = + delegate == null + ? StandardArgumentsValidators.exactly( types.length ) + : delegate; } /** @@ -77,20 +76,20 @@ public void validate( int count = 0; for ( var argument : arguments ) { // JdbcTypeIndicators indicators = typeConfiguration.getCurrentBaseSqlTypeIndicators(); - final SqmExpressible nodeType = argument.getNodeType(); - final FunctionParameterType type = count < types.length ? types[count++] : types[types.length - 1]; - if ( nodeType != null && type != FunctionParameterType.ANY ) { + final var nodeType = argument.getNodeType(); + final var parameterType = count < types.length ? types[count++] : types[types.length - 1]; + if ( nodeType != null && parameterType != FunctionParameterType.ANY ) { if ( nodeType instanceof TupleType ) { - throwTupleError(type, functionName, count); + throwTupleError(parameterType, functionName, count); } - final JavaType javaType = nodeType.getRelationalJavaType(); - if (javaType != null) { - checkArgumentType( functionName, count, argument, type, javaType ); + final var javaType = nodeType.getRelationalJavaType(); + if ( javaType != null ) { + checkArgumentType( functionName, count, argument, parameterType, javaType ); } - switch (type) { + switch ( parameterType ) { case TEMPORAL_UNIT: if ( !(argument instanceof SqmExtractUnit) && !(argument instanceof SqmDurationUnit) ) { - throwError(type, Object.class, null, functionName, count); + throwError(parameterType, Object.class, null, functionName, count); } break; // the following are not really necessary for the functions we have today @@ -99,12 +98,12 @@ public void validate( // something crazy by the parser case TRIM_SPEC: if ( !(argument instanceof SqmTrimSpecification) ) { - throwError(type, Object.class, null, functionName, count); + throwError(parameterType, Object.class, null, functionName, count); } break; case COLLATION: if ( !(argument instanceof SqmCollation) ) { - throwError(type, Object.class, null, functionName, count); + throwError(parameterType, Object.class, null, functionName, count); } break; case NO_UNTYPED: @@ -179,9 +178,9 @@ private void checkArgumentType( @Override public void validateSqlTypes(List arguments, String functionName) { int count = 0; - for ( SqlAstNode argument : arguments ) { + for ( var argument : arguments ) { if ( argument instanceof Expression expression ) { - final JdbcMappingContainer expressionType = expression.getExpressionType(); + final var expressionType = expression.getExpressionType(); if ( expressionType != null ) { if ( isUnknownExpressionType( expressionType ) ) { count += expressionType.getJdbcTypeCount(); @@ -206,16 +205,16 @@ public static boolean isUnknownExpressionType(JdbcMappingContainer expressionTyp private int validateArgument(int paramNumber, JdbcMappingContainer expressionType, String functionName) { final int jdbcTypeCount = expressionType.getJdbcTypeCount(); for ( int i = 0; i < jdbcTypeCount; i++ ) { - final JdbcMapping mapping = expressionType.getJdbcMapping( i ); - final FunctionParameterType type = + final var parameterType = paramNumber < types.length ? types[paramNumber++] : types[types.length - 1]; - if ( type != null ) { + if ( parameterType != null ) { + final var mapping = expressionType.getJdbcMapping( i ); checkArgumentType( paramNumber, functionName, - type, + parameterType, mapping.getJdbcType(), mapping.getJavaTypeDescriptor().getJavaType() ); @@ -310,7 +309,7 @@ public String getSignature() { String sig = delegate.getSignature(); for (int i=0; i