All Downloads are FREE. Search and download functionalities are using the official Maven repository.

org.hibernate.dialect.function.CastFunction Maven / Gradle / Ivy

There is a newer version: 7.0.0.Alpha2
Show newest version
/*
 * Hibernate, Relational Persistence for Idiomatic Java
 *
 * License: GNU Lesser General Public License (LGPL), version 2.1 or later
 * See the lgpl.txt file in the root directory or http://www.gnu.org/licenses/lgpl-2.1.html
 */
package org.hibernate.dialect.function;

import java.sql.Types;
import java.util.List;

import org.hibernate.dialect.Dialect;
import org.hibernate.metamodel.mapping.JdbcMapping;
import org.hibernate.query.CastType;
import org.hibernate.query.sqm.function.AbstractSqmSelfRenderingFunctionDescriptor;
import org.hibernate.query.sqm.produce.function.StandardArgumentsValidators;
import org.hibernate.query.sqm.produce.function.StandardFunctionReturnTypeResolvers;
import org.hibernate.query.sqm.produce.function.internal.PatternRenderer;
import org.hibernate.sql.ast.SqlAstTranslator;
import org.hibernate.sql.ast.spi.SqlAppender;
import org.hibernate.sql.ast.tree.SqlAstNode;
import org.hibernate.sql.ast.tree.expression.CastTarget;
import org.hibernate.sql.ast.tree.expression.Expression;

/**
 * @author Gavin King
 */
public class CastFunction extends AbstractSqmSelfRenderingFunctionDescriptor {

	private final Dialect dialect;
	private final CastType booleanCastType;

	public CastFunction(Dialect dialect, int preferredSqlTypeCodeForBoolean) {
		super(
				"cast",
				StandardArgumentsValidators.exactly( 2 ),
				StandardFunctionReturnTypeResolvers.useArgType( 2 )
		);
		this.dialect = dialect;
		this.booleanCastType = getBooleanCastType( preferredSqlTypeCodeForBoolean );
	}

	private CastType getBooleanCastType(int preferredSqlTypeCodeForBoolean) {
		switch ( preferredSqlTypeCodeForBoolean ) {
			case Types.BIT:
			case Types.SMALLINT:
			case Types.TINYINT:
				return CastType.INTEGER_BOOLEAN;
		}
		return CastType.BOOLEAN;
	}

	@Override
	public void render(SqlAppender sqlAppender, List arguments, SqlAstTranslator walker) {
		final Expression source = (Expression) arguments.get( 0 );
		final JdbcMapping sourceMapping = source.getExpressionType().getJdbcMappings().get( 0 );
		final CastType sourceType = getCastType( sourceMapping );

		final CastTarget castTarget = (CastTarget) arguments.get( 1 );
		final JdbcMapping targetJdbcMapping = castTarget.getExpressionType().getJdbcMappings().get( 0 );
		final CastType targetType = getCastType( targetJdbcMapping );

		String cast = dialect.castPattern( sourceType, targetType );

		new PatternRenderer( cast ).render( sqlAppender, arguments, walker );
	}

	private CastType getCastType(JdbcMapping sourceMapping) {
		final CastType castType = sourceMapping.getCastType();
		if ( castType == CastType.BOOLEAN ) {
			return booleanCastType;
		}
		return castType;
	}

//	@Override
//	protected  SelfRenderingSqmFunction generateSqmFunctionExpression(
//			List> arguments,
//			AllowableFunctionReturnType impliedResultType,
//			QueryEngine queryEngine,
//			TypeConfiguration typeConfiguration) {
//		SqmCastTarget targetType = (SqmCastTarget) arguments.get(1);
//		SqmExpression arg = (SqmExpression) arguments.get(0);
//
//		CastType to = CastType.from( targetType.getType() );
//		CastType from = CastType.from( arg.getNodeType() );
//
//		return queryEngine.getSqmFunctionRegistry()
//				.patternDescriptorBuilder( "cast", dialect.castPattern( from, to ) )
//				.setExactArgumentCount( 2 )
//				.setReturnTypeResolver( useArgType( 2 ) )
//				.descriptor()
//				.generateSqmExpression(
//						arguments,
//						impliedResultType,
//						queryEngine,
//						typeConfiguration
//				);
//	}

	@Override
	public String getArgumentListSignature() {
		return "(arg as Type)";
	}

}




© 2015 - 2024 Weber Informatics LLC | Privacy Policy