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

-- 
imagination is more important than knowledge - Albert Einstein
Logic will get you from A to B. Imagination will take you everywhere - Albert Einstein
Learn from yesterday, live for today, hope for tomorrow. The important thing is not to stop questioning. - Albert Einstein
The true sign of intelligence is not knowledge but imagination. - Albert Einstein
Gravitation is not responsible for people falling in love. - Albert Einstein