[prev in list] [next in list] [prev in thread] [next in thread] 

List:       kde-commits
Subject:    [Akonadi] c54b02b: Listen to the SearchDone signal and process it.
From:       Till Adam <till () kdab ! com>
Date:       2010-12-30 12:32:05
Message-ID: 20101230123205.DFC02A6090 () git ! kde ! org
[Download RAW message or body]

commit c54b02b07472a455a52641268f5c4c853eabd743
branch master
Author: Till Adam <till@kdab.com>
Date:   Tue Dec 28 14:50:05 2010 +0100

    Listen to the SearchDone signal and process it.
    
    We'd like to to live searching, but strigidaemon currently does
    not seem to support that. So listen for SearchDone, which we will
    only get if live searching isn't active, and when we get it, close
    that search.

diff --git a/server/src/search/xesamsearchengine.cpp \
b/server/src/search/xesamsearchengine.cpp index 0e1ab48..9fcf63a 100644
--- a/server/src/search/xesamsearchengine.cpp
+++ b/server/src/search/xesamsearchengine.cpp
@@ -78,26 +78,38 @@ void XesamSearchEngine::initializeSearchInterface()
 
   if ( mInterface->isValid() ) {
     mSession = mInterface->NewSession();
+
+    /* FIXME currently broken in strigi
     QDBusVariant result = mInterface->SetProperty( mSession, QLatin1String( \
                "search.live" ), QDBusVariant( true ) );
-    mValid = mValid && result.variant().toBool();
+    mValid = result.variant().toBool();
+    */
+    mValid = true;
 
-    connect( mInterface, SIGNAL( HitsAdded( QString, uint ) ), SLOT( slotHitsAdded( \
                QString, uint ) ) );
-    connect( mInterface, SIGNAL( HitsRemoved( QString, QList<uint> ) ), SLOT( \
                slotHitsRemoved( QString, QList<uint> ) ) );
-    connect( mInterface, SIGNAL( HitsModified( QString, QList<uint> ) ), SLOT( \
slotHitsModified( QString, QList<uint> ) ) ); +    if ( mValid ) {
+      connect( mInterface, SIGNAL( HitsAdded( QString, uint ) ), SLOT( \
slotHitsAdded( QString, uint ) ) ); +      connect( mInterface, SIGNAL( SearchDone( \
QString ) ), SLOT( slotSearchDone( QString ) ) ); +      connect( mInterface, SIGNAL( \
HitsRemoved( QString, QList<uint> ) ), SLOT( slotHitsRemoved( QString, QList<uint> ) \
) ); +      connect( mInterface, SIGNAL( HitsModified( QString, QList<uint> ) ), \
SLOT( slotHitsModified( QString, QList<uint> ) ) );  
-    mValid = true;
-    reloadSearches();
+      reloadSearches();
+    }
   } else {
     mValid = false;
   }
 }
 
-void XesamSearchEngine::slotHitsAdded( const QString &search, uint count )
+qint64 XesamSearchEngine::searchToCollectionId( const QString& search )
 {
-  qDebug() << "hits added: " << search << count;
   mMutex.lock();
-  const qint64 collectionId = mSearchMap.value( search );
+  const qint64 collectionId = mSearchMap.contains( search ) ? mSearchMap.value( \
search ) : -1;  mMutex.unlock();
+  return collectionId;
+}
+
+void XesamSearchEngine::slotHitsAdded( const QString &search, uint count )
+{
+  qDebug() << "hits added: " << search << count;
+  const qint64 collectionId = searchToCollectionId( search );
 
   if ( collectionId <= 0 || count <= 0 )
     return;
@@ -118,8 +130,14 @@ void XesamSearchEngine::slotHitsAdded( const QString &search, \
uint count )  if ( itemId == -1 )
       continue;
 
-    Entity::addToRelation<CollectionPimItemRelation>( collectionId, itemId );
-    mCollector->itemLinked( PimItem::retrieveById( itemId ), collection );
+
+    const PimItem item = PimItem::retrieveById( itemId );
+    if ( item.isValid() ) {
+      Entity::addToRelation<CollectionPimItemRelation>( collectionId, itemId );
+      mCollector->itemLinked( item, collection );
+    } else {
+      qDebug() << "Non-existing item referenced in XESAM search. Discarding id:" << \
itemId; +    }
   }
 
   mCollector->dispatchNotifications();
@@ -128,9 +146,7 @@ void XesamSearchEngine::slotHitsAdded( const QString &search, \
uint count )  void XesamSearchEngine::slotHitsRemoved( const QString &search, const \
QList<uint> &hits )  {
   qDebug() << "hits removed: " << search << hits;
-  mMutex.lock();
-  const qint64 collectionId = mSearchMap.value( search );
-  mMutex.unlock();
+  const qint64 collectionId = searchToCollectionId( search );
 
   if ( collectionId <= 0 )
     return;
@@ -190,8 +206,11 @@ void XesamSearchEngine::addSearch( const Collection &collection \
)  if ( collection.remoteId().isEmpty() )
     return;
 
-  const QString searchId = mInterface->NewSearch( mSession, collection.remoteId() );
-  qDebug() << "XesamSearchEngine::addSeach" << collection.name() << searchId;
+  const QString searchString = collection.queryString();
+  if ( searchString.isEmpty() )
+    return;
+  const QString searchId = mInterface->NewSearch( mSession, searchString );
+  qDebug() << "XesamSearchEngine::addSearch" << collection.name() << searchId << \
searchString;  
   mMutex.lock();
   mSearchMap.insert( searchId, collection.id() );
@@ -203,6 +222,8 @@ void XesamSearchEngine::addSearch( const Collection &collection )
 
 void XesamSearchEngine::removeSearch( qint64 collectionId )
 {
+  if ( !mInvSearchMap.contains( collectionId ) )
+    return;
   mMutex.lock();
   const QString searchId = mInvSearchMap.value( collectionId );
   mMutex.unlock();
@@ -210,6 +231,8 @@ void XesamSearchEngine::removeSearch( qint64 collectionId )
   if ( searchId.isEmpty() )
     return;
 
+  Q_ASSERT( mSearchMap.contains( searchId ) );
+
   mInterface->CloseSearch( searchId );
 
   mMutex.lock();
@@ -233,4 +256,14 @@ void XesamSearchEngine::stopSearches()
   }
 }
 
+void XesamSearchEngine::slotSearchDone(const QString &search)
+{
+  // If we get a search done signal, this is not a live search
+  // so we can stop monitoring it. This is to avoid getting
+  // spurious hits for already finished searches.
+  qDebug() << "search done" << search;
+  if ( mSearchMap.contains( search ) )
+    mInterface->CloseSearch( search );
+}
+
 #include "xesamsearchengine.moc"
diff --git a/server/src/search/xesamsearchengine.h \
b/server/src/search/xesamsearchengine.h index b85976d..6322470 100644
--- a/server/src/search/xesamsearchengine.h
+++ b/server/src/search/xesamsearchengine.h
@@ -46,11 +46,13 @@ class XesamSearchEngine : public QObject, public \
AbstractSearchEngine  private:
     void reloadSearches();
     void stopSearches();
+    qint64 searchToCollectionId( const QString& search );
 
   private Q_SLOTS:
     void initializeSearchInterface();
 
     void slotHitsAdded( const QString &search, uint count );
+    void slotSearchDone( const QString &search );
     void slotHitsRemoved( const QString &search, const QList<uint> &hits );
     void slotHitsModified( const QString &search, const QList<uint> &hits );
 


[prev in list] [next in list] [prev in thread] [next in thread] 

Configure | About | News | Add a list | Sponsored by KoreLogic