You are viewing a plain text version of this content. The canonical link for it is here.
Posted to users@wicket.apache.org by Martin Grigorov <mg...@apache.org> on 2016/08/05 20:00:06 UTC

Re: AbstractPageableView calling IDataProvider.size() when it maybe shouldn't

Hi,


On Wed, Jul 27, 2016 at 11:24 PM, Janos Cserep <cs...@pilar.hu> wrote:

> Hi,
>
> I noticed a possible inefficiency in AbstractPageableView's
> getItemModels() method:
>
> /**
>      * This method retrieves the subset of models for items in the current
> page and allows
>      * RefreshingView to generate items.
>      *
>      * @return iterator over models for items in the current page
>      */
>     @Override
>     protected Iterator<IModel<T>> getItemModels()
>     {
>         long offset = getFirstItemOffset();
>         long size = getViewSize();
>
>         Iterator<IModel<T>> models = getItemModels(offset, size);
>
>         models = new CappedIteratorAdapter<T>(models, size);
>
>         return models;
>     }
>
> The getViewSize() method will issue a getRowCount() call which in
> DataViewBase will call the size() method of the DataProvider:
>
> public long getViewSize()
>     {
>         return Math.min(getItemsPerPage(), getRowCount() -
> getFirstItemOffset());
>     }
>
> As far as I can see, this happens so that the call to
> getItemModels(offset, size) would not ask for more items, than there is in
> the underlying provider.
>
> However, ListDataProvider defends against getting more items than present
> in the list:
>
>
> @Override
>     public Iterator<T> iterator(final long first, final long count)
>     {
>         List<T> list = getData();
>
>         long toIndex = first + count;
>         if (toIndex > list.size())
>         {
>             toIndex = list.size();
>         }
>         return list.subList((int)first, (int)toIndex).listIterator();
>     }
>
> Also databases can handle a LIMIT clause that asks for more rows than
> present in the dataset.
>
> The reason I was looking at this code is a DataView element I'm using on
> the front page of a public web application that fetches and displays the N
> most recent entries from a comment table without any paging components
> added to the DataView and I was seeing a simple "SELECT count(id) FROM
> comment"-like query taking 9% of all sql time according to JavaMelody for
> the last few days.
>
> I've changed the implementation by overriding the getItemModels() method
> to call directly getItemsPerPage instead of getViewSize and it got rid of
> the count selects and everything else seems to be working fine.
>
> I'm wondering if there is maybe some other reason why getItemModels() is
> calling getViewSize instead of getItemsPerPage that I've missed. If not
> should I create a ticket in jira?
>

Please file a ticket!
We have to take a deeper look.
Thank you!


>
> Thanks,
>
> Janos
>
> --
> pilar.hu
>
>
>
>
> ---------------------------------------------------------------------
> To unsubscribe, e-mail: users-unsubscribe@wicket.apache.org
> For additional commands, e-mail: users-help@wicket.apache.org
>
>