sc/source/ui/unoobj/chart2uno.cxx | 73 ++++++++++++++++++-------------------- 1 file changed, 35 insertions(+), 38 deletions(-)
New commits: commit fe88326d35579f2c88efe96a45911affa9c9f174 Author: Noel Grandin <n...@peralex.com> Date: Thu Dec 17 12:07:54 2015 +0200 sc: convert SequenceMapping O(n^2) algorithm to O(n log(n)) tdf#85548 Change-Id: Ie0c819ac3f8b0c0b165e95ae5e58405a12c38472 Reviewed-on: https://gerrit.libreoffice.org/20753 Reviewed-by: Markus Mohrhard <markus.mohrh...@googlemail.com> Tested-by: Markus Mohrhard <markus.mohrh...@googlemail.com> diff --git a/sc/source/ui/unoobj/chart2uno.cxx b/sc/source/ui/unoobj/chart2uno.cxx index deb144f..51a159e 100644 --- a/sc/source/ui/unoobj/chart2uno.cxx +++ b/sc/source/ui/unoobj/chart2uno.cxx @@ -1762,6 +1762,18 @@ bool RangeAnalyzer::inSameSingleColumn( RangeAnalyzer& rOther ) 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 uno::Sequence< beans::PropertyValue > SAL_CALL ScChart2DataProvider::detectArguments( @@ -1983,49 +1995,34 @@ uno::Sequence< beans::PropertyValue > SAL_CALL ScChart2DataProvider::detectArgum if( xDataSource.is() && xCompareDataSource.is() ) { - uno::Sequence< uno::Reference< chart2::data::XLabeledDataSequence> > aOldSequences( - xCompareDataSource->getDataSequences() ); - uno::Sequence< uno::Reference< chart2::data::XLabeledDataSequence > > aNewSequences( - xDataSource->getDataSequences()); - - OUString aOldLabel; - OUString aNewLabel; - OUString aOldValues; - OUString aNewValues; + const uno::Sequence< uno::Reference< chart2::data::XLabeledDataSequence> >& aOldSequences = + xCompareDataSource->getDataSequences(); + const uno::Sequence< uno::Reference< chart2::data::XLabeledDataSequence> >& aNewSequences = + xDataSource->getDataSequences(); - 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] ); - for( sal_Int32 nOldIndex = 0; nOldIndex < aOldSequences.getLength(); nOldIndex++ ) + const uno::Reference< chart2::data::XLabeledDataSequence>& xOld( aOldSequences[nIndex] ); + if( xOld.is() ) { - uno::Reference< chart2::data::XLabeledDataSequence> xOld( aOldSequences[nOldIndex] ); - - 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; - } - } + OUString key = constructKey(xOld); + aOldEntryToIndex[key] = nIndex; } } + 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() ) _______________________________________________ Libreoffice-commits mailing list libreoffice-comm...@lists.freedesktop.org http://lists.freedesktop.org/mailman/listinfo/libreoffice-commits