Skip to content

Commit cd39715

Browse files
committed
HHH-18979 prototype for Restrictions
Make Range a user-visible abstraction (so that it can be the parameter type of a repository method)
1 parent f327d94 commit cd39715

File tree

14 files changed

+363
-259
lines changed

14 files changed

+363
-259
lines changed
Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,29 @@
1+
/*
2+
* SPDX-License-Identifier: LGPL-2.1-or-later
3+
* Copyright Red Hat Inc. and Hibernate Authors
4+
*/
5+
package org.hibernate.query;
6+
7+
import jakarta.persistence.criteria.CriteriaBuilder;
8+
import jakarta.persistence.criteria.Predicate;
9+
import jakarta.persistence.criteria.Root;
10+
import jakarta.persistence.metamodel.SingularAttribute;
11+
import org.hibernate.query.range.Range;
12+
13+
/**
14+
* Restricts an attribute of an entity to a given {@link Range}.
15+
*
16+
* @param <X> The entity type
17+
* @param <U> The attribute type
18+
*/
19+
record AttributeRange<X, U>(SingularAttribute<X, U> attribute, Range<U> range) implements Restriction<X> {
20+
@Override
21+
public Restriction<X> negated() {
22+
return new Negation<>( this );
23+
}
24+
25+
@Override
26+
public Predicate toPredicate(Root<? extends X> root, CriteriaBuilder builder) {
27+
return range.toPredicate( root, attribute, builder );
28+
}
29+
}
Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,30 @@
1+
/*
2+
* SPDX-License-Identifier: LGPL-2.1-or-later
3+
* Copyright Red Hat Inc. and Hibernate Authors
4+
*/
5+
package org.hibernate.query;
6+
7+
import jakarta.persistence.criteria.CriteriaBuilder;
8+
import jakarta.persistence.criteria.Predicate;
9+
import jakarta.persistence.criteria.Root;
10+
11+
/**
12+
* A compound restriction constructed using logical AND.
13+
*
14+
* @param restrictions The restrictions to be AND-ed
15+
* @param <X> The entity type
16+
*/
17+
record Conjunction<X>(java.util.List<? extends Restriction<? super X>> restrictions)
18+
implements Restriction<X> {
19+
@Override
20+
public Restriction<X> negated() {
21+
return new Disjunction<>( restrictions.stream().map( Restriction::negated ).toList() );
22+
}
23+
24+
@Override
25+
public Predicate toPredicate(Root<? extends X> root, CriteriaBuilder builder) {
26+
return builder.and( restrictions.stream()
27+
.map( restriction -> restriction.toPredicate( root, builder ) )
28+
.toList() );
29+
}
30+
}
Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,30 @@
1+
/*
2+
* SPDX-License-Identifier: LGPL-2.1-or-later
3+
* Copyright Red Hat Inc. and Hibernate Authors
4+
*/
5+
package org.hibernate.query;
6+
7+
import jakarta.persistence.criteria.CriteriaBuilder;
8+
import jakarta.persistence.criteria.Predicate;
9+
import jakarta.persistence.criteria.Root;
10+
11+
/**
12+
* A compound restriction constructed using logical OR.
13+
*
14+
* @param restrictions The restrictions to be OR-ed
15+
* @param <X> The entity type
16+
*/
17+
record Disjunction<X>(java.util.List<? extends Restriction<? super X>> restrictions)
18+
implements Restriction<X> {
19+
@Override
20+
public Restriction<X> negated() {
21+
return new Conjunction<>( restrictions.stream().map( Restriction::negated ).toList() );
22+
}
23+
24+
@Override
25+
public Predicate toPredicate(Root<? extends X> root, CriteriaBuilder builder) {
26+
return builder.or( restrictions.stream()
27+
.map( restriction -> restriction.toPredicate( root, builder ) )
28+
.toList() );
29+
}
30+
}

hibernate-core/src/main/java/org/hibernate/query/Domain.java

Lines changed: 0 additions & 233 deletions
This file was deleted.
Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,27 @@
1+
/*
2+
* SPDX-License-Identifier: LGPL-2.1-or-later
3+
* Copyright Red Hat Inc. and Hibernate Authors
4+
*/
5+
package org.hibernate.query;
6+
7+
import jakarta.persistence.criteria.CriteriaBuilder;
8+
import jakarta.persistence.criteria.Predicate;
9+
import jakarta.persistence.criteria.Root;
10+
11+
/**
12+
* Negates a restriction; a logical NOT.
13+
*
14+
* @param restriction The restriction to be negated
15+
* @param <X> The entity type
16+
*/
17+
record Negation<X>(Restriction<X> restriction) implements Restriction<X> {
18+
@Override
19+
public Restriction<X> negated() {
20+
return restriction;
21+
}
22+
23+
@Override
24+
public Predicate toPredicate(Root<? extends X> root, CriteriaBuilder builder) {
25+
return builder.not( restriction.toPredicate( root, builder ) );
26+
}
27+
}

0 commit comments

Comments
 (0)