0
0
mirror of https://github.com/fralx/LimeReport.git synced 2024-12-24 00:33:02 +03:00

Group functions rendering has been optimized

This commit is contained in:
Arin Alexander 2019-10-08 13:51:10 +03:00
parent 109e216281
commit 9b914b05fd
2 changed files with 63 additions and 22 deletions

View File

@ -189,11 +189,45 @@ void ReportRender::initDatasource(const QString& name){
} }
} }
void ReportRender::analizeItem(ContentItemDesignIntf* contentItem, BandDesignIntf* band){
if (contentItem){
QString content = contentItem->content();
QVector<QString> functions;
foreach(const QString &functionName, m_datasources->groupFunctionNames()){
QRegExp rx(QString(Const::GROUP_FUNCTION_RX).arg(functionName));
rx.setMinimal(true);
if (rx.indexIn(content)>=0){
functions.append(functionName);
}
}
if (functions.size()>0)
m_groupfunctionItems.insert(contentItem->patternName(), functions);
}
}
void ReportRender::analizeContainer(BaseDesignIntf* item, BandDesignIntf* band){
foreach(BaseDesignIntf* child, item->childBaseItems()){
ContentItemDesignIntf* contentItem = dynamic_cast<ContentItemDesignIntf*>(child);
if (contentItem) analizeItem(contentItem, band);
else analizeContainer(child, band);
}
}
void ReportRender::analizePage(PageItemDesignIntf* patternPage){
foreach(BandDesignIntf* band, patternPage->bands()){
if (band->isFooter() || band->isHeader()){
analizeContainer(band,band);
}
}
}
void ReportRender::renderPage(PageItemDesignIntf* patternPage, bool isTOC, bool /*isFirst*/, bool /*resetPageNumbers*/) void ReportRender::renderPage(PageItemDesignIntf* patternPage, bool isTOC, bool /*isFirst*/, bool /*resetPageNumbers*/)
{ {
m_currentNameIndex = 0; m_currentNameIndex = 0;
m_patternPageItem = patternPage; m_patternPageItem = patternPage;
analizePage(patternPage);
if (m_patternPageItem->resetPageNumber() && m_pageCount>0 && !isTOC) { if (m_patternPageItem->resetPageNumber() && m_pageCount>0 && !isTOC) {
resetPageNumber(PageReset); resetPageNumber(PageReset);
} }
@ -380,33 +414,34 @@ void ReportRender::extractGroupFunctions(BandDesignIntf *band)
extractGroupFunctionsFromContainer(band, band); extractGroupFunctionsFromContainer(band, band);
} }
void ReportRender::replaceGroupFunctionsInItem(ContentItemDesignIntf* contentItem, BandDesignIntf* band){ void ReportRender::replaceGroupFunctionsInItem(ContentItemDesignIntf* contentItem, BandDesignIntf* band){
if (contentItem){ if (contentItem){
QString content = contentItem->content(); if (m_groupfunctionItems.contains(contentItem->patternName())){
foreach(const QString &functionName, m_datasources->groupFunctionNames()){ QString content = contentItem->content();
QRegExp rx(QString(Const::GROUP_FUNCTION_RX).arg(functionName)); foreach(QString functionName, m_groupfunctionItems.value(contentItem->patternName())){
rx.setMinimal(true); QRegExp rx(QString(Const::GROUP_FUNCTION_RX).arg(functionName));
if (rx.indexIn(content)>=0){ rx.setMinimal(true);
int pos = 0; if (rx.indexIn(content)>=0){
while ( (pos = rx.indexIn(content,pos))!= -1 ){ int pos = 0;
QVector<QString> captures = normalizeCaptures(rx); while ( (pos = rx.indexIn(content,pos))!= -1 ){
if (captures.size() >= 3){ QVector<QString> captures = normalizeCaptures(rx);
QString expressionIndex = datasources()->putGroupFunctionsExpressions(captures.at(Const::VALUE_INDEX)); if (captures.size() >= 3){
if (captures.size()<5){ QString expressionIndex = datasources()->putGroupFunctionsExpressions(captures.at(Const::VALUE_INDEX));
content.replace(captures.at(0),QString("%1(%2,%3)").arg(functionName).arg('"'+expressionIndex+'"').arg('"'+band->objectName()+'"')); if (captures.size()<5){
} else { content.replace(captures.at(0),QString("%1(%2,%3)").arg(functionName).arg('"'+expressionIndex+'"').arg('"'+band->objectName()+'"'));
content.replace(captures.at(0),QString("%1(%2,%3,%4)") } else {
.arg(functionName) content.replace(captures.at(0),QString("%1(%2,%3,%4)")
.arg('"'+expressionIndex+'"') .arg(functionName)
.arg('"'+band->objectName()+'"') .arg('"'+expressionIndex+'"')
.arg(captures.at(4))); .arg('"'+band->objectName()+'"')
.arg(captures.at(4)));
}
} }
pos += rx.matchedLength();
} }
pos += rx.matchedLength();
} }
contentItem->setContent(content);
} }
contentItem->setContent(content);
} }
} }
} }

View File

@ -82,6 +82,7 @@ private:
int m_TOCRangeIndex; int m_TOCRangeIndex;
}; };
class ReportRender: public QObject class ReportRender: public QObject
{ {
Q_OBJECT Q_OBJECT
@ -109,6 +110,10 @@ signals:
public slots: public slots:
void cancelRender(); void cancelRender();
private: private:
void analizeContainer(BaseDesignIntf *item, BandDesignIntf *band);
void analizeItem(ContentItemDesignIntf *item, BandDesignIntf *band);
void analizePage(PageItemDesignIntf *patternPage);
void initDatasources(); void initDatasources();
void initDatasource(const QString &name); void initDatasource(const QString &name);
void initRenderPage(); void initRenderPage();
@ -193,7 +198,7 @@ private:
QMultiMap< BandDesignIntf*, GroupBandsHolder* > m_childBands; QMultiMap< BandDesignIntf*, GroupBandsHolder* > m_childBands;
QList<BandDesignIntf*> m_reprintableBands; QList<BandDesignIntf*> m_reprintableBands;
QList<BandDesignIntf*> m_recalcBands; QList<BandDesignIntf*> m_recalcBands;
QMap<QString, QVector<QString>> m_groupfunctionItems;
int m_currentIndex; int m_currentIndex;
int m_pageCount; int m_pageCount;
@ -217,6 +222,7 @@ private:
bool m_newPageStarted; bool m_newPageStarted;
bool m_lostHeadersMoved; bool m_lostHeadersMoved;
}; };
} // namespace LimeReport } // namespace LimeReport
#endif // LRREPORTRENDER_H #endif // LRREPORTRENDER_H