use of io.crnk.jpa.internal.JpaRequestContext 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.jpa.internal.JpaRequestContext 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