Skip to content

Commit 9cff6e2

Browse files
committed
Revert "Use Blaze Persistence for criteria queries."
This reverts commit ab36adb. Change-Id: I335ec7d02bd0d53655ca4b07bed9ee4a0c01ce04
1 parent 5885dad commit 9cff6e2

File tree

3 files changed

+66
-104
lines changed

3 files changed

+66
-104
lines changed

pom.xml

Lines changed: 1 addition & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -29,7 +29,6 @@
2929
<spotless-plugin.version>2.43.0</spotless-plugin.version>
3030

3131
<basic-annotations.version>0.2.0</basic-annotations.version>
32-
<blaze-persistence.version>1.6.12</blaze-persistence.version>
3332
<findbugs-jsr305.version>3.0.2</findbugs-jsr305.version>
3433
<flexmark.version>0.64.8</flexmark.version>
3534
<google.java.format.version>1.15.0</google.java.format.version>
@@ -55,14 +54,6 @@
5554
<scope>import</scope>
5655
</dependency>
5756

58-
<dependency>
59-
<groupId>com.blazebit</groupId>
60-
<artifactId>blaze-persistence-bom</artifactId>
61-
<version>${blaze-persistence.version}</version>
62-
<type>pom</type>
63-
<scope>import</scope>
64-
</dependency>
65-
6657
<!-- Hibernate PostgreSQL Extra Types -->
6758
<dependency>
6859
<groupId>io.hypersistence</groupId>
@@ -202,21 +193,8 @@
202193
<artifactId>quarkus-container-image-jib</artifactId>
203194
</dependency>
204195

196+
205197
<!-- Quarkus universe -->
206-
<dependency>
207-
<groupId>com.blazebit</groupId>
208-
<artifactId>blaze-persistence-integration-quarkus-3</artifactId>
209-
</dependency>
210-
<dependency>
211-
<groupId>com.blazebit</groupId>
212-
<artifactId>blaze-persistence-integration-hibernate-6.2</artifactId>
213-
<scope>runtime</scope>
214-
</dependency>
215-
<dependency>
216-
<groupId>com.blazebit</groupId>
217-
<artifactId>blaze-persistence-entity-view-processor</artifactId>
218-
<scope>provided</scope>
219-
</dependency>
220198
<dependency>
221199
<groupId>org.apache.camel.quarkus</groupId>
222200
<artifactId>camel-quarkus-mail</artifactId>

src/main/java/eu/mulk/mulkcms2/benki/posts/Post.java

Lines changed: 60 additions & 57 deletions
Original file line numberDiff line numberDiff line change
@@ -2,22 +2,18 @@
22

33
import static java.util.stream.Collectors.toList;
44

5-
import com.blazebit.persistence.CriteriaBuilder;
6-
import com.blazebit.persistence.CriteriaBuilderFactory;
75
import eu.mulk.mulkcms2.benki.accesscontrol.Role;
86
import eu.mulk.mulkcms2.benki.bookmarks.Bookmark;
97
import eu.mulk.mulkcms2.benki.lazychat.LazychatMessage;
108
import eu.mulk.mulkcms2.benki.newsletter.Newsletter;
119
import eu.mulk.mulkcms2.benki.users.User;
12-
import org.hibernate.annotations.JdbcTypeCode;
13-
import org.hibernate.type.SqlTypes;
10+
import eu.mulk.mulkcms2.benki.users.User_;
1411
import io.quarkus.hibernate.orm.panache.PanacheEntityBase;
1512
import jakarta.annotation.Nullable;
1613
import jakarta.json.bind.annotation.JsonbTransient;
1714
import jakarta.persistence.CascadeType;
1815
import jakarta.persistence.Column;
1916
import jakarta.persistence.Entity;
20-
import jakarta.persistence.EntityManager;
2117
import jakarta.persistence.EnumType;
2218
import jakarta.persistence.Enumerated;
2319
import jakarta.persistence.FetchType;
@@ -35,6 +31,11 @@
3531
import jakarta.persistence.OrderBy;
3632
import jakarta.persistence.SequenceGenerator;
3733
import jakarta.persistence.Table;
34+
import jakarta.persistence.criteria.CriteriaBuilder;
35+
import jakarta.persistence.criteria.CriteriaQuery;
36+
import jakarta.persistence.criteria.From;
37+
import jakarta.persistence.criteria.JoinType;
38+
import jakarta.persistence.criteria.Predicate;
3839
import java.time.LocalDate;
3940
import java.time.OffsetDateTime;
4041
import java.util.ArrayList;
@@ -48,9 +49,12 @@
4849
import java.util.TimeZone;
4950
import java.util.regex.Pattern;
5051
import java.util.stream.Collectors;
52+
import java.util.stream.Stream;
5153
import javax.annotation.CheckForNull;
52-
import org.hibernate.annotations.Type;
54+
import org.hibernate.Session;
55+
import org.hibernate.annotations.JdbcTypeCode;
5356
import org.hibernate.annotations.SQLRestriction;
57+
import org.hibernate.type.SqlTypes;
5458

5559
@Entity
5660
@Table(name = "posts", schema = "benki")
@@ -171,76 +175,80 @@ public Visibility getVisibility() {
171175
}
172176
}
173177

174-
protected static <T extends Post<?>> CriteriaBuilder<T> queryViewable(
178+
protected static <T extends Post> CriteriaQuery<T> queryViewable(
175179
Class<T> entityClass,
176180
@CheckForNull User reader,
177181
@CheckForNull User owner,
178182
@CheckForNull Integer cursor,
179-
EntityManager em,
180-
CriteriaBuilderFactory cbf,
183+
CriteriaBuilder cb,
181184
boolean forward,
182185
@CheckForNull String searchQuery) {
186+
CriteriaQuery<T> query = cb.createQuery(entityClass);
183187

184-
CriteriaBuilder<T> cb = cbf.create(em, entityClass).select("post");
188+
var conditions = new ArrayList<Predicate>();
185189

190+
From<?, T> post;
186191
if (reader == null) {
187-
cb =
188-
cb.from(entityClass, "post")
189-
.innerJoin("post.targets", "role")
190-
.where("'world'")
191-
.isMemberOf("role.tags");
192+
post = query.from(entityClass);
193+
var target = post.join(Post_.targets);
194+
conditions.add(cb.equal(target, Role.getWorld()));
192195
} else {
193-
cb = cb.from(User.class, "user").where("user").eq(reader);
196+
var root = query.from(User.class);
197+
conditions.add(cb.equal(root, reader));
194198
if (entityClass.isAssignableFrom(Post.class)) {
195-
cb = cb.innerJoin("user.visiblePosts", "post");
199+
post = (From<?, T>) root.join(User_.visiblePosts);
196200
} else if (entityClass.isAssignableFrom(Bookmark.class)) {
197-
cb = cb.innerJoin("user.visibleBookmarks", "post");
201+
post = (From<?, T>) root.join(User_.visibleBookmarks);
198202
} else if (entityClass.isAssignableFrom(LazychatMessage.class)) {
199-
cb = cb.innerJoin("user.visibleLazychatMessages", "post");
203+
post = (From<?, T>) root.join(User_.visibleLazychatMessages);
200204
} else {
201205
throw new IllegalArgumentException();
202206
}
203207
}
204208

205-
cb = cb.fetch("post.owner");
209+
query.select(post);
210+
post.fetch(Post_.owner, JoinType.LEFT);
206211

207212
if (owner != null) {
208-
cb = cb.where("post.owner").eq(owner);
213+
conditions.add(cb.equal(post.get(Post_.owner), owner));
209214
}
210215

211216
if (forward) {
212-
cb = cb.orderByDesc("post.id");
217+
query.orderBy(cb.desc(post.get(Post_.id)));
213218
} else {
214-
cb = cb.orderByAsc("post.id");
219+
query.orderBy(cb.asc(post.get(Post_.id)));
215220
}
216221

217222
if (cursor != null) {
218223
if (forward) {
219-
cb = cb.where("post.id").le(cursor);
224+
conditions.add(cb.le(post.get(Post_.id), cursor));
220225
} else {
221-
cb = cb.where("post.id").gt(cursor);
226+
conditions.add(cb.gt(post.get(Post_.id), cursor));
222227
}
223228
}
224229

225230
if (searchQuery != null && !searchQuery.isBlank()) {
226-
cb =
227-
cb.whereExists()
228-
.from(PostText.class, "postText")
229-
.where("postText.post")
230-
.eqExpression("post")
231-
.whereOr()
232-
.whereExpression(
233-
"post_matches_websearch(postText.searchTerms, 'de', :searchQueryText) = true")
234-
.whereExpression(
235-
"post_matches_websearch(postText.searchTerms, 'en', :searchQueryText) = true")
236-
.endOr()
237-
.end()
238-
.setParameter("searchQueryText", searchQuery);
231+
var postTexts = post.join(Post_.texts);
232+
var localizedSearches =
233+
Stream.of("de", "en")
234+
.map(
235+
language ->
236+
cb.isTrue(
237+
cb.function(
238+
"post_matches_websearch",
239+
Boolean.class,
240+
postTexts.get(PostText_.searchTerms),
241+
cb.literal(language),
242+
cb.literal(searchQuery))))
243+
.toArray(n -> new Predicate[n]);
244+
conditions.add(cb.or(localizedSearches));
239245
}
240246

241-
cb = cb.where("post.scope").eq(Scope.top_level);
247+
conditions.add(cb.equal(post.get(Post_.scope), Scope.top_level));
242248

243-
return cb;
249+
query.where(conditions.toArray(new Predicate[0]));
250+
251+
return query;
244252
}
245253

246254
public final boolean isVisibleTo(@Nullable User user) {
@@ -312,18 +320,13 @@ public List<Day<T>> days() {
312320
}
313321

314322
public static PostPage<Post<? extends PostText<?>>> findViewable(
315-
PostFilter postFilter,
316-
EntityManager em,
317-
CriteriaBuilderFactory cbf,
318-
@CheckForNull User viewer,
319-
@CheckForNull User owner) {
320-
return findViewable(postFilter, em, cbf, viewer, owner, null, null, null);
323+
PostFilter postFilter, Session session, @CheckForNull User viewer, @CheckForNull User owner) {
324+
return findViewable(postFilter, session, viewer, owner, null, null, null);
321325
}
322326

323327
public static PostPage<Post<? extends PostText<?>>> findViewable(
324328
PostFilter postFilter,
325-
EntityManager em,
326-
CriteriaBuilderFactory cbf,
329+
Session session,
327330
@CheckForNull User viewer,
328331
@CheckForNull User owner,
329332
@CheckForNull Integer cursor,
@@ -340,13 +343,12 @@ public static PostPage<Post<? extends PostText<?>>> findViewable(
340343
default:
341344
entityClass = Post.class;
342345
}
343-
return findViewable(entityClass, em, cbf, viewer, owner, cursor, count, searchQuery);
346+
return findViewable(entityClass, session, viewer, owner, cursor, count, searchQuery);
344347
}
345348

346349
protected static <T extends Post<? extends PostText<?>>> PostPage<T> findViewable(
347350
Class<? extends T> entityClass,
348-
EntityManager em,
349-
CriteriaBuilderFactory cbf,
351+
Session session,
350352
@CheckForNull User viewer,
351353
@CheckForNull User owner,
352354
@CheckForNull Integer cursor,
@@ -357,9 +359,10 @@ protected static <T extends Post<? extends PostText<?>>> PostPage<T> findViewabl
357359
Objects.requireNonNull(count);
358360
}
359361

360-
var forwardCriteria =
361-
queryViewable(entityClass, viewer, owner, cursor, em, cbf, true, searchQuery);
362-
var forwardQuery = forwardCriteria.getQuery();
362+
var cb = session.getCriteriaBuilder();
363+
364+
var forwardCriteria = queryViewable(entityClass, viewer, owner, cursor, cb, true, searchQuery);
365+
var forwardQuery = session.createQuery(forwardCriteria);
363366

364367
if (count != null) {
365368
forwardQuery.setMaxResults(count + 1);
@@ -371,16 +374,16 @@ protected static <T extends Post<? extends PostText<?>>> PostPage<T> findViewabl
371374
if (cursor != null) {
372375
// Look backwards as well so we can find the prevCursor.
373376
var backwardCriteria =
374-
queryViewable(entityClass, viewer, owner, cursor, em, cbf, false, searchQuery);
375-
var backwardQuery = backwardCriteria.getQuery();
377+
queryViewable(entityClass, viewer, owner, cursor, cb, false, searchQuery);
378+
var backwardQuery = session.createQuery(backwardCriteria);
376379
backwardQuery.setMaxResults(count);
377380
var backwardResults = backwardQuery.getResultList();
378381
if (!backwardResults.isEmpty()) {
379382
prevCursor = backwardResults.get(backwardResults.size() - 1).id;
380383
}
381384
}
382385

383-
var forwardResults = new ArrayList<T>(forwardQuery.getResultList());
386+
var forwardResults = (List<T>) forwardQuery.getResultList();
384387
if (count != null) {
385388
if (forwardResults.size() == count + 1) {
386389
nextCursor = forwardResults.get(count).id;

src/main/java/eu/mulk/mulkcms2/benki/posts/PostResource.java

Lines changed: 5 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,6 @@
66
import static jakarta.ws.rs.core.MediaType.TEXT_PLAIN;
77
import static java.nio.charset.StandardCharsets.UTF_8;
88

9-
import com.blazebit.persistence.CriteriaBuilderFactory;
109
import com.rometools.rome.feed.atom.Content;
1110
import com.rometools.rome.feed.atom.Entry;
1211
import com.rometools.rome.feed.atom.Feed;
@@ -121,8 +120,6 @@ public static native MailTemplateInstance commentNotificationMail(
121120

122121
@PersistenceContext protected EntityManager entityManager;
123122

124-
@Inject protected CriteriaBuilderFactory criteriaBuilderFactory;
125-
126123
private final SecureRandom secureRandom;
127124

128125
private final PostFilter postFilter;
@@ -145,16 +142,8 @@ public TemplateInstance getIndex(
145142
maxResults = maxResults == null ? defaultMaxResults : maxResults;
146143

147144
@CheckForNull var reader = getCurrentUser();
148-
var q =
149-
Post.findViewable(
150-
postFilter,
151-
entityManager,
152-
criteriaBuilderFactory,
153-
reader,
154-
null,
155-
cursor,
156-
maxResults,
157-
searchQuery);
145+
var session = entityManager.unwrap(Session.class);
146+
var q = Post.findViewable(postFilter, session, reader, null, cursor, maxResults, searchQuery);
158147

159148
q.cacheDescriptions();
160149

@@ -192,16 +181,8 @@ public TemplateInstance getUserIndex(
192181

193182
@CheckForNull var reader = getCurrentUser();
194183
var owner = User.findByNickname(ownerName);
195-
var q =
196-
Post.findViewable(
197-
postFilter,
198-
entityManager,
199-
criteriaBuilderFactory,
200-
reader,
201-
owner,
202-
cursor,
203-
maxResults,
204-
null);
184+
var session = entityManager.unwrap(Session.class);
185+
var q = Post.findViewable(postFilter, session, reader, owner, cursor, maxResults, null);
205186

206187
q.cacheDescriptions();
207188

@@ -373,7 +354,7 @@ private String makeFeed(
373354
private String makeFeed(
374355
@CheckForNull User reader, @Nullable User owner, @Nullable String ownerName)
375356
throws FeedException {
376-
var q = Post.findViewable(postFilter, entityManager, criteriaBuilderFactory, reader, owner);
357+
var q = Post.findViewable(postFilter, entityManager.unwrap(Session.class), reader, owner);
377358
q.cacheDescriptions();
378359
var posts = q.posts;
379360

0 commit comments

Comments
 (0)