use of com.blazebit.persistence.deltaspike.data.Pageable in project blaze-persistence by Blazebit.
the class ExtendedParameters method create.
public static ExtendedParameters create(Method method, Object[] parameters, RepositoryMethod repositoryMethod) {
int max = extractSizeRestriction(method, repositoryMethod);
int first = DEFAULT_FIRST;
List<Parameter> result = new ArrayList<Parameter>(parameters.length);
int paramIndex = 1;
Annotation[][] annotations = method.getParameterAnnotations();
Class<?>[] parameterTypes = method.getParameterTypes();
Pageable pageable = null;
Specification<?> specification = null;
for (int i = 0; i < parameters.length; i++) {
// Extended for support of Pageable and Specification parameters
if (Pageable.class.isAssignableFrom(parameterTypes[i])) {
pageable = (Pageable) parameters[i];
} else if (Specification.class.isAssignableFrom(parameterTypes[i])) {
specification = (Specification) parameters[i];
} else if (isParameter(annotations[i])) {
QueryParam qpAnnotation = extractFrom(annotations[i], QueryParam.class);
if (qpAnnotation != null) {
result.add(new NamedParameter(qpAnnotation.value(), parameters[i]));
} else {
result.add(new IndexedParameter(paramIndex++, parameters[i]));
}
} else {
max = extractInt(parameters[i], annotations[i], MaxResults.class, max);
first = extractInt(parameters[i], annotations[i], FirstResult.class, first);
}
}
if (pageable == null) {
if (first > DEFAULT_FIRST || max > 0 && max < Integer.MAX_VALUE) {
pageable = new OffsetPageRequest(first, max);
}
}
return new ExtendedParameters(result, pageable, specification);
}
use of com.blazebit.persistence.deltaspike.data.Pageable in project blaze-persistence by Blazebit.
the class KeysetPageableParamConverter method fromString.
@Override
public Pageable fromString(String value) {
MultivaluedMap<String, String> queryParameters = requestUriInfo.getQueryParameters();
Pageable defaultOrFallback = pageableConfiguration.getFallbackPageable();
String offsetString = queryParameters.getFirst(pageableConfiguration.getPrefix() + pageableConfiguration.getOffsetParameterName());
String pageString = queryParameters.getFirst(pageableConfiguration.getPrefix() + pageableConfiguration.getPageParameterName());
String pageSizeString = queryParameters.getFirst(pageableConfiguration.getPrefix() + pageableConfiguration.getSizeParameterName());
boolean pageAndSizeGiven = (!StringUtils.isEmpty(pageString) || !StringUtils.isEmpty(offsetString)) && !StringUtils.isEmpty(pageSizeString);
if (!pageAndSizeGiven && defaultOrFallback == null) {
return null;
}
int maxPageSize = pageableConfiguration.getMaxPageSize();
int pageSize = !StringUtils.isEmpty(pageSizeString) ? parseAndApplyBoundaries(pageSizeString, maxPageSize, false) : defaultOrFallback.getPageSize();
// Limit lower bound
pageSize = pageSize < 1 ? defaultOrFallback.getPageSize() : pageSize;
// Limit upper bound
pageSize = pageSize > maxPageSize ? maxPageSize : pageSize;
int offset;
if (!StringUtils.isEmpty(offsetString)) {
offset = parseAndApplyBoundaries(pageString, Integer.MAX_VALUE, false);
} else if (!StringUtils.isEmpty(pageString)) {
offset = pageSize * parseAndApplyBoundaries(pageString, Integer.MAX_VALUE, true);
} else {
offset = pageSize * defaultOrFallback.getPageNumber();
}
Sort sort = resolveSort(queryParameters.get(pageableConfiguration.getSortParameterName()));
// Default if necessary and default configured
sort = sort == null && defaultOrFallback != null ? defaultOrFallback.getSort() : sort;
KeysetPage keysetPage = null;
Iterator<Sort.Order> iterator;
if (keysetClass != null) {
if (sort != null && (iterator = sort.iterator()).hasNext()) {
String previousOffsetString = queryParameters.getFirst(keysetPageableConfiguration.getPrefix() + keysetPageableConfiguration.getPreviousOffsetParameterName());
String previousPageString = queryParameters.getFirst(keysetPageableConfiguration.getPrefix() + keysetPageableConfiguration.getPreviousPageParameterName());
if (!StringUtils.isEmpty(previousOffsetString) || !StringUtils.isEmpty(previousPageString)) {
String previousPageSizeString = queryParameters.getFirst(keysetPageableConfiguration.getPrefix() + keysetPageableConfiguration.getPreviousSizeParameterName());
int previousPageSize = StringUtils.isEmpty(previousPageSizeString) ? pageSize : parseAndApplyBoundaries(previousPageSizeString, maxPageSize, false);
int previousOffset;
if (!StringUtils.isEmpty(previousOffsetString)) {
previousOffset = parseAndApplyBoundaries(previousOffsetString, Integer.MAX_VALUE, false);
} else {
int previousPage = parseAndApplyBoundaries(previousPageString, Integer.MAX_VALUE, true);
previousOffset = previousPage * previousPageSize;
}
String lowestString = queryParameters.getFirst(keysetPageableConfiguration.getPrefix() + keysetPageableConfiguration.getLowestParameterName());
String highestString = queryParameters.getFirst(keysetPageableConfiguration.getPrefix() + keysetPageableConfiguration.getHighestParameterName());
if (!StringUtils.isEmpty(lowestString) && !StringUtils.isEmpty(highestString)) {
List<Serializable> lowest = new ArrayList<>();
List<Serializable> highest = new ArrayList<>();
JsonNode lowestObject;
JsonNode highestObject;
try {
lowestObject = mapper.readTree(lowestString);
} catch (IOException ex) {
throw new IllegalArgumentException("Invalid lowest object!", ex);
}
try {
highestObject = mapper.readTree(highestString);
} catch (IOException ex) {
throw new IllegalArgumentException("Invalid highest object!", ex);
}
while (iterator.hasNext()) {
Sort.Order o = iterator.next();
JsonNode low = lowestObject;
JsonNode high = highestObject;
String[] propertyParts = o.getPath().split("\\.");
Class<? extends Serializable> propertyType = getPropertyType(keysetClass, o.getPath());
for (int i = 0; i < propertyParts.length; i++) {
low = low == null ? null : low.get(propertyParts[i]);
high = high == null ? null : high.get(propertyParts[i]);
}
lowest.add(low == null ? null : convert(low, propertyType));
highest.add(high == null ? null : convert(high, propertyType));
}
keysetPage = new DefaultKeysetPage(previousOffset, previousPageSize, new DefaultKeyset(lowest.toArray(new Serializable[lowest.size()])), new DefaultKeyset(highest.toArray(new Serializable[highest.size()])));
}
}
}
return new KeysetPageRequest(keysetPage, sort, offset, pageSize);
}
return new PageRequest(sort, offset, pageSize);
}
use of com.blazebit.persistence.deltaspike.data.Pageable in project blaze-persistence by Blazebit.
the class EntityViewMethodQueryBuilder method createJpaQuery.
private <V> Query createJpaQuery(EntityViewCdiQueryInvocationContext context) {
ExtendedParameters params = context.getExtendedParams();
EntityViewQueryRoot root = context.getRepositoryMethodMetadata().getEntityViewQueryRoot();
Pageable pageable = params.getPageable();
CriteriaBuilder<?> cb;
Specification<?> specification = params.getSpecification();
if (specification == null) {
cb = context.getCriteriaBuilderFactory().create(context.getEntityManager(), context.getEntityClass());
root.apply(cb);
} else {
BlazeCriteriaBuilder blazeCriteriaBuilder = BlazeCriteria.get(context.getCriteriaBuilderFactory());
BlazeCriteriaQuery<?> query = blazeCriteriaBuilder.createQuery(context.getEntityClass());
Root queryRoot = query.from(context.getEntityClass());
root.apply(queryRoot, query, blazeCriteriaBuilder);
Predicate predicate = specification.toPredicate(queryRoot, query, blazeCriteriaBuilder);
if (predicate != null) {
if (query.getRestriction() == null) {
query.where(predicate);
} else {
query.where(query.getRestriction(), predicate);
}
}
cb = query.createCriteriaBuilder(context.getEntityManager());
}
Class<V> entityViewClass = (Class<V>) context.getEntityViewClass();
// TODO: depending on return type we might need to do keyset extraction
boolean keysetExtraction = false;
FullQueryBuilder<?, ?> fullCb = QueryBuilderUtils.getFullQueryBuilder(cb, pageable, context.getEntityViewManager(), entityViewClass, keysetExtraction);
fullCb = context.applyCriteriaBuilderPostProcessors(fullCb);
Query q = params.applyTo(context.createQuery(fullCb));
return context.applyRestrictions(q);
}
use of com.blazebit.persistence.deltaspike.data.Pageable in project blaze-persistence by Blazebit.
the class ExtendedParameters method create.
public static ExtendedParameters create(Method method, Object[] parameters, RepositoryMethodMetadata repositoryMethod) {
int max = extractSizeRestriction(method, repositoryMethod);
int first = DEFAULT_FIRST;
List<Parameter> result = new ArrayList<Parameter>(parameters.length);
int paramIndex = 1;
Annotation[][] annotations = method.getParameterAnnotations();
Class<?>[] parameterTypes = method.getParameterTypes();
Pageable pageable = null;
Specification<?> specification = null;
for (int i = 0; i < parameters.length; i++) {
// Extended for support of Pageable and Specification parameters
if (Pageable.class.isAssignableFrom(parameterTypes[i])) {
pageable = (Pageable) parameters[i];
} else if (Specification.class.isAssignableFrom(parameterTypes[i])) {
specification = (Specification) parameters[i];
} else if (isParameter(annotations[i])) {
QueryParam qpAnnotation = extractFrom(annotations[i], QueryParam.class);
if (qpAnnotation != null) {
result.add(new NamedParameter(qpAnnotation.value(), parameters[i]));
} else {
result.add(new IndexedParameter(paramIndex++, parameters[i]));
}
} else {
max = extractInt(parameters[i], annotations[i], MaxResults.class, max);
first = extractInt(parameters[i], annotations[i], FirstResult.class, first);
}
}
if (pageable == null) {
if (first > DEFAULT_FIRST || max > 0 && max < Integer.MAX_VALUE) {
pageable = new OffsetPageRequest(first, max);
}
}
return new ExtendedParameters(result, pageable, specification);
}
use of com.blazebit.persistence.deltaspike.data.Pageable in project blaze-persistence by Blazebit.
the class FullEntityViewRepositoryTest method testFindAllWithKeysetExtraction.
@Test
public void testFindAllWithKeysetExtraction() {
Pageable pageable = new KeysetPageRequest(null, new Sort("id"), 0, 5, true, true);
Page<PersonView> page = personViewRepository.findAll(pageable);
KeysetAwarePage<PersonView> keysetAwarePage = (KeysetAwarePage<PersonView>) page;
assertEquals(5, keysetAwarePage.getKeysetPage().getKeysets().size());
}
Aggregations