Blame SOURCES/0003-fdo-72645-Case-insensitive-string-comparison-in-GETP.patch

f0633d
From 7c4a58833df3931c168c57be3239e904e3a3baba Mon Sep 17 00:00:00 2001
f0633d
From: Kohei Yoshida <kohei.yoshida@collabora.com>
f0633d
Date: Tue, 7 Jan 2014 00:48:10 -0500
f0633d
Subject: [PATCH 3/9] fdo#72645: Case-insensitive string comparison in
f0633d
 GETPIVOTDATA.
f0633d
f0633d
Change-Id: Ibdb2b7ab2bae03875a3462816e860f58d9076457
f0633d
Reviewed-on: https://gerrit.libreoffice.org/7285
f0633d
Reviewed-by: Eike Rathke <erack@redhat.com>
f0633d
Tested-by: Eike Rathke <erack@redhat.com>
f0633d
---
f0633d
 sc/source/core/data/dpobject.cxx    | 12 +++++++-----
f0633d
 sc/source/core/data/dpresfilter.cxx | 29 +++++++++++++++++++++--------
f0633d
 2 files changed, 28 insertions(+), 13 deletions(-)
f0633d
f0633d
diff --git a/sc/source/core/data/dpobject.cxx b/sc/source/core/data/dpobject.cxx
f0633d
index 3d9f5af..f9344aa 100644
f0633d
--- a/sc/source/core/data/dpobject.cxx
f0633d
+++ b/sc/source/core/data/dpobject.cxx
f0633d
@@ -1321,24 +1321,24 @@ namespace {
f0633d
 
f0633d
 class FindByName : std::unary_function<const ScDPSaveDimension*, bool>
f0633d
 {
f0633d
-    OUString maName;
f0633d
+    OUString maName; // must be all uppercase.
f0633d
 public:
f0633d
     FindByName(const OUString& rName) : maName(rName) {}
f0633d
     bool operator() (const ScDPSaveDimension* pDim) const
f0633d
     {
f0633d
         // Layout name takes precedence.
f0633d
         const OUString* pLayoutName = pDim->GetLayoutName();
f0633d
-        if (pLayoutName && *pLayoutName == maName)
f0633d
+        if (pLayoutName && ScGlobal::pCharClass->uppercase(*pLayoutName) == maName)
f0633d
             return true;
f0633d
 
f0633d
         sheet::GeneralFunction eGenFunc = static_cast<sheet::GeneralFunction>(pDim->GetFunction());
f0633d
         ScSubTotalFunc eFunc = ScDPUtil::toSubTotalFunc(eGenFunc);
f0633d
         OUString aSrcName = ScDPUtil::getSourceDimensionName(pDim->GetName());
f0633d
         OUString aFuncName = ScDPUtil::getDisplayedMeasureName(aSrcName, eFunc);
f0633d
-        if (maName == aFuncName)
f0633d
+        if (maName == ScGlobal::pCharClass->uppercase(aFuncName))
f0633d
             return true;
f0633d
 
f0633d
-        return maName == aSrcName;
f0633d
+        return maName == ScGlobal::pCharClass->uppercase(aSrcName);
f0633d
     }
f0633d
 };
f0633d
 
f0633d
@@ -1382,7 +1382,9 @@ double ScDPObject::GetPivotData(const OUString& rDataFieldName, std::vector
f0633d
         return fRet;
f0633d
 
f0633d
     std::vector<const ScDPSaveDimension*>::iterator it = std::find_if(
f0633d
-        aDataDims.begin(), aDataDims.end(), FindByName(rDataFieldName));
f0633d
+        aDataDims.begin(), aDataDims.end(),
f0633d
+        FindByName(ScGlobal::pCharClass->uppercase(rDataFieldName)));
f0633d
+
f0633d
     if (it == aDataDims.end())
f0633d
         return fRet;
f0633d
 
f0633d
diff --git a/sc/source/core/data/dpresfilter.cxx b/sc/source/core/data/dpresfilter.cxx
f0633d
index 41b2d7e..d4895b8 100644
f0633d
--- a/sc/source/core/data/dpresfilter.cxx
f0633d
+++ b/sc/source/core/data/dpresfilter.cxx
f0633d
@@ -10,6 +10,7 @@
f0633d
 #include "dpresfilter.hxx"
f0633d
 #include "global.hxx"
f0633d
 
f0633d
+#include <unotools/charclass.hxx>
f0633d
 #include <rtl/math.hxx>
f0633d
 
f0633d
 #include <com/sun/star/sheet/DataPilotFieldFilter.hpp>
f0633d
@@ -113,12 +114,13 @@ void ScDPResultTree::add(
f0633d
 
f0633d
         // See if this dimension exists.
f0633d
         DimensionsType& rDims = pMemNode->maChildDimensions;
f0633d
-        DimensionsType::iterator itDim = rDims.find(filter.maDimName);
f0633d
+        OUString aUpperName = ScGlobal::pCharClass->uppercase(filter.maDimName);
f0633d
+        DimensionsType::iterator itDim = rDims.find(aUpperName);
f0633d
         if (itDim == rDims.end())
f0633d
         {
f0633d
             // New dimenison.  Insert it.
f0633d
             std::pair<DimensionsType::iterator, bool> r =
f0633d
-                rDims.insert(DimensionsType::value_type(filter.maDimName, new DimensionNode(pMemNode)));
f0633d
+                rDims.insert(DimensionsType::value_type(aUpperName, new DimensionNode(pMemNode)));
f0633d
 
f0633d
             if (!r.second)
f0633d
                 // Insertion failed!
f0633d
@@ -132,13 +134,14 @@ void ScDPResultTree::add(
f0633d
         // Now, see if this dimension member exists.
f0633d
         DimensionNode* pDim = itDim->second;
f0633d
         MembersType& rMembers = pDim->maChildMembers;
f0633d
-        MembersType::iterator itMem = rMembers.find(filter.maValue);
f0633d
+        aUpperName = ScGlobal::pCharClass->uppercase(filter.maValue);
f0633d
+        MembersType::iterator itMem = rMembers.find(aUpperName);
f0633d
         if (itMem == rMembers.end())
f0633d
         {
f0633d
             // New member.  Insert it.
f0633d
             std::pair<MembersType::iterator, bool> r =
f0633d
                 rMembers.insert(
f0633d
-                    MembersType::value_type(filter.maValue, new MemberNode(pDim)));
f0633d
+                    MembersType::value_type(aUpperName, new MemberNode(pDim)));
f0633d
 
f0633d
             if (!r.second)
f0633d
                 // Insertion failed!
f0633d
@@ -153,7 +156,10 @@ void ScDPResultTree::add(
f0633d
 
f0633d
     if (pDimName && pMemName)
f0633d
     {
f0633d
-        NamePairType aNames(*pDimName, *pMemName);
f0633d
+        NamePairType aNames(
f0633d
+            ScGlobal::pCharClass->uppercase(*pDimName),
f0633d
+            ScGlobal::pCharClass->uppercase(*pMemName));
f0633d
+
f0633d
         LeafValuesType::iterator it = maLeafValues.find(aNames);
f0633d
         if (it == maLeafValues.end())
f0633d
         {
f0633d
@@ -197,13 +203,17 @@ const ScDPResultTree::ValuesType* ScDPResultTree::getResults(
f0633d
     const MemberNode* pMember = mpRoot;
f0633d
     for (; p != pEnd; ++p)
f0633d
     {
f0633d
-        DimensionsType::const_iterator itDim = pMember->maChildDimensions.find(p->FieldName);
f0633d
+        DimensionsType::const_iterator itDim = pMember->maChildDimensions.find(
f0633d
+            ScGlobal::pCharClass->uppercase(p->FieldName));
f0633d
+
f0633d
         if (itDim == pMember->maChildDimensions.end())
f0633d
             // Specified dimension not found.
f0633d
             return NULL;
f0633d
 
f0633d
         const DimensionNode* pDim = itDim->second;
f0633d
-        MembersType::const_iterator itMem = pDim->maChildMembers.find(p->MatchValue);
f0633d
+        MembersType::const_iterator itMem = pDim->maChildMembers.find(
f0633d
+            ScGlobal::pCharClass->uppercase(p->MatchValue));
f0633d
+
f0633d
         if (itMem == pDim->maChildMembers.end())
f0633d
             // Specified member not found.
f0633d
             return NULL;
f0633d
@@ -216,7 +226,10 @@ const ScDPResultTree::ValuesType* ScDPResultTree::getResults(
f0633d
 
f0633d
 double ScDPResultTree::getLeafResult(const com::sun::star::sheet::DataPilotFieldFilter& rFilter) const
f0633d
 {
f0633d
-    NamePairType aPair(rFilter.FieldName, rFilter.MatchValue);
f0633d
+    NamePairType aPair(
f0633d
+        ScGlobal::pCharClass->uppercase(rFilter.FieldName),
f0633d
+        ScGlobal::pCharClass->uppercase(rFilter.MatchValue));
f0633d
+
f0633d
     LeafValuesType::const_iterator it = maLeafValues.find(aPair);
f0633d
     if (it != maLeafValues.end())
f0633d
         // Found!
f0633d
-- 
f0633d
1.8.4.2
f0633d