mirror of
https://github.com/xiaoyifang/goldendict-ng.git
synced 2024-11-27 15:24:05 +00:00
qt5.15.2 does not work with qtconcurrent::blockingmapped
This commit is contained in:
parent
76969aa49d
commit
837dcfbf63
220
ftshelpers.cc
220
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;
|
||||
|
|
Loading…
Reference in a new issue