Index: src/main/src/org/compass/core/support/search/CompassSearchHelper.java =================================================================== --- src/main/src/org/compass/core/support/search/CompassSearchHelper.java (revision 1820) +++ src/main/src/org/compass/core/support/search/CompassSearchHelper.java (working copy) @@ -114,7 +114,8 @@ } int from = page * iPageSize; if (from > hits.getLength()) { - from = hits.getLength() - iPageSize; + // from can't be negative + from = Math.max(0, hits.getLength() - iPageSize); doProcessBeforeDetach(searchCommand, session, hits, from, (hitsLength-from)); detachedHits = hits.detach(from, (hitsLength-from)); } else if ((from + iPageSize) > hitsLength) { Index: src/main/test/org/compass/core/test/support/search/CompassSearchHelperTests.java =================================================================== --- src/main/test/org/compass/core/test/support/search/CompassSearchHelperTests.java (revision 1820) +++ src/main/test/org/compass/core/test/support/search/CompassSearchHelperTests.java (working copy) @@ -171,6 +171,31 @@ session.close(); } + /** + * The purpose is to test that if user asks for the second result page (even if + * results fits the first page completely) that it returns the first page again + * and no Exeption is thrown. + */ + public void testSecondPageWhenFirstPageSmallerThenPageSize() { + CompassSession session = openSession(); + CompassTransaction tr = session.beginTransaction(); + + addData(session, 5); + CompassSearchHelper searchHelper = new CompassSearchHelper(getCompass(), new Integer(10)); + // Note that we are asking for the second result page even if results completely fits the first result page. + CompassSearchResults results = searchHelper.search(new CompassSearchCommand("test", new Integer(1))); + assertEquals(5, results.getHits().length); + assertEquals(5, results.getTotalHits()); + assertEquals(1, results.getPages().length); + assertEquals(1, results.getPages()[0].getFrom()); + assertEquals(5, results.getPages()[0].getTo()); + assertEquals(5, results.getPages()[0].getSize()); + assertEquals(true, results.getPages()[0].isSelected()); + + tr.commit(); + session.close(); + } + private void addData(CompassSession session, int size) { for (int i = 0; i < size; i++) { session.save(new A(i, "test value" + i));