Skip to content

Commit e2e5af8

Browse files
author
Martin Fekete
committed
allow to customize json search function
1 parent ee9764b commit e2e5af8

File tree

3 files changed

+52
-15
lines changed

3 files changed

+52
-15
lines changed

rsql-jpa/src/main/java/io/github/perplexhub/rsql/jsonb/JsonbExpressionBuilder.java

Lines changed: 0 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -161,10 +161,6 @@ public ArgValue convert(String s) {
161161
Map.entry(BETWEEN, "(%1$s >= %2$s && %1$s <= %3$s)")
162162
);
163163

164-
private static final String JSONB_PATH_EXISTS = "jsonb_path_exists";
165-
166-
private static final String JSONB_PATH_EXISTS_TZ = "jsonb_path_exists_tz";
167-
168164
private final ComparisonOperator operator;
169165
private final String keyPath;
170166
private final List<ArgValue> values;

rsql-jpa/src/main/java/io/github/perplexhub/rsql/jsonb/JsonbSupport.java

Lines changed: 18 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -1,35 +1,43 @@
11
package io.github.perplexhub.rsql.jsonb;
22

33

4-
import static io.github.perplexhub.rsql.RSQLVisitorBase.getEntityManagerMap;
5-
6-
import java.lang.reflect.Field;
7-
import java.util.EnumSet;
8-
import java.util.Map;
9-
import java.util.Optional;
10-
import java.util.Set;
11-
124
import cz.jirutka.rsql.parser.ast.ComparisonNode;
135
import cz.jirutka.rsql.parser.ast.ComparisonOperator;
146
import io.github.perplexhub.rsql.RSQLOperators;
157
import io.github.perplexhub.rsql.RSQLVisitorBase;
168
import io.github.perplexhub.rsql.ResolvedExpression;
179
import jakarta.persistence.Column;
1810
import jakarta.persistence.criteria.CriteriaBuilder;
19-
import jakarta.persistence.criteria.Expression;
2011
import jakarta.persistence.criteria.Path;
21-
import jakarta.persistence.criteria.Predicate;
2212
import jakarta.persistence.metamodel.Attribute;
2313
import jakarta.persistence.metamodel.ManagedType;
2414
import org.springframework.orm.jpa.vendor.Database;
2515

16+
import java.lang.reflect.Field;
17+
import java.util.EnumSet;
18+
import java.util.Map;
19+
import java.util.Optional;
20+
import java.util.Set;
21+
22+
import static io.github.perplexhub.rsql.RSQLVisitorBase.getEntityManagerMap;
23+
2624
/**
2725
* Support for jsonb expression.
2826
*/
2927
public class JsonbSupport {
3028

3129
public static boolean DATE_TIME_SUPPORT = false;
3230

31+
/**
32+
* Postgresql {@code jsonb_path_exists} function to use
33+
*/
34+
public static String JSONB_PATH_EXISTS = "jsonb_path_exists";
35+
36+
/**
37+
* Postgresql {@code jsonb_path_exists_tz} function to use
38+
*/
39+
public static String JSONB_PATH_EXISTS_TZ = "jsonb_path_exists_tz";
40+
3341
private static final Set<Database> JSON_SUPPORT = EnumSet.of(Database.POSTGRESQL);
3442

3543
private static final Map<ComparisonOperator, ComparisonOperator> NEGATE_OPERATORS =

rsql-jpa/src/test/java/io/github/perplexhub/rsql/jsonb/JsonbExpressionBuilderTest.java

Lines changed: 34 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,8 @@
1212
import java.util.Objects;
1313
import java.util.stream.Stream;
1414

15-
import static org.junit.jupiter.api.Assertions.*;
15+
import static org.junit.jupiter.api.Assertions.assertEquals;
16+
import static org.junit.jupiter.api.Assertions.assertThrows;
1617
import static org.junit.jupiter.params.provider.Arguments.arguments;
1718

1819
class JsonbExpressionBuilderTest {
@@ -37,6 +38,27 @@ void testJsonbPathExpressionWithTemporal(ComparisonOperator operator, String key
3738
assertEquals(expectedJsonbPath, expression.jsonbPath());
3839
}
3940

41+
@ParameterizedTest
42+
@MethodSource("customized")
43+
void testJsonbPathExpressionCustomized(ComparisonOperator operator, String keyPath, List<String> arguments, String expectedJsonbFunction, String expectedJsonbPath) {
44+
String jsonbPathExists = JsonbSupport.JSONB_PATH_EXISTS;
45+
String jsonbPathExistsTz = JsonbSupport.JSONB_PATH_EXISTS_TZ;
46+
try {
47+
JsonbSupport.JSONB_PATH_EXISTS = "my_jsonb_path_exists";
48+
JsonbSupport.JSONB_PATH_EXISTS_TZ = "my_jsonb_path_exists_tz";
49+
JsonbSupport.DATE_TIME_SUPPORT = true;
50+
JsonbExpressionBuilder builder = new JsonbExpressionBuilder(operator, keyPath, arguments);
51+
var expression = builder.getJsonPathExpression();
52+
assertEquals(expectedJsonbFunction, expression.jsonbFunction());
53+
assertEquals(expectedJsonbPath, expression.jsonbPath());
54+
} catch (Exception e) {
55+
throw e;
56+
} finally {
57+
JsonbSupport.JSONB_PATH_EXISTS = jsonbPathExists;
58+
JsonbSupport.JSONB_PATH_EXISTS_TZ = jsonbPathExistsTz;
59+
}
60+
}
61+
4062
static Stream<Arguments> data() {
4163
return Stream.of(
4264
allOperators(),
@@ -78,6 +100,17 @@ static Stream<Arguments> conversion() {
78100
).filter(Objects::nonNull);
79101
}
80102

103+
static Stream<Arguments> customized() {
104+
105+
return Stream.of(
106+
arguments(RSQLOperators.EQUAL, "json.equal_key", Collections.singletonList("value"), "my_jsonb_path_exists", "$.equal_key ? (@ == \"value\")"),
107+
arguments(RSQLOperators.GREATER_THAN, "json.greater_than_key", Collections.singletonList("value"), "my_jsonb_path_exists", "$.greater_than_key ? (@ > \"value\")"),
108+
arguments(RSQLOperators.EQUAL, "json.equal_key", Collections.singletonList("1970-01-01T00:00:00.000"), "my_jsonb_path_exists", "$.equal_key ? (@.datetime() == \"1970-01-01T00:00:00.000\".datetime())"),
109+
arguments(RSQLOperators.EQUAL, "json.equal_key", Collections.singletonList("1970-01-01T00:00:00.000Z"), "my_jsonb_path_exists_tz", "$.equal_key ? (@.datetime() == \"1970-01-01T00:00:00.000Z\".datetime())"),
110+
null
111+
).filter(Objects::nonNull);
112+
}
113+
81114
static Stream<Arguments> temporal() {
82115

83116
return Stream.of(

0 commit comments

Comments
 (0)