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

org.hibernate.query.sqm.sql.internal.BasicValuedPathInterpretation Maven / Gradle / Ivy

There is a newer version: 7.0.0.Beta1
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.query.sqm.sql.internal;

import java.util.Collections;
import java.util.List;
import java.util.function.Consumer;

import org.hibernate.NotYetImplementedFor6Exception;
import org.hibernate.metamodel.mapping.BasicValuedModelPart;
import org.hibernate.metamodel.mapping.ModelPart;
import org.hibernate.query.sqm.SemanticQueryWalker;
import org.hibernate.sql.ast.spi.SqlAstCreationState;
import org.hibernate.sql.ast.spi.SqlExpressionResolver;
import org.hibernate.query.sqm.tree.domain.SqmBasicValuedSimplePath;
import org.hibernate.query.sqm.tree.domain.SqmPath;
import org.hibernate.sql.ast.spi.SqlAstCreationContext;
import org.hibernate.sql.ast.spi.SqlAstWalker;
import org.hibernate.sql.ast.tree.expression.ColumnReference;
import org.hibernate.sql.ast.tree.expression.Expression;
import org.hibernate.sql.ast.tree.expression.SqlSelectionExpression;
import org.hibernate.sql.ast.tree.from.TableGroup;
import org.hibernate.sql.ast.tree.from.TableReference;
import org.hibernate.sql.ast.tree.update.Assignment;
import org.hibernate.sql.results.spi.DomainResult;
import org.hibernate.sql.results.spi.DomainResultCreationState;

/**
 * @author Steve Ebersole
 */
public class BasicValuedPathInterpretation implements AssignableSqmPathInterpretation, DomainResultProducer {
	/**
	 * Static factory
	 */
	public static  BasicValuedPathInterpretation from(
			SqmBasicValuedSimplePath sqmPath,
			SqlAstCreationState sqlAstCreationState,
			SemanticQueryWalker sqmWalker) {
		final TableGroup tableGroup = sqlAstCreationState.getFromClauseAccess().getTableGroup( sqmPath.getLhs().getNavigablePath() );

		final BasicValuedModelPart mapping = (BasicValuedModelPart) tableGroup.getModelPart().findSubPart(
				sqmPath.getReferencedPathSource().getPathName(),
				null
		);

		final TableReference tableReference = tableGroup.resolveTableReference( mapping.getContainingTableExpression() );

		final Expression expression = sqlAstCreationState.getSqlExpressionResolver().resolveSqlExpression(
				SqlExpressionResolver.createColumnReferenceKey(
						tableReference,
						mapping.getMappedColumnExpression()
				),
				sacs -> new ColumnReference(
						tableReference.getIdentificationVariable(),
						mapping.getMappedColumnExpression(),
						mapping.getJdbcMapping(),
						sqlAstCreationState.getCreationContext().getSessionFactory()
				)
		);

		final ColumnReference columnReference;
		if ( expression instanceof ColumnReference ) {
			columnReference = ( (ColumnReference) expression );
		}
		else if ( expression instanceof SqlSelectionExpression ) {
			final Expression selectedExpression = ( (SqlSelectionExpression) expression ).getExpression();
			assert selectedExpression instanceof ColumnReference;
			columnReference = (ColumnReference) selectedExpression;
		}
		else {
			throw new UnsupportedOperationException( "Unsupported basic-valued path expression : " + expression );
		}

		return new BasicValuedPathInterpretation<>( columnReference, sqmPath, mapping, tableGroup );
	}

	private final ColumnReference columnReference;

	private final SqmBasicValuedSimplePath sqmPath;
	private final BasicValuedModelPart mapping;
	private final TableGroup tableGroup;

	private BasicValuedPathInterpretation(
			ColumnReference columnReference,
			SqmBasicValuedSimplePath sqmPath,
			BasicValuedModelPart mapping,
			TableGroup tableGroup) {
		assert columnReference != null;
		this.columnReference = columnReference;

		assert sqmPath != null;
		this.sqmPath = sqmPath;

		assert mapping != null;
		this.mapping = mapping;

		assert tableGroup != null;
		this.tableGroup = tableGroup;


	}

	@Override
	public SqmPath getInterpretedSqmPath() {
		return sqmPath;
	}

	@Override
	public ModelPart getExpressionType() {
		return mapping;
	}


	// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
	// DomainResultProducer

	@Override
	public DomainResult createDomainResult(
			String resultVariable,
			DomainResultCreationState creationState) {
		return mapping.createDomainResult( getNavigablePath(), tableGroup, resultVariable, creationState );
	}

	@Override
	public void applySqlSelections(DomainResultCreationState creationState) {
		mapping.applySqlSelections( getNavigablePath(), tableGroup, creationState );
	}

	@Override
	public void applySqlAssignments(
			Expression newValueExpression,
			AssignmentContext assignmentProcessingState,
			Consumer assignmentConsumer,
			SqlAstCreationContext creationContext) {
		throw new NotYetImplementedFor6Exception( getClass() );
	}

	@Override
	public void accept(SqlAstWalker sqlTreeWalker) {
		columnReference.accept( sqlTreeWalker );
	}

	@Override
	public String toString() {
		return "BasicValuedPathInterpretation(" + sqmPath.getNavigablePath().getFullPath() + ')';
	}

	@Override
	public void visitColumnReferences(Consumer columnReferenceConsumer) {
		columnReferenceConsumer.accept( columnReference );
	}

	@Override
	public List getColumnReferences() {
		return Collections.singletonList( columnReference );
	}
}




© 2015 - 2024 Weber Informatics LLC | Privacy Policy