My ListGrid doesn't updates well with updateCaches when the DataSource contains a <whereClause>.
Attached a minimal testcase:
DataSource1:
DataSource2:
Note that DataSource2 contains a whereClause.
In the code, I am trying to update the second listgrid which uses datasource2. The whereClause is not respected. After pressing the button, all records are being shown, discarding the whereClause. So if we have a record with continent=America, it will be shown in listGrid2, although its whereClause says: continent=Europe.
Is this a bug or am I doing something wrong?
Using Smartgwt 3.1p (v9.0p_2013-09-25)
Attached a minimal testcase:
Code:
public class TestingModule implements EntryPoint {
public void onModuleLoad() {
final ListGrid countryList = new ListGrid();
countryList.setWidth(500);
countryList.setAlternateRecordStyles(true);
countryList.setDataSource(DataSource.get("worldDSExport"));
countryList.setAutoFetchData(true);
ListGridField pk = new ListGridField("pk");
pk.setHidden(true);
ListGridField countryName = new ListGridField("countryName", "Country");
ListGridField capital = new ListGridField("capital", "Capital");
ListGridField continent = new ListGridField("continent", "Continent");
countryList.setFields(pk, countryName, capital, continent);
countryList.setAutoFitData(Autofit.VERTICAL);
countryList.setShowFilterEditor(true);
countryList.setAutoFitMaxRecords(10);
VLayout layout = new VLayout(15);
layout.setHeight(300);
HLayout formLayout = new HLayout(15);
IButton addBtn = new IButton("Correct capital");
addBtn.addClickHandler(new ClickHandler() {
@Override
public void onClick(ClickEvent event) {
Record updateRecord = new Record();
updateRecord.setAttribute("pk", 3);
updateRecord.setAttribute("capital", "Washington");
DataSource.get("worldDSExport").updateData(updateRecord, new DSCallback() {
@Override
public void execute(DSResponse dsResponse, Object data, DSRequest dsRequest) {
Criteria c = new Criteria();
c.addCriteria("countryName", "USA");
DataSource.get("worldDSExport").fetchData(c, new DSCallback() {
@Override
public void execute(DSResponse dsResponse, Object data, DSRequest dsRequest) {
for (Record rec: dsResponse.getData()) {
DSResponse simulatedResponse = new DSResponse();
simulatedResponse.setOperationType(DSOperationType.UPDATE);
simulatedResponse.setDataSource("worldDSExport2");
simulatedResponse.setData(new ListGridRecord(rec.getJsObj()));
System.out.println("PK: " + rec.getAttribute("pk"));
DataSource.get("worldDSExport2").updateCaches(simulatedResponse);
}
}
});
}
});
}
});
formLayout.addMember(addBtn);
layout.addMember(formLayout);
layout.addMember(countryList);
final ListGrid countryList2 = new ListGrid();
countryList2.setWidth(500);
countryList2.setAlternateRecordStyles(true);
countryList2.setDataSource(DataSource.get("worldDSExport2"));
countryList2.setAutoFetchData(false);
ListGridField pk2 = new ListGridField("pk");
pk2.setHidden(true);
ListGridField countryName2 = new ListGridField("countryName", "Country");
ListGridField capital2 = new ListGridField("capital", "Capital");
ListGridField continent2 = new ListGridField("continent", "Continent");
countryList2.setFields(pk2, countryName2, capital2, continent2);
countryList2.setAutoFitData(Autofit.VERTICAL);
countryList2.setShowFilterEditor(true);
countryList2.setAutoFitMaxRecords(10);
countryList2.fetchData();
layout.addMember(countryList2);
layout.draw();
}
}
Code:
<DataSource
ID="worldDSExport"
tableName="worldDS"
serverType="sql"
>
<fields>
<field name="pk" type="integer" hidden="true" primaryKey="true" />
<field name="countryCode" type="text" required="true" />
<field name="countryName" type="text" required="true" />
<field name="capital" type="text" />
<field name="government" type="text" length="500" />
<field name="continent" type="text" >
</field>
<field name="independence" type="date" />
<field name="area" type="float" />
<field name="population" type="integer" />
<field name="gdp" type="float" />
<field name="member_g8" type="boolean" />
</fields>
</DataSource>
Code:
<DataSource
ID="worldDSExport2"
tableName="worldDS"
serverType="sql"
>
<fields>
<field name="pk" type="integer" hidden="true" primaryKey="true" />
<field name="countryCode" type="text" required="true" />
<field name="countryName" type="text" required="true" />
<field name="capital" type="text" />
<field name="government" type="text" length="500" />
<field name="continent" type="text" >
</field>
<field name="independence" type="date" />
<field name="area" type="float" />
<field name="population" type="integer" />
<field name="gdp" type="float" />
<field name="member_g8" type="boolean" />
</fields>
<operationBindings>
<operationBinding operationType="fetch" >
<whereClause>
continent = 'Europe'
</whereClause>
</operationBinding>
</operationBindings>
</DataSource>
In the code, I am trying to update the second listgrid which uses datasource2. The whereClause is not respected. After pressing the button, all records are being shown, discarding the whereClause. So if we have a record with continent=America, it will be shown in listGrid2, although its whereClause says: continent=Europe.
Is this a bug or am I doing something wrong?
Using Smartgwt 3.1p (v9.0p_2013-09-25)
Comment