we are getting off track though. suppose class result { int size; iterator data } and idataprovider { result getdata(int first, int count); }
how do we handle usecases where we just need the size and dont know first/count yet? -igor On Wed, Mar 26, 2008 at 7:19 AM, Hoover, William <[EMAIL PROTECTED]> wrote: > see below... > > > -----Original Message----- > From: Igor Vaynberg [mailto:[EMAIL PROTECTED] > > Sent: Monday, March 24, 2008 5:13 PM > To: users@wicket.apache.org > Subject: Re: DataView size() iterator() call order issue > > > > how are we going to cover these usecases: > > * pagination toolbar needs to call dataprovier.size() to figure out > how many total records there are. at this point the toolbar doesnt > know what window of data to retrieve, it just wants to know the size. > [Will]: Currently, the size() method is called twice when paginating using > PagingNavigator (not to mention the call for isvisible you describe below). > This causes issues with duplicate query calls if the count is queried in the > size() method. Could there be transient properties in the data provider that > cache the count/list of items that would be cleared when rendered? If that > were the case there could be an abstract method defined in the data provider > interface to query/set the results. > > > * often users do: > new dataview() { isvisible() { return dataprovider.size()>0; } > once again, datawindow size is not known. > [Will]: This would be accommodated by the above solution. > > > > -igor > > > > On Mon, Mar 24, 2008 at 6:52 AM, Hoover, William <[EMAIL PROTECTED]> wrote: > > We are using a modified version of the Generic DAO for Hibernate > (http://www.hibernate.org/328.html) where we make reuse of common DAO methods > such as keyword searches that retrieve corresponding entities as well a total > size (both use the same search criteria when determining results so it makes > sense to combine the operations). As you stated, we are making two calls the > database, but only one call to the DAO (although, as stated in previous > responses there are alternative ways to perform one query to achieve this). > > > > Our business tier handles the transactions for us (not our DAOs ;o) using > an event model (similar to typical BPM systems). Broadcast agents are used to > notify our business listeners which in turn process our DAO calls. This gives > us an the flexibility to have independent transactions for different business > rule operations and makes the most out of code reuse. > > > > Avoiding the heavier call makes perfect sense, but couldn't this > responsibility be passed to the data provider implementation? It may make > more sense if the operation were combined so that the implementation could > determine how/when to make the call to the persistence tier for the two > operations. I guess I'm not seeing why we need the count before the iterator. > The data provider impl can determine whether or not it will make the > expensive call for the results. > > > > > > -----Original Message----- > > From: Igor Vaynberg [mailto:[EMAIL PROTECTED] > > > > Sent: Friday, March 21, 2008 2:44 PM > > To: users@wicket.apache.org > > Subject: Re: DataView size() iterator() call order issue > > > > > > > > > > knowing the size and the window together seems like a ui requirement, > > it is a bit strange to me that you have it inside a dao which should > > cater to business logic. eg, as far as i know there is no single db > > operation that will produce both, so you are still doing two calls > > inside the dao. > > > > also transaction management should be handled outside the dao, daos > > are too fine an object to implement transaction management for. > > > > anywho, just nitpicking :) > > > > size() is called first for a lot of reasons, namely even knowing if > > there are any rows to retrieve before a much heavier iterator() is > > called. some clients want to hide a repeater if there are no items > > visible, and so size() might get called from inside isvisible() as > > well. > > > > idataprovider is quiet old and we havent had many complaints about its > > design so far. if all you are using is the dataview it should be > > pretty simple for you to roll your own dataview, if you look at > > dataview all it does is implement idataprovider handling to feed the > > pageable view. however, if you do you will also lose datatable as well > > :| > > > > if you got suggestions on how to improve it im all ears. > > > > -igor > > > > > > On Fri, Mar 21, 2008 at 11:24 AM, Hoover, William <[EMAIL PROTECTED]> > wrote: > > > When using DataView/IDataProvider size() is called before iterator(int > first, int count) causing calls to DAOs to be duplicated. Our current > framework that is internally using Hibernate allows one call to be made to a > DAO that returns both the total result size and the actual records (based off > first/count). The problem is that the first and count are unknown until the > iterator method is called- forcing multiple calls to the DAO to retrieve the > data (also forcing multiple transactions). What are the reasons behind > calling size before iterator? > > > > > > > > > --------------------------------------------------------------------- > > > 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]