diff --git a/hibernate-core/src/main/antlr/org/hibernate/grammars/hql/HqlParser.g4 b/hibernate-core/src/main/antlr/org/hibernate/grammars/hql/HqlParser.g4 index 4fc90da898cd..5db8339e9a72 100644 --- a/hibernate-core/src/main/antlr/org/hibernate/grammars/hql/HqlParser.g4 +++ b/hibernate-core/src/main/antlr/org/hibernate/grammars/hql/HqlParser.g4 @@ -185,11 +185,14 @@ limitOffset * * - The 'select' clause may come first, in which case 'from' is optional * - The 'from' clause may come first, in which case 'select' is optional, and comes last + * - If both 'select' and 'from' are missing, a 'where' clause on its own is allowed + * + * Note that 'having' is only allowed with 'group by', but we don't enforce + * that in the grammar. */ query -// TODO: add with clause - : selectClause fromClause? whereClause? (groupByClause havingClause?)? - | fromClause whereClause? (groupByClause havingClause?)? selectClause? + : selectClause fromClause? whereClause? groupByClause? havingClause? + | fromClause whereClause? groupByClause? havingClause? selectClause? | whereClause ; diff --git a/hibernate-core/src/main/java/org/hibernate/query/hql/internal/SemanticQueryBuilder.java b/hibernate-core/src/main/java/org/hibernate/query/hql/internal/SemanticQueryBuilder.java index e1cf905ceabd..1ed8bd64c9aa 100644 --- a/hibernate-core/src/main/java/org/hibernate/query/hql/internal/SemanticQueryBuilder.java +++ b/hibernate-core/src/main/java/org/hibernate/query/hql/internal/SemanticQueryBuilder.java @@ -71,6 +71,7 @@ import org.hibernate.query.criteria.JpaRoot; import org.hibernate.query.criteria.JpaSearchOrder; import org.hibernate.query.criteria.JpaXmlTableColumnNode; +import org.hibernate.query.spi.QueryEngine; import org.hibernate.query.sqm.SqmBindableType; import org.hibernate.query.sqm.tree.domain.SqmEntityDomainType; import org.hibernate.query.sqm.tuple.internal.AnonymousTupleType; @@ -413,6 +414,14 @@ public Stack getProcessingStateStack() { return processingStateStack; } + private NodeBuilder nodeBuilder() { + return creationContext.getNodeBuilder(); + } + + private QueryEngine queryEngine() { + return creationContext.getQueryEngine(); + } + // ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ // Grammar rules @@ -452,8 +461,8 @@ else if ( parseTree instanceof HqlParser.DeleteStatementContext deleteStatementC @Override public SqmSelectStatement visitSelectStatement(HqlParser.SelectStatementContext ctx) { - final HqlParser.QueryExpressionContext queryExpressionContext = ctx.queryExpression(); - final SqmSelectStatement selectStatement = new SqmSelectStatement<>( creationContext.getNodeBuilder() ); + final var queryExpressionContext = ctx.queryExpression(); + final SqmSelectStatement selectStatement = new SqmSelectStatement<>( nodeBuilder() ); parameterCollector = selectStatement; @@ -482,14 +491,14 @@ public SqmRoot visitTargetEntity(HqlParser.TargetEntityContext dmlTargetConte (EntityDomainType) visitEntityName( dmlTargetContext.entityName() ), extractAlias( dmlTargetContext.variable() ), false, - creationContext.getNodeBuilder() + nodeBuilder() ); } @Override public SqmInsertStatement visitInsertStatement(HqlParser.InsertStatementContext ctx) { - final HqlParser.TargetEntityContext dmlTargetContext = ctx.targetEntity(); - final HqlParser.TargetFieldsContext targetFieldsSpecContext = ctx.targetFields(); + final var dmlTargetContext = ctx.targetEntity(); + final var targetFieldsSpecContext = ctx.targetFields(); final SqmRoot root = visitTargetEntity( dmlTargetContext ); if ( root.getModel() instanceof SqmPolymorphicRootDescriptor ) { throw new SemanticException( @@ -499,10 +508,10 @@ public SqmInsertStatement visitInsertStatement(HqlParser.InsertStatementConte ); } - final HqlParser.QueryExpressionContext queryExpressionContext = ctx.queryExpression(); + final var queryExpressionContext = ctx.queryExpression(); if ( queryExpressionContext != null ) { final SqmInsertSelectStatement insertStatement = - new SqmInsertSelectStatement<>( root, creationContext.getNodeBuilder() ); + new SqmInsertSelectStatement<>( root, nodeBuilder() ); parameterCollector = insertStatement; final SqmDmlCreationProcessingState processingState = new SqmDmlCreationProcessingState( insertStatement, @@ -542,7 +551,7 @@ public SqmInsertStatement visitInsertStatement(HqlParser.InsertStatementConte } else { final SqmInsertValuesStatement insertStatement = - new SqmInsertValuesStatement<>( root, creationContext.getNodeBuilder() ); + new SqmInsertValuesStatement<>( root, nodeBuilder() ); parameterCollector = insertStatement; final SqmDmlCreationProcessingState processingState = new SqmDmlCreationProcessingState( insertStatement, @@ -559,7 +568,7 @@ public SqmInsertStatement visitInsertStatement(HqlParser.InsertStatementConte } final ArrayList valuesList = new ArrayList<>(); - final HqlParser.ValuesListContext valuesListContext = ctx.valuesList(); + final var valuesListContext = ctx.valuesList(); for ( int i = 1; i < valuesListContext.getChildCount(); i += 2 ) { final ParseTree values = valuesListContext.getChild( i ); final ArrayList> valuesExpressions = new ArrayList<>(); @@ -609,9 +618,9 @@ public SqmConflictClause visitConflictClause(HqlParser.ConflictClauseContext @SuppressWarnings("unchecked") final SqmInsertStatement statement = (SqmInsertStatement) processingState.getProcessingQuery(); final SqmConflictClause conflictClause = new SqmConflictClause<>( statement ); - final HqlParser.ConflictTargetContext conflictTargetContext = ctx.conflictTarget(); + final var conflictTargetContext = ctx.conflictTarget(); if ( conflictTargetContext != null ) { - final HqlParser.IdentifierContext identifierCtx = conflictTargetContext.identifier(); + final var identifierCtx = conflictTargetContext.identifier(); if ( identifierCtx != null ) { conflictClause.conflictOnConstraint( visitIdentifier( identifierCtx ) ); } @@ -623,8 +632,8 @@ public SqmConflictClause visitConflictClause(HqlParser.ConflictClauseContext conflictClause.conflictOnConstraintPaths( constraintAttributes ); } } - final HqlParser.ConflictActionContext conflictActionContext = ctx.conflictAction(); - final HqlParser.SetClauseContext setClauseContext = conflictActionContext.setClause(); + final var conflictActionContext = ctx.conflictAction(); + final var setClauseContext = conflictActionContext.setClause(); if ( setClauseContext != null ) { processingState.getPathRegistry().registerByAliasOnly( conflictClause.getExcludedRoot() ); final SqmConflictUpdateAction updateAction = conflictClause.onConflictDoUpdate(); @@ -638,7 +647,7 @@ public SqmConflictClause visitConflictClause(HqlParser.ConflictClauseContext @Override public SqmUpdateStatement visitUpdateStatement(HqlParser.UpdateStatementContext ctx) { - final SqmUpdateStatement updateStatement = new SqmUpdateStatement<>( creationContext.getNodeBuilder() ); + final SqmUpdateStatement updateStatement = new SqmUpdateStatement<>( nodeBuilder() ); parameterCollector = updateStatement; final SqmDmlCreationProcessingState processingState = new SqmDmlCreationProcessingState( updateStatement, @@ -650,14 +659,14 @@ public SqmUpdateStatement visitUpdateStatement(HqlParser.UpdateStatementConte updateStatement.versioned( ctx.VERSIONED() != null ); //noinspection unchecked updateStatement.setTarget( (JpaRoot) visitEntityWithJoins( ctx.entityWithJoins() ) ); - final HqlParser.SetClauseContext setClauseCtx = ctx.setClause(); + final var setClauseCtx = ctx.setClause(); for ( ParseTree subCtx : setClauseCtx.children ) { if ( subCtx instanceof HqlParser.AssignmentContext assignmentContext ) { updateStatement.applyAssignment( visitAssignment( assignmentContext ) ); } } - final HqlParser.WhereClauseContext whereClauseContext = ctx.whereClause(); + final var whereClauseContext = ctx.whereClause(); if ( whereClauseContext != null ) { updateStatement.applyPredicate( visitWhereClause( whereClauseContext ) ); } @@ -676,7 +685,7 @@ public SqmAssignment visitAssignment(HqlParser.AssignmentContext ctx) { final SqmPath targetPath = (SqmPath) consumeDomainPath( ctx.simplePath() ); final String targetPathJavaType = targetPath.getJavaTypeName(); final boolean isEnum = targetPath.isEnum(); - final ParseTree rightSide = ctx.getChild( 2 ); + final var rightSide = ctx.expressionOrPredicate(); final Set possibleEnumValues; final SqmExpression value; if ( isEnum @@ -697,7 +706,7 @@ public SqmAssignment visitAssignment(HqlParser.AssignmentContext ctx) { @Override public SqmDeleteStatement visitDeleteStatement(HqlParser.DeleteStatementContext ctx) { - final SqmDeleteStatement deleteStatement = new SqmDeleteStatement<>( creationContext.getNodeBuilder() ); + final SqmDeleteStatement deleteStatement = new SqmDeleteStatement<>( nodeBuilder() ); parameterCollector = deleteStatement; final SqmDmlCreationProcessingState sqmDeleteCreationState = new SqmDmlCreationProcessingState( deleteStatement, this ); @@ -705,7 +714,7 @@ public SqmDeleteStatement visitDeleteStatement(HqlParser.DeleteStatementConte try { //noinspection unchecked deleteStatement.setTarget( (JpaRoot) visitEntityWithJoins( ctx.entityWithJoins() ) ); - final HqlParser.WhereClauseContext whereClauseContext = ctx.whereClause(); + final var whereClauseContext = ctx.whereClause(); if ( whereClauseContext != null ) { deleteStatement.applyPredicate( visitWhereClause( whereClauseContext ) ); } @@ -737,32 +746,21 @@ public Object visitWithClause(HqlParser.WithClauseContext ctx) { @Override public Object visitCte(HqlParser.CteContext ctx) { - final SqmCteContainer cteContainer = (SqmCteContainer) processingStateStack.getCurrent().getProcessingQuery(); - final String name = visitIdentifier( (HqlParser.IdentifierContext) ctx.children.get( 0 ) ); + final SqmCteContainer cteContainer = + (SqmCteContainer) processingStateStack.getCurrent().getProcessingQuery(); + final String name = visitIdentifier( ctx.identifier() ); final TerminalNode thirdChild = (TerminalNode) ctx.getChild( 2 ); - final int queryExpressionIndex; - final CteMaterialization materialization; - switch ( thirdChild.getSymbol().getType() ) { - case HqlParser.NOT: - materialization = CteMaterialization.NOT_MATERIALIZED; - queryExpressionIndex = 5; - break; - case HqlParser.MATERIALIZED: - materialization = CteMaterialization.MATERIALIZED; - queryExpressionIndex = 4; - break; - default: - materialization = null; - queryExpressionIndex = 3; - break; - } - - final HqlParser.QueryExpressionContext queryExpressionContext = - (HqlParser.QueryExpressionContext) ctx.getChild( queryExpressionIndex ); + final CteMaterialization materialization = switch ( thirdChild.getSymbol().getType() ) { + case HqlParser.NOT -> CteMaterialization.NOT_MATERIALIZED; + case HqlParser.MATERIALIZED -> CteMaterialization.MATERIALIZED; + default -> null; + }; + + final var queryExpressionContext = ctx.queryExpression(); final SqmSelectQuery cte = cteContainer instanceof SqmSubQuery subQuery - ? new SqmSubQuery<>( subQuery.getParent(), creationContext.getNodeBuilder() ) - : new SqmSelectStatement<>( creationContext.getNodeBuilder() ); + ? new SqmSubQuery<>( subQuery.getParent(), nodeBuilder() ) + : new SqmSelectStatement<>( nodeBuilder() ); processingStateStack.push( new SqmQueryPartCreationProcessingStateStandardImpl( processingStateStack.getCurrent(), @@ -776,84 +774,13 @@ public Object visitCte(HqlParser.CteContext ctx) { if ( queryExpressionContext instanceof HqlParser.SetQueryGroupContext setContext ) { // A recursive query is only possible if the child count is lower than 5 e.g. `withClause? q1 op q2` if ( setContext.getChildCount() < 5 ) { - final SetOperator setOperator = (SetOperator) setContext.getChild( setContext.getChildCount() - 2 ) - .accept( this ); - switch ( setOperator ) { - case UNION: - case UNION_ALL: - final HqlParser.OrderedQueryContext nonRecursiveQueryContext; - final HqlParser.OrderedQueryContext recursiveQueryContext; - // On count == 4, we have a withClause at index 0 - if ( setContext.getChildCount() == 4 ) { - nonRecursiveQueryContext = (HqlParser.OrderedQueryContext) setContext.getChild( 1 ); - recursiveQueryContext = (HqlParser.OrderedQueryContext) setContext.getChild( 3 ); - } - else { - nonRecursiveQueryContext = (HqlParser.OrderedQueryContext) setContext.getChild( 0 ); - recursiveQueryContext = (HqlParser.OrderedQueryContext) setContext.getChild( 2 ); - } - // First visit the non-recursive part - nonRecursiveQueryContext.accept( this ); - - // Visiting the possibly recursive part must happen within the call to SqmCteContainer.with, - // because in there, the SqmCteStatement/JpaCteCriteria is available for use in the recursive part. - // The structure (SqmCteTable) for the SqmCteStatement is based on the non-recursive part, - // which is necessary to have, so that the SqmCteRoot/SqmCteJoin can resolve sub-paths. - final SqmSelectStatement recursivePart = - new SqmSelectStatement<>( creationContext.getNodeBuilder() ); - - processingStateStack.pop(); - processingStateStack.push( - new SqmQueryPartCreationProcessingStateStandardImpl( - processingStateStack.getCurrent(), - recursivePart, - this - ) - ); - final JpaCteCriteria cteDefinition; - if ( setOperator == SetOperator.UNION ) { - cteDefinition = cteContainer.withRecursiveUnionDistinct( - name, - cte, - cteCriteria -> { - currentPotentialRecursiveCte = cteCriteria; - recursiveQueryContext.accept( this ); - return recursivePart; - } - ); - } - else { - cteDefinition = cteContainer.withRecursiveUnionAll( - name, - cte, - cteCriteria -> { - currentPotentialRecursiveCte = cteCriteria; - recursiveQueryContext.accept( this ); - return recursivePart; - } - ); - } - if ( materialization != null ) { - cteDefinition.setMaterialization( materialization ); - } - final ParseTree lastChild = ctx.getChild( ctx.getChildCount() - 1 ); - final ParseTree potentialSearchClause; - if ( lastChild instanceof HqlParser.CycleClauseContext cycleClauseContext ) { - applyCycleClause( cteDefinition, cycleClauseContext ); - potentialSearchClause = ctx.getChild( ctx.getChildCount() - 2 ); - } - else { - potentialSearchClause = lastChild; - } - if ( potentialSearchClause instanceof HqlParser.SearchClauseContext searchClauseContext ) { - applySearchClause( cteDefinition, searchClauseContext ); - } - return null; + if ( handleRecursive( ctx, setContext, cteContainer, name, cte, materialization ) ) { + return null; } } } queryExpressionContext.accept( this ); - final JpaCteCriteria cteDefinition = cteContainer.with( name, cte ); + final JpaCteCriteria cteDefinition = cteContainer.with( name, cte ); if ( materialization != null ) { cteDefinition.setMaterialization( materialization ); } @@ -865,14 +792,85 @@ public Object visitCte(HqlParser.CteContext ctx) { return null; } + private boolean handleRecursive( + HqlParser.CteContext cteContext, + HqlParser.SetQueryGroupContext setContext, + SqmCteContainer cteContainer, + String name, + SqmSelectQuery cte, + CteMaterialization materialization) { + final SetOperator setOperator = (SetOperator) setContext.setOperator(0).accept( this ); + switch ( setOperator ) { + case UNION: + case UNION_ALL: + final var nonRecursiveQueryContext = setContext.orderedQuery(0); + final var recursiveQueryContext = setContext.orderedQuery(1); + // First visit the non-recursive part + nonRecursiveQueryContext.accept( this ); + + // Visiting the possibly recursive part must happen within the call to SqmCteContainer.with, + // because in there, the SqmCteStatement/JpaCteCriteria is available for use in the recursive part. + // The structure (SqmCteTable) for the SqmCteStatement is based on the non-recursive part, + // which is necessary to have, so that the SqmCteRoot/SqmCteJoin can resolve sub-paths. + final SqmSelectStatement recursivePart = + new SqmSelectStatement<>( nodeBuilder() ); + + processingStateStack.pop(); + processingStateStack.push( + new SqmQueryPartCreationProcessingStateStandardImpl( + processingStateStack.getCurrent(), + recursivePart, + this + ) + ); + final JpaCteCriteria cteDefinition; + if ( setOperator == SetOperator.UNION ) { + cteDefinition = cteContainer.withRecursiveUnionDistinct( + name, + cte, + cteCriteria -> { + currentPotentialRecursiveCte = cteCriteria; + recursiveQueryContext.accept( this ); + return recursivePart; + } + ); + } + else { + cteDefinition = cteContainer.withRecursiveUnionAll( + name, + cte, + cteCriteria -> { + currentPotentialRecursiveCte = cteCriteria; + recursiveQueryContext.accept( this ); + return recursivePart; + } + ); + } + if ( materialization != null ) { + cteDefinition.setMaterialization( materialization ); + } + final var cycleClauseContext = cteContext.cycleClause(); + if ( cycleClauseContext != null ) { + applyCycleClause( cteDefinition, cycleClauseContext ); + } + final var searchClauseContext = cteContext.searchClause(); + if ( searchClauseContext != null ) { + applySearchClause( cteDefinition, searchClauseContext ); + } + return true; + } + return false; + } + private void applyCycleClause(JpaCteCriteria cteDefinition, HqlParser.CycleClauseContext ctx) { - final HqlParser.CteAttributesContext attributesContext = ctx.cteAttributes(); - final String cycleMarkAttributeName = visitIdentifier( (HqlParser.IdentifierContext) ctx.getChild( 3 ) ); - final List cycleAttributes = new ArrayList<>( ( attributesContext.getChildCount() + 1 ) >> 1 ); - final List children = attributesContext.children; + final var attributesContext = ctx.cteAttributes(); + final String cycleMarkAttributeName = visitIdentifier( ctx.identifier(0) ); + final List cycleAttributes = + new ArrayList<>( ( attributesContext.getChildCount() + 1 ) >> 1 ); + final var identifiers = attributesContext.identifier(); final JpaCteCriteriaType type = cteDefinition.getType(); - for ( int i = 0; i < children.size(); i += 2 ) { - final String attributeName = visitIdentifier( (HqlParser.IdentifierContext) children.get( i ) ); + for ( int i = 0; i < identifiers.size(); i ++ ) { + final String attributeName = visitIdentifier( identifiers.get( i ) ); final JpaCteCriteriaAttribute attribute = type.getAttribute( attributeName ); if ( attribute == null ) { throw new SemanticException( @@ -890,40 +888,34 @@ private void applyCycleClause(JpaCteCriteria cteDefinition, HqlParser.CycleCl final String cyclePathAttributeName; final Object cycleValue; final Object noCycleValue; - if ( ctx.getChildCount() > 4 ) { - if ( ctx.getChildCount() > 6 ) { - final SqmLiteral cycleLiteral = (SqmLiteral) visitLiteral( (HqlParser.LiteralContext) ctx.getChild( 5 ) ); - final SqmLiteral noCycleLiteral = (SqmLiteral) visitLiteral( (HqlParser.LiteralContext) ctx.getChild( 7 ) ); - cycleValue = cycleLiteral.getLiteralValue(); - noCycleValue = noCycleLiteral.getLiteralValue(); - } - else { - cycleValue = Boolean.TRUE; - noCycleValue = Boolean.FALSE; - } - final ParseTree lastChild = ctx.getChild( ctx.getChildCount() - 1 ); - cyclePathAttributeName = - lastChild instanceof HqlParser.IdentifierContext identifierContext - ? visitIdentifier( identifierContext ) - : null; + if ( ctx.TO() != null && ctx.DEFAULT() != null ) { + final SqmLiteral cycleLiteral = (SqmLiteral) visitLiteral( ctx.literal(0) ); + final SqmLiteral noCycleLiteral = (SqmLiteral) visitLiteral( ctx.literal(1) ); + cycleValue = cycleLiteral.getLiteralValue(); + noCycleValue = noCycleLiteral.getLiteralValue(); } else { - cyclePathAttributeName = null; cycleValue = Boolean.TRUE; noCycleValue = Boolean.FALSE; } + if ( ctx.USING() != null ) { + cyclePathAttributeName = visitIdentifier( ctx.identifier(1) ); + } + else { + cyclePathAttributeName = null; + } cteDefinition.cycleUsing( cycleMarkAttributeName, cyclePathAttributeName, cycleValue, noCycleValue, cycleAttributes ); } private void applySearchClause(JpaCteCriteria cteDefinition, HqlParser.SearchClauseContext ctx) { final String searchAttributeName = visitIdentifier( ctx.identifier() ); - final HqlParser.SearchSpecificationsContext searchCtx = ctx.searchSpecifications(); + final var searchCtx = ctx.searchSpecifications(); final List searchOrders = new ArrayList<>( ( searchCtx.getChildCount() + 1 ) >> 1 ); - final List children = searchCtx.children; + final var searchSpecifications = searchCtx.searchSpecification(); final JpaCteCriteriaType type = cteDefinition.getType(); - for ( int i = 0; i < children.size(); i += 2 ) { - final HqlParser.SearchSpecificationContext specCtx = (HqlParser.SearchSpecificationContext) children.get( i ); + for ( int i = 0; i < searchSpecifications.size(); i ++ ) { + final var specCtx = searchSpecifications.get( i ); final String attributeName = visitIdentifier( specCtx.identifier() ); final JpaCteCriteriaAttribute attribute = type.getAttribute( attributeName ); if ( attribute == null ) { @@ -941,7 +933,7 @@ private void applySearchClause(JpaCteCriteria cteDefinition, HqlParser.Search int index = 1; if ( index < specCtx.getChildCount() ) { if ( specCtx.getChild( index ) instanceof HqlParser.SortDirectionContext ) { - final HqlParser.SortDirectionContext sortCtx = specCtx.sortDirection(); + final var sortCtx = specCtx.sortDirection(); final Token symbol = ((TerminalNode) sortCtx.getChild( 0 )).getSymbol(); sortOrder = switch ( symbol.getType() ) { case HqlParser.ASC -> SortDirection.ASCENDING; @@ -952,7 +944,7 @@ private void applySearchClause(JpaCteCriteria cteDefinition, HqlParser.Search index++; } if ( index < specCtx.getChildCount() ) { - final HqlParser.NullsPrecedenceContext nullsPrecedenceContext = specCtx.nullsPrecedence(); + final var nullsPrecedenceContext = specCtx.nullsPrecedence(); final Token symbol = ((TerminalNode) nullsPrecedenceContext.getChild( 1 )).getSymbol(); nullPrecedence = switch ( symbol.getType() ) { case HqlParser.FIRST -> Nulls.FIRST; @@ -962,7 +954,7 @@ private void applySearchClause(JpaCteCriteria cteDefinition, HqlParser.Search }; } } - searchOrders.add( creationContext.getNodeBuilder().search( attribute, sortOrder, nullPrecedence ) ); + searchOrders.add( nodeBuilder().search( attribute, sortOrder, nullPrecedence ) ); } cteDefinition.search( getCteSearchClauseKind( ctx ), searchAttributeName, searchOrders ); } @@ -973,11 +965,11 @@ private static CteSearchClauseKind getCteSearchClauseKind(HqlParser.SearchClause @Override public SqmQueryPart visitSimpleQueryGroup(HqlParser.SimpleQueryGroupContext ctx) { - final int lastChild = ctx.getChildCount() - 1; - if ( lastChild != 0 ) { - ctx.getChild( 0 ).accept( this ); + final var withClauseContext = ctx.withClause(); + if ( withClauseContext != null ) { + withClauseContext.accept( this ); } - return (SqmQueryPart) ctx.getChild( lastChild ).accept( this ); + return (SqmQueryPart) ctx.orderedQuery().accept( this ); } @Override @@ -1017,31 +1009,31 @@ public SqmQueryPart visitNestedQueryExpression(HqlParser.NestedQueryExpressio @Override public SqmQueryGroup visitSetQueryGroup(HqlParser.SetQueryGroupContext ctx) { - final List children = ctx.children; - final int firstIndex; - if ( children.get( 0 ) instanceof HqlParser.WithClauseContext ) { - children.get( 0 ).accept( this ); - firstIndex = 1; - } - else { - firstIndex = 0; + var withClauseContext = ctx.withClause(); + if ( withClauseContext != null ) { + withClauseContext.accept( this ); } - final SqmQueryPart firstQueryPart = (SqmQueryPart) children.get( firstIndex ).accept( this ); + final SqmQueryPart firstQueryPart = + (SqmQueryPart) ctx.orderedQuery(0).accept( this ); SqmQueryGroup queryGroup = firstQueryPart instanceof SqmQueryGroup sqmQueryGroup ? sqmQueryGroup : new SqmQueryGroup<>( firstQueryPart ); setCurrentQueryPart( queryGroup ); - final int size = children.size(); + final var orderedQueryContexts = ctx.orderedQuery(); + final var setOperatorContexts = ctx.setOperator(); final SqmCreationProcessingState firstProcessingState = processingStateStack.pop(); - for ( int i = firstIndex + 1; i < size; i += 2 ) { - final SetOperator operator = visitSetOperator( (HqlParser.SetOperatorContext) children.get(i) ); - final HqlParser.OrderedQueryContext simpleQueryCtx = - (HqlParser.OrderedQueryContext) children.get( i + 1 ); - queryGroup = getSqmQueryGroup( operator, simpleQueryCtx, queryGroup, size, firstProcessingState, i ); + for ( int i = 0; i < setOperatorContexts.size(); i++ ) { + queryGroup = getSqmQueryGroup( + visitSetOperator( setOperatorContexts.get(i) ), + orderedQueryContexts.get( i+1 ), + queryGroup, + setOperatorContexts.size(), + firstProcessingState, + i + ); } processingStateStack.push( firstProcessingState ); - return queryGroup; } @@ -1052,8 +1044,6 @@ private SqmQueryGroup getSqmQueryGroup( int size, SqmCreationProcessingState firstProcessingState, int i) { - - final List> queryParts; processingStateStack.push( new SqmQueryPartCreationProcessingStateStandardImpl( processingStateStack.getCurrent(), @@ -1061,28 +1051,29 @@ private SqmQueryGroup getSqmQueryGroup( this ) ); - if ( queryGroup.getSetOperator() == null || queryGroup.getSetOperator() == operator ) { + final List> queryParts; + final SetOperator setOperator = queryGroup.getSetOperator(); + if ( setOperator == null || setOperator == operator ) { queryGroup.setSetOperator( operator ); queryParts = queryGroup.queryParts(); } else { queryParts = new ArrayList<>( size - ( i >> 1 ) ); queryParts.add( queryGroup ); - queryGroup = new SqmQueryGroup<>( creationContext.getNodeBuilder(), operator, queryParts ); + queryGroup = new SqmQueryGroup<>( nodeBuilder(), operator, queryParts ); setCurrentQueryPart( queryGroup ); } try { - final List subChildren = simpleQueryCtx.children; - if ( subChildren.get( 0 ) instanceof HqlParser.QueryContext ) { - final SqmQuerySpec querySpec = new SqmQuerySpec<>( creationContext.getNodeBuilder() ); + if ( simpleQueryCtx instanceof HqlParser.QuerySpecExpressionContext querySpecContext ) { + final SqmQuerySpec querySpec = new SqmQuerySpec<>( nodeBuilder() ); queryParts.add( querySpec ); - visitQuerySpecExpression( (HqlParser.QuerySpecExpressionContext) simpleQueryCtx ); + visitQuerySpecExpression( querySpecContext ); } - else { + else if ( simpleQueryCtx instanceof HqlParser.NestedQueryExpressionContext nestedQueryContext ) { try { - final SqmSelectStatement selectStatement = - new SqmSelectStatement<>( creationContext.getNodeBuilder() ); + final SqmSelectStatement selectStatement = + new SqmSelectStatement<>( nodeBuilder() ); processingStateStack.push( new SqmQueryPartCreationProcessingStateStandardImpl( processingStateStack.getCurrent(), @@ -1092,13 +1083,14 @@ private SqmQueryGroup getSqmQueryGroup( ); @SuppressWarnings("unchecked") final SqmQueryPart queryPart = (SqmQueryPart) - visitNestedQueryExpression( (HqlParser.NestedQueryExpressionContext) simpleQueryCtx ); + visitNestedQueryExpression( nestedQueryContext ); queryParts.add( queryPart ); } finally { processingStateStack.pop(); } } + // else if QueryOrderExpressionContext, nothing to do } finally { processingStateStack.pop(); @@ -1120,9 +1112,9 @@ public SetOperator visitSetOperator(HqlParser.SetOperatorContext ctx) { protected void visitLimitOffset(SqmQueryPart sqmQueryPart, HqlParser.LimitOffsetContext ctx) { if ( ctx != null ) { - final HqlParser.LimitClauseContext limitClauseContext = ctx.limitClause(); - final HqlParser.OffsetClauseContext offsetClauseContext = ctx.offsetClause(); - final HqlParser.FetchClauseContext fetchClauseContext = ctx.fetchClause(); + final var limitClauseContext = ctx.limitClause(); + final var offsetClauseContext = ctx.offsetClause(); + final var fetchClauseContext = ctx.fetchClause(); if ( limitClauseContext != null || offsetClauseContext != null || fetchClauseContext != null ) { if ( getCreationOptions().useStrictJpaCompliance() ) { throw new StrictJpaComplianceViolation( @@ -1175,30 +1167,40 @@ else if ( fetchClauseContext == null ) { public SqmQuerySpec visitQuery(HqlParser.QueryContext ctx) { final SqmQuerySpec sqmQuerySpec = currentQuerySpec(); + final var fromClauseContext = ctx.fromClause(); + final var whereClauseContext = ctx.whereClause(); + final var groupByClauseContext = ctx.groupByClause(); + final var havingClauseContext = ctx.havingClause(); + final var selectClauseContext = ctx.selectClause(); + + if ( havingClauseContext != null && groupByClauseContext == null ) { + throw new SemanticException( "Query has 'having' but no 'group by'", query ); + } + // visit from clause first!!! final SqmFromClause fromClause = - ctx.fromClause() == null - ? buildInferredFromClause( ctx.selectClause() ) - : visitFromClause( ctx.fromClause() ); + fromClauseContext == null + ? buildInferredFromClause( selectClauseContext ) + : visitFromClause( fromClauseContext ); sqmQuerySpec.setFromClause( fromClause ); final SqmSelectClause selectClause = - ctx.selectClause() == null + selectClauseContext == null ? buildInferredSelectClause( fromClause ) - : visitSelectClause( ctx.selectClause() ); + : visitSelectClause( selectClauseContext ); sqmQuerySpec.setSelectClause( selectClause ); - final SqmWhereClause whereClause = new SqmWhereClause( creationContext.getNodeBuilder() ); - if ( ctx.whereClause() != null ) { - whereClause.setPredicate( (SqmPredicate) ctx.whereClause().accept( this ) ); + final SqmWhereClause whereClause = new SqmWhereClause( nodeBuilder() ); + if ( whereClauseContext != null ) { + whereClause.setPredicate( (SqmPredicate) whereClauseContext.accept( this ) ); } sqmQuerySpec.setWhereClause( whereClause ); - if ( ctx.groupByClause() != null ) { - sqmQuerySpec.setGroupByClauseExpressions( visitGroupByClause( ctx.groupByClause() ) ); + if ( groupByClauseContext != null ) { + sqmQuerySpec.setGroupByClauseExpressions( visitGroupByClause( groupByClauseContext ) ); } - if ( ctx.havingClause() != null ) { - sqmQuerySpec.setHavingClausePredicate( visitHavingClause( ctx.havingClause() ) ); + if ( havingClauseContext != null ) { + sqmQuerySpec.setHavingClausePredicate( visitHavingClause( havingClauseContext ) ); } return sqmQuerySpec; @@ -1221,7 +1223,7 @@ private SqmFromClause buildInferredFromClause(HqlParser.SelectClauseContext sele final EntityDomainType entityDescriptor = getResultEntity(); if ( entityDescriptor != null ) { final SqmRoot sqmRoot = - new SqmRoot<>( entityDescriptor, null, false, creationContext.getNodeBuilder() ); + new SqmRoot<>( entityDescriptor, null, false, nodeBuilder() ); processingStateStack.getCurrent().getPathRegistry().register( sqmRoot ); fromClause.addRoot( sqmRoot ); } @@ -1267,8 +1269,7 @@ protected SqmSelectClause buildInferredSelectClause(SqmFromClause fromClause) { query ); } - final NodeBuilder nodeBuilder = creationContext.getNodeBuilder(); - + final NodeBuilder nodeBuilder = nodeBuilder(); for ( SqmRoot sqmRoot : fromClause.getRoots() ) { if ( "this".equals( sqmRoot.getExplicitAlias() ) ) { // we found an entity with the alias 'this' @@ -1369,7 +1370,7 @@ protected SqmSelectClause buildInferredSelectClause(SqmFromClause fromClause) { private void applyJoinsToInferredSelectClause(SqmFrom sqm, SqmSelectClause selectClause) { sqm.visitSqmJoins( sqmJoin -> { if ( sqmJoin.isImplicitlySelectable() ) { - selectClause.addSelection( new SqmSelection<>( sqmJoin, sqmJoin.getAlias(), creationContext.getNodeBuilder() ) ); + selectClause.addSelection( new SqmSelection<>( sqmJoin, sqmJoin.getAlias(), nodeBuilder() ) ); applyJoinsToInferredSelectClause( sqmJoin, selectClause ); } } ); @@ -1379,8 +1380,8 @@ private void applyJoinsToInferredSelectClause(SqmFrom sqm, SqmSelectClause public SqmSelectClause visitSelectClause(HqlParser.SelectClauseContext ctx) { // todo (6.0) : primer a select-clause-specific SemanticPathPart into the stack final SqmSelectClause selectClause = - new SqmSelectClause( ctx.DISTINCT() != null, creationContext.getNodeBuilder() ); - final HqlParser.SelectionListContext selectionListContext = ctx.selectionList(); + new SqmSelectClause( ctx.DISTINCT() != null, nodeBuilder() ); + final var selectionListContext = ctx.selectionList(); for ( HqlParser.SelectionContext selectionContext : selectionListContext.selection() ) { selectClause.addSelection( visitSelection( selectionContext ) ); } @@ -1397,7 +1398,7 @@ public SqmSelection visitSelection(HqlParser.SelectionContext ctx) { // NOTE : SqmSelection forces the alias down to its selectableNode. // - no need to do that here resultIdentifier, - creationContext.getNodeBuilder() + nodeBuilder() ); // if the node is not a dynamic-instantiation, register it with @@ -1410,7 +1411,7 @@ public SqmSelection visitSelection(HqlParser.SelectionContext ctx) { } private SqmSelectableNode visitSelectableNode(HqlParser.SelectionContext ctx) { - final ParseTree subCtx = ctx.getChild( 0 ).getChild( 0 ); + final ParseTree subCtx = ctx.selectExpression().getChild( 0 ); if ( subCtx instanceof HqlParser.ExpressionOrPredicateContext ) { final SqmExpression sqmExpression = (SqmExpression) subCtx.accept( this ); if ( sqmExpression instanceof SqmPath sqmPath @@ -1440,7 +1441,7 @@ private SqmSelectableNode visitSelectableNode(HqlParser.SelectionContext ctx) @Override public SqmDynamicInstantiation visitInstantiation(HqlParser.InstantiationContext ctx) { final SqmDynamicInstantiation dynamicInstantiation = visitInstantiationTarget( ctx.instantiationTarget() ); - for ( HqlParser.InstantiationArgumentContext arg : ctx.instantiationArguments().instantiationArgument() ) { + for ( var arg : ctx.instantiationArguments().instantiationArgument() ) { dynamicInstantiation.addArgument( visitInstantiationArgument( arg ) ); } @@ -1460,19 +1461,19 @@ public SqmDynamicInstantiation visitInstantiation(HqlParser.InstantiationCont @Override public SqmDynamicInstantiation visitInstantiationTarget(HqlParser.InstantiationTargetContext ctx) { if ( ctx.MAP() != null ) { - return forMapInstantiation( mapJavaType, creationContext.getNodeBuilder() ); + return forMapInstantiation( mapJavaType, nodeBuilder() ); } else if ( ctx.LIST() != null ) { - return forListInstantiation( listJavaType, creationContext.getNodeBuilder() ); + return forListInstantiation( listJavaType, nodeBuilder() ); } else { - final HqlParser.SimplePathContext simplePath = ctx.simplePath(); + final var simplePath = ctx.simplePath(); if ( simplePath == null ) { throw new SyntaxException( "Missing instantiation target type" ); } final String className = instantiationClassName( simplePath ); try { - return forClassInstantiation( resolveInstantiationTargetType( className ), creationContext.getNodeBuilder() ); + return forClassInstantiation( resolveInstantiationTargetType( className ), nodeBuilder() ); } catch (ClassLoadingException e) { throw new SemanticException( "Could not resolve class '" + className + "' named for instantiation", query ); @@ -1495,12 +1496,12 @@ private JavaType resolveInstantiationTargetType(String className) { @Override public SqmDynamicInstantiationArgument visitInstantiationArgument(HqlParser.InstantiationArgumentContext ctx) { - final HqlParser.VariableContext variable = ctx.variable(); + final var variable = ctx.variable(); final String alias = variable == null ? null : extractAlias( variable ); final SqmSelectableNode argExpression = (SqmSelectableNode) ctx.instantiationArgumentExpression().accept( this ); final SqmDynamicInstantiationArgument argument = - new SqmDynamicInstantiationArgument<>( argExpression, alias, creationContext.getNodeBuilder() ); + new SqmDynamicInstantiationArgument<>( argExpression, alias, nodeBuilder() ); if ( !(argExpression instanceof SqmDynamicInstantiation) ) { processingStateStack.getCurrent().getPathRegistry().register( argument ); } @@ -1523,15 +1524,11 @@ public SqmPath visitJpaSelectObjectSyntax(HqlParser.JpaSelectObjectSyntaxCont @Override public List> visitGroupByClause(HqlParser.GroupByClauseContext ctx) { - final int size = ctx.getChildCount(); - // Shift 1 bit instead of division by 2 - final int estimateExpressionsCount = ( size >> 1 ) - 1; - final List> expressions = new ArrayList<>( estimateExpressionsCount ); + final var groupByExpressionContexts = ctx.groupByExpression(); + final int size = groupByExpressionContexts.size(); + final List> expressions = new ArrayList<>( size ); for ( int i = 0; i < size; i++ ) { - final ParseTree parseTree = ctx.getChild( i ); - if ( parseTree instanceof HqlParser.GroupByExpressionContext ) { - expressions.add( (SqmExpression) parseTree.accept( this ) ); - } + expressions.add( (SqmExpression) groupByExpressionContexts.get( i ).accept( this ) ); } return expressions; } @@ -1540,7 +1537,7 @@ private SqmExpression resolveOrderByOrGroupByExpression( ParseTree child, boolean definedCollate, boolean allowPositionalOrAliases) { - final NodeBuilder nodeBuilder = creationContext.getNodeBuilder(); + final NodeBuilder nodeBuilder = nodeBuilder(); final SqmCreationProcessingState processingState = processingStateStack.getCurrent(); final SqmQuery processingQuery = processingState.getProcessingQuery(); final SqmQueryPart queryPart; @@ -1696,18 +1693,14 @@ public SqmOrderByClause visitOrderByClause(HqlParser.OrderByClauseContext ctx) { } private SqmOrderByClause visitOrderByClause(HqlParser.OrderByClauseContext ctx, boolean allowPositionalOrAliases) { - final int size = ctx.getChildCount(); - // Shift 1 bit instead of division by 2 - final int estimateExpressionsCount = ( size >> 1 ) - 1; - final SqmOrderByClause orderByClause = new SqmOrderByClause( estimateExpressionsCount ); + final var sortSpecificationContexts = ctx.sortSpecification(); + final int size = sortSpecificationContexts.size(); + final SqmOrderByClause orderByClause = new SqmOrderByClause( size ); for ( int i = 0; i < size; i++ ) { - final ParseTree parseTree = ctx.getChild( i ); - if ( parseTree instanceof HqlParser.SortSpecificationContext sortSpecificationContext ) { - orderByClause.addSortSpecification( visitSortSpecification( - sortSpecificationContext, - allowPositionalOrAliases - ) ); - } + orderByClause.addSortSpecification( visitSortSpecification( + sortSpecificationContexts.get( i ), + allowPositionalOrAliases + ) ); } return orderByClause; } @@ -1814,7 +1807,7 @@ public SqmExpression visitFetchClause(HqlParser.FetchClauseContext ctx) { return null; } - final HqlParser.FetchCountOrPercentContext fetchCountOrPercent = ctx.fetchCountOrPercent(); + final var fetchCountOrPercent = ctx.fetchCountOrPercent(); if ( fetchCountOrPercent.PERCENT() == null ) { return (SqmExpression) fetchCountOrPercent.parameterOrIntegerLiteral().accept( this ); } @@ -1965,7 +1958,7 @@ public SqmFromClause visitFromClause(HqlParser.FromClauseContext parserFromClaus fromClause.addRoot( sqmRoot ); for ( int i = 1; i < roots.size(); i++ ) { - final HqlParser.EntityWithJoinsContext secondaryRoot = roots.get( i ); + final var secondaryRoot = roots.get( i ); SqmTreeCreationHelper.handleRootAsCrossJoin( secondaryRoot, sqmRoot, this ); } } @@ -2004,7 +1997,7 @@ else if ( parseTree instanceof HqlParser.JpaCollectionJoinContext jpaCollectionJ @Override public SqmRoot visitRootEntity(HqlParser.RootEntityContext ctx) { - final HqlParser.EntityNameContext entityNameContext = ctx.entityName(); + final var entityNameContext = ctx.entityName(); final String name = getEntityName( entityNameContext ); final EntityDomainType entityDescriptor = creationContext.getJpaMetamodel().getHqlEntityReference( name ); @@ -2036,7 +2029,7 @@ public SqmRoot visitRootEntity(HqlParser.RootEntityContext ctx) { } final SqmRoot sqmRoot = - new SqmRoot<>( entityDescriptor, alias, true, creationContext.getNodeBuilder() ); + new SqmRoot<>( entityDescriptor, alias, true, nodeBuilder() ); pathRegistry.register( sqmRoot ); return sqmRoot; } @@ -2183,7 +2176,7 @@ private JpaMetamodel getJpaMetamodel() { protected void consumeJoin(HqlParser.JoinContext parserJoin, SqmRoot sqmRoot) { final SqmJoinType joinType = getSqmJoinType( parserJoin.joinType() ); - final HqlParser.JoinTargetContext qualifiedJoinTargetContext = parserJoin.joinTarget(); + final var qualifiedJoinTargetContext = parserJoin.joinTarget(); final String alias = extractAlias( getVariable( qualifiedJoinTargetContext ) ); final boolean fetch = parserJoin.FETCH() != null; @@ -2194,7 +2187,7 @@ protected void consumeJoin(HqlParser.JoinContext parserJoin, SqmRoot sqmR dotIdentifierConsumerStack.push( new QualifiedJoinPathConsumer( sqmRoot, joinType, fetch, alias, this ) ); try { final SqmJoin join = getJoin( sqmRoot, joinType, qualifiedJoinTargetContext, alias, fetch ); - final HqlParser.JoinRestrictionContext joinRestrictionContext = parserJoin.joinRestriction(); + final var joinRestrictionContext = parserJoin.joinRestriction(); if ( join instanceof SqmEntityJoin || join instanceof SqmDerivedJoin || join instanceof SqmCteJoin ) { sqmRoot.addSqmJoin( join ); } @@ -2361,7 +2354,7 @@ public SqmPredicate visitWhereClause(HqlParser.WhereClauseContext ctx) { public SqmGroupedPredicate visitGroupedPredicate(HqlParser.GroupedPredicateContext ctx) { return new SqmGroupedPredicate( (SqmPredicate) ctx.predicate().accept( this ), - creationContext.getNodeBuilder() + nodeBuilder() ); } @@ -2396,7 +2389,7 @@ private SqmPredicate junction(Predicate.BooleanOperator operator, SqmPredicate l return junction; } } - return new SqmJunctionPredicate( operator, lhs, rhs, creationContext.getNodeBuilder() ); + return new SqmJunctionPredicate( operator, lhs, rhs, nodeBuilder() ); } @Override @@ -2407,7 +2400,7 @@ public SqmPredicate visitNegatedPredicate(HqlParser.NegatedPredicateContext ctx) return predicate; } else { - return new SqmNegatedPredicate( predicate, creationContext.getNodeBuilder() ); + return new SqmNegatedPredicate( predicate, nodeBuilder() ); } } @@ -2418,7 +2411,7 @@ public SqmBetweenPredicate visitBetweenPredicate(HqlParser.BetweenPredicateConte (SqmExpression) ctx.expression( 1 ).accept( this ), (SqmExpression) ctx.expression( 2 ).accept( this ), ctx.NOT() != null, - creationContext.getNodeBuilder() + nodeBuilder() ); } @@ -2428,7 +2421,7 @@ public SqmNullnessPredicate visitIsNullPredicate(HqlParser.IsNullPredicateContex return new SqmNullnessPredicate( (SqmExpression) ctx.expression().accept( this ), ctx.NOT() != null, - creationContext.getNodeBuilder() + nodeBuilder() ); } @@ -2439,7 +2432,7 @@ public SqmEmptinessPredicate visitIsEmptyPredicate(HqlParser.IsEmptyPredicateCon return new SqmEmptinessPredicate( pluralValuedSimplePath, ctx.NOT() != null, - creationContext.getNodeBuilder() + nodeBuilder() ); } else { @@ -2453,7 +2446,7 @@ public Object visitIsTruePredicate(HqlParser.IsTruePredicateContext ctx) { (SqmExpression) ctx.expression().accept( this ), true, ctx.NOT() != null, - creationContext.getNodeBuilder() + nodeBuilder() ); } @@ -2463,7 +2456,7 @@ public Object visitIsFalsePredicate(HqlParser.IsFalsePredicateContext ctx) { (SqmExpression) ctx.expression().accept( this ), false, ctx.NOT() != null, - creationContext.getNodeBuilder() + nodeBuilder() ); } @@ -2484,15 +2477,15 @@ public Object visitComparisonOperator(HqlParser.ComparisonOperatorContext ctx) { @Override public SqmPredicate visitComparisonPredicate(HqlParser.ComparisonPredicateContext ctx) { final ComparisonOperator comparisonOperator = (ComparisonOperator) ctx.comparisonOperator().accept( this ); - final HqlParser.ExpressionContext leftExpressionContext = ctx.expression( 0 ); - final HqlParser.ExpressionContext rightExpressionContext = ctx.expression( 1 ); + final var leftExpressionContext = ctx.expression( 0 ); + final var rightExpressionContext = ctx.expression( 1 ); return createComparisonPredicate( comparisonOperator, leftExpressionContext, rightExpressionContext ); } @Override public SqmPredicate visitIsDistinctFromPredicate(HqlParser.IsDistinctFromPredicateContext ctx) { - final HqlParser.ExpressionContext leftExpressionContext = ctx.expression( 0 ); - final HqlParser.ExpressionContext rightExpressionContext = ctx.expression( 1 ); + final var leftExpressionContext = ctx.expression( 0 ); + final var rightExpressionContext = ctx.expression( 1 ); final ComparisonOperator comparisonOperator = ctx.NOT() == null ? ComparisonOperator.DISTINCT_FROM : ComparisonOperator.NOT_DISTINCT_FROM; @@ -2544,7 +2537,7 @@ else if ( r instanceof AnyDiscriminatorSqmPath anyDiscriminatorPath && l inst left, comparisonOperator, right, - creationContext.getNodeBuilder() + nodeBuilder() ); } @@ -2556,7 +2549,7 @@ private SqmExpression createDiscriminatorValue( expressible.getPathName(), getJpaMetamodel().resolveHqlEntityReference( valueExpressionContext.getText() ), expressible.getPathType(), - creationContext.getNodeBuilder() + nodeBuilder() ); } @@ -2636,9 +2629,9 @@ public SqmPredicate visitContainsPredicate(HqlParser.ContainsPredicateContext ct final SelfRenderingSqmFunction contains = getFunctionDescriptor( "array_contains" ).generateSqmExpression( asList( lhs, rhs ), null, - creationContext.getQueryEngine() + queryEngine() ); - return new SqmBooleanExpressionPredicate( contains, negated, creationContext.getNodeBuilder() ); + return new SqmBooleanExpressionPredicate( contains, negated, nodeBuilder() ); } @Override @@ -2646,7 +2639,7 @@ public SqmExpression visitJsonValueFunction(HqlParser.JsonValueFunctionContex checkJsonFunctionsEnabled( ctx ); final SqmExpression jsonDocument = (SqmExpression) ctx.expression( 0 ).accept( this ); final SqmExpression jsonPath = (SqmExpression) ctx.expression( 1 ).accept( this ); - final HqlParser.JsonValueReturningClauseContext returningClause = ctx.jsonValueReturningClause(); + final var returningClause = ctx.jsonValueReturningClause(); final SqmCastTarget castTarget = returningClause == null ? null : (SqmCastTarget) returningClause.castTarget().accept( this ); @@ -2656,10 +2649,10 @@ public SqmExpression visitJsonValueFunction(HqlParser.JsonValueFunctionContex ? asList( jsonDocument, jsonPath ) : asList( jsonDocument, jsonPath, castTarget ), null, - creationContext.getQueryEngine() + queryEngine() ); visitJsonValueOnErrorOrEmptyClause( jsonValue, ctx.jsonValueOnErrorOrEmptyClause() ); - final HqlParser.JsonPassingClauseContext passingClause = ctx.jsonPassingClause(); + final var passingClause = ctx.jsonPassingClause(); if ( passingClause != null ) { final List expressionContexts = passingClause.expressionOrPredicate(); final List identifierContexts = passingClause.identifier(); @@ -2704,11 +2697,11 @@ public SqmExpression visitJsonQueryFunction(HqlParser.JsonQueryFunctionContex final SqmJsonQueryExpression jsonQuery = (SqmJsonQueryExpression) getFunctionDescriptor( "json_query" ).generateSqmExpression( asList( jsonDocument, jsonPath ), null, - creationContext.getQueryEngine() + queryEngine() ); visitJsonQueryWrapperClause( jsonQuery, ctx.jsonQueryWrapperClause() ); visitJsonQueryOnErrorOrEmptyClause( jsonQuery, ctx.jsonQueryOnErrorOrEmptyClause() ); - final HqlParser.JsonPassingClauseContext passingClause = ctx.jsonPassingClause(); + final var passingClause = ctx.jsonPassingClause(); if ( passingClause != null ) { final List expressionContexts = passingClause.expressionOrPredicate(); final List identifierContexts = passingClause.identifier(); @@ -2786,9 +2779,9 @@ public SqmExpression visitJsonExistsFunction(HqlParser.JsonExistsFunctionCont final SqmJsonExistsExpression jsonExists = (SqmJsonExistsExpression) getFunctionDescriptor( "json_exists" ).generateSqmExpression( asList( jsonDocument, jsonPath ), null, - creationContext.getQueryEngine() + queryEngine() ); - final HqlParser.JsonExistsOnErrorClauseContext subCtx = ctx.jsonExistsOnErrorClause(); + final var subCtx = ctx.jsonExistsOnErrorClause(); if ( subCtx != null ) { final TerminalNode firstToken = (TerminalNode) subCtx.getChild( 0 ); switch ( firstToken.getSymbol().getType() ) { @@ -2797,7 +2790,7 @@ public SqmExpression visitJsonExistsFunction(HqlParser.JsonExistsFunctionCont case HqlParser.FALSE -> jsonExists.falseOnError(); } } - final HqlParser.JsonPassingClauseContext passingClause = ctx.jsonPassingClause(); + final var passingClause = ctx.jsonPassingClause(); if ( passingClause != null ) { final List expressionContexts = passingClause.expressionOrPredicate(); final List identifierContexts = passingClause.identifier(); @@ -2814,7 +2807,7 @@ public SqmExpression visitJsonExistsFunction(HqlParser.JsonExistsFunctionCont @Override public SqmExpression visitJsonArrayFunction(HqlParser.JsonArrayFunctionContext ctx) { checkJsonFunctionsEnabled( ctx ); - final HqlParser.JsonNullClauseContext subCtx = ctx.jsonNullClause(); + final var subCtx = ctx.jsonNullClause(); final List argumentContexts = ctx.expressionOrPredicate(); int count = argumentContexts.size(); final List> arguments = new ArrayList<>( count + (subCtx == null ? 0 : 1 ) ); @@ -2832,20 +2825,20 @@ public SqmExpression visitJsonArrayFunction(HqlParser.JsonArrayFunctionContex return getFunctionDescriptor( "json_array" ).generateSqmExpression( arguments, null, - creationContext.getQueryEngine() + queryEngine() ); } @Override public SqmExpression visitJsonObjectFunction(HqlParser.JsonObjectFunctionContext ctx) { checkJsonFunctionsEnabled( ctx ); - final HqlParser.JsonObjectFunctionEntriesContext entries = ctx.jsonObjectFunctionEntries(); + final var entries = ctx.jsonObjectFunctionEntries(); final List> arguments; if ( entries == null ) { arguments = Collections.emptyList(); } else { - final HqlParser.JsonNullClauseContext subCtx = ctx.jsonNullClause(); + final var subCtx = ctx.jsonNullClause(); final List argumentContexts = entries.expressionOrPredicate(); int count = argumentContexts.size(); arguments = new ArrayList<>( count + ( subCtx == null ? 0 : 1 ) ); @@ -2864,14 +2857,14 @@ public SqmExpression visitJsonObjectFunction(HqlParser.JsonObjectFunctionCont return getFunctionDescriptor( "json_object" ).generateSqmExpression( arguments, null, - creationContext.getQueryEngine() + queryEngine() ); } @Override public Object visitJsonArrayAggFunction(HqlParser.JsonArrayAggFunctionContext ctx) { checkJsonFunctionsEnabled( ctx ); - final HqlParser.JsonNullClauseContext jsonNullClauseContext = ctx.jsonNullClause(); + final var jsonNullClauseContext = ctx.jsonNullClause(); final ArrayList> arguments = new ArrayList<>( jsonNullClauseContext == null ? 1 : 2 ); arguments.add( (SqmTypedNode) ctx.expressionOrPredicate().accept( this ) ); if ( jsonNullClauseContext != null ) { @@ -2889,15 +2882,15 @@ public Object visitJsonArrayAggFunction(HqlParser.JsonArrayAggFunctionContext ct ? null : visitOrderByClause( ctx.orderByClause(), false ), null, - creationContext.getQueryEngine() + queryEngine() ); } @Override public Object visitJsonObjectAggFunction(HqlParser.JsonObjectAggFunctionContext ctx) { checkJsonFunctionsEnabled( ctx ); - final HqlParser.JsonNullClauseContext jsonNullClauseContext = ctx.jsonNullClause(); - final HqlParser.JsonUniqueKeysClauseContext jsonUniqueKeysClauseContext = ctx.jsonUniqueKeysClause(); + final var jsonNullClauseContext = ctx.jsonNullClause(); + final var jsonUniqueKeysClauseContext = ctx.jsonUniqueKeysClause(); final ArrayList> arguments = new ArrayList<>( 4 ); for ( HqlParser.ExpressionOrPredicateContext subCtx : ctx.expressionOrPredicate() ) { arguments.add( (SqmTypedNode) subCtx.accept( this ) ); @@ -2922,7 +2915,7 @@ public Object visitJsonObjectAggFunction(HqlParser.JsonObjectAggFunctionContext arguments, getFilterExpression( ctx ), null, - creationContext.getQueryEngine() + queryEngine() ); } @@ -2933,14 +2926,14 @@ public Object visitJsonTableFunction(HqlParser.JsonTableFunctionContext ctx) { final SqmExpression jsonDocument = (SqmExpression) argumentsContexts.get( 0 ).accept( this ); final SqmJsonTableFunction jsonTable; if ( argumentsContexts.size() == 1 ) { - jsonTable = creationContext.getNodeBuilder().jsonTable( jsonDocument ); + jsonTable = nodeBuilder().jsonTable( jsonDocument ); } else { //noinspection unchecked final SqmExpression jsonPath = (SqmExpression) argumentsContexts.get( 1 ).accept( this ); - jsonTable = creationContext.getNodeBuilder().jsonTable( jsonDocument, jsonPath ); + jsonTable = nodeBuilder().jsonTable( jsonDocument, jsonPath ); } - final HqlParser.JsonPassingClauseContext passingClauseContext = ctx.jsonPassingClause(); + final var passingClauseContext = ctx.jsonPassingClause(); if ( passingClauseContext != null ) { final List expressionContexts = passingClauseContext.expressionOrPredicate(); final List identifierContexts = passingClauseContext.identifier(); @@ -2953,7 +2946,7 @@ public Object visitJsonTableFunction(HqlParser.JsonTableFunctionContext ctx) { } visitColumns( jsonTable, ctx.jsonTableColumnsClause().jsonTableColumns().jsonTableColumn() ); - final HqlParser.JsonTableErrorClauseContext errorClauseContext = ctx.jsonTableErrorClause(); + final var errorClauseContext = ctx.jsonTableErrorClause(); if ( errorClauseContext != null ) { if ( ( (TerminalNode) errorClauseContext.getChild( 0 ) ).getSymbol().getType() == HqlParser.ERROR ) { jsonTable.errorOnError(); @@ -2995,7 +2988,7 @@ else if ( columnContext instanceof HqlParser.JsonTableExistsColumnContext exists final JpaJsonExistsNode existsNode = jsonPath == null ? columnsNode.existsColumn( attributeName ) : columnsNode.existsColumn( attributeName, unquoteStringLiteral( jsonPath.getText() ) ); - final HqlParser.JsonExistsOnErrorClauseContext errorClauseContext = existsContext.jsonExistsOnErrorClause(); + final var errorClauseContext = existsContext.jsonExistsOnErrorClause(); if ( errorClauseContext != null ) { switch ( ( (TerminalNode) errorClauseContext.getChild( 0 ) ).getSymbol().getType() ) { case HqlParser.ERROR -> existsNode.errorOnError(); @@ -3005,7 +2998,7 @@ else if ( columnContext instanceof HqlParser.JsonTableExistsColumnContext exists } } else { - final HqlParser.JsonTableNestedColumnContext nestedColumnContext = (HqlParser.JsonTableNestedColumnContext) columnContext; + final var nestedColumnContext = (HqlParser.JsonTableNestedColumnContext) columnContext; visitColumns( columnsNode.nested( unquoteStringLiteral( nestedColumnContext.STRING_LITERAL().getText() ) ), nestedColumnContext.jsonTableColumnsClause().jsonTableColumns().jsonTableColumn() @@ -3028,8 +3021,8 @@ private void checkJsonFunctionsEnabled(ParserRuleContext ctx) { public SqmExpression visitXmlelementFunction(HqlParser.XmlelementFunctionContext ctx) { checkXmlFunctionsEnabled( ctx ); final String elementName = visitIdentifier( ctx.identifier() ); - final SqmXmlElementExpression xmlelement = creationContext.getNodeBuilder().xmlelement( elementName ); - final HqlParser.XmlattributesFunctionContext attributeCtx = ctx.xmlattributesFunction(); + final SqmXmlElementExpression xmlelement = nodeBuilder().xmlelement( elementName ); + final var attributeCtx = ctx.xmlattributesFunction(); if ( attributeCtx != null ) { final List expressions = attributeCtx.expressionOrPredicate(); final List attributeNames = attributeCtx.identifier(); @@ -3069,18 +3062,18 @@ public SqmExpression visitXmlforestFunction(HqlParser.XmlforestFunctionContex } } } - return creationContext.getNodeBuilder().xmlforest( elementExpressions ); + return nodeBuilder().xmlforest( elementExpressions ); } @Override public SqmExpression visitXmlpiFunction(HqlParser.XmlpiFunctionContext ctx) { checkXmlFunctionsEnabled( ctx ); final String name = visitIdentifier( ctx.identifier() ); - final HqlParser.ExpressionContext exprCtx = ctx.expression(); + final var exprCtx = ctx.expression(); //noinspection unchecked return exprCtx == null - ? creationContext.getNodeBuilder().xmlpi( name ) - : creationContext.getNodeBuilder().xmlpi( name, (Expression) exprCtx.accept( this ) ); + ? nodeBuilder().xmlpi( name ) + : nodeBuilder().xmlpi( name, (Expression) exprCtx.accept( this ) ); } @Override @@ -3088,7 +3081,7 @@ public SqmExpression visitXmlqueryFunction(HqlParser.XmlqueryFunctionContext checkXmlFunctionsEnabled( ctx ); final SqmExpression query = (SqmExpression) ctx.expression( 0 ).accept( this ); final SqmExpression xmlDocument = (SqmExpression) ctx.expression( 1 ).accept( this ); - return creationContext.getNodeBuilder().xmlquery( query, xmlDocument ); + return nodeBuilder().xmlquery( query, xmlDocument ); } @Override @@ -3096,7 +3089,7 @@ public SqmExpression visitXmlexistsFunction(HqlParser.XmlexistsFunctionContex checkXmlFunctionsEnabled( ctx ); final SqmExpression query = (SqmExpression) ctx.expression( 0 ).accept( this ); final SqmExpression xmlDocument = (SqmExpression) ctx.expression( 1 ).accept( this ); - return creationContext.getNodeBuilder().xmlexists( query, xmlDocument ); + return nodeBuilder().xmlexists( query, xmlDocument ); } @Override @@ -3114,7 +3107,7 @@ public SqmExpression visitXmlaggFunction(HqlParser.XmlaggFunctionContext ctx) ? null : visitOrderByClause( ctx.orderByClause(), false ), null, - creationContext.getQueryEngine() + queryEngine() ) ); } @@ -3126,7 +3119,7 @@ public Object visitXmltableFunction(HqlParser.XmltableFunctionContext ctx) { //noinspection unchecked final SqmExpression xpath = (SqmExpression) argumentsContexts.get( 0 ).accept( this ); final SqmExpression document = (SqmExpression) argumentsContexts.get( 1 ).accept( this ); - final SqmXmlTableFunction xmlTable = creationContext.getNodeBuilder().xmlTable( xpath, document); + final SqmXmlTableFunction xmlTable = nodeBuilder().xmlTable( xpath, document); visitColumns( xmlTable, ctx.xmltableColumnsClause().xmltableColumn() ); return xmlTable; } @@ -3138,7 +3131,7 @@ private void visitColumns(SqmXmlTableFunction xmlTable, List node = xmlTable.queryColumn( columnName, xpath ); - final HqlParser.XmltableDefaultClauseContext defaultClause = queryColumnContext.xmltableDefaultClause(); + final var defaultClause = queryColumnContext.xmltableDefaultClause(); if ( defaultClause != null ) { //noinspection unchecked node.defaultExpression( (Expression) defaultClause.expression().accept( this ) ); @@ -3151,14 +3144,14 @@ else if ( columnContext instanceof HqlParser.XmlTableValueColumnContext valueCol final TerminalNode pathNode = valueColumnContext.STRING_LITERAL(); final String xpath = pathNode == null ? null : unquoteStringLiteral( pathNode.getText() ); final JpaXmlTableColumnNode node = xmlTable.valueColumn( columnName, castTarget, xpath ); - final HqlParser.XmltableDefaultClauseContext defaultClause = valueColumnContext.xmltableDefaultClause(); + final var defaultClause = valueColumnContext.xmltableDefaultClause(); if ( defaultClause != null ) { //noinspection unchecked node.defaultExpression( (Expression) defaultClause.expression().accept( this ) ); } } else { - final HqlParser.XmlTableOrdinalityColumnContext ordinalityColumnContext + final var ordinalityColumnContext = (HqlParser.XmlTableOrdinalityColumnContext) columnContext; xmlTable.ordinalityColumn( visitIdentifier( ordinalityColumnContext.identifier() ) ); } @@ -3199,9 +3192,9 @@ public SqmPredicate visitIncludesPredicate(HqlParser.IncludesPredicateContext ct final SelfRenderingSqmFunction contains = getFunctionDescriptor( "array_includes" ).generateSqmExpression( asList( lhs, rhs ), null, - creationContext.getQueryEngine() + queryEngine() ); - return new SqmBooleanExpressionPredicate( contains, negated, creationContext.getNodeBuilder() ); + return new SqmBooleanExpressionPredicate( contains, negated, nodeBuilder() ); } @Override @@ -3220,9 +3213,9 @@ public SqmPredicate visitIntersectsPredicate(HqlParser.IntersectsPredicateContex final SelfRenderingSqmFunction contains = getFunctionDescriptor( "array_intersects" ).generateSqmExpression( asList( lhs, rhs ), null, - creationContext.getQueryEngine() + queryEngine() ); - return new SqmBooleanExpressionPredicate( contains, negated, creationContext.getNodeBuilder() ); + return new SqmBooleanExpressionPredicate( contains, negated, nodeBuilder() ); } @Override @@ -3235,7 +3228,7 @@ public SqmPredicate visitLikePredicate(HqlParser.LikePredicateContext ctx) { (SqmExpression) ctx.expression(1).accept( this ), negated, caseSensitive, - creationContext.getNodeBuilder() + nodeBuilder() ); } else { @@ -3245,15 +3238,15 @@ public SqmPredicate visitLikePredicate(HqlParser.LikePredicateContext ctx) { (SqmExpression) ctx.likeEscape().accept( this ), negated, caseSensitive, - creationContext.getNodeBuilder() + nodeBuilder() ); } } @Override public Object visitLikeEscape(HqlParser.LikeEscapeContext ctx) { - final HqlParser.ParameterContext parameter = ctx.parameter(); - final BasicType characterType = creationContext.getNodeBuilder().getCharacterType(); + final var parameter = ctx.parameter(); + final BasicType characterType = nodeBuilder().getCharacterType(); if ( parameter instanceof HqlParser.NamedParameterContext namedParameterContext ) { return visitNamedParameter( namedParameterContext, characterType ); } @@ -3269,7 +3262,7 @@ else if ( parameter instanceof HqlParser.PositionalParameterContext positionalPa query ); } - return new SqmLiteral<>( escape.charAt( 0 ), characterType, creationContext.getNodeBuilder() ); + return new SqmLiteral<>( escape.charAt( 0 ), characterType, nodeBuilder() ); } } @@ -3282,7 +3275,7 @@ public SqmPredicate visitMemberOfPredicate(HqlParser.MemberOfPredicateContext ct (SqmExpression) ctx.expression().accept( this ), pluralValuedSimplePath, negated, - creationContext.getNodeBuilder() + nodeBuilder() ); } else { @@ -3295,7 +3288,7 @@ public SqmPredicate visitMemberOfPredicate(HqlParser.MemberOfPredicateContext ct public SqmPredicate visitInPredicate(HqlParser.InPredicateContext ctx) { final boolean negated = ctx.getChildCount() == 4; final SqmExpression testExpression = (SqmExpression) ctx.expression().accept( this ); - final HqlParser.InListContext inListContext = ctx.inList(); + final var inListContext = ctx.inList(); if ( inListContext instanceof HqlParser.ExplicitTupleInListContext tupleExpressionListContext ) { final int size = tupleExpressionListContext.getChildCount(); final int estimatedSize = size >> 1; @@ -3331,7 +3324,7 @@ public SqmPredicate visitInPredicate(HqlParser.InPredicateContext ctx) { testExpression, listExpressions, negated, - creationContext.getNodeBuilder() + nodeBuilder() ); } finally { @@ -3345,7 +3338,7 @@ else if ( inListContext instanceof HqlParser.ParamInListContext tupleExpressionL testExpression, singletonList( tupleExpressionListContext.parameter().accept( this ) ), negated, - creationContext.getNodeBuilder() + nodeBuilder() ); } finally { @@ -3357,7 +3350,7 @@ else if ( inListContext instanceof HqlParser.SubqueryInListContext subQueryOrPar testExpression, visitSubquery( subQueryOrParamInListContext.subquery() ), negated, - creationContext.getNodeBuilder() + nodeBuilder() ); } else if ( inListContext instanceof HqlParser.PersistentCollectionReferenceInListContext collectionReferenceInListContext ) { @@ -3371,7 +3364,7 @@ else if ( inListContext instanceof HqlParser.PersistentCollectionReferenceInList (TerminalNode) collectionReferenceInListContext.collectionQuantifier().getChild(0).getChild(0) ), negated, - creationContext.getNodeBuilder() + nodeBuilder() ); } else if ( inListContext instanceof HqlParser.ArrayInListContext arrayInListContext ) { @@ -3394,9 +3387,9 @@ else if ( inListContext instanceof HqlParser.ArrayInListContext arrayInListConte final SelfRenderingSqmFunction contains = getFunctionDescriptor( "array_contains" ).generateSqmExpression( asList( arrayExpr, testExpression ), null, - creationContext.getQueryEngine() + queryEngine() ); - return new SqmBooleanExpressionPredicate( contains, negated, creationContext.getNodeBuilder() ); + return new SqmBooleanExpressionPredicate( contains, negated, nodeBuilder() ); } else { throw new ParsingException( "Unexpected IN predicate type [" + ctx.getClass().getSimpleName() + "] : " @@ -3407,13 +3400,13 @@ else if ( inListContext instanceof HqlParser.ArrayInListContext arrayInListConte @Override public SqmPredicate visitExistsCollectionPartPredicate(HqlParser.ExistsCollectionPartPredicateContext ctx) { final SqmSubQuery subQuery = createCollectionReferenceSubQuery( ctx.simplePath(), null ); - return new SqmExistsPredicate( subQuery, creationContext.getNodeBuilder() ); + return new SqmExistsPredicate( subQuery, nodeBuilder() ); } @Override public SqmPredicate visitExistsPredicate(HqlParser.ExistsPredicateContext ctx) { final SqmExpression expression = (SqmExpression) ctx.expression().accept( this ); - return new SqmExistsPredicate( expression, creationContext.getNodeBuilder() ); + return new SqmExistsPredicate( expression, nodeBuilder() ); } @Override @@ -3427,22 +3420,22 @@ public SqmPredicate visitBooleanExpressionPredicate(HqlParser.BooleanExpressionP } @SuppressWarnings("unchecked") final SqmExpression booleanExpression = (SqmExpression) expression; - return new SqmBooleanExpressionPredicate( booleanExpression, creationContext.getNodeBuilder() ); + return new SqmBooleanExpressionPredicate( booleanExpression, nodeBuilder() ); } @Override public Object visitEntityTypeExpression(HqlParser.EntityTypeExpressionContext ctx) { - final HqlParser.EntityTypeReferenceContext entityTypeReferenceContext = ctx.entityTypeReference(); + final var entityTypeReferenceContext = ctx.entityTypeReference(); // can be one of 2 forms: // 1) TYPE( some.path ) // 2) TYPE( :someParam ) - final HqlParser.ParameterContext parameter = entityTypeReferenceContext.parameter(); - final HqlParser.PathContext path = entityTypeReferenceContext.path(); + final var parameter = entityTypeReferenceContext.parameter(); + final var path = entityTypeReferenceContext.path(); if ( parameter != null ) { // we have form (2) return new SqmParameterizedEntityType<>( (SqmParameter) parameter.accept( this ), - creationContext.getNodeBuilder() + nodeBuilder() ); } else if ( path != null ) { @@ -3578,7 +3571,7 @@ public SqmFkExpression visitToOneFkReference(HqlParser.ToOneFkReferenceContex public SqmMapEntryReference visitMapEntrySelection(HqlParser.MapEntrySelectionContext ctx) { return new SqmMapEntryReference<>( consumePluralAttributeReference( ctx.path() ), - creationContext.getNodeBuilder() + nodeBuilder() ); } @@ -3597,7 +3590,7 @@ public SqmExpression visitConcatenationExpression(HqlParser.ConcatenationExpr return getFunctionDescriptor( "array_concat" ).generateSqmExpression( asList( lhs, rhs ), null, - creationContext.getQueryEngine() + queryEngine() ); } else { @@ -3605,7 +3598,7 @@ public SqmExpression visitConcatenationExpression(HqlParser.ConcatenationExpr return getFunctionDescriptor( "array_append" ).generateSqmExpression( asList( lhs, rhs ), null, - creationContext.getQueryEngine() + queryEngine() ); } } @@ -3615,7 +3608,7 @@ else if ( rhsExpressible != null && rhsExpressible.getSqmType() instanceof Basic return getFunctionDescriptor( "array_concat" ).generateSqmExpression( asList( lhs, rhs ), null, - creationContext.getQueryEngine() + queryEngine() ); } else { @@ -3623,7 +3616,7 @@ else if ( rhsExpressible != null && rhsExpressible.getSqmType() instanceof Basic return getFunctionDescriptor( "array_prepend" ).generateSqmExpression( asList( lhs, rhs ), null, - creationContext.getQueryEngine() + queryEngine() ); } } @@ -3631,7 +3624,7 @@ else if ( rhsExpressible != null && rhsExpressible.getSqmType() instanceof Basic return getFunctionDescriptor( "concat" ).generateSqmExpression( asList( lhs, rhs ), null, - creationContext.getQueryEngine() + queryEngine() ); } } @@ -3685,7 +3678,7 @@ public Object visitAdditionExpression(HqlParser.AdditionExpressionContext ctx) { operator, left, right, - creationContext.getNodeBuilder() + nodeBuilder() ); } @@ -3704,7 +3697,7 @@ public Object visitMultiplicationExpression(HqlParser.MultiplicationExpressionCo return getFunctionDescriptor("mod").generateSqmExpression( asList( left, right ), null, - creationContext.getQueryEngine() + queryEngine() ); } else { @@ -3712,7 +3705,7 @@ public Object visitMultiplicationExpression(HqlParser.MultiplicationExpressionCo operator, left, right, - creationContext.getNodeBuilder() + nodeBuilder() ); } } @@ -3723,7 +3716,7 @@ public Object visitToDurationExpression(HqlParser.ToDurationExpressionContext ct (SqmExpression) ctx.expression().accept( this ), toDurationUnit( (SqmExtractUnit) ctx.datetimeField().accept( this ) ), resolveExpressibleTypeBasic( Duration.class ), - creationContext.getNodeBuilder() + nodeBuilder() ); } @@ -3731,7 +3724,7 @@ private SqmDurationUnit toDurationUnit(SqmExtractUnit extractUnit) { return new SqmDurationUnit<>( extractUnit.getUnit(), resolveExpressibleTypeBasic( Long.class ), - creationContext.getNodeBuilder() + nodeBuilder() ); } @@ -3743,7 +3736,7 @@ public Object visitFromDurationExpression(HqlParser.FromDurationExpressionContex toDurationUnit( (SqmExtractUnit) ctx.datetimeField().accept( this ) ), expression, resolveExpressibleTypeBasic( Long.class ), - creationContext.getNodeBuilder() + nodeBuilder() ); } @@ -3774,14 +3767,14 @@ public Object visitCollateFunction(HqlParser.CollateFunctionContext ctx) { return getFunctionDescriptor("collate").generateSqmExpression( asList( expressionToCollate, castTargetExpression ), null, //why not string? - creationContext.getQueryEngine() + queryEngine() ); } @Override public Object visitCollation(HqlParser.CollationContext ctx) { final StringBuilder collation = new StringBuilder(); - final HqlParser.SimplePathContext simplePathContext = ctx.simplePath(); + final var simplePathContext = ctx.simplePath(); final boolean quoted = simplePathContext.getStart().getType() == QUOTED_IDENTIFIER; if ( quoted ) { collation.append("\""); @@ -3795,7 +3788,7 @@ public Object visitCollation(HqlParser.CollationContext ctx) { collation.append("\""); } return new SqmCollation( collation.toString(), null, - creationContext.getNodeBuilder() ); + nodeBuilder() ); } @Override @@ -3806,7 +3799,7 @@ public Object visitTupleExpression(HqlParser.TupleExpressionContext ctx) { ); } final List> expressions = visitExpressions( ctx ); - return new SqmTuple<>( expressions, creationContext.getNodeBuilder() ); + return new SqmTuple<>( expressions, nodeBuilder() ); } private List> visitExpressions(ParserRuleContext parentContext) { @@ -3832,11 +3825,11 @@ public Object visitCaseExpression(HqlParser.CaseExpressionContext ctx) { public SqmCaseSimple visitSimpleCaseList(HqlParser.SimpleCaseListContext ctx) { final int size = ctx.simpleCaseWhen().size(); final SqmExpression expression = (SqmExpression) ctx.expressionOrPredicate().accept(this); - final SqmCaseSimple caseExpression = new SqmCaseSimple<>( expression, size, creationContext.getNodeBuilder() ); + final SqmCaseSimple caseExpression = new SqmCaseSimple<>( expression, size, nodeBuilder() ); for ( int i = 0; i < size; i++ ) { - final HqlParser.SimpleCaseWhenContext simpleCaseWhenContext = ctx.simpleCaseWhen( i ); - final HqlParser.ExpressionContext testExpression = simpleCaseWhenContext.expression(); + final var simpleCaseWhenContext = ctx.simpleCaseWhen( i ); + final var testExpression = simpleCaseWhenContext.expression(); final SqmExpression test; final Set possibleEnumTypes; if ( ( possibleEnumTypes = getPossibleEnumTypes( testExpression ) ) != null ) { @@ -3855,7 +3848,7 @@ public Object visitCaseExpression(HqlParser.CaseExpressionContext ctx) { caseExpression.when( test, result ); } - final HqlParser.CaseOtherwiseContext caseOtherwiseContext = ctx.caseOtherwise(); + final var caseOtherwiseContext = ctx.caseOtherwise(); if ( caseOtherwiseContext != null ) { caseExpression.otherwise( (SqmExpression) caseOtherwiseContext.expressionOrPredicate().accept( this ) ); } @@ -3866,17 +3859,17 @@ public Object visitCaseExpression(HqlParser.CaseExpressionContext ctx) { @Override @SuppressWarnings({"rawtypes", "unchecked"}) public SqmCaseSearched visitSearchedCaseList(HqlParser.SearchedCaseListContext ctx) { final int size = ctx.searchedCaseWhen().size(); - final SqmCaseSearched caseExpression = new SqmCaseSearched<>( size, creationContext.getNodeBuilder() ); + final SqmCaseSearched caseExpression = new SqmCaseSearched<>( size, nodeBuilder() ); for ( int i = 0; i < size; i++ ) { - final HqlParser.SearchedCaseWhenContext searchedCaseWhenContext = ctx.searchedCaseWhen( i ); + final var searchedCaseWhenContext = ctx.searchedCaseWhen( i ); caseExpression.when( (SqmPredicate) searchedCaseWhenContext.predicate().accept( this ), (SqmExpression) searchedCaseWhenContext.expressionOrPredicate().accept( this ) ); } - final HqlParser.CaseOtherwiseContext caseOtherwiseContext = ctx.caseOtherwise(); + final var caseOtherwiseContext = ctx.caseOtherwise(); if ( caseOtherwiseContext != null ) { caseExpression.otherwise( (SqmExpression) caseOtherwiseContext.expressionOrPredicate().accept( this ) ); } @@ -3889,7 +3882,7 @@ public SqmExpression visitCurrentDateFunction(HqlParser.CurrentDateFunctionCo return getFunctionDescriptor("current_date") .generateSqmExpression( resolveExpressibleTypeBasic( Date.class ), - creationContext.getQueryEngine() + queryEngine() ); } @@ -3898,7 +3891,7 @@ public SqmExpression visitCurrentTimeFunction(HqlParser.CurrentTimeFunctionCo return getFunctionDescriptor("current_time") .generateSqmExpression( resolveExpressibleTypeBasic( Time.class ), - creationContext.getQueryEngine() + queryEngine() ); } @@ -3907,7 +3900,7 @@ public SqmExpression visitCurrentTimestampFunction(HqlParser.CurrentTimestamp return getFunctionDescriptor("current_timestamp") .generateSqmExpression( resolveExpressibleTypeBasic( Timestamp.class ), - creationContext.getQueryEngine() + queryEngine() ); } @@ -3916,7 +3909,7 @@ public SqmExpression visitInstantFunction(HqlParser.InstantFunctionContext ct return getFunctionDescriptor("instant") .generateSqmExpression( resolveExpressibleTypeBasic( Instant.class ), - creationContext.getQueryEngine() + queryEngine() ); } @@ -3925,7 +3918,7 @@ public SqmExpression visitLocalDateFunction(HqlParser.LocalDateFunctionContex return getFunctionDescriptor("local_date") .generateSqmExpression( resolveExpressibleTypeBasic( LocalDate.class ), - creationContext.getQueryEngine() + queryEngine() ); } @@ -3934,7 +3927,7 @@ public SqmExpression visitLocalTimeFunction(HqlParser.LocalTimeFunctionContex return getFunctionDescriptor("local_time") .generateSqmExpression( resolveExpressibleTypeBasic( LocalTime.class ), - creationContext.getQueryEngine() + queryEngine() ); } @@ -3943,7 +3936,7 @@ public SqmExpression visitLocalDateTimeFunction(HqlParser.LocalDateTimeFuncti return getFunctionDescriptor("local_datetime") .generateSqmExpression( resolveExpressibleTypeBasic( LocalDateTime.class ), - creationContext.getQueryEngine() + queryEngine() ); } @@ -3952,7 +3945,7 @@ public SqmExpression visitOffsetDateTimeFunction(HqlParser.OffsetDateTimeFunc return getFunctionDescriptor("offset_datetime") .generateSqmExpression( resolveExpressibleTypeBasic( OffsetDateTime.class ), - creationContext.getQueryEngine() + queryEngine() ); } @@ -4012,7 +4005,7 @@ public Object visitArrayLiteral(HqlParser.ArrayLiteralContext ctx) { return getFunctionDescriptor( "array" ).generateSqmExpression( arguments, null, - creationContext.getQueryEngine() + queryEngine() ); } @@ -4038,7 +4031,7 @@ public SqmExpression visitTerminal(TerminalNode node) { case HqlParser.BIG_DECIMAL_LITERAL -> bigDecimalLiteral( node.getText() ); case HqlParser.FALSE -> booleanLiteral( false ); case HqlParser.TRUE -> booleanLiteral( true ); - case HqlParser.NULL -> new SqmLiteralNull<>( creationContext.getNodeBuilder() ); + case HqlParser.NULL -> new SqmLiteralNull<>( nodeBuilder() ); case HqlParser.BINARY_LITERAL -> binaryLiteral( node.getText() ); default -> throw new ParsingException( "Unexpected terminal node [" + node.getText() + "]" ); }; @@ -4084,7 +4077,7 @@ public Object visitTimeLiteral(HqlParser.TimeLiteralContext ctx) { @Override public Object visitJdbcTimestampLiteral(HqlParser.JdbcTimestampLiteralContext ctx) { - final HqlParser.DateTimeContext dateTime = ctx.dateTime(); + final var dateTime = ctx.dateTime(); if ( dateTime != null ) { return dateTime.accept( this ); } @@ -4095,7 +4088,7 @@ public Object visitJdbcTimestampLiteral(HqlParser.JdbcTimestampLiteralContext ct @Override public Object visitJdbcDateLiteral(HqlParser.JdbcDateLiteralContext ctx) { - final HqlParser.DateContext date = ctx.date(); + final var date = ctx.date(); if ( date != null ) { return date.accept( this ); } @@ -4106,7 +4099,7 @@ public Object visitJdbcDateLiteral(HqlParser.JdbcDateLiteralContext ctx) { @Override public Object visitJdbcTimeLiteral(HqlParser.JdbcTimeLiteralContext ctx) { - final HqlParser.TimeContext time = ctx.time(); + final var time = ctx.time(); if ( time != null ) { return time.accept( this ); } @@ -4146,7 +4139,7 @@ private SqmLiteral localDateTimeLiteralFrom( return new SqmLiteral<>( LocalDateTime.of( localDate( date ), localTime( time ) ), resolveExpressibleTypeBasic( LocalDateTime.class ), - creationContext.getNodeBuilder() + nodeBuilder() ); } @@ -4157,7 +4150,7 @@ private SqmLiteral zonedDateTimeLiteralFrom( return new SqmLiteral<>( ZonedDateTime.of( localDate( date ), localTime( time ), visitZoneId( timezone ) ), resolveExpressibleTypeBasic( ZonedDateTime.class ), - creationContext.getNodeBuilder() + nodeBuilder() ); } @@ -4187,7 +4180,7 @@ private SqmLiteral offsetDatetimeLiteralFrom( return new SqmLiteral<>( OffsetDateTime.of( localDate( date ), localTime( time ), zoneOffset( offset ) ), resolveExpressibleTypeBasic( OffsetDateTime.class ), - creationContext.getNodeBuilder() + nodeBuilder() ); } @@ -4198,7 +4191,7 @@ private SqmLiteral offsetDatetimeLiteralFrom( return new SqmLiteral<>( OffsetDateTime.of( localDate( date ), localTime( time ), zoneOffset( offset ) ), resolveExpressibleTypeBasic( OffsetDateTime.class ), - creationContext.getNodeBuilder() + nodeBuilder() ); } @@ -4207,7 +4200,7 @@ public Object visitDate(HqlParser.DateContext ctx) { return new SqmLiteral<>( localDate( ctx ), resolveExpressibleTypeBasic( LocalDate.class ), - creationContext.getNodeBuilder() + nodeBuilder() ); } @@ -4216,14 +4209,14 @@ public Object visitTime(HqlParser.TimeContext ctx) { return new SqmLiteral<>( localTime( ctx ), resolveExpressibleTypeBasic( LocalTime.class ), - creationContext.getNodeBuilder() + nodeBuilder() ); } private static LocalTime localTime(HqlParser.TimeContext ctx) { final int hour = Integer.parseInt( ctx.hour().getText() ); final int minute = Integer.parseInt( ctx.minute().getText() ); - final HqlParser.SecondContext secondContext = ctx.second(); + final var secondContext = ctx.second(); if ( secondContext != null ) { final String secondText = secondContext.getText(); final int index = secondText.indexOf( '.' ); @@ -4281,15 +4274,19 @@ private static ZoneOffset zoneOffset(HqlParser.OffsetWithMinutesContext offset) ); } + private static CharSequence stripQuotes(String literalText) { + return literalText.subSequence( 1, literalText.length() - 1 ); + } + private SqmLiteral sqlTimestampLiteralFrom(String literalText) { - final TemporalAccessor parsed = DATE_TIME.parse( literalText.subSequence( 1, literalText.length() - 1 ) ); + final TemporalAccessor parsed = DATE_TIME.parse( stripQuotes( literalText ) ); try { final ZonedDateTime zonedDateTime = ZonedDateTime.from( parsed ); final Calendar literal = GregorianCalendar.from( zonedDateTime ); return new SqmLiteral<>( literal, resolveExpressibleTypeBasic( Calendar.class ), - creationContext.getNodeBuilder() + nodeBuilder() ); } catch (DateTimeException dte) { @@ -4298,28 +4295,28 @@ private SqmLiteral sqlTimestampLiteralFrom(String literalText) { return new SqmLiteral<>( literal, resolveExpressibleTypeBasic( Timestamp.class ), - creationContext.getNodeBuilder() + nodeBuilder() ); } } private SqmLiteral sqlDateLiteralFrom(String literalText) { - final LocalDate localDate = LocalDate.from( ISO_LOCAL_DATE.parse( literalText.subSequence( 1, literalText.length() - 1 ) ) ); + final LocalDate localDate = LocalDate.from( ISO_LOCAL_DATE.parse( stripQuotes( literalText ) ) ); final Date literal = Date.valueOf( localDate ); return new SqmLiteral<>( literal, resolveExpressibleTypeBasic( Date.class ), - creationContext.getNodeBuilder() + nodeBuilder() ); } private SqmLiteral