Issue Details (XML | Word | Printable)

Key: OPENJPA-175
Type: Bug Bug
Status: Resolved Resolved
Resolution: Fixed
Priority: Major Major
Assignee: Unassigned
Reporter: Srinivasa
Votes: 0
Watchers: 0
Operations

If you were logged in you would be able to see more operations.
OpenJPA

Eager selects by PagingResultObjectProvider may not use the FetchBatchSize

Created: 19/Mar/07 11:57 PM   Updated: 24/Mar/07 12:42 AM
Return to search
Component/s: None
Affects Version/s: 0.9.0, 0.9.6
Fix Version/s: 0.9.7

Time Tracking:
Not Specified

File Attachments:
  Size
Text File Licensed for inclusion in ASF works InExpression-Diff.txt 2007-03-22 05:45 AM Srinivasa 3 kB
Text File Licensed for inclusion in ASF works OPENJPA-175-patch.txt 2007-03-20 07:43 PM Srinivasa 5 kB
Text File Licensed for inclusion in ASF works OPENJPA-175-patch.txt 2007-03-20 12:05 AM Srinivasa 5 kB

Resolution Date: 24/Mar/07 12:42 AM


 Description  « Hide
The PagingResultObjectProvider during initialization does checks to determine the appropriate pageSize. While this logic caps the size to 50 and addresses determining an appropriate page size, it doesn't always conform to the set batch size. For example with the size being 1000 and FetchBatchSize set to say 500, the page size is determined to be 50 resulting in eager selects happening in batches of 50 when the user expects it to be in batches of 500.

 All   Comments   Work Log   Change History   Subversion Commits      Sort Order: Ascending order - Click to sort in descending order
Abe White added a comment - 20/Mar/07 03:11 PM
+1, with some caveats:

- The proposed patch doesn't handle the common cases where the FetchBatchSize is -1 (unlimited) or 0 (driver default).
- I'm a little nervous about defaulting the in clause limit to "unlimited" when we don't have much info on actual database limits other than Oracle.

Srinivasa added a comment - 20/Mar/07 07:43 PM
Patch with fixes to address the FetchBatchSize values of -1, 0. For FetchBatchSize being 0 or negative value other than -1 uses the earlier logic of determining a pageSize capped by 50 based on size.

Abe White added a comment - 21/Mar/07 04:22 PM
I'll have to see the code in context once it's checked in because I'm not very good at reading patches, but it looks good to me.

Abe White added a comment - 21/Mar/07 10:06 PM
1. Are you also going to fix InExpression to honor the DBDictionary's new in clause limit?
2. After reviewing the patch some more, I propose the following simplified version:

        // try to find a good page size. if the known size < batch size, use
        // it. if the batch size is set, then use that; if it's sorta close
        // to the size, then use the size / 2 to get two full pages rather
        // than a possible big one and small one
        int batch = getFetchConfiguration().getFetchBatchSize();
        int pageSize;
        if (batch < 0)
            pageSize = (int) size;
        else {
            if (batch == 0)
                batch = 50; // reasonable default
            if (size <= batch)
                pageSize = (int) size;
            else if (size <= batch * 2) {
                if (size % 2 == 0)
                    pageSize = (int) (size / 2);
                else
                    pageSize = (int) (size / 2 + 1);
            } else
                pageSize = batch;
        }

Srinivasa added a comment - 21/Mar/07 10:57 PM
1 - Yes, was planning to do it as a separate JIRA given that it directly does not concern the issue raised here, however I will include it here since we are introducing the in-clause limit in the DBDictionary for this fix.
2 - Looks fine to me, except for the minor issue that in the (size <= batch * 2) case we will not be adhering to the FetchBatchSize for pageSize in that the first in-clause query will be for lesser than the FetchBatchSize number of entries, however we will still endup running the same number of in-clause queries - 2.