Switch to side-by-side view

--- a/src/python/xesam/xesam-recoll-service
+++ b/src/python/xesam/xesam-recoll-service
@@ -1,24 +1,25 @@
 #!/usr/bin/env python
 """
-Demo implementation of a xesam server. Run it like
+Recoll implementation of a xesam server. 
+Based on the example in the xesam-tools package by:
+ Mikkel Kamstrup Erlandsen <mikkel.kamstrup@gmail.com>
 
-    demo/xesam-dummy-service [-s|--state-messages]
+Run it like
+
+xesam-recoll-service 
 
 And launch a search on it via
 
-    ./xesam-tool search hello
+  xesam-tool search hello
 
-You can use the -s or --state-messages switch to enable StateChanged
-signal monitoring in xesam-tool as well as in xesam-dummy-service.
 """
-
 
 # Sets up path to uninstalled xesam module
 import demo
 
 import xesam
 import xesam.query
-from xesam.server import *
+import xesam.server
 import gobject
 import sys
 
@@ -34,15 +35,16 @@
     """
     
     def __init__ (self):
-        h_fact = HandleFactory ()
-        fact = ClientFactory (self, h_fact, RecollSession, RecollSearch)
+        h_fact = xesam.server.HandleFactory ()
+        fact = xesam.server.ClientFactory (self, h_fact, 
+                                           RecollSession, RecollSearch)
         xesam.server.Searcher.__init__ (self, h_fact, fact)
         self.set_echo_queries (True)
         self.rcldb = recoll.connect()
 
     def start (self):
         # Export our selves via a SearchServerStub
-        SearchServerStub(self).start()
+        xesam.server.SearchServerStub(self).start()
     
     def GetProperty (self, shandle, name):
         prop = xesam.server.Searcher.GetProperty(self, shandle, name)
@@ -54,33 +56,24 @@
         xesam.debug ("Set property request for '%s=%s', on session '%s', returning %s" % (name, value, shandle,val))
         return val
 
-class RecollSession (Session):
+class RecollSession (xesam.server.Session):
     """
     
     """
     def __init__ (self, searcher, session_handle):
-        Session.__init__ (self, searcher, session_handle)
+        xesam.server.Session.__init__ (self, searcher, session_handle)
         self.set_property ("recoll.org", "xesam-recoll-service")
         
-class RecollSearch (Search):
+class RecollSearch (xesam.server.Search):
     """
         
     """
-    # Translation from known xesam/whatever field names to Recoll Doc elements
-    FLDTRANS = \
-        {
-        "xesam:title"   : lambda doc : doc.title,
-        "xesam:summary" : lambda doc : doc.abstract,
-        "xesam:mimeType" : lambda doc : doc.mimetype,
-        "xesam:contentModified" : lambda doc : \
-            timestampToIso8601(doc.dmtime or doc.fmtime),
-        "xesam:url"     : lambda doc : doc.url
-        }
+
     SLICE = 10
 
     def __init__ (self, searcher, session, search_handle, \
                       query=None, xml=None) :
-        Search.__init__ (self, searcher, session, search_handle, \
+        xesam.server.Search.__init__ (self, searcher, session, search_handle, \
                              query=query, xml=xml)
        
         self._hit_fields = session.get_property (xesam.SESSION_HIT_FIELDS)
@@ -88,10 +81,7 @@
             xesam.error ("Got property hit.fields as None."
                              " Setting default xesam:url")
             self._hit_fields = ["xesam:url"]
-        print "RecollSearch: fields:", self._hit_fields
-        # TOBEDONE: if fields includes "snippet" we need to generate
-        # the synthetic abstract for each returned doc
-        # Also relevancyRating, ContentCategory et SourceCategory
+        xesam.debug("RecollSearch: fields:" % self._hit_fields)
         xesam.debug ("Created %s with handle %s and query:\n%s" % 
                      (self.__class__, self.get_handle(), self.get_query()))
 
@@ -99,6 +89,21 @@
         if not isinstance(self.get_query(), xesam.query.UserQuery):
             raise Exception ("Only UserQuery supported ATM, sorry.")
         self.rclquery = self._searcher.rcldb.query()
+        
+        # In the latest version (>0.95), primary/secondary is replaced by 
+        # a field list.
+        sortfield = session.get_property(xesam.SESSION_SORT_PRIMARY)
+        order = session.get_property(xesam.SESSION_SORT_ORDER)
+
+        # xesam-tool does not know how to set these for now, so let's
+        # TEST here
+        sortfield = "contentModified"
+        order = "descending"
+        xesam.debug("Session sort primary %s order %s" % (sortfield, order))
+        # END TEST
+
+        if sortfield:
+            self.rclquery.sortby(sortfield, order == "ascending" and 1 or 0)
 
     def start (self):
         xesam.debug ("RecollSearch '%s' got [%s]" % 
@@ -110,10 +115,16 @@
             doc = self.rclquery.fetchone()
             data = []
             for fld in self._hit_fields:
-                if self.FLDTRANS.has_key (fld):
-                    data.append(self.FLDTRANS[fld](doc))
+                # Need to handle ContentCategory and SourceCategory
+                fld = fld.lower().replace("xesam:", "")
+                xesam.debug("Adding data for fld %s" % (fld))
+                if fld == "snippet":
+                    data.append(self._searcher.rcldb.makeDocAbstract(doc, 
+                                                                self.rclquery))
+                elif fld == "contentmodified":
+                    data.append(timestampToIso8601(getattr(doc, "mtime")))
                 else:
-                    data.append("")
+                    data.append(getattr(doc, fld, ""))
             self.add_new_hit (self._hit_fields, data)
             hits += 1
             if hits >= self.SLICE:
@@ -135,7 +146,7 @@
         xesam.debug ("RecollSearch get_hits")
 
         if self._stopped:
-            return Search.get_hits(self, num_hits)
+            return xesam.server.Search.get_hits(self, num_hits)
 
         hits = 0
         done = 0;
@@ -163,7 +174,7 @@
             xesam.debug ("Search '%s' emitted 'done'" % self.get_handle())
             self.stop()
 
-        return Search.get_hits(self, num_hits)
+        return xesam.server.Search.get_hits(self, num_hits)
 
 
 if __name__ == "__main__":