Skip to content

Commit 22af945

Browse files
committed
HHH-19240 Refactor IS predicate to single UnaryIsPredicate rule
(cherry picked from commit adcb5db)
1 parent be80704 commit 22af945

File tree

2 files changed

+21
-45
lines changed

2 files changed

+21
-45
lines changed

hibernate-core/src/main/antlr/org/hibernate/grammars/hql/HqlParser.g4

Lines changed: 1 addition & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -657,10 +657,7 @@ whereClause
657657
predicate
658658
//highest to lowest precedence
659659
: LEFT_PAREN predicate RIGHT_PAREN # GroupedPredicate
660-
| expression IS NOT? NULL # IsNullPredicate
661-
| expression IS NOT? EMPTY # IsEmptyPredicate
662-
| expression IS NOT? TRUE # IsTruePredicate
663-
| expression IS NOT? FALSE # IsFalsePredicate
660+
| expression IS NOT? (NULL|EMPTY|TRUE|FALSE) # UnaryIsPredicate
664661
| expression IS NOT? DISTINCT FROM expression # IsDistinctFromPredicate
665662
| expression NOT? MEMBER OF? path # MemberOfPredicate
666663
| expression NOT? IN inList # InPredicate

hibernate-core/src/main/java/org/hibernate/query/hql/internal/SemanticQueryBuilder.java

Lines changed: 20 additions & 41 deletions
Original file line numberDiff line numberDiff line change
@@ -2453,51 +2453,30 @@ public SqmBetweenPredicate visitBetweenPredicate(HqlParser.BetweenPredicateConte
24532453
);
24542454
}
24552455

2456-
24572456
@Override
2458-
public SqmNullnessPredicate visitIsNullPredicate(HqlParser.IsNullPredicateContext ctx) {
2459-
return new SqmNullnessPredicate(
2460-
(SqmExpression<?>) ctx.expression().accept( this ),
2461-
ctx.NOT() != null,
2462-
creationContext.getNodeBuilder()
2463-
);
2464-
}
2465-
2466-
@Override
2467-
public SqmEmptinessPredicate visitIsEmptyPredicate(HqlParser.IsEmptyPredicateContext ctx) {
2468-
SqmExpression<?> expression = (SqmExpression<?>) ctx.expression().accept(this);
2469-
if ( expression instanceof SqmPluralValuedSimplePath ) {
2470-
return new SqmEmptinessPredicate(
2471-
(SqmPluralValuedSimplePath<?>) expression,
2472-
ctx.NOT() != null,
2473-
creationContext.getNodeBuilder()
2474-
);
2475-
}
2476-
else {
2477-
throw new SemanticException( "Operand of 'is empty' operator must be a plural path", query );
2457+
public SqmPredicate visitUnaryIsPredicate(HqlParser.UnaryIsPredicateContext ctx) {
2458+
final var expression = (SqmExpression<?>) ctx.expression().accept( this );
2459+
final var negated = ctx.NOT() != null;
2460+
final var nodeBuilder = creationContext.getNodeBuilder();
2461+
switch ( ((TerminalNode) ctx.getChild( ctx.getChildCount() - 1 )).getSymbol().getType() ) {
2462+
case HqlParser.NULL:
2463+
return new SqmNullnessPredicate( expression, negated, nodeBuilder );
2464+
case HqlParser.EMPTY:
2465+
if ( expression instanceof SqmPluralValuedSimplePath<?> ) {
2466+
return new SqmEmptinessPredicate( (SqmPluralValuedSimplePath<?>) expression, negated, nodeBuilder );
2467+
}
2468+
else {
2469+
throw new SemanticException( "Operand of 'is empty' operator must be a plural path", query );
2470+
}
2471+
case HqlParser.TRUE:
2472+
return new SqmTruthnessPredicate( expression, true, negated, nodeBuilder );
2473+
case HqlParser.FALSE:
2474+
return new SqmTruthnessPredicate( expression, false, negated, nodeBuilder );
2475+
default:
2476+
throw new AssertionError( "Unknown unary is predicate: " + ctx.getChild( ctx.getChildCount() - 1 ) );
24782477
}
24792478
}
24802479

2481-
@Override
2482-
public Object visitIsTruePredicate(HqlParser.IsTruePredicateContext ctx) {
2483-
return new SqmTruthnessPredicate(
2484-
(SqmExpression<?>) ctx.expression().accept( this ),
2485-
true,
2486-
ctx.NOT() != null,
2487-
creationContext.getNodeBuilder()
2488-
);
2489-
}
2490-
2491-
@Override
2492-
public Object visitIsFalsePredicate(HqlParser.IsFalsePredicateContext ctx) {
2493-
return new SqmTruthnessPredicate(
2494-
(SqmExpression<?>) ctx.expression().accept( this ),
2495-
false,
2496-
ctx.NOT() != null,
2497-
creationContext.getNodeBuilder()
2498-
);
2499-
}
2500-
25012480
@Override
25022481
public Object visitComparisonOperator(HqlParser.ComparisonOperatorContext ctx) {
25032482
final TerminalNode firstToken = (TerminalNode) ctx.getChild( 0 );

0 commit comments

Comments
 (0)