[Libreoffice-commits] core.git: Branch 'private/kohei/calc-shared-string' - sc/source

Kohei Yoshida kohei.yoshida at collabora.com
Wed Oct 9 07:49:07 PDT 2013


 sc/source/core/data/table3.cxx |   38 ++++++++++++++++++++++++++------------
 1 file changed, 26 insertions(+), 12 deletions(-)

New commits:
commit b990aa69c50ff1af0193e1a036fe20d315185a9b
Author: Kohei Yoshida <kohei.yoshida at collabora.com>
Date:   Wed Oct 9 10:50:23 2013 -0400

    Use shared string's fast equality check for ValidQuery().
    
    Change-Id: Ib84087a10cc10a7533e64c4e8998354b52017df7

diff --git a/sc/source/core/data/table3.cxx b/sc/source/core/data/table3.cxx
index 10c7ca7..1e21621 100644
--- a/sc/source/core/data/table3.cxx
+++ b/sc/source/core/data/table3.cxx
@@ -1196,7 +1196,8 @@ namespace {
 
 class QueryEvaluator
 {
-    const ScDocument& mrDoc;
+    ScDocument& mrDoc;
+    svl::SharedStringPool& mrStrPool;
     const ScTable& mrTab;
     const ScQueryParam& mrParam;
     const bool* mpTestEqualCondition;
@@ -1259,9 +1260,10 @@ class QueryEvaluator
     }
 
 public:
-    QueryEvaluator(const ScDocument& rDoc, const ScTable& rTab, const ScQueryParam& rParam,
+    QueryEvaluator(ScDocument& rDoc, const ScTable& rTab, const ScQueryParam& rParam,
                    const bool* pTestEqualCondition) :
         mrDoc(rDoc),
+        mrStrPool(rDoc.GetSharedStringPool()),
         mrTab(rTab),
         mrParam(rParam),
         mpTestEqualCondition(pTestEqualCondition),
@@ -1405,7 +1407,7 @@ public:
         bool bOk = false;
         bool bTestEqual = false;
         bool bMatchWholeCell = mbMatchWholeCell;
-        OUString  aCellStr;
+        svl::SharedString aCellStr;
         if (isPartialTextMatchOp(rEntry))
             // may have to do partial textural comparison.
             bMatchWholeCell = false;
@@ -1415,16 +1417,24 @@ public:
             if (rCell.meType == CELLTYPE_FORMULA && rCell.mpFormula->GetErrCode())
             {
                 // Error cell is evaluated as string (for now).
-                aCellStr = ScGlobal::GetErrorString(rCell.mpFormula->GetErrCode());
+                aCellStr = mrStrPool.intern(ScGlobal::GetErrorString(rCell.mpFormula->GetErrCode()));
             }
+            else if (rCell.meType == CELLTYPE_STRING)
+                aCellStr = *rCell.mpString;
             else
             {
                 sal_uLong nFormat = mrTab.GetNumberFormat( static_cast<SCCOL>(rEntry.nField), nRow );
-                ScCellFormat::GetInputString(rCell, nFormat, aCellStr, *mrDoc.GetFormatTable(), &mrDoc);
+                OUString aStr;
+                ScCellFormat::GetInputString(rCell, nFormat, aStr, *mrDoc.GetFormatTable(), &mrDoc);
+                aCellStr = mrStrPool.intern(aStr);
             }
         }
         else
-            mrTab.GetInputString( static_cast<SCCOL>(rEntry.nField), nRow, aCellStr );
+        {
+            OUString aStr;
+            mrTab.GetInputString(static_cast<SCCOL>(rEntry.nField), nRow, aStr);
+            aCellStr = mrStrPool.intern(aStr);
+        }
 
         bool bRealRegExp = isRealRegExp(rEntry);
         bool bTestRegExp = isTestRegExp(rEntry);
@@ -1441,12 +1451,12 @@ public:
                 nEnd = 0;
                 nStart = aCellStr.getLength();
                 bMatch = rEntry.GetSearchTextPtr( mrParam.bCaseSens )
-                    ->SearchBackward( aCellStr, &nStart, &nEnd );
+                    ->SearchBackward(aCellStr.getString(), &nStart, &nEnd);
             }
             else
             {
                 bMatch = rEntry.GetSearchTextPtr( mrParam.bCaseSens )
-                    ->SearchForward( aCellStr, &nStart, &nEnd );
+                    ->SearchForward(aCellStr.getString(), &nStart, &nEnd);
             }
             if ( bMatch && bMatchWholeCell
                     && (nStart != 0 || nEnd != aCellStr.getLength()) )
@@ -1498,8 +1508,12 @@ public:
                 }
                 else if ( bMatchWholeCell )
                 {
-                    // TODO: Use shared string for faster equality check.
-                    bOk = mpTransliteration->isEqual(aCellStr, rItem.maString.getString());
+                    // Fast string equality check by comparing string identifiers.
+                    if (mrParam.bCaseSens)
+                        bOk = aCellStr.getData() == rItem.maString.getData();
+                    else
+                        bOk = aCellStr.getDataIgnoreCase() == rItem.maString.getDataIgnoreCase();
+
                     if ( rEntry.eOp == SC_NOT_EQUAL )
                         bOk = !bOk;
                 }
@@ -1507,7 +1521,7 @@ public:
                 {
                     OUString aQueryStr = rItem.maString.getString();
                     OUString aCell( mpTransliteration->transliterate(
-                        aCellStr, ScGlobal::eLnge, 0, aCellStr.getLength(),
+                        aCellStr.getString(), ScGlobal::eLnge, 0, aCellStr.getLength(),
                         NULL ) );
                     OUString aQuer( mpTransliteration->transliterate(
                         aQueryStr, ScGlobal::eLnge, 0, aQueryStr.getLength(),
@@ -1547,7 +1561,7 @@ public:
             else
             {   // use collator here because data was probably sorted
                 sal_Int32 nCompare = mpCollator->compareString(
-                    aCellStr, rItem.maString.getString());
+                    aCellStr.getString(), rItem.maString.getString());
                 switch (rEntry.eOp)
                 {
                     case SC_LESS :


More information about the Libreoffice-commits mailing list