Kaydet (Commit) fe88326d authored tarafından Noel Grandin's avatar Noel Grandin Kaydeden (comit) Markus Mohrhard

sc: convert SequenceMapping O(n^2) algorithm to O(n log(n)) tdf#85548

Change-Id: Ie0c819ac3f8b0c0b165e95ae5e58405a12c38472
Reviewed-on: https://gerrit.libreoffice.org/20753Reviewed-by: 's avatarMarkus Mohrhard <markus.mohrhard@googlemail.com>
Tested-by: 's avatarMarkus Mohrhard <markus.mohrhard@googlemail.com>
üst 3538e039
...@@ -1762,6 +1762,18 @@ bool RangeAnalyzer::inSameSingleColumn( RangeAnalyzer& rOther ) ...@@ -1762,6 +1762,18 @@ bool RangeAnalyzer::inSameSingleColumn( RangeAnalyzer& rOther )
return false; return false;
} }
OUString constructKey(const uno::Reference< chart2::data::XLabeledDataSequence>& xNew)
{
OUString key;
if( xNew->getLabel().is() )
key += xNew->getLabel()->getSourceRangeRepresentation();
key += "####";
if( xNew->getValues().is() )
key += xNew->getValues()->getSourceRangeRepresentation();
return key;
}
} //end anonymous namespace } //end anonymous namespace
uno::Sequence< beans::PropertyValue > SAL_CALL ScChart2DataProvider::detectArguments( uno::Sequence< beans::PropertyValue > SAL_CALL ScChart2DataProvider::detectArguments(
...@@ -1983,49 +1995,34 @@ uno::Sequence< beans::PropertyValue > SAL_CALL ScChart2DataProvider::detectArgum ...@@ -1983,49 +1995,34 @@ uno::Sequence< beans::PropertyValue > SAL_CALL ScChart2DataProvider::detectArgum
if( xDataSource.is() && xCompareDataSource.is() ) if( xDataSource.is() && xCompareDataSource.is() )
{ {
uno::Sequence< uno::Reference< chart2::data::XLabeledDataSequence> > aOldSequences( const uno::Sequence< uno::Reference< chart2::data::XLabeledDataSequence> >& aOldSequences =
xCompareDataSource->getDataSequences() ); xCompareDataSource->getDataSequences();
uno::Sequence< uno::Reference< chart2::data::XLabeledDataSequence > > aNewSequences( const uno::Sequence< uno::Reference< chart2::data::XLabeledDataSequence> >& aNewSequences =
xDataSource->getDataSequences()); xDataSource->getDataSequences();
OUString aOldLabel;
OUString aNewLabel;
OUString aOldValues;
OUString aNewValues;
for( sal_Int32 nNewIndex = 0; nNewIndex < aNewSequences.getLength(); nNewIndex++ ) std::map<OUString,sal_Int32> aOldEntryToIndex;
for( sal_Int32 nIndex = 0; nIndex < aOldSequences.getLength(); nIndex++ )
{ {
uno::Reference< chart2::data::XLabeledDataSequence> xNew( aNewSequences[nNewIndex] ); const uno::Reference< chart2::data::XLabeledDataSequence>& xOld( aOldSequences[nIndex] );
for( sal_Int32 nOldIndex = 0; nOldIndex < aOldSequences.getLength(); nOldIndex++ ) if( xOld.is() )
{ {
uno::Reference< chart2::data::XLabeledDataSequence> xOld( aOldSequences[nOldIndex] ); OUString key = constructKey(xOld);
aOldEntryToIndex[key] = nIndex;
if( xOld.is() && xNew.is() )
{
aOldLabel.clear();
aNewLabel.clear();
aOldValues.clear();
aNewValues.clear();
if( xOld.is() && xOld->getLabel().is() )
aOldLabel = xOld->getLabel()->getSourceRangeRepresentation();
if( xNew.is() && xNew->getLabel().is() )
aNewLabel = xNew->getLabel()->getSourceRangeRepresentation();
if( xOld.is() && xOld->getValues().is() )
aOldValues = xOld->getValues()->getSourceRangeRepresentation();
if( xNew.is() && xNew->getValues().is() )
aNewValues = xNew->getValues()->getSourceRangeRepresentation();
if( aOldLabel.equals(aNewLabel)
&& ( aOldValues.equals(aNewValues) ) )
{
if( nOldIndex!=nNewIndex )
bDifferentIndexes = true;
aSequenceMappingVector.push_back(nOldIndex);
break;
}
}
} }
} }
for( sal_Int32 nNewIndex = 0; nNewIndex < aNewSequences.getLength(); nNewIndex++ )
{
const uno::Reference< chart2::data::XLabeledDataSequence>& xNew( aNewSequences[nNewIndex] );
if( !xNew.is() )
continue;
OUString key = constructKey(xNew);
if (aOldEntryToIndex.find(key) == aOldEntryToIndex.end())
continue;
sal_Int32 nOldIndex = aOldEntryToIndex[key];
if( nOldIndex != nNewIndex )
bDifferentIndexes = true;
aSequenceMappingVector.push_back(nOldIndex);
}
} }
if( bDifferentIndexes && !aSequenceMappingVector.empty() ) if( bDifferentIndexes && !aSequenceMappingVector.empty() )
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment