protected Predicate getArgumentPredicate(CriteriaBuilder cb, From<?,?> path, DataFetchingEnvironment environment, Argument argument) { ObjectValue whereValue = getValue(argument); if (whereValue.getChildren().isEmpty()) return cb.disjunction(); Logical logical = Optional.of(argument.getName()) .filter(it -> Arrays.asList("AND", "OR").contains(it)) .map(it -> Logical.valueOf(it)) .orElse(Logical.AND); List<Predicate> predicates = new ArrayList<>(); whereValue.getObjectFields().stream() .filter(it -> Arrays.asList("AND", "OR").contains(it.getName())) .map(it -> getArgumentPredicate(cb, path, new ArgumentEnvironment(environment, argument.getName()), new Argument(it.getName(), it.getValue()))) .forEach(predicates::add); whereValue.getObjectFields().stream() .filter(it -> !Arrays.asList("AND", "OR").contains(it.getName())) .map(it -> getFieldPredicate(it.getName(), cb, path, it, new ArgumentEnvironment(environment, argument.getName()), new Argument(it.getName(), it.getValue()))) .filter(predicate -> predicate != null) .forEach(predicates::add); if (predicates.isEmpty()) predicates.add(cb.disjunction()); return (logical == Logical.OR) ? cb.or(predicates.toArray(new Predicate[predicates.size()])) : cb.and(predicates.toArray(new Predicate[predicates.size()])); }
private Predicate getFieldPredicate(String fieldName, CriteriaBuilder cb, From<?,?> path, ObjectField objectField, DataFetchingEnvironment environment, Argument argument) { ObjectValue expressionValue = (ObjectValue) objectField.getValue(); if(expressionValue.getChildren().isEmpty()) return cb.disjunction();
@SuppressWarnings( "serial" ) protected Predicate getWherePredicate(CriteriaBuilder cb, Root<?> root, From<?,?> path, DataFetchingEnvironment environment, Argument argument) { ObjectValue whereValue = getValue(argument); if(whereValue.getChildren().isEmpty()) return cb.conjunction(); return getArgumentPredicate(cb, (path != null) ? path : root, new DataFetchingEnvironmentImpl( environment.getSource(), new LinkedHashMap<String,Object>() {{ put(Logical.AND.name(), environment.getArguments()); }}, environment.getContext(), environment.getRoot(), environment.getFieldDefinition(), environment.getFields(), environment.getFieldType(), environment.getParentType(), environment.getGraphQLSchema(), environment.getFragmentsByName(), environment.getExecutionId(), environment.getSelectionSet(), environment.getExecutionStepInfo(), environment.getExecutionContext() ), new Argument(Logical.AND.name(), whereValue) ); }