It can be seen in table, mouse events demo in sampler as well. Is it really necessary?
This is probably
ticket 5376
, to be fixed in a 6.4.x bug fix release.
Ok, in 6.4.0 is still there.
Furthermore i can’t tell why it happends, i have two tables, one sends two requests, the other only one on sort, and there’s no notable difference between them, except the one w/ one request is populated with primitives (and still sorts - probably they are set as ref types internally), and the other one with unnecessary large types.
Two request table:
public SumsFrequencyTable(Container dataSource) {
setContainerDataSource(dataSource);
setPageLength(10);
// setCacheRate(1);
setColumnCollapsingAllowed(true);
setColumnReorderingAllowed(true);
setVisibleColumns(NATURAL_COL_ORDER);
setColumnHeaders(COLUMN_NAMES);
}
two request table’s bean:
private String groupedSum;
private BigDecimal percent;
private BigInteger count;
One request table:
public ParityFrequencyTable(Container dataSource) {
setContainerDataSource(dataSource);
setPageLength(7);
setColumnCollapsingAllowed(true);
setColumnReorderingAllowed(true);
setVisibleColumns(NATURAL_COL_ORDER);
setColumnHeaders(COLUMN_NAMES);
}
one request table’s bean fields:
private byte odds;
private byte evens;
private double percent;
private short count;
That is a little strange; as mentioned in the ticket (which is fixed in 6.4.2), this did depend on whether column reordering was enabled or not for the table, but your code examples had it enabled for both.
Did you test if you can reproduce this with 6.4.2?
EDIT: Well, it’s kind of a minor issue rather than a bug. In the sampler > table, mouse event it still sends two requests too (i don’t know if it uses 2.4.2+).
I tested with 2.4.3 and the result is strange, out of ~10 tables, only two send two requests, and there’s no indication why.
Table bean fields and table settings (the others have identical table settings and mostly if not all primitive bean fields - furthermore, there’s more tables using the Frequency bean; it doesn’t make sense):
private byte odds;
private byte evens;
private byte cardinality;
private float percent;
private float delta;
private short count;
private String groups;
private float percent;
private short count;
package view.ui.tables;
import model.beans.ParitiesConsecutivity;
import model.managers.ParitiesManager;
import model.managers.StaticDataManager;
import com.vaadin.data.Container;
import com.vaadin.data.util.BeanItemContainer;
import com.vaadin.ui.Table;
public class ParitiesConsecutivityTable extends Table {
public final static Object[] NATURAL_COL_ORDER = new Object[]
{ "odds",
"evens", "cardinality", "percent", "delta", "count" };
public static String[] COLUMN_NAMES = { "Odds", "Evens", "Cardinality", "Percent", "Delta", "Count"};
public ParitiesConsecutivityTable(Container dataSource) {
setContainerDataSource(dataSource);
setPageLength(10);
setCacheRate(1);
setColumnCollapsingAllowed(true);
setColumnReorderingAllowed(true);
setVisibleColumns(NATURAL_COL_ORDER);
setColumnHeaders(COLUMN_NAMES);
}
public ParitiesConsecutivityTable(int minLimit, int maxLimit) {
this(new BeanItemContainer<ParitiesConsecutivity>(
ParitiesManager.paritiesConsecutivityUnique(minLimit, maxLimit)));
}
public ParitiesConsecutivityTable() {
this(new BeanItemContainer<ParitiesConsecutivity>(
StaticDataManager.PARITIES_CONSECUTIVITY_UNIQUE));
}
}
package view.ui.tables;
import model.beans.Frequency;
import model.managers.StaticDataManager;
import model.managers.SumsManager;
import com.vaadin.data.Container;
import com.vaadin.data.util.BeanItemContainer;
import com.vaadin.ui.Table;
public class SumsFrequencyTable extends Table {
public final static Object[] NATURAL_COL_ORDER = {
"groups", "percent", "count" };
public static String[] COLUMN_NAMES = { "Grouped Sum", "Percent", "Count" };
public SumsFrequencyTable(Container dataSource) {
setContainerDataSource(dataSource);
setPageLength(10);
setCacheRate(1);
setColumnCollapsingAllowed(true);
setColumnReorderingAllowed(true);
setVisibleColumns(NATURAL_COL_ORDER);
setColumnHeaders(COLUMN_NAMES);
}
public SumsFrequencyTable(int minLimit, int maxLimit) {
this(new BeanItemContainer<Frequency>(
SumsManager.listFrequencyByGroup(
StaticDataManager.DEFAULT_GROUP_FACTOR, minLimit,
maxLimit)));
}
public SumsFrequencyTable() {
this(new BeanItemContainer<Frequency>(
SumsManager.listFrequencyByGroup(
StaticDataManager.DEFAULT_GROUP_FACTOR,
StaticDataManager.DEFAULT_MIN_LIMIT,
StaticDataManager.COUNT)));
}
}
The following Vaadin sampler tables have the same issue still in whatever version it is built currently:
http://demo.vaadin.com/sampler#TableCellStyling
http://demo.vaadin.com/sampler#TableRowStyling
http://demo.vaadin.com/sampler#TableMouseEvents
and so forth…
This one doesn’t have this issue:
http://demo.vaadin.com/sampler#TableClickListeners
What’s the difference?
You can see what requests are sent and what is received in the replies using the “?debug” URL parameter before the fragment start hash character.
What seems to happen in the demos (at least some of which still use Vaadin 6.7.4) is that the client tells the server to sort by a specific column and requests rows to fill its buffer, but the server only returns enough rows for the visible part of the window. The client then requests more rows to fill its scroll buffer (based on page length and cache rate for the table).
More recent 6.7 versions and especially latest 6.7 nightly do change what is sent by the server somewhat, possibly eliminating problematic second requests in certain cases such as a partly visible first row. Note, though, that the second request for rows not currently on screen is not always necessarily a bad thing as it could improve responsiveness by allowing to display information quicker.
The click listeners example is not performing sorting and does not need to resend any rows from the server.
Yes, that’s what happens. Thanks. Caught it with the test:
package com.example.vaadintest;
import java.math.BigDecimal;
import java.util.Arrays;
import com.vaadin.Application;
import com.vaadin.data.Container;
import com.vaadin.data.util.BeanItemContainer;
import com.vaadin.ui.Table;
import com.vaadin.ui.Window;
public class VaadintestApplication extends Application {
public class Archive {
private BigDecimal id;
private String date;
private int nr1;
private BigDecimal nr2;
private BigDecimal nr3;
private BigDecimal nr4;
private BigDecimal nr5;
private BigDecimal nr6;
public Archive(BigDecimal id, String date, int nr1, BigDecimal nr2,
BigDecimal nr3, BigDecimal nr4, BigDecimal nr5, BigDecimal nr6) {
this.id = id;
this.date = date;
this.nr1 = nr1;
this.nr2 = nr2;
this.nr3 = nr3;
this.nr4 = nr4;
this.nr5 = nr5;
this.nr6 = nr6;
}
public BigDecimal getId() {
return id;
}
public void setId(BigDecimal id) {
this.id = id;
}
public String getDate() {
return date;
}
public void setDate(String date) {
this.date = date;
}
public int getNr1() {
return nr1;
}
public void setNr1(int nr1) {
this.nr1 = nr1;
}
public BigDecimal getNr2() {
return nr2;
}
public void setNr2(BigDecimal nr2) {
this.nr2 = nr2;
}
public BigDecimal getNr3() {
return nr3;
}
public void setNr3(BigDecimal nr3) {
this.nr3 = nr3;
}
public BigDecimal getNr4() {
return nr4;
}
public void setNr4(BigDecimal nr4) {
this.nr4 = nr4;
}
public BigDecimal getNr5() {
return nr5;
}
public void setNr5(BigDecimal nr5) {
this.nr5 = nr5;
}
public BigDecimal getNr6() {
return nr6;
}
public void setNr6(BigDecimal nr6) {
this.nr6 = nr6;
}
}
public final static Object[] NATURAL_COL_ORDER = new Object[]
{ "id",
"date", "nr1", "nr2", "nr3", "nr4", "nr5", "nr6" };
public static final String[] COLUMN_NAMES = { "Id", "Date", "Nr1", "Nr2",
"Nr3", "Nr4", "Nr5", "Nr6" };
class ArchiveTable extends Table {
public ArchiveTable() {
// this(new BeanItemContainer(Archive.class,
// Arrays.asList(new Archive[] { new Archive(1, "2012-1-1", 1, 2,
// 3, 4, 5, 6) })));
}
public ArchiveTable(Container dataSource) {
setContainerDataSource(dataSource);
setPageLength(10);
setCacheRate(1);
setColumnCollapsingAllowed(true);
setColumnReorderingAllowed(true);
setVisibleColumns(NATURAL_COL_ORDER);
setColumnHeaders(COLUMN_NAMES);
}
}
@Override
public void init() {
final Window mainWindow = new Window("Vaadintest Application");
setMainWindow(mainWindow);
ArchiveTable table = new ArchiveTable();
table.setContainerDataSource(new BeanItemContainer(Archive.class,
Arrays.asList(new Archive[] {
new Archive(new BigDecimal(1), "2012-1-1", 1,
new BigDecimal(1), new BigDecimal(1),
new BigDecimal(1), new BigDecimal(1),
new BigDecimal(1)),
new Archive(new BigDecimal(1), "2012-1-1", 1,
new BigDecimal(1), new BigDecimal(1),
new BigDecimal(1), new BigDecimal(1),
new BigDecimal(1)),
new Archive(new BigDecimal(1), "2012-1-1", 1,
new BigDecimal(1), new BigDecimal(1),
new BigDecimal(1), new BigDecimal(1),
new BigDecimal(1)),
new Archive(new BigDecimal(1), "2012-1-1", 1,
new BigDecimal(1), new BigDecimal(1),
new BigDecimal(1), new BigDecimal(1),
new BigDecimal(1)),
new Archive(new BigDecimal(1), "2012-1-1", 1,
new BigDecimal(1), new BigDecimal(1),
new BigDecimal(1), new BigDecimal(1),
new BigDecimal(1)),
new Archive(new BigDecimal(1), "2012-1-1", 1,
new BigDecimal(1), new BigDecimal(1),
new BigDecimal(1), new BigDecimal(1),
new BigDecimal(1)),
new Archive(new BigDecimal(1), "2012-1-1", 1,
new BigDecimal(1), new BigDecimal(1),
new BigDecimal(1), new BigDecimal(1),
new BigDecimal(1)),
new Archive(new BigDecimal(1), "2012-1-1", 1,
new BigDecimal(1), new BigDecimal(1),
new BigDecimal(1), new BigDecimal(1),
new BigDecimal(1)),
new Archive(new BigDecimal(1), "2012-1-1", 1,
new BigDecimal(1), new BigDecimal(1),
new BigDecimal(1), new BigDecimal(1),
new BigDecimal(1)),
new Archive(new BigDecimal(1), "2012-1-1", 1,
new BigDecimal(1), new BigDecimal(1),
new BigDecimal(1), new BigDecimal(1),
new BigDecimal(1)),
new Archive(new BigDecimal(1), "2012-1-1", 1,
new BigDecimal(1), new BigDecimal(1),
new BigDecimal(1), new BigDecimal(1),
new BigDecimal(1)),
new Archive(new BigDecimal(1), "2012-1-1", 1,
new BigDecimal(1), new BigDecimal(1),
new BigDecimal(1), new BigDecimal(1),
new BigDecimal(1)),
new Archive(new BigDecimal(1), "2012-1-1", 1,
new BigDecimal(1), new BigDecimal(1),
new BigDecimal(1), new BigDecimal(1),
new BigDecimal(1)),
new Archive(new BigDecimal(1), "2012-1-1", 1,
new BigDecimal(1), new BigDecimal(1),
new BigDecimal(1), new BigDecimal(1),
new BigDecimal(1)),
new Archive(new BigDecimal(1), "2012-1-1", 1,
new BigDecimal(1), new BigDecimal(1),
new BigDecimal(1), new BigDecimal(1),
new BigDecimal(1)),
new Archive(new BigDecimal(1), "2012-1-1", 1,
new BigDecimal(1), new BigDecimal(1),
new BigDecimal(1), new BigDecimal(1),
new BigDecimal(1)),
new Archive(new BigDecimal(1), "2012-1-1", 1,
new BigDecimal(1), new BigDecimal(1),
new BigDecimal(1), new BigDecimal(1),
new BigDecimal(1)),
new Archive(new BigDecimal(1), "2012-1-1", 1,
new BigDecimal(1), new BigDecimal(1),
new BigDecimal(1), new BigDecimal(1),
new BigDecimal(1)),
new Archive(new BigDecimal(1), "2012-1-1", 1,
new BigDecimal(1), new BigDecimal(1),
new BigDecimal(1), new BigDecimal(1),
new BigDecimal(1)),
new Archive(new BigDecimal(1), "2012-1-1", 1,
new BigDecimal(1), new BigDecimal(1),
new BigDecimal(1), new BigDecimal(1),
new BigDecimal(1)),
new Archive(new BigDecimal(1), "2012-1-1", 1,
new BigDecimal(1), new BigDecimal(1),
new BigDecimal(1), new BigDecimal(1),
new BigDecimal(1)),
new Archive(new BigDecimal(1), "2012-1-1", 1,
new BigDecimal(1), new BigDecimal(1),
new BigDecimal(1), new BigDecimal(1),
new BigDecimal(1)),
new Archive(new BigDecimal(1), "2012-1-1", 1,
new BigDecimal(1), new BigDecimal(1),
new BigDecimal(1), new BigDecimal(1),
new BigDecimal(1)),
new Archive(new BigDecimal(1), "2012-1-1", 1,
new BigDecimal(1), new BigDecimal(1),
new BigDecimal(1), new BigDecimal(1),
new BigDecimal(1)),
new Archive(new BigDecimal(1), "2012-1-1", 1,
new BigDecimal(1), new BigDecimal(1),
new BigDecimal(1), new BigDecimal(1),
new BigDecimal(1)),
new Archive(new BigDecimal(1), "2012-1-1", 1,
new BigDecimal(1), new BigDecimal(1),
new BigDecimal(1), new BigDecimal(1),
new BigDecimal(1)),
new Archive(new BigDecimal(1), "2012-1-1", 1,
new BigDecimal(1), new BigDecimal(1),
new BigDecimal(1), new BigDecimal(1),
new BigDecimal(1)),
new Archive(new BigDecimal(1), "2012-1-1", 1,
new BigDecimal(1), new BigDecimal(1),
new BigDecimal(1), new BigDecimal(1),
new BigDecimal(1)),
new Archive(new BigDecimal(1), "2012-1-1", 1,
new BigDecimal(1), new BigDecimal(1),
new BigDecimal(1), new BigDecimal(1),
new BigDecimal(1)),
new Archive(new BigDecimal(1), "2012-1-1", 1,
new BigDecimal(1), new BigDecimal(1),
new BigDecimal(1), new BigDecimal(1),
new BigDecimal(1)),
new Archive(new BigDecimal(1), "2012-1-1", 1,
new BigDecimal(1), new BigDecimal(1),
new BigDecimal(1), new BigDecimal(1),
new BigDecimal(1)) })));
table.setVisibleColumns(NATURAL_COL_ORDER);
mainWindow.addComponent(table);
mainWindow.addWindow(new Window());
}
}