/*
* 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.consume.spi;
import org.hibernate.query.sqm.tree.SqmDeleteStatement;
import org.hibernate.query.sqm.tree.SqmInsertSelectStatement;
import org.hibernate.query.sqm.tree.SqmQuerySpec;
import org.hibernate.query.sqm.tree.SqmSelectStatement;
import org.hibernate.query.sqm.tree.SqmStatement;
import org.hibernate.query.sqm.tree.SqmUpdateStatement;
import org.hibernate.query.sqm.tree.expression.BinaryArithmeticSqmExpression;
import org.hibernate.query.sqm.tree.expression.CaseSearchedSqmExpression;
import org.hibernate.query.sqm.tree.expression.CaseSimpleSqmExpression;
import org.hibernate.query.sqm.tree.expression.CoalesceSqmExpression;
import org.hibernate.query.sqm.tree.expression.CollectionSizeSqmExpression;
import org.hibernate.query.sqm.tree.expression.ConcatSqmExpression;
import org.hibernate.query.sqm.tree.expression.ConstantEnumSqmExpression;
import org.hibernate.query.sqm.tree.expression.ConstantFieldSqmExpression;
import org.hibernate.query.sqm.tree.expression.EntityTypeLiteralSqmExpression;
import org.hibernate.query.sqm.tree.expression.LiteralBigDecimalSqmExpression;
import org.hibernate.query.sqm.tree.expression.LiteralBigIntegerSqmExpression;
import org.hibernate.query.sqm.tree.expression.LiteralCharacterSqmExpression;
import org.hibernate.query.sqm.tree.expression.LiteralDoubleSqmExpression;
import org.hibernate.query.sqm.tree.expression.LiteralFalseSqmExpression;
import org.hibernate.query.sqm.tree.expression.LiteralFloatSqmExpression;
import org.hibernate.query.sqm.tree.expression.LiteralIntegerSqmExpression;
import org.hibernate.query.sqm.tree.expression.LiteralLongSqmExpression;
import org.hibernate.query.sqm.tree.expression.LiteralNullSqmExpression;
import org.hibernate.query.sqm.tree.expression.LiteralStringSqmExpression;
import org.hibernate.query.sqm.tree.expression.LiteralTrueSqmExpression;
import org.hibernate.query.sqm.tree.expression.NamedParameterSqmExpression;
import org.hibernate.query.sqm.tree.expression.NullifSqmExpression;
import org.hibernate.query.sqm.tree.expression.ParameterizedEntityTypeSqmExpression;
import org.hibernate.query.sqm.tree.expression.PositionalParameterSqmExpression;
import org.hibernate.query.sqm.tree.expression.SqmExpression;
import org.hibernate.query.sqm.tree.expression.SubQuerySqmExpression;
import org.hibernate.query.sqm.tree.expression.UnaryOperationSqmExpression;
import org.hibernate.query.sqm.tree.expression.domain.AbstractSpecificSqmCollectionIndexReference;
import org.hibernate.query.sqm.tree.expression.domain.SqmAttributeReference;
import org.hibernate.query.sqm.tree.expression.domain.SqmCollectionElementReference;
import org.hibernate.query.sqm.tree.expression.domain.SqmCollectionIndexReference;
import org.hibernate.query.sqm.tree.expression.domain.SqmEntityIdentifierReference;
import org.hibernate.query.sqm.tree.expression.domain.SqmEntityTypeSqmExpression;
import org.hibernate.query.sqm.tree.expression.domain.SqmMapEntryBinding;
import org.hibernate.query.sqm.tree.expression.domain.SqmMaxElementReference;
import org.hibernate.query.sqm.tree.expression.domain.SqmMinElementReference;
import org.hibernate.query.sqm.tree.expression.domain.SqmMinIndexReferenceBasic;
import org.hibernate.query.sqm.tree.expression.domain.SqmSingularAttributeReference;
import org.hibernate.query.sqm.tree.expression.function.AvgFunctionSqmExpression;
import org.hibernate.query.sqm.tree.expression.function.CastFunctionSqmExpression;
import org.hibernate.query.sqm.tree.expression.function.ConcatFunctionSqmExpression;
import org.hibernate.query.sqm.tree.expression.function.CountFunctionSqmExpression;
import org.hibernate.query.sqm.tree.expression.function.CountStarFunctionSqmExpression;
import org.hibernate.query.sqm.tree.expression.function.GenericFunctionSqmExpression;
import org.hibernate.query.sqm.tree.expression.function.LowerFunctionSqmExpression;
import org.hibernate.query.sqm.tree.expression.function.MaxFunctionSqmExpression;
import org.hibernate.query.sqm.tree.expression.function.MinFunctionSqmExpression;
import org.hibernate.query.sqm.tree.expression.function.SubstringFunctionSqmExpression;
import org.hibernate.query.sqm.tree.expression.function.SumFunctionSqmExpression;
import org.hibernate.query.sqm.tree.expression.function.TrimFunctionSqmExpression;
import org.hibernate.query.sqm.tree.expression.function.UpperFunctionSqmExpression;
import org.hibernate.query.sqm.tree.from.SqmFromElementSpace;
import org.hibernate.query.sqm.tree.from.SqmAttributeJoin;
import org.hibernate.query.sqm.tree.from.SqmCrossJoin;
import org.hibernate.query.sqm.tree.from.SqmEntityJoin;
import org.hibernate.query.sqm.tree.from.SqmFromClause;
import org.hibernate.query.sqm.tree.from.SqmJoin;
import org.hibernate.query.sqm.tree.from.SqmRoot;
import org.hibernate.query.sqm.tree.order.SqmOrderByClause;
import org.hibernate.query.sqm.tree.order.SqmSortSpecification;
import org.hibernate.query.sqm.tree.paging.SqmLimitOffsetClause;
import org.hibernate.query.sqm.tree.predicate.AndSqmPredicate;
import org.hibernate.query.sqm.tree.predicate.BetweenSqmPredicate;
import org.hibernate.query.sqm.tree.predicate.BooleanExpressionSqmPredicate;
import org.hibernate.query.sqm.tree.predicate.EmptinessSqmPredicate;
import org.hibernate.query.sqm.tree.predicate.GroupedSqmPredicate;
import org.hibernate.query.sqm.tree.predicate.InListSqmPredicate;
import org.hibernate.query.sqm.tree.predicate.InSubQuerySqmPredicate;
import org.hibernate.query.sqm.tree.predicate.LikeSqmPredicate;
import org.hibernate.query.sqm.tree.predicate.MemberOfSqmPredicate;
import org.hibernate.query.sqm.tree.predicate.NegatedSqmPredicate;
import org.hibernate.query.sqm.tree.predicate.NullnessSqmPredicate;
import org.hibernate.query.sqm.tree.predicate.OrSqmPredicate;
import org.hibernate.query.sqm.tree.predicate.RelationalSqmPredicate;
import org.hibernate.query.sqm.tree.predicate.SqmWhereClause;
import org.hibernate.query.sqm.tree.select.SqmDynamicInstantiation;
import org.hibernate.query.sqm.tree.select.SqmSelectClause;
import org.hibernate.query.sqm.tree.select.SqmSelection;
import org.hibernate.query.sqm.tree.set.SqmAssignment;
import org.hibernate.query.sqm.tree.set.SqmSetClause;
/**
* @author Steve Ebersole
*/
@SuppressWarnings({"unchecked", "WeakerAccess"})
public class BaseSemanticQueryWalker<T> implements SemanticQueryWalker<T> {
@Override
public T visitStatement(SqmStatement statement) {
return statement.accept( this );
}
@Override
public T visitSelectStatement(SqmSelectStatement statement) {
visitQuerySpec( statement.getQuerySpec() );
return (T) statement;
}
@Override
public T visitUpdateStatement(SqmUpdateStatement statement) {
visitRootEntityFromElement( statement.getEntityFromElement() );
visitSetClause( statement.getSetClause() );
visitWhereClause( statement.getWhereClause() );
return (T) statement;
}
@Override
public T visitSetClause(SqmSetClause setClause) {
for ( SqmAssignment assignment : setClause.getAssignments() ) {
visitAssignment( assignment );
}
return (T) setClause;
}
@Override
public T visitAssignment(SqmAssignment assignment) {
visitAttributeReferenceExpression( assignment.getStateField() );
assignment.getStateField().accept( this );
return (T) assignment;
}
@Override
public T visitInsertSelectStatement(SqmInsertSelectStatement statement) {
visitRootEntityFromElement( statement.getInsertTarget() );
for ( SqmSingularAttributeReference stateField : statement.getStateFields() ) {
stateField.accept( this );
}
visitQuerySpec( statement.getSelectQuery() );
return (T) statement;
}
@Override
public T visitDeleteStatement(SqmDeleteStatement statement) {
visitRootEntityFromElement( statement.getEntityFromElement() );
visitWhereClause( statement.getWhereClause() );
return (T) statement;
}
@Override
public T visitQuerySpec(SqmQuerySpec querySpec) {
visitFromClause( querySpec.getFromClause() );
visitSelectClause( querySpec.getSelectClause() );
visitWhereClause( querySpec.getWhereClause() );
visitOrderByClause( querySpec.getOrderByClause() );
visitLimitOffsetClause( querySpec.getLimitOffsetClause() );
return (T) querySpec;
}
@Override
public T visitFromClause(SqmFromClause fromClause) {
for ( SqmFromElementSpace fromElementSpace : fromClause.getFromElementSpaces() ) {
visitFromElementSpace( fromElementSpace );
}
return (T) fromClause;
}
@Override
public T visitFromElementSpace(SqmFromElementSpace fromElementSpace) {
visitRootEntityFromElement( fromElementSpace.getRoot() );
for ( SqmJoin joinedFromElement : fromElementSpace.getJoins() ) {
joinedFromElement.accept( this );
}
return (T) fromElementSpace;
}
@Override
public T visitCrossJoinedFromElement(SqmCrossJoin joinedFromElement) {
return (T) joinedFromElement;
}
@Override
public T visitQualifiedEntityJoinFromElement(SqmEntityJoin joinedFromElement) {
return (T) joinedFromElement;
}
@Override
public T visitQualifiedAttributeJoinFromElement(SqmAttributeJoin joinedFromElement) {
return (T) joinedFromElement;
}
@Override
public T visitRootEntityFromElement(SqmRoot rootEntityFromElement) {
return (T) rootEntityFromElement;
}
@Override
public T visitSelectClause(SqmSelectClause selectClause) {
for ( SqmSelection selection : selectClause.getSelections() ) {
visitSelection( selection );
}
return (T) selectClause;
}
@Override
public T visitSelection(SqmSelection selection) {
selection.getExpression().accept( this );
return (T) selection;
}
@Override
public T visitDynamicInstantiation(SqmDynamicInstantiation dynamicInstantiation) {
return (T) dynamicInstantiation;
}
@Override
public T visitWhereClause(SqmWhereClause whereClause) {
whereClause.getPredicate().accept( this );
return (T) whereClause;
}
@Override
public T visitGroupedPredicate(GroupedSqmPredicate predicate) {
predicate.getSubPredicate().accept( this );
return (T) predicate;
}
@Override
public T visitAndPredicate(AndSqmPredicate predicate) {
predicate.getLeftHandPredicate().accept( this );
predicate.getRightHandPredicate().accept( this );
return (T) predicate;
}
@Override
public T visitOrPredicate(OrSqmPredicate predicate) {
predicate.getLeftHandPredicate().accept( this );
predicate.getRightHandPredicate().accept( this );
return (T) predicate;
}
@Override
public T visitRelationalPredicate(RelationalSqmPredicate predicate) {
predicate.getLeftHandExpression().accept( this );
predicate.getRightHandExpression().accept( this );
return (T) predicate;
}
@Override
public T visitIsEmptyPredicate(EmptinessSqmPredicate predicate) {
predicate.getExpression().accept( this );
return (T) predicate;
}
@Override
public T visitIsNullPredicate(NullnessSqmPredicate predicate) {
predicate.getExpression().accept( this );
return (T) predicate;
}
@Override
public T visitBetweenPredicate(BetweenSqmPredicate predicate) {
predicate.getExpression().accept( this );
predicate.getLowerBound().accept( this );
predicate.getUpperBound().accept( this );
return (T) predicate;
}
@Override
public T visitLikePredicate(LikeSqmPredicate predicate) {
predicate.getMatchExpression().accept( this );
predicate.getPattern().accept( this );
predicate.getEscapeCharacter().accept( this );
return (T) predicate;
}
@Override
public T visitMemberOfPredicate(MemberOfSqmPredicate predicate) {
predicate.getPluralAttributeReference().accept( this );
return (T) predicate;
}
@Override
public T visitNegatedPredicate(NegatedSqmPredicate predicate) {
predicate.getWrappedPredicate().accept( this );
return (T) predicate;
}
@Override
public T visitInListPredicate(InListSqmPredicate predicate) {
predicate.getTestExpression().accept( this );
for ( SqmExpression expression : predicate.getListExpressions() ) {
expression.accept( this );
}
return (T) predicate;
}
@Override
public T visitInSubQueryPredicate(InSubQuerySqmPredicate predicate) {
predicate.getTestExpression().accept( this );
predicate.getSubQueryExpression().accept( this );
return (T) predicate;
}
@Override
public T visitBooleanExpressionPredicate(BooleanExpressionSqmPredicate predicate) {
predicate.getBooleanExpression().accept( this );
return (T) predicate;
}
@Override
public T visitOrderByClause(SqmOrderByClause orderByClause) {
if ( orderByClause.getSortSpecifications() != null ) {
for ( SqmSortSpecification sortSpecification : orderByClause.getSortSpecifications() ) {
visitSortSpecification( sortSpecification );
}
}
return (T) orderByClause;
}
@Override
public T visitSortSpecification(SqmSortSpecification sortSpecification) {
sortSpecification.getSortExpression().accept( this );
return (T) sortSpecification;
}
@Override
public T visitLimitOffsetClause(SqmLimitOffsetClause limitOffsetClause) {
if ( limitOffsetClause != null ) {
if ( limitOffsetClause.getLimitExpression() != null ) {
limitOffsetClause.getLimitExpression().accept( this );
}
if ( limitOffsetClause.getOffsetExpression() != null ) {
limitOffsetClause.getOffsetExpression().accept( this );
}
}
return (T) limitOffsetClause;
}
@Override
public T visitPositionalParameterExpression(PositionalParameterSqmExpression expression) {
return (T) expression;
}
@Override
public T visitNamedParameterExpression(NamedParameterSqmExpression expression) {
return (T) expression;
}
@Override
public T visitEntityTypeLiteralExpression(EntityTypeLiteralSqmExpression expression) {
return (T) expression;
}
@Override
public T visitEntityTypeExpression(SqmEntityTypeSqmExpression expression) {
return (T) expression;
}
@Override
public T visitParameterizedEntityTypeExpression(ParameterizedEntityTypeSqmExpression expression) {
return (T) expression;
}
@Override
public T visitUnaryOperationExpression(UnaryOperationSqmExpression expression) {
expression.getOperand().accept( this );
return (T) expression;
}
@Override
public T visitAttributeReferenceExpression(SqmAttributeReference expression) {
return (T) expression;
}
@Override
public T visitGenericFunction(GenericFunctionSqmExpression expression) {
return (T) expression;
}
@Override
public T visitCastFunction(CastFunctionSqmExpression expression) {
return (T) expression;
}
@Override
public T visitAvgFunction(AvgFunctionSqmExpression expression) {
return (T) expression;
}
@Override
public T visitCountStarFunction(CountStarFunctionSqmExpression expression) {
return (T) expression;
}
@Override
public T visitCountFunction(CountFunctionSqmExpression expression) {
return (T) expression;
}
@Override
public T visitMaxFunction(MaxFunctionSqmExpression expression) {
return (T) expression;
}
@Override
public T visitMinFunction(MinFunctionSqmExpression expression) {
return (T) expression;
}
@Override
public T visitSumFunction(SumFunctionSqmExpression expression) {
return (T) expression;
}
@Override
public T visitPluralAttributeSizeFunction(CollectionSizeSqmExpression function) {
return (T) function;
}
@Override
public T visitPluralAttributeElementBinding(SqmCollectionElementReference binding) {
return (T) binding;
}
@Override
public T visitPluralAttributeIndexFunction(SqmCollectionIndexReference binding) {
return (T) binding;
}
@Override
public T visitMapKeyBinding(SqmCollectionIndexReference binding) {
return (T) binding;
}
@Override
public T visitMapEntryFunction(SqmMapEntryBinding binding) {
return (T) binding;
}
@Override
public T visitMaxElementBinding(SqmMaxElementReference binding) {
return (T) binding;
}
@Override
public T visitMinElementBinding(SqmMinElementReference binding) {
return (T) binding;
}
@Override
public T visitMaxIndexFunction(AbstractSpecificSqmCollectionIndexReference function) {
return (T) function;
}
@Override
public T visitMinIndexFunction(SqmMinIndexReferenceBasic function) {
return (T) function;
}
@Override
public T visitLiteralStringExpression(LiteralStringSqmExpression expression) {
return (T) expression;
}
@Override
public T visitLiteralCharacterExpression(LiteralCharacterSqmExpression expression) {
return (T) expression;
}
@Override
public T visitLiteralDoubleExpression(LiteralDoubleSqmExpression expression) {
return (T) expression;
}
@Override
public T visitLiteralIntegerExpression(LiteralIntegerSqmExpression expression) {
return (T) expression;
}
@Override
public T visitLiteralBigIntegerExpression(LiteralBigIntegerSqmExpression expression) {
return (T) expression;
}
@Override
public T visitLiteralBigDecimalExpression(LiteralBigDecimalSqmExpression expression) {
return (T) expression;
}
@Override
public T visitLiteralFloatExpression(LiteralFloatSqmExpression expression) {
return (T) expression;
}
@Override
public T visitLiteralLongExpression(LiteralLongSqmExpression expression) {
return (T) expression;
}
@Override
public T visitLiteralTrueExpression(LiteralTrueSqmExpression expression) {
return (T) expression;
}
@Override
public T visitLiteralFalseExpression(LiteralFalseSqmExpression expression) {
return (T) expression;
}
@Override
public T visitLiteralNullExpression(LiteralNullSqmExpression expression) {
return (T) expression;
}
@Override
public T visitConcatExpression(ConcatSqmExpression expression) {
expression.getLeftHandOperand().accept( this );
expression.getRightHandOperand().accept( this );
return (T) expression;
}
@Override
public T visitConcatFunction(ConcatFunctionSqmExpression expression) {
for ( SqmExpression argument : expression.getExpressions() ) {
argument.accept( this );
}
return (T) expression;
}
@Override
public T visitConstantEnumExpression(ConstantEnumSqmExpression expression) {
return (T) expression;
}
@Override
public T visitConstantFieldExpression(ConstantFieldSqmExpression expression) {
return (T) expression;
}
@Override
public T visitBinaryArithmeticExpression(BinaryArithmeticSqmExpression expression) {
return (T) expression;
}
@Override
public T visitSubQueryExpression(SubQuerySqmExpression expression) {
return (T) expression;
}
@Override
public T visitSimpleCaseExpression(CaseSimpleSqmExpression expression) {
return (T) expression;
}
@Override
public T visitSearchedCaseExpression(CaseSearchedSqmExpression expression) {
return (T) expression;
}
@Override
public T visitCoalesceExpression(CoalesceSqmExpression expression) {
return (T) expression;
}
@Override
public T visitNullifExpression(NullifSqmExpression expression) {
return (T) expression;
}
@Override
public T visitSubstringFunction(SubstringFunctionSqmExpression expression) {
return (T) expression;
}
@Override
public T visitTrimFunction(TrimFunctionSqmExpression expression) {
return (T) expression;
}
@Override
public T visitLowerFunction(LowerFunctionSqmExpression expression) {
return (T) expression;
}
@Override
public T visitEntityIdentifierBinding(SqmEntityIdentifierReference expression) {
return (T) expression;
}
@Override
public T visitUpperFunction(UpperFunctionSqmExpression expression) {
return (T) expression;
}
}