diff options
-rw-r--r-- | sc/inc/queryiter.hxx | 8 | ||||
-rw-r--r-- | sc/source/core/data/queryiter.cxx | 27 | ||||
-rw-r--r-- | sc/source/core/inc/interpre.hxx | 6 | ||||
-rw-r--r-- | sc/source/core/tool/interpr1.cxx | 35 |
4 files changed, 42 insertions, 34 deletions
diff --git a/sc/inc/queryiter.hxx b/sc/inc/queryiter.hxx index 32fd1cb83898..f494b83d74a5 100644 --- a/sc/inc/queryiter.hxx +++ b/sc/inc/queryiter.hxx @@ -183,7 +183,7 @@ protected: sal_uInt8 nSortedBinarySearch; bool bAdvanceQuery; bool bIgnoreMismatchOnLeadingStrings; - bool bXLookUp; + sal_uInt16 nSearchOpCode; SCCOL nBestFitCol; SCROW nBestFitRow; @@ -276,8 +276,8 @@ public: nSearchbAscd : (nSearchMode == -2 ? nSearchbDesc : nBinarySearchDisabled)); } - void SetXlookupMode( bool bVal ) - { bXLookUp = bVal; } + void SetLookupMode( sal_uInt16 nVal ) + { nSearchOpCode = nVal; } }; @@ -325,7 +325,7 @@ class ScQueryCellIterator using Base::getThisResult; using Base::nBestFitCol; using Base::nBestFitRow; - using Base::bXLookUp; + using Base::nSearchOpCode; bool GetThis(); diff --git a/sc/source/core/data/queryiter.cxx b/sc/source/core/data/queryiter.cxx index 56d4081e7255..8abaa2b93fdd 100644 --- a/sc/source/core/data/queryiter.cxx +++ b/sc/source/core/data/queryiter.cxx @@ -67,7 +67,7 @@ ScQueryCellIteratorBase< accessType, queryType >::ScQueryCellIteratorBase(ScDocu , nSortedBinarySearch( nBinarySearchDisabled ) , bAdvanceQuery( false ) , bIgnoreMismatchOnLeadingStrings( false ) - , bXLookUp( false ) + , nSearchOpCode( SC_OPCODE_NONE ) , nBestFitCol(SCCOL_MAX) , nBestFitRow(SCROW_MAX) { @@ -207,7 +207,8 @@ void ScQueryCellIteratorBase< accessType, queryType >::PerformQuery() return; // XLookUp: Forward/asc/backward/desc search for best fit value, except if we have an exact match - if (bXLookUp && (rEntry.eOp == SC_LESS_EQUAL || rEntry.eOp == SC_GREATER_EQUAL) && + if (nSearchOpCode == SC_OPCODE_X_LOOKUP && + (rEntry.eOp == SC_LESS_EQUAL || rEntry.eOp == SC_GREATER_EQUAL) && (nBestFitCol != nCol || nBestFitRow != nRow)) { bool bNumSearch = rItem.meType == ScQueryEntry::ByValue && aCell.hasNumeric(); @@ -315,7 +316,7 @@ void ScQueryCellIteratorBase< accessType, queryType >::InitPos() // is the one after it. lastRow = nRow; // BinarySearch() looks for the first match for XLOOKUP - if (!bXLookUp) + if (nSearchOpCode != SC_OPCODE_X_LOOKUP) { ScQueryOp saveOp = op; op = SC_LESS; @@ -341,7 +342,7 @@ void ScQueryCellIteratorBase< accessType, queryType >::InitPos() if( BinarySearch( nCol )) lastRow = nRow; } - AccessBase::InitPosFinish(beforeRow, lastRow, bXLookUp); + AccessBase::InitPosFinish(beforeRow, lastRow, (nSearchOpCode == SC_OPCODE_X_LOOKUP)); } } @@ -545,7 +546,9 @@ bool ScQueryCellIteratorBase< accessType, queryType >::BinarySearch( SCCOL col, { if (fLastInRangeValue <= nCellVal) { - if (bXLookUp && nSortedBinarySearch != nSearchbDesc && fLastInRangeValue == nCellVal && aIndexer.getLowIndex() != i) + if (nSearchOpCode == SC_OPCODE_X_LOOKUP && + nSortedBinarySearch != nSearchbDesc && + fLastInRangeValue == nCellVal && aIndexer.getLowIndex() != i) bDone = true; else { @@ -593,7 +596,9 @@ bool ScQueryCellIteratorBase< accessType, queryType >::BinarySearch( SCCOL col, aCellStr); if (nTmp <= 0) { - if (bXLookUp && nSortedBinarySearch != nSearchbDesc && nTmp == 0 && aIndexer.getLowIndex() != i) + if (nSearchOpCode == SC_OPCODE_X_LOOKUP && + nSortedBinarySearch != nSearchbDesc && + nTmp == 0 && aIndexer.getLowIndex() != i) bDone = true; else { @@ -667,7 +672,8 @@ bool ScQueryCellIteratorBase< accessType, queryType >::BinarySearch( SCCOL col, { found = i; nLastInRange = i; - if (bXLookUp && (nSortedBinarySearch == nSearchbAscd && (rEntry.eOp == SC_LESS_EQUAL || rEntry.eOp == SC_EQUAL))) + if (nSearchOpCode == SC_OPCODE_X_LOOKUP && (nSortedBinarySearch == nSearchbAscd && + (rEntry.eOp == SC_LESS_EQUAL || rEntry.eOp == SC_EQUAL))) bDone = true; else // But keep searching to find the last matching one. nLo = nMid + 1; @@ -747,7 +753,7 @@ bool ScQueryCellIterator< accessType >::FindEqualOrSortedLastInRange( SCCOL& nFo nFoundCol = rDoc.MaxCol()+1; nFoundRow = rDoc.MaxRow()+1; - if (bXLookUp && nSortedBinarySearch == nBinarySearchDisabled) + if (nSearchOpCode == SC_OPCODE_X_LOOKUP && nSortedBinarySearch == nBinarySearchDisabled) SetStopOnMismatch( false ); // assume not sorted keys for XLookup else SetStopOnMismatch( true ); // assume sorted keys @@ -762,7 +768,8 @@ bool ScQueryCellIterator< accessType >::FindEqualOrSortedLastInRange( SCCOL& nFo (maParam.GetEntry(0).eOp == SC_LESS_EQUAL || maParam.GetEntry(0).eOp == SC_GREATER_EQUAL); // assume not sorted properly if we are using XLookup with forward or backward search - if (bBinary && bXLookUp && nSortedBinarySearch == nBinarySearchDisabled) + if (bBinary && nSearchOpCode == SC_OPCODE_X_LOOKUP && + nSortedBinarySearch == nBinarySearchDisabled) bBinary = false; bool bFound = false; @@ -855,7 +862,7 @@ bool ScQueryCellIterator< accessType >::FindEqualOrSortedLastInRange( SCCOL& nFo } } } - if ( IsEqualConditionFulfilled() && !bXLookUp ) + if ( IsEqualConditionFulfilled() && nSearchOpCode != SC_OPCODE_X_LOOKUP ) { // Position on last equal entry, except for XLOOKUP, // which looking for the first equal entry diff --git a/sc/source/core/inc/interpre.hxx b/sc/source/core/inc/interpre.hxx index ea30b57ae7ea..57c69d6a3d02 100644 --- a/sc/source/core/inc/interpre.hxx +++ b/sc/source/core/inc/interpre.hxx @@ -61,8 +61,8 @@ enum SearchMode{ searchfwd=1, searchrev=-1, searchbasc=2, searchbdesc=-2 }; struct VectorSearchArguments { // struct contains the contents of the function arguments - // Struct owner, ScMatch or ScXLookup - bool isXLookup = false; + // OpCode of struct owner + sal_uInt16 nSearchOpCode = SC_OPCODE_NONE; // match mode (common, enum values are from XLOOKUP) // optional 5th argument to set match mode @@ -541,7 +541,7 @@ private: inline void TreatDoubleError( double& rVal ); // Lookup using ScLookupCache, @returns true if found and result address bool LookupQueryWithCache( ScAddress & o_rResultPos, const ScQueryParam & rParam, - const ScComplexRefData* refData, sal_Int8 nSearchMode, bool bXlookupMode ) const; + const ScComplexRefData* refData, sal_Int8 nSearchMode, sal_Int16 nOpCode ) const; void ScIfJump(); void ScIfError( bool bNAonly ); diff --git a/sc/source/core/tool/interpr1.cxx b/sc/source/core/tool/interpr1.cxx index 3d3b967ffaa0..fd7bab714805 100644 --- a/sc/source/core/tool/interpr1.cxx +++ b/sc/source/core/tool/interpr1.cxx @@ -4920,7 +4920,7 @@ void ScInterpreter::ScMatch() return; VectorSearchArguments vsa; - vsa.isXLookup = false; + vsa.nSearchOpCode = SC_OPCODE_MATCH; // get match mode double fType = ( nParamCount == 3 ? GetDouble() : 1.0 ); @@ -7545,7 +7545,8 @@ void ScInterpreter::CalculateLookup(bool bHLookup) else { ScAddress aResultPos( nCol1, nRow1, nTab1); - bFound = LookupQueryWithCache( aResultPos, aParam, refData, 0, false ); + bFound = LookupQueryWithCache( aResultPos, aParam, refData, 0, + ( bHLookup ? SC_OPCODE_H_LOOKUP : SC_OPCODE_V_LOOKUP ) ); nRow = aResultPos.Row(); nCol = nSpIndex; } @@ -7638,7 +7639,7 @@ void ScInterpreter::ScXLookup() return; VectorSearchArguments vsa; - vsa.isXLookup = true; + vsa.nSearchOpCode = SC_OPCODE_X_LOOKUP; if ( nParamCount == 6 ) { @@ -10663,7 +10664,7 @@ bool ScInterpreter::SearchRangeForValue( VectorSearchArguments& vsa, ScQueryPara rParam.bByRow = true; ScAddress aResultPos( vsa.nCol1, vsa.nRow1, vsa.nTab1 ); const ScComplexRefData* refData = nullptr; - if ( LookupQueryWithCache( aResultPos, rParam, refData, vsa.eSearchMode, vsa.isXLookup ) ) + if ( LookupQueryWithCache( aResultPos, rParam, refData, vsa.eSearchMode, vsa.nSearchOpCode ) ) vsa.nHitIndex = aResultPos.Row() - vsa.nRow1 + 1; } else @@ -10674,7 +10675,7 @@ bool ScInterpreter::SearchRangeForValue( VectorSearchArguments& vsa, ScQueryPara ScQueryCellIteratorDirect aCellIter(mrDoc, mrContext, vsa.nTab1, rParam, false, bReverseSearch); // Advance Entry.nField in Iterator if column changed aCellIter.SetAdvanceQueryParamEntryField(true); - aCellIter.SetXlookupMode(vsa.isXLookup); + aCellIter.SetLookupMode(vsa.nSearchOpCode); // TODO: no binary search for column (horizontal) search (use linear) aCellIter.SetSortedBinarySearchMode(vsa.eSearchMode); if (rEntry.eOp == SC_EQUAL) @@ -10741,7 +10742,7 @@ bool ScInterpreter::SearchVectorForValue( VectorSearchArguments& vsa ) case wildcard : // this mode can only used with XLOOKUP - if ( vsa.isXLookup ) + if ( vsa.nSearchOpCode == SC_OPCODE_X_LOOKUP ) { rEntry.eOp = SC_EQUAL; if ( vsa.isStringSearch ) @@ -10774,7 +10775,7 @@ bool ScInterpreter::SearchVectorForValue( VectorSearchArguments& vsa ) { rItem.meType = ScQueryEntry::ByString; rItem.maString = vsa.sSearchStr; - if ( !vsa.isXLookup ) + if ( vsa.nSearchOpCode == SC_OPCODE_MATCH ) { if ( mrDoc.IsInVBAMode() ) rParam.eSearchType = utl::SearchParam::SearchType::Wildcard; @@ -10805,12 +10806,12 @@ bool ScInterpreter::SearchVectorForValue( VectorSearchArguments& vsa ) // MATCH expects index starting with 1, XLOOKUP expects index starting with 0 if ( vsa.nHitIndex > 0 ) { - vsa.nIndex = ( vsa.isXLookup ? --vsa.nHitIndex : vsa.nHitIndex ); + vsa.nIndex = ( vsa.nSearchOpCode == SC_OPCODE_X_LOOKUP ? --vsa.nHitIndex : vsa.nHitIndex ); return true; } else if ( vsa.nHitIndex == 0 && vsa.nBestFit != SCSIZE_MAX ) { - if ( vsa.isXLookup ) + if ( vsa.nSearchOpCode == SC_OPCODE_X_LOOKUP ) { vsa.nIndex = vsa.nBestFit; if ( !vsa.pMatSrc ) @@ -10832,7 +10833,7 @@ bool ScInterpreter::SearchVectorForValue( VectorSearchArguments& vsa ) static bool lcl_LookupQuery( ScAddress & o_rResultPos, ScDocument& rDoc, ScInterpreterContext& rContext, const ScQueryParam & rParam, const ScQueryEntry & rEntry, const ScFormulaCell* cell, - const ScComplexRefData* refData, sal_Int8 nSearchMode, bool bXlookupMode ) + const ScComplexRefData* refData, sal_Int8 nSearchMode, sal_Int16 nOpCode ) { if (rEntry.eOp != SC_EQUAL) { @@ -10849,7 +10850,7 @@ static bool lcl_LookupQuery( ScAddress & o_rResultPos, ScDocument& rDoc, ScInter // search for the first GreaterOrEqual value if SearchMode is asc ScQueryCellIteratorSortedCache aCellIter(rDoc, rContext, rParam.nTab, rParam, false, false); aCellIter.SetSortedBinarySearchMode(nSearchMode); - aCellIter.SetXlookupMode(bXlookupMode); + aCellIter.SetLookupMode(nOpCode); if (aCellIter.GetFirst()) { o_rResultPos.SetCol(aCellIter.GetCol()); @@ -10864,7 +10865,7 @@ static bool lcl_LookupQuery( ScAddress & o_rResultPos, ScDocument& rDoc, ScInter ScQueryCellIteratorDirect aCellIter(rDoc, rContext, rParam.nTab, rParam, false, bReverse); aCellIter.SetSortedBinarySearchMode(nSearchMode); - aCellIter.SetXlookupMode(bXlookupMode); + aCellIter.SetLookupMode(nOpCode); if (aCellIter.FindEqualOrSortedLastInRange(nCol, nRow)) { o_rResultPos.SetCol(nCol); @@ -10886,7 +10887,7 @@ static bool lcl_LookupQuery( ScAddress & o_rResultPos, ScDocument& rDoc, ScInter { ScQueryCellIteratorSortedCache aCellIter( rDoc, rContext, rParam.nTab, rParam, false, false ); aCellIter.SetSortedBinarySearchMode(nSearchMode); - aCellIter.SetXlookupMode(bXlookupMode); + aCellIter.SetLookupMode(nOpCode); if (aCellIter.GetFirst()) { o_rResultPos.SetCol( aCellIter.GetCol()); @@ -10899,7 +10900,7 @@ static bool lcl_LookupQuery( ScAddress & o_rResultPos, ScDocument& rDoc, ScInter ScQueryCellIteratorDirect aCellIter( rDoc, rContext, rParam.nTab, rParam, false, static_cast<SearchMode>(nSearchMode) == searchrev); aCellIter.SetSortedBinarySearchMode(nSearchMode); - aCellIter.SetXlookupMode(bXlookupMode); + aCellIter.SetLookupMode(nOpCode); if (aCellIter.GetFirst()) { o_rResultPos.SetCol( aCellIter.GetCol()); @@ -10951,7 +10952,7 @@ static SCROW lcl_getPrevRowWithEmptyValueLookup( const ScLookupCache& rCache, bool ScInterpreter::LookupQueryWithCache( ScAddress & o_rResultPos, const ScQueryParam & rParam, const ScComplexRefData* refData, - sal_Int8 nSearchMode, bool bXlookupMode ) const + sal_Int8 nSearchMode, sal_Int16 nOpCode ) const { bool bFound = false; const ScQueryEntry& rEntry = rParam.GetEntry(0); @@ -10964,7 +10965,7 @@ bool ScInterpreter::LookupQueryWithCache( ScAddress & o_rResultPos, * parameter so it would affect only the lookup range parameter. */ if (!bColumnsMatch || GetVolatileType() != NOT_VOLATILE) bFound = lcl_LookupQuery( o_rResultPos, mrDoc, mrContext, rParam, rEntry, pMyFormulaCell, - refData, nSearchMode, bXlookupMode ); + refData, nSearchMode, nOpCode ); else { ScRange aLookupRange( rParam.nCol1, rParam.nRow1, rParam.nTab, @@ -10996,7 +10997,7 @@ bool ScInterpreter::LookupQueryWithCache( ScAddress & o_rResultPos, case ScLookupCache::NOT_CACHED : case ScLookupCache::CRITERIA_DIFFERENT : bFound = lcl_LookupQuery( o_rResultPos, mrDoc, mrContext, rParam, rEntry, - pMyFormulaCell, refData, nSearchMode, bXlookupMode ); + pMyFormulaCell, refData, nSearchMode, nOpCode ); if (eCacheResult == ScLookupCache::NOT_CACHED) rCache.insert( o_rResultPos, aCriteria, aPos, bFound); break; |