Lazy Query Container strange behaviour (size method called many times)

Hello all, I am logging the LQC behaviour and found that size() method is called many times.
Here you have the code I used for the BeanQuery:


public class UserBeanQuery extends AbstractBeanQuery<User> 
{
	private DAO dao = DAOFactory.instance().createDAO();

	public UserBeanQuery(QueryDefinition definition,
			Map<String, Object> queryConfiguration, Object[] sortPropertyIds,
			boolean[] sortStates) 
	{
		super(definition, queryConfiguration, sortPropertyIds, sortStates);
	}
	
	protected User constructBean() 
	{
		System.err.println("*** constructBean");
		return new User(-1);
	}

	protected List<User> loadBeans(int startIndex, int count)
	{
		System.err.println("*** loadBeans(" + startIndex + ", " + count + ")");
		Set<User> result = dao.findAll(User.class, startIndex, count);
		return new ArrayList<User>(result);
	}

	protected void saveBeans(List<User> addedTasks, List<User> modifiedTasks,
			List<User> removedTasks)
	{
		System.err.println("*** saveBeans");
	}

	public int size() 
	{
		int result = (int)dao.count(User.class);		
		System.err.println("*** size() = " + result);
		return result;
	}
}

And the code for Table:


public class UserTable extends Table
{
	private static final long serialVersionUID = -8877945668449793082L;
	private static final Object[] ORDER = { "userId", "name", "surname", "email", "street", "streetNumber", "city", "postalCode", "state", "country" };
	private static final String[] HEADERS = { "ID", "Surname", "First Name", "Email", "Street", "N", "City", "Code", "State", "Country" };

	public UserTable()
	{
		setSizeFull();

		BeanQueryFactory<UserBeanQuery> factory = new BeanQueryFactory<UserBeanQuery>(UserBeanQuery.class);
		LazyQueryDefinition definition = new LazyQueryDefinition(false, 30);
		
		definition.addProperty("userId", String.class, new Integer(-1), true, true);
		definition.addProperty("name", String.class, "", true, true);
		definition.addProperty("surname", String.class, "", true, true);
		definition.addProperty("email", String.class, "", true, true);
		definition.addProperty("street", String.class, "", true, true);
		definition.addProperty("streetNumber", String.class, "", true, true);
		definition.addProperty("city", String.class, "", true, true);
		definition.addProperty("postalCode", String.class, "", true, true);
		definition.addProperty("state", String.class, "", true, true);
		definition.addProperty("country", String.class, "", true, true);

		LazyQueryContainer container = new LazyQueryContainer(definition, factory);
		setContainerDataSource(container);
		
		setVisibleColumns(ORDER);
		setColumnHeaders(HEADERS);
	}
}

The log is the following:



11:50:17,554 ERROR [stderr]
 (http--192.168.100.11-8080-1) *** size() = 108
11:50:17,555 ERROR [stderr]
 (http--192.168.100.11-8080-1) *** size() = 108
11:50:17,555 ERROR [stderr]
 (http--192.168.100.11-8080-1) *** loadBeans(0, 30)
11:50:17,572 ERROR [stderr]
 (http--192.168.100.11-8080-1) *** size() = 108
11:50:17,572 ERROR [stderr]
 (http--192.168.100.11-8080-1) *** size() = 108
11:50:17,573 ERROR [stderr]
 (http--192.168.100.11-8080-1) *** size() = 108
11:50:17,574 ERROR [stderr]
 (http--192.168.100.11-8080-1) *** size() = 108
11:50:17,575 ERROR [stderr]
 (http--192.168.100.11-8080-1) *** size() = 108
11:50:17,575 ERROR [stderr]
 (http--192.168.100.11-8080-1) *** size() = 108
11:50:17,576 ERROR [stderr]
 (http--192.168.100.11-8080-1) *** size() = 108
11:50:17,577 ERROR [stderr]
 (http--192.168.100.11-8080-1) *** size() = 108
11:50:17,577 ERROR [stderr]
 (http--192.168.100.11-8080-1) *** size() = 108
11:50:17,578 ERROR [stderr]
 (http--192.168.100.11-8080-1) *** size() = 108
11:50:17,578 ERROR [stderr]
 (http--192.168.100.11-8080-1) *** size() = 108
11:50:17,579 ERROR [stderr]
 (http--192.168.100.11-8080-1) *** size() = 108
11:50:17,580 ERROR [stderr]
 (http--192.168.100.11-8080-1) *** size() = 108
11:50:17,580 ERROR [stderr]
 (http--192.168.100.11-8080-1) *** size() = 108
11:50:17,581 ERROR [stderr]
 (http--192.168.100.11-8080-1) *** size() = 108
11:50:17,582 ERROR [stderr]
 (http--192.168.100.11-8080-1) *** size() = 108
11:50:17,582 ERROR [stderr]
 (http--192.168.100.11-8080-1) *** size() = 108
11:50:17,712 ERROR [stderr]
 (http--192.168.100.11-8080-1) *** size() = 108
11:50:17,713 ERROR [stderr]
 (http--192.168.100.11-8080-1) *** size() = 108
11:50:17,714 ERROR [stderr]
 (http--192.168.100.11-8080-1) *** size() = 108
11:50:17,715 ERROR [stderr]
 (http--192.168.100.11-8080-1) *** size() = 108
11:50:17,716 ERROR [stderr]
 (http--192.168.100.11-8080-1) *** size() = 108
11:50:17,716 ERROR [stderr]
 (http--192.168.100.11-8080-1) *** size() = 108
11:50:17,717 ERROR [stderr]
 (http--192.168.100.11-8080-1) *** size() = 108
11:50:17,718 ERROR [stderr]
 (http--192.168.100.11-8080-1) *** size() = 108
11:50:17,718 ERROR [stderr]
 (http--192.168.100.11-8080-1) *** size() = 108
11:50:17,719 ERROR [stderr]
 (http--192.168.100.11-8080-1) *** size() = 108
11:50:17,720 ERROR [stderr]
 (http--192.168.100.11-8080-1) *** size() = 108
11:50:17,720 ERROR [stderr]
 (http--192.168.100.11-8080-1) *** size() = 108
11:50:17,721 ERROR [stderr]
 (http--192.168.100.11-8080-1) *** size() = 108
11:50:17,721 ERROR [stderr]
 (http--192.168.100.11-8080-1) *** size() = 108
11:50:17,722 ERROR [stderr]
 (http--192.168.100.11-8080-1) *** size() = 108
11:50:17,723 ERROR [stderr]
 (http--192.168.100.11-8080-1) *** size() = 108
11:50:17,723 ERROR [stderr]
 (http--192.168.100.11-8080-1) *** size() = 108
11:50:17,724 ERROR [stderr]
 (http--192.168.100.11-8080-1) *** size() = 108
11:50:17,726 ERROR [stderr]
 (http--192.168.100.11-8080-1) *** size() = 108
11:50:17,726 ERROR [stderr]
 (http--192.168.100.11-8080-1) *** size() = 108
11:50:17,727 ERROR [stderr]
 (http--192.168.100.11-8080-1) *** size() = 108
11:50:17,728 ERROR [stderr]
 (http--192.168.100.11-8080-1) *** size() = 108
11:50:17,728 ERROR [stderr]
 (http--192.168.100.11-8080-1) *** size() = 108
11:50:17,729 ERROR [stderr]
 (http--192.168.100.11-8080-1) *** size() = 108
11:50:17,730 ERROR [stderr]
 (http--192.168.100.11-8080-1) *** size() = 108
11:50:17,730 ERROR [stderr]
 (http--192.168.100.11-8080-1) *** size() = 108
11:50:17,731 ERROR [stderr]
 (http--192.168.100.11-8080-1) *** size() = 108
11:50:17,731 ERROR [stderr]
 (http--192.168.100.11-8080-1) *** size() = 108
11:50:17,732 ERROR [stderr]
 (http--192.168.100.11-8080-1) *** size() = 108
11:50:17,733 ERROR [stderr]
 (http--192.168.100.11-8080-1) *** size() = 108
11:50:17,733 ERROR [stderr]
 (http--192.168.100.11-8080-1) *** size() = 108
11:50:17,734 ERROR [stderr]
 (http--192.168.100.11-8080-1) *** size() = 108
11:50:17,735 ERROR [stderr]
 (http--192.168.100.11-8080-1) *** size() = 108
11:50:17,735 ERROR [stderr]
 (http--192.168.100.11-8080-1) *** size() = 108
11:50:17,735 ERROR [stderr]
 (http--192.168.100.11-8080-1) *** loadBeans(30, 30)
11:50:17,744 ERROR [stderr]
 (http--192.168.100.11-8080-1) *** size() = 108
11:50:17,745 ERROR [stderr]
 (http--192.168.100.11-8080-1) *** size() = 108
11:50:17,746 ERROR [stderr]
 (http--192.168.100.11-8080-1) *** size() = 108
11:50:17,746 ERROR [stderr]
 (http--192.168.100.11-8080-1) *** size() = 108
11:50:17,747 ERROR [stderr]
 (http--192.168.100.11-8080-1) *** size() = 108
11:50:17,748 ERROR [stderr]
 (http--192.168.100.11-8080-1) *** size() = 108
11:50:17,748 ERROR [stderr]
 (http--192.168.100.11-8080-1) *** size() = 108
11:50:17,749 ERROR [stderr]
 (http--192.168.100.11-8080-1) *** size() = 108
11:50:17,750 ERROR [stderr]
 (http--192.168.100.11-8080-1) *** size() = 108
11:50:17,750 ERROR [stderr]
 (http--192.168.100.11-8080-1) *** size() = 108
11:50:17,751 ERROR [stderr]
 (http--192.168.100.11-8080-1) *** size() = 108
11:50:17,752 ERROR [stderr]
 (http--192.168.100.11-8080-1) *** size() = 108
11:50:17,752 ERROR [stderr]
 (http--192.168.100.11-8080-1) *** size() = 108
11:50:17,753 ERROR [stderr]
 (http--192.168.100.11-8080-1) *** size() = 108
11:50:17,754 ERROR [stderr]
 (http--192.168.100.11-8080-1) *** size() = 108
11:50:17,754 ERROR [stderr]
 (http--192.168.100.11-8080-1) *** size() = 108
11:50:17,755 ERROR [stderr]
 (http--192.168.100.11-8080-1) *** size() = 108
11:50:17,755 ERROR [stderr]
 (http--192.168.100.11-8080-1) *** size() = 108
11:50:17,756 ERROR [stderr]
 (http--192.168.100.11-8080-1) *** size() = 108
11:50:17,757 ERROR [stderr]
 (http--192.168.100.11-8080-1) *** size() = 108
11:50:17,757 ERROR [stderr]
 (http--192.168.100.11-8080-1) *** size() = 108
11:50:17,758 ERROR [stderr]
 (http--192.168.100.11-8080-1) *** size() = 108
11:50:17,759 ERROR [stderr]
 (http--192.168.100.11-8080-1) *** size() = 108
11:50:17,760 ERROR [stderr]
 (http--192.168.100.11-8080-1) *** size() = 108
11:50:17,760 ERROR [stderr]
 (http--192.168.100.11-8080-1) *** size() = 108
11:50:17,761 ERROR [stderr]
 (http--192.168.100.11-8080-1) *** size() = 108
11:50:17,761 ERROR [stderr]
 (http--192.168.100.11-8080-1) *** size() = 108
11:50:17,762 ERROR [stderr]
 (http--192.168.100.11-8080-1) *** size() = 108
11:50:17,763 ERROR [stderr]
 (http--192.168.100.11-8080-1) *** size() = 108
11:50:17,763 ERROR [stderr]
 (http--192.168.100.11-8080-1) *** size() = 108
11:50:17,764 ERROR [stderr]
 (http--192.168.100.11-8080-1) *** size() = 108
11:50:17,764 ERROR [stderr]
 (http--192.168.100.11-8080-1) *** loadBeans(60, 30)

Is there somebody that can help me to understand why size() method is called so many times?

Thanks in advance for your help
jona

Hi,

The Vaadin Table calls Container#size() many times. It just does. The “correct” thing to do is to cache the value of size, especially in your example -


 
int size  = -1;
public int size()     {
  if(size == -1) {
    size = (int)dao.count(User.class);        
  }

  return size;
}

Thank you Charles, I will follow your suggestion.

regards
jona