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