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:
@@ -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;
|
||||||
|
@@ -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
|
||||||
|
@@ -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 )
|
||||||
|
Reference in New Issue
Block a user