Full-text search: Optimize data transfer to articles list

This commit is contained in:
Abs62 2022-09-08 18:14:31 +03:00 committed by Xiao YiFang
parent ec3f93f34e
commit 4f39a6bd89

View file

@ -126,6 +126,72 @@ QString FtsIndexing::nowIndexingName()
return nowIndexing; return nowIndexing;
} }
void addSortedHeadwords( QList< FtsHeadword > & base_list, QList< FtsHeadword > const & add_list)
{
QList< FtsHeadword > list;
if( add_list.isEmpty() )
return;
if( base_list.isEmpty() )
{
base_list = add_list;
return;
}
list.reserve( base_list.size() + add_list.size() );
QList< FtsHeadword >::iterator base_it = base_list.begin();
QList< FtsHeadword >::const_iterator add_it = add_list.constBegin();
while( base_it != base_list.end() || add_it != add_list.end() )
{
if( base_it == base_list.end() )
{
while( add_it != add_list.end() )
{
list.append( *add_it );
++add_it;
}
break;
}
if( add_it == add_list.end() )
{
while( base_it != base_list.end() )
{
list.append( *base_it );
++base_it;
}
break;
}
if( *add_it < *base_it )
{
list.append( *add_it );
++add_it;
}
else if( *add_it == *base_it )
{
base_it->dictIDs.append( add_it->dictIDs );
for( QStringList::const_iterator itr = add_it->foundHiliteRegExps.constBegin();
itr != add_it->foundHiliteRegExps.constEnd(); ++itr )
{
if( !base_it->foundHiliteRegExps.contains( *itr ) )
base_it->foundHiliteRegExps.append( *itr );
}
++add_it;
}
else
{
list.append( *base_it );
++base_it;
}
}
base_list.swap( list );
}
FullTextSearchDialog::FullTextSearchDialog( QWidget * parent, FullTextSearchDialog::FullTextSearchDialog( QWidget * parent,
Config::Class & cfg_, Config::Class & cfg_,
std::vector< sptr< Dictionary::Class > > const & dictionaries_, std::vector< sptr< Dictionary::Class > > const & dictionaries_,
@ -405,6 +471,7 @@ void FullTextSearchDialog::accept()
void FullTextSearchDialog::searchReqFinished() void FullTextSearchDialog::searchReqFinished()
{ {
QList< FtsHeadword > allHeadwords;
while ( searchReqs.size() ) while ( searchReqs.size() )
{ {
std::list< sptr< Dictionary::DataRequest > >::iterator it; std::list< sptr< Dictionary::DataRequest > >::iterator it;
@ -421,13 +488,14 @@ void FullTextSearchDialog::searchReqFinished()
QList< FtsHeadword > * headwords; QList< FtsHeadword > * headwords;
if( (unsigned)(*it)->dataSize() >= sizeof( headwords ) ) if( (unsigned)(*it)->dataSize() >= sizeof( headwords ) )
{ {
QList< FtsHeadword > hws;
try try
{ {
(*it)->getDataSlice( 0, sizeof( headwords ), &headwords ); (*it)->getDataSlice( 0, sizeof( headwords ), &headwords );
model->addResults( QModelIndex(), *headwords ); hws.swap( *headwords );
std::sort( hws.begin(), hws.end() );
delete headwords; delete headwords;
ui.articlesFoundLabel->setText( tr( "Articles found: " ) addSortedHeadwords( allHeadwords, hws );
+ QString::number( results.size() ) );
} }
catch( std::exception & e ) catch( std::exception & e )
{ {
@ -449,6 +517,14 @@ void FullTextSearchDialog::searchReqFinished()
else else
break; break;
} }
if( !allHeadwords.isEmpty() )
{
model->addResults( QModelIndex(), allHeadwords );
ui.articlesFoundLabel->setText( tr( "Articles found: " )
+ QString::number( results.size() ) );
}
if ( searchReqs.empty() ) if ( searchReqs.empty() )
{ {
ui.searchProgressBar->hide(); ui.searchProgressBar->hide();
@ -608,27 +684,7 @@ void HeadwordsListModel::addResults(const QModelIndex & parent, QList< FtsHeadwo
Q_UNUSED( parent ); Q_UNUSED( parent );
beginResetModel(); beginResetModel();
QList< FtsHeadword > temp; addSortedHeadwords( headwords, hws );
for( int x = 0; x < hws.length(); x++ )
{
QList< FtsHeadword >::iterator it = std::lower_bound( headwords.begin(), headwords.end(), hws.at( x ) );
if( it != headwords.end() && *it == hws.at( x ) )
{
it->dictIDs.push_back( hws.at( x ).dictIDs.front() );
for( QStringList::const_iterator itr = it->foundHiliteRegExps.constBegin();
itr != it->foundHiliteRegExps.constEnd(); ++itr )
{
if( !it->foundHiliteRegExps.contains( *itr ) )
it->foundHiliteRegExps.append( *itr );
}
}
else
temp.append( hws.at( x ) );
}
headwords.append( temp );
std::sort( headwords.begin(), headwords.end() );
endResetModel(); endResetModel();
emit contentChanged(); emit contentChanged();