sc/inc/dociter.hxx | 6 +-- sc/inc/queryentry.hxx | 3 - sc/inc/queryparam.hxx | 5 -- sc/source/core/data/dociter.cxx | 69 +++++++------------------------------ sc/source/core/data/table3.cxx | 2 - sc/source/core/tool/doubleref.cxx | 2 - sc/source/core/tool/interpr1.cxx | 18 ++++++++- sc/source/core/tool/interpr4.cxx | 5 -- sc/source/core/tool/queryentry.cxx | 2 - sc/source/core/tool/queryparam.cxx | 31 +++------------- 10 files changed, 44 insertions(+), 99 deletions(-)
New commits: commit 97f01dcc8a7fa2a1840ec4c5c456b62d89e56e85 Author: Martin Nathansen <marsia...@gmail.com> Date: Thu Mar 1 17:04:47 2018 +0000 Revert "tdf#35636: Match also empty cells (backport of the idea)" This reverts commit 86a9cf80c88d380dbee5111c587bf09ea9b424d6. Revertion 2/2 to fix regression trac#23641. diff --git a/sc/inc/dociter.hxx b/sc/inc/dociter.hxx index ac19951e50dc..cfffb7ef2f56 100644 --- a/sc/inc/dociter.hxx +++ b/sc/inc/dociter.hxx @@ -284,7 +284,7 @@ private: bool bAdvanceQuery; bool bIgnoreMismatchOnLeadingStrings; - bool GetThis(); + ScBaseCell* GetThis(); /* Only works if no regular expression is involved, only searches for rows in one column, and only the first @@ -302,8 +302,8 @@ public: const ScQueryParam& aParam, bool bMod = true); // for bMod = FALSE the QueryParam has to be filled // (bIsString) - bool GetFirst(); - bool GetNext(); + ScBaseCell* GetFirst(); + ScBaseCell* GetNext(); SCCOL GetCol() { return nCol; } SCROW GetRow() { return nRow; } diff --git a/sc/inc/queryentry.hxx b/sc/inc/queryentry.hxx index 7c67aa19558f..08a2f811fd77 100644 --- a/sc/inc/queryentry.hxx +++ b/sc/inc/queryentry.hxx @@ -42,9 +42,8 @@ struct SC_DLLPUBLIC ScQueryEntry QueryType meType; double mfVal; OUString maString; - bool mbMatchEmpty; - Item() : meType(ByValue), mfVal(0.0), mbMatchEmpty(false) {} + Item() : meType(ByValue), mfVal(0.0) {} bool operator== (const Item& r) const; }; diff --git a/sc/inc/queryparam.hxx b/sc/inc/queryparam.hxx index 6fb95b03b1b3..445c23c06aac 100644 --- a/sc/inc/queryparam.hxx +++ b/sc/inc/queryparam.hxx @@ -25,8 +25,6 @@ #include <boost/ptr_container/ptr_vector.hpp> -class SvNumberFormatter; - struct ScDBQueryParamInternal; struct ScQueryEntry; @@ -51,8 +49,7 @@ struct ScQueryParamBase ScQueryEntry* FindEntryByField(SCCOLROW nField, bool bNew); SC_DLLPUBLIC void RemoveEntryByField(SCCOLROW nField); void Resize(size_t nNew); - void FillInExcelSyntax(const OUString& aCellStr, SCSIZE nIndex, - SvNumberFormatter* pFormatter); + void FillInExcelSyntax(const OUString& aCellStr, SCSIZE nIndex); protected: typedef boost::ptr_vector<ScQueryEntry> EntriesType; diff --git a/sc/source/core/data/dociter.cxx b/sc/source/core/data/dociter.cxx index 16c6d1fee94f..e050e5816c5a 100644 --- a/sc/source/core/data/dociter.cxx +++ b/sc/source/core/data/dociter.cxx @@ -56,31 +56,6 @@ namespace { rStr = ScGlobal::pCharClass->uppercase(rStr.trim()); } - - void lcl_FillBlankCells( std::vector<ColEntry> &rSrcCols, std::vector<ColEntry> &rDestCols, SCROW nLastRow, bool bMatchEmpty ) - { - rDestCols.clear(); - - if (!bMatchEmpty) - { - rDestCols = rSrcCols; - return; - } - - for( SCROW i = 0, n = 0; i <= nLastRow; ++i ) - { - rDestCols.push_back(ColEntry()); - rDestCols.back().nRow = i; - - if ( rSrcCols[n].nRow == i ) - { - rDestCols.back().pCell = rSrcCols[n].pCell; - ++n; - } - else - rDestCols.back().pCell = NULL; - } - } } ScDocumentIterator::ScDocumentIterator( ScDocument* pDocument, @@ -1203,7 +1178,7 @@ ScQueryCellIterator::ScQueryCellIterator(ScDocument* pDocument, SCTAB nTable, nAttrEndRow = 0; } -bool ScQueryCellIterator::GetThis() +ScBaseCell* ScQueryCellIterator::GetThis() { if (nTab >= pDoc->GetTableCount()) OSL_FAIL("try to access index out of bounds, FIX IT"); @@ -1218,13 +1193,6 @@ bool ScQueryCellIterator::GetThis() !mpParam->bHasHeader && rItem.meType == ScQueryEntry::ByString && ((mpParam->bByRow && nRow == mpParam->nRow1) || (!mpParam->bByRow && nCol == mpParam->nCol1)); - - bool bMatchEmpty = ( rItem.mbMatchEmpty && rEntry.GetQueryItems().size() == 1 ); - - std::vector<ColEntry> rColItems; - SCROW nLastRow = pCol->GetLastDataPos(); - lcl_FillBlankCells( pCol->maItems, rColItems, std::max(nLastRow, mpParam->nRow2), bMatchEmpty ); - for ( ;; ) { if ( nRow > mpParam->nRow2 ) @@ -1235,16 +1203,13 @@ bool ScQueryCellIterator::GetThis() do { if ( ++nCol > mpParam->nCol2 ) - return false; // Over and out + return NULL; // Over and out if ( bAdvanceQuery ) { AdvanceQueryParamEntryField(); nFirstQueryField = rEntry.nField; } - pCol = &(pDoc->maTabs[nTab])->aCol[nCol]; - nLastRow = pCol->GetLastDataPos(); - lcl_FillBlankCells( pCol->maItems, rColItems, std::max(nLastRow, mpParam->nRow2), bMatchEmpty ); } while ( pCol->maItems.empty() ); pCol->Search( nRow, nColRow ); bFirstStringIgnore = bIgnoreMismatchOnLeadingStrings && @@ -1252,19 +1217,13 @@ bool ScQueryCellIterator::GetThis() mpParam->bByRow; } - while ( nColRow < rColItems.size() && rColItems[nColRow].nRow < nRow ) + while ( nColRow < pCol->maItems.size() && pCol->maItems[nColRow].nRow < nRow ) nColRow++; - if ( nColRow < rColItems.size() && - (nRow = rColItems[nColRow].nRow) <= mpParam->nRow2 ) + if ( nColRow < pCol->maItems.size() && + (nRow = pCol->maItems[nColRow].nRow) <= mpParam->nRow2 ) { - ScBaseCell* pCell = rColItems[nColRow].pCell; - - // empty cell when empty cells should be matched - if ( bMatchEmpty && ( pCell == NULL ) ) - return true; - - + ScBaseCell* pCell = pCol->maItems[nColRow].pCell; if (bAllStringIgnore && pCell->HasStringData()) ++nRow; else @@ -1276,7 +1235,7 @@ bool ScQueryCellIterator::GetThis() { if ( nTestEqualCondition && bTestEqualCondition ) nTestEqualCondition |= nTestEqualConditionMatched; - return true; // Found it! + return pCell; // Found it! } else if ( nStopOnMismatch ) { @@ -1287,7 +1246,7 @@ bool ScQueryCellIterator::GetThis() { nTestEqualCondition |= nTestEqualConditionMatched; nStopOnMismatch |= nStopOnMismatchOccurred; - return false; + return NULL; } bool bStop; if (bFirstStringIgnore) @@ -1305,7 +1264,7 @@ bool ScQueryCellIterator::GetThis() if (bStop) { nStopOnMismatch |= nStopOnMismatchOccurred; - return false; + return NULL; } } else @@ -1318,7 +1277,7 @@ bool ScQueryCellIterator::GetThis() } } -bool ScQueryCellIterator::GetFirst() +ScBaseCell* ScQueryCellIterator::GetFirst() { if (nTab >= pDoc->GetTableCount()) OSL_FAIL("try to access index out of bounds, FIX IT"); @@ -1331,7 +1290,7 @@ bool ScQueryCellIterator::GetFirst() return GetThis(); } -bool ScQueryCellIterator::GetNext() +ScBaseCell* ScQueryCellIterator::GetNext() { ++nRow; if ( nStopOnMismatch ) @@ -1404,17 +1363,17 @@ bool ScQueryCellIterator::FindEqualOrSortedLastInRange( SCCOL& nFoundCol, { // First equal entry or last smaller than (greater than) entry. SCSIZE nColRowSave; - bool bNext = false; + ScBaseCell* pNext = 0; do { nFoundCol = GetCol(); nFoundRow = GetRow(); nColRowSave = nColRow; - } while ( !IsEqualConditionFulfilled() && (bNext = GetNext() ) ); + } while ( !IsEqualConditionFulfilled() && (pNext = GetNext()) != NULL ); // There may be no pNext but equal condition fulfilled if regular // expressions are involved. Keep the found entry and proceed. - if (!bNext && !IsEqualConditionFulfilled()) + if (!pNext && !IsEqualConditionFulfilled()) { // Step back to last in range and adjust position markers for // GetNumberFormat() or similar. diff --git a/sc/source/core/data/table3.cxx b/sc/source/core/data/table3.cxx index d13992d5f7aa..73f952ddc9e0 100644 --- a/sc/source/core/data/table3.cxx +++ b/sc/source/core/data/table3.cxx @@ -2041,7 +2041,7 @@ bool ScTable::CreateExcelQuery(SCCOL nCol1, SCROW nRow1, SCCOL nCol2, SCROW nRow if (nIndex < nNewEntries) { rQueryParam.GetEntry(nIndex).nField = pFields[nCol - nCol1]; - rQueryParam.FillInExcelSyntax(aCellStr, nIndex, NULL); + rQueryParam.FillInExcelSyntax(aCellStr, nIndex); nIndex++; if (nIndex < nNewEntries) rQueryParam.GetEntry(nIndex).eConnect = SC_AND; diff --git a/sc/source/core/tool/doubleref.cxx b/sc/source/core/tool/doubleref.cxx index 94976d488845..f7d873cb61a8 100644 --- a/sc/source/core/tool/doubleref.cxx +++ b/sc/source/core/tool/doubleref.cxx @@ -185,7 +185,7 @@ bool lcl_createExcelQuery( if (nIndex < nNewEntries) { pParam->GetEntry(nIndex).nField = aFields[nCol]; - pParam->FillInExcelSyntax(OUString(aCellStr), nIndex, NULL); + pParam->FillInExcelSyntax(OUString(aCellStr), nIndex); nIndex++; if (nIndex < nNewEntries) pParam->GetEntry(nIndex).eConnect = SC_AND; diff --git a/sc/source/core/tool/interpr1.cxx b/sc/source/core/tool/interpr1.cxx index 0ab4657aeac0..c90f07d22c81 100644 --- a/sc/source/core/tool/interpr1.cxx +++ b/sc/source/core/tool/interpr1.cxx @@ -5701,7 +5701,11 @@ double ScInterpreter::IterateParametersIf( ScIterFuncIf eFunc ) } else { - rParam.FillInExcelSyntax(aString, 0, pFormatter); + rParam.FillInExcelSyntax(aString, 0); + sal_uInt32 nIndex = 0; + bool bNumber = pFormatter->IsNumberFormat( + rItem.maString, nIndex, rItem.mfVal); + rItem.meType = bNumber ? ScQueryEntry::ByValue : ScQueryEntry::ByString; if (rItem.meType == ScQueryEntry::ByString) rParam.bRegExp = MayBeRegExp(rItem.maString, pDok); } @@ -6000,7 +6004,11 @@ void ScInterpreter::ScCountIf() } else { - rParam.FillInExcelSyntax(aString, 0, pFormatter); + rParam.FillInExcelSyntax(aString, 0); + sal_uInt32 nIndex = 0; + bool bNumber = pFormatter->IsNumberFormat( + rItem.maString, nIndex, rItem.mfVal); + rItem.meType = bNumber ? ScQueryEntry::ByValue : ScQueryEntry::ByString; if (rItem.meType == ScQueryEntry::ByString) rParam.bRegExp = MayBeRegExp(rItem.maString, pDok); } @@ -6248,7 +6256,11 @@ double ScInterpreter::IterateParametersIfs( ScIterFuncIfs eFunc ) } else { - rParam.FillInExcelSyntax(aString, 0, pFormatter); + rParam.FillInExcelSyntax(aString, 0); + sal_uInt32 nIndex = 0; + bool bNumber = pFormatter->IsNumberFormat( + rItem.maString, nIndex, rItem.mfVal); + rItem.meType = bNumber ? ScQueryEntry::ByValue : ScQueryEntry::ByString; if (rItem.meType == ScQueryEntry::ByString) rParam.bRegExp = MayBeRegExp(rItem.maString, pDok); } diff --git a/sc/source/core/tool/queryentry.cxx b/sc/source/core/tool/queryentry.cxx index 53ffb5d80aba..1ac1a899327b 100644 --- a/sc/source/core/tool/queryentry.cxx +++ b/sc/source/core/tool/queryentry.cxx @@ -32,7 +32,7 @@ bool ScQueryEntry::Item::operator== (const Item& r) const { - return meType == r.meType && mfVal == r.mfVal && maString.equals(r.maString) && mbMatchEmpty == r.mbMatchEmpty; + return meType == r.meType && mfVal == r.mfVal && maString.equals(r.maString); } ScQueryEntry::ScQueryEntry() : diff --git a/sc/source/core/tool/queryparam.cxx b/sc/source/core/tool/queryparam.cxx index 8ebf5e974d55..781816a3d9e5 100644 --- a/sc/source/core/tool/queryparam.cxx +++ b/sc/source/core/tool/queryparam.cxx @@ -20,8 +20,6 @@ #include "queryparam.hxx" #include "queryentry.hxx" -#include <svl/zforlist.hxx> - namespace { const size_t MAXQUERY = 8; @@ -168,17 +166,17 @@ void ScQueryParamBase::Resize(size_t nNew) } } -void ScQueryParamBase::FillInExcelSyntax(const OUString& rStr, SCSIZE nIndex, SvNumberFormatter *pFormatter) +void ScQueryParamBase::FillInExcelSyntax(const OUString& rStr, SCSIZE nIndex) { const String aCellStr = rStr; - if ( nIndex >= maEntries.size() ) - Resize( nIndex+1 ); - - ScQueryEntry& rEntry = GetEntry(nIndex); - ScQueryEntry::Item& rItem = rEntry.GetQueryItem(); - if (aCellStr.Len() > 0) { + if ( nIndex >= maEntries.size() ) + Resize( nIndex+1 ); + + ScQueryEntry& rEntry = GetEntry(nIndex); + ScQueryEntry::Item& rItem = rEntry.GetQueryItem(); + rEntry.bDoQuery = sal_True; // Operatoren herausfiltern if (aCellStr.GetChar(0) == '<') @@ -220,21 +218,6 @@ void ScQueryParamBase::FillInExcelSyntax(const OUString& rStr, SCSIZE nIndex, Sv rItem.maString = aCellStr; rEntry.eOp = SC_EQUAL; } - - } - - if (pFormatter) - { - sal_uInt32 nFormat = 0; - bool bNumber = pFormatter->IsNumberFormat( rItem.maString, nFormat, rItem.mfVal); - rItem.meType = bNumber ? ScQueryEntry::ByValue : ScQueryEntry::ByString; - - /* TODO: pFormatter currently is also used as a flag whether matching - * empty cells with an empty string is triggered from the interpreter. - * This could be handled independently if all queries should support - * it, needs to be evaluated if that actually is desired. */ - if (rItem.meType == ScQueryEntry::ByString) - rItem.mbMatchEmpty = (rEntry.eOp == SC_EQUAL && rItem.maString.isEmpty()); } } commit 430c267a0fcdd7b501c7aa7734249168d00a0c4b Author: Martin Nathansen <marsia...@gmail.com> Date: Thu Mar 1 17:03:09 2018 +0000 Revert "Resolves: tdf#39316 add matrix empty cells to ScInterpreter::QueryMatrixType()" This reverts commit fdfda3fba4267a9b52e62b20bc94983091398f7a. Revertion 1/2 to fix regression trac#23641. diff --git a/sc/source/core/tool/interpr4.cxx b/sc/source/core/tool/interpr4.cxx index 399b0246c7fb..9057166af3d2 100644 --- a/sc/source/core/tool/interpr4.cxx +++ b/sc/source/core/tool/interpr4.cxx @@ -1849,11 +1849,6 @@ void ScInterpreter::QueryMatrixType(ScMatrixRef& xMat, short& rRetTypeExpr, sal_ PushTempToken( new ScMatrixCellResultToken( xMat, xRes.get())); rRetTypeExpr = NUMBERFORMAT_LOGICAL; } - else if ( xMat->IsEmpty( 0, 0)) - { // empty or empty cell - FormulaTokenRef xRes = new ScEmptyCellToken( false, true); // not inherited, display empty - PushTempToken( new ScMatrixCellResultToken( xMat, xRes.get())); - } else { String aStr( nMatVal.GetString()); _______________________________________________ Libreoffice-commits mailing list libreoffice-comm...@lists.freedesktop.org https://lists.freedesktop.org/mailman/listinfo/libreoffice-commits