[prev in list] [next in list] [prev in thread] [next in thread]
List: kde-commits
Subject: KDE/kdebase/runtime/nepomuk/services/queryservice
From: Sebastian Trueg <sebastian () trueg ! de>
Date: 2010-11-11 23:00:06
Message-ID: 20101111230006.C6324AC89E () svn ! kde ! org
[Download RAW message or body]
SVN commit 1195756 by trueg:
* Fixed a crash when the folder is deleted before the search is done (again).
* Report results in batches.
M +11 -3 folder.cpp
M +1 -1 folder.h
M +23 -19 searchrunnable.cpp
M +1 -4 searchrunnable.h
--- trunk/KDE/kdebase/runtime/nepomuk/services/queryservice/folder.cpp \
#1195755:1195756 @@ -128,19 +128,27 @@
// called from SearchRunnable in the search thread
-void Nepomuk::Query::Folder::addResult( const Nepomuk::Query::Result& result )
+void Nepomuk::Query::Folder::addResults( const QList<Nepomuk::Query::Result>& \
results ) {
if ( m_initialListingDone ) {
+ QList<Result> newResults;
+ Q_FOREACH( const Result& result, results ) {
m_newResults.insert( result.resource().resourceUri(), result );
if ( !m_results.contains( result.resource().resourceUri() ) ) {
- emit newEntries( QList<Result>() << result );
+ newResults << result;
}
}
+ if( !newResults.isEmpty() ) {
+ emit newEntries( newResults );
+ }
+ }
else {
+ Q_FOREACH( const Result& result, results ) {
m_results.insert( result.resource().resourceUri(), result );
- emit newEntries( QList<Result>() << result );
}
+ emit newEntries( results );
}
+}
// called from SearchRunnable in the search thread
--- trunk/KDE/kdebase/runtime/nepomuk/services/queryservice/folder.h #1195755:1195756
@@ -89,7 +89,7 @@
*/
int getResultCount() const { return m_resultCount; }
- void addResult( const Result& result );
+ void addResults( const QList<Result>& result );
void listingFinished();
--- trunk/KDE/kdebase/runtime/nepomuk/services/queryservice/searchrunnable.cpp \
#1195755:1195756 @@ -54,8 +54,7 @@
Nepomuk::Query::SearchRunnable::SearchRunnable( Folder* folder )
: QRunnable(),
- m_folder( folder ),
- m_resultCnt( 0 )
+ m_folder( folder )
{
m_canceled = false;
}
@@ -69,8 +68,10 @@
void Nepomuk::Query::SearchRunnable::cancel()
{
m_canceled = true;
- // we wait for the runnable to finish by locking the mutex the run() method \
locks, too
- QMutexLocker lock( &m_cancelMutex );
+
+ // "detach" us from the folder which will most likely be deleted now
+ QMutexLocker lock( &m_folderMutex );
+ m_folder = 0;
}
@@ -79,32 +80,35 @@
if( m_canceled )
return;
+ kDebug() << m_folder->query() << m_folder->sparqlQuery();
+
QTime time;
time.start();
- // lock the cancel mutex to make the cancel() method block until we are actually \
done
- m_cancelMutex.lock();
+ // we push the results in batches to lower the traffic and improve the user \
experience + QList<Result> resultCache;
- m_resultCnt = 0;
-
Soprano::QueryResultIterator hits = \
ResourceManager::instance()->mainModel()->executeQuery( m_folder->sparqlQuery(), \
Soprano::Query::QueryLanguageSparql );
- while ( hits.next() ) {
- if ( m_canceled ) break;
-
- ++m_resultCnt;
-
+ while ( !m_canceled &&
+ m_folder &&
+ hits.next() ) {
Result result = extractResult( hits );
kDebug() << "Found result:" << result.resource().resourceUri() << \
result.score();
- if( m_folder )
- m_folder->addResult( result );
- else
- break;
+ resultCache << result;
+
+ // FIXME: does it really make sense to emit results in batches? Or do we \
then waste time that we could already use to stat local file results in the kio \
slave? + static const int s_resultBatchSize = 20;
+ if( resultCache.count() >= s_resultBatchSize ) {
+ QMutexLocker lock( &m_folderMutex );
+ if( m_folder ) {
+ m_folder->addResults( resultCache );
+ resultCache.clear();
}
+ }
+ }
- m_cancelMutex.unlock();
-
kDebug() << time.elapsed();
if( m_folder && !m_canceled )
--- trunk/KDE/kdebase/runtime/nepomuk/services/queryservice/searchrunnable.h \
#1195755:1195756 @@ -59,13 +59,10 @@
Nepomuk::Query::Result extractResult( const \
Soprano::QueryResultIterator& it ) const;
QPointer<Folder> m_folder;
+ QMutex m_folderMutex;
// status
bool m_canceled;
- int m_resultCnt;
-
- // used only for ensuring that the runnable is actually done after a \
call to cancel()
- QMutex m_cancelMutex;
};
}
}
[prev in list] [next in list] [prev in thread] [next in thread]
Configure |
About |
News |
Add a list |
Sponsored by KoreLogic