Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
@@ -0,0 +1,32 @@
package io.github.perplexhub.rsql;

import jakarta.persistence.criteria.CriteriaBuilder;
import jakarta.persistence.criteria.Expression;
import jakarta.persistence.criteria.Predicate;
import org.hibernate.query.criteria.HibernateCriteriaBuilder;
import org.springframework.util.ClassUtils;

final class HibernateSupport {

private static final boolean isHibernatePresent = ClassUtils.isPresent(
"org.hibernate.query.criteria.HibernateCriteriaBuilder", HibernateSupport.class.getClassLoader());

private HibernateSupport() {
}

static boolean isHibernateCriteriaBuilder(CriteriaBuilder cb) {
return isHibernatePresent && cb instanceof HibernateCriteriaBuilder;
}

/**
* Must be guarded with {@linkplain #isHibernatePresent} before invoking.
*/
static Predicate ilike(CriteriaBuilder cb, Expression<String> expression, String arg, Character escapeChar) {
var hcb = (HibernateCriteriaBuilder) cb;
var pattern = '%' + arg + '%';

return escapeChar != null
? hcb.ilike(expression, pattern, escapeChar)
: hcb.ilike(expression, pattern);
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -330,21 +330,19 @@ private Predicate expressionPredicate(ComparisonNode node, ResolvedExpression.Pa
return builder.notEqual(expression, argument);
}
if (op.equals(LIKE)) {
return likePredicate(expression.as(String.class), "%" + argument.toString() + "%", builder);
return likePredicate(expression, argument, false);
}
if (op.equals(NOT_LIKE)) {
return likePredicate(expression.as(String.class), "%" + argument.toString() + "%", builder).not();
return likePredicate(expression, argument, false).not();
}
if (op.equals(IGNORE_CASE)) {
return builder.equal(builder.upper(expression), argument.toString().toUpperCase());
}
if (op.equals(IGNORE_CASE_LIKE)) {
return likePredicate(builder.upper(expression), "%" + argument.toString()
.toUpperCase() + "%", builder);
return likePredicate(expression, argument, true);
}
if (op.equals(IGNORE_CASE_NOT_LIKE)) {
return likePredicate(builder.upper(expression), "%" + argument.toString()
.toUpperCase() + "%", builder).not();
return likePredicate(expression, argument, true).not();
}
if (op.equals(EQUAL)) {
return equalPredicate(expression, type, argument);
Expand Down Expand Up @@ -388,6 +386,20 @@ private Predicate likePredicate(Expression attributePath, String likeExpression,
.orElseGet(() -> builder.like(attributePath, likeExpression));
}

private Predicate likePredicate(Expression<?> expression, Object argument, boolean ignoreCase) {
String argToUse = String.valueOf(argument);
Expression<String> strExpression = expression.as(String.class);
if (ignoreCase) {
if (HibernateSupport.isHibernateCriteriaBuilder(builder)) {
return HibernateSupport.ilike(builder, strExpression, argToUse, likeEscapeCharacter);
}

return likePredicate(builder.upper(strExpression), "%" + argToUse.toUpperCase(Locale.ROOT) + "%", builder);
}

return likePredicate(strExpression, "%" + argToUse + "%", builder);
}

private Predicate equalPredicate(Expression expr, Class type, Object argument) {
if (type.equals(String.class)) {
String argStr = argument.toString();
Expand Down
Loading