Home
Designing Analytics Reports
Improvement of performance for the dynamic table
Migrateduser
<p>Hi, I am generating a dynamic table using the following script.</p>
<p>But it takes too long. Please suggest something to improve the performance.<br>
I think it is due to adding of individual cell in the for loop. Unfortunately org.eclipse.birt.report.model.api.SlotHanle class does not have addall() method. Is there an alternative?</p>
<p> </p>
<p><span style="font-size:12px;">function preQueryDataSet(dataSetName) {<br>
var resultIterator;<br>
var queryResult;<br>
var dataReq;<br><br>
try {<br>
<br>
var dataSourceName = reportContext.getDesignHandle().findDataSet(dataSetName).getDataSourceName(); //Get DataSource Name from DataSet<br>
<br>
importPackage(Packages.java.io);<br>
importClass(org.eclipse.birt.data.engine.api.querydefn.QueryDefinition);<br>
importClass(org.eclipse.birt.report.data.adapter.api.DataRequestSession);<br>
importClass(org.eclipse.birt.report.data.adapter.api.DataSessionContext);<br><br>
// Run preQuery data set<br>
var myconfig = reportContext.getReportRunnable().getReportEngine().getConfig(); //Get report engine configurations<br>
var dataSource = reportContext.getDesignHandle().findDataSource(dataSourceName); //Get DataSource handle for "DATA_SOURCE_NAME"<br>
var dataSet = reportContext.getDesignHandle().findDataSet(dataSetName); //Get DataSet handle for "DATA_SET_NAME"<br><br>
var scriptCtx = _jsContext.getScriptContext(); //Get JavaScript context<br>
var ctx = new DataSessionContext(DataSessionContext.MODE_DIRECT_PRESENTATION, reportContext.getDesignHandle(), scriptCtx, null); //Get DataSession context<br>
dataReq = DataRequestSession.newSession(myconfig, ctx); //Get DataRequestSessionImpl (handle/object?)<br>
var modelAdapter = dataReq.getModelAdaptor(); //Get DataModelAdapter (handle/object?)<br>
var odaDataSource = modelAdapter.adaptDataSource(dataSource); //Get OdaDataSourceAdapter (handle/object?)<br>
var odaDataSet = modelAdapter.adaptDataSet(dataSet); //Get OdaDataSetAdapter (handle/object?)<br>
<br>
odaDataSet.setDataSource(dataSourceName); //Set DataSource to "DATA_SOURCE_NAME"<br><br>
dataReq.defineDataSource(odaDataSource);<br>
dataReq.defineDataSet(odaDataSet);<br>
<br>
var queryDefinition = new QueryDefinition();<br>
queryDefinition.setAutoBinding(true);<br><br>
queryDefinition.setDataSetName(odaDataSet.getName());<br><br>
var pq = dataReq.prepare(queryDefinition);<br>
queryResult = pq.execute(null);<br>
resultIterator = queryResult.getResultIterator();<br><br>
dataSetLogic(resultIterator); //Pass resultIterator to DataSetLogic function.<br>
}<br>
finally {<br>
//Close up<br>
if (resultIterator != null) {<br>
java.util.logging.Logger.getLogger("birt.report.logger").info("resultIterator.close()");<br>
resultIterator.close();<br>
}<br>
if (queryResult != null) {<br>
java.util.logging.Logger.getLogger("birt.report.logger").info("queryResult.close()");<br>
queryResult.close();<br>
}<br>
if (dataReq != null) {<br>
java.util.logging.Logger.getLogger("birt.report.logger").info("dataReq.shutdown()");<br>
dataReq.shutdown();<br>
}<br>
}<br>
}<br><br>
function dataSetLogic(resultIterator) {<br><br>
var cc = resultIterator.getResultMetaData().getColumnCount(); //Get column count<br><br>
var rsmd = resultIterator.getResultMetaData(); //Get metadata handle.<br><br>
importPackage(Packages.org.eclipse.birt.report.model.api);<br><br>
//get a reference to the ElementFactory<br>
var elementFactory = reportContext.getReportRunnable().designHandle.getElementFactory();<br><br>
//create a new table element<br>
var rptTable = elementFactory.newTableItem("rptTable", 0, 1, 0, 0); //(java.lang.String name, int columnNum, int headerRow, int detailRow, int footerRow)<br>
rptTable.setWidth("100%"); //Set table width<br>
reportContext.getReportRunnable().designHandle.getBody().add(rptTable); //Add table element to report body<br><br><br>
for (var i = 0; i < cc; i++) {<br>
rptTable.insertColumn(i, 1);<br><br>
var label = elementFactory.newLabel("Label"); //create label<br>
label.setText(rsmd.getColumnName(i + 1)); //set label text<br><br>
var tableCell = rptTable.getHeader().get(0).getCells().get(i); //get table cell<br>
tableCell.getContent().add(label); //add label to table cell<br>
}<br><br>
var rowNumber = -1; //Start counter with -1 so first<br>
while (resultIterator.next()) { //Loop through each row in the entire Data Set (iResultIterator)<br><br>
rowNumber++; //add row number<br>
rptTable.insertRow(new RowOperationParameters(2, -1, rowNumber)); //insert row<br><br>
for (var i = 0; i < cc; i++) { //Loop through each column in the row.<br><br>
<strong> var label = elementFactory.newLabel("Label"); //create label element<br>
label.setText(resultIterator.getValue(rsmd.getColumnName(i + 1))); //set "Name" text. *Note: Add 1 as column's start with 1 rather than 0<br><br>
var tableCell = rptTable.getDetail().get(rowNumber).getCells().get(i); //get table cell<br>
tableCell.getContent().add(label); //add label to cell</strong><br>
}<br>
}<br>
}<br>
//
</span></p>
<p> </p>
<p> </p>
<p>Thanks for the suggstions.</p>
Find more posts tagged with
Comments
There are no comments yet