From 837dcfbf63db75c1e22243a483e3d6e4bf524187 Mon Sep 17 00:00:00 2001 From: Xiao YiFang Date: Wed, 8 Jun 2022 21:38:30 +0800 Subject: [PATCH] qt5.15.2 does not work with qtconcurrent::blockingmapped --- ftshelpers.cc | 220 ++++++-------------------------------------------- 1 file changed, 24 insertions(+), 196 deletions(-) diff --git a/ftshelpers.cc b/ftshelpers.cc index e3b3ae41..997c05c0 100644 --- a/ftshelpers.cc +++ b/ftshelpers.cc @@ -447,180 +447,7 @@ void FTSResultsRequest::checkArticles( QVector< uint32_t > const & offsets, QStringList const & words, QRegExp const & searchRegexp ) { - // int results = 0; - QString headword, articleText; - QList< uint32_t > offsetsForHeadwords; - QVector< QStringList > hiliteRegExps; - - QString id = QString::fromUtf8( dict.getId().c_str() ); - - // RegExp mode - QRegularExpression searchRegularExpression; - if( searchMode == FTS::Wildcards ) - searchRegularExpression.setPattern( wildcardsToRegexp( searchRegexp.pattern() ) ); - else - searchRegularExpression.setPattern( searchRegexp.pattern() ); - QRegularExpression::PatternOptions patternOptions = - QRegularExpression::DotMatchesEverythingOption | QRegularExpression::UseUnicodePropertiesOption - | QRegularExpression::MultilineOption | QRegularExpression::InvertedGreedinessOption; - if( searchRegexp.caseSensitivity() == Qt::CaseInsensitive ) - patternOptions |= QRegularExpression::CaseInsensitiveOption; - searchRegularExpression.setPatternOptions( patternOptions ); - if( !searchRegularExpression.isValid() ) - searchRegularExpression.setPattern( "" ); - - if( searchMode == FTS::Wildcards || searchMode == FTS::RegExp ) - { - for( int i = 0; i < offsets.size(); i++ ) - { - if( Utils::AtomicInt::loadAcquire( isCancelled ) ) - break; - - dict.getArticleText( offsets.at( i ), headword, articleText ); - articleText = articleText.normalized( QString::NormalizationForm_C ); - - if( ignoreDiacritics ) - articleText = gd::toQString( Folding::applyDiacriticsOnly( gd::toWString( articleText ) ) ); - - if( articleText.contains( searchRegularExpression ) ) - { - if( headword.isEmpty() ) - offsetsForHeadwords.append( offsets.at( i ) ); - else - foundHeadwords->append( FTS::FtsHeadword( headword, id, QStringList(), matchCase ) ); - - results++; - if( maxResults > 0 && results >= maxResults ) - break; - } - } - } - else - { - // Words mode - - Qt::CaseSensitivity cs = matchCase ? Qt::CaseSensitive : Qt::CaseInsensitive; - QVector< QPair< QString, bool > > wordsList; - if( ignoreWordsOrder ) - { - for( QStringList::const_iterator it = words.begin(); it != words.end(); ++it ) - wordsList.append( QPair< QString, bool >( *it, true ) ); - } - - for( int i = 0; i < offsets.size(); i++ ) - { - if( Utils::AtomicInt::loadAcquire( isCancelled ) ) - break; - - QVector< QStringList > allOrders; - QStringList order; - - if( ignoreWordsOrder ) - { - for( int i = 0; i < wordsList.size(); i++ ) - wordsList[ i ].second = true; - } - - dict.getArticleText( offsets.at( i ), headword, articleText ); - - articleText = articleText.normalized( QString::NormalizationForm_C ); - - if( ignoreDiacritics ) - articleText = gd::toQString( Folding::applyDiacriticsOnly( gd::toWString( articleText ) ) ); - - if(ignoreWordsOrder) - { - bool allMatch = true; - foreach( QString word, words ) - { - if( containCJK( word ) || searchMode == FTS::PlainText ) - { - if( !articleText.contains( word ) ) - { - allMatch = false; - break; - } - } - else if( searchMode == FTS::WholeWords) - { - QRegularExpression tmpReg( QString( "\b%1\b" ).arg( word ),QRegularExpression::CaseInsensitiveOption|QRegularExpression::UseUnicodePropertiesOption ); - if( !articleText.contains( tmpReg) ) - { - allMatch = false; - break; - } - } - - } - - if(!allMatch) - { - continue; - } - - if( distanceBetweenWords >= 0 ) - { - // the article text contains all the needed words. - // determine if distance restriction is meet - QRegularExpression replaceReg( QString( "(%1)" ).arg( words.join( '|' ) ), - QRegularExpression::CaseInsensitiveOption | - QRegularExpression::UseUnicodePropertiesOption ); - // use a string that could not be presented in the article. - articleText = articleText.replace( replaceReg, "=@XXXXX@=" ); - - auto hasCJK = false; - foreach(QString word,words) - { - if(containCJK( word )) - { - hasCJK = true; - break; - } - } - - //hascjk value ,perhaps should depend on each word - auto searchRegStr = makeHiliteRegExpString( Utils::repeat( "=@XXXXX@=", words.size() ), searchMode, distanceBetweenWords,hasCJK ); - QRegularExpression distanceOrderReg( searchRegStr, - QRegularExpression::CaseInsensitiveOption | - QRegularExpression::UseUnicodePropertiesOption ); - // use a string that could not be presented in the article. - if(articleText.contains(distanceOrderReg)) - { - if( headword.isEmpty() ) - offsetsForHeadwords.append( offsets.at( i ) ); - else - foundHeadwords->append( FTS::FtsHeadword( headword, id, QStringList(), matchCase ) ); - - ++results; - if( maxResults > 0 && results >= maxResults ) - break; - } - } - - } - else - { - if( articleText.contains( searchRegularExpression ) ) - { - if( headword.isEmpty() ) - offsetsForHeadwords.append( offsets.at( i ) ); - else - foundHeadwords->append( FTS::FtsHeadword( headword, id, QStringList(), matchCase ) ); - - ++results; - if( maxResults > 0 && results >= maxResults ) - break; - } - } - } - } - if( !offsetsForHeadwords.isEmpty() ) - { - QVector< QString > headwords; - dict.getHeadwordsFromOffsets( offsetsForHeadwords, headwords, &isCancelled ); - for( int x = 0; x < headwords.size(); x++ ) - foundHeadwords->append( FTS::FtsHeadword( headwords.at( x ), id, x < hiliteRegExps.size() ? hiliteRegExps.at( x ) : QStringList(), matchCase ) ); - } + QtConcurrent::blockingMap( offsets, [ & ]( uint32_t offset ) { checkSingleArticle( offset, words, searchRegexp ); } ); } void FTSResultsRequest::checkSingleArticle( uint32_t offset, @@ -819,13 +646,15 @@ void FTSResultsRequest::indexSearch( BtreeIndexing::BtreeIndex & ftsIndex, if( indexWords.isEmpty() ) return; - auto findLinks = [ & ]( const QString & word ) -> QSet< uint32_t > + QList< QSet< uint32_t > > addressLists; + + auto findLinks = [ & ]( const QString & word ) { QSet< uint32_t > tmp; uint32_t size; if( Utils::AtomicInt::loadAcquire( isCancelled ) ) - return tmp; + addressLists<< tmp; vector< BtreeIndexing::WordArticleLink > links = ftsIndex.findArticles( gd::toWString( word ), ignoreDiacritics ); @@ -833,7 +662,7 @@ void FTSResultsRequest::indexSearch( BtreeIndexing::BtreeIndex & ftsIndex, { if( Utils::AtomicInt::loadAcquire( isCancelled ) ) - return tmp; + addressLists<< tmp; vector< char > chunk; char * linksPtr; @@ -853,14 +682,13 @@ void FTSResultsRequest::indexSearch( BtreeIndexing::BtreeIndex & ftsIndex, links.clear(); - return tmp; + addressLists<< tmp; }; // int n = indexWords.length(); - auto sets = QtConcurrent::blockingMapped( indexWords, - findLinks ); + QtConcurrent::blockingMap( indexWords, findLinks ); int i = 0; - for( auto & elem : sets ) + for( auto & elem : addressLists ) { if( i++ == 0 ) setOfOffsets = elem; @@ -887,11 +715,7 @@ void FTSResultsRequest::indexSearch( BtreeIndexing::BtreeIndex & ftsIndex, dict.sortArticlesOffsetsForFTS( offsets, isCancelled ); -//#if (QT_VERSION >= QT_VERSION_CHECK(6,0,0)) - QtConcurrent::blockingMap(offsets,[&](uint32_t offset){checkSingleArticle(offset,searchWords,regexp);}); -//#else -// checkArticles( offsets, searchWords, regexp ); -//#endif + checkArticles( offsets, searchWords, regexp ); } void FTSResultsRequest::combinedIndexSearch( BtreeIndexing::BtreeIndex & ftsIndex, @@ -934,17 +758,15 @@ void FTSResultsRequest::combinedIndexSearch( BtreeIndexing::BtreeIndex & ftsInde if( !hieroglyphsList.empty() ) { - QSet< uint32_t > tmp; - vector< BtreeIndexing::WordArticleLink > links; - - for( int i = 0; i < hieroglyphsList.size(); i++ ) + QList< QSet< uint32_t > > sets; + auto fn_wordLink = [ & ](const QString & word ) { - links = ftsIndex.findArticles( gd::toWString( hieroglyphsList.at( i ) ) ); + QSet< uint32_t > tmp; + vector< BtreeIndexing::WordArticleLink > links = ftsIndex.findArticles( gd::toWString( word ) ); for( unsigned x = 0; x < links.size(); x++ ) { - if( Utils::AtomicInt::loadAcquire( isCancelled ) ) - return; + sets<< tmp; vector< char > chunk; char * linksPtr; @@ -963,11 +785,17 @@ void FTSResultsRequest::combinedIndexSearch( BtreeIndexing::BtreeIndex & ftsInde } links.clear(); + sets<< tmp; + }; + QtConcurrent::blockingMap( hieroglyphsList, fn_wordLink ); - if( i == 0 ) - setOfOffsets = tmp; + int i = 0; + for( auto & elem : sets ) + { + if( i++ == 0 ) + setOfOffsets = elem; else - setOfOffsets = setOfOffsets.intersect( tmp ); + setOfOffsets = setOfOffsets.intersect( elem ); } allWordsLinks[ wordNom ] = setOfOffsets;