[Nepomuk] Avoid using the query service to run queries in the kioslave

Vishesh Handa me at vhanda.in
Mon Jun 25 08:50:35 UTC 2012


Hey Sebastian

The reviewboard has gone insane and it refuses to let me upload my patch -
"The file 'nepomuk/kioslaves/search/kio_nepomuksearch.cpp' (r2311b7a) could
not be found in the repository".

The auto updates donot seem to work any more, so that really needs to be
fixed or thrown away. I would prefer throwing it away, but it does have a
valid use-case, though the implementation is horrible.

commit 1fba20495fddfc596591f6ea8535d5fc6427c62b
Author: Vishesh Handa <me at vhanda.in>
Date:   Sat Jun 16 02:57:57 2012 +0530

    Avoid using the query service to run queries in the kioslave

    Avoid creating a new thread in the query service, and parsing the
    results over dbus. Instead just run the query manually in the kioslave.

    We can do this cause kioslaves run in a separate process and are allowed
    to be blocking.

diff --git a/nepomuk/kioslaves/common/resourcestat.cpp
b/nepomuk/kioslaves/common/resourcestat.cpp
index a259ba5..8f3088e 100644
--- a/nepomuk/kioslaves/common/resourcestat.cpp
+++ b/nepomuk/kioslaves/common/resourcestat.cpp
@@ -349,6 +349,7 @@ KUrl Nepomuk2::redirectionUrl( const
Nepomuk2::Resource& res )


 namespace {
+
     /**
      * Check if the resource represents a local file with an existing
nie:url property.
      */
diff --git a/nepomuk/kioslaves/search/kio_nepomuksearch.cpp
b/nepomuk/kioslaves/search/kio_nepomuksearch.cpp
index 2311b7a..3c82796 100644
--- a/nepomuk/kioslaves/search/kio_nepomuksearch.cpp
+++ b/nepomuk/kioslaves/search/kio_nepomuksearch.cpp
@@ -182,7 +182,7 @@ void Nepomuk2::SearchProtocol::listDir( const KUrl& url )
         else {
             SearchFolder folder( url, this );
             updateQueryUrlHistory( url );
-            folder.waitForListing();
+            folder.list();
             listEntry( KIO::UDSEntry(), true );
             finished();
         }
@@ -315,7 +315,7 @@ void Nepomuk2::SearchProtocol::listRoot()
     if ( query.isValid() ) {
         // FIXME: Avoid this useless conversion to searchUrl and back
         SearchFolder folder( query.toSearchUrl(), this );
-        folder.waitForListing();
+        folder.list();
     }

     listEntry( KIO::UDSEntry(), true );
diff --git a/nepomuk/kioslaves/search/searchfolder.cpp
b/nepomuk/kioslaves/search/searchfolder.cpp
index 3cd098a..38e4b1d 100644
--- a/nepomuk/kioslaves/search/searchfolder.cpp
+++ b/nepomuk/kioslaves/search/searchfolder.cpp
@@ -32,15 +32,19 @@
 #include <Nepomuk2/Thing>
 #include <Nepomuk2/Types/Class>
 #include <Nepomuk2/Query/Query>
-#include <Nepomuk2/Query/QueryParser>
+#include <Nepomuk2/Query/Result>
 #include <Nepomuk2/Query/ResourceTypeTerm>
-#include <Nepomuk2/Query/QueryServiceClient>
 #include <Nepomuk2/Vocabulary/NFO>
 #include <Nepomuk2/Vocabulary/NIE>
 #include <Nepomuk2/Vocabulary/PIMO>

+#include <Nepomuk2/ResourceManager>
+#include <Nepomuk2/Resource>
+
 #include <QtCore/QMutexLocker>
 #include <QTextDocument>
+#include <Soprano/QueryResultIterator>
+#include <Soprano/Model>

 #include <KUrl>
 #include <KDebug>
@@ -51,6 +55,8 @@
 #include <KConfig>
 #include <KConfigGroup>

+using namespace Nepomuk2::Vocabulary;
+using namespace Soprano::Vocabulary;

 Nepomuk2::SearchFolder::SearchFolder( const KUrl& url, KIO::SlaveBase* slave )
     : QObject( 0 ),
@@ -60,23 +66,9 @@ Nepomuk2::SearchFolder::SearchFolder( const KUrl&
url, KIO::SlaveBase* slave )
     // parse URL (this may fail in which case we fall back to pure
SPARQL below)
     Query::parseQueryUrl( url, m_query, m_sparqlQuery );

-    m_client = new Nepomuk2::Query::QueryServiceClient();
-
-    connect( m_client, SIGNAL( newEntries( const
QList<Nepomuk2::Query::Result>& ) ),
-             this, SLOT( slotNewEntries( const
QList<Nepomuk2::Query::Result>& ) ) );
-    connect( m_client, SIGNAL( resultCount(int) ),
-             this, SLOT( slotResultCount(int) ) );
-    connect( m_client, SIGNAL( finishedListing() ),
-             this, SLOT( slotFinishedListing() ) );
-    connect( m_client, SIGNAL( error(QString) ),
-             this, SLOT( slotFinishedListing() ) );
-    connect( m_client, SIGNAL( finishedListing() ),
-             m_client, SLOT( deleteLater() ) );
-
-    if ( m_query.isValid() )
-        m_client->query( m_query );
-    else
-        m_client->sparqlQuery( m_sparqlQuery );
+    if ( m_query.isValid() ) {
+        m_sparqlQuery = m_query.toSparqlQuery();
+    }
 }


@@ -84,36 +76,20 @@ Nepomuk2::SearchFolder::~SearchFolder()
 {
 }

-void Nepomuk2::SearchFolder::waitForListing()
-{
-    m_eventLoop.exec();
-}
-
-void Nepomuk2::SearchFolder::slotNewEntries( const
QList<Nepomuk2::Query::Result>& results )
+void Nepomuk2::SearchFolder::list()
 {
-    KIO::UDSEntryList entryList;
-    foreach(const Query::Result& result, results ) {
+    //FIXME: Do the result count as well?
+    Soprano::Model* model = ResourceManager::instance()->mainModel();
+    Soprano::QueryResultIterator it = model->executeQuery(
m_sparqlQuery, Soprano::Query::QueryLanguageSparql );
+    while( it.next() ) {
+        Query::Result result = extractResult( it );
         KIO::UDSEntry uds = statResult( result );
         if ( uds.count() ) {
-            //kDebug() << "listing" << result.resource().resourceUri();
             m_slave->listEntry(uds, false);
         }
     }
 }

-
-void Nepomuk2::SearchFolder::slotResultCount( int count )
-{
-    m_slave->totalSize( count );
-}
-
-
-void Nepomuk2::SearchFolder::slotFinishedListing()
-{
-    m_eventLoop.exit();
-}
-
-
 namespace {
     bool statFile( const KUrl& url, const KUrl& fileUrl, KIO::UDSEntry& uds )
     {
@@ -146,7 +122,7 @@ KIO::UDSEntry Nepomuk2::SearchFolder::statResult(
const Query::Result& result )
 {
     Resource res( result.resource() );
     const KUrl uri( res.resourceUri() );
-    KUrl nieUrl( result[Nepomuk2::Vocabulary::NIE::url()].uri() );
+    KUrl nieUrl( result[NIE::url()].uri() );

     // the additional bindings that we only have on unix systems
     // Either all are bound or none of them.
@@ -263,3 +239,36 @@ KIO::UDSEntry Nepomuk2::SearchFolder::statResult(
const Query::Result& result )

     return uds;
 }
+
+// copied from the QueryService
+Nepomuk2::Query::Result Nepomuk2::SearchFolder::extractResult(const
Soprano::QueryResultIterator& it) const
+{
+    Query::Result result( Resource::fromResourceUri( it[0].uri() ) );
+    const Query::RequestPropertyMap map = m_query.requestPropertyMap();
+    for( Query::RequestPropertyMap::const_iterator rit = map.begin();
rit != map.constEnd(); rit++ ) {
+        result.addRequestProperty( rit.value(), it.binding( rit.key() ) );
+    }
+
+    // make sure we do not store values twice
+    QStringList names = it.bindingNames();
+    names.removeAll( QLatin1String( "r" ) );
+
+    static const char* s_scoreVarName = "_n_f_t_m_s_";
+    static const char* s_excerptVarName = "_n_f_t_m_ex_";
+
+    Soprano::BindingSet set;
+    int score = 0;
+    Q_FOREACH( const QString& var, names ) {
+        if ( var == QLatin1String( s_scoreVarName ) )
+            score = it[var].literal().toInt();
+        else if ( var == QLatin1String( s_excerptVarName ) )
+            result.setExcerpt( it[var].toString() );
+        else
+            set.insert( var, it[var] );
+    }
+
+    result.setAdditionalBindings( set );
+    result.setScore( ( double )score );
+
+    return result;
+}
\ No newline at end of file
diff --git a/nepomuk/kioslaves/search/searchfolder.h
b/nepomuk/kioslaves/search/searchfolder.h
index 794baaa..b475402 100644
--- a/nepomuk/kioslaves/search/searchfolder.h
+++ b/nepomuk/kioslaves/search/searchfolder.h
@@ -36,6 +36,9 @@
 #include <Nepomuk2/Resource>
 #include <KUrl>

+namespace Soprano {
+    class QueryResultIterator;
+}

 namespace Nepomuk2 {
     namespace Query {
@@ -76,17 +79,7 @@ namespace Nepomuk2 {
         /**
          * List the results directly on the parent slave.
          */
-        void waitForListing();
-
-    private Q_SLOTS:
-        /// connected to the QueryServiceClient in the search thread
-        void slotNewEntries( const QList<Nepomuk2::Query::Result>& );
-
-        /// connected to the QueryServiceClient in the search thread
-        void slotResultCount( int );
-
-        /// connected to the QueryServiceClient in the search thread
-        void slotFinishedListing();
+        void list();

     private:
         /**
@@ -94,6 +87,8 @@ namespace Nepomuk2 {
          */
         KIO::UDSEntry statResult( const Query::Result& result );

+        Query::Result extractResult( const
Soprano::QueryResultIterator& it ) const;
+
         // folder properties
         KUrl m_url;




-- 
Vishesh Handa
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://mail.kde.org/pipermail/nepomuk/attachments/20120625/da47d036/attachment.html>


More information about the Nepomuk mailing list