From: <fg...@us...> - 2011-06-06 17:21:59
|
Revision: 3508 http://openutils.svn.sourceforge.net/openutils/?rev=3508&view=rev Author: fgiust Date: 2011-06-06 17:21:52 +0000 (Mon, 06 Jun 2011) Log Message: ----------- CRIT-38 Criteria return all elements if offset is set and offset > maxResult - 1 and DocumentOrder = true Modified Paths: -------------- trunk/openutils-mgnlcriteria/src/main/java/net/sourceforge/openutils/mgnlcriteria/advanced/impl/AdvancedResultImpl.java trunk/openutils-mgnlcriteria/src/main/java/net/sourceforge/openutils/mgnlcriteria/advanced/impl/QueryExecutorHelper.java trunk/openutils-mgnlcriteria/src/test/java/net/sourceforge/openutils/mgnlcriteria/advanced/OrderingTest.java Modified: trunk/openutils-mgnlcriteria/src/main/java/net/sourceforge/openutils/mgnlcriteria/advanced/impl/AdvancedResultImpl.java =================================================================== --- trunk/openutils-mgnlcriteria/src/main/java/net/sourceforge/openutils/mgnlcriteria/advanced/impl/AdvancedResultImpl.java 2011-06-06 13:45:34 UTC (rev 3507) +++ trunk/openutils-mgnlcriteria/src/main/java/net/sourceforge/openutils/mgnlcriteria/advanced/impl/AdvancedResultImpl.java 2011-06-06 17:21:52 UTC (rev 3508) @@ -71,6 +71,8 @@ private final boolean applyLocalPaging; + private int offset; + /** * @param jcrQueryResult * @param itemsPerPage @@ -108,6 +110,37 @@ Query spellCheckerQuery, boolean applyLocalPaging) { + this( + jcrQueryResult, + itemsPerPage, + pageNumberStartingFromOne, + statement, + hm, + spellCheckerQuery, + applyLocalPaging, + 0); + } + + /** + * @param jcrQueryResult + * @param itemsPerPage + * @param pageNumberStartingFromOne + * @param statement + * @param hm + * @param spellCheckerQuery + * @param applyLocalPaging don't assume the result iterator is already paginated, do it "manually" + * @param offset TODO + */ + public AdvancedResultImpl( + QueryResultImpl jcrQueryResult, + int itemsPerPage, + int pageNumberStartingFromOne, + String statement, + HierarchyManager hm, + Query spellCheckerQuery, + boolean applyLocalPaging, + int offset) + { this.jcrQueryResult = jcrQueryResult; this.itemsPerPage = itemsPerPage; this.statement = statement; @@ -115,6 +148,7 @@ this.spellCheckerQuery = spellCheckerQuery; this.pageNumberStartingFromOne = pageNumberStartingFromOne; this.applyLocalPaging = applyLocalPaging; + this.offset = offset; } /** @@ -179,8 +213,12 @@ if (applyLocalPaging && itemsPerPage > 0) { - final int offset = (Math.max(pageNumberStartingFromOne, 1) - 1) * itemsPerPage; + if (offset == 0) + { + offset = (Math.max(pageNumberStartingFromOne, 1) - 1) * itemsPerPage; + } + // removing preceding records rows.skip(offset); Modified: trunk/openutils-mgnlcriteria/src/main/java/net/sourceforge/openutils/mgnlcriteria/advanced/impl/QueryExecutorHelper.java =================================================================== --- trunk/openutils-mgnlcriteria/src/main/java/net/sourceforge/openutils/mgnlcriteria/advanced/impl/QueryExecutorHelper.java 2011-06-06 13:45:34 UTC (rev 3507) +++ trunk/openutils-mgnlcriteria/src/main/java/net/sourceforge/openutils/mgnlcriteria/advanced/impl/QueryExecutorHelper.java 2011-06-06 17:21:52 UTC (rev 3508) @@ -145,7 +145,8 @@ stmt, hm, spellCheckerQuery, - forcePagingWithDocumentOrder); + forcePagingWithDocumentOrder, + offset); } finally { Modified: trunk/openutils-mgnlcriteria/src/test/java/net/sourceforge/openutils/mgnlcriteria/advanced/OrderingTest.java =================================================================== --- trunk/openutils-mgnlcriteria/src/test/java/net/sourceforge/openutils/mgnlcriteria/advanced/OrderingTest.java 2011-06-06 13:45:34 UTC (rev 3507) +++ trunk/openutils-mgnlcriteria/src/test/java/net/sourceforge/openutils/mgnlcriteria/advanced/OrderingTest.java 2011-06-06 17:21:52 UTC (rev 3508) @@ -216,4 +216,66 @@ Assert.assertEquals(i, PAGINATION_LENGTH, "Wrong number of results returned by the iterator."); } + + /** + * Retrieves all letters. + * @throws Exception + */ + @Test + public void testNoOrderWithOffset() throws Exception + { + + int offset = 9; + + Criteria criteria = JCRCriteriaFactory.createCriteria().setWorkspace(ContentRepository.WEBSITE); + criteria.setBasePath("/letters"); + criteria.add(Restrictions.eq("@jcr:primaryType", "mgnl:content")); + criteria.setForcePagingWithDocumentOrder(true); + criteria.setFirstResult(offset); + criteria.setMaxResults(Integer.MAX_VALUE); + + log.debug(criteria.toXpathExpression()); + + AdvancedResult advResult = criteria.execute(); + + Assert.assertEquals(advResult.getTotalSize(), LETTERS_ARRAY.length, "Unset total size."); + + ResultIterator<AdvancedResultItem> resultIterator = advResult.getItems(); + Assert.assertEquals(resultIterator.getSize(), LETTERS_ARRAY.length - offset, "Wrong iterator size."); + + int i = 0; + for (AdvancedResultItem currentResult : resultIterator) + { + Assert.assertEquals(currentResult.getTitle(), LETTERS_ARRAY[i + offset], "Position " + + i + + ": found " + + currentResult.getTitle() + + " instead of " + + LETTERS_ARRAY[i + offset]); + i++; + } + Assert.assertEquals(i, LETTERS_ARRAY.length - offset, "Wrong number of results returned by the iterator."); + + resultIterator = advResult.getItems(); + i = 0; + + // check that hasNext doesn't change the result of getPosition() + while (resultIterator.hasNext() && resultIterator.hasNext() && resultIterator.hasNext()) + { + AdvancedResultItem currentResult = resultIterator.next(); + Assert.assertEquals(currentResult.getTitle(), LETTERS_ARRAY[i + offset], "Position " + + i + + ": found " + + currentResult.getTitle() + + " instead of " + + LETTERS_ARRAY[i + offset]); + i++; + } + + Assert.assertEquals( + i, + LETTERS_ARRAY.length - offset, + "Wrong number of results returned by the iterator when calling hasNext() more than once."); + } + } This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |