use of io.crnk.core.resource.meta.MetaInformation in project crnk-framework by crnk-project.
the class SecurityRepositoryFilter method filterMeta.
@Override
public <T> MetaInformation filterMeta(RepositoryFilterContext context, Iterable<T> resources, RepositoryMetaFilterChain chain) {
MetaInformation metaInformation = chain.doFilter(context, resources);
if (metaInformation instanceof ResourcePermissionInformation) {
ResourcePermissionInformation permissionInformation = (ResourcePermissionInformation) metaInformation;
QueryAdapter queryAdapter = context.getRequest().getQueryAdapter();
Class<?> resourceClass = queryAdapter.getResourceInformation().getResourceClass();
permissionInformation.setResourcePermission(module.getResourcePermission(resourceClass));
}
return metaInformation;
}
use of io.crnk.core.resource.meta.MetaInformation in project crnk-framework by crnk-project.
the class ResponseRepositoryAdapter method getResponse.
protected JsonApiResponse getResponse(Object repository, Object result, RepositoryRequestSpec requestSpec) {
if (result instanceof JsonApiResponse) {
return (JsonApiResponse) result;
}
Iterable<?> resources;
boolean isCollection = result instanceof Iterable;
if (isCollection) {
resources = (Iterable<?>) result;
} else {
resources = Collections.singletonList(result);
}
Iterable<?> filteredResult = filterResult(resources, requestSpec);
MetaInformation metaInformation = getMetaInformation(repository, resources, requestSpec);
LinksInformation linksInformation = getLinksInformation(repository, resources, requestSpec);
Object resultEntity;
if (isCollection) {
resultEntity = filteredResult;
} else {
Iterator<?> iterator = filteredResult.iterator();
if (iterator.hasNext()) {
resultEntity = iterator.next();
PreconditionUtil.assertFalse("expected unique result", iterator.hasNext());
} else {
resultEntity = null;
}
}
return new JsonApiResponse().setEntity(resultEntity).setLinksInformation(linksInformation).setMetaInformation(metaInformation);
}
use of io.crnk.core.resource.meta.MetaInformation in project crnk-framework by crnk-project.
the class InMemoryEvaluator method eval.
public <T> void eval(Iterable<T> resources, QuerySpec querySpec, ResourceList<T> resultList) {
Iterator<T> iterator = resources.iterator();
while (iterator.hasNext()) {
resultList.add(iterator.next());
}
// filter
if (!querySpec.getFilters().isEmpty()) {
FilterSpec filterSpec = FilterSpec.and(querySpec.getFilters());
applyFilter(resultList, filterSpec);
}
long totalCount = resultList.size();
// sort
applySorting(resultList, querySpec.getSort());
// offset/limit
applyPaging(resultList, querySpec);
// set page information
if (querySpec.getLimit() != null || querySpec.getOffset() != 0) {
MetaInformation meta = resultList.getMeta();
if (meta instanceof PagedMetaInformation) {
PagedMetaInformation pagedMeta = (PagedMetaInformation) meta;
pagedMeta.setTotalResourceCount(totalCount);
}
if (meta instanceof HasMoreResourcesMetaInformation) {
HasMoreResourcesMetaInformation pagedMeta = (HasMoreResourcesMetaInformation) meta;
pagedMeta.setHasMoreResources(totalCount > querySpec.getOffset() + querySpec.getLimit());
}
}
}
use of io.crnk.core.resource.meta.MetaInformation in project crnk-framework by crnk-project.
the class JpaEntityRepository method findAll.
@Override
public ResourceList<T> findAll(QuerySpec querySpec) {
Class<?> entityClass = repositoryConfig.getEntityClass();
QuerySpec filteredQuerySpec = filterQuerySpec(querySpec);
JpaQueryFactory queryFactory = module.getQueryFactory();
JpaQuery<?> query = queryFactory.query(entityClass);
query.setPrivateData(new JpaRequestContext(this, querySpec));
ComputedAttributeRegistry computedAttributesRegistry = queryFactory.getComputedAttributes();
Set<String> computedAttrs = computedAttributesRegistry.getForType(entityClass);
JpaRepositoryUtils.prepareQuery(query, filteredQuerySpec, computedAttrs);
query = filterQuery(filteredQuerySpec, query);
JpaQueryExecutor<?> executor = query.buildExecutor();
boolean fetchNext = isNextFetched(filteredQuerySpec);
boolean fetchTotal = isTotalFetched(filteredQuerySpec);
JpaRepositoryUtils.prepareExecutor(executor, filteredQuerySpec, fetchRelations(null));
if (fetchNext) {
executor.setLimit(executor.getLimit() + 1);
}
executor = filterExecutor(filteredQuerySpec, executor);
List<Tuple> tuples = executor.getResultTuples();
Boolean hasNext = null;
if (fetchNext) {
hasNext = tuples.size() == querySpec.getLimit() + 1;
if (hasNext) {
tuples = tuples.subList(0, querySpec.getLimit().intValue());
}
}
tuples = filterTuples(filteredQuerySpec, tuples);
ResourceList<T> resources = repositoryConfig.newResultList();
MetaInformation metaInfo = resources.getMeta();
fillResourceList(tuples, resources);
resources = filterResults(filteredQuerySpec, resources);
if (fetchTotal) {
long totalRowCount = executor.getTotalRowCount();
((PagedMetaInformation) metaInfo).setTotalResourceCount(totalRowCount);
}
if (fetchNext) {
((HasMoreResourcesMetaInformation) metaInfo).setHasMoreResources(hasNext);
}
return resources;
}
use of io.crnk.core.resource.meta.MetaInformation in project crnk-framework by crnk-project.
the class JpaRelationshipRepository method findTargets.
@Override
public MultivaluedMap<I, T> findTargets(Iterable<I> sourceIds, String fieldName, QuerySpec querySpec) {
List<I> sourceIdLists = new ArrayList<>();
for (I sourceId : sourceIds) {
sourceIdLists.add(sourceId);
}
if (querySpec.getLimit() != null && sourceIdLists.size() > 1) {
throw new UnsupportedOperationException("page limit not supported for bulk inclusions");
}
// support paging for non-bulk requests
boolean singleRequest = sourceIdLists.size() == 1;
boolean pagedSingleRequest = singleRequest && querySpec.getLimit() != null;
boolean fetchNext = pagedSingleRequest && isNextFetched(querySpec);
QuerySpec bulkQuerySpec = querySpec.duplicate();
QuerySpec filteredQuerySpec = filterQuerySpec(bulkQuerySpec);
JpaQueryFactory queryFactory = module.getQueryFactory();
JpaQuery<?> query = queryFactory.query(sourceEntityClass, fieldName, sourceIdLists);
query.setPrivateData(new JpaRequestContext(this, querySpec));
query.addParentIdSelection();
query = filterQuery(filteredQuerySpec, query);
Class<?> entityClass = repositoryConfig.getEntityClass();
ComputedAttributeRegistry computedAttributesRegistry = queryFactory.getComputedAttributes();
Set<String> computedAttrs = computedAttributesRegistry.getForType(entityClass);
JpaRepositoryUtils.prepareQuery(query, filteredQuerySpec, computedAttrs);
JpaQueryExecutor<?> executor = query.buildExecutor();
JpaRepositoryUtils.prepareExecutor(executor, filteredQuerySpec, fetchRelations(fieldName));
executor = filterExecutor(filteredQuerySpec, executor);
if (fetchNext) {
executor.setLimit(executor.getLimit() + 1);
}
List<Tuple> tuples = executor.getResultTuples();
Boolean hasNext = null;
if (fetchNext) {
hasNext = tuples.size() == querySpec.getLimit() + 1;
if (hasNext) {
tuples = tuples.subList(0, querySpec.getLimit().intValue());
}
}
tuples = filterTuples(bulkQuerySpec, tuples);
MultivaluedMap<I, T> map = mapTuples(tuples);
if (singleRequest) {
I sourceId = sourceIdLists.get(0);
ResourceList<T> iterable;
if (map.containsKey(sourceId)) {
iterable = (ResourceList<T>) map.getList(sourceId);
} else {
iterable = repositoryConfig.newResultList();
map.set(sourceId, iterable);
}
if (pagedSingleRequest) {
MetaInformation metaInfo = iterable.getMeta();
boolean fetchTotal = isTotalFetched(filteredQuerySpec);
if (fetchTotal) {
long totalRowCount = executor.getTotalRowCount();
((PagedMetaInformation) metaInfo).setTotalResourceCount(totalRowCount);
}
if (fetchNext) {
((HasMoreResourcesMetaInformation) metaInfo).setHasMoreResources(hasNext);
}
}
}
return map;
}
Aggregations