use of io.crnk.core.resource.meta.PagedMetaInformation 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.PagedMetaInformation in project crnk-framework by crnk-project.
the class InMemoryEvaluatorTest method testFilterEquals.
@Test
public void testFilterEquals() {
QuerySpec spec = new QuerySpec(Task.class);
spec.setLimit(10000L);
spec.addFilter(new FilterSpec(Arrays.asList("name"), FilterOperator.EQ, "test1"));
ResourceList<Task> results = spec.apply(tasks);
Assert.assertEquals(1, results.size());
PagedMetaInformation meta = results.getMeta(PagedMetaInformation.class);
Assert.assertEquals(1L, meta.getTotalResourceCount().longValue());
Assert.assertEquals("test1", results.get(0).getName());
}
use of io.crnk.core.resource.meta.PagedMetaInformation 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.PagedMetaInformation 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