Perfect! detach was the missing piece of the puzzle, thank you! The only issue 
remaining is the capability to combine the size/iterator call to prevent 
duplicate DAO calls.

-----Original Message-----
From: Martijn Dashorst [mailto:[EMAIL PROTECTED]
Sent: Thursday, March 27, 2008 12:02 PM
To: users@wicket.apache.org
Subject: Re: DataView size() iterator() call order issue


forgot:

public class MYSizeCachingDataProvider ... {
    public void detach() {
        size = null;
        resultset = null;
    }
}


On 3/27/08, Martijn Dashorst <[EMAIL PROTECTED]> wrote:
> public class MySizeCachingDataProvider implements IDataProvider {
>     private Integer size = null;
>     private List<Foo> resultset = null;
>     public int getSize() {
>         if(size == null ) {
>             performExpensiveQuery();
>         }
>         return size;
>     }
>     public Iterator iterator() {
>         if(resultset == null ) {
>             performExpensiveQuery();
>         }
>         return resultset;
>     }
>     private void performExpensiveQuery() {
>         size = count();
>         resultset = query();
>
>     }
>  }
>
>  On 3/27/08, Hoover, William <[EMAIL PROTECTED]> wrote:
>  > I'm only interested in caching it for the current request so there isn't 
> multiple calls to size within the same request. The same way 
> AbstractPageableView is caching it and clearing it in "onBeforeRender". The 
> only problem is that:
>  >
>  >  1) I do not have access to the cached size stored in AbstractPageableView 
> -> cachedItemCount from within the data provider
>  >  2) The cached size in AbstractPageableView -> cachedItemCount is 
> "cleared" in onBeforeRender() before the call is made to getViewOffset() -> 
> getCurrentPage() -> getPageCount() -> getRowCount() when getting the item 
> models in getItemModels(); This causes a second call to the data providers 
> size() method when paginating. In other words, the AbstractPageableView -> 
> cachedItemCount is not working properly when a link for the PagingNavigator 
> is clicked- causing 2 calls to the size() method within the same request (w/o 
> deletions ;o).
>  >
>  >
>  >  -----Original Message-----
>  >  From: Johan Compagner [mailto:[EMAIL PROTECTED]
>  >
>  > Sent: Thursday, March 27, 2008 11:36 AM
>  >  To: users@wicket.apache.org
>  >  Subject: Re: DataView size() iterator() call order issue
>  >
>  >
>  >  If you are iterating over a list that can be changed by all kinds of
>  >  different users
>  >  Then you cant really cache it
>  >
>  >  If you are iterating over a list that is pretty stable for the current 
> users
>  >  or the user itself only alters that list (insert/delete)
>  >  Then you can cache it easily
>  >
>  >  Just call detach (that clears the size cache) when you have an action that
>  >  deletes or inserts a new items so that you know the size is changed.
>  >
>  >  johan
>  >
>  >
>  >  On Thu, Mar 27, 2008 at 4:04 PM, Hoover, William <[EMAIL PROTECTED]>
>  >  wrote:
>  >
>  >  > Can you post code for an example data provider that would KNOW how to
>  >  > cache the size?
>  >  >
>  >  > -----Original Message-----
>  >  > From: Johan Compagner [mailto:[EMAIL PROTECTED]
>  >  > Sent: Thursday, March 27, 2008 10:47 AM
>  >  > To: users@wicket.apache.org
>  >  > Subject: Re: DataView size() iterator() call order issue
>  >  >
>  >  >
>  >  > no you as a developer KNOW that it can cache it
>  >  > Cache it if you can dont if you cant
>  >  >
>  >  > On Thu, Mar 27, 2008 at 2:28 PM, Hoover, William <[EMAIL PROTECTED]>
>  >  > wrote:
>  >  >
>  >  > > Okay, two issues... (1) combined call for size/data (2) multiple calls
>  >  > to
>  >  > > size() when paginating
>  >  > >
>  >  > > I will avoid confusion by addressing only the multiple calls to size()
>  >  > for
>  >  > > now.
>  >  > >
>  >  > > If only the size was to be cached, as you suggested, how would the 
> data
>  >  > > provider know when to clear it? The data provider is statefull and
>  >  > maintains
>  >  > > the size across requests and there is no "onBeforeRender" in a data
>  >  > provider
>  >  > > like there is in AbstractPageableView. So, the size will never be
>  >  > cleared
>  >  > > when paginating from one page to the next. Even if we were able to 
> cache
>  >  > the
>  >  > > size we would be maintaining the same data in two different locations-
>  >  > in
>  >  > > the AbstractPageableView -> cachedItemCount and in the data provider.
>  >  > >
>  >  > > -----Original Message-----
>  >  > > From: Johan Compagner [mailto:[EMAIL PROTECTED]
>  >  > > Sent: Thursday, March 27, 2008 8:12 AM
>  >  > > To: users@wicket.apache.org
>  >  > > Subject: Re: DataView size() iterator() call order issue
>  >  > >
>  >  > >
>  >  > > no cache the size.
>  >  > > We first have to have the size to be able to give you the offset and
>  >  > count
>  >  > > params.
>  >  > > And depending of the type of data or the database you use you could 
> also
>  >  > > already query the data (in the size() call)
>  >  > > But i know that is not always the best thing to do.
>  >  > >
>  >  > > But do you want an extra 2 params also in the size() call?
>  >  > > What would be the offset and what would be the max length?
>  >  > > The problem is that both of those depends on the size call.....
>  >  > > So the offset is calculated with the size param as is the count..
>  >  > >
>  >  > > So if we try to guess those 2 params for the size() call then those 2
>  >  > > params
>  >  > > dont have to be the same for the iterator call...
>  >  > >
>  >  > > johan
>  >  > >
>  >  > >
>  >  > > On Thu, Mar 27, 2008 at 1:01 PM, Hoover, William <[EMAIL PROTECTED]>
>  >  > > wrote:
>  >  > >
>  >  > > > Also, you mention that all that is needed is to cache it (I assume 
> you
>  >  > > are
>  >  > > > referring to the actual data) in the data provider. How can that be
>  >  > done
>  >  > > > when the size is being called when there is no way to get the 
> current
>  >  > > offset
>  >  > > > that is needed to get the data in the first place?
>  >  > > >
>  >  > > > -----Original Message-----
>  >  > > > From: Hoover, William [mailto:[EMAIL PROTECTED]
>  >  > > > Sent: Thursday, March 27, 2008 7:55 AM
>  >  > > > To: users@wicket.apache.org
>  >  > > > Subject: RE: DataView size() iterator() call order issue
>  >  > > >
>  >  > > >
>  >  > > > The difference is that in the deletion scenario the state of the 
> data
>  >  > > has
>  >  > > > changed. In the pagination scenario the state of the data has not
>  >  > > changed.
>  >  > > > Why is that so difficult to differentiate?
>  >  > > >
>  >  > > > -----Original Message-----
>  >  > > > From: Johan Compagner [mailto:[EMAIL PROTECTED]
>  >  > > > Sent: Thursday, March 27, 2008 7:49 AM
>  >  > > > To: users@wicket.apache.org
>  >  > > > Subject: Re: DataView size() iterator() call order issue
>  >  > > >
>  >  > > >
>  >  > > > and how do we know the difference?
>  >  > > >
>  >  > > > You as a developer know it, we dont know it as a framework, just 
> cache
>  >  > > it
>  >  > > > in
>  >  > > > your dataprovider or wrap in in a caching data provider. Why is that
>  >  > so
>  >  > > > difficult
>  >  > > >
>  >  > > > johan
>  >  > > >
>  >  > > >
>  >  > > > On Thu, Mar 27, 2008 at 12:39 PM, Hoover, William <[EMAIL PROTECTED]
>  >  > >
>  >  > > > wrote:
>  >  > > >
>  >  > > > > That makes perfect sense in the scenario where rows are deleted, 
> but
>  >  > > it
>  >  > > > > doesn't make sense when all that is being done is clicking the 
> next
>  >  > > > button
>  >  > > > > for a PagingNavigator. Why would do we need two calls to the size
>  >  > > method
>  >  > > > in
>  >  > > > > that scenario?
>  >  > > > >
>  >  > > > > -----Original Message-----
>  >  > > > > From: Igor Vaynberg [mailto:[EMAIL PROTECTED]
>  >  > > > > Sent: Wednesday, March 26, 2008 3:27 PM
>  >  > > > > To: users@wicket.apache.org
>  >  > > > > Subject: Re: DataView size() iterator() call order issue
>  >  > > > >
>  >  > > > >
>  >  > > > > On Wed, Mar 26, 2008 at 11:37 AM, Hoover, William <
>  >  > [EMAIL PROTECTED]
>  >  > > >
>  >  > > > > wrote:
>  >  > > > > >  2) Although AbstractPageableView does ensure the cached item
>  >  > count
>  >  > > is
>  >  > > > > used before calling the data provider size() in getRowCount(), the
>  >  > > > cached
>  >  > > > > item count is "cleared" in onBeforeRender() before the call is 
> made
>  >  > to
>  >  > > > > getViewOffset() -> getCurrentPage() -> getPageCount() ->
>  >  > getRowCount()
>  >  > > > when
>  >  > > > > getting the item models in getItemModels(); This causes an
>  >  > unnecessary
>  >  > > > > duplicate call to the data providers size() method when 
> paginating.
>  >  > > > >
>  >  > > > > it is not unnecessary
>  >  > > > >
>  >  > > > > suppose you have a dataview with overridden isvisible() { return
>  >  > > > > getitemcount()>0; }
>  >  > > > > inside this dataview you have a delete link
>  >  > > > >
>  >  > > > > suppose dataview loads and has 1 item.
>  >  > > > > user clicks delete
>  >  > > > > wicket checks the link is indeed visible - which results it the
>  >  > size()
>  >  > > > > call which in turn caches the result
>  >  > > > > onclick() handler is invoked
>  >  > > > > row is removed
>  >  > > > > onbeforerender is called
>  >  > > > > dataview is rendered
>  >  > > > >
>  >  > > > > in this case dataview is rendered because getitemcount() has been
>  >  > > > > cached before onclick() has been executed, so the cached count is 
> 1
>  >  > > > > when in reality there are now 0 items. that is why 
> onbeforerender()
>  >  > > > > clears the cache, and why sometimes you will get two size() calls.
>  >  > > > >
>  >  > > > > -igor
>  >  > > > >
>  >  > > > >
>  >  > ---------------------------------------------------------------------
>  >  > > > > To unsubscribe, e-mail: [EMAIL PROTECTED]
>  >  > > > > For additional commands, e-mail: [EMAIL PROTECTED]
>  >  > > > >
>  >  > > > >
>  >  > > > >
>  >  > > > >
>  >  > ---------------------------------------------------------------------
>  >  > > > > To unsubscribe, e-mail: [EMAIL PROTECTED]
>  >  > > > > For additional commands, e-mail: [EMAIL PROTECTED]
>  >  > > > >
>  >  > > > >
>  >  > > >
>  >  > > >
>  >  > > > 
> ---------------------------------------------------------------------
>  >  > > > To unsubscribe, e-mail: [EMAIL PROTECTED]
>  >  > > > For additional commands, e-mail: [EMAIL PROTECTED]
>  >  > > >
>  >  > > >
>  >  > > >
>  >  > > > 
> ---------------------------------------------------------------------
>  >  > > > To unsubscribe, e-mail: [EMAIL PROTECTED]
>  >  > > > For additional commands, e-mail: [EMAIL PROTECTED]
>  >  > > >
>  >  > > >
>  >  > >
>  >  > >
>  >  > > ---------------------------------------------------------------------
>  >  > > To unsubscribe, e-mail: [EMAIL PROTECTED]
>  >  > > For additional commands, e-mail: [EMAIL PROTECTED]
>  >  > >
>  >  > >
>  >  >
>  >  >
>  >  > ---------------------------------------------------------------------
>  >  > To unsubscribe, e-mail: [EMAIL PROTECTED]
>  >  > For additional commands, e-mail: [EMAIL PROTECTED]
>  >  >
>  >  >
>  >
>  >
>  >  ---------------------------------------------------------------------
>  >  To unsubscribe, e-mail: [EMAIL PROTECTED]
>  >  For additional commands, e-mail: [EMAIL PROTECTED]
>  >
>  >
>
>
>
> --
>  Buy Wicket in Action: http://manning.com/dashorst
>  Apache Wicket 1.3.2 is released
>  Get it now: http://www.apache.org/dyn/closer.cgi/wicket/1.3.2
>


-- 
Buy Wicket in Action: http://manning.com/dashorst
Apache Wicket 1.3.2 is released
Get it now: http://www.apache.org/dyn/closer.cgi/wicket/1.3.2

---------------------------------------------------------------------
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]



---------------------------------------------------------------------
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]

Reply via email to