public ReactiveMongoParameterAccessor(MongoQueryMethod method, Object[] values) { super(method, values); this.values = values; this.subscriptions = new ArrayList<>(values.length); for (int i = 0; i < values.length; i++) { Object value = values[i]; if (value == null || !ReactiveWrappers.supports(value.getClass())) { subscriptions.add(null); continue; } if (ReactiveWrappers.isSingleValueType(value.getClass())) { subscriptions.add(ReactiveWrapperConverters.toWrapper(value, Mono.class).toProcessor()); } else { subscriptions.add(ReactiveWrapperConverters.toWrapper(value, Flux.class).collectList().toProcessor()); } } }
@Override public boolean isCollectionQuery() { return !(isPageQuery() || isSliceQuery()) && ReactiveWrappers.isMultiValueType(method.getReturnType()); }
/** * Check if the given {@link org.springframework.data.repository.query.QueryMethod} receives a reactive parameter * wrapper as one of its parameters. * * @return */ public boolean hasReactiveWrapperParameter() { for (ElasticsearchParameter param : getParameters()) { if (ReactiveWrapperConverters.supports(param.getType())) { return true; } } return false; }
public ReactiveElasticsearchQueryMethod(Method method, RepositoryMetadata metadata, ProjectionFactory factory, MappingContext<? extends ElasticsearchPersistentEntity<?>, ElasticsearchPersistentProperty> mappingContext) { super(method, metadata, factory, mappingContext); this.method = method; if (hasParameterOfType(method, Pageable.class)) { TypeInformation<?> returnType = ClassTypeInformation.fromReturnTypeOf(method); boolean multiWrapper = ReactiveWrappers.isMultiValueType(returnType.getType()); boolean singleWrapperWithWrappedPageableResult = ReactiveWrappers.isSingleValueType(returnType.getType()) && (PAGE_TYPE.isAssignableFrom(returnType.getRequiredComponentType()) || SLICE_TYPE.isAssignableFrom(returnType.getRequiredComponentType())); if (singleWrapperWithWrappedPageableResult) { throw new InvalidDataAccessApiUsageException( String.format("'%s.%s' must not use sliced or paged execution. Please use Flux.buffer(size, skip).", ClassUtils.getShortName(method.getDeclaringClass()), method.getName())); } if (!multiWrapper) { throw new IllegalStateException(String.format( "Method has to use a either multi-item reactive wrapper return type or a wrapped Page/Slice type. Offending method: %s", method.toString())); } if (hasParameterOfType(method, Sort.class)) { throw new IllegalStateException(String.format("Method must not have Pageable *and* Sort parameter. " + "Use sorting capabilities on Pageble instead! Offending method: %s", method.toString())); } } }
/** * Returns whether the {@link MethodParameter} should be unwrapped. * * @param parameter must not be {@literal null}. * @see QueryExecutionConverters */ private static boolean shouldUnwrap(MethodParameter parameter) { return QueryExecutionConverters.supportsUnwrapping(parameter.getParameterType()) || ReactiveWrappers.supports(parameter.getParameterType()); } }
private boolean isStreamOfGeoResult() { if (!ReactiveWrappers.supports(returnType.getType())) { return false; } TypeInformation<?> componentType = returnType.getComponentType(); return componentType != null && GeoResult.class.equals(componentType.getType()); } }
@Nullable @Override public final Object convert(@Nullable Object source, TypeDescriptor sourceType, TypeDescriptor targetType) { if (source == null) { return null; } NullableWrapper wrapper = (NullableWrapper) source; Object value = wrapper.getValue(); // TODO: Add Recursive conversion once we move to Spring 4 return value == null ? nullValue : wrap(value); }
@Override public boolean isReactiveRepository() { return ReactiveWrappers.usesReactiveType(repositoryInterface); } }
public static WrapperType getWrapperType() { return WrapperType.singleValue(Optional.class); } }
boolean isSingleValue() { return cardinality.equals(Cardinality.SINGLE); } }
/** * Creates a new {@link ElasticsearchParametersParameterAccessor}. * * @param method must not be {@literal null}. * @param values must not be {@literal null}. */ ReactiveElasticsearchParametersParameterAccessor(ReactiveElasticsearchQueryMethod method, Object[] values) { super(method, values); this.subscriptions = new ArrayList<>(values.length); for (int i = 0; i < values.length; i++) { Object value = values[i]; if (value == null || !ReactiveWrappers.supports(value.getClass())) { subscriptions.add(null); continue; } if (ReactiveWrappers.isSingleValueType(value.getClass())) { subscriptions.add(ReactiveWrapperConverters.toWrapper(value, Mono.class).toProcessor()); } else { subscriptions.add(ReactiveWrapperConverters.toWrapper(value, Flux.class).collectList().toProcessor()); } } }
if (hasParameterOfType(method, Pageable.class)) { boolean multiWrapper = ReactiveWrappers.isMultiValueType(returnType.getType()); boolean singleWrapperWithWrappedPageableResult = ReactiveWrappers.isSingleValueType(returnType.getType()) && (PAGE_TYPE.isAssignableFrom(returnType.getRequiredComponentType()) || SLICE_TYPE.isAssignableFrom(returnType.getRequiredComponentType())); if (hasParameterOfType(method, Sort.class)) { throw new IllegalStateException(String.format("Method must not have Pageable *and* Sort parameter. " + "Use sorting capabilities on Pageble instead! Offending method: %s", method.toString()));
private boolean isGeoNearQuery(Method method) { if (ReactiveWrappers.supports(method.getReturnType())) { TypeInformation<?> from = ClassTypeInformation.fromReturnTypeOf(method); return GeoResult.class.equals(from.getRequiredComponentType().getType()); } return false; }
/** * Check if the given {@link org.springframework.data.repository.query.QueryMethod} receives a reactive parameter * wrapper as one of its parameters. * * @return */ public boolean hasReactiveWrapperParameter() { for (MongoParameter mongoParameter : getParameters()) { if (ReactiveWrapperConverters.supports(mongoParameter.getType())) { return true; } } return false; }
@Override public boolean isCollectionQuery() { return !(isPageQuery() || isSliceQuery()) && ReactiveWrappers.isMultiValueType(method.getReturnType()); }
public ReactiveMongoParameterAccessor(MongoQueryMethod method, Object[] values) { super(method, values); this.values = values; this.subscriptions = new ArrayList<>(values.length); for (int i = 0; i < values.length; i++) { Object value = values[i]; if (value == null || !ReactiveWrappers.supports(value.getClass())) { subscriptions.add(null); continue; } if (ReactiveWrappers.isSingleValueType(value.getClass())) { subscriptions.add(ReactiveWrapperConverters.toWrapper(value, Mono.class).toProcessor()); } else { subscriptions.add(ReactiveWrapperConverters.toWrapper(value, Flux.class).collectList().toProcessor()); } } }
if (hasParameterOfType(method, Pageable.class)) { boolean multiWrapper = ReactiveWrappers.isMultiValueType(returnType.getType()); boolean singleWrapperWithWrappedPageableResult = ReactiveWrappers.isSingleValueType(returnType.getType()) && (PAGE_TYPE.isAssignableFrom(returnType.getRequiredComponentType()) || SLICE_TYPE.isAssignableFrom(returnType.getRequiredComponentType())); if (hasParameterOfType(method, Sort.class)) { throw new IllegalStateException(String.format("Method must not have Pageable *and* Sort parameter. " + "Use sorting capabilities on Pageble instead! Offending method: %s", method.toString()));
private boolean isStreamOfGeoResult() { if (!ReactiveWrappers.supports(returnType.getType())) { return false; } TypeInformation<?> componentType = returnType.getComponentType(); return componentType != null && GeoResult.class.equals(componentType.getType()); } }
/** * Check if the given {@link org.springframework.data.repository.query.QueryMethod} receives a reactive parameter * wrapper as one of its parameters. * * @return */ public boolean hasReactiveWrapperParameter() { for (MongoParameter mongoParameter : getParameters()) { if (ReactiveWrapperConverters.supports(mongoParameter.getType())) { return true; } } return false; }
private boolean isGeoNearQuery(Method method) { if (ReactiveWrappers.supports(method.getReturnType())) { TypeInformation<?> from = ClassTypeInformation.fromReturnTypeOf(method); return GeoResult.class.equals(from.getRequiredComponentType().getType()); } return false; }