[Libreoffice-commits] core.git: Branch 'libreoffice-6-0' - sc/qa sc/source

Dennis Francis dennis.francis at collabora.co.uk
Wed Jan 24 11:25:34 UTC 2018


 sc/qa/unit/parallelism.cxx           |   23 +++++++++++++++++++++++
 sc/source/core/tool/formulagroup.cxx |   16 +++++++++++++---
 2 files changed, 36 insertions(+), 3 deletions(-)

New commits:
commit 1c6244f1faaefb6a5198c79c00849924ac2e91c2
Author: Dennis Francis <dennis.francis at collabora.co.uk>
Date:   Tue Jan 23 19:53:19 2018 +0530

    tdf#115093 : Do not reuse singleref tokens...
    
    ...in formula group computation if the formula contains
    only a single reference besides any ocOpen/ocClose pairs
    wrapping it as the sole content.
    
    In such a case the "result" formula token
    returned by ScInterpreter::GetResultToken() is the same
    as the original singleref token, so for each row of the
    formulagroup, we need to use a separate singleref token.
    
    Also added a unit test in sc/qa/unit/parallelism.cxx
    
    Change-Id: I6032efc5be9b51ca1e9daf9bdd19997a949d2f43
    Reviewed-on: https://gerrit.libreoffice.org/48449
    Reviewed-by: Michael Meeks <michael.meeks at collabora.com>
    Tested-by: Jenkins <ci at libreoffice.org>
    (cherry picked from commit ff166845fa5ed178a97b54bb2deef4beb0cf3bdf)
    Reviewed-on: https://gerrit.libreoffice.org/48478
    Tested-by: Michael Meeks <michael.meeks at collabora.com>

diff --git a/sc/qa/unit/parallelism.cxx b/sc/qa/unit/parallelism.cxx
index 428d65a20bec..896b7c1d8382 100644
--- a/sc/qa/unit/parallelism.cxx
+++ b/sc/qa/unit/parallelism.cxx
@@ -46,12 +46,14 @@ public:
     void testDivision();
     void testVLOOKUP();
     void testVLOOKUPSUM();
+    void testSingleRef();
 
     CPPUNIT_TEST_SUITE(ScParallelismTest);
     CPPUNIT_TEST(testSUMIFS);
     CPPUNIT_TEST(testDivision);
     CPPUNIT_TEST(testVLOOKUP);
     CPPUNIT_TEST(testVLOOKUPSUM);
+    CPPUNIT_TEST(testSingleRef);
     CPPUNIT_TEST_SUITE_END();
 
 private:
@@ -296,6 +298,27 @@ void ScParallelismTest::testVLOOKUPSUM()
     m_pDoc->DeleteTab(0);
 }
 
+void ScParallelismTest::testSingleRef()
+{
+    m_pDoc->InsertTab(0, "1");
+
+    const size_t nNumRows = 200;
+    for (size_t i = 0; i < nNumRows; ++i)
+    {
+        m_pDoc->SetValue(0, i, 0, static_cast<double>(i));
+        m_pDoc->SetFormula(ScAddress(1, i, 0), "=A" + OUString::number(i+1), formula::FormulaGrammar::GRAM_NATIVE_UI);
+    }
+
+    m_xDocShell->DoHardRecalc();
+
+    for (size_t i = 0; i < nNumRows; ++i)
+    {
+        OString aMsg = "At row " + OString::number(i);
+        CPPUNIT_ASSERT_EQUAL_MESSAGE(aMsg.getStr(), i, static_cast<size_t>(m_pDoc->GetValue(1, i, 0)));
+    }
+    m_pDoc->DeleteTab(0);
+}
+
 CPPUNIT_TEST_SUITE_REGISTRATION(ScParallelismTest);
 
 CPPUNIT_PLUGIN_IMPLEMENT();
diff --git a/sc/source/core/tool/formulagroup.cxx b/sc/source/core/tool/formulagroup.cxx
index d763d15d2f1c..38b9c2a327ee 100644
--- a/sc/source/core/tool/formulagroup.cxx
+++ b/sc/source/core/tool/formulagroup.cxx
@@ -177,6 +177,7 @@ public:
         ScTokenArray aCode2;
 
         ScInterpreterContext aContext(mrDoc, mpFormatter);
+        sal_uInt16 nNumNonOpenClose = mrCode.GetLen();
 
         for (SCROW i = mnIdx; i <= mnLastIdx; ++i, maBatchTopPos.IncRow())
         {
@@ -212,7 +213,7 @@ public:
                                 aCode2.AddString(rPool.intern(OUString(pStr)));
                             else
                             {
-                                if ( pTargetTok->GetType() == formula::svString )
+                                if ( ( pTargetTok->GetType() == formula::svString ) && ( nNumNonOpenClose > 1 ) )
                                     pTargetTok->SetString(rPool.intern(OUString(pStr)));
                                 else
                                 {
@@ -226,7 +227,7 @@ public:
                             // Value of NaN represents an empty cell.
                             if ( !pTargetTok )
                                 aCode2.AddToken(ScEmptyCellToken(false, false));
-                            else if ( pTargetTok->GetType() != formula::svEmptyCell )
+                            else if ( ( pTargetTok->GetType() != formula::svEmptyCell ) || ( nNumNonOpenClose == 1 ) )
                             {
                                 ScEmptyCellToken* pEmptyTok = new ScEmptyCellToken(false, false);
                                 aCode2.ReplaceToken(nTokIdx, pEmptyTok, formula::FormulaTokenArray::CODE_ONLY);
@@ -239,7 +240,7 @@ public:
                                 aCode2.AddDouble(fVal);
                             else
                             {
-                                if ( pTargetTok->GetType() == formula::svDouble )
+                                if ( ( pTargetTok->GetType() == formula::svDouble ) && ( nNumNonOpenClose > 1 ) )
                                     pTargetTok->GetDoubleAsReference() = fVal;
                                 else
                                 {
@@ -291,7 +292,16 @@ public:
                     break;
                     default:
                         if ( !pTargetTok )
+                        {
+                            if ( p->GetType() == formula::svSep )
+                            {
+                                OpCode eOp = p->GetOpCode();
+                                if ( eOp == ocOpen || eOp == ocClose )
+                                    --nNumNonOpenClose;
+                            }
+
                             aCode2.AddToken(*p);
+                        }
                 } // end of switch statement
             } // end of formula token for loop
 


More information about the Libreoffice-commits mailing list