[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