tdf#148635 cache some chart stuff

cache some intermediate stuff that it does a handful of times when
finishing a chart - halves the time taken

Change-Id: I75c5621844d4309b64e64219a7c9e2bcd344ce36
Reviewed-on: https://gerrit.libreoffice.org/c/core/+/133173
Tested-by: Jenkins
Reviewed-by: Noel Grandin <noel.grandin@collabora.co.uk>
This commit is contained in:
Noel Grandin
2022-04-19 14:24:46 +02:00
parent 6500106dff
commit fd2ca96074
3 changed files with 33 additions and 13 deletions

View File

@@ -1118,7 +1118,8 @@ public:
private: //member private: //member
std::shared_ptr< Chart2ModelContact > m_spChart2ModelContact; std::shared_ptr< Chart2ModelContact > m_spChart2ModelContact;
mutable Any m_aOuterValue; mutable Any m_aOuterValue;
mutable bool m_bDetectedRangeSegmentation { false };
}; };
} }
@@ -1172,15 +1173,19 @@ Any WrappedDataRowSourceProperty::getPropertyValue( const Reference< beans::XPro
bool bHasCategories = true; bool bHasCategories = true;
uno::Sequence< sal_Int32 > aSequenceMapping; uno::Sequence< sal_Int32 > aSequenceMapping;
if( DataSourceHelper::detectRangeSegmentation( if (!m_bDetectedRangeSegmentation)
m_spChart2ModelContact->getDocumentModel(), aRangeString, aSequenceMapping, bUseColumns
, bFirstCellAsLabel, bHasCategories ) )
{ {
css::chart::ChartDataRowSource eChartDataRowSource = css::chart::ChartDataRowSource_ROWS; if( DataSourceHelper::detectRangeSegmentation(
if(bUseColumns) m_spChart2ModelContact->getDocumentModel(), aRangeString, aSequenceMapping, bUseColumns
eChartDataRowSource = css::chart::ChartDataRowSource_COLUMNS; , bFirstCellAsLabel, bHasCategories ) )
{
css::chart::ChartDataRowSource eChartDataRowSource = css::chart::ChartDataRowSource_ROWS;
if(bUseColumns)
eChartDataRowSource = css::chart::ChartDataRowSource_COLUMNS;
m_aOuterValue <<= eChartDataRowSource; m_aOuterValue <<= eChartDataRowSource;
}
m_bDetectedRangeSegmentation = true;
} }
return m_aOuterValue; return m_aOuterValue;

View File

@@ -147,6 +147,10 @@ private:
ScDocument* m_pDocument; ScDocument* m_pDocument;
SfxItemPropertySet m_aPropSet; SfxItemPropertySet m_aPropSet;
bool m_bIncludeHiddenCells; bool m_bIncludeHiddenCells;
css::uno::Reference< css::chart2::data::XDataSource > mxCachedDataSource;
css::uno::Sequence< css::beans::PropertyValue > maCachedArguments;
css::uno::Sequence< css::beans::PropertyValue > maCreateDataSourceArguments;
css::uno::Reference< css::chart2::data::XDataSource > mxCreatedDataSource;
}; };
// DataSource // DataSource

View File

@@ -1403,7 +1403,11 @@ ScChart2DataProvider::createDataSource(
if ( ! m_pDocument ) if ( ! m_pDocument )
throw uno::RuntimeException(); throw uno::RuntimeException();
uno::Reference< chart2::data::XDataSource> xResult; // This is expensive to compute and we get called more than once, so cache
if (maCreateDataSourceArguments == aArguments)
return mxCreatedDataSource;
maCreateDataSourceArguments = aArguments;
bool bLabel = true; bool bLabel = true;
bool bCategories = false; bool bCategories = false;
bool bOrientCol = true; bool bOrientCol = true;
@@ -1490,7 +1494,7 @@ ScChart2DataProvider::createDataSource(
const Chart2PositionMap* pChartMap = aChPositioner.getPositionMap(); const Chart2PositionMap* pChartMap = aChPositioner.getPositionMap();
if (!pChartMap) if (!pChartMap)
// No chart position map instance. Bail out. // No chart position map instance. Bail out.
return xResult; return mxCreatedDataSource;
rtl::Reference<ScChart2DataSource> pDS; rtl::Reference<ScChart2DataSource> pDS;
::std::vector< uno::Reference< chart2::data::XLabeledDataSequence > > aSeqs; ::std::vector< uno::Reference< chart2::data::XLabeledDataSequence > > aSeqs;
@@ -1568,8 +1572,8 @@ ScChart2DataProvider::createDataSource(
} }
} }
xResult.set( pDS ); mxCreatedDataSource.set(pDS);
return xResult; return mxCreatedDataSource;
} }
namespace namespace
@@ -1761,6 +1765,10 @@ std::pair<OUString, OUString> constructKey(const uno::Reference< chart2::data::X
uno::Sequence< beans::PropertyValue > SAL_CALL ScChart2DataProvider::detectArguments( uno::Sequence< beans::PropertyValue > SAL_CALL ScChart2DataProvider::detectArguments(
const uno::Reference< chart2::data::XDataSource >& xDataSource ) const uno::Reference< chart2::data::XDataSource >& xDataSource )
{ {
// Cache these because this is expensive to compute and we get called more than once
if (xDataSource == mxCachedDataSource)
return maCachedArguments;
::std::vector< beans::PropertyValue > aResult; ::std::vector< beans::PropertyValue > aResult;
bool bRowSourceDetected = false; bool bRowSourceDetected = false;
bool bFirstCellAsLabel = false; bool bFirstCellAsLabel = false;
@@ -2026,7 +2034,10 @@ uno::Sequence< beans::PropertyValue > SAL_CALL ScChart2DataProvider::detectArgum
} }
} }
return comphelper::containerToSequence( aResult ); mxCachedDataSource = xDataSource;
maCachedArguments = comphelper::containerToSequence( aResult );
return maCachedArguments;
} }
sal_Bool SAL_CALL ScChart2DataProvider::createDataSequenceByRangeRepresentationPossible( const OUString& aRangeRepresentation ) sal_Bool SAL_CALL ScChart2DataProvider::createDataSequenceByRangeRepresentationPossible( const OUString& aRangeRepresentation )