Dear all,
I've been using the MagmaCollectionReader to develop a paged view over some collection. I'm using this paged view in a seaside app. This shows if there is a previous or a next page and the number of items being shown now: 1 - 21 of 2867.
If I do a query on a MagmaCollection using a sortBy: clause; some things go sometimes a bit wrong.
If I do a query using a sortBy: ; then i can check if sortComplete. Using a query without sortBy:, I can know the total number of items by calling lastKnownSize. If I do a sortBy: query, the lastKnownSize returns the max number already sorted (which is not ok in my gui; I need the total of that query). However I noticed that u can also use fractionSorted to know how much items already have been sorted, and derived from that how much items there are in total.
For instance:
Last known size: 2249 Fraction Sorted:(2249/6065)
So I wrote code like this to already know and show the total numbers of the search, even if the search is still going on on the server, like this I can then already show the first page with the result, while the server is still creating further pages
totalNumberOfElements ^(magmaCollectionReader sortComplete) ifTrue: [magmaCollectionReader lastKnownSize] ifFalse: [|fractionSorted| fractionSorted := magmaCollectionReader fractionSorted. (fractionSorted = 0) ifTrue: [self totalNumberOfElements]. (fractionSorted isFraction) ifTrue: [fractionSorted denominator] ifFalse: [magmaCollectionReader lastKnownSize]]].
This works mostly. If the fraction gets reduced however, the denominator returns a too low number off course. Is there any other way to know the total number of items in the search, even if it is still going on the server?
If I follow the code into MaQueryExecutor>>fractionComplete ^ trunkPosition ifNil: [ 0 ] ifNotNil: [ | trunkSize | trunkSize _ self trunk trunkSize. trunkSize = 0 ifTrue: [ 1 ] ifFalse: [ trunkPosition / self trunk trunkSize ] ]
I understand where the 0 can come from & where the reduction comes from. Integer/anotherInteger automatically does a reduce.
If I on the server Image change MaQueryExecutor>>fractionComplete ^ trunkPosition ifNil: [ 0 ] ifNotNil: [ | trunkSize | trunkSize _ self trunk trunkSize. trunkSize = 0 ifTrue: [ 1 ] ifFalse: [* Fraction numerator: trunkPosition denominator: self trunk trunkSize* ] ]
It works because the reduce is then not done. This is a bit of hack off course.
Is there any other way of doing this?
Thanks for any help.
Kind Regards
Bart