Search in sources :

Example 6 with PagedMetaInformation

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());
        }
    }
}
Also used : PagedMetaInformation(io.crnk.core.resource.meta.PagedMetaInformation) HasMoreResourcesMetaInformation(io.crnk.core.resource.meta.HasMoreResourcesMetaInformation) MetaInformation(io.crnk.core.resource.meta.MetaInformation) PagedMetaInformation(io.crnk.core.resource.meta.PagedMetaInformation) HasMoreResourcesMetaInformation(io.crnk.core.resource.meta.HasMoreResourcesMetaInformation)

Example 7 with PagedMetaInformation

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());
}
Also used : Task(io.crnk.core.mock.models.Task) PagedMetaInformation(io.crnk.core.resource.meta.PagedMetaInformation) Test(org.junit.Test)

Example 8 with PagedMetaInformation

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;
}
Also used : HasMoreResourcesMetaInformation(io.crnk.core.resource.meta.HasMoreResourcesMetaInformation) MetaInformation(io.crnk.core.resource.meta.MetaInformation) PagedMetaInformation(io.crnk.core.resource.meta.PagedMetaInformation) HasMoreResourcesMetaInformation(io.crnk.core.resource.meta.HasMoreResourcesMetaInformation) JpaRequestContext(io.crnk.jpa.internal.JpaRequestContext) PagedMetaInformation(io.crnk.core.resource.meta.PagedMetaInformation) QuerySpec(io.crnk.core.queryspec.QuerySpec)

Example 9 with PagedMetaInformation

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;
}
Also used : ComputedAttributeRegistry(io.crnk.jpa.query.ComputedAttributeRegistry) HasMoreResourcesMetaInformation(io.crnk.core.resource.meta.HasMoreResourcesMetaInformation) JpaQueryFactory(io.crnk.jpa.query.JpaQueryFactory) ArrayList(java.util.ArrayList) MetaInformation(io.crnk.core.resource.meta.MetaInformation) PagedMetaInformation(io.crnk.core.resource.meta.PagedMetaInformation) HasMoreResourcesMetaInformation(io.crnk.core.resource.meta.HasMoreResourcesMetaInformation) JpaRequestContext(io.crnk.jpa.internal.JpaRequestContext) PagedMetaInformation(io.crnk.core.resource.meta.PagedMetaInformation) QuerySpec(io.crnk.core.queryspec.QuerySpec) Tuple(io.crnk.jpa.query.Tuple)

Aggregations

PagedMetaInformation (io.crnk.core.resource.meta.PagedMetaInformation)9 Test (org.junit.Test)6 AbstractJpaTest (io.crnk.jpa.query.AbstractJpaTest)5 QuerySpec (io.crnk.core.queryspec.QuerySpec)4 TestEntity (io.crnk.jpa.model.TestEntity)4 HasMoreResourcesMetaInformation (io.crnk.core.resource.meta.HasMoreResourcesMetaInformation)3 MetaInformation (io.crnk.core.resource.meta.MetaInformation)3 JpaRequestContext (io.crnk.jpa.internal.JpaRequestContext)2 RelatedEntity (io.crnk.jpa.model.RelatedEntity)2 Task (io.crnk.core.mock.models.Task)1 ComputedAttributeRegistry (io.crnk.jpa.query.ComputedAttributeRegistry)1 JpaQueryFactory (io.crnk.jpa.query.JpaQueryFactory)1 Tuple (io.crnk.jpa.query.Tuple)1 ArrayList (java.util.ArrayList)1