Index: src/main/src/org/compass/core/support/search/CompassSearchHelper.java =================================================================== --- src/main/src/org/compass/core/support/search/CompassSearchHelper.java (revision 1816) +++ src/main/src/org/compass/core/support/search/CompassSearchHelper.java (working copy) @@ -115,11 +115,11 @@ int from = page * iPageSize; if (from > hits.getLength()) { from = hits.getLength() - iPageSize; - doProcessBeforeDetach(searchCommand, session, hits, from, hitsLength); - detachedHits = hits.detach(from, hitsLength); + doProcessBeforeDetach(searchCommand, session, hits, from, (hitsLength-from)); + detachedHits = hits.detach(from, (hitsLength-from)); } else if ((from + iPageSize) > hitsLength) { - doProcessBeforeDetach(searchCommand, session, hits, from, hitsLength); - detachedHits = hits.detach(from, hitsLength); + doProcessBeforeDetach(searchCommand, session, hits, from, (hitsLength-from)); + detachedHits = hits.detach(from, (hitsLength-from)); } else { doProcessBeforeDetach(searchCommand, session, hits, from, iPageSize); detachedHits = hits.detach(from, iPageSize); Index: src/main/test/org/compass/core/test/support/search/AbstractSearchHelper.java =================================================================== --- src/main/test/org/compass/core/test/support/search/AbstractSearchHelper.java (revision 0) +++ src/main/test/org/compass/core/test/support/search/AbstractSearchHelper.java (revision 0) @@ -0,0 +1,39 @@ +package org.compass.core.test.support.search; + +import org.compass.core.Compass; +import org.compass.core.CompassHits; +import org.compass.core.CompassSession; +import org.compass.core.support.search.CompassSearchCommand; +import org.compass.core.support.search.CompassSearchHelper; + +/** + * This file is named Abstract* in spite of the fact we can create its instance + * but we don't want to process this call by JUnit during testing. + */ +public class AbstractSearchHelper extends CompassSearchHelper { + + private int expectedFrom; + private int expectedSize; + + public AbstractSearchHelper(Compass compass) { super(compass); } + + public AbstractSearchHelper(Compass compass, Integer pageSize) { + super(compass, pageSize); + } + + public int getExpectedSize() { + return expectedSize; + } + + public int getExpectedFrom() { + return expectedFrom; + } + + protected void doProcessBeforeDetach( + CompassSearchCommand searchCommand, CompassSession session, + CompassHits hits, int from, int size) { + + expectedFrom = from; + expectedSize = size; + } +} Index: src/main/test/org/compass/core/test/support/search/CompassSearchHelperTests.java =================================================================== --- src/main/test/org/compass/core/test/support/search/CompassSearchHelperTests.java (revision 1816) +++ src/main/test/org/compass/core/test/support/search/CompassSearchHelperTests.java (working copy) @@ -1,5 +1,6 @@ package org.compass.core.test.support.search; +import org.compass.core.Compass; import org.compass.core.CompassSession; import org.compass.core.CompassTransaction; import org.compass.core.support.search.CompassSearchCommand; @@ -137,6 +138,40 @@ session.close(); } + /** + * The purpose of this test is to verify that the size of the second page is determined correctly. + */ + public void testSecondSmallerPageSize() { + CompassSession session = openSession(); + CompassTransaction tr = session.beginTransaction(); + + addData(session, 8); + CompassSearchHelper searchHelper = new CompassSearchHelper(getCompass(), new Integer(5)); + CompassSearchResults results = searchHelper.search(new CompassSearchCommand("test", new Integer(0))); + assertEquals(5, results.getHits().length); + assertEquals(8, results.getTotalHits()); + assertEquals(2, 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()); + assertEquals(6, results.getPages()[1].getFrom()); + assertEquals(8, results.getPages()[1].getTo()); + assertEquals(3, results.getPages()[1].getSize()); + assertEquals(false, results.getPages()[1].isSelected()); + + searchHelper = new AbstractSearchHelper(getCompass(), new Integer(5)); + results = searchHelper.search(new CompassSearchCommand("test", new Integer(1))); + assertEquals(3, results.getHits().length); + assertEquals(8, results.getTotalHits()); + assertEquals(2, results.getPages().length); + assertEquals(5,((AbstractSearchHelper)searchHelper).getExpectedFrom()); + assertEquals(3,((AbstractSearchHelper)searchHelper).getExpectedSize()); + + 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));