Skip to content

Commit fcf9f12

Browse files
committed
fix: separate reuse fetch and join methods with better apis
1 parent 3aa3347 commit fcf9f12

File tree

1 file changed

+37
-26
lines changed

1 file changed

+37
-26
lines changed

graphql-jpa-query-schema/src/main/java/com/introproventures/graphql/jpa/query/schema/impl/QraphQLJpaBaseDataFetcher.java

Lines changed: 37 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -159,7 +159,7 @@ protected final List<Argument> getFieldArguments(Field field, CriteriaQuery<?> q
159159
if(!TYPENAME.equals(selectedField.getName()) && !IntrospectionUtils.isTransient(from.getJavaType(), selectedField.getName())) {
160160

161161
Path<?> fieldPath = from.get(selectedField.getName());
162-
Join<?,?> join = null;
162+
From<?,?> fetch = null;
163163
Optional<Argument> optionalArgument = getArgument(selectedField, OPTIONAL);
164164

165165
// Build predicate arguments for singular attributes only
@@ -194,7 +194,7 @@ protected final List<Argument> getFieldArguments(Field field, CriteriaQuery<?> q
194194
.orElse(attribute.isOptional());
195195

196196
// Let's apply left outer join to retrieve optional associations
197-
join = reuseJoin(from, selectedField.getName(), isOptional);
197+
fetch = reuseFetch(from, selectedField.getName(), isOptional);
198198
}
199199
}
200200
} else {
@@ -205,7 +205,7 @@ protected final List<Argument> getFieldArguments(Field field, CriteriaQuery<?> q
205205
.orElse(toManyDefaultOptional);
206206

207207
// Let's apply join to retrieve associated collection
208-
join = reuseJoin(from, selectedField.getName(), isOptional);
208+
fetch = reuseFetch(from, selectedField.getName(), isOptional);
209209

210210
// TODO add fetch argument parameter
211211
// Let's fetch element collections to avoid filtering their values used where search criteria
@@ -215,7 +215,7 @@ protected final List<Argument> getFieldArguments(Field field, CriteriaQuery<?> q
215215

216216
// Let's build join fetch graph to avoid Hibernate error:
217217
// "query specified join fetching, but the owner of the fetched association was not present in the select list"
218-
if(join != null && selectedField.getSelectionSet() != null) {
218+
if(fetch != null && selectedField.getSelectionSet() != null) {
219219
GraphQLFieldDefinition fieldDefinition = getFieldDef(environment.getGraphQLSchema(),
220220
this.getObjectType(environment),
221221
selectedField);
@@ -225,7 +225,7 @@ protected final List<Argument> getFieldArguments(Field field, CriteriaQuery<?> q
225225
fieldDefinition,
226226
args);
227227
// TODO nested where criteria expressions
228-
getFieldArguments(selectedField, query, cb, join, fieldEnvironment);
228+
getFieldArguments(selectedField, query, cb, fetch, fieldEnvironment);
229229
}
230230
}
231231
}
@@ -317,7 +317,7 @@ protected Predicate getPredicate(CriteriaBuilder cb, Root<?> from, From<?,?> pat
317317
// If the argument is a list, let's assume we need to join and do an 'in' clause
318318
if (argumentEntityAttribute instanceof PluralAttribute) {
319319
// Apply left outer join to retrieve optional associations
320-
return reuseJoin(from, argument.getName(), false)
320+
return reuseFetch(from, argument.getName(), false)
321321
.in(convertValue(environment, argument, argument.getValue()));
322322
}
323323

@@ -373,7 +373,7 @@ protected Predicate getWherePredicate(CriteriaBuilder cb, Root<?> root, From<?,
373373
return getArgumentPredicate(cb, (path != null) ? path : root, predicateDataFetchingEnvironment, predicateArgument);
374374
}
375375

376-
protected Predicate getArgumentPredicate(CriteriaBuilder cb, From<?,?> path,
376+
protected Predicate getArgumentPredicate(CriteriaBuilder cb, From<?,?> from,
377377
DataFetchingEnvironment environment, Argument argument) {
378378
ObjectValue whereValue = getValue(argument);
379379

@@ -390,12 +390,12 @@ protected Predicate getArgumentPredicate(CriteriaBuilder cb, From<?,?> path,
390390
Map<String, Object> arguments = getFieldArguments(environment, it, argument);
391391

392392
if(it.getValue() instanceof ArrayValue) {
393-
return getArrayArgumentPredicate(cb, path,
393+
return getArgumentsPredicate(cb, from,
394394
argumentEnvironment(environment, arguments),
395395
new Argument(it.getName(), it.getValue()));
396396
}
397397

398-
return getArgumentPredicate(cb, path,
398+
return getArgumentPredicate(cb, from,
399399
argumentEnvironment(environment, arguments),
400400
new Argument(it.getName(), it.getValue()));
401401
})
@@ -417,15 +417,15 @@ protected Predicate getArgumentPredicate(CriteriaBuilder cb, From<?,?> path,
417417
new Field(it.getName()));
418418
boolean isOptional = false;
419419

420-
return getArgumentPredicate(cb, reuseJoin(path, it.getName(), isOptional),
420+
return getArgumentPredicate(cb, reuseFetch(from, it.getName(), isOptional),
421421
wherePredicateEnvironment(environment, fieldDefinition, args),
422422
arg);
423423
}
424424
}
425425

426-
return getFieldPredicate(it.getName(),
426+
return getLogicalPredicate(it.getName(),
427427
cb,
428-
path,
428+
from,
429429
it,
430430
argumentEnvironment(environment, args),
431431
arg);
@@ -436,7 +436,7 @@ protected Predicate getArgumentPredicate(CriteriaBuilder cb, From<?,?> path,
436436
return getCompoundPredicate(cb, predicates, logical);
437437
}
438438

439-
protected Predicate getArrayArgumentPredicate(CriteriaBuilder cb,
439+
protected Predicate getArgumentsPredicate(CriteriaBuilder cb,
440440
From<?, ?> path,
441441
DataFetchingEnvironment environment,
442442
Argument argument) {
@@ -470,7 +470,7 @@ protected Predicate getArrayArgumentPredicate(CriteriaBuilder cb,
470470
Argument arg = new Argument(it.getName(), it.getValue());
471471

472472
if(ArrayValue.class.isInstance(it.getValue())) {
473-
return getArrayArgumentPredicate(cb,
473+
return getArgumentsPredicate(cb,
474474
path,
475475
argumentEnvironment(environment, args),
476476
arg);
@@ -502,13 +502,13 @@ protected Predicate getArrayArgumentPredicate(CriteriaBuilder cb,
502502
new Field(it.getName()));
503503
boolean isOptional = false;
504504

505-
return getArgumentPredicate(cb, reuseJoin(path, it.getName(), isOptional),
505+
return getArgumentPredicate(cb, reuseFetch(path, it.getName(), isOptional),
506506
wherePredicateEnvironment(environment, fieldDefinition, args),
507507
arg);
508508
}
509509
}
510510

511-
return getFieldPredicate(it.getName(),
511+
return getLogicalPredicate(it.getName(),
512512
cb,
513513
path,
514514
it,
@@ -545,7 +545,7 @@ private Logical extractLogical(Argument argument) {
545545
.orElse(Logical.AND);
546546
}
547547

548-
private Predicate getArrayFieldPredicate(String fieldName,
548+
private Predicate getLogicalPredicates(String fieldName,
549549
CriteriaBuilder cb,
550550
From<?, ?> path,
551551
ObjectField objectField,
@@ -565,7 +565,7 @@ private Predicate getArrayFieldPredicate(String fieldName,
565565
Map<String, Object> args = getFieldArguments(environment, it, argument);
566566
Argument arg = new Argument(it.getName(), it.getValue());
567567

568-
return getFieldPredicate(it.getName(),
568+
return getLogicalPredicate(it.getName(),
569569
cb,
570570
path,
571571
it,
@@ -577,7 +577,7 @@ private Predicate getArrayFieldPredicate(String fieldName,
577577
return getCompoundPredicate(cb, predicates, logical);
578578
}
579579

580-
private Predicate getFieldPredicate(String fieldName, CriteriaBuilder cb, From<?,?> path, ObjectField objectField, DataFetchingEnvironment environment, Argument argument) {
580+
private Predicate getLogicalPredicate(String fieldName, CriteriaBuilder cb, From<?,?> path, ObjectField objectField, DataFetchingEnvironment environment, Argument argument) {
581581
ObjectValue expressionValue;
582582

583583
if(objectField.getValue() instanceof ObjectValue)
@@ -600,12 +600,12 @@ private Predicate getFieldPredicate(String fieldName, CriteriaBuilder cb, From<?
600600
Argument arg = new Argument(it.getName(), it.getValue());
601601

602602
if(it.getValue() instanceof ArrayValue) {
603-
return getArrayFieldPredicate(fieldName, cb, path, it,
603+
return getLogicalPredicates(fieldName, cb, path, it,
604604
argumentEnvironment(environment, args),
605605
arg);
606606
}
607607

608-
return getFieldPredicate(fieldName, cb, path, it,
608+
return getLogicalPredicate(fieldName, cb, path, it,
609609
argumentEnvironment(environment, args),
610610
arg);
611611
})
@@ -631,7 +631,7 @@ private Predicate getFieldPredicate(String fieldName, CriteriaBuilder cb, From<?
631631
isOptional = isOptionalAttribute(getAttribute(environment, argument));
632632
}
633633

634-
return getArgumentPredicate(cb, reuseJoin(path, fieldName, isOptional),
634+
return getArgumentPredicate(cb, reuseFetch(path, fieldName, isOptional),
635635
wherePredicateEnvironment(environment, fieldDefinition, args),
636636
arg);
637637
}
@@ -760,16 +760,27 @@ private Path<?> getCompoundJoinedPath(From<?,?> rootPath, String fieldName, bool
760760
}
761761

762762
// trying to find already existing joins to reuse
763-
private Join<?,?> reuseJoin(From<?, ?> path, String fieldName, boolean outer) {
763+
private Join<?,?> reuseJoin(From<?, ?> from, String fieldName, boolean outer) {
764764

765-
for (Fetch<?,?> join : path.getFetches()) {
765+
for (Join<?,?> join : from.getJoins()) {
766766
if (join.getAttribute().getName().equals(fieldName)) {
767-
return (Join<?,?>) join;
767+
return join;
768768
}
769769
}
770-
return outer ? (Join<?,?>) path.fetch(fieldName, JoinType.LEFT) : (Join<?,?>) path.fetch(fieldName);
770+
return outer ? from.join(fieldName, JoinType.LEFT) : from.join(fieldName);
771771
}
772772

773+
// trying to find already existing fetch joins to reuse
774+
private From<?,?> reuseFetch(From<?, ?> from, String fieldName, boolean outer) {
775+
776+
for (Fetch<?,?> fetch : from.getFetches()) {
777+
if (fetch.getAttribute().getName().equals(fieldName)) {
778+
return (From<?,?>) fetch;
779+
}
780+
}
781+
return outer ? (From<?,?>) from.fetch(fieldName, JoinType.LEFT) : (From<?,?>) from.fetch(fieldName);
782+
}
783+
773784
@SuppressWarnings( { "unchecked", "rawtypes" } )
774785
protected Object convertValue(DataFetchingEnvironment environment, Argument argument, Value value) {
775786
if (value instanceof NullValue) {

0 commit comments

Comments
 (0)